random123

Counter-based Random Number Generators
git clone git://git.meso-star.com/random123.git
Log | Files | Refs | README | LICENSE

commit d8a0c25e49992685c0b9d91b553c1d04f81b6b4b
Author: johnsalmon <salmonj@deshawresearch.com>
Date:   Sat, 16 Jan 2021 21:52:44 -0500

Initial commit

Sync'ed from in-house repo.

Diffstat:
A.gitignore | 45+++++++++++++++++++++++++++++++++++++++++++++
AGNUmakefile | 46++++++++++++++++++++++++++++++++++++++++++++++
ALICENSE | 31+++++++++++++++++++++++++++++++
AREADME.md | 421+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adocs/Doxyfile | 44++++++++++++++++++++++++++++++++++++++++++++
Adocs/cbrng.dox | 198+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adocs/header.html | 11+++++++++++
Adocs/main.dox | 421+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adocs/releasenotes.dox | 212+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/GNUmakefile | 156+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/README | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/example_seeds.h | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/gencl.sh | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_aes.cpp | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_capi.c | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_check.h | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_cppapi.cpp | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_cuda.cu | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_cudapp.cu | 127+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_gsl.c | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_metal.m | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_metal_kernel.metal | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_microurng.cpp | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_opencl.c | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_opencl_kernel.ocl | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/pi_uniform.cpp | 154+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/simple.c | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexamples/simplepp.cpp | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/MicroURNG.hpp | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/ReinterpretCtr.hpp | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/aes.h | 398+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/array.h | 355+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/ars.h | 204+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/boxmuller.hpp | 139+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/conventional/Engine.hpp | 280+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/conventional/gsl_cbrng.h | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/clangfeatures.h | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/compilerfeatures.h | 343+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/gccfeatures.h | 285+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/iccfeatures.h | 212+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/metalfeatures.h | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/msvcfeatures.h | 200+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/nvccfeatures.h | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/open64features.h | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/openclfeatures.h | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/pgccfeatures.h | 195+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/sse.h | 280+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/sunprofeatures.h | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/features/xlcfeatures.h | 211+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/gsl_microrng.h | 136+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/philox.h | 493+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/threefry.h | 874+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/u01fixedpt.h | 200+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainclude/Random123/uniform.hpp | 310+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/BUILDVC.BAT | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/BUILDVC11.BAT | 6++++++
Atests/GNUmakefile | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/README | 145+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/gencl.sh | 2++
Atests/kat.h | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/kat_c.c | 41+++++++++++++++++++++++++++++++++++++++++
Atests/kat_cpp.cpp | 222+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/kat_cuda.cu | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/kat_dev_execute.h | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/kat_main.h | 306+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/kat_metal.m | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/kat_metal_kernel.metal | 38++++++++++++++++++++++++++++++++++++++
Atests/kat_opencl.c | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/kat_opencl_kernel.ocl | 37+++++++++++++++++++++++++++++++++++++
Atests/kat_vectors | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/old_kat_vectors | 5339+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/rngNxW.h | 48++++++++++++++++++++++++++++++++++++++++++++++++
Atests/time_boxmuller.cpp | 142+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/time_boxmuller_cuda.cu | 181+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/time_cuda.cu | 175+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/time_initkeyctr.h | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/time_misc.h | 44++++++++++++++++++++++++++++++++++++++++++++
Atests/time_opencl.c | 200+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/time_opencl_kernel.ocl | 35+++++++++++++++++++++++++++++++++++
Atests/time_random123.h | 119+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/time_serial.c | 162+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/time_thread.c | 242+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/timers.cpp | 249+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_Engine.cpp | 246+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_M128.cpp | 151++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_ReinterpretCtr.cpp | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_aes.cpp | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_ars.c | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_carray.cpp | 319+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_features.cpp | 469+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_gsl.c | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_ua.cpp | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_uniform.cpp | 173+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_uniform_IEEEkat.cpp | 293+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_uniform_IEEEkatvectors.hpp | 2605+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_uniform_kat_vectors.dat | 2604+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ut_uniform_reference.hpp | 19+++++++++++++++++++
Atests/util.h | 221+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/util_cuda.h | 135+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/util_demangle.hpp | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/util_expandtpl.h | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/util_m128.h | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/util_metal.h | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/util_opencl.h | 381+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/util_print.h | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
105 files changed, 26220 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -0,0 +1,45 @@ +*~ +*.[oa] +*.pyc +*.metallib +*.air +/.sconsign.dblite +/objs +docs/html +# make leaves a lot of junk in examples/ and tests/ +# We really should create objects in a subdir! +**/kat_c +**/kat_cpp +**/kat_metal +**/pi_aes +**/pi_capi +**/pi_cppapi +**/pi_gsl +**/pi_microurng +**/pi_uniform +**/pi_metal +**/pi_opencl +**/simple +**/simplepp +**/time_boxmuller +**/time_serial +**/time_thread +**/timers +**/ut_Engine +**/ut_M128 +**/ut_ReinterpretCtr +**/ut_aes +**/ut_ars +**/ut_carray +**/ut_features +**/ut_gsl +**/ut_ua +**/ut_uniform +**/ut_uniform_IEEEkat +**/kat_cuda +**/pi_cuda +**/pi_cudapp +**/pi_opencl +**/time_boxmuller_cuda +**/time_cuda +**/*.i diff --git a/GNUmakefile b/GNUmakefile @@ -0,0 +1,46 @@ +# This Makefile is EXTREMELY simple. Let's keep it that way. + +all: + @echo Random123 is a header-only package. There is nothing to build. + @echo 'However, "make install" understands prefix, DESTDIR, etc.,' + @echo 'and "make check" understands CFLAGS, CXXFLAGS, LDFLAGS, etc.' +.PHONY: all + +check: + cd tests && $(MAKE) runcore +.PHONY: check + +prefix?=/usr/local +includedir?=$(prefix)/include +datarootdir?=$(prefix)/share +datadir?=$(datarootdir) +docdir?=$(datarootdir)/doc/Random123 +export prefix includedir datarootdir datadir docdir + +install: install-html install-include install-examples install-tests +.PHONY: install + +# recursively copy include/Random123 to $(includedir) +install-include: + mkdir -p $(DESTDIR)$(includedir) + cp -dr include/Random123 $(DESTDIR)$(includedir) +.PHONY: install-include + +# Run doxygen to install html documentation +install-html: + mkdir -p $(DESTDIR)$(docdir) + cd docs; (cat Doxyfile; echo OUTPUT_DIRECTORY=$(DESTDIR)$(docdir)) | doxygen - +.PHONY: install-html + +# install-examples and install-tests copy files to +# $(DESTDIR)$(docdir). Since 'make check' (or other devel activity) +# might "pollute" the examples/ and tests/ directories, the files to +# be copied are enumerated in {examples,tests}/GNUmakefile. +install-examples: + cd examples; $(MAKE) install +.PHONY: install-examples + +install-tests: + cd tests; $(MAKE) install +.PHONY: install-tests + diff --git a/LICENSE b/LICENSE @@ -0,0 +1,31 @@ +/** @page LICENSE +Copyright 2010-2012, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ diff --git a/README.md b/README.md @@ -0,0 +1,421 @@ +# Random123: a Library of Counter-Based Random Number Generators + +The Random123 library is a collection of counter-based random +number generators (<!-- @ref CBRNG--> "CBRNGs") for CPUs (C and C++) and GPUs (CUDA and OpenCL), as described in +<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy +as 1, 2, 3</i>, Salmon, Moraes, Dror & Shaw, SC11, Seattle, Washington, USA, 2011, ACM </a>. +They are intended for use in statistical +applications and Monte Carlo simulation +and have passed all of the rigorous +SmallCrush, Crush and BigCrush tests in the +<a href="http://www.iro.umontreal.ca/~simardr/testu01/tu01.html"> +extensive TestU01 suite</a> of statistical tests for random number generators. +They are **not** suitable for use in cryptography or security +even though they are constructed using principles drawn from cryptography. + +The Random123 library is implemented entirely in header files. +See [below](#installation-and-testing), for how to +install and use the library, and how to generate documentation +with doxygen. + +CBRNGs are as fast as, or faster than conventional RNGs, much +easier to parallelize, use minimal memory/cache resources, and +require very little code. On modern architectures, the +Random123 CBRNGs require a few cycles per byte of random data +returned and return random data in convenient sizes (arrays of +two or four elements, each of which is an unsigned integer of 32 +or 64 bits). The range of random numbers is the full +representable range of the 32 or 64 bit unsigned integer) +The `<Random123/uniform.h>` header contains utility functions +to convert 32- and 64-bit unsigned integers to open or closed +ranges of single or double precision floating point numbers. + +The Random123 library was written by John Salmon and Mark Moraes. +It is available at <a href="https://github.com/DEShawResearch/random123"> +https://github.com/DEShawResearch/random123</a> +Archived releases are also +available from +<a href="http://deshawresearch.com/resources_random123.html"> +http://deshawresearch.com/resources_random123.html.</a> Please see +the <!-- @ref LICENSE--> "LICENSE" for terms and conditions. Please +send +feedback, including bug reports, suggestions, patches, etc. to +random123@deshawresearch.com. + +## Overview + +Unlike conventional RNGs, counter-based RNGs are +*stateless* functions (or function classes i.e. functors) whose +arguments are a *counter*, and a *key* +that return a result of the same type as the counter. + + result = CBRNGname(counter, key) + +The returned result is a deterministic function of the key and counter, +i.e. a unique (counter, key) tuple will always produce the same +result. The result is highly sensitive to small changes in the inputs, +so that the sequence of values produced by simply +incrementing the counter (or key) is effectively indistinguishable from a +sequence of samples of a uniformly distributed random variable. + +For all the CBRNGs in the Random123 library, the result and +counter are the same type, specifically an array of *N* words, +where words have a width of *W* bits, encapsulated in <!-- @ref +arrayNxW--> "r123arrayNxW" structs, or equivalently, for C++, in +the <!-- @ref r123::Array1x32--> "ArrayNxW" typedefs in the r123 +namespace. Keys are usually also arrayMxW types, but sometimes M is +a different size than the counter N (e.g. Philox keys have half the +number of elements as the counter, Threefry and ARS have the same number, +AES uses an opaque key type rather than an array) The N random +numbers returned in `result.v[]` are unsigned integers of +width W (32 or 64), and the range of the random numbers is the full +range of the unsigned integer of that width (i.e. 0 to 2^W-1) + +In C++, all public names (classes, structs, typedefs, etc) are in the +`r123` namespace. In C, the public names (functions, enums, structs, +typedefs) begin either with `r123` or with one of the RNG family names, e.g., +`threefry`, `philox`, `ars`, `aesni`. The RNG functions themselves have names like +`philox4x32`. C++ class names are capitalized, e.g., `Threefry4x32`. + +## <!--families--> The different families of Random123 generators + +Several families of CBRNGs are available in this version of the library: +<ul> +<li> <!-- @ref ThreefryNxW--> "Threefry" is a **non-cryptographic** +adaptation of the Threefish block cipher from the <a href="http://www.skein-hash.info/"> Skein Hash Function</a>. +See <!-- @ref--> r123::Threefry2x32, <!-- @ref--> r123::Threefry4x32, <!-- @ref--> r123::Threefry2x64, <!-- @ref--> r123::Threefry4x64. +<li> <!-- @ref PhiloxNxW--> "Philox" uses a Feistel network and integer multiplication. +See <!-- @ref--> r123::Philox2x32, <!-- @ref--> r123::Philox4x32, <!-- @ref--> r123::Philox2x64, <!-- @ref--> r123::Philox4x64. +The Nx64 forms are only available on hardware +that supports 64-bit multiplication producing a 128-bit result. +<li> <!@ref AESNI--> "AESNI" uses the Advanced Encryption Standard (AES) New Instruction, +available on certain modern x86 processors (some models of Intel Westmere and Sandy Bridge, +and AMD Interlagos, as of 2011). AESNI CBRNGs can operate on four 32bit words (internally converting +them to the 128bit SSE type needed by the AES-NI instructions, or on a single m128i "word", +which holds the SSE type. +See <!-- @ref--> r123::AESNI4x32, <!-- @ref--> r123::AESNI1xm128i. +<li> <!-- @ref AESNI--> "ARS" (Advanced Randomization System) is a **non-cryptographic** simplification of <!-- @ref AESNI--> "AESNI". +See <!-- @ref--> r123::ARS4x32_R, <!-- @ref--> r123::ARS1xm128i_R. +</ul> + +## Installation and Testing + +The Random123 library is implemented entirely in header files. Thus, +there is nothing to compile before using it and nothing to link after +you `#include` it in your source files. Simply direct your C or +C++ compiler to find the header files in the `include/` directory +of the cloned repo and use the Random123 +header files, types and functions in your application. + +There is a top-level GNUmakefile with "install" and "install-html" +targets. The former will copy header files to $(DESTDIR)$(includedir) +(default: /usr/local/include). The latter will run doxygen, with +OUTPUT_DIRECTORY=$(DESTDIR)$(docdir)/html (default: /usr/local/doc/Random123/html). + +In addition to the `include/` files which implement the library, the +distribution also contains an `examples/` and a `tests/` directory. Users are +**STRONGLY ADVISED** to compile and run the tests in `tests/` before using +Random123 in an application (see <!-- @ref TestsREADME--> `tests/README`). +Do not use the library if any tests fail. (It is not a failure for +a test to report that it cannot run because of missing +hardware capabilities like 64bit multiply, +SSE, AES-NI or compiler capabilities) + +## Usage + +### C++ API + +A typical C++ use case might look like: + +``` +#include <Random123/philox.h> + +typedef r123::Philox4x32 RNG; +RNG rng; +RNG::ctr_type c={{}}; +RNG::ukey_type uk={{}}; +uk[0] = ???; // some user_supplied_seed +RNG::key_type k=uk; + +for(...){ + c[0] = ???; // some loop-dependent application variable + c[1] = ???; // another loop-dependent application variable + RNG::ctr_type r = rng(c, k); + // use the random values in r for some operation related to + // this iteration on objectid +} +``` + +On each iteration, `r` contains an array of 4 32-bit random values that +will not be repeated by any other call to `rng` as long as `c` and `k` +are not reused. + +In the example above, we use the <!-- @ref--> r123::Philox4x32, but any of the +other <!-- @ref CBRNG--> "CBRNGs" would serve equally well. Also note that +for most CBRNGs, the `ukey_type` and the `key_type` are identical; the code +could just as well ignore the `ukey_type` and directly construct the +`key_type`. However, for the <!-- @ref AESNI--> "AESNI" CBRNGs, the `key_type` is opaque, and +must be constructed from a `ukey_type`, as shown. + +### The C API + +In C, the example above could be written as: +``` +#include <Random123/philox.h> + +philox4x32_ctr_t c={{}}; +philox4x32_ukey_t uk={{}}; + +uk.v[0] = user_supplied_seed; +philox4x32_key_t k = philox4x32keyinit(uk); + +for(...){ + c.v[0] = ???; /* some loop-dependent application variable */ + c.v[1] = ???; /* another loop-dependent application variable */ + philox4x32_ctr_t r = philox4x32(c, k); +} +``` + +In C, access to the contents of the counter and key is through +the fixed-size array member `v`. + +## The CUDA platform + +All relevant functions in the C and C++ APIs for Random123 are declared +as CUDA device functions if they are included in a CUDA kernel source file +and compiled with a CUDA compiler (nvcc). They can be used exactly +as described/documented for regular C or C++ programs. Note that +CUDA device functions and host functions share the same namespace, so +it is not currently possible to use Random123 functions in +both the host portion and the device portion of the same .cu source file. +To work around this, you must compile Random123-using host code in +a separate .c source file from your .cu device-resident code. +The Nx32 forms are faster than the Nx64 variants on current (2011) +32-bit GPU architectures. + +It has been reported that Random123 uses 16 bytes of +static memory per thread. This is undesirable and not intentional, +but we do not have a workaround other than to suggest adjusting memory +allocation accordingly. + +The +pi_cuda.cu and pi_cudapp.cu examples illustrate the use of CUDA. + +In a machine with different GPUs, the +R123EXAMPLE_ENVCONF_CUDA_DEVICE environment variable can be set +to a unique substring of the CUDA GPU device name to select a +specific GPU (else examples try to choose the GPU with the most +cores) + +## The OpenCL platform + +The functions in the Random123 C API can all be used in +OpenCL kernels, just as in regular C functions. +As with CUDA, the Nx32 forms are faster than the Nx64 variants on current (2011) +32-bit GPU architectures. + +The `pi_opencl.c` and `pi_opencl_kernel.ocl` examples illustrate the use +of OpenCL. + +In a machine with different OpenCL devices, the +R123EXAMPLE_ENVCONF_OPENCL_DEVICE environment variable can be +set to a unique substring of the OpenCL device name to select a +specific OpenCL device (else examples try to choose the device +with the most cores) + +## C++11 \<random\> interface + +In addition to the stateless ("pure/functional") C++ API above, +the Random123 package includes two C++ classes +that leverage the C++11 \<random\> API. + +<ul> +<li>r123::MicroURNG provides an adapter class that provides a +more conventional interface compatible with the C++11 URNG +(uniform random number generator) API; the MicroURNG adapter can +be used with C++11 random number distributions and is +fast/lightweight enough that a new MicroURNG can be instantiated +with a unique key,counter tuple and used for each call to a +distribution, there is little or no overhead to creating +billions of unique MicroURNGs. This adapter retains one of the +key advantages of CBRNGs -- complete application control over +the RNG state. +<li>r123::Engine provides the C++11 Random Engine API. This can +also be used with any of the C++11 random distributions, but +sacrifices the application control over RNG state that is a +defining characteristic of CBRNGs. +</ul> + +## The GNU Scientific Library (GSL) interface + +In addition to the stateless ("pure/functional") C API above, +the Random123 package includes two C adapter interfaces +to the <a href="http://www.gnu.org/s/gsl/">GNU Scientific Library (GSL).</a> + +<ul> +<li>The <!--\ref--> GSL_MICRORNG macro allows the application to +define a GSL random number generator. It +can be used with GSL random distributions but still provides the +application with complete control over the RNG state (it is +analogous to the MicroURNG class, in that it uses shorter +periods, and is intended to be instantiated in large numbers for +a few calls to the random distribution). +<li>The <!--\ref--> GSL_CBRNG macro allows the application to create a GSL +RNG with a completely conventional interface, sacrificing +application control over the internal RNG state. +</ul> + +## Generating uniformly distributed and Gaussian distributed floats and doubles + +The Random123 library provides generators for uniformly distributed +random **integers**. Often, applications want random **real** values or +samples from other distributions. The general problem of generating +samples from arbitrary distributions is beyond the scope of the Random123 +library. One can, of course, use GSL or MicroURNG and the +distributions in the C++11 \<random\> library, but a few simple cases +are common enough that all that extra machinery seems like overkill. +We have included a few generic conversion utilities which developers may +find useful. + +<ul> +<li> uniform.hpp - C++ functions that convert random integers to + random, uniformly distributed floating point values. +<li> u01fixedpt.h - C functions that convert random integers to + random, uniformly distributed, equi-spaced, i.e., fixed point, + values. +<li> boxmuller.hpp - C++ functions that take two + uniformly distributed integers (32 or 64 bit) and + return a pair of Gaussian distributed floats or doubles. +</ul> + +The Box-Muller method of generating Gaussian random variables is +particularly well suited to Random123 because it deterministically +consumes exactly two uniform randoms to generate exactly two gaussian +randoms. It uses math library functions: sincos, log and sqrt which +may be slow on some platforms, but which are surprisingly fast on +others. Notably, on GPUs, the lack of branching in the Box-Muller +method and hardware support for math functions overcomes the +transcendental function overhead, making it the fastest generator of +Gaussians that we are aware of. + +## Examples + +The <!-- @ref ExamplesREADME--> "examples/" directory, contains example code +intended to illustrate use of the library. + +Complete, short programs estimate pi by counting the number of random +points that fall inside a circle inscribed in a square, demonstrating +the C, C++, AES, GSL, OpenCL, CUDA and C++11 APIs. The environment +variable R123EXAMPLE_ENVCONF_SEED can be set to any unsigned integer value to run +the example with a different seed. Many of the pi_* examples run different +numbers of iterations if that number is specified as the first argument +on the command line. + +### Tests and Benchmarks + +The <!-- @ref TestsREADME--> "tests/" directory contains tests and benchmarks. +This code is complicated due to the fact that it is +largely "single source" for CUDA, OpenCL and CPU implmentations. +Developers are strongly discouraged from emulating its style. +It contains: +<ul> +<li> Unit tests for individual components and "known-answer-tests", which +should be run to ensure that these RNGs build correctly on desired platforms. +These help to provide assurance that the code is being compiled correctly. +<li> A variety of timing harnesses are provided +which measure performance of a variety of generators in different +programming environments. +</ul> + +## Portability + +Although we have done our best to make Random123 portable and standards conforming, +it is an unfortunate fact that there is no portable code. There is only +code that has been ported. + +Prior to release, we test Random123 on a variety of systems and with a +variety of toolchains that are readily available to us. Our +current test environment includes: + +<ul> +<li> Linux, gcc-5.2.0, 6.3.0, 8.1.0 using -march=native on Xeon hardware with + AES and SSE4_2 and AVX2 support. +<li> Linux, gcc-5.2.0 using -m32. +<li> Linux, clang-8.0.0 with libc++ (8.0.0) on Xeon hardware. +<li> Linux, CentOS7 using the vendor supplied gcc toolchain (4.8.5-16). +<li> Linux, Ubuntu 16.04(LTS) using the vendor supplied gcc toolchain (5.4.0-6ubuntu1-16.04.11). +<li> Linux, Ubuntu 16.04(LTS) using OpenCL beignet 1.1.1-2 and https://github.com/intel/compute-runtime/releases/tag/19.07.12410 +<li> Linux, Ubuntu 18.04(LTS) with clang-11.0.1 and both libc++ and libstdc++. +<li> Linux, icc-18.0.3 on Xeon hardware with AES, SSE4 and AVX2 support. +<li> Linux, NVIDIA CUDA 10.0.130 with GTX 980 and 1080, and Titan RTX (aka Turing) hardware. +<li> MacOS, with Xcode-10.1 and Metal on a 2018 Mac mini. +</ul> + +In the past, we have tested Random123 with additional toolchains and +hardware. Although we no longer test on these platforms, we know of +no reason that they should not work. + +<ul> +<li>Linux, gcc (multiple versions from 3.4.3 through 6.3.0), on x86_64. +<li>Linux, gcc-4.1.2 and 4.4.1 on i686. +<li>Linux, gcc-4.8 on ARMv7 (32bit) Freescale/NXP LS1021A & ARM A53 (64bit) Freescale/NXP 1043A. +<li>Linux, clang-2.9, 3.0, 3.1, 3.3 and 3.6 on x86_64. +<li>Linux, clang-3.0 and 3.1 with lib++ (2012-04-19 svn checkout) on x86_64. +<li>Linux, clang-8.0.0 with libc++ on x86_64 +<li>Linux, open64-4.2.4 on x86_64. +<li>Linux, Intel icc and icpc 12.0.2 on x86_64. +<li>Linux, NVIDIA CUDA 4.1.15, 4.2.6, 5.5.22 and 7.5.1. (NOTE: We recommend against the use of CUDA before 4.1) +<li>Linux, OpenCL (NVIDIA SDK 4.0.17) on GTX480, M2090, GTX580 and GTX680 GPUs. +<li>Linux, OpenCL (AMD APP SDK 2.4 or 2.5), on x86_64 CPUs and Radeon HD6970 GPUs. +<li>Linux, OpenCL (Intel OpenCL 1.5), on x86_64 CPUs. +<li>Solaris, both gcc-3.4.3 and Sun C/C++ 5.8, on x86_64. +<li>FreeBSD 8.2, gcc-4.2.1, on x86_64. +<li>MacOS X 5.8, gcc-4.0.1, on i686. +<li>MacOS X 5.8, llvm-2.9.1 on i686 (problems with catching C++ exceptions). +<li>Windows 7, Microsoft Visual Studio, version 10.0, Microsoft C/C++ compiler 16.00. +</ul> + +Others have reported success on +<ul> +<li>MacOS, OpenCL on x86_64 CPUs +<li>Linux, gcc-4.7.2 on Powerpc64 (BlueGene/Q) +<li>Linux, Portland Group Compiler on Powerpc64 (BlueGene/Q) +<li>Linux, IBM xlc on Powerpc64 (BlueGene/Q) +<li>MacOS, Metal on x86_64 CPUs and AMD Radeon R9 M380 GPU +</ul> + +## Warnings + +With some compilation options, the CUDA nvcc compiler warns about +unreachable code in array.h. The compiler doesn't recognize that the +code that is unreachable for some values of some macro parameters, is +actually reachable for other values of the parameters. It is possible +to disable that particular warning for a specific compilation unit by +adding -Wcudafe&nbsp;--diag_suppress=111 to the compilation command +line. + +On our ARMv7 test platform, we suspect a compiler bug with -O3, +which does not seem to affect Random123 code itself, but +produces nondeterministic results from time_serial. The +offending compiler version was +"aarch64-fsl-linux-gcc&nbsp;(Linaro&nbsp;GCC&nbsp;4.8-2014.04)&nbsp;4.8.3&nbsp;20140401&nbsp;(prerelease)". +We slightly reordered a couple of innocuous statements (a +timer() and dprintf() call) in time_serial to avoid the bug, but +we would avoid -O3 on ARMv7 with that particular version of the +compiler at least. + +## Contributors + +We welcome bug reports, new ports, success stories or any +feedback to random123@deshawresearch.com + +We are grateful for contributions from the following users: +<ul> +<li> Geoffrey Irving and Gabriel Rockefeller - BlueGene/Q and powerpc ports +<li> Yan Zhou - MacOS and clang ports +<li> David Lawrie - allowing 64-bit philox to compile for both host and device with CUDA +<li> Bogdan Opanchuk - pointing out the inconsistent rotation constants in the implementation of threefry2xW in version 1.07 and earlier. +<li> Tom Schoonjans - Support for Metal (Apple's successor to OpenCL). +</ul> + + diff --git a/docs/Doxyfile b/docs/Doxyfile @@ -0,0 +1,44 @@ +# generated with doxygen -g and edited +# Doxyfile 1.8.11 + +PROJECT_NAME = "Random123" +STRIP_FROM_PATH = ../include .. +STRIP_FROM_INC_PATH = ../include/ +TAB_SIZE = 8 +EXTENSION_MAPPING = .h=C++ +MARKDOWN_SUPPORT = NO +AUTOLINK_SUPPORT = NO +EXTRACT_ALL = YES +EXTRACT_STATIC = YES +INPUT = main.dox cbrng.dox releasenotes.dox \ + ../include/Random123 \ + ../include/Random123/conventional \ + ../include/Random123/features/sse.h \ + ../include/Random123/features/compilerfeatures.h \ + ../tests/README \ + ../examples/README \ + ../LICENSE + +#USE_MDFILE_AS_MAINPAGE = + +HTML_HEADER = header.html +HTML_TIMESTAMP = YES +GENERATE_LATEX = NO +MACRO_EXPANSION = YES + +PREDEFINED = \ + "R123_STATIC_ASSERT(e,m)= " \ + "R123_FORCE_INLINE(decl)= decl " \ + "R123_STATIC_INLINE= static inline " \ + "R123_CUDA_DEVICE= " \ + "__cplusplus " \ + "R123_USE_SSE= 1" \ + "R123_USE_AES_NI= 1" \ + "R123_USE_U01_DOUBLE= 1" \ + "R123_USE_PHILOX_64BIT= 1" \ + "R123_USE_64BIT= 1" \ + "R123_USE_CXX11_STD_ARRAY= 1" +EXPAND_AS_DEFINED = \ + R123_ULONG_LONG \ + R123_STATIC_INLINE \ + R123_CUDA_DEVICE diff --git a/docs/cbrng.dox b/docs/cbrng.dox @@ -0,0 +1,198 @@ +/** +@page CBRNG Counter Based RNGs (CBRNGs). + +The counter-based random number generators (CBRNGs) +in the Random123 library are described in more detail in +<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>, +which was named the Best Paper at the ACM SC'11 International Conference on High Performance Computing, Networking, +Storage, and Analysis. +All the CBRNGs in the library conform to a consistent +interface. Basically: +\verbatim + value = CBRNGname(counter, key) +\endverbatim + +Thus, with some care, they can be used +interchangeably in applications. (Since code +compiled with AES-NI instructions will result +in an illegal instruction exception on processors +without those instructions, Random123 provides a +@ref haveAESNI function that can be used +to detect the existence of AES at run-time; +user code could use it to either report an +error or substitute an alternative compatible +CBRNG.) + +The API descriptions below are generic, but apply to +all the different @ref families "families" of +Random123 CBRNGs. + +\section arrays Fixed-size Array Types + +Data is passed into and back from the Random123 functions as +@ref arrayNxW "r123arrayNxW" +types; these types +contain fixed-size arrays of W-bit types (\c uintW_t for the +most part, but also a special r123m128i wrapper for the @ref +AESNI "ARS and AESNI" CBRNGs). The counter argument +and the return value have the same type, +referred to as \c ctr_type in C++, and \c ctr_t in C. The +type of the key argument is referred to as \c key_type in C++, +and \c key_t in C. +For an @ref arrayNxW "r123arrayNxW", \c r, the data member \c r.v is an array of N elements, +each of width W (each element is +type \c uintW_t or an r123m128i wrapper object). +C programs can access these elements as \c r.v[0], ... \c r.v[N-1] for +the \c uintW_t types. + +In C++, these array types closely resemble the C++0x std::array<N, uintW_t> template, but do not +require C++11 libraries or compiler features. +C++ programs can access array elements via operator[] +\c r[0], ... \c r[N-1], or via most of the capabilities +of a C++ "Container" e.g. \c at(), \c begin(), \c end(), +\c size() and others. In addition, containers have <c> incr() </c> and <c> incr(unsigned long long)</c> +member function that do increment-with-carry, which facilitate +using r123arrays as very-long-period counters. + +If the compiler environment supports it, +\c Random123/array.h also declares \c r123array1xm128i, which contains an array of one +\c r123m128i, which in turn is a class wrapping a single element +of \c __m128i SSE type, which can be accessed as \c r.v[0].m. +The @ref r123::ARS1xm128i_R RNGs +use \c r123array1xm128i for both \c ctr_type and \c key_type. +For the @ref AESNI "AESNI" RNG, \c ctr_type is an \c r123array1xm128i, but +\c key_type is an opaque type, which must be initialized +by assignment from a <c>userkey_type</c> (an r123array1xm128i). + +\section aliasing A note on aliasing and type-punning +It is easiest (though not necessarily fastest) to choose a CBRNG whose +\c ctr_type matches the width of the random data needed by the +application, e.g., Philox4x32 for applications that need random data in +32-bit words. If the application's needs don't match the counter's value_type, +it is tempting to use "type punning" and pointer casts to interconvert between +types. Such conversions require great care and are very difficult to do +safely without use of unions or memcpy. +See <a +href="http://blog.worldofcoding.com/2010/02/solving-gcc-44-strict-aliasing-problems.html"> +here</a> +and +<a href="http://dbp-consulting.com/tutorials/StrictAliasing.html"> +here</a> +for discussions of the pitfalls related to aliasing. +The C++ +@ref r123::ReinterpretCtr template is a safe way to reinterpret \c CBRNG +counter types. +Gcc's \c +-Wstrict-aliasing=2 warning level will warn if strict aliasing +violations are detected. If you find yourself ignoring or disabling +warnings about strict aliasing, you should strongly consider adding something +like gcc's \c -fnostrict-aliasing option to your compiler +flags. + +\section cxxapi C++ API + +There are four families of CBRNGs in the library: +<ul> +<li> @ref ThreefryNxW "Threefry": @ref r123::Threefry2x32, @ref r123::Threefry4x32, @ref r123::Threefry2x64, @ref r123::Threefry4x64 +<li> @ref PhiloxNxW "Philox": @ref r123::Philox2x32, @ref r123::Philox4x32, @ref r123::Philox2x64, @ref r123::Philox4x64 +<li> @ref r123::AESNI4x32, r123::AESNI1xm128i +<li> @ref r123::ARS4x32_R +</ul> + +A <i> counter based RNG </i> (CBRNG) with a name of the form +<i>FamilynameN</i>x<i>W</i> is a type G +with the three member typedefs: + +<ul> +<li> G::ctr_type, which is an @ref arrayNxW "r123arrayNxW" container class. +<li> G::ukey_type, which is an @ref arrayNxW "r123arrayMxV" container class. +Note that the width, \c MxV of the key +may not be the same as the width \c NxW of +the ctr_type (@ref PhiloxNxW "Philox" keys are half as wide as the counter, +and future CBRNGs may well have different widths). +<li> G::key_type, which in most cases is identical to +G::ukey_type, but is different for the @ref AESNI "AESNI" types. +In all cases, there is a G::key_type(G::ukey_type) constructor +and a G::key_type assignment operator for a G::ukey_type +right-hand-side. In general, one can always write: +@code + G::ukey_type uk1, uk2; + // user code initializes uk1 and uk2 + G::key_type k1(uk1), k2; + k2 = uk2; +@endcode +</ul> +For most CBRNG's, i.e., any one not in the @ref AESNI "AESNI" family, it is also +perfectly acceptable to set the elements of a G::key_type directly from application variables. +The quality of the results will not be compromised by using highly correlated +or "non-random" keys. + +A value \c g of type \c G can be invoked as <c>g(c,k)</c>, where \c c +is a value of type \c G::ctr_type and \c k is a value of type \c G::key_type, +and <c>g(c,k)</c> returns a value of type \c G::ctr_type. + +<ul> +<li> g() is a stateless, pure function. That is, g(c,k) may be called +any number of times in any context and always returns the same result +for the same inputs. In particular, c1==c2 and k1==k2 implies that g(c1,k1) +== g(c2,k2). +<li> For constant k, g(*,k) is a bijection. That is, +g(c1,k) == g(c2,k) if and only if c1 == c2. +<li> g "randomizes" its inputs. That is, +for most sequences of inputs (c1,k1), +(c2, k2), ... (including those obtained by following highly +regular patterns of incrementing and striding +through the counter and user key spaces) the output sequence, g(c1, k1), +g(c2, k2), ... looks like a a sequence of uniformly distributed +random variables drawn from the set of all ctr_types. +</ul> + +All the CBRNGs in the library work by iterating a randomization function for a specific number of \e rounds. +Too few rounds and the CBRNG is a poor (perhaps +catastrophically poor) random number generator. Too many rounds and time is wasted +with little or no improvement in the randomness of the output. Each of the CBRNGs +has a specific number of rounds which the authors believe is a reasonable compromise +between speed and quality. In all cases, the default number of rounds includes a margin +of safety above the minimum number of rounds that have passed all of the SmallCrush, Crush and BigCrush +tests in the <a href="http://www.iro.umontreal.ca/~simardr/testu01/tu01.html"> TestU01</a> suite. + +Users may, however wish to employ a different numbers of rounds. Each of the above +classes is actually a typedef of a more general class with a template parameter that +specifies the number of rounds as <i>name</i>_rounds. The template classes all end in \c _R: + +<ul> +<li> @ref ThreefryNxW "Threefry": @ref r123::Threefry2x32_R, @ref r123::Threefry4x32_R, @ref r123::Threefry2x64_R, @ref r123::Threefry4x64_R +<li> @ref PhiloxNxW "Philox": @ref r123::Philox2x32_R, @ref r123::Philox4x32_R, @ref r123::Philox2x64_R, @ref r123::Philox4x64_R +<li> @ref r123::AESNI4x32_R, r123::AESNI1xm128i_R +<li> @ref r123::ARS4x32_R +</ul> + +\section capi C API + +A subset of the C++ interface +is also directly usable by C programs. All header files may be +safely included in C files. The C API to each of the +supported RNGs consists of two typedefs, <i>name</i>_ctr_t, +<i>name</i>_key_t, two functions <i>name</i>() and <i>name</i>_R(), and +the enum <i>name</i>_rounds which specifies the recommended number of rounds. +<ul> +<li> <i>name</i>(c, k), performs the recommended number of rounds of the <i>name</i> CBRNG. +<li> <i>name_R</i>(R,c,k), performs an R-round version of the <i>name</i> CBRNG. +<i>name</i>(c,k) is equivalent to +<i>name</i>_R(<i>name</i>_rounds, c, k). +</ul> + +The \c _R functions are designed and implemented so that an optimizing compiler can achieve good performance +when the number of rounds is a compile-time constant. It is likely that <c>philox4x32_R(10,c,k) </c> +will perform much better than <c>philox4x32_R(r,c,k)</c> if \c r cannot be +evaluated at compile-time. + +The supported names for the C API are +<ul> +<li> @ref ThreefryNxW "threefry": @ref threefry2x32, @ref threefry4x32, @ref threefry2x64, @ref threefry4x64. +<li> @ref PhiloxNxW "philox": @ref philox2x32, @ref philox4x32, @ref philox2x64, @ref philox4x64. +<li> @ref ars4x32_R, @ref ars1xm128i_R +<li> @ref aesni4x32, @ref aesni1xm128i +</ul> + +*/ diff --git a/docs/header.html b/docs/header.html @@ -0,0 +1,11 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<title>$title</title> +<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/> +$search +<link href="$relpath$doxygen.css" rel="stylesheet" type="text/css"/> +</head> +<body onload='searchBox.OnSelectItem(0);'> +<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">$projectname $projectnumber Documentation</li></ul></div> diff --git a/docs/main.dox b/docs/main.dox @@ -0,0 +1,421 @@ +/** +@mainpage Random123: a Library of Counter-Based Random Number Generators + +The Random123 library is a collection of counter-based random +number generators (@ref CBRNG "CBRNGs") for CPUs (C and C++) and GPUs (CUDA and OpenCL), as described in +<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy +as 1, 2, 3</i>, Salmon, Moraes, Dror & Shaw, SC11, Seattle, Washington, USA, 2011, ACM </a>. +They are intended for use in statistical +applications and Monte Carlo simulation +and have passed all of the rigorous +SmallCrush, Crush and BigCrush tests in the +<a href="http://www.iro.umontreal.ca/~simardr/testu01/tu01.html"> +extensive TestU01 suite</a> of statistical tests for random number generators. +They are \b not suitable for use in cryptography or security +even though they are constructed using principles drawn from cryptography. + +The Random123 library is implemented entirely in header files. +See @ref install "below", for how to +install and use the library, and how to generate documentation +with doxygen. + +CBRNGs are as fast as, or faster than conventional RNGs, much +easier to parallelize, use minimal memory/cache resources, and +require very little code. On modern architectures, the +Random123 CBRNGs require a few cycles per byte of random data +returned and return random data in convenient sizes (arrays of +two or four elements, each element is an unsigned integer of 32 +or 64 bits. The range of random numbers is the full +representable range of the 32 or 64 bit unsigned integer) +The \c <Random123/u01.h> header contains utility functions +to convert 32- and 64-bit unsigned integers to open or closed +ranges of single or double precision floating point numbers. + +The Random123 library was written by John Salmon and Mark Moraes. It is +available from +<a href="http://deshawresearch.com/resources_random123.html"> +http://deshawresearch.com/resources_random123.html.</a> Please see +the @ref LICENSE "license" for terms and conditions. Please +send +feedback, including bug reports, suggestions, patches, etc. to +random123@deshawresearch.com. + +\section overview Overview + +Unlike conventional RNGs, counter-based RNGs are +<b>stateless</b> functions (or function classes i.e. functors) whose +arguments are a \e counter, and a \e key +that return a result of the same type as the counter. + + result = CBRNGname(counter, key) + +The returned result is a deterministic function of the key and counter, +i.e. a unique (counter, key) tuple will always produce the same +result. The result is highly sensitive to small changes in the inputs, +so that the sequence of values produced by simply +incrementing the counter (or key) is effectively indistinguishable from a +sequence of samples of a uniformly distributed random variable. + +For all the CBRNGs in the Random123 library, the result and +counter are the same type, specifically an array of \e N words, +where words have a width of \e W bits, encapsulated in @ref +arrayNxW "r123arrayNxW" structs, or equivalently, for C++, in +the @ref r123::Array1x32 "ArrayNxW" typedefs in the r123 +namespace. Keys are usually also arrayMxW types, but sometimes M is +a different size than the counter N (e.g. Philox keys are half the +number of elements as the counter, Threefry and ARS are the same number, +AES uses an opaque key type rather than an array) The N random +numbers returned in \c result.v[] are unsigned integers of +width W (32 or 64), and the range of the random numbers is the full +range of the unsigned integer of that width (i.e. 0 to 2^W-1) + +In C++, all public names (classes, structs, typedefs, etc) are in the +\c r123 namespace. In C, the public names (functions, enums, structs, +typedefs) begin either with \c %r123 or with one of the RNG family names, e.g., \c +threefry, \c philox, \c ars, \c aesni. The RNG functions themselves have names like +\c philox4x32. C++ class names are capitalized, e.g., \c Threefry4x32. + +\section families The different families of Random123 generators + +Several families of CBRNGs are available in this version of the library: +<ul> +<li> @ref ThreefryNxW "Threefry" is a <b>non-cryptographic</b> +adaptation of the Threefish block cipher from the <a href="http://www.skein-hash.info/"> Skein Hash Function</a>. +See @ref r123::Threefry2x32, @ref r123::Threefry4x32, @ref r123::Threefry2x64, @ref r123::Threefry4x64. +<li> @ref PhiloxNxW "Philox" uses a Feistel network and integer multiplication. +See @ref r123::Philox2x32, @ref r123::Philox4x32, @ref r123::Philox2x64, @ref r123::Philox4x64. +The Nx64 forms are only available on hardware +that supports 64-bit multiplication producing a 128-bit result. +<li> @ref AESNI "AESNI" uses the Advanced Encryption Standard (AES) New Instruction, +available on certain modern x86 processors (some models of Intel Westmere and Sandy Bridge, +and AMD Interlagos, as of 2011). AESNI CBRNGs can operate on four 32bit words (internally converting +them to the 128bit SSE type needed by the AES-NI instructions, or on a single m128i "word", +which holds the SSE type. +See @ref r123::AESNI4x32, @ref r123::AESNI1xm128i. +<li> @ref AESNI "ARS" (Advanced Randomization System) is a \b non-cryptographic simplification of @ref AESNI "AESNI". +See @ref r123::ARS4x32_R, @ref r123::ARS1xm128i_R. +</ul> + +\section install Installation and Testing + +The Random123 library is implemented entirely in header files. Thus, +there is nothing to compile before using it and nothing to link after +you <c>\#include</c> it in your source files. Simply direct your C or +C++ compiler to find the header files in the \c include/ directory +of the cloned repo and use the Random123 +header files, types and functions in your application. + +There is a top-level GNUmakefile with "install" and "install-html" +targets. The former will copy header files to $(DESTDIR)$(includedir) +(default: /usr/local/include). The latter will run doxygen, with +OUTPUT_DIRECTORY=$(DESTDIR)$(docdir)/html (default: /usr/local/doc/Random123/html). + +In addition to the \c include/ files which implement the library the +distribution also contains an \c examples/ and a \c tests/ directory. Users are <b> +STRONGLY ADVISED </b> to compile and run the tests in tests/ before using +Random123 in an application (see <c> @ref TestsREADME "tests/README"</c>). +Do not use the library if any tests fail. (It is not a failure for +a test to report that it cannot run because of missing +hardware capabilities like 64bit multiply, +SSE, AES-NI or compiler capabilities) + +\section usage Usage + +\subsection CxxAPI C++ API + +A typical C++ use case might look like: + +@code +#include <Random123/philox.h> + +typedef r123::Philox4x32 RNG; +RNG rng; +RNG::ctr_type c={{}}; +RNG::ukey_type uk={{}}; +uk[0] = ???; // some user_supplied_seed +RNG::key_type k=uk; + +for(...){ + c[0] = ???; // some loop-dependent application variable + c[1] = ???; // another loop-dependent application variable + RNG::ctr_type r = rng(c, k); + // use the random values in r for some operation related to + // this iteration on objectid +} +@endcode + +On each iteration,\c r contains an array of 4 32-bit random values that +will not be repeated by any other call to \c rng as long as \c c and \c k +are not reused. + +In the example above, we use the @ref r123::Philox4x32, but any of the +other @ref CBRNG "CBRNGs" would serve equally well. Also note that +for most CBRNGs, the ukey_type and the key_type are identical; the code +could just as well ignore the ukey_type and directly construct the +key_type. However, for the @ref AESNI "AESNI" CBRNGs, the key_type is opaque, and +must be constructed from a ukey_type, as shown. + +\subsection Capi The C API + +In C, the example above could be written as: +@code +#include <Random123/philox.h> + +philox4x32_ctr_t c={{}}; +philox4x32_ukey_t uk={{}}; + +uk.v[0] = user_supplied_seed; +philox4x32_key_t k = philox4x32keyinit(uk); + +for(...){ + c.v[0] = ???; /* some loop-dependent application variable */ + c.v[1] = ???; /* another loop-dependent application variable */ + philox4x32_ctr_t r = philox4x32(c, k); +} +@endcode + +In C, access to the contents of the counter and key is through +the fixed-size array member \c v. + +\section cuda The CUDA platform + +All relevant functions in the C and C++ APIs for Random123 are declared +as CUDA device functions if they are included in a CUDA kernel source file +and compiled with a CUDA compiler (nvcc). They can be used exactly +as described/documented for regular C or C++ programs. It is now +possible to use Random123 functions in +both the host portion and the device portion of the same .cu source file. +The Nx32 forms were faster than the Nx64 variants on +32-bit GPU architectures in 2011, but we haven't measured this recently. + +It has been reported that Random123 uses 16 bytes of +static memory per thread. This is undesirable and not intentional, +but we do not have a workaround other than to suggest adjusting memory +allocation accordingly. + +The +pi_cuda.cu and pi_cudapp.cu examples illustrate the use of CUDA. + +In a machine with different GPUs, the +R123EXAMPLE_ENVCONF_CUDA_DEVICE environment variable can be set +to a unique substring of the CUDA GPU device name to select a +specific GPU (else examples try to choose the GPU with the most +cores) + +\section opencl The OpenCL platform + +The functions in the Random123 C API can all be used in +OpenCL kernels, just as in regular C functions. +As with CUDA, the Nx32 forms are faster than the Nx64 variants on current (2011) +32-bit GPU architectures. + +The pi_opencl.c and pi_opencl_kernel.ocl examples illustrate the use +of OpenCL. + +In a machine with different OpenCL devices, the +R123EXAMPLE_ENVCONF_OPENCL_DEVICE environment variable can be +set to a unique substring of the OpenCL device name to select a +specific OpenCL device (else examples try to choose the device +with the most cores) + +\section cplusplus0x C++11 \<random\> interface + +In addition to the stateless ("pure/functional") C++ API above, +the Random123 package includes two C++ classes +that leverage the C++11 \<random\> API. + +<ul> +<li>r123::MicroURNG provides an adapter class that provides a +more conventional interface compatible with the C++11 URNG +(uniform random number generator) API; the MicroURNG adapter can +be used with C++11 random number distributions and is +fast/lightweight enough that a new MicroURNG can be instantiated +with a unique key,counter tuple and used for each call to a +distribution, there is little or no overhead to creating +billions of unique MicroURNGs. This adapter retains one of the +key advantages of CBRNGs -- complete application control over +the RNG state. +<li>r123::Engine provides the C++11 Random Engine API. This can +also be used with any of the C++11 random distributions, but +sacrifices the application control over RNG state that is a +defining characteristic of CBRNGs. +</ul> + +\section gsl The GNU Scientific Library (GSL) interface + +In addition to the stateless ("pure/functional") C API above, +the Random123 package includes two C adapter interfaces +to the <a href="http://www.gnu.org/s/gsl/">GNU Scientific Library (GSL).</a> + +<ul> +<li>The \ref GSL_MICRORNG macro allows the application to +define a GSL random number generator. It +can be used with GSL random distributions but still provides the +application with complete control over the RNG state (it is +analogous to the MicroURNG class, in that it uses shorter +periods, and is intended to be instantiated in large numbers for +a few calls to the random distribution). +<li>The \ref GSL_CBRNG macro allows the application to create a GSL +RNG with a completely conventional interface, sacrificing +application control over the internal RNG state. +</ul> + +\section u01 Generating uniformly distributed and Gaussian distributed floats and doubles + +The Random123 library provides generators for uniformly distributed +random \b integers. Often, applications want random \b real values or +samples from other distributions. The general problem of generating +samples from arbitrary distributions is beyond the scope of the Random123 +library. One can, of course, use GSL or MicroURNG and the +distributions in the C++11 \<random\> library, but a few simple cases +are common enough that all that extra machinery seems like overkill. +We have included a few generic conversion utilities which developers may +find useful. + +<ul> +<li> uniform.hpp - C++ functions that convert random integers to + random, uniformly distributed floating point values. +<li> u01fixedpt.h - C functions that convert random integers to + random, uniformly distributed, equi-spaced, i.e., fixed point, + values. +<li> boxmuller.hpp - C++ functions that take two + uniformly distributed integers (32 or 64 bit) and + return a pair of Gaussian distributed floats or doubles. +</ul> + +The Box-Muller method of generating Gaussian random variables is +particularly well suited to Random123 because it deterministically +consumes exactly two uniform randoms to generate exactly two gaussian +randoms. It uses math library functions: sincos, log and sqrt which +may be slow on some platforms, but which are surprisingly fast on +others. Notably, on GPUs, the lack of branching in the Box-Muller +method and hardware support for math functions overcomes the +transcendental function overhead, making it the fastest generator of +Gaussians that we are aware of. + +\subsection examples Examples + +The @ref ExamplesREADME "examples/" directory, contains example code +intended to illustrate use of the library. + +Complete, short programs estimate pi by counting the number of random +points that fall inside a circle inscribed in a square, demonstrating +the C, C++, AES, GSL, OpenCL, CUDA and C++11 APIs. The environment +variable R123EXAMPLE_ENVCONF_SEED can be set to any unsigned integer value to run +the example with a different seed. Many of the pi_* examples run different +numbers of iterations if that number is specified as the first argument +on the command line. + +\subsection tests Tests and Benchmarks + +The @ref TestsREADME "tests/" directory contains tests and benchmarks. +This code is complicated due to the fact that it is +largely "single source" for CUDA, OpenCL and CPU implmentations. +Developers are strongly discouraged from emulating its style. +It contains: +<ul> +<li> Unit tests for individual components and "known-answer-tests", which +should be run to ensure that these RNGs build correctly on desired platforms. +These help to provide assurance that the code is being compiled correctly. +<li> A variety of timing harnesses are provided +which measure performance of a variety of generators in different +programming environments. +</ul> + +\section portability Portability + +Although we have done our best to make Random123 portable and standards conforming, +it is an unfortunate fact that there is no portable code. There is only +code that has been ported. + +Prior to release, we test Random123 on a variety of systems and with a +variety of toolchains that are readily available to us. Our +current test environment includes: + +<ul> +<li> Linux, gcc-5.2.0, 6.3.0, 8.1.0, 10.1.0 using -march=native on Xeon hardware with + AES and SSE4_2 and AVX2 support. +<li> Linux, gcc-5.2.0 using -m32. +<li> Linux, clang-8.0.0 with libc++ (8.0.0) on Xeon hardware. +<li> Linux, CentOS7 using the vendor supplied gcc toolchain (4.8.5-16). +<li> Linux, Ubuntu 16.04(LTS) using the vendor supplied gcc toolchain (5.4.0-6ubuntu1-16.04.11). +<li> Linux, Ubuntu 16.04(LTS) using OpenCL beignet 1.1.1-2 and https://github.com/intel/compute-runtime/releases/tag/19.07.12410 +<li> Linux, Ubuntu 18.04(LTS) with clang-11.0.1 and both libc++ and libstdc++. +<li> Linux, icc-18.0.3 and 19.1.2.254 on Xeon hardware with AES, SSE4 and AVX2 support. +<li> Linux, NVIDIA CUDA 10.0.130 with GTX 980 and 1080, and Titan RTX (aka Turing) hardware. +<li> MacOS, with Xcode-10.1 and Metal on a 2018 Mac mini. +</ul> + +In the past, we have tested Random123 with additional toolchains and +hardware. Although we no longer test on these platforms, we know of +no reason that they should not work. + +<ul> +<li>Linux, gcc (multiple versions from 3.4.3 through 6.3.0), on x86_64. +<li>Linux, gcc-4.1.2 and 4.4.1 on i686. +<li>Linux, gcc-4.8 on ARMv7 (32bit) Freescale/NXP LS1021A & ARM A53 (64bit) Freescale/NXP 1043A. +<li>Linux, clang-2.9, 3.0, 3.1, 3.3 and 3.6 on x86_64. +<li>Linux, clang-3.0 and 3.1 with lib++ (2012-04-19 svn checkout) on x86_64. +<li>Linux, clang-8.0.0 with libc++ on x86_64 +<li>Linux, open64-4.2.4 on x86_64. +<li>Linux, Intel icc and icpc 12.0.2 on x86_64. +<li>Linux, NVIDIA CUDA 4.1.15, 4.2.6, 5.5.22 and 7.5.1. (NOTE: We recommend against the use of CUDA before 4.1) +<li>Linux, OpenCL (NVIDIA SDK 4.0.17) on GTX480, M2090, GTX580 and GTX680 GPUs. +<li>Linux, OpenCL (AMD APP SDK 2.4 or 2.5), on x86_64 CPUs and Radeon HD6970 GPUs. +<li>Linux, OpenCL (Intel OpenCL 1.5), on x86_64 CPUs. +<li>Solaris, both gcc-3.4.3 and Sun C/C++ 5.8, on x86_64. +<li>FreeBSD 8.2, gcc-4.2.1, on x86_64. +<li>MacOS X 5.8, gcc-4.0.1, on i686. +<li>MacOS X 5.8, llvm-2.9.1 on i686 (problems with catching C++ exceptions). +<li>Windows 7, Microsoft Visual Studio, version 10.0, Microsoft C/C++ compiler 16.00. +</ul> + +Others have reported success on +<ul> +<li>MacOS, OpenCL on x86_64 CPUs +<li>Linux, gcc-4.7.2 on Powerpc64 (BlueGene/Q) +<li>Linux, Portland Group Compiler on Powerpc64 (BlueGene/Q) +<li>Linux, IBM xlc on Powerpc64 (BlueGene/Q) +<li>MacOS, Metal on x86_64 CPUs and AMD Radeon R9 M380 GPU +<li>MacOS Sierra and Scientific Linux with Nvidia GPU and CUDA 8 +<li>Linux, on s390x +</ul> + +\section warnings Warnings + +With some compilation options, the CUDA nvcc compiler warns about +unreachable code in array.h. The compiler doesn't recognize that the +code that is unreachable for some values of some macro parameters, is +actually reachable for other values of the parameters. It is possible +to disable that particular warning for a specific compilation unit by +adding -Wcudafe&nbsp;--diag_suppress=111 to the compilation command +line. + +On our ARMv7 test platform, we suspect a compiler bug with -O3, +which does not seem to affect Random123 code itself, but +produces nondeterministic results from time_serial. The +offending compiler version was +"aarch64-fsl-linux-gcc&nbsp;(Linaro&nbsp;GCC&nbsp;4.8-2014.04)&nbsp;4.8.3&nbsp;20140401&nbsp;(prerelease)". +We slightly reordered a couple of innocuous statements (a +timer() and dprintf() call) in time_serial to avoid the bug, but +we would avoid -O3 on ARMv7 with that particular version of the +compiler at least. + +\section contributors Contributors + +We welcome bug reports, new ports, success stories or any +feedback to random123@deshawresearch.com + +We are grateful for contributed bug-fixes and portability enhancements from the following users: +<ul> +<li> Geoffrey Irving and Gabriel Rockefeller - BlueGene/Q and powerpc ports +<li> Yan Zhou - MacOS and clang ports +<li> David Lawrie - allowing 64-bit philox to compile for both host and device with CUDA +<li> Bogdan Opanchuk - pointing out the inconsistent rotation constants in the implementation of threefry2xW in version 1.07 and earlier. +<li> Tom Schoonjans - Support for Metal (Apple's successor to OpenCL) +<li> Karl Magdsick - documentation in uniform.hpp +<li> KT Thompson - Visual Studio 2015 and ibm xlc compiler ports +</ul> +*/ + + diff --git a/docs/releasenotes.dox b/docs/releasenotes.dox @@ -0,0 +1,212 @@ +/** +@page "Release Notes" +<dl> +<dt>1.14 - ??? ??, 2020 </dt> +<dd><ul> +<li> Correctly identify newer versions (16+) of IBM's XL compiler +<li> Better support for MS Visual Studio 2015 (and hopefully later) +<li> Allow compilation on s390x. +<li> Don't use arrays internally in the threefry implementations. + This seems to avoid register spills when compiled with icc, and + has no apparent effect on gcc's code generation. +<li> Remove error-prone code to discover CPU clockspeed. Don't report cpB in timing tests. +<li> Remove error-prone code to "clean" device names and parse hex float strings. +<li> Suppress some warnings from gcc10: + - don't use size_t if stddef hasn't been included + - declare default copy-assignment and move-assignment operators in Engine. +</ul></dd> + +<dt>1.13 - Mar 22, 2019 </dt> +<dd><ul> +<li> Don't try to declare reverse iterators for r123array in cuda. +<li> Add support for Apple's Metal Shading Language (2.1) - contributed by Tom Schoonjans. + - Implementation of 32-bit threefry and philox. + - metalfeatures.h, plus new macros in compilerfeatures.h, + used in threefry.h, philox.h and kat infrastructure. + - tests/kat_metal and examples/pi_metal. +<li> Small tweaks to silence warnings from newer gcc, clang, cuda and opencl. +<li> Cosmetic changes to doxygen markup, including fixes to work with newer releases of doxygen. +</ul></dd> + +<dt>1.12 - not publicly released</dt> +<dd> +</dd> + +<dt>1.11 - Mar 30, 2017 (not publicly released)</dt> +<dd><ul> +<li> Changes to conventional/Engine.hpp: + - The sequence of generated randoms is unchanged. + - shrink the memory footprint by not keeping a copy of the ukey in the Engine and storing the 'elem' counter in v.back(). + - insertion and extraction operators have changed incompatibly. I.e., + engines serialized with 1.10 or earlier cannot be deserialized + with 1.11, and vice versa. + - getkey returns a key_type and setkey takes a key_type. + - when ukey_type is not the same as key_type, provide a constructor + and a seed method that takes a const key_type& argument. + - the getseed method is eliminated. +<li> Move uniform.hpp, boxmuller.hpp and u01fixedpt.h into + include/Random123. I.e., make them available in exactly + the same way as threefry.h, et al. It is no longer necessary + to copy them from the examples directory to user code. +<li> Incorporate ua.hpp into uniform.hpp. +<li> Provide insertion, extraction and comparison operators to the + aesopenssl16x8_key_t and aesni1xm128_key_t. +<li> Separate tests and benchmarks (which are absurdly complicated) + from examples (which are meant to be short and simple) in + the source tree. We still test and time the same things, but all + that code is in tests/, while the code remaining in examples/ + really tries to be exemplary. +<li> More careful use cl_uint and elimination of uint from opencl code. +<li> Better (but not reliable) support for OpenCL on MacOS. +<li> Fix documentation for examples/uniform.hpp. +</ul></dd> + +<dt>1.10 - Apr 12, 2016 </dt> +<dd><ul> +<li> R123EXAMPLE_ENVCONF_SEED environment variable provides seed to most pi_* examples +<li> R123EXAMPLE_ENVCONF_CUDA_DEVICE and R123EXAMPLE_ENVCONF_OPENCL_DEVICE allow selection of non-default + GPUs, e.g. R123EXAMPLE_ENVCONF_CUDA_DEVICE=980&nbsp;pi_cuda + or R123EXAMPLE_ENVCONF_OPENCL_DEVICE=680&nbsp;pi_opencl +<li> Updated hardcoded device core detection with newer GPUs (Kepler, Maxwell) + and changed default cores from 1 to 384 to run more sensible number of + iterations on unrecognized devices. +<li> moved lots of arbitrary, funny, irrelevant constants into example_seeds.h so that they do + not confuse the punters. +<li> Tested on ARMv7 (32bit) and `ARM A53 (64bit) with Freescale/Linaro toolchain gcc 4.8. + Needed workaround for -O3 compiler bug on ARMv7. +</ul></dd> +<dt>1.09 - Mar 6, 2016 </dt> +<dd><ul> +<li> add \#define R123_USE_U01_DOUBLE to u10fixedpt.h +<li> fix definition of const char *srcstr[] in util_opencl.h +<li> improve nvccfeatures.h so that 64-bit philox can be used +both on the host and on the cuda device. +<li> add _Pragmas so R123_STATIC_ASSERT doesn't warn with clang-3.6. +<li> boxmuller.hpp doesn't look for sincos when __APPLE__ is true. +</ul></dd> +<dt>1.08 - Aug 20, 2013 </dt> +<dd><ul> +<li> Fix a bug in threefry2xW whereby rotation constants were +chosen incorrectly after the 20th round. There is no reason to +suspect that the incorrectly chosen rotation constants were "bad" +or "deficient" so there is no reason to suspect the quality of the +random numbers produced. Using threefry with R>20 would have been +rare in any case. The fix simply makes the implementation correspond +correctly to the description in the paper. +<li> Add examples/uniform.hpp, examples/boxmuller.hpp and + examples/ua.hpp, containing example code to generate uniformly + and gaussian distributed floats and doubles. Also add unit tests + (ut_uniform.cpp, ut_uniform_IEEEkat.cpp) and timing harnesses + (time_boxmuller.cpp and time_boxmuller_cuda.cpp). +<li> overhaul u01_closed_closed and u01_open_open so they produce + equally spaced/probable values except for endpoints. +<li> Demote u01.h from the include/Random123/ to examples/ufixed01.h, but + examples/uniform.hpp is preferred. +<li> Add kat_vectors for threefry2xW_32 and threefry4xW_72, i.e., the +largest number of supported rounds in each case. +<li> Mention ukey on the first page of docs. +<li> Fix typos in documentation and comments and in gccfeatures.h. +<li> Don't \#include &lt;x86intrin.h&gt; unless (defined(__x86_64__)||defined(__i386__)). +<li> Use __clang__ rather than __llvm__ in the predicate that decides whether to + include clangfeatures.h. +<li> Add support for Portland Group compilers. +<li> Add support for gcc and IBM XL compilers on powerpc64, e.g. BlueGene/Q. +<li> Port to PPC. (BG/L) +<li> Refuse to build with CUDA before 4.1 to avoid namespace bug. +<li> Update/fix core count hackery NVIDIA Tesla K20c +</ul></dd> + +<dt>1.07 - Nov 7, 2012 </dt> +<dd><ul> +<li> Provide const static data members: _Min and _Max in Engine and MicroURNG, which +work around a non-standard requirement imposed by the MacOS Xcode 4.5.2 &lt;random&gt; library. +<li> Fine-grained test macros for specific features of C++11 rather than +an all-or-none USE_CXX0X macro. Features tested: +constexpr, unrestricted unions, explicit conversions, &lt;random&gt; and &lt;type_traits&gt;. +<li> Declare max() and min() methods with the R123_CONSTEXPR attribute +in Engine and MicroURNG. +<li> Improved clang support +<li> Works with Solaris Sun CC now (requires -library=stlport4) +<li> NVIDIA GTX6x0 should report correct core count +<li> ut_features prints the list of features that compile on the build platform +<li> Compiles cleanly with -Wall -Wextra (implying -Wunused-parameter -Wsign-compare) +</ul></dd> + +<dt>1.06 - Apr 5, 2012 </dt> +<dd><ul> +<li> Added a known answer test for the u01 functions (kat_u01). +<li> Defend headers against possible max and min macros in "system" header files. +</ul></dd> + +<dt>1.05 - Mar 20, 2012 </dt><dd> +<ul><li> +MicroURNG and GSL_MICROURNG no longer give the programmer control +over the number bits in the internal counter via a template or macro argument. +Such flexibility is too easy to misuse, with the possible consequence +of repeating random values. Now, all MicroURNGs have a period in +excess of 2^32, and MicroURNG&lt;CBRNG&gt;(c1, k1) +and MicroURNG&lt;CBRNG&gt;(c2, k2) "collide" if and only if c1==c2 and k1==k2.</li> +<li>Added &lt;Random123/u01.h&gt; header file with static functions for conversion +of integers to uniformly distributed floating point values.</li> +<li>Make operator&lt;&lt;(ostream&amp;, const r123array&amp;) and operator&gt;&gt;(ostream&amp;, r123array&amp;) +inline. This should work around ODR violations when the header files are +included in more than one file in a project.</li> +<li>Recognize that icpc has an _mm_set_epi64x intrinsic as of version 12.1.</li> +<li>The gsl adapters always return 32-bits of random data, regardless of the +width of counter type.</li> +<li>Works around lack of anonymous enums in Intel OpenCL 1.5</li> +<li>gencl.sh works on MacOS and systems with "classic" BSD indent.</li> +<li>Tests run on AMD Radeon 7970 (Tahiti).</li> +</ul> + +</dd> + +<dt>1.04 - Dec 5, 2011</dt><dd> +<ul><li> +new kat_vectors - there are now three tests for each tested generator: gen(ctr=0, key=0), gen(ctr=fff, key=0xfff), + and gen(ctr=digits-of-pi, key=more-digits-of-pi). There are fewer tests overall, but they provide + better coverage, especially of non-zero keys.</li> +</ul> +</dd> + +<dt>1.03 - Nov 30, 2011</dt><dd> +<ul> +<li> overhaul known answer tests (kat) + <ul> + <li> common source for serial C, C++, cuda and opencl replaces katc and katpp </li> + <li> add missing kat_vectors for threefry2x32 </li> + </ul></li> +<li> make keyinit functions device/kernel functions in CUDA/OpenCL </li> +<li> replace r123array::assemble methods with r123array::seed(SeedSeq) template </li> +<li> cleanup of signatures of Engine and MicroURNG methods: + <ul> + <li> Engine(ukey_type&amp;) and MicroURNG(ctr_type, ukey_type) constructors.</li> + <li> Engine(SeedSeq&amp;) takes a reference argument, and, when C++0x &lt;type_traits&gt; + are available the SeedSeq templates don't participate in "surprising" overloads. </li> + </ul> +</li> +</ul> +</dd> + +<dt>1.02 - Nov 21, 2011</dt><dd> +<ul> +<li> +<b> BUG FIXED </b> in threefry2xW_R(R&lt;20, ...). Earlier implementations of +threefry2x32_R and threfry2x64_R produced incorrect +results when called with the number of rounds less than 20. +The bug caused extra work to be done in every call, possibly resulting in <i>more</i> +mixing than the correct implementation delivers. Both old (buggy, more mixing) and new (bug-fixed, less mixing) +implementations have been rechecked and are fully "Crush-Resistant". </li> +<li>worked around problems with argument marshalling in version 2.4 of the AMDAPPSDK OpenCL implementation</li> +</ul> +</dd> + +<dt>1.01 - Nov 11, 2011</dt><dd> +<ul> +<li>allow the user to define __STDC_CONSTANT_MACROS</li> +<li>allow r123arrayNxW::incr(larger_than_largest_value_type)</li> +</ul> + +<dt>1.00 - Sep 26, 2011</dt><dd>Initial release</dd> +</dl> +*/ diff --git a/examples/GNUmakefile b/examples/GNUmakefile @@ -0,0 +1,156 @@ +no_target_specified: runcore + @echo + @echo The default make rule is equivalent to \'make runcore\' which builds + @echo and runs most of the examples. + @echo The following \'meta-targets\' are available: + @echo " " $(meta_targets) + @echo Here is the complete list of individual program targets: + @echo " " $(all_primary_targets) + @echo Prepend \'run\' to any of the program targets or metatargets + @echo to run the binary and check for a zero exit status. + @echo Adding force=1 on the command line causes all targets to be considered out-of-date. +.PHONY: no_target_specified + +# metatargets are variables which get mapped by METATARGET_template +meta_targets:=core aesni c cpp gsl cuda opencl thread metal + +# Platform metatargets: each one typically has specific requirements in the build environment. +# c is C99 (will work in MSVC), cpp is C++98, gsl requires the GNU Scientific Library +# (specifically, the gsl-config program in the PATH), thread requires POSIX threads, +# CUDA requires NVIDIA CUDA 3.x or newer, OpenCL requires OpenCL includes & libraries +# (e.g. AMD APP SDK, NVIDIA SDK) +c:=simple pi_capi +cpp:=simplepp pi_uniform pi_cppapi pi_microurng +gsl:=pi_gsl +cuda:=pi_cuda pi_cudapp +opencl:=pi_opencl +thread:= # ?? should we have a thread example? +metal:=pi_metal + +# Convenience metatargets: these are to help developers test functional subsets across platforms +core:=$(c) $(cpp) +aesni:=pi_aes + +$(gsl) : override LDLIBS += `gsl-config --libs` +$(gsl) : override CFLAGS += `gsl-config --cflags` + +$(opencl) : % : %_kernel.i +# Or try this if we USE_GENCL in kat_opencl.c +#$(opencl) : override CPPFLAGS += -DSRCDIR=\"$(dir $(abspath $<)).\" + +ifeq ($(shell uname),Darwin) +$(opencl) : override LDLIBS+=-framework OpenCL +else +$(opencl) : override LDLIBS+=-lOpenCL +endif +$(opencl) : override CFLAGS+=-I. +# Note, the Intel OpenCL SDK (1.5) has unresolved C++ symbols in its +# libOpenCL.so Even though 'main' is a C program, you may need to link +# it with a C++ compiler-driver, e.g., g++. Since this Makefile does +# compile-and-link in one step, use something like: +# $(opencl) : CC=g++ -xc +# which will invoke the g++ compiler-driver, but will treat the +# program as C rather than C++. + +$(metal) : % : %_kernel.metallib +$(metal) : override LDLIBS+=-framework Metal -framework Foundation -framework CoreGraphics + +all_primary_targets += $(addsuffix _kernel.i, $(opencl)) +all_primary_targets += $(addsuffix _kernel.metallib, $(metal)) +all_primary_targets += $(addsuffix _kernel.air, $(metal)) + +################################################ +# Generic boilerplate from here down: +vpath %.c $(srcdir/) +vpath %.cpp $(srcdir/) +vpath %.cu $(srcdir/) +vpath %.ocl $(srcdir/) +vpath %.metal $(srcdir/) + +define METATARGET_template +.PHONY: $(1) +$(1) : $(filter-out $(SKIP_TARGETS), $($(1))) +.PHONY: run$(1) +run$(1) : $(addprefix run, $(filter-out $(SKIP_TARGETS), $($(1)))) +all_primary_targets += $($(1)) +endef + +$(foreach T,$(meta_targets), $(eval $(call METATARGET_template,$(T)))) + +# sort also does 'uniq' +all_primary_targets:=$(sort $(all_primary_targets)) + +INC=$(srcdir/)../include +override CPPFLAGS += -I$(INC) + +ifndef NVCC +NVCC:=nvcc +endif +# The rngs are *very* slow without optimization. In the simplest case, +# where the user just calls 'make', we don't want them to see terrible +# performance. Unfortunately, this might surprise someone +# who says, e.g., make CPPFLAGS=-O0. Oh well... +ifndef CFLAGS +CFLAGS:=-O +endif +ifndef CXXFLAGS +CXXFLAGS:=-O +endif + +%.i : %.ocl + CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" $(srcdir/)./gencl.sh $< > $@ + +% : %.cu + $(NVCC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@ + +% : %.c + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@ + +% : %.cpp + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@ + +% : %.m + $(CC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@ + +%.air : %.metal + xcrun --sdk macosx metal $(CPPFLAGS) -c $< -o $@ + +%.metallib : %.air + xcrun --sdk macosx metallib $< -o $@ + +run% : % + ./$^ $(RUN_ARGS) + +# In lieu of autodepends, just say that all the compilation targets depend on all the headers. +hdrs:=$(wildcard $(srcdir/)*.h $(srcdir/)gsl/*.c $(INC)/Random123/*.h $(INC)/Random123/*.hpp $(INC)/Random123/*/*.h $(INC)/Random123/*/*.hpp) +misc:=$(wildcard $(srcdir/)*.cu $(srcdir/)*.ocl) +$(all_primary_targets) : $(hdrs) +$(misc) : $(hdrs) + +# If you put force=y on the command line, then $(all_primary_targets) will be +# depend on FORCE, and hence will not be up-to-date. +ifdef force +$(all_primary_targets) : FORCE +FORCE: +endif + +.PHONY : echo_build_commands +echo_build_commands: + make -n force=1 $(all_primary_targets) | grep -v 'is up to date' + +.PHONY : clean veryclean +clean: + rm -f $(all_primary_targets) + +veryclean: + rm -f $(all_primary_targets) *.o \#* *~ *.pdb *.exe *.obj *.ilk *.suo + +.PHONY : install + +# N.B. normally these are exported by ../GNUmakefile +prefix?=/usr/local +datarootdir?=$(prefix)/share +docdir?=$(datarootdir)/doc/Random123 +install: + mkdir -p $(DESTDIR)$(docdir)/examples + cp README GNUmakefile *.sh *.c *.h *.cpp *.cu *.metal *.m *.ocl $(DESTDIR)$(docdir)/examples diff --git a/examples/README b/examples/README @@ -0,0 +1,83 @@ +This file is examples/README and is also linked to from the doxygen main page. + +/** +@page ExamplesREADME Examples + +The examples/ directory contains usage examples +for the components of the Random123 library. + +@section building Compiling and Running the code + +Installing and using Random123 requires only the use +of the header files, and has no prerequisites other than +a reasonable C99 or C++98 compiler. + +With a modern GNU make (3.80 or newer), building and running the core tests +and examples can be as easy as running gmake with no arguments. +Note, though, that the provided examples/GNUmakefile intentionally avoids setting +any of the standard make variables: CC, CXX, CPPFLAGS, CFLAGS, +CXXFLAGS, TARGET_ARCH, LDFLAGS, LOADLIBES, LDLIBS. GNU make +will inherit settings for these variables from the environment, +or they may be set on the command line. If none are set, +compilation will proceed using system-wide default flags, generally +without advanced optimization, architectural tuning, warnings, or other +common options. + +Before putting the Random123 library to use in an application, +it is important to test it using the same compiler flags and +features that the application will use. In other words, +the conventional make variables should be set +the same way when testing the library as they will be set when the +library is actually compiled into your application. +Something like: +@code +gmake CFLAGS="-std=c99" CXXFLAGS="-std=c++0x" CPPFLAGS="/alternate/location/include -O3 -Wall -Wstrict-aliasing=2" TARGET_ARCH="-march=native" +@endcode +would confirm that all is well with optimization on, and output targeted at +an architecture with the same capabilities as the machine running the compilation. + +Very old versions of GNU make (pre-2002) or non-GNU +make will not work with examples/GNUmakefile.. Lacking a suitably modern GNU make, +our advice is to invoke the +C or C++ compiler directly on the source files in the examples/ directory. + +@section examples Examples + +@subsection simple Simple examples in C and C++ + +There are two extremely short examples that show all the code necessary to +obtain and print a few random numbers in C and C++: +<ul> +<li> simple.c +<li> simplepp.cpp +</ul> + +@subsection pi Estimating pi using different APIs + +Using random numbers to estimate pi is a classic example. The idea +is to choose points at random in a square and to count how many of +them lie within the inscribed circle. Since the area of the square +is 4*r^2 and the area of the circle is pi*r^2, the ratio of the +number of points in the circle to the total number of points should +approach pi/4 as the number of points grows. + +We give several examples of pi estimation, each of +which illustrates a slightly different API + +<ul> +<li> pi_capi - using only the basic C API +<li> pi_cppapi - using only the basic C++ API +<li> pi_u01 - using the C++ API and uniform.hpp +<li> pi_gsl - using a Random123 generator, but a gsl distribution to obtain real-valued random numbers. <b>Requires the GNU Scientific Library</b> +<li> pi_microurng - using a Random123 generator, but a C++11 \<random\> distribution to obtain real-valued random numbers +<li> pi_cuda - using the Random123 library with CUDA, runnable on an NVIDIA GPU +<li> pi_cudapp - using the C++ API with CUDA, runnable on an NVIDIA GPU +<li> pi_opencl - using the Random123 library with OpenCL, runnable on any OpenCL platform: e.g. NVIDIA or ATI GPUs or Intel or AMD CPUs. The actual +compute kernel lives in the \c pi_opencl_kernel.ocl file and is transformed by \c gencl.sh into strings that get included in \c pi_opencl.c, since +the OpenCL kernels get compiled for the target OpenCL platform at run-time. Note that Apple deprecated OpenCL in MacOS 10.14 (2018). See pi_metal. +<li> pi_aes - uses the AESNI4x32 Random123 generator +<li> pi_metal - uses Apple's Metal framework (replacement for OpenCL). +</ul> + + +*/ diff --git a/examples/example_seeds.h b/examples/example_seeds.h @@ -0,0 +1,72 @@ +#ifndef EXAMPLE_SEEDS_H__ +#define EXAMPLE_SEEDS_H__ 1 + +/* + * This entire file is overkill to allow seeds to be set in Random123 + * example and test programs via a R123EXAMPLE_ENVCONF_SEED environment + * variable, mainly to illustrate and test how one might use a user-set + * seed to produce different random streams for different runs. + * None of this code is needed for the correct functioning or + * use of the Random123 library. + */ + +#include <stdlib.h> // for strtoul +#include <limits.h> // for ULONG_MAX +#include <errno.h> // for errno +#include <string.h> // for strerror +#include <stdio.h> // for stderr + +/* + * The following arbitrary values for sample seeds (used to + * initialize keys and counters in the examples) have no + * particular meaning. They could equally easily all be 0. + */ +#define EXAMPLE_SEED1_U32 0x11111111U +#define EXAMPLE_SEED2_U32 0x22222222U +#define EXAMPLE_SEED3_U32 0x33333333U +#define EXAMPLE_SEED4_U32 0x44444444U + +#define EXAMPLE_SEED5_U32 0xdeadbeefU +#define EXAMPLE_SEED6_U32 0xbeadcafeU +#define EXAMPLE_SEED7_U32 0x12345678U +#define EXAMPLE_SEED8_U32 0x90abcdefU +#define EXAMPLE_SEED9_U32 0xdecafbadU + +#if R123_USE_64BIT +#define EXAMPLE_SEED1_U64 R123_64BIT(0xdeadbeef12345678) +#define EXAMPLE_SEED2_U64 R123_64BIT(0xdecafbadbeadfeed) +#endif + +static inline unsigned long example_seed_u64(uint64_t defaultseed) { + const char *e = "R123EXAMPLE_ENVCONF_SEED"; + const char *cp = getenv(e); + unsigned long u; + char *ep; + errno = 0; + if (cp) { + u = strtoul(cp, &ep, 0); + if (u == ULONG_MAX && errno != 0) { + fprintf(stderr, "strtoul failed to convert environment variable %s=\"%s\" to unsigned long: %s\n", + e, cp, strerror(errno)); + exit(1); + } else if (*ep != '\0') { + fprintf(stderr, "strtoul failed to fully convert environment variable %s=\"%s\" to unsigned long, got 0x%lu\n", + e, cp, u); + exit(1); + } + } else { + u = defaultseed; + } + return u; +} + +static inline uint32_t example_seed_u32(uint32_t defaultseed) { + uint64_t u64 = example_seed_u64(defaultseed); + if (u64 > 0xFFFFFFFFUL /* UINT32_MAX, which clang29 does not have, sigh */) { + fprintf(stderr, "Warning: truncating seed 0x%lu to uint32_t\n", (unsigned long)u64); + } + return (uint32_t)u64; +} + + +#endif /* EXAMPLE_SEEDS_H__ */ diff --git a/examples/gencl.sh b/examples/gencl.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# Run the C preprocessor on an OpenCL kernel to generate a C string array +# suitable for clCreateProgramWithSource. This allows us to create +# standalone OpenCL programs that do not depend on paths to the source +# tree (the programs will still run the OpenCL run-time compiler to +# compile the kernel, but the kernel is a string within the program, with +# no external include dependencies) +# Mark Moraes, D. E. Shaw Research + +# indenting the cpp output makes errors from the OpenCL runtime compiler +# much more understandable. User can override with whatever they want. +# The classic BSD indent (yes, the one that lived in /usr/ucb/indent once) +# defaults to -br, but recent GNU indent versions do not. Both appear to +# accept -br, fortunately... (BSD indent does not accept -kr or -linux, alas) + +PATH=$PATH:/usr/bin +export PATH +if type indent > /dev/null 2>&1; then + : ${GENCL_INDENT=indent} +else + : ${GENCL_INDENT=cat} +fi + +# We rely on gsub in awk, which exists in everything except classic +# old V7 awk (Solaris!). If we can find gawk or nawk, we prefer those. +# http://www.shelldorado.com/articles/awkcompat.html +for f in gawk nawk awk; do + if type "$f" > /dev/null 2>&1; then + : ${GENCL_AWK="$f"} + break + fi +done +[ ${GENCL_AWK:+set} ] || { echo "$0: could not find awk!">&2; exit 1; } + +usage="Usage: $0 inputoclfilename" +case $# in +1) ;; +*) echo "$usage" >&2; exit 1;; +esac +case "$1" in +''|-*) echo "Invalid or empty inputoclfilename: $1 +$usage" >&2; exit 1;; +esac +set -e +${CC-cc} -xc -E -P -nostdinc -D__OPENCL_VERSION__=1 $CPPFLAGS "$1" | + ${GENCL_INDENT} | + ${GENCL_AWK} 'BEGIN {print "\"\\n\\"} + {gsub("\\", "\\\\", $0); gsub("\"", "\\\"", $0); print $0 "\\n\\"} + END {print "\""}' diff --git a/examples/pi_aes.cpp b/examples/pi_aes.cpp @@ -0,0 +1,89 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <Random123/aes.h> +#include <stdio.h> +#include <assert.h> +using namespace r123; + +// Everyone's favorite PRNG example: calculate pi/4 by throwing darts +// at a square board and counting the fraction that are inside the +// inscribed circle. + +// This version uses the C++ API to AESNI. + +#include "pi_check.h" +#include "example_seeds.h" + +int main(int, char **){ +#if R123_USE_AES_NI + unsigned long seed = example_seed_u32(EXAMPLE_SEED1_U32); // example user-settable seed + unsigned long hits = 0, tries = 0; + const int64_t two_to_the_62 = ((int64_t)1)<<62; + + if (!haveAESNI()) { + std::cerr << "AES-NI instructions not available on this hardware, skipping the pi_aes test." << std::endl; + return 0; + } + typedef AESNI4x32 G; + G generator; + // As an example, we illustrate one user-provided seed word and the rest as arbitrary constants + G::ukey_type ukey = {{(G::ukey_type::value_type)seed, EXAMPLE_SEED2_U32, EXAMPLE_SEED3_U32, EXAMPLE_SEED4_U32}}; + // The key_type constructor transforms the 128bit AES ukey_type to an expanded (1408bit) form. + G::key_type key = ukey; + // start ctr from an arbitrary point. 0 would work fine too, this is just to show that it does + // not matter where it starts from (or for that matter, whether it increments by 1, or some other + // arbitrary stride or in some other way, as long as it never repeats a key,ctr combination) + G::ctr_type ctr = {{EXAMPLE_SEED5_U32, EXAMPLE_SEED6_U32, EXAMPLE_SEED7_U32, EXAMPLE_SEED8_U32}}; + + printf("Throwing %lu darts at a square board using AESNI4x32\n", NTRIES); + std::cout << "Initializing AES key with hex userkey: " << std::hex << ukey << " ctr: " << ctr << std::endl; + + while(tries < NTRIES){ + ctr.incr(); + G::ctr_type r = generator(ctr, key); + if (tries == 0) { + std::cout << "first random from AESNI is " << std::hex << r << std::endl;; + } + for(size_t j=0; j<r.size(); j+=2){ + int64_t x = (int32_t)r[j]; + int64_t y = (int32_t)r[j+1]; + if( (x*x + y*y) < two_to_the_62 ) + hits++; + tries++; + } + } + return pi_check(hits, tries); +#else + std::cout << "AESNI RNG not compiled into this binary, skipping the pi_aes test.\n"; + return 0; // Not a failure to not have AESNI compiled into this. +#endif +} diff --git a/examples/pi_capi.c b/examples/pi_capi.c @@ -0,0 +1,78 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <Random123/threefry.h> +#include <stdio.h> +#include <assert.h> + +/* Everyone's favorite PRNG example: calculate pi/4 by throwing darts +// at a square board and counting the fraction that are inside the +// inscribed circle. + +// This version uses the C API to threefry2x64. */ + +#include "pi_check.h" + +int main(int argc, char **argv){ + unsigned long hits = 0, tries = 0; + const int64_t two_to_the_62 = ((int64_t)1)<<62; + + threefry2x64_key_t key = {{0, 0}}; + threefry2x64_ctr_t ctr = {{0, 0}}; + enum { int32s_per_counter = sizeof(ctr)/sizeof(int32_t) }; + (void)argc;(void)argv; /* unused */ + + printf("Throwing %lu darts at a square board using threefry2x64\n", NTRIES); + + /* make the most of each bijection by looping over as many + int32_t's as we can find in the ctr_type. */ + assert( int32s_per_counter%2 == 0 ); + while(tries < NTRIES){ + /* Use a union to avoid strict aliasing issues. */ + union{ + threefry2x64_ctr_t ct; + int32_t i32[int32s_per_counter]; + }u; + size_t j; + /* Don't worry about the 'carry'. We're not going to loop + more than 2^64 times. */ + ctr.v[0]++; + u.ct = threefry2x64(ctr, key); + for(j=0; j<int32s_per_counter; j+=2){ + int64_t x = u.i32[j]; + int64_t y = u.i32[j+1]; + if( (x*x + y*y) < two_to_the_62 ) + hits++; + tries++; + } + } + return pi_check(hits, tries); +} diff --git a/examples/pi_check.h b/examples/pi_check.h @@ -0,0 +1,67 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef PI_CHECK_H__ +#define PI_CHECK_H__ 1 + +#include <stdio.h> + +const unsigned long NTRIES = 10000000UL; + +/* XX Cannot make this static, is included in some files that only use it + under ifdef-conditionally, and we do not want to ifdef this to match. */ +int pi_check(unsigned long hits, unsigned long tries) +{ + const double PI = 3.14159265358979323846; + double ourpi, mean, var, delta, chisq; + printf("%lu out of %lu darts thrown at a square board hit the inscribed circle\n", + hits, tries); + ourpi = 4.*hits/tries; + printf("pi is approximately %.8g (diff = %.2g %%)\n", ourpi, (ourpi - PI)*100./PI); + mean = tries*(PI/4.); + var = tries * (PI/4.)*(1. - (PI/4.)); + delta = hits - mean; + chisq = delta*delta/var; + /* Sigh. Jump through hoops so we don't want to link with -lm for sqrt */ + if( chisq < 1. ) + printf("OK, # of hits is less than one 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq); + else if(chisq < 4.) + printf("OK, # of hits is between one and two 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq); + else if(chisq < 9.) + printf("Maybe OK, # of hits is between two and three 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq); + else { + printf("May not be OK, # of hits is more than three 'sigma'. Worth looking into.\n(chisquared = %.2g)\n", chisq); + return 1; + } + return 0; +} + +#endif /* PI_CHECK_H__ */ diff --git a/examples/pi_cppapi.cpp b/examples/pi_cppapi.cpp @@ -0,0 +1,78 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <Random123/threefry.h> +#include <Random123/ReinterpretCtr.hpp> +#include <stdio.h> +#include <assert.h> + +// Everyone's favorite PRNG example: calculate pi/4 by throwing darts +// at a square board and counting the fraction that are inside the +// inscribed circle. + +// This version uses the C++ API to Threefry4x64, and the +// ReinterpretCtr template to get 32-bit values. + +// Note - by using ReinterpretCtr, the result depends on the +// endianness of the hardware it runs on even though the underlying +// generator is endian-independent. An easy way to make the result +// endian-independent would be to eliminate ReinterpretCtr and to use +// a generator that works natively with 32-bit quantities, e.g., +// Threefry4x32 or Philox4x32. + +using namespace r123; + +#include "pi_check.h" + +int main(int, char **){ + unsigned long hits = 0, tries = 0; + const int64_t two_to_the_62 = ((int64_t)1)<<62; + + typedef ReinterpretCtr<r123array8x32, Threefry4x64> G; + G generator; + G::key_type key = {{}}; // initialize with zeros + G::ctr_type ctr = {{}}; + + printf("Throwing %lu darts at a square board using Threefry4x64\n", NTRIES); + + while(tries < NTRIES){ + ctr.incr(); + G::ctr_type r = generator(ctr, key); + for(size_t j=0; j<r.size(); j+=2){ + int64_t x = (int32_t)r[j]; + int64_t y = (int32_t)r[j+1]; + if( (x*x + y*y) < two_to_the_62 ) + hits++; + tries++; + } + } + return pi_check(hits, tries); +} diff --git a/examples/pi_cuda.cu b/examples/pi_cuda.cu @@ -0,0 +1,121 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// Simple CUDA device kernel and host main program to +// compute pi via random darts at a square + +// functions for boilerplate CUDA init and done +#include "../tests/util_cuda.h" + +#include <Random123/philox.h> + +int debug = 0; +const char *progname; + +// CUDA Kernel: +// generates n x,y points and returns hits[tid] with the count of number +// of those points within the unit circle on each thread. +__global__ void counthits(unsigned n, unsigned useed, uint2 *hitsp) +{ + unsigned tid = blockDim.x * blockIdx.x + threadIdx.x; + unsigned hits = 0, tries = 0; + philox4x32_key_t k = {{tid, useed}}; + philox4x32_ctr_t c = {{}}; // start counter from 0 + + while (tries < n) { + union { + philox4x32_ctr_t c; + int4 i; + }u; + c.v[0] = tries; + u.c = philox4x32(c, k); + int64_t x1 = u.i.x, y1 = u.i.y; + int64_t x2 = u.i.z, y2 = u.i.w; + if ((x1*x1 + y1*y1) < (1LL<<62)) { + hits++; + } + tries++; + if ((x2*x2 + y2*y2) < (1LL<<62)) { + hits++; + } + tries++; + } + hitsp[tid] = make_uint2(hits, tries); +} + +#include "pi_check.h" +#include "example_seeds.h" + +int +main(int argc, char **argv) +{ + unsigned seed = example_seed_u32(EXAMPLE_SEED9_U32); // example user-settable seed + CUDAInfo *infop; + uint2 *hits_host, *hits_dev; + size_t hits_sz; + unsigned nthreads; + unsigned count = argc > 1 ? atoi(argv[1]) : 0; + double d = 0.; + + d = timer(&d); + progname = argv[0]; + debug = argc > 2 ? atoi(argv[2]): 0; + + infop = cuda_init(argc > 3 ? argv[3] : NULL); + nthreads = infop->blocks_per_grid * infop->threads_per_block; + if (count == 0) + count = NTRIES/nthreads; + + hits_sz = nthreads * sizeof(hits_host[0]); + CHECKCALL(cudaMalloc(&hits_dev, hits_sz)); + CHECKNOTZERO((hits_host = (uint2 *)malloc(hits_sz))); + + printf("starting %u blocks with %u threads/block for %u points each with seed 0x%x\n", + infop->blocks_per_grid, infop->threads_per_block, count, seed); + fflush(stdout); + + counthits<<<infop->blocks_per_grid, infop->threads_per_block>>>(count, seed, hits_dev); + + CHECKCALL(cudaDeviceSynchronize()); + CHECKCALL(cudaMemcpy(hits_host, hits_dev, hits_sz, cudaMemcpyDeviceToHost)); + + unsigned long long hits = 0, tries = 0; + for (unsigned i = 0; i < nthreads; i++) { + if (debug) + printf("%u %u %u\n", i, hits_host[i].x, hits_host[i].y); + hits += hits_host[i].x; + tries += hits_host[i].y; + } + CHECKCALL(cudaFree(hits_dev)); + free(hits_host); + cuda_done(infop); + return pi_check(hits, tries); +} diff --git a/examples/pi_cudapp.cu b/examples/pi_cudapp.cu @@ -0,0 +1,127 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// Simple CUDA device kernel and host main program to +// compute pi via random darts at a square + +// functions for boilerplate CUDA init and done +#include "../tests/util_cuda.h" + +#include <Random123/philox.h> + +using namespace r123; + +int debug = 0; +const char *progname; + + +// CUDA Kernel: +// generates n x,y points and returns hits[tid] with the count of number +// of those points within the unit circle on each thread. +__global__ void counthits(unsigned n, unsigned useed, uint2 *hitsp) +{ + unsigned tid = blockDim.x * blockIdx.x + threadIdx.x; + unsigned hits = 0, tries = 0; + typedef Philox4x32 G; + G rng; + G::key_type k = {{tid, useed}}; + G::ctr_type c = {{}}; + + while (tries < n) { + union { + G::ctr_type c; + int4 i; + }u; + c.incr(); + u.c = rng(c, k); + int64_t x1 = u.i.x, y1 = u.i.y; + int64_t x2 = u.i.z, y2 = u.i.w; + if ((x1*x1 + y1*y1) < (1LL<<62)) { + hits++; + } + tries++; + if ((x2*x2 + y2*y2) < (1LL<<62)) { + hits++; + } + tries++; + } + hitsp[tid] = make_uint2(hits, tries); +} + +#include "pi_check.h" +#include "example_seeds.h" + +int +main(int argc, char **argv) +{ + unsigned seed = example_seed_u32(EXAMPLE_SEED9_U32); // example user-settable seed + CUDAInfo *infop; + uint2 *hits_host, *hits_dev; + size_t hits_sz; + unsigned nthreads; + unsigned count = argc > 1 ? atoi(argv[1]) : 0; + double d = 0.; + + d = timer(&d); + progname = argv[0]; + debug = argc > 2 ? atoi(argv[2]): 0; + + infop = cuda_init(argc > 3 ? argv[3] : NULL); + nthreads = infop->blocks_per_grid * infop->threads_per_block; + if (count == 0) + count = NTRIES/nthreads; + + hits_sz = nthreads * sizeof(hits_host[0]); + CHECKCALL(cudaMalloc(&hits_dev, hits_sz)); + CHECKNOTZERO((hits_host = (uint2 *)malloc(hits_sz))); + + printf("starting %u blocks with %u threads/block for %u points each with seed 0x%x\n", + infop->blocks_per_grid, infop->threads_per_block, count, seed); + fflush(stdout); + + counthits<<<infop->blocks_per_grid, infop->threads_per_block>>>(count, seed, hits_dev); + + CHECKCALL(cudaDeviceSynchronize()); + CHECKCALL(cudaMemcpy(hits_host, hits_dev, nthreads*sizeof(hits_dev[0]), + cudaMemcpyDeviceToHost)); + + unsigned long hits = 0, tries = 0; + for (unsigned i = 0; i < nthreads; i++) { + if (debug) + printf("%u %u %u\n", i, hits_host[i].x, hits_host[i].y); + hits += hits_host[i].x; + tries += hits_host[i].y; + } + CHECKCALL(cudaFree(hits_dev)); + free(hits_host); + cuda_done(infop); + return pi_check(hits, tries); +} diff --git a/examples/pi_gsl.c b/examples/pi_gsl.c @@ -0,0 +1,67 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <gsl/gsl_randist.h> +#include <stdio.h> +#include "Random123/philox.h" +#include "Random123/threefry.h" +#include "Random123/gsl_microrng.h" + +/* Compute pi, using the gsl_ran_flat distribution with + an underlying threefry4x64 counter-based rng (cbrng). + We can call cbrng 8 times between calls to cbrng_reset */ + +GSL_MICRORNG(cbrng, threefry4x64); /* creates gsl_rng_cbrng */ + +#include "pi_check.h" + +int main(int argc, char **argv){ + unsigned long hits = 0, tries = 0; + gsl_rng *r; + (void)argc; (void)argv; /* unused */ + + threefry4x64_ctr_t c = {{0}}; + threefry4x64_key_t k = {{0}}; + r = gsl_rng_alloc(gsl_rng_cbrng); + printf("%lu uniforms from %s\n", NTRIES, gsl_rng_name(r)); + while (tries < NTRIES) { + double x, y; + c.v[0]++; /* increment the counter */ + cbrng_reset(r, c, k); /* reset the rng to the new counter */ + x = gsl_ran_flat (r, -1.0, 1.0); + y = gsl_ran_flat (r, -1.0, 1.0); + if( x*x + y*y < 1.0 ) + hits++; + tries++; + } + gsl_rng_free (r); + return pi_check(hits, tries); +} diff --git a/examples/pi_metal.m b/examples/pi_metal.m @@ -0,0 +1,107 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// Simple Metal device kernel and host main program to +// compute pi via random darts at a square +// +// Written by Tom Schoonjans <Tom.Schoonjans@me.com> + +// functions to do boilerplate Metal begin and end +#include "../tests/util_metal.h" +#include "pi_check.h" + +const char *progname; +int verbose = 0; +int debug = 0; + +int +main(int argc, char **argv) +{ + unsigned count = argc > 1 ? atoi(argv[1]) : 0; + UMetalInfo *infop; + size_t i, nthreads = 1024, hits_sz; + uint *hits_host; + uint *tries_host; + NSString *kernelname = @"counthits"; + NSError *err = nil; + double d = 0.; + id<MTLFunction> function; + id<MTLBuffer> hits_dev, tries_dev; + id<MTLCommandBuffer> buffer; + id<MTLComputeCommandEncoder> encoder; + id<MTLComputePipelineState> pipeline; + + d = timer(&d); + progname = argv[0]; + verbose = debug = argc > 2 ? atoi(argv[2]): 0; + infop = metal_init(argc > 3 ? argv[3] : NULL, "pi_metal_kernel.metallib"); + CHECKNOTZERO(function = [infop->library newFunctionWithName: kernelname]); + CHECKNOTZERO(hits_dev = [infop->device newBufferWithLength: sizeof(uint) * nthreads options:0]); + CHECKNOTZERO(tries_dev = [infop->device newBufferWithLength: sizeof(uint) * nthreads options:0]); + + if (count == 0) + count = NTRIES/nthreads; + + CHECKNOTZERO(buffer = [infop->queue commandBuffer]); + CHECKNOTZERO(encoder = [buffer computeCommandEncoder]); + CHECKERR(pipeline = [infop->device newComputePipelineStateWithFunction:function error:&err]); + [encoder setComputePipelineState:pipeline]; + [encoder setBytes:&count length:sizeof(uint) atIndex:0]; + [encoder setBuffer:hits_dev offset:0 atIndex:1]; + [encoder setBuffer:tries_dev offset:0 atIndex:2]; + + MTLSize threadsPerThreadgroup = MTLSizeMake([pipeline maxTotalThreadsPerThreadgroup], 1, 1); + MTLSize grid = MTLSizeMake(nthreads, 1, 1); + + [encoder dispatchThreads:grid threadsPerThreadgroup:threadsPerThreadgroup]; + [encoder endEncoding]; + [buffer commit]; + [buffer waitUntilCompleted]; + + hits_host = [hits_dev contents]; + tries_host = [tries_dev contents]; + + unsigned long hits = 0, tries = 0; + for (i = 0; i < nthreads; i++) { + if (debug) + printf("%lu %u %u\n", (unsigned long)i, hits_host[i], tries_host[i]); + hits += hits_host[i]; + tries += tries_host[i]; + } + metal_done(infop); + [function release]; + [hits_dev release]; + [tries_dev release]; + [buffer release]; + [encoder release]; + [pipeline release]; + return pi_check(hits, tries); +} diff --git a/examples/pi_metal_kernel.metal b/examples/pi_metal_kernel.metal @@ -0,0 +1,73 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* + * This file is the Metal kernel. + * + * Written by Tom Schoonjans <Tom.Schoonjans@me.com> + */ + +#include <Random123/threefry.h> + +/* + * counthits generates n x,y points and returns hits[tid] with + * the count of number of those points within the unit circle on + * each thread. + */ +kernel void counthits(const device unsigned &n [[ buffer(0) ]], + device uint *hitsp [[ buffer(1) ]], + device uint *triesp [[ buffer(2) ]], + uint tid [[thread_position_in_grid]]) { + unsigned hits = 0, tries = 0; + threefry4x32_key_t k = {{tid, 0xdecafbad, 0xfacebead, 0x12345678}}; + threefry4x32_ctr_t c = {{0, 0xf00dcafe, 0xdeadbeef, 0xbeeff00d}}; + const float uint_max_fl = (float) UINT_MAX; + while (tries < n) { + union { + threefry4x32_ctr_t c; + uint4 i; + } u; + c.v[0]++; + u.c = threefry4x32(c, k); + float x1 = ((float) u.i.x) / uint_max_fl, y1 = ((float) u.i.y) / uint_max_fl; + float x2 = ((float) u.i.z) / uint_max_fl, y2 = ((float) u.i.w) / uint_max_fl; + if ((x1*x1 + y1*y1) < (1.0)) { + hits++; + } + tries++; + if ((x2*x2 + y2*y2) < (1.0)) { + hits++; + } + tries++; + } + hitsp[tid] = hits; + triesp[tid] = tries; +} diff --git a/examples/pi_microurng.cpp b/examples/pi_microurng.cpp @@ -0,0 +1,108 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// Everyone's favorite PRNG example: calculate pi/4 by throwing darts +// at a square board and counting the fraction that are inside the +// inscribed circle. + +// This version uses Philox4x32 with a MicroURNG and the C++11 standard +// library std::uniform_real distribution to generate floats in [-1..1] + +// N.B. The results are hardware dependent even though the underlying +// counter based RNG is hardware and endian-invariant. On x86, +// floating point temporaries, e.g., x, y, x*x, etc., are stored in +// 80-bit extended precision registers. On x86-64 (and other IEEE-754 +// systems), temporaries are stored in 32-bit SSE registers. + +#include <Random123/philox.h> +#include <Random123/MicroURNG.hpp> +#include <Random123/ReinterpretCtr.hpp> +#if R123_USE_CXX11_RANDOM +#include <random> +#endif +#include <iostream> +#include <iomanip> +#include "pi_check.h" + +using namespace r123; + +int main(int, char**){ + typedef Philox4x32 RNG; + RNG::ctr_type c = {{}}; + RNG::key_type k = {{}}; + MicroURNG<RNG> longmurng(c.incr(), k); +#if R123_USE_STD_RANDOM + std::uniform_real_distribution<float> u(-1., 1.); + + // First, compute pi with a nice long MicroURNG that we cancall + // billions of times (2^31) before it runs out of state: + unsigned long hits=0; + std::cout << "Calling a single MicroURNG " << NTRIES << " times" << std::endl; + for(unsigned long i=0; i<NTRIES; ++i){ + float x = u(longmurng); + float y = u(longmurng); + if( (x*x + y*y) < 1.0f ) + hits++; + } + if (pi_check(hits, NTRIES) != 0) { + return 1; + } + // MicroURNGs are very light-weight. It shouldn't be + // too expensive to create a new one every time through the loop: + std::cout << "Creating and calling a new MicroURNG " << NTRIES << " times" << std::endl; + hits=0; + for(unsigned long i=0; i<NTRIES; ++i){ + MicroURNG<RNG> shorturng(c.incr(), k); + float x = u(shorturng); + float y = u(shorturng); + if( (x*x + y*y) < 1.0f ) + hits++; + } + return pi_check(hits, NTRIES); +#else + // MicroURNG's are interesting because they allow us to use std::distributions, + // as in the above code. Std::distributions are nice, but if all we need is + // a uniform integer, we can do without such fancy C++11 features: + unsigned long hits=0; + std::cout << "Calling a single MicroURNG " << NTRIES << " times" << std::endl; + for(unsigned long i=0; i<NTRIES; ++i){ + float x = 2.*longmurng()/(double)std::numeric_limits<uint32_t>::max() - 1.; + float y = 2.*longmurng()/(double)std::numeric_limits<uint32_t>::max() - 1.; + if( (x*x + y*y) < 1.0f ) + hits++; + } + if (pi_check(hits, NTRIES) != 0) { + return 1; + } +#endif + + +} diff --git a/examples/pi_opencl.c b/examples/pi_opencl.c @@ -0,0 +1,98 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// Simple OpenCL device kernel and host main program to +// compute pi via random darts at a square + +// util_opencl.h has a large amount of OpenCL boilerplate. +// It contains nothing RNG-specific. +#include "../tests/util_opencl.h" +#include "pi_check.h" +#include "example_seeds.h" + +static const char *opencl_src = +// pi_opencl_kernel.i contains a literal string +// with the kernel source code. It's generated +// by ./gencl.sh opencl_kernel.ocl +#include "pi_opencl_kernel.i" + ; + +const char *progname; +int verbose = 0; +int debug = 0; + +int +main(int argc, char **argv) +{ + unsigned seed = example_seed_u32(EXAMPLE_SEED9_U32); // example user-settable seed + unsigned count = argc > 1 ? atoi(argv[1]) : 0; + UCLInfo *infop; + size_t i, nthreads, hits_sz; + cl_mem hits_dev; + cl_uint2 *hits_host; + const char *kernelname = "counthits"; + cl_int err; + cl_kernel kern; + double d = 0.; + + d = timer(&d); + progname = argv[0]; + verbose = debug = argc > 2 ? atoi(argv[2]): 0; + infop = opencl_init(argc > 3 ? argv[3] : NULL, opencl_src, argc > 4 ? argv[4] : ""); + CHECKERR(kern = clCreateKernel(infop->prog, kernelname, &err)); + if (infop->wgsize > 64) infop->wgsize /= 2; + nthreads = infop->cores * infop->wgsize; + if (count == 0) + count = NTRIES/nthreads; + hits_sz = nthreads * sizeof(hits_host[0]); + CHECKNOTZERO(hits_host = (cl_uint2 *)malloc(hits_sz)); + CHECKERR(hits_dev = clCreateBuffer(infop->ctx, CL_MEM_WRITE_ONLY, hits_sz, 0, &err)); + CHECK(clSetKernelArg(kern, 0, sizeof(unsigned), (void*)&count)); + CHECK(clSetKernelArg(kern, 1, sizeof(unsigned), (void*)&seed)); + CHECK(clSetKernelArg(kern, 2, sizeof(cl_mem), (void*)&hits_dev)); + printf("queuing kernel for %lu threads with %lu work group size, %u points with seed 0x%x\n", + (unsigned long)nthreads, (unsigned long)infop->wgsize, count, seed); + CHECK(clEnqueueNDRangeKernel(infop->cmdq, kern, 1, 0, &nthreads, &infop->wgsize, 0, 0, 0)); + CHECK(clFinish(infop->cmdq)); + CHECK(clEnqueueReadBuffer(infop->cmdq, hits_dev, CL_TRUE, 0, hits_sz, hits_host, 0, 0, 0)); + + unsigned long hits = 0, tries = 0; + for (i = 0; i < nthreads; i++) { + if (debug) + printf("%lu %u %u\n", (unsigned long)i, hits_host[i].x, hits_host[i].y); + hits += hits_host[i].x; + tries += hits_host[i].y; + } + CHECK(clReleaseMemObject(hits_dev)); + CHECK(clReleaseKernel(kern)); + opencl_done(infop); + return pi_check(hits, tries); +} diff --git a/examples/pi_opencl_kernel.ocl b/examples/pi_opencl_kernel.ocl @@ -0,0 +1,71 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* + * This file is the OpenCL kernel. It gets preprocessed, munged + * into a C string declaration and included in pi_opencl, so that + * running the compiled pi_opencl does not depend on any include + * files, paths etc. + */ + +#include <Random123/threefry.h> + +/* + * counthits generates n x,y points and returns hits[tid] with + * the count of number of those points within the unit circle on + * each thread. + */ +__kernel void counthits(unsigned n, unsigned useed, __global uint2 *hitsp) { + unsigned tid = get_global_id(0); + unsigned hits = 0, tries = 0; + threefry4x32_key_t k = {{tid, useed}}; + threefry4x32_ctr_t c = {{}}; // start counter from 0 + while (tries < n) { + union { + threefry4x32_ctr_t c; + int4 i; + } u; + c.v[0]++; + u.c = threefry4x32(c, k); + long x1 = u.i.x, y1 = u.i.y; + long x2 = u.i.z, y2 = u.i.w; + if ((x1*x1 + y1*y1) < (1L<<62)) { + hits++; + } + tries++; + if ((x2*x2 + y2*y2) < (1L<<62)) { + hits++; + } + tries++; + } + hitsp[tid].x = hits; + hitsp[tid].y = tries; +} diff --git a/examples/pi_uniform.cpp b/examples/pi_uniform.cpp @@ -0,0 +1,154 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <stdio.h> +#include <Random123/threefry.h> +#include <Random123/uniform.hpp> + +/* Compute pi, using the u01 conversion with threefry2x64 and threefry2x32 */ + +#include "pi_check.h" +#include "example_seeds.h" + +using namespace r123; + +template<typename Ftype, typename CBRNG> +void pi(typename CBRNG::key_type k); + +int errs = 0; +int main(int, char **){ + uint64_t seed64 = example_seed_u64(EXAMPLE_SEED1_U64); // example user-settable seed + unsigned long hits = 0, tries = 0; + + // First, we demonstrate how to compute pi + // using uneg11 to convert the integer output + // of threefry2x64 to a double in (-1, 1). + Threefry2x64::ctr_type c = {{0}}, r; + Threefry2x64::ukey_type uk = {{seed64}}; + Threefry2x64::key_type k = uk; + printf("%lu uniform doubles from threefry2x64\n", NTRIES); + while (tries < NTRIES) { + double x, y; + c.v[0]++; /* increment the counter */ + r = threefry2x64(c, k); + x = uneg11<double>(r.v[0]); + y = uneg11<double>(r.v[1]); + if( x*x + y*y < 1.0 ) + hits++; + tries++; + } + errs += pi_check(hits, tries); + + // Extra credit: use some template hackery to exercise various + // combinations of float, double and long double, unit64_t and + // uint32_t and the conversion functions u01, uneg11 and ufixed01. + // This provides minimal testing of the conversion functions. + pi<float, Threefry2x64>(k); + pi<double, Threefry2x64>(k); + pi<long double, Threefry2x64>(k); + uint32_t seed32 = example_seed_u32(EXAMPLE_SEED9_U32); + + Threefry2x32::ukey_type ukh = {{seed32}}; + Threefry2x32::key_type kh = ukh; + pi<float, Threefry2x32>(kh); + pi<double, Threefry2x32>(kh); + pi<long double, Threefry2x32>(kh); + + return !!errs; +} + +template<typename Ftype, typename CBRNG> +void pi(typename CBRNG::key_type k){ + unsigned long hits = 0, tries = 0; + CBRNG rng; + + printf("Compute pi with uneg11:\n"); + typename CBRNG::ctr_type c = {{0}}, r; + hits = tries = 0; + while (tries < NTRIES) { + Ftype x, y; + c.v[0]++; /* increment the counter */ + r = rng(c, k); + // x and y in the entire square from (-1,-1) to (1,1) + x = uneg11<Ftype>(r.v[0]); + y = uneg11<Ftype>(r.v[1]); + if( x*x + y*y < 1.0 ) + hits++; + tries++; + } + errs += pi_check(hits, tries); + +#if __cplusplus >= 201103L + printf("Compute pi with uneg11all (requires C++11):\n"); + hits = tries = 0; + while (tries < NTRIES) { + c.v[0]++; /* increment the counter */ + r = rng(c, k); + // x and y in the entire square from (-1,-1) to (1,1) + auto a = uneg11all<Ftype>(r); + if( a[0]*a[0] + a[1]*a[1] < 1.0 ) + hits++; + tries++; + } + errs += pi_check(hits, tries); +#endif + + printf("Compute pi with u01:\n"); + hits = tries = 0; + while (tries < NTRIES) { + Ftype x, y; + c.v[0]++; /* increment the counter */ + r = rng(c, k); + // generate x and y in the first quadrant from (0,0) to (1,1) + x = u01<Ftype>(r.v[0]); + y = u01<Ftype>(r.v[1]); + if( x*x + y*y < 1.0 ) + hits++; + tries++; + } + errs += pi_check(hits, tries); + + printf("Compute pi with u01fixedpt:\n"); + hits = tries = 0; + while (tries < NTRIES) { + Ftype x, y; + c.v[0]++; /* increment the counter */ + r = rng(c, k); + // generate x and y in the first quadrant from (0,0) to (1,1) + x = u01fixedpt<Ftype>(r.v[0]); + y = u01fixedpt<Ftype>(r.v[1]); + if( x*x + y*y < 1.0 ) + hits++; + tries++; + } + errs += pi_check(hits, tries); + } + diff --git a/examples/simple.c b/examples/simple.c @@ -0,0 +1,59 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <Random123/threefry.h> +#include <stdio.h> +#include "example_seeds.h" + +int main(int argc, char **argv){ + int i; + uint32_t seed = example_seed_u32(EXAMPLE_SEED1_U32); // example of user-settable seed + + /* while this example starts the counter from 0 and then increments by 0, + this could start anywhere and increment by any stride or pattern that + makes sense for the application as long as it produces a non-repeating stream */ + threefry4x32_ctr_t ctr = {{0,0,0,0}}; + /* we illustrate one user-specified seed and one constant as the key */ + threefry4x32_key_t key = {{seed, EXAMPLE_SEED2_U32,0,0}}; + (void)argc; (void)argv; /* unused */ + printf( "The first few randoms with key 0x%llx 0x%llx\n", + (unsigned long long)key.v[0], (unsigned long long)key.v[1]); + for(i=0; i<10; ++i){ + ctr.v[0] = i; + { + threefry4x32_ctr_t rand = threefry4x32(ctr, key); + printf("ctr: %llx %llx threefry4x32(20, ctr, key): %llx %llx\n", + (unsigned long long)ctr.v[0], (unsigned long long)ctr.v[1], + (unsigned long long)rand.v[0], (unsigned long long)rand.v[1]); + } + } + return 0; +} diff --git a/examples/simplepp.cpp b/examples/simplepp.cpp @@ -0,0 +1,49 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <Random123/threefry.h> +#include <iostream> +#include "example_seeds.h" + +int main(int, char **){ + typedef r123::Threefry2x64 CBRNG; + CBRNG::key_type::value_type seed = example_seed_u64(EXAMPLE_SEED1_U64); // example of user-settable seed + CBRNG::key_type key = {{seed}}; + CBRNG::ctr_type ctr = {{0,0}}; + CBRNG g; + std::cout << std::hex << "The first few 2x64 randoms from Threefry2x64 with hex key " << key << "\n"; + for(int i=0; i<10; ++i){ + ctr[0] = i; + CBRNG::ctr_type rand = g(ctr, key); + std::cout << "ctr: " << ctr << " Threefry2x64<>(ctr, key): " << rand << "\n"; + } + return 0; +} diff --git a/include/Random123/MicroURNG.hpp b/include/Random123/MicroURNG.hpp @@ -0,0 +1,146 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __MicroURNG_dot_hpp__ +#define __MicroURNG_dot_hpp__ + +#include <stdexcept> +#include <limits> + +namespace r123{ +/** + Given a CBRNG whose ctr_type has an unsigned integral value_type, + MicroURNG<CBRNG>(c, k) is a type that satisfies the + requirements of a C++11 Uniform Random Number Generator. + + The intended purpose is for a MicroURNG to be passed + as an argument to a C++11 Distribution, e.g., + std::normal_distribution. See examples/MicroURNG.cpp. + + The MicroURNG functor has a period of "only" + + ctr_type.size()*2^32, + + after which it will silently repeat. + + The high 32 bits of the highest word in the counter c, passed to + the constructor must be zero. MicroURNG uses these bits to + "count". + + Older versions of the library permitted a second template + parameter by which the caller could control the number of + bits devoted to the URNG's internal counter. This flexibility + has been disabled because URNGs created with different + numbers of counter bits could, conceivably "collide". + +\code + typedef ?someCBRNG? RNG; + RNG::ctr_type c = ...; // under application control + RNG::key_type k = ...; // + std::normal_distribution<float> nd; + MicroURNG<RNG> urng(c, k); + for(???){ + ... + nd(urng); // may be called several hundred times with BITS=10 + ... + } +\endcode +*/ + +template<typename CBRNG> +class MicroURNG{ + // According to C++11, a URNG requires only a result_type, + // operator()(), min() and max() methods. Everything else + // (ctr_type, key_type, reset() method, etc.) is "value added" + // for the benefit of users that "know" that they're dealing with + // a MicroURNG. +public: + typedef CBRNG cbrng_type; + static const int BITS = 32; + typedef typename cbrng_type::ctr_type ctr_type; + typedef typename cbrng_type::key_type key_type; + typedef typename cbrng_type::ukey_type ukey_type; + typedef typename ctr_type::value_type result_type; + + R123_STATIC_ASSERT( std::numeric_limits<result_type>::digits >= BITS, "The result_type must have at least 32 bits" ); + + result_type operator()(){ + if(last_elem == 0){ + // jam n into the high bits of c + const size_t W = std::numeric_limits<result_type>::digits; + ctr_type c = c0; + c[c0.size()-1] |= n<<(W-BITS); + rdata = b(c,k); + n++; + last_elem = rdata.size(); + } + return rdata[--last_elem]; + } + MicroURNG(cbrng_type _b, ctr_type _c0, ukey_type _uk) : b(_b), c0(_c0), k(_uk), n(0), last_elem(0) { + chkhighbits(); + } + MicroURNG(ctr_type _c0, ukey_type _uk) : b(), c0(_c0), k(_uk), n(0), last_elem(0) { + chkhighbits(); + } + + // _Min and _Max work around a bug in the library shipped with MacOS Xcode 4.5.2. + // See the commment in conventional/Engine.hpp. + const static result_type _Min = 0; + const static result_type _Max = ~((result_type)0); + + static R123_CONSTEXPR result_type min R123_NO_MACRO_SUBST () { return _Min; } + static R123_CONSTEXPR result_type max R123_NO_MACRO_SUBST () { return _Max; } + // extra methods: + const ctr_type& counter() const{ return c0; } + void reset(ctr_type _c0, ukey_type _uk){ + c0 = _c0; + chkhighbits(); + k = _uk; + n = 0; + last_elem = 0; + } + +private: + cbrng_type b; + ctr_type c0; + key_type k; + R123_ULONG_LONG n; + size_t last_elem; + ctr_type rdata; + void chkhighbits(){ + result_type r = c0[c0.size()-1]; + result_type mask = ((uint64_t)std::numeric_limits<result_type>::max R123_NO_MACRO_SUBST ())>>BITS; + if((r&mask) != r) + throw std::runtime_error("MicroURNG: c0, does not have high bits clear"); + } +}; +} // namespace r123 +#endif diff --git a/include/Random123/ReinterpretCtr.hpp b/include/Random123/ReinterpretCtr.hpp @@ -0,0 +1,88 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __ReinterpretCtr_dot_hpp__ +#define __ReinterpretCtr_dot_hpp__ + +#include "features/compilerfeatures.h" +#include <cstring> + +namespace r123{ +/*! + ReinterpretCtr uses memcpy to map back and forth + between a CBRNG's ctr_type and the specified ToType. For example, + after: + + typedef ReinterpretCtr<r123array4x32, Philox2x64> G; + + G is a bona fide CBRNG with ctr_type r123array4x32. + + WARNING: ReinterpretCtr is endian dependent. The + values returned by G, declared as above, + will depend on the endianness of the machine on which it runs. + */ + +template <typename ToType, typename CBRNG> +struct ReinterpretCtr{ + typedef ToType ctr_type; + typedef typename CBRNG::key_type key_type; + typedef typename CBRNG::ctr_type bctype; + typedef typename CBRNG::ukey_type ukey_type; + R123_STATIC_ASSERT(sizeof(ToType) == sizeof(bctype) && sizeof(typename bctype::value_type) != 16, + "ReinterpretCtr: sizeof(ToType) is not the same as sizeof(CBRNG::ctr_type) or CBRNG::ctr_type::value_type looks like it might be __m128i"); + // It's amazingly difficult to safely do conversions with __m128i. + // If we use the operator() implementation below with a CBRNG + // whose ctr_type is r123array1xm128i, gcc4.6 optimizes away the + // memcpys, inlines the operator()(c,k), and produces assembly + // language that ends with an aesenclast instruction with a + // destination operand pointing to an unaligned memory address ... + // Segfault! See: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50444 + // MSVC also produces code that crashes. We suspect a + // similar mechanism but haven't done the debugging necessary to + // be sure. We were able to 'fix' gcc4.6 by making bc a mutable + // data member rather than declaring it in the scope of + // operator(). That didn't fix the MSVC problems, though. + // + // Conclusion - don't touch __m128i, at least for now. The + // easiest (but highly imprecise) way to do that is the static + // assertion above that rejects bctype::value_types of size 16. - + // Sep 2011. + ctr_type operator()(ctr_type c, key_type k){ + bctype bc; + std::memcpy(&bc, &c, sizeof(c)); + CBRNG b; + bc = b(bc, k); + std::memcpy(&c, &bc, sizeof(bc)); + return c; + } +}; +} // namespace r123 +#endif diff --git a/include/Random123/aes.h b/include/Random123/aes.h @@ -0,0 +1,398 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __Random123_aes_dot_hpp__ +#define __Random123_aes_dot_hpp__ + +#include "features/compilerfeatures.h" +#include "array.h" + +/* Implement a bona fide AES block cipher. It's minimally +// checked against the test vector in FIPS-197 in ut_aes.cpp. */ +#if R123_USE_AES_NI + +/** @ingroup AESNI */ +typedef struct r123array1xm128i aesni1xm128i_ctr_t; +/** @ingroup AESNI */ +typedef struct r123array1xm128i aesni1xm128i_ukey_t; +/** @ingroup AESNI */ +typedef struct r123array4x32 aesni4x32_ukey_t; +/** @ingroup AESNI */ +enum r123_enum_aesni1xm128i { aesni1xm128i_rounds = 10 }; + +/** \cond HIDDEN_FROM_DOXYGEN */ +R123_STATIC_INLINE __m128i AES_128_ASSIST (__m128i temp1, __m128i temp2) { + __m128i temp3; + temp2 = _mm_shuffle_epi32 (temp2 ,0xff); + temp3 = _mm_slli_si128 (temp1, 0x4); + temp1 = _mm_xor_si128 (temp1, temp3); + temp3 = _mm_slli_si128 (temp3, 0x4); + temp1 = _mm_xor_si128 (temp1, temp3); + temp3 = _mm_slli_si128 (temp3, 0x4); + temp1 = _mm_xor_si128 (temp1, temp3); + temp1 = _mm_xor_si128 (temp1, temp2); + return temp1; +} + +R123_STATIC_INLINE void aesni1xm128iexpand(aesni1xm128i_ukey_t uk, __m128i ret[11]) +{ + __m128i rkey = uk.v[0].m; + __m128i tmp2; + + ret[0] = rkey; + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[1] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x2); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[2] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x4); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[3] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x8); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[4] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x10); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[5] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x20); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[6] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x40); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[7] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x80); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[8] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1b); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[9] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x36); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[10] = rkey; +} +/** \endcond */ + +#ifdef __cplusplus +/** @ingroup AESNI */ +struct aesni1xm128i_key_t{ + __m128i k[11]; + aesni1xm128i_key_t(){ + aesni1xm128i_ukey_t uk; + uk.v[0].m = _mm_setzero_si128(); + aesni1xm128iexpand(uk, k); + } + aesni1xm128i_key_t(const aesni1xm128i_ukey_t& uk){ + aesni1xm128iexpand(uk, k); + } + aesni1xm128i_key_t(const aesni4x32_ukey_t& uk){ + aesni1xm128i_ukey_t uk128; + uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]); + aesni1xm128iexpand(uk128, k); + } + aesni1xm128i_key_t& operator=(const aesni1xm128i_ukey_t& uk){ + aesni1xm128iexpand(uk, k); + return *this; + } + aesni1xm128i_key_t& operator=(const aesni4x32_ukey_t& uk){ + aesni1xm128i_ukey_t uk128; + uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]); + aesni1xm128iexpand(uk128, k); + return *this; + } + bool operator==(const aesni1xm128i_key_t& rhs) const{ + for(int i=0; i<11; ++i){ + // Sigh... No r123m128i(__m128i) constructor! + r123m128i li; li.m = k[i]; + r123m128i ri; ri.m = rhs.k[i]; + if( li != ri ) return false; + } + return true; + } + bool operator!=(const aesni1xm128i_key_t& rhs) const{ + return !(*this == rhs); + } + friend std::ostream& operator<<(std::ostream& os, const aesni1xm128i_key_t& v){ + r123m128i ki; + for(int i=0; i<10; ++i){ + ki.m = v.k[i]; + os << ki << " "; + } + ki.m = v.k[10]; + return os << ki; + } + friend std::istream& operator>>(std::istream& is, aesni1xm128i_key_t& v){ + r123m128i ki; + for(int i=0; i<11; ++i){ + is >> ki; + v.k[i] = ki; + } + return is; + } +}; +#else +typedef struct { + __m128i k[11]; +}aesni1xm128i_key_t; + +/** @ingroup AESNI */ +R123_STATIC_INLINE aesni1xm128i_key_t aesni1xm128ikeyinit(aesni1xm128i_ukey_t uk){ + aesni1xm128i_key_t ret; + aesni1xm128iexpand(uk, ret.k); + return ret; +} +#endif + +/** @ingroup AESNI */ +R123_STATIC_INLINE aesni1xm128i_ctr_t aesni1xm128i(aesni1xm128i_ctr_t in, aesni1xm128i_key_t k) { + __m128i x = _mm_xor_si128(k.k[0], in.v[0].m); + x = _mm_aesenc_si128(x, k.k[1]); + x = _mm_aesenc_si128(x, k.k[2]); + x = _mm_aesenc_si128(x, k.k[3]); + x = _mm_aesenc_si128(x, k.k[4]); + x = _mm_aesenc_si128(x, k.k[5]); + x = _mm_aesenc_si128(x, k.k[6]); + x = _mm_aesenc_si128(x, k.k[7]); + x = _mm_aesenc_si128(x, k.k[8]); + x = _mm_aesenc_si128(x, k.k[9]); + x = _mm_aesenclast_si128(x, k.k[10]); + { + aesni1xm128i_ctr_t ret; + ret.v[0].m = x; + return ret; + } +} + +/** @ingroup AESNI */ +R123_STATIC_INLINE aesni1xm128i_ctr_t aesni1xm128i_R(unsigned R, aesni1xm128i_ctr_t in, aesni1xm128i_key_t k){ + R123_ASSERT(R==10); + return aesni1xm128i(in, k); +} + + +/** @ingroup AESNI */ +typedef struct r123array4x32 aesni4x32_ctr_t; +/** @ingroup AESNI */ +typedef aesni1xm128i_key_t aesni4x32_key_t; +/** @ingroup AESNI */ +enum r123_enum_aesni4x32 { aesni4x32_rounds = 10 }; +/** @ingroup AESNI */ +R123_STATIC_INLINE aesni4x32_key_t aesni4x32keyinit(aesni4x32_ukey_t uk){ + aesni1xm128i_ukey_t uk128; + aesni4x32_key_t ret; + uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]); + aesni1xm128iexpand(uk128, ret.k); + return ret; +} + +/** @ingroup AESNI */ +/** The aesni4x32_R function provides a C API to the @ref AESNI "AESNI" CBRNG, allowing the number of rounds to be specified explicitly **/ +R123_STATIC_INLINE aesni4x32_ctr_t aesni4x32_R(unsigned int Nrounds, aesni4x32_ctr_t c, aesni4x32_key_t k){ + aesni1xm128i_ctr_t c128; + c128.v[0].m = _mm_set_epi32(c.v[3], c.v[2], c.v[1], c.v[0]); + c128 = aesni1xm128i_R(Nrounds, c128, k); + _mm_storeu_si128((__m128i*)&c.v[0], c128.v[0].m); + return c; +} + +#define aesni4x32_rounds aesni1xm128i_rounds + +/** The aesni4x32 macro provides a C API to the @ref AESNI "AESNI" CBRNG, uses the default number of rounds i.e. \c aesni4x32_rounds **/ +/** @ingroup AESNI */ +#define aesni4x32(c,k) aesni4x32_R(aesni4x32_rounds, c, k) + +#ifdef __cplusplus +namespace r123{ +/** +@defgroup AESNI ARS and AESNI Classes and Typedefs + +The ARS4x32, ARS1xm128i, AESNI4x32 and AESNI1xm128i classes export the member functions, typedefs and +operator overloads required by a @ref CBRNG "CBRNG" class. + +ARS1xm128i and AESNI1xm128i are based on the AES block cipher and rely on the AES-NI hardware instructions +available on some some new (2011) CPUs. + +The ARS1xm128i CBRNG and the use of AES for random number generation are described in +<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>. +Although it uses some cryptographic primitives, ARS1xm128i uses a cryptographically weak key schedule and is \b not suitable for cryptographic use. + +@class AESNI1xm128i +@ingroup AESNI +AESNI exports the member functions, typedefs and operator overloads required by a @ref CBRNG class. + +AESNI1xm128i uses the crypotgraphic AES round function, including the cryptographic key schedule. + +In contrast to the other CBRNGs in the Random123 library, the AESNI1xm128i_R::key_type is opaque +and is \b not identical to the AESNI1xm128i_R::ukey_type. Creating a key_type, using either the constructor +or assignment operator, is significantly more time-consuming than running the bijection (hundreds +of clock cycles vs. tens of clock cycles). + +AESNI1xm128i is only available when the feature-test macro R123_USE_AES_NI is true, which +should occur only when the compiler is configured to generate AES-NI instructions (or +when defaults are overridden by compile-time, compiler-command-line options). + +As of September 2011, the authors know of no statistical flaws with AESNI1xm128i. It +would be an event of major cryptographic note if any such flaws were ever found. +*/ +struct AESNI1xm128i{ + typedef aesni1xm128i_ctr_t ctr_type; + typedef aesni1xm128i_ukey_t ukey_type; + typedef aesni1xm128i_key_t key_type; + static const unsigned int rounds=10; + ctr_type operator()(ctr_type ctr, key_type key) const{ + return aesni1xm128i(ctr, key); + } +}; + +/* @class AESNI4x32 */ +struct AESNI4x32{ + typedef aesni4x32_ctr_t ctr_type; + typedef aesni4x32_ukey_t ukey_type; + typedef aesni4x32_key_t key_type; + static const unsigned int rounds=10; + ctr_type operator()(ctr_type ctr, key_type key) const{ + return aesni4x32(ctr, key); + } +}; + +/** @ingroup AESNI + @class AESNI1xm128i_R + +AESNI1xm128i_R is provided for completeness, but is only instantiable with ROUNDS=10, in +which case it is identical to AESNI1xm128i */ +template <unsigned ROUNDS=10> +struct AESNI1xm128i_R : public AESNI1xm128i{ + R123_STATIC_ASSERT(ROUNDS==10, "AESNI1xm128i_R<R> is only valid with R=10"); +}; + +/** @class AESNI4x32_R **/ +template <unsigned ROUNDS=10> +struct AESNI4x32_R : public AESNI4x32{ + R123_STATIC_ASSERT(ROUNDS==10, "AESNI4x32_R<R> is only valid with R=10"); +}; +} // namespace r123 +#endif /* __cplusplus */ + +#endif /* R123_USE_AES_NI */ + +#if R123_USE_AES_OPENSSL +#include "string.h" +#include <openssl/aes.h> +typedef struct r123array16x8 aesopenssl16x8_ctr_t; +typedef struct r123array16x8 aesopenssl16x8_ukey_t; +#ifdef __cplusplus +struct aesopenssl16x8_key_t{ + AES_KEY k; + aesopenssl16x8_key_t(){ + aesopenssl16x8_ukey_t ukey={{}}; + AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k); + } + aesopenssl16x8_key_t(const aesopenssl16x8_ukey_t& ukey){ + AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k); + } + aesopenssl16x8_key_t& operator=(const aesopenssl16x8_ukey_t& ukey){ + AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k); + return *this; + } + bool operator==(const aesopenssl16x8_key_t& rhs) const{ + return (k.rounds == rhs.k.rounds) && 0==::memcmp(&k.rd_key[0], &rhs.k.rd_key[0], (k.rounds+1) * 4 * sizeof(uint32_t)); + } + bool operator!=(const aesopenssl16x8_key_t& rhs) const{ + return !(*this == rhs); + } + friend std::ostream& operator<<(std::ostream& os, const aesopenssl16x8_key_t& v){ + os << v.k.rounds; + const unsigned int *p = &v.k.rd_key[0]; + for(int i=0; i<(v.k.rounds+1); ++i){ + os << " " << p[0] << " " << p[1] << " " << p[2] << " " << p[3]; + p += 4; + } + return os; + } + friend std::istream& operator>>(std::istream& is, aesopenssl16x8_key_t& v){ + is >> v.k.rounds; + unsigned int *p = &v.k.rd_key[0]; + for(int i=0; i<(v.k.rounds+1); ++i){ + is >> p[0] >> p[1] >> p[2] >> p[3]; + p += 4; + } + return is; + } +}; +#else +typedef struct aesopenssl16x8_key_t{ + AES_KEY k; +}aesopenssl16x8_key_t; +R123_STATIC_INLINE struct aesopenssl16x8_key_t aesopenssl16x8keyinit(aesopenssl16x8_ukey_t uk){ + aesopenssl16x8_key_t ret; + AES_set_encrypt_key((const unsigned char *)&uk.v[0], 128, &ret.k); + return ret; +} +#endif + +R123_STATIC_INLINE R123_FORCE_INLINE(aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key)); +R123_STATIC_INLINE +aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key){ + aesopenssl16x8_ctr_t ret; + AES_encrypt((const unsigned char*)&ctr.v[0], (unsigned char *)&ret.v[0], &key.k); + return ret; +} + +#define aesopenssl16x8_rounds aesni4x32_rounds +#define aesopenssl16x8(c,k) aesopenssl16x8_R(aesopenssl16x8_rounds) + +#ifdef __cplusplus +namespace r123{ +struct AESOpenSSL16x8{ + typedef aesopenssl16x8_ctr_t ctr_type; + typedef aesopenssl16x8_key_t key_type; + typedef aesopenssl16x8_ukey_t ukey_type; + static const unsigned int rounds=10; + ctr_type operator()(const ctr_type& in, const key_type& k){ + ctr_type out; + AES_encrypt((const unsigned char *)&in[0], (unsigned char *)&out[0], &k.k); + return out; + } +}; +} // namespace r123 +#endif /* __cplusplus */ +#endif /* R123_USE_AES_OPENSSL */ + +#endif diff --git a/include/Random123/array.h b/include/Random123/array.h @@ -0,0 +1,355 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _r123array_dot_h__ +#define _r123array_dot_h__ +#include "features/compilerfeatures.h" +#include "features/sse.h" + +#if !defined(__cplusplus) || defined(__METAL_MACOS__) +#define CXXMETHODS(_N, W, T) +#define CXXOVERLOADS(_N, W, T) +#define CXXMETHODS_REQUIRING_STL +#else + +#include <stddef.h> +#include <algorithm> +#include <stdexcept> +#include <iterator> +#include <limits> +#include <iostream> + +/** @defgroup arrayNxW The r123arrayNxW classes + + Each of the r123arrayNxW is a fixed size array of N W-bit unsigned integers. + It is functionally equivalent to the C++11 std::array<N, uintW_t>, + but does not require C++11 features or libraries. + + In addition to meeting most of the requirements of a Container, + it also has a member function, incr(), which increments the zero-th + element and carrys overflows into higher indexed elements. Thus, + by using incr(), sequences of up to 2^(N*W) distinct values + can be produced. + + If SSE is supported by the compiler, then the class + r123array1xm128i is also defined, in which the data member is an + array of one r123m128i object. + + When compiling with __CUDA_ARCH__ defined, the reverse iterator + methods (rbegin, rend, crbegin, crend) are not defined because + CUDA does not support std::reverse_iterator. + +*/ + +/** @cond HIDDEN_FROM_DOXYGEN */ + +template <typename value_type> +inline R123_CUDA_DEVICE value_type assemble_from_u32(uint32_t *p32){ + value_type v=0; + for(size_t i=0; i<(3+sizeof(value_type))/4; ++i) + v |= ((value_type)(*p32++)) << (32*i); + return v; +} + +/** @endcond */ + +#ifdef __CUDA_ARCH__ +/* CUDA can't handle std::reverse_iterator. We *could* implement it + ourselves, but let's not bother until somebody really feels a need + to reverse-iterate through an r123array */ +#define CXXMETHODS_REQUIRING_STL +#else +#define CXXMETHODS_REQUIRING_STL \ + public: \ + typedef std::reverse_iterator<iterator> reverse_iterator; \ + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; \ + R123_CUDA_DEVICE reverse_iterator rbegin(){ return reverse_iterator(end()); } \ + R123_CUDA_DEVICE const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); } \ + R123_CUDA_DEVICE reverse_iterator rend(){ return reverse_iterator(begin()); } \ + R123_CUDA_DEVICE const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); } \ + R123_CUDA_DEVICE const_reverse_iterator crbegin() const{ return const_reverse_iterator(cend()); } \ + R123_CUDA_DEVICE const_reverse_iterator crend() const{ return const_reverse_iterator(cbegin()); } +#endif + +// Work-alike methods and typedefs modeled on std::array: +#define CXXMETHODS(_N, W, T) \ + typedef T value_type; \ + typedef T* iterator; \ + typedef const T* const_iterator; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + typedef size_t size_type; \ + typedef ptrdiff_t difference_type; \ + typedef T* pointer; \ + typedef const T* const_pointer; \ + /* Boost.array has static_size. C++11 specializes tuple_size */ \ + enum {static_size = _N}; \ + R123_CUDA_DEVICE reference operator[](size_type i){return v[i];} \ + R123_CUDA_DEVICE const_reference operator[](size_type i) const {return v[i];} \ + R123_CUDA_DEVICE reference at(size_type i){ if(i >= _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \ + R123_CUDA_DEVICE const_reference at(size_type i) const { if(i >= _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \ + R123_CUDA_DEVICE size_type size() const { return _N; } \ + R123_CUDA_DEVICE size_type max_size() const { return _N; } \ + R123_CUDA_DEVICE bool empty() const { return _N==0; }; \ + R123_CUDA_DEVICE iterator begin() { return &v[0]; } \ + R123_CUDA_DEVICE iterator end() { return &v[_N]; } \ + R123_CUDA_DEVICE const_iterator begin() const { return &v[0]; } \ + R123_CUDA_DEVICE const_iterator end() const { return &v[_N]; } \ + R123_CUDA_DEVICE const_iterator cbegin() const { return &v[0]; } \ + R123_CUDA_DEVICE const_iterator cend() const { return &v[_N]; } \ + R123_CUDA_DEVICE pointer data(){ return &v[0]; } \ + R123_CUDA_DEVICE const_pointer data() const{ return &v[0]; } \ + R123_CUDA_DEVICE reference front(){ return v[0]; } \ + R123_CUDA_DEVICE const_reference front() const{ return v[0]; } \ + R123_CUDA_DEVICE reference back(){ return v[_N-1]; } \ + R123_CUDA_DEVICE const_reference back() const{ return v[_N-1]; } \ + R123_CUDA_DEVICE bool operator==(const r123array##_N##x##W& rhs) const{ \ + /* CUDA3 does not have std::equal */ \ + for (size_t i = 0; i < _N; ++i) \ + if (v[i] != rhs.v[i]) return false; \ + return true; \ + } \ + R123_CUDA_DEVICE bool operator!=(const r123array##_N##x##W& rhs) const{ return !(*this == rhs); } \ + /* CUDA3 does not have std::fill_n */ \ + R123_CUDA_DEVICE void fill(const value_type& val){ for (size_t i = 0; i < _N; ++i) v[i] = val; } \ + R123_CUDA_DEVICE void swap(r123array##_N##x##W& rhs){ \ + /* CUDA3 does not have std::swap_ranges */ \ + for (size_t i = 0; i < _N; ++i) { \ + T tmp = v[i]; \ + v[i] = rhs.v[i]; \ + rhs.v[i] = tmp; \ + } \ + } \ + R123_CUDA_DEVICE r123array##_N##x##W& incr(R123_ULONG_LONG n=1){ \ + /* This test is tricky because we're trying to avoid spurious \ + complaints about illegal shifts, yet still be compile-time \ + evaulated. */ \ + if(sizeof(T)<sizeof(n) && n>>((sizeof(T)<sizeof(n))?8*sizeof(T):0) ) \ + return incr_carefully(n); \ + if(n==1){ \ + ++v[0]; \ + if(_N==1 || R123_BUILTIN_EXPECT(!!v[0], 1)) return *this; \ + }else{ \ + v[0] += n; \ + if(_N==1 || R123_BUILTIN_EXPECT(n<=v[0], 1)) return *this; \ + } \ + /* We expect that the N==?? tests will be \ + constant-folded/optimized away by the compiler, so only the \ + overflow tests (!!v[i]) remain to be done at runtime. For \ + small values of N, it would be better to do this as an \ + uncondtional sequence of adc. An experiment/optimization \ + for another day... \ + N.B. The weird subscripting: v[_N>3?3:0] is to silence \ + a spurious error from icpc \ + */ \ + ++v[_N>1?1:0]; \ + if(_N==2 || R123_BUILTIN_EXPECT(!!v[_N>1?1:0], 1)) return *this; \ + ++v[_N>2?2:0]; \ + if(_N==3 || R123_BUILTIN_EXPECT(!!v[_N>2?2:0], 1)) return *this; \ + ++v[_N>3?3:0]; \ + for(size_t i=4; i<_N; ++i){ \ + if( R123_BUILTIN_EXPECT(!!v[i-1], 1) ) return *this; \ + ++v[i]; \ + } \ + return *this; \ + } \ + /* seed(SeedSeq) would be a constructor if having a constructor */ \ + /* didn't cause headaches with defaults */ \ + template <typename SeedSeq> \ + R123_CUDA_DEVICE static r123array##_N##x##W seed(SeedSeq &ss){ \ + r123array##_N##x##W ret; \ + const size_t Ngen = _N*((3+sizeof(value_type))/4); \ + uint32_t u32[Ngen]; \ + uint32_t *p32 = &u32[0]; \ + ss.generate(&u32[0], &u32[Ngen]); \ + for(size_t i=0; i<_N; ++i){ \ + ret.v[i] = assemble_from_u32<value_type>(p32); \ + p32 += (3+sizeof(value_type))/4; \ + } \ + return ret; \ + } \ +protected: \ + R123_CUDA_DEVICE r123array##_N##x##W& incr_carefully(R123_ULONG_LONG n){ \ + /* n may be greater than the maximum value of a single value_type */ \ + value_type vtn; \ + vtn = n; \ + v[0] += n; \ + const unsigned rshift = 8* ((sizeof(n)>sizeof(value_type))? sizeof(value_type) : 0); \ + for(size_t i=1; i<_N; ++i){ \ + if(rshift){ \ + n >>= rshift; \ + }else{ \ + n=0; \ + } \ + if( v[i-1] < vtn ) \ + ++n; \ + if( n==0 ) break; \ + vtn = n; \ + v[i] += n; \ + } \ + return *this; \ + } \ + +/** @cond HIDDEN_FROM_DOXYGEN */ + +// There are several tricky considerations for the insertion and extraction +// operators: +// - we would like to be able to print r123array16x8 as a sequence of 16 integers, +// not as 16 bytes. +// - we would like to be able to print r123array1xm128i. +// - we do not want an int conversion operator in r123m128i because it causes +// lots of ambiguity problems with automatic promotions. +// Solution: r123arrayinsertable and r123arrayextractable + +template<typename T> +struct r123arrayinsertable{ + const T& v; + r123arrayinsertable(const T& t_) : v(t_) {} + friend std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<T>& t){ + return os << t.v; + } +}; + +template<> +struct r123arrayinsertable<uint8_t>{ + const uint8_t& v; + r123arrayinsertable(const uint8_t& t_) : v(t_) {} + friend std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<uint8_t>& t){ + return os << (int)t.v; + } +}; + +template<typename T> +struct r123arrayextractable{ + T& v; + r123arrayextractable(T& t_) : v(t_) {} + friend std::istream& operator>>(std::istream& is, r123arrayextractable<T>& t){ + return is >> t.v; + } +}; + +template<> +struct r123arrayextractable<uint8_t>{ + uint8_t& v; + r123arrayextractable(uint8_t& t_) : v(t_) {} + friend std::istream& operator>>(std::istream& is, r123arrayextractable<uint8_t>& t){ + int i; + is >> i; + t.v = i; + return is; + } +}; +/** @endcond */ + +#define CXXOVERLOADS(_N, W, T) \ + \ +inline std::ostream& operator<<(std::ostream& os, const r123array##_N##x##W& a){ \ + os << r123arrayinsertable<T>(a.v[0]); \ + for(size_t i=1; i<_N; ++i) \ + os << " " << r123arrayinsertable<T>(a.v[i]); \ + return os; \ +} \ + \ +inline std::istream& operator>>(std::istream& is, r123array##_N##x##W& a){ \ + for(size_t i=0; i<_N; ++i){ \ + r123arrayextractable<T> x(a.v[i]); \ + is >> x; \ + } \ + return is; \ +} \ + \ +namespace r123{ \ + typedef r123array##_N##x##W Array##_N##x##W; \ +} + +#endif /* __cplusplus */ + +/* _r123array_tpl expands to a declaration of struct r123arrayNxW. + + In C, it's nothing more than a struct containing an array of N + objects of type T. + + In C++ it's the same, but endowed with an assortment of member + functions, typedefs and friends. In C++, r123arrayNxW looks a lot + like std::array<T,N>, has most of the capabilities of a container, + and satisfies the requirements outlined in compat/Engine.hpp for + counter and key types. ArrayNxW, in the r123 namespace is + a typedef equivalent to r123arrayNxW. +*/ + +#define _r123array_tpl(_N, W, T) \ + /** @ingroup arrayNxW */ \ + /** @see arrayNxW */ \ +struct r123array##_N##x##W{ \ + T v[_N]; \ + CXXMETHODS(_N, W, T) \ + CXXMETHODS_REQUIRING_STL \ +}; \ + \ +CXXOVERLOADS(_N, W, T) + + +#if defined(__CUDACC__) +/* Disable complaints from CUDA8 and C++ */ +#pragma diag_suppress = code_is_unreachable +#endif +_r123array_tpl(1, 32, uint32_t) /* r123array1x32 */ +_r123array_tpl(2, 32, uint32_t) /* r123array2x32 */ +_r123array_tpl(4, 32, uint32_t) /* r123array4x32 */ +_r123array_tpl(8, 32, uint32_t) /* r123array8x32 */ + +#if R123_USE_64BIT +_r123array_tpl(1, 64, uint64_t) /* r123array1x64 */ +_r123array_tpl(2, 64, uint64_t) /* r123array2x64 */ +_r123array_tpl(4, 64, uint64_t) /* r123array4x64 */ +#endif +#if defined(__CUDACC__) +#pragma diag_default = code_is_unreachable +#endif + +_r123array_tpl(16, 8, uint8_t) /* r123array16x8 for ARSsw, AESsw */ + +#if R123_USE_SSE +_r123array_tpl(1, m128i, r123m128i) /* r123array1x128i for ARSni, AESni */ +#endif + +/* In C++, it's natural to use sizeof(a::value_type), but in C it's + pretty convoluted to figure out the width of the value_type of an + r123arrayNxW: +*/ +#define R123_W(a) (8*sizeof(((a *)0)->v[0])) + +/** @namespace r123 + Most of the Random123 C++ API is contained in the r123 namespace. +*/ + +#endif + diff --git a/include/Random123/ars.h b/include/Random123/ars.h @@ -0,0 +1,204 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __Random123_ars_dot_hpp__ +#define __Random123_ars_dot_hpp__ + +#include "features/compilerfeatures.h" +#include "array.h" + +#if R123_USE_AES_NI + +#ifndef ARS1xm128i_DEFAULT_ROUNDS +#define ARS1xm128i_DEFAULT_ROUNDS 7 +#endif + +/** @ingroup AESNI */ +enum r123_enum_ars1xm128i {ars1xm128i_rounds = ARS1xm128i_DEFAULT_ROUNDS}; + +/* ARS1xm128i with Weyl keys. Fast, and Crush-resistant, but NOT CRYPTO. */ +/** @ingroup AESNI */ +typedef struct r123array1xm128i ars1xm128i_ctr_t; +/** @ingroup AESNI */ +typedef struct r123array1xm128i ars1xm128i_key_t; +/** @ingroup AESNI */ +typedef struct r123array1xm128i ars1xm128i_ukey_t; +/** @ingroup AESNI */ +R123_STATIC_INLINE ars1xm128i_key_t ars1xm128ikeyinit(ars1xm128i_ukey_t uk) { return uk; } +/** @ingroup AESNI */ +R123_STATIC_INLINE ars1xm128i_ctr_t ars1xm128i_R(unsigned int Nrounds, ars1xm128i_ctr_t in, ars1xm128i_key_t k){ + __m128i kweyl = _mm_set_epi64x(R123_64BIT(0xBB67AE8584CAA73B), /* sqrt(3) - 1.0 */ + R123_64BIT(0x9E3779B97F4A7C15)); /* golden ratio */ + /* N.B. the aesenc instructions do the xor *after* + // so if we want to follow the AES pattern, we + // have to do the initial xor explicitly */ + __m128i kk = k.v[0].m; + __m128i v = _mm_xor_si128(in.v[0].m, kk); + ars1xm128i_ctr_t ret; + R123_ASSERT(Nrounds<=10); + if( Nrounds>1 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>2 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>3 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>4 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>5 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>6 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>7 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>8 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>9 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenclast_si128(v, kk); + ret.v[0].m = v; + return ret; +} + +/** @def ars1xm128i +@ingroup AESNI +The ars1mx128i macro provides a C API interface to the @ref AESNI "ARS" CBRNG with the default number of rounds i.e. \c ars1xm128i_rounds **/ +#define ars1xm128i(c,k) ars1xm128i_R(ars1xm128i_rounds, c, k) + +/** @ingroup AESNI */ +typedef struct r123array4x32 ars4x32_ctr_t; +/** @ingroup AESNI */ +typedef struct r123array4x32 ars4x32_key_t; +/** @ingroup AESNI */ +typedef struct r123array4x32 ars4x32_ukey_t; +/** @ingroup AESNI */ +enum r123_enum_ars4x32 {ars4x32_rounds = ARS1xm128i_DEFAULT_ROUNDS}; +/** @ingroup AESNI */ +R123_STATIC_INLINE ars4x32_key_t ars4x32keyinit(ars4x32_ukey_t uk) { return uk; } +/** @ingroup AESNI */ +R123_STATIC_INLINE ars4x32_ctr_t ars4x32_R(unsigned int Nrounds, ars4x32_ctr_t c, ars4x32_key_t k){ + ars1xm128i_ctr_t c128; + ars1xm128i_key_t k128; + c128.v[0].m = _mm_set_epi32(c.v[3], c.v[2], c.v[1], c.v[0]); + k128.v[0].m = _mm_set_epi32(k.v[3], k.v[2], k.v[1], k.v[0]); + c128 = ars1xm128i_R(Nrounds, c128, k128); + _mm_storeu_si128((__m128i*)&c.v[0], c128.v[0].m); + return c; +} + +/** @def ars4x32 +@ingroup AESNI +The ars4x32 macro provides a C API interface to the @ref AESNI "ARS" CBRNG with the default number of rounds i.e. \c ars4x32_rounds **/ +#define ars4x32(c,k) ars4x32_R(ars4x32_rounds, c, k) + +#ifdef __cplusplus +namespace r123{ +/** +@ingroup AESNI + +ARS1xm128i_R exports the member functions, typedefs and operator overloads required by a @ref CBRNG class. + +ARS1xm128i uses the crypotgraphic AES round function, but a @b non-cryptographc key schedule +to save time and space. + +ARS1xm128i is only available when the feature-test macro R123_USE_AES_NI is true, which +should occur only when the compiler is configured to generate AES-NI instructions (or +when defaults are overridden by compile-time, compiler-command-line options). + +The template argument, ROUNDS, is the number of times the ARS round +functions will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=5 or more. + +@class ARS1xm128i_R + +*/ +template<unsigned int ROUNDS> +struct ARS1xm128i_R{ + typedef ars1xm128i_ctr_t ctr_type; + typedef ars1xm128i_key_t key_type; + typedef ars1xm128i_key_t ukey_type; + static const unsigned int rounds=ROUNDS; + R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ + return ars1xm128i_R(ROUNDS, ctr, key); + } +}; + +/** @class ARS4x32_R + @ingroup AESNI +*/ + +template<unsigned int ROUNDS> +struct ARS4x32_R{ + typedef ars4x32_ctr_t ctr_type; + typedef ars4x32_key_t key_type; + typedef ars4x32_key_t ukey_type; + static const unsigned int rounds=ROUNDS; + R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ + return ars4x32_R(ROUNDS, ctr, key); + } +}; +/** +@ingroup AESNI + +@class ARS1xm128i_R + ARS1xm128i is equivalent to ARS1xm128i_R<7>. With 7 rounds, + the ARS1xm128i CBRNG has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. */ +typedef ARS1xm128i_R<ars1xm128i_rounds> ARS1xm128i; +typedef ARS4x32_R<ars4x32_rounds> ARS4x32; +} // namespace r123 + +#endif /* __cplusplus */ + +#endif /* R123_USE_AES_NI */ + +#endif diff --git a/include/Random123/boxmuller.hpp b/include/Random123/boxmuller.hpp @@ -0,0 +1,139 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +// This file implements the Box-Muller method for generating gaussian +// random variables (GRVs). Box-Muller has the advantage of +// deterministically requiring exactly two uniform random variables as +// input and producing exactly two GRVs as output, which makes it +// especially well-suited to the counter-based generators in +// Random123. Other methods (e.g., Ziggurat, polar) require an +// indeterminate number of inputs for each output and so require a +// 'MicroURNG' to be used with Random123. The down side of Box-Muller +// is that it calls sincos, log and sqrt, which may be slow. However, +// on GPUs, these functions are remarkably fast, which makes +// Box-Muller the fastest GRV generator we know of on GPUs. +// +// This file exports two structs and one overloaded function, +// all in the r123 namespace: +// struct r123::float2{ float x,y; } +// struct r123::double2{ double x,y; } +// +// r123::float2 r123::boxmuller(uint32_t u0, uint32_t u1); +// r123::double2 r123::boxmuller(uint64_t u0, uint64_t u1); +// +// float2 and double2 are identical to their synonymous global- +// namespace structures in CUDA. +// +// This file may not be as portable, and has not been tested as +// rigorously as other files in the library, e.g., the generators. +// Nevertheless, we hope it is useful and we encourage developers to +// copy it and modify it for their own use. We invite comments and +// improvements. + +#ifndef _r123_BOXMULLER_HPP__ +#define _r123_BOXMULLER_HPP__ + +#include <Random123/features/compilerfeatures.h> +#include <Random123/uniform.hpp> +#include <math.h> + +namespace r123{ + +#if !defined(__CUDACC__) +typedef struct { float x, y; } float2; +typedef struct { double x, y; } double2; +#else +typedef ::float2 float2; +typedef ::double2 double2; +#endif + +#if !defined(R123_NO_SINCOS) && defined(__APPLE__) +/* MacOS X 10.10.5 (2015) doesn't have sincosf */ +#define R123_NO_SINCOS 1 +#endif + +#if R123_NO_SINCOS /* enable this if sincos and sincosf are not in the math library */ +R123_CUDA_DEVICE R123_STATIC_INLINE void sincosf(float x, float *s, float *c) { + *s = sinf(x); + *c = cosf(x); +} + +R123_CUDA_DEVICE R123_STATIC_INLINE void sincos(double x, double *s, double *c) { + *s = sin(x); + *c = cos(x); +} +#endif /* sincos is not in the math library */ + +#if !defined(CUDART_VERSION) || CUDART_VERSION < 5000 /* enabled if sincospi and sincospif are not in math lib */ + +R123_CUDA_DEVICE R123_STATIC_INLINE void sincospif(float x, float *s, float *c){ + const float PIf = 3.1415926535897932f; + sincosf(PIf*x, s, c); +} + +R123_CUDA_DEVICE R123_STATIC_INLINE void sincospi(double x, double *s, double *c) { + const double PI = 3.1415926535897932; + sincos(PI*x, s, c); +} +#endif /* sincospi is not in math lib */ + +/* + * take two 32bit unsigned random values and return a float2 with + * two random floats in a normal distribution via a Box-Muller transform + */ +R123_CUDA_DEVICE R123_STATIC_INLINE float2 boxmuller(uint32_t u0, uint32_t u1) { + float r; + float2 f; + sincospif(uneg11<float>(u0), &f.x, &f.y); + r = sqrtf(-2.f * logf(u01<float>(u1))); // u01 is guaranteed to avoid 0. + f.x *= r; + f.y *= r; + return f; +} + +/* + * take two 64bit unsigned random values and return a double2 with + * two random doubles in a normal distribution via a Box-Muller transform + */ +R123_CUDA_DEVICE R123_STATIC_INLINE double2 boxmuller(uint64_t u0, uint64_t u1) { + double r; + double2 f; + + sincospi(uneg11<double>(u0), &f.x, &f.y); + r = sqrt(-2. * log(u01<double>(u1))); // u01 is guaranteed to avoid 0. + f.x *= r; + f.y *= r; + return f; +} +} // namespace r123 + +#endif /* BOXMULLER_H__ */ diff --git a/include/Random123/conventional/Engine.hpp b/include/Random123/conventional/Engine.hpp @@ -0,0 +1,280 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __Engine_dot_hpp_ +#define __Engine_dot_hpp_ + +#include "../features/compilerfeatures.h" +#include "../array.h" +#include <limits> +#include <stdexcept> +#include <sstream> +#include <algorithm> +#include <vector> +#if R123_USE_CXX11_TYPE_TRAITS +#include <type_traits> +#endif + +namespace r123{ +/** + If G satisfies the requirements of a CBRNG, and has a ctr_type whose + value_type is an unsigned integral type, then Engine<G> satisfies + the requirements of a C++11 "Uniform Random Number Engine" and can + be used in any context where such an object is expected. + + Note that wrapping a counter based RNG with a traditional API in + this way obscures much of the power of counter based PRNGs. + Nevertheless, it may be of value in applications that are already + coded to work with the C++11 random number engines. + + The MicroURNG template in MicroURNG.hpp + provides the more limited functionality of a C++11 "Uniform + Random Number Generator", but leaves the application in control + of counters and keys and hence may be preferable to the Engine template. + For example, a MicroURNG allows one to use C++11 "Random Number + Distributions" without giving up control over the counters + and keys. +*/ + +template<typename CBRNG> +struct Engine { + typedef CBRNG cbrng_type; + typedef typename CBRNG::ctr_type ctr_type; + typedef typename CBRNG::key_type key_type; + typedef typename CBRNG::ukey_type ukey_type; + typedef typename ctr_type::value_type result_type; + +protected: + cbrng_type b; + key_type key; + ctr_type c; + ctr_type v; + + void fix_invariant(){ + if( v.back() != 0 ) { + result_type vv = v.back(); + v = b(c, key); + v.back() = vv; + } + } +public: + explicit Engine() : b(), c() { + ukey_type x = {{}}; + v.back() = 0; + key = x; + } + explicit Engine(result_type r) : b(), c() { + ukey_type x = {{typename ukey_type::value_type(r)}}; + v.back() = 0; + key = x; + } + // 26.5.3 says that the SeedSeq templates shouldn't particpate in + // overload resolution unless the type qualifies as a SeedSeq. + // How that is determined is unspecified, except that "as a + // minimum a type shall not qualify as a SeedSeq if it is + // implicitly convertible to a result_type." + // + // First, we make sure that even the non-const copy constructor + // works as expected. In addition, if we've got C++11 + // type_traits, we use enable_if and is_convertible to implement + // the convertible-to-result_type restriction. Otherwise, the + // template is unconditional and will match in some surpirsing + // and undesirable situations. + Engine(Engine& e) : b(e.b), key(e.key), c(e.c){ + v.back() = e.v.back(); + fix_invariant(); + } + Engine(const Engine& e) : b(e.b), key(e.key), c(e.c){ + v.back() = e.v.back(); + fix_invariant(); + } +#if __cplusplus >= 201103L + Engine& operator=(const Engine&) = default; + Engine& operator=(Engine&&) = default; +#endif + + template <typename SeedSeq> + explicit Engine(SeedSeq &s +#if R123_USE_CXX11_TYPE_TRAITS + , typename std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0 +#endif + ) + : b(), c() { + ukey_type ukey = ukey_type::seed(s); + key = ukey; + v.back() = 0; + } + void seed(result_type r){ + *this = Engine(r); + } + template <typename SeedSeq> + void seed(SeedSeq &s +#if R123_USE_CXX11_TYPE_TRAITS + , typename std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0 +#endif + ){ + *this = Engine(s); + } + void seed(){ + *this = Engine(); + } + friend bool operator==(const Engine& lhs, const Engine& rhs){ + return lhs.c==rhs.c && lhs.v.back() == rhs.v.back() && lhs.key == rhs.key; + } + friend bool operator!=(const Engine& lhs, const Engine& rhs){ + return lhs.c!=rhs.c || lhs.v.back()!=rhs.v.back() || lhs.key!=rhs.key; + } + + friend std::ostream& operator<<(std::ostream& os, const Engine& be){ + return os << be.c << " " << be.key << " " << be.v.back(); + } + + friend std::istream& operator>>(std::istream& is, Engine& be){ + is >> be.c >> be.key >> be.v.back(); + be.fix_invariant(); + return is; + } + + // The <random> shipped with MacOS Xcode 4.5.2 imposes a + // non-standard requirement that URNGs also have static data + // members: _Min and _Max. Later versions of libc++ impose the + // requirement only when constexpr isn't supported. Although the + // Xcode 4.5.2 requirement is clearly non-standard, it is unlikely + // to be fixed and it is very easy work around. We certainly + // don't want to go to great lengths to accommodate every buggy + // library we come across, but in this particular case, the effort + // is low and the benefit is high, so it's worth doing. Thanks to + // Yan Zhou for pointing this out to us. See similar code in + // ../MicroURNG.hpp + const static result_type _Min = 0; + const static result_type _Max = ~((result_type)0); + + static R123_CONSTEXPR result_type min R123_NO_MACRO_SUBST () { return _Min; } + static R123_CONSTEXPR result_type max R123_NO_MACRO_SUBST () { return _Max; } + + result_type operator()(){ + if( c.size() == 1 ) // short-circuit the scalar case. Compilers aren't mind-readers. + return b(c.incr(), key)[0]; + result_type& elem = v.back(); + if( elem == 0 ){ + v = b(c.incr(), key); + result_type ret = v.back(); + elem = c.size()-1; + return ret; + } + return v[--elem]; + } + + void discard(R123_ULONG_LONG skip){ + // don't forget: elem counts down + size_t nelem = c.size(); + size_t sub = skip % nelem; + result_type& elem = v.back(); + skip /= nelem; + if (elem < sub) { + elem += nelem; + skip++; + } + elem -= sub; + c.incr(skip); + fix_invariant(); + } + + //-------------------------- + // Some bonus methods, not required for a Random Number + // Engine + + // Constructors and seed() method for ukey_type seem useful + // We need const and non-const to supersede the SeedSeq template. + explicit Engine(const ukey_type &uk) : key(uk), c(){ v.back() = 0; } + explicit Engine(ukey_type &uk) : key(uk), c(){ v.back() = 0; } + void seed(const ukey_type& uk){ + *this = Engine(uk); + } + void seed(ukey_type& uk){ + *this = Engine(uk); + } + +#if R123_USE_CXX11_TYPE_TRAITS + template <typename DUMMY=void> + explicit Engine(const key_type& k, + typename std::enable_if<!std::is_same<ukey_type, key_type>::value, DUMMY>::type* = 0) + : key(k), c(){ v.back() = 0; } + + template <typename DUMMY=void> + void seed(const key_type& k, + typename std::enable_if<!std::is_same<ukey_type, key_type>::value, DUMMY>::type* = 0){ + *this = Engine(k); + } +#endif + + // Forward the e(counter) to the CBRNG we are templated + // on, using the current value of the key. + ctr_type operator()(const ctr_type& c) const{ + return b(c, key); + } + + key_type getkey() const{ + return key; + } + + // N.B. setkey(k) is different from seed(k) because seed(k) zeros + // the counter (per the C++11 requirements for an Engine), whereas + // setkey does not. + void setkey(const key_type& k){ + key = k; + fix_invariant(); + } + + // Maybe the caller want's to know the details of + // the internal state, e.g., so it can call a different + // bijection with the same counter. + std::pair<ctr_type, result_type> getcounter() const { + return std::make_pair(c, v.back()); + } + + // And the inverse. + void setcounter(const ctr_type& _c, result_type _elem){ + static const size_t nelem = c.size(); + if( _elem >= nelem ) + throw std::range_error("Engine::setcounter called with elem out of range"); + c = _c; + v.back() = _elem; + fix_invariant(); + } + + void setcounter(const std::pair<ctr_type, result_type>& ce){ + setcounter(ce.first, ce.second); + } +}; +} // namespace r123 + +#endif diff --git a/include/Random123/conventional/gsl_cbrng.h b/include/Random123/conventional/gsl_cbrng.h @@ -0,0 +1,128 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __r123_compat_gslrng_dot_h__ +#define __r123_compat_gslrng_dot_h__ + +#include <gsl/gsl_rng.h> +#include <string.h> + +/** + The macro: GSL_CBRNG(NAME, CBRNGNAME) + declares the necessary structs and constants that define a + gsl_rng_NAME type based on the counter-based RNG CBRNGNAME. For example: + + Usage: + + @code + #include <Random123/threefry.h> + #include <Random123/conventional/gsl_cbrng.h> // this file + GSL_CBRNG(cbrng, threefry4x32); // creates gsl_rng_cbrng + + int main(int argc, char **argv){ + gsl_rng *r = gsl_rng_alloc(gsl_rng_cbrng); + ... use r as you would use any other gsl_rng ... + } + @endcode + + It requires that NAME be the name of a CBRNG that follows the + naming and stylistic conventions of the Random123 library. + + Note that wrapping a \ref CBRNG "counter-based PRNG" with a traditional API in + this way obscures much of the power of the CBRNG API. + Nevertheless, it may be of value to applications that are already + coded to work with GSL random number generators, and that wish + to use the RNGs in the Random123 library. + + */ + +#define GSL_CBRNG(NAME, CBRNGNAME) \ +const gsl_rng_type *gsl_rng_##NAME; \ + \ +typedef struct{ \ + CBRNGNAME##_ctr_t ctr; \ + CBRNGNAME##_ctr_t r; \ + CBRNGNAME##_key_t key; \ + int elem; \ +} NAME##_state; \ + \ +static unsigned long int NAME##_get(void *vstate){ \ + NAME##_state *st = (NAME##_state *)vstate; \ + const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]); \ + if( st->elem == 0 ){ \ + ++st->ctr.v[0]; \ + if( N>1 && st->ctr.v[0] == 0 ) ++st->ctr.v[1]; \ + if( N>2 && st->ctr.v[1] == 0 ) ++st->ctr.v[2]; \ + if( N>3 && st->ctr.v[2] == 0 ) ++st->ctr.v[3]; \ + st->r = CBRNGNAME(st->ctr, st->key); \ + st->elem = N; \ + } \ + return 0xffffffffUL & st->r.v[--st->elem]; \ +} \ + \ +static double \ +NAME##_get_double (void * vstate) \ +{ \ + return NAME##_get (vstate)/4294967296.0; \ +} \ + \ +static void NAME##_set(void *vstate, unsigned long int s){ \ + NAME##_state *st = (NAME##_state *)vstate; \ + st->elem = 0; \ + /* Assume that key and ctr have an array member, v, \ + as if they are r123arrayNxW. If not, this will fail \ + to compile. In particular, this macro fails to compile \ + when the underlying CBRNG requires use of keyinit */ \ + memset(&st->ctr.v[0], 0, sizeof(st->ctr.v)); \ + memset(&st->key.v[0], 0, sizeof(st->key.v)); \ + /* GSL 1.15 documentation says this about gsl_rng_set: \ + Note that the most generators only accept 32-bit seeds, with higher \ + values being reduced modulo 2^32. For generators with smaller \ + ranges the maximum seed value will typically be lower. \ + so we won't jump through any hoops here to deal with \ + high bits if sizeof(unsigned long) > sizeof(uint32_t). */ \ + st->key.v[0] = s; \ +} \ + \ +static const gsl_rng_type NAME##_type = { \ + #NAME, \ + 0xffffffffUL, \ + 0, \ + sizeof(NAME##_state), \ + &NAME##_set, \ + &NAME##_get, \ + &NAME##_get_double \ +}; \ + \ +const gsl_rng_type *gsl_rng_##NAME = &NAME##_type + +#endif + diff --git a/include/Random123/features/clangfeatures.h b/include/Random123/features/clangfeatures.h @@ -0,0 +1,93 @@ +/* +Copyright 2010-2016, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __clangfeatures_dot_hpp +#define __clangfeatures_dot_hpp + +#ifndef R123_USE_X86INTRIN_H +#if (defined(__x86_64__)||defined(__i386__)) +#define R123_USE_X86INTRIN_H 1 +#else +#define R123_USE_X86INTRIN_H 0 +#endif +#endif + +#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS +#define R123_USE_CXX11_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions) +#endif + +#ifndef R123_USE_CXX11_STATIC_ASSERT +#define R123_USE_CXX11_STATIC_ASSERT __has_feature(cxx_static_assert) +#endif + +// With clang-3.6, -Wall warns about unused-local-typedefs. +// The "obvious" thing to do is to ignore -Wunused-local-typedefs, +// but that doesn't work because earlier versions of clang blow +// up on an 'unknown warning group'. So we briefly ignore -Wall... +// It's tempting to just give up on static assertions in pre-c++11 code. +#if !R123_USE_CXX11_STATIC_ASSERT && !defined(R123_STATIC_ASSERT) +#define R123_STATIC_ASSERT(expr, msg) \ +_Pragma("clang diagnostic push") \ +_Pragma("clang diagnostic ignored \"-Wall\"") \ +typedef char static_assertion[(!!(expr))*2-1] \ +_Pragma("clang diagnostic pop") +#endif + +#ifndef R123_USE_CXX11_CONSTEXPR +#define R123_USE_CXX11_CONSTEXPR __has_feature(cxx_constexpr) +#endif + +#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS +#define R123_USE_CXX11_EXPLICIT_CONVERSIONS __has_feature(cxx_explicit_conversions) +#endif + +// With clang-3.0, the apparently simpler: +// #define R123_USE_CXX11_RANDOM __has_include(<random>) +// dumps core. +#ifndef R123_USE_CXX11_RANDOM +#if __cplusplus>=201103L && __has_include(<random>) +#define R123_USE_CXX11_RANDOM 1 +#else +#define R123_USE_CXX11_RANDOM 0 +#endif +#endif + +#ifndef R123_USE_CXX11_TYPE_TRAITS +#if __cplusplus>=201103L && __has_include(<type_traits>) +#define R123_USE_CXX11_TYPE_TRAITS 1 +#else +#define R123_USE_CXX11_TYPE_TRAITS 0 +#endif +#endif + +#include "gccfeatures.h" + +#endif diff --git a/include/Random123/features/compilerfeatures.h b/include/Random123/features/compilerfeatures.h @@ -0,0 +1,343 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/** + +@page porting Preprocessor symbols for porting Random123 to different platforms. + +The Random123 library is portable across C, C++, CUDA, OpenCL environments, +and multiple operating systems (Linux, Windows 7, Mac OS X, FreeBSD, Solaris). +This level of portability requires the abstraction of some features +and idioms that are either not standardized (e.g., asm statments), or for which +different vendors have their own standards (e.g., SSE intrinsics) or for +which vendors simply refuse to conform to well-established standards (e.g., <inttypes.h>). + +Random123/features/compilerfeatures.h +conditionally includes a compiler-or-OS-specific Random123/featires/XXXfeatures.h file which +defines appropriate values for the preprocessor symbols which can be used with +a specific compiler or OS. Those symbols will then +be used by other header files and source files in the Random123 +library (and may be used by applications) to control what actually +gets presented to the compiler. + +Most of the symbols are boolean valued. In general, they will +\b always be defined with value either 1 or 0, so do +\b NOT use \#ifdef. Use \#if R123_USE_SOMETHING instead. + +Library users can override any value by defining the pp-symbol with a compiler option, +e.g., + + cc -DR123_USE_MULHILO64_C99 + +will use a strictly c99 version of the full-width 64x64->128-bit multiplication +function, even if it would be disabled by default. + +All boolean-valued pre-processor symbols in Random123/features/compilerfeatures.h start with the prefix R123_USE_ +@verbatim + AES_NI + AES_OPENSSL + SSE4_2 + SSE4_1 + SSE + + STD_RANDOM + + GNU_UINT128 + ASM_GNU + ASM_MSASM + + CPUID_MSVC + + CXX11_RANDOM + CXX11_TYPE_TRAITS + CXX11_STATIC_ASSERT + CXX11_CONSTEXPR + CXX11_UNRESTRICTED_UNIONS + CXX11_EXPLICIT_CONVERSIONS + CXX11_LONG_LONG + CXX11_STD_ARRAY + CXX11 + + X86INTRIN_H + IA32INTRIN_H + XMMINTRIN_H + EMMINTRIN_H + SMMINTRIN_H + WMMINTRIN_H + INTRIN_H + + MULHILO32_ASM + MULHILO64_ASM + MULHILO64_MSVC_INTRIN + MULHILO64_CUDA_INTRIN + MULHILO64_OPENCL_INTRIN + MULHILO64_C99 + + U01_DOUBLE + +@endverbatim +Most have obvious meanings. Some non-obvious ones: + +AES_NI and AES_OPENSSL are not mutually exclusive. You can have one, +both or neither. + +GNU_UINT128 says that it's safe to use __uint128_t, but it +does not require its use. In particular, it should be +used in mulhilo<uint64_t> only if MULHILO64_ASM is unset. + +If the XXXINTRIN_H macros are true, then one should +@code +#include <xxxintrin.h> +@endcode +to gain accesss to compiler intrinsics. + +The CXX11_SOME_FEATURE macros allow the code to use specific +features of the C++11 language and library. The catchall +In the absence of a specific CXX11_SOME_FEATURE, the feature +is controlled by the catch-all R123_USE_CXX11 macro. + +U01_DOUBLE defaults on, and can be turned off (set to 0) +if one does not want the utility functions that convert to double +(i.e. u01_*_53()), e.g. on OpenCL without the cl_khr_fp64 extension. + +There are a number of invariants that are always true. Application code may +choose to rely on these: + +<ul> +<li>ASM_GNU and ASM_MASM are mutually exclusive +<li>The "higher" SSE values imply the lower ones. +</ul> + +There are also non-boolean valued symbols: + +<ul> +<li>R123_STATIC_INLINE - + According to both C99 and GNU99, the 'static inline' declaration allows + the compiler to not emit code if the function is not used. + Note that the semantics of 'inline', 'static' and 'extern' in + gcc have changed over time and are subject to modification by + command line options, e.g., -std=gnu89, -fgnu-inline. + Nevertheless, it appears that the meaning of 'static inline' + has not changed over time and (with a little luck) the use of 'static inline' + here will be portable between versions of gcc and to other C99 + compilers. + See: http://gcc.gnu.org/onlinedocs/gcc/Inline.html + http://www.greenend.org.uk/rjk/2003/03/inline.html + +<li>R123_FORCE_INLINE(decl) - + which expands to 'decl', adorned with the compiler-specific + embellishments to strongly encourage that the declared function be + inlined. If there is no such compiler-specific magic, it should + expand to decl, unadorned. + +<li>R123_CUDA_DEVICE - which expands to __device__ (or something else with + sufficiently similar semantics) when CUDA is in use, and expands + to nothing in other cases. + +<li>R123_METAL_THREAD_ADDRESS_SPACE - which expands to 'thread' (or + something else with sufficiently similar semantics) when compiling a + Metal kernel, and expands to nothing in other cases. + +<li>R123_ASSERT(x) - which expands to assert(x), or maybe to nothing at + all if we're in an environment so feature-poor that you can't even + call assert (I'm looking at you, CUDA and OpenCL), or even include + assert.h safely (OpenCL). + +<li>R123_STATIC_ASSERT(expr,msg) - which expands to + static_assert(expr,msg), or to an expression that + will raise a compile-time exception if expr is not true. + +<li>R123_ULONG_LONG - which expands to a declaration of the longest available + unsigned integer. + +<li>R123_64BIT(x) - expands to something equivalent to + UINT64_C(x) from <stdint.h>, even in environments where <stdint.h> + is not available, e.g., MSVC and OpenCL. + +<li>R123_BUILTIN_EXPECT(expr,likely_value) - expands to something with + the semantics of gcc's __builtin_expect(expr,likely_value). If + the environment has nothing like __builtin_expect, it should expand + to just expr. +</ul> + + +\cond HIDDEN_FROM_DOXYGEN +*/ + +/* +N.B. When something is added to the list of features, it should be +added to each of the *features.h files, AND to examples/ut_features.cpp. +*/ + +/* N.B. most other compilers (icc, nvcc, open64, llvm) will also define __GNUC__, so order matters. */ +#if defined(__METAL_MACOS__) +#include "metalfeatures.h" +#elif defined(__OPENCL_VERSION__) && __OPENCL_VERSION__ > 0 +#include "openclfeatures.h" +#elif defined(__CUDACC__) +#include "nvccfeatures.h" +#elif defined(__ICC) +#include "iccfeatures.h" +#elif defined(__xlC__) || defined(__ibmxl__) +#include "xlcfeatures.h" +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#include "sunprofeatures.h" +#elif defined(__OPEN64__) +#include "open64features.h" +#elif defined(__clang__) +#include "clangfeatures.h" +#elif defined(__GNUC__) +#include "gccfeatures.h" +#elif defined(__PGI) +#include "pgccfeatures.h" +#elif defined(_MSC_FULL_VER) +#include "msvcfeatures.h" +#else +#error "Can't identify compiler. You'll need to add a new xxfeatures.hpp" +{ /* maybe an unbalanced brace will terminate the compilation */ +#endif + +#ifndef R123_USE_CXX11 +#define R123_USE_CXX11 (__cplusplus >= 201103L) +#endif + +#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS +#define R123_USE_CXX11_UNRESTRICTED_UNIONS R123_USE_CXX11 +#endif + +#ifndef R123_USE_CXX11_STATIC_ASSERT +#define R123_USE_CXX11_STATIC_ASSERT R123_USE_CXX11 +#endif + +#ifndef R123_USE_CXX11_CONSTEXPR +#define R123_USE_CXX11_CONSTEXPR R123_USE_CXX11 +#endif + +#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS +#define R123_USE_CXX11_EXPLICIT_CONVERSIONS R123_USE_CXX11 +#endif + +#ifndef R123_USE_CXX11_RANDOM +#define R123_USE_CXX11_RANDOM R123_USE_CXX11 +#endif + +#ifndef R123_USE_CXX11_TYPE_TRAITS +#define R123_USE_CXX11_TYPE_TRAITS R123_USE_CXX11 +#endif + +#ifndef R123_USE_CXX11_LONG_LONG +#define R123_USE_CXX11_LONG_LONG R123_USE_CXX11 +#endif + +#ifndef R123_USE_CXX11_STD_ARRAY +#define R123_USE_CXX11_STD_ARRAY R123_USE_CXX11 +#endif + +#ifndef R123_USE_MULHILO64_C99 +#define R123_USE_MULHILO64_C99 0 +#endif + +#ifndef R123_USE_MULHILO64_MULHI_INTRIN +#define R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO32_MULHI_INTRIN +#define R123_USE_MULHILO32_MULHI_INTRIN 0 +#endif + +#ifndef R123_STATIC_ASSERT +#if R123_USE_CXX11_STATIC_ASSERT +#define R123_STATIC_ASSERT(expr, msg) static_assert(expr, msg) +#else + /* if msg always_looked_like_this, we could paste it into the name. Worth it? */ +#define R123_STATIC_ASSERT(expr, msg) typedef char static_assertion[(!!(expr))*2-1] +#endif +#endif + +#ifndef R123_CONSTEXPR +#if R123_USE_CXX11_CONSTEXPR +#define R123_CONSTEXPR constexpr +#else +#define R123_CONSTEXPR +#endif +#endif + +#ifndef R123_USE_64BIT +#define R123_USE_64BIT 1 +#endif + +#ifndef R123_USE_PHILOX_64BIT +#define R123_USE_PHILOX_64BIT (R123_USE_64BIT && (R123_USE_MULHILO64_ASM || R123_USE_MULHILO64_MSVC_INTRIN || R123_USE_MULHILO64_CUDA_INTRIN || R123_USE_GNU_UINT128 || R123_USE_MULHILO64_C99 || R123_USE_MULHILO64_OPENCL_INTRIN || R123_USE_MULHILO64_MULHI_INTRIN)) +#endif + +#ifndef R123_ULONG_LONG +#if defined(__cplusplus) && !R123_USE_CXX11_LONG_LONG +/* C++98 doesn't have long long. It doesn't have uint64_t either, but + we will have typedef'ed uint64_t to something in the xxxfeatures.h. + With luck, it won't elicit complaints from -pedantic. Cross your + fingers... */ +#define R123_ULONG_LONG uint64_t +#else +#define R123_ULONG_LONG unsigned long long +#endif +#endif + +/* UINT64_C should have been #defined by XXXfeatures.h, either by + #include <stdint.h> or through compiler-dependent hacks */ +#ifndef R123_64BIT +#define R123_64BIT(x) UINT64_C(x) +#endif + +#ifndef R123_THROW +#define R123_THROW(x) throw (x) +#endif + +#ifndef R123_METAL_THREAD_ADDRESS_SPACE +#define R123_METAL_THREAD_ADDRESS_SPACE +#endif + +#ifndef R123_METAL_CONSTANT_ADDRESS_SPACE +#define R123_METAL_CONSTANT_ADDRESS_SPACE +#endif + +/* + * Windows.h (and perhaps other "well-meaning" code define min and + * max, so there's a high chance that our definition of min, max + * methods or use of std::numeric_limits min and max will cause + * complaints in any program that happened to include Windows.h or + * suchlike first. We use the null macro below in our own header + * files definition or use of min, max to defensively preclude + * this problem. It may not be enough; one might need to #define + * NOMINMAX before including Windows.h or compile with -DNOMINMAX. + */ +#define R123_NO_MACRO_SUBST + +/** \endcond */ diff --git a/include/Random123/features/gccfeatures.h b/include/Random123/features/gccfeatures.h @@ -0,0 +1,285 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __gccfeatures_dot_hpp +#define __gccfeatures_dot_hpp + +#define R123_GNUC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) + +#if !defined(__x86_64__) && !defined(__i386__) && !defined(__powerpc__) && !defined(__arm__) && !defined(__aarch64__) && !defined(__s390x__) +# error "This code has only been tested on x86, powerpc and a few arm platforms." +#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task> +{ /* maybe an unbalanced brace will terminate the compilation */ + /* Feel free to try the Random123 library on other architectures by changing + the conditions that reach this error, but you should consider it a + porting exercise and expect to encounter bugs and deficiencies. + Please let the authors know of any successes (or failures). */ +#endif + +#if defined(__powerpc__) && !defined(__clang__) +#include <ppu_intrinsics.h> +#endif + +#ifndef R123_STATIC_INLINE +#define R123_STATIC_INLINE static __inline__ +#endif + +#ifndef R123_FORCE_INLINE +#if R123_GNUC_VERSION >= 40000 +#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#else +#define R123_FORCE_INLINE(decl) decl +#endif +#endif + +#ifndef R123_CUDA_DEVICE +#define R123_CUDA_DEVICE +#endif + +#ifndef R123_ASSERT +#include <assert.h> +#define R123_ASSERT(x) assert(x) +#endif + +#ifndef R123_BUILTIN_EXPECT +#define R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely) +#endif + +/* According to the C++0x standard, we should be able to test the numeric + value of __cplusplus == 199701L for C++98, __cplusplus == 201103L for C++11 + But gcc has had an open bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 + since early 2001, which was finally fixed in 4.7 (early 2012). For + earlier versions, the only way to detect whether --std=c++0x was requested + on the command line is to look at the __GCC_EXPERIMENTAL_CXX0X__ pp-symbol. +*/ +#if defined(__GCC_EXPERIMENTAL_CXX0X__) +#define GNU_CXX11 (__cplusplus>=201103L || (R123_GNUC_VERSION<40700 && 1/* defined(__GCC_EXPERIMENTAL_CXX0X__) */)) +#else +#define GNU_CXX11 (__cplusplus>=201103L || (R123_GNUC_VERSION<40700 && 0/* defined(__GCC_EXPERIMENTAL_CXX0X__) */)) +#endif + +#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS +#define R123_USE_CXX11_UNRESTRICTED_UNIONS ((R123_GNUC_VERSION >= 40600) && GNU_CXX11) +#endif + +#ifndef R123_USE_CXX11_STATIC_ASSERT +#define R123_USE_CXX11_STATIC_ASSERT ((R123_GNUC_VERSION >= 40300) && GNU_CXX11) +#endif + +#ifndef R123_USE_CXX11_CONSTEXPR +#define R123_USE_CXX11_CONSTEXPR ((R123_GNUC_VERSION >= 40600) && GNU_CXX11) +#endif + +#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS +#define R123_USE_CXX11_EXPLICIT_CONVERSIONS ((R123_GNUC_VERSION >= 40500) && GNU_CXX11) +#endif + +#ifndef R123_USE_CXX11_RANDOM +#define R123_USE_CXX11_RANDOM ((R123_GNUC_VERSION>=40500) && GNU_CXX11) +#endif + +#ifndef R123_USE_CXX11_TYPE_TRAITS +#define R123_USE_CXX11_TYPE_TRAITS ((R123_GNUC_VERSION>=40400) && GNU_CXX11) +#endif + +#ifndef R123_USE_AES_NI +#ifdef __AES__ +#define R123_USE_AES_NI 1 +#else +#define R123_USE_AES_NI 0 +#endif +#endif + +#ifndef R123_USE_SSE4_2 +#ifdef __SSE4_2__ +#define R123_USE_SSE4_2 1 +#else +#define R123_USE_SSE4_2 0 +#endif +#endif + +#ifndef R123_USE_SSE4_1 +#ifdef __SSE4_1__ +#define R123_USE_SSE4_1 1 +#else +#define R123_USE_SSE4_1 0 +#endif +#endif + +#ifndef R123_USE_SSE +/* There's no point in trying to compile SSE code in Random123 + unless SSE2 is available. */ +#ifdef __SSE2__ +#define R123_USE_SSE 1 +#else +#define R123_USE_SSE 0 +#endif +#endif + +#ifndef R123_USE_AES_OPENSSL +/* There isn't really a good way to tell at compile time whether + openssl is available. Without a pre-compilation configure-like + tool, it's less error-prone to guess that it isn't available. Add + -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define R123_USE_AES_OPENSSL 0 +#endif + +#ifndef R123_USE_GNU_UINT128 +#if defined(__x86_64__) || defined(__aarch64__) +#define R123_USE_GNU_UINT128 1 +#else +#define R123_USE_GNU_UINT128 0 +#endif +#endif + +#ifndef R123_USE_ASM_GNU +#if (defined(__x86_64__)||defined(__i386__)) +#define R123_USE_ASM_GNU 1 +#else +#define R123_USE_ASM_GNU 1 +#endif +#endif + +#ifndef R123_USE_CPUID_MSVC +#define R123_USE_CPUID_MSVC 0 +#endif + +#ifndef R123_USE_X86INTRIN_H +#if (defined(__x86_64__)||defined(__i386__)) +#define R123_USE_X86INTRIN_H (1/* (defined(__x86_64__)||defined(__i386__)) */ && R123_GNUC_VERSION >= 40402) +#else +#define R123_USE_X86INTRIN_H (0/* (defined(__x86_64__)||defined(__i386__)) */ && R123_GNUC_VERSION >= 40402) +#endif +#endif + +#ifndef R123_USE_IA32INTRIN_H +#define R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef R123_USE_XMMINTRIN_H +#define R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef R123_USE_EMMINTRIN_H +/* gcc -m64 on Solaris 10 defines __SSE2__ but doesn't have + emmintrin.h in the include search path. This is + so broken that I refuse to try to work around it. If this + affects you, figure out where your emmintrin.h lives and + add an appropriate -I to your CPPFLAGS. Or add -DR123_USE_SSE=0. */ +#define R123_USE_EMMINTRIN_H (R123_USE_SSE && (R123_GNUC_VERSION < 40402)) +#endif + +#ifndef R123_USE_SMMINTRIN_H +#define R123_USE_SMMINTRIN_H ((R123_USE_SSE4_1 || R123_USE_SSE4_2) && (R123_GNUC_VERSION < 40402)) +#endif + +#ifndef R123_USE_WMMINTRIN_H +#define R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef R123_USE_INTRIN_H +#define R123_USE_INTRIN_H 0 +#endif + +#ifndef R123_USE_MULHILO32_ASM +#define R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_MSVC_INTRIN +#define R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#define R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_OPENCL_INTRIN +#define R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_MULHI_INTRIN +#if (defined(__powerpc64__)) +#define R123_USE_MULHILO64_MULHI_INTRIN 1 +#else +#define R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif +#endif + +#ifndef R123_USE_MULHILO64_ASM +/* Shouldn't we use asm for mulhilo64 when the #ifdefs above haven't + chosen something else? Everything about the mulhilo64 + implementation is so fragile and difficult to test that I'm + reluctant to make this change without a compelling reason, but this + seems preferable to just turning off USE_MULHILO64_ASM. + +#define R123_USE_MULHILO64_ASM (R123_USE_ASM_GNU && (!R123_USE_GNU_UINT128) && (!R123_USE_MULHILO64_CUDA_INTRIN) && (!R123_USE_MULHILO64_MULHI_INTRIN) && (!R123_USE_MULHILO64_OPENCL_INTRIN) && (!R123_USE_MULHILO64_MSVC_INTRIN)) +*/ +#define R123_USE_MULHILO64_ASM 0 +#endif + +#if defined(__powerpc__) && defined(__clang__) +#ifdef __powerpc64__ +static inline unsigned long long __mulhdu(unsigned long long a, unsigned long long b) { + __uint128_t c = (__uint128_t) a * (__uint128_t) b; + return c >> 64; +} +#endif + +static inline unsigned int __mulhwu(unsigned int a, unsigned int b) { + unsigned long long c = (unsigned long long) a * (unsigned long long) b; + return c >> 32; +} +#endif + +#ifndef R123_MULHILO64_MULHI_INTRIN +#define R123_MULHILO64_MULHI_INTRIN __mulhdu +#endif + +#ifndef R123_USE_MULHILO32_MULHI_INTRIN +#define R123_USE_MULHILO32_MULHI_INTRIN 0 +#endif + +#ifndef R123_MULHILO32_MULHI_INTRIN +#define R123_MULHILO32_MULHI_INTRIN __mulhwu +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +/* If you add something, it must go in all the other XXfeatures.hpp + and in ../ut_features.cpp */ +#endif diff --git a/include/Random123/features/iccfeatures.h b/include/Random123/features/iccfeatures.h @@ -0,0 +1,212 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __icpcfeatures_dot_hpp +#define __icpcfeatures_dot_hpp + +// icc relies on gcc libraries and other toolchain components. +#define R123_GNUC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) + +#if !defined(__x86_64__) && !defined(__i386__) +# error "This code has only been tested on x86 platforms." +{ // maybe an unbalanced brace will terminate the compilation +// You are invited to try Easy123 on other architectures, by changing +// the conditions that reach this error, but you should consider it a +// porting exercise and expect to encounter bugs and deficiencies. +// Please let the authors know of any successes (or failures). +#endif + +#ifndef R123_STATIC_INLINE +#define R123_STATIC_INLINE static inline +#endif + +#ifndef R123_FORCE_INLINE +#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#endif + +#ifndef R123_CUDA_DEVICE +#define R123_CUDA_DEVICE +#endif + +#ifndef R123_ASSERT +#include <assert.h> +#define R123_ASSERT(x) assert(x) +#endif + +#ifndef R123_BUILTIN_EXPECT +#define R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely) +#endif + +// The basic idiom is: +// #ifndef R123_SOMETHING +// #if some condition +// #define R123_SOMETHING 1 +// #else +// #define R123_SOMETHING 0 +// #endif +// #endif +// This idiom allows an external user to override any decision +// in this file with a command-line -DR123_SOMETHING=1 or -DR123_SOMETHINE=0 + +// An alternative idiom is: +// #ifndef R123_SOMETHING +// #define R123_SOMETHING (some boolean expression) +// #endif +// where the boolean expression might contain previously-defined R123_SOMETHING_ELSE +// pp-symbols. + +#ifndef R123_USE_SSE4_2 +#ifdef __SSE4_2__ +#define R123_USE_SSE4_2 1 +#else +#define R123_USE_SSE4_2 0 +#endif +#endif + +#ifndef R123_USE_SSE4_1 +#ifdef __SSE4_1__ +#define R123_USE_SSE4_1 1 +#else +#define R123_USE_SSE4_1 0 +#endif +#endif + +#ifndef R123_USE_SSE +#ifdef __SSE2__ +#define R123_USE_SSE 1 +#else +#define R123_USE_SSE 0 +#endif +#endif + +#ifndef R123_USE_AES_NI +// Unlike gcc, icc (version 12) does not pre-define an __AES__ +// pp-symbol when -maes or -xHost is on the command line. This feels +// like a defect in icc (it defines __SSE4_2__ in analogous +// circumstances), but until Intel fixes it, we're better off erring +// on the side of caution and not generating instructions that are +// going to raise SIGILL when executed. To get the AES-NI +// instructions with icc, the caller must puts something like +// -DR123_USE_AES_NI=1 or -D__AES__ on the command line. FWIW, the +// AES-NI Whitepaper by Gueron says that icc has supported AES-NI from +// 11.1 onwards. +// +#if defined(__AES__) +#define R123_USE_AES_NI ((__ICC>=1101) && 1/*defined(__AES__)*/) +#else +#define R123_USE_AES_NI ((__ICC>=1101) && 0/*defined(__AES__)*/) +#endif +#endif + +#ifndef R123_USE_AES_OPENSSL +/* There isn't really a good way to tell at compile time whether + openssl is available. Without a pre-compilation configure-like + tool, it's less error-prone to guess that it isn't available. Add + -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define R123_USE_AES_OPENSSL 0 +#endif + +#ifndef R123_USE_GNU_UINT128 +#define R123_USE_GNU_UINT128 0 +#endif + +#ifndef R123_USE_ASM_GNU +#define R123_USE_ASM_GNU 1 +#endif + +#ifndef R123_USE_CPUID_MSVC +#define R123_USE_CPUID_MSVC 0 +#endif + +#ifndef R123_USE_X86INTRIN_H +#define R123_USE_X86INTRIN_H 0 +#endif + +#ifndef R123_USE_IA32INTRIN_H +#define R123_USE_IA32INTRIN_H 1 +#endif + +#ifndef R123_USE_XMMINTRIN_H +#define R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef R123_USE_EMMINTRIN_H +#define R123_USE_EMMINTRIN_H 1 +#endif + +#ifndef R123_USE_SMMINTRIN_H +#define R123_USE_SMMINTRIN_H 1 +#endif + +#ifndef R123_USE_WMMINTRIN_H +#define R123_USE_WMMINTRIN_H 1 +#endif + +#ifndef R123_USE_INTRIN_H +#define R123_USE_INTRIN_H 0 +#endif + +#ifndef R123_USE_MULHILO16_ASM +#define R123_USE_MULHILO16_ASM 0 +#endif + +#ifndef R123_USE_MULHILO32_ASM +#define R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_ASM +#define R123_USE_MULHILO64_ASM 1 +#endif + +#ifndef R123_USE_MULHILO64_MSVC_INTRIN +#define R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#define R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_OPENCL_INTRIN +#define R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +// If you add something, it must go in all the other XXfeatures.hpp +// and in ../ut_features.cpp +#endif diff --git a/include/Random123/features/metalfeatures.h b/include/Random123/features/metalfeatures.h @@ -0,0 +1,111 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Written by Tom Schoonjans <Tom.Schoonjans@me.com> + */ + +#ifndef __metalfeatures_dot_hpp +#define __metalfeatures_dot_hpp + +#ifndef R123_STATIC_INLINE +#define R123_STATIC_INLINE inline +#endif + +#ifndef R123_FORCE_INLINE +#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#endif + +#ifndef R123_CUDA_DEVICE +#define R123_CUDA_DEVICE +#endif + +#ifndef R123_METAL_THREAD_ADDRESS_SPACE +#define R123_METAL_THREAD_ADDRESS_SPACE thread +#endif + +#ifndef R123_METAL_CONSTANT_ADDRESS_SPACE +#define R123_METAL_CONSTANT_ADDRESS_SPACE constant +#endif + +#ifndef R123_ASSERT +#define R123_ASSERT(x) +#endif + +#ifndef R123_BUILTIN_EXPECT +#define R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +#ifndef R123_USE_GNU_UINT128 +#define R123_USE_GNU_UINT128 0 +#endif + +#ifndef R123_USE_MULHILO64_ASM +#define R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_MSVC_INTRIN +#define R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#define R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_OPENCL_INTRIN +#define R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO32_MULHI_INTRIN +#define R123_USE_MULHILO32_MULHI_INTRIN 1 +#endif + +#if R123_USE_MULHILO32_MULHI_INTRIN +#include <metal_integer> +#define R123_MULHILO32_MULHI_INTRIN metal::mulhi +#endif + +#ifndef R123_USE_AES_NI +#define R123_USE_AES_NI 0 +#endif + +#ifndef R123_USE_64BIT +#define R123_USE_64BIT 0 /* Metal currently (Feb 2019, Specification-2) does not support 64-bit variable types */ +#endif + +#ifndef R123_ULONG_LONG +/* the longest integer type in Metal (Feb 2019, Specification-2) is a + * 32-bit unsigned int. Let's hope for the best... */ +#define R123_ULONG_LONG unsigned int +#endif + +#endif diff --git a/include/Random123/features/msvcfeatures.h b/include/Random123/features/msvcfeatures.h @@ -0,0 +1,200 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __msvcfeatures_dot_hpp +#define __msvcfeatures_dot_hpp + +//#if _MSVC_FULL_VER <= 15 +//#error "We've only tested MSVC_FULL_VER==15." +//#endif + +#if !defined(_M_IX86) && !defined(_M_X64) +# error "This code has only been tested on x86 platforms." +{ // maybe an unbalanced brace will terminate the compilation +// You are invited to try Random123 on other architectures, by changing +// the conditions that reach this error, but you should consider it a +// porting exercise and expect to encounter bugs and deficiencies. +// Please let the authors know of any successes (or failures). +#endif + +#ifndef R123_STATIC_INLINE +#define R123_STATIC_INLINE static __inline +#endif + +#ifndef R123_FORCE_INLINE +#define R123_FORCE_INLINE(decl) _forceinline decl +#endif + +#ifndef R123_CUDA_DEVICE +#define R123_CUDA_DEVICE +#endif + +#ifndef R123_ASSERT +#include <assert.h> +#define R123_ASSERT(x) assert(x) +#endif + +#ifndef R123_BUILTIN_EXPECT +#define R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +// The basic idiom is: +// #ifndef R123_SOMETHING +// #if some condition +// #define R123_SOMETHING 1 +// #else +// #define R123_SOMETHING 0 +// #endif +// #endif +// This idiom allows an external user to override any decision +// in this file with a command-line -DR123_SOMETHING=1 or -DR123_SOMETHINE=0 + +// An alternative idiom is: +// #ifndef R123_SOMETHING +// #define R123_SOMETHING (some boolean expression) +// #endif +// where the boolean expression might contain previously-defined R123_SOMETHING_ELSE +// pp-symbols. + +#ifndef R123_USE_AES_NI +#if defined(_M_X64) +#define R123_USE_AES_NI 1 +#else +#define R123_USE_AES_NI 0 +#endif +#endif + +#ifndef R123_USE_SSE4_2 +#if defined(_M_X64) || _MSC_VER > 1899 +#define R123_USE_SSE4_2 1 +#else +#define R123_USE_SSE4_2 0 +#endif +#endif + +#ifndef R123_USE_SSE4_1 +#if defined(_M_X64) || _MSC_VER > 1899 +#define R123_USE_SSE4_1 1 +#else +#define R123_USE_SSE4_1 0 +#endif +#endif + +#ifndef R123_USE_SSE +#define R123_USE_SSE 1 +#endif + +#ifndef R123_USE_AES_OPENSSL +#define R123_USE_AES_OPENSSL 0 +#endif + +#ifndef R123_USE_GNU_UINT128 +#define R123_USE_GNU_UINT128 0 +#endif + +#ifndef R123_USE_ASM_GNU +#define R123_USE_ASM_GNU 0 +#endif + +#ifndef R123_USE_CPUID_MSVC +#define R123_USE_CPUID_MSVC 1 +#endif + +#ifndef R123_USE_X86INTRIN_H +#define R123_USE_X86INTRIN_H 0 +#endif + +#ifndef R123_USE_IA32INTRIN_H +#define R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef R123_USE_XMMINTRIN_H +#define R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef R123_USE_EMMINTRIN_H +#define R123_USE_EMMINTRIN_H 1 +#endif + +#ifndef R123_USE_SMMINTRIN_H +#define R123_USE_SMMINTRIN_H 1 +#endif + +#ifndef R123_USE_WMMINTRIN_H +#define R123_USE_WMMINTRIN_H 1 +#endif + +#ifndef R123_USE_INTRIN_H +#define R123_USE_INTRIN_H 1 +#endif + +#ifndef R123_USE_MULHILO16_ASM +#define R123_USE_MULHILO16_ASM 0 +#endif + +#ifndef R123_USE_MULHILO32_ASM +#define R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_ASM +#define R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_MSVC_INTRIN +#if defined(_M_X64) +#define R123_USE_MULHILO64_MSVC_INTRIN 1 +#else +#define R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#define R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_OPENCL_INTRIN +#define R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +#pragma warning(disable:4244) +#pragma warning(disable:4996) + +// If you add something, it must go in all the other XXfeatures.hpp +// and in ../ut_features.cpp +#endif diff --git a/include/Random123/features/nvccfeatures.h b/include/Random123/features/nvccfeatures.h @@ -0,0 +1,129 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __r123_nvcc_features_dot_h__ +#define __r123_nvcc_features_dot_h__ + +#if !defined(CUDART_VERSION) +#error "why are we in nvccfeatures.h if CUDART_VERSION is not defined" +#endif + +#if CUDART_VERSION < 4010 +#error "CUDA versions earlier than 4.1 produce incorrect results for some templated functions in namespaces. Random123 isunsupported. See comments in nvccfeatures.h" +// This test was added in Random123-1.08 (August, 2013) because we +// discovered that Ftype(maxTvalue<T>()) with Ftype=double and +// T=uint64_t in examples/uniform.hpp produces -1 for CUDA4.0 and +// earlier. We can't be sure this bug doesn't also affect invocations +// of other templated functions, e.g., essentially all of Random123. +// Thus, we no longer trust CUDA versions earlier than 4.1 even though +// we had previously tested and timed Random123 with CUDA 3.x and 4.0. +// If you feel lucky or desperate, you can change #error to #warning, but +// please take extra care to be sure that you are getting correct +// results. +#endif + +// nvcc falls through to gcc or msvc. So first define +// a couple of things and then include either gccfeatures.h +// or msvcfeatures.h + +//#ifdef __CUDA_ARCH__ allows Philox32 and Philox64 to be compiled +//for both device and host functions in CUDA by setting compiler flags +//for the device function +#ifdef __CUDA_ARCH__ +#ifndef R123_CUDA_DEVICE +#define R123_CUDA_DEVICE __device__ +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#define R123_USE_MULHILO64_CUDA_INTRIN 1 +#endif + +#ifndef R123_THROW +// No exceptions in CUDA, at least upto 4.0 +#define R123_THROW(x) R123_ASSERT(0) +#endif + +#ifndef R123_ASSERT +#define R123_ASSERT(x) if((x)) ; else asm("trap;") +#endif + +#ifndef R123_BUILTIN_EXPECT +#define R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +#ifndef R123_USE_AES_NI +#define R123_USE_AES_NI 0 +#endif + +#ifndef R123_USE_SSE4_2 +#define R123_USE_SSE4_2 0 +#endif + +#ifndef R123_USE_SSE4_1 +#define R123_USE_SSE4_1 0 +#endif + +#ifndef R123_USE_SSE +#define R123_USE_SSE 0 +#endif + +#ifndef R123_USE_GNU_UINT128 +#define R123_USE_GNU_UINT128 0 +#endif + +#ifndef R123_ULONG_LONG +// uint64_t, which is what we'd get without this, is +// not the same as unsigned long long +#define R123_ULONG_LONG unsigned long long +#endif + +#else // ! __CUDA_ARCH__ + +// If we're using nvcc, but not compiling for the CUDA architecture, +// then we must be compiling for the host. But host-compilation might +// use gcc, msvc, or xlc. This #else/#endif used to be higher up, +// mistakenly turning off all kinds of things the host that are really +// problematic only in device code. It's not clear that we need to do +// anything special for host-code that we wouldn't otherwise do in +// xlcfeatures, gccfeatures or msvcfeatures. But if we do, this is +// the place to do it. + +#endif // __CUDA_ARCH__ + +#if defined(__xlC__) || defined(__ibmxl__) +#include "xlcfeatures.h" +#elif defined(__GNUC__) +#include "gccfeatures.h" +#elif defined(_MSC_FULL_VER) +#include "msvcfeatures.h" +#endif + +#endif diff --git a/include/Random123/features/open64features.h b/include/Random123/features/open64features.h @@ -0,0 +1,50 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __open64features_dot_hpp +#define __open64features_dot_hpp + +/* The gcc features are mostly right. We just override a few and then include gccfeatures.h */ + +/* Open64 4.2.3 and 4.2.4 accept the __uint128_t code without complaint + but produce incorrect code for 64-bit philox. The MULHILO64_ASM + seems to work fine */ +#ifndef R123_USE_GNU_UINT128 +#define R123_USE_GNU_UINT128 0 +#endif + +#ifndef R123_USE_MULHILO64_ASM +#define R123_USE_MULHILO64_ASM 1 +#endif + +#include "gccfeatures.h" + +#endif diff --git a/include/Random123/features/openclfeatures.h b/include/Random123/features/openclfeatures.h @@ -0,0 +1,89 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __openclfeatures_dot_hpp +#define __openclfeatures_dot_hpp + +#ifndef R123_STATIC_INLINE +#define R123_STATIC_INLINE inline +#endif + +#ifndef R123_FORCE_INLINE +#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#endif + +#ifndef R123_CUDA_DEVICE +#define R123_CUDA_DEVICE +#endif + +#ifndef R123_ASSERT +#define R123_ASSERT(x) +#endif + +#ifndef R123_BUILTIN_EXPECT +#define R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +#ifndef R123_USE_GNU_UINT128 +#define R123_USE_GNU_UINT128 0 +#endif + +#ifndef R123_USE_MULHILO64_ASM +#define R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_MSVC_INTRIN +#define R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#define R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_OPENCL_INTRIN +#define R123_USE_MULHILO64_OPENCL_INTRIN 1 +#endif + +#ifndef R123_USE_AES_NI +#define R123_USE_AES_NI 0 +#endif + +// XXX ATI APP SDK 2.4 clBuildProgram SEGVs if one uses uint64_t instead of +// ulong to mul_hi. And gets lots of complaints from stdint.h +// on some machines. +// But these typedefs mean we cannot include stdint.h with +// these headers? Do we need R123_64T, R123_32T, R123_8T? +typedef ulong uint64_t; +typedef uint uint32_t; +typedef uchar uint8_t; +#define UINT64_C(x) ((ulong)(x##UL)) + +#endif diff --git a/include/Random123/features/pgccfeatures.h b/include/Random123/features/pgccfeatures.h @@ -0,0 +1,195 @@ +/* This derivative file contributed via email by Gabriel Rockefeller on 8/5/2013 */ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright (c) 2013, Los Alamos National Security, LLC +All rights reserved. + +Copyright 2013. Los Alamos National Security, LLC. This software was produced +under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National +Laboratory (LANL), which is operated by Los Alamos National Security, LLC for +the U.S. Department of Energy. The U.S. Government has rights to use, +reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR LOS +ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR +ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified +to produce derivative works, such modified software should be clearly marked, +so as not to confuse it with the version available from LANL. +*/ +#ifndef __pgccfeatures_dot_hpp +#define __pgccfeatures_dot_hpp + +#if !defined(__x86_64__) && !defined(__i386__) +# error "This code has only been tested on x86 platforms." +#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task> +{ /* maybe an unbalanced brace will terminate the compilation */ + /* Feel free to try the Random123 library on other architectures by changing + the conditions that reach this error, but you should consider it a + porting exercise and expect to encounter bugs and deficiencies. + Please let the authors know of any successes (or failures). */ +#endif + +#ifndef R123_STATIC_INLINE +#define R123_STATIC_INLINE static inline +#endif + +/* Found this example in PGI's emmintrin.h. */ +#ifndef R123_FORCE_INLINE +#define R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__)) +#endif + +#ifndef R123_CUDA_DEVICE +#define R123_CUDA_DEVICE +#endif + +#ifndef R123_ASSERT +#include <assert.h> +#define R123_ASSERT(x) assert(x) +#endif + +#ifndef R123_BUILTIN_EXPECT +#define R123_BUILTIN_EXPECT(expr,likely) (expr) +#endif + +/* PGI through 13.2 doesn't appear to support AES-NI. */ +#ifndef R123_USE_AES_NI +#define R123_USE_AES_NI 0 +#endif + +/* PGI through 13.2 appears to support MMX, SSE, SSE3, SSE3, SSSE3, SSE4a, and + ABM, but not SSE4.1 or SSE4.2. */ +#ifndef R123_USE_SSE4_2 +#define R123_USE_SSE4_2 0 +#endif + +#ifndef R123_USE_SSE4_1 +#define R123_USE_SSE4_1 0 +#endif + +#ifndef R123_USE_SSE +/* There's no point in trying to compile SSE code in Random123 + unless SSE2 is available. */ +#ifdef __SSE2__ +#define R123_USE_SSE 1 +#else +#define R123_USE_SSE 0 +#endif +#endif + +#ifndef R123_USE_AES_OPENSSL +/* There isn't really a good way to tell at compile time whether + openssl is available. Without a pre-compilation configure-like + tool, it's less error-prone to guess that it isn't available. Add + -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define R123_USE_AES_OPENSSL 0 +#endif + +#ifndef R123_USE_GNU_UINT128 +#define R123_USE_GNU_UINT128 0 +#endif + +#ifndef R123_USE_ASM_GNU +#define R123_USE_ASM_GNU 1 +#endif + +#ifndef R123_USE_CPUID_MSVC +#define R123_USE_CPUID_MSVC 0 +#endif + +#ifndef R123_USE_X86INTRIN_H +#define R123_USE_X86INTRIN_H 0 +#endif + +#ifndef R123_USE_IA32INTRIN_H +#define R123_USE_IA32INTRIN_H 0 +#endif + +/* emmintrin.h from PGI #includes xmmintrin.h but then complains at link time + about undefined references to _mm_castsi128_ps(__m128i). Why? */ +#ifndef R123_USE_XMMINTRIN_H +#define R123_USE_XMMINTRIN_H 1 +#endif + +#ifndef R123_USE_EMMINTRIN_H +#define R123_USE_EMMINTRIN_H 1 +#endif + +#ifndef R123_USE_SMMINTRIN_H +#define R123_USE_SMMINTRIN_H 0 +#endif + +#ifndef R123_USE_WMMINTRIN_H +#define R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef R123_USE_INTRIN_H +#ifdef __ABM__ +#define R123_USE_INTRIN_H 1 +#else +#define R123_USE_INTRIN_H 0 +#endif +#endif + +#ifndef R123_USE_MULHILO32_ASM +#define R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_MULHI_INTRIN +#define R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_ASM +#define R123_USE_MULHILO64_ASM 1 +#endif + +#ifndef R123_USE_MULHILO64_MSVC_INTRIN +#define R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#define R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_OPENCL_INTRIN +#define R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +/* If you add something, it must go in all the other XXfeatures.hpp + and in ../ut_features.cpp */ +#endif diff --git a/include/Random123/features/sse.h b/include/Random123/features/sse.h @@ -0,0 +1,280 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _Random123_sse_dot_h__ +#define _Random123_sse_dot_h__ + +#if R123_USE_SSE + +#if R123_USE_X86INTRIN_H +#include <x86intrin.h> +#endif +#if R123_USE_IA32INTRIN_H +#include <ia32intrin.h> +#endif +#if R123_USE_XMMINTRIN_H +#include <xmmintrin.h> +#endif +#if R123_USE_EMMINTRIN_H +#include <emmintrin.h> +#endif +#if R123_USE_SMMINTRIN_H +#include <smmintrin.h> +#endif +#if R123_USE_WMMINTRIN_H +#include <wmmintrin.h> +#endif +#if R123_USE_INTRIN_H +#include <intrin.h> +#endif +#ifdef __cplusplus +#include <iostream> +#include <limits> +#include <stdexcept> +#endif + +#if R123_USE_ASM_GNU + +/* bit25 of CX tells us whether AES is enabled. */ +R123_STATIC_INLINE int haveAESNI(){ + unsigned int eax, ebx, ecx, edx; + __asm__ __volatile__ ("cpuid": "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : + "a" (1)); + return (ecx>>25) & 1; +} +#elif R123_USE_CPUID_MSVC +R123_STATIC_INLINE int haveAESNI(){ + int CPUInfo[4]; + __cpuid(CPUInfo, 1); + return (CPUInfo[2]>>25)&1; +} +#else /* R123_USE_CPUID_??? */ +#warning "No R123_USE_CPUID_XXX method chosen. haveAESNI will always return false" +R123_STATIC_INLINE int haveAESNI(){ + return 0; +} +#endif /* R123_USE_ASM_GNU || R123_USE_CPUID_MSVC */ + +// There is a lot of annoying and inexplicable variation in the +// SSE intrinsics available in different compilation environments. +// The details seem to depend on the compiler, the version and +// the target architecture. Rather than insisting on +// R123_USE_feature tests for each of these in each of the +// compilerfeatures.h files we just keep the complexity localized +// to here... +#if (defined(__ICC) && __ICC<1210) || (defined(_MSC_VER) && !defined(_WIN64) && _MSC_VER < 1900) +/* Is there an intrinsic to assemble an __m128i from two 64-bit words? + If not, use the 4x32-bit intrisic instead. N.B. It looks like Intel + added _mm_set_epi64x to icc version 12.1 in Jan 2012. +*/ +R123_STATIC_INLINE __m128i _mm_set_epi64x(uint64_t v1, uint64_t v0){ + union{ + uint64_t u64; + uint32_t u32[2]; + } u1, u0; + u1.u64 = v1; + u0.u64 = v0; + return _mm_set_epi32(u1.u32[1], u1.u32[0], u0.u32[1], u0.u32[0]); +} +#endif +/* _mm_extract_lo64 abstracts the task of extracting the low 64-bit + word from an __m128i. The _mm_cvtsi128_si64 intrinsic does the job + on 64-bit platforms. Unfortunately, both MSVC and Open64 fail + assertions in ut_M128.cpp and ut_carray.cpp when we use the + _mm_cvtsi128_si64 intrinsic. (See + https://bugs.open64.net/show_bug.cgi?id=873 for the Open64 bug). + On 32-bit platforms, there's no MOVQ, so there's no intrinsic. + Finally, even if the intrinsic exists, it may be spelled with or + without the 'x'. +*/ +#if !defined(__x86_64__) || defined(_MSC_VER) || defined(__OPEN64__) +R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){ + union{ + uint64_t u64[2]; + __m128i m; + }u; + _mm_store_si128(&u.m, si); + return u.u64[0]; +} +#elif defined(__llvm__) || defined(__ICC) +R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){ + return (uint64_t)_mm_cvtsi128_si64(si); +} +#else /* GNUC, others */ +/* FWIW, gcc's emmintrin.h has had the 'x' spelling + since at least gcc-3.4.4. The no-'x' spelling showed up + around 4.2. */ +R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){ + return (uint64_t)_mm_cvtsi128_si64x(si); +} +#endif +#if defined(__GNUC__) && __GNUC__ < 4 +/* the cast builtins showed up in gcc4. */ +R123_STATIC_INLINE __m128 _mm_castsi128_ps(__m128i si){ + return (__m128)si; +} +#endif + +#ifdef __cplusplus + +struct r123m128i{ + __m128i m; +#if R123_USE_CXX11_UNRESTRICTED_UNIONS + // C++98 forbids a union member from having *any* constructors. + // C++11 relaxes this, and allows union members to have constructors + // as long as there is a "trivial" default construtor. So in C++11 + // we can provide a r123m128i constructor with an __m128i argument, and still + // have the default (and hence trivial) default constructor. + r123m128i() = default; + r123m128i(__m128i _m): m(_m){} +#endif + r123m128i& operator=(const __m128i& rhs){ m=rhs; return *this;} + r123m128i& operator=(R123_ULONG_LONG n){ m = _mm_set_epi64x(0, n); return *this;} +#if R123_USE_CXX11_EXPLICIT_CONVERSIONS + // With C++11 we can attach explicit to the bool conversion operator + // to disambiguate undesired promotions. For g++, this works + // only in 4.5 and above. + explicit operator bool() const {return _bool();} +#else + // Pre-C++11, we have to do something else. Google for the "safe bool" + // idiom for other ideas... + operator const void*() const{return _bool()?this:0;} +#endif + operator __m128i() const {return m;} + +private: +#if R123_USE_SSE4_1 + bool _bool() const{ return !_mm_testz_si128(m,m); } +#else + bool _bool() const{ return 0xf != _mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(m, _mm_setzero_si128()))); } +#endif +}; + +R123_STATIC_INLINE r123m128i& operator++(r123m128i& v){ + __m128i& c = v.m; + __m128i zeroone = _mm_set_epi64x(R123_64BIT(0), R123_64BIT(1)); + c = _mm_add_epi64(c, zeroone); + //return c; +#if R123_USE_SSE4_1 + __m128i zerofff = _mm_set_epi64x(0, ~(R123_64BIT(0))); + if( R123_BUILTIN_EXPECT(_mm_testz_si128(c,zerofff), 0) ){ + __m128i onezero = _mm_set_epi64x(R123_64BIT(1), R123_64BIT(0)); + c = _mm_add_epi64(c, onezero); + } +#else + unsigned mask = _mm_movemask_ps( _mm_castsi128_ps(_mm_cmpeq_epi32(c, _mm_setzero_si128()))); + // The low two bits of mask are 11 iff the low 64 bits of + // c are zero. + if( R123_BUILTIN_EXPECT((mask&0x3) == 0x3, 0) ){ + __m128i onezero = _mm_set_epi64x(1,0); + c = _mm_add_epi64(c, onezero); + } +#endif + return v; +} + +R123_STATIC_INLINE r123m128i& operator+=(r123m128i& lhs, R123_ULONG_LONG n){ + __m128i c = lhs.m; + __m128i incr128 = _mm_set_epi64x(0, n); + c = _mm_add_epi64(c, incr128); + // return c; // NO CARRY! + + int64_t lo64 = _mm_extract_lo64(c); + if((uint64_t)lo64 < n) + c = _mm_add_epi64(c, _mm_set_epi64x(R123_64BIT(1),R123_64BIT(0))); + lhs.m = c; + return lhs; +} + +// We need this one because it's present, but never used in r123array1xm128i::incr +R123_STATIC_INLINE bool operator<=(R123_ULONG_LONG, const r123m128i &){ + throw std::runtime_error("operator<=(unsigned long long, r123m128i) is unimplemented.");} + +// The comparisons aren't implemented, but if we leave them out, and +// somebody writes, e.g., M1 < M2, the compiler will do an implicit +// conversion through void*. Sigh... +R123_STATIC_INLINE bool operator<(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator<(r123m128i, r123m128i) is unimplemented.");} +R123_STATIC_INLINE bool operator<=(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator<=(r123m128i, r123m128i) is unimplemented.");} +R123_STATIC_INLINE bool operator>(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator>(r123m128i, r123m128i) is unimplemented.");} +R123_STATIC_INLINE bool operator>=(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator>=(r123m128i, r123m128i) is unimplemented.");} + +R123_STATIC_INLINE bool operator==(const r123m128i &lhs, const r123m128i &rhs){ + return 0xf==_mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(lhs, rhs))); } +R123_STATIC_INLINE bool operator!=(const r123m128i &lhs, const r123m128i &rhs){ + return !(lhs==rhs);} +R123_STATIC_INLINE bool operator==(R123_ULONG_LONG lhs, const r123m128i &rhs){ + r123m128i LHS; LHS.m=_mm_set_epi64x(0, lhs); return LHS == rhs; } +R123_STATIC_INLINE bool operator!=(R123_ULONG_LONG lhs, const r123m128i &rhs){ + return !(lhs==rhs);} +R123_STATIC_INLINE std::ostream& operator<<(std::ostream& os, const r123m128i& m){ + union{ + uint64_t u64[2]; + __m128i m; + }u; + _mm_storeu_si128(&u.m, m.m); + return os << u.u64[0] << " " << u.u64[1]; +} + +R123_STATIC_INLINE std::istream& operator>>(std::istream& is, r123m128i& m){ + uint64_t u64[2]; + is >> u64[0] >> u64[1]; + m.m = _mm_set_epi64x(u64[1], u64[0]); + return is; +} + +template<typename T> inline T assemble_from_u32(uint32_t *p32); // forward declaration + +template <> +inline r123m128i assemble_from_u32<r123m128i>(uint32_t *p32){ + r123m128i ret; + ret.m = _mm_set_epi32(p32[3], p32[2], p32[1], p32[0]); + return ret; +} + +#else + +typedef struct { + __m128i m; +} r123m128i; + +#endif /* __cplusplus */ + +#else /* !R123_USE_SSE */ +R123_STATIC_INLINE int haveAESNI(){ + return 0; +} +#endif /* R123_USE_SSE */ + +#endif /* _Random123_sse_dot_h__ */ diff --git a/include/Random123/features/sunprofeatures.h b/include/Random123/features/sunprofeatures.h @@ -0,0 +1,172 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __sunprofeatures_dot_hpp +#define __sunprofeatures_dot_hpp + +#ifndef R123_STATIC_INLINE +#define R123_STATIC_INLINE static inline +#endif + +#ifndef R123_FORCE_INLINE +#define R123_FORCE_INLINE(decl) decl +#endif + +#ifndef R123_CUDA_DEVICE +#define R123_CUDA_DEVICE +#endif + +#ifndef R123_ASSERT +#include <assert.h> +#define R123_ASSERT(x) assert(x) +#endif + +#ifndef R123_BUILTIN_EXPECT +#define R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +// The basic idiom is: +// #ifndef R123_SOMETHING +// #if some condition +// #define R123_SOMETHING 1 +// #else +// #define R123_SOMETHING 0 +// #endif +// #endif +// This idiom allows an external user to override any decision +// in this file with a command-line -DR123_SOMETHING=1 or -DR123_SOMETHINE=0 + +// An alternative idiom is: +// #ifndef R123_SOMETHING +// #define R123_SOMETHING (some boolean expression) +// #endif +// where the boolean expression might contain previously-defined R123_SOMETHING_ELSE +// pp-symbols. + +#ifndef R123_USE_AES_NI +#define R123_USE_AES_NI 0 +#endif + +#ifndef R123_USE_SSE4_2 +#define R123_USE_SSE4_2 0 +#endif + +#ifndef R123_USE_SSE4_1 +#define R123_USE_SSE4_1 0 +#endif + +#ifndef R123_USE_SSE +#define R123_USE_SSE 0 +#endif + +#ifndef R123_USE_AES_OPENSSL +#define R123_USE_AES_OPENSSL 0 +#endif + +#ifndef R123_USE_GNU_UINT128 +#define R123_USE_GNU_UINT128 0 +#endif + +#ifndef R123_USE_ASM_GNU +#define R123_USE_ASM_GNU 0 +#endif + +#ifndef R123_USE_CPUID_MSVC +#define R123_USE_CPUID_MSVC 0 +#endif + +#ifndef R123_USE_X86INTRIN_H +#define R123_USE_X86INTRIN_H 0 +#endif + +#ifndef R123_USE_IA32INTRIN_H +#define R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef R123_USE_XMMINTRIN_H +#define R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef R123_USE_EMMINTRIN_H +#define R123_USE_EMMINTRIN_H 0 +#endif + +#ifndef R123_USE_SMMINTRIN_H +#define R123_USE_SMMINTRIN_H 0 +#endif + +#ifndef R123_USE_WMMINTRIN_H +#define R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef R123_USE_INTRIN_H +#define R123_USE_INTRIN_H 0 +#endif + +#ifndef R123_USE_MULHILO16_ASM +#define R123_USE_MULHILO16_ASM 0 +#endif + +#ifndef R123_USE_MULHILO32_ASM +#define R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_ASM +#define R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_MSVC_INTRIN +#define R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#define R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_OPENCL_INTRIN +#define R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef R123_USE_PHILOX_64BIT +#define R123_USE_PHILOX_64BIT 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +// If you add something, it must go in all the other XXfeatures.hpp +// and in ../ut_features.cpp +#endif diff --git a/include/Random123/features/xlcfeatures.h b/include/Random123/features/xlcfeatures.h @@ -0,0 +1,211 @@ +/* This derivative file contributed via email by Gabriel Rockefeller on 8/5/2013 */ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright (c) 2013, Los Alamos National Security, LLC +All rights reserved. + +Copyright 2013. Los Alamos National Security, LLC. This software was produced +under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National +Laboratory (LANL), which is operated by Los Alamos National Security, LLC for +the U.S. Department of Energy. The U.S. Government has rights to use, +reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR LOS +ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR +ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified +to produce derivative works, such modified software should be clearly marked, +so as not to confuse it with the version available from LANL. +*/ +#ifndef __xlcfeatures_dot_hpp +#define __xlcfeatures_dot_hpp + +#if !defined(__x86_64__) && !defined(__i386__) && !defined(__powerpc__) +# error "This code has only been tested on x86 and PowerPC platforms." +#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task> +{ /* maybe an unbalanced brace will terminate the compilation */ + /* Feel free to try the Random123 library on other architectures by changing + the conditions that reach this error, but you should consider it a + porting exercise and expect to encounter bugs and deficiencies. + Please let the authors know of any successes (or failures). */ +#endif + +#ifdef __cplusplus +/* builtins are automatically available to xlc. To use them with xlc++, + one must include builtins.h. c.f + http://publib.boulder.ibm.com/infocenter/cellcomp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.cell.doc/compiler_ref/compiler_builtins.html +*/ +#include <builtins.h> +#endif + +#ifndef R123_STATIC_INLINE +#define R123_STATIC_INLINE static inline +#endif + +#ifndef R123_FORCE_INLINE +#define R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__)) +#endif + +#ifndef R123_CUDA_DEVICE +#define R123_CUDA_DEVICE +#endif + +#ifndef R123_ASSERT +#include <assert.h> +#define R123_ASSERT(x) assert(x) +#endif + +#ifndef R123_BUILTIN_EXPECT +#define R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely) +#endif + +#ifndef R123_USE_AES_NI +#define R123_USE_AES_NI 0 +#endif + +#ifndef R123_USE_SSE4_2 +#define R123_USE_SSE4_2 0 +#endif + +#ifndef R123_USE_SSE4_1 +#define R123_USE_SSE4_1 0 +#endif + +#ifndef R123_USE_SSE +#define R123_USE_SSE 0 +#endif + +#ifndef R123_USE_AES_OPENSSL +/* There isn't really a good way to tell at compile time whether + openssl is available. Without a pre-compilation configure-like + tool, it's less error-prone to guess that it isn't available. Add + -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define R123_USE_AES_OPENSSL 0 +#endif + +#ifndef R123_USE_GNU_UINT128 +#define R123_USE_GNU_UINT128 0 +#endif + +#ifndef R123_USE_ASM_GNU +#define R123_USE_ASM_GNU 1 +#endif + +#ifndef R123_USE_CPUID_MSVC +#define R123_USE_CPUID_MSVC 0 +#endif + +#ifndef R123_USE_X86INTRIN_H +#define R123_USE_X86INTRIN_H 0 +#endif + +#ifndef R123_USE_IA32INTRIN_H +#define R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef R123_USE_XMMINTRIN_H +#define R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef R123_USE_EMMINTRIN_H +#define R123_USE_EMMINTRIN_H 0 +#endif + +#ifndef R123_USE_SMMINTRIN_H +#define R123_USE_SMMINTRIN_H 0 +#endif + +#ifndef R123_USE_WMMINTRIN_H +#define R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef R123_USE_INTRIN_H +#ifdef __ABM__ +#define R123_USE_INTRIN_H 1 +#else +#define R123_USE_INTRIN_H 0 +#endif +#endif + +#ifndef R123_USE_MULHILO32_ASM +#define R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef R123_USE_MULHILO64_MULHI_INTRIN +#if (defined(__powerpc64__)) +#define R123_USE_MULHILO64_MULHI_INTRIN 1 +#else +#define R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif +#endif + +#ifndef R123_MULHILO64_MULHI_INTRIN +#define R123_MULHILO64_MULHI_INTRIN __mulhdu +#endif + +#ifndef R123_USE_MULHILO32_MULHI_INTRIN +#define R123_USE_MULHILO32_MULHI_INTRIN 0 +#endif + +#ifndef R123_MULHILO32_MULHI_INTRIN +#define R123_MULHILO32_MULHI_INTRIN __mulhwu +#endif + +#ifndef R123_USE_MULHILO64_ASM +#if defined(__powerpc64__) +#define R123_USE_MULHILO64_ASM (1 /*defined(__powerpc64__)*/ && !(R123_USE_MULHILO64_MULHI_INTRIN)) +#else +#define R123_USE_MULHILO64_ASM (0 /*defined(__powerpc64__)*/ && !(R123_USE_MULHILO64_MULHI_INTRIN)) +#endif +#endif + +#ifndef R123_USE_MULHILO64_MSVC_INTRIN +#define R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#define R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef R123_USE_MULHILO64_OPENCL_INTRIN +#define R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +/* If you add something, it must go in all the other XXfeatures.hpp + and in ../ut_features.cpp */ +#endif diff --git a/include/Random123/gsl_microrng.h b/include/Random123/gsl_microrng.h @@ -0,0 +1,136 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __r123_gslmicrorng_dot_h__ +#define __r123_gslmicrorng_dot_h__ + + +#include <gsl/gsl_rng.h> +#include <string.h> + +/** The macro: GSL_MICRORNG(NAME, CBRNGNAME) is the GSL + analog analog of the C++ r123::MicroURNG template. It declares a gsl_rng + type named gsl_rng_NAME which uses the underlying CBRNGNAME + and can be invoked a limited number of times between calls to NAME_reset. + + When the underlying CBRNG's \c ctr_t is an \ref arrayNxW "r123arrayNxW", + and the gsl_rng_NAME may called up to \c N*2^32 times + between calls to \c NAME_reset. + + \c NAME_reset takes a gsl_rng_NAME type, a counter and a key as arguments. + It restarts the micro-rng with a new base counter and key. + + Note that you must call NAME_reset before the first use + of a gsl_rng. NAME_reset is not called automatically by + gsl_rng_alloc(). + + @code + #include <Random123/threefry.h> + #include <Random123/gsl_microrng.h> // this file + GSL_MICRORNG(microcbrng, threefry4x64, 20) // creates gsl_rng_microcbrng + + int main(int argc, char** argv) { + gsl_rng *r = gsl_rng_alloc(gsl_rng_microcbrng); + threefry4x64_ctr_t c = {{}}; + threefry4x64_key_t k = {{}}; + + for (...) { + c.v[0] = ??; // some application variable + microcbrng_reset(r, c, k); + for (...) { + // gaussian calls r several times. It is safe for + // r to be used upto 2^20 times in this loop + something[i] = gsl_ran_gaussian(r, 1.5); + } + } + } + @endcode + +*/ + +#define GSL_MICRORNG(NAME, CBRNGNAME) \ +const gsl_rng_type *gsl_rng_##NAME; \ + \ +typedef struct{ \ + CBRNGNAME##_ctr_t ctr; \ + CBRNGNAME##_ctr_t r; \ + CBRNGNAME##_key_t key; \ + R123_ULONG_LONG n; \ + int elem; \ +} NAME##_state; \ + \ +static unsigned long int NAME##_get(void *vstate){ \ + NAME##_state *st = (NAME##_state *)vstate; \ + const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]); \ + if( st->elem == 0 ){ \ + CBRNGNAME##_ctr_t c = st->ctr; \ + c.v[N-1] |= st->n<<(R123_W(CBRNGNAME##_ctr_t)-32); \ + st->n++; \ + st->r = CBRNGNAME(c, st->key); \ + st->elem = N; \ + } \ + return 0xffffffff & st->r.v[--st->elem]; \ +} \ + \ +static double \ +NAME##_get_double (void * vstate) \ +{ \ + return NAME##_get (vstate)/4294967296.; \ +} \ + \ +static void NAME##_set(void *vstate, unsigned long int s){ \ + NAME##_state *st = (NAME##_state *)vstate; \ + (void)s; /* ignored */ \ + st->elem = 0; \ + st->n = ~0; /* will abort if _reset is not called */ \ +} \ + \ +static const gsl_rng_type NAME##_type = { \ + #NAME, \ + 0xffffffffUL, \ + 0, \ + sizeof(NAME##_state), \ + &NAME##_set, \ + &NAME##_get, \ + &NAME##_get_double \ +}; \ + \ +R123_STATIC_INLINE void NAME##_reset(const gsl_rng* gr, CBRNGNAME##_ctr_t c, CBRNGNAME##_key_t k) { \ + NAME##_state* state = (NAME##_state *)gr->state; \ + state->ctr = c; \ + state->key = k; \ + state->n = 0; \ + state->elem = 0; \ +} \ + \ +const gsl_rng_type *gsl_rng_##NAME = &NAME##_type + +#endif diff --git a/include/Random123/philox.h b/include/Random123/philox.h @@ -0,0 +1,493 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _philox_dot_h_ +#define _philox_dot_h_ + +/** \cond HIDDEN_FROM_DOXYGEN */ + +#include "features/compilerfeatures.h" +#include "array.h" + + +/* +// Macros _Foo_tpl are code generation 'templates' They define +// inline functions with names obtained by mangling Foo and the +// macro arguments. E.g., +// _mulhilo_tpl(32, uint32_t, uint64_t) +// expands to a definition of: +// mulhilo32(uint32_t, uint32_t, uint32_t *, uint32_t *) +// We then 'instantiate the template' to define +// several different functions, e.g., +// mulhilo32 +// mulhilo64 +// These functions will be visible to user code, and may +// also be used later in subsequent templates and definitions. + +// A template for mulhilo using a temporary of twice the word-width. +// Gcc figures out that this can be reduced to a single 'mul' instruction, +// despite the apparent use of double-wide variables, shifts, etc. It's +// obviously not guaranteed that all compilers will be that smart, so +// other implementations might be preferable, e.g., using an intrinsic +// or an asm block. On the other hand, for 32-bit multiplies, +// this *is* perfectly standard C99 - any C99 compiler should +// understand it and produce correct code. For 64-bit multiplies, +// it's only usable if the compiler recognizes that it can do +// arithmetic on a 128-bit type. That happens to be true for gcc on +// x86-64, and powerpc64 but not much else. +*/ +#define _mulhilo_dword_tpl(W, Word, Dword) \ +R123_CUDA_DEVICE R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \ + Dword product = ((Dword)a)*((Dword)b); \ + *hip = product>>W; \ + return (Word)product; \ +} + +/* +// A template for mulhilo using gnu-style asm syntax. +// INSN can be "mulw", "mull" or "mulq". +// FIXME - porting to other architectures, we'll need still-more conditional +// branching here. Note that intrinsics are usually preferable. +*/ +#ifdef __powerpc__ +#define _mulhilo_asm_tpl(W, Word, INSN) \ +R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){ \ + Word dx = 0; \ + __asm__("\n\t" \ + INSN " %0,%1,%2\n\t" \ + : "=r"(dx) \ + : "r"(b), "r"(ax) \ + ); \ + *hip = dx; \ + return ax*b; \ +} +#else +#define _mulhilo_asm_tpl(W, Word, INSN) \ +R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){ \ + Word dx; \ + __asm__("\n\t" \ + INSN " %2\n\t" \ + : "=a"(ax), "=d"(dx) \ + : "r"(b), "0"(ax) \ + ); \ + *hip = dx; \ + return ax; \ +} +#endif /* __powerpc__ */ + +/* +// A template for mulhilo using MSVC-style intrinsics +// For example,_umul128 is an msvc intrinsic, c.f. +// http://msdn.microsoft.com/en-us/library/3dayytw9.aspx +*/ +#define _mulhilo_msvc_intrin_tpl(W, Word, INTRIN) \ +R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \ + return INTRIN(a, b, hip); \ +} + +/* N.B. This really should be called _mulhilo_mulhi_intrin. It just + happens that CUDA was the first time we used the idiom. */ +#define _mulhilo_cuda_intrin_tpl(W, Word, INTRIN) \ +R123_CUDA_DEVICE R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, R123_METAL_THREAD_ADDRESS_SPACE Word* hip){ \ + *hip = INTRIN(a, b); \ + return a*b; \ +} + +/* +// A template for mulhilo using only word-size operations and +// C99 operators (no adc, no mulhi). It +// requires four multiplies and a dozen or so shifts, adds +// and tests. It's *SLOW*. It can be used to +// implement philoxNx32 on platforms that completely lack +// 64-bit types, e.g., Metal. +// On 32-bit platforms, it could be used to +// implement philoxNx64, but on such platforms both the philoxNx32 +// and the threefryNx64 cbrngs are going to have much better +// performance. It is enabled below by R123_USE_MULHILO64_C99, +// but that is currently (Feb 2019) only set by +// features/metalfeatures.h headers. It can, of course, be +// set with a compile-time -D option. +*/ +#define _mulhilo_c99_tpl(W, Word) \ +R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, R123_METAL_THREAD_ADDRESS_SPACE Word *hip){ \ + const unsigned WHALF = W/2; \ + const Word LOMASK = ((((Word)1)<<WHALF)-1); \ + Word lo = a*b; /* full low multiply */ \ + Word ahi = a>>WHALF; \ + Word alo = a& LOMASK; \ + Word bhi = b>>WHALF; \ + Word blo = b& LOMASK; \ + \ + Word ahbl = ahi*blo; \ + Word albh = alo*bhi; \ + \ + Word ahbl_albh = ((ahbl&LOMASK) + (albh&LOMASK)); \ + Word hi = ahi*bhi + (ahbl>>WHALF) + (albh>>WHALF); \ + hi += ahbl_albh >> WHALF; /* carry from the sum of lo(ahbl) + lo(albh) ) */ \ + /* carry from the sum with alo*blo */ \ + hi += ((lo >> WHALF) < (ahbl_albh&LOMASK)); \ + *hip = hi; \ + return lo; \ +} + +/* +// A template for mulhilo on a platform that can't do it +// We could put a C version here, but is it better to run *VERY* +// slowly or to just stop and force the user to find another CBRNG? +*/ +#define _mulhilo_fail_tpl(W, Word) \ +R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word *hip){ \ + R123_STATIC_ASSERT(0, "mulhilo" #W " is not implemented on this machine\n"); \ +} + +/* +// N.B. There's an MSVC intrinsic called _emul, +// which *might* compile into better code than +// _mulhilo_dword_tpl +*/ +#if R123_USE_MULHILO32_ASM +#ifdef __powerpc__ +_mulhilo_asm_tpl(32, uint32_t, "mulhwu") +#else +_mulhilo_asm_tpl(32, uint32_t, "mull") +#endif /* __powerpc__ */ +#else +#if R123_USE_64BIT +_mulhilo_dword_tpl(32, uint32_t, uint64_t) +#elif R123_USE_MULHILO32_MULHI_INTRIN +_mulhilo_cuda_intrin_tpl(32, uint32_t, R123_MULHILO32_MULHI_INTRIN) +#else +_mulhilo_c99_tpl(32, uint32_t) +#endif +#endif + +#if R123_USE_PHILOX_64BIT +#if R123_USE_MULHILO64_ASM +#ifdef __powerpc64__ +_mulhilo_asm_tpl(64, uint64_t, "mulhdu") +#else +_mulhilo_asm_tpl(64, uint64_t, "mulq") +#endif /* __powerpc64__ */ +#elif R123_USE_MULHILO64_MSVC_INTRIN +_mulhilo_msvc_intrin_tpl(64, uint64_t, _umul128) +#elif R123_USE_MULHILO64_CUDA_INTRIN +_mulhilo_cuda_intrin_tpl(64, uint64_t, __umul64hi) +#elif R123_USE_MULHILO64_OPENCL_INTRIN +_mulhilo_cuda_intrin_tpl(64, uint64_t, mul_hi) +#elif R123_USE_MULHILO64_MULHI_INTRIN +_mulhilo_cuda_intrin_tpl(64, uint64_t, R123_MULHILO64_MULHI_INTRIN) +#elif R123_USE_GNU_UINT128 +_mulhilo_dword_tpl(64, uint64_t, __uint128_t) +#elif R123_USE_MULHILO64_C99 +_mulhilo_c99_tpl(64, uint64_t) +#else +_mulhilo_fail_tpl(64, uint64_t) +#endif +#endif + +/* +// The multipliers and Weyl constants are "hard coded". +// To change them, you can #define them with different +// values before #include-ing this file. +// This isn't terribly elegant, but it works for C as +// well as C++. A nice C++-only solution would be to +// use template parameters in the style of <random> +*/ +#ifndef PHILOX_M2x64_0 +#define PHILOX_M2x64_0 R123_64BIT(0xD2B74407B1CE6E93) +#endif + +#ifndef PHILOX_M4x64_0 +#define PHILOX_M4x64_0 R123_64BIT(0xD2E7470EE14C6C93) +#endif + +#ifndef PHILOX_M4x64_1 +#define PHILOX_M4x64_1 R123_64BIT(0xCA5A826395121157) +#endif + +#ifndef PHILOX_M2x32_0 +#define PHILOX_M2x32_0 ((uint32_t)0xd256d193) +#endif + +#ifndef PHILOX_M4x32_0 +#define PHILOX_M4x32_0 ((uint32_t)0xD2511F53) +#endif +#ifndef PHILOX_M4x32_1 +#define PHILOX_M4x32_1 ((uint32_t)0xCD9E8D57) +#endif + +#ifndef PHILOX_W64_0 +#define PHILOX_W64_0 R123_64BIT(0x9E3779B97F4A7C15) /* golden ratio */ +#endif +#ifndef PHILOX_W64_1 +#define PHILOX_W64_1 R123_64BIT(0xBB67AE8584CAA73B) /* sqrt(3)-1 */ +#endif + +#ifndef PHILOX_W32_0 +#define PHILOX_W32_0 ((uint32_t)0x9E3779B9) +#endif +#ifndef PHILOX_W32_1 +#define PHILOX_W32_1 ((uint32_t)0xBB67AE85) +#endif + +/** \endcond */ +#ifndef PHILOX2x32_DEFAULT_ROUNDS +#define PHILOX2x32_DEFAULT_ROUNDS 10 +#endif + +#ifndef PHILOX2x64_DEFAULT_ROUNDS +#define PHILOX2x64_DEFAULT_ROUNDS 10 +#endif + +#ifndef PHILOX4x32_DEFAULT_ROUNDS +#define PHILOX4x32_DEFAULT_ROUNDS 10 +#endif + +#ifndef PHILOX4x64_DEFAULT_ROUNDS +#define PHILOX4x64_DEFAULT_ROUNDS 10 +#endif +/** \cond HIDDEN_FROM_DOXYGEN */ + +/* The ignored fourth argument allows us to instantiate the + same macro regardless of N. */ +#define _philox2xWround_tpl(W, T) \ +R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key)); \ +R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key){ \ + T hi; \ + T lo = mulhilo##W(PHILOX_M2x##W##_0, ctr.v[0], &hi); \ + struct r123array2x##W out = {{hi^key.v[0]^ctr.v[1], lo}}; \ + return out; \ +} +#define _philox2xWbumpkey_tpl(W) \ +R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array1x##W _philox2x##W##bumpkey( struct r123array1x##W key) { \ + key.v[0] += PHILOX_W##W##_0; \ + return key; \ +} + +#define _philox4xWround_tpl(W, T) \ +R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key)); \ +R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key){ \ + T hi0; \ + T hi1; \ + T lo0 = mulhilo##W(PHILOX_M4x##W##_0, ctr.v[0], &hi0); \ + T lo1 = mulhilo##W(PHILOX_M4x##W##_1, ctr.v[2], &hi1); \ + struct r123array4x##W out = {{hi1^ctr.v[1]^key.v[0], lo1, \ + hi0^ctr.v[3]^key.v[1], lo0}}; \ + return out; \ +} + +#define _philox4xWbumpkey_tpl(W) \ +R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array2x##W _philox4x##W##bumpkey( struct r123array2x##W key) { \ + key.v[0] += PHILOX_W##W##_0; \ + key.v[1] += PHILOX_W##W##_1; \ + return key; \ +} + +/** \endcond */ +#define _philoxNxW_tpl(N, Nhalf, W, T) \ +/** @ingroup PhiloxNxW */ \ +enum r123_enum_philox##N##x##W { philox##N##x##W##_rounds = PHILOX##N##x##W##_DEFAULT_ROUNDS }; \ +typedef struct r123array##N##x##W philox##N##x##W##_ctr_t; \ +typedef struct r123array##Nhalf##x##W philox##N##x##W##_key_t; \ +typedef struct r123array##Nhalf##x##W philox##N##x##W##_ukey_t; \ +R123_CUDA_DEVICE R123_STATIC_INLINE philox##N##x##W##_key_t philox##N##x##W##keyinit(philox##N##x##W##_ukey_t uk) { return uk; } \ +R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key)); \ +R123_CUDA_DEVICE R123_STATIC_INLINE philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key) { \ + R123_ASSERT(R<=16); \ + if(R>0){ ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>1){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>2){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>3){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>4){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>5){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>6){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>7){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>8){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>9){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>10){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>11){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>12){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>13){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>14){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>15){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + return ctr; \ +} + +_philox2xWbumpkey_tpl(32) +_philox4xWbumpkey_tpl(32) +_philox2xWround_tpl(32, uint32_t) /* philox2x32round */ +_philox4xWround_tpl(32, uint32_t) /* philo4x32round */ + +_philoxNxW_tpl(2, 1, 32, uint32_t) /* philox2x32bijection */ +_philoxNxW_tpl(4, 2, 32, uint32_t) /* philox4x32bijection */ +#if R123_USE_PHILOX_64BIT +/** \cond HIDDEN_FROM_DOXYGEN */ +_philox2xWbumpkey_tpl(64) +_philox4xWbumpkey_tpl(64) +_philox2xWround_tpl(64, uint64_t) /* philo2x64round */ +_philox4xWround_tpl(64, uint64_t) /* philo4x64round */ +/** \endcond */ +_philoxNxW_tpl(2, 1, 64, uint64_t) /* philox2x64bijection */ +_philoxNxW_tpl(4, 2, 64, uint64_t) /* philox4x64bijection */ +#endif /* R123_USE_PHILOX_64BIT */ + +#define philox2x32(c,k) philox2x32_R(philox2x32_rounds, c, k) +#define philox4x32(c,k) philox4x32_R(philox4x32_rounds, c, k) +#if R123_USE_PHILOX_64BIT +#define philox2x64(c,k) philox2x64_R(philox2x64_rounds, c, k) +#define philox4x64(c,k) philox4x64_R(philox4x64_rounds, c, k) +#endif /* R123_USE_PHILOX_64BIT */ + +#if defined(__cplusplus) + +#define _PhiloxNxW_base_tpl(CType, KType, N, W) \ +namespace r123{ \ +template<unsigned int ROUNDS> \ +struct Philox##N##x##W##_R{ \ + typedef CType ctr_type; \ + typedef KType key_type; \ + typedef KType ukey_type; \ + static const R123_METAL_CONSTANT_ADDRESS_SPACE unsigned int rounds=ROUNDS; \ + inline R123_CUDA_DEVICE R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ \ + R123_STATIC_ASSERT(ROUNDS<=16, "philox is only unrolled up to 16 rounds\n"); \ + return philox##N##x##W##_R(ROUNDS, ctr, key); \ + } \ +}; \ +typedef Philox##N##x##W##_R<philox##N##x##W##_rounds> Philox##N##x##W; \ + } // namespace r123 + +_PhiloxNxW_base_tpl(r123array2x32, r123array1x32, 2, 32) // Philox2x32_R<R> +_PhiloxNxW_base_tpl(r123array4x32, r123array2x32, 4, 32) // Philox4x32_R<R> +#if R123_USE_PHILOX_64BIT +_PhiloxNxW_base_tpl(r123array2x64, r123array1x64, 2, 64) // Philox2x64_R<R> +_PhiloxNxW_base_tpl(r123array4x64, r123array2x64, 4, 64) // Philox4x64_R<R> +#endif + +/* The _tpl macros don't quite work to do string-pasting inside comments. + so we just write out the boilerplate documentation four times... */ + +/** +@defgroup PhiloxNxW Philox Classes and Typedefs + +The PhiloxNxW classes export the member functions, typedefs and +operator overloads required by a @ref CBRNG "CBRNG" class. + +As described in +<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>. +The Philox family of counter-based RNGs use integer multiplication, xor and permutation of W-bit words +to scramble its N-word input key. Philox is a mnemonic for Product HI LO Xor). + + +@class r123::Philox2x32_R +@ingroup PhiloxNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Philox round +function will be applied. + +As of November 2011, the authors know of no statistical flaws with +ROUNDS=6 or more for Philox2x32. + +@typedef r123::Philox2x32 +@ingroup PhiloxNxW + Philox2x32 is equivalent to Philox2x32_R<10>. With 10 rounds, + Philox2x32 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Philox2x64_R +@ingroup PhiloxNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Philox round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=6 or more for Philox2x64. + +@typedef r123::Philox2x64 +@ingroup PhiloxNxW + Philox2x64 is equivalent to Philox2x64_R<10>. With 10 rounds, + Philox2x64 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Philox4x32_R +@ingroup PhiloxNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Philox round +function will be applied. + +In November 2011, the authors recorded some suspicious p-values (approximately 1.e-7) from +some very long (longer than the default BigCrush length) SimpPoker tests. Despite +the fact that even longer tests reverted to "passing" p-values, a cloud remains over +Philox4x32 with 7 rounds. The authors know of no statistical flaws with +ROUNDS=8 or more for Philox4x32. + +@typedef r123::Philox4x32 +@ingroup PhiloxNxW + Philox4x32 is equivalent to Philox4x32_R<10>. With 10 rounds, + Philox4x32 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Philox4x64_R +@ingroup PhiloxNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Philox round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=7 or more for Philox4x64. + +@typedef r123::Philox4x64 +@ingroup PhiloxNxW + Philox4x64 is equivalent to Philox4x64_R<10>. With 10 rounds, + Philox4x64 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. +*/ + +#endif /* __cplusplus */ + +#endif /* _philox_dot_h_ */ diff --git a/include/Random123/threefry.h b/include/Random123/threefry.h @@ -0,0 +1,874 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _threefry_dot_h_ +#define _threefry_dot_h_ +#include "features/compilerfeatures.h" +#include "array.h" + +/** \cond HIDDEN_FROM_DOXYGEN */ +/* Significant parts of this file were copied from + from: + Skein_FinalRnd/ReferenceImplementation/skein.h + Skein_FinalRnd/ReferenceImplementation/skein_block.c + + in http://csrc.nist.gov/groups/ST/hash/sha-3/Round3/documents/Skein_FinalRnd.zip + + This file has been modified so that it may no longer perform its originally + intended function. If you're looking for a Skein or Threefish source code, + please consult the original file. + + The original file had the following header: +************************************************************************** +** +** Interface declarations and internal definitions for Skein hashing. +** +** Source code author: Doug Whiting, 2008. +** +** This algorithm and source code is released to the public domain. +** +*************************************************************************** + +*/ + +/* See comment at the top of philox.h for the macro pre-process + strategy. */ + +/* Rotation constants: */ +enum r123_enum_threefry64x4 { + /* These are the R_256 constants from the Threefish reference sources + with names changed to R_64x4... */ + R_64x4_0_0=14, R_64x4_0_1=16, + R_64x4_1_0=52, R_64x4_1_1=57, + R_64x4_2_0=23, R_64x4_2_1=40, + R_64x4_3_0= 5, R_64x4_3_1=37, + R_64x4_4_0=25, R_64x4_4_1=33, + R_64x4_5_0=46, R_64x4_5_1=12, + R_64x4_6_0=58, R_64x4_6_1=22, + R_64x4_7_0=32, R_64x4_7_1=32 +}; + +enum r123_enum_threefry64x2 { + /* + // Output from skein_rot_search: (srs64_B64-X1000) + // Random seed = 1. BlockSize = 128 bits. sampleCnt = 1024. rounds = 8, minHW_or=57 + // Start: Tue Mar 1 10:07:48 2011 + // rMin = 0.136. #0325[*15] [CRC=455A682F. hw_OR=64. cnt=16384. blkSize= 128].format + */ + R_64x2_0_0=16, + R_64x2_1_0=42, + R_64x2_2_0=12, + R_64x2_3_0=31, + R_64x2_4_0=16, + R_64x2_5_0=32, + R_64x2_6_0=24, + R_64x2_7_0=21 + /* 4 rounds: minHW = 4 [ 4 4 4 4 ] + // 5 rounds: minHW = 8 [ 8 8 8 8 ] + // 6 rounds: minHW = 16 [ 16 16 16 16 ] + // 7 rounds: minHW = 32 [ 32 32 32 32 ] + // 8 rounds: minHW = 64 [ 64 64 64 64 ] + // 9 rounds: minHW = 64 [ 64 64 64 64 ] + //10 rounds: minHW = 64 [ 64 64 64 64 ] + //11 rounds: minHW = 64 [ 64 64 64 64 ] */ +}; + +enum r123_enum_threefry32x4 { + /* Output from skein_rot_search: (srs-B128-X5000.out) + // Random seed = 1. BlockSize = 64 bits. sampleCnt = 1024. rounds = 8, minHW_or=28 + // Start: Mon Aug 24 22:41:36 2009 + // ... + // rMin = 0.472. #0A4B[*33] [CRC=DD1ECE0F. hw_OR=31. cnt=16384. blkSize= 128].format */ + R_32x4_0_0=10, R_32x4_0_1=26, + R_32x4_1_0=11, R_32x4_1_1=21, + R_32x4_2_0=13, R_32x4_2_1=27, + R_32x4_3_0=23, R_32x4_3_1= 5, + R_32x4_4_0= 6, R_32x4_4_1=20, + R_32x4_5_0=17, R_32x4_5_1=11, + R_32x4_6_0=25, R_32x4_6_1=10, + R_32x4_7_0=18, R_32x4_7_1=20 + + /* 4 rounds: minHW = 3 [ 3 3 3 3 ] + // 5 rounds: minHW = 7 [ 7 7 7 7 ] + // 6 rounds: minHW = 12 [ 13 12 13 12 ] + // 7 rounds: minHW = 22 [ 22 23 22 23 ] + // 8 rounds: minHW = 31 [ 31 31 31 31 ] + // 9 rounds: minHW = 32 [ 32 32 32 32 ] + //10 rounds: minHW = 32 [ 32 32 32 32 ] + //11 rounds: minHW = 32 [ 32 32 32 32 ] */ + +}; + +enum r123_enum_threefry32x2 { + /* Output from skein_rot_search (srs32x2-X5000.out) + // Random seed = 1. BlockSize = 64 bits. sampleCnt = 1024. rounds = 8, minHW_or=28 + // Start: Tue Jul 12 11:11:33 2011 + // rMin = 0.334. #0206[*07] [CRC=1D9765C0. hw_OR=32. cnt=16384. blkSize= 64].format */ + R_32x2_0_0=13, + R_32x2_1_0=15, + R_32x2_2_0=26, + R_32x2_3_0= 6, + R_32x2_4_0=17, + R_32x2_5_0=29, + R_32x2_6_0=16, + R_32x2_7_0=24 + + /* 4 rounds: minHW = 4 [ 4 4 4 4 ] + // 5 rounds: minHW = 6 [ 6 8 6 8 ] + // 6 rounds: minHW = 9 [ 9 12 9 12 ] + // 7 rounds: minHW = 16 [ 16 24 16 24 ] + // 8 rounds: minHW = 32 [ 32 32 32 32 ] + // 9 rounds: minHW = 32 [ 32 32 32 32 ] + //10 rounds: minHW = 32 [ 32 32 32 32 ] + //11 rounds: minHW = 32 [ 32 32 32 32 ] */ + }; + +enum r123_enum_threefry_wcnt { + WCNT2=2, + WCNT4=4 +}; + +#if R123_USE_64BIT +R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(uint64_t RotL_64(uint64_t x, unsigned int N)); +R123_CUDA_DEVICE R123_STATIC_INLINE uint64_t RotL_64(uint64_t x, unsigned int N) +{ + return (x << (N & 63)) | (x >> ((64-N) & 63)); +} +#endif + +R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(uint32_t RotL_32(uint32_t x, unsigned int N)); +R123_CUDA_DEVICE R123_STATIC_INLINE uint32_t RotL_32(uint32_t x, unsigned int N) +{ + return (x << (N & 31)) | (x >> ((32-N) & 31)); +} + +#define SKEIN_MK_64(hi32,lo32) ((lo32) + (((uint64_t) (hi32)) << 32)) +#define SKEIN_KS_PARITY64 SKEIN_MK_64(0x1BD11BDA,0xA9FC1A22) +#define SKEIN_KS_PARITY32 0x1BD11BDA + +/** \endcond */ + +#ifndef THREEFRY2x32_DEFAULT_ROUNDS +#define THREEFRY2x32_DEFAULT_ROUNDS 20 +#endif + +#ifndef THREEFRY2x64_DEFAULT_ROUNDS +#define THREEFRY2x64_DEFAULT_ROUNDS 20 +#endif + +#ifndef THREEFRY4x32_DEFAULT_ROUNDS +#define THREEFRY4x32_DEFAULT_ROUNDS 20 +#endif + +#ifndef THREEFRY4x64_DEFAULT_ROUNDS +#define THREEFRY4x64_DEFAULT_ROUNDS 20 +#endif + +#define _threefry2x_tpl(W) \ +typedef struct r123array2x##W threefry2x##W##_ctr_t; \ +typedef struct r123array2x##W threefry2x##W##_key_t; \ +typedef struct r123array2x##W threefry2x##W##_ukey_t; \ +R123_CUDA_DEVICE R123_STATIC_INLINE threefry2x##W##_key_t threefry2x##W##keyinit(threefry2x##W##_ukey_t uk) { return uk; } \ +R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \ +R123_CUDA_DEVICE R123_STATIC_INLINE \ +threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \ + uint##W##_t X0,X1; \ + uint##W##_t ks0, ks1, ks2; \ + R123_ASSERT(Nrounds<=32); \ + ks2 = SKEIN_KS_PARITY##W; \ + ks0 = k.v[0]; \ + X0 = in.v[0] + ks0; \ + ks2 ^= ks0; \ +\ + ks1 = k.v[1]; \ + X1 = in.v[1] + ks1; \ + ks2 ^= ks1; \ + \ + if(Nrounds>0){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_0_0); X1 ^= X0; } \ + if(Nrounds>1){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_1_0); X1 ^= X0; } \ + if(Nrounds>2){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_2_0); X1 ^= X0; } \ + if(Nrounds>3){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_3_0); X1 ^= X0; } \ + if(Nrounds>3){ \ + /* InjectKey(r=1) */ \ + X0 += ks1; X1 += ks2; \ + X1 += 1; /* X.v[2-1] += r */ \ + } \ + if(Nrounds>4){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_4_0); X1 ^= X0; } \ + if(Nrounds>5){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_5_0); X1 ^= X0; } \ + if(Nrounds>6){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_6_0); X1 ^= X0; } \ + if(Nrounds>7){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_7_0); X1 ^= X0; } \ + if(Nrounds>7){ \ + /* InjectKey(r=2) */ \ + X0 += ks2; X1 += ks0; \ + X1 += 2; \ + } \ + if(Nrounds>8){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_0_0); X1 ^= X0; } \ + if(Nrounds>9){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_1_0); X1 ^= X0; } \ + if(Nrounds>10){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_2_0); X1 ^= X0; } \ + if(Nrounds>11){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_3_0); X1 ^= X0; } \ + if(Nrounds>11){ \ + /* InjectKey(r=3) */ \ + X0 += ks0; X1 += ks1; \ + X1 += 3; \ + } \ + if(Nrounds>12){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_4_0); X1 ^= X0; } \ + if(Nrounds>13){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_5_0); X1 ^= X0; } \ + if(Nrounds>14){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_6_0); X1 ^= X0; } \ + if(Nrounds>15){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_7_0); X1 ^= X0; } \ + if(Nrounds>15){ \ + /* InjectKey(r=4) */ \ + X0 += ks1; X1 += ks2; \ + X1 += 4; \ + } \ + if(Nrounds>16){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_0_0); X1 ^= X0; } \ + if(Nrounds>17){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_1_0); X1 ^= X0; } \ + if(Nrounds>18){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_2_0); X1 ^= X0; } \ + if(Nrounds>19){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_3_0); X1 ^= X0; } \ + if(Nrounds>19){ \ + /* InjectKey(r=5) */ \ + X0 += ks2; X1 += ks0; \ + X1 += 5; \ + } \ + if(Nrounds>20){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_4_0); X1 ^= X0; } \ + if(Nrounds>21){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_5_0); X1 ^= X0; } \ + if(Nrounds>22){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_6_0); X1 ^= X0; } \ + if(Nrounds>23){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_7_0); X1 ^= X0; } \ + if(Nrounds>23){ \ + /* InjectKey(r=6) */ \ + X0 += ks0; X1 += ks1; \ + X1 += 6; \ + } \ + if(Nrounds>24){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_0_0); X1 ^= X0; } \ + if(Nrounds>25){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_1_0); X1 ^= X0; } \ + if(Nrounds>26){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_2_0); X1 ^= X0; } \ + if(Nrounds>27){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_3_0); X1 ^= X0; } \ + if(Nrounds>27){ \ + /* InjectKey(r=7) */ \ + X0 += ks1; X1 += ks2; \ + X1 += 7; \ + } \ + if(Nrounds>28){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_4_0); X1 ^= X0; } \ + if(Nrounds>29){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_5_0); X1 ^= X0; } \ + if(Nrounds>30){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_6_0); X1 ^= X0; } \ + if(Nrounds>31){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_7_0); X1 ^= X0; } \ + if(Nrounds>31){ \ + /* InjectKey(r=8) */ \ + X0 += ks2; X1 += ks0; \ + X1 += 8; \ + } \ + threefry2x##W##_ctr_t ret={{X0, X1}}; \ + return ret; \ +} \ + /** @ingroup ThreefryNxW */ \ +enum r123_enum_threefry2x##W { threefry2x##W##_rounds = THREEFRY2x##W##_DEFAULT_ROUNDS }; \ +R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \ +R123_CUDA_DEVICE R123_STATIC_INLINE \ +threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \ + return threefry2x##W##_R(threefry2x##W##_rounds, in, k); \ +} + + +#define _threefry4x_tpl(W) \ +typedef struct r123array4x##W threefry4x##W##_ctr_t; \ +typedef struct r123array4x##W threefry4x##W##_key_t; \ +typedef struct r123array4x##W threefry4x##W##_ukey_t; \ +R123_CUDA_DEVICE R123_STATIC_INLINE threefry4x##W##_key_t threefry4x##W##keyinit(threefry4x##W##_ukey_t uk) { return uk; } \ +R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \ +R123_CUDA_DEVICE R123_STATIC_INLINE \ +threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \ + uint##W##_t X0, X1, X2, X3; \ + uint##W##_t ks0, ks1, ks2, ks3, ks4; \ + R123_ASSERT(Nrounds<=72); \ + ks4 = SKEIN_KS_PARITY##W; \ + ks0 = k.v[0]; \ + X0 = in.v[0] + ks0; \ + ks4 ^= ks0; \ + \ + ks1 = k.v[1]; \ + X1 = in.v[1] + ks1; \ + ks4 ^= ks1; \ + \ + ks2 = k.v[2]; \ + X2 = in.v[2] + ks2; \ + ks4 ^= ks2; \ + \ + ks3 = k.v[3]; \ + X3 = in.v[3] + ks3; \ + ks4 ^= ks3; \ + \ + if(Nrounds>0){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \ + } \ + if(Nrounds>1){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \ + } \ + if(Nrounds>2){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \ + } \ + if(Nrounds>3){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \ + } \ + if(Nrounds>3){ \ + /* InjectKey(r=1) */ \ + X0 += ks1; X1 += ks2; X2 += ks3; X3 += ks4; \ + X3 += 1; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>4){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \ + } \ + if(Nrounds>5){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \ + } \ + if(Nrounds>6){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \ + } \ + if(Nrounds>7){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \ + } \ + if(Nrounds>7){ \ + /* InjectKey(r=2) */ \ + X0 += ks2; X1 += ks3; X2 += ks4; X3 += ks0; \ + X3 += 2; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>8){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \ + } \ + if(Nrounds>9){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \ + } \ + if(Nrounds>10){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \ + } \ + if(Nrounds>11){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \ + } \ + if(Nrounds>11){ \ + /* InjectKey(r=3) */ \ + X0 += ks3; X1 += ks4; X2 += ks0; X3 += ks1; \ + X3 += 3; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>12){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \ + } \ + if(Nrounds>13){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \ + } \ + if(Nrounds>14){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \ + } \ + if(Nrounds>15){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \ + } \ + if(Nrounds>15){ \ + /* InjectKey(r=1) */ \ + X0 += ks4; X1 += ks0; X2 += ks1; X3 += ks2; \ + X3 += 4; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>16){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \ + } \ + if(Nrounds>17){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \ + } \ + if(Nrounds>18){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \ + } \ + if(Nrounds>19){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \ + } \ + if(Nrounds>19){ \ + /* InjectKey(r=1) */ \ + X0 += ks0; X1 += ks1; X2 += ks2; X3 += ks3; \ + X3 += 5; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>20){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \ + } \ + if(Nrounds>21){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \ + } \ + if(Nrounds>22){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \ + } \ + if(Nrounds>23){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \ + } \ + if(Nrounds>23){ \ + /* InjectKey(r=1) */ \ + X0 += ks1; X1 += ks2; X2 += ks3; X3 += ks4; \ + X3 += 6; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>24){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \ + } \ + if(Nrounds>25){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \ + } \ + if(Nrounds>26){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \ + } \ + if(Nrounds>27){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \ + } \ + if(Nrounds>27){ \ + /* InjectKey(r=1) */ \ + X0 += ks2; X1 += ks3; X2 += ks4; X3 += ks0; \ + X3 += 7; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>28){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \ + } \ + if(Nrounds>29){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \ + } \ + if(Nrounds>30){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \ + } \ + if(Nrounds>31){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \ + } \ + if(Nrounds>31){ \ + /* InjectKey(r=1) */ \ + X0 += ks3; X1 += ks4; X2 += ks0; X3 += ks1; \ + X3 += 8; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>32){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \ + } \ + if(Nrounds>33){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \ + } \ + if(Nrounds>34){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \ + } \ + if(Nrounds>35){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \ + } \ + if(Nrounds>35){ \ + /* InjectKey(r=1) */ \ + X0 += ks4; X1 += ks0; X2 += ks1; X3 += ks2; \ + X3 += 9; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>36){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \ + } \ + if(Nrounds>37){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \ + } \ + if(Nrounds>38){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \ + } \ + if(Nrounds>39){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \ + } \ + if(Nrounds>39){ \ + /* InjectKey(r=1) */ \ + X0 += ks0; X1 += ks1; X2 += ks2; X3 += ks3; \ + X3 += 10; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>40){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \ + } \ + if(Nrounds>41){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \ + } \ + if(Nrounds>42){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \ + } \ + if(Nrounds>43){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \ + } \ + if(Nrounds>43){ \ + /* InjectKey(r=1) */ \ + X0 += ks1; X1 += ks2; X2 += ks3; X3 += ks4; \ + X3 += 11; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>44){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \ + } \ + if(Nrounds>45){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \ + } \ + if(Nrounds>46){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \ + } \ + if(Nrounds>47){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \ + } \ + if(Nrounds>47){ \ + /* InjectKey(r=1) */ \ + X0 += ks2; X1 += ks3; X2 += ks4; X3 += ks0; \ + X3 += 12; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>48){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \ + } \ + if(Nrounds>49){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \ + } \ + if(Nrounds>50){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \ + } \ + if(Nrounds>51){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \ + } \ + if(Nrounds>51){ \ + /* InjectKey(r=1) */ \ + X0 += ks3; X1 += ks4; X2 += ks0; X3 += ks1; \ + X3 += 13; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>52){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \ + } \ + if(Nrounds>53){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \ + } \ + if(Nrounds>54){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \ + } \ + if(Nrounds>55){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \ + } \ + if(Nrounds>55){ \ + /* InjectKey(r=1) */ \ + X0 += ks4; X1 += ks0; X2 += ks1; X3 += ks2; \ + X3 += 14; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>56){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \ + } \ + if(Nrounds>57){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \ + } \ + if(Nrounds>58){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \ + } \ + if(Nrounds>59){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \ + } \ + if(Nrounds>59){ \ + /* InjectKey(r=1) */ \ + X0 += ks0; X1 += ks1; X2 += ks2; X3 += ks3; \ + X3 += 15; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>60){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \ + } \ + if(Nrounds>61){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \ + } \ + if(Nrounds>62){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \ + } \ + if(Nrounds>63){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \ + } \ + if(Nrounds>63){ \ + /* InjectKey(r=1) */ \ + X0 += ks1; X1 += ks2; X2 += ks3; X3 += ks4; \ + X3 += 16; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>64){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \ + } \ + if(Nrounds>65){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \ + } \ + if(Nrounds>66){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \ + } \ + if(Nrounds>67){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \ + } \ + if(Nrounds>67){ \ + /* InjectKey(r=1) */ \ + X0 += ks2; X1 += ks3; X2 += ks4; X3 += ks0; \ + X3 += 17; /* XWCNT4-1 += r */ \ + } \ + \ + if(Nrounds>68){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \ + } \ + if(Nrounds>69){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \ + } \ + if(Nrounds>70){ \ + X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \ + X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \ + } \ + if(Nrounds>71){ \ + X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \ + X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \ + } \ + if(Nrounds>71){ \ + /* InjectKey(r=1) */ \ + X0 += ks3; X1 += ks4; X2 += ks0; X3 += ks1; \ + X3 += 18; /* XWCNT4-1 += r */ \ + } \ + \ + threefry4x##W##_ctr_t ret = {{X0, X1, X2, X3}}; \ + return ret; \ +} \ + \ + /** @ingroup ThreefryNxW */ \ +enum r123_enum_threefry4x##W { threefry4x##W##_rounds = THREEFRY4x##W##_DEFAULT_ROUNDS }; \ +R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \ +R123_CUDA_DEVICE R123_STATIC_INLINE \ +threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \ + return threefry4x##W##_R(threefry4x##W##_rounds, in, k); \ +} + +#if R123_USE_64BIT +_threefry2x_tpl(64) +_threefry4x_tpl(64) +#endif +_threefry2x_tpl(32) +_threefry4x_tpl(32) + +/* gcc4.5 and 4.6 seem to optimize a macro-ized threefryNxW better + than a static inline function. Why? */ +#define threefry2x32(c,k) threefry2x32_R(threefry2x32_rounds, c, k) +#define threefry4x32(c,k) threefry4x32_R(threefry4x32_rounds, c, k) +#define threefry2x64(c,k) threefry2x64_R(threefry2x64_rounds, c, k) +#define threefry4x64(c,k) threefry4x64_R(threefry4x64_rounds, c, k) + +#if defined(__cplusplus) +#define _threefryNxWclass_tpl(NxW) \ +namespace r123{ \ +template<unsigned int ROUNDS> \ + struct Threefry##NxW##_R{ \ + typedef threefry##NxW##_ctr_t ctr_type; \ + typedef threefry##NxW##_key_t key_type; \ + typedef threefry##NxW##_key_t ukey_type; \ + static const R123_METAL_CONSTANT_ADDRESS_SPACE unsigned int rounds=ROUNDS; \ + inline R123_CUDA_DEVICE R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key)){ \ + R123_STATIC_ASSERT(ROUNDS<=72, "threefry is only unrolled up to 72 rounds\n"); \ + return threefry##NxW##_R(ROUNDS, ctr, key); \ + } \ +}; \ + typedef Threefry##NxW##_R<threefry##NxW##_rounds> Threefry##NxW; \ +} // namespace r123 + +_threefryNxWclass_tpl(2x32) +_threefryNxWclass_tpl(4x32) +#if R123_USE_64BIT +_threefryNxWclass_tpl(2x64) +_threefryNxWclass_tpl(4x64) +#endif + +/* The _tpl macros don't quite work to do string-pasting inside comments. + so we just write out the boilerplate documentation four times... */ + +/** +@defgroup ThreefryNxW Threefry Classes and Typedefs + +The ThreefryNxW classes export the member functions, typedefs and +operator overloads required by a @ref CBRNG "CBRNG" class. + +As described in +<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>, +the Threefry family is closely related to the Threefish block cipher from +<a href="http://www.skein-hash.info/"> Skein Hash Function</a>. +Threefry is \b not suitable for cryptographic use. + +Threefry uses integer addition, bitwise rotation, xor and permutation of words to randomize its output. + +@class r123::Threefry2x32_R +@ingroup ThreefryNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Threefry round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=13 or more for Threefry2x32. + +@typedef r123::Threefry2x32 +@ingroup ThreefryNxW + Threefry2x32 is equivalent to Threefry2x32_R<20>. With 20 rounds, + Threefry2x32 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + +@class r123::Threefry2x64_R +@ingroup ThreefryNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Threefry round +function will be applied. + +In November 2011, the authors discovered that 13 rounds of +Threefry2x64 sequenced by strided, interleaved key and counter +increments failed a very long (longer than the default BigCrush +length) WeightDistrub test. At the same time, it was confirmed that +14 rounds passes much longer tests (up to 5x10^12 samples) of a +similar nature. The authors know of no statistical flaws with +ROUNDS=14 or more for Threefry2x64. + +@typedef r123::Threefry2x64 +@ingroup ThreefryNxW + Threefry2x64 is equivalent to Threefry2x64_R<20>. With 20 rounds, + Threefry2x64 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Threefry4x32_R +@ingroup ThreefryNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Threefry round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=12 or more for Threefry4x32. + +@typedef r123::Threefry4x32 +@ingroup ThreefryNxW + Threefry4x32 is equivalent to Threefry4x32_R<20>. With 20 rounds, + Threefry4x32 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Threefry4x64_R +@ingroup ThreefryNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Threefry round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=12 or more for Threefry4x64. + +@typedef r123::Threefry4x64 +@ingroup ThreefryNxW + Threefry4x64 is equivalent to Threefry4x64_R<20>. With 20 rounds, + Threefry4x64 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. +*/ + +#endif + +#endif diff --git a/include/Random123/u01fixedpt.h b/include/Random123/u01fixedpt.h @@ -0,0 +1,200 @@ +/* +Copyright 2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _random123_ufixed01_dot_h_ +#define _random123_ufixed01_dot_h_ + +#include "features/compilerfeatures.h" + +/** @defgroup u01fixedpt The u01fixedpt conversion functions + + These functions convert unsigned W-bit integers to uniformly + spaced real values (float or double) between 0.0 and 1.0 with + mantissas of M bits. + + PLEASE THINK CAREFULLY BEFORE USING THESE FUNCTIONS. THEY MAY + NOT BE WHAT YOU WANT. YOU MAY BE MUCH BETTER SERVED BY THE + FUNCTIONS IN ./uniform.hpp. + + These functions produce a finite number *uniformly spaced* values + in the range from 0.0 to 1.0 with uniform probability. The price + of uniform spacing is that they may not utilize the entire space + of possible outputs. E.g., u01fixedpt_closed_open_32_24 will never + produce a non-zero value less than 2^-24, even though such values + are representable in single-precision floating point. + + There are 12 functions, corresponding to the following choices: + + - W = 32 or 64 + - M = 24 (float) or 53 (double) + - open0 or closed0 : whether the output is open or closed at 0.0 + - open1 or closed1 : whether the output is open or closed at 1.0 + + The W=64 M=24 cases are not implemented. To obtain an M=24 float + from a uint64_t, use a cast (possibly with right-shift and bitwise + and) to convert some of the bits of the uint64_t to a uint32_t and + then use u01fixedpt_x_y_32_float. Note that the 64-bit random integers + produced by the Random123 library are random in "all the bits", so + with a little extra effort you can obtain two floats this way -- + one from the high bits and one from the low bits of the 64-bit + value. + + If the output is open at one end, then the extreme + value (0.0 or 1.0) will never be returned. Conversely, if the output + is closed at one end, then the extreme value is a possible + return value. + + The values returned are as follows. All values are returned + with equal frequency, except as noted in the closed_closed case: + + closed_open: Let P=min(M,W) + there are 2^P possible output values: + {0, 1, 2, ..., 2^P-1}/2^P + + open_closed: Let P=min(M,W) + there are 2^P possible values: + {1, 2, ..., 2^P}/2^P + + open_open: Let P=min(M, W+1) + there are 2^(P-1) possible values: + {1, 3, 5, ..., 2^P-1}/2^P + + closed_closed: Let P=min(M, W-1) + there are 1+2^P possible values: + {0, 1, 2, ... 2^P}/2^P + The extreme values (0.0 and 1.0) are + returned with half the frequency of + all others. + + On x86 hardware, especially on 32bit machines, the use of + internal 80bit x87-style floating point may result in + 'bonus' precision, which may cause closed intervals to not + be really closed, i.e. the conversions below might not + convert UINT{32,64}_MAX to 1.0. This sort of issue is + likely to occur when storing the output of a u01fixedpt_*_32_float + function in a double, though one can imagine getting extra + precision artifacts when going from 64_53 as well. Other + artifacts may exist on some GPU hardware. The tests in + kat_u01_main.h try to expose such issues, but caveat emptor. + + @cond HIDDEN_FROM_DOXYGEN + */ + +/* Hex floats were standardized by C in 1999, but weren't standardized + by C++ until 2011. So, we're obliged to write out our constants in + decimal, even though they're most naturally expressed in binary. + We cross our fingers and hope that the compiler does the compile-time + constant arithmetic properly. +*/ +#define R123_0x1p_31f (1.f/(1024.f*1024.f*1024.f*2.f)) +#define R123_0x1p_24f (128.f*R123_0x1p_31f) +#define R123_0x1p_23f (256.f*R123_0x1p_31f) +#define R123_0x1p_32 (1./(1024.*1024.*1024.*4.)) +#define R123_0x1p_63 (2.*R123_0x1p_32*R123_0x1p_32) +#define R123_0x1p_53 (1024.*R123_0x1p_63) +#define R123_0x1p_52 (2048.*R123_0x1p_63) + +/** @endcond */ + +#ifndef R123_USE_U01_DOUBLE +#define R123_USE_U01_DOUBLE 1 +#endif + +#ifdef __cplusplus +extern "C"{ +#endif + +/* narrowing conversions: uint32_t to float */ +R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_closed_closed_32_float(uint32_t i){ + /* N.B. we ignore the high bit, so output is not monotonic */ + return ((i&0x7fffffc0) + (i&0x40))*R123_0x1p_31f; /* 0x1.p-31f */ +} + +R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_closed_open_32_float(uint32_t i){ + return (i>>8)*R123_0x1p_24f; /* 0x1.0p-24f; */ +} + +R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_open_closed_32_float(uint32_t i){ + return (1+(i>>8))*R123_0x1p_24f; /* *0x1.0p-24f; */ +} + +R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_open_open_32_float(uint32_t i){ + return (0.5f+(i>>9))*R123_0x1p_23f; /* 0x1.p-23f; */ +} + +#if R123_USE_U01_DOUBLE +/* narrowing conversions: uint64_t to double */ +R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_closed_64_double(uint64_t i){ + /* N.B. we ignore the high bit, so output is not monotonic */ + return ((i&R123_64BIT(0x7ffffffffffffe00)) + (i&0x200))*R123_0x1p_63; /* 0x1.p-63; */ +} + +R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_open_64_double(uint64_t i){ + return (i>>11)*R123_0x1p_53; /* 0x1.0p-53; */ +} + +R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_closed_64_double(uint64_t i){ + return (1+(i>>11))*R123_0x1p_53; /* 0x1.0p-53; */ +} + +R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_open_64_double(uint64_t i){ + return (0.5+(i>>12))*R123_0x1p_52; /* 0x1.0p-52; */ +} + +/* widening conversions: u32 to double */ +R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_closed_32_double(uint32_t i){ + /* j = i+(i&1) takes on 2^31+1 possible values with a 'trapezoid' distribution: + p_j = 1 0 2 0 2 .... 2 0 2 0 1 + j = 0 1 2 3 4 .... 2^32 + by converting to double *before* doing the add, we don't wrap the high bit. + */ + return (((double)(i&1)) + i)*R123_0x1p_32; /* 0x1.p-32; */ +} + +R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_open_32_double(uint32_t i){ + return i*R123_0x1p_32; /* 0x1.p-32; */ +} + +R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_closed_32_double(uint32_t i){ + return (1.+i)*R123_0x1p_32; /* 0x1.p-32; */ +} + +R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_open_32_double(uint32_t i){ + return (0.5+i)*R123_0x1p_32; /* 0x1.p-32; */ +} +#endif /* R123_USE_U01_DOUBLE */ + +#ifdef __cplusplus +} +#endif + +/** @} */ +#endif diff --git a/include/Random123/uniform.hpp b/include/Random123/uniform.hpp @@ -0,0 +1,310 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __r123_uniform_dot_hpp +#define __r123_uniform_dot_hpp + +/** @defgroup uniform Uniform distribution scalar conversion functions + +This file provides some simple functions that can be used to convert +integers of various widths to floats and doubles with various +characteristics. It can be used to generate real-valued, uniformly +distributed random variables from the random integers produced by +the Random123 CBRNGs. + +There are three templated functions: + + - u01: output is as dense as possible in (0,1}, never 0.0. May + return 1.0 if and only if the number of output mantissa bits + is less than the width of the input. + + - uneg11: output is as dense as possible in {-1,1}, never 0.0. May + return 1.0 or -1.0 if and only if the number of output mantissa bits + is less than the width of the input. + + - u01fixedpt: output is "fixed point", equispaced, open at both ends, + and is never 0.0, 0.5 nor 1.0. + +The behavior of u01 and uneg11 depend on the pre-processor symbol: +R123_UNIFORM_FLOAT_STORE. When #defined to a non-zero value, u01 +and uneg11 declare a volatile intermediate result, with the +intention of forcing architectures that have "extra bits" in their +floating point registers to more closely conform to IEEE +arithmetic. When compiled this way, u01 and uneg11 will be +significantly slower, as they will incur a memory write and read on +every call. Without it, they may fail the "known answer test" +implemented in ut_uniform_IEEEkat.cpp even though they perform +perfectly reasonable int to float conversions. We have used +this option to get 32-bit x86 to produce the same results as +64-bit x86-64 code, but we do not recommend it for normal +use. + +Three additional functions are defined when C++11 or newer is in use: + + - u01all + - uneg11all + - u01fixedptall + +These functions apply the corresponding conversion to every +element of their argument, which must be a staticly sized +array, e.g., an r123array or a std::array of an integer type. + +This file may not be as portable, and has not been tested as +rigorously as other files in the library, e.g., the generators. +Nevertheless, we hope it is useful and we encourage developers to +copy it and modify it for their own use. We invite comments and +improvements. +*/ + +#include <Random123/features/compilerfeatures.h> +#include <limits> +#if R123_USE_CXX11_TYPE_TRAITS +#include <type_traits> +#endif +#if __cplusplus >= 201103L +#include <array> +#endif + +namespace r123{ +/** +@{ +@cond HIDDEN_FROM_DOXYGEN +*/ + +#if R123_USE_CXX11_TYPE_TRAITS +using std::make_signed; +using std::make_unsigned; +#else +// Sigh... We could try to find another <type_traits>, e.g., from +// boost or TR1. Or we can do it ourselves in the r123 namespace. +// It's not clear which will cause less headache... +template <typename T> struct make_signed{}; +template <typename T> struct make_unsigned{}; +#define R123_MK_SIGNED_UNSIGNED(ST, UT) \ +template<> struct make_signed<ST>{ typedef ST type; }; \ +template<> struct make_signed<UT>{ typedef ST type; }; \ +template<> struct make_unsigned<ST>{ typedef UT type; }; \ +template<> struct make_unsigned<UT>{ typedef UT type; } + +R123_MK_SIGNED_UNSIGNED(int8_t, uint8_t); +R123_MK_SIGNED_UNSIGNED(int16_t, uint16_t); +R123_MK_SIGNED_UNSIGNED(int32_t, uint32_t); +R123_MK_SIGNED_UNSIGNED(int64_t, uint64_t); +#if R123_USE_GNU_UINT128 +R123_MK_SIGNED_UNSIGNED(__int128_t, __uint128_t); +#endif +#undef R123_MK_SIGNED_UNSIGNED +#endif + +#if defined(__CUDACC__) || defined(_LIBCPP_HAS_NO_CONSTEXPR) +// Amazing! cuda thinks numeric_limits::max() is a __host__ function, so +// we can't use it in a device function. +// +// The LIBCPP_HAS_NO_CONSTEXP test catches situations where the libc++ +// library thinks that the compiler doesn't support constexpr, but we +// think it does. As a consequence, the library declares +// numeric_limits::max without constexpr. This workaround should only +// affect a narrow range of compiler/library pairings. +// +// In both cases, we find max() by computing ~(unsigned)0 right-shifted +// by is_signed. +template <typename T> +R123_CONSTEXPR R123_STATIC_INLINE R123_CUDA_DEVICE T maxTvalue(){ + typedef typename make_unsigned<T>::type uT; + return (~uT(0)) >> std::numeric_limits<T>::is_signed; + } +#else +template <typename T> +R123_CONSTEXPR R123_STATIC_INLINE T maxTvalue(){ + return std::numeric_limits<T>::max(); +} +#endif +/** @endcond + @} + */ + +//! Return a uniform real value in (0, 1] +/** + @ingroup uniform + Input is a W-bit integer (signed or unsigned). It is cast to + a W-bit unsigned integer, multiplied by Ftype(2^-W) and added to + Ftype(2^(-W-1)). A good compiler should optimize it down to an + int-to-float conversion followed by a multiply and an add, which + might be fused, depending on the architecture. + + If the input is a uniformly distributed integer, and if Ftype + arithmetic follows IEEE754 round-to-nearest rules, then the + result is a uniformly distributed floating point number in (0, 1]. + +- The result is never exactly 0.0. +- The smallest value returned is 2^-(W-1). +- Let M be the number of mantissa bits in Ftype (typically 24 or 53). + - If W>M then the largest value retured is 1.0. + - If W<=M then the largest value returned is Ftype(1.0 - 2^(-W-1)). +*/ +template <typename Ftype, typename Itype> +R123_CUDA_DEVICE R123_STATIC_INLINE Ftype u01(Itype in){ + typedef typename make_unsigned<Itype>::type Utype; + R123_CONSTEXPR Ftype factor = Ftype(1.)/(Ftype(maxTvalue<Utype>()) + Ftype(1.)); + R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor; +#if R123_UNIFORM_FLOAT_STORE + volatile Ftype x = Utype(in)*factor; return x+halffactor; +#else + return Utype(in)*factor + halffactor; +#endif +} + +//! Return a signed value in [-1,1] +/** + @ingroup uniform + The argument is converted to a W-bit signed integer, multiplied by Ftype(2^-(W-1)) and + then added to Ftype(2^-W). A good compiler should optimize + it down to an int-to-float conversion followed by a multiply and + an add, which might be fused, depending on the architecture. + + If the input is a uniformly distributed integer, and if Ftype + arithmetic follows IEEE754 round-to-nearest rules, then the + output is a uniformly distributed floating point number in [-1, 1]. + +- The result is never exactly 0.0. +- The smallest absolute value returned is 2^-W +- Let M be the number of mantissa bits in Ftype. + - If W>M then the largest value retured is 1.0 and the smallest is -1.0. + - If W<=M then the largest value returned is the Ftype(1.0 - 2^-W) + and the smallest value returned is -Ftype(1.0 - 2^-W). +*/ +template <typename Ftype, typename Itype> +R123_CUDA_DEVICE R123_STATIC_INLINE Ftype uneg11(Itype in){ + typedef typename make_signed<Itype>::type Stype; + R123_CONSTEXPR Ftype factor = Ftype(1.)/(Ftype(maxTvalue<Stype>()) + Ftype(1.)); + R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor; +#if R123_UNIFORM_FLOAT_STORE + volatile Ftype x = Stype(in)*factor; return x+halffactor; +#else + return Stype(in)*factor + halffactor; +#endif +} + +//! Return a value in (0,1) chosen from a set of equally spaced fixed-point values +/** + @ingroup uniform + Let: + - W = width of Itype, e.g., 32 or 64, regardless of signedness. + - M = mantissa bits of Ftype, e.g., 24, 53 or 64 + - B = min(M, W) + + Then the 2^(B-1) possible output values are: 2^-B*{1, 3, 5, ..., 2^B - 1} + + The smallest output is: 2^-B + + The largest output is: 1 - 2^-B + + The output is never exactly 0.0, nor 0.5, nor 1.0. + + The 2^(B-1) possible outputs: + - are equally likely, + - are uniformly spaced by 2^-(B-1), + - are balanced around 0.5 +*/ +template <typename Ftype, typename Itype> +R123_CUDA_DEVICE R123_STATIC_INLINE Ftype u01fixedpt(Itype in){ + typedef typename make_unsigned<Itype>::type Utype; + R123_CONSTEXPR int excess = std::numeric_limits<Utype>::digits - std::numeric_limits<Ftype>::digits; + if(excess>=0){ + R123_CONSTEXPR int ex_nowarn = (excess>=0) ? excess : 0; + R123_CONSTEXPR Ftype factor = Ftype(1.)/(Ftype(1.) + Ftype((maxTvalue<Utype>()>>ex_nowarn))); + return (1 | (Utype(in)>>ex_nowarn)) * factor; + }else + return u01<Ftype>(in); +} + +#if R123_USE_CXX11_STD_ARRAY + +//! Apply u01 to every item in an r123array, returning a std::array +/** @ingroup uniform + * Only in C++11 and newer. + * The argument type may be any integer collection with a constexpr static_size member, + * e.g., an r123array or a std::array of an integer type. + */ +template <typename Ftype, typename CollType> +static inline +std::array<Ftype, CollType::static_size> u01all(CollType in) +{ + std::array<Ftype, CollType::static_size> ret; + auto p = ret.begin(); + for(auto e : in){ + *p++ = u01<Ftype>(e); + } + return ret; +} + +//! Apply uneg11 to every item in an r123array, returning a std::array +/** @ingroup uniform + * Only in C++11 and newer. + * The argument type may be any integer collection with a constexpr static_size member, + * e.g., an r123array or a std::array of an integer type. + */ +template <typename Ftype, typename CollType> +static inline +std::array<Ftype, CollType::static_size> uneg11all(CollType in) +{ + std::array<Ftype, CollType::static_size> ret; + auto p = ret.begin(); + for(auto e : in){ + *p++ = uneg11<Ftype>(e); + } + return ret; +} + +//! Apply u01fixedpt to every item in an r123array, returning a std::array +/** @ingroup uniform + * Only in C++11 and newer. + * The argument type may be any integer collection with a constexpr static_size member, + * e.g., an r123array or a std::array of an integer type. +*/ +template <typename Ftype, typename CollType> +static inline +std::array<Ftype, CollType::static_size> u01fixedptall(CollType in) +{ + std::array<Ftype, CollType::static_size> ret; + auto p = ret.begin(); + for(auto e : in){ + *p++ = u01fixedpt<Ftype>(e); + } + return ret; +} +#endif // __cplusplus >= 201103L + +} // namespace r123 + +#endif + diff --git a/tests/BUILDVC.BAT b/tests/BUILDVC.BAT @@ -0,0 +1,50 @@ +:: Call this with either x86 (for 32bit compile on a 32bit machine), +:: amd64 (if you want to do a 64bit compile on a 64bit machine), +:: or x86_amd64 (if you want to compile for amd64 on an x86) +:: With no argument, will default to amd64 on Win64 and x86 otherwise. +:: Call this with the argument "run" if you want to only run the +:: previously compiled executables. +@echo off +setlocal +if not "%1"=="run" goto :Default +set CC=echo +set CFLAGS= +goto :Loop + +:Default +if "%~1"=="" goto :Guess +set NEWBUILDVC=%1 +goto :Next + +:Guess +set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0 +REG.exe Query %RegQry% > hwdesc.o +FIND /i "x86" < hwdesc.o > hwcheck.o +if %errorlevel% == 0 ( +set NEWBUILDVC=x86 +) else ( +set NEWBUILDVC=amd64 +) + +:Next +if "%BUILDVC%"=="%NEWBUILDVC%" goto :Continue +if NOT DEFINED VCBAT set VCBAT="c:\Program Files (x86)\Microsoft Visual Studio 10.0\vc\vcvarsall.bat" +call %VCBAT% %NEWBUILDVC% +if errorlevel 1 exit /b 1 +set BUILDVC=%NEWBUILDVC% + +:Continue +:: /Zi for debug. /favor:INTEL64 is ignored for 32bit compiles. +if NOT DEFINED CFLAGS set CFLAGS=/DR123_NO_SINCOS=1 /I..\include /W3 /Ox /EHs /nologo /favor:INTEL64 +set CC=cl +echo Using %VCBAT% +echo Building for %BUILDVC% with %CC% %CFLAGS% + +:Loop +set BUILDFILES= ( kat_c.c kat_cpp.cpp pi_aes.cpp pi_capi.c pi_cppapi.cpp pi_microurng.cpp simple.c simplepp.cpp time_serial.c time_boxmuller.cpp timers.cpp ut_Engine.cpp ut_M128.cpp ut_ReinterpretCtr.cpp ut_aes.cpp ut_ars.c ut_carray.cpp ut_features.cpp ut_uniform.cpp ) +FOR %%A IN %BUILDFILES% DO ( + %CC% %CFLAGS% %%A + if errorlevel 1 exit /b 1 + %%~nA + if errorlevel 1 exit /b 1 ) +endlocal diff --git a/tests/BUILDVC11.BAT b/tests/BUILDVC11.BAT @@ -0,0 +1,6 @@ +rem /DR123_USE_CXX11=1 will not work because VS2012 is not fully C++11 compliant yet. +setlocal +set CFLAGS=/I..\include /W3 /Ox /EHs /nologo /favor:INTEL64 +set VCBAT="c:\Program Files (x86)\Microsoft Visual Studio 11.0\vc\vcvarsall.bat" +call BUILDVC.bat %1 +endlocal diff --git a/tests/GNUmakefile b/tests/GNUmakefile @@ -0,0 +1,172 @@ +no_target_specified: runcore + @echo + @echo The default make rule is equivalent to \'make runcore\' which runs only the most basic tests. + @echo The following \'meta-targets\' are available: + @echo " " $(meta_targets) + @echo Here is the complete list of individual program targets: + @echo " " $(all_primary_targets) + @echo Prepend \'run\' to any of the program targets or metatargets + @echo to run the binary and check for a zero exit status. + @echo Adding force=1 on the command line causes all targets to be considered out-of-date. +.PHONY: no_target_specified + +# metatargets are variables which get mapped by METATARGET_template +meta_targets:=kat core aesni timing c cpp gsl thread cuda opencl metal ut + +# Platform metatargets: each one typically has specific requirements in the build environment. +# c is C99 (will work in MSVC), cpp is C++98, gsl requires the GNU Scientific Library +# (specifically, the gsl-config program in the PATH), thread requires POSIX threads, +# CUDA requires NVIDIA CUDA 3.x or newer, OpenCL requires OpenCL includes & libraries +# (e.g. AMD APP SDK, NVIDIA SDK) +c:=kat_c ut_ars time_serial +cpp:=kat_cpp ut_carray ut_M128 ut_features ut_ReinterpretCtr ut_Engine ut_aes timers time_boxmuller ut_ua ut_uniform +gsl:=ut_gsl +thread:=time_thread +cuda:=time_cuda kat_cuda time_boxmuller_cuda +opencl:=time_opencl kat_opencl +metal:=kat_metal + +# Convenience metatargets: these are to help developers test functional subsets across platforms +kat:=kat_c kat_cpp +core:=$(c) $(cpp) +aesni:=ut_aes ut_ars +timing:=timers time_serial time_thread +# N.B. ut doesn't include ut_gsl, ut_ars or ut_aes +ut:=ut_carray ut_Engine ut_features ut_M128 ut_ReinterpretCtr ut_ua ut_uniform ut_uniform_IEEEkat + +$(gsl) : override LDLIBS += `gsl-config --libs` +$(gsl) : override CFLAGS += `gsl-config --cflags` + +$(opencl) : % : %_kernel.i +# Or try this if we USE_GENCL in kat_opencl.c +#$(opencl) : override CPPFLAGS += -DSRCDIR=\"$(dir $(abspath $<)).\" + +ifeq ($(shell uname),Darwin) +$(opencl) : override LDLIBS+=-framework OpenCL +else +$(opencl) : override LDLIBS+=-lOpenCL +endif +$(opencl) : override CFLAGS+=-I. +# Note, the Intel OpenCL SDK (1.5) has unresolved C++ symbols in its +# libOpenCL.so Even though 'main' is a C program, you may need to link +# it with a C++ compiler-driver, e.g., g++. Since this Makefile does +# compile-and-link in one step, use something like: +# $(opencl) : CC=g++ -xc +# which will invoke the g++ compiler-driver, but will treat the +# program as C rather than C++. + +# N.B. gcc -pthread (without the -l) on linux at compile time also +# adds -D_REENTRANT. Unfortunately -pthread is unrecognized by +# SunPRO. Posix says that -lpthread is portable (as if anyone cares +# what Posix says), and it seems to work in all the environments we've +# tested. Gcc's features.h says that _THREAD_SAFE is "often used by +# other systems" as a synonym for _REENTRANT. Cross your fingers... +$(thread) : override LDLIBS+=-lpthread +$(thread) : override CPPFLAGS+=-D_REENTRANT=1 -D_THREAD_SAFE=1 + +$(metal) : % : %_kernel.metallib +$(metal) : override LDLIBS+=-framework Metal -framework Foundation -framework CoreGraphics + +all_primary_targets += $(addsuffix _kernel.i, $(opencl)) +all_primary_targets += $(addsuffix _kernel.metallib, $(metal)) +all_primary_targets += $(addsuffix _kernel.air, $(metal)) + +################################################ +# Generic boilerplate from here down: +vpath %.c $(srcdir/) +vpath %.cpp $(srcdir/) +vpath %.cu $(srcdir/) +vpath %.ocl $(srcdir/) +vpath %.metal $(srcdir/) + +define METATARGET_template +.PHONY: $(1) +$(1) : $(filter-out $(SKIP_TARGETS), $($(1))) +.PHONY: run$(1) +run$(1) : $(addprefix run, $(filter-out $(SKIP_TARGETS), $($(1)))) +all_primary_targets += $($(1)) +endef + +$(foreach T,$(meta_targets), $(eval $(call METATARGET_template,$(T)))) + +# sort also does 'uniq' +all_primary_targets:=$(sort $(all_primary_targets)) + +INC=$(srcdir/)../include +override CPPFLAGS += -I$(INC) + +ifndef NVCC +NVCC:=nvcc +endif +# The rngs are *very* slow without optimization. In the simplest case, +# where the user just calls 'make', we don't want them to see terrible +# performance. Unfortunately, this might surprise someone +# who says, e.g., make CPPFLAGS=-O0. Oh well... +ifndef CFLAGS +CFLAGS:=-O +endif +ifndef CXXFLAGS +CXXFLAGS:=-O +endif + +%.i : %.ocl + CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" $(srcdir/)./gencl.sh $< > $@ + +% : %.cu + $(NVCC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@ + +% : %.c + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@ + +% : %.cpp + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@ + +% : %.m + $(CC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@ + +%.air : %.metal + xcrun --sdk macosx metal $(CPPFLAGS) -c $< -o $@ + +%.metallib : %.air + xcrun --sdk macosx metallib $< -o $@ + +run% : % + ./$^ $(RUN_ARGS) + +# In lieu of autodepends, just say that all the compilation targets depend on all the headers. +hdrs:=$(wildcard $(srcdir/)*.h $(srcdir/)gsl/*.c $(INC)/Random123/*.h $(INC)/Random123/*.hpp $(INC)/Random123/*/*.h $(INC)/Random123/*/*.hpp) +misc:=$(wildcard $(srcdir/)*.cu $(srcdir/)*.ocl) +$(all_primary_targets) : $(hdrs) +$(misc) : $(hdrs) + +# If you put force=y on the command line, then $(all_primary_targets) will be +# depend on FORCE, and hence will not be up-to-date. +ifdef force +$(all_primary_targets) : FORCE +FORCE: +endif + +.PHONY : echo_build_commands +echo_build_commands: + make -n force=1 $(all_primary_targets) | grep -v 'is up to date' + +.PHONY : clean veryclean +clean: + rm -f $(all_primary_targets) + +veryclean: + rm -f $(all_primary_targets) *.o \#* *~ *.pdb *.exe *.obj *.ilk *.suo + +.PHONY : install + +# N.B. normally these are exported by ../GNUmakefile +prefix?=/usr/local +datarootdir?=$(prefix)/share +docdir?=$(datarootdir)/doc/Random123 + +# Are 'tests/' "documentation" or "architecture independent data files"? +# If the former, then they belong in $(docdir)/tests (aka /usr/local/share/doc/Random123/tests) +# If the latter, then they belong in $(datarootdir)/Random123/tests (aka /usr/local/share/Random123/tests) +install: + mkdir -p $(DESTDIR)$(docdir)/tests + cp README GNUmakefile BUILDVC* *kat_vectors* *.sh *.c *.h *.cpp *.cu *.metal *.m *.ocl $(DESTDIR)$(docdir)/tests diff --git a/tests/README b/tests/README @@ -0,0 +1,145 @@ +This file is examples/README and is also linked to from the doxygen main page. + +/** +@page TestsREADME Tests and Benchmarks + +The tests/ directory contains tests and timing +harnesses for the components of the Random123 library. + +<b>See @ref ExamplesREADME "../examples" for examples</b> of how to +use the Random123 APIs in different contexts. + +The code in this directory (tests/) is not exemplary because it +sacrifices readability to support many different generators (philox, +threefry, ARS), programming models (C, C++, CUDA, OpenCL, Metal), +compilers (gcc, clang, icc), hardware (Intel, ARM, NVidia), and +operating systems (Linux, Windows, OSX). + +@section building Compiling and Running the code + +Installing and using Random123 requires only the use +of the header files, and has no prerequisites other than +a reasonable C99 or C++98 compiler. + +With a modern GNU make (3.80 or newer), building and running the core tests +and examples can be as easy as running gmake with no arguments. +Note, though, that the provided tests/GNUmakefile intentionally avoids setting +any of the standard make variables: CC, CXX, CPPFLAGS, CFLAGS, +CXXFLAGS, TARGET_ARCH, LDFLAGS, LOADLIBES, LDLIBS. GNU make +will inherit settings for these variables from the environment, +or they may be set on the command line. If none are set, +compilation will proceed using system-wide default flags, generally +without advanced optimization, architectural tuning, warnings, or other +common options. + +Before putting the Random123 library to use in an application, +it is important to test it using the same compiler flags and +features that the application will use. In other words, +the conventional make variables should be set +the same way when testing the library as they will be set when the +library is actually compiled into your application. +Something like: +@code +gmake CFLAGS="-std=c99" CXXFLAGS="-std=c++0x" CPPFLAGS="/alternate/location/include -O3 -Wall -Wstrict-aliasing=2" TARGET_ARCH="-march=native" +@endcode +would confirm that all is well with optimization on, and output targeted at +an architecture with the same capabilities as the machine running the compilation. + +Very old versions of GNU make (pre-2002) or non-GNU +make will not work with tests/GNUmakefile.. Lacking a suitably modern GNU make, +our advice is to invoke the +C or C++ compiler directly on the source files in the tests/ directory. +The file tests/BUILD.LOG contains a list of sample build commands. They +will almost certainly need to be adapted to the target system. +For Windows users, BUILDVC.BAT invokes the Microsoft +Visual Studio compiler. Edit it as needed for your platform. + + +@section tests Tests + +It is recommended that Random123 be tested <b> on the target system, +with the target compiler, intended optimization levels, options, +target architectures, etc.</b> +before relying it. The library +uses architecture- and compiler-specific intrinsics, +features and assembly language. We have seen cases where +one compiler (open64 version 4.2.4) masquerades as another compiler (it defines __GNUC__) accepts extensions +specific to the other compiler (__uint128_t) +without error or warning, and then silently produces incorrect code. +The only way to guard against this kind of misbehavior is to +compile and run the tests with the compiler and options that you intend to use and +the platform that you intend to run on. + +@subsection kat Known Answer Tests + +Testing that your compiled code computes the same "Known Answers" as the +reference implementation which has been subjected to the Crush batteries of +statistical tests is critically important. + +The file \c tests/kat_vectors contains a few dozen "Known Answer +Test" vectors, i.e., tuples of (method, counter, key, answer). The +source file katc.c is incorporated into kat_c.c (C), +kat_cpp.cpp (C++), kat_cuda.cu (CUDA) and kat_opencl.c +(OpenCL), which are compiled into kat_c, kat_cpp, kat_cuda +and kat_opencl, respectively. Each of these will read kat_vectors +and verify that the compiled code obtains the same "known answers". + +The kat vectors are not language-specific. Implementations of CBRNGs in +other languages could also be validated against \c kat_vectors. The +kat vectors are also byte-order independent. In other +words, the CBRNGs in the library should produce the same numerical +results on little-endian and big-endian hardware, but this behavior +is largely untested. + +@subsection ut Unit Tests + +tests/ also contains tests of specific components of the library. While not +exhaustive, these tests verify that a variety of invariants are satisfied +by the public methods (e.g., that incr(N) is the same as incr() N times). They +also serve to verify some of the compile-time feature-test logic which, if incorrect can +lead to mysterious errors (e.g., is it necessary to <c>#include <smmintrin.h></c>). +Unit tests include: + +<ul> +<li> ut_features - verifies compile-time feature-test logic. +<li> ut_carray - verifies the capabilities of the @ref arrayNxW "r123arrayNxW" types. +<li> ut_M128 - verifies the capabilities of the r123m128i type (only when SSE2 is available). +<li> ut_ReinterpretCtr - verifies the r123::ReinterpretCtr wrapper template. +<li> ut_Engine - verifies the capabilities of the r123::Engine wrapper template. +<li> ut_aes - verifies that the @ref AESNI "AESNI" cbrngs match known answers from FIPS-197. +<li> ut_gsl - tests the @ref GSL_CBRNG adapter <b>Requires the GNU Scientific Library</b>. +</ul> + +@section timers Measuring performance + +We include some timing harnesses that can be used to measure +the performance of these CBRNGs on various platforms. They report aggregate throughput +in GB/sec: a direct +measure of performance, but one that depends on clock speed +and number of cores being used. They also report cpB (cycles-per-byte) +if they are invoked with an environment variable. For example, +<pre> +<code> + env TIME_SERIAL_CPU_GHZ=3.2 ./time_serial +</code> +</pre> +will report cpB assuming a 3.2GHz clock. + +<ul> +<li> time_serial - uses the C API and reports performance for a +single core. +<li> timers - uses the C++ API, and is the only tool that reports +AESNI1xm128i and ARS1xm128i performance (if your CPU supports the AES-NI instruction +extensions). +<li> time_thread - uses the C API and pthreads to report +multithreaded performance. Uses TIME_THREAD_NTHREADS (or 12 if unset) threads. +<li> time_cuda - uses the C API within NVIDIA CUDA to run on NVIDIA GPUs. +<li> time_opencl - uses the C API within OpenCL to run on GPUs or CPUs. +</ul> + +time_serial, time_thread, time_cuda, time_opencl all use a common +kernel defined in time_random123.h. They all use various +util_* header files for utility functions and platform-related +boilerplate (also used by the pi_* examples). + +*/ diff --git a/tests/gencl.sh b/tests/gencl.sh @@ -0,0 +1 @@ +../examples/gencl.sh +\ No newline at end of file diff --git a/tests/kat.h b/tests/kat.h @@ -0,0 +1,70 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __katdoth__ +#define __katdoth__ + +#include <Random123/philox.h> +#include <Random123/threefry.h> +#include <Random123/ars.h> +#include <Random123/aes.h> + +enum method_e{ +#define RNGNxW_TPL(base, N, W) base##N##x##W##_e, +#include "rngNxW.h" +#undef RNGNxW_TPL + last +}; + +#define RNGNxW_TPL(base, N, W) \ + typedef struct { \ + base##N##x##W##_ctr_t ctr; \ + base##N##x##W##_ukey_t ukey; \ + base##N##x##W##_ctr_t expected; \ + base##N##x##W##_ctr_t computed; \ + } base##N##x##W##_kat; +#include "rngNxW.h" +#undef RNGNxW_TPL + +typedef struct{ + enum method_e method; + unsigned nrounds; + union{ +#define RNGNxW_TPL(base, N, W) base##N##x##W##_kat base##N##x##W##_data; +#include "rngNxW.h" +#undef RNGNxW_TPL + /* Sigh... For those platforms that lack uint64_t, carve + out 128 bytes for the counter, key, expected, and computed. */ + char justbytes[128]; + }u; +} kat_instance; + +#endif diff --git a/tests/kat_c.c b/tests/kat_c.c @@ -0,0 +1,41 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "kat_main.h" + +#define KAT_KERNEL +#define KAT_GLOBAL +#include "kat_dev_execute.h" + +void host_execute_tests(kat_instance *tests, unsigned ntests){ + (void)ntests; /* unused */ + dev_execute_tests(tests); +} diff --git a/tests/kat_cpp.cpp b/tests/kat_cpp.cpp @@ -0,0 +1,222 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "kat_main.h" + +// With C++, it's a little trickier to create the mapping from +// method-name/round-count to functions +// because the round-counts are template arguments that have to be +// specified at compile-time. Thus, we can't just do #define RNGNxW_TPL +// and #include "rngNxW.h". We have to build a static map from: +// pair<generator, rounds> to functions that apply the right generator +// with the right number of rounds. + +#ifdef _MSC_FULL_VER +// Engines have multiple copy constructors, quite legal C++, disable MSVC complaint +#pragma warning (disable : 4521) +#endif + +#include <map> +#include <cstring> +#include <utility> +#include <stdexcept> +#include <Random123/MicroURNG.hpp> +#include <Random123/conventional/Engine.hpp> + +using namespace std; + +typedef map<pair<method_e, unsigned>, void (*)(kat_instance *)> genmap_t; +genmap_t genmap; + +void dev_execute_tests(kat_instance *tests, unsigned ntests){ + unsigned i; + for(i=0; i<ntests; ++i){ + kat_instance *ti = &tests[i]; + genmap_t::iterator p = genmap.find(make_pair(ti->method, ti->nrounds)); + if(p == genmap.end()) + throw std::runtime_error("pair<generator, nrounds> not in map. You probably need to add more genmap entries in kat_cpp.cpp"); + + p->second(ti); + // TODO: check that the corresponding Engine and MicroURNG + // return the same values. Note that we have ut_Engine and + // ut_MicroURNG, which check basic functionality, but they + // don't have the breadth of the kat_vectors. + } +} + +static int murng_reported; +static int engine_reported; + +template <typename GEN> +void do_test(kat_instance* ti){ + GEN g; + struct gdata{ + typename GEN::ctr_type ctr; + typename GEN::ukey_type ukey; + typename GEN::ctr_type expected; + typename GEN::ctr_type computed; + }; + gdata data; + // use memcpy. A reinterpret_cast would violate strict aliasing. + memcpy(&data, &ti->u, sizeof(data)); + data.computed = g(data.ctr, data.ukey); + + // Before we return, let's make sure that MicroURNG<GEN,1> and + // Engine<GEN> work as expeccted. This doesn't really "fit" the + // execution model of kat.c, which just expects us to fill in + // ti->u.computed, so we report the error by failing to write back + // the computed data item in the (hopefully unlikely) event that + // things don't match up as expected. + int errs = 0; + + // MicroURNG: throws if the top 32 bits of the high word of ctr + // are non-zero. + typedef typename GEN::ctr_type::value_type value_type; + + value_type hibits = data.ctr[data.ctr.size()-1]>>( std::numeric_limits<value_type>::digits - 32 ); + try{ + r123::MicroURNG<GEN> urng(data.ctr, data.ukey); + if(hibits) + errs++; // Should have thrown. + for (size_t i = 0; i < data.expected.size(); i++) { + size_t j = data.expected.size() - i - 1; + if (data.expected[j] != urng()) { + errs++; + } + } + }catch(std::runtime_error& /*ignored*/){ + // A runtime_error is expected from the constructor + // when hibit is set. + if(!hibits) + errs++; + } + if(errs && (murng_reported++ == 0)) + cerr << "Error in MicroURNG<GEN>, will appear as \"computed\" value of zero in error summary\n"; + + // Engine + // N.B. exercising discard() arguably belongs in ut_Engine.cpp + typedef r123::Engine<GEN> Etype; + typedef typename GEN::ctr_type::value_type value_type; + Etype e(data.ukey); + typename GEN::ctr_type c = data.ctr; + value_type c0; + if( c[0] > 0 ){ + c0 = c[0]-1; + }else{ + // N.B. Assume that if c[0] is 0, then so are all the + // others. Arrange to "roll over" to {0,..,0} on the first + // counter-increment. Alternatively, we could just + // skip the test for this case... + c.fill(std::numeric_limits<value_type>::max()); + c0 = c[0]; + } + c[0] /= 3; + e.setcounter(c, 0); + if( c0 > c[0] ){ + // skip one value by calling e() + (void)e(); + if (c0 > c[0]+1) { + // skip many values by calling discard() + R123_ULONG_LONG ndiscard = (c0 - c[0] - 1); + // Take care not to overflow the long long + if( ndiscard >= std::numeric_limits<R123_ULONG_LONG>::max() / c.size() ){ + for(size_t j=0; j<c.size(); ++j){ + e.discard(ndiscard); + } + }else{ + ndiscard *= c.size(); + e.discard(ndiscard); + } + } + // skip a few more by calling e(). + for (size_t i = 1; i < c.size(); i++) { + (void) e(); + } + // we should be back to where we started... + } + for (size_t i = 0; i < data.expected.size(); i++) { + value_type val = e(); + size_t j = data.expected.size() - i - 1; + if (data.expected[j] != val) { + cerr << hex; + cerr << "Engine check, j=" << j << " expected: " << data.expected[j] << " val: " << val << "\n"; + errs++; + if(engine_reported++ == 0) + cerr << "Error in Engine<GEN, 1>, will appear as \"computed\" value of zero in error summary\n"; + } + } + + // Signal an error to the caller by *not* copying back + // the computed data object into the ti + if(errs == 0) + memcpy(&ti->u, &data, sizeof(data)); +} + +void host_execute_tests(kat_instance *tests, unsigned ntests){ + // In C++1x, this could be staticly declared with an initializer list. + genmap[make_pair(threefry2x32_e, 13u)] = do_test<r123::Threefry2x32_R<13> >; + genmap[make_pair(threefry2x32_e, 20u)] = do_test<r123::Threefry2x32_R<20> >; + genmap[make_pair(threefry2x32_e, 32u)] = do_test<r123::Threefry2x32_R<32> >; +#if R123_USE_64BIT + genmap[make_pair(threefry2x64_e, 13u)] = do_test<r123::Threefry2x64_R<13> >; + genmap[make_pair(threefry2x64_e, 20u)] = do_test<r123::Threefry2x64_R<20> >; + genmap[make_pair(threefry2x64_e, 32u)] = do_test<r123::Threefry2x64_R<32> >; +#endif + + genmap[make_pair(threefry4x32_e, 13u)] = do_test<r123::Threefry4x32_R<13> >; + genmap[make_pair(threefry4x32_e, 20u)] = do_test<r123::Threefry4x32_R<20> >; + genmap[make_pair(threefry4x32_e, 72u)] = do_test<r123::Threefry4x32_R<72> >; +#if R123_USE_64BIT + genmap[make_pair(threefry4x64_e, 13u)] = do_test<r123::Threefry4x64_R<13> >; + genmap[make_pair(threefry4x64_e, 20u)] = do_test<r123::Threefry4x64_R<20> >; + genmap[make_pair(threefry4x64_e, 72u)] = do_test<r123::Threefry4x64_R<72> >; +#endif + + genmap[make_pair(philox2x32_e, 7u)] = do_test<r123::Philox2x32_R<7> >; + genmap[make_pair(philox2x32_e, 10u)] = do_test<r123::Philox2x32_R<10> >; + genmap[make_pair(philox4x32_e, 7u)] = do_test<r123::Philox4x32_R<7> >; + genmap[make_pair(philox4x32_e, 10u)] = do_test<r123::Philox4x32_R<10> >; + +#if R123_USE_PHILOX_64BIT + genmap[make_pair(philox2x64_e, 7u)] = do_test<r123::Philox2x64_R<7> >; + genmap[make_pair(philox2x64_e, 10u)] = do_test<r123::Philox2x64_R<10> >; + genmap[make_pair(philox4x64_e, 7u)] = do_test<r123::Philox4x64_R<7> >; + genmap[make_pair(philox4x64_e, 10u)] = do_test<r123::Philox4x64_R<10> >; +#endif + +#if R123_USE_AES_NI + genmap[make_pair(aesni4x32_e, 10u)] = do_test<r123::AESNI4x32 >; + genmap[make_pair(ars4x32_e, 7u)] = do_test<r123::ARS4x32_R<7> >; + genmap[make_pair(ars4x32_e, 10u)] = do_test<r123::ARS4x32_R<10> >; +#endif + + dev_execute_tests(tests, ntests); +} diff --git a/tests/kat_cuda.cu b/tests/kat_cuda.cu @@ -0,0 +1,62 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "util_cuda.h" +#include "kat_main.h" + +#define KAT_KERNEL __global__ +#define KAT_GLOBAL +#include "kat_dev_execute.h" + +void host_execute_tests(kat_instance *tests_host, unsigned ntests){ + CUDAInfo *infop; + kat_instance *tests_dev; + size_t tests_sz; + + infop = cuda_init(NULL); + + tests_sz = sizeof(tests_host[0]) * (ntests+1); // +1 for sentinel test with method==last + CHECKCALL(cudaMalloc(&tests_dev, tests_sz)); + CHECKCALL(cudaMemcpy(tests_dev, tests_host, tests_sz, cudaMemcpyHostToDevice)); + + printf("starting %u tests on 1 blocks with 1 threads/block\n", ntests); + fflush(stdout); + + // TO DO: call this with parallelism, <<<infop->blocks_per_grid, infop->threads_per_block>>> + // and then insure that each of the threads got the same result. + dev_execute_tests<<<1, 1>>>(tests_dev); + + CHECKCALL(cudaDeviceSynchronize()); + CHECKCALL(cudaMemcpy(tests_host, tests_dev, tests_sz, cudaMemcpyDeviceToHost)); + CHECKCALL(cudaFree(tests_dev)); + cuda_done(infop); +} + diff --git a/tests/kat_dev_execute.h b/tests/kat_dev_execute.h @@ -0,0 +1,51 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "kat.h" +#ifndef KAT_METAL_BUFFER0 +#define KAT_METAL_BUFFER0 /* non-empty only when compiling Metal kernel */ +#endif +KAT_KERNEL void dev_execute_tests(KAT_GLOBAL kat_instance *tests KAT_METAL_BUFFER0){ + size_t i; + int done = 0; + for(i=0; !done; ++i){ + KAT_GLOBAL kat_instance *ti = &tests[i]; + switch(tests[i].method){ + //case philox2x32_e: ti->u.philox2x32_data.computed = philox2x32_R(ti->rounds, ti->u.philox2x32_data.ctr, ti->u.philox2x32_data.key); +#define RNGNxW_TPL(base, N, W) case base##N##x##W##_e: ti->u.base##N##x##W##_data.computed = base##N##x##W##_R(ti->nrounds, ti->u.base##N##x##W##_data.ctr, base##N##x##W##keyinit(ti->u.base##N##x##W##_data.ukey)); break; +#include "rngNxW.h" +#undef RNGNxW_TPL + case last: + done = 1; + break; + } + } +} diff --git a/tests/kat_main.h b/tests/kat_main.h @@ -0,0 +1,306 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* Known Answer Test */ + +/* We use the same source files to implement the Known Answer Test + (KAT) in C, C++, OpenCL and CUDA. Supporting all four environments + with a single source file, and getting it all to work with 'make' + is a bit involved: + + There are five "top-level" files: + kat_c.c + kat_cpp.cpp + kat_cuda.c + kat_opencl.c + kat_metal.m + + These correspond to make targets: kat_c, kat_cpp, kat_cuda, + kat_opencl and kat_metal. + + Those files are relatively simple. First, they #include this file, + which contains all the machinery for reading test vectors, + complaining about errors, etc.. Then they implement the function + host_execute_tests() in the appropriate environment. host_execute_tests + looks very different in C/C++/CUDA/OpenCL/Metal. + + host_execute_tests contrives to call/launch "dev_execute_tests" + on the device. Except for a few environment-specific keywords, + (e.g., __global, __kernel), which are #defined in kat_XXX.c, + dev_execute_tests is obtained by including a common source file: + #include <kat_dev_execute.h> + + One final complication: in order to fully "bake" the source code + into the binary at compile-time, dev_execute_tests for opencl is implemented in + kat_opencl_kernel.ocl, which is processed by gencl.sh into + kat_opencl_kernel.i, which is thein #include-ed by kat_opencl.c. + +*/ +#include "util.h" +#include "kat.h" + +#define LINESIZE 1024 + +int have_aesni = 0; +int verbose = 0; +int debug = 0; +unsigned nfailed = 0; +const char *progname; + +extern void host_execute_tests(kat_instance *tests, unsigned ntests); + +/* A little hack to keep track of the test vectors that we don't know how to deal with: */ +int nunknowns = 0; +#define MAXUNKNOWNS 20 +const char *unknown_names[MAXUNKNOWNS]; +int unknown_counts[MAXUNKNOWNS]; + +void register_unknown(const char *name){ + int i; + for(i=0; i<nunknowns; ++i){ + if( strcmp(name, unknown_names[i]) == 0 ){ + unknown_counts[i]++; + return; + } + } + if( i >= MAXUNKNOWNS ){ + fprintf(stderr, "Too many unknown rng types. Bye.\n"); + exit(1); + } + nunknowns++; + unknown_names[i] = ntcsdup(name); + unknown_counts[i] = 1; +} + +void report_unknowns(){ + int i; + for(i=0; i<nunknowns; ++i){ + printf("%d test vectors of type %s skipped\n", unknown_counts[i], unknown_names[i]); + } +} + +/* read_<GEN>NxW */ +#define RNGNxW_TPL(base, N, W) \ +int read_##base##N##x##W(const char *line, kat_instance* tinst){ \ + size_t i; \ + int nchar; \ + const char *p = line; \ + char *newp; \ + size_t nkey = sizeof(tinst->u.base##N##x##W##_data.ukey.v)/sizeof(tinst->u.base##N##x##W##_data.ukey.v[0]); \ + tinst->method = base##N##x##W##_e; \ + sscanf(p, "%u%n", &tinst->nrounds, &nchar); \ + p += nchar; \ + for(i=0; i<N; ++i){ \ + tinst->u.base##N##x##W##_data.ctr.v[i] = strtou##W(p, &newp, 16); \ + p = newp; \ + } \ + for(i=0; i<nkey; ++i){ \ + tinst->u.base##N##x##W##_data.ukey.v[i] = strtou##W(p, &newp, 16); \ + p = newp; \ + } \ + for(i=0; i<N; ++i){ \ + tinst->u.base##N##x##W##_data.expected.v[i] = strtou##W(p, &newp, 16); \ + p = newp; \ + } \ + /* set the computed to 0xca. If the test fails to set computed, we'll see cacacaca in the FAILURE notices */ \ + memset(tinst->u.base##N##x##W##_data.computed.v, 0xca, sizeof(tinst->u.base##N##x##W##_data.computed.v)); \ + return 1; \ +} +#include "rngNxW.h" +#undef RNGNxW_TPL + +/* readtest: dispatch to one of the read_<GEN>NxW functions */ +static int readtest(const char *line, kat_instance* tinst){ + int nchar; + char name[LINESIZE]; + if( line[0] == '#') return 0; + sscanf(line, "%s%n", name, &nchar); + if(!have_aesni){ + /* skip any tests that require AESNI */ + if(strncmp(name, "aes", 3)==0 || + strncmp(name, "ars", 3)==0){ + register_unknown(name); + return 0; + } + } +#define RNGNxW_TPL(base, N, W) if(strcmp(name, #base #N "x" #W) == 0) return read_##base##N##x##W(line+nchar, tinst); +#include "rngNxW.h" +#undef RNGNxW_TPL + + register_unknown(name); + return 0; +} + +#define RNGNxW_TPL(base, N, W) \ +void report_##base##N##x##W##error(const kat_instance *ti){ \ + size_t i; \ + size_t nkey = sizeof(ti->u.base##N##x##W##_data.ukey.v)/sizeof(ti->u.base##N##x##W##_data.ukey.v[0]); \ + fprintf(stderr, "FAIL: expected: "); \ + fprintf(stderr, #base #N "x" #W " %d", ti->nrounds); \ + for(i=0; i<N; ++i){ \ + fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ctr.v[i]); \ + } \ + for(i=0; i<nkey; ++i){ \ + fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ukey.v[i]); \ + } \ + for(i=0; i<N; ++i){ \ + fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.expected.v[i]); \ + } \ + fprintf(stderr, "\n"); \ + \ + fprintf(stderr, "FAIL: computed: "); \ + fprintf(stderr, #base #N "x" #W " %d", ti->nrounds); \ + for(i=0; i<N; ++i){ \ + fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ctr.v[i]); \ + } \ + for(i=0; i<nkey; ++i){ \ + fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ukey.v[i]); \ + } \ + for(i=0; i<N; ++i){ \ + fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.computed.v[i]); \ + } \ + fprintf(stderr, "\n"); \ + nfailed++; \ +} +#include "rngNxW.h" +#undef RNGNxW_TPL + +// dispatch to one of the report_<GEN>NxW() functions +void analyze_tests(const kat_instance *tests, unsigned ntests){ + unsigned i; + char zeros[512] = {0}; + for(i=0; i<ntests; ++i){ + const kat_instance *ti = &tests[i]; + switch(tests[i].method){ +#define RNGNxW_TPL(base, N, W) case base##N##x##W##_e: \ + if (memcmp(zeros, ti->u.base##N##x##W##_data.expected.v, N*W/8)==0){ \ + fprintf(stderr, "kat expected all zeros? Something is wrong with the test harness!\n"); \ + nfailed++; \ + } \ + if (memcmp(ti->u.base##N##x##W##_data.computed.v, ti->u.base##N##x##W##_data.expected.v, N*W/8)) \ + report_##base##N##x##W##error(ti); \ + break; +#include "rngNxW.h" +#undef RNGNxW_TPL + case last: ; + } + } +} + +#define NTESTS 1000 + +int main(int argc, char **argv){ + kat_instance *tests; + unsigned t, ntests = NTESTS; + char linebuf[LINESIZE]; + FILE *inpfile; + const char *p; + const char *inname; + char filename[LINESIZE]; + + progname = argv[0]; + + /* If there's an argument, open that file. + else if getenv("srcdir") is non-empty open getenv("srcdir")/kat_vectors + else open "./kat_vectors" */ + if( argc > 1 ) + inname = argv[1]; + else{ + const char *e = getenv("srcdir"); + if(!e) + e = "."; + sprintf(filename, "%s/kat_vectors", e); + inname = filename; + } + + if (strcmp(inname, "-") == 0) { + inpfile = stdin; + } else { + inpfile = fopen(inname, "r"); + if (inpfile == NULL) { + fprintf(stderr, "%s: error opening input file %s for reading: %s\n", + progname, inname, strerror(errno)); + exit(1); + } + } + if ((p = getenv("KATC_VERBOSE")) != NULL) { + verbose = atoi(p); + } + if ((p = getenv("KATC_DEBUG")) != NULL) { + debug = atoi(p); + } + +#if R123_USE_AES_NI + have_aesni = haveAESNI(); +#else + have_aesni = 0; +#endif + + tests = (kat_instance *) malloc(sizeof(tests[0])*ntests); + if (tests == NULL) { + fprintf(stderr, "Could not allocate %lu bytes for tests\n", + (unsigned long) ntests); + exit(1); + } + t = 0; + while (fgets(linebuf, sizeof linebuf, inpfile) != NULL) { + if( t==ntests ){ + ntests *= 2; + tests = (kat_instance *)realloc(tests, sizeof(tests[0])*ntests); + if (tests == NULL) { + fprintf(stderr, "Could not grow tests to %lu bytes\n", + (unsigned long) ntests); + exit(1); + } + } + if( readtest(linebuf, &tests[t]) ) + ++t; + } + if(t==ntests){ + fprintf(stderr, "No more space for tests? Recompile with a larger NTESTS\n"); + exit(1); + } + tests[t].method = last; // N.B *not* t++ - the 'ntests' value passed to host_execute_tests does not count the 'last' one. + + report_unknowns(); + printf("Perform %lu tests.\n", (unsigned long)t); + host_execute_tests(tests, t); + + analyze_tests(tests, t); + free(tests); + if(nfailed != 0){ + printf("FAILED %u out of %u\n", nfailed, t); + return 1; + }else{ + printf("PASSED %u known answer tests\n", t); + return 0; + } +} diff --git a/tests/kat_metal.m b/tests/kat_metal.m @@ -0,0 +1,85 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// Simple Metal device kernel and host main program to +// compute pi via random darts at a square +// +// Written by Tom Schoonjans <Tom.Schoonjans@me.com> + +// We're compiling on the host, so we don't include metalfeatures.h, +// but metal doesn't have 64-bit arithmetic, so we turn it off here. +#define R123_USE_64BIT 0 +// functions to do boilerplate Metal begin and end +#include "../tests/util_metal.h" +#include "kat_main.h" + +void host_execute_tests(kat_instance *tests, unsigned ntests){ + UMetalInfo *infop; + size_t i, nthreads = 1024, hits_sz; + uint *tests_host; + NSString *kernelname = @"dev_execute_tests"; + NSError *err = nil; + id<MTLFunction> function; + id<MTLBuffer> tests_dev; + size_t tests_sz; + id<MTLCommandBuffer> buffer; + id<MTLComputeCommandEncoder> encoder; + id<MTLComputePipelineState> pipeline; + + infop = metal_init(NULL, "kat_metal_kernel.metallib"); + CHECKNOTZERO(function = [infop->library newFunctionWithName: kernelname]); + tests_sz = sizeof(kat_instance) * (ntests+1); // +1 for sentinel test with method==last + CHECKNOTZERO(tests_dev = [infop->device newBufferWithBytes: tests length: tests_sz options:0]); + + CHECKNOTZERO(buffer = [infop->queue commandBuffer]); + CHECKNOTZERO(encoder = [buffer computeCommandEncoder]); + CHECKERR(pipeline = [infop->device newComputePipelineStateWithFunction:function error:&err]); + [encoder setComputePipelineState:pipeline]; + [encoder setBuffer:tests_dev offset:0 atIndex:0]; + + MTLSize threadsPerThreadgroup = MTLSizeMake([pipeline maxTotalThreadsPerThreadgroup], 1, 1); + MTLSize grid = MTLSizeMake(nthreads, 1, 1); + + [encoder dispatchThreads:grid threadsPerThreadgroup:threadsPerThreadgroup]; + [encoder endEncoding]; + [buffer commit]; + [buffer waitUntilCompleted]; + + tests_host = [tests_dev contents]; + + memcpy(tests, tests_host, tests_sz); + metal_done(infop); + [function release]; + [tests_dev release]; + [buffer release]; + [encoder release]; + [pipeline release]; +} diff --git a/tests/kat_metal_kernel.metal b/tests/kat_metal_kernel.metal @@ -0,0 +1,38 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "kat.h" + +#define KAT_KERNEL kernel +#define KAT_GLOBAL device +#define KAT_METAL_BUFFER0 [[ buffer(0) ]] + +#include "kat_dev_execute.h" diff --git a/tests/kat_opencl.c b/tests/kat_opencl.c @@ -0,0 +1,100 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "util_opencl.h" +#include "kat_main.h" + +// USE_GENCL: gencl.sh is a small shell script +// that pre-processes foo.ocl into foo.i, containing +// a definition like: +// const char opencl_src[] = "preprocessed text of foo.ocl" +// Thus, with gencl, this file says +// #include <foo.i> +// and the binary obtained by compiling it +// is fully "baked". Runtime behavior doesn't depend +// on the contents of some file (e.g., foo.ocl or some +// header that it includes) that might have changed long after this +// file was compiled. +// +// The alternative (USE_GENCL 0) seems to be more along +// the lines of what OpenCL designers imagine. It makes the text of the +// kernel program the string "#include <foo.c>". This eliminates +// the need for the extra machinery in gencl.sh, but runtime +// behavior is susceptable to changes in foo.c, or files included +// by foo.c long after this file is compiled. It also requires some +// hocus pocus to get absolute paths for the -I options needed +// to compile the code at runtime. Something like: +// override CFLAGS += -DSRCDIR=\"$(dir $(abspath $<)).\" +#define USE_GENCL 1 + +#if USE_GENCL +const char *opencl_src = +#include "kat_opencl_kernel.i" + ; +#else +#ifndef SRCDIR +#error -DSRCDIR="/absolute/path/to/examples" should have been put on the command-line by GNUmakefile +#endif +#endif + +void host_execute_tests(kat_instance *tests, unsigned ntests){ + UCLInfo *infop; + cl_kernel kern; + size_t nthreads, tests_sz; + cl_mem tests_dev; + const char *kernelname = "dev_execute_tests"; + cl_int err; + +#if USE_GENCL + infop = opencl_init(NULL, opencl_src, ""); +#else + infop = opencl_init(NULL, "#include <kat_dev_execute.h>", + " -I" SRCDIR + " -I" SRCDIR "/../include " + " -DKAT_KERNEL=__kernel " + " -DKAT_GLOBAL=__global "); +#endif + CHECKERR(kern = clCreateKernel(infop->prog, kernelname, &err)); + if (infop->wgsize > 64) infop->wgsize /= 2; + nthreads = infop->cores * infop->wgsize; + tests_sz = sizeof(*tests) * (ntests+1); // +1 for sentinel test with method==last + CHECKERR(tests_dev = clCreateBuffer(infop->ctx, CL_MEM_READ_WRITE|CL_MEM_USE_HOST_PTR, tests_sz, tests, &err)); + CHECK(clEnqueueWriteBuffer(infop->cmdq, tests_dev, CL_TRUE, 0, tests_sz, tests, 0, 0, 0)); + CHECK(clSetKernelArg(kern, 0, sizeof(cl_mem), (void*)&tests_dev)); + printf("queuing kernel for %lu threads with %lu work group size, %u tests\n", + (unsigned long)nthreads, (unsigned long)infop->wgsize, ntests); + CHECK(clEnqueueNDRangeKernel(infop->cmdq, kern, 1, 0, &nthreads, &infop->wgsize, 0, 0, 0)); + CHECK(clFinish(infop->cmdq)); + CHECK(clEnqueueReadBuffer(infop->cmdq, tests_dev, CL_TRUE, 0, tests_sz, tests, 0, 0, 0)); + CHECK(clReleaseMemObject(tests_dev)); + CHECK(clReleaseKernel(kern)); + opencl_done(infop); +} diff --git a/tests/kat_opencl_kernel.ocl b/tests/kat_opencl_kernel.ocl @@ -0,0 +1,37 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "kat.h" + +#define KAT_KERNEL __kernel +#define KAT_GLOBAL __global + +#include "kat_dev_execute.h" diff --git a/tests/kat_vectors b/tests/kat_vectors @@ -0,0 +1,83 @@ +# For each generator, we test: gen(0, 0), gen(fff, fff) and gen(ctr=digits_of_pi, key=more_digits_of_pi). +# Ignoring endianness, these are the first few hexdigits of pi: +# 243F6A88 85A308D3 13198A2E 03707344 A4093822 299F31D0 082EFA98 EC4E6C89 452821E6 38D01377 BE5466CF 34E90C6C C0AC29B7 C97C50DD 3F84D5B5 B5470917 9216D5D9 8979FB1BD +# +#nameNxW R CTR KEY EXPECTED +# +aesni4x32 10 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 d44be966 3b2c8aef 59fa4c88 2e2b34ca +aesni4x32 10 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 00000000 00000000 0f68399f cc680a67 4cbd230d 816d2e23 +aesni4x32 10 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 ca693cbf 134a4f64 965e0cfd 5217a28f +# also test AESNI with the test vector from FIPS197 +aesni4x32 10 33221100 77665544 bbaa9988 ffeeddcc 03020100 07060504 0b0a0908 0f0e0d0c d8e0c469 30047b6a 80b7cdd8 5ac5b470 +# +ars4x32 10 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 8d73ee19 506401ef 13c2dbe4 0cbe9c0d +ars4x32 10 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 a516e7d6 8357ad74 5b59b3ec 8763fff3 +ars4x32 10 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 00000000 00000000 bb3743b1 9f635551 ecbc87fc a19478a9 +# +philox2x32 7 00000000 00000000 00000000 257a3673 cd26be2a +philox2x32 7 ffffffff ffffffff ffffffff ab302c4d 3dc9d239 +philox2x32 7 243f6a88 85a308d3 13198a2e bedbbe6b e4c770b3 +philox2x32 10 00000000 00000000 00000000 ff1dae59 6cd10df2 +philox2x32 10 ffffffff ffffffff ffffffff 2c3f628b ab4fd7ad +philox2x32 10 243f6a88 85a308d3 13198a2e dd7ce038 f62a4c12 +# +philox4x32 7 00000000 00000000 00000000 00000000 00000000 00000000 5f6fb709 0d893f64 4f121f81 4f730a48 +philox4x32 7 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 5207ddc2 45165e59 4d8ee751 8c52f662 +philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 4dfccaba 190a87f0 c47362ba b6b5242a +philox4x32 10 00000000 00000000 00000000 00000000 00000000 00000000 6627e8d5 e169c58d bc57ac4c 9b00dbd8 +philox4x32 10 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 408f276d 41c83b0e a20bc7c6 6d5451fd +philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 d16cfe09 94fdcceb 5001e420 24126ea1 +# +philox2x64 7 0000000000000000 0000000000000000 0000000000000000 b41da69fbfefc666 511e9ce1a5534056 +philox2x64 7 ffffffffffffffff ffffffffffffffff ffffffffffffffff a4696cc04462015d 724782dae17169e9 +philox2x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 98ed1534392bf372 67528b1568882fd5 +philox2x64 10 0000000000000000 0000000000000000 0000000000000000 ca00a0459843d731 66c24222c9a845b5 +philox2x64 10 ffffffffffffffff ffffffffffffffff ffffffffffffffff 65b021d60cd8310f 4d02f3222f86df20 +philox2x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 0a5e742c2997341c b0f883d38000de5d +# +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 5dc8ee6268ec62cd 139bc570b6c125a0 84d6deb4fb65f49e aff7583376d378c2 +philox4x64 7 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 071dd84367903154 48e2bbdc722b37d1 6afa9890bb89f76c 9194c8d8ada56ac7 +philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c 513a366704edf755 f05d9924c07044d3 bef2cb9cbea74c6c 8db948de4caa1f8a +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 16554d9eca36314c db20fe9d672d0fdc d7e772cee186176b 7e68b68aec7ba23b +philox4x64 10 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 87b092c3013fe90b 438c3c67be8d0224 9cc7d7c69cd777b6 a09caebf594f0ba0 +philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c a528f45403e61d95 38c72dbd566e9788 a5a1610e72fd18b5 57bd43b5e52b7fe6 +# +threefry2x32 13 00000000 00000000 00000000 00000000 9d1c5ec6 8bd50731 +threefry2x32 13 ffffffff ffffffff ffffffff ffffffff fd36d048 2d17272c +threefry2x32 13 243f6a88 85a308d3 13198a2e 03707344 ba3e4725 f27d669e +threefry2x32 20 00000000 00000000 00000000 00000000 6b200159 99ba4efe +threefry2x32 20 ffffffff ffffffff ffffffff ffffffff 1cb996fc bb002be7 +threefry2x32 20 243f6a88 85a308d3 13198a2e 03707344 c4923a9c 483df7a0 +threefry2x32 32 00000000 00000000 00000000 00000000 cee3d47e a23dfd5c +threefry2x32 32 ffffffff ffffffff ffffffff ffffffff 6e2fe0d0 b1b76f82 +threefry2x32 32 243f6a88 85a308d3 13198a2e 03707344 e2827716 c3c05cdf +# +threefry4x32 13 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 531c7e4f 39491ee5 2c855a92 3d6abf9a +threefry4x32 13 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c4189358 1c9cc83a d5881c67 6a0a89e0 +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 4aa71d8f 734738c2 431fc6a8 ae6debf1 +threefry4x32 20 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 9c6ca96a e17eae66 fc10ecd4 5256a7d8 +threefry4x32 20 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 2a881696 57012287 f6c7446e a16a6732 +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 59cd1dbb b8879579 86b5d00c ac8b6d84 +threefry4x32 72 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 93171da6 9220326d b392b7b1 ff58a002 +threefry4x32 72 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 60743f3d 9961e684 aab21c34 8c65fb7d +threefry4x32 72 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 09930adf 7f27bd55 9ed68ce1 97f803f6 +# +threefry2x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000000 f167b032c3b480bd e91f9fee4b7a6fb5 +threefry2x64 13 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ccdec5c917a874b1 4df53abca26ceb01 +threefry2x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 c3aac71561042993 3fe7ae8801aff316 +threefry2x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000000 c2b6e3a8c2c69865 6f81ed42f350084d +threefry2x64 20 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff e02cb7c4d95d277a d06633d0893b8b68 +threefry2x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 263c7d30bb0f0af1 56be8361d3311526 +threefry2x64 32 0000000000000000 0000000000000000 0000000000000000 0000000000000000 38ba854d7f13cfb3 d02fca729d54fadc +threefry2x64 32 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 6b532f4f6e288646 0388f1ec135ee18e +threefry2x64 32 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 dad492f32efbd0c4 b6d7d0cd1f193e84 +# +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 4071fabee1dc8e05 02ed3113695c9c62 397311b5b89f9d49 e21292c3258024bc +threefry4x64 13 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 7eaed935479722b5 90994358c429f31c 496381083e07a75b 627ed0d746821121 +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c c0ac29b7c97c50dd 3f84d5b5b5470917 4361288ef9c1900c 8717291521782833 0d19db18c20cf47e a0b41d63ac8581e5 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 09218ebde6c85537 55941f5266d86105 4bd25e16282434dc ee29ec846bd2e40b + threefry4x64 20 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 29c24097942bba1b 0371bbfb0f6f4e11 3c231ffa33f83a1c cd29113fde32d168 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c be5466cf34e90c6c c0ac29b7c97c50dd a7e8fde591651bd9 baafd0c30138319b 84a5c1a729e685b9 901d406ccebc1ba4 +threefry4x64 72 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 94eeea8b1f2ada84 adf103313eae6670 952419a1f4b16d53 d83f13e63c9f6b11 +threefry4x64 72 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 11518c034bc1ff4c 193f10b8bcdcc9f7 d024229cb58f20d8 563ed6e48e05183f +threefry4x64 72 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c be5466cf34e90c6c c0ac29b7c97c50dd acf412ccaa3b2270 c9e99bd53f2e9173 43dad469dc825948 fbb19d06c8a2b4dc diff --git a/tests/old_kat_vectors b/tests/old_kat_vectors @@ -0,0 +1,5339 @@ +#Generated by gentests.py and then running parsefail +# +# Unfortunately, these kat_vectors don't exercise the bits of KEY very well, +# so we have a new set in ./kat_vectors that is both smaller and +# (we think) better. +# +# We keep these around because the extensive Crush tests reported in +# the Random123 paper were all done with generators that satisfied +# *these* kat_vectors. It is reassuring to be able to verify +# that future versions of the library satisfy the same kat_vectors. +# +#nameNxW R CTR KEY EXPECTED +philox2x32 7 00000001 00000000 00000001 dd304d50 12e4d653 +philox2x32 7 00000000 00000001 00000001 2c4a4855 9199e69b +philox2x32 7 00000000 ffffffff 00000001 6d2698e6 b701a038 +philox2x32 7 00000000 80000000 00000001 800bb214 33f68d84 +philox2x32 7 243f6a88 85a308d3 00000001 5e8c7db7 fe555fa5 +philox2x32 7 13198a2e 03707344 00000001 8c1ec904 8e580829 +philox2x32 7 a4093822 299f31d0 00000001 057c044a 7aafdd03 +philox2x32 7 082efa98 ec4e6c89 00000001 5a522bef 4f71ff9b +philox2x32 7 452821e6 38d01377 00000001 5dbe9036 c71bfb6f +philox2x32 7 be5466cf 34e90c6c 00000001 f8ce43da 5d07a3bc +philox2x32 10 00000001 00000000 00000001 df873210 f52df537 +philox2x32 10 00000000 00000001 00000001 7ed26ce8 86c7f618 +philox2x32 10 00000000 ffffffff 00000001 319f09f6 8e11e823 +philox2x32 10 00000000 80000000 00000001 b004c3a1 5aaa7aab +philox2x32 10 243f6a88 85a308d3 00000001 249cdc9c 4f745808 +philox2x32 10 13198a2e 03707344 00000001 7fe8940c 5164f5d3 +philox2x32 10 a4093822 299f31d0 00000001 9fa9cccc da4e7ee4 +philox2x32 10 082efa98 ec4e6c89 00000001 749e4ccd 6b4efa58 +philox2x32 10 452821e6 38d01377 00000001 e352771f 210baeaa +philox2x32 10 be5466cf 34e90c6c 00000001 4d2a7213 d84561e4 +philox2x64 7 0000000000000001 0000000000000000 0000000000000001 6731c5bf26de72d3 adb0404961332fbe +philox2x64 7 0000000000000000 0000000000000001 0000000000000001 88c0f355559817df 613b0c0682da5d16 +philox2x64 7 0000000000000000 ffffffffffffffff 0000000000000001 ef60e579e0cc8308 d5de9d9bf11b57ce +philox2x64 7 0000000000000000 8000000000000000 0000000000000001 f05773bd9ddff049 600bdd92470c8940 +philox2x64 7 243f6a8885a308d3 13198a2e03707344 0000000000000001 a96599d377733423 d1c51f3aa6d13b8c +philox2x64 7 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 81a0e4d3c158a51a 5e20f98aff4f692c +philox2x64 7 452821e638d01377 be5466cf34e90c6c 0000000000000001 e9fdf171af72db90 1ed074cb2bbc90c1 +philox2x64 10 0000000000000001 0000000000000000 0000000000000001 d9942a5c25dce933 512c1502dbacf1a2 +philox2x64 10 0000000000000000 0000000000000001 0000000000000001 9d42f8da0c592ba8 626786f6b2c510b0 +philox2x64 10 0000000000000000 ffffffffffffffff 0000000000000001 2d7c99d63b91dec2 0e13046ba2a2a7e6 +philox2x64 10 0000000000000000 8000000000000000 0000000000000001 0a1c7400c97c2506 845e4df70479d69f +philox2x64 10 243f6a8885a308d3 13198a2e03707344 0000000000000001 9da663796aaa8b69 a04cf817aceac82d +philox2x64 10 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0bde60d810e6cfcd ed2f63ae6019fd5a +philox4x32 7 00000001 00000000 00000000 00000000 00000001 00000000 6b3257c3 820c5486 4de08b66 8771d665 +philox4x32 7 00000000 00000001 00000000 00000000 00000001 00000000 03dd87e3 e457f6e9 36c1ef7a 2c08abd7 +philox4x32 7 00000000 00000000 00000001 00000000 00000001 00000000 7b95d061 973a01c3 34a7320a b948ba2b +philox4x32 7 00000000 00000000 00000000 00000001 00000001 00000000 ec3a83e6 1b8a97b3 d62f2558 2bbefc0b +philox4x32 7 00000000 ffffffff 00000000 00000000 00000001 00000000 a84bdb23 ad074f5c d009bbed dc77d86c +philox4x32 7 00000000 80000000 00000000 00000000 00000001 00000000 fee842f9 4ab3aed6 d83a3a74 6166acec +philox4x32 7 00000000 00000000 ffffffff 00000000 00000001 00000000 9d9941e5 c454b1a9 292e9032 012e7a5b +philox4x32 7 00000000 00000000 80000000 00000000 00000001 00000000 450f5c67 5e4f567e 3e5ae48e eca744c7 +philox4x32 7 00000000 00000000 00000000 ffffffff 00000001 00000000 700b66cd 833b8af0 e955c344 17781353 +philox4x32 7 00000000 00000000 00000000 80000000 00000001 00000000 f5dec550 d08482a9 09e2e568 c08a2602 +philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 00000001 00000000 64803f9b acd38b4b 5ea00643 770c3921 +philox4x32 7 a4093822 299f31d0 082efa98 ec4e6c89 00000001 00000000 477d1496 cd0263d3 fa87a887 a1a13750 +philox4x32 7 452821e6 38d01377 be5466cf 34e90c6c 00000001 00000000 3c182998 851c52ae 22df9a24 805a4e26 +philox4x32 7 00000001 00000000 00000000 00000000 00000000 00000001 4582d3b2 11884435 1c51f335 56b76cad +philox4x32 7 00000000 00000001 00000000 00000000 00000000 00000001 824469c3 e2b3aee2 f27d3e79 69e5de86 +philox4x32 7 00000000 00000000 00000001 00000000 00000000 00000001 c8cc99de 36b6acce c7fde4e2 b954b1f0 +philox4x32 7 00000000 00000000 00000000 00000001 00000000 00000001 d02f5ec7 f0673bf6 027bec46 779e7874 +philox4x32 7 00000000 ffffffff 00000000 00000000 00000000 00000001 55a94893 5824e089 0aacd579 d69ce6fb +philox4x32 7 00000000 80000000 00000000 00000000 00000000 00000001 bed1d713 08c60b2d f16241e5 37b110de +philox4x32 7 00000000 00000000 ffffffff 00000000 00000000 00000001 a44a8fd2 10e92201 f15f62ac e00f43b6 +philox4x32 7 00000000 00000000 80000000 00000000 00000000 00000001 096862a9 6755b23c 3e211f07 49799dc7 +philox4x32 7 00000000 00000000 00000000 ffffffff 00000000 00000001 189beecf e053c60b bbd309b7 6c7a7794 +philox4x32 7 00000000 00000000 00000000 80000000 00000000 00000001 deb89556 c991d089 09e16ad6 15a24b57 +philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 00000000 00000001 3eb0cda8 1c3550e7 2541d05d 068d381c +philox4x32 7 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000001 13818be6 633e77bb 6d135b5b a3b20aa0 +philox4x32 7 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000001 b3735496 aa6cda09 0d72df0b b961e99a +philox4x32 7 00000001 00000000 00000000 00000000 00000000 ffffffff b5c9dc53 0f8b9936 5dfd28f4 80f4c67d +philox4x32 7 00000000 00000001 00000000 00000000 00000000 ffffffff 993b616b d3aba408 076593da a2999568 +philox4x32 7 00000000 00000000 00000001 00000000 00000000 ffffffff f891827e 3b2f7ecf 41cbeeb4 596c72b8 +philox4x32 7 00000000 00000000 00000000 00000001 00000000 ffffffff 5eddf390 c16f5ad8 5480b946 92b74eb2 +philox4x32 7 00000000 ffffffff 00000000 00000000 00000000 ffffffff 41e41234 eac57ab3 3565428b 0ae4d890 +philox4x32 7 00000000 80000000 00000000 00000000 00000000 ffffffff 9bbbefb2 69155b0d 59124dbf 5fa21593 +philox4x32 7 00000000 00000000 ffffffff 00000000 00000000 ffffffff bb2d9138 e2aea83c 735542fd 142578c1 +philox4x32 7 00000000 00000000 80000000 00000000 00000000 ffffffff b9bb52fe d06f257f b5079c8f 0490d30e +philox4x32 7 00000000 00000000 00000000 ffffffff 00000000 ffffffff 793416be 37270805 fb649c02 68a4e7c2 +philox4x32 7 00000000 00000000 00000000 80000000 00000000 ffffffff 0e6e511e 8e7045fa d56a0e60 f8e94c17 +philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 00000000 ffffffff 80fda6c5 33db1407 042deee8 0dec8a67 +philox4x32 7 a4093822 299f31d0 082efa98 ec4e6c89 00000000 ffffffff 55a400f8 90e13684 1ad7c6c6 fdfdd335 +philox4x32 7 452821e6 38d01377 be5466cf 34e90c6c 00000000 ffffffff 9ea5c780 92dfd935 5f5021d0 891581d8 +philox4x32 7 00000001 00000000 00000000 00000000 00000000 80000000 5a134bed 542bab82 21429fcd 677a1dd3 +philox4x32 7 00000000 00000001 00000000 00000000 00000000 80000000 819bfdaa 2584def1 af9ca218 0a2ef133 +philox4x32 7 00000000 00000000 00000001 00000000 00000000 80000000 d7854663 74abe06e dd8f4d3c b7f52230 +philox4x32 7 00000000 00000000 00000000 00000001 00000000 80000000 0d5576d6 d37a4b50 2d544d55 33f654d6 +philox4x32 7 00000000 ffffffff 00000000 00000000 00000000 80000000 db5de1d1 534479e1 fae88f56 c66f402b +philox4x32 7 00000000 80000000 00000000 00000000 00000000 80000000 4cd24250 9291c73f 39429688 83707553 +philox4x32 7 00000000 00000000 ffffffff 00000000 00000000 80000000 6b227dcf b5bf2a3a c60d00b8 c0e04288 +philox4x32 7 00000000 00000000 80000000 00000000 00000000 80000000 56ddb529 b18488a9 63f467c6 a689a8ad +philox4x32 7 00000000 00000000 00000000 ffffffff 00000000 80000000 414ea6b4 083011b4 08bc62cb 76d8fb76 +philox4x32 7 00000000 00000000 00000000 80000000 00000000 80000000 323abc61 28b9f4ce 59d8d353 01a9cf42 +philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 00000000 80000000 2040eb58 f609f646 bbf37f20 5d76b5f9 +philox4x32 7 a4093822 299f31d0 082efa98 ec4e6c89 00000000 80000000 f9440a22 337100bb 1845d9c8 2736ad6d +philox4x32 7 452821e6 38d01377 be5466cf 34e90c6c 00000000 80000000 b30a1fd9 3149f07f 59ede6aa 95d62ce2 +philox4x32 10 00000001 00000000 00000000 00000000 00000001 00000000 ac08141b dfc5ccbe 79c07a47 a7f66093 +philox4x32 10 00000000 00000001 00000000 00000000 00000001 00000000 833ff8dc 225c963c 232b88b3 0b334b07 +philox4x32 10 00000000 00000000 00000001 00000000 00000001 00000000 07071c12 428264b6 3909104b 6da2bda2 +philox4x32 10 00000000 00000000 00000000 00000001 00000001 00000000 127bee41 1e047488 48842b20 0a393496 +philox4x32 10 00000000 ffffffff 00000000 00000000 00000001 00000000 04e2eae1 463cc999 e7786310 65b3dc49 +philox4x32 10 00000000 80000000 00000000 00000000 00000001 00000000 34a4d61d 340e4017 f6945830 e9f52b96 +philox4x32 10 00000000 00000000 ffffffff 00000000 00000001 00000000 fb0905e2 78378790 ca37926b cdf58cfa +philox4x32 10 00000000 00000000 80000000 00000000 00000001 00000000 f2e15c7d 3fedcd99 90046f6c 6657f0ca +philox4x32 10 00000000 00000000 00000000 ffffffff 00000001 00000000 f50c9398 b36cdab2 436bdc89 cc49431b +philox4x32 10 00000000 00000000 00000000 80000000 00000001 00000000 dde26e4e 17666f3b fc1f5b3a 83ac805d +philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 00000001 00000000 38527b8f fad9a48c 20e675c0 f2fea26a +philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89 00000001 00000000 fb9877f8 482895e2 60b01453 198ea67b +philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c 00000001 00000000 f7b7fa0a 8d970e2c 205c9c76 83b16ce5 +philox4x32 10 00000001 00000000 00000000 00000000 00000000 00000001 ccf3076a 6306f434 bea71965 d96fe48a +philox4x32 10 00000000 00000001 00000000 00000000 00000000 00000001 532f1322 36c890fb 6504b937 07bbfef7 +philox4x32 10 00000000 00000000 00000001 00000000 00000000 00000001 7f6c13ff 114b2447 0550eced ea1fc805 +philox4x32 10 00000000 00000000 00000000 00000001 00000000 00000001 96b27e8c 28826d0f 66d958ef 081509dc +philox4x32 10 00000000 ffffffff 00000000 00000000 00000000 00000001 00e94a67 3524f44e 22995230 bb54df1e +philox4x32 10 00000000 80000000 00000000 00000000 00000000 00000001 ce1afc4e 4fbf97a1 6110bee9 a559be2f +philox4x32 10 00000000 00000000 ffffffff 00000000 00000000 00000001 576241af d3b45bee 619bd94d 15dd8793 +philox4x32 10 00000000 00000000 80000000 00000000 00000000 00000001 d9da65af eced57ba c34d2661 91fe931f +philox4x32 10 00000000 00000000 00000000 ffffffff 00000000 00000001 36241728 4d42c858 fea737d6 49f40347 +philox4x32 10 00000000 00000000 00000000 80000000 00000000 00000001 0436a39b 31be9efa 6abd0c76 e7a68f83 +philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 00000000 00000001 126514c3 d1898b69 da2707b3 6e6fb436 +philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000001 1c28fa3f 8c5bf977 bb989783 0c1a3737 +philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000001 ac87a8c1 f240abdb add6c012 68a32a78 +philox4x32 10 00000001 00000000 00000000 00000000 00000000 ffffffff 473ab778 330bacc0 acd5fc9a 5ede76b3 +philox4x32 10 00000000 00000001 00000000 00000000 00000000 ffffffff cdfbd51c caae5f2e 10739cfc 79e95162 +philox4x32 10 00000000 00000000 00000001 00000000 00000000 ffffffff 6c4b0e80 357e5a94 3255445d 6f433f0b +philox4x32 10 00000000 00000000 00000000 00000001 00000000 ffffffff 5c4ecd0c 64c12cf9 8f9fb4c8 40c4a01f +philox4x32 10 00000000 ffffffff 00000000 00000000 00000000 ffffffff 5f9c47aa 19861d86 ff2be81d 4c7db17e +philox4x32 10 00000000 80000000 00000000 00000000 00000000 ffffffff 715a87cf f966a7f0 3e6dd95f e884e2fd +philox4x32 10 00000000 00000000 ffffffff 00000000 00000000 ffffffff 07678411 9e524307 ba634e67 94ee8cb7 +philox4x32 10 00000000 00000000 80000000 00000000 00000000 ffffffff b6f48e28 f2fa9414 00b64f66 4810cdb4 +philox4x32 10 00000000 00000000 00000000 ffffffff 00000000 ffffffff 9f18bb20 62161056 7ea8c028 4c01fc6e +philox4x32 10 00000000 00000000 00000000 80000000 00000000 ffffffff 2a460458 0a2709e5 47bc9115 0f96d8af +philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 00000000 ffffffff 08f7720c 845ee9e0 502ccd3d a9a00e27 +philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89 00000000 ffffffff 9fcce05d 837d3f3c 5cdf3e61 db2544c0 +philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c 00000000 ffffffff 72ce44b3 b44f9b78 49af0267 726813ac +philox4x32 10 00000001 00000000 00000000 00000000 00000000 80000000 e29b9f84 2903d316 42a1f56f 1ad02eab +philox4x32 10 00000000 00000001 00000000 00000000 00000000 80000000 94f419f8 1116c316 99f2fa30 bc048ad6 +philox4x32 10 00000000 00000000 00000001 00000000 00000000 80000000 488b0258 9eea6420 afe7062e 768f5637 +philox4x32 10 00000000 00000000 00000000 00000001 00000000 80000000 dbec6d70 69cea528 f7e22262 2e9f3e8f +philox4x32 10 00000000 ffffffff 00000000 00000000 00000000 80000000 905ee550 c7520e9a 9af9d0ad 69b97e98 +philox4x32 10 00000000 80000000 00000000 00000000 00000000 80000000 1b89d963 0defe9af 60c9d3fb 3cfae97d +philox4x32 10 00000000 00000000 ffffffff 00000000 00000000 80000000 601b5460 fe29678b 54510a02 c72ed094 +philox4x32 10 00000000 00000000 80000000 00000000 00000000 80000000 ae56ca02 7609ba67 25abd7df 46ce39a3 +philox4x32 10 00000000 00000000 00000000 ffffffff 00000000 80000000 09812238 47b8470d 3e0d0a26 92d96c9a +philox4x32 10 00000000 00000000 00000000 80000000 00000000 80000000 f7a0b371 e51dc93d 56ce135d 1d4b5580 +philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 00000000 80000000 63675d2c 422d7c4d 3145d30d 3bce33a4 +philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89 00000000 80000000 aa74e81c c9ddb97b 2c2cd881 9390c78d +philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c 00000000 80000000 94ca5566 14924b2f 28214292 59faeaee +philox4x64 7 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 a84f99f224f4cfbc 274efe46f0cc52a1 d63e2ec6fdb168a0 075123647506ee27 +philox4x64 7 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 eb2bf03a13a1a1e3 56e7cbc84c87ec48 fc506dd46338cd70 46a7a39083ba8489 +philox4x64 7 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 86b74b62e856f3a5 6053b9cb9274a289 4c9b75ec697ea72a a4fa1ef2ff24eae2 +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000001 0000000000000000 1ca5eced2c7cecd3 b1fcae7585130dc7 c0ea46280e16a2db 6d92ea22c9ad7e25 +philox4x64 7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ae055a5045f32faf bde85edbfd887cd4 5f0dce5cb463d2c3 20e5732feedfc102 +philox4x64 7 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 716bdad82151f110 991e7ed663cda695 b538a61037fa6f7b a33b549af210f319 +philox4x64 7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 ef3b00173dbfc105 d4d3378c1dbc8f3a 72bdd51b26d942f9 c6a1f46aa8d6fa9f +philox4x64 7 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 dd0b5de968e6c5c0 6b78797808867752 0b5a7aaa79ea06bc dcc26e1185e4d95c +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 8cf59bc42e37b57e 0b6a6e082f3ea65d 694ad11a471343a5 50da2ec78fbb66e9 +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000001 0000000000000000 2d9ca006eea83ab2 b6d94afceb4e5ebb 5ade5ab35910b0f8 94ead24dc22e07da +philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 e08b7a33c86d98e0 33aecd4f91b264b4 b91a88e80a219875 8f2a9dd82780854e +philox4x64 7 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 f5e3223b00116da4 134e2e4b93c349cd 05df4d3d10fe52a4 0cd4fc5f2a6d4605 +philox4x64 7 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 fa4318f3ddcbae0c d3822c687b18fbc9 fd6efa89fdf4def3 8a6e2b28c7000d51 +philox4x64 7 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 b71736800cb19cc2 465e0b290594a26f 7d6461c312bbb3d2 ab712cce37a08231 +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 e30b487d004a7790 a0b8ddb3235e7b2c ed4d107445bed6b8 0014a98401e1c79a +philox4x64 7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 cffa905456214f44 5d92693cc6a563b6 5c156d9fc4514d26 f681331c9095f9d0 +philox4x64 7 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 af633db845c5b35a 3c904c74d24a616d e058112dc1e3d77f 2b486a45fc44757c +philox4x64 7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 51ec481f11ca6d9c 5af7aee63bbdef91 fd9219ace01ca886 371274c68c106c72 +philox4x64 7 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 84368e022df11716 9babf90b2d734275 ac2b18faf4b70450 74df64b2f1d44a4d +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 a07151c1a2096454 f1a175c7c4d40fa0 cdde1a462fb4d017 3e717c0b191a75e2 +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 9059231222d6b54a c10c9276b5d8b864 3c6d04e46e384088 df9c4a211d0df316 +philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 0046825443639c50 1c1a53c10fd6a39a 204525814c2bf9ca a2a8a25b1cfe992e +philox4x64 7 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff bd030c40201c0f70 8de0448c8d01b695 e0a3f6bb1516887d 3b17f2a2ac08146f +philox4x64 7 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0adde99a7834d3be 381bec931b9ad649 a08229387d02463a dcbe1ac725399cee +philox4x64 7 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff f3e86513a4e70e1e 186f958e53095344 3b971ea6c9a81548 dfafa60231e08d3d +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff e0f90c7455a782a6 c552e4d263923300 22a0948ea7972b4d e387aec33822523c +philox4x64 7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 52a6a2780e51d7b2 3673bb81e995d85d b12dd4b6eb72d6f0 2e1909106a07a8cf +philox4x64 7 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff c189106b490bd2fb 4f6d1dd470fdfbcb a7bd83ddeb0a1dab 045aa110f8f52c40 +philox4x64 7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 9df8faedb521ef1e f1a120f15e091886 1d4689c5d1779200 829ef45f53092914 +philox4x64 7 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 767a5736b7d348aa efa73968ff5c0444 ede6adac4e8d4795 c366d2c5357e0bae +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff cd2b03d43747bf25 b1e1d178f4476f31 2f04f2e652429d2b 3f18ff71fe2b1d96 +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff ae8dd2e4f571e95e cbe84fe3c5c7a22e 41958d43eb183198 be273430e39dbb2d +philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 6eaea4468842c579 61c993f6deddb8b7 32da2c8845639fea 1caa39d539440f84 +philox4x64 7 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 fdb4c38370017081 37f20a8cded028e1 07b6b7e9b441ca64 afcbb7db096a11ba +philox4x64 7 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 77f9f02957fe399f e7bcf2e59a9c0014 60c025f137ddfdef 6e2d9e24f28b054f +philox4x64 7 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 b1dffa9d26bb2bba a686af9fbc2fccca 7703523657b1f11d d1b1117279f5e560 +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8000000000000000 1ee64cc049af47d4 130f44d0d6cb90b1 8aa65fb519e08c1d 5fd2902cdd9c4b21 +philox4x64 7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 5eda50bb0f6bf36b a61c3684ea63eac2 72577567a117738a 4c2f885c923f8a50 +philox4x64 7 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 62c4b12d2d6f4f43 7ac09a7a5f78a347 eaeceb4a5d707d81 ddc693c1152ca863 +philox4x64 7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 19b89a3a0ebfc396 851393a4eb9800e1 60219574c2cfdf14 99835afa209b5a5f +philox4x64 7 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 fccd9c83d6bef5c8 495bdfc8980206ec ef6b8861816b556e 6750afa3867363f8 +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 7793fdab901f40e2 0770db0a6546aebc 9414169ccb08ea4f 8e4107ded7e6fe22 +philox4x64 7 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 8000000000000000 2e2e8b89c1ecd349 a7a9e220db717f97 39841e145bee64ec af899729cd317ab5 +philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 c4b6db2cafd36b63 1c10b197be4bb8f9 6ccf699079df5db9 7426268167ef98ce +philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 4db6a27b756282df d944fa03babe0e2f 27f872e577060d32 07f697696a0482a2 +philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 bbf738c62d3516b3 7faed3926853226b c175b4809d5da923 7a77f6c341cec732 +philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 05c42b05ff257651 83431181197ac359 57be92230b7ced59 75073635c66ba84b +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000001 0000000000000000 8047f8778e0c2a18 da91ab55df266829 5a8b0adc29d708de d2ba72e9a5f8ca1f +philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 82a98ead15250c68 dca14805e19e01bc 7bc58279fe853ad2 4366ca54a9015751 +philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 5103c647343f9197 a979e24146bddfdb a38a5cea6c70d5ea 69dbc87d145feea6 +philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 f5cfc4e5a58df07a 6fcdcdd4c962f858 9924d9474dfddf2f f5da8c63141ebe42 +philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0dd2beab02c79d3b 85868d969fc6d557 da416fa7e6efe9a5 97aa0f5a07837f3c +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 e3de832dbefa4f20 9d8e387753e80554 3f942711126531ab cbac59ef8a8facfc +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000001 0000000000000000 4aea7a2d45ef6b56 9d39b7727af2b34d 710b6c665646f6f3 4c266cbd9914407c +philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 c306b6f69047b4d3 50a141b88a52f51f c1255f575c5efa40 e9ec1af0c5fd12e7 +philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 d037f8c3f9a1d176 c057419b4c210765 abf13115117b0065 7bae035dea6ea5c0 +philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 5f173f0fc52df6ee 8e8e9c9688aed89e abdae5020b0cb568 48f2b1309feded50 +philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 fc2c9c4d9ddaf082 2897652bb49dcae3 baaf4535a51ae093 97a0e3db84f4deda +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 c403b0ed4f4a56bc 4c10205602338da5 44026cf45fd8c7b3 c85ab2577611200a +philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 a6b0eb43d4242e83 7eb0571197ef0432 595c5ac87ab02ffd 3065201e77c7719d +philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 06fc1ee830dac525 9dbd142788436b9f 5142f5068c0d523b 3a272b75f6fc8d07 +philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 05ea68c26fda314d bfedb09469623669 b5d90ab786f50a8a 91ab55b3322fa08b +philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 fc66f7ed4a80f91a 26321095c87d4593 b7c965253657e98f 9ec415f9832e5a5b +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0a3c7e26094a08d3 2adb8f85553814c3 2e4991e78f66b1e3 15eb86339cfe3169 +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 fc1433efdbd33e21 808ce83adf2a77f8 96ee08d151e9bb53 e8f4c80839491335 +philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 43e89f25ef59b052 d2502d395a99506d d5c391a65ae822ed 5b049af4d110de73 +philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 72d6708a2e33f32e cdb7d7084ea573af 7afec3befacf7bfa 973f3514d6cb878e +philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 78f3fb4b2e6c3b4c 8ff0de70dc8d4d15 7ff4df00521f1fa6 562c6ab0f46014a6 +philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 2387991c4ec7757a b5386352c0608d17 4e1652d424a4e695 0a51cf9337aa092d +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff e6ffec0a65d827e2 4eda0ce957436ecb 044226366e687984 c563403773ea4586 +philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 610763733452c58c 782a055afc18c1b2 9a6f11fd37bba6b7 7230bfcc8a5f81b8 +philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0227ecdbbe8da04d c78fb8f0b412a18b 2c95e618493dbf20 b3ecdbb8c2ef1600 +philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 9dd4b8f423be915e 43cd5fa1ab84838c 9bdd5bc7b21d5372 ae35cb6a3d94c1fe +philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 127083ab716caa91 96939425b7ef4758 da6dbf8bfa9da76b f4a9720c1af9e0e2 +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff 3609d7e72c5bf1ea e82604f634f7ad33 8b6c9f114736edf2 83dcba394e12f45a +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff cc2e3611b341b443 d975353c6baa07e8 4d0e70419e907e10 8a4dceea01380ae1 +philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 7abbd897f6d97f60 a35c61aae7c5a341 939a3dd4f55b2e11 aca6e644802e2b83 +philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 95bf028be28ca5e8 80a06590a6c807a8 1770cb520415bcba fecac07f93e9ed1f +philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 6aa3e3e8852b4cc4 eeed4a014947ee9a b347eb5bb39cbcee f048d1bc0fc2b4f2 +philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 86b7bbf896316096 dbf03c3291b0e8e4 f7baf2cce7820704 6901641d0e74863d +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8000000000000000 a22ba98c8739f11c 75840cee16d70e1a 59211c4195818dbb 26fd6d1dd8b4d938 +philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 b7a2f1ee3064f644 5bfed8c7b0e09ec9 d7ef6479063d9862 b94fd6571ec99673 +philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 237b3d9bab6c147b 15cd10a376b3ba31 e9fca9f852456a7c 011d03871fbcd351 +philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 c2af8ad32fd4de40 210519dc3915cf8d 96d7b5aaac61e656 bf890353d0e4f406 +philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 deabe779ac4018bf c244924f18a0bd57 b2c176463cbcdd44 924c5c68f49efe61 +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 65084d38b2079128 26278aadff5dc8a0 12b70968c429186c 3008f3151aec94d0 +philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 8000000000000000 4e5204874c73745c b416cb6ef85bba05 87819def7e3f93a0 cc38b1dbe3d9d6e9 +philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 79b0012fa80e5ad7 15b81f9bf706cc38 6586b6802ea9ba1c 1bba4ac847739bca +threefry2x32 13 00000001 00000000 00000001 00000000 d460839c ee5930d0 +threefry2x32 13 00000000 00000001 00000001 00000000 ea891938 471d995c +threefry2x32 13 00000000 ffffffff 00000001 00000000 c5e14858 bd7ab190 +threefry2x32 13 00000000 00000000 00000001 00000000 61ec2d44 95654539 +threefry2x32 13 85a308d3 03707344 00000001 00000000 ade2ae91 0d6ab23f +threefry2x32 13 299f31d0 ec4e6c89 00000001 00000000 c2e3fb83 a2106e59 +threefry2x32 13 38d01377 34e90c6c 00000001 00000000 56362c81 144ef0e3 +threefry2x32 13 00000001 00000000 00000000 00000001 2ecbda41 982f3323 +threefry2x32 13 00000000 00000001 00000000 00000001 8f4c4973 dc866a7b +threefry2x32 13 00000000 ffffffff 00000000 00000001 83ecfb53 4e25540b +threefry2x32 13 00000000 00000000 00000000 00000001 7a3f4f18 3aaa1dff +threefry2x32 13 85a308d3 03707344 00000000 00000001 7fac70ab 49b0b079 +threefry2x32 13 299f31d0 ec4e6c89 00000000 00000001 244c0e5d 55ae15dd +threefry2x32 13 38d01377 34e90c6c 00000000 00000001 da2d36d7 adebf45a +threefry2x32 13 00000001 00000000 00000000 ffffffff d858c2ae a698929b +threefry2x32 13 00000000 00000001 00000000 ffffffff 5da8f6fe 123c29d0 +threefry2x32 13 00000000 ffffffff 00000000 ffffffff 0e22aa9d 848090af +threefry2x32 13 00000000 00000000 00000000 ffffffff dace553b b8265b65 +threefry2x32 13 85a308d3 03707344 00000000 ffffffff 35aa55c0 223e1b40 +threefry2x32 13 299f31d0 ec4e6c89 00000000 ffffffff 88771755 0a184a3e +threefry2x32 13 38d01377 34e90c6c 00000000 ffffffff 4b6695da c4532c17 +threefry2x32 13 00000001 00000000 00000000 00000000 fdddad3b cb69c1c2 +threefry2x32 13 00000000 00000001 00000000 00000000 4050e5b0 f6bca927 +threefry2x32 13 00000000 ffffffff 00000000 00000000 09c64211 b4e160b6 +threefry2x32 13 00000000 00000000 00000000 00000000 9d1c5ec6 8bd50731 +threefry2x32 13 85a308d3 03707344 00000000 00000000 a985a4e2 fb491ec4 +threefry2x32 13 299f31d0 ec4e6c89 00000000 00000000 cb484bfb e0dc3459 +threefry2x32 13 38d01377 34e90c6c 00000000 00000000 40f75b24 29b5d523 +threefry2x32 20 00000001 00000000 00000001 00000000 0ec66872 2d84e7b1 +threefry2x32 20 00000000 00000001 00000001 00000000 e8de5dc1 461e61e4 +threefry2x32 20 00000000 ffffffff 00000001 00000000 74100836 8f0cc08e +threefry2x32 20 00000000 00000000 00000001 00000000 b435a7fa 96eb2785 +threefry2x32 20 85a308d3 03707344 00000001 00000000 6d2173ca 182d2d62 +threefry2x32 20 299f31d0 ec4e6c89 00000001 00000000 053c52c2 a5fd076c +threefry2x32 20 38d01377 34e90c6c 00000001 00000000 0aff7206 20c6b1ad +threefry2x32 20 00000001 00000000 00000000 00000001 4233dc34 3df99f6b +threefry2x32 20 00000000 00000001 00000000 00000001 74298876 fc8d8048 +threefry2x32 20 00000000 ffffffff 00000000 00000001 45ecd01c effc9cbd +threefry2x32 20 00000000 00000000 00000000 00000001 1e3f1835 6e752082 +threefry2x32 20 85a308d3 03707344 00000000 00000001 985706f1 39ede42b +threefry2x32 20 299f31d0 ec4e6c89 00000000 00000001 9b255e86 836367b6 +threefry2x32 20 38d01377 34e90c6c 00000000 00000001 eacbd1c2 ddac6576 +threefry2x32 20 00000001 00000000 00000000 ffffffff 0a5c684a 89734cfb +threefry2x32 20 00000000 00000001 00000000 ffffffff ce53f10b 4253b296 +threefry2x32 20 00000000 ffffffff 00000000 ffffffff dd0a4b72 e61f3a35 +threefry2x32 20 00000000 00000000 00000000 ffffffff b139a81a 35816875 +threefry2x32 20 85a308d3 03707344 00000000 ffffffff 09658c63 5ab84cbb +threefry2x32 20 299f31d0 ec4e6c89 00000000 ffffffff c2662ee4 dae195a6 +threefry2x32 20 38d01377 34e90c6c 00000000 ffffffff f57c9b26 3333f9c2 +threefry2x32 20 00000001 00000000 00000000 00000000 508efb2c c0de3f32 +threefry2x32 20 00000000 00000001 00000000 00000000 375f238f cddb151d +threefry2x32 20 00000000 ffffffff 00000000 00000000 2c4e0437 e1e32d13 +threefry2x32 20 00000000 00000000 00000000 00000000 6b200159 99ba4efe +threefry2x32 20 85a308d3 03707344 00000000 00000000 8a7778e0 ba02812d +threefry2x32 20 299f31d0 ec4e6c89 00000000 00000000 46367996 5ebc6941 +threefry2x32 20 38d01377 34e90c6c 00000000 00000000 0bfcf941 19b8c9e3 +threefry2x64 13 0000000000000001 0000000000000000 0000000000000001 0000000000000000 969384cc85e4f376 7483ab72c7895c74 +threefry2x64 13 0000000000000000 0000000000000001 0000000000000001 0000000000000000 a834c98cc31101ea e55d6fcaae6c2303 +threefry2x64 13 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 ea4631bbb7e357da 76431283a854ad4d +threefry2x64 13 0000000000000000 8000000000000000 0000000000000001 0000000000000000 aebb048a42880e06 0a82fc96ab46703c +threefry2x64 13 243f6a8885a308d3 13198a2e03707344 0000000000000001 0000000000000000 f76fab3d0c8c5f58 86a6582b195612d5 +threefry2x64 13 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 4f56a3dab3651001 cfcdd06f8b5b9839 +threefry2x64 13 452821e638d01377 be5466cf34e90c6c 0000000000000001 0000000000000000 c9fc81ac4243db43 901cfd8fd5f300fd +threefry2x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000001 4b4b7208689c3b75 a55414a2d2ee4bb0 +threefry2x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000001 eebbc15aa98df672 e9a144a8c6cee1fd +threefry2x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 4205e3c81cc0d747 ff9bee23459767fe +threefry2x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000001 3adcde8fdf34b6ea b181e52876711403 +threefry2x64 13 243f6a8885a308d3 13198a2e03707344 0000000000000000 0000000000000001 f32f578de3c86db0 33cba85c3ab32ac2 +threefry2x64 13 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 8b991da7e77d5ad2 e0f66c743d048332 +threefry2x64 13 452821e638d01377 be5466cf34e90c6c 0000000000000000 0000000000000001 b3839b7842aaabdf 1b09812c3734f7d5 +threefry2x64 13 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff d734efd44c40a6b0 c200d10c90840acf +threefry2x64 13 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff 0a54d24f2de3fe2d c94935795a374f71 +threefry2x64 13 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff b05f97bf8112bd85 1e2febcdf6f2434b +threefry2x64 13 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff 706e230984d25125 1a7fb58e33062071 +threefry2x64 13 243f6a8885a308d3 13198a2e03707344 0000000000000000 ffffffffffffffff e79c1e9a9638a94b 0696219fb2391fdd +threefry2x64 13 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 63b3b5d7355ee523 98226c5378d79481 +threefry2x64 13 452821e638d01377 be5466cf34e90c6c 0000000000000000 ffffffffffffffff a74b06d5dd1e77bc 78ace2fdf2fd1130 +threefry2x64 13 0000000000000001 0000000000000000 0000000000000000 8000000000000000 695a084cd9107249 7c2a145f7a914169 +threefry2x64 13 0000000000000000 0000000000000001 0000000000000000 8000000000000000 426ce9a41d6e3b44 1f406838af84fc50 +threefry2x64 13 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 29fb2a250cb2be0e ab5d1d66743cb621 +threefry2x64 13 0000000000000000 8000000000000000 0000000000000000 8000000000000000 8f5f55581e428ef4 6f50999482bb0717 +threefry2x64 13 243f6a8885a308d3 13198a2e03707344 0000000000000000 8000000000000000 8132c0494d3a1024 1310f2c1f743337e +threefry2x64 13 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 f0ac482e2f8c554e 0c250a7c2bd56d1f +threefry2x64 13 452821e638d01377 be5466cf34e90c6c 0000000000000000 8000000000000000 c74c1599c6d82c7f 7d40926bdb8a9b86 +threefry2x64 20 0000000000000001 0000000000000000 0000000000000001 0000000000000000 76f8c465410f1b27 d44c2d67df04a330 +threefry2x64 20 0000000000000000 0000000000000001 0000000000000001 0000000000000000 a8049503dd3079f9 3d5ddeed522c0ede +threefry2x64 20 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 5e53259aa4258a55 0e8f38c365945d25 +threefry2x64 20 0000000000000000 8000000000000000 0000000000000001 0000000000000000 361a8be863ffb732 a4b1a2eeb58e74d0 +threefry2x64 20 243f6a8885a308d3 13198a2e03707344 0000000000000001 0000000000000000 fd6ae8f34dc33d12 038c18af4795d22a +threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 7ac8bd11c1f70ff1 74639e2ca058255e +threefry2x64 20 452821e638d01377 be5466cf34e90c6c 0000000000000001 0000000000000000 ed08efd2a170bbd7 0dd10199b9784662 +threefry2x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000001 ff2b78b5ab41d8da f62ebfe044d2eda8 +threefry2x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000001 5f3a212f661cd020 986a3ba650b3fe67 +threefry2x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 6a6b93a7418044f4 87b8ba42ce2ff9bf +threefry2x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000001 bae5e0296c6a477d 0fbb8a9f8a4ce574 +threefry2x64 20 243f6a8885a308d3 13198a2e03707344 0000000000000000 0000000000000001 99cec910eff5ec80 590c31d2679b536f +threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 02f8b55a501f2281 d76b4bf86e78c17a +threefry2x64 20 452821e638d01377 be5466cf34e90c6c 0000000000000000 0000000000000001 85ed5f68252b8dad 94e7c2f00c87c774 +threefry2x64 20 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 2315d2c0d1827ca7 6c9edc5ea9168247 +threefry2x64 20 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff e673b4093ab96a92 e6b9195814502ad9 +threefry2x64 20 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff 617e1767c6bab4b3 9defeccc66ef5483 +threefry2x64 20 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff 64008223d83f51ea 703e62828caafe5c +threefry2x64 20 243f6a8885a308d3 13198a2e03707344 0000000000000000 ffffffffffffffff 55c5791f5e6a445c 6244e287ceff815b +threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 69f5517074ffb421 364c6cb5114df09b +threefry2x64 20 452821e638d01377 be5466cf34e90c6c 0000000000000000 ffffffffffffffff 8abfad0acf126feb 7e4838608dff93a6 +threefry2x64 20 0000000000000001 0000000000000000 0000000000000000 8000000000000000 f3113561b7808541 e1d6850fd01f03c8 +threefry2x64 20 0000000000000000 0000000000000001 0000000000000000 8000000000000000 1f254bdb6686f3f7 2defd1bc9a4e7d58 +threefry2x64 20 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 becfaedd81933ce0 91105295132db554 +threefry2x64 20 0000000000000000 8000000000000000 0000000000000000 8000000000000000 08e7eef4615bbae3 16c446fef3ff2fa6 +threefry2x64 20 243f6a8885a308d3 13198a2e03707344 0000000000000000 8000000000000000 58af89abe6d07cab 12e1901ad854ba14 +threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 469ded4657b380b5 4e18d924d1d191f4 +threefry2x64 20 452821e638d01377 be5466cf34e90c6c 0000000000000000 8000000000000000 89983220cc01af30 756813c51f68660f +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 a6f9957bb320bd6e ef0a1039b8680652 fae787a45de5657b f9642457fdfcb48d +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 33a54b87b3cd8f2e 9fa6ecdbf563b5a8 931690edd16e1167 73f4cf17f6509ec7 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 b57fb4d862d825f6 5f5a8b05deb0f388 bdaf7ca748b32db5 dcc8a16110f45860 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000001 0000000000000000 0000000000000000 0000000000000000 63afa273fd1e9e0c 97afe3fa44762e3b 2219a168a1c4a650 b5aa9e933220d0b6 +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 18ebd38f634db4d4 fe8a4b02116edcae dd968dbd012bb9b1 015735f374007b55 +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 dc11f8adbd11b24a 791accb12bf2dec9 b3252ca2b3d45867 32583a89606cc095 +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 142fbf027471bec7 d4a21fe298e42da0 e1809cdb47379df7 895c488e4ce2e8e4 +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 56233cf7c5050e03 138e50f0180f9432 77e5abc32171ead2 22156b3a4478058e +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 0000000000000000 0000000000000000 b51f94a1964e29f4 73c3547be95bcf52 cd0980b164b47740 cb7a80706dda6cd4 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 6826fc7451e6c26c 9c945a480118b238 878fdb0ccf5287a2 b721878054b3e170 +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 0000000000000000 0000000000000000 1450ad64afc5f2ed e276f0d9b36896cc 1bf54af66c1ea6e1 b75bf6b012256a2f +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 c0a579b6df85d3f0 732bf17e102f3503 e9ef8226f861b581 9c6323b1032ee103 +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 419fb75d6279b45e 456c9bc33b2aa89b 6b9f17cbeaafb959 0f4d34c7bc2615dd +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 35dc176476fd83f7 11c97fffd44c6f08 803723f5c82c0c4c 915629678133f8d0 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 0000000000000000 7b6e1a8f678caef4 db5a7994ef339ef5 b7aff2cabd5a0d5a a1b164b52ef2880c +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 e335bf28c658f0a2 6dc44599a8dc94ac 17ce032c8be59e34 46bf9933175c2c84 +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 a0ca6ff95e2395e3 f178163a7734c5a4 3fa3d6b89533b005 74ae65ed952f7779 +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 87043dbdc9710b4f 9257db04f6d3e197 385860312b4c2170 ce4cf41003912f85 +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 7040ee2508a3b5f8 641da9784e15d9cb fd6425f2b65abfcd 52a998ee7e05bb87 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 0000000000000000 c435439eadf80e26 3d1d6a0cc0c5a1ff 6e0f4ab6ccc428e6 a01b294b56f911ca +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 c6a96a811e9e7967 246e0dde25ee2e41 4f2a463cafbc149d eed2f0dd7fb7e015 +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 0000000000000000 0000000000000000 3eb1e2a9f11e2bf6 c4bbbb8f8b92a4f3 a2785db07b5e26e3 dfe2c344e871d170 +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 94daba158dd2da48 f5e6c0b25edfef90 02dc9eadc3f11073 c6bc42a8d86e82e0 +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 2f0dd3a02e097fe7 c478a58d8de77acd 432b1f1a4f0376d1 a8ffef5de8592b22 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 e145933082f42a2b 281a975a59959231 42e82c1fa3928ee2 ccc5c01c9c173ff6 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 98968fa4a639959e 31522da140cfa5f4 3925eef1f1df6024 8d364318e053e86b +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8b7a6424cd57bd36 0f14e72a776d9eba 5056bbff35bb2d8b 2bf2035a0f74457b +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 b98486865fe19a16 bbf02df5d0b6f14e 1d1d3db837473cfe 39d36d4ef6027d20 +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 4546fa00ed7ba2e7 b9598f5ffa69d1b5 2a31e21e7479956b 18b430b333a65956 +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 7e3fc60c2ba2b532 42ecfe3256df67fd 12cc29eda1e8e628 476fa98b6c20dc0c +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0553dc3e29eb393e 4fcb860d74474ba2 a54bda273d90fa5e b2d09969a3e0781e +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 1b0d22708753d5a5 fe97c91941b129a0 43fde34d3a6b9581 684ee07a5d059bc6 +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000001 0000000000000000 c5ae23b6e14b65a0 1bb8c20cf54ee911 afd0f01436a88dc7 e27b950209d0e8ea +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 d6e0471854c36f95 024f53084350d59a a746f965db3779ab aec82c5a5a89448a +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 c5aa1f1c7ae358f3 97a8892135e7c1ef eb25fba1cb9a4c41 7a90abbd43261fa4 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 fb59e13f8bf1a7b6 3406ec6cdd6e2f1d 28d4622f7d272829 618f7c7e73507e00 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 641cb9a478c9a5f6 6bf494830fc3c197 836e085ed5dfb374 cbae065146b3e242 +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 31f44b90e71f66c9 2f3ba3de820f4650 9097c77cde234ac5 50340ce26229fabc +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 4e026822a87dee71 b4ab7f79ed3dfd4a 9429731fdb5c0a64 7706366fb9251512 +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 1949594f1d057a72 cbaea16559f04cb0 4a0ca9e5ad24f4cb db1f95560c87f79f +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0f9ca509614863a7 615112fd34af4c67 408fd57c3fadb45b 1f229a09ca130ea9 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 48b71c1ec5e0e1a7 61005d67d77283bd 7475cf1b42918462 9a47b84099cb8820 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 f744c0e233f14f37 ec52e887545bed98 75013191d39a68a5 b5107d5fbda31dba +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 0000000000000001 07bfa94414046839 c9292f370d05ec10 e5abfd88ea69c29c e5694ea31b40917e +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 5b1e5890fd4dddda 3bd7fe815d826da7 5cead66cc2d6cf4b 9f2b09ff30f4496e +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 e6dcd7854a76f333 535299e0765eda14 a649fdda2cf305f4 601265889b4f49b7 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 31ce59c9547701ce 442e5c98d58dd9e5 a4272c64230571fb 54d00283ad3869b8 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 78e0555be3caa567 29fd32a8e78dfe2b d12e964c3bb4e95d 508ce2a099d1294a +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 9bfaa6924981503c 3839252d08d78e82 b5a318c512e81925 2c3df5629446cb3d +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 39f7c8350c2fd966 a296554641bfa50f 2217077aa07b2a77 f4e41f63a9bbb3c4 +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8dad2651f0d59fc3 3fb4b008bf0c67ae 7a4958e5704b0e42 049189499fb9d713 +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 47ba2144a6d5593a 70cf55d5a21ced0c 7bae9fe35eedf169 5fa2bef1f0178e53 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 3481c43775a74a3d 594029c16094b2ac 4242c166d72c5e8a 47132e77e038a80f +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 2583f96efb951f87 5c05dc0fad2a0640 2276fd3905536384 f52f698ab7c15254 +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 860b9848db0836a6 60e2cf66b950ac3a d9d93cc3d01c0bb8 0c39d9fca3179af4 +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0b97f6aec4194f29 f807cc683239c776 92336bc0d194833e 6af28b14847cbd25 +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 d0bcda618f970ad7 23bf3f0b100b6b8e c0f43c6935f03f96 8567ff6ca9bb298a +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 952d67de8cc88100 b05aeba45473ada1 a12187872e534939 6bd07569c5c1384c +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8000000000000000 0000000000000000 0000000000000000 206a6c9947cd4059 ecb599e01e678611 d76e1a6ec72eed5b 9af53b23d20fdf5d +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 4686adcda45f8e82 f7c04d3b241269f9 98c2c7452f1de0be 9c45ac8325862db6 +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 1c1af5206f2ece54 f9bac132c72d711c a227149a44bda9d7 828db0a58587130c +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 c0c6c3989f8a19c4 82ff34015e798fe5 1539e98a9cdce38a c98e62331c6329ff +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 36d9f5d821c1c83f e2db772b11f2f021 6ba03362c1c10994 8d8a339448474da9 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 0000000000000000 0000000000000000 5225a064dbddca63 dec3c80ea3f20208 b04e786c1de1a6b1 86e5434fc1dc51cc +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ccb716bd11cb6fe2 3dda97c9ec8c6199 23b4e9fc6557cb92 03ee97e50b557f80 +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 0000000000000000 0000000000000000 cfc902fffa76fa1b 71feded34df89372 84bc39de7545239f a8a7257817796076 +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 43ac62ad40bb0dc8 f19797814ee9d712 bc733e88b4f4fc6f 8d88689a11c0e444 +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 87c9feb08a847950 19601bb00361a1e4 b08ea511608f3a79 e0682be6cff83767 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 da75d515c7765562 a53632bf88383197 2ac07dd554ee8076 d5b5d9ca8fc4d7ef +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 acacc47aec597245 5603e39ea0c435be faac042a22a85a33 def0f2feabb108fb +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 84ceb8a17a4d921d c34ea70e11cd714c cb778d241722ad54 b6f57011c04feafd +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 17df51edc9093e45 ff21858aa5e3f88c 719738071c63ae9d f78bd7d434990a43 +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 2e68fc7dfa5150a7 13b3e50898941ecf 67a61073ce21b66b 8ae48f8761ddb641 +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 13019c159fd18540 56b47f4ff862d77e f0525397b38f5659 06c701aa0b5f0ce7 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 120841cc984c8b5d 7ef7e0e47aa11b7f 427eccd66d8ca6a7 8c9c187c5a93f9d8 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 5cd4de739c3025d4 8b7cba4515780d90 fcb10461e7262355 80cefb8eb218096a +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 3138f3138e47b09b c3957d408434f8f8 f53e02d616b134e7 721029b2628b0497 +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 de825ce58d5c1163 fcc32b1bf6dba058 23ad3d0d2f87e6d2 75e05c241fc71616 +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 da20c7bc4e3d9707 5d92445c4891a513 e82592343e1ad0cd fe01a1f64d1e9a00 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 154c6525d00f11aa 05559415b1cb8a8c 030bb62025d53788 18030170eda486a4 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 0000000000000000 31e3d5a16fc4baa7 aaeb4bc3b0a7054e 76338ce0989861b0 0c883d1d87da3197 +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0003485836fb3812 6efa47e66ad4aaa9 dedbe1b07f5e2027 77013bbab7104b3a +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 1812be595dda0739 4e5a2fdb16c8947b e04cab5c91c3864a 1d1afd092303374a +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 bfdadb9f36d8e4ea 5b422319060bf905 53ffcae0b8c7ca1c f6562ebd20777d5a +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 96d112d938bc7771 e3fe46aa2618ac2f 206673e37bda2625 af1ebed61abd839a +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 0000000000000000 c11769ceba44ff3f 1996279e3a7cd8b5 b0ce7ee3ee7555b6 7d932c7e563d7cc5 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 9eae02df80c59f3b 01dc7640aafa9fd8 9d5b7aa9f801ceb4 79d13e5608aedac7 +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 8000000000000000 0000000000000000 dd81e5071213cb65 f95242bc69694579 ba58df28812f62ac 8fc5dcbc22f589f5 +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 706df8b143a55f67 ddff5e09840fa38c c879c4f524d998ba dc73a56cd4ae98bb +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 78053349f166715d c14d62de2c740d61 71c3e7d81060b29a 21bc36b618c97a1b +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 3c51fd1d7a0231a7 1c716c429b12d830 f98749855715755f d4928002384a27fa +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 3f2322ac3118ab7a 77342b3ce112420b a4e74eaea4b602ef d7a036a48f09bbeb +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 1f7d2d32b4560572 65dd77ea737af34e 7273b33fcc3a542a f4be4f5efe578555 +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 9c8b4bb1d1234df1 c81acf5747a7e967 8a2816c04ee41e46 5044b310241a3b3e +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 9669abc61b43311c 43356b81b746111b b6dc48eeb21b8699 dbe907f08d01a64c +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 8beb2316ebfc349a 43338972ba44efa1 027aa324111ddb2a a0cc5e126b613e9c +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 9ab42dcf03464387 a1ba2f214f9603a6 75659e356c523763 140c05291e373a99 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff cc76b2ebda048a1f 74303dd7cbc9fe2b 86bcb8baedce89d7 02e1b32c8116a108 +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff cd41da269ca3c8f9 3e1b1b12a9e2aa1b 68742c4dfaa5e2f9 d905f214c4e32adb +threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 a15fe10faae1413d b3ea00728b426ae8 44e0362e37778626 d76da78c8bbdb2f3 +threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 c74b6463897871d2 3dee782ceb448d5b 76fb472b4f8dfb3c 579b0fa66a5a7e3c +threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 c596fbc29750200c 5eac3cafb1b65cff 0ebf88e52a4ca31c 56ce58d36711edc8 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 344ee7b935fc9f4e 86e7bbe859b3288f 4fd5f444ff546852 379d0f15264ce291 +threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 a12b7c0ae47df332 b1fb8faf8c7e055c 012f4ce8699912e8 1807370c17fe4806 +threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 309cf1978593199d 4803a4c3464b33b1 8de1cf19119e5184 0e98be6e29cc004d +threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 a3f741dfb4b0123e baacbbb9319e1f3c 6e2a766bd9f55e2d f85ca77e46c8ac8d +threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 b1940157b0d12078 5a6d59771301089c 5528ee2ad8191549 062755f87de1a247 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 921cfbb9ab46b160 bc60a78079a42218 dd7c39b5185d007c 046c126b53105693 +threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 25c6067a84995616 d33240726703b517 ca201d11dd57f427 64a6de3f4143ee6e +threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 8000000000000000 afeee610c4519328 8cbaaca176308e27 dc15a9770306e954 c7ece70c6b146822 +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 f89ed93865056e32 bd896a3dbd85a756 62d8d73be7c894f0 e792657aabcd4d07 +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 982b64d9ed17727f b92ee937b202c51f f4b17d93cfd45600 f9f8aae4c794d15e +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 b6a7225711cc34b8 53074728c278f4c7 5667235e08827615 132e773e6e7f0eb3 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000001 0000000000000000 0000000000000000 0000000000000000 44bbf877aa21ae51 965dfe7a5d2264b4 e9f7ad5df7d8f80b f7b569832716868e +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 93f2387a206e8f9e 6cb5b48ffdf2d7cd 0e979b44e4dd0e1a d7bff06c4f8e5211 +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 c89facdd90bc86dc 2860da6424e61172 6d062d8f0dc96667 977cd762173d0fe5 +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 c3d42d91a2e77a9d 9618b89ffb6c4c06 72f6505dff514d2c 6dac73802a09ff91 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 c65d933491370e7f 8bd8c1c43548d88b 677cbc00c0577228 9c5c490ce2485273 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 0000000000000000 0000000000000000 fb128418d58c8190 a30cacdbeeaf83a4 7daabc3ee8242ca6 cdc871c48430783c +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 aa8f96391f668b67 e55eab0e8e2e5836 a1467300f7fb04f6 873ec0bc55573b89 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 0000000000000000 0000000000000000 7bbbcbf0f617f950 8eda8917ee3a6a15 56bf5df8bfd1060e df7a6d2bf0396704 +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8ae5e8b70c436fa2 a95dbadf918998a1 0e5908b70abc9526 293f0eb4a5fdafe4 +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8186defe625c11f3 06657e8ebbc151f1 f3b446f77ff82f6e a8655aab80b83368 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 bfff7105cf64329d 5da774462017e77f 604b3d42401fcfd6 12c33a3cc0a622f7 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 0000000000000000 543bc7d16d113372 c13b3c63636d7acc c596bf4b944e106c ebad1d5a09f2d8e2 +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 1c72022fd804739a fb70dbc298660c89 ef584d080b442849 647fbc04f2b0ba2f +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 e53b96331ed89298 87f81c5d8334482b 1ab323554c0c08ef d8a54cad427df583 +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 aa234e6ecafcf2a0 4744cbeaae240876 64c770d4dcc26254 153e3de28b8c62e5 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 d69224680a4d2e61 cf82a8b14c8282f6 c35caf223d708d26 d20eb877b3b194e6 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 0000000000000000 05b4e3832ac3001f cabd925f6019062a 6e881791ffffcddc 3d07c493dc18ee36 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 770f680e00670cf7 55b37fe1f230b862 c60feeaa07a9a962 74b7618ae3112c62 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 0000000000000000 0000000000000000 56292009e38f1873 10629818ed1b807a ecf7a9c2699f4c84 68dee03a7ba18cc0 +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 e976691f1b80d958 be8abbb14c5ed824 f29b8e777ca5c94b 97175c4d56649bd8 +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 99122a867130ba68 29e6fc66a54153d1 6bb286953c60faa3 15f3a11b70692bba +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 568c091d800376a4 6410b91f1213d435 5a53e48b09b33a5d d3ca8ae91eb3cb52 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ebfa25173eba130b 872e5f2c3f858550 34ba124306653c10 75abaf6f3b82a8a5 +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 cb423ba5d281d13b 97355c07bffaaa4b f04be7e7841daec4 3d58b14622d0c064 +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 cd807105b3a2206f 8dfbf66b057ab348 81333ca31ef60ef4 db7e5ee3664aab98 +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8a7a795de1c22fb1 710a7f0c73e9c6d9 552b80b908fd894a 1b2a91bbce9b4246 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 c623a20d932ccb7d 03bf8b8446d7128b 72c4a06097e4601d 06742862e6031180 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 61f394f4b8f77bb2 f73fa064e84c2daf 35c35bfbdfbef4f3 a724fb52592f935f +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 6db56dd85b84b7d0 f159755eab2ce68f 60b4cd66d0531931 593643f04eabd3df +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8bae3792b1c7f028 d06b57022556fdb7 c9d485c0d516a5d0 389901e211326996 +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 fda4e34b6bda2e78 1bcde08f72564ebd db1ea7ab9244c332 1809e6e1f0baa36c +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 1f46785827cf00cc 73efc9633842cd4f 76218d83b83a8156 62bcb826031f519e +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 e062b28847b0a31d f9931a29afe520d4 2f2d40165188a578 4a3e9e455553a412 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 cf65681072a11a30 00f9875b6228100c c6631b848fd3f81b d1391138164dffea +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 3b55def85f780ad3 7c89509a536576db 703c7a54c92adc37 a634e944edfbb1b1 +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 523c9f16575344da 3b8b47c4f2abbbed c086def85eb710d0 ccccfce7151fed41 +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 2989b44b7bc9c589 6f51f1aa8194cd9c 910b471870d34248 3e16e545d6f9d3b4 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 8e68fea009eee4b2 edb5e4274c6f0a04 eb34879011e8d7b2 d9da39416b62f51c +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 1c84b638d27d7dd4 4e6dd3b04b1ff092 1adfe69682d3620e 508a1926a26bada8 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 52ea8499b2a6f121 de7bf09d98328388 a93dee2da6423d6c fccbb0aa5fea8721 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 0000000000000001 f83be1563ca6864f f9b2244eb9a0a0bb 77c0dce929577f0d 4312da346a75b901 +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 85874a427171bd52 087203b705096abb 2b4eac4bb197cc47 668384e956bb1b88 +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 558e048a3b205295 73937c2aa93e99de 59141306fb089079 ad2f30432f603af0 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ca31a1506188b7f3 e2f687331eb59e6b 2e0c5db2e49d0369 b2504b862d707d07 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8e15267d675bb7f5 37e79e8f2c4f4c1a 738fd248c3fb83ce 6c5f250b42b1ead3 +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 7a8abd584135cc95 54ae8923a9790941 36b8855f23b8c0cb d6e30da6960e6d3a +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 1b3e76a15a3d81bd 47515b766d1526a2 a8ac2e9d8c6fcbba 14842f687111ad6b +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 801ad32259dca163 ac610dfd986e37ab 92f0626474e43f64 f13aaf2bf6f9db40 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 4c2f35571e07df4f e6181172f7a4a8c2 852fe5c10b21ec0a 36859f042ba1fbb2 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 014828936fc30529 30b098f7baabebab bdba756ed22e67e8 dbfeb29883206ff2 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 603bb6e0f2479da5 e51dcee4b383d277 d961095b84b3418d 2125876df94c0a88 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 5eeed616d1e3b26b d476bb39d85d25ea 2388dc0afe33a091 53fe3702435ff634 +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 a702cfdfe4973280 7c249f1d0758cc0f 98454baaad673214 e3c59f707aabde84 +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 3131a6508d56437b 6cd6b52c18dc1a9a 7150f4cca95bc4b5 49a586b366d35c15 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 67c05a6a0bb9ed25 de5266bab7cc9295 c343dcc30c002b27 5efb26d17a892573 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8000000000000000 0000000000000000 0000000000000000 7805bde324c1af1c 668691f3be21caf7 3d6b424c11f232da aa67d4a504d5e515 +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 36fa107bd920d2a1 3241cb98bde958cb b0dc16d6e08b0631 6e7eee73c179ad07 +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 d919b55afd55c267 722ed883e05662d4 26e2c219316f4af4 952da37749e78786 +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 b1480c8085f9a79c 80fc9858168a8b32 4666dd30592b2e33 823262f5f32e3ad0 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 a712d08192fb239b e6e4fe0a58a601fd e71ad1813b69e0e2 3219922b43502981 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ef86f20d6c3b68c3 917b208c644349cc 73738d7bc08f52ae 4144bc69eed1d435 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 13a65d5f806490ec 9b7641d917615d41 ff918ea8509cc729 5c120cff123aedd2 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 0000000000000000 0000000000000000 e6e9d6e5a345a1b1 ab16981d4978321a 9089eaa221460088 ae397a5f5f162e31 +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 31243c5a95e832e1 cf3dc1a984b07f34 e950b7eb25eb26ba b5593c3426a1f0d3 +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 fa7817180e135577 a128dcbcf2a70e97 e4932adcb9b11983 9755f62735e87f34 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 b834ea24815ea121 cac44aca182f748c b0dde9fec9df32de 44b9a0fc44677efb +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 5a6173e2accebd38 5b131c1580e7e4f3 efa5bf67388ddf08 f9ac55e63922c0d5 +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 b384790d86c31a9e f1fb8ddfeaa88d4d 066441fc1fd9a778 2f1c77b88b083355 +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 96659fc0678254da 6918643b2bde533f 5715c3b72f70b12f 03fbbca391a5696a +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 1c4ba033ecb49c93 966d0e8012a5a388 4a24daa292dceaab 03d2f3860af6f4e9 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 15a613110b4673a0 121b874b4810f620 f64e02eaa1212920 bcffc54556c3fce1 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 357adb0df3abcc95 db1ab7be4520ea15 6951e8aaaa5af14c fcf212f0979c0363 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 21f38a82dd49ebdd c9bade4b39894d89 992854bccee76282 cb11ce4b04634f01 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ac11615cfb8804fb c26d1580d38b7c7d 3e8e683a4d20ea56 8a739c355ae4bbb9 +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 b587771995c1ffe7 cfd116bd3029fc42 4d8207deb6d416c2 af9483f1ce57809f +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 56a77269eff784de 07482fa109e195cc db90c9c776d70a2a 75d0913c19d22612 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 9565f1f53359b88f ad98ae294ac770bb ee99e6b7b51226f9 c4e0ab4c9a14125f +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 0000000000000000 111a5de94005c146 2030eded2dd3b8e8 c957d395e7de6463 8d808f6ec9f73b44 +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 40e6bb219ab5c4cd ea85ca56ac874867 bc1540419dac8e01 563ad7643a376e93 +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 164321657c70819d eaaf8de42198a16e 7eae23927bcbfab8 73a04730feb4851e +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 97f229a61529e38a 8e319418bcfbb12a 6ba27633af0fa6de 57cbb3e68c3527d6 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 68bbf3170a0997ed 881860e14d5cf2ed 31b899a4921526aa e677a9c70e92af02 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 0000000000000000 e60fa0c35e7b6944 9dff379ef3e2ad34 fabe148a01b71390 73e1d7df2dc9a644 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 562d75b725acf954 f7f1b0276038ebfc 3c1eacdd68247566 c742c844a8deb5c5 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 8000000000000000 0000000000000000 4b9990815eeba4e6 2b3ef48aa6419c30 d5b962dd45793f01 c867e6d3d6a9fbce +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff e38fadf720fccf69 73760232ff7339ae 7096a387f7bfce8b 09cdf4a8033c6461 +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 8fbcb0ccb5a68c09 3c091f05ef3feb5a 880c915948eff90f 6d042824d55cfa79 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff f4187df19710e7bc 8176d6775bee5998 b2629a879b5983d3 8250daa72833a195 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff f16d33bd22225c93 257dd8242032f571 eb9c45bd059d0fa1 5a7f9b7c55960b1c +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 2e8361a4aa930a0e b8cbba78f68d1b63 3c0df7648dc4d4f9 3b533a4d2913ba33 +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff c3b2ee2c35624ffe ff045283a1e08c3d b1b3042bb82d6ede 1bf1550286f383a2 +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff f0326d40804c3153 37c27181a460c9ae c0034d039686abdf 3d55f60596ad5837 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0dab0563aa95c953 f38f100b1348d506 c27321a2d99f0a88 94e94b06c6477c62 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff a87036c367446e12 9f68749a58b47e25 6fc48a19201b0798 952188d35cf69fb0 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 36c8bd17d63a9a82 8af6f23bf2d3040c 156eee41f13b2798 244e8221835a7618 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff a293802a64ec9166 8039fe9d142bf9dc ab193c3d4835196a a650f43736078795 +threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 a6848ded0ad67dd2 361bc11075f5202e 845a8a315b2978f9 d47cf41ceb9da6e9 +threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 b0d56aaa267b5d14 778b7e865a84766b 533e6fe15d3fdee3 09d71e0d017df61f +threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 45fa780c18a49ae1 51be9eec7776ffa5 50f9251d8c94279d e6cd7113274158fe +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 e6e1d3dd2aacbd00 67e52c14f46d11b5 2946912c9908c136 789dc703ca33c595 +threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 9e858b947929378d 49298d74f00caa5f baf9196410a6257c 3e63a9a8359411c6 +threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 d8ea8f824e58974a 3d23b4c3e1fbee5b c6546469d088fcbd a72cba22c3abf1ec +threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 84e993586057fd3d 5b26f2142a47213b 95bec6cb2ae889ac ea3895b9b7c8a3f8 +threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 9a089a5f75db3ff3 3d97d5241f6b069e bb731d24954f2716 91213cc1c1f7e527 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 cd2eb1d24a7de2c8 a3b1f18a27af4225 5f9a54357f4af40c bb8e26b5a9efb033 +threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 616e99086444a4c3 bd6973f3a79afaa1 c98be82cfb397c4e 01fc06bb62fc3f33 +threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 8000000000000000 763ab713c2a06541 ac19a24b93f5678b 95117e99d0a8b3a9 9d41e61fc315bfe9 +threefry4x32 13 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 bb9799a3 99c96b85 147cb42b 41c4d9f0 +threefry4x32 13 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 07d71da4 d1a2b380 4b1c0744 07071fa3 +threefry4x32 13 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 6f325910 eb4baef9 63dc79fd 9fb4289a +threefry4x32 13 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 c06c8569 41f8c075 0d9ac8fc ca4cb183 +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000001 00000000 00000000 00000000 46dfc573 32ec2cd4 970d926b 4741150b +threefry4x32 13 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 3cfb67ac 563ebf09 9e64b7fe a17a6edd +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000001 00000000 00000000 00000000 6fdcaa29 85eb97b0 641658b6 637597f8 +threefry4x32 13 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 6921a1bd edb37289 2a96f041 feee8d3d +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000001 00000000 00000000 00000000 46996f57 e449bcc1 8eecf7e2 8c9476b6 +threefry4x32 13 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 64c583dd 541b87f2 a1a74ed0 be222e82 +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000001 00000000 00000000 00000000 2dd111e3 4bcd84f6 a7bedab5 cfaccded +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000001 00000000 00000000 00000000 91ad0543 8796f2e3 1f7dea71 5954cf16 +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000001 00000000 00000000 00000000 8b838910 ec61f53d 9159be96 00a91b1a +threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 db476b8b 64ca080f 8164731a df2ad744 +threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 f2ec5347 87e3be56 ed0d2f4f c549203a +threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 a105cb4d 540fca6f 1912780c 021445c5 +threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 d1711880 a6fdb528 57b11ea0 8ee9b71a +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000001 00000000 00000000 4d25c9d8 35411722 876597d3 a77c6b82 +threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 63cd2323 f5e6e7ec 4c97c974 75e7869f +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000001 00000000 00000000 eb05fac0 16e56be7 f2de2606 fda2302b +threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 7513c86c ae260696 bcb5037b 83374447 +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000001 00000000 00000000 a51b3ee6 b7ae14a5 a62dbd0f 1cd66929 +threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 24989ca3 581db664 f62bd4c4 4d4bf09f +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000001 00000000 00000000 6fb81745 d27ca3e0 ceb229f5 a9ea334b +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000001 00000000 00000000 a869236e 14bd4ece 83fd7d8a d40cf21c +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000001 00000000 00000000 c34f3a0e 43b2e4d7 934173c0 f3cdf64a +threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 babf5878 38c2494e 3019c043 1e0b2b9b +threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 5d800e70 7ac570e8 97c4694a d8a3180a +threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 e8c65d99 7c5ca426 0a86c445 7d4d3a21 +threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 26d36381 19af15e5 a54676bc 4af5d5eb +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 00000001 00000000 5a87e689 783f1462 3cedd1ae 2ea11e0a +threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 92ceb56e 1d319cd1 a2b34995 e723ef97 +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 00000001 00000000 f0ba66a4 04f0fd34 f5a697dd aa00c84a +threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 93366e54 253cda1e a4e1b57b 70d26242 +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 00000001 00000000 d972babe b256e807 670bdbbd 74ab6ecd +threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 a205f99f b02fddb1 0336fd8e f281b7dc +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000001 00000000 0527b8fa e9fdb4d9 08177632 a4c34938 +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000001 00000000 28006c21 591fad8a 36cb57c4 04820ec7 +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000001 00000000 a2538b90 2cbe2c7f 1542fe5f 9772775e +threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 6a51ba3a 33fc7dd8 83ec724b 592255be +threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 3b00082e f3111cc6 67f122b1 a4c02cec +threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 eebb5e2e 5d5a0d75 64526042 bfeb2a2b +threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 cc78dfd4 f03f59d7 24eb369b 7f233bc2 +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 00000001 8a1de487 dbc78315 02bad926 0d62c434 +threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 5b7ec382 20dfb637 5e14485f 4365e731 +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 00000001 48f54a63 040c8fe7 6f5f60e7 a8e2c422 +threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 bfa7d1e0 b2a7a93b a4a0780f 1b11e5e2 +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 00000001 1d7fbcc4 fcc9efd9 4a40437e cb63413c +threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 730a2e93 0cbfda73 72c9f9fe 936a1a42 +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 00000001 c325dccd 4d0d46a3 a0bf87fd 765514a9 +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 00000001 77eab59a 4aeebf17 5f99bf1a 61de049e +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 00000001 af627ea8 d88088da c07f790d 4ff5b0ac +threefry4x32 13 00000001 00000000 00000000 00000000 00000000 ffffffff 00000000 00000000 e0cb88ba 17e181a0 2946aa88 9443cccc +threefry4x32 13 00000000 00000001 00000000 00000000 00000000 ffffffff 00000000 00000000 b0ea449f 66f501e8 8df43f17 52c4ee1d +threefry4x32 13 00000000 00000000 00000001 00000000 00000000 ffffffff 00000000 00000000 7889161d 5e28d071 d3f5c7a3 95225ab6 +threefry4x32 13 00000000 00000000 00000000 00000001 00000000 ffffffff 00000000 00000000 880f46d0 28610176 362a2ecb f1a6336b +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 ffffffff 00000000 00000000 d2b3535a d354a28a 36d6521d e0ce90a2 +threefry4x32 13 00000000 80000000 00000000 00000000 00000000 ffffffff 00000000 00000000 5f8f5010 72df59a8 f6979560 6abef914 +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 ffffffff 00000000 00000000 835394ae 63d0fa88 4f429ab5 e9b5607a +threefry4x32 13 00000000 00000000 80000000 00000000 00000000 ffffffff 00000000 00000000 d551fb5f 37913678 4ac2778a befd7153 +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 ffffffff 00000000 00000000 497e8b34 d89d8baf 1de18810 674236b2 +threefry4x32 13 00000000 00000000 00000000 80000000 00000000 ffffffff 00000000 00000000 7f592187 57aec906 15d8b63e 6702a7f9 +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 ffffffff 00000000 00000000 93492d6c b08d1b13 356c8f17 49014dbb +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 ffffffff 00000000 00000000 2aba9b17 b0f1815b 5f138050 2e88678e +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 ffffffff 00000000 00000000 b0afc429 9054cef2 63f61b5b d2607a3e +threefry4x32 13 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 b5a298c5 98544b8f 0b290c3b 4fc4fdf3 +threefry4x32 13 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 e2041951 46bb6763 5a36b34f 1f66efaf +threefry4x32 13 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 89aa48a3 c778ebf3 60c3ac82 dedaed40 +threefry4x32 13 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 1eacd90b c3f0b4e6 23e423ce aafd4b43 +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 80000000 00000000 00000000 8a638e3b c227769d bae62226 12630b0f +threefry4x32 13 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 97724835 82597cc0 49882f15 7c12d92f +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 80000000 00000000 00000000 591bf94a 59fa8964 5dc10c15 dea6b756 +threefry4x32 13 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 541b74ab 1aa9ef7a 59220844 15fa0d90 +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 80000000 00000000 00000000 385c7d29 c23b3a6c 0fca8dd0 3f4f3e91 +threefry4x32 13 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 e538346b 44592384 21c220bd 940f1fbb +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 80000000 00000000 00000000 6a8dccf0 e3103390 ec3122e0 1b0dc865 +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 80000000 00000000 00000000 10259fc5 4a51eb0e ed50befc 8c10418c +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 80000000 00000000 00000000 4f20b506 d03e080e 5dd8990c e3fafd81 +threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 ffffffff 00000000 20c66986 ce82602a b34b9348 de9cc423 +threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 ffffffff 00000000 0a8f0c1d 82fce677 27c1ac16 57988493 +threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 ffffffff 00000000 7bfcc4a1 45a65bf9 f5aeacd1 a2947299 +threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 ffffffff 00000000 90875e0b 82506f17 b531b1b2 7d2d028c +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 ffffffff 00000000 18545949 69305ed4 4b3da352 0f8dd522 +threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 ffffffff 00000000 b4d7bb50 ac6f5eba 5d97c45e de2d6956 +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 ffffffff 00000000 617273a9 211ecb6a f327e136 bdd5dacb +threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 ffffffff 00000000 7a3467b0 f8a27a09 b120bc81 8a9557f5 +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 ffffffff 00000000 6de0b215 7d98a8f1 58cb248f 4f666c7e +threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 ffffffff 00000000 244e2551 7ab76c56 0cb96ec5 fcabd419 +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 ffffffff 00000000 934afaf9 56a7c139 6962f013 84ec70a1 +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 ffffffff 00000000 c6a6cd92 d83ee260 8b666f81 94a02e20 +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 ffffffff 00000000 638f713e e708f8e2 fff2eb86 31ec2455 +threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 c0163b54 8f252db7 c28d798a 6613f48f +threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 ce187c27 a948119f 07227a1b 0c6ead40 +threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 5d64e652 a3f06629 387cb0a2 431cbfee +threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 32ec886e fe5884e3 a4a72770 4e126562 +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 80000000 00000000 a4ae85df c1d2f99a 5fe4d68c 9e3f0931 +threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 3f93aa6d bfaec1b9 456c1592 d2fb4742 +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 80000000 00000000 6a664c79 50161d2e 4b55d3fa 9137506d +threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 f2192d18 d6e93dc7 f0faded8 1413e98a +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 80000000 00000000 a4efc3b8 ddfc1a8b 47fa89d3 e28a2d7c +threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 a6307085 fd39c3dd 440c18b7 7338e5a3 +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 80000000 00000000 50bccbed 79ddec0d 53d7163d 584f8670 +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 80000000 00000000 d3b55c83 6e7b6f42 fb6a086e f8d484c3 +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 80000000 00000000 ea8172a9 0f986a3b b392993f 370b8468 +threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ffffffff 859aa72f 6bb65ad2 1af7d19a 07b3dfba +threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ffffffff 3b681644 1118ab22 cd72ea4e d032523b +threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ffffffff f7b84f1b 4df726ca c2f490f4 a1c7081a +threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ffffffff ad9946e8 09c1c011 e4bb5cbe a8384ba3 +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 ffffffff 130ffb6d 587e8e0d 265ad6e6 51acdfb1 +threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ffffffff 6f3d6d3b 9e1ceb3c 5de98f47 5dcee187 +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 ffffffff eeb5e084 76c64fbd aa92e022 bf4c9c68 +threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ffffffff b2b71f54 101817ca 88b01673 6c67712d +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 ffffffff 1f5a4754 643e6831 b3c094be d28a2a24 +threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ffffffff 549a5412 89bdc102 614c9193 a6d813f7 +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 ffffffff ffe3fd54 21a20d59 03cf8258 84ac4999 +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 ffffffff b79cd0cf b515fcc0 a1674946 a1187117 +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 ffffffff b6305e69 b3ccd613 a3266147 4312ec73 +threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 7d67e519 55549296 2eb13bfd 81823f68 +threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 66dba48c a5eee0bb 18d1599f 1eba839e +threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 d71d63bb 3351afa8 b24560e1 b6355e77 +threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 d4f42034 cc3975c3 c9ecc935 658abb6e +threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 80000000 f9f9b176 5d8314e0 9685ff9a e8dcf31f +threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 75151c94 5f1bb005 f9174036 95460872 +threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 80000000 007d59b5 37178598 35fbd0dc d54535cd +threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 b5f32f71 a670ff75 2bd1eb0c 74138877 +threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 80000000 19319fd2 97eb8752 7c7c5657 a95bcf65 +threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 5e75035a 33bf62ee eaf8c0b2 c7461234 +threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 80000000 91894181 9b4a5a5a 5436d9a4 464b4f16 +threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 80000000 12a30ea8 5998d88f 7efddb98 18855380 +threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 80000000 b9ea931a eaa9ebc0 23814855 1ed78d0e +threefry4x32 20 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 7abf626d 1ab006a8 df122d54 f32aad64 +threefry4x32 20 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 9ca4c2d0 52b79a44 746ff6b9 d2bc40a8 +threefry4x32 20 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 1660946a 5c6cb533 bce451d6 6a8ea7d1 +threefry4x32 20 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 aee9b8af d3974b35 08430dd8 c0144975 +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000001 00000000 00000000 00000000 1d70ba8d 10b08201 d648f656 53725b82 +threefry4x32 20 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 da93366f 0c3172ae e540e7d3 4394643e +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000001 00000000 00000000 00000000 d63def2f 21dd1e3c f1f869aa 45651495 +threefry4x32 20 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 76d830a5 5626c957 ad7bab47 bce56186 +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000001 00000000 00000000 00000000 929d0fdb 313aba54 6ddae3a7 458ac900 +threefry4x32 20 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 8a33982c 3e714678 8e459239 e69e7871 +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000001 00000000 00000000 00000000 7771a0cb 14b9d81f 7f6fafa4 1ef38878 +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000001 00000000 00000000 00000000 d2475970 69b39f1c 76a0e58d 6cbc7b00 +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000001 00000000 00000000 00000000 44e9188c f22b4558 abe99791 d7050ba1 +threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 cd5ca55b 0f511ce1 d034d9d4 4de57515 +threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 719ed999 5ee45a0a 98bf92f7 313eb33d +threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 e3b5105e 17ff842b e76c7b45 9c8ec5eb +threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 dbd1f89d 2d266865 223e2436 20da6b99 +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000001 00000000 00000000 9bd6735a 912dd856 31e700d3 e846fe74 +threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 e999d1ec de625a88 2b62184a 7e757487 +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000001 00000000 00000000 bbef6b52 46ec2e38 fb1ce33a 6f4d08a1 +threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 77de5928 2fd26df7 7c138b05 ec40d875 +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000001 00000000 00000000 68b00fd7 28226ece 30717554 3caad6d9 +threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 7f1febcc b36e7136 8dc0b136 e7e907f9 +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000001 00000000 00000000 da6b34b7 6f1f3431 a29d7413 a1ee6b27 +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000001 00000000 00000000 a6b1f881 9dea4786 80989c4c 4d60c817 +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000001 00000000 00000000 48d517ee 57fe23cf 236383d0 f68f54ca +threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 877ec138 5d60ec84 cf496d33 00810905 +threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 a32388e9 bb55a8c3 4b6bb74c 2f4db0e7 +threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 b36c626f f78b6390 618f2b73 d8f60c3b +threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 d7ed773c 499f3a68 458782e4 d9587c59 +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 00000001 00000000 c03ca044 8b53660e 4da73b98 cf3f5e8b +threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 23d5f689 304886c9 c4dc0f19 04d89ded +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 00000001 00000000 47efa3ce fa438a0c 7e505603 bf41e2b5 +threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 b1fb5a5a 322e31ee bc46eaad 264c7a0a +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 00000001 00000000 2be25bd7 3ecff089 d667e103 0cc98f4b +threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 dcc09281 25e8fc15 99b73154 8ecb92f4 +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000001 00000000 354060d0 2a7af67b fe20d404 7e3851b5 +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000001 00000000 f59114e5 924f6c4c 6e46f9f3 4148c3a4 +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000001 00000000 59ad2ff1 aaf66838 58f96539 41ac71f6 +threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 f9980dbb 6fb50a56 61316640 c5fbc269 +threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 29e66b28 0b31a602 813b6463 672b996c +threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 97a75cdf 3e163e27 f762605f 24f1cf0d +threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 11128c97 7cfedcf4 21ac3aeb c57f95a0 +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 00000001 8871d08b 50a56a70 cf8b5fb1 41af799a +threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 20d1b6dc 2ea43da2 d1d3ce8c e3a2ba78 +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 00000001 84ce4cc5 9173f458 8f93d413 17f1917e +threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 4f459d2a d6396b52 227fcfff 364fb84b +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 00000001 818780ad 84a418bb 89298bb2 6e029f7c +threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 2f38ef82 fddbbda1 b835f37e ceca1194 +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 00000001 ca5c1d73 966f4bb6 c39a67b5 700ef44f +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 00000001 b2be8a87 e80084dd 567e7c32 b2b567d1 +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 00000001 f9465abf 41dcb1e5 c3dd2934 60cefe14 +threefry4x32 20 00000001 00000000 00000000 00000000 00000000 ffffffff 00000000 00000000 f938ae0b 280a1a60 22588ce3 d2ad79e5 +threefry4x32 20 00000000 00000001 00000000 00000000 00000000 ffffffff 00000000 00000000 f9bb4d06 7bd59688 c26de361 afe0fd6b +threefry4x32 20 00000000 00000000 00000001 00000000 00000000 ffffffff 00000000 00000000 e23d5d08 38c68a3c ff829bd3 2fc0e91d +threefry4x32 20 00000000 00000000 00000000 00000001 00000000 ffffffff 00000000 00000000 6decfd6d c52434e1 5aec208d 59501671 +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 ffffffff 00000000 00000000 7807880f fb81f5ae 3b8a50f6 b370c421 +threefry4x32 20 00000000 80000000 00000000 00000000 00000000 ffffffff 00000000 00000000 8f6a3d89 508c5cbf 9225f59b 71d1261a +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 ffffffff 00000000 00000000 9724a16b 8b0883c5 1846f2ff d6a10d39 +threefry4x32 20 00000000 00000000 80000000 00000000 00000000 ffffffff 00000000 00000000 54307a6e c60747fb edd0fbc8 0bd6fb57 +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 ffffffff 00000000 00000000 05c03d1c 58007f68 ccba4dca 5eb0e23a +threefry4x32 20 00000000 00000000 00000000 80000000 00000000 ffffffff 00000000 00000000 3b13b3ba 5e085212 d13c41d5 e856459b +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 ffffffff 00000000 00000000 33e6452a 35fc8e87 a16f03ef 68e38cf7 +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 ffffffff 00000000 00000000 d348602b 00d485ba dfa639b3 d60e12cd +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 ffffffff 00000000 00000000 02e4dfb4 8142a511 495c5c31 7ae0da50 +threefry4x32 20 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 d37eb236 2ddad9c3 61528ff7 b8ec5256 +threefry4x32 20 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 03ad393e bbc1bf89 dd6e098c 56a3302c +threefry4x32 20 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 fc5b6ff0 879c918b d6e46000 fb47ab60 +threefry4x32 20 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 17b8b414 0aa2716b a6925cee 44b8be19 +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 80000000 00000000 00000000 eec59a8b fd034061 6c249c4f 5271c003 +threefry4x32 20 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 0659aef3 347f8aa1 664a8892 e4183f59 +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 80000000 00000000 00000000 0b0366fb 6d6e8025 da9b8e96 000fa93a +threefry4x32 20 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 1415a6d4 44b1df75 e690b46c aff8c717 +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 80000000 00000000 00000000 a7515669 034355b9 527c44b0 cf71b104 +threefry4x32 20 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 8c502590 9ce36ae7 45875b1c fde5ff97 +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 80000000 00000000 00000000 d056e169 da3c6dab 31b3ed9f 70c8b685 +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 80000000 00000000 00000000 941eac5f f50a12c3 bed601ff 6024a402 +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 80000000 00000000 00000000 67139da8 71e6f247 a90ff128 3fe6ccf0 +threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 ffffffff 00000000 b26e46d7 d58dcbea 44489127 2865ac93 +threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 ffffffff 00000000 14ee5b14 66aba2e0 6bd68aae f984f705 +threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 ffffffff 00000000 f49e7e65 dedd4390 4b104723 618625fc +threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 ffffffff 00000000 577246b9 6d087fea 64b6d323 8e4fa21e +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 ffffffff 00000000 0c9b68b4 16289051 7b6b1ac6 23e3d806 +threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 ffffffff 00000000 f4c74238 f457f99a 7b7a0621 1d791994 +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 ffffffff 00000000 79a8f615 4c1fb115 2439febc 91ec3ef7 +threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 ffffffff 00000000 505396e0 2aeac4e0 5aef015d a129a598 +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 ffffffff 00000000 82832f91 e2733136 9677e3ff 96b94781 +threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 ffffffff 00000000 3037f522 33b7280b ff7f8973 d6131090 +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 ffffffff 00000000 d385ce86 2bc39e5a 4ade2764 ba39188a +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 ffffffff 00000000 fa7c55f8 0ccf6a95 6828c88c b3b7edc8 +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 ffffffff 00000000 b0e93230 2a11fb81 75be814c e0be3860 +threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 3c62aa08 d99bfc63 72d34e76 781ae48c +threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 f88da646 bc58451d dfb5c3f1 eb596c4c +threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 8b6e05be 4455517d 416026d6 548b3e5d +threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 9f6ab638 70addd3d 105b2dd6 2f87b26d +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 80000000 00000000 8f11466e 36aae720 31530649 dddbad07 +threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 193985e2 c5f3347d f1dc0637 6be021fa +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 80000000 00000000 5e289a03 80647773 10df1470 e035bce8 +threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 c6304224 34d873a7 db3b2b6e 54030b67 +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 80000000 00000000 beaf10ec 8b48cada 668f7b2c e2fd86a7 +threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 9fbb252d 2bcb551c cc59a234 156ca0cb +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 80000000 00000000 32d9d5c3 b491382e e679cdb9 e6c96f8e +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 80000000 00000000 e5356b8c e1f3df45 8024b188 d2bf0aab +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 80000000 00000000 6ef2396b ce289257 342f9c90 3aaee904 +threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ffffffff abc8ddc7 dbf5379e 3a809978 82f9096c +threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ffffffff 38b0bb32 c8ced8d8 b63b9968 dbf325b8 +threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ffffffff 2086ba88 1cb8f743 07ac211a 965f6b64 +threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ffffffff 07c6b1d7 4a66beb5 21c093bf 1081e95f +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 ffffffff ad660005 4e918661 86f9c5ae a244990e +threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ffffffff 9ebee205 166de65d 48b85c4d 71a4a225 +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 ffffffff 24fa4e0b 6f4a4f1c 3efc6acf 2f0af4b4 +threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ffffffff d781cec1 16e2bca6 959e05cc 2b4dd292 +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 ffffffff 24aa0e95 a5192356 67a67574 53a84850 +threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ffffffff f2016f23 a78565ae 1880c681 3dd669b8 +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 ffffffff c533f368 9dc05fec 46387b65 e6df5427 +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 ffffffff 86dbe6b0 ee36ed73 d2003c4c 85b2f032 +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 ffffffff 8f40ddae 6720f14a 1295037e 2b6fe580 +threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 a7ab1fa0 a48016dd 199d9549 9c7d6e97 +threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 6140be19 0bb69fbf 41262d16 e577b795 +threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 f3eeeb6c f70a689d 96074833 8d2913c3 +threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 4d3c8d35 eaae92ef 9d504bb9 ebf6a44f +threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 80000000 a79d4a27 b64d6bc7 dedd5f31 1d036d32 +threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 0f7e61c8 551a5639 601396b7 072ed781 +threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 80000000 e44dfcc4 53432a37 1e3b8ac0 4d398038 +threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 47688a8d b01f446f c12e5b49 7f858ea4 +threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 80000000 634c27d7 898b3477 05a72e5a e4319af9 +threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 d493dd04 d6964a71 f5fec603 399b5e2f +threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 80000000 32c36c0b 33dc130f c0890ca1 b34d5012 +threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 80000000 af2f3e6a c77e8257 001209a2 3d78e3ee +threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 80000000 c089a051 b8cbe6c4 70ade481 414be4a8 +#Only aesni test is the FIPS197 test vector +aesni4x32 10 33221100 77665544 bbaa9988 ffeeddcc 03020100 07060504 0b0a0908 0f0e0d0c d8e0c469 30047b6a 80b7cdd8 5ac5b470 +ars4x32 7 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 3523162b dc14d20c 79184077 72184193 +ars4x32 7 00000100 00000000 00000000 00000000 00000001 00000000 00000000 00000000 6fb6e62d 68b661a4 6f1280f3 22cdb932 +ars4x32 7 00010000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 55b66ba6 0b73dfc4 ca2010ae ad28d97e +ars4x32 7 01000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 af6cb834 72fab497 290540d3 28a63677 +ars4x32 7 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 f928af71 52594c2a e41e8545 f10cae23 +ars4x32 7 00000000 00000100 00000000 00000000 00000001 00000000 00000000 00000000 f9498100 dc442236 92194dd1 83a093c7 +ars4x32 7 00000000 00010000 00000000 00000000 00000001 00000000 00000000 00000000 f87500fe 1adb2f6b 919d5769 a882d0f0 +ars4x32 7 00000000 01000000 00000000 00000000 00000001 00000000 00000000 00000000 c6e27fb8 5dd75c62 84f2a444 11fd91a4 +ars4x32 7 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 b12ef4b4 748f8bd7 9fb1399d d39547a8 +ars4x32 7 00000000 00000000 00000100 00000000 00000001 00000000 00000000 00000000 80a66748 ba2bdf93 8d5fae68 0edc78d5 +ars4x32 7 00000000 00000000 00010000 00000000 00000001 00000000 00000000 00000000 11fb3330 432514e5 0e1a63d2 c3f4b292 +ars4x32 7 00000000 00000000 01000000 00000000 00000001 00000000 00000000 00000000 a7b5bf1b b295ebeb 544f1fdf 947bb346 +ars4x32 7 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 fa8bab94 ef7e7d49 d67f6d8f b030b353 +ars4x32 7 00000000 00000000 00000000 00000100 00000001 00000000 00000000 00000000 4177e35d b5585986 e16e468b 7b051fe8 +ars4x32 7 00000000 00000000 00000000 00010000 00000001 00000000 00000000 00000000 ef4ae251 c01058d0 91844766 73b965e9 +ars4x32 7 00000000 00000000 00000000 01000000 00000001 00000000 00000000 00000000 789dfd47 2f2f3ed2 8f55eba5 15af98bd +ars4x32 7 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 00000000 c2cbebe0 4906b074 99d2a4fe 74204972 +ars4x32 7 00008000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 2845e523 51e91cb7 a79b537e 1a5875f1 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 022013d3 4b413126 5e2da277 774ce804 +ars4x32 7 00800000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 af7088fb f4e42652 2d5d6163 e79832b3 +ars4x32 7 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 81fc8a91 7bff9086 03393910 e8c2f256 +ars4x32 7 80000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 42231b13 ff20707d 5f2376f2 ce8672b7 +ars4x32 7 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 00000000 de5ee9e4 f3f68d60 03aeb145 5ab70d58 +ars4x32 7 00000000 00000080 00000000 00000000 00000001 00000000 00000000 00000000 2815ad0c 34ec29d2 2afb2a63 4d4ded27 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 00000000 f51e542f cc4cba41 9cd20f31 7b45463a +ars4x32 7 00000000 00008000 00000000 00000000 00000001 00000000 00000000 00000000 32e737f1 e90ae2d4 c517c727 43dac8c0 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 00000000 59f476a9 25a68376 12aaa448 4204c7ef +ars4x32 7 00000000 00800000 00000000 00000000 00000001 00000000 00000000 00000000 109a62da 375da48e e667373f 7d300432 +ars4x32 7 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 00000000 a9e31d93 f36c93a0 9257bd76 53618c92 +ars4x32 7 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 82e49339 8779350e 88dbb182 4b767bc3 +ars4x32 7 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 00000000 1fba16c5 87a56b41 eee975e7 fcd9c427 +ars4x32 7 00000000 00000000 00000080 00000000 00000001 00000000 00000000 00000000 4c4e8cee 26c911ed 82c9c419 7e922f32 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 00000000 4c6b9e86 8b63621a 0ce69c5a 8e1214a8 +ars4x32 7 00000000 00000000 00008000 00000000 00000001 00000000 00000000 00000000 3345dbf8 a21b6deb 95df8882 2cee5bf6 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 00000000 a95808a6 9ac50792 4e8f64bb 23481cc2 +ars4x32 7 00000000 00000000 00800000 00000000 00000001 00000000 00000000 00000000 ff154d65 f952e6b8 49fce617 0e5c66b9 +ars4x32 7 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 00000000 7fa55a59 c660b95b 82afe74e 11b90abe +ars4x32 7 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 8dc1b022 cd9abb84 418a32dc edc93d06 +ars4x32 7 00000000 00000000 00000000 000000ff 00000001 00000000 00000000 00000000 014375b0 28d52a24 7c0dfda2 5fb669eb +ars4x32 7 00000000 00000000 00000000 00000080 00000001 00000000 00000000 00000000 888951cd b983f2dd 673d28ca 9715cfb2 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000001 00000000 00000000 00000000 407e6c65 cf1aaaaa 00f5e6a5 b842096d +ars4x32 7 00000000 00000000 00000000 00008000 00000001 00000000 00000000 00000000 3b7ee2df d3bd1c9f c106f806 800057b6 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000001 00000000 00000000 00000000 a72a1c5b 7ddec8b7 58758642 9a3130c2 +ars4x32 7 00000000 00000000 00000000 00800000 00000001 00000000 00000000 00000000 5f9a8a5d ed8fe111 2e184cd9 5ebea31c +ars4x32 7 00000000 00000000 00000000 ff000000 00000001 00000000 00000000 00000000 de5527e7 7d0b3f49 7dc8235a dc6ed5c9 +ars4x32 7 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 a2154453 e90a0384 0e3816c0 bdb8b8e0 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000001 00000000 00000000 00000000 bb4006c7 33dbc0db 1ea0a1c9 7f9541e3 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000001 00000000 00000000 00000000 36f0672e 0337ce56 45e7cf25 197db869 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000001 00000000 00000000 00000000 bb33ad5e 8825d64e 9f8cbc28 722c7449 +ars4x32 7 00000001 00000000 00000000 00000000 00000100 00000000 00000000 00000000 e2fef76c e69a2546 354f712d cf15f67f +ars4x32 7 00000100 00000000 00000000 00000000 00000100 00000000 00000000 00000000 34fffcea 8ea015ce eccfaa90 bb401947 +ars4x32 7 00010000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 d727b857 560f384e 4d6f6d00 df267f76 +ars4x32 7 01000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 a9878fc5 dc39724f 37be857f a90a5d68 +ars4x32 7 00000000 00000001 00000000 00000000 00000100 00000000 00000000 00000000 38041b25 540aee93 8a7dea41 8531fc3c +ars4x32 7 00000000 00000100 00000000 00000000 00000100 00000000 00000000 00000000 ed3b3cd0 039b7fee 59bfaf4c 2bb3ad73 +ars4x32 7 00000000 00010000 00000000 00000000 00000100 00000000 00000000 00000000 6d00d7e3 5d24e1f6 0c0f476a d7a7b45c +ars4x32 7 00000000 01000000 00000000 00000000 00000100 00000000 00000000 00000000 bac0b2d2 f0bd7fa6 fdb5bbe1 d64347c3 +ars4x32 7 00000000 00000000 00000001 00000000 00000100 00000000 00000000 00000000 e360493c 31d69a9a 820e0bfa dd9a3dce +ars4x32 7 00000000 00000000 00000100 00000000 00000100 00000000 00000000 00000000 424c05df 59e03d06 8d2b91b9 a8c6c4fd +ars4x32 7 00000000 00000000 00010000 00000000 00000100 00000000 00000000 00000000 1a0f53d9 bc1548db 245e6e04 d5bdca89 +ars4x32 7 00000000 00000000 01000000 00000000 00000100 00000000 00000000 00000000 d1e06460 1d1230a9 0db6634b ada192f5 +ars4x32 7 00000000 00000000 00000000 00000001 00000100 00000000 00000000 00000000 cadb6f7f 90f2ff0f fd7e194d 0f20d0e1 +ars4x32 7 00000000 00000000 00000000 00000100 00000100 00000000 00000000 00000000 b23f4afe 1d5b5b1e 188fd756 c1211130 +ars4x32 7 00000000 00000000 00000000 00010000 00000100 00000000 00000000 00000000 cbfe49f4 1f7ead50 111d546f 0cfe779e +ars4x32 7 00000000 00000000 00000000 01000000 00000100 00000000 00000000 00000000 ec6701cf c96ceaa5 c6ac2bea f8d24538 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 00000000 d2a5788d 2ac03ddb 4694e11b 19a821ff +ars4x32 7 00008000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 8c1a80e0 c1d9bca3 33bb5502 3a699ee9 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 4fb35bd5 f75ba852 20e4c1ac d89e8e78 +ars4x32 7 00800000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 01de2719 57f13a99 4a865950 83467712 +ars4x32 7 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 eda124b0 86926832 6b07d1ae 6089e29e +ars4x32 7 80000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 3f7a7507 dcd9ce76 776f338f e0de1d10 +ars4x32 7 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 00000000 0045b783 c8882fd9 589f8c68 f1215797 +ars4x32 7 00000000 00000080 00000000 00000000 00000100 00000000 00000000 00000000 aa75b9e2 b3bcea23 ee080acb 80c007c0 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 00000000 dec4660c 586d36d3 405af16c e6747c3d +ars4x32 7 00000000 00008000 00000000 00000000 00000100 00000000 00000000 00000000 ad1bc2ec 4e80db1d 555bb146 0adb8978 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 00000000 b30955b3 506de1ee 517e0ce9 adcb4423 +ars4x32 7 00000000 00800000 00000000 00000000 00000100 00000000 00000000 00000000 fca5abdc 155e1f1a 1294a02d ac338d14 +ars4x32 7 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 00000000 0f354869 9db19735 c62a061c d781a794 +ars4x32 7 00000000 80000000 00000000 00000000 00000100 00000000 00000000 00000000 6aa0ec2d 52169669 52cc849c b04b4e2e +ars4x32 7 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 00000000 76a8695f e2657f52 66132680 459fac17 +ars4x32 7 00000000 00000000 00000080 00000000 00000100 00000000 00000000 00000000 65b2c50a f0fa659e 2955f763 dd50b7be +ars4x32 7 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 00000000 46e35843 9ed05230 93cb262c 82447770 +ars4x32 7 00000000 00000000 00008000 00000000 00000100 00000000 00000000 00000000 c90129e3 17bbb904 93b73b91 54bd4ecb +ars4x32 7 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 00000000 f6b8ea4f 56dc57d8 b1da974c 930f4404 +ars4x32 7 00000000 00000000 00800000 00000000 00000100 00000000 00000000 00000000 62f1a1a9 9f4bfe1e b147e06a 89480f80 +ars4x32 7 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 00000000 8ccf46b7 3c96fa79 dbaddd6e 6d4a8f9f +ars4x32 7 00000000 00000000 80000000 00000000 00000100 00000000 00000000 00000000 9cfd0a12 dbd449d0 0899f1b0 776734aa +ars4x32 7 00000000 00000000 00000000 000000ff 00000100 00000000 00000000 00000000 164e2a2e 0687b6b0 28ae5171 cf72b434 +ars4x32 7 00000000 00000000 00000000 00000080 00000100 00000000 00000000 00000000 ba0ff3f7 55904f5a f5654604 39ed84bd +ars4x32 7 00000000 00000000 00000000 0000ff00 00000100 00000000 00000000 00000000 53066b99 83a4d1ed 454b66bd 46c3db2b +ars4x32 7 00000000 00000000 00000000 00008000 00000100 00000000 00000000 00000000 d932d01f 523fc11c 649026d7 78555d42 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000100 00000000 00000000 00000000 22692731 a3e84efd a62e8563 7d082ea0 +ars4x32 7 00000000 00000000 00000000 00800000 00000100 00000000 00000000 00000000 cc1faa6e d153f41f e49510b5 7414ee11 +ars4x32 7 00000000 00000000 00000000 ff000000 00000100 00000000 00000000 00000000 f75eee60 cfd19dbb 6b2928db a23eaa4d +ars4x32 7 00000000 00000000 00000000 80000000 00000100 00000000 00000000 00000000 eb212ad6 d1798ddd 1cb1d3a2 4faa492c +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000100 00000000 00000000 00000000 16f12765 03364a45 2ad9d46e a3e9a74c +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000100 00000000 00000000 00000000 62163ea3 73e12817 e531a348 50c03c1e +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000100 00000000 00000000 00000000 5f2bd4b2 d3e5db14 64a054e9 1a7f038c +ars4x32 7 00000001 00000000 00000000 00000000 00010000 00000000 00000000 00000000 89946751 a8781167 cec08928 26e12d35 +ars4x32 7 00000100 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e8fcd218 527420d0 5bdf9eb9 88275738 +ars4x32 7 00010000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e5349df5 2bebd533 051d33a9 79089581 +ars4x32 7 01000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 77745613 fa0843e2 574548a4 4ad71f07 +ars4x32 7 00000000 00000001 00000000 00000000 00010000 00000000 00000000 00000000 759a7b4f e250af00 67feb99b c9bcd5a8 +ars4x32 7 00000000 00000100 00000000 00000000 00010000 00000000 00000000 00000000 f2fa46c5 4bc8e03a 9da5f00b e94f26be +ars4x32 7 00000000 00010000 00000000 00000000 00010000 00000000 00000000 00000000 b24af7b7 8b39e81b 516497b4 03d45328 +ars4x32 7 00000000 01000000 00000000 00000000 00010000 00000000 00000000 00000000 74518558 34a6b002 6b2295ac 259c675a +ars4x32 7 00000000 00000000 00000001 00000000 00010000 00000000 00000000 00000000 5a88b52d 6326fe18 c4e87f3e de32b54d +ars4x32 7 00000000 00000000 00000100 00000000 00010000 00000000 00000000 00000000 88e59a00 51d28a83 f6e4b330 746a5e21 +ars4x32 7 00000000 00000000 00010000 00000000 00010000 00000000 00000000 00000000 1d7a1606 84e4cbbd 1abfa751 44c1af28 +ars4x32 7 00000000 00000000 01000000 00000000 00010000 00000000 00000000 00000000 635b17fa 93d2b246 18dff0d5 44174196 +ars4x32 7 00000000 00000000 00000000 00000001 00010000 00000000 00000000 00000000 9439d321 39b6ed65 f29ad358 5b3ab33b +ars4x32 7 00000000 00000000 00000000 00000100 00010000 00000000 00000000 00000000 d3b226d0 f17ae0c4 1c08b11d 770fabda +ars4x32 7 00000000 00000000 00000000 00010000 00010000 00000000 00000000 00000000 510571eb b26a689b ed6354f4 72f4dc67 +ars4x32 7 00000000 00000000 00000000 01000000 00010000 00000000 00000000 00000000 2b6f7eb0 d09fe512 5c4059fa 10b93549 +ars4x32 7 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 00000000 a01993d5 792f4743 856cc064 b4c1aa0b +ars4x32 7 00008000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 a9be5bef fb21cd0a e6a36818 7ce9d3cc +ars4x32 7 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 520e92c7 df1e1219 7b1ecbef ae4ecbab +ars4x32 7 00800000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 78b673a8 4b6699ce 9fbbed20 9e7c251e +ars4x32 7 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e62aee2b 70e15362 48919226 6c8b2ea8 +ars4x32 7 80000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e18e5b03 b73ea66a 17fa2367 9bec1912 +ars4x32 7 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 00000000 d9653b53 8e53c7f2 f7e28d83 f382e091 +ars4x32 7 00000000 00000080 00000000 00000000 00010000 00000000 00000000 00000000 b8ab1362 ca09b231 b6e182e4 0898a049 +ars4x32 7 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 00000000 9100d155 d1f9195a 65e17e27 25335ad9 +ars4x32 7 00000000 00008000 00000000 00000000 00010000 00000000 00000000 00000000 6fdbdcdd fe852f14 2c7ea5e6 fe6ed6a4 +ars4x32 7 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 00000000 2e003c15 fc696b20 4fa0d3e8 187a9ad0 +ars4x32 7 00000000 00800000 00000000 00000000 00010000 00000000 00000000 00000000 e6a6230d d621826a ceaff40d dab1fd68 +ars4x32 7 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 00000000 23b972dd 6a41102e 3fefaa9f 787d61d2 +ars4x32 7 00000000 80000000 00000000 00000000 00010000 00000000 00000000 00000000 38217de7 996aec37 c2ac8fc7 6a85fe7d +ars4x32 7 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 00000000 b9110c72 b89bd9e7 af746395 ad3dab5e +ars4x32 7 00000000 00000000 00000080 00000000 00010000 00000000 00000000 00000000 7b8e959a f6a29350 dd89bcd6 0b2de298 +ars4x32 7 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 00000000 61017e12 acf42650 9db18422 a6fead93 +ars4x32 7 00000000 00000000 00008000 00000000 00010000 00000000 00000000 00000000 1c770454 668ef738 76e03c43 2c0be368 +ars4x32 7 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 00000000 8e3473f6 cab98281 79318e54 7bff427e +ars4x32 7 00000000 00000000 00800000 00000000 00010000 00000000 00000000 00000000 4f76299a e1d27fee f05ea39e 60eed953 +ars4x32 7 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 00000000 80b8e85c 39987169 5689feb9 f6896150 +ars4x32 7 00000000 00000000 80000000 00000000 00010000 00000000 00000000 00000000 28409dad 503d924f 7a86db93 fa9a1b86 +ars4x32 7 00000000 00000000 00000000 000000ff 00010000 00000000 00000000 00000000 81162d5b 17805524 0f746072 56198ae6 +ars4x32 7 00000000 00000000 00000000 00000080 00010000 00000000 00000000 00000000 b02e2741 d0a55125 833710d0 99095698 +ars4x32 7 00000000 00000000 00000000 0000ff00 00010000 00000000 00000000 00000000 1d1a877f 6248d773 42ff4f8d f3318007 +ars4x32 7 00000000 00000000 00000000 00008000 00010000 00000000 00000000 00000000 953eaa01 345cb173 89b1a43d 2a262484 +ars4x32 7 00000000 00000000 00000000 00ff0000 00010000 00000000 00000000 00000000 2f99217b e3265774 f8c7097d 176838e1 +ars4x32 7 00000000 00000000 00000000 00800000 00010000 00000000 00000000 00000000 7b455b7a 8f44de5b 49b4e489 4efecc1f +ars4x32 7 00000000 00000000 00000000 ff000000 00010000 00000000 00000000 00000000 89d36bdc 7250509e 154947d6 2b24eee7 +ars4x32 7 00000000 00000000 00000000 80000000 00010000 00000000 00000000 00000000 805902c7 5fe8da24 5596a805 919414a5 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00010000 00000000 00000000 00000000 a1f28e94 d9c2bd6e d1aefdb8 06de12b5 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00010000 00000000 00000000 00000000 0f57450c 94b448ed 3efb8323 d0002896 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00010000 00000000 00000000 00000000 73005580 e1245058 41d4db4c 21861651 +ars4x32 7 00000001 00000000 00000000 00000000 01000000 00000000 00000000 00000000 5c4b4fac 4a902da1 49c67894 81affdbc +ars4x32 7 00000100 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80dffd64 942af8b4 91ce56d0 a1f0b1d8 +ars4x32 7 00010000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 f64d4d05 4aaf07b4 e42433b4 bb9a2dcd +ars4x32 7 01000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00d8b708 3a583109 a0b663ce dc387c79 +ars4x32 7 00000000 00000001 00000000 00000000 01000000 00000000 00000000 00000000 bde8b707 b1d0fc98 2a6e75e9 69b13bc8 +ars4x32 7 00000000 00000100 00000000 00000000 01000000 00000000 00000000 00000000 921cd0c0 20641dd8 4077e8a0 4015c4f3 +ars4x32 7 00000000 00010000 00000000 00000000 01000000 00000000 00000000 00000000 1d992c48 19122a0e 29855702 e7fe63e8 +ars4x32 7 00000000 01000000 00000000 00000000 01000000 00000000 00000000 00000000 d3615b62 a10a3fbf e8c529eb 8ee27361 +ars4x32 7 00000000 00000000 00000001 00000000 01000000 00000000 00000000 00000000 0b120f22 3dc6329e 1ddcb426 7a0dbecb +ars4x32 7 00000000 00000000 00000100 00000000 01000000 00000000 00000000 00000000 22d34172 9bd694bc 16621499 14971a6f +ars4x32 7 00000000 00000000 00010000 00000000 01000000 00000000 00000000 00000000 f5239b2f 825cef05 6dc375a1 cb8d3678 +ars4x32 7 00000000 00000000 01000000 00000000 01000000 00000000 00000000 00000000 ebfcdf2c e82a8caf f0358985 82d5e001 +ars4x32 7 00000000 00000000 00000000 00000001 01000000 00000000 00000000 00000000 d6184b2f 521d122b 1b58dbde 2ee393f4 +ars4x32 7 00000000 00000000 00000000 00000100 01000000 00000000 00000000 00000000 e270e869 3f150608 7ffc8753 6c417364 +ars4x32 7 00000000 00000000 00000000 00010000 01000000 00000000 00000000 00000000 057cf2ab 4e817a4e a155ce11 e508ff07 +ars4x32 7 00000000 00000000 00000000 01000000 01000000 00000000 00000000 00000000 af6928f4 77a40536 ee3a8087 4b9ed5a1 +ars4x32 7 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 00000000 65a7b7d5 f7988414 f7753877 44da2732 +ars4x32 7 00008000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 d32b4207 e3ccc6da a74431ce edc0c367 +ars4x32 7 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 15cdd5ad b95621a7 9df98e93 7afc642d +ars4x32 7 00800000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 f79e3600 278a9ff4 25840b72 ddbe0f3a +ars4x32 7 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 6f3a0542 74b95c62 7079dc80 c403d4fd +ars4x32 7 80000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 fefe9a3d 77d75f58 07bdbf41 f81a8b77 +ars4x32 7 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 00000000 07af7386 3b4eded0 e11204fe 39a066c6 +ars4x32 7 00000000 00000080 00000000 00000000 01000000 00000000 00000000 00000000 846fda1a c6652537 e644a37a 0d25ac39 +ars4x32 7 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 00000000 790a495a 8e01d43b 1ba7f6d0 bd42895b +ars4x32 7 00000000 00008000 00000000 00000000 01000000 00000000 00000000 00000000 fcb0bb8a 81e4607b 0a0b331c 133a6780 +ars4x32 7 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 00000000 aae2bd69 f2ed7a43 6dafd25c 1fee4b82 +ars4x32 7 00000000 00800000 00000000 00000000 01000000 00000000 00000000 00000000 455f5a2c 876960c9 0e7ca579 08c9afed +ars4x32 7 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 00000000 59ce76c2 e0a6e62a 3ad76158 ddb9d93e +ars4x32 7 00000000 80000000 00000000 00000000 01000000 00000000 00000000 00000000 6659a57e 986e656e 3013c3fb 61ebc630 +ars4x32 7 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 00000000 907e763c c6b83a25 ef89a90f 74fdb694 +ars4x32 7 00000000 00000000 00000080 00000000 01000000 00000000 00000000 00000000 fba4b3a6 477cc9c2 bcce80ce b6f101b0 +ars4x32 7 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 00000000 710adbb1 3b7b935a bfa43ed9 af53d3ee +ars4x32 7 00000000 00000000 00008000 00000000 01000000 00000000 00000000 00000000 993981f3 10a0761d 18b966d6 db95020b +ars4x32 7 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 00000000 23277b85 4775d2a1 389e8a20 6d6e9a32 +ars4x32 7 00000000 00000000 00800000 00000000 01000000 00000000 00000000 00000000 83b8cda3 dddafdcd b241246d f8ef5001 +ars4x32 7 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 00000000 ca3d1252 eb2f2305 882985a7 06dd099b +ars4x32 7 00000000 00000000 80000000 00000000 01000000 00000000 00000000 00000000 af730151 3ebf4c13 ddb6ac40 a6b9f508 +ars4x32 7 00000000 00000000 00000000 000000ff 01000000 00000000 00000000 00000000 2606cdef e2398e47 1eefffab b8443df5 +ars4x32 7 00000000 00000000 00000000 00000080 01000000 00000000 00000000 00000000 8108c137 2f79064f 9184f6dd 1984b4d2 +ars4x32 7 00000000 00000000 00000000 0000ff00 01000000 00000000 00000000 00000000 dac3d4d8 85e7cf04 22b2b6c0 ca9cdbaa +ars4x32 7 00000000 00000000 00000000 00008000 01000000 00000000 00000000 00000000 d91f06c5 79dbe78b a6ee5140 f5e3e1d4 +ars4x32 7 00000000 00000000 00000000 00ff0000 01000000 00000000 00000000 00000000 e49c12eb 805810c6 4389010c 438dd318 +ars4x32 7 00000000 00000000 00000000 00800000 01000000 00000000 00000000 00000000 2baf979c 0b234238 7a91dcee 8f2195fe +ars4x32 7 00000000 00000000 00000000 ff000000 01000000 00000000 00000000 00000000 8c367e4e 9384e1e8 d2d54f83 e24bd666 +ars4x32 7 00000000 00000000 00000000 80000000 01000000 00000000 00000000 00000000 05ec5aed 7b80c18f 6e02ec00 af7d8461 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 01000000 00000000 00000000 00000000 6b62230f a3c81ef5 378ab653 23af48f3 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 01000000 00000000 00000000 00000000 9f28e482 ef3ad602 a7f68742 17bdf9dd +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 01000000 00000000 00000000 00000000 9bcee3c9 47d31087 b3d5d208 281dd93a +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 b98fa0e7 cdd825ac c4a2942b 188df12b +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000001 00000000 00000000 e56a671d fa738e98 71ee4418 0900944f +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 582501fc e56c7921 d38ed338 c37e5a4e +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 e4e7782f 675942c8 917bcde1 c3739f28 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 45a75118 f1c9f98e e1cbd902 ffa4f796 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000001 00000000 00000000 8e63d1dc ddc2763e eac3cd9d 8b624caf +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000001 00000000 00000000 31190524 b3ff427a 2418a4ce aadbcaba +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000001 00000000 00000000 0dde1a7a a994604a e66d1ccf ebd37d29 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 12847b3e 6b2b9d08 38d1e36d cb4e5d1c +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000001 00000000 00000000 88e7ac98 eb941086 f3556cb4 20964290 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000001 00000000 00000000 8febb1a4 bdd9c500 fc798878 1699918b +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000001 00000000 00000000 8c6b4bce 3acc1384 5eb2f546 a70d2ab0 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 3e6cf754 72ff7900 42b1882e a259b63d +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000001 00000000 00000000 05118b88 d902ce95 87b141fa a95529d9 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000001 00000000 00000000 4ffee2f7 2ff88f16 e4fa93e0 2ba2e908 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000001 00000000 00000000 0d00fbab 394bd1ab 8372d815 57ce07bd +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 00000000 c91da1c3 a89eba39 83c66a3e 7f9ccf3d +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 a9aab7d2 48ab0c11 94120bf6 661ed874 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 90f76c90 a75c8676 d5932a66 29b2ed5d +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 6e287bb4 8fcb509d 3282420a b2f0acce +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 7577b019 481c0dd9 45771637 e47d6c74 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 1caa9a2a 3fd49fee 28a8592f f820b17e +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 00000000 bd9d4712 a1bab707 a658a416 fc2cad21 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000001 00000000 00000000 5db5aef3 4aacb477 e00321e3 03f2f164 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 86c63b0c 1ae77829 f54fc72b 3e65483e +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000001 00000000 00000000 b8e6a3aa 3870f807 67e6d3c0 3c786c41 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 60723484 3f6acad0 f3150d04 6fe1cef2 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000001 00000000 00000000 d0875b42 d178529d b07f05ed 1936bc05 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 58eac67a 702ce62d b491a9e8 ca546c89 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 a9b8f470 afef5bd3 578b37cf bf2cdc2e +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 aa38025f e885466b a026d001 3f0376e3 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000001 00000000 00000000 540dff9b 94870d7f 6035a801 1d2461d5 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 d54a4299 03db719c 03867340 2b8ce970 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000001 00000000 00000000 0cf0355e d424d952 85ce5c9b 89ea9557 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 fc648dc4 0a8e70d9 37f5dfea faaaf6d4 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000001 00000000 00000000 a89ba05f 64d4f5c6 446076c2 c68f0fee +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 32ebf3c8 b3b5a1c7 422d6927 6e5c3871 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 3d6730bb d4af0df0 7af81d69 87ae990c +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 102e26cc d8ad45ce d4ddaed3 26f5d03a +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000001 00000000 00000000 6ae99574 408d6c8e 5198ef8a 251ce0c0 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 9865f8d1 0f1a33c4 16a6f032 4501cb27 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000001 00000000 00000000 50c5fd20 0f842254 2573669a 1118408a +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 9c85b493 34006dfb f29cb2d2 fe3eeb55 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000001 00000000 00000000 31f2f820 a237d610 e79519f0 a3e6773d +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 9a42597e bc616f75 11873515 0d95b6bf +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 149e81a7 13397722 e15ef1c9 085060f1 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000001 00000000 00000000 ec49a376 fc9c0e9f 1dc34445 963c9380 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000001 00000000 00000000 2a100713 0631ced0 42f20c78 d81af2e7 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000001 00000000 00000000 706b9c5e 50067d76 d9d4d6fa 4d44ac9c +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000100 00000000 00000000 dfda1d3a 072f4efa a128a5d5 a6fe1d04 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000100 00000000 00000000 aefe63cd a94f6047 ef47ae8a 5c6d0fc7 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 a263fbbb 95aa495c a5937e9e 544bfb02 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 4b5755b9 2ca59014 9403b7ff 5c00c781 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000100 00000000 00000000 62acbd8b ec95ebd4 35e31abf b290cc33 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000100 00000000 00000000 134748e1 b6befa9f 7232fa06 d4764e33 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000100 00000000 00000000 6190f931 ee7ee9d3 6ed0f4d1 16c9b244 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000100 00000000 00000000 c7f11a27 94dba789 e9dbcbc5 14a9abc6 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000100 00000000 00000000 153d00f7 f2129258 20aa50f2 ed9aebae +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000100 00000000 00000000 9f7cebbc 2ec7b89e 66001c4c 83cdbb20 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000100 00000000 00000000 65155935 919e4c9e 5f34f008 b51f7415 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000100 00000000 00000000 be69da4b 58cb9d5e 19d12824 d82c1b08 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000100 00000000 00000000 ac76a8a7 fff592ae 7b84a113 daad3a5b +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000100 00000000 00000000 b278eb5b 63a440b9 623099ad b87237c8 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000100 00000000 00000000 8ab1b9ef 8a631fc5 2dce6925 acaa5c9d +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000100 00000000 00000000 2433ea25 2017b332 91aa1b2a 0e49b4a3 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 00000000 86fd3cb3 f56664c6 e7140277 cf6a9098 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 52efaf03 3b031fa5 eec1ec93 4a377c34 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 7fead7cb 22746d85 d921eb48 e7a70ecd +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 3281b39d 696b18bd 8eda997d d5bb089c +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 adab5d35 ad91fa0d 7acfa6fd 9892d997 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 85ade5e0 2c042865 15890a20 f7c24d33 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 00000000 119163c9 a07d67cd 20f06789 a281ee4d +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000100 00000000 00000000 2fb03510 5ed5dca3 b719eb6f 574605c9 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 f4f7d2ef 7a524610 a185f709 f21fefd6 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000100 00000000 00000000 c5e7439c 2804792a 1235964f 8539a3c7 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 5f369f8f 7d9d5302 4f494420 827ed4f2 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000100 00000000 00000000 0775ffd7 3b1dea1e b02efaca b4f9719a +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 426cd4b8 3a1fc698 c19c4020 723a2986 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000100 00000000 00000000 ed151868 428ac2da 5531458b 00d2447c +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 fcb4f454 b536ddfa 3a52e482 71f6646e +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000100 00000000 00000000 3997e8de 9b8e8867 6293329b 06827994 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 f4991404 73e5e16e f5b17c26 9924f7a2 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000100 00000000 00000000 3066aea9 c3fd8937 7994b392 4b2269ac +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 c06e303d 65230c26 fcc999c3 928bbecd +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000100 00000000 00000000 949c3f78 95a9a17b 353c533c 32f8838a +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 a037a04d a5d5ef5f 134dce23 1cce86ea +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000100 00000000 00000000 73bcea41 a66fe5a3 e92911a5 d81c85f1 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 13a8abdc 5c45c562 2850859a 38851cc5 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000100 00000000 00000000 1cf530b3 c20a3ef5 1dd72902 d8f71715 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 20c4d1e9 6aaea5f9 d31be549 32a09e8e +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000100 00000000 00000000 642cc569 29ad57a4 9e7e4347 6ad323fd +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 cccb582c a8794b89 9e9ee7b4 f64b2875 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000100 00000000 00000000 75c085fb 289d50f1 78cb52d7 a5492eac +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 dc83b67b 6ae5216e 0945dd86 bfe74a90 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000100 00000000 00000000 d9b3797d 07d9cede b0d73dd4 a9ab3ba1 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000100 00000000 00000000 dd0b9690 1f87f73e b52e0554 f3a8866f +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000100 00000000 00000000 445a7ccb 1d2bd419 6cb33baa 8de67355 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000100 00000000 00000000 8186605a 2a648389 7fa392d4 a0282353 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00010000 00000000 00000000 cc555e0c 96812f76 c34b8b18 0ab1336f +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00010000 00000000 00000000 d8e396e2 593932fb c6e40d9f 7422c554 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 c3121431 cb1af462 1c6d3dc8 06806508 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 74a52f42 ab71d0a5 2d9ec16f 6a309675 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00010000 00000000 00000000 f8e52867 c5154ebe 3e2412d2 1fd6eb47 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00010000 00000000 00000000 b6d97bb1 6633b0c4 f5b83d5f ef5b7701 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00010000 00000000 00000000 21987c11 f47b221c 1bd108f9 4a89ea4c +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00010000 00000000 00000000 fd5b97cd cddf1906 abe0b7a9 32b6f137 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00010000 00000000 00000000 4651379b c51b8684 b8661b5c eee9c303 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00010000 00000000 00000000 dbe78ab2 23c7dd58 5f85f73b 37ffe920 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00010000 00000000 00000000 78afdc44 98924fa1 cb7ee502 198cf8be +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00010000 00000000 00000000 bb80d75c a4f61d05 371b83b0 f8b925c1 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00010000 00000000 00000000 8ab4b97a e856ed18 6691e448 e9c947b1 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00010000 00000000 00000000 8c0ce175 1f94b2a8 64368529 f8c997d9 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00010000 00000000 00000000 a581635b dcadee87 37d80a10 42e2d6ea +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00010000 00000000 00000000 f6073156 f3c915f5 872d7248 7428bd38 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 00000000 5c1adf3b 31a5847f 38f35004 ab0c0e56 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 fd51e724 1b511634 abfc1f02 e08d5826 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 221d06a9 b5a1fa43 c87832af 07c56795 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 0d7aa123 b5f4f0e1 10b92a35 4c568a8e +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 dc53383e 738f609d 6bda6aab 5b9015b3 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 1b01b36b 16dc731f 38af0f58 14549502 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 00000000 aec3f7e9 4513e562 bd0a53a9 a7c19937 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00010000 00000000 00000000 dce01ffb be0890c6 9acbaeda d40fe96e +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 4eceae96 81ed9647 555e7dba 1100b881 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00010000 00000000 00000000 c75f6525 f06dd94d 7f24c2bc 51c982e0 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 b0729ec8 3c6027b6 d1539c93 035cc3e9 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00010000 00000000 00000000 eaca848d 069cb07a 96bd3060 6d2752e4 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 7450b9f7 871a1d9a 211b42e5 02d9e3ce +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00010000 00000000 00000000 a0300cb3 f04fbefe fe6d6fd2 7b1e58b7 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 360d9abf 3fb3c8bc d919221d 10f57a6a +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00010000 00000000 00000000 f63c4618 ece252f4 2662a407 84841340 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 3e14c92b 4f431782 653d0255 5e48097e +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00010000 00000000 00000000 eb618ea6 d0e27776 6bd5ec9d 72491aab +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 7b42d9a7 073a55fe 5cef8388 5d240e4e +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00010000 00000000 00000000 39d1c065 85c0acc7 f0101005 93ec0ee2 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 460bd111 4a7e1dcf e6c05f70 62fde911 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00010000 00000000 00000000 5758809e ab8bd50d b1542f44 0b7a51b0 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 2398b55f 28407e67 60f625c8 ab267016 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00010000 00000000 00000000 910b861a 9ae4f63b 69c20a02 2d60c3f7 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 3fcb21a7 16951149 990475c1 99025226 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00010000 00000000 00000000 d7e919f3 73db70ec 003a8e3b 4c2b67eb +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 991f3917 b56c3247 1a5d48ad 01bcbfae +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00010000 00000000 00000000 613efef9 09710d43 50d71c7c 06c2355d +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 4313ed8e bd141078 c12d3c6e efa80cf0 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00010000 00000000 00000000 656a64b2 c9e2588a 6a740d6b f6771cfe +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00010000 00000000 00000000 01329c6b b18c5d96 17088447 58573d6b +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00010000 00000000 00000000 475e7f2c df5f29d5 71c921aa e71bf175 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00010000 00000000 00000000 75311c7e 008c90a3 cd72458f 6eb71f5e +ars4x32 7 00000001 00000000 00000000 00000000 00000000 01000000 00000000 00000000 f1d28f60 cadf4685 f5a23c51 d908aa34 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 01000000 00000000 00000000 01c8c951 22a359fb 3ff357d4 f2efe9fc +ars4x32 7 00010000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 cbfb74e9 d32346b5 74a9d8e7 78ad3148 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 9ad5ccf9 1e86645e 060e4b44 806d350e +ars4x32 7 00000000 00000001 00000000 00000000 00000000 01000000 00000000 00000000 af5c32bc 2f4c1d79 42ea3ba8 7f64cf82 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 01000000 00000000 00000000 b5de7ef6 3b368ca4 797907bb 0e290d60 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 01000000 00000000 00000000 63ff88f8 f2fcda03 ed9521eb 0da73a6f +ars4x32 7 00000000 01000000 00000000 00000000 00000000 01000000 00000000 00000000 af2004e3 6b8c03c1 ce200f44 15272428 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 01000000 00000000 00000000 f76605b2 f5b358bb 7e29f4de 48e9b229 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 01000000 00000000 00000000 ec4a3974 a873f7aa 58833321 6efcbe17 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 01000000 00000000 00000000 56cdee6f 690fabf1 e9d1f12e 477dad74 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 01000000 00000000 00000000 3d45f975 4219eaaa ed5bd00f 4ee3eeda +ars4x32 7 00000000 00000000 00000000 00000001 00000000 01000000 00000000 00000000 4ce13170 ccdef41e 82346a8c e6b3d412 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 01000000 00000000 00000000 469c7844 ee82a394 a7a3b23c 8cc4db81 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 01000000 00000000 00000000 0ca9b5fe a5673d62 7c83e3f0 95143ac0 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 01000000 00000000 00000000 efcf3d1a df15cb85 41679ec2 473c724a +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 00000000 5257892e 0c645c39 ffd595d6 fa3d694e +ars4x32 7 00008000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 68d8f64a 066631ec f3a9997a a1350d5b +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 ca14c369 47ce2364 9cb2196d af6c47ad +ars4x32 7 00800000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 849eb7ff c5950be4 f1a61f9e 6001f279 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 cdda7689 01a0fc17 1c8cb79e 663104e6 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 fdc8b354 3974bfb8 9805f0b9 687134ea +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 00000000 80ee7029 e70ddbd3 5910cc44 5f4afd16 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 01000000 00000000 00000000 2af567a0 2d2f3cbf 1aa86411 0f64b041 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 1d511c03 26f8fd53 e46cb9ba 770aab45 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 01000000 00000000 00000000 80dc0d67 f54a2826 cbdbd04e 74b4fbc8 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 ef3c100a 92fc4374 40b313d2 125f29b5 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 01000000 00000000 00000000 e2488dc6 f410be92 0e5dea44 c0694d36 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 0a4085bf 797eeeee 6b7a0006 e538592d +ars4x32 7 00000000 80000000 00000000 00000000 00000000 01000000 00000000 00000000 d63c4b1b d52295d2 87f5a196 d1542c1b +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 4565e62b 2b06ae38 e41196d8 f9a249b7 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 01000000 00000000 00000000 b4f09a88 759568be ce1dfb0c 948834ad +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 da4eb391 01bc628b 38c604a2 07535efe +ars4x32 7 00000000 00000000 00008000 00000000 00000000 01000000 00000000 00000000 3c4f71c5 54059a07 0d1f9a16 4b1af865 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 3fefd40d c260b532 63363e58 6f98c813 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 01000000 00000000 00000000 7d02082c 5f09d506 18c4f684 352ef5e3 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 bf1187a0 46a976bc bc71e679 4e0e5623 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 01000000 00000000 00000000 ed83edea b6645e3a 16acb791 7d43064f +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 91556a10 1b40759c 95cdff41 52cb618a +ars4x32 7 00000000 00000000 00000000 00000080 00000000 01000000 00000000 00000000 fb7e7161 4ab7039f 519333e1 78d7a241 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 a2590d06 f8338a72 4705fdd9 9f8db47d +ars4x32 7 00000000 00000000 00000000 00008000 00000000 01000000 00000000 00000000 c5146907 aba557c4 7ba1b22f 46cb38e0 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 510cda71 b0b2f5d7 26ed41b7 014a51fd +ars4x32 7 00000000 00000000 00000000 00800000 00000000 01000000 00000000 00000000 4a73adf2 4ba83e52 c3ea9859 72be18f3 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 b9d90390 981871a2 0f7145e8 7a00fa57 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 01000000 00000000 00000000 689c9cc9 293ab8ae 1dfca36b 7c8a9731 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 01000000 00000000 00000000 59978e50 6d29cdb5 8d324ba0 a5dd3e4a +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 01000000 00000000 00000000 3948cc5d b01d7d06 ee2cb5c4 a8a14e61 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 01000000 00000000 00000000 753c4e79 496e5769 8b50732c d23f56d9 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 e55ec276 e473d61f c316132c 954894ea +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000001 00000000 61e296a3 a424ccbd 575b5150 0aec2318 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 5a6b6952 34618ed9 ad0f420a 50060389 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 36e839df 742e6b89 45867c8a 969127fb +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 7a0cad0e 9eacee2a 32bbe64e 799efd9d +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000001 00000000 a06824a8 4fb555db 1241f0e7 304538c0 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000001 00000000 5afd1311 eb272486 71660469 54fb1933 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000001 00000000 934d980f 7d2a488a ce3cd73c 48dfe32b +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 acbb0ca6 57d697a2 5fde660c 606d05e1 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000001 00000000 d0c41463 5b22d41f e82375fd e05576e7 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000001 00000000 d395d125 02665bf0 ba11994f c781ccab +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000001 00000000 96880c59 01df06b8 07e62c46 7904e9e5 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 c8a185e0 e0c7db14 36518c29 fc40bba8 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000001 00000000 c788d4d7 db552421 962dc825 41cefbe8 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000001 00000000 b656d6c7 abe0765e b3501422 cadb748e +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000001 00000000 e34b1ea4 8d64c890 09afc44f b36a4508 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 00000000 950434ab c13c78d1 46c50ea8 8a41ad52 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 5818cc68 9c066862 d8668af1 14ebb966 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 4dbfdf75 73fc433a 5864d4a2 a0e27186 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 9f16f8fa 43943702 cc3f4e1a 581f9570 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 91f7c720 45712f56 ff004166 3252a1eb +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 84915ec3 6992c44b 71942078 488fb76c +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 00000000 d561a9ed c75c6965 d21c4161 e7d06023 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000001 00000000 3eb2ec86 ed6ec73d 7892f171 1522715b +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 53892271 8674ab3b 93e6afca 841cbca2 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000001 00000000 13541920 3a435e24 25f08417 bfade8dc +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 d0a1e7a9 7a816e40 b66226ae 62e0a4ee +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000001 00000000 8e3f42e2 2b014896 d86aa526 cd27fbeb +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 cafdabd9 6dcfa350 f7f8270a 9ae67ded +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 3d0d8f49 51136f93 26192fc1 18520d2f +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 20b28b79 8a8b37f8 00b104ab 868b2d14 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000001 00000000 31d98a86 9ccebecb 645a8b17 f0bb99eb +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 68a48077 83b8ba14 05946de8 24566774 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000001 00000000 d86678f9 354f95b4 eb7a401a ad61c2c6 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 8f66d754 a08c81e6 c63c356c 3ba62f17 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000001 00000000 c17d8282 720b8f46 db6e67b1 b4e955cd +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 9aff812c 45baa6b7 4b0c9c0f ff98f8b1 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 b326c5ad 7a9aa757 00b31db0 601fcdca +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 91620765 6f729564 29a2f9f2 cfded75c +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000001 00000000 c941d058 5cd997a1 5e9bf194 7b21d5fb +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 10e2485a b4e5e1e9 cd4ba01c 2e49dde2 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000001 00000000 1cdbca4c e5e98bc9 72f23ac1 cdb16c1b +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 1fb363a1 474f5285 78035b43 d518402e +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000001 00000000 307ba338 840c962b 34cba2bb 8d50d44e +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 53ca2c77 05f1ed32 94b6cd6f 4d397f26 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 faf425b1 b86d358e d1a20e65 281bbbf8 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000001 00000000 61f619d6 16c90f22 1fec0d94 6257e0be +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000001 00000000 25142c67 9cfa1771 c5978a54 7400f567 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000001 00000000 2ee984a7 638ced08 d33ef781 0247374b +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000100 00000000 d1b71a4f 1684424d 9fd4c7dc 9bc4d871 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000100 00000000 9fa9054b 71f78e23 c9b3d997 2ca4eedb +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3db7ed45 be438491 cd0d6566 ac45f324 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 cc1a364b 3a1cbe65 abe2f8e9 f502c286 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000100 00000000 8feeb62a d5061040 b534de85 3c027ed9 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000100 00000000 9e2e2531 4c9f15d0 c445affc 60730252 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000100 00000000 b7c5670e 138a4b8d 6e42fdd8 5b9daf1f +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000100 00000000 dd1d56da 6eed44fd a7dc085e 152674ca +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000100 00000000 5295cae2 66bb409c 75db79b7 58dd33f3 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000100 00000000 ed9ce0e1 072c7948 03c30fb2 ac016e8b +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000100 00000000 5e2ca009 ca4f2212 44f195a6 565be49a +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000100 00000000 ceb2d3c0 be733e64 bc1f1860 c29c14ad +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000100 00000000 824fa943 31b285c4 263d37ea 2f123fbb +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000100 00000000 a816d1be 20fb3610 72e57473 56e874cd +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000100 00000000 4350d13a 2617f33b d1609d1c 7843b983 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000100 00000000 bf189652 e19db3da b9a9c751 fe69dabd +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 00000000 aa25fcc5 aa1d1333 04449e1f 8233a5d1 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 b3cd867f 2740b7cb 39cea5c5 c184d63b +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 31a10a6f d86903e4 310fda33 90006449 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 a0489810 69a99632 f30a3276 0ebabdb1 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 0987067b ac2d74b1 c8d0f7f8 651d1ca4 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 a63b4182 ad284ec1 4436f8b9 b98134fd +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 00000000 23bcfa51 0870547e b46b24d5 a34737a6 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000100 00000000 ee786787 118a55f0 43b9771a 20ff54a3 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 75412ce0 52dee65c 77791fd6 60943f38 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000100 00000000 8bbe8840 ed24b4df 125e9e9b 5ede5ceb +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 956293f5 eb6577e5 aea6424d 050e3306 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000100 00000000 256d2b89 d3f9ad2f 90b82362 018409fd +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 af745525 fb08c32e 1c134f69 54af5d5b +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000100 00000000 4279efbd cdfc19a2 6b806fe3 c3cdf539 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 91b1a835 6e6fa9f9 9ad21955 f9881872 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000100 00000000 d3da99a7 2b009b3b 04b727a1 1eaaa447 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 33bd4a06 c8968739 e08dad00 45f8363b +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000100 00000000 1c399450 72192248 9dbd2ddf be17d911 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 4213e7e2 9eee3bff ca895491 00c7b193 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000100 00000000 b955af87 2c272a9e a500d242 22611535 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 2e01ebb4 0dcf0ecc 758d642a a7597d3b +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000100 00000000 3c587492 fc291e69 97a3dc0f a71448c5 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 1faf9fbe b3d940fc c93b02a2 cd4aa238 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000100 00000000 ec9bcc5d 28a32054 4c7d0e4c 47cfc9b1 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 e7fd6ed3 406c0111 96dbb609 4ad0168d +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000100 00000000 e6d16efd ee3b3517 0b0af6f6 0fb44f85 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 c6081d68 22ff5d78 f406fde2 1c8277de +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000100 00000000 22ccb737 9e4a0d7d 6c6dd7cc 6f9fa8a9 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 5c4fc443 c4461e64 8d34b2b4 3948c1da +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000100 00000000 fc085908 e4d876e5 e4af7700 6c218c12 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000100 00000000 148d2070 dbe15c71 a8847c49 02efc241 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000100 00000000 ea492649 be966d5e ae76cfce b1d4d505 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000100 00000000 2b1e4db8 f7cfdc2d 14b0b987 8f31e992 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00010000 00000000 e59bf1d2 cab0f564 3104664f 2620d3a8 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00010000 00000000 e13533b7 b2562201 a8eaa55f a750df08 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 6d9b77c1 b4c8d357 2680fa2b 3f24b6eb +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 8b8c2007 29822d48 c5ef677d 1f89c3a7 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00010000 00000000 5d2fa112 e2c5d011 df9135ad 763f29cd +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00010000 00000000 7b396de9 cf3342ed 91371e20 e5836599 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00010000 00000000 18f90e00 e840907d b34d1745 2fa31445 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00010000 00000000 5b21ea12 9b81514d 3a44a5d1 1e429945 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00010000 00000000 db5924f6 43a09271 4bbd7526 47a0b9c8 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00010000 00000000 eeaf24d3 513eabbd 6e27d8de dfba806f +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00010000 00000000 60caf69a ce5c0585 ebaca6c9 51b5618f +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00010000 00000000 40e5c216 f39c46bb 42124cf5 d29e3a81 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00010000 00000000 f57c667d 46dbbbf1 221b419b 086bc672 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00010000 00000000 68babf11 f7755abc 1c03ca54 5d4876f6 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00010000 00000000 01e33c4c 337f84f1 accdd03a df95085e +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00010000 00000000 dcc0f93d 9d21dc4d bb1c0159 6151428f +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 00000000 d1fed09e 84ec00dd a4f64c71 b958535e +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 3e7982ea 8c9be213 a326f346 4e9711e3 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 49e320a2 8526076a 01c83b75 89eca4cf +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 13b6d420 5802874a e8c409d3 5400604b +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 866c2aae 210efb54 f1dd4928 15276ee1 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 df8334cd 383c4a69 b4530250 7e70f0f0 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 00000000 39a0f8e2 faf0937a cab7a67b 14fa4909 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00010000 00000000 3452504e aa51562b 8ed6632a f532ff33 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 198b3f09 69a2a1b7 244cb5c3 f5975969 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00010000 00000000 a5b028bf eb128cea fa673ddc 6dba3964 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 62063941 455d80cb 0a50e480 c0cfc579 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00010000 00000000 c4c59ee9 c55bfd45 e9d9d1f8 aed1a219 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 bc39e53b f43472b1 f3e1a62e 20214463 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00010000 00000000 0b9fdddf e49b3226 9b609ebf 94e00cd1 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 6ef585e1 372feb69 4a300d7a 3b9d9371 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00010000 00000000 87cf8e6b 3e5e1e1f feb7c8e4 a2081049 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 f9e429b6 69cc141b a7c881d3 e29b35ac +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00010000 00000000 d4a1f5c4 401e56b6 9b5490a8 2f833185 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 99766356 8ff50157 b3821b37 ec4d7fe1 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00010000 00000000 d410c303 bdcc51fe 4fce8db1 c2300086 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 3c76e5d6 7f97d7b2 87fefb47 aa1e74a3 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00010000 00000000 b04160af ccd69849 d997776c 78baca82 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 2b426a66 b4778997 036bb2b6 73f85000 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00010000 00000000 97c725fd 4c263287 6b84df34 87bab7e8 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 955705c6 638b9589 bf7079d3 a0812340 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00010000 00000000 8062aec7 ad667c4c 531d646c a89419b6 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 5f4b9c78 e073fd03 7af2647f e04cadb5 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00010000 00000000 21173c0d bcbff324 23e49265 77a987e2 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 75469838 fd82de60 d25e525f 6fc94eec +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00010000 00000000 2901d556 c39f0758 f0f25524 ab9ea7f1 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00010000 00000000 0f4f1084 0dbb5150 bf4b4ba1 f1e9a302 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00010000 00000000 a7f09b0b d538d63e 8cd9698e 4de1d5c8 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00010000 00000000 e14850e1 da61655e f8b9fee9 4cca7a22 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 01000000 00000000 82d8ce21 f80a41c3 e9d7378e a43774de +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 01000000 00000000 29450fbe c7620b1e 01db607e 496c959e +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 67b63d9e b7aa2865 5b0b2f47 38eca693 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 22e3d97b 88139492 04477566 8fdf0038 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 01000000 00000000 df57c091 a68d2400 c56ef541 caca2946 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 01000000 00000000 d2e144ed 44f15ecc 72ad8cf0 18eb77a1 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 01000000 00000000 597c28af dff928f2 c9881678 39c1b806 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 01000000 00000000 9448bc5a 0f04a19c 7de7946f e41b327e +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 01000000 00000000 25e501dc fc98dc25 2a624ae8 3335bc09 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 01000000 00000000 73ed7ea6 1d84a23a ecea26e4 79d91ca2 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 01000000 00000000 17c50437 780ab31f 883bf9e7 e4426521 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 01000000 00000000 5ed86b68 57bcd482 c1963c45 c80403e9 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 01000000 00000000 e4318c44 bd5a645e ee2a5267 d3f32328 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 01000000 00000000 9584cdb9 0369c0c6 5db25327 f05fe043 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 01000000 00000000 0eb27e05 398c1efc e252f9ec 9792108d +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 01000000 00000000 27d98c16 a999fd3e 0f9aa126 4714fcf5 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 00000000 18e2ab27 192e782c 228edbcd 1cf25b21 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 b4dfa099 93e47dcd 53622042 1ae269aa +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 289bdca4 79f10ec9 223c09b3 be39c40d +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 a5f9354a 74713822 5d699bd5 e61ef52b +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 155c9b52 7f208dab 99bfd248 967ad519 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 99c71cf2 004e9a5d dbf6813b e03f8f30 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 00000000 fd514803 5b988c05 11b96981 cc9efbf5 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 01000000 00000000 a2e373f3 fff6af00 aae75bb6 aa810fda +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 1b9d9279 33f2e9d4 57b2baac a08aaecd +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 01000000 00000000 3b7d051d c251092d 0f387d56 c30b2bbd +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 f7161117 ef751edb ad5435ad fdcbd02c +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 01000000 00000000 a53512ef ab201dd5 5ce98a55 6152b179 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 71491954 fa3dfbaa 4766b8de 18867ab8 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 01000000 00000000 a90344a6 0d3c789a 30a038cb 6bb037f2 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 0a27fa46 3b9d3956 4817a0f7 0f35fd04 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 01000000 00000000 56940c06 a82316da 4ae11ae6 ca14cb80 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 ef5356d3 eba75b67 5280c534 333bc371 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 01000000 00000000 b29f5cb6 60e617b8 f15ab8d2 58a93843 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 ee1b4eea 636b83ad 7310d166 3c49ed51 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 01000000 00000000 cdcf1fa1 ff375a8c 3b20fba8 0553b4ac +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 534e5a74 6ad414cf 6783dc68 5afdaefc +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 01000000 00000000 aa5f07f3 8208c9f7 86206e63 0e1dba58 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 c4b11a37 665a50fa a5f49338 6e8f0568 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 01000000 00000000 f7f20443 868b09a9 7432511a 88556c5b +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 8cf1b0f7 195a07bb e7444fc0 8efa2752 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 01000000 00000000 d4deb9d3 8a9dcfcc 04f1b075 fb78122f +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 8bb5c362 97b1a466 ff73a392 dd0e35ed +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 01000000 00000000 30099688 0620fd6d 7988d696 194aab84 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 d381395a 31d23232 e2ce7661 9c07e08f +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 01000000 00000000 38c43a08 5fe81ebb 3227c6cd e673f899 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 01000000 00000000 57b9eb17 b16faefb f026d744 770589ec +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 01000000 00000000 64ee86b0 b6f88be3 c384e0d6 a98d0044 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 01000000 00000000 0943acb4 e8ca93ea c99a6bf0 587bbe35 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d8cdc0b3 76febda9 f145334c 8ccd989e +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000001 a4120da0 7e334806 6ccbbae6 f884db86 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 fe3fdf78 7fe5f526 0f9898a0 8553f47a +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 0f5c7ddf e4ff9c6b b7822869 824f7b3c +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 907e8fe5 6ff48574 c613762f 8419cca9 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000001 7027e389 5b9bdc45 08d90b0a 996e7998 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000001 904f9f5a b5f4e88d ead29fc0 2b996332 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000001 80a2b84e 6900e001 c5162475 051606e2 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 6c7a3b27 944d3b5b 052a12c4 1287ca7d +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000001 7117192f 8e210458 f4f9f6f5 6c4a0318 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000001 8aeeaf0a 185ac5e3 bcb8fc4a acbfe41b +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000001 d9c75aea 39894834 bf1d275e d00a123c +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 34d40c7a c5526b8f 0b35e113 bcd830c6 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000001 b7acb815 feffa06e ea979b88 c0cf38bd +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000001 6cdeb44a 35bd89c2 2fd88035 fbc9ddd3 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000001 6c5d7d52 c8b975e9 e8a693ab b4bd1af3 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000001 f8521b4a dbe20169 24340095 4dd3bb60 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 c2d6689b 3b72883f f0fc19d1 6cc655f8 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 0949c29c 3880052f 2459c0d3 774f67ac +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d37727d5 d44885fb 40dec1e3 10be5d27 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 3ac80642 953d6595 9c2df6a1 2fa227c0 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 e343745c 514c98fb 202c521b 36a272dd +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000001 8f31f7db 58d9f1d0 2ba4fff1 dafd441e +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000001 14093d48 19b54970 3076e546 54df7928 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 65a1ec0f 0410478d 0336f294 08685c66 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000001 adc7dadb 75984ee9 3f99fbec 32abbb5d +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 ec4d68bc 8193dd1c 5db4cc7c 53e78f28 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000001 2747e673 697ba048 fbd55241 f7d03178 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 1c4c758f 6142a50c 3db5d4c9 7d8964bb +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 490f97b9 fb25b95c cae9be65 ba621248 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 95a625ff c506be5a 3c3547b4 b50900dc +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000001 0b47695b 0823c2e9 7e30a51b 61a7bf88 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 746993bc 5e841d54 3663cb30 679aa59a +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000001 26b7e4b3 b52b2568 6ae26a56 7ece4e0a +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 81b612d9 b684a761 b460a0d0 dea6923a +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000001 a15c7e43 8b87221e aa01cea1 897212b9 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 d87e6534 a914f232 2ba776e3 64de0c83 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 07043336 9ae9d489 f4a25ba8 165fddb8 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 c3d87d0d 58adc9e4 9e1da7d2 da881245 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000001 0533180f afe5e50e 779f1051 79221e92 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 3dd06f43 0b0d5f83 1302fe7d 3d2552e3 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000001 725fc967 5021d4c6 ca759daa 0f8a7bbe +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 a22aaee8 4ff66429 11f6d35b 9f328c05 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000001 26131e6e cdac6fde dcdb3556 62e54f7b +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 c5ae206a 792a3d3c cff179d2 0667b2ec +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 be478a57 82e7d9a0 25d55857 66b8c0ab +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000001 eb5c58f7 9b42dc31 09174875 447f07e3 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000001 e7091d5f ba221fd5 3775e6e7 6f5d17f4 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000001 c944f017 ecdc01b1 64613fad 638d30f8 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000100 7f2f0daa 8250599e d86eaf5b 6bbae2a9 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000100 e4b5773e de0d22b1 f2ea0982 7b34db92 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 393ae33d 46d1e116 12b3e6dd 59980fac +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 5f412afa fdc6613b d0e935f6 471e5e4b +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000100 7abeb2bc 122ddec0 6fa03a7a 824166dc +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000100 1008b496 a85ba459 e7f1b8bd 3da32d88 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000100 4d1afb12 939b7c02 f44bf246 fe7d2ef8 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000100 1bb5c98d 60fa9c25 2749d1d9 3c880ed9 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000100 a419efe3 cec80e6c 3fcc84a9 e56898c6 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000100 505c2396 befec6b5 325cc0ed d63677a7 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000100 1a6a4fcd b4fd4d3c 08fd0936 7cb1abb4 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000100 01e1f7e9 959bfa34 b1ba5ba2 4c4dd6e0 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000100 e6205d2a 0f119894 bc95a629 7ec8eb32 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000100 542e3279 b1f2cffe 3eb39960 3680a449 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000100 25021f11 cda42315 29e10f48 b917f681 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000100 6b563024 a62a213a 083ef6de 448dcb62 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000100 3dd4ac40 773dd04b 1fa760a1 5ab2d7b4 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 55183ca4 2fae8c07 8a04c8a2 83bfb3b1 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 ac1fa9e2 8a376297 6a76f622 66951cc2 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 dcce8912 4bdd1e1a 8177deb0 a2df4df6 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 7b47aa39 17de883b f0389adb 725a81a2 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 cd5f9e74 661902ef ef2a7524 0782be05 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000100 6950909c b0c259d3 9a1b0d2a e940fb31 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000100 74bd6da0 2506319b fc8113d5 79455bde +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 720d34e0 5f60576f 7278b81c d707f0a1 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000100 ac8137db 28f464a3 98fc9b1b 2a2e70c9 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 53d3c9db cb40a3bb d21c9214 4385dc60 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000100 01ca9fc8 be2d5bc7 58e949a0 b7c03b88 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 0bd240e0 4fd3dc82 2fad4a10 ab50808e +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000100 06c9fb2c 7bbc95f4 6f01b025 3ff15e9f +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 df36eb98 3a8cf76f cf22acb6 5e6bfb60 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000100 4d620503 ff7ad0ad cba5c94d af9c37e5 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 7161b90e cae6104d 5b1257d9 29f82898 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000100 59d062ab 89e20f13 e6223064 6e7a60ee +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 631ad4da b29b6712 052c2160 7d7315ba +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000100 e920893f f173f4de 7e3a9c64 18cd538d +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 60303917 64f675bd 98417210 b058a208 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000100 6464c8b1 8b280c53 18c499fb f27a4e16 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 f2ab7027 8d25e619 90017a45 2dc913ce +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000100 23e9d1f4 7e6995a0 c4e606b8 0f1a66bc +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 0a095c69 eae0868d f0f38532 f98b752b +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000100 17fbf313 e6698d5b 0d534c3a c11f77ae +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 460be28e 444d9392 7a902b48 84cae4e3 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000100 610abef3 e7b54875 39a79235 eb13ffb4 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 c713d0ef 445f03ed bd7ead2d ed950e14 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000100 e6737c14 2c8dcc7d 3a23f109 67b6a89f +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000100 67f457c1 557228c2 c8089581 7d01371a +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000100 a824da65 0b3dc334 aaba7e18 3d402fbe +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000100 22ac2693 92de8f21 02a7797d 8f573dfe +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00010000 16453451 ae1de563 0dee5530 eceed42c +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00010000 46df3956 2d4a949c b59326a3 584723cd +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 f08b09be 0de23177 5098b59b 110784f7 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 485ef1c7 80025f08 b23ee428 27208fe3 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00010000 b158ebb3 8338a0a1 de47abd3 30640723 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00010000 87326517 08099596 4ce7aa41 c4c38ba2 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00010000 46b8aa2a 3777c4be 8415045a 1299fdbe +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00010000 54421b55 8571e355 5c415a26 6cb049b7 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00010000 6f930ec4 a9e9ad53 4251bb83 2e476fa6 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00010000 a7ef447a 524b4fa1 05c908a1 45f9ad22 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00010000 267ec642 b82ac27a 4d84ed96 e0b16f5f +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00010000 ab216213 8d2a7155 bbe7d6b4 9b641b00 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00010000 90b88f45 621a4888 765566df 5e4be449 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00010000 0ec8a630 6e5b9e83 9a75b24c 4f8235b9 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00010000 f4619e3a 02ded40c 9c0340eb 3b7e7721 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00010000 05072ea9 5639f5a6 d23e7418 b1e3ced6 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00010000 a33ab035 a790718f 180c5629 6cb17eb0 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 3afaf21d f5f444d4 418d0c92 4d51e6ab +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 e38a9623 fc3e8309 4454bf75 244bfb0d +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 29397c94 ee16888b f4cd5d6b 2f559297 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 afe121a2 836f1bdc 9c684339 599bbaac +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 97b8aabd b1df936a 52f5e128 d56ede53 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00010000 78942d59 640b16e9 b8cf9e93 6654d236 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00010000 8b1ad3ba 90e87f5b 0d634de7 aaf1ec6d +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 b4a35540 8a7bfccb d8ef9e43 6e6f13b1 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00010000 269e3c15 d4beeeb8 ec43a0a2 94e2f460 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 b074026a 609dcbb3 e487f3d7 30364b78 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00010000 53e4a4db a3556ea4 576e6986 1b516aa4 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 dc5e18da ef5264a5 413d6200 1c4fe353 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00010000 bd3bf363 f67e6401 a70a9952 864d4aa5 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 ca25ca8c d87c52ed 10f3e089 a3f10a38 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00010000 99b35266 3935d44c 45de70ae 5f45642b +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 881487ec a7d965b7 9390323e a0f820ec +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00010000 3c407556 c54e9eee 10be61a8 01b3314c +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 9bdfd785 cdfacd85 2ad6eaae 08e5e1e0 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00010000 70049988 28ac8eaa 8f88c445 26a6a7ac +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 b3309df6 9f70fb63 e6bfe14d d9db32c5 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00010000 78c3331f e11483c2 196cd881 8c5cb976 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 78c1f422 ffb35622 976a0ea2 c47dadf3 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00010000 9a48897c 0d43258e 68143233 a4c42971 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 c0c0c9a1 db862add 34cbbc45 0ae92dc3 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00010000 609cb695 a458cf4e 845dea00 770d10fd +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 96096fbc 092a6c52 a2863361 6034ae5a +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00010000 59325887 93450bbe a209db71 2ca5aafb +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 603c3e9c 37da7ac1 46c5ed4c d4b26267 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00010000 417dd2b9 c069d12c 5cd96a21 a5aa30fe +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00010000 d1e6217e c52b09d7 43c3362c daa88559 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00010000 500d3d50 8334b350 4a350e9d 065f38cd +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00010000 6cf8999b 6a224467 cef79e60 1f6aa053 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 01000000 236973b9 acfa2b20 a57b6a9e 141ff8a6 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 01000000 b28f36c5 abf41d7b d5fce5d2 14ed9ac6 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 87c39599 8016094f a95de4ce aa6aa7b8 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 400e9c58 f0d67e0b 9e82d4ce 1309b835 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 01000000 80ef9d40 b2e43def 364c02e9 06946104 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 01000000 d0c96c3c ddb82b22 5849cf64 76915554 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 01000000 974f08cb f1017d85 2a8ff47c 9515ba1f +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 01000000 0f6f1b7b 01983102 4f048852 ee49b8c2 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 01000000 1657d267 dc22abf5 6144b420 934224a4 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 01000000 7ec7d92c cf0f4ed8 e5850d8b dc54d1af +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 01000000 44c14233 ffb3c533 199a6672 4d92fefd +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 01000000 6f391434 d9838457 4558af73 cde09326 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 01000000 749c35fa 013dd6ad c985360b 054b5540 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 01000000 0da7d3fb a196f591 87ddccb6 5bacae93 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 01000000 0f1b4f3e 7110733b f8515528 ff32033b +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 01000000 fb5a5d93 3ed97d61 039e3770 f3d0f902 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 01000000 681a3e44 8e63ecd0 3abcabec 4d2d5731 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 7f371943 dcfe4c07 49b7b9fb d57162e7 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 83976612 a822b1a8 35791be9 a5d50048 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 63f7134a d37c8caa 7f04dd78 8a27a3ec +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 6d3353b7 77bb4bb3 d7e0c2ff 16005d82 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 3e284f56 e9881391 2e0fd8ea 724a7aee +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 01000000 bd941ac9 ae36480f 7558b610 d6f26b21 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 01000000 3314bc79 87b3f03a 481bfaa7 a7b3a2f0 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 828a4d0b 88977fc1 d68b9de4 102f59e1 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 01000000 989b41df fc836e53 5651aa7a 4e468c77 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 0f2ca98d 3217d236 7e6fa595 ed30cbc0 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 01000000 95a56154 36c66fdb 2d78e0b1 264d50a4 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 730568fa 5f468b14 def70363 1347fbb1 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 01000000 1e9be78a 288adfe4 acb526aa cf7bfcad +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 f28e617f 82ecd209 cead3a30 94a421cb +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 01000000 275841e9 2b57d809 cde1d166 5fd89bf5 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 2445d98d 4e04a79b 13979046 6b7d16ef +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 01000000 06632be5 e012e4a6 415e4e48 f0a6810d +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 dd19f886 d6931273 ee256f13 b76397aa +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 01000000 9ae07c7a ff565271 12f255ea 92b0421c +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 70b1f0b9 804754b2 e7ce2010 95d34179 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 01000000 832a2722 bb70152a 3b712fff 3e86ca27 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 73235ff4 84cf30f9 70ceb0f4 648df5bb +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 01000000 5de658ec 8c032498 30ab870e f87c9df4 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 48d8da59 56604227 972bde33 323ff9df +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 01000000 035faa21 6bcbf158 25f98491 b0d4fa88 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 3f39a50d 739f3ae0 f8c6c4cf 14edf4e2 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 01000000 5fb447f4 4e452b6d 471ca52a 490b9927 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 ef0634c5 6283e5e1 a6fe4817 18509a0a +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 01000000 e52f5ce3 b9b1feac 423d4a40 d133d0af +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 01000000 f3aa0390 315d0cd6 4519ebd9 fc2f7ce2 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 01000000 488fca1d 2ce48061 5fc5db0d 71c22c4e +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 01000000 3e71fd01 b9a73d45 2efb44bc bc0883ef +ars4x32 7 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 7d13e4db 9a88eb7a 35843f1a 866f65c3 +ars4x32 7 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 f076786a 2de44c1d 0a5a871b 43f6e099 +ars4x32 7 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 c47cd146 027b1ba4 31ab6a10 7f56ff7a +ars4x32 7 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 e76c9bd9 ec696130 dd0a4218 f9eb265d +ars4x32 7 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 00000000 e16d46ca ae9d21bd 1a2902ae 6dc6dafc +ars4x32 7 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 00000000 173f2a2e 55ed290e b558c7eb 491c6fa2 +ars4x32 7 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 00000000 afb78413 0b81cf0c 82f232ff eceb9c23 +ars4x32 7 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 00000000 388159c2 679fc345 5776c7cf dcc2b909 +ars4x32 7 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 00000000 a7c5cf36 038f933f e2736b0f 25ece025 +ars4x32 7 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 00000000 7d760dc7 fba9e143 2c03d992 0deed06d +ars4x32 7 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 00000000 52fb540d ed4f5f6f 5979bebf 4d125b76 +ars4x32 7 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 00000000 ab8062b5 37067fbd 9e374581 83b02c1d +ars4x32 7 00000000 00000000 00000000 00000001 0000ff00 00000000 00000000 00000000 4294069a 343f7c26 d07baf72 923b8aec +ars4x32 7 00000000 00000000 00000000 00000100 0000ff00 00000000 00000000 00000000 177f19b6 b7c68ffa de71312e 24ea4f8b +ars4x32 7 00000000 00000000 00000000 00010000 0000ff00 00000000 00000000 00000000 f09e48eb 3c48bb03 e74e4b45 380059bd +ars4x32 7 00000000 00000000 00000000 01000000 0000ff00 00000000 00000000 00000000 715c8bc7 cce2cbb0 5967a9ac b62c96e3 +ars4x32 7 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 35715da2 e9b679af 41d4db67 5a0d04bb +ars4x32 7 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a06bdcb5 f4847027 3b5847b4 7aaa7469 +ars4x32 7 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 b7c3b815 a954e0a8 94d0f903 84d221b8 +ars4x32 7 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 6f49710d 0161f573 4e6ad7eb b127ea30 +ars4x32 7 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a16a81ec bb71b3cf b61df0bc cd5a6cf2 +ars4x32 7 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 dae31938 f0122e2d 6152c09c 27e2c376 +ars4x32 7 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 00000000 61b8aeea 304bd76d 2b9fda47 7d6815d0 +ars4x32 7 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 00000000 b415b044 950ef84a 019c610d e2be1cb8 +ars4x32 7 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 00000000 79b7e774 54b9d8e8 6906d920 e14e30d7 +ars4x32 7 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 00000000 54c20799 0d32af30 7e69c810 8ea36de2 +ars4x32 7 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 00000000 d16bfa1e 859584c8 a46d009a e023eece +ars4x32 7 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 00000000 4c5910e4 3671ddee 0ca84957 0a604ccc +ars4x32 7 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 00000000 8f4fbe19 f18a46c1 0b430910 4468a0f1 +ars4x32 7 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 00000000 087f97a4 9a0ba2c1 bf36caea 8587a619 +ars4x32 7 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 00000000 7ff7e522 9b292fd3 1b2600d0 2a68ec8f +ars4x32 7 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 00000000 2391de60 ac9c9f97 9b45f2c6 3f1fcd2f +ars4x32 7 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 00000000 d7b54f07 11e5c24f 2b8c3173 ebe64dc4 +ars4x32 7 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 00000000 2019eb40 e45a0ca7 41967671 9325094e +ars4x32 7 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 00000000 d377c955 f73724b0 60a4367f 74efbae9 +ars4x32 7 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 00000000 d06a64ff 3d3fb872 d23cddfe 2cf313f3 +ars4x32 7 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 00000000 caa347ec 362e47fa 37db32a2 939f3dd0 +ars4x32 7 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 00000000 121068a3 a6f6a9bd 6b4436f2 2936fae3 +ars4x32 7 00000000 00000000 00000000 000000ff 0000ff00 00000000 00000000 00000000 5ca7f32b 35843972 38c38c1d 22ccb436 +ars4x32 7 00000000 00000000 00000000 00000080 0000ff00 00000000 00000000 00000000 0d50a165 c7706d44 dfbcb0a0 3dbb9b10 +ars4x32 7 00000000 00000000 00000000 0000ff00 0000ff00 00000000 00000000 00000000 6cbd9d88 25856615 ca9cc5a0 3ee77397 +ars4x32 7 00000000 00000000 00000000 00008000 0000ff00 00000000 00000000 00000000 3a22b46a f51324d1 181b1a2c 7a6d6620 +ars4x32 7 00000000 00000000 00000000 00ff0000 0000ff00 00000000 00000000 00000000 dba434d5 e9f01484 230a2026 c32fbaa6 +ars4x32 7 00000000 00000000 00000000 00800000 0000ff00 00000000 00000000 00000000 555abae9 49b8aa4d 08e2898d 34c05ffa +ars4x32 7 00000000 00000000 00000000 ff000000 0000ff00 00000000 00000000 00000000 4e588132 9ebf1ea8 eb70abf3 19c1340e +ars4x32 7 00000000 00000000 00000000 80000000 0000ff00 00000000 00000000 00000000 22547cb5 08984142 8cc08a13 e241ae97 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 0000ff00 00000000 00000000 00000000 98b62d23 0b6d0ba8 baab19fd dea5184d +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 0000ff00 00000000 00000000 00000000 4cfeb8e9 0a7e96d4 0507241f b3e34599 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 0000ff00 00000000 00000000 00000000 42cad440 508e26da 3f6420ce f9dac8a0 +ars4x32 7 00000001 00000000 00000000 00000000 00008000 00000000 00000000 00000000 b4192971 09539fc9 c077cc1f 02dc8280 +ars4x32 7 00000100 00000000 00000000 00000000 00008000 00000000 00000000 00000000 b29da95f 97960ab5 cc0ba6f5 70f68b45 +ars4x32 7 00010000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 4b26eba9 0afec271 1a5862d9 a2fbab60 +ars4x32 7 01000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 5b96062d 4a538f1b cef0f3f0 fa33f829 +ars4x32 7 00000000 00000001 00000000 00000000 00008000 00000000 00000000 00000000 2df682a5 e9fd97e4 de2fcc61 6ad346b1 +ars4x32 7 00000000 00000100 00000000 00000000 00008000 00000000 00000000 00000000 9ea89c73 7d9a8473 0a98fdc5 cd4eaa4b +ars4x32 7 00000000 00010000 00000000 00000000 00008000 00000000 00000000 00000000 ce3dd09f 9a94935c d642de44 fe93f557 +ars4x32 7 00000000 01000000 00000000 00000000 00008000 00000000 00000000 00000000 4ca77f0c b785dabb 2b70797f 1b4f7cd0 +ars4x32 7 00000000 00000000 00000001 00000000 00008000 00000000 00000000 00000000 afb7d87e 3e5372ff 3670b934 370b142c +ars4x32 7 00000000 00000000 00000100 00000000 00008000 00000000 00000000 00000000 eb57ceb5 9e0cab9d 0c6e81d2 80c5d390 +ars4x32 7 00000000 00000000 00010000 00000000 00008000 00000000 00000000 00000000 887ab783 e2dda480 7efa747d 50c3a6f7 +ars4x32 7 00000000 00000000 01000000 00000000 00008000 00000000 00000000 00000000 fd28991d 8cd72c34 3b8d7957 4d82bc0f +ars4x32 7 00000000 00000000 00000000 00000001 00008000 00000000 00000000 00000000 42cbb732 e812c8ac 4fe033fa 3c57857f +ars4x32 7 00000000 00000000 00000000 00000100 00008000 00000000 00000000 00000000 3a322695 e9cc71ba 60873d85 0330afa2 +ars4x32 7 00000000 00000000 00000000 00010000 00008000 00000000 00000000 00000000 3af0fdc5 44df990c f3b574be 8ba46baf +ars4x32 7 00000000 00000000 00000000 01000000 00008000 00000000 00000000 00000000 ad4505c7 e5e3e8bb 5bd7f068 fc0c2205 +ars4x32 7 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 00000000 10290740 4d49e705 1a76c8ff a7a5aa59 +ars4x32 7 00008000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 c344e818 d6f972c9 718ba48d 243ec4d4 +ars4x32 7 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 bc156ad2 142af240 c1a88557 09840973 +ars4x32 7 00800000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 7e1f495d 91e0b733 725991ab 03de3987 +ars4x32 7 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 149b47c9 cf7fac97 1e060e9a 95a36c31 +ars4x32 7 80000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 d88726d1 dc6c33c9 26b520f5 1d138faf +ars4x32 7 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 00000000 44d588d5 1b98e290 8b7dbb9a 01748115 +ars4x32 7 00000000 00000080 00000000 00000000 00008000 00000000 00000000 00000000 a2e345ad c19117e9 b05da489 55cfa170 +ars4x32 7 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 00000000 81d05528 f132945d 67c683f5 0651c945 +ars4x32 7 00000000 00008000 00000000 00000000 00008000 00000000 00000000 00000000 d029cbaa 6346b68e c879f83d 97f73048 +ars4x32 7 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 00000000 4e4c11b2 8506d628 2c9c75a3 975d680a +ars4x32 7 00000000 00800000 00000000 00000000 00008000 00000000 00000000 00000000 313b97cf e3a44a70 fc6187a5 58a034a3 +ars4x32 7 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 00000000 442a0817 afb746b8 194c0eb5 4ef17998 +ars4x32 7 00000000 80000000 00000000 00000000 00008000 00000000 00000000 00000000 f39262b5 f0135a8f 6aa2d31c 528b4b26 +ars4x32 7 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 00000000 27c0e3f3 093c2cf4 71500803 c6f737e4 +ars4x32 7 00000000 00000000 00000080 00000000 00008000 00000000 00000000 00000000 da68c63a d4cd41e4 7b4edead d2484d56 +ars4x32 7 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 00000000 ff2f78ea 780c5f4f d8300b11 cebe22da +ars4x32 7 00000000 00000000 00008000 00000000 00008000 00000000 00000000 00000000 c9d4b44f b60f12af a0751b26 89250c61 +ars4x32 7 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 00000000 95a7f1a5 8e9c86c0 61b88412 ad26e5c2 +ars4x32 7 00000000 00000000 00800000 00000000 00008000 00000000 00000000 00000000 a01a31b5 b0a556f6 94e4352c e0694763 +ars4x32 7 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 00000000 fe8bae26 53f4f2fd f6104dd2 3ae163d3 +ars4x32 7 00000000 00000000 80000000 00000000 00008000 00000000 00000000 00000000 a96d7149 e1c71ace 03c22296 3258065b +ars4x32 7 00000000 00000000 00000000 000000ff 00008000 00000000 00000000 00000000 0034229f f1f520b0 70852ef1 b5acd951 +ars4x32 7 00000000 00000000 00000000 00000080 00008000 00000000 00000000 00000000 bd37d239 dfa1d7bf ab0bc739 6f10d461 +ars4x32 7 00000000 00000000 00000000 0000ff00 00008000 00000000 00000000 00000000 248444f6 406c6f2d 0708e103 1380c7c3 +ars4x32 7 00000000 00000000 00000000 00008000 00008000 00000000 00000000 00000000 dbeecd59 c32c51e9 f68865af 641ea2e6 +ars4x32 7 00000000 00000000 00000000 00ff0000 00008000 00000000 00000000 00000000 eff2640d 7b4b0ad8 c2c66c11 4394dfc4 +ars4x32 7 00000000 00000000 00000000 00800000 00008000 00000000 00000000 00000000 83c21922 bb3bf8f7 bb57629d fbdfbf90 +ars4x32 7 00000000 00000000 00000000 ff000000 00008000 00000000 00000000 00000000 11222c7d 43bfed9f 3289c92d 0d731aae +ars4x32 7 00000000 00000000 00000000 80000000 00008000 00000000 00000000 00000000 228c99ac f2677093 86390bb7 dd798774 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00008000 00000000 00000000 00000000 f688f6fc 11df506a ba609007 46a5debe +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00008000 00000000 00000000 00000000 aa8cba8f c215007b 3ff3b9c4 b4dd340e +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00008000 00000000 00000000 00000000 861a9f31 8360b689 8b7d6829 1623096e +ars4x32 7 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 5699ef44 00d103a4 c3eaac9b 45008c49 +ars4x32 7 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 b2be89c2 c37ed97e aa49c958 eefdc48c +ars4x32 7 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 c84c1a7b 503fac50 0a0f4268 3432317e +ars4x32 7 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 317cffea 45a03ab6 b84734b4 7491e4a8 +ars4x32 7 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 00000000 7641fe12 0409fbee 8dc258fa 643a095c +ars4x32 7 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 00000000 4144456b 56e421b9 8e0bc871 908da857 +ars4x32 7 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 00000000 31467a52 9f569421 57af6d93 4ab9aaf1 +ars4x32 7 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 00000000 a4a81156 d35e565b c0004abc f7f5ad80 +ars4x32 7 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 00000000 d9a3c778 5a994a33 050a851e 53ff6bb3 +ars4x32 7 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 00000000 9602db81 4f3e8e31 b8eb8778 8d9ae6e6 +ars4x32 7 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 00000000 9cc2bebf cd9c9adb 1f5111bf 525c8306 +ars4x32 7 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 00000000 254233e0 f1600a4a 12cd2ffa 33f64782 +ars4x32 7 00000000 00000000 00000000 00000001 00ff0000 00000000 00000000 00000000 c76b94ff 1506dbfa b6a53b19 6567ec72 +ars4x32 7 00000000 00000000 00000000 00000100 00ff0000 00000000 00000000 00000000 b96d4a8b a94e4988 48e5aa70 7f981078 +ars4x32 7 00000000 00000000 00000000 00010000 00ff0000 00000000 00000000 00000000 7297a8ae 50f40468 7c06ad3f ada1dacb +ars4x32 7 00000000 00000000 00000000 01000000 00ff0000 00000000 00000000 00000000 5e5c57e0 6b7e504d 29090675 5f3846be +ars4x32 7 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 f5203998 7c9f3216 ee22563a 3b71d9e6 +ars4x32 7 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 52c6dec8 0610dfdc cabe92af b816df9d +ars4x32 7 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 b8cb69c4 7c6cd1b4 fef546e2 a67ba514 +ars4x32 7 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 79ced4ff a7a61914 6b548c73 a7f15747 +ars4x32 7 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 a2e949d9 860c3f63 d1105cb4 848d284e +ars4x32 7 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 5bfdfefd 00f7baa4 6952abe6 e67d2254 +ars4x32 7 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 00000000 6f489149 449ccf7d 2851c093 342faa21 +ars4x32 7 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 00000000 8f05251e 3b8e4328 3c01aa05 af222007 +ars4x32 7 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 00000000 2639f421 3d48b670 dfa86214 e6acd2ce +ars4x32 7 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 00000000 94c5e071 feec27d5 17ec71d4 be8166af +ars4x32 7 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 00000000 81bf17b5 15bf09e4 60c94d35 7719711e +ars4x32 7 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 00000000 1f623b0b ebfca3f2 b6ca58a7 eeffc059 +ars4x32 7 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 00000000 d12de53f 82c9fd72 153a4bf1 97834260 +ars4x32 7 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 00000000 78be9d31 d05ca12d 978adffa 42c3f165 +ars4x32 7 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 00000000 df6516c8 c517f2ac f8189fcb 40268c9f +ars4x32 7 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 00000000 06f0db2d b8cf2a5d 6a2fac1f b2b615f3 +ars4x32 7 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 00000000 07e97c9f b59955f1 ce210819 ddc6c117 +ars4x32 7 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 00000000 266fc505 086d79dd 883c7f19 812c8e58 +ars4x32 7 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 00000000 b2c8ba04 c0fdc64a b4d9a67c b335bd21 +ars4x32 7 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 00000000 c750fb02 49c6f0df 5e77855c 41bb7162 +ars4x32 7 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 00000000 5a23f420 4b39be37 d12b4e70 43748ae8 +ars4x32 7 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 00000000 34ca991f 61a767bd c351e5b2 05eb14a6 +ars4x32 7 00000000 00000000 00000000 000000ff 00ff0000 00000000 00000000 00000000 b9032c17 622b9d66 a63ab848 cae4026d +ars4x32 7 00000000 00000000 00000000 00000080 00ff0000 00000000 00000000 00000000 cb0864ff b9e9a0f4 587865a2 8d0e951a +ars4x32 7 00000000 00000000 00000000 0000ff00 00ff0000 00000000 00000000 00000000 15df81bf 96bd32db 32fbbc39 5b63bcdf +ars4x32 7 00000000 00000000 00000000 00008000 00ff0000 00000000 00000000 00000000 6437f14b 830fadfc 94314d02 c2511479 +ars4x32 7 00000000 00000000 00000000 00ff0000 00ff0000 00000000 00000000 00000000 48cb4f99 382ec6b3 be457c1d 2beed31f +ars4x32 7 00000000 00000000 00000000 00800000 00ff0000 00000000 00000000 00000000 907b159b fe077e87 07b00ee8 5a81946f +ars4x32 7 00000000 00000000 00000000 ff000000 00ff0000 00000000 00000000 00000000 996fcba6 25b49011 c432074f 5f3b26ef +ars4x32 7 00000000 00000000 00000000 80000000 00ff0000 00000000 00000000 00000000 a91adb51 2af26621 19e0aeff 68d6e694 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00ff0000 00000000 00000000 00000000 3c41f9b1 ad73ddb3 02d857d3 09ff12ea +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00ff0000 00000000 00000000 00000000 991e32b5 45aaf05e 64fffcd8 61b258d8 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00ff0000 00000000 00000000 00000000 081148ce 4da869c0 d06f78cf 42cda6d4 +ars4x32 7 00000001 00000000 00000000 00000000 00800000 00000000 00000000 00000000 a1b4b19d e403839e 16f8b8b6 1652d04b +ars4x32 7 00000100 00000000 00000000 00000000 00800000 00000000 00000000 00000000 099f42eb 7c93ef4a 7273a8b3 ef9d69b5 +ars4x32 7 00010000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 a76aebe3 7ff94770 dfee2619 05bd0057 +ars4x32 7 01000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 451fe101 f6a3ef4e 667f63a8 04ce4c83 +ars4x32 7 00000000 00000001 00000000 00000000 00800000 00000000 00000000 00000000 15cf4734 c47aef94 80edc942 f5ca69db +ars4x32 7 00000000 00000100 00000000 00000000 00800000 00000000 00000000 00000000 e7566892 c6eb88c6 9c918435 0dd838f7 +ars4x32 7 00000000 00010000 00000000 00000000 00800000 00000000 00000000 00000000 469a99d1 8f034fce 3d2030c4 e0ed5d88 +ars4x32 7 00000000 01000000 00000000 00000000 00800000 00000000 00000000 00000000 c2c40a6a c58b2921 a4f6decf 4ae71aac +ars4x32 7 00000000 00000000 00000001 00000000 00800000 00000000 00000000 00000000 1f70d2ed d32b22f6 9aa6dda6 3fef3838 +ars4x32 7 00000000 00000000 00000100 00000000 00800000 00000000 00000000 00000000 a9916db0 88b578e6 e47542bc 9ce1322f +ars4x32 7 00000000 00000000 00010000 00000000 00800000 00000000 00000000 00000000 9e6e2d23 bd640359 4ab167df 9e912c62 +ars4x32 7 00000000 00000000 01000000 00000000 00800000 00000000 00000000 00000000 a2eda192 53f1d8b3 f44078fa d08dac13 +ars4x32 7 00000000 00000000 00000000 00000001 00800000 00000000 00000000 00000000 f7fc0eda 98472867 c3d1b83a 94ac445c +ars4x32 7 00000000 00000000 00000000 00000100 00800000 00000000 00000000 00000000 0afed4d3 7d509436 d83d1e7e 804f751d +ars4x32 7 00000000 00000000 00000000 00010000 00800000 00000000 00000000 00000000 a256ba8c 38c907b1 75c2a0b3 c53df9d7 +ars4x32 7 00000000 00000000 00000000 01000000 00800000 00000000 00000000 00000000 76c3db9a d7f46201 9fa6778f 543e2247 +ars4x32 7 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 00000000 1de2029f e8bd542d adf51e19 85712c5d +ars4x32 7 00008000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 ea2d0d3d 7c789821 6436a2dc 2dcc2884 +ars4x32 7 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 5aba4731 34daa9ed a85c4546 d7dbf009 +ars4x32 7 00800000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 86c988bd 0701e39e 73a7d71c 17ab834e +ars4x32 7 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 aa465b47 86459dff 49611206 659bf418 +ars4x32 7 80000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 cf78f7c8 c620145b e06942aa 812e7565 +ars4x32 7 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 00000000 c1ec8b70 da99ba59 d636b3f1 d33f4c01 +ars4x32 7 00000000 00000080 00000000 00000000 00800000 00000000 00000000 00000000 2889f1e5 5202bc42 93ca7570 41bfee0e +ars4x32 7 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 00000000 f498fb91 d2aa5281 d0320c53 6e8f9393 +ars4x32 7 00000000 00008000 00000000 00000000 00800000 00000000 00000000 00000000 e0588e3a b2502bdf 0d301f0e d3ae6262 +ars4x32 7 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 00000000 e6c9f06e cb8f5012 31ccd88d 8082af36 +ars4x32 7 00000000 00800000 00000000 00000000 00800000 00000000 00000000 00000000 fbd461b1 bcf10336 da98061d f9f0eead +ars4x32 7 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 00000000 8d77a649 48ab6739 f3f6244a bcdb8ea4 +ars4x32 7 00000000 80000000 00000000 00000000 00800000 00000000 00000000 00000000 01d0fd1e 86e6ec23 34fe8312 adac2407 +ars4x32 7 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 00000000 7183f509 0c87a68e 516efffe cd0603a1 +ars4x32 7 00000000 00000000 00000080 00000000 00800000 00000000 00000000 00000000 f90e665a 45f197b8 b01703a5 d9850ca9 +ars4x32 7 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 00000000 aba1b65b c3dc39c6 f818760c 5fcd9614 +ars4x32 7 00000000 00000000 00008000 00000000 00800000 00000000 00000000 00000000 c931ae0a a9c813a2 7389ce7b 3452f6d9 +ars4x32 7 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 00000000 5a7dd37f 99af6c84 d32965cc 710b3e37 +ars4x32 7 00000000 00000000 00800000 00000000 00800000 00000000 00000000 00000000 baedac97 b750a9ff 2f620a43 75c8add1 +ars4x32 7 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 00000000 45954d84 67001176 dc64cf9e d0c338d7 +ars4x32 7 00000000 00000000 80000000 00000000 00800000 00000000 00000000 00000000 249dc958 65149828 5151c56e 707367fb +ars4x32 7 00000000 00000000 00000000 000000ff 00800000 00000000 00000000 00000000 4e5ae7bc e47b30b0 f86b822c e364646c +ars4x32 7 00000000 00000000 00000000 00000080 00800000 00000000 00000000 00000000 e63765d5 f32674bc 7782ed19 5567a9e5 +ars4x32 7 00000000 00000000 00000000 0000ff00 00800000 00000000 00000000 00000000 3ac6ab25 eebd3be5 ce198c87 190642a6 +ars4x32 7 00000000 00000000 00000000 00008000 00800000 00000000 00000000 00000000 90ca936c 19a11969 95285a8e d6c02163 +ars4x32 7 00000000 00000000 00000000 00ff0000 00800000 00000000 00000000 00000000 b47543c1 fcbb50e4 2b70872f e7925299 +ars4x32 7 00000000 00000000 00000000 00800000 00800000 00000000 00000000 00000000 45024998 0f63a2ab 1073737f b118a227 +ars4x32 7 00000000 00000000 00000000 ff000000 00800000 00000000 00000000 00000000 3c131bc1 dafb56c6 3f891099 ada112bf +ars4x32 7 00000000 00000000 00000000 80000000 00800000 00000000 00000000 00000000 20510e0e 9282f9f2 36a85fea 60436ef8 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00800000 00000000 00000000 00000000 c8c161d9 a6254725 3a8e0032 b16af124 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00800000 00000000 00000000 00000000 fc54d1a3 2bebd8fc 350e3cba a9b3e3b3 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00800000 00000000 00000000 00000000 725a0795 1f5b8fbf 0dde02a2 ddda103b +ars4x32 7 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 f20c1570 d6039a6e be4c0b63 0ceab11b +ars4x32 7 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 c58d83f4 c7c11330 92c5c6aa c439b7b9 +ars4x32 7 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 f6d11f1d 28402208 38be7215 bcf3029f +ars4x32 7 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 0d715426 5dc37963 60e36070 f208eb70 +ars4x32 7 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 00000000 02d1fa26 36d9a526 bd86b104 f287cff5 +ars4x32 7 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 00000000 d2661d98 6e9fa52e c4b8b29c 7715a4e6 +ars4x32 7 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 00000000 4ab024ed 9feb8bfb 4ab3a7af d6d46e21 +ars4x32 7 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 00000000 e0ca2ef9 0f8fcc91 a909c0f8 5026f05d +ars4x32 7 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 00000000 00b618f9 7986feda 5082f579 dccbe02e +ars4x32 7 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 00000000 91c81394 a3c03bd0 be362e51 14e979c2 +ars4x32 7 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 00000000 afffebcd 5e5ee6c9 5ad415ff 1c816807 +ars4x32 7 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 00000000 6e8b1751 c4ebb487 1a3c413e 8b34880c +ars4x32 7 00000000 00000000 00000000 00000001 ff000000 00000000 00000000 00000000 531ef1f8 157230dd 44a117e0 d28ebbb2 +ars4x32 7 00000000 00000000 00000000 00000100 ff000000 00000000 00000000 00000000 5117f82c bcb985ff 3cc57c54 1dea7b4c +ars4x32 7 00000000 00000000 00000000 00010000 ff000000 00000000 00000000 00000000 2ec0689e e031aff0 9c5bbe70 4be2d641 +ars4x32 7 00000000 00000000 00000000 01000000 ff000000 00000000 00000000 00000000 7fdcd715 f074a429 486e4445 f4b48540 +ars4x32 7 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 3f336fa9 7ac9514b fbe022cc 72d67f1c +ars4x32 7 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 cb311987 a33b790b 5238e35c 1b22d75d +ars4x32 7 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 3f33ae27 8073ad94 00e099ba 0890dc6b +ars4x32 7 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 316ed3b1 7ebb4320 8d4e502c 19b9a17b +ars4x32 7 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 8a4ef9ba b150b7b8 a89b995d 222654b3 +ars4x32 7 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 aa6ab8e1 32aaafe2 68cff088 5126a72f +ars4x32 7 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 00000000 d9484dd2 d8ed45bf cd934356 98711bc5 +ars4x32 7 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 00000000 b194fc17 7ad19838 104a1190 6ad2e2c6 +ars4x32 7 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 00000000 10e03c4f 1d66a55e f4015b51 24b0a6da +ars4x32 7 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 00000000 5c877863 27e4ae74 c1fe9bdb 30e7387f +ars4x32 7 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 00000000 48d665be 04dd1041 3c536403 c0c50658 +ars4x32 7 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 00000000 316af260 c3e51228 8e2d101c 55283e5f +ars4x32 7 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 00000000 b2d3fb05 0e237707 5159f20a c142ef5b +ars4x32 7 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 00000000 e31079c1 260ea3df aa6faa8b 38845c56 +ars4x32 7 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 00000000 9acdaf03 0885571d 530cb772 2d658c18 +ars4x32 7 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 00000000 950397cf ddd8b4bb 9018eaa0 e764146d +ars4x32 7 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 00000000 b24e6d97 79f27720 cedc6bcf cebad106 +ars4x32 7 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 00000000 f2e3aedb 07a6ff24 57597231 c1c326ea +ars4x32 7 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 00000000 5006737e ef8f114f 5433839c 8bf6fcec +ars4x32 7 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 00000000 ce0dcef4 5dce8255 9cfc7a44 92c775f6 +ars4x32 7 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 00000000 06445467 01eaf5af 7c41372f 306c0418 +ars4x32 7 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 00000000 b24a91ad 5374b993 532c214e 4d62735c +ars4x32 7 00000000 00000000 00000000 000000ff ff000000 00000000 00000000 00000000 2ad702b7 f298e652 ad45e416 afdf3b45 +ars4x32 7 00000000 00000000 00000000 00000080 ff000000 00000000 00000000 00000000 1fdfac1b 29d91b83 6283fa9a c4bdabc1 +ars4x32 7 00000000 00000000 00000000 0000ff00 ff000000 00000000 00000000 00000000 c38ba415 36e0934a 9e93e7ff 57fb9604 +ars4x32 7 00000000 00000000 00000000 00008000 ff000000 00000000 00000000 00000000 8496cc8f d317b99a 09ed2dd5 0edb985e +ars4x32 7 00000000 00000000 00000000 00ff0000 ff000000 00000000 00000000 00000000 c1a8e6ba f637f477 7c1be8c5 1635dc1c +ars4x32 7 00000000 00000000 00000000 00800000 ff000000 00000000 00000000 00000000 5f2e7d91 f1f9cf5a 817e48fe 32ccab0c +ars4x32 7 00000000 00000000 00000000 ff000000 ff000000 00000000 00000000 00000000 319fdc17 28a1caa6 cc3b75d2 cb8f3b4d +ars4x32 7 00000000 00000000 00000000 80000000 ff000000 00000000 00000000 00000000 1f4d97b8 422e76b3 dda759c2 a5847931 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 ff000000 00000000 00000000 00000000 0ba58ff4 f368a86b fd226d2d 38846c8f +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec ff000000 00000000 00000000 00000000 0559bff4 5d8c2def 9683e6e7 2f3bfae0 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 ff000000 00000000 00000000 00000000 49aa9863 e5956af6 c1963ab1 591271f2 +ars4x32 7 00000001 00000000 00000000 00000000 80000000 00000000 00000000 00000000 87bb5447 bc484c00 3c5b9aeb 1c2b06a0 +ars4x32 7 00000100 00000000 00000000 00000000 80000000 00000000 00000000 00000000 85ff139c 79136de3 a6c097ad a9d93b5e +ars4x32 7 00010000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 d742d3e8 1cadab91 38352a68 13cdbe8f +ars4x32 7 01000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 7baaf6fd ce25c905 cd52dd6d 9b4b8695 +ars4x32 7 00000000 00000001 00000000 00000000 80000000 00000000 00000000 00000000 a372abd2 9170f153 c0f3826a 030d183c +ars4x32 7 00000000 00000100 00000000 00000000 80000000 00000000 00000000 00000000 ac9b58af eab5f7f1 3067583b 20a88a68 +ars4x32 7 00000000 00010000 00000000 00000000 80000000 00000000 00000000 00000000 1543d6a6 2a11882a b8bd4a66 9d975a6a +ars4x32 7 00000000 01000000 00000000 00000000 80000000 00000000 00000000 00000000 71143d7c 1ef3ced0 7932bd39 5ea74960 +ars4x32 7 00000000 00000000 00000001 00000000 80000000 00000000 00000000 00000000 78214851 98901970 9c7fb38b 86e20192 +ars4x32 7 00000000 00000000 00000100 00000000 80000000 00000000 00000000 00000000 4516ccf1 a5a3eb0f ea6d2d14 cbe8dc1d +ars4x32 7 00000000 00000000 00010000 00000000 80000000 00000000 00000000 00000000 b0e28d6c dafe0519 9265f7a2 3a67d98f +ars4x32 7 00000000 00000000 01000000 00000000 80000000 00000000 00000000 00000000 ca83bf38 b97608b1 f638b1ad 264da873 +ars4x32 7 00000000 00000000 00000000 00000001 80000000 00000000 00000000 00000000 eb299f5a 488ca603 d07f13b6 11f9a950 +ars4x32 7 00000000 00000000 00000000 00000100 80000000 00000000 00000000 00000000 1820cc2d ed40c0c6 9de2f5db a832b40c +ars4x32 7 00000000 00000000 00000000 00010000 80000000 00000000 00000000 00000000 8c94851e 9015ad5d fa421361 7a8c9a72 +ars4x32 7 00000000 00000000 00000000 01000000 80000000 00000000 00000000 00000000 356b05ae e4868c3f 00d4c8e7 5bb483bd +ars4x32 7 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 00000000 87e57c8d a2ebb5da 94ef921b fa8513ce +ars4x32 7 00008000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 cc5d25dd 0f0c036d d8f1396b 0a42d6b4 +ars4x32 7 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 a2459ccc f6ee7d36 ccec35f6 e61df0ad +ars4x32 7 00800000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 124c12b5 6fdd7c44 d10cd930 50fc3048 +ars4x32 7 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 09a36724 e1efb60c 7a6af056 16918325 +ars4x32 7 80000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 241b7c12 dac5702f 035aaf92 367de6b0 +ars4x32 7 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 00000000 d0e87638 680d52f8 ef7d1235 eb854d5f +ars4x32 7 00000000 00000080 00000000 00000000 80000000 00000000 00000000 00000000 41458389 3648fdb0 f32d3a06 1b374ab6 +ars4x32 7 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 00000000 89767040 98bd8b53 2a7a25e1 9d330351 +ars4x32 7 00000000 00008000 00000000 00000000 80000000 00000000 00000000 00000000 0495c061 b369bdf6 16e39b8b 2f73c706 +ars4x32 7 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 00000000 4f44ba25 2fa529fb 7bac72d0 8c5e9791 +ars4x32 7 00000000 00800000 00000000 00000000 80000000 00000000 00000000 00000000 cf05097a 9445e279 6be1bea5 934cc529 +ars4x32 7 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 00000000 b14f83c4 23ea98f2 117f8aa9 6f4e3cff +ars4x32 7 00000000 80000000 00000000 00000000 80000000 00000000 00000000 00000000 bcefcdbe f7800c28 75a42433 343eb79f +ars4x32 7 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 00000000 c823637a f2cd8f68 3f74cbdd 72672c7e +ars4x32 7 00000000 00000000 00000080 00000000 80000000 00000000 00000000 00000000 cdd08685 aa494976 778fdcd3 9ecac13f +ars4x32 7 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 00000000 fa778f3c 6258a48a e9264cb5 7b37bca7 +ars4x32 7 00000000 00000000 00008000 00000000 80000000 00000000 00000000 00000000 2d459898 72b4770e c2a0bb2b 3c849ce6 +ars4x32 7 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 00000000 4cc396bc ced17dc9 f56b05e9 f981fa2a +ars4x32 7 00000000 00000000 00800000 00000000 80000000 00000000 00000000 00000000 fca7e4cd 675b8891 78cb54e9 32b59df7 +ars4x32 7 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 00000000 2382998d 5c4ed0b3 055d8edf ca6ca6d4 +ars4x32 7 00000000 00000000 80000000 00000000 80000000 00000000 00000000 00000000 afa21a88 d3361143 bda336cd 1bf267e9 +ars4x32 7 00000000 00000000 00000000 000000ff 80000000 00000000 00000000 00000000 b18364a6 17306f04 1b6a8425 6eff1661 +ars4x32 7 00000000 00000000 00000000 00000080 80000000 00000000 00000000 00000000 0e9be5fd 8ca4a6f1 0a8877e6 da88be80 +ars4x32 7 00000000 00000000 00000000 0000ff00 80000000 00000000 00000000 00000000 1b5e3bd8 03430218 f30c0ab5 396c6445 +ars4x32 7 00000000 00000000 00000000 00008000 80000000 00000000 00000000 00000000 782878c3 3e5bf42b cf3105a1 de7112a6 +ars4x32 7 00000000 00000000 00000000 00ff0000 80000000 00000000 00000000 00000000 43bd4d21 40c58ac2 32165652 fbf0adba +ars4x32 7 00000000 00000000 00000000 00800000 80000000 00000000 00000000 00000000 f0139d5e 9458d4c8 5adb4065 18813af3 +ars4x32 7 00000000 00000000 00000000 ff000000 80000000 00000000 00000000 00000000 28331921 43f86e50 f0b94047 e0654b93 +ars4x32 7 00000000 00000000 00000000 80000000 80000000 00000000 00000000 00000000 5ec61507 95b87190 8213fbdb 1360ab51 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 80000000 00000000 00000000 00000000 533f6a37 ba512677 d84dfdd5 5597e5aa +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 80000000 00000000 00000000 00000000 529c017f 9f86555b 837d649b ff84d080 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 80000000 00000000 00000000 00000000 25283e1d ec64d74a afae1f45 5dad3c19 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 43c59a8b 7a0a8656 9c5f8e27 4af02ac2 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 57dc1d90 13124348 47a4d8f5 d64e0304 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 99ae0ba7 08529cca 397c2875 233f40e4 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 87ceb2f7 6b345e61 9a2262b5 d69056cc +ars4x32 7 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 00000000 1d69aed8 3b929058 e9fbe805 18ed39b5 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 00000000 90bfc885 9f4237b2 dfd32f0e b1e2f26a +ars4x32 7 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 00000000 da68b9cc 33b56472 05f80088 098915f3 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 00000000 55848037 5c14a6e4 10023500 abc72296 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 00000000 e7d77cf9 7140c274 0642cd78 c167426a +ars4x32 7 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 00000000 1f6f5dc7 6a834368 bc961991 01d51d24 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 00000000 1bb02fcb 029706f2 c4d03153 40cc75eb +ars4x32 7 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 00000000 be29eb01 7a39d0ea 79092750 0157e93f +ars4x32 7 00000000 00000000 00000000 00000001 00000000 000000ff 00000000 00000000 78f7259c 6ac835be 3b05318c a379cd46 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 000000ff 00000000 00000000 c914d01b 78603f42 272880d0 63db5558 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 000000ff 00000000 00000000 30fed3a5 d7d0f6ca f8a2b39b 4d1abdbd +ars4x32 7 00000000 00000000 00000000 01000000 00000000 000000ff 00000000 00000000 6fc859e0 28e9e642 deeabe53 148ec29e +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2ed44b13 fb6dc843 f6762574 24a4be71 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 c15b218e 5942aad5 5385c634 0b1a8d79 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 cea1fe5d d64390e8 77fa74f9 739b2908 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2d68af44 add72c30 8695fccf 457ff20c +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 a6d4ccee 099f5cb7 3def8137 c8b0e054 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2262767d 4f132f15 74544c84 849da607 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 00000000 6ffb7b5e f6433da9 546972b1 b9ba5e91 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 00000000 2f2e366a 8e08a28d 9fd231f5 89e1b414 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 00000000 ec4f793f 4a915361 49d4bf4b 008921e9 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 00000000 c16c5ceb 50bfe194 033a05fb 581cece7 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 00000000 b62541fa 29374e2b 5fd7db5a b8dc8fa1 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 00000000 f3092fc1 2d34850a ee312b26 b3248d96 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 00000000 18b536c0 2171ac1c 366bacb9 20307007 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 00000000 e5a3b8fc 7d0ebab7 1773b22b ca5ef8ff +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 00000000 eb5a6b14 d6f13e39 e5c2898c 884ae98d +ars4x32 7 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 00000000 63559e27 f649cb3e 8dad6310 214cec8b +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 00000000 ed16c428 2f7d0063 1dbe5855 0964c597 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 00000000 9c1c25a2 b51b1513 c2ce46c6 b710743b +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 00000000 27e77312 e0090553 981f1b58 e2e53ed4 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 00000000 2aba1abb c3d3fd8e 4db4d2cf a0d8e8fe +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 00000000 d6eb1511 03b367ec fb02e357 221e1de6 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 00000000 998b7fa0 c330bf3e 4906a0b9 32c00aee +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 000000ff 00000000 00000000 f95becd0 bdc40f82 23bc843a 953bbb26 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 000000ff 00000000 00000000 f960be5e c44d7241 08b27d55 67690dca +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 000000ff 00000000 00000000 ff69bad7 6752a2e6 5222bb9c 30d59d7e +ars4x32 7 00000000 00000000 00000000 00008000 00000000 000000ff 00000000 00000000 585585c3 b27283cf 4dcd15a3 ce8cd474 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 000000ff 00000000 00000000 09d00347 3eb2b33d c167b7a6 3481b589 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 000000ff 00000000 00000000 abb02cd1 a5501d95 f69faffa efae570e +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 000000ff 00000000 00000000 4ab73886 18a8e008 86c42139 4ffd1164 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 000000ff 00000000 00000000 f77867ae 96b779a2 e350fb3a bc323d55 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 000000ff 00000000 00000000 ad84c758 b85d53fc 270cc9cb 0d11d188 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 000000ff 00000000 00000000 1a623015 87f931a8 16b04922 f155907a +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 000000ff 00000000 00000000 f584e714 00b48848 4a91baa5 3ca12024 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000080 00000000 00000000 ae90a49e 0299f75a dba09105 373ea9eb +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000080 00000000 00000000 214eed3d 174342ff 75353808 982cff92 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 0f23fa1a 7b4b9c5d e05f47d2 b5ab6abc +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 c5d8ab43 57dccb7e e867925b 7f6262a2 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000080 00000000 00000000 374bb137 888b5016 ab7c188d 90208ed9 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000080 00000000 00000000 5f9ea30d a10ab20d 6dbd796c ef1aaa67 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000080 00000000 00000000 77d47187 2f3cfe06 9379af3f c4ba660f +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000080 00000000 00000000 f3b87463 f479102f ba81384d 34102ef8 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000080 00000000 00000000 60908525 4aabf57a 93c9cc43 8cad4313 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000080 00000000 00000000 3ce1f6e3 dda6d891 e1510c84 8f834bf4 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000080 00000000 00000000 985cf038 aa7b16b2 638d34f1 eda67219 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000080 00000000 00000000 a545eecc 860e969e 239e2844 0169b9a8 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000080 00000000 00000000 cb17174d e653d856 bc2b4908 e8fe058e +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000080 00000000 00000000 da37f0c2 dea7695a b2d60e33 5ea535fb +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000080 00000000 00000000 ab5150a4 6bda12a2 8f191285 7d7bb7c3 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000080 00000000 00000000 37041509 09fbce98 04aa5f64 c4321682 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 00000000 9c143b49 5f8c06bf 2cdff4f4 221ceef9 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 b7be5da6 fa4c411e c9cd4b45 531ad13e +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 6b883640 05246641 2b401ae1 d4d847ed +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 68166451 96c4002c a2bfab07 d56932a7 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 969ce4d7 2327f0e2 9f062d34 68cb61ac +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 f524b711 5cb24950 b205657f 695b1936 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 00000000 a428a90d ee8be22b ec86cd41 d7ca0544 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000080 00000000 00000000 92033e09 70381ddf a67153cf 7f1d3e6a +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 00000000 776d80b7 92d6738c 0eb0f0f1 6606b60b +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000080 00000000 00000000 3437e471 971e2660 9de12fcc 9e719dee +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 00000000 17d851f4 b6e2cba0 dcf9d96f 6db22640 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000080 00000000 00000000 49fba068 efaea7ff 4403e079 eff7e9f8 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 00000000 a9d90c25 137cefe3 2da099c8 8b7c54fe +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000080 00000000 00000000 31ecb7fc e98ed901 cc52ca53 522b8aef +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 00000000 67ea36d8 edc81619 75f854de 62620573 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000080 00000000 00000000 5f07cdb6 dc8eba08 a2203ab9 ebd2994e +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 00000000 2f97e7b3 1c024bf0 9460e45c 1eb15ddd +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000080 00000000 00000000 f99e3f20 685e32af d12893b7 d18721d8 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 00000000 59a6b960 e2f7be6d 19708280 ec687494 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000080 00000000 00000000 f6bf72b5 35e08dfc 79348d65 0c815c53 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 00000000 47060b19 ade1deb2 8d099901 f0ac9d2d +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000080 00000000 00000000 0a867ee5 95ee7cc0 7f2e1cf0 c07dfba7 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000080 00000000 00000000 c6642d40 a7c3b4ed eec824dc 24aee808 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000080 00000000 00000000 597ca954 4b3feb03 b167cc9c c8279e80 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000080 00000000 00000000 593f9abf 9e8e17a6 0242e2e5 f369eeed +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000080 00000000 00000000 fab1a164 05491084 8eef7174 75a535d2 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000080 00000000 00000000 69bcce75 1438b313 66a61a4b 43d63282 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000080 00000000 00000000 a4af4199 6f5a71ff 5414096c 85cb08c1 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000080 00000000 00000000 39646b02 29dd0ee6 e83e8167 a6d3146d +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000080 00000000 00000000 532476b9 2bbb5430 2f6e0475 0eda4364 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000080 00000000 00000000 e5f3aa72 34c9a92c ecef1d1b cf2f08f2 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000080 00000000 00000000 f5deff66 26bdf298 18970803 1b6bedfd +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000080 00000000 00000000 0cc5fc86 ec0fdde9 76d69653 8db392f0 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 bf8d3d73 1d510d98 a6a565cb f41beed0 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 e6d8c3e2 327dc9c6 a53a0526 a7a2e8c8 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 981d0eee 0e53df72 c8c669fa ef118af6 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 1ee3785e 8f405a41 6cf2f459 d12f65de +ars4x32 7 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 5689240e 4a9abb71 24f810b9 a00fed86 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 18ea4be2 8b2cd08c 56f9bdbe 494e587c +ars4x32 7 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 92e8db17 688254d0 099cfecb 0098b9be +ars4x32 7 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 8d849af3 bf8eb57a e3608fea 0abb0dc5 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 f0957217 2d87c5a8 769befb8 0549d014 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 501c3db9 1c2634bf 1338febc 662dcdb1 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 5208560b 3029b78d 68a6398f 7ddd0893 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 5e03fc29 b285b39d 03b9254b 6beccc1a +ars4x32 7 00000000 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 dc4ea628 911b21d6 a19c28e2 37bba515 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 467cdace 893c5b03 f7c0a63f b5fa6d2f +ars4x32 7 00000000 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 f9f1edfc 22a89845 34a86319 15f2be80 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 e95326d2 158048c8 8a64a0bf 59be8fe3 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 ed0f0350 6dd365eb 1bcfa92a 4db75da2 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 62ffa2d5 51f141be 09c2b4b8 b598b403 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 811a7341 0810d368 7a944fba 8c2db187 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 5d716d41 86d8ebee d46107c9 e689580a +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 30171295 a98ec36d 2e0be711 4f2d1fe9 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 f0015e01 ca15540b 21cb5ab1 ac427fe0 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 00000000 b27d8ea4 4571306b 285941ad d099a2fa +ars4x32 7 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 00000000 cf80a449 81a472b2 3f02b902 5331a873 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 8c7134f8 5c101fe0 a856f137 f0b7f9e2 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 afb74eb6 8ce42242 283c88fb c996e8f9 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 de9c09e7 2c4371b2 d68598a3 fd542cd7 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 b644c5b6 d9b39c14 df251f04 d100e3a3 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 60227b14 5446b9ec 29d6f141 aabf28ec +ars4x32 7 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 4e5ff116 74319409 a2701bcf c21ac2b8 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 df928d9b f5ee85d1 d2e6fcff 8ff1a089 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 655d7684 02a497cf 66472be3 51cb21ae +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 385c614b cfbb23f4 d8d2e9e1 fc2d347a +ars4x32 7 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 be160be9 d5f9377d 4ab8930d de644129 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 f71ffc4b 9cab4462 5ea652a8 14c64784 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 37283e06 0ed6eb3a b50d87d7 e634ea06 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 4f21b624 e648f329 2d8d00e4 e9b49f04 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 e4a3fe71 9b5fae1e 53820c87 1c58ec32 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 c29db687 ff297beb c5d6bec3 cb7ae3cf +ars4x32 7 00000000 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 21951dae 003c22e4 83d84db6 1a9de86f +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 f413a989 165bdbe1 8922a860 6797a8ff +ars4x32 7 00000000 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 e59016e4 fb6e32cd 65f00e08 30226a9b +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 229fd6be 4ee85e56 716cdf41 170ff3ff +ars4x32 7 00000000 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 b52fe913 83b547be 82862735 846a4eac +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 196d2d4f 8e9e6910 a5ca966a fe82b956 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 36d5b269 f4db697b ec722e8d df2ff182 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 0000ff00 00000000 00000000 5bd99f4a c5252d31 108e2fe8 3f2686a2 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 0000ff00 00000000 00000000 39c67c1f 1d0b1143 8f481468 8a074ac7 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 0000ff00 00000000 00000000 f4159e57 3ab56aa9 c3494b56 be2adf75 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00008000 00000000 00000000 db9704a9 ef263fce 5db55684 c96084fb +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00008000 00000000 00000000 dfeb7041 fa1db088 b7bc68f9 33ca18ac +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 31d60d2d 47f43f83 9df1d72f 181de12c +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 f9c6cd53 132035ec 2e18186a 2104f1c9 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00008000 00000000 00000000 2cc737b6 58815b90 33777112 aeb6800a +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00008000 00000000 00000000 9d94df0d 2a830476 cf2e099c 8d892ff3 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00008000 00000000 00000000 748b4a17 5b72ce83 1b3f3e4b 8728a776 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00008000 00000000 00000000 7d45758d e76bf3fe a7b55753 dcaefaac +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00008000 00000000 00000000 e66b7711 3e2e1887 b0f76cd2 4f19cd7d +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00008000 00000000 00000000 749fb548 e9504acc 8f4fcea3 995dd615 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00008000 00000000 00000000 35945e10 73b8316d 4304cd97 22139e09 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00008000 00000000 00000000 c0a3584d 8851beab bb5054da 54bde8ef +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00008000 00000000 00000000 cac47e18 33b1923a 2661cd54 3912c9f6 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00008000 00000000 00000000 8eea2fca 424213b8 432d7466 eec8205e +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00008000 00000000 00000000 e14c3c29 4c914482 e4297b22 9b74a9b0 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00008000 00000000 00000000 09298383 2aacc8c9 68fab5f3 3ac39074 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 00000000 e6fda281 e47d10f1 913e2eef bc2d749e +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 85bfc2ed f03342c8 33575fab 39908df3 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 9ba088f8 8b002507 b53e5ba5 a7f72b49 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 ea1c882b b06e1f48 76e390fe 0da47a30 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 98a48736 42766b4c 51a4ab61 a91bb5c3 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 4ae41923 243a9d0b bcc8f725 f287d208 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 00000000 2becea93 ace8c413 b7cc8723 a2239118 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00008000 00000000 00000000 54b29d30 73bc664f 9a9e7718 e88468d8 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 e61b52ea 70fb72a5 f697bd49 e7aed424 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00008000 00000000 00000000 abd7dc9f 87a475f2 a2a09480 e550e8f7 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 9b1e02fa f83ae20c 2f622aa8 3219519a +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00008000 00000000 00000000 14fba53a eb197503 a8df910f 321148c8 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 1f4105db 1c722e89 cbc6bca0 37dc36db +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00008000 00000000 00000000 1754bdfb 10ec431e d2b3eaad a00edf7a +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 f6fe2fd1 a5178952 af6b93b0 0bd11cf2 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00008000 00000000 00000000 d03063ae dd50c426 1acbb6a0 b0554b47 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 2f8b0bf2 429ab5a5 a016a59e d471538a +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00008000 00000000 00000000 71f7c393 8f48b5e7 299ddc6a 55fcaa6c +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 a71b7b5d 578afb73 0e7392db 96b694ce +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00008000 00000000 00000000 5a441f14 c83ec7d0 753ac769 38073516 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 e4e6f8dc f53de139 45effab1 dc0996a6 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00008000 00000000 00000000 50cd0a10 c52757d4 7ff34684 bb68de39 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 215ef309 6f0de2af b4b85414 7b736785 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00008000 00000000 00000000 8731b162 bd29d6fa 00f59b48 678bc88d +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 c4606bde ddd5ed0c 5c9bc1ff 5ad36111 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00008000 00000000 00000000 cdee80d2 29fde63c 08b24838 4bdd7d5b +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 69f07cb4 3daad6ee 23d91210 dd331958 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00008000 00000000 00000000 dd083841 75da0960 dfed0370 f375191b +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 dfe5fc51 5c5afcd7 318a4734 6cac06cb +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00008000 00000000 00000000 0addcc4e 9a41fb4d b703f735 84e16f6c +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00008000 00000000 00000000 06cf3877 8a415845 dd99e388 407e5223 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00008000 00000000 00000000 de6ea0e8 e8222e4f 1c21646b b734df48 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00008000 00000000 00000000 dd143117 e8d7dca6 e5bed8c0 b263b96d +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 22f2e0d8 119db813 ef467231 87adf624 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 591be312 848da854 bc940af1 67bc8788 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 2590446f 41ed4294 1fabf395 9992d4d0 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 cb66370c 08d192e8 bb3e9866 aa7f9e33 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 7a9b0472 38d53db3 9583ba65 84d57212 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 29280b3e 2d6c8fbd 994dfe1c 593aeaa6 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 dd008448 cd16543a 30df7d0f 3039bd79 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9f11a9e6 e603f66f 5a57ee92 93d9af01 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 1345a1be 0f8a5c3f d1ea8039 4abbac6d +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 94d5bec7 b9b0e28d d20cc7e4 af8f8d86 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 0693f3d8 c0b81f20 3788c729 9cea29c9 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 53fa683a f547a8ba 302b9e54 0558a385 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 d20286b1 15b4c8c5 d23c8659 4710be03 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 b6b46794 9185795e edd8901e 40d74d41 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 34732fd7 ae767bd9 04cebe75 92815953 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 b7326f81 17aaf702 caed628d a909f2a4 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 7b09863f 3274ceb9 e8ca6436 cd9fa04c +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 33044882 ca7f0d85 a60f44fc 5b4891ce +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9dc3299a 212f0f0d 88c5f4a4 906b734e +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9556fc2f 7afc82b3 3bc44611 4351e66d +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 dfce62c3 d3c5a2c0 4c1d6737 862d9293 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 f4f0b118 144c2c2f 26b39231 ea14c7b9 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 00000000 b245315d bcf6c91d 754a7c14 2565e48f +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 00000000 752203b4 ae13b9a0 e31fec08 eb692cef +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 09df70d5 40f8d185 48efe5f7 ee1108a0 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 136a420c b7181b55 deafcbae 1d5ee1a6 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 a0d5b02b 733a381c 450b339f 7cff8df1 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 c8926a31 a643a5b0 43107ff4 32072bc9 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 a58e8a68 a6b42ff4 258b5e32 60b56a1c +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 fcee65a1 f4d681ca 3505111a 9a6acf37 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 b0f43b3b 1c31e2b7 67e8de1c 31a02555 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 ecc48ee5 981d2b49 fd7a22b9 ec415eca +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 4970651e 85676890 def6e22c 4f7cfaec +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 5d3c6b96 d38d2378 b276ece6 f5fcafda +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 9a8d3698 ab0ef629 959e5d2c 56c0b421 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 9a344ab0 8f692a72 859b7958 da1b6e56 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 db668406 9292601c 3f17b216 7d4a1edf +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 fcbbbf78 df5a0eb5 d3db5451 cfc752a7 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 23810f43 e8b16515 aa4c4b07 c1ba936e +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 9577f463 e0444f19 420d39d5 df310656 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 c87afd4b 878b17e4 058a30a0 80f8c3c8 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 865e2af9 48b7f68a 41bd6dfa 342ba0f8 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 2ea49763 e91477bf aa5d51d1 74e9517d +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 d432cdeb d7a03de6 e6da11f1 7acb2a00 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 e6d53827 4fc4e478 71542a8d 1f3bc6a8 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 e3847d0b e65bbbb4 5bb78b81 94a1ffa8 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00ff0000 00000000 00000000 e7d6bcdd 45051fe4 252629fc bf659cc5 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00ff0000 00000000 00000000 41f95399 e7959014 d2b9e413 1f39e87e +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00ff0000 00000000 00000000 c2b31aea d398aa7a 3b1031e1 bc68c109 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00800000 00000000 00000000 a00cec5b ca487f61 359cf73f 70d21378 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00800000 00000000 00000000 4ec9a531 01d54c62 bf5bb168 3936a9dc +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 88d2d6f8 39b8dfdf 2c4b698c 1777afa9 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 7420b78f 0c252bbd 9c15e937 310f3172 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00800000 00000000 00000000 1ef12f67 a60fe50b 69094d0d 8bff4098 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00800000 00000000 00000000 8efc8373 d5525958 00b1ca78 1a00468b +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00800000 00000000 00000000 4c8af3c6 287a3960 bc819b5c ccd70ef3 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00800000 00000000 00000000 be01d2cb bcb36836 6d07da5d 7b5f5131 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00800000 00000000 00000000 f80acd07 8c3fad47 a43a6c1d 69d4c38b +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00800000 00000000 00000000 0366f28f b42cc3d2 c48f4210 fc323078 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00800000 00000000 00000000 b939bdc3 f022b43d ad77aeb2 9873ef1e +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00800000 00000000 00000000 8348845d 3d6f6b77 5d6c5431 f41b1d32 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00800000 00000000 00000000 1a0d422b a516883d 2c9cbcbd 2e3e99aa +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00800000 00000000 00000000 d86f62b6 f25abfd6 d3552a3a 66b91402 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00800000 00000000 00000000 a7ec3af6 70d67a95 b65e8dd4 ea222f76 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00800000 00000000 00000000 ce5df8a5 01643578 caa889a5 e2705fd6 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 00000000 3c6ad46b e7e1f139 39fbf5ef 6f1a3aea +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 234f33d3 4fa04e77 411d7035 39268f19 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 0b14f1c3 cd9af14d 539e70e4 79825055 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 40e73acc e9b3b945 10196cce f368f24b +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 836ff74a 9c70652a fea219a9 8b74d93f +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 0a5591da 22b02386 4d28d374 836fa930 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 00000000 e38da49a 17af6e25 348ceb8f ab48a1a1 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00800000 00000000 00000000 aebfe231 846aeb9c fa9738a5 f6f29436 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 347096a3 b95cdaea 860c65c8 6bd32e14 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00800000 00000000 00000000 b5d23f22 30beb254 e19e5180 0876af03 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 7622487e bfcbebc8 d543d53a 32525da0 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00800000 00000000 00000000 f110591a e77c10d2 131fd7c5 7866db43 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 30a66ecc ae6b7e48 74bd80d8 76b29af8 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00800000 00000000 00000000 58d0bb84 6706c78b 45009e22 e2785f61 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 4c61bfe6 7c955151 e8001ec5 d0e615d8 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00800000 00000000 00000000 6f3ad05a f461f745 93857d8c f4905c98 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 3bd3b603 e4d94cd7 26d0b77f 02c0d7a4 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00800000 00000000 00000000 d157ff8d 0d02e8e2 684207f3 b9bcf112 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 339e5c56 076e7a8f 14c0c415 b969eada +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00800000 00000000 00000000 37433a96 db919da4 81251cf1 f4e33e0a +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 f8347f15 c53d6bd6 d45169e6 66d75179 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00800000 00000000 00000000 df6f61ec c24802e5 9ac4c23b 567b0462 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 75201044 9748cf2d 2863ce41 abc2f9d6 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00800000 00000000 00000000 4e472868 2032a8ef 57b542a6 87a7ba77 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 11dc900c 177c3c50 ff18eb90 1ae824ac +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00800000 00000000 00000000 d96eb7d0 2278a9f7 1cc3be75 2c605110 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 d807febf f989c784 c403114d 4216b1ee +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00800000 00000000 00000000 6311b004 c28fb046 5a200f83 bb7d751d +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 26188d57 412bf765 4600984a b9c9d357 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00800000 00000000 00000000 844374b9 abff9a5f 96815949 b22f6961 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00800000 00000000 00000000 ffac52fa 1f7d34f9 a9738dfc 47759b16 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00800000 00000000 00000000 fbcf1b8f 4e82c5d7 124478f1 bf5d6237 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00800000 00000000 00000000 d563c78b 35d4deef f9dff8ba fa4c3faa +ars4x32 7 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 3fff9d46 5b0693fe a650b70e f7364259 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 c2fa97cf 135f3c99 5e5827b4 9f23e516 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 595f9ac4 d3ce4ef5 6e35b798 05625328 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 440ab580 5e2cb77e 20834e4f 07c5cda9 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 5cad76b4 2d10781c 88281342 86f4b2ff +ars4x32 7 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 0baef30c 35fd70c5 0405f817 7b2ff157 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 91c7c79a a6c35ec2 c68d26e3 1d67d346 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 6a06e692 9dc01cf5 643390ba dcf9a4e1 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 2846ce5d 2d5c5293 69ef3bf5 14eda2ee +ars4x32 7 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 073bcfeb c7511a06 e6e172ad 04256d1b +ars4x32 7 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 7eedd694 783e76ea a54f18ce 73358e97 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 ce6d599c a1e8dba1 c792f716 e79f5e37 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 9492bd38 cba5a7d4 b2f61619 c4d1d9ac +ars4x32 7 00000000 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 2f993455 e8b24e8a 03463cba 76d284ee +ars4x32 7 00000000 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 98675030 cdf6a1e1 ae7c3e3e 75852eb4 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 8b15c94a 9e1e7937 dffda9ac dccd4d48 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 b22116ab 9fe03ef6 c537818f e47727e0 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 8d56c361 b300372f fb93f6d9 db48a513 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 d5169544 537df03d 51194829 50f20d3f +ars4x32 7 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 d262b945 f3d67451 2580e1f1 bd4a686d +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 e869c6ed 0a359231 fe48009f f52ec3dc +ars4x32 7 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 5e06823f c5938edd 13af24a0 27958c66 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 00000000 c99e41d0 33024c8d fe9d5339 a63a5f24 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 00000000 3290af6f db2d7d1c bcd8a1a8 3e8bb439 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 129ea6bb 5d08d671 f62ef596 cad420a5 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 bf9ecf25 dfe7fe89 62867a95 2683b953 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 03bc9cda eaaee763 88c08cdf 7719a09c +ars4x32 7 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 ad437fdc 6976af30 f4ec20b6 dfc29017 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 eb301301 290c523c 45eee9c5 d64bf7a8 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 3a342e30 d00ac78f 5b41b3e7 bbb4d824 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 9de8ac05 ce583257 b2c5ef4f a57f7c76 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 0a2ad7b3 b4d4d02f a71b913e 274cc7ad +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 a5d2501c 04dc2b1d e116388c d560e1d9 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 070a7bb7 d1a2432e bec1284d b10c0250 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 3cbceeed 85a455f6 136cda60 453b735f +ars4x32 7 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 0aa40388 0316fcda acbc1c87 bc639a3e +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 2a77b2df 5082a5a5 b5527d9f f113ea2e +ars4x32 7 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 d052815c 62de4af5 c0d26b42 c4aeb933 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 7d751d2d 8dc0e76f 275d7b8b df4aa40a +ars4x32 7 00000000 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 681d9e43 febf6b94 4b026a8d ee1485e9 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 00041b8f f701647b 5444ac32 d89fb67c +ars4x32 7 00000000 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 e9858209 2bc56022 16004c89 85bc27b4 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 4158a0f1 f4c90b15 c1cb18d3 63d6cf74 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 3c663c9d 72ec3fe3 2dbd3c61 13009c67 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 c4a83fc3 68898afd 597344cf 21084208 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 7fab47bb fcd840f2 cda838c4 6ae55be9 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 ff000000 00000000 00000000 a0473fb6 d208106d 8b769b3a 24d4f27b +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 ff000000 00000000 00000000 844c06ae f167b931 f701a614 7ec8b726 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 ff000000 00000000 00000000 37bd10fd 09a717ef 3b52e5fa 4a6937c2 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 5f0ada1b bd050790 dcaf5e38 298a17b8 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 80000000 00000000 00000000 5773f53d c2e1b603 87014c86 e34ec098 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 414196fd 2b2dc69e 78149e7c 45b5f326 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 1f875ed9 ac5906df 12e5f6a7 e233bfd1 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 dcfc2a48 f8ba776a 5c4a2812 8a16d7be +ars4x32 7 00000000 00000100 00000000 00000000 00000000 80000000 00000000 00000000 2a3576d3 6629f24d 13f14b9e 3d2ca84e +ars4x32 7 00000000 00010000 00000000 00000000 00000000 80000000 00000000 00000000 3e16e8a7 fc4d8a08 0a01ac1e 1af11bec +ars4x32 7 00000000 01000000 00000000 00000000 00000000 80000000 00000000 00000000 96593166 0238eabc bbebf20f 0f504522 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 8af3b216 dd7acd2b a3e33e1e 78b046e4 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 80000000 00000000 00000000 9a054567 fff1d369 15556300 cf32fa94 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 80000000 00000000 00000000 f5a60b19 7d5e3da6 84d86206 9e1853e9 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 80000000 00000000 00000000 94c67275 4b58d229 ed89be2b 74d861c9 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 63a9b261 caeb28c8 2ef06ebd f2e5792a +ars4x32 7 00000000 00000000 00000000 00000100 00000000 80000000 00000000 00000000 38f259c6 82cd5ca0 88012938 1b5e554e +ars4x32 7 00000000 00000000 00000000 00010000 00000000 80000000 00000000 00000000 f2573b0c 7adc711e 19ce7393 e9f7de3e +ars4x32 7 00000000 00000000 00000000 01000000 00000000 80000000 00000000 00000000 6b8acec2 ead9cca3 7fa50710 5d15e514 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 00000000 8c7993f1 e3203144 84cab4b5 72020dbb +ars4x32 7 00008000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 42d7f77d f086fc2e 3e73a287 c07d7ebc +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 6bce9267 5e248dac a2ed0ce5 aef8fd8f +ars4x32 7 00800000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 4472cb80 f16e7a81 1ae5d21e 5f55c422 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 aa8c96e7 7081d2fc 29cae09f 98911fa3 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 edff19de 058ba50c 77d23430 a67d3096 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 00000000 249e0ed9 233a0ad4 1eb99295 52e5de17 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 80000000 00000000 00000000 5cbc4013 a507ff7e 19c0ec9a 98a429e1 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 b82754b5 f5be7d8e 4ffa8942 52e2a259 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 80000000 00000000 00000000 c1dd067d 61dfed2a 9fa61288 846d0e65 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 5eedd38e daf2e6c6 efcbf785 0773d069 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 80000000 00000000 00000000 bebaae38 bf214df2 00b1720c 42177b77 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 23e1c82a 5d9a8441 4d3274da 8db3ac26 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 1612e16c 8ce98dcd 39b1bd24 45addfa9 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 370cafef 3f7e2898 73255314 2a49538b +ars4x32 7 00000000 00000000 00000080 00000000 00000000 80000000 00000000 00000000 2d984e0c 528466c2 a95bee17 d09bc557 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 04c3d191 76c5b6f6 15e575df 1579abf0 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 80000000 00000000 00000000 cfb9c656 406d2556 357a2e8c bea5ee32 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 18978a0b 3832c66a 2e2d7273 683e77c6 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 80000000 00000000 00000000 1234972a 25fa70fa 4da76fce 53941394 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 a8f77508 14259e2b 210358b5 98cd4738 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 8976de9d 368c66d2 ba5f8bbf f4881147 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 aa9648cd d926107f 4ef3fb1c 3e9b4cff +ars4x32 7 00000000 00000000 00000000 00000080 00000000 80000000 00000000 00000000 7de770ee 7198b212 30e3fb87 1bf1945e +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 00e0ac25 c7ceb630 cdd4686d fa763bdf +ars4x32 7 00000000 00000000 00000000 00008000 00000000 80000000 00000000 00000000 43b3b752 af25c906 b1b4c5f5 a060418e +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 198dd040 e1df7ce3 2a02dab1 d3af6e19 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 80000000 00000000 00000000 600c5000 a1452641 eb1394d7 3afe4cb5 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 00966e72 fd68133c 2fd0ca6e be23b3bd +ars4x32 7 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 d4a2cb91 1091cb54 cf890039 ddda004f +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 80000000 00000000 00000000 bbc2523d e460d59d 48e1dd0e 60e28a17 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 80000000 00000000 00000000 cfcb3264 9ca26dd6 94e27470 4c925066 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 80000000 00000000 00000000 6735321b 61e112c7 afee373e 46f1395e +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 dd64a2ff 5104730d c0ae788d a01d6a2b +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 e70ebc93 76c6aad5 80ad83b3 62d2754f +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 7a62d1cc de10fa0e 0d8b1e8a 32776f76 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 055823a1 c06b9761 f9bd3fc2 e878afc5 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 37cd795c 1ccc8adf a68d762e 553c7112 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 03b8471b fb53325a 12d2e358 1c5da90d +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 a78e262c 3b1ba467 3ba757f4 e692d21c +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 7665303b 4e3555cb 36df84ad 2fb325c6 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 364b771f 291c0c78 13a1aa88 c494c221 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 7c36b039 692e4b12 50a2349c 85410d4d +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 9964202c e48b3418 b31c5ede d22677c6 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 1883bb94 b1301868 24a80f7e 285b3455 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 f83701ba 2054306a 41cc63a4 c107d44d +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 e7ec839f 21a2f540 431d62b9 dc559e31 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 193c9ee3 710ca9c0 4d2a0071 2bfd6a4e +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 9481e88c ec053c33 9c4983da 8e71653c +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 35a186ff 53d78ecb 6c2514a6 0bc7ace5 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 30b292b0 288f14e0 16a3ed41 5e9a1e8c +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 d3b9ae42 53ea5e05 ea37344c 3365d0de +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 873b4e28 fc4c21d5 970a4cb3 3f02ee17 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 431ef8cf 59c8dfd2 f86178a1 847b60cf +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 60af461e a413f0ba a76cb9d6 1f633554 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff 00000000 803a06af ec3f8653 c212c9e0 1cb31cb2 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 00000000 017e6914 0f535266 0ae93b38 cfe4c9d3 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 b9d94a88 1c64dd00 c747a4dd 171ed6e3 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 0b5675f7 942da36f 345f5696 0bf565c3 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 c65b64c3 da4f3f6b 2588c0a8 66504ff2 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 0cbb3a66 77613276 0dc528a1 31a876f3 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 a06a59b7 aab0c4b8 ef1aabd3 a33c70b4 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 b02a5efd 857a0543 d8ef7568 6726adf7 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 52fd0dfd 15561258 c6ab328b f9557afc +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 89c6338c d18771e7 7c12f02d 3d0955b9 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 68dd0297 3442908f 77dfe98b e52ea361 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 50b1e8eb 9b537afa 147b4051 48d80416 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 f6ff5eb4 30f6b151 630a56dd 5a0b422f +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 be82fb06 15d2509e 725b861a df97b972 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 b6c6a327 885044c7 53b59d61 d8e11374 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 b19247c4 4e3d2d40 a3dc5fb9 e9a64a87 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 f6accc79 61a1a18f c10cde1c 82263b48 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 e4080bc3 9f03cf41 73813e63 55920cbf +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 953bd9b1 f0adfdbc 8d1e8637 fc3aae24 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 67aac33a bc41dc9d 9e76a5d3 d05fb0cc +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 9aa1ec74 abeedbf3 b69362c4 8bc7fef0 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 e2a38fe5 e357ad6e f9428603 1da81cce +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 38aa15a5 571ef34a c022ddce 78d900b2 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 12facc68 09c6ab68 d036ec58 02fb6181 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 000000ff 00000000 e16cc4ad 54f590c4 e1566ac0 32f9c6a9 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 000000ff 00000000 265d4bd1 c1615d4e 09de0cd2 eb487c57 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 000000ff 00000000 ee505d84 9d283ee1 779ab900 0827c83e +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000080 00000000 28b2328f 0fa5f615 8316c9ea e541fe16 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000080 00000000 5e0d37b7 d3a150e2 0a8cd83b 43948be9 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 c7241b1e bb6537ef a62023dc 0ab19d6d +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 acdb9793 b6762963 011e1e60 736b471f +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000080 00000000 a04030ca 37035c35 3c83185d 66977ad7 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000080 00000000 f87e3660 29b62f23 1fa911e4 8825ac2d +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000080 00000000 0405098d 5f586df6 4d048c3a 5f6625a3 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000080 00000000 b570ae35 55111919 6cd58d47 ffdf357e +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000080 00000000 e61b9f3d cc504fd1 e55cc705 e1164506 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000080 00000000 d4abecca 32245a7d bf274520 781bf659 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000080 00000000 8cd339b8 f7292101 db49022d 52747449 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000080 00000000 88f0a81a 9ba3290c e738881f e27cec9e +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000080 00000000 b02ee6da f5f9bc83 62de8926 fa7ee983 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000080 00000000 8c983a61 1ae74967 5bd89970 5b8d7c6c +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000080 00000000 2f0b2de6 4f52e7e4 61cbdefe 02fef405 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000080 00000000 7c76e448 a783f64f 0560b403 255a28a1 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 00000000 f157758b baf4ccb5 2d66ebe5 6c94c55d +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 a1b67bff 447e0b5e 4c3ddd64 072f1022 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 4b52c613 834a15d2 4cd2b88b c7810251 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 5a306e0b c7da868e d032dde6 5c06d858 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 dc5360db ed5d35a2 439064ac fce2a0ec +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 6289382f e74206ba 91690ea6 4a7cd082 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 00000000 890c9ecd 757b4645 0c116ba9 3345c351 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000080 00000000 cc566acc e04aa66a eeddafe9 41e2f7e7 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 f4d61444 ba5cbec6 58d7bb95 620ff6f3 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000080 00000000 906a517a 5f65728b 59ea2a88 5c307e01 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 e7122e90 7832983a 96c5af52 f5d242ce +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000080 00000000 fbb8d451 7d889eb5 96c8d138 0ffc51e9 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 dab30e2a dbd9f3e7 6bf73eaf bc3a8d7d +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000080 00000000 bc7d6d85 b69aee83 e8f71720 70d09ae8 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 5fa55d16 9908c07b e7b4ee98 134617f1 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000080 00000000 eaeb1cb5 1ff6b616 acca2703 75221d78 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 6b77d622 8646ca40 6028461c af1903b7 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000080 00000000 03900db2 4aa298bd 10dcbf6e 6fecc45c +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 842f5cd6 646ba731 8d066c6f 716cabf6 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000080 00000000 93675dde ccd2485a 52960f2b 66bf4a21 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 78d8e9c6 862bc175 c09fed18 1256f338 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000080 00000000 77a9b9d1 f964ad82 27f1b1fb bd8a0bd1 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 cbc664b6 810d4747 ad8aa88f 806fbd63 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000080 00000000 8435f62a 91cfc4d9 0eed6cd9 91cb2208 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 8f321c01 5b3edf6e fb7991a3 bd289447 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000080 00000000 eea6f4db 41de03f5 182895c1 b53098a7 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 3780b16c 3bd637f8 95636506 6da9be31 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000080 00000000 293a9962 66a0cdff 152b3b0d e29416ec +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 1e80c35a 26391dc2 1411b393 6d83ef15 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000080 00000000 63ba81ae b5d0f45b 2167d0a7 f6753e70 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000080 00000000 ef14eb2a 8375a2fb 6079b492 a44dc69a +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000080 00000000 1be30298 84e8d9e2 5cd64037 d7689860 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000080 00000000 d2d55a42 a400c4d7 12d0cc63 3191768e +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 e207ecb3 210b891c 856c8786 d570d667 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 473186b1 9247f498 84e2cdb1 0fd6079b +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 3ee486a0 e30bc9a7 cae61162 3541295c +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 39342ae3 0f79c530 a2b86b64 6874fce4 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 17b01843 1999a4d5 38d3003c 8ba22700 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 37abbdf5 f6ed2b16 302e3c8d ae41ef09 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 598b800c 85d7af3e 4b7c9da2 7be5610f +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 1b0aefe6 7060079f 4455577c 9520db4a +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 91431f52 816d61a4 7abc1dcb beb68973 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 39a6d5f0 3ab9c84e 7bb3aa4f d2439736 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 04953ce3 1f590731 8326bcc3 76545701 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 eb2aae06 ab7c74cd af2b98b8 938db69f +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 3f706478 3fcfe475 43c02841 3da4c11f +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 2aa708ea c23d23a2 441b0061 6fd2d232 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 5a7d4288 10fe9cfb 328bbb69 24d5d706 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 b40c18cc 876c614f dbb42b2a b7ae7994 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 94b1ba11 1454e234 5078f9ba 253fd486 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 1abd0a2c 9890ccbc 99eca8d6 440a1934 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 d20d70e9 fd4cd32b d5ccd103 8d323b56 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 7dbc1d85 8dbadddd c86dcb38 75eb4f48 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 bb652524 cb8eab7d 2da04670 63a33b3e +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 689a1ecc 6039e2be 2cd5fd3a 14e563b2 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 00000000 b16bea2d 967c4577 0df15037 e4886893 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 00000000 b496dbe0 9ad71f56 070fc5e7 b120b9a2 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 e0ce7d99 a52b4a27 e88b11f4 4685a7ca +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 b770bfd2 97e22420 5f29089a b4577e2c +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 39bfa7b3 b92a5943 9ed1915e 48a33f8d +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 830af295 4eaa5e63 019f24d7 aec4a78b +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 25137691 347525cd d32fd26d 9305c2ce +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 ad2dfac0 2e2c8c4d 7fdb7b6a ca5e0859 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 87ce0724 1b64153f e2ae361f 07572129 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 bb8c5b2e 843b2948 208de4e2 cdeab0ad +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 b944aa9c c45f5a12 f1ca4a9e a0456e0b +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 40b417b0 a2a007c2 85f8319d a3756891 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 f7a5b1a6 06a4b50c 686df503 2c847a65 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 9bc2c697 c68ebdda 8632850d 1caa3240 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 6b6426a7 7d75282e 8674bff4 b5375972 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 7120e227 60337a2c e5057c45 044f5b94 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 9726bb5f 8047463b 8fe61df7 12ffdf7c +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 753e008d 82416d3d f65cddc2 7b6ccd1f +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 72bf7410 06ab16a1 a7d39ea2 bff4f0b9 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 6cc08cf8 f5c5e856 5867ba98 eb67e26a +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 5da7e2fc fcd7a11c 8d858c12 f65f99e2 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 87f146c1 5898085a 37a4f313 6d3018c5 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 8dd15ad3 0c7c3618 83d72028 3884bb9f +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 0c5b6d80 06845859 8c5feea9 89d16738 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 0000ff00 00000000 2df31a0a 729ebc03 67e18942 f9f32def +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 0000ff00 00000000 360c4e8a ea0dc3f7 9553d17b e974fec4 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 0000ff00 00000000 9a7f1259 37d979c6 ce278c27 96d67bb3 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00008000 00000000 ff8b4859 ea64fe49 f4087406 fc4b2f65 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00008000 00000000 d378a434 2c15de1d e24a3c41 1aafe6a9 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 e9352493 e2655ea3 916a121e 984ad64f +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 487ee61d 2c252f77 47c1f591 eafcf518 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00008000 00000000 5be2f0c5 2f9bc90b 6636fb8a 3c95bb55 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00008000 00000000 c852daa3 2dc271d9 5259cd5e 0e1a8cdf +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00008000 00000000 36fbd56b 352a20fc eb27648d 8b9ade31 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00008000 00000000 2670d668 deeddda4 383006f4 8998f35c +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00008000 00000000 04910224 1a5dbc0b 08a0163c ace7a017 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00008000 00000000 910c3e65 b3e85fbc cd168602 ddf8e63a +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00008000 00000000 a7c3fe43 884bbe51 eb9967f2 cf0c575d +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00008000 00000000 692a2238 531c9c29 afa6d025 0dd6445d +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00008000 00000000 9f3f5308 0d79dd3b 15e080d5 fd8e4dca +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00008000 00000000 b92f2227 df6749aa e3c2767d b0e4e214 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00008000 00000000 e19300ae de40a7b3 b0776433 df508342 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00008000 00000000 adb4da91 ad928796 8a063cfe cfe98a48 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 00000000 9a196e77 eec0b6a2 0f09da71 77f0b9a7 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 a1423831 92b09a92 1b59db81 97877bc9 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 a9803eb6 c2150f50 f3f4335b 769870b5 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 bc228b32 1c261956 c258d812 d53f8dcd +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 e4d4d995 66a88f32 16924d5f 131e87a3 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 11f1fc59 0d452e4b 22a34320 d6837e2b +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 00000000 e9a5f770 5ce1166e 2c3a0b84 2ba27e02 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00008000 00000000 211f56d5 455fb285 809479ad adc82395 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 e1dcd656 8cbe35c9 1b1da938 6cf939e7 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00008000 00000000 c96bc0a7 cc55c189 1c33cadf fef12577 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 e2c7cee9 284c6c94 f111b06c 7c94f947 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00008000 00000000 e6061948 d5068dc4 2ad66b1e 69796b8d +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 263b16fa d57ae39b c5721991 559c3496 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00008000 00000000 424d82a4 2de34feb c9ea8fde 2a795a77 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 e38c8441 d997461e ec59f5f1 209e8fae +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00008000 00000000 78ff893e 731b1680 35c09a8a 2707177c +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 8f2c1884 74f32a0f 5a6e8255 f2cd90b5 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00008000 00000000 30d1e593 bd0dddce 4c3300c6 bf4cce98 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 62d7584f dba38064 c5804177 c1523bc6 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00008000 00000000 9a95ba58 a8d89e83 78abc8ad f5e7d2cf +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 ba70ac88 361c8ab0 22c5c925 ad11aafb +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00008000 00000000 2724e7bf 0d5370e4 f73abf99 6f458b64 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 d6bde385 73f0a1dd f741c189 645bf361 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00008000 00000000 b923575c d74cfa76 4cf13d38 89e164be +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 2e1b196d 1262def8 c49e9776 212320de +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00008000 00000000 459ce8c6 b1cfa83e 432d48f0 e8b5bd63 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 e419fbf3 af62d307 f56ce478 b71545c2 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00008000 00000000 f388f74d 6b2771e0 b07f3b19 d978d23d +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 38536d42 0bc4cb6d c6458036 0f9dc83c +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00008000 00000000 3349b5d4 35dd0907 fd7807ee 2686b306 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00008000 00000000 b21c2bf9 1c4628f1 5a2141d6 38d7c260 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00008000 00000000 f94b8b78 38e02d43 5af1f50c 20479c8f +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00008000 00000000 851cb311 34296508 baade6b5 ec7c625e +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 4fa36bed f49b0f68 f68454e1 8f4ffd6b +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 0ed25b31 17d37f27 63fa0d94 d9669710 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 e358a9f1 f2635fdd 8f93e471 97ddd54f +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 9021c525 2f77fcf9 2bb35ce2 99d6c5ea +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 6e6685a3 75fba10d 1d2ed31a 813a318a +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 1556fb5d 5b90d443 78106e08 69b66c5c +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 b601a9a9 fc7333bc 69067f14 4492bee6 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8a3d63e9 03147c09 5c30d175 3222a38f +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 216a0bff 6e151caf c631b665 9b6d7527 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 45db8411 309a25f2 4eb85913 aa7be9d1 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 a3adade5 5f44b75c 453fea47 e259fbc2 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 1c87faa1 ed8f4de4 b985e974 d09eff50 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 5073b96d 15f38001 705963cd 5cb0103e +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 db35c200 3f6b4da2 c9915de2 218ff3bf +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 47cd4aab d752d014 f28b860c a1bc04cb +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 a285a077 6e47cdc9 98569e8d c677b518 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 4b9c3596 92c11f50 c97b5915 51e6898a +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00d14d89 38006c1d 7bc5afc9 cfe16969 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 f207a99e 33e90e8a 48736b6e baf80a74 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 9106c865 646d84a4 dcd683ce 4182f6ad +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 19f21514 78c6ed2c ee689dac 9f2df2d9 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8bd79976 ff8adaca 0130d1f7 2b06140b +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 00000000 4a70c7e2 356656c9 7c9e7d56 820e892a +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 00000000 c57855ef 829c70f3 8ce2efb9 f3d34560 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 06520b39 be42e64d 30377268 5264ee53 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 eafc3b62 e9f93279 7ebe1830 515a177d +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 c9a49b3a 07b4e3a9 418deeef 13559144 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 54b4f3ea 7d21dd47 ca6c3c92 ad216979 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 74713ea7 12ad5451 8671dbc1 d57d9d75 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 ebe4ecb9 c31eba78 5a6303bc ee4c42ca +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 3dc002f5 52b17469 8298788c 7537b37c +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 41b45326 fd956649 46486ae0 86ca0006 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 2eb13676 7d591e27 e6713fe3 74bf381a +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 5c3e62f5 5fa35cd6 e42d2934 8ea2df61 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 b269cb2b 5ea85bfb 2a8ce1ab fa783c04 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 eb6c4f88 4ae25fa7 975f094c bf74c4bd +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 822f96a4 47cb8dcc 5b65d0ee 00592c4c +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 9e913667 d144a7c6 b02f5136 7558771c +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 5da84c50 b88e33ef 820698aa f8e5d652 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 e04d1713 be1bd333 2cac27c3 7cef40b8 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 57c02c7f 1940a93d 5f44006e 903339b2 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 0060047d 49f3a5a4 a9da83fa 5bd5d855 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 7c232cfd 483abf9a e0494b22 ce559af9 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 e2e3d656 7055d469 67f35dc8 a135cf8a +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 1a50f657 df2bdd5e b594ec19 ffe9269d +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 35bc3c82 eec65419 99bc3f75 1645e084 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00ff0000 00000000 d055bdad a21ab0fa 6f5c68c8 2871b20e +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00ff0000 00000000 8cdb6d07 0331f252 829f3fdb 5fdb7e77 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00ff0000 00000000 03e0b8f9 aad821bc f95e2a0c 51feb93a +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00800000 00000000 e9080079 057151f2 6d995910 750b5673 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00800000 00000000 fa63d562 9947e6db c9939d4c 6bc5f1e3 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 8c275b4f 3307529f 0205d226 19fc0965 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 994f4ebd 177adfb5 f0b7ad06 2538baf2 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00800000 00000000 a8493f2e 2fe47ed2 75b7ee41 9f2bfb4b +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00800000 00000000 7f7dfec1 d7acaae6 5d90e279 40b20fa9 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00800000 00000000 e137e761 9e68178d 63d6f810 16c59e33 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00800000 00000000 feb6ad7e f650069c ed4fbfcf ec8eaea2 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00800000 00000000 a8fdbcba 7cc58b23 7567a9e8 0a431787 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00800000 00000000 789c95d2 6fe20176 b35d830d 2e89a3ea +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00800000 00000000 9817cdaa 1314c2a3 a7e3e005 91b0e928 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00800000 00000000 7b56644e 2f5a731e 0f8bc3c3 955e6def +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00800000 00000000 435ec10c f48f1cc9 b4097238 b9e9e8b1 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00800000 00000000 b5fa1cd8 39c43e5e cc5812a4 d8ee89a0 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00800000 00000000 88ecfd91 bf0c0a69 e8634b97 54642a0f +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00800000 00000000 4b36b2e9 1a6251f8 33fbf583 e799e32a +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 00000000 9e778350 3447036e 9706b42d 5d0a1b8b +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 7d55a72a 3b02f5e1 41e66207 511cb7bb +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 21773439 410262a4 193f6dda b884b561 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 21b9839b 52ab6283 7b605860 c52c1a36 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 2bd6d845 47f8f2bc 16a2963b dcff967d +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 2c1c2d04 805c7d28 01a807b0 7153f583 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 00000000 997db510 302959cf 3bdc36a4 6197c9ba +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00800000 00000000 ff7ac844 641ad65c ced417d5 e5bca0f1 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 cfc50be7 1440ee7e b43063eb fa79bc51 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00800000 00000000 414f54e0 c020b7f6 cd98df4c da58c2c6 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 831c6399 5ffbf486 71efd2e8 95b4255f +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00800000 00000000 cbaceb29 37bbc31c ef44bdab 90f92671 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 81bc89d5 e4c3dd2a a4e8b457 98589830 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00800000 00000000 78d0a9a0 f167c7d1 dff91d28 3f0c112d +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 82333e85 8efd25a3 dc58e89f 6be384c6 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00800000 00000000 0ddaa164 9cb2b549 c0dc502d 4056fdb6 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 60950f43 a4e9d390 431c18ab 06f6edb3 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00800000 00000000 8aef14ef a673a0c2 bc64341c 40bbd2e1 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 6e2377f3 18a9cdeb 0942dcdd 934a22f6 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00800000 00000000 26fefcd8 4a8fd303 737f374b d5553621 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 86d7b77b cbe8e3b1 572f67d3 f77dee99 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00800000 00000000 80ca0691 5c053347 6cd2f69a 92d7f5e1 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 1c770c46 0ed1ce0c 534e8311 ace6d64a +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00800000 00000000 0401673f 236b14e1 b86a8060 511e469e +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 684be1c8 2eb410f4 8f053d5f cd4e0351 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00800000 00000000 23872d7c 20039fcb 774aff2f 79a117a8 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 612edeee 0c9ee409 531c983a bab16142 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00800000 00000000 013f14ea 9a9fa775 225cdca9 1e561107 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 226668a8 29203d71 1f34d9d5 aadd4b71 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00800000 00000000 e34b6fcf 51c8285b 60fc7dd5 99067bb1 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00800000 00000000 3d7154ab 7f08d6ca 8dcc0b0b e99e6581 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00800000 00000000 aefdaed4 e8ba816a e4d91e8a 85bb1f9c +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00800000 00000000 9ea642bc bead97b7 81029076 b33a7fc5 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 e594998f b5d5bcd5 7998a540 6d4720f9 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 e191f528 e9bf876c 2d943b13 c96c6246 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 43f89e68 8cd82bb8 f47d82ff 70e66707 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 5139c273 62620c93 3eccc591 06d3bba3 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 04760d2a f5edbe89 4dd31233 f5a349ad +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 1c99f4bb b2870b61 740c20e8 b4b3a447 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 50142161 ca26a966 b631aa10 76202601 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 a4e5c4fe cbbe1926 55d303f9 1e0ba097 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 d096cdb9 8198af67 01567021 8f068fea +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 b7fb1a31 15b6d0e5 57450c2b 8e931a17 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 26774f55 9c0a6234 3c9dc396 93347de8 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 1dfb4108 4be6f25d 7c5de5e4 951402bd +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 6302ed04 6ad5096f 7cf96fee e62789af +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 ffb2f2ca a2b6c832 1755f26d 3b042f52 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 d9d4678c 69e519d5 47c61f78 f03ae6df +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 6b032ecf 64d2139b c8e0058e 520bf9dc +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 59e92d22 7949c4bb e8657fba 7080bd58 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 842e5047 04709ad9 491fd8cd cd9d36ef +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 33cda626 bca22980 90f9a64f cbc3c4b6 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 981eb300 a9ed8be1 6c051075 1f4aa89f +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 aee436ba 4cb7543b c08d10e3 46af739b +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 313a8392 fc1b20c8 107a3111 becca7c5 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 00000000 c61fabad 747a7795 f7be9cf5 a47b0dc7 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 00000000 fa88c065 5041f854 f0f14444 e07fff07 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 1c968df6 052f9a87 1ec2cdd4 0e86ac4a +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 604bd694 dd191dcc d2b42afd b364fdbe +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 7605676c 44eaae99 f550c105 758d377e +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 8f824b8a 169359c6 8757dde1 39f8a63b +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 260e12ab ef29fa83 25010c47 55fc59f8 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 1437d144 53fc8556 01fd3e34 9ec7ce17 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 f9889861 2885a4c0 90199984 8186c409 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 d5a5b5c0 4dedbbad c729b38c 6e6b5f5b +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 eab2b472 84d793a5 21469192 b4a1bf6d +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 b1b2dc57 afd6624d 5f128d86 f89fe2a9 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 dfcb6e5e a0894b3b f85c52fa d29e0bff +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 1633dc13 10ceced3 613ed8de deb5db90 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 f9abe8ab 34ae560f c23b89c5 ffb47ec7 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 38205c98 e813a1dc c7dfd2cc c7ed1b5a +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 a83a5099 81580b72 9418d1a1 427b5bc8 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 057cd2b9 f1396aed 962fb7e8 007b9417 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 9ead8db7 0be43b46 abbf6f00 64399b80 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 a5f7a8c1 9c014f32 e84da0c7 528db876 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 2f862e83 ee399416 2fc4b244 219bf33b +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 7c38fd5e e88c7b0b 00a39564 d127ba08 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 9dde56f7 703a51a2 809b288c 13fc1db8 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 001a54c7 7c415411 7419eadc 30283e4c +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 ff000000 00000000 3c9224d4 642eaab1 3ca000f2 c837fd1b +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 ff000000 00000000 35b24344 d6067df7 c0c48112 05f68f85 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 ff000000 00000000 6e492fd4 5de1d3f5 082d2ff3 0c00136a +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 50ee6f9f b145d6ff 04c3488c 77cd209f +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 80000000 00000000 d91e7c95 8944f3d8 8943fa3a 4d22c6ea +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 2686ee74 f5c74c56 e38f1dbc ded52c9e +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 0567728c ea8d267b 37e6a8ba 5625d260 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 c0ced4da 4bfe2786 e58b4d79 9ea767d6 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 80000000 00000000 b269706c 863d4f06 ad7e7fe2 88b07128 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 80000000 00000000 e573ef41 430faffa eade00c4 20f0b1ba +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 80000000 00000000 7cd777be 5053dd9f 30ef6a67 6b51d8f7 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 ec045802 370393e6 bd882103 588ed4f1 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 80000000 00000000 9898896b 1b9b3011 cec1c90c b3bff953 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 80000000 00000000 832d4f7a c2bcc9d3 2c59d87a 8fe2f8ab +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 80000000 00000000 8a3070a6 896d5802 6b3c1d19 ed1d2810 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 bc69ab5b 32405fbd 5c43ac3c 2371b526 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 80000000 00000000 71ec9436 4fa0ee91 46b32565 9553dc6c +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 80000000 00000000 9fbc1872 75a39026 810ad2d0 2c8601a6 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 80000000 00000000 97cb2996 bf8fd265 82cea626 3347e64b +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 00000000 4af192d3 a36695a6 a17916fd ab5b1252 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 3e10a586 c183603d 5583b06c 430f5fcd +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 05d060a5 85e09077 5489df86 a37daedc +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 9a5142d6 a7d70911 9a87b352 4e1a8f77 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 7e6a1959 a16d3e5e 3bf24b06 b503c1f8 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 7aba07a8 1ed6fb0d 5f51e882 3495d0e3 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 00000000 0add6979 17a72877 ce5565e8 41a226ff +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 80000000 00000000 043fe565 b0e380bb a6a88d46 c7219ae4 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 6c7c39b8 a33a2a55 e0e820f6 cc322707 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 80000000 00000000 eecc5f3f 40870c09 cd3ad7c3 4b1604be +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 6bc74f4b 6c57bbeb e8cb7079 2d461a71 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 80000000 00000000 2a846853 f7fca57a 1252cfd2 f4ee435a +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 af9b5771 27e2c1f0 262d0f5a a11f9c95 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 312670de 6f0f7254 08254bde 3b9bf3bd +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 91f3c2f1 51a51b64 f8db3bad 84658c4a +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 80000000 00000000 3622195e 3afeaff4 e68cfc47 7f0e392d +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 e404d0de 0dad63df 1d86d0bf 5f84995c +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 80000000 00000000 1f101c49 a193a793 f59bae29 f4022bb1 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 939a5317 65f86e1e a510f31d 89b18ee5 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 80000000 00000000 cbf83da1 ddd26b7a c2b08e12 2f259f99 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 bb8a595b c4b6ebc9 c15f8037 ae5ae08c +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 a7a3f1d9 a4e83df6 c164329a 26887914 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 a43219d2 70e406ee 648a62ff d27bdf0c +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 80000000 00000000 fcc32a22 78ea12c6 4c617906 99e5c9ef +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 0b1f00f6 084d9447 534f7cc0 ee2599c1 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 80000000 00000000 2278d6c7 7d598017 a5a8495d 082fd290 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 03468145 4b44a835 3faca49e 1d1cefff +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 80000000 00000000 4d2c2ff9 87ba11be fd422373 ebd9ed6e +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 612aa9c0 f9507178 c7988e66 33be6059 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 ee635721 f0227c18 019f491f f1f72229 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 80000000 00000000 77c8a6b3 63296dcf c2bc8b57 a12bf8e8 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 80000000 00000000 4402a2a9 7dcd34d4 722f7f82 203961ac +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 80000000 00000000 40b825de a60b3b62 f4ebf400 0e825cbf +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 000000ff ba205fb6 7571108e 39bb44a8 08d8418f +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 9bd98154 0c5fd6a0 2a17f791 379c7568 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 21db62f4 126704f7 9e258258 58d5afdd +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 3ac130a1 94e59f22 1e98e881 70e56970 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 3fc93b6e 03ce6242 08b7885e 2d82bbaf +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 000000ff ac5a404c 9a57bacd 9c8a2152 c1505349 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 000000ff cdcd83a2 c711fdbe e51645e5 7e6d046d +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 4373d67c 358d830c 3fa8027d 757dcfcf +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 000000ff 68020c55 7a9d35a0 017e4ddd f9ae6d97 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 6f360904 5653e7d9 21fd3780 45370e1c +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 000000ff 3eab9707 15013d52 aabe0047 d7fb53a6 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 000000ff 942aec32 3e14b6f5 fcea7f43 bc089bcc +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 000000ff c255d1e3 eb8b8360 1265d817 8469d77a +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 000000ff 1ca7f47f 54b6924e ccd09f94 ca3b2c0e +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 86a52cca a8987a42 bed185ee c8eb8d7a +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 6200e914 68f0cf97 88381a0d 305d9e6c +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 000000ff b34e6fd8 fda920d7 eab62664 afc9526a +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 0d281301 5fe3c5d1 0ca70fe0 642e27d1 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 8b83e9c8 fcf79329 e8136b62 445ee56a +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff dd404bcf db24fc5e ff00b775 dd297bf3 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff dcca8760 ce686599 fecaac4d 3d6f484e +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff f1e30f8c 242c8379 6b2cbbbe a34dd198 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 000000ff 0cc917eb 0f5fa1ac 12e47540 cd0f31e6 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 000000ff d917750a 8e3e533d a980b398 9a701daa +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 0a0abe59 10a96176 2c6f1819 6f955e80 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 000000ff fb553ded 772c96f6 c9e98f69 f6215dc7 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff 9d279f8c 001a6b16 a9d2b14d 6b312d90 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 94068fe0 5d3a1770 5a5d122a 2e461232 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff 699fa8ee 285405cf 0fe6a66f c6afc4d3 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 000000ff 6f905c6c ff97a60d 67329e05 c06eef7e +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff 4d92bc50 44607f7c ce770b42 2b897df0 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 978f1fbc 9e462394 ef68d931 03fff47c +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 114a0d56 50016f2a 9ffd7388 be9ffa0c +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 2749f402 a64b9a01 c35cce05 7d891479 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 7d35638a 597e663d 9606347b c5c56adb +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 000000ff be8ab74f d910586f 3bb3029b 679bfe1c +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff e5fd023d 40ba82d5 b74e4200 2b3019af +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 5cf9b98a 11a7d7f4 59df98d0 7821aae9 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 2890decf 9d58b59f f578c4cd d37a5621 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 000000ff e5b5d0ec 0bcddc55 e3ce4717 834d42ec +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff be40ed1c d3fa06b4 5e129830 006d89f6 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 987c84ed ed1f21f3 44ffe815 a2408672 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 9ba6d879 10e6e4f8 06ed8aa5 0145877d +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 8d10aaec e645e3ba 3f04218d 40f8b67d +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff b0659c9c 0740e25f 2c151c73 eb08059e +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 2599afaa 47af114f b715953d f14f0d62 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 000000ff 09a2917c 81643036 7d18cdaf b286a87c +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 000000ff 5a7e2699 3219d6af 8ffb64e6 20049567 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 000000ff af08af74 e8fbf59c 8a5af092 f94136c8 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000080 b6c8a390 d1017b49 945a30e4 bbb12e77 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000080 dbf38ffe 7cffafd6 f46b1b64 2030119e +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ec40611c 9922b2f1 aba0ca77 68704af0 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 191a0257 5b89af7c b4a0842a 671a25b5 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000080 0adeb3e8 6bf36c1f 8d34bead a28eb9c1 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000080 e41a2df7 a59eaf3c a2facbfa b4578cd2 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000080 8fbc7d6b 62769b02 06fddf59 98fd67ce +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000080 4c206362 ae612042 30bb1ea0 60367f6e +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000080 af37d525 13a44d70 3c481d0a 18eec0b2 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000080 2faea34b 4bac3b7b c17ebace e97fb330 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000080 369fdfe3 04081de3 fc1adc6d 9ee43625 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000080 c3e039b3 0e50d67e 02dc6318 cf160f8a +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000080 63df5831 b78e3874 cf3deccc ac763012 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000080 87d8f297 8636d3c7 0c81a629 71217d68 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000080 d01601cc 416a8b81 c03f0d12 04568b8a +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000080 e126b7db dd192c78 76d98e1e 3e3acb44 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000080 0385df57 5fe0a1f0 f7db7de5 cab598f7 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ea2cddaf a12525bf 59cc4e5d 46fc7628 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ac8a8993 2627d7da 785a4410 43d6ca35 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ed74b91e 4cd838ed 8da65f2a f45836af +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 1220ecfd 9d90e56f 3bdb3e66 a13d3459 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 9ac247b3 c0fbe2ee 29a5ce96 6223e7a6 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000080 07f38992 431f289c bf3d0f90 bb31139d +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000080 3e87e158 4421f5c2 3bd07c3b e078c6ff +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 40ff4b3d 972e40f7 a3de98f2 629c220d +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000080 e049bd76 b882e323 5f203d0c 44406976 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 56f35880 8268e2c8 ee9ea2b2 bb013349 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000080 67381f8b 45d26557 63f30265 07d94652 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 03dc8465 59a93630 6e37c101 342ba48e +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000080 4badda42 e5745abd b2a4c569 59932f35 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 05c369b7 c16d6c0a 00a61636 d6f16971 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000080 5cfb1283 5456a613 132d7ad7 f5f6fc33 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 6d70be70 68f1c773 7aef97a8 cf2afd9f +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000080 e72b5845 3b1ad9b1 cccb8327 e974936b +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 40f06d8d 8daeaf90 a12a9bb5 1ddb0188 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000080 e6c63d22 b909283f 350817aa 8a241aaa +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 2b0ff10c 407f999d 0f4a0bd2 6f2aa50a +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000080 269160c8 4ca320e4 8ac10c3e f61ea009 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 29cef2f0 ab096ca5 06153c58 b293312b +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000080 9df9fa8c 48bc1a69 b4e05ade 10626ed7 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 3740739f b4c2803f 4c664624 a9556783 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000080 6c112d9a 0bcabebe 4fc7cb1e 4b24f856 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 28a20ce7 0ae113bf 7ef2db5c 3bee6c8e +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000080 f086532a 016327da e2b39dbc 23c9c84c +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 df2a6747 c64b2d09 4e76212b b34591f7 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000080 999f7488 e79031e6 b2121bc1 647ac92d +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000080 0bcf9f8a d3f78a00 bef7f10a 0aba298c +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000080 dd2efffc 78da53fb 29b853c8 7f2df440 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000080 7220bc39 b7230651 3e17b7e5 c35375b7 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 e6969724 ea77117b f4472835 e1782eb7 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 bc137850 6915f2cf fcbc8fa0 a9556b09 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 3b768400 b96371bb 1cbcf1fe 9d198b9d +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 e4a78c1d 06042e7c a7233197 93970572 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 3f5109bb 5103e99d 8cf85d2f 3291b05b +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 3360830e 30fe7c80 f7043c06 2f8250da +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 d6640367 4d4347de 19a7ec43 53304d04 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 a3fa134f 78844f3b c53e40e9 01419be7 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 63d3090e 98efe3c0 28db8c72 6e8a6e3d +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 4c2b8318 3eb8c5c0 531b38cc 227aed96 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 d96a78ed ec8ad8e5 a172bc36 137384d8 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 d82dd886 384813c6 e7b1285e f2a0660a +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 6a04b8b3 2ff1e2c1 c46517e7 d667347a +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 9eb3eb63 4308fef5 d5a79ab6 9ff96e30 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 3131e370 625a7960 b954d783 8d5e1ceb +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 baceb239 b276bc17 2bfdace4 75108304 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 60007544 26b8e375 0070ef6d 43f7f0cb +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 7be23e1e 5747dc9f 8379d38d 2bab83ee +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 ee5d036d d2d90edd 34834765 9f53affd +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 6b57dc82 37fc10ee feff9c27 85dd9d70 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 d0b60125 12434c5e 3a1cca46 ade79259 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 ded42a73 ee5dd93d b36d7933 89ac2906 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 0000ff00 dda978d0 e516497f 14385f40 606063cc +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 0000ff00 25ad5b4c 0707cee6 c3c95f35 504c730c +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 cf90e7c3 e8b160f9 5741b506 094c31c1 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 e67e5fa4 949d5d9d 40aea83f b9346f56 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 d93b9673 e8062095 ec216f51 1831cef6 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 635c096f e2e438c0 d1b8d51e 8d7e2503 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 b114c194 5625692d 0bb23f33 7304011d +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 fb3747a3 ef52cd47 69d89179 09a108c6 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 e64edb80 829bc7a0 268d1a02 e54c9e71 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 f18f31b9 2f5ef9e2 e109bb9a 78555284 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 7630b865 80dfb883 bfb250a2 3748e0a7 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 f44eaf8e 2ece190f 1daa5830 47a38a4c +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 3223ebb4 bffcb90d 4c12a456 bc506ea4 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 1fcd3b82 b9afc082 3aa0e466 7637c0aa +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 cf12ceb9 0bb5cbcc 9da02550 d63999b0 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 e1daa0ef 79f0f80f 9c9ecc32 dc20c432 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 ec8858fa 42e6894b d8fe0a5f 8a0a07c9 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 49072a40 c08d2519 c6055bc6 92577eda +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 342325fa d8f20b40 c2c3aac5 65147f0a +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 264b735c 0e1b4cf1 11ccbc18 450c7f7c +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 b9cd79c9 9a7ac672 ed3787f9 806bd94f +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 6c35f272 6f1aa932 1f3365b0 b7bd24b7 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 cc68caf4 3a97ae1e 793c3f5c 3322417e +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 9b90b178 512785d3 d370ddac eb79ee42 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 0000ff00 6efe6875 3010187d ca52b0ef 74716ff0 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 0000ff00 b82755f4 19593fe3 cff17ba6 7dac57d4 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 0000ff00 4209f0a9 cae24b27 5a798a39 b321e924 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00008000 9999d86f d5b04c49 99aa4d6a 5249f1b5 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00008000 3a96ddf4 b8ffbf68 c54fa232 e2fd3c77 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 8c8b3ecf f03e1940 4292f136 50f58c35 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 b577e787 f046cfab b157f5a5 befeb264 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00008000 28173c64 98a8e68a ccfbb49d 3db3e06d +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00008000 ade69c8c 2ba7642c 7b75f40f 6573d916 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00008000 33a8fa63 1b348950 10636d86 c02c1cae +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00008000 95ee84ad c3b4c302 b1fa0d5b 39219c4a +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00008000 9c12f262 05966d6f 6d8e0df8 128090d8 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00008000 1d93efae f470bb64 a078b87f 83aab9dd +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00008000 9b5f3253 8b89bc76 66846275 dc68047e +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00008000 0f086cab 81843faf d23d7fab 7f996bfb +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00008000 192f9388 d7392088 2f521dfa e05def2e +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00008000 c8338a4b c1074f84 c74ea356 bbe7b2d7 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00008000 f3f22a4b 40cb0754 3fec10b0 e978eb1c +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00008000 f07ff368 adebb743 f9e19a5a 4268be87 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00008000 bbf5ac6e 06f970cf 80e2593b 4da13148 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 652ba9c3 d7f3d5eb d6c46af1 5992e908 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 e513bb9f 4e5eecdf ad9cf572 1d2e049b +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 6f7e7212 aaeda863 d328b6fc 7b6d3808 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 dbe5393c 8e2034b9 b585639a 56e5aabd +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 1d5bbd63 e15c015f 3fd66f0e e9c21cfa +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00008000 d037c45a e1a6efd0 f3aa3b71 ba68c5c0 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00008000 1a351deb e6921918 b4a8e59a b2b5c926 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 182749dc a3c6ebe5 2442f308 a7839bae +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00008000 ddfbbbd4 7d8da7b4 728edfba d30be2f4 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 56558acf 3e41130b e42e7286 4b6a3b50 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00008000 ecb9fcb1 88476795 6f82c630 2118c855 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 8467b6b3 e419570c b96ebe38 fbc8f905 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00008000 78fe5b75 b3b35322 e4e0ea23 14f78048 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 1745da18 ceabb445 783908d9 26037384 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00008000 a0296cb7 9c833dc4 1e316b0f 0a7367b7 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 8be3cbb9 7613179f 310e0ae0 237ed1ee +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00008000 8d42edbc 75bd79f1 c65cb7cd a4c875c7 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 d23528d9 21e9b771 34d464aa c4ff2c8d +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00008000 64aa52e7 71c96867 981477d7 2f5c226d +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 19dbdbed 6b4bd3ef 3ca21d36 d9cf8641 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00008000 7014fdbd a49ab556 1a53f673 d7103a1d +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 cee680a7 56b7ba5b 83e4cf54 56880773 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00008000 8fe4e861 b51e152e 77d241a4 c3729436 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 dac02c8e 04dc6e8c deedd4e3 79192afe +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00008000 3d700b73 ae21f5a9 199e8baf 26b3d711 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 44892f95 bb2d1a02 a567e66f 38ea3760 +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00008000 a8b94889 fd901188 54ab283c a0a59643 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 1d0f1f82 c12db848 0623c816 e001f107 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00008000 9c98f9fc 748f2908 0eaebb20 f2abb869 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00008000 173b5371 63012220 8bc6c1ca 5b052e37 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00008000 5e7e1980 d4f004e3 74e1dd35 06c63ed3 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00008000 f8585f35 792755dd f3a1ad8d a0fbb9b5 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 aec2d436 8450fa0e bd6c2af2 b2e2ea62 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 de1716a9 d31542ec 420d8e5f 96edb01e +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 8f8cb7f9 061b2e5b 13b57a41 3531eade +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 976ae569 5eea786d 2c14232b ef1b689a +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 75477164 f695da43 ba81e870 b89589a5 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 e55ac2bb 27f6b140 807d1cf1 e78047d4 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 ff50a010 b8120cf6 d64a591b df1e78fd +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 438426a3 68fa62fc 86f9be7f 179cd401 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 95768488 3cdda66d 04781755 5278e78c +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 15f585da 1821534c 700462b2 2ac16577 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 d13c83a3 92d5a62d 25493930 1bf3ed6a +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 60ea84c1 3fff6f6e eb8d52f3 e792bda5 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 e8298a66 060fd8bd 4aa82879 c82de151 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 419be76a f046e526 2f7585b1 b1a46c03 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 6d0e8d83 d96af6fc b360ff30 1f48847a +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 13013969 07b3289f f60b3d21 a100b04a +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 a5858e1f ce56b291 33486dcd ea078153 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 f5d6bbfb e20a1bf1 e9d4c738 16d99eee +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 47257887 2e330955 890cf6c8 0197d72d +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 33afed53 723dba58 cf5c22bc 7774a1bf +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 2cd7020d 53397f2a dad07a2e 937c373e +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 995409e1 124fa314 d0e81be9 c3bd5823 +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00ff0000 decaafb5 f2af7017 dffa6d3b 4084547b +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00ff0000 e33806e3 bbce22c4 065a8146 18f3e4fb +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 5e78c26d 6c474b39 4f7bfaa6 547c5c7d +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 775e72f9 ef6aa867 3cece2da d3e20ab4 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 8f5ced18 67bd1184 3305c9d5 c123547e +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 7e905e3f e11324ba 12df2ae1 116e1447 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 8e3de9cc 7db83f52 c8bdbbc3 a8209cb9 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 06c95f5a a3442340 ff5d70b9 b0150951 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 fa64ffb8 5f6b7ea5 1a8940b8 c2d7a4e2 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 39229535 557d82f9 4d1960af 8345401f +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 c64c071e e9c00095 96cd2a0a 5377835d +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 7bf81b02 3c39163a 084d0685 0caba919 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 24ae41eb 689c1939 d454c719 5dcd1288 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 c0bf8717 ba19ac1d cf744187 32d9e41e +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 c8230f78 eecd9fda 52e5791a dc794523 +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 6a193c9b a65600c4 2760c467 12ce3b0c +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 7f200e53 7201567c 9d6e2655 5566dc40 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 2733749b 1244ae8f b003b6d6 0b6cdab0 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 30926386 795206f4 b369f320 89fead5b +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 a87b350a 95f4026c 91e2de67 2a2e63b9 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 04b9d323 38328c93 5b618e1f db402a8c +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 aa266846 6c7bbf03 803238d6 7261b5dc +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 af9dee32 ad0458bd 3afb0ba4 3e79dcb9 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 34486962 3b6b724c 30ad6bb4 e12028a0 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00ff0000 98307f93 b7bd1a71 2cab55d1 d8fa0e74 +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00ff0000 78402005 ed9ef8a7 0cedb596 0e90bc22 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00ff0000 5744b07b 59adac28 18046647 10c93034 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00800000 913ceb51 38138c27 95ef225e cdb73cba +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00800000 2ffeb8f8 d40b8746 c307909a a28bce5b +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 2fa64be7 0f3875aa f42872e6 2b2dd366 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 86c842dc b9bbae51 41ce8725 beceb6e0 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00800000 9160bbfd 4e416ce0 4f552606 0411554a +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00800000 cae9d9ac e80ffdb8 7a4acb5c 05728b4c +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00800000 cb4e3e01 707b04f9 be3d08e0 1e724878 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00800000 f22dc1d1 61efa99b fe4b35c4 42f1ae9f +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00800000 abb51416 704b9fdf b783c974 6b910362 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00800000 48e985f2 1b2f3015 37e33c25 2d14bcd3 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00800000 6f3f2636 bb6aa8e5 9705f884 2cc11782 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00800000 20167428 7bcad5ca c641e404 bef7d4cc +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00800000 506428c3 04978fc6 9fa8d4be 8e3e570f +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00800000 69aa3611 83eadb80 ac09e387 9c0f5d55 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00800000 88417573 160ef3a0 beac468d aff9718f +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00800000 533037a7 50dc35b5 8e01f7b3 880fce38 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00800000 09b2a987 58d6ee83 60700022 0b07a0a9 +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 08b995e1 75e4ace8 701c1317 5ff425ec +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 b56c5fa5 b400898f 6b18aeaa 467780c0 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 5ac8c476 5bc9f43f a83ab541 a7678e64 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 4dbfd87a aee8d958 5301ed7a b57af9d2 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 ba7dccc3 49e9b6af 2601ec2d 142d19fe +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00800000 bbee6bb1 25af1268 8c16dc3d 09d51329 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00800000 258d3743 e578bab3 8dca4b33 e244314e +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 e7b2e049 637e1b76 8424dd3f 40777e5a +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00800000 cf407bb7 7fe0bdb6 ad2cfed5 825e04d2 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 52d3122b df42f504 9328862a badb6776 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00800000 3a63c38b 600be114 99578e15 3f9f13cf +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 c47cf038 7f7811b6 6989c8a3 e7f4ed71 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00800000 427542a1 c074fad8 df5cfb21 4a67dad8 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 8bf976fb 7f6991c1 a5bd7a21 dd41ecaa +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00800000 3826a018 504b9d62 c878c336 b04b85dc +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 587f2792 59c7af31 6f2737a6 8e59316a +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00800000 fe0e9d1f 128b13b6 c764d11a a372ad18 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 8f30d4a3 b2b93b51 6da9656d b868c978 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00800000 909756ee 327575fe ddfe2647 ae53fc4d +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 4196cbdc 60c6840c bb6d5444 f259f47c +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00800000 0be279c9 e42ecc5f d35705f9 6f7583c1 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 17af5e04 02c95c18 3f23a503 a2261d4e +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00800000 bcfb6e46 d1a3d60c ea740e5f 12ea6ed1 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 3e4add40 4e9c8224 b2361093 609db035 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00800000 76ae32ae 70456796 4e35906d 444508cd +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 433e75df bae525fd cfc16bb1 23956a4c +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00800000 a927b4c0 4b64a202 9af94594 ed59a36b +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 2e2850c5 105bdac7 3be5093b c3367694 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00800000 326ded18 3901a24b cdd54a03 e440b784 +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00800000 133d5d06 256a441d 70bf8e82 6cd6089d +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00800000 4ef00738 868ce320 3b278f38 de4fc31e +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00800000 28b894f6 94d29fa6 5bc130a9 6cc758d0 +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 830ede16 2c7aedff 98327fad 25585765 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 688c673f 4feebbd6 4ee8f6dd cb325a2b +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 7469633d 1c511f43 a5d7f652 5f992c84 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 e327b087 6b3a38bb dfb0bbcf 6029a7f1 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 56327af1 3defa922 9873cc35 0fbb01b0 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 b302a0b9 28bd9cb8 cd998b9e 390348f7 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 99bbcabe 849548c5 7fd94f01 6fc3d07a +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 198149ba 35394361 d8fc6c48 b8d63959 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 69d7d7c7 c0bc9014 ae8b5fa3 d2a89e74 +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 ea950837 fb738fc6 ef4d55d7 04576d0f +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 3620f982 3ce8fc43 62b7c574 abb7857e +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 f01f1083 76afb448 c1c8b156 96e1879e +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 ec9eacc2 6774f522 841c19a4 1f8dda37 +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 ca15575d 1ab3559d 7b18ae12 27e40e29 +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 dcb6d7c6 03d08b0e 5081cc94 8e249c86 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 a2560187 8a78fec2 67aa93bf e103de82 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 7e93bdaa 3333d2a9 54275e94 29f2558b +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 4a80089c b95368bf 90fb6f8b 2d894c41 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 f2d44d68 cdb19f20 9747a357 35505875 +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 0291942e 2cb40254 f3dc55e9 7c7221d2 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 3a3c5a30 094dc480 328c313f c4fc6fe2 +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 cb7c77d5 5d0f196b 297a4cd7 b02e3eef +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 ff000000 0af3f33d b4444c6f 484a326f 6951a499 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 ff000000 7960fd9a 3a445d2f 03a78647 0cc25aa7 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 2c91b280 c10863bf 4136bce5 31ad2c85 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 44a43b39 8ec6dec2 7debc7db ce0666ee +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 081925c6 522ccff9 a82cdebd 2f9e8fc5 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 eaafe2a9 f15dd430 7dc169c8 1466e73c +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 182f687e 2d7ee0d8 f4c7111e d4568acb +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 d8581c85 465a6bde 1f27ff17 18522949 +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 bc596afa ad59cb47 76aa9deb 205ddf74 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 f7e07727 150aa4af 0beb9007 cd5095fd +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 9618d496 f2b60e55 52125c7f 81e153f7 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 9fafbcd8 03328635 6e262747 83fc5f6f +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 762f673f 5b94c0b2 2085a682 02705419 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 b0179103 8d458989 ff0e5982 49f5be90 +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 d7625e83 26e36f0a 09cbefbf 44469e3c +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 4f654e80 74f7ba7b 1d71a482 5d2ef42f +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 50a9e302 0a88eded 605407d6 961cf688 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 0e35fc3f 51317e4f 7ec99c9c 247e15e2 +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 b79f2dbe d88d92a4 6bdcd12d 0da84be4 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 28aaf55a 0d457eaa ca39b6bd 9ae11aca +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 f51f42bb 714a3ba4 ecf49d28 3297feaf +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 34033ef5 ef1a2178 3dc08498 8742b1f8 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 42a38dae 356f9800 ee54d9ce 2c8fe759 +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 8ac74af6 db5395b6 3d51c46d bb448a5d +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 ff000000 5fe80073 4be63b93 c8bc6459 3647869c +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 ff000000 b0e3dd9a f2f1c750 7a819dcf b5da4539 +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 ff000000 e87ec26e 055af8ee 4554a7db b2ff189c +ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 26789d39 0b35b558 d134c70a 05f21058 +ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 80000000 b090f71b 0c24e6cd 14c39853 29eea7a1 +ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 67957e08 82b4de0c 3817a4a4 a7d9c9e5 +ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 36475912 2e67e681 9186a568 6d3ab920 +ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 36641fe7 44561777 df4a4071 774a7979 +ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 80000000 13d7c238 ec3445e5 03bf05d0 efc826e4 +ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 80000000 1856302b 2cfd6cef f3c4c4c2 fd97ea43 +ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 80000000 c82ecfc9 246d99da ee5a939a df4e2ec7 +ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 b3057d65 5f4857fe 161fd575 eb1af21d +ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 80000000 493e26c7 ab8a8a12 b2c7522e ee623a12 +ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 80000000 54fb2c88 9b0a6e74 afe9a75c 5ac60579 +ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 80000000 4708dd7f 9772ca07 09d43d7b d657da70 +ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 1866cb47 ec4a45b5 51415a63 62edcebd +ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 80000000 f48b91c7 c7f95960 f75596d2 7d66e99c +ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 80000000 30fd74da 8416b1b8 acfad80a 74183a32 +ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80000000 60abf0c9 a8f16c38 6aecc856 77585d18 +ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 80000000 95ecca0f a586b316 49039c99 db7c3ced +ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 69b6c8dd c867ff5c c29fbfd2 bb8abad8 +ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 91bd9101 1ade8c27 dd03d6cf 4a2f609d +ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 9fe8eb8d c0f1ad2c ff1b02c2 13e53657 +ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 d2737890 1c5bf29a 60c1876b d0e6375f +ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 a36d95f2 e1b3836b 16e07380 530e046a +ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 80000000 49a80c7f 38e8f470 5297276c 2a15f290 +ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 80000000 129069a4 34691701 1e540326 459225e0 +ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 0aeef630 536d89b1 62698a9b 75935d28 +ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 80000000 ed53e002 2f4dafd2 c699a3ce c518f265 +ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 fe8314d1 430aba3a 903a1b95 383b4771 +ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 80000000 32ef00e3 a8288238 7925c333 09305962 +ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 faa6902d d4e9436b 117ef210 cc580c65 +ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 da277aa7 b9bcc78d 7682a753 7f111edb +ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 cf776645 b25583c1 6afc73ed 563c5124 +ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 80000000 8e5c34e2 4b8ae101 e9f7f828 e3f5ca55 +ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 2419a489 22144205 48ae6a07 6e461b03 +ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 80000000 26896192 7988e1c2 c9517654 68253c81 +ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 757d6cfb f7030e88 9248f577 32a75662 +ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 80000000 36fd2e12 e975bc10 3078eace be3302dd +ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 c14e818d 97df0638 c264b1de 5d478b0e +ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 e3ba2b28 9db21117 896fa5d6 a803d2b9 +ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 a569e149 bc4c5eab 2452fc82 01d2e698 +ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 80000000 b407f105 4e2bf500 52e0672a bfb546db +ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 d69cde49 60f9ec60 bb175073 cf0d97e7 +ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 80000000 fe0a7ffe f6d1bcf2 b98768d8 7e94a046 +ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 a3432cf6 10539085 0f7d7a9b e14c6dee +ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 80000000 baee3cbe 194d47c1 7dc26b0f a063a426 +ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 8e864bfc a7c4c727 4c946170 af4dd13d +ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 b6c08c48 52962db9 88508917 4dd4aaff +ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 80000000 31e3f0cc 92d1e3cc a2fdaa6c 902c741b +ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 80000000 378edc3f 0de9ca93 eabe8ab2 8b2f1d2e +ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 80000000 394a7bc3 4d049c56 b0e3d5a5 dcb070b5 +ars4x32 10 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 3789b2f9 cf3e7bfc 51bafd66 e5c2f16c +ars4x32 10 00000100 00000000 00000000 00000000 00000001 00000000 00000000 00000000 419e7cee 1634c377 ac441b35 b5fdad47 +ars4x32 10 00010000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 8f5a5777 3966ef14 a179a3a6 68bd181a +ars4x32 10 01000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 598460c9 f5a72152 18876ff0 6499a688 +ars4x32 10 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 1e482dbb 2a7d29e4 abd679be 27f0d406 +ars4x32 10 00000000 00000100 00000000 00000000 00000001 00000000 00000000 00000000 4e2cb77d 76586ea3 20b8a841 abe1ae74 +ars4x32 10 00000000 00010000 00000000 00000000 00000001 00000000 00000000 00000000 9dbd160e bea9c9bc 2b30c629 a7563f10 +ars4x32 10 00000000 01000000 00000000 00000000 00000001 00000000 00000000 00000000 dc7e94c1 a7c5a4d0 1132a44c 095cb974 +ars4x32 10 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 dbdbc6af 3ea7b4f4 219b4da7 47161831 +ars4x32 10 00000000 00000000 00000100 00000000 00000001 00000000 00000000 00000000 f3a905df df16c950 92e4d08e 0ccaa78f +ars4x32 10 00000000 00000000 00010000 00000000 00000001 00000000 00000000 00000000 d948e4cc 4f6e190c 0d73a820 c492e4ea +ars4x32 10 00000000 00000000 01000000 00000000 00000001 00000000 00000000 00000000 28adb021 4ba7a2c6 e2e147bd 41f1d499 +ars4x32 10 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 4febfa99 150b2760 42b439ab 644be146 +ars4x32 10 00000000 00000000 00000000 00000100 00000001 00000000 00000000 00000000 5d4ec2f9 0b058beb 06ee5c54 40d84bfd +ars4x32 10 00000000 00000000 00000000 00010000 00000001 00000000 00000000 00000000 62b8f839 5efa5122 91dcbecc d338fda6 +ars4x32 10 00000000 00000000 00000000 01000000 00000001 00000000 00000000 00000000 992fcee9 92f851d3 686e3c09 2f99ac38 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 00000000 dd3052a2 e18f6d4d a56acffb 7e788c8a +ars4x32 10 00008000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 f53537d6 a25397f4 894699bf 69fcc395 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 d7a2c9fc e5cc90ea 5309405a 8513cb0a +ars4x32 10 00800000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 f588d19d e91f4772 8b088d79 79c222e8 +ars4x32 10 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 23fa982b 4d2f59e5 7c4259d5 efa0c6bc +ars4x32 10 80000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 f98c4b1f 68cc558d ae0b81ea 01f64bf8 +ars4x32 10 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 00000000 31816f80 faaccbe9 7cf8f6ad b150f7e0 +ars4x32 10 00000000 00000080 00000000 00000000 00000001 00000000 00000000 00000000 cfb3111e d9c0e672 b199fc26 7d00477b +ars4x32 10 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 00000000 8fd7f747 1d1829ac 0768c9b2 15461738 +ars4x32 10 00000000 00008000 00000000 00000000 00000001 00000000 00000000 00000000 7bf0f87d f7574711 f2060d65 2d4648ca +ars4x32 10 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 00000000 a25a23a4 59e31c12 43b7712f 3b4db0b7 +ars4x32 10 00000000 00800000 00000000 00000000 00000001 00000000 00000000 00000000 9bb76c81 13279319 da45e911 e7acf8ac +ars4x32 10 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 00000000 45c6e2e7 1c1064b5 8cc499c0 60a32751 +ars4x32 10 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 ea1329f0 b4e46d1c 800e51a9 7abe2fb6 +ars4x32 10 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 00000000 5385535f 75fd78fe 7627488b ae1cd2ec +ars4x32 10 00000000 00000000 00000080 00000000 00000001 00000000 00000000 00000000 59637a22 8c35edc1 f80a44e4 a3c7aea9 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 00000000 77755dc9 106066b3 694b91f8 e3ea193d +ars4x32 10 00000000 00000000 00008000 00000000 00000001 00000000 00000000 00000000 f05f3386 1cab5701 8937931b c617bcd1 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 00000000 ea05d264 8cbe6a05 f64e9f3e 39d51fca +ars4x32 10 00000000 00000000 00800000 00000000 00000001 00000000 00000000 00000000 1db2d166 c8b21f45 897084ea 35c3bf03 +ars4x32 10 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 00000000 f2b2c107 5e0a0c79 f4ccd6ee f28b47e3 +ars4x32 10 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 01ac4859 eb71b2ce 40dfc98a e4217138 +ars4x32 10 00000000 00000000 00000000 000000ff 00000001 00000000 00000000 00000000 0d1001e5 f20e6f86 196988ab a0bda0b9 +ars4x32 10 00000000 00000000 00000000 00000080 00000001 00000000 00000000 00000000 e1fc3ada a9cfe2d6 072e60e8 08110681 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000001 00000000 00000000 00000000 db24279e 2d1845bf 385a2256 3da77f6b +ars4x32 10 00000000 00000000 00000000 00008000 00000001 00000000 00000000 00000000 234f6deb 9200575b 61cfb986 055d4a4d +ars4x32 10 00000000 00000000 00000000 00ff0000 00000001 00000000 00000000 00000000 7af7d320 10013dd4 3c765651 1d6fcf32 +ars4x32 10 00000000 00000000 00000000 00800000 00000001 00000000 00000000 00000000 635342f1 e8f843da 42926271 bc0f9c38 +ars4x32 10 00000000 00000000 00000000 ff000000 00000001 00000000 00000000 00000000 4ef05c09 5d6f2a07 2dbe6c53 40aa3a76 +ars4x32 10 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 618f6832 57cc23f0 e06b3858 7b8cc711 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000001 00000000 00000000 00000000 21d40a5c 21e528aa a1a359eb 9c02b159 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000001 00000000 00000000 00000000 42e0f6c1 5a350cc7 ca3d7163 bab442a1 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000001 00000000 00000000 00000000 417063dd 05895c8c aa1ad0f2 8a7e2516 +ars4x32 10 00000001 00000000 00000000 00000000 00000100 00000000 00000000 00000000 72a0ac1f 480fae16 3ee35313 d59218d1 +ars4x32 10 00000100 00000000 00000000 00000000 00000100 00000000 00000000 00000000 909a04f3 dee070ac 5d34d9f6 0057f628 +ars4x32 10 00010000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 9a214df4 a4449843 b5ad1ada edaa299d +ars4x32 10 01000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 4846ef73 06c41885 6741882b 4d09e74a +ars4x32 10 00000000 00000001 00000000 00000000 00000100 00000000 00000000 00000000 71d41253 9e730f5b 9705647d e25d4f88 +ars4x32 10 00000000 00000100 00000000 00000000 00000100 00000000 00000000 00000000 5adf8f61 784b1b6f 7c95509d afbfe97d +ars4x32 10 00000000 00010000 00000000 00000000 00000100 00000000 00000000 00000000 994f3797 8bfeb14d 2c321c99 e88b5b0b +ars4x32 10 00000000 01000000 00000000 00000000 00000100 00000000 00000000 00000000 3ce918ed 6302e8eb 4ffcbf54 4bd82ec6 +ars4x32 10 00000000 00000000 00000001 00000000 00000100 00000000 00000000 00000000 3d5fe3f7 ab107c15 6dcc7326 2824fb0d +ars4x32 10 00000000 00000000 00000100 00000000 00000100 00000000 00000000 00000000 765b3288 51c9afcb a4c5741e 5bbeb453 +ars4x32 10 00000000 00000000 00010000 00000000 00000100 00000000 00000000 00000000 cec5baf1 93d7d9fc 3096a8e9 e277db63 +ars4x32 10 00000000 00000000 01000000 00000000 00000100 00000000 00000000 00000000 73d2fbb8 f299bef8 f4dc31cd f0338bd6 +ars4x32 10 00000000 00000000 00000000 00000001 00000100 00000000 00000000 00000000 0b8824b9 96d0f8fd 4d0fc3f9 d35cbe7b +ars4x32 10 00000000 00000000 00000000 00000100 00000100 00000000 00000000 00000000 62f0abf0 a89ca8c1 05c82cc9 3cb5c328 +ars4x32 10 00000000 00000000 00000000 00010000 00000100 00000000 00000000 00000000 085e56bd 1d91f6ea 3c29fec0 1f703b97 +ars4x32 10 00000000 00000000 00000000 01000000 00000100 00000000 00000000 00000000 3a2f8790 5fba0608 f9992841 3de27411 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 00000000 ed032a22 05db0314 e8b6fa9e 1cd7d7dd +ars4x32 10 00008000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 2b4c41b1 f5d7550b 96494e63 9dee9b50 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 7f046111 ef2b88be d7e01af1 c8540447 +ars4x32 10 00800000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 8904c8b5 1bff107c 89de1122 f078fe9e +ars4x32 10 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 91d45dec fe7a07dd 003e5ca6 98b2f680 +ars4x32 10 80000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 66e6c7c0 3d668856 bd6208df dd6c0b04 +ars4x32 10 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 00000000 12165f49 5bb73eab ebe55978 d391b601 +ars4x32 10 00000000 00000080 00000000 00000000 00000100 00000000 00000000 00000000 9096afe3 8c271d02 02d21b32 20c3a8b9 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 00000000 2b13a66e b47a554a ceb1047e 1fa90048 +ars4x32 10 00000000 00008000 00000000 00000000 00000100 00000000 00000000 00000000 f056db2d deaaa7ce 829d9400 8457dad7 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 00000000 c2ec8828 0987967a ea4e82f9 da6cb8eb +ars4x32 10 00000000 00800000 00000000 00000000 00000100 00000000 00000000 00000000 c4a587d7 4eae030f 71af5aa7 17470690 +ars4x32 10 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 00000000 b37dcd16 221b0d99 9c3ee696 b5a768eb +ars4x32 10 00000000 80000000 00000000 00000000 00000100 00000000 00000000 00000000 e3528871 e932bab8 3b5575fa 640afb7b +ars4x32 10 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 00000000 14377abb 63c257a7 271e195c b3c779fa +ars4x32 10 00000000 00000000 00000080 00000000 00000100 00000000 00000000 00000000 4a8b3b3c 2f2d8018 95f0f21d 70cc5020 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 00000000 ef4d408f c66ddec4 cf3e8e5b 2e4d80a6 +ars4x32 10 00000000 00000000 00008000 00000000 00000100 00000000 00000000 00000000 195c0040 e612419d 6870bb86 037c5e1c +ars4x32 10 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 00000000 716308b0 8845c05a bfec797f 178fccb3 +ars4x32 10 00000000 00000000 00800000 00000000 00000100 00000000 00000000 00000000 0144107c b2391277 2a953a84 17b80885 +ars4x32 10 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 00000000 d6c2189d 2f394669 b780f227 1d7f1b9f +ars4x32 10 00000000 00000000 80000000 00000000 00000100 00000000 00000000 00000000 0c53c3e4 bfeb3488 560ac071 9076c1ed +ars4x32 10 00000000 00000000 00000000 000000ff 00000100 00000000 00000000 00000000 06cd9d79 8725dc30 e8620e96 832b78b2 +ars4x32 10 00000000 00000000 00000000 00000080 00000100 00000000 00000000 00000000 590a48df c970e88e 215eff00 5f65a014 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000100 00000000 00000000 00000000 b6be10a4 54e96084 f7b1c020 5667a715 +ars4x32 10 00000000 00000000 00000000 00008000 00000100 00000000 00000000 00000000 0158f44f 096ba2ba b7ccce1a 1ee18eb7 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000100 00000000 00000000 00000000 e2aeff6c 3c9f9df9 75d95894 96e56309 +ars4x32 10 00000000 00000000 00000000 00800000 00000100 00000000 00000000 00000000 e43683f9 6d48b586 89822f15 c24ab59e +ars4x32 10 00000000 00000000 00000000 ff000000 00000100 00000000 00000000 00000000 91535e7f 89114f9f c173e3a4 b0ac992a +ars4x32 10 00000000 00000000 00000000 80000000 00000100 00000000 00000000 00000000 99af942b fe15e28d 0eb06c81 62509724 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000100 00000000 00000000 00000000 5b594541 b7fab0dc 89f9ca5d ea0db0de +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000100 00000000 00000000 00000000 a3703024 38b84df2 a4686a4c c2a647f5 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000100 00000000 00000000 00000000 ff22a6fe 66be6769 aec16d23 905b0622 +ars4x32 10 00000001 00000000 00000000 00000000 00010000 00000000 00000000 00000000 fd1af696 5378a483 2a7902de d90db43e +ars4x32 10 00000100 00000000 00000000 00000000 00010000 00000000 00000000 00000000 5b8189ee d7af776f 58b70db1 8b21950f +ars4x32 10 00010000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 aae746c3 335eb675 a093d5d7 4437e425 +ars4x32 10 01000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 4183ba0e 2c7f021a 9b5e19be 961ef6b9 +ars4x32 10 00000000 00000001 00000000 00000000 00010000 00000000 00000000 00000000 8cfaf2cd 9679da95 f58b3663 13dece23 +ars4x32 10 00000000 00000100 00000000 00000000 00010000 00000000 00000000 00000000 a4c5273c 93f1e56e 00c1b09e 8fe9f0a3 +ars4x32 10 00000000 00010000 00000000 00000000 00010000 00000000 00000000 00000000 de7add1b 7b602b8b 6f51d466 d5b704f7 +ars4x32 10 00000000 01000000 00000000 00000000 00010000 00000000 00000000 00000000 3b0ac4d1 1604d0e9 c2efbeb8 49234e1d +ars4x32 10 00000000 00000000 00000001 00000000 00010000 00000000 00000000 00000000 0b137f97 68b33f23 94c15a81 b9b0eb77 +ars4x32 10 00000000 00000000 00000100 00000000 00010000 00000000 00000000 00000000 dca890a0 a82d10a7 0c548dd9 935541dd +ars4x32 10 00000000 00000000 00010000 00000000 00010000 00000000 00000000 00000000 bb299133 967b5068 c3c080cd afb20355 +ars4x32 10 00000000 00000000 01000000 00000000 00010000 00000000 00000000 00000000 05b8865b 2b4bbba1 a0769fd0 68eefc0f +ars4x32 10 00000000 00000000 00000000 00000001 00010000 00000000 00000000 00000000 f69dfef6 3b4bead5 5fceac0f 73b6cb5d +ars4x32 10 00000000 00000000 00000000 00000100 00010000 00000000 00000000 00000000 71b4613f c0f36665 75746911 75fc8724 +ars4x32 10 00000000 00000000 00000000 00010000 00010000 00000000 00000000 00000000 87bce4ef 0763cd7e ac659500 dcd4abe5 +ars4x32 10 00000000 00000000 00000000 01000000 00010000 00000000 00000000 00000000 1334dcee a9e3a84b f5541b4b fa03c8c3 +ars4x32 10 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 00000000 b00ef56f 052800d1 f563e286 e3e0c3c6 +ars4x32 10 00008000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 06fd42be d01bd239 8dfc2b89 178357cc +ars4x32 10 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 1d3e451b 1dd7fad8 a9147b03 7ee20538 +ars4x32 10 00800000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 555d8ec6 0764fbde 5649615a d700e43e +ars4x32 10 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 11eb0368 f5f67768 35bfa350 f3f0ff8f +ars4x32 10 80000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 5ed1e7d1 6180fd1a 4e755be0 dcda0759 +ars4x32 10 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 00000000 20ea794e 29e33a57 8ab149b6 f867e36f +ars4x32 10 00000000 00000080 00000000 00000000 00010000 00000000 00000000 00000000 7c091aab e38ab356 5d488601 89edc670 +ars4x32 10 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 00000000 8174879e b33931a4 5d0c5717 ae86c09c +ars4x32 10 00000000 00008000 00000000 00000000 00010000 00000000 00000000 00000000 d741a12a 69239d5d ccbab809 b88e680d +ars4x32 10 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 00000000 0a718384 2ad5217d a98b5369 b917ff13 +ars4x32 10 00000000 00800000 00000000 00000000 00010000 00000000 00000000 00000000 0b7dc6ba 15709a53 f9ba3787 b14a4762 +ars4x32 10 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 00000000 ed61078d 146e50da c907e4ce 504676b4 +ars4x32 10 00000000 80000000 00000000 00000000 00010000 00000000 00000000 00000000 21b4604c fd5740e3 9c4e16de 5c97f02b +ars4x32 10 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 00000000 4618e0bd 7723923b fff48883 488b574c +ars4x32 10 00000000 00000000 00000080 00000000 00010000 00000000 00000000 00000000 830e64af 8a583bd0 877e69b3 2889afd3 +ars4x32 10 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 00000000 c9982b20 703c4841 8d27bbdc 658c69e7 +ars4x32 10 00000000 00000000 00008000 00000000 00010000 00000000 00000000 00000000 e65236c6 43d9f184 44306648 ab1234d7 +ars4x32 10 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 00000000 ee67b8e8 64d2128b 85a2de0e 93a9aff6 +ars4x32 10 00000000 00000000 00800000 00000000 00010000 00000000 00000000 00000000 66d264e4 a46aa477 4c735fb0 9d59c142 +ars4x32 10 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 00000000 8e17378f 267db9e2 d12a015f 18fbe34f +ars4x32 10 00000000 00000000 80000000 00000000 00010000 00000000 00000000 00000000 f3439b2c fadad898 25014f01 5099d9f5 +ars4x32 10 00000000 00000000 00000000 000000ff 00010000 00000000 00000000 00000000 3eeebe70 bc9a61d9 afbcdae9 4f87accf +ars4x32 10 00000000 00000000 00000000 00000080 00010000 00000000 00000000 00000000 60b54112 73002122 cc8949b3 e5821081 +ars4x32 10 00000000 00000000 00000000 0000ff00 00010000 00000000 00000000 00000000 70852928 211bab69 86b713dc 2234fddb +ars4x32 10 00000000 00000000 00000000 00008000 00010000 00000000 00000000 00000000 97992054 2e7cf8a6 f7cbcd18 585e18bd +ars4x32 10 00000000 00000000 00000000 00ff0000 00010000 00000000 00000000 00000000 511b8cf0 f5bdc929 dd620ff5 a3f29b63 +ars4x32 10 00000000 00000000 00000000 00800000 00010000 00000000 00000000 00000000 552608b7 49a1b891 96658c98 b8655fe2 +ars4x32 10 00000000 00000000 00000000 ff000000 00010000 00000000 00000000 00000000 ef7d4bf4 e9f48f98 b56a03ec f4a406c0 +ars4x32 10 00000000 00000000 00000000 80000000 00010000 00000000 00000000 00000000 4eda0692 f78cdc59 a8df1cc3 54192d76 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00010000 00000000 00000000 00000000 5550ef69 36bc1242 5bc4d226 57dfc1fd +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00010000 00000000 00000000 00000000 9eea7478 7181135b 9c46c00e 14ab98cb +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00010000 00000000 00000000 00000000 0e83e4e0 2c1a2165 03e84f54 bad9495a +ars4x32 10 00000001 00000000 00000000 00000000 01000000 00000000 00000000 00000000 fc860b1c 81fd3b9b e00affc5 371e9791 +ars4x32 10 00000100 00000000 00000000 00000000 01000000 00000000 00000000 00000000 7c48a581 57f33193 c825dd82 ced9cd59 +ars4x32 10 00010000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 ab3fbb2a f0c5af6c e0c8032e c7625f7c +ars4x32 10 01000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 93af7909 9477151a 257f9650 75d45378 +ars4x32 10 00000000 00000001 00000000 00000000 01000000 00000000 00000000 00000000 de139644 12373518 10a91988 b46ff4c9 +ars4x32 10 00000000 00000100 00000000 00000000 01000000 00000000 00000000 00000000 15d90584 72abfec9 e90d0b25 087a54aa +ars4x32 10 00000000 00010000 00000000 00000000 01000000 00000000 00000000 00000000 f454dd05 18db0405 ba4da74e 135e6dd7 +ars4x32 10 00000000 01000000 00000000 00000000 01000000 00000000 00000000 00000000 57223ac0 691401c5 04289c5f 1fd99b47 +ars4x32 10 00000000 00000000 00000001 00000000 01000000 00000000 00000000 00000000 4d01c327 7eb0aae9 f8dbc2d1 4449f6da +ars4x32 10 00000000 00000000 00000100 00000000 01000000 00000000 00000000 00000000 8802025e 2335325c 10681d07 485fa32d +ars4x32 10 00000000 00000000 00010000 00000000 01000000 00000000 00000000 00000000 91fdb751 1e470175 13154e9b bd7a980c +ars4x32 10 00000000 00000000 01000000 00000000 01000000 00000000 00000000 00000000 90de49e9 71233994 8524b5d9 9e02d455 +ars4x32 10 00000000 00000000 00000000 00000001 01000000 00000000 00000000 00000000 ad2d1804 acee0a47 bab650ea d4e5cb98 +ars4x32 10 00000000 00000000 00000000 00000100 01000000 00000000 00000000 00000000 f046e106 b280a9f6 af60ab90 3d102592 +ars4x32 10 00000000 00000000 00000000 00010000 01000000 00000000 00000000 00000000 437e3d76 6a0864c1 244daddf 6a018f67 +ars4x32 10 00000000 00000000 00000000 01000000 01000000 00000000 00000000 00000000 fc995c91 5eeb4755 2ed9f981 f4c15509 +ars4x32 10 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 00000000 3b59c5d2 70ba805d b0ea3ebd 0e369797 +ars4x32 10 00008000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80c308fc 49264772 811ea2e6 0332d35f +ars4x32 10 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 b59962e6 31218d76 eb1dc97e 09d71d31 +ars4x32 10 00800000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 94049e5b 21f2ad69 aaeea03b 2dbe9379 +ars4x32 10 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 86b06282 ddc76d90 47b21c7a 6d426bb8 +ars4x32 10 80000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80f4e2bd f5b8d606 563e0268 5c79dee5 +ars4x32 10 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 00000000 1701491b 144d5be1 7a2abfa6 1539d924 +ars4x32 10 00000000 00000080 00000000 00000000 01000000 00000000 00000000 00000000 2df222cd 1e1d897a a8338527 0d932cbb +ars4x32 10 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 00000000 158de244 1384539d 0820155b b97fbfde +ars4x32 10 00000000 00008000 00000000 00000000 01000000 00000000 00000000 00000000 472c8495 a2ffa86e 0f8f0023 02725dcd +ars4x32 10 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 00000000 41498fde da77bceb dad8421f 6c03848b +ars4x32 10 00000000 00800000 00000000 00000000 01000000 00000000 00000000 00000000 6485b186 a59cc5d2 d235ca5a ddb2a88a +ars4x32 10 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 00000000 51a11ce0 4ee3b8d6 3eedc6c5 42fc8b28 +ars4x32 10 00000000 80000000 00000000 00000000 01000000 00000000 00000000 00000000 4091fc6c 65000c0c 1236a673 c3d26d7e +ars4x32 10 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 00000000 498db7a3 386ecc4f 1b39a73e 61a74aa6 +ars4x32 10 00000000 00000000 00000080 00000000 01000000 00000000 00000000 00000000 4faf0b29 8aab2130 81b0d347 a1c0701e +ars4x32 10 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 00000000 da0b6dd1 d5ecde42 99cd9db1 410c63b6 +ars4x32 10 00000000 00000000 00008000 00000000 01000000 00000000 00000000 00000000 11873158 9c5af954 4afd1c56 ef1a5b58 +ars4x32 10 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 00000000 2577dc2d c937bf7e 70db2e79 12fec747 +ars4x32 10 00000000 00000000 00800000 00000000 01000000 00000000 00000000 00000000 84125aa3 95cd880f 84b3a5ae 5bc903d5 +ars4x32 10 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 00000000 491bff18 a58abc16 980f071b 3efc1a0f +ars4x32 10 00000000 00000000 80000000 00000000 01000000 00000000 00000000 00000000 3bf95ff6 e2331d1e 1d7120f5 909ef332 +ars4x32 10 00000000 00000000 00000000 000000ff 01000000 00000000 00000000 00000000 cbf60703 aefcd779 c448583e fd7e1d9f +ars4x32 10 00000000 00000000 00000000 00000080 01000000 00000000 00000000 00000000 694d10a6 83259031 7eac1d10 876c6404 +ars4x32 10 00000000 00000000 00000000 0000ff00 01000000 00000000 00000000 00000000 d3d427ec 67a13a84 5bdcb359 37356889 +ars4x32 10 00000000 00000000 00000000 00008000 01000000 00000000 00000000 00000000 2790c7e3 3b276547 4e807221 811fc030 +ars4x32 10 00000000 00000000 00000000 00ff0000 01000000 00000000 00000000 00000000 e9b889b3 07dc1d5c 69d3481f 088a62a3 +ars4x32 10 00000000 00000000 00000000 00800000 01000000 00000000 00000000 00000000 3b19c924 8eb03fee 7729ea7d 208a494f +ars4x32 10 00000000 00000000 00000000 ff000000 01000000 00000000 00000000 00000000 838374fa ce7514da 84b027c5 bb34b237 +ars4x32 10 00000000 00000000 00000000 80000000 01000000 00000000 00000000 00000000 81617bdf 3cbce010 39410cbd 8f866b7e +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 01000000 00000000 00000000 00000000 beb5befb 81de37f7 9d71d7f3 1355920a +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 01000000 00000000 00000000 00000000 95d1beab 03d40658 8a3c77c8 c7ff1269 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 01000000 00000000 00000000 00000000 b7fde77f 17befdd0 62cdc28e df0fc922 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 bfd4f3d1 ecc3187a cdff4528 1718ed47 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000001 00000000 00000000 40ce4318 f222abd1 d504fc5c 2bcfb432 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 acb1f467 2e1e7d92 8ae54caa 4c40966d +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 31f42074 9b42fec4 6904b2e6 a0394425 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 97bf20ea 01410ccd 903cbe64 9a01639a +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000001 00000000 00000000 7eabeb65 5838f760 b6d5acb7 9946e5f3 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000001 00000000 00000000 9293178d 1488e417 92b6b94c 6bee2ed3 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000001 00000000 00000000 e1e6e986 ff6a5697 6990f8e7 2ff09e37 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 30641bb8 95408420 559d692f 9da284a8 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000001 00000000 00000000 d367be4f 153ce862 ec4caf3e b541f0c9 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000001 00000000 00000000 3e38cb33 a34ca8b2 a5ce5b8f c3698852 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000001 00000000 00000000 459a9382 dcfb0e97 b448d680 ad54f2e0 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 d8b662a7 fdcf5fc6 8362b5d1 c49d7fdd +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000001 00000000 00000000 631d0b89 aa692571 3b6fbd45 23b148ec +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000001 00000000 00000000 2d239410 b738d860 03a139fd 83c2e20f +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000001 00000000 00000000 78f4cc47 8e254e87 423e3555 bdd03738 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 00000000 96100ad9 afb67343 a017ef86 e81ff838 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 a31342cd be973fc0 cd421b80 4ce07c86 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 75040d45 c26cc386 1a72b4d8 168c7cc7 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 7b391fd8 721c3746 5b681c84 1ed54b5c +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 2710673e 74feb97b 5da20bcf dd664a98 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 5b29f83b 1cc13a86 c33cea1f 078f80e9 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 00000000 646f76d2 bcd60477 b114f75a 675d0eaf +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000001 00000000 00000000 7e7fcfa1 5447f6c0 45acb805 ce1e029d +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 f6c0cdd6 c00123bc dbdd876a 809954db +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000001 00000000 00000000 1444a4c7 114a1082 ab0826e8 41b7ceff +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 da769fd5 5dab338d d2651bf4 8ff5e181 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000001 00000000 00000000 5f49458b f30e7822 37318817 431d9788 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 cd545d32 91fdfca3 ee1bc378 d5de49e3 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 e2daef77 fdca4c2e af7e0fbe c4f92ca0 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 3c35a24d 054f1076 5608cdfe e0daab21 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000001 00000000 00000000 2e7757ad 966ab208 d833608e bf8d94eb +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 00efc870 541575d6 00596efa 9735d2d0 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000001 00000000 00000000 c4de9e0a cd3b7939 19c2ca34 91cc6caa +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 ad5c7145 608b2764 2688d22a 4ce0fbf8 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000001 00000000 00000000 f41ba454 80441dfc 3405e53b d794fd33 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 60be9130 b451879b 19922d8f 1f9a4fd3 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 67800d7c 07db99ce 6ffbcfc7 755321a4 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 13894f1d 2488f85d e904b6f0 3840c79f +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000001 00000000 00000000 58f7922b aa6ce608 d93bd8d8 3ca9f6ea +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 528acc48 9aa02e61 5521500e 18555b6c +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000001 00000000 00000000 508109ec 559b7023 64e3e562 2df69fba +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 18b56a1a 417812b1 263c7be3 b37183c1 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000001 00000000 00000000 c0d51b22 2fbc6c94 57bc4bd6 68cf5022 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 2e7460db 9fa33fee 41d322bd f82953c5 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 6477708d b6ed7061 fb9047db 8a42e3cf +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000001 00000000 00000000 41e2795a f4c16966 19d92cf2 2ca279a9 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000001 00000000 00000000 58b993db 5576ccd3 74d2aba9 ccc12df4 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000001 00000000 00000000 aaf7fc35 5f3edfb9 6ccd2e41 23239042 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000100 00000000 00000000 060e57e2 5b2951fc f1a12bba 6ee00755 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000100 00000000 00000000 74c867ed a4d7421a 9096722a dbfe336b +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 c22c998a c1cc03e1 9321470c 1a917550 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 b3399733 41a29fc2 f853ab4f a5335c76 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000100 00000000 00000000 4748503e 0cac3731 08b43c28 978e8899 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000100 00000000 00000000 06ed60de fddd401d 42481e9f 75b1a5a3 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000100 00000000 00000000 6721c6c7 d20d3ebe f3fe66b5 ff71a033 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000100 00000000 00000000 95ba8f60 67834224 a72d0de8 15cbdfa7 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000100 00000000 00000000 2fddcba6 995c62e9 2958150d b9f739df +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000100 00000000 00000000 3a2813c1 7a71f3a9 a556f619 21cba117 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000100 00000000 00000000 ba1c117b 81b89f93 201c9b0b 111e7fc3 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000100 00000000 00000000 e7bf6a5a 03c8d18b f1b9a08d 63a58137 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000100 00000000 00000000 eacd39d2 c0b6a1f1 94322d0b c6c343aa +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000100 00000000 00000000 dbaf44de edfe1d58 36275f08 3986269e +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000100 00000000 00000000 a57d1092 2f544c57 13bc0871 fa43d886 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000100 00000000 00000000 5a9a6ce7 650a3536 9f6e6f49 3891361d +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 00000000 1d628619 73d8a773 18f02dbf e8ff2d8b +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 10bbe054 e899a607 e6f6c151 4fa59102 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 00d3c748 0412c157 030d7094 bbb9b671 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 b1f4fb4e cf597a37 bc42d357 77fef051 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 bcdbfc69 2d2f450e 2f48a872 0e5a2aad +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 9a195442 9cf3a70b fb778338 be621807 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 00000000 8f746c68 0f34e2cb a9bbad63 fcb9ed3e +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000100 00000000 00000000 e209361f b9d770d0 f0401031 14471c8c +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 14587472 aee079a7 9d248e9b 84bf98d5 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000100 00000000 00000000 5617cd7e cf121cb3 a7fea455 602172fe +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 ebcf671f 5c5b7c31 c23126a7 8a213279 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000100 00000000 00000000 a2c9274b 0df40531 0e1fb929 12c747d4 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 08671a9f 3c455428 b10ed0ff a03c7578 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000100 00000000 00000000 ab400477 e772d792 c852367e b3be7c96 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 8ad68f38 00412fbe 5d7b18be e168bac7 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000100 00000000 00000000 74c7af57 08dc5f8b 3ab9cd75 cdd2b74a +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 992ce9ed 8d739ea1 21aba89a 4f4001d3 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000100 00000000 00000000 13ad16b2 bd562f32 a42a41ef 736d72b2 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 cb573a84 0f0ddb71 1f5a43f1 e874ea9e +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000100 00000000 00000000 aefac238 c2550422 e7c52da2 1e296fb1 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 31ee3d43 ca3deb61 fb236218 36ce79e0 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000100 00000000 00000000 0173e654 5938583b 134210ce faaf72cf +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 71d627bf d946907f a0632309 b1e5cf47 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000100 00000000 00000000 2b7a2f55 1b843650 566c98b8 5b792892 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 6449f4cb d91cc504 8e90409e 15ced0ce +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000100 00000000 00000000 8174d8b0 c0ee31ef 972940b1 403d1f21 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 80f58285 8bb0a5e2 78664e39 5222725a +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000100 00000000 00000000 a6e5122d 86a514fc 699eaf15 3a32b327 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 168f76ba 20b994ee 62f80250 d965092b +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000100 00000000 00000000 6c332825 becccb7e 8a044408 38e14a79 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000100 00000000 00000000 62e41263 47de94d7 3bef0ab5 99b7c6c3 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000100 00000000 00000000 df68edfe f42fbd44 552f75c1 449bff8d +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000100 00000000 00000000 32409ac9 d4afe040 3d4166b7 b5ba0843 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00010000 00000000 00000000 79744520 ab471dee 2229ee76 142f29a5 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00010000 00000000 00000000 da1f0f64 3ac98f1a dfcfdc39 91c5493c +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 8063c637 8143b753 efbb9cc6 a4779ea0 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 41c71d46 39e540b0 b1edeb98 3f40c392 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00010000 00000000 00000000 e3010a49 beecef10 19fed042 d6d65129 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00010000 00000000 00000000 c61ae084 122f9d86 417c0ab6 64f63ddd +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00010000 00000000 00000000 088ac5bb 0cd34875 75552299 b46d2df9 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00010000 00000000 00000000 472a81ed a0f827b8 ea577e51 efee88e1 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00010000 00000000 00000000 245b80d4 511c60bc fda74051 4cc6874c +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00010000 00000000 00000000 1a874d01 b1fa2411 8a79844a 609e11d0 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00010000 00000000 00000000 5b0e23d8 94ded59e 4f0280e4 4de98d46 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00010000 00000000 00000000 b396a7e4 adc70056 ce376050 7028adb3 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00010000 00000000 00000000 6e21e594 7a62bd3e 4abb9ed4 838dc27c +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00010000 00000000 00000000 88974616 cf4faf02 ee9f97d4 b7f44dfa +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00010000 00000000 00000000 6e263cf1 791e4a77 69213927 51eb46d0 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00010000 00000000 00000000 17a1f6b9 450efddb 5f369ea1 e259d647 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 00000000 db2b30fd 1eb49923 6e46d2ad b41ea3e2 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 cdf245ec 1eafa5af c8d72b40 1e7e33b0 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 112ea2b5 eeb733dd d9190cf1 d6fca246 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 156db0b5 afdb177e 882309da b3acd61c +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 666d782b 0c479c66 b149ccd0 b822c6a8 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 3c3871b8 ec24e8f0 24949528 302f11c0 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 00000000 b94bb344 533ec7fc 2ee3a059 f15953bf +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00010000 00000000 00000000 9bcf62ce 52c7fad3 1df2cfaa ba441314 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 3d86e62b 0b798100 18f85c0b c758eaff +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00010000 00000000 00000000 503004e7 ef0fbb14 098e9cdc ce9eb330 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 a5ca0432 f1b38bb4 5b9a8918 ff286165 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00010000 00000000 00000000 c1c96fee 935518f6 67986b63 f2c8a5cd +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 8fe8428e ddfaf73c 563ef193 090dc8db +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00010000 00000000 00000000 6398312c dfd17c95 c85f20d3 f618c47b +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 333d8f64 3fb516e2 bb91bd0e a031b72e +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00010000 00000000 00000000 15d89365 a663b6ee 20f86c41 24e71dbc +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 6865715a 19a35bfd fcbbeafa 44b787e4 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00010000 00000000 00000000 5ae0faf9 8779d15d 524734e3 a7f0cf34 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 ee108acb 4d5a248c 52045add 2ddf877d +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00010000 00000000 00000000 6b99345b 5e99a8a3 f396433e a9d49c98 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 059bfcc1 c7584fbd 3f1e4a70 ac3957ed +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00010000 00000000 00000000 b6d51c0e cfcf17ae cf3b9440 00fc2908 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 6c728ec5 f8f32e4b 4b35172a f8f8395c +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00010000 00000000 00000000 28dbd11e b5748583 934b929e a6700643 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 811ceff5 2eea3339 e548ef68 15c50b0f +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00010000 00000000 00000000 e2883bbc 74ea0e81 fb1756e3 943d29b0 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 5f3863d1 4a71611b b2c055a2 79e7fa19 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00010000 00000000 00000000 69c24de1 6e892c47 e493bf8c 2899cc43 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 cbd7176f 72a9ab45 93c16a50 f3fe8bc6 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00010000 00000000 00000000 d75a6592 be01362b 7976f7d3 0adbb2a8 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00010000 00000000 00000000 3ddaafe2 6fe742c5 354f8a52 d6d29e5a +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00010000 00000000 00000000 ef6fb762 4cd0001d 16c68b0b 2dbb0aba +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00010000 00000000 00000000 7995d3ed d1ff5dd4 a66c5408 b7b57f46 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 01000000 00000000 00000000 3fb0f209 ec46902b b0cb92f0 71cd4dc8 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 01000000 00000000 00000000 e37240c3 940ecd2c 8a8b8880 825c2d60 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 874b17f1 25ddfd8e dbb86906 c239527e +ars4x32 10 01000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 b4216b45 8d5efd6c d0b0cf3c afc15920 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 01000000 00000000 00000000 1c0a1a33 0c58d79a 1dc31f0a 3f3e48ad +ars4x32 10 00000000 00000100 00000000 00000000 00000000 01000000 00000000 00000000 f1131a69 c1ada617 09b19130 bb3a2dd6 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 01000000 00000000 00000000 d7c2737f f4e4cd53 8d555496 bc8588cb +ars4x32 10 00000000 01000000 00000000 00000000 00000000 01000000 00000000 00000000 54e46015 02c0955b 570df0fa 5a4ee4ce +ars4x32 10 00000000 00000000 00000001 00000000 00000000 01000000 00000000 00000000 330d20b0 becff70f 69e6b919 edfa2357 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 01000000 00000000 00000000 9c521989 4b461e45 c1728d66 47a5c9e3 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 01000000 00000000 00000000 98930d07 5b30e46c 86d53a54 dc47bd07 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 01000000 00000000 00000000 4ba983e8 06bbbcd3 30d0c62e 3de153b5 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 01000000 00000000 00000000 e9ee0e5a 4a518bec 48d97ffb 1a051110 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 01000000 00000000 00000000 7382e3ed a18970ab 114f2724 94722940 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 01000000 00000000 00000000 459b82b3 1ebb9005 5b8b6b37 dddc4c1d +ars4x32 10 00000000 00000000 00000000 01000000 00000000 01000000 00000000 00000000 9f5a2184 e3010010 8b75e977 6f9e0698 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 00000000 77c4a50c b3d073e7 c3e061e7 56118fe4 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 d9d8eb8e e2370636 2d916219 39ad2085 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 28e28abe 3972d404 31eb3d2f 0324d171 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 1ee43af3 02e8fb9e 9b94a6b8 213cbc8d +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 96ba9165 84971203 2a5af6d7 cfbe4757 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 f3b43fb3 7c208a83 a33d5ddd 2206abdd +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 00000000 a8621d78 c3bdef73 40fa56d4 9d5df72d +ars4x32 10 00000000 00000080 00000000 00000000 00000000 01000000 00000000 00000000 53117285 512402a4 002f894c 1fca6b16 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 c6e4be24 808dc4d1 4d0485fd c0445b33 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 01000000 00000000 00000000 8b9639ad 06d9825d 2bccd907 7a288325 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 94772093 aa59262d 2fdf153e 74b4dcb3 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 01000000 00000000 00000000 1b8cff46 9cefb067 69df31d3 1b739b43 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 0ee5bd64 1e83b18a a1e22225 868c1831 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 01000000 00000000 00000000 1e9e60bd 813b3fd1 231f614a 84d597df +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 5efca986 7c4e56df de86fd5e 88bb87b7 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 01000000 00000000 00000000 dd4e54e7 a25f2f2e a3010ebd c8f3fa61 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 8bce1a3d 8f055227 cde20b9e 282de09d +ars4x32 10 00000000 00000000 00008000 00000000 00000000 01000000 00000000 00000000 65b19137 c0aeb93a 38989860 fd7987a5 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 0698b753 8b1a360a 47ed543f 723f8714 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 01000000 00000000 00000000 f252603c 25733ab7 1890301e d99576c1 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 94234fe0 d5978da9 b557b299 8281fc07 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 01000000 00000000 00000000 f03e782d b654780b 9ed5614d 9a050adf +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 7f5fa570 0e293e10 1f9fda22 e843efe2 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 01000000 00000000 00000000 bd3027f3 fb400d64 9bc46c03 f2d69986 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 3b283179 c530d618 121e3991 b0151d60 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 01000000 00000000 00000000 bad9bfb6 8e6d58d2 ec9ca2db 53d305b0 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 40b89c8f 06ec7b3a db7e2330 2e6924ff +ars4x32 10 00000000 00000000 00000000 00800000 00000000 01000000 00000000 00000000 b2f5b121 47028501 2e42db1f beabfc13 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 23130470 729b594a 8d436499 592b860f +ars4x32 10 00000000 00000000 00000000 80000000 00000000 01000000 00000000 00000000 d644c6c2 079ade86 ea18abff 1599ac31 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 01000000 00000000 00000000 eec33e51 af4070e6 70867f49 f2c76cb5 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 01000000 00000000 00000000 8a5612a0 59d12ee9 81d1e679 64880e10 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 01000000 00000000 00000000 fa481e8a 4aee6a4a 3743c22b 43c29a06 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 3b6da218 dead2919 1881c9f1 1fbae2fa +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000001 00000000 cca52c27 2c7f5e1e 018a877b 0427fcf3 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 bfbd5600 484665db e30ba803 029ac957 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 0207c89e e2faa9a2 9c6f6b7f bf644286 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 28a535e4 1e633eab 9e99accd 39dfbac7 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000001 00000000 3a3da075 f7b97e3c 92ddd583 a9c0515a +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000001 00000000 ea044d54 72acc464 9f564e5a 8e803cf6 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000001 00000000 30b877dc 27cbee0e e157547a b50a3229 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 03fadd0d f684cc55 c93a2bc6 3157a8aa +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000001 00000000 9cd1c3dc 9cbf9642 5bba5f7e cc57560e +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000001 00000000 5d45da73 ad72f4e5 217d6f04 e01018e8 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000001 00000000 4f79a630 681862d0 9187a7a9 d2b6228b +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 3f22ac01 326f4bdc dc59699a 31131031 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000001 00000000 ca569cca 4a1234cc 011ef9e9 3acc0871 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000001 00000000 35c2e79a 6d82a846 cfdb03ea 7cc737ec +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000001 00000000 1607d796 6414bb50 f1d68168 415d0fe5 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b758a508 9a19d3d0 05cf6c00 aa56a110 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b318b4fa 9b487e27 6d78ccce b35d9944 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 1a1c53b4 97410980 0fd3f17f 54e1b36d +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b352246e b53e32d1 fe17691a ce07debf +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 c012668a 91d42293 f0fa88db c46400b2 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 520ca484 208436e1 2dd1d264 60baa37c +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 00000000 b60d427f 7f740c3a 8a42180a aa2435a5 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000001 00000000 dccf627e f30e00ff 41aadaac 96b44f6d +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 c9062243 f61fa301 4eae59e9 4bc9ca87 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000001 00000000 589e53a9 e7a18b34 7f81eec5 448cde5a +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 d3b52fa5 0bec4e82 db777641 d6d7ce1c +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000001 00000000 646d0325 9a95656e 1f5bbc36 4f5c8d31 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 40e7ff1f 8db8807e 24e406c1 e7ffefe3 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 7ab87d4c 22524953 f697bfd1 4a8fa5af +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 fb9990c5 17a82d5a ed61000e 1760b52c +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000001 00000000 f0ab6fe4 ac81a8f8 d132ef2f 8562665e +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 b14d9cb4 23e10b75 539a5993 54950f3f +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000001 00000000 61f18fa8 10c72855 07238252 b84b8f85 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 82295fb2 0113d8ae d125425d e218b87a +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000001 00000000 74015001 8238716d 5bb7e8c8 82652e1e +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 b8fdcccc 79f12e50 8b5d2ca9 ae37ed3c +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 f70d72cd 119d6244 f89d5ece de4ec4d4 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 47d26478 35548a5c 1f723bfa bbe42052 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000001 00000000 123f01cb 59bb0542 edb94675 f8a2f093 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 ae428db7 25a40404 9516b2af 2bbd3270 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000001 00000000 830c6a08 968ea4da a9f6b36d a8756cfa +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 31329a5a 3b79a414 73ce6f09 e056e02d +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000001 00000000 04005865 5280e42d f93f8264 ea076ef7 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 335323f0 7e5a4c67 07d28bde 6ab5457b +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 31032630 af692c8b 6c4a0149 a9182b0d +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000001 00000000 dba9a18f 4a8ba058 d88ade5c 09d1295f +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000001 00000000 5179b9c0 cb326d0d b21c57aa 5cfd9320 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000001 00000000 afe0e8b8 b51af1bc 09ccefba c5a5d5cb +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3a24e38a f2f479cb b01944b4 787db0cc +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000100 00000000 ee3e1719 6df3d396 94aad58c 945d2a6a +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3636c4c0 f4de3eef abcd21b9 0fc39679 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 4e290cbc 1187add7 050a4bee cd74796b +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000100 00000000 310595d6 b0243ff4 0def94bb 489bcf09 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000100 00000000 678986ee 95bc7c78 b62a2ef8 662a739d +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000100 00000000 ee7ce9f3 c25c4244 2d3282d8 28a82909 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000100 00000000 88b21a07 e239b7e0 b70453e5 bee35270 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000100 00000000 ccb2bc2c 4720b4f4 8bd1a65a 5c069920 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000100 00000000 7e2b8c2d d3f271cb e01e7725 e649c3f1 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000100 00000000 dc4dc527 54543e6a d496bb0c bf332ffa +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000100 00000000 4df06a29 7f665420 e75be145 0521f902 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000100 00000000 6757fcd1 a4d214f0 ff160e06 2fbe68b9 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000100 00000000 03c65f5d b129a136 7869bc83 7b9ae516 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000100 00000000 712861d8 0dcd1b4a 08eef989 ae83de10 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000100 00000000 d412f16e 4993bb53 5d4c46d7 83b47181 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 00000000 4e06f6c5 6de2ef2a b6140d2f d5853b30 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 ba20ecdb ac4192ef ecd7050c 9e65a71e +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 5e9b4604 d42b487a cf95b31e 7ca7993b +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 e83d44c2 e99d926f 479e4132 57dd525f +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3ea2c8b5 e5987dd5 1894f0d7 6e9dc53f +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 6c3dbb24 a4f93856 4c82b52a 488b9165 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 00000000 f8cb9348 bb0266c5 2cd842c5 26fc8c00 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000100 00000000 7349ff5a c319fd45 dcda0575 3f21b3d2 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 c00f7b2f ceaf4cdb 4ac4dc31 154c19dc +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000100 00000000 7e74e110 1935a117 3ff50bce 94bbb144 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 144413d2 2246c38e 02930b9a b0baad7c +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000100 00000000 0315cd39 d7aa8fed a7ca8633 f1332f6a +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 267ae963 2a5a1091 d6fa66a4 e1931070 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000100 00000000 8dbae2ba bf505e53 cb081eb9 38f78513 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 646723f1 c59588de 35d64138 62f4f638 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000100 00000000 d3ec5c77 41ac4ab9 f538ff0c b6fc0eea +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 fa73e170 7f2eb263 1311bef6 4baf3de2 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000100 00000000 24558d77 342b0b22 05e2209d a685912d +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 6ffc1906 0b216795 cdb94b1f 5ad9f467 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000100 00000000 971e896a 17cb24c0 947a56a9 673672b2 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 df0d5551 976050f4 4c71d944 5e915fb7 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000100 00000000 2ff7a1b6 38c8dc6d 310a11a5 d31099c9 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 1afc0f34 d31c7a6d b8c9b481 c3df3411 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000100 00000000 55e651a4 8f8c6480 a88be763 ee484349 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 4841234e d38e02c2 7085b9af 5ae19921 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000100 00000000 82a0524f 909836f1 2b37c0fd e8bb5a68 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 5f601944 728c210c eec42500 8208d1ff +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000100 00000000 cab60741 2c79f40f 48b6b6ee b05773ba +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 54f9db96 5da83c71 53e98128 5e1f3fed +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000100 00000000 ede0c269 db58068f 1dad8f7e 31365754 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000100 00000000 cccc3855 3b7250a3 c1ba834f 0f1971c2 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000100 00000000 c0ecdb97 0bb47b83 78428cac 5508e403 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000100 00000000 9d0e088c 51aad17d b2e90098 c5701d31 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00010000 00000000 6d379196 f5a0e8b6 82ed605a 4261efd5 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00010000 00000000 470d64b7 4fb9e376 240377ba e087143a +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 ed397e2a 62613728 8f945e67 bab73e70 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 a0db8ab4 f81debf2 017d3c84 fd2b0967 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00010000 00000000 66344dc6 c5ed1455 1a6e0173 ecad0ae4 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00010000 00000000 2a0c8828 f3cf3ef6 e7c4f214 984a8b30 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00010000 00000000 138ca5fe 39f5acd0 f952cf2b 28f7b5b3 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00010000 00000000 e9206a90 413f58d9 1f13a5af 7bae6ce0 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00010000 00000000 f0cf39bb 3eb8befd a4fdd272 b270a992 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00010000 00000000 c67dd272 0f43e863 7b5a9044 5768b0af +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00010000 00000000 24b7ed0d 93483b55 807d858d 506f9e86 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00010000 00000000 2449ac5b fca945e7 af6736ec 1409d8b6 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00010000 00000000 e2808a62 d941c835 af8733f8 84cefd17 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00010000 00000000 38147605 70c6708f 98367389 125db73a +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00010000 00000000 6cc7b369 35124f77 d0f5b3f6 239298aa +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00010000 00000000 6649f539 a3603a3d 6e90e8d2 b060b7ed +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 00000000 9f0d4dd5 466f7ab9 a2cb72ed 3b0eb515 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 958bb39e 7b50f52f b19b5604 46fe8648 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 f6f717d6 d7cae96e f805f6ae 03456c6c +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 2aaea638 580972d2 54f9eac4 2af2139a +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 a45aad7b fe11c4db 71e5b90f 21d6bcaa +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 30ebaa3b 08bae465 3b7f886e a65f14ab +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 00000000 b43540ef 6648506d e7b43f88 702e2168 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00010000 00000000 cd83b53f f1eabcd6 11e4cdd2 ecae04ab +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 8109ccb1 b1e93308 98b6adb9 b4fd5869 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00010000 00000000 54a7f662 f010414a 66b9168a 316e7c96 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 c6121cb3 46b010ee 66a7523a 4c78f6a3 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00010000 00000000 88b864a6 27410eee 232e3a98 01529469 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 91990f1f 26e916bf a13c7f8e 83bbc2d2 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00010000 00000000 82eae346 c786e1d6 2be9a5ab 6abab178 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 27cad9ef 39773de2 3187675d 700415eb +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00010000 00000000 8f115fb6 63fd3e7f 187eeca7 06825f02 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 a167ba02 88faed26 5cfcddcc cf18ff60 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00010000 00000000 9a885cba de3c28e5 d37a61cd b573951f +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 29b9480e 49de968c bbf6cf9c a18bc0c9 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00010000 00000000 06f5efa7 a2eecffd c2721b15 a1b2fba7 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 b6fd0d49 b5b677c8 85b4864d 90788bf5 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00010000 00000000 59628edd e69f3ba4 ab0a4400 2a11e765 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 c0ac8e76 288f5e66 97c3672e 8da77970 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00010000 00000000 b71d89a8 93b990e4 6a991646 71b48b74 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 a46b95c1 1ae1bd2c 17dcb860 498671df +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00010000 00000000 1dae7ea4 12a1e229 acd13702 55c3fffa +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 110dc0cc 43fb4477 abd9226c 17c2f80b +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00010000 00000000 206e4bd1 ff42717b a725faf8 20fd1253 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 1a43112d add402ad abbf9688 6cd0ea86 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00010000 00000000 80f6754c a5ddaa17 ec763fe2 79c7da96 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00010000 00000000 4cfa0a0b 2b01063a f2de8183 9b73a748 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00010000 00000000 a816a6ec b5c31283 09630670 68823347 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00010000 00000000 4304806c 678427b0 590e73ee f01ef425 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 01000000 00000000 f0ec9081 17439473 d35e62c7 565376dc +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 01000000 00000000 29dff89a 5925e07c 1c9a36a9 1ff67d0c +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 e327a201 72601fcb fa492724 594c8bde +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 baab607a 46eeee26 f120ff0b de8aab05 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 01000000 00000000 9df160a2 fea97302 6f09ee94 7af3592a +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 01000000 00000000 f5e604aa 7b2b9b77 7be6665c 55f86568 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 01000000 00000000 21d42295 e98eba48 3da4566b 63de1a1d +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 01000000 00000000 81e31326 07dfeaef f9a3b35f 55b42e2a +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 01000000 00000000 fe571b0a 2f3b0f85 3ae46c13 c147a031 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 01000000 00000000 ad2055b9 fe4693eb 0cd23900 75c1cf16 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 01000000 00000000 407a6ae1 aed41913 cc785e96 733d9574 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 01000000 00000000 14790664 c31bd6c8 1006e243 6b8ba00c +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 01000000 00000000 16341bb4 33f7c92a 7da857a4 54fa72d0 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 01000000 00000000 b023abd5 4be29d0b c2ec8c44 4759f825 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 01000000 00000000 ba7e678e 879b2090 20003b19 28ffbfbc +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 01000000 00000000 9d613b98 e88c8bc9 f6cffe07 3ba558fa +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 00000000 b17d2fb7 41de2a63 69f8477e b842b6c0 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 d7c8c34d 72a728f5 90176d9d 12a20872 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 060fceb2 dd0ae253 b5b055d3 80d3c814 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 574dc142 6911237f 42f24703 dc367a60 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 58e90605 f7d04d30 09706766 e3c7dae1 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 5f2fa382 8fc9965c 6101e8d0 1b0cb812 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 00000000 6f2c17f1 0ccabeb3 9b76af24 961159d3 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 01000000 00000000 cd298400 24e18e72 d1e4806e ff4e590e +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 07521109 ad6a1cc0 bb975e41 b95a35c7 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 01000000 00000000 b70c2a80 671f5b84 680bbd42 f60c6c35 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 4e338c5c 805e6304 8198670c 96775bcb +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 01000000 00000000 f8ee10dc ceee3c76 85a48d75 fd91006d +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 57efb78c 4cb625e3 f92f2ec0 cd0e568b +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 01000000 00000000 a491e191 3dda3454 1d1d7da2 b46f0381 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 3b9a15f6 9513a474 826060f1 fe2e12fe +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 01000000 00000000 fce1af10 3ef65f2c 76c708ce a70a9d0b +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 817cdaa6 05420d43 adf89b3b 6d876924 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 01000000 00000000 2108e0ce be053b4b bee203c0 d3a3e45c +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 164aa195 5b3c52da 4bc45866 a3c09427 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 01000000 00000000 f0616dec ffce2c48 8ad61e07 bac6f5d8 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 e037c667 9caa836b b94643ed 4f29d7c2 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 01000000 00000000 0cdcf979 9e0bbeb1 f1792602 9374d54a +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 97af39cc a96de874 54dcb078 f467d206 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 01000000 00000000 dd6dc39b a93139a5 d333e43e 67716f60 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 ae4636c5 1405a129 2b8668a6 d73d09d6 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 01000000 00000000 636af1ce 6ee69d0f 15f452ee 3569ec72 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 23906744 658f7afd 76d77c00 08a22245 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 01000000 00000000 87f45225 6e2a65a8 f81a9808 03291042 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 67b56823 1c6edf37 cac0ce94 fc5b9375 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 01000000 00000000 a9faac65 baeffe98 c47c0b67 6efd4c3d +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 01000000 00000000 6d980bc2 6b28966d cc0edc5e 56029663 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 01000000 00000000 c676b55f 8ad7487b 63bc0c7f 1379c4b5 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 01000000 00000000 c63e4e34 dda2ae11 6a4eea59 e2d735e4 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 e030af51 f0c406ad cd31da3f 12daeb18 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d647af79 a5e0b9f7 d945e5a4 161fc4c8 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 c6e78b9f 08760454 98f27570 17813501 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 ba496ee9 da990d16 7612ca4c 3eae2911 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 b5a0fbb3 a9766f8c 7af52349 4f04e26a +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000001 aa093e55 b226f0a9 53afa070 569ab229 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000001 4f47704d efa380e9 b5edad71 38aad304 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000001 9e9853a0 082ef8bc 716329cb ddf155e8 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 63461ac2 938b887a 56773d65 31df7347 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000001 c1e6ce95 97e64ad4 bd0b383a 8ebf32f9 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000001 5aca53c2 27e87b5a 97050794 c6d1ab5a +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000001 a6e6df68 a16f4e57 ffad3462 51065696 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 73845df4 e3f11542 363666c3 39e10bb6 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000001 64a87348 7ec4d910 9e75213b 5914d9f9 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000001 e4d6993c 77305999 46a765f5 ea1fbb4d +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000001 068a65eb 6aea3a8c 343c1a47 f7560cf1 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000001 ef3a2fc1 32b12ecd 31f46080 4856d695 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 9e24d97a 238869ca 35a667a9 cac75660 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d078505b c444a93d 3c1d4687 fd299c5b +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 455a18e0 8b25ee8a 9eb52d70 0a2406f6 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 e42be7a5 10e8344b 8a841e2a 76866124 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 40dd0d34 a1083f9b 54e94679 f24cb157 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000001 f76ee81e 3f8e191c 7ace5e54 686c78a9 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000001 7b0e0ea5 626bb09b a3084fed 1e1ea262 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 6c35e2e4 4b116ac4 7c76ccce 6bb9a4a7 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000001 9f4d1018 414a8cf5 6baee5d1 f7c0f074 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 e663febc 5aff1931 fba5f61c 11210a8b +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000001 1dda1386 c427a4f4 da7de3be ca6d898e +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 e5136b72 9c9a2b25 e6212dd9 11b59216 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 b5f6c242 16eee9c4 5d9f2224 3ee53567 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 998d7220 94aab55c 675ec4d4 751d8763 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000001 3065eb46 14dd6ecc 56227cda 656756d6 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 c8e3c4e8 d5a754f1 ce7a3b8c 145d41a5 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000001 bc8ee1a1 1efad7f8 cca32205 f25ecce9 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 999d4322 09f63cba 401bf5f5 dfa94671 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000001 2bcdfd5d 9cc3f21e f2e4ffa4 de8da739 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 ae20c6a7 1f6a5d18 a46ca51e 536b01fa +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 0d6e2690 54582cd4 a409c539 8d61509c +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 0b56a479 ac382ffd 8ff545ad 38bf0503 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000001 976ac401 af2a5de7 4bc9f677 d4aef946 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 12e13444 50ac2a67 ca356633 e03b7d2f +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000001 5e649cc6 ef0f17a5 94798230 08e834c1 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 66a13df1 5a5dcbd0 0508d339 bc651029 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000001 14bb05b6 6b7fa5a4 1055f28f 77cc28f2 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 69db4f0a 2f946efd a984980b b9faa3ac +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 d62eb4ff 35cfdc17 cd4a1c41 14d50043 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000001 ef824629 1cba14e7 49ed4950 ffb38246 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000001 a34ee7af 7f2fd010 664fda60 38af05b1 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000001 1d54c792 869cb843 fbd24ccd ad3de6b3 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000100 f1df58a4 1ed53375 7bb78ef4 4e11dbab +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000100 e6ee2dee 3b5880ed 942efd6f 91f43b8f +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 7c21e72b a288390d f96c436d 0d20b4e0 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 807067d5 212fec9b 88c0801b 5a85aff9 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000100 1b0be5cb 29d0b95d 372985b6 48e76f44 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000100 93c509e1 e718172c 7f883cb2 c21639ce +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000100 06cfde2e fa591c7f cd70f744 7757851b +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000100 1864201c 9f652d37 09547c97 4d881d90 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000100 7fbb915f 552c9bb0 3c7a3c8b ce644482 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000100 ed0e5f89 9e74bab0 97043f39 7f18a3f2 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000100 65258d2d ab2d98a6 242de7be 0e5a2536 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000100 792c4707 16b18391 e007d7f4 c4cbeb22 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000100 02c8ef7e a739a692 2421e133 69219eed +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000100 6e3cc3e1 25db43ec 96727f77 21ed7496 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000100 747d8e1e 932a1db3 a88a3850 f4da36b5 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000100 628b9a9e 258e5f68 65ee127b 5303581e +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000100 b67af349 02f4b3e4 6e4f30ce 61bfc6f4 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 f791fead 0377ddf6 bdc314ba f0671471 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 637910a8 bbdcc060 a1c08936 7a710668 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 dcae14d3 6776e33d 7766d0ce 408f15fa +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 c93ba8e6 7435c567 845dc071 d02ca702 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 fa54a9fa 8e7465b9 77d395ce c43bd5a4 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000100 79523499 349f6079 c3461163 179aec9f +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000100 95d8e848 6aa64376 9d703e91 fab6988a +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 c53dd017 99b3e749 3ef4f8d8 7d752c89 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000100 43ab57e1 4789da5f 87033eb8 e7ad3a50 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 faedf924 7a650192 147d4b09 9ac01939 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000100 e2042db4 dca05c16 827d333c 9251e5da +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 d1603183 18130362 9d2c9608 818ac71e +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000100 33147cbe e7b079be fc1189f5 5887bb9d +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 29b1e630 8f1af85b d903d2ed 1a082d77 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000100 c6b5525a 81d234f0 48a17017 8351d3b5 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 b8187e65 b2cb6954 e3c23052 69f5b5b4 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000100 2e87227e 7dfabedb f2933574 e7b37365 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 e3486e92 1fc15025 16d75fe1 547641e7 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000100 f8d61ae3 62f626ae 92910a34 bffbc7cc +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 5d335465 e2b59668 6f89fa9f d4e30427 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000100 52320fe3 28ba865c 883302fc 476e34d7 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 228b94db 37aa6dc2 da959a01 7d123017 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000100 5b4eee21 8252a042 21b5ed99 e08dbf9c +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 38050743 c31e8259 983e032e 713cf089 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000100 94beb06e 10012caf 03832d81 51bd03a3 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 d98e9d5e 0c316ae4 a8670426 8d941618 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000100 66e4d621 a3795a49 ac79c7d4 b3011d67 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 b6c8fb40 c1da803d 08588e78 ae5fcfad +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000100 8ae97e4b 1f8b6a28 0f7b192c b7ae7931 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000100 683e01ea 87f5779a aef054a4 8e33cb06 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000100 0dfab3ca a7ba9e3f 9c954ad6 6b613c27 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000100 6c5aea28 7690beb2 4c79a7b5 760f532a +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00010000 a9b35b10 a375ea94 9808b6c1 e50acdf9 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00010000 d97b580a 1d94d0f0 7d7c8d8a 438197d1 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 9a9c2bc3 2e00bd2f 68f86d66 fda84482 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 1c0e722c d39ac81c 32fce64e 2c076b46 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00010000 fb05a984 a71de6a4 009f985b 6d29c01a +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00010000 a4696ee0 5c0abe77 77ab1ca0 de73318b +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00010000 514becd2 01d352ed 31b84f0f 5d2e8628 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00010000 4b514f06 7566afa1 c6c71798 e0d25cda +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00010000 186f64bd 87b56de6 aba3c4bc 4d812602 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00010000 44119056 89cbd5be d7e979ab c2d59c40 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00010000 316066d3 9e963405 f0c6436d 941c5dc4 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00010000 6c79b3f9 0a16685c b27b9a10 85170546 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00010000 8e2a93a1 aab9e1dd b6b102a4 4c18cbc6 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00010000 782a17be 532c720d 2e96d480 285a912a +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00010000 89ca671f a89507f3 2eb97463 c1a49f17 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00010000 17ec9935 79683783 a11238fb 4c608198 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00010000 52de9adf 1fa60534 58b426b4 8609be54 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 ee86cc4b 116cc1dc e7e039bf 47088901 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 7fabcc11 9cb66a47 5fb49fab 5fc996a7 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 caa700a6 0325b0d7 a7cb3251 6e979ea8 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 56317ad6 505ed872 57947af4 aac1b4fa +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 46e441bc 37cf2022 d17d4e60 486c4b33 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00010000 2faee6c2 7fd2e177 c9f9c395 281f73ee +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00010000 7e5e29a7 c156a39e 30e3276b 250a765d +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 426b7127 b2aab7c7 a3e000e3 0e222cd3 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00010000 5a46397c 3dcbe508 db679125 8af9502f +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 e177c2d6 e6882c0b 7fe501d5 1955b56d +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00010000 c40d3950 8dff35f0 ca567139 f0b23503 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 b8b7824f 583c476a 9d7a73ea f640b07f +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00010000 dbe1caa4 9c7508b7 19b89657 6975a0b1 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 b9894675 fc9dbef6 8b9f01e3 35b679f8 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00010000 c04646d9 ff304cee 2563d09e c70b493c +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 0c9b3b1f 378faf60 53a737c3 8f7d0f98 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00010000 afd60479 e8d33be6 3c5d1a86 37683214 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 9f88f7c7 31ad8d98 007e7d53 647f473b +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00010000 70b61e10 af6eaf82 5ea450af b4165ed2 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 d38acb23 16435559 3c751c68 d0268fa8 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00010000 0d8f8b91 c6cbc3e8 82d1ae4b e4da5cc4 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 bf6c742e a95e65c9 ce7dc48e ff90ffc8 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00010000 d91f6594 9c18a30c 445657a6 7066d6bf +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 b9817a19 15cf8179 e39085d4 f31e8cf5 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00010000 60f6a78b 38c4d698 b09432f1 3cea4a6e +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 1cd61bb4 49c0cb69 f1d31578 16fc57df +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00010000 377e16e6 442c4847 da18f00c 0beed65c +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 24a1351d d340c934 0d24242b 8c777c1c +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00010000 b1521cc5 83135c99 97176e37 c90058e5 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00010000 672ae628 5567ee43 e1836c02 2e4c17eb +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00010000 6b9c636d acb17505 985e650b 5e7f69ae +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00010000 25e22335 13360180 3230dd73 63916012 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 01000000 247f0514 bf305a96 52a1a2a3 e57040fd +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 01000000 998b05e4 d36d64aa c626aeaf f2753c2c +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 cfcf8e8d 09c75787 71eb8a35 4ca0901c +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 9fe0465a 29a6fa34 b863a0b8 248d9b96 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 01000000 8a389ee3 1a46f0fa 79591b16 965cf03d +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 01000000 d8afe7dc 8f28277b ab017f0f e657d755 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 01000000 c0c9741f d01806cc cc3a9052 1b735f2e +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 01000000 cafb62e7 0bcab19b 830ea094 ceaa9892 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 01000000 ab9dfe3b 91d056cc 802cc19a b0b86070 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 01000000 1cea55b5 0de9fb2f 22ae0d0f da5d677c +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 01000000 6d12c1fd 88aa8db1 15feaaff 34881817 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 01000000 5ddba2e1 61a25b12 78f177c2 545a617c +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 01000000 06fae575 4f5fd1a2 46823be1 9daa0f27 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 01000000 c5ecca74 0c27e77b 5f8d6f60 1954e0e8 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 01000000 00df0908 fd4f181c a59ca029 3b64c3d5 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 01000000 fbba385e 31fadaba 7cb9fb23 d890b40a +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 01000000 51c44a4a d23387f2 6a4868ec 143e6914 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 73c9215a 067421dc a47ba7df ed17441c +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 05223e30 99614b1f 824558a0 77def08f +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 ff8ffbdf dbf27d95 656aa8de 20c486f3 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 20f060fa 5a681df4 8a74aa57 0d312560 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 c4cc387a f116d76d c73534c7 721c66fb +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 01000000 1062de7a 87531b12 0e4268ee 105fdc0c +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 01000000 6f28d09d a8f2e77b 3dd54948 728f0b06 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 03768c53 0e08e96f bb9532f7 c81f7a6e +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 01000000 232b442e 1ecc54b5 47fd72c5 660c1ed0 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 37bf7ae2 aae1c68d 6107992e 279634c8 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 01000000 d79665d2 0f079047 379ce9c3 f25e6799 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 b84df59b a7682678 3d61af8b 84eebdbd +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 01000000 f9c59ee0 b4be9850 4bb861f3 e67d08d1 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 9c521252 d6a8c73c e379f086 f89ab41a +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 01000000 b7b31df0 accc7692 f4fbaa8d 64fd8874 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 9a717564 a0cb7cdc 438b7552 b91b7820 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 01000000 918c06f2 75f0076d ce870444 c5d9860d +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 f88f9930 afb8ce53 f1a97c5a 25d31efe +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 01000000 8fd66e4c ffd160cf 2cc93b1d 2dce4692 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 5524dcaf 40762d39 d69e3b7b baba1676 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 01000000 7a7c7737 6057b9fe 7a76e3c8 b574f8fb +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 954ba403 6ba1c264 b6aed22d ee859bc4 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 01000000 14f8612e 3726a4ec c611176d ed092f61 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 e632d378 c397c684 d32f3508 a394057b +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 01000000 55a364eb 570a271b b75dda1c 0e45b60d +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 c6d6b2ce e913f457 60d4c582 7441c07a +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 01000000 57ee42ec 960b74ca 972ea934 8654c107 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 6a795ce7 a720649b 1296b189 d4e4697f +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 01000000 703f3bd8 138b897b ede3087f 43fa7a1b +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 01000000 879c7e5a 7b9cf65f 447c0371 08a9687b +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 01000000 79702e82 a0689d80 3e967f90 b48255d3 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 01000000 4e9a3827 89deff2a 7578177a b2856db2 +ars4x32 10 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 fcae6333 bd01b7df b770e892 9cb16292 +ars4x32 10 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 e5087d42 c37b8481 e34a0bf2 ffc5218b +ars4x32 10 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a5b4b75e 76b71d55 3ce3f901 7cb7c270 +ars4x32 10 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 b8572a88 3ea486ca a4297626 8aa5f727 +ars4x32 10 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 00000000 25004d41 354bfbd5 cb0d6d2a ce2866fe +ars4x32 10 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 00000000 ce1f43dc 9476d233 173e2431 1bf36ea2 +ars4x32 10 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 00000000 94216c8e 9b501d69 1b832695 c13ab5f9 +ars4x32 10 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 00000000 6a5c2f12 060bf87e 5a077a17 ae024bc6 +ars4x32 10 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 00000000 94252aa8 0444a04d dfac6fd6 977b6c1a +ars4x32 10 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 00000000 9506aa8c 6ee40879 138836aa 509ac569 +ars4x32 10 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 00000000 536fbd48 217a89ec c2476fc1 b649b851 +ars4x32 10 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 00000000 2bc4b6af 3b94ba32 67bdea20 ec9488d7 +ars4x32 10 00000000 00000000 00000000 00000001 0000ff00 00000000 00000000 00000000 23753cdb 5909cafa 72e4a6b1 03f47730 +ars4x32 10 00000000 00000000 00000000 00000100 0000ff00 00000000 00000000 00000000 990ddfe7 152ed393 eb0d9f13 2e4ea32a +ars4x32 10 00000000 00000000 00000000 00010000 0000ff00 00000000 00000000 00000000 e016741b 3783a4c4 bce1590f f08190de +ars4x32 10 00000000 00000000 00000000 01000000 0000ff00 00000000 00000000 00000000 c8c35ede 248aa584 5a0f85c9 00b3fd5b +ars4x32 10 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 0d087d6b 615667d8 51c24c95 048f31a8 +ars4x32 10 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 8594974a 10c70d1f 5ff39e10 74e7b83b +ars4x32 10 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 340e3607 f971005f e562dcac a8a8958d +ars4x32 10 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 044ac5c0 b36dbf67 56089195 c3e407cf +ars4x32 10 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 56567ace 4d5b1686 a544562d 3cc18ba8 +ars4x32 10 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 3ca2b293 a5d66ea0 31831459 926ea2fa +ars4x32 10 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 00000000 0fcd4b44 1577f2bb 8d4ee07d bc8d9195 +ars4x32 10 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 00000000 941d2950 d634b468 69c05b83 e09a08ba +ars4x32 10 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 00000000 45dd8a83 d1a6fcf6 f366a1cd dc96484f +ars4x32 10 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 00000000 e840f688 55b214ad d57918bb cc7161d0 +ars4x32 10 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 00000000 dffddb1d 119bcb50 3312aa05 647a03de +ars4x32 10 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 00000000 f6b1de15 8fffc880 78fde489 c28e8cb6 +ars4x32 10 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a9140b47 b30e6b6d 409d0abe eb61b360 +ars4x32 10 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 00000000 f886b0ab 70e2290f 5eeda35a 1b3e2f9e +ars4x32 10 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 00000000 d9f03545 5211f8b3 2a76c051 97266bf0 +ars4x32 10 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 00000000 9bbe9abe db095dd8 1b808527 9f28fee9 +ars4x32 10 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 00000000 7857bb35 9aa27628 ba02455a 81ef8e54 +ars4x32 10 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 00000000 99d67194 60448862 83329032 3f23d5dc +ars4x32 10 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 00000000 901bc81a 26ee2082 290f81f2 578edbf2 +ars4x32 10 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 00000000 a0a3f116 1511d5f8 b1e6eb53 258c6f33 +ars4x32 10 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 00000000 a814f115 a68a1479 6f615e1e da260fc3 +ars4x32 10 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 00000000 2d4f25cc da7dc5a2 12b4d343 6d004435 +ars4x32 10 00000000 00000000 00000000 000000ff 0000ff00 00000000 00000000 00000000 d6cd5c8e 70a36b18 a224f39a 74d7d2c6 +ars4x32 10 00000000 00000000 00000000 00000080 0000ff00 00000000 00000000 00000000 18dc79b1 736119d4 a52be882 78e23f3d +ars4x32 10 00000000 00000000 00000000 0000ff00 0000ff00 00000000 00000000 00000000 042ba503 6d4bc33d 530de6b6 46c83dbc +ars4x32 10 00000000 00000000 00000000 00008000 0000ff00 00000000 00000000 00000000 ac2bcf2e 6d1831d7 e748da2a 66618176 +ars4x32 10 00000000 00000000 00000000 00ff0000 0000ff00 00000000 00000000 00000000 b8177d4a 8f058469 d2d72992 7c56821a +ars4x32 10 00000000 00000000 00000000 00800000 0000ff00 00000000 00000000 00000000 cc92440a 08a79c7c b6203a24 8e81c8fa +ars4x32 10 00000000 00000000 00000000 ff000000 0000ff00 00000000 00000000 00000000 60891aaf d01bf76a 166dd985 4a59c676 +ars4x32 10 00000000 00000000 00000000 80000000 0000ff00 00000000 00000000 00000000 3b8dc262 9a3c487a b9f621ae 532cce23 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 0000ff00 00000000 00000000 00000000 a588c9fb 84c80f49 85617392 f28ffb9e +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 0000ff00 00000000 00000000 00000000 1d9391f8 d9c48b01 2015ae55 66beca09 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 0000ff00 00000000 00000000 00000000 33721436 1ddc703e 7d53720c 06616c78 +ars4x32 10 00000001 00000000 00000000 00000000 00008000 00000000 00000000 00000000 2c1fb260 4b9d3357 b5e32c52 e4d4a547 +ars4x32 10 00000100 00000000 00000000 00000000 00008000 00000000 00000000 00000000 86f801b8 5661adcd f033c12a bdecffd1 +ars4x32 10 00010000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 828a289c 779a00a0 0a4fca07 f55832eb +ars4x32 10 01000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 a8158b87 8b117489 a0163d43 4bde76fb +ars4x32 10 00000000 00000001 00000000 00000000 00008000 00000000 00000000 00000000 b649633d 8edf2b2e 224d0043 b110e51c +ars4x32 10 00000000 00000100 00000000 00000000 00008000 00000000 00000000 00000000 1a2b5294 a32ca0ed ebaad815 51e9bdf6 +ars4x32 10 00000000 00010000 00000000 00000000 00008000 00000000 00000000 00000000 5e641b42 f4e3e74c 83c74cd5 a807a6b1 +ars4x32 10 00000000 01000000 00000000 00000000 00008000 00000000 00000000 00000000 580fc53f 36b7fec4 855dab97 60157c73 +ars4x32 10 00000000 00000000 00000001 00000000 00008000 00000000 00000000 00000000 70233efb 1fba478b 8bfd17d5 2ba33d17 +ars4x32 10 00000000 00000000 00000100 00000000 00008000 00000000 00000000 00000000 289fff80 c6c4462a 50aa8868 fb07aacd +ars4x32 10 00000000 00000000 00010000 00000000 00008000 00000000 00000000 00000000 f95b9940 6de46d1d 090a417b eb7b9b22 +ars4x32 10 00000000 00000000 01000000 00000000 00008000 00000000 00000000 00000000 8693b12b 5605ca40 3639dbb6 773154ea +ars4x32 10 00000000 00000000 00000000 00000001 00008000 00000000 00000000 00000000 b4f37059 b7c5e71a 976e0084 ce535b06 +ars4x32 10 00000000 00000000 00000000 00000100 00008000 00000000 00000000 00000000 67089a5f 0f7499d4 ba3e5df8 65b5d616 +ars4x32 10 00000000 00000000 00000000 00010000 00008000 00000000 00000000 00000000 3030083c 44c4fc9c de89336a 56c3d028 +ars4x32 10 00000000 00000000 00000000 01000000 00008000 00000000 00000000 00000000 98e4d84d 0aa677ed 7eef5d57 8ec60064 +ars4x32 10 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 00000000 ead6b0d8 15c4a87c 9fd307c5 c59222ba +ars4x32 10 00008000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 40067896 8c980481 dd9b28cc 1fe0a1d7 +ars4x32 10 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 a7530620 85baf1ab f8554105 3f28debf +ars4x32 10 00800000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 c3e96d56 3528f63e 69745e92 093df66a +ars4x32 10 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 0a7b4073 2d90e83d 5c6403ce 9138f700 +ars4x32 10 80000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 48cda39c cf436caa 256ce979 42e2007e +ars4x32 10 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 00000000 28c02311 f61730f1 f777e987 6633e363 +ars4x32 10 00000000 00000080 00000000 00000000 00008000 00000000 00000000 00000000 36c60b34 95849f47 be3eadd5 15621908 +ars4x32 10 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 00000000 ad9c0e68 d937938e d51ff077 d9248807 +ars4x32 10 00000000 00008000 00000000 00000000 00008000 00000000 00000000 00000000 8ed38874 e59f5903 4637afa1 9385dc8f +ars4x32 10 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 00000000 c6329fb2 c441156d 431cd7e6 acbf16dc +ars4x32 10 00000000 00800000 00000000 00000000 00008000 00000000 00000000 00000000 7ac3e4e4 fb235550 28eef786 5973a922 +ars4x32 10 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 00000000 1bf649d1 22e1d20f 909dac92 a0841b86 +ars4x32 10 00000000 80000000 00000000 00000000 00008000 00000000 00000000 00000000 038df3cf a92f5ed0 d9d9b196 7e30dc75 +ars4x32 10 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 00000000 ae62b3e4 8f7fd299 3e8a3331 dfbf97cf +ars4x32 10 00000000 00000000 00000080 00000000 00008000 00000000 00000000 00000000 6e8b36ac 00312a90 0627f1b4 830909ec +ars4x32 10 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 00000000 d5f57993 ba3427b2 494662f7 1540d20c +ars4x32 10 00000000 00000000 00008000 00000000 00008000 00000000 00000000 00000000 77336a3b 29db5f6e 14c3529f 2fe84106 +ars4x32 10 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 00000000 69f5c5d1 74e9e964 b34f84ea 33c005f7 +ars4x32 10 00000000 00000000 00800000 00000000 00008000 00000000 00000000 00000000 4169325f a27e38d6 a840fdab f6e263c4 +ars4x32 10 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 00000000 6ba6529c 060468f4 f75739df d14b414a +ars4x32 10 00000000 00000000 80000000 00000000 00008000 00000000 00000000 00000000 f9e1dbfa 4629392b 40c440ae b150dc10 +ars4x32 10 00000000 00000000 00000000 000000ff 00008000 00000000 00000000 00000000 c3bfd4e5 49f163df 982dc34d 3ea45d73 +ars4x32 10 00000000 00000000 00000000 00000080 00008000 00000000 00000000 00000000 0b1d46a4 0dc87e22 51b31851 e67a0640 +ars4x32 10 00000000 00000000 00000000 0000ff00 00008000 00000000 00000000 00000000 b3947949 cda68ed4 5b41245a fec3cc4d +ars4x32 10 00000000 00000000 00000000 00008000 00008000 00000000 00000000 00000000 f0b14a4d 9d6bc368 41291f18 c7732ebb +ars4x32 10 00000000 00000000 00000000 00ff0000 00008000 00000000 00000000 00000000 5d14a04a 5fd91a6c 24f2daa6 9e5bee56 +ars4x32 10 00000000 00000000 00000000 00800000 00008000 00000000 00000000 00000000 e1da803f f714cd82 86c69275 fa85929a +ars4x32 10 00000000 00000000 00000000 ff000000 00008000 00000000 00000000 00000000 24e1c392 e0687318 b80eda4b 4d779c7a +ars4x32 10 00000000 00000000 00000000 80000000 00008000 00000000 00000000 00000000 229b4480 a8d51c8f aea527fd 2061cf50 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00008000 00000000 00000000 00000000 1541fd48 266479ea d562ddaf b046946a +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00008000 00000000 00000000 00000000 51e6885b d82e4842 6bc6f3ef 84348129 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00008000 00000000 00000000 00000000 5069213d c381cd8d 6636cc72 f4661fd7 +ars4x32 10 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 e88443ad 68c1e6a7 1bcf3aec 1dd200a7 +ars4x32 10 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 cae83bfa 673e52f0 678d80ac 703c57b3 +ars4x32 10 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 93656c91 ebe4c141 94d82984 dbe7b4c1 +ars4x32 10 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 46ce0ab3 e697a69b de54a604 18a05322 +ars4x32 10 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 00000000 7b659b84 7ac2102a 0ef11f37 fb9226a2 +ars4x32 10 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 00000000 cdba9d6e a28a10f0 bd9118b9 fbcc0c7b +ars4x32 10 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 00000000 933021e6 11537841 93256204 e191ed2c +ars4x32 10 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0fb34cf4 a9f8bfc8 32abc499 66ba599c +ars4x32 10 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 00000000 c3b56dd9 1150aa54 9f5fad4f 996e43d9 +ars4x32 10 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 00000000 76c3605b e31e707c 34408c3e 1c06c78e +ars4x32 10 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 00000000 233e3c15 fae95405 f3cb0fd7 4906d997 +ars4x32 10 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 00000000 704b0da7 f6b4e9f5 ac79ea80 5d2b16d4 +ars4x32 10 00000000 00000000 00000000 00000001 00ff0000 00000000 00000000 00000000 52e9c5c4 bdea19d5 f9f4130b 82c74a8b +ars4x32 10 00000000 00000000 00000000 00000100 00ff0000 00000000 00000000 00000000 28250c8e 091815d9 f9440858 ba50a1bb +ars4x32 10 00000000 00000000 00000000 00010000 00ff0000 00000000 00000000 00000000 00aa3398 1593c82b 01f90307 4da20b88 +ars4x32 10 00000000 00000000 00000000 01000000 00ff0000 00000000 00000000 00000000 14d27e46 c6e0deee 6246a1ab 544ae3c5 +ars4x32 10 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 38ad9717 fbede586 a6fb65ed df1c9f5b +ars4x32 10 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 9b6c7482 25032317 b78aa504 5045caf2 +ars4x32 10 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 7252d59d f4f4d769 b9149134 3d4684c9 +ars4x32 10 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 873abe0e 5201f3f1 30cdb3cc 8e715ac2 +ars4x32 10 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0cd9f4b7 5e3f61b3 c2bbe84a ed11a097 +ars4x32 10 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 9168e4e8 a189d9cc 4a788569 d53b415a +ars4x32 10 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 00000000 9f99a1d1 b9f6076b 05a627e8 b064124d +ars4x32 10 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 00000000 b5891ac7 98593d8a 5f966b3c 466c6ae3 +ars4x32 10 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 00000000 7f8d8a7a 037a7275 cbb4f9bf a61e2b9c +ars4x32 10 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 00000000 b3b7b20d 2d87fe1d b98016a3 ae8e4ce1 +ars4x32 10 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 00000000 534bd7f1 72934711 4171cfcb 81ddaad3 +ars4x32 10 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 00000000 42d534bd bcae68e8 dea7289e 1ccc31d3 +ars4x32 10 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 00000000 c51854f1 ef3fb610 aab3ddc8 06cd29a6 +ars4x32 10 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 00000000 a6f81ddd f812ed3f 0b14cb66 2d74d5af +ars4x32 10 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 00000000 02b9e693 e2daeb40 38c3c0d1 b6e1b678 +ars4x32 10 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 00000000 619299f7 5d418257 05a4b287 7d64ec86 +ars4x32 10 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 00000000 54abe441 1e0ca52c 9697d390 ec49403c +ars4x32 10 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 00000000 45f4cd80 081e315a 7642ae2a 759b45c1 +ars4x32 10 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 00000000 12aa95e9 ce20986d 7736572f 632973d1 +ars4x32 10 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 00000000 0c51b3d6 bfd21432 720ef22f a8eb9b11 +ars4x32 10 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 00000000 e5d77df0 cc30d6f1 90a45f1a e82f6893 +ars4x32 10 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 00000000 6ad6d549 22c09b7e 11252c9e 952d6aff +ars4x32 10 00000000 00000000 00000000 000000ff 00ff0000 00000000 00000000 00000000 ee477839 37c32d1a 48552f71 b890ec4b +ars4x32 10 00000000 00000000 00000000 00000080 00ff0000 00000000 00000000 00000000 4f7f8639 5db444c4 ef8f4605 f1556a83 +ars4x32 10 00000000 00000000 00000000 0000ff00 00ff0000 00000000 00000000 00000000 b7661dc6 4d43a593 549d1cfe cfc04369 +ars4x32 10 00000000 00000000 00000000 00008000 00ff0000 00000000 00000000 00000000 de625f52 02b261c4 effc7c7b 91cb13e7 +ars4x32 10 00000000 00000000 00000000 00ff0000 00ff0000 00000000 00000000 00000000 a1c7b8bd 6d64b2f8 d1298c96 e130ab7b +ars4x32 10 00000000 00000000 00000000 00800000 00ff0000 00000000 00000000 00000000 662f82fa 1800add6 f8312469 4736a74f +ars4x32 10 00000000 00000000 00000000 ff000000 00ff0000 00000000 00000000 00000000 5911e758 97dae4b4 6af2b7bf 150f6d1b +ars4x32 10 00000000 00000000 00000000 80000000 00ff0000 00000000 00000000 00000000 3488d858 3e2bbad6 40c64989 bab1e0e5 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00ff0000 00000000 00000000 00000000 dbe2cf83 80c2228c 2c1e363d e5d927c0 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00ff0000 00000000 00000000 00000000 847c9587 c42cd2d6 451f9848 6c289780 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00ff0000 00000000 00000000 00000000 9efd8b55 0a5d400e 3a07864b db6eed91 +ars4x32 10 00000001 00000000 00000000 00000000 00800000 00000000 00000000 00000000 db5ef4e1 e16048d4 78b14d68 33a970c7 +ars4x32 10 00000100 00000000 00000000 00000000 00800000 00000000 00000000 00000000 1b61f324 2fa9127a daf45f23 2281de23 +ars4x32 10 00010000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 e527ad88 66072a45 cb92483c 5bca41c9 +ars4x32 10 01000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 0df61f3f b1b08c54 c7570612 1103be2c +ars4x32 10 00000000 00000001 00000000 00000000 00800000 00000000 00000000 00000000 e4ec6165 605e55f8 44fff6e8 b971033f +ars4x32 10 00000000 00000100 00000000 00000000 00800000 00000000 00000000 00000000 c2569c0f 04a96b58 b4eac11f 6f477e54 +ars4x32 10 00000000 00010000 00000000 00000000 00800000 00000000 00000000 00000000 9867ce58 13167afc 3259d630 73b5cb83 +ars4x32 10 00000000 01000000 00000000 00000000 00800000 00000000 00000000 00000000 06ba859e b8d588e4 ea7f3b8e 3b1d1b79 +ars4x32 10 00000000 00000000 00000001 00000000 00800000 00000000 00000000 00000000 c04d021b 3518ba1e 3f729c0a 2cb2d2f2 +ars4x32 10 00000000 00000000 00000100 00000000 00800000 00000000 00000000 00000000 830e7ae7 eadc30a7 4d9812dc 6b43aa06 +ars4x32 10 00000000 00000000 00010000 00000000 00800000 00000000 00000000 00000000 b08691da 09b5e267 73cbee0d 57194cef +ars4x32 10 00000000 00000000 01000000 00000000 00800000 00000000 00000000 00000000 e03fbf4a eaaf4354 a5f21afc 0b24275a +ars4x32 10 00000000 00000000 00000000 00000001 00800000 00000000 00000000 00000000 4085411e 55ddeccd 11721c28 61944ef3 +ars4x32 10 00000000 00000000 00000000 00000100 00800000 00000000 00000000 00000000 31d2bb4c db351c79 ed94d0e6 b06757ac +ars4x32 10 00000000 00000000 00000000 00010000 00800000 00000000 00000000 00000000 b948086e 5a94b824 1dab6a09 7ab43abb +ars4x32 10 00000000 00000000 00000000 01000000 00800000 00000000 00000000 00000000 c2d6fbef 6f1ad683 6e50b436 8f6e0473 +ars4x32 10 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 00000000 7c0ff76b c44db90a c7495841 3d14b195 +ars4x32 10 00008000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 646271c9 b5f201f1 6a854d67 50292d43 +ars4x32 10 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 d45d3917 70ffcfb0 2ff6010e 9af9b891 +ars4x32 10 00800000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 cf7aac1c 76b5a514 fcfcbe40 2bbc5b50 +ars4x32 10 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 fca66d94 0f4feb3f e0ab1b45 536472a3 +ars4x32 10 80000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 2090d2e1 fe76252c 0a3241d7 1898c552 +ars4x32 10 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 00000000 8f1a05f3 eb0d950f 5e10ac82 d7d98359 +ars4x32 10 00000000 00000080 00000000 00000000 00800000 00000000 00000000 00000000 e9c204bf bb484da9 7025ed88 c41eb824 +ars4x32 10 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 00000000 e3f0c873 0632085c fc75c879 88318a3d +ars4x32 10 00000000 00008000 00000000 00000000 00800000 00000000 00000000 00000000 bcfed823 8ee4cee9 78d39ab7 f915b651 +ars4x32 10 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 00000000 95f99dbd 2abddccb 6ac36720 2ac62033 +ars4x32 10 00000000 00800000 00000000 00000000 00800000 00000000 00000000 00000000 f46eca4a 488c1f4d fce17f35 0e29f371 +ars4x32 10 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 00000000 ed90442c 193ae115 c99d70af 9dbae328 +ars4x32 10 00000000 80000000 00000000 00000000 00800000 00000000 00000000 00000000 004e80fe 9b3a9cf4 1ace505d aec4050b +ars4x32 10 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 00000000 859f6028 433d3b58 85f84904 609079a2 +ars4x32 10 00000000 00000000 00000080 00000000 00800000 00000000 00000000 00000000 37ab8b47 fd603f7d b3f51703 1df6faee +ars4x32 10 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 00000000 d12ca292 4e8eafd6 7720d20b afe3dc6d +ars4x32 10 00000000 00000000 00008000 00000000 00800000 00000000 00000000 00000000 3958d33c 251761e9 2a2508e8 3ad41a75 +ars4x32 10 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 00000000 63b226bc 9f57beb8 0a08b6d2 deb4184f +ars4x32 10 00000000 00000000 00800000 00000000 00800000 00000000 00000000 00000000 f1762304 babb3dad 9e68f4d9 ede3754a +ars4x32 10 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 00000000 459d968c 6566e40b 42960e14 d220224b +ars4x32 10 00000000 00000000 80000000 00000000 00800000 00000000 00000000 00000000 bc82e8db 4745f1f7 834f9f5f 423b69b5 +ars4x32 10 00000000 00000000 00000000 000000ff 00800000 00000000 00000000 00000000 d4ac8f96 1e5ce164 202b2891 c1f1cb85 +ars4x32 10 00000000 00000000 00000000 00000080 00800000 00000000 00000000 00000000 555a3182 851f8f14 840f6e67 ff50f9bd +ars4x32 10 00000000 00000000 00000000 0000ff00 00800000 00000000 00000000 00000000 c81cd8cf 39a0b6d9 707fb56c 14e285e5 +ars4x32 10 00000000 00000000 00000000 00008000 00800000 00000000 00000000 00000000 703f8143 6a9d4f17 1ce6b2d1 8a5a82ae +ars4x32 10 00000000 00000000 00000000 00ff0000 00800000 00000000 00000000 00000000 bd3214ef 868380c4 90c06b8a 67ce86ef +ars4x32 10 00000000 00000000 00000000 00800000 00800000 00000000 00000000 00000000 b49e71ab 6320e3ef 54ed49fd fe98e25e +ars4x32 10 00000000 00000000 00000000 ff000000 00800000 00000000 00000000 00000000 ab7c9f9a 309cd4ef 72c641eb 8aaf2ef4 +ars4x32 10 00000000 00000000 00000000 80000000 00800000 00000000 00000000 00000000 97cc0d1a 620b1043 84c6dfe1 931f395e +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00800000 00000000 00000000 00000000 b7ca7f47 66e13159 047c8bec a45d8db0 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00800000 00000000 00000000 00000000 67e23eb6 be4231c7 3fa98062 fe04bd78 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00800000 00000000 00000000 00000000 5fa8976f f69a3512 1774b3f4 80395e73 +ars4x32 10 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 f7d2aa28 e640a1ec c2d8b754 41848c0e +ars4x32 10 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 410b55c1 7bf60178 37d78113 db9f0b23 +ars4x32 10 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 69feb9d9 7ddb8fee 793d78d1 cd2aeb75 +ars4x32 10 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 3b6e6059 c910b0f8 7a39c697 41336a36 +ars4x32 10 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 00000000 fd1b6a45 cb542c48 02229b0d 290a52ba +ars4x32 10 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 00000000 c3d2e857 0441fd33 973d189f 0f2e74cd +ars4x32 10 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 00000000 409d2af9 5b3bf6c6 67242f7d 0a4ac554 +ars4x32 10 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 00000000 ce3e9c59 6f490eef af582f73 466d8fc3 +ars4x32 10 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 00000000 c63a6987 171d2147 0a028b8a 9357d8da +ars4x32 10 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 00000000 457d09fb ad6adc96 cf7e989a 18de088a +ars4x32 10 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 00000000 ca559ca2 a52c8634 b9f259f0 eb45d905 +ars4x32 10 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 00000000 6d9c800b 96db29c0 68997d47 85629ce3 +ars4x32 10 00000000 00000000 00000000 00000001 ff000000 00000000 00000000 00000000 385760c0 d16f0faa 23cb7b10 5b7684fa +ars4x32 10 00000000 00000000 00000000 00000100 ff000000 00000000 00000000 00000000 030f70d6 a2276f19 aa0303a5 9fff9373 +ars4x32 10 00000000 00000000 00000000 00010000 ff000000 00000000 00000000 00000000 a32dd276 66689272 7c93a697 5535e13e +ars4x32 10 00000000 00000000 00000000 01000000 ff000000 00000000 00000000 00000000 4c882120 42e1caa4 77d94eaa 40fb7d85 +ars4x32 10 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 68af87e5 736298dc ffd70c1e cd7fdc20 +ars4x32 10 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 06877113 0f14e185 97f9e55a b4eaa91f +ars4x32 10 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 b7a90a79 29557e2e 2859cc17 a9342fcb +ars4x32 10 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 124f8d4f 9db2acdf ca0bbb11 3d23283a +ars4x32 10 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 5df2a345 ca3497ca 637ff8f2 42ce8160 +ars4x32 10 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 4c9688b5 de560a88 153c9b25 6de2906c +ars4x32 10 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 00000000 a4894ec2 b445b0d1 5ce41862 80de31ec +ars4x32 10 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 00000000 7ce5a59c 61f94b72 6cbf8c5d 5ab5b2bd +ars4x32 10 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 00000000 4ebc3279 09240e4b a07646df 005db721 +ars4x32 10 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 00000000 387cd8ae ec75b073 76f47ec8 fcd3bde8 +ars4x32 10 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 00000000 042a366e 12677620 bb39008c 14397c4a +ars4x32 10 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 00000000 b5da689c 879191e2 57b3b2dc cceba406 +ars4x32 10 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 00000000 93d66392 592f6cc4 95102dad f11423e0 +ars4x32 10 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 00000000 efdb58c1 669ba5f2 63e548f7 4fd85d31 +ars4x32 10 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 00000000 c55a255a 6bb3527f 36f5bd81 b732a889 +ars4x32 10 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 00000000 9642acba 516b0c77 6616d37a 38363d9b +ars4x32 10 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 00000000 fec0b5c5 e1eb7b36 d67dbc8d ed6b2fcc +ars4x32 10 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 00000000 ceaafa67 bb785bf6 db255932 f5fce949 +ars4x32 10 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 00000000 81ca13cf 1c5aa438 5fbf0aeb f8ea76de +ars4x32 10 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 00000000 ba833116 fe7eaaa0 3fe9eff9 0de94178 +ars4x32 10 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 00000000 4e586f11 1e4a7a42 111fae69 d48e5612 +ars4x32 10 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 00000000 44c18d42 65604a51 a44b5072 8641ca7a +ars4x32 10 00000000 00000000 00000000 000000ff ff000000 00000000 00000000 00000000 ce91dd77 a6a45786 ea5cf870 a8de2c9f +ars4x32 10 00000000 00000000 00000000 00000080 ff000000 00000000 00000000 00000000 f05bd698 29284180 78c6f669 1b5cf6e5 +ars4x32 10 00000000 00000000 00000000 0000ff00 ff000000 00000000 00000000 00000000 13a510c1 7ec43c0a 51e6456c 2fb6d9b8 +ars4x32 10 00000000 00000000 00000000 00008000 ff000000 00000000 00000000 00000000 34b3f6ad e44fda40 74d440b8 cb8b80d0 +ars4x32 10 00000000 00000000 00000000 00ff0000 ff000000 00000000 00000000 00000000 16bfac7f ba4437e0 c8aa863a 6bc8b15f +ars4x32 10 00000000 00000000 00000000 00800000 ff000000 00000000 00000000 00000000 4da07234 8f72fe3d a4c2e8dc 94bdd3ac +ars4x32 10 00000000 00000000 00000000 ff000000 ff000000 00000000 00000000 00000000 f468dfc1 6e0f1e95 26798846 5154122e +ars4x32 10 00000000 00000000 00000000 80000000 ff000000 00000000 00000000 00000000 5fe2c6c1 af61ba83 457a3f73 a14a3fad +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 ff000000 00000000 00000000 00000000 b68c8a72 adb26d11 56ac3f0b 0ff6bd07 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec ff000000 00000000 00000000 00000000 7791be90 afae34fe 929d2b8e b154905a +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 ff000000 00000000 00000000 00000000 d9c97667 c152434b dc1464bd e178171a +ars4x32 10 00000001 00000000 00000000 00000000 80000000 00000000 00000000 00000000 97ff5cd8 4861db8c 56b30095 393ea1b2 +ars4x32 10 00000100 00000000 00000000 00000000 80000000 00000000 00000000 00000000 d79f27d2 8c0b82f2 032b61a7 325736af +ars4x32 10 00010000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 6d8a2815 12c7ae92 c104fdf1 cffe9065 +ars4x32 10 01000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 4a2e289e 6022c434 a9d05f0f b6164120 +ars4x32 10 00000000 00000001 00000000 00000000 80000000 00000000 00000000 00000000 a242a3c1 2d12adde 35c2700c 381ac0cb +ars4x32 10 00000000 00000100 00000000 00000000 80000000 00000000 00000000 00000000 e0570553 5f8edf6c a744ed01 9b38eefd +ars4x32 10 00000000 00010000 00000000 00000000 80000000 00000000 00000000 00000000 c278a1e4 30fdb3e6 87758dc9 407e25fc +ars4x32 10 00000000 01000000 00000000 00000000 80000000 00000000 00000000 00000000 780d148b 118fcdea b603d27f 02207e40 +ars4x32 10 00000000 00000000 00000001 00000000 80000000 00000000 00000000 00000000 a2bda148 cc53600a 1726339f 72104df8 +ars4x32 10 00000000 00000000 00000100 00000000 80000000 00000000 00000000 00000000 0729f5bd cd715d46 76d7deb7 319cffb6 +ars4x32 10 00000000 00000000 00010000 00000000 80000000 00000000 00000000 00000000 8accf3dc 9cf6976f 95f4991a 366a0b57 +ars4x32 10 00000000 00000000 01000000 00000000 80000000 00000000 00000000 00000000 d9f99c22 aba10b6f 409410a4 46579319 +ars4x32 10 00000000 00000000 00000000 00000001 80000000 00000000 00000000 00000000 909887b1 6f7554d8 37e260c5 daa0f112 +ars4x32 10 00000000 00000000 00000000 00000100 80000000 00000000 00000000 00000000 f74bd90d 935d6769 0251c6dc 8c756b12 +ars4x32 10 00000000 00000000 00000000 00010000 80000000 00000000 00000000 00000000 36c4bb4a 068834b6 8658e86e e63b17c5 +ars4x32 10 00000000 00000000 00000000 01000000 80000000 00000000 00000000 00000000 fff5db04 c71a6e74 6fef623c 8cbd1065 +ars4x32 10 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 00000000 5494ff8e b037ba29 79cc7007 586b197a +ars4x32 10 00008000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00ec0fcb 778eb20e aab8faf1 e35ac3cf +ars4x32 10 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 a917f1ed 8159329a de9788bf 97e4bbe8 +ars4x32 10 00800000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 25906cb3 7d803d3f 4ba100f5 e89d9852 +ars4x32 10 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 d82188ad 229109e3 b4981afa 5ab8891d +ars4x32 10 80000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 adbdf443 3fb1ffa4 1fa26427 d492932f +ars4x32 10 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 00000000 e8fa0690 193087aa f5ed6379 c99b78ba +ars4x32 10 00000000 00000080 00000000 00000000 80000000 00000000 00000000 00000000 c967dfa9 e083aa64 ead2c7b7 d9ea26b1 +ars4x32 10 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 00000000 5dcf7365 5afcb957 df110c18 cbbeb426 +ars4x32 10 00000000 00008000 00000000 00000000 80000000 00000000 00000000 00000000 d5e940e2 434e3b1e 2f128f6f 5451dfc3 +ars4x32 10 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 00000000 f1794662 b301ae7d a2f464e6 997dd9f6 +ars4x32 10 00000000 00800000 00000000 00000000 80000000 00000000 00000000 00000000 c3aef88e f1d5ac85 d42a0f21 7cb0f3c9 +ars4x32 10 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 00000000 92c61834 8ea5053f 102d04af 61223c6b +ars4x32 10 00000000 80000000 00000000 00000000 80000000 00000000 00000000 00000000 89182370 ca6696b6 cd760b2c e0a3a674 +ars4x32 10 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 00000000 da2c51c8 364eaf31 254fe3c1 ac396019 +ars4x32 10 00000000 00000000 00000080 00000000 80000000 00000000 00000000 00000000 a07f2985 6feb731a af6bbb05 aee2e670 +ars4x32 10 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 00000000 0ed8bd0b d0b7bd3c 516bad61 c187b5d2 +ars4x32 10 00000000 00000000 00008000 00000000 80000000 00000000 00000000 00000000 e2fdfa30 5630a1f2 2d4cba2f a04055ef +ars4x32 10 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 00000000 fa4f81be 84a8f047 770751fe 6a4c9e83 +ars4x32 10 00000000 00000000 00800000 00000000 80000000 00000000 00000000 00000000 879c5ee9 c172703d fbbdcac4 03a9c0e3 +ars4x32 10 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 00000000 6ae3fe71 5adb4c66 79a32ba4 f4be6b5e +ars4x32 10 00000000 00000000 80000000 00000000 80000000 00000000 00000000 00000000 f40b0b8e eba53eb5 d8c08069 e2927be8 +ars4x32 10 00000000 00000000 00000000 000000ff 80000000 00000000 00000000 00000000 53d9cee3 cece393c ed6574f2 ebe560ef +ars4x32 10 00000000 00000000 00000000 00000080 80000000 00000000 00000000 00000000 f78c13c7 8c0b88e3 c3173a73 929c7e82 +ars4x32 10 00000000 00000000 00000000 0000ff00 80000000 00000000 00000000 00000000 ec276a98 a5c64f44 ad7dfa39 47bc1a2d +ars4x32 10 00000000 00000000 00000000 00008000 80000000 00000000 00000000 00000000 cc98cd21 2513088c 1ff85f6d 9dddd2af +ars4x32 10 00000000 00000000 00000000 00ff0000 80000000 00000000 00000000 00000000 1b445988 88b28e58 1f32ac9f d878b6b6 +ars4x32 10 00000000 00000000 00000000 00800000 80000000 00000000 00000000 00000000 906819f6 9f13ac1c 776dee54 23b41c34 +ars4x32 10 00000000 00000000 00000000 ff000000 80000000 00000000 00000000 00000000 57489a6c 3a733797 a402c7c6 f7072556 +ars4x32 10 00000000 00000000 00000000 80000000 80000000 00000000 00000000 00000000 a978be96 d415dec9 0c39bc27 3042b2f9 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 80000000 00000000 00000000 00000000 4760415d 0a8eb41e e617271e ce05bbb2 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 80000000 00000000 00000000 00000000 a1ae2eab 1339f173 ed81008d b1f714e0 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 80000000 00000000 00000000 00000000 18c45445 15a58d99 fdb3876d eb1f5c04 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 1fa1e630 4d2f894e 6ba89d45 96dc9df0 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 1516864d 4eb88d23 b222d70e 6fb68e8b +ars4x32 10 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 5ce4a88a 23da0556 daac7f67 ed800fd1 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 828cc9d2 fb57de07 e8de59fb 2f90cec1 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 00000000 77b148c1 ed3007c2 0651b6d7 b722ec45 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 00000000 b6c6c579 e5d1451f 640dd587 fa5ae330 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 00000000 5a28db11 36678ef2 930bbcf1 23cd2392 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 00000000 59760264 41199d8c efbdd3c5 966525d3 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 00000000 a2077d7d 8ae1cee9 14205b74 90e49ed9 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 00000000 a34202b9 02f0238b 48f1f511 f4b9ae4e +ars4x32 10 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 00000000 b8c1c0ea 3330fb90 f9947b9c a4a72574 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 00000000 e1f71d06 65fbb183 99769e9c eac7f1e4 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 000000ff 00000000 00000000 c16e3334 d796c741 eb5bb0dd 8a879ac3 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 000000ff 00000000 00000000 f53b562d 1dfbd78f d3d968db fc5401be +ars4x32 10 00000000 00000000 00000000 00010000 00000000 000000ff 00000000 00000000 b441bfb3 540c411d e0bc213c db49576d +ars4x32 10 00000000 00000000 00000000 01000000 00000000 000000ff 00000000 00000000 a768eabd d0a8a1d9 8d9f363f 4ddf49ff +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2b692d50 cddf4bd2 6930bca7 0e0d70fc +ars4x32 10 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 b33c77e3 14c35ce1 52c76d19 7f569a77 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 e68e0fa7 8d78692c 613fd85d b6e15efd +ars4x32 10 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 abbe0880 b1cd7217 7d55ce46 797a0862 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 dae5f10d 4ec8e1fc 3f268cf4 8c2c2ad4 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 84686cd0 a7ae82ec ff25ac79 f1dc3088 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 00000000 b93e4064 9a91e466 07e0e82b b1117cde +ars4x32 10 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 00000000 10db4555 815d4eb3 5d25295e f2a4f297 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 00000000 703414c0 cc52320c b66fcfe8 7ccf471f +ars4x32 10 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 00000000 a6a4b22b 0957d232 ebcafef3 476f5f82 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 00000000 3e79b79a 29b72295 0aac8aab 1df135ca +ars4x32 10 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 00000000 6c25c4a2 ded9637d b0062115 6f168a11 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 00000000 c0268b28 4baf1fd9 75522421 c70141be +ars4x32 10 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 00000000 2b0db51a e6e972fa c3db0c71 cf011a1b +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 00000000 526dcc62 57cc3103 5325c82d 8d0d2443 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 00000000 4d40d69f 70795c84 43806a1a 026f7148 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 00000000 fc9ec47e 9da0186c 690fbed9 e779d32d +ars4x32 10 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 00000000 adc1e763 48657940 f821733b 94466063 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 00000000 88313a3b 434321fd 704c3a37 1de3ff37 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 00000000 f8bb1fee 069fbde8 aea1be43 7bdfc1ea +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 00000000 fcf27c4c 51054364 a2e8947c 4fe3d72d +ars4x32 10 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 00000000 d0f8f28a f8816738 3c514ce7 6c34bb66 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 000000ff 00000000 00000000 fd2c89e4 f10f1080 a4ae9678 a4d6d514 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 000000ff 00000000 00000000 b9947f21 66735588 8fb143dc e7cc086c +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 000000ff 00000000 00000000 bc57f7b9 fbdd225d 327ce0ad fa0057f8 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 000000ff 00000000 00000000 d330aa24 d9b8c90c f33a9aea dcce91d0 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 000000ff 00000000 00000000 cce8a8bd e6d58698 ff2ef9ed 45c0ec86 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 000000ff 00000000 00000000 1c2a1a5c a03f2a9a 90488834 d9d22878 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 000000ff 00000000 00000000 f50918b0 1abc837e 63f787ca 4c3d21b0 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 000000ff 00000000 00000000 d3b48412 00431173 fc381c89 92f0d299 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 000000ff 00000000 00000000 59e6ed04 e72dee88 43a0c869 f80b6f82 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 000000ff 00000000 00000000 8ba8b541 1e8abc5e 2fb4912b 4d0f6dc1 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 000000ff 00000000 00000000 8b10b9c9 b977f852 d9bd28bf 12d77e54 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000080 00000000 00000000 110d6be7 a16da48b a3f265d0 b0569d26 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000080 00000000 00000000 52ca46a7 a18bb1f4 20ea22e7 128f8393 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 8c87ef25 27cba360 f0a8fc01 40c75256 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 5a5b8507 eb4ffb4b 398550d2 48ddd688 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000080 00000000 00000000 b33cee09 c18b0735 b1498f38 d5398d27 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000080 00000000 00000000 a17c32c1 8c2671c0 b2015ac4 209eabe2 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000080 00000000 00000000 688f798b 46fbe8bf 9dee92d7 054dffbd +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000080 00000000 00000000 bb8c5b61 041a0b85 c4560614 8c04ec9d +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000080 00000000 00000000 213669a9 29989053 7223d88d 000e3388 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000080 00000000 00000000 6832e31a 2bb5aa98 94ec72d5 84dabefe +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000080 00000000 00000000 aa365f18 72a90916 7b72d26a 94d8b664 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000080 00000000 00000000 ad54e76b 62d5fa01 c1d1575d 0b65f816 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000080 00000000 00000000 c233074c f26bc2e3 848a0d7f 50133fbb +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000080 00000000 00000000 70ebbaf0 4f6e7229 782f099f 2b72b631 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000080 00000000 00000000 33a62ae4 7c6eac1e b920fb8a 74f74c1d +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000080 00000000 00000000 af0a5b7d 43519cd0 ea3cda2f f740241e +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 00000000 e47439e6 ba0ebd9a ec544e8f 10895388 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 33f4223d 998b9cee 918cbcd8 bdc679c9 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 8e93e529 ae3eec51 464b8779 bf89010e +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 0abcea55 2b8b74d1 eec1f021 3446b5a7 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 e774b3db e0d8f2cb 684b504b 8ba60f5f +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 3b05baca afc7aaa9 9b3892d1 9abe1d26 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 00000000 2f6c73a2 972ed4cc 41d15bbf bc036df0 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000080 00000000 00000000 3f401a57 c43fd94c d3e0d78e 7994b848 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 00000000 1bbc1c53 2bb7665a 338c238d ff975267 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000080 00000000 00000000 2cdd6893 02156110 1c814ecf 6ec3f330 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 00000000 4ce62ccd 7f6a5d2e da2c1c9b 1ce2b248 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000080 00000000 00000000 220c8cad a5af436f 64e11e9f 391581d9 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 00000000 48b5dabf df94481a 6ed3bcf6 34ad0952 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000080 00000000 00000000 9f17100b 3f5315e4 793b6995 11cc7178 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 00000000 2e6da599 a33aa282 a52c8fe8 82d587cc +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000080 00000000 00000000 961099d8 a3e1ea0f d1c06f29 3576caf6 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 00000000 f3f8264a 0f8812fd 72cec900 4d46f983 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000080 00000000 00000000 150b661c d645dc30 58cee969 ffc65955 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 00000000 497d867a 04f9bdc0 01fdb685 b54bff6f +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000080 00000000 00000000 7c2e189a 58781269 a87399db 364b24ee +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 00000000 7ec65f86 adc1d28f bb957d72 d9e41689 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000080 00000000 00000000 87448d14 3b1715c9 586b3fe5 61b33657 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000080 00000000 00000000 3ca3750f 41213709 b4a9c050 a2802c9d +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000080 00000000 00000000 3e7d1880 846ca7a8 5b4d718b ec3c4b4e +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000080 00000000 00000000 aa65a024 a1f6e3e1 1e50300b 81b2fe34 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000080 00000000 00000000 6ea04ddf 68274c2d 00e8fe18 1e72c32a +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000080 00000000 00000000 091763e9 95c787c6 795f2454 7cde8a2b +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000080 00000000 00000000 f7eeae5f 4741b188 fce905e1 135baaa7 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000080 00000000 00000000 b1f3bfc9 6cb39ec6 a3c738ea a04985eb +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000080 00000000 00000000 590a08dd 916022c4 adc06097 48303077 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000080 00000000 00000000 64e7b5b9 33179a7e 4ca06cc0 5d956f58 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000080 00000000 00000000 dd4830eb 1314366c 600a1334 b68aa44f +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000080 00000000 00000000 a99d55a9 7cf8940a a70f0281 d233a206 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 2dc6c14a 01f7b3e4 e269700c 8039a0fe +ars4x32 10 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 cf32bd13 c75e8c63 337a5b1c 8b874719 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 bd30d45c 846cf3e2 0f784607 5180e999 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 24c4748b 5ff9410b 1638e715 317f5646 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 fa857c4e f695a8fa ba5a3fa2 f6231137 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 e9ffd90d 50b3ab34 f829bd63 9df6a93d +ars4x32 10 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 fda8b1ac 2efbcda8 9f4d4ed0 f39d01c2 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 3f4e231d 9e776fa6 32c5e943 06362122 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 bb71ca48 14cf1dd1 84cc6c3d 0a99871f +ars4x32 10 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 cfb0ef9a a2df536a b732ae38 1823beab +ars4x32 10 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 e2e28037 172a132b 6e060aa8 2fc0c9e3 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 f0981cf0 88e1084e 4c41f8c0 74505114 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 9b618c4c d158e039 45ddb8c4 4b0fdf24 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 52ac216a 053b9443 2b9c9b4a a5fb6faa +ars4x32 10 00000000 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 bee39c93 93b0301a 8910637e 23c3611c +ars4x32 10 00000000 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 650c2e58 7fd8bcf2 b846d4cb 5c5c5896 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 27f00b01 e912ea67 025dbccf 216e777f +ars4x32 10 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 95188c09 e7abd1db f318be66 d1165daf +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 faa73165 0abe4f13 ec553c37 448f1e74 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 d32c5d3b 0af1158c 2bc4a9f8 ee58b025 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 482b2f4f 77e2bd55 29e72d52 a7d60f91 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 fa179af1 9a4fb273 da522d39 f1dc01a7 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 00000000 a3fed363 4fc44ec9 a06b8195 38126587 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 00000000 01cf1c5d a676e82d bfcba095 5b90a259 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 aeb20d4c ea634ae9 1b8be6b3 6df7b85d +ars4x32 10 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 afa063b7 8902017c dd482f4e 59a11ca9 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 96f72228 034dacbf 8bee6910 b56b2d20 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 80c2cc73 1f725523 61f67069 17059dfd +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 8a19cd22 d8e8238c a1159618 cf0e9fe9 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 a0be8a6c 1290d8e5 ccba2020 258bd01f +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 c28cf28c 6d2d75ae b6aec62d b6fa4e89 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 d065ba13 013ae0ff e9c4c8c8 c52e46cf +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 be88f8ac b839f2f3 f3af303c 63895958 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 4fd07277 958637fc 6a3b8e1d a3b8dcb2 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 6a829f35 7fb7d017 371bb7ff 4adfa760 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 67018fc1 0e251c19 6223f775 1eb72c0e +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 d460bcde da2c1ea7 4e6158f8 0dcca4a8 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 4a97d4c6 ce1fad90 29297407 ad396e77 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 d4f4091c a3c2580f 8e58289a 0075b40e +ars4x32 10 00000000 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 234a4361 27a4a0b9 af6ccd19 28133313 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 eba3fbea c112d76a 4d32c5e6 9a8e9651 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 45e5faa9 c2277e0a a73963b9 8a75f7e8 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 1bab678d 9901717a 60d037ec aeddc874 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 fa19c967 6830b351 347d854e c4b9f813 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 7ba2449d 32520ac1 d9d16688 0add41f0 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 a33f8984 e8d72811 711888e1 f5fbe028 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 0000ff00 00000000 00000000 cb545f23 5ca091cc 08a6a333 4a2921e1 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 0000ff00 00000000 00000000 2307f427 f289a5c6 396b854e c89338d7 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 0000ff00 00000000 00000000 aaf76d9a 28743c55 708931a0 b700e2cb +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00008000 00000000 00000000 11b2c798 52af64ac 5e86f95a add1345d +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00008000 00000000 00000000 89ef1d94 7516434d 8b76d4f5 51bb21d9 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 b8344e5d 861a5367 85e0d288 d52a6203 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 1e234bac 544cb733 74336b9a 34b1db37 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00008000 00000000 00000000 c0babd76 90c70187 1688183d 457dba82 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00008000 00000000 00000000 b58786b8 09807b2f c6886e95 d9fffcf5 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00008000 00000000 00000000 fdb0253b 138d16ba 4e9fef71 99813f71 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00008000 00000000 00000000 c39a5f5a 90c42202 e41ce57e 25d838f5 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00008000 00000000 00000000 bf7138c2 2db613f3 979e46d2 15b04dbe +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00008000 00000000 00000000 37dbe9ae fb1acad6 6d44734c 3169b3f7 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00008000 00000000 00000000 efb0b715 8ea1b1d7 30607b3a 6cbfa6e6 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00008000 00000000 00000000 b9943661 5b9b8b69 09758f3f 53b808e7 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00008000 00000000 00000000 f3770661 9d9b9d0c 5484af6b aa8d4ae6 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00008000 00000000 00000000 10aeb57b bed162e9 61e1ec21 875c02ba +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00008000 00000000 00000000 7eb11039 8be0d22b 973f2195 339f4e7d +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00008000 00000000 00000000 bf9e158c f594dea2 163f71b5 cf4625ab +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 00000000 c5c9e699 44b05450 220e2be6 b3fbafaa +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 7a702519 770065c5 7da1ac78 42975dfc +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 e45e79b9 c1d70b6b e58d50da e25b8a3a +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 bb8017f6 c2dcd9ca 438b0414 da0afe0e +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 001d26fb e5cd3e68 2eb855d5 cede37aa +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 26caf5a6 c643f329 e8607db7 d9c43796 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 00000000 4f70d0bb cb90e2e1 deae178a a69ff4ca +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00008000 00000000 00000000 04e23895 30380ec2 ecc92d37 e56ff7ff +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 384cd0f8 f6fb584d 34653a8a 233ccfbd +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00008000 00000000 00000000 0b8bf352 9216ef4f 671c47f0 40d679ed +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 384b01f1 cf053f61 0ee822fc d0eb61a0 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00008000 00000000 00000000 a73319dd d1dca02f 849e2935 362de084 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 126fe0b7 14eccfee 3dd0d096 0cc3db10 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00008000 00000000 00000000 c19242ba 0ff36b65 5bdd3942 75c188a2 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 62024504 6cd94d16 bd1dba48 21bda41b +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00008000 00000000 00000000 f3833739 6d37801f 73b528bb fcb1ddc9 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 90f44c11 9b3cd3e3 4df59a4c f8fbe502 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00008000 00000000 00000000 db6477d1 e733e1ed b8aab516 5cc31604 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 903253e6 055dc1c5 eaea3cc4 7a424462 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00008000 00000000 00000000 547f2be9 3242aee5 b9a90db3 9a29a381 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 daef34c4 45aed485 41ca2065 db079e0c +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00008000 00000000 00000000 4e1631d6 5c7b4cf3 73a62ac9 741a6062 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 13bb6593 dcba39fe 373f2594 4fdadf7e +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00008000 00000000 00000000 e2aa5355 6565f485 e856d8b6 1d7adba8 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 093b963e 4f1add3c 1901fe1b 368971d9 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00008000 00000000 00000000 04214948 1dfe8a9e 840c1e7d d34065ba +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 d587f9f9 16e41aba 3081e5ae 3f13668d +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00008000 00000000 00000000 d359dc0d 04af3b91 af74a3ed 87abd08a +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 183c4d47 496bda9c 2733d10b cea402e3 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00008000 00000000 00000000 314c5626 49d1dee8 5d50e64f fda22ca1 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00008000 00000000 00000000 d407159d ad5b77e9 6c1f5f7c 35e4de8e +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00008000 00000000 00000000 699f5f9d 9fa89518 c13cdb55 4d965dc1 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00008000 00000000 00000000 7b10eb91 66941760 e17ccee9 0cb270ca +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 8b271a26 3cded4fd cb377902 7f99f502 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 792d2c87 5be9b0d5 f50624e0 620eddef +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 cb87c293 5ef3b0ac 4a0b069a fa524a9c +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 73af0176 f2d557b5 f6cb2d33 0910883d +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 a95baffc 8692d41d 45e878b2 5a37e6ec +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 58ad47c0 9ea46109 aa939c1d f1070142 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 fe9eec24 d63ae788 42cb27a1 2a4809ac +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 e1d90779 d0cf9e8e 2d18a333 93524d17 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 b0d45209 bb6959ea 981747e1 43f39533 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 54ed87ce 97c97497 2ab91c56 c619b886 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 d03ca0a5 1e7da6e8 e6f15ee7 f595e3e9 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 a69eddec a62433ad 00a9b200 f12e415f +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 f41434d3 322159d1 f6877d95 8c5beada +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 499f4f32 9fc76c64 bea7af15 11fb6c62 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 d7602848 995411e1 ff54159c 4d1f597f +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 4fcb1a1a 68d49cb9 0b816bf9 8ab2995a +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 92b3435b 68231e7f 34d0496d 835a905e +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 6e257524 3131909f 14c26282 f39bb71c +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 e2ea1171 5bce8a8d 9dc3143a 7f73794b +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 3bc194f4 7f08a721 90d50d8c 8c4d558d +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 4274cbd9 5f814654 d63ae4b6 991a1bb2 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 73f15782 8ee7bbd4 b2698492 3d28ce62 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 00000000 60ee2bc1 df5d201b cb3f1ce6 01174504 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 00000000 de375b32 20f72567 d341c3bc 96fb7b71 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 2b9f1dc7 28521207 662164d9 814fb941 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 9a46ea69 93255817 9462f4ca a1e7a299 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 aca5f032 54df27d4 90e4397f a25907b4 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 437b6f99 61aa8c4d 53d08872 1f945ba7 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9fff0f99 1e866f3e 4bb9588b 65e8a528 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 1f4c2477 506b421f 76562a09 4b19fb3f +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 4d7d6752 85f4d2e6 5ea98a87 a9932a8b +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 a1e478bc 62bbb1c1 f31f526a f707e9d8 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 a2e8713b 9fd9843c 35f213da 69535ab7 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 f6e3e374 c4182263 185a28ec 3fb22ed7 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 1ab188cc 3c24b734 8b7fdfa6 34651748 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 b73485bb f616a467 b941b4f8 ba301c08 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 5fc90eb0 38749554 9ad52075 be7e9fd3 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 6e82d5f4 44b9bfb9 68d69727 0f1af38f +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 26a5309e 92459c89 13e8246a 8a1debce +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 9f30a96d 8fb8d407 bd1ae374 fc6a2e7c +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 8d886bcb 2dfd8d6d b9821758 dc461d09 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 f695ecbc 86558726 aea04b27 47007ed8 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 b95435b3 ea82ec28 8c211929 10117636 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 537efb9f b4bb37d9 11b135be 59cb6b94 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 f13bf67e a9633301 bfe65b6f 3ecb9167 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 6b0a6693 db1fc14f fb49596d 7dbc3ca4 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00ff0000 00000000 00000000 b99ff4bb 8b706e5b 33e937b1 c89eb4f3 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00ff0000 00000000 00000000 0c5f68b3 e13e35d2 97b3e761 1d05ec2c +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00ff0000 00000000 00000000 fa437e41 baa6d495 31e4651b 065a40bc +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00800000 00000000 00000000 a9614f77 e878adfc d1644771 bb7e1f0f +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00800000 00000000 00000000 51c98f25 4dfb61b1 72070d1b 2b4bce7b +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 a6dcee11 fd2c4c13 35b3c08e a74ee6f3 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 ea476d7f af214625 ad771422 28c1ba87 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00800000 00000000 00000000 d844d6cc a557cf23 3df42836 978a7ef0 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00800000 00000000 00000000 c2a296d8 9b211cd1 02e4c488 2d2f36fd +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00800000 00000000 00000000 8ac56a48 dc10e356 42515a3f 7a8c383f +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00800000 00000000 00000000 d8a88471 4823d9b8 3cde01cc 54187f20 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00800000 00000000 00000000 77dde11a 0f88c85f eb5e4013 051f7868 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00800000 00000000 00000000 65798694 72d38e68 bbc713fd cb3c43dd +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00800000 00000000 00000000 86b0f28e 68bafab0 fdac32b9 83f28341 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00800000 00000000 00000000 3af3ac1e a60e19c1 91532c03 482276ae +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00800000 00000000 00000000 f3a77866 84a6ac92 50873f5b bea502e7 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00800000 00000000 00000000 c3ff6aca b19189cd 41e7fd41 1f8019ab +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00800000 00000000 00000000 84cf9d48 8d6a83a1 3f3b1cb0 68da841b +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00800000 00000000 00000000 06042f2c b5c52213 9b0f3804 ba68d96d +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 00000000 c864f8e8 9f323c3d ccb036d2 1fc4944f +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 7127d03b b6cf6400 87b36419 24dd6bbe +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 c75b4203 ff4b9dbc 411a33e7 6657b609 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 72f5ea73 c633bba0 da9d45fb d8118c29 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 40bac872 417af0e8 18491dda d6c616f5 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 c919dc63 1328fdc9 21353f9c 5cdf89e6 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 00000000 c1fabb73 39e038ac 98726be3 88ffb110 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00800000 00000000 00000000 4fe2ea59 757d88c1 fd1bd554 291f1d12 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 6625392c bd116176 393d082e 1c65e979 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00800000 00000000 00000000 de7824ee 41930dbf 0297daf7 b5b44e94 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 6d8582de efb21c49 06bdf0cf 1ef8ed63 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00800000 00000000 00000000 95e325a9 c9452803 1b92d70a 36290e55 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 b40e1c7f 51359e8a c545965c 4f94d4bb +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00800000 00000000 00000000 0d156b55 447f4959 0f62f99e 87c94668 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 7031d465 15587368 4c2efc4b 7e9a28fd +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00800000 00000000 00000000 ebfe358d 0d8cf82a ac6b7fef 3f690b9c +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 951be3d0 919ee902 0ab9ed0f 32308e60 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00800000 00000000 00000000 0bbe6a6f 56b38c2a 36a4517d d19eb168 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 76b0a5b9 166ef9de 3c20e1c9 f32192b0 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00800000 00000000 00000000 84f90e94 ba62b185 b8a9b3a8 e2ad2df7 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 0ca1105d 39d85068 f21fd86d e1b17585 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00800000 00000000 00000000 0a0398e8 de216909 5afb1040 b39b650f +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 e3a13c42 d7980183 c885a470 385b36f1 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00800000 00000000 00000000 f7bc487f ab0e715f af9319bc abd0bc9e +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 7917a5e2 3a2c501e e65446be 39701909 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00800000 00000000 00000000 082ca32d 5f7316a6 724c27f8 14a1186a +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 67f5ae30 4e872d21 3b7ee342 2678784d +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00800000 00000000 00000000 facba4fa ca4ab7ec 5404231f 490e3bac +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 d49a718f 8017f588 d2493f0c b711a6d6 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00800000 00000000 00000000 3720a7ab bab9748e 9716bb16 81c698b5 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00800000 00000000 00000000 ab3cabe1 89b3bb6a 688f9d93 04122cca +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00800000 00000000 00000000 e673f8a9 1a1349ea 1bce935c 129c5a05 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00800000 00000000 00000000 3218b830 3acfac5b 8e1f2094 cdafe481 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 a0f9adc0 50a0a405 0792e60b d250490e +ars4x32 10 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 710201b7 f4fad272 4a0f4d05 13bfce15 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 ba8fe932 b074d0a1 5a22c96a f5177348 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 80aa7b57 ebb4e0ec ed281947 7e20fbae +ars4x32 10 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 24c99b1f 28c1fefd 9b09c683 268f3683 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 2937c5fb 75f9242d c218d7b0 e21da5c3 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 5d9cdbde ffd2ed18 7a29659d 0a8490c1 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 83a9ccf6 e3e5f3eb 92d33f24 f29d26a9 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 b9502d2a 9b7e2edb cb7007a3 e3e1bf84 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 a7ce23fb a1da063b ccbc80c9 f204b7b8 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 f44fb029 f88edbe5 767663ae 76159c73 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 88b1e3c5 ac6bf6d4 9b8ede00 1d50be01 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 a06872b0 2115765f 71e5f5b0 06c72b76 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 fb5d18df 8769ff31 e1e17123 72d6d1b7 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 3932a248 c79313a9 1cc7dff0 d35e3f26 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 87d2e8e9 994264a9 2c55677c 198990a8 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 53f0b4bf 13c9f83c 640030e8 6096a3ef +ars4x32 10 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 69349340 084b9ee1 1847b60a ecf1129b +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 5a979080 ac599f32 82e9f866 dfea36fe +ars4x32 10 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 fe136d46 a8948301 8e29eb3e 4ca702df +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 fa1eea01 a4d4f372 a2a6abeb e056b959 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 1c5f9175 40fe7227 a1cc702a 03716ea4 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 00000000 682d8534 5ba4cd55 b3598b72 debffe0a +ars4x32 10 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 00000000 e807a95c eb8bf49c 7081ada2 76fa7315 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 a03a73e9 15f9785f 8f2f449a d9951353 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 9a68b1db a743b0e5 4bd12457 facc0d2a +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 5e491c36 7b79cc5e 030fb10f fd830c30 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 3a4897b0 dd519314 4770822f 00b8d259 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 b675f977 2e1ab2e3 7d185337 d4dc0d49 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 2e36a555 c3c707e5 ffc6d799 f24d4311 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 609b8e18 b6d3fd60 86d71136 bbeae13a +ars4x32 10 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 fac5b1be 656786cb 58a1c095 6a46aa21 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 d646323b af4b3751 9bb77dba ef0ca0fb +ars4x32 10 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 b9b127ad 2d4dfe40 5aa49be3 ff1b6897 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 45661465 1cf012c0 9497666a 6173081c +ars4x32 10 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 9d20cc22 9814ce73 83510e87 b16f59c6 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 2959ebf8 44c6d75e 5c7bf4ba bc1ff850 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 f6192614 5bdc0dfd 9a5f5825 caa993ed +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 0aa7844c a3aab8b1 2278de65 22b828ab +ars4x32 10 00000000 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 7c17e752 b8419c18 fcb21d8e 1ebbb101 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 b1d26e4d dc7af8fe 7895d10f c4eede45 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 c1410777 2d3248f8 269c2836 2e7cd461 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 5c861f6e 6c4386b1 5f03c53c 377e35fc +ars4x32 10 00000000 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 d36721d4 9ef3c8d7 311f374e 0048acf5 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 04060dcc b0eff4b7 1d1357d8 d953f14f +ars4x32 10 00000000 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 3da29869 87c1cba7 0a83b037 c2bc2f74 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 ff000000 00000000 00000000 cd2ce71d 484fc862 51f2b487 7d8fb164 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 ff000000 00000000 00000000 a8b834d7 97503406 ed40d6b6 a131a359 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 ff000000 00000000 00000000 a5bd4941 390f6b85 5450dc68 c053a7a1 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 35490912 57d0e7d9 ca875369 3cfd04f0 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 80000000 00000000 00000000 f0bda856 42764679 19fbda68 8172da2f +ars4x32 10 00010000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 31f324d9 96d79123 5252fdcb f32ecd0e +ars4x32 10 01000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 22905cd3 18dd2f62 0e30a1cf 41ede49e +ars4x32 10 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 942d9e5c 4d5d4e1a 8efa50d7 57f2b95a +ars4x32 10 00000000 00000100 00000000 00000000 00000000 80000000 00000000 00000000 2ff68685 317f6334 769179f1 769f811e +ars4x32 10 00000000 00010000 00000000 00000000 00000000 80000000 00000000 00000000 cda3bc71 f45c0efe cf9c8392 f6c63745 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 80000000 00000000 00000000 74cd0365 ef908ab9 cc4d4637 1db9ebd2 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 cd891f47 607c8990 d9b38f3b 44e7cea5 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 80000000 00000000 00000000 4e9ce7a4 88224aa0 699f58de b44e5acf +ars4x32 10 00000000 00000000 00010000 00000000 00000000 80000000 00000000 00000000 28661024 afadeba7 d0f8222e 81218a10 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 80000000 00000000 00000000 659799ca bafffae3 a6473f39 4dffdcc2 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 8d352b3e e95d257e 2b3add91 4614e45f +ars4x32 10 00000000 00000000 00000000 00000100 00000000 80000000 00000000 00000000 49ad8464 0aa772a7 52a8ea18 c8eac568 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 80000000 00000000 00000000 f778e9ec d9e60399 e7db0012 8ecc888e +ars4x32 10 00000000 00000000 00000000 01000000 00000000 80000000 00000000 00000000 f2303c41 733bbc2b fcd5d8e4 73dac3aa +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 00000000 bf8290cf 4f386e9d 98e26227 4b71c30b +ars4x32 10 00008000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 99b92605 b5b8407d ce9a264a efc77316 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 cea8f1d7 b6bf885b 02fa6423 0cc90195 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 d1d0debb 1e26cda5 234e1eb6 9f053dd5 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 4ac84af4 9e2bcf7b c92400c7 425abf64 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 63f4d549 0b5b9f93 4f1dcd5a 17d2efe7 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 00000000 55cf4ef9 5cd578ea fd9aeeb8 22aeb44f +ars4x32 10 00000000 00000080 00000000 00000000 00000000 80000000 00000000 00000000 a369eb36 0ce5a066 359b0d2f 7394e4ce +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 8d9ccef5 64949cd7 ff5bdc17 799f01a8 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 80000000 00000000 00000000 0851a190 2f6c3516 06d9b4ad d16e22fa +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 5d2bc951 5ef057fe ef7adfd1 3e1020ae +ars4x32 10 00000000 00800000 00000000 00000000 00000000 80000000 00000000 00000000 a9191c15 4e461234 1f53bfb2 1017eed9 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 29eb1d58 906ebd03 3884c6a5 a653e529 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 fc52f6ac e2be16cf 1a91efd2 8f2c9ef4 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 a19f9e8f e02661b2 87f70d0a 270420c8 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 80000000 00000000 00000000 50f7f407 0a83c5d1 ea15a99e de1fc8f2 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 abae9972 c9b62db1 d5a35a15 78bf031c +ars4x32 10 00000000 00000000 00008000 00000000 00000000 80000000 00000000 00000000 ae290b57 22620c16 8c4e3380 8f98f719 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 f53616a7 898e1293 5f8a4e1e 6557c24c +ars4x32 10 00000000 00000000 00800000 00000000 00000000 80000000 00000000 00000000 7203fec5 a32613dc b91c159b ffad3ccb +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 f108b0e0 3984cf10 0c2759ed a3a43c0d +ars4x32 10 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 5c6810ea d797869a 6ec81def 9bbc3fbf +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 8ce8b903 2356b275 84691e6e 8d2efe08 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 80000000 00000000 00000000 26c9b894 ced52c49 b1f1b094 e156101e +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 105c7c88 609d2997 81304651 8338a0ca +ars4x32 10 00000000 00000000 00000000 00008000 00000000 80000000 00000000 00000000 2b093dd5 fca6899f 6b275645 45d06e83 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 c7199cdb 1342290b dcb9eb77 1dc71da7 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 80000000 00000000 00000000 7b1b1236 2ce34af7 e02ef933 ea984440 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 6cb3b476 d12819f6 959504d0 ccc2f276 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 3edff8c0 a6187c02 4a1d2177 cb169a0d +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 80000000 00000000 00000000 f382422b 3d3dc13c 6d45a473 af756ca8 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 80000000 00000000 00000000 31d99cd0 d6b7e2d9 1ebcea94 e1a748f7 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 80000000 00000000 00000000 a4e64916 cd15299d 5e26d12b 48de37f0 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 9f5d80d4 794a5486 29019ab6 472dc4b2 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 4ea72aa2 24ace57c 65343fe2 6141fd36 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 9f2ff8a9 7c05765c 452bc993 56084006 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 45aaeca8 27b057aa 2dc113b2 3702518c +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 66e88052 7dc51f2e 9c389d67 1183e665 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 be2afa22 a59d5538 b472a507 29dfae20 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 a8e52eb3 142aa6f6 15539351 b2712232 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 c06bec00 a6ceb148 e5f5fa07 63d33156 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 9ce5471a 1b3a598e 147d0066 d43b3db6 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 ddda7a40 55624a27 ff7f26a6 e9d75f26 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 c436bd96 912fa0a4 60c27280 1cdcfda9 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 c04e5b29 51991d05 ada54c6a cc68206a +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 978b5998 d111a2be 502869aa 05f16b73 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 0de53a91 0aa5a806 085092d5 1105944d +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 09cb6199 f40eb188 1c0b8c0e b6185e6f +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 8bb1801f 28cbb5eb 942bb8ed 712f8a30 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 d5860ee1 1fffabfc 739c6d0f 652fe6f2 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 74fb0c2b 8f24decd e948fd90 5230ee0d +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 3df7bada 01abdad5 56eeea05 45442205 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 d4674c3f c89c765b 82857074 32763d4d +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 219a795f bf1f73ca 80a4661f 7b03cea8 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 07f88686 9cbf736a 90fa5537 bdc78d0f +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff 00000000 31c48afb 47e6fdc1 bfab3797 9911a653 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 00000000 bd931b49 d549608e 341743d5 d33a2785 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 71e6c352 95ffd8d4 087423a2 57d38421 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 6a889c62 4cc200b8 443378a4 024a49a6 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 15854a4e 399eab8c fa1bddf2 31bb7730 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 deec5aca a4e0cd6f ca050a65 d8e94063 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 3bb81a8d 57466caf 04414319 0e2b8c4a +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 ed59a3a3 d755a575 589bee5d 5cb05c14 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 4597e89c 63d67111 e9b252a1 9a190af6 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 f8eb267a 0e8e0dc1 c8366e23 758f6f30 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 991dc2fc a2782037 3f421cf7 c6b03740 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 a226fe9c ad602184 9140c643 4129ca3d +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 1bdeb639 53b985ee c0bcb078 b892c4e2 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 172511c8 c2a169b2 fb123cef 32417c29 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 8efe1d11 d5be5fa6 be816827 904558d6 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 5889a990 36b0fcb6 26ad5e11 8f3bbf66 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 349e8c58 73a53b65 29d1ed42 4616e7a4 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 a2aaf3eb 9347b26a 1917022d de2dffee +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 8c757a87 587c4cf9 1b5c1bf9 0c3616c5 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 6760e16f 93b03b74 a7de3a80 8fa93309 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 ff278b74 d430f96e de8e472f 0ab8a7d0 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 e8e4f94a 345f8d70 a38fd32a 5c726aea +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 c2a23dd0 7011b1e2 332c7423 b35056ee +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 251b5804 ba885efb 577759f8 543e0e84 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 000000ff 00000000 7fd4d23b 15b8edfc fee03fe5 a12f94a2 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 000000ff 00000000 1049d92e 7b4b996e 99541c8d 087efad4 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 000000ff 00000000 9d0ded71 e435dccb 164901af 34fc1baf +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000080 00000000 78edb96a 6908c8de 14f55ef2 9f0fae04 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000080 00000000 de37fe97 cf28bbb9 b661da5b 2a13c7ee +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 6e861f75 1c7655a4 daa779f7 1021c8ff +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 44313b42 a77b3f2a 2fe551e6 0540dfd3 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000080 00000000 03dd5293 61edd733 c5ed88da a6cab8b2 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000080 00000000 ed06f5a9 5568a8cc cc6cc793 3ed98f1f +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000080 00000000 24b74d8a b47dc602 eb1c91a6 9f4ed8e6 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000080 00000000 7d802fde a6e88144 599f7e11 8a4d5f68 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000080 00000000 32a71211 59b38cc0 b4f2b31a b2136232 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000080 00000000 ced9a35f 763e924f 69fd7268 33d411de +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000080 00000000 8e5b8b9f 94f47d85 57251d28 f0b25ce9 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000080 00000000 97591c5d 87e8713d 3cc50903 d1e27c7a +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000080 00000000 3f7b1e5e 2aba4203 5a55d1ff ab7ed0fc +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000080 00000000 5d0fcbcd 06665fed 3757cff9 d810791a +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000080 00000000 728af58d 5781eff8 8864c0f9 3b75ee85 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000080 00000000 967523e3 f9c4a057 c35a6daa 6151a76a +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 00000000 1933314b ee335886 0ed15ef6 5e42982a +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 decd3a83 4501177d 54b8c3ab c59dd6e3 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 5b445f94 312e247b 2ab3cd23 fd412c8b +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 010df58d 380f8c53 0cfc4871 e3cd6daa +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 699b519e 09f8e4c8 266de62a 9f7f6722 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 9286df5b 4acb9c6a 6796ae21 66c4b0f9 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 00000000 257bb931 15374ecc 84e3bc37 00b3a497 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000080 00000000 34212381 2c5363ee 2576da5e e6cc37a2 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 3433f8db 4cb05ac7 f0607702 38136951 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000080 00000000 635503bf a1954b79 2cf926f5 980ca587 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 d39d7534 afcc457b 098e9a43 4a456000 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000080 00000000 4519de79 96f80024 24d07cbd 4c0b7795 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 d29296cd 6dc750a2 fd383b84 64755f9c +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000080 00000000 49c5803d 9fcf9542 6c79ea07 49261f84 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 e273b4b5 6b136ebe 533957ea 77e304bb +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000080 00000000 1c44d927 538b6c83 e363d0cf 00a77f62 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 b61ee82d e2655b38 3db27ab2 cd94f34e +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000080 00000000 eda4f5e2 47d08f95 8bfc833c cdbd697a +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 f5d9cdc2 4f91c004 27391e7d 199b276e +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000080 00000000 d23978f4 ab233254 f611ca0b 7fbc8460 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 2bc6f4ac 6d6b8451 19b58a65 c84fb4c9 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000080 00000000 8a84549b c251bb70 e7cfff88 5f71c7d0 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 08b2e46c dbfe2c11 8b6ea6da 3aa1fbfd +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000080 00000000 75f8eee7 418fb421 e6d0d4a0 c638e3b3 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 b892d231 e09b1b98 a8285831 74b2ed09 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000080 00000000 2cbdeaa2 c85de50d d999dbac ba322240 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 9066074a d3f2b6eb bf997c56 6e2fc3e1 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000080 00000000 c1dab9a7 02680c69 69bc280a ef506afe +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 6b4503ea 3dd88f9a a64e9edf 54e5101f +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000080 00000000 e2e930df bc0f222b ced19097 52071260 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000080 00000000 b4e5e606 35b7286f 950de5c6 c2f1a652 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000080 00000000 dc194b8a 448447bc c7374ed0 9980536e +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000080 00000000 aa838c05 e22ba715 6918cc5c dc292da8 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 4f895e3e 72b5a8f9 41c531be 63caf21f +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 e1814add 46b78185 5a794602 c5cbb81f +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 b2c797be f07a5e58 4aaeb2d5 34d77337 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 79a0ffd9 48780199 0705054e 49350ed4 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 ea92d127 fc1a95df 273c0510 b61e10e8 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 465c4daa 7959cac3 580b5939 5cade546 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 40d94049 f73cb9ac 745cffa6 59f76ec5 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 cf703f5b cd3f4549 97b731f1 a76acffc +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 601682a7 ff3352a6 f51767ca 67c505cb +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 064a4fd5 acf56790 fc2f77c6 542e7a7b +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 07dd2141 a9e2457c debae6fc ddd06c68 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 5a7b064d c5639457 f259c9bf c8070244 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 d197cd70 1ef3538c db127a4b a3a1bb87 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 4b404fd6 ad1b745e 6a8c294b 5df0c9d4 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 9578bf95 49e2728e 56c2e4ae 3ae95323 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 45839f9c c7f0e13d f1a64680 3aeac951 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 be685e6a 35d02b3f 65b1fab0 1a9b817c +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 8b23624f c777cdc2 17ba7e26 91e2d3ab +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 7475aab9 7f315b43 bc2b96c3 00242add +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 109a90ca 965c5269 7430bab4 a3889c75 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 fe582027 bef70e59 8a9b2847 5c0df86c +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 3e3f8f0f 1734ab81 33f4d2ea 300b3b8b +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 00000000 ff63a226 41021a29 82485198 8c15a717 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 00000000 e27a093e c263725a de05cc61 86e501c0 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 b06ada3e 32f43fc1 f617a8d4 05404006 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 98361f5a c454edae c9d73afa e3eef15b +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 43f847d0 0c32ef55 6b7d8ca5 b2e06275 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 59daf278 4e717bc6 bac4cd52 19ad0428 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 515a9cd5 6a818e6d ca4261cc e40fa439 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 9c190df3 635b6902 e957b24e 6df51f6e +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 afb4979c 19bf132f 235e7a66 379823d2 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 fab801f4 7d8403c4 213946e6 bf26cfa1 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 2bff30c5 dc2724dd 276b8f10 293035ae +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 bd535fc6 d0996f9d 0b279e9a 198ca5ac +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 082570f6 f137eed9 82f8e840 a5190121 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 ea45c747 936587e8 2f8ad187 95ea35d0 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 1bd18a60 b0d73ea8 e1966b10 2eac853b +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 5236a302 62972607 e3c01714 0b62be49 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 efb10eeb acd85f80 99fba3e7 47b3c363 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 41722b57 d4ac5a7a acd93feb 753133f3 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 11d3138c c2a57d61 aa7af870 055f2d4e +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 2b9fb6aa f71d55a2 f2792824 edb7f27f +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 d4778713 5e30a88a 062e6325 be4add84 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 b5a55af2 1be5b52b 12f81646 0e07d277 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 45a08cc5 57c9c115 f8e385c0 a36320f8 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 612339f4 86580243 459c100b 850bd33d +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 0000ff00 00000000 39bd7725 10cbed46 51577369 8acdda6c +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 0000ff00 00000000 c5650896 57b105b1 dc6cceb4 73d682b0 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 0000ff00 00000000 6f5b19b1 da5bbfef b31787b4 e1b68bc1 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00008000 00000000 24d1487f 158e76bd 8f4625e2 1e4540ed +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00008000 00000000 fdc7999b 7bf57a2f 01436def 8b61b237 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 686e0027 1feb6da1 c12824a4 7c2b0f28 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 33836406 9f2ab550 562389cc 95d88501 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00008000 00000000 6cfc5fce 5c5bb94e b6ecef73 69459223 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00008000 00000000 3421e4bb 62cff9de 6aadbe7f 5402a3e1 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00008000 00000000 6c9c37e8 700b2ff4 8814305d fafff619 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00008000 00000000 c9a01dff c0d0754d c7746621 10487b7c +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00008000 00000000 261f4c1a 558a7d91 69228368 ca5bb4e3 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00008000 00000000 41535347 2881b818 bae2d203 472f8fe7 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00008000 00000000 7eb52b1a 195c1451 be6a546d c97ab66a +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00008000 00000000 7d3f7f8c 6de137ff d4250a82 2ced4b04 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00008000 00000000 01d2065f a5e190c7 b6966627 9f26e06c +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00008000 00000000 64fa9a54 d9e965d1 eb21155c e55453cf +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00008000 00000000 cd61bd9d 992e6f20 722cb30e 8d88b06d +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00008000 00000000 b6d727bd ff9b0a17 cda0c38a 3cc5d2cb +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 00000000 7c6a0872 3e6f25d4 92970934 dcabecfc +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 5e22281e 0b94307d e9db296b 2cf95249 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 011bac44 666d7197 a5e1c544 c75e1c6d +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 abbe39f4 52d30bab 991053f6 4b4ed4cf +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 f3e85902 a7c0dbb2 bd9d9c94 6b3042fb +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 a723461e 951ecf6d ab3f8dc8 4c05d117 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 00000000 ee5355b5 32725efa 61b14b48 e353a242 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00008000 00000000 11f078cc 605038a9 68376309 10032ad2 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 0900e5ff 0f45e7e0 d8fd1655 5a726ff7 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00008000 00000000 2aaa22f3 ab0c292e ecbf2fa5 bbe1420c +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 0ce0d376 233941c7 e7362e05 2d05628d +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00008000 00000000 3e176017 54200793 d514e4e8 3eb412a7 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 48f2869b 3845ef22 5e1901ea 4a859734 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00008000 00000000 b7418462 d1f9ac07 3c055a85 8e0f3ea1 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 e8d41de4 a8874978 46a24e6c 62ca3cfc +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00008000 00000000 1532c522 6ddf05a4 c2066e0d 4bcd4299 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 85e164d1 abc06722 d1d9c63f d7c77859 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00008000 00000000 1a82806a 5a3f2a6b f64ab142 8f9dcbfe +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 3b79de87 7c00eab3 f24513c2 3dd85d75 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00008000 00000000 4ba6fbb8 6103aaa6 9b5bd1ab 82501d69 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 f5753d5b b7ba337b cb34b53a d8ab23ed +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00008000 00000000 f8c29746 c96595dd 2a7e4df6 c4f15e03 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 5e5bf243 43201ef2 b2b56cdf 2606e3c1 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00008000 00000000 5b7b8240 9c0dbf33 3cd7526b d88092c4 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 5cd72157 3bf89f8d 4308c0af acdd1a5f +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00008000 00000000 d2c67dca 081c3b2b 3971d46f 1aa33642 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 b37023cb 70133c8f 50dcbba4 b0ec5a98 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00008000 00000000 66d1ab9e c8000dc4 6bf78454 f5967ab4 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 8cdee45a 0a564a1c 247a57b6 7d76dd5c +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00008000 00000000 9d950cfc 48245225 e2f6ce41 e18bbb3d +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00008000 00000000 8726cb58 4b596fcc d85ccd2d ea5c1b86 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00008000 00000000 b5bbbd24 af621eff eb71ad90 3963eda2 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00008000 00000000 7e8c5d35 b01f4357 1d4da01a 349d9308 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 150100c1 8d8bf7c0 1c7d1deb ea2ff94f +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 994d5250 c83dc66c e341426f bb32bccb +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8ac076c6 b28157c7 823ddb74 5d555ba4 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 912496a3 26ef9bae afd546a9 6ad2f1f1 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 17bfc356 ba77656f 0f46d315 8fc83394 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 30ca7dd6 e2b05be4 c3d7d1be d450f616 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 5857a46b 9ccfbe40 2b669fa2 9abc43b5 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 d062d457 d657a39e 23313e22 00fe8983 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 6a2a8e8c fa721dd3 5569b7a8 7047dffc +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 8a8ed781 7cf1b536 87ec6941 c4e4c20f +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 4d954fc9 836102fa fb3944b2 d1b5a7e9 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 79a5718b b154c479 a77f8db1 adb57436 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 43642543 c3937039 9f582b56 19f7d08b +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 675c5fbe f10a35e8 f11bcf82 d576b00e +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 049552f7 68df840f 7cb4f5f2 6d19b3a0 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 831c604c 0e4000c8 4bc6c406 6962eaea +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 d0f5ceb6 19226e67 265c3f6e 50007b66 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 c519f53c f413fac7 436b8242 f48c31b2 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 d4b94661 5822fc35 7d5f5827 88fbc576 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 39661f90 f3148a86 85deba9a 6a320b8b +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8f57ce6e f6391458 ecc348bf bb6f94e1 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 76cb2978 8e67c88d 950a1a6a a62e2213 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 00000000 1ae699eb 3cbca167 39775a0e 146b9cc6 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 00000000 a98821cc 51579bf1 e844a285 39fa3044 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 4be5b753 8f56938b 3d6cc3da 86ecba90 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 198172c3 800e20da be07ee33 a8560a99 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 ff2b7003 d5983fe4 1309cf3c 74333dd4 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 771bf320 5a91a69a 25e85234 6b44483d +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 cad80ab5 243a85d6 746d94c3 14288f35 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 af6409e0 7b2e97e1 61dc66cc daf91138 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 72f34dba 42ea306f ab2dbb1c f89d0e52 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 de0425e6 b0711cbe a1f06647 1d22420d +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 2c4547fb 290dc51b f05b6832 367d1247 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 8c9ba4ff 28b80719 bae6c186 2961fbb2 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 f4d1a124 8dd06f6e b60ad992 a75bb575 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 1d264180 0d82de2f f7ad28d1 6de99d88 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 e8d546e4 f436aa12 d9ea6b9b 1e8293d8 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 c68b533b 0c2f5dca ee1f618f dac2795c +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 b0231ad0 d9f78969 e9a7f2fa 57a7d045 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 66222670 31459874 e598e3a8 1a4bde92 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 b6d2196d db3851bd 516ae69b 06225b81 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 bdc0eebb bfa3e06f 92d8d0ae bd8cf1c3 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 62aa92f2 f195369f 42e7ce55 30d5680a +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 bd9e04a8 227be90d 097430ac 878fd8a8 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 40930095 69a60863 56535b7c 1db91864 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 3fe5270e 13485418 5b672b74 4a4d1bce +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00ff0000 00000000 ac577578 1f84fd44 033a5861 779c8365 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00ff0000 00000000 a8a3b667 0c5cbf5b caccc1bd 734b447b +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00ff0000 00000000 e5d8935f 0661e012 1b98bb8d a2055553 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00800000 00000000 68e72e13 266b1949 abca7cd0 d1d4a3cd +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00800000 00000000 705dbcb8 95696c45 d61cf801 3c1b2b7e +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 0ab694e0 2a73e296 0075cb87 e3e64788 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 c8c39af7 2c85aa23 7658b885 0a9b9ceb +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00800000 00000000 adae304e c04bff5e dc073076 326c6db4 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00800000 00000000 9f18f947 2e6324bb 63a1cbf3 70b3c520 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00800000 00000000 85f625f9 42888c8a 3ba60d3a 4b775425 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00800000 00000000 f1ff4973 f55b9ef0 92ece024 a4eecd95 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00800000 00000000 66193413 cb44934e 0286e084 30f50630 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00800000 00000000 4a3c0db1 e14e905d 19af9847 74a6bab5 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00800000 00000000 360c0993 a7e6d53c 6545bd83 3d1e73a3 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00800000 00000000 562cf033 253dcff5 4a402904 fa8abff9 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00800000 00000000 436a432f 11dbdb14 05e49a83 9993339e +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00800000 00000000 58d08506 40633f84 56a1a0f8 660b48aa +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00800000 00000000 02c240f0 8d2fc6dd 5a8c1a84 aab3284f +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00800000 00000000 2864f59a 6edf90a5 ce976842 915798b4 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 00000000 825a70ce 7c5cd2df 26b9286b 7e663990 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 d2582afe 7ce7356c 61af9992 76e40957 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 cabcada6 6adfef01 8d0f0341 3e913f9d +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 a5980f69 9d59ac3a 1948d421 7b5f876c +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 22263e0b 847009f1 534a770e d3bee5ee +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 6cb180d5 1a7fe928 c78f1ad4 2a5f82b2 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 00000000 901f9239 d8682cf2 9f1aef9d de8af58c +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00800000 00000000 a2068588 a97aa456 a42ed8a0 431234e4 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 3b1d0a13 0049dcf1 60b9cdbb 9beedcb5 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00800000 00000000 18a1aba6 4403bbca 967481e5 7e6554e1 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 482ceb52 af4d0143 55c736db aebb6425 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00800000 00000000 f6cf72fb 4d6640d9 35a977f1 7096cc36 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 d21cb48e 36311bae 3221e8d1 4ba5719f +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00800000 00000000 13086d02 660d0a2d e0962f43 b0fa1d6e +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 f04d666c 30ff59f4 7502022c 3cfc80a4 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00800000 00000000 d5114c63 b5d76336 b8b67146 02867d09 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 953c28e4 4ae01f34 8ed0dc6e 7789cb86 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00800000 00000000 1be4f6a6 f44a275b 1d943bf8 c0a290f1 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 dd31a5da 05be7bd6 a167d78e 7d08f34c +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00800000 00000000 d5dcf493 3b152044 3d432a8f 775976d2 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 80e0584e a682ae00 0fcc317d 405dd7b8 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00800000 00000000 b328592e 23fdb9a2 cc0a0b5a c9e4691c +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 472a4c24 b385afbd 4dfd4a54 c97f647a +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00800000 00000000 f94146fb 0d22e6f0 56ecd3a4 208e570e +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 5b6370ef 423622fc be86d2ba 442a8110 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00800000 00000000 3f27be64 7d2df841 441029aa 8a19787e +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 1151638b 08a6c2ca 14f24afa 0e840c78 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00800000 00000000 8112fcc5 e7bae10f 737e7764 05a503e4 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 37694239 bdd5f12f c3534fd0 42a4a9c2 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00800000 00000000 15288d81 c5011e00 64e4df7d c6fe95d1 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00800000 00000000 3244478c 4ffda7c7 530422c7 833a4081 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00800000 00000000 1f6b2595 f19ea03d 12612526 3e202d62 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00800000 00000000 6bec8130 ae19560b 5c138b96 3fcb10a4 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 58efaae8 908f42d9 e4a5adeb 800f20f0 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 1b5bd8ef 4c71ab0a 4361587e e736be48 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 e7fa3d88 ed05f2ad a1f51a03 8019547e +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 a84250a7 481c99b6 ad206e2d f7cfc759 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 83828d08 1ed9dd9b 8370a4da 87770b65 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 70bc4d50 e5d389ce 0d1ed6bf 5cb66f96 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 d011df96 62a24fd2 862bdb89 51673aff +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 b5951541 117d9964 7bbc4552 d46c6108 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 895d27ea dc118488 14108089 c64316d5 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 77515b74 8ea060d8 aeb9258e 29210aff +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 98894204 5953a99d 98611732 cc2a318a +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 4015a871 701ca798 3e27d956 1ad8e87d +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 20823b8c 3c0e0feb b35a9f82 811604a4 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 15144119 2ce37c74 7e392f1a 9e35c7cb +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 bb159130 24c7e73e 0829a1e6 dd30133b +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 fca4d0ca f03c677f 70ba8d66 a1adfb79 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 f0a7207b 5f3d4137 65cde2ab 886b68a4 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 687ed791 369f293a 1d55e60b 2b9402fa +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 02044399 a8ee0e4b 4df92ff7 84f2d2e0 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 ba9ba0b4 6d8a660a 38361200 3a68ba1b +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 411ff0c5 6c9435a8 75df0544 d8aab3a1 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 819b4329 41031a9c d55552cd da3cd070 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 00000000 3b3b48b5 8ef2dd6a eff89bd0 ca2f9b84 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 00000000 e2dbbab9 f08aee93 b7f69de6 3d049a17 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 5017bc10 55fad779 44fa7a36 0118e600 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 fcb470e5 66cf1e2c cd667359 ab002923 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 5a3bcb0d 7171d784 87adcf0f 48815634 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 581967fb 3a31f5eb 56eb2845 0c4664fb +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 bcb2b6db 5bb1b54c 8aeec711 3de3aaed +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 82f23d44 c05a76ae fd053b09 4811f26c +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 60e4c1b3 a9cbe94b 5a1bf944 af1cc907 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 579e0bed 17c5f429 5d523ca2 083c228e +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 4d08ca02 f93a8353 d942c66f 14e89ccf +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 c437ef90 b3e6c4f8 5c96cd27 c9eb6193 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 97e2cfff 7fb4a4d8 711f5d3a 30ddd82c +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 2a7de2c3 9b2b4963 b35c6f87 5c6224a5 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 fbafd6b1 0a2cde19 ffc1b1db fb4475e9 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 a209fecb 74698947 efe93434 9247b5ee +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 9c680acb 3a32a953 be5c11a4 7c443198 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 6d2fe0c4 2cd7c774 a1108e79 30e00da1 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 a7bf2fb6 d8745ced 3689002d dd18f2d4 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 d96b2959 c77aae07 6eb557df 804209f0 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 fe919ceb 31d0dc56 e872a4a1 eba61bf8 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 25d41591 6eeb72bf 5a9b8eed d69fafbe +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 14fe134c c16f5762 9fbe3991 3fd1124d +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 db8829be c1f8712e da644ea2 27a8390c +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 ff000000 00000000 80d8415d 43b257fb 31703e65 24616f8a +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 ff000000 00000000 057dc2d7 5ae3fa5a f95a7de3 f9808716 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 ff000000 00000000 88e51669 eadba2c2 09cf3da5 d5f0465c +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 83d8298c cf50434e 604c644b 085b2b3a +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 80000000 00000000 c31c0ee3 a3e4013f 929d7a3a 251cef6b +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 b2958cdc adf2ca56 298655aa 38dfb0bd +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 8b666be5 6691a603 becb6f7c 4e518093 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 a28133df c529f5e6 cd5f91f9 7d10f299 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 80000000 00000000 ab9f6d47 eacf9e26 4d2f0c18 a35abd5c +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 80000000 00000000 abb330b6 de59b743 50f267d1 aad6a67a +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 80000000 00000000 fb1d5547 79fbc7c9 4e8d3ab8 8250e91c +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 7d0a1025 4c3269bf bb67303f 1443062e +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 80000000 00000000 c3772324 636a13a2 818cc7da 8e61b8aa +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 80000000 00000000 0fac38e2 b1f0c476 e266440c f91503a1 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 80000000 00000000 9547f705 ad06ba30 85e1496f 17ebf7f5 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 26f2e248 bb626483 6cc9da1e 3935acb5 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 80000000 00000000 6193ea72 dd9179f9 11d5fb2b b3f582f5 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 80000000 00000000 daa78425 2b6a189a f60338b6 1b561a4f +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 80000000 00000000 83642eba a4210779 c8e5bedc b835e990 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 00000000 20989bb9 ced2018e b11a2efb a2c28fe8 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 fbe11e8e 51f48068 2efe8e0c 3ead3383 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 2312ca53 57298d29 b524128a 78103575 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 9ce0f6ba 2bef00f8 36c91af0 170c8f5f +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 92167ad7 7e9e298f f8a3b57c 37f5d192 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 65b750a7 2cf2e7d2 180b35f8 8b26a303 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 00000000 0b38e8b0 5a2c26ae 7e18dc14 ca613f02 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 80000000 00000000 36c55fa7 649d1c12 f0a73818 660ea1de +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 336a6fb3 99c55a04 9c57b111 09cd84fd +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 80000000 00000000 927aa646 be0db63e 45794f89 d4712587 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 85488bc3 6cad29d3 d25bb760 94f43c28 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 80000000 00000000 3fc3414f d6d0b06b 4c01b8e3 30e2e6de +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 cdc351e1 db319290 6211914b e9ce9b56 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 12235426 f00d95e3 0350c5b6 f0660a18 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 907152eb 78604841 c96f8ea5 7031759b +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 80000000 00000000 6c0eb5d6 9772bd42 6dccfed2 53db859c +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 6e69e34c 29510fff 3fe90368 87329159 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 80000000 00000000 e327d823 6b2d3ecd 544a284b 79686d75 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 9ba8cef6 e7f80e0c 4136bed0 12362d9a +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 80000000 00000000 c0eed7ce 6eaf676a 66cf3cd4 20ee1258 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 e2a102ed 1306dfbd 18088d73 2ad203b3 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 1f530db1 45344f8c e782dbd5 1a9e476f +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 4088a06b 4986fe43 0a37c474 99853bc9 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 80000000 00000000 4a0bfe2d 6d38c858 71d3170e 871c4c6b +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 a44728cf 99964d4e 6c11ef52 f261d9b1 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 80000000 00000000 b7be56a8 29b7eb27 d0713407 1c015d45 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 720f816b fc240128 6cf925c1 718ab1cd +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 80000000 00000000 8d9b5126 ca07da70 04d57bbe 1bdc146f +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 f209882a cb81e957 d97f320f 03635b68 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 63b7f67b 35533d6a acff5c1d e3c9e3d9 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 80000000 00000000 7a532752 8f6680af 0db9bfab 0d33bcaa +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 80000000 00000000 595aeda6 b34e1b64 0c119a13 00834623 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 80000000 00000000 cad2076a 85890ca8 c59dac90 549d1fce +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 33ffd0ef 0c0babaa 08eb61d8 976b28d3 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 000000ff f7e104ab be0b3491 2397b283 b5a861b3 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 21816f54 5725716b 202fad3e 26c0da69 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff a95bdf5a b791e42f dba8f277 cdaff870 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 74c668e6 295aa836 671e0057 809aac97 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 000000ff 6c80bd64 1cf9a282 e07ae71a b7659073 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 000000ff 99c28353 d7142627 6298578b c78e1cb5 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 4d150fd5 c4c7937e f8eaf05c 47c5de1f +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 000000ff bef0c095 25d06762 ea140336 4033cc83 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 9ab8f614 5f5f8717 53a45bb0 b961b14b +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 000000ff b9cc0441 c291dc7b 125608d4 a5e48b9a +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 000000ff b20b345f b53497d8 98d069af fdc6ff85 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 000000ff 6f4126ba d37262eb 948fc600 e0ad87db +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 000000ff ee0a121c e2605764 b4441611 2f6213f9 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 3ecf3a05 fa6c6c61 e595463f 1dccb524 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 639dbb7f 92f573e3 fcbf4d49 d9b8a651 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 000000ff edb11662 f32ccdb4 59b654a0 b4c156d2 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff aab94b97 e10e41b8 caf908ba 26000a72 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 9e14dc32 072a4e95 907bafb9 1d7c7e56 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 8c8f6c05 2dd2144f 7b4b1890 2d33cd21 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 2d70ad73 d2936e08 023a5229 27024f69 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff d198566a 956e9f11 aff6033c b7a1e0d9 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 000000ff 8396e64c f66b5c04 2b3c5067 4984eca2 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 000000ff 27a41963 ab27c91b 651acdf0 54996ecc +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 81109c08 9da13963 e6ce44b5 8ebc1ec0 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 000000ff 893684a4 c76671cb 5ff2b138 26f596fc +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff f270746c 8a659b14 2597b05b b41b8ac6 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 6fc87a80 b9b202a6 14861218 39aa8048 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff a3692a84 fd8f8dfa ce1ff290 16f88d25 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 000000ff fbb888a1 4e8b803c 6cc94bef ddbef818 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff c7c4c6a9 c1bf2778 279d1ba1 7960de94 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 695878ca 94719854 9dd8d82d 99c457d5 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 41445324 58ecb758 96f36169 90bad6e1 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 260ffa79 d230efab a95ced9a afd4b25c +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 8fdb4fdc de0ca0da 72e24082 764ee577 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 000000ff a59adf40 317e08bb 1099c6b6 aa74f87d +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff 36f8f5dc 512092ae c300df3a 45d4ddab +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 662321c2 2dc580ec f8c30280 ab2e2d6b +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 198bc760 6fd7ee4e 8d5a18fc 49c316be +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 000000ff a713a3f0 00daaee4 e3e8d3ec 7a7d7056 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff d3633eb7 892b2455 19b1b392 569daedf +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 7694f06f ffca196c 92b6fcd1 ec177846 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 1c0e34f5 4eee2d80 65980ae9 732c4be2 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 6c83d21b e14ac358 0d1c78c2 78668cfa +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff c7b701c2 d2c32a77 fb9f7760 4f5157db +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 0454b442 2c74a5e4 945a81ac 7f9c1f7b +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 000000ff cfdf7117 5c542fd4 92d2a507 81b674aa +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 000000ff 19e70495 cfd13d17 35586663 1249a4ee +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 000000ff df69d37a 0c16d3a1 6b06175c 5c346c58 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000080 441f8846 7805ddde 01d6501c 66965a55 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000080 a4ea924d 9333f022 4c005326 811ad481 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 1fff4f86 30488a15 3473582f 24afed44 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 5b178f62 eccaa1aa 4dacef8b e120ecf3 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000080 888cabaa e962affe d6b811e0 da8998cf +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000080 01f6e1fa bcfe755b 59f405cb d3b9595d +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000080 a92c805a 07f594c6 82b56f52 fd277e6c +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000080 2814dfbf ef7a2f15 a63f540e 951ffd5f +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000080 916a6b19 5c6539d6 2e042e51 f1067340 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000080 61bf8f15 b1655376 2e585680 1910fb8d +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000080 d823be54 c018af09 c83c8aa4 1acb9df7 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000080 e475a6ec c5af66b1 9728aa88 3f22ffb6 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000080 0d9f50c5 63a94f4b a5c20fb8 eac1b9c8 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000080 6668bdc0 ac5a23df 080bc7fa bfdf8622 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000080 d19d9045 2e79a915 94922bdd 1259c766 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000080 bceba0f0 68947c27 0161f941 7de2146a +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000080 efc230aa 41961f4d 12330650 a5b27be1 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 438dc33d 39b01218 a0330845 93780676 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 38e5e94b 259b59dd f0f5f46a fdb2ea7f +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 e8cef36d 2b604c05 43b6c2a9 26d94cc6 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 106647b8 cfd28eb1 fd243ed7 89279207 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 cfd7caf8 aa1dc211 f9ceba3f 09b3dde3 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000080 b80ba363 35897d3d bd0b0ae1 4a29e020 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000080 454c62b8 04123d8b 53456512 a9c6eafa +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 0d875fd4 3799d4b3 1ef0689a 19775936 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000080 32793f33 3690320d fc0d04b9 45949259 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 bb3e2980 a0b65de2 15bb7894 1c1624d5 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000080 ee3efec8 3f12e6d5 3856536f 27d8042e +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 f951b734 5532181d c7e1f51c 3fa0c656 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000080 0ca4b22f f7dbf66f a5920bf6 b23cf0b5 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 65e54190 2e8a5593 d8a9213e d5dfc748 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000080 bee6b5b8 43957076 a6a35191 e559fdbb +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 8012169a 0778bf27 46b2b0bd cbab0500 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000080 9367dea7 e05cf125 dd1e32e1 3b33f515 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 dd095a3b b2e80097 1541b57e 963aa5a9 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000080 d6ec3e16 94364668 5237e175 c07a4ae7 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 c6479866 eda003f0 c72af0cf 8996bd8d +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000080 fd76301e d114c666 eaabe38e a2ee1acf +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 cde36b1a 4bd149c4 49b4af8c bf6ad382 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000080 e18c881c 7236049b 86ab2a17 7741d079 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 a2b1485b 2d362f5d 70e37119 9dfe9263 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000080 36ac4fcd 0f724248 457ec24f 7e7b9a01 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 8a320fae a0ee0eb8 bee52539 d49ca440 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000080 288480d9 073d5371 23cdb186 7061f0b1 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 04676afe 9bea090f aa0cf401 25ce78af +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000080 373bddf2 dc759e42 06e04841 d7933fff +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000080 0e2f4a16 f57c7ca6 fb4e4e01 bb68b93c +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000080 9b3bf539 5e0f2816 95f0b29c b4388b10 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000080 36cbd4d4 53867fd4 c5414655 f86902e6 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 2980bb5e 3c4ff48b cad6d110 93e28c48 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 312e0c21 66863de4 38c7d0c3 0ff3214a +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 95b94d16 e22e1a1f 9aa4d3a0 b054e524 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 b28a787b bc920c57 3c391390 281e9428 +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 214588d9 9e5ecced a8fb6fba be9e731b +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 eff22c55 84357d81 d153dcd8 bf81cca7 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 61c77b2a 98dc4d28 01635a07 616bac16 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 5d487e87 4fad2564 633ac064 9ffb8ccf +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 a716fa17 d0fdb0e1 0332c62c ae3de920 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 34eab877 9414be2a cb17472f f1559987 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 46ec8cb1 8ed57197 e14dab1d 71fd3de5 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 de09d251 890dbcbe 91552c2f 0969f34e +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 c632f05c 217c5375 71edcdba 1f903697 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 ad5f4d61 275baa40 837a4ba9 f9bc3b63 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 7f9b6db4 cbdb9890 a4e63f50 dbcacc9d +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 2a0094a1 23e30b4a 04bb601e bbd3cd3e +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 f5724c8a 5056e5dc de3df5cd 8b0f7208 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 3f47da17 060bf755 978efcee dc6ec630 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 b166b082 d5fc1935 412a33cc 7fe5bdeb +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 ec675656 0518c33b 5724d6d9 2a989266 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 0df3c708 be07f0ea 8736897c 46654b90 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 4cdb44f2 4eb10192 85ed84e8 6fed9533 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 0000ff00 5b6ab4a6 8322cd4f 0256450b 250c608f +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 0000ff00 f82a8df0 17a68ce6 57e4a9d3 3dd1575f +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 1cc8256a 95df59dc 63098fae 7866ccc8 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 e865b08e 7ddd6871 e3c02bef cd1893f4 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 2b384e63 a9d3e4d6 ee7258cd e31778f1 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 5db3377c e4475048 d82ad1c0 b0ccc4c6 +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 25330c24 3fe84857 7a1a5f33 975eaa32 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 f4db2e62 af485e1d 4f03d243 c668ad02 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 7ac0fcd2 81cea5e7 a9c50d20 cc6f3d71 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 08e5ad77 fcd190c5 ee22854d bb3dbdaa +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 1cf237e1 ed803394 31ad06dd b9d3def7 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 63b7d290 da9032c0 9fa386bf 170e735f +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 0c9db5ca d9b700e0 9633e409 32e90ccf +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 a3596eb4 03a8793a d2046a69 f524015a +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 ce9c088d cac32294 1dcea918 70c68754 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 30bf1275 033f5ce0 e5a937cc b8a92a63 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 00f4eadb 2c7de0ff 8cbddde5 100e5989 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 07731ecf 8b9e331a 703f296e fec62773 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 5a5857fe 540171a0 46420351 21377428 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 bd1fb099 803e090a 6eae74e5 a6306414 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 679a91e1 130b9bb9 c4149fe9 3cd42b79 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 aa99531d cb58591d 5b8311c6 73dc851d +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 e468fa6d 537601a5 0736eb73 00cdfaf6 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 5fea58d2 ffbe434a 6e460b2c f0da2415 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 0000ff00 5d9c00e5 0a20546d 438080b5 ac7259a5 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 0000ff00 ed43dcf1 29c33a47 8dc88e14 99a62820 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 0000ff00 c2d4e578 cd384c4d 320ac18d 60eefb71 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00008000 dc5b2a9a 0afef152 4cc6ce2b e496280e +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00008000 ce2452c9 d8746b9c 5fa4b592 676c01f6 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 b2e83580 93092e6f 832452f0 9b71e0ec +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 359a248d e0717f2f 966b85aa 1c3edbae +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00008000 c1498c85 1c5caa7d 927cfa28 c06b49ca +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00008000 bb49de96 49b1c65a 9f592b56 4b9e518a +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00008000 1818ca8d 5f7d9737 1c27d3b0 78dc7efa +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00008000 8e697715 f204f264 3ddbef0f b4d6acf4 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00008000 33792d55 6f3b4039 107ca94d faeb84ad +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00008000 8a1365ce a5573d6b 0d3dca48 70c61ecd +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00008000 3f92ba86 82d9540d 8ccf984e 6af3e6b3 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00008000 257fb510 2f8721de 4fd1b056 3b60363e +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00008000 bb700f86 7bdb19b3 9e11db4a 9beea8a4 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00008000 7ca7cb18 cdb73ae0 b3f297f1 aa17ae2f +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00008000 af439f17 1f7c8397 11fbac69 44eb3140 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00008000 3057672f 5d1f5c34 0f169cc5 a5e63f71 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00008000 56544e93 500aece7 58e47d5e f1a52735 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 96b33f5d a134b4bc 91a8ebe8 7b23e4f0 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 58c3c3ea 00fe987a cafbc39d d9c48178 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 e420e4dd 6f693315 ac6f48be 9ef6d10c +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 86df5e20 f9559125 215f0b08 f5d3929e +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 bb31badd c2618da6 d23fb278 b4bd3d10 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00008000 8bac757b 5a3083a8 069c44d6 9174a0d0 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00008000 fe734946 d39c1fba 7f1ff519 15307785 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 8a37c599 ec59f39b 44998ae3 0d5a394f +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00008000 4efca554 eb7e76b7 cd2d9623 36f0afe2 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 8333d78e 5737cb50 1a0885ac c203ece1 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00008000 fc690244 15cf363a 503e643d 69a79d4d +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 31b20472 166c52bc 5b63968a 47133bce +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00008000 cd8574d8 1b115532 65daa911 706930fb +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 09ab4d96 2da926c6 e65bd1bd e1880ac9 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00008000 6dcb3eed 584a0e60 96dd3d0f 16fcef9b +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 e3b63fa1 394cfae6 31d34bef ea6c7ba0 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00008000 51cb0477 5d484017 9e5a14ab e071ad23 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 e7245aaf 0cd8556a 94525c59 cc84d991 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00008000 8561b8e7 af8a34ce f8be98d5 a68da87d +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 df20f930 275651ce a922c02b 4600bae3 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00008000 c067bc44 05061760 bf3b3abb 5f40267d +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 414f2d26 020e128c 4baea3f5 8bf858bf +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00008000 68c2b324 825c48dd 9a314db8 d03c0fbc +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 81fc8b30 4c30c6f9 8c1303e7 1ce78a18 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00008000 31b85719 f187d654 09b1e0f6 b24a59aa +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 ce669498 81c6a9b3 b7decc86 0568f8a7 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00008000 24293624 33cf83ee c99ade5a 4f6dbc01 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 699467f0 602914f1 73dba5fd 6e518a1a +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00008000 6e06bb5b 94088181 b8d7177c 8817e9c1 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00008000 2042d92e 54aa35dd 35ce06ee 5d805f84 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00008000 ef8a0eb8 d41d547f 0b2f495d 97f37acd +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00008000 3933029f d9cf9fe5 59ce01da d11c35c8 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 f3f46196 d11cae53 af61b8ee b22e6b3b +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 6f3d9f29 76c3e022 e3727918 d589dc6d +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 6b0e18a2 5ac5b5df 25fb5583 e3bf3c7c +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 5b4c73fe 0b3f41ed 9ac98d5c baa8d82e +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 a7049b58 deb285fc fc21d230 5f1c6147 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 bfac55f9 02b0f828 807285e5 0376257a +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 6c736849 eec20a20 77b2b107 55fa1de7 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 d27272c1 85c6ff05 8567961f 74443e44 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 da91acd2 71d9a6be 033ac1c4 12f26984 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 626813a9 ce47f3d6 96d92c2d fa083734 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 6225c1f8 1d45b19f 5176e440 b3ca458e +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 5460ea28 b640c053 77469753 bee6cff7 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 d2c422dd 3010efc5 b202f5d0 be05c6dd +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 be9431a7 0911a5a4 bd2abe83 612f8586 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 fb686a25 4ff2114c deb1c3b9 854ee3db +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 61791f3a eda4ed85 0fef769c 8cb219ab +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 662d6593 0dd2a51f 3df30975 881ae692 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 b572dd2f b403b910 ddade016 68524bf8 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 02df66b2 6844e2d4 c6a601ad 678e8471 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 965e9a17 6141df53 2472c9e7 a2e94bb7 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 f7cfcaac f631f03d 78328e33 6c26b793 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 93788181 6d25b373 cead0033 6ff7a44e +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00ff0000 ae37fdd7 fdc156be 92955610 b13722b1 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00ff0000 4fce4684 22a96286 952f4e4b 974e97b3 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 c6b16976 fd2c1fd0 b86c0899 d95ed223 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 65129760 4c61b126 df0dd04d 8322c305 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 04764b97 84f92827 1d8e42ab 162444fe +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 8d08195b 8c7198d2 31d048ae df36c78e +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 7935ec55 74893e0a a38f531e e93402af +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 c699a874 35cc0a22 acfd92ad 15dc044d +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 36fdddcc c9359a1d c2ac1dda 0db7e34f +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 0e96dfbd 0f307501 8e70f586 dcf688d7 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 8c821ea2 8f488d76 4f271e49 74890070 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 d7c029b3 94aaf818 dbfa13c3 b7d8435c +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 851d7dfc b9cb6acb cc3bda81 056f06ea +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 86837cdc d5bba7d9 938abbda e8ab258d +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 ef8a2b6d 2bd164f7 ee06fc74 203fc944 +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 6f19f017 3b4ef67c 7be9a3c8 f858e684 +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 f50a6906 d1d32a39 dc3756c6 c36cadad +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 0842f1d8 db7fffdc def8c50c 6693b706 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 bdf4fcbd 8bc60f49 55d3d3f5 bc6333cc +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 7105df6e f5ffee84 b5137ddf 6aef0f35 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 c1f4a96d cadeb327 221fba3b c64dc031 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 442c7b1b 65ce7736 338602d5 5cabab3f +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 be3e7800 996bba5f 58e5821e 4e4924e3 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 7d1317c5 2d1e0b31 2bd4b871 a4cf6b92 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00ff0000 53c36f2d 8d53f6ef 53113e46 04a659e0 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00ff0000 3c543e7c 261edcd4 726dfbf3 c8d99a69 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00ff0000 ea418a97 139c31e5 ac9b19ba aa538a8e +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00800000 42046aaf b91498a5 6a259a16 b3eb3a2e +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00800000 fd625108 b17ba275 97886513 21ad40a9 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 aafef5bb 62b249f9 8b0aa44f 45e468f8 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 ec330007 44aa0288 25be9228 d5f8e13f +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00800000 673aceb7 7ca9ae9f d83907e6 7e9256bc +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00800000 5676e018 edcf0a72 bea8a741 f795cda6 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00800000 6d5d7593 d401b974 6a0f1bba ed12286c +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00800000 0ae1d756 b94312b5 5675a578 5b4a46c4 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00800000 1bd24cc0 e8080a9d 0ecbb72b f3a76d57 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00800000 3966784c 7dc969a3 44eb558b 8961e6dd +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00800000 73b4879c eace0901 4cc1cafb 8553c489 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00800000 e80a74ba 362da2ef ef2d5659 e533ba90 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00800000 5e55ee55 3f4e0282 031ca33c 21b48f8e +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00800000 93f70128 e5821be3 50409b66 0897ccad +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00800000 bd19830e a5960c21 7fd3aa66 147d3108 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00800000 91808867 737d2300 62bfc781 9de2d107 +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00800000 3771eb8b c3b77eed e250ecf5 5c5eb4fd +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 f09b7b64 56f85b75 f6bf2b80 9b0cc239 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 93139c5c 96ccedb3 8b7391ff d0119d20 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 a59252d0 3c860eaf b7ad1fc4 f978a8d1 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 159c5ad0 8d3752f2 5e4e902d c0e4e886 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 8aa631f8 069ae5ab 0008b3f9 60404759 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00800000 a34f31cb 506b2397 89f24851 e15455d3 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00800000 aa3133ac 1e2abffd ba03d968 7fd7861c +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 19d0a84f f97c0cec b2524039 aaffe800 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00800000 c2ea9b6d 27c10f71 a6896dfd 2050fcac +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 ec8aa5b3 cb97a73e 7aaf19c1 035d9258 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00800000 50da963d 0e7a7178 5953710a b025b96f +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 b4b91bc5 628a3b09 8187bf2c d218b973 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00800000 e701a2de fe5f816a 76ae8ffa f5e8a4d7 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 c851d186 92d4ae9d 8ebd58d4 beb32d60 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00800000 44b837e3 8f5d1220 465dce59 4beb067f +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 312dfdd7 dc15914d d3365f15 bae1edcb +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00800000 ae8c17d8 1a855cba 066ecafc abd9a392 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 35caf6a0 b779a7e5 963fd0f5 530f640c +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00800000 44ec39e9 1b7bc783 34a68e2a 216e372c +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 b92eb27e e15ccf20 df0da553 3d94e19b +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00800000 e9f64c3a fe517c12 13b493f4 606fbfbb +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 d4ae37ff b9d776d0 7dd5d17b 1c692adc +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00800000 18d6c6fc 95ca9ec2 efbb03cd 45efbadf +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 5cdc4bd5 ad3f779d 2e66cd6e 3d02b112 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00800000 02baadd8 220a382f 810b2330 81b9b93c +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 37e2e70a ee2871ac 2a5a8ac9 cc44e32b +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00800000 3eceab21 6056d03c 8c05d55e e088c124 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 4fc8c7bc 3d1c046d 275bc435 81346eab +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00800000 6659edac 26290dd5 0a3e3455 b31a2be3 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00800000 e6c0191d 261dcebc d41bbe82 8e6e9730 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00800000 197b4a3b ef928010 96e75bd3 a2d1e856 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00800000 e7b8e74d 038826eb 03a47ad1 4ac33455 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 27b00d10 76eeb5fe 30fea418 02742412 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 fd72843d 364facaf 6f610ab5 a3b54a17 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 77e3bb3f 612cad81 f7568471 a28cf424 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 c516b0a8 c9b2ac37 8386050b 7ab691ff +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 35c207f6 29adeb17 53c324da 2ee41036 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 64d4c6f5 51a9f791 99290f8e 5dadfe9f +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 06395df1 78ef47c2 3611e5d3 c858d573 +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 2db4b9d2 48766956 84e31755 75eff4b7 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 f7a2dafc 4227e584 db7eb815 fc23888e +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 8241b04f 294be7c6 77da5fbc 1d297fe7 +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 9f195b14 d92996f6 ccf2d097 282d3d82 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 8c03f471 c325a44e af4cf54d 818945ac +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 538b8502 3da680b4 4ba5207a ff17a65e +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 0bbf6ebf 277560b4 ebcbc2eb 62cf1bd2 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 00e77ac0 277dc0dc 2323de1e c4d15453 +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 e679e1e6 78b4356b d50ac033 7ba1b8ef +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 76d2f408 b92d7e94 15ef11ff fc6057c4 +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 c69cb78e 69407a3c 4fe5a98a b278c6b9 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 4952fdd0 05239ddb b842ce7d f3707c1f +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 e93dbade d6ad32cd 0cedc6e8 dbe27d0d +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 d418902a e8718bef 411592de 89d0b3f6 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 f0c0139a 4cecb0b3 3dd22f10 82a32996 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 ff000000 6879fd3b dcd3090c cd76e918 9763aa16 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 ff000000 006ca0cb 05501fdb 5b52dd6d 659411d8 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 0148bb9c dd798f1a 510eb47b 20046ca7 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 b8bd5381 14cda4be 07e491e2 36e08dc9 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 882d166f f0c359dc b21dc4a4 053a5ee3 +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 301a4295 e655143d 6dd028ad fedda3ac +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 688a4524 7aaabc09 25b5a1b5 08088fa9 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 c17b1d49 cc5607a9 21ee2dfe 95a99bff +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 2aced990 38892fc6 49e2b4c6 3a52a56f +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 0fa8f694 e50536aa 8b05a5ea 30391e50 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 ede36e48 e2d7501d 0fbdb070 d7611f60 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 ed6e7836 13d33ce8 2ec70ea2 4b7458e3 +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 6180aae3 f456e639 31a87e11 c85999b0 +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 b0f72296 b437656f 0c6c13af 42269ae3 +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 8992f96a 38f12202 b145b3e0 4b22b7df +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 e3266f68 75e172c8 4e627e57 2f18974e +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 43f0eb04 f210d529 0a8bf0ce 38681023 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 8bc32dfc 73fda05d 6150a6a3 55f1806c +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 cc8357d2 581e8348 460a644c 509d3ec2 +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 3e3698b8 c03b8b6f 1fca337d e8290c22 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 cf661d8e f1adc07c c6751ffb 2b670e1e +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 8b05dbd5 3cb2ff22 fdd8ce3b f863a7e6 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 8cb4ba53 7ed4b1f4 75c5c0b3 2df76a1a +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 3eef466a 0224052f acd47be6 9aba9889 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 ff000000 73fb0705 020ccd4e 85f36527 d8c79692 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 ff000000 2c3fe25f 3a57e7ee bc1827bd 6b3d18b0 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 ff000000 8bbcd0b2 6ee1140a 73e65601 21fb1ba7 +ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 fb029bde c66dcda0 d5e37e9e b16153f4 +ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 80000000 c8628b14 65dd32ad 9df2d576 84590ee0 +ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 56abd8fd 08eb9fbe c7c0e3ef 7ebe6a02 +ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 86d7ca0a 10293363 a91e2acf 41cb60cd +ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 2cbc07ec 78f6ebc0 e178d485 e1bd2a79 +ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 80000000 fc0dd527 5525a559 b82ec796 3fce8b27 +ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 80000000 35f94c49 dcec4494 b32b5591 607c35ae +ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 80000000 223ecea6 9c6b82b9 8cda2ead fbdb3669 +ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 60302545 19be4945 ed1f61af 47ed7642 +ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 80000000 1e3c6ed3 1a6d28f8 e927216b 6983fe5f +ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 80000000 64ec8748 bc735a79 154db177 98d6e304 +ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 80000000 eb8dbaaa c8d657ba 157635c4 cd8027b1 +ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 006d78b1 3240f565 1591df9a 3920f3a9 +ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 80000000 e63ae4b3 f4a20e6a b06cb99c ab9ebae3 +ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 80000000 0d0a1f5f 8b52c922 b655a04d 154509fb +ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80000000 4f955239 57ea76d1 2ed261e8 6665c61f +ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 80000000 167a4885 bdd9d560 44901710 a1db3fef +ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 01303e4d cc35c236 602a988b 67b25d16 +ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 d59d1ae1 201cf528 ca644f98 c863c919 +ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 a64ddf44 b9181f8f 08467b4c 0bddb7e5 +ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 1803efc8 007c2e15 25833640 8e7345c3 +ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 5a9b7d60 6ea2901e 78003e60 8942fbf4 +ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 80000000 29d3113a 43eaba4a 2758c58e 8fff4986 +ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 80000000 c403cb6c b87ce89f ddc5a406 eb5c0ea4 +ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 e7c4b1fa b544220c f4049712 84c85034 +ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 80000000 dea49ca5 785d289e f24509fb 37a561d4 +ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 39a9c229 b37e81f3 25136a6b 31f8df5d +ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 80000000 c6a48363 d638f93c 0f7e20a0 2aa2107f +ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 6e32daa1 77487aa8 981c7542 45c89ac2 +ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 24b7ff04 54a379cd 54105878 5e699328 +ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 4a217568 5ab95f01 c470dd0e cc312296 +ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 80000000 59f4e457 b3b2944d 2db60de7 5d6596c5 +ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 6291ff37 e4ec1241 2c6b7ea5 070f2af3 +ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 80000000 c52c541e 96b8b03e 29020434 07b8b52e +ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 1d9ca290 d22df559 677b4219 211115fd +ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 80000000 8b22d574 a1cffe3d 9c70e4c4 4d39249d +ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 198c7bbb c5fc8419 46ddb6b8 f63f407b +ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 f07ea702 360cb148 72e5e1fa e903112e +ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 b117d222 cb3f5001 c5eb6c25 7440f4e5 +ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 80000000 f062efce 07b8dae5 6e487b3c ee17a039 +ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 93345860 df9ce586 7c8b5ff3 1028ea8a +ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 80000000 f7ae5400 234e6d34 aa1e51c0 cdf51bd4 +ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 df755c0e 4842b68b a3d26d09 b1e5d506 +ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 80000000 dc546bee be2edfda 2887d5b6 39e817e9 +ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 e9375d82 8c142da5 cdf4bffe 421e1845 +ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 a0e70327 7caee527 6a428c61 3c4f3840 +ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 80000000 b80e41ea 4a1fa670 348659dd ee801943 +ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 80000000 020ddcdd 4a5fbd4f 03373d33 9415f871 +ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 80000000 d45af446 218fe8d8 47653a38 a1d863e2 diff --git a/tests/rngNxW.h b/tests/rngNxW.h @@ -0,0 +1,48 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +RNGNxW_TPL(philox, 2, 32) +RNGNxW_TPL(philox, 4, 32) +RNGNxW_TPL(threefry, 2, 32) +RNGNxW_TPL(threefry, 4, 32) +#if R123_USE_64BIT +#if R123_USE_PHILOX_64BIT +RNGNxW_TPL(philox, 2, 64) +RNGNxW_TPL(philox, 4, 64) +#endif +RNGNxW_TPL(threefry, 2, 64) +RNGNxW_TPL(threefry, 4, 64) +#endif +#if R123_USE_AES_NI +RNGNxW_TPL(ars, 4, 32) +RNGNxW_TPL(aesni, 4, 32) +#endif diff --git a/tests/time_boxmuller.cpp b/tests/time_boxmuller.cpp @@ -0,0 +1,142 @@ +// Test for boxmuller.h on CPU +#include <Random123/philox.h> +#include <Random123/threefry.h> +#include <Random123/boxmuller.hpp> +#include "util.h" // for timer() + +#if __GNUC__>=7 +#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#endif + +typedef r123::Philox4x32 CBRNGF; +#if R123_USE_64BIT +typedef r123::Threefry2x64 CBRNGD; +#endif + +const char *progname = "time_boxmuller"; + +// Each call to boxmuller() returns a pair of values in the .x and .y +// members, which we add up into sum just to avoid being optimized away. +template <typename CBRNG, typename F, typename F2> +F timedloop(typename CBRNG::ukey_type k, size_t Ntry){ + F sum = 0.f; + typename CBRNG::ctr_type ctr = {{}}; + const size_t csize = sizeof(ctr)/sizeof(ctr[0]); + CBRNG rng; + + for(size_t i=0; i<Ntry; i+=csize){ + ctr.incr(); + typename CBRNG::ctr_type u = rng(ctr, k); + F2 f2; + switch(csize) { + case 8: f2 = r123::boxmuller(u[6], u[7]); sum += f2.x + f2.y; + f2 = r123::boxmuller(u[4], u[5]); sum += f2.x + f2.y; + case 4: f2 = r123::boxmuller(u[2], u[3]); sum += f2.x + f2.y; + case 2: f2 = r123::boxmuller(u[0], u[1]); sum += f2.x + f2.y; + break; + default: + R123_ASSERT(0); + } + } + return sum; +} + +template <typename CBRNG, typename F2> +void dumploop(FILE *fp, typename CBRNG::ukey_type k, size_t Ntry){ + typename CBRNG::ctr_type ctr = {{}}; + const size_t csize = sizeof(ctr)/sizeof(ctr[0]); + CBRNG rng; + + for(size_t i=0; i<Ntry; i+=csize){ + ctr.incr(); + typename CBRNG::ctr_type u = rng(ctr, k); + F2 f2; + switch(csize) { + case 8: f2 = r123::boxmuller(u[6], u[7]); fprintf(fp, "%g\n%g\n", f2.x, f2.y); + f2 = r123::boxmuller(u[4], u[5]); fprintf(fp, "%g\n%g\n", f2.x, f2.y); + case 4: f2 = r123::boxmuller(u[2], u[3]); fprintf(fp, "%g\n%g\n", f2.x, f2.y); + case 2: f2 = r123::boxmuller(u[0], u[1]); fprintf(fp, "%g\n%g\n", f2.x, f2.y); break; + default: + R123_ASSERT(0); + } + } +} + +#define NREPEAT 20 + +template <typename CBRNG, typename F, typename F2> +void timedcall(const char *tname, typename CBRNG::ukey_type k, size_t Ntry, char *out_fname) { + double cur_time, dt; + F sums[NREPEAT]; + int i; + FILE *fp; + char *fname; + if (out_fname) { + fname = (char *) malloc(strlen(out_fname) + strlen(tname) + 2); + CHECKNOTZERO(fname); + sprintf(fname, "%s-%s", out_fname, tname); + fp = fopen(fname, "w"); + CHECKNOTZERO(fp); + } else { + fname = NULL; + fp = NULL; + } + (void) timer(&cur_time); + /* + * we call timedloop NREPEAT times so that it is easy to keep + * Ntry the same for boxmuller.cu and boxmuller.cpp, so sum[0] + * can be checked. + */ + for (i = 0; i < NREPEAT; i++) { + k.v[sizeof(k)/sizeof(k.v[0])-1] = i; + if (fp) + dumploop<CBRNG, F2>(fp, k, Ntry); + else + sums[i] = timedloop<CBRNG, F, F2>(k, Ntry); + } + dt = timer(&cur_time); + if (fp) { + printf("%s %lu written to %s in %g sec: %gM/sec\n", tname, (unsigned long)(Ntry*NREPEAT), fname, dt, Ntry*NREPEAT*1.e-6/dt); + fclose(fp); + free(fname); + } else { + printf("%s %lu in %g sec: %gM/sec, sum = %g\n", tname, (unsigned long)(Ntry*NREPEAT), dt, Ntry*NREPEAT*1.e-6/dt, sums[0]); + for (i = 1; i < NREPEAT; i++) { + printf(" %g", sums[i]); + } + printf("\n"); + } +} + +const size_t DEF_N = 200000; + +int main(int argc, char **argv){ + CBRNGF::ukey_type keyf = {{}}; +#if R123_USE_64BIT + CBRNGD::ukey_type keyd = {{}}; +#endif + size_t Ntry = DEF_N; + char *dumpfname; + + dumpfname = getenv("BOXMULLER_DUMPFILE"); + if(argc>1) { + if (argv[1][0] == '-') { + fprintf(stderr, "Usage: %s [iterations_per_thread [key0 [key1]]]\n", argv[0]); + exit(1); + } + Ntry = atol(argv[1]); + } + for (int i = 0; i < (int)(sizeof(keyf)/sizeof(keyf[0])-1) && 2+i < argc; i++) { + keyf.v[i] = atol(argv[2+i]); + } + timedcall<CBRNGF,float,r123::float2>("float", keyf, Ntry, dumpfname); + +#if R123_USE_64BIT + for (int i = 0; i < (int)(sizeof(keyd)/sizeof(keyd[0])-1) && 2+i < argc; i++) { + keyd.v[i] = atol(argv[2+i]); + } + timedcall<CBRNGD,double,r123::double2>("double", keyd, Ntry, dumpfname); +#endif + return 0; +} + diff --git a/tests/time_boxmuller_cuda.cu b/tests/time_boxmuller_cuda.cu @@ -0,0 +1,181 @@ +// Test for boxmuller.h on CUDA +#include <Random123/philox.h> +#include <Random123/threefry.h> +#include "util.h" // for timer() +#include "util_cuda.h" // for cuda_init, CHECKCALL +#include <Random123/boxmuller.hpp> + +typedef r123::Philox4x32 CBRNGF; +typedef r123::Threefry2x64 CBRNGD; +int debug = 0; +const char *progname = "time_boxmuller_cuda"; + +// Sometimes warnings are A LOT more trouble than they're worth. +// if we just write u[6], we get warnings +// so we write u[(csize>n)?6:0]. +#define UGLY(n) (csize>n)?n:0 + +// The timedloop kernel sums N randoms per thread for timing and +// records that sum in out[tid] (mainly to ensure that +// the random generation process does not get optimized away) +template <typename CBRNG, typename F, typename F2> +__global__ void timedloop(F *out, typename CBRNG::ukey_type k, size_t N){ + unsigned tid = blockDim.x * blockIdx.x + threadIdx.x; + const size_t klast = sizeof(k)/sizeof(k[0]) - 1; + R123_ASSERT(k[klast] == 0); // uses last element of key to + k[klast] = tid; // ensure unique key per thread + F sum = 0.f; + typename CBRNG::ctr_type ctr = {}; + const size_t csize = sizeof(ctr)/sizeof(ctr[0]); + CBRNG rng; + + for(size_t i=0; i<N; i+=csize){ + ctr.incr(); + typename CBRNG::ctr_type u = rng(ctr, k); + F2 f2; + // Using a loop instead of the Duff device here costs 10%, + // at least in CUDA4.2 circa Jan 2013 on a Tesla C2050! + switch(csize) { + case 8: f2 = r123::boxmuller(u[UGLY(6)], u[UGLY(7)]); sum += f2.x + f2.y; + f2 = r123::boxmuller(u[UGLY(4)], u[UGLY(5)]); sum += f2.x + f2.y; + case 4: f2 = r123::boxmuller(u[UGLY(2)], u[UGLY(3)]); sum += f2.x + f2.y; + case 2: f2 = r123::boxmuller(u[0], u[1]); sum += f2.x + f2.y; + break; + default: + R123_ASSERT(0); + } + } + out[tid] = sum; +} + +// The dumploop kernel records all the normal randoms individually in out, +// so it produces N randoms per thread. Each thread records +// its randoms in tid, NTHREADS+tid, NTHREAD*2+tid, ..., NTHREADS*(N-1)+tid +// which hopefully results in nicely coalesced writes from each warp. +template <typename CBRNG, typename F, typename F2> +__global__ void dumploop(F *out, typename CBRNG::ukey_type k, size_t N){ + unsigned tid = blockDim.x * blockIdx.x + threadIdx.x; + const size_t klast = sizeof(k)/sizeof(k[0]) - 1; + R123_ASSERT(k[klast] == 0); // uses last element of key to + k[klast] = tid; // ensure unique key per thread + typename CBRNG::ctr_type ctr = {}; + const size_t csize = sizeof(ctr)/sizeof(ctr[0]); + CBRNG rng; + + for(size_t i=0; i<N;){ + ctr.incr(); + typename CBRNG::ctr_type u = rng(ctr, k); + F2 f2; + // Using a loop instead of the Duff device here costs 10%, + // at least in CUDA4.2 circa Jan 2013 on a Tesla C2050! + switch(csize) { + case 8: f2 = r123::boxmuller(u[UGLY(6)], u[UGLY(7)]); + out[blockDim.x*gridDim.x*i + tid] = f2.x; + i++; + out[blockDim.x*gridDim.x*i + tid] = f2.y; + i++; + f2 = r123::boxmuller(u[UGLY(4)], u[UGLY(5)]); + out[blockDim.x*gridDim.x*i + tid] = f2.x; + i++; + out[blockDim.x*gridDim.x*i + tid] = f2.y; + i++; + case 4: f2 = r123::boxmuller(u[UGLY(2)], u[UGLY(3)]); +#undef UGLY + out[blockDim.x*gridDim.x*i + tid] = f2.x; + i++; + out[blockDim.x*gridDim.x*i + tid] = f2.y; + i++; + case 2: f2 = r123::boxmuller(u[0], u[1]); + out[blockDim.x*gridDim.x*i + tid] = f2.x; + i++; + out[blockDim.x*gridDim.x*i + tid] = f2.y; + i++; + break; + default: + asm("trap;"); + } + } +} + +template <typename CBRNG, typename F, typename F2> +void timedcall(const char *tname, const char *out_fname, CUDAInfo *infop, typename CBRNG::ukey_type k, size_t N) { + double cur_time, dt; + const int nthreads = infop->blocks_per_grid*infop->threads_per_block; + const size_t nrand = out_fname ? N * nthreads : nthreads; + const size_t out_size = nrand*sizeof(F); + F *d_out, *h_out = (F *) malloc(out_size); + CHECKNOTZERO(h_out); + CHECKCALL(cudaMalloc(&d_out, out_size)); + (void) timer(&cur_time); + if (out_fname) + dumploop<CBRNG,F,F2> <<<infop->blocks_per_grid, infop->threads_per_block>>> (d_out, k, N); + else + timedloop<CBRNG,F,F2> <<<infop->blocks_per_grid, infop->threads_per_block>>> (d_out, k, N); + CHECKCALL(cudaDeviceSynchronize()); + CHECKCALL(cudaMemcpy(h_out, d_out, out_size, cudaMemcpyDeviceToHost)); + dt = timer(&cur_time); + printf("%s %zd in %g sec: %gM/sec\n", tname, N*nthreads, dt, N*nthreads*1.e-6/dt); + if (out_fname) { + char *fname = (char *) malloc(strlen(out_fname) + strlen(tname) + 2); + CHECKNOTZERO(fname); + sprintf(fname, "%s-%s", out_fname, tname); + FILE *fp = fopen(fname, "w"); + CHECKNOTZERO(fp); + for (size_t i = 0; i < nrand; i++){ + fprintf(fp, "%g\n", h_out[i]); + } + fclose(fp); + free(fname); + } else { + int nwoops = 0; + printf("%s h_out[0] = %g\n", tname, h_out[0]); + for (size_t i = 0; i < nrand; i++){ + if(h_out[i] == 0.f){ + if(nwoops++<10) + printf("Woops %s h_out[%zd] = %g\n", tname, i, h_out[i]); + + } + } + if(nwoops>10){ + printf("Woops %s %d times\n", tname, nwoops); + } + } + CHECKCALL(cudaFree(d_out)); + free(h_out); +} + +const size_t DEF_N = 200000; + +int main(int argc, char **argv){ + CBRNGF::ukey_type keyf = {}; + CBRNGD::ukey_type keyd = {}; + size_t Ntry = DEF_N; + char *cp = getenv("R123_DEBUG"); + if (cp) + debug = atoi(cp); + if ((cp = getenv("BOXMULLER_DUMPFILE")) != NULL) { + Ntry = 8; + } else { + Ntry = DEF_N; + } + if(argc>1) { + if (argv[1][0] == '-') { + fprintf(stderr, "Usage: %s [iterations_per_thread [key0 [key1]]]\n", argv[0]); + exit(1); + } + Ntry = atol(argv[1]); + } + // XXX cannot use keyf.size in host code, only in device code + for (int i = 0; i < (int)(sizeof(keyf)/sizeof(keyf[0])-1) && 2+i < argc; i++) { + keyf.v[i] = atol(argv[2+i]); + } + for (int i = 0; i < (int)(sizeof(keyd)/sizeof(keyd[0])-1) && 2+i < argc; i++) { + keyd.v[i] = atol(argv[2+i]); + } + CUDAInfo *infop = cuda_init(NULL); + timedcall<CBRNGF,float,r123::float2>("float", cp, infop, keyf, Ntry); + timedcall<CBRNGD,double,r123::double2>("double",cp, infop, keyd, Ntry); + cuda_done(infop); + return 0; +} + diff --git a/tests/time_cuda.cu b/tests/time_cuda.cu @@ -0,0 +1,175 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* + * CUDA test and timing harness for Random123 RNGs. Uses macros + * and util_expandtpl.h to "templatize" over all the different + * permutations of RNGs and NxW and R. + */ + +#include "util_cuda.h" + +#include "Random123/philox.h" +#include "Random123/threefry.h" + +#include "time_misc.h" +#include "util_print.h" + +#define KERNEL __global__ +#define get_global_id(i) (blockDim.x * blockIdx.x + threadIdx.x) +#include "time_random123.h" + +#define TEST_TPL(NAME, N, W, R) \ +void NAME##N##x##W##_##R(NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t kactr, unsigned count, CUDAInfo *tp) \ +{ \ + const char *kernelname = PREFIX #NAME #N "x" #W "_" #R; \ + NAME##N##x##W##_ctr_t *hC, *dC; \ + int n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \ + double cur_time; \ + size_t i; \ + const size_t nworkitems = tp->blocks_per_grid * tp->threads_per_block; \ + const size_t szC = nworkitems*sizeof(hC[0]); \ + \ + /* allocate vector of counters in device memory, initialize to zero */ \ + CHECKCALL(cudaMalloc(&dC, szC)); \ + CHECKCALL(cudaMemset((void *)dC, 0, szC)); \ + /* allocate and initialize vector of counters in host memory */ \ + CHECKNOTZERO(hC = (NAME##N##x##W##_ctr_t *)malloc(szC)); \ + for (i = 0; i < nworkitems; i++) { \ + size_t xi; \ + for (xi = 0; xi < N; xi++) { \ + hC[i].v[xi] = 0; \ + } \ + } \ + unsigned kcount = 0; \ + double basetime = 0., dt = 0., mindt = 0.; \ + for (n = -2; n < niterations; n++) { \ + if (n == -2) { \ + if (count == 0) { \ + /* try to set a good guess for count */ \ + count = (unsigned)(tp->cycles ? tp->cycles * 1e-8 : 10000); \ + dprintf(("starting with count = %u\n", count)); \ + } \ + kcount = count; \ + } else if (n == -1) { \ + /* use first iteration time to calibrate count to get approximately sec_per_trial */ \ + if (count > 1) { \ + count = (unsigned)(count * sec_per_trial / dt); \ + dprintf(("scaled count = %u\n", count)); \ + } \ + /* second iteration is to calculate overhead after warmup */ \ + kcount = 1; \ + } else if (n == 0) { \ + int xj; \ + /* Check that we got the expected value */ \ + for (xj = 0; xj < N; xj++) { \ + if (kactr.v[xj] != hC[0].v[xj]) { \ + printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \ + printf(" but got\n"); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \ + if(!debug) exit(1); \ + else break; \ + } else { \ + dprintf(("%s matched word %d\n", kernelname, xj)); \ + } \ + } \ + basetime = dt; \ + if (debug||verbose) { \ + dprintf(("%s %.3f secs for %lu workitems test on device %d (%s)\n", \ + kernelname, basetime, (unsigned long) nworkitems, \ + tp->devnum, tp->dev.name)); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, hC, (verbose < 2) ? 1 : nworkitems); \ + } \ + kcount = count + 1; \ + } \ + dprintf(("launch %s\n", kernelname)); \ + (void)timer(&cur_time); \ + test_##NAME##N##x##W##_##R<<<tp->blocks_per_grid, tp->threads_per_block>>>(kcount, ctr, ukey, dC); \ + dprintf(("synchronize\n")); \ + CHECKCALL(cudaDeviceSynchronize()); \ + dprintf(("copy results back from device to host\n")); \ + CHECKCALL(cudaMemcpy(hC, dC, szC, cudaMemcpyDeviceToHost)); \ + dt = timer(&cur_time); \ + dprintf(("iteration %d took %.3f secs\n", n, dt)); \ + ALLZEROS(hC, nworkitems, N); \ + if (n == 0 || dt < mindt) mindt = dt; \ + } \ + if (count > 1) { \ + double tpB = (mindt - basetime) / ( (kcount - 1.) * nworkitems * (N * W / 8.) ); \ + printf("%-17s %#5.3g cpB, %#5.3g GB/s on dev %d %u B granularity (best %u in %.3f s - %.6f s)\n", \ + kernelname + sizeof(PREFIX) - 1, \ + tpB * tp->cycles , 1e-9/tpB, \ + tp->devnum, (unsigned)(N*W/8), kcount, mindt, basetime ); \ + fflush(stdout); \ + } \ + /* free host and device memory */ \ + free(hC); \ + CHECKCALL(cudaFree(dC)); \ +} + +#include "util_expandtpl.h" + +int main(int argc, char **argv) +{ + char *cp; + unsigned count = 0; + CUDAInfo *infop; + int keyctroffset = 0; + + progname = argv[0]; + if (argc > 3|| (argv[1] && argv[1][0] == '-')) { + fprintf(stderr, "Usage: %s [COUNT [DEVICESTRING]]\n", progname); + exit(1); + } + if (argc > 1) + count = atoi(argv[1]); + if ((cp = getenv("TIME_CUDA_VERBOSE")) != NULL) { + verbose = atoi(cp); + } + if ((cp = getenv("TIME_CUDA_DEBUG")) != NULL) { + debug = atoi(cp); + } + if ((cp = getenv("TIME_CUDA_OFFSET")) != NULL) { + keyctroffset = atoi(cp); + } + if ((cp = getenv("TIME_CUDA_NUMTRIALS")) != NULL) { + numtrials = atoi(cp); + } + if ((cp = getenv("TIME_CUDA_SEC_PER_TRIAL")) != NULL) { + sec_per_trial = atof(cp); + } + infop = cuda_init(argc > 2 ? argv[2] : NULL); + /* define macro to initialize and call the kernels */ +# include "time_initkeyctr.h" + cuda_done(infop); + return 0; +} diff --git a/tests/time_initkeyctr.h b/tests/time_initkeyctr.h @@ -0,0 +1,123 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef TIME_INITKEYCTR_H__ +#define TIME_INITKEYCTR_H__ 1 + +/* + * EXAMPLE_KEY* and EXAMPLE_CTR* values are just arbitrary numbers + * with some bits set, they have no special importance, they do + * not even have to be different. If they are changed, then the + * good_* values further below will need to be updated to match. + */ + +#define EXAMPLE_KEY0 0xdeadbeefU +#define EXAMPLE_KEY1 0x12345678U +#define EXAMPLE_KEY2 0xc0debad1U +#define EXAMPLE_KEY3 0x31415926U + +#define EXAMPLE_CTR0 0x00000000U +#define EXAMPLE_CTR1 0x10000000U +#define EXAMPLE_CTR2 0x20000000U +#define EXAMPLE_CTR3 0x30000000U + +/* + * The magic hex numbers below are just known good values that + * result from the arbitrary EXAMPLE* inputs above. We check that + * we got these results at the end of timing tests to ensure that + * we didn't accidentally let a compiler optimize away some loop. + */ +#if R123_USE_PHILOX_64BIT +static philox2x64_ctr_t good_philox2x64_6 = {{R123_64BIT(0xdd40cdb81af968d2),R123_64BIT(0x0cb57d6d5f7b68dc)}}; +static philox2x64_ctr_t good_philox2x64_10 = {{R123_64BIT(0x539e5b3d18faf5da),R123_64BIT(0x838ca1328d07d3ba)}}; +static philox4x64_ctr_t good_philox4x64_7 = {{R123_64BIT(0xcf492074862957a2),R123_64BIT(0x7057627260938584),R123_64BIT(0x676e23214a14901d),R123_64BIT(0xefa2c5df3848e3fe)}}; +static philox4x64_ctr_t good_philox4x64_10 = {{R123_64BIT(0x1b64f56b381a5a89),R123_64BIT(0x940a282a8add45e1),R123_64BIT(0x53c936376ac7d5df),R123_64BIT(0x6147e87ec9bd9caa)}}; +#endif +static philox4x32_ctr_t good_philox4x32_7 = {{0x40ba6a95,0x799e6a43,0x7dcabe10,0xa7a81636}}; +static philox4x32_ctr_t good_philox4x32_10 = {{0xf16d828e,0xa1c5962d,0xacac820c,0x58113d7a}}; +static threefry4x32_ctr_t good_threefry4x32_12 = {{0xe461db1c,0xfdfa62a7,0x0b10cd2a,0xa3679758}}; +static threefry4x32_ctr_t good_threefry4x32_20 = {{0xf82cf576,0x162ca116,0x3afefe23,0x54cc64ac}}; +#if R123_USE_64BIT +static threefry2x64_ctr_t good_threefry2x64_13 = {{R123_64BIT(0xdf0f096c179ad798),R123_64BIT(0x077862fbaa1a0d11)}}; +static threefry2x64_ctr_t good_threefry2x64_20 = {{R123_64BIT(0xb91153d59815d50e),R123_64BIT(0xdb0dd45e5b0eab81)}}; +static threefry4x64_ctr_t good_threefry4x64_12 = {{R123_64BIT(0x416d1802da0a4a0f),R123_64BIT(0xabd4d80749306281),R123_64BIT(0x62c6b120b542bff0),R123_64BIT(0xefb28dc80c6fc36c)}}; +static threefry4x64_ctr_t good_threefry4x64_20 = {{R123_64BIT(0xad8f0b8c18ed5187),R123_64BIT(0xd80146a6961e1880),R123_64BIT(0x7fce9d950d8acbc4),R123_64BIT(0x782948d5203519f1)}}; +static threefry4x64_ctr_t good_threefry4x64_72 = {{R123_64BIT(0x73ff3f7a0b878f68),R123_64BIT(0x6668f6bbaba83f31),R123_64BIT(0x088eb85d40fbdb56),R123_64BIT(0xd1f39136adc96552)}}; +#endif + +#if R123_USE_AES_NI +static ars4x32_ctr_t good_ars4x32_5 = {{0x279f6b0b, 0xd0b1edf6, 0x6044b433, 0x66c06817}}; +static ars4x32_ctr_t good_ars4x32_7 = {{0xa9cd8055, 0x80272a47, 0x4b7ab914, 0x5351d78e}}; +static aesni4x32_ctr_t good_aesni4x32_10 = {{0x1e68c9fd, 0x347b0858, 0x503d8d91, 0x9e73460a}}; +#endif + +/* + * template code initializes a ukey and counter to known values + * with a known offset and calls a Random123 test function with + * that ukey, ctr and a count and closure. keyctroffset is + * a variable initialized from runtime environment (e.g. argv, argc, + * getenv(), etc) to avoid compile-time optimization + * caused by constants, so we get worst-case numbers. Users may, + * of course, benefit from compile-time optimization if they + * have some constants for key or ctr values. + * + */ +#define TEST_TPL(NAME, N, W, R) \ +if ((strncmp(#NAME, "aes", 3) == 0 || strncmp(#NAME, "ars", 3) == 0) && !haveAESNI()) { \ + printf("AESNI not available on this hardware\n"); \ +} else { \ + NAME##N##x##W##_ukey_t ukey={{0}}; \ + NAME##N##x##W##_ctr_t ctr={{0}}; \ + size_t xi; \ + for (xi = 0; xi < sizeof(ukey)/sizeof(ukey.v[0]); xi++) { \ + switch (xi) { \ + case 0: ukey.v[xi] = EXAMPLE_KEY0+keyctroffset; break; \ + case 1: ukey.v[xi] = EXAMPLE_KEY1+keyctroffset; break; \ + case 2: ukey.v[xi] = EXAMPLE_KEY2+keyctroffset; break; \ + case 3: ukey.v[xi] = EXAMPLE_KEY3+keyctroffset; break; \ + } \ + } \ + for (xi = 0; xi < N; xi++) { \ + switch (xi) { \ + case 0: ctr.v[xi] = EXAMPLE_CTR0+keyctroffset; break; \ + case 1: ctr.v[xi] = EXAMPLE_CTR1+keyctroffset; break; \ + case 2: ctr.v[xi] = EXAMPLE_CTR2+keyctroffset; break; \ + case 3: ctr.v[xi] = EXAMPLE_CTR3+keyctroffset; break; \ + } \ + } \ + NAME##N##x##W##_##R(ctr, ukey, good_##NAME##N##x##W##_##R, count, infop); \ +} + +#include "util_expandtpl.h" + +#endif /* TIME_INITKEYCTR_H__ */ + + diff --git a/tests/time_misc.h b/tests/time_misc.h @@ -0,0 +1,44 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef TIME_MISC_H__ +#define TIME_MISC_H__ 1 +/* Miscellaneous common definitions for time_*.c */ + +const char *progname; +int verbose = 0; +int debug = 0; +int numtrials = 5; +double sec_per_trial = 0.2; + +#define PREFIX "test_" + +#endif /* TIME_MISC_H__ */ diff --git a/tests/time_opencl.c b/tests/time_opencl.c @@ -0,0 +1,200 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* + * OpenCL test and timing harness for Random123 RNGs. Uses macros + * and util_expandtpl.h to "templatize" over all the different + * permutations of RNGs and NxW and R. + */ + +#define R123_USE_AES_NI 0 /* never use this for OpenCL */ + +#include "util_opencl.h" + +#include "Random123/philox.h" +#include "Random123/threefry.h" + +#include "time_misc.h" +#include "util_print.h" + +#define TEST_TPL(NAME, N, W, R) \ +void NAME##N##x##W##_##R(NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t kactr, unsigned count, UCLInfo *tp) \ +{ \ + const char *kernelname = PREFIX #NAME #N "x" #W "_" #R; \ + NAME##N##x##W##_ctr_t *hC; \ + int n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \ + int narg; \ + double cur_time; \ + size_t i; \ + cl_int err; \ + cl_mem dC; \ + cl_kernel kern; \ + \ + /* create handle to kernel in program */ \ + dprintf(("%s kernel\n", kernelname)); \ + CHECKERR(kern = clCreateKernel(tp->prog, kernelname, &err)); \ + const size_t nworkitems = tp->wgsize * tp->cores; \ + const size_t szC = nworkitems*sizeof(hC[0]); \ + /* allocate and initialize vector of counters in host memory */ \ + CHECKNOTZERO(hC = (NAME##N##x##W##_ctr_t *) malloc(szC)); \ + for (i = 0; i < nworkitems; i++) { \ + int xi; \ + for (xi = 0; xi < N; xi++) \ + hC[i].v[xi] = 0; \ + } \ + /* allocate vector of counters in device memory, initialize from current host memory */ \ + CHECKERR(dC = clCreateBuffer(tp->ctx, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, szC, hC, &err)); \ + cl_uint kcount = 0; \ + double basetime = 0., dt = 0., mindt = 0.; \ + /* first two iterations are for warmup & baseline */ \ + for (n = -2; n < niterations; n++) { \ + if (n == -2) { \ + if (count == 0) { \ + /* try to set a good guess for count */ \ + count = (unsigned)(tp->cycles ? tp->cycles * 1e-8 : 10000); \ + dprintf(("starting with count = %u\n", count)); \ + } \ + kcount = count; \ + } else if (n == -1) { \ + /* use first iteration time to calibrate count to get approximately sec_per_trial */ \ + if (count > 1) { \ + count = (unsigned)(count * sec_per_trial / dt); \ + dprintf(("scaled count = %u\n", count)); \ + } \ + /* second iteration is to calculate overhead after warmup */ \ + kcount = 1; \ + } else if (n == 0) { \ + int xj; \ + /* Check that we got the expected value */ \ + for (xj = 0; xj < N; xj++) { \ + if (kactr.v[xj] != hC[0].v[xj]) { \ + printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \ + printf(" but got\n"); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \ + if(!debug) exit(1); \ + else break; \ + } else { \ + dprintf(("%s matched word %d\n", kernelname, xj)); \ + } \ + } \ + basetime = dt; \ + if (debug||verbose) { \ + dprintf(("%s %.3f secs for %lu workitems test on device %s\n", \ + kernelname, basetime, (unsigned long) nworkitems, \ + tp->devname)); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, hC, (verbose < 2) ? 1 : nworkitems); \ + } \ + kcount = count + 1; \ + } \ + (void)timer(&cur_time); \ + dprintf(("setup arguments to kernel function %s\n", kernelname)); \ + narg = 0; \ + CHECK(clSetKernelArg(kern, narg, sizeof(kcount), (void *)&kcount)); \ + narg++; \ + CHECK(clSetKernelArg(kern, narg, sizeof(ctr), (void *)&ctr)); \ + narg++; \ + CHECK(clSetKernelArg(kern, narg, sizeof(ukey), (void *)&ukey)); \ + narg++; \ + CHECK(clSetKernelArg(kern, narg, sizeof(cl_mem), (void *)&dC)); \ + dprintf(("queue kernel for execution on device %s\n", tp->devname)); \ + CHECK(clEnqueueNDRangeKernel(tp->cmdq, kern, 1, 0, &nworkitems, &tp->wgsize, 0, 0, 0)); \ + CHECK(clFlush(tp->cmdq)); \ + dprintf(("copy results from device memory to host memory\n")); \ + CHECK(clEnqueueReadBuffer(tp->cmdq, dC, CL_FALSE, 0, szC, hC, 0, 0, 0)); \ + CHECK(clFlush(tp->cmdq)); \ + dprintf(("synchronize\n")); \ + CHECK(clFinish(tp->cmdq)); \ + dt = timer(&cur_time); \ + dprintf(("iteration %d took %.3f secs\n", n, dt)); \ + ALLZEROS(hC, nworkitems, N); \ + if (n == 0 || dt < mindt) mindt = dt; \ + } \ + if (count > 1) { \ + double tpB = (mindt - basetime) / ( (count - 1.) * nworkitems * (N * W / 8.) ); \ + printf("%-17s %#5.3g cpB, %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \ + kernelname + sizeof(PREFIX) - 1, \ + tpB * tp->cycles , 1e-9/tpB, \ + (unsigned)(N*W/8), count, mindt, basetime ); \ + fflush(stdout); \ + } \ + /* free host and device memory */ \ + free(hC); \ + CHECK(clReleaseMemObject(dC)); \ + /* free the kernel */ \ + CHECK(clReleaseKernel(kern)); \ +} + +#include "util_expandtpl.h" + +/* Include the preprocessed source code, stashed in a literal string */ +const char *opencl_src = +#include "time_opencl_kernel.i" + ; + +int main(int argc, char **argv) +{ + const char *cp; + unsigned count = 0; + UCLInfo *infop; + int keyctroffset = 0; + + progname = argv[0]; + if (argc > 3|| (argv[1] && argv[1][0] == '-')) { + fprintf(stderr, "Usage: %s [COUNT [DEVICESTRING]]\n", progname); + exit(1); + } + if (argc > 1) + count = atoi(argv[1]); + if ((cp = getenv("TIME_OPENCL_VERBOSE")) != NULL) { + verbose = atoi(cp); + } + if ((cp = getenv("TIME_OPENCL_DEBUG")) != NULL) { + debug = atoi(cp); + } + if ((cp = getenv("TIME_OPENCL_OFFSET")) != NULL) { + keyctroffset = atoi(cp); + } + if ((cp = getenv("TIME_OPENCL_NUMTRIALS")) != NULL) { + numtrials = atoi(cp); + } + if ((cp = getenv("TIME_OPENCL_SEC_PER_TRIAL")) != NULL) { + sec_per_trial = atof(cp); + } + if ((cp = getenv("TIME_OPENCL_BUILD_OPTIONS")) == NULL) { + cp = ""; + } + infop = opencl_init(argc > 2 ? argv[2] : NULL, opencl_src, cp); + /* define macro to initialize and call the kernels */ +# include "time_initkeyctr.h" + opencl_done(infop); + return 0; +} diff --git a/tests/time_opencl_kernel.ocl b/tests/time_opencl_kernel.ocl @@ -0,0 +1,35 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __OPENCL_VERSION__ +#define __OPENCL_VERSION__ 1 +#endif +#include "time_random123.h" diff --git a/tests/time_random123.h b/tests/time_random123.h @@ -0,0 +1,119 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef TIME_RANDOM123_H__ +#define TIME_RANDOM123_H__ 1 + +/* + * This file contains the performance timing kernels for Random123 + * RNGs and a few conventional PRNGs, which have been hacked into + * this framework. This code should NOT be considered as an + * example of using PRNGs. A few macros try to keep it + * cross-platform across C (serial or threads), CUDA and OpenCL. + * The TEST_TPL + include util_expandtpl trick is used to + * template-generate kernels for all the different RNGs across + * NxW. + */ + +#include <Random123/philox.h> +#include <Random123/threefry.h> + +#if defined(__OPENCL_VERSION__) +#define KERNEL __kernel +#define MEMTYPE __global +#define xprintf(x) +#elif defined(__CUDA_ARCH__) +#define xprintf(x) +#else +#define xprintf(x) printf x +#endif + +#ifndef KERNEL +#define KERNEL +#endif + +#ifndef MEMTYPE +#define MEMTYPE +#endif + +/* LOOK_AT forces the compiler to actually produce the code that + computes the elements of A. Without it, optimizing compilers can + elide some or all of the computation of A (i.e., the RNG we're + trying to get timings for). There are many ways to do this. A + perhaps more natural way would be to keep a running sum of all the + results so far, but we found that gcc 4.5 and 4.6 could unroll that + code into a fully SSE-ized loop, which appears to be + unrepresentative of the kinds of optimizations that are possible in + practice. I.e., we could not find any "real" use of the output of + the RNG that permitted SSE-ization of the RNG. */ +#define LOOK_AT(A, I, N) do{ \ + if (N==4) if(R123_BUILTIN_EXPECT(!(A.v[N>2?3:0]^A.v[N>2?2:0]^A.v[N>1?1:0]^A.v[0]), 0)) ++I; \ + if (N==2) if(R123_BUILTIN_EXPECT(!(A.v[N>1?1:0]^A.v[0]), 0)) ++I; \ + if (N==1) if(R123_BUILTIN_EXPECT(!(A.v[0]), 0)) ++I; \ + }while(0) + + +/* Macro that will expand later into all the Random123 PRNGs for NxW_R */ +/* XXX AMDAPPSDK 2.4 seemed unhappy with the first arg being uint, but + was ok when it was changed to uint64_t. It's now back to unsigned + because that seems more correct and generic. Nobody's using 2.4 + any more, are they? Note that this macro is expanded into CPU, + CUDA and OpenCL "kernels", so it has to be generic. */ +#define TEST_TPL(NAME, N, W, R) \ +KERNEL void test_##NAME##N##x##W##_##R(unsigned n, NAME##N##x##W##_ctr_t ctrinit, NAME##N##x##W##_ukey_t uk, MEMTYPE NAME##N##x##W##_ctr_t *ctr) \ +{ \ + unsigned tid = get_global_id(0); \ + unsigned i; \ + NAME##N##x##W##_ctr_t c, v={{0}}; \ + NAME##N##x##W##_key_t k=NAME##N##x##W##keyinit(uk); \ + c = ctrinit; \ + if( R == NAME##N##x##W##_rounds ){ \ + for (i = 0; i < n; ++i) { \ + v = NAME##N##x##W(c, k); \ + LOOK_AT(v, i, N); \ + c.v[0]++; \ + } \ + }else { \ + for (i = 0; i < n; ++i) { \ + v = NAME##N##x##W##_R(R, c, k); \ + /*xprintf(("1: %s k[0] %lx c[0] %lx v[0] %lx\n", #NAME #N "x" #W "_" #R, (unsigned long) k.v[0], (unsigned long) c.v[0], (unsigned long) v.v[0]));*/ \ + /*if (c.v[0] == 0) printline_##NAME##N##x##W##_##R(k, c, &v, 1);*/ \ + LOOK_AT(v, i, N); \ + c.v[0]++; \ + } \ + } \ + ctr[tid] = v; \ +} + +/* Now expand TEST_TPL for all the relevant RNGs */ +#include "util_expandtpl.h" + +#endif /* TIME_RANDOM123_H__ */ diff --git a/tests/time_serial.c b/tests/time_serial.c @@ -0,0 +1,162 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* + * Single-core CPU test and timing harness for Random123 RNGs. + * Uses macros and util_expandtpl.h to "templatize" over all the + * different permutations of RNGs and NxW and R. + */ +#include "util.h" + +#include "Random123/philox.h" +#include "Random123/threefry.h" +#include "Random123/ars.h" +#include "Random123/aes.h" + +#include "time_misc.h" +#include "util_print.h" + +#include "util.h" +#define KERNEL R123_STATIC_INLINE +#define get_global_id(i) (i) +#include "time_random123.h" + +static double cpu_hz = -1.; + +#define TEST_TPL(NAME, N, W, R) \ +void NAME##N##x##W##_##R(NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t kactr, unsigned count, void* unused) \ +{ \ + const char *kernelname = #NAME #N "x" #W "_" #R; \ + double cur_time; \ + int n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \ + unsigned kcount = 0; \ + double basetime = 0., dt = 0., mindt = 0.; \ + NAME##N##x##W##_ctr_t C, *hC = &C; \ + (void)unused; /* suppress warning */ \ + \ + for (n = -2; n < niterations; n++) { \ + if (n == -2) { \ + if (count == 0) { \ + /* try to set a good guess for count */ \ + count = 1000000; \ + dprintf(("starting with count = %u\n", count)); \ + } \ + kcount = count; \ + } else if (n == -1) { \ + /* use first iteration time to calibrate count to get approximately sec_per_trial */ \ + if (count > 1) { \ + count = (unsigned)(count * sec_per_trial / dt); \ + dprintf(("scaled count = %u\n", count)); \ + } \ + /* second iteration is to calculate overhead after warmup */ \ + kcount = 1; \ + } else if (n == 0) { \ + int xj; \ + /* Check that we got the expected value */ \ + for (xj = 0; xj < N; xj++) { \ + if (kactr.v[xj] != hC[0].v[xj]) { \ + printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \ + printf(" but got\n"); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \ + if(!debug) exit(1); \ + else break; \ + } else { \ + dprintf(("%s matched word %d\n", kernelname, xj)); \ + } \ + } \ + basetime = dt; \ + if (debug||verbose) { \ + dprintf(("%s %.3f secs\n", kernelname, basetime)); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \ + } \ + kcount = count + 1; \ + } \ + /* calling timer *before* dprintf avoids an ARMv7 gcc 4.8.3 -O3 compiler bug! */ \ + (void)timer(&cur_time); \ + dprintf(("call function %s\n", kernelname)); \ + test_##NAME##N##x##W##_##R(kcount, ctr, ukey, hC); \ + dt = timer(&cur_time); \ + dprintf(("iteration %d took %.3f secs\n", n, dt)); \ + ALLZEROS(hC, 1, N); \ + if (n == 0 || dt < mindt) mindt = dt; \ + } \ + if (count > 1) { \ + double tpB = (mindt - basetime) / ( (kcount - 1.) * (N * W / 8.) ); \ + if(cpu_hz > 0.) \ + printf("%-17s %#5.3g cpB %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \ + kernelname, tpB*cpu_hz, 1e-9/tpB, \ + (unsigned)(N*W/8), kcount, mindt, basetime ); \ + else \ + printf("%-17s %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \ + kernelname, 1e-9/tpB, \ + (unsigned)(N*W/8), kcount, mindt, basetime ); \ + fflush(stdout); \ + } \ +} + +#include "util_expandtpl.h" + +int main(int argc, char **argv) +{ + char *cp; + unsigned count = 0; + int keyctroffset = 0; + void* infop = NULL; + + progname = argv[0]; + if (argc > 3|| (argv[1] && argv[1][0] == '-')) { + fprintf(stderr, "Usage: %s [COUNT]]\n", progname); + exit(1); + } + if (argc > 1) + count = atoi(argv[1]); + if ((cp = getenv("TIME_SERIAL_CPU_GHZ")) != NULL) { + cpu_hz = 1.e9 * atof(cp); + } + if ((cp = getenv("TIME_SERIAL_VERBOSE")) != NULL) { + verbose = atoi(cp); + } + if ((cp = getenv("TIME_SERIAL_DEBUG")) != NULL) { + debug = atoi(cp); + } + if ((cp = getenv("TIME_SERIAL_OFFSET")) != NULL) { + keyctroffset = atoi(cp); + } + if ((cp = getenv("TIME_SERIAL_NUMTRIALS")) != NULL) { + numtrials = atoi(cp); + } + if ((cp = getenv("TIME_SERIAL_SEC_PER_TRIAL")) != NULL) { + sec_per_trial = atof(cp); + } +# include "time_initkeyctr.h" + return 0; +} diff --git a/tests/time_thread.c b/tests/time_thread.c @@ -0,0 +1,242 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* + * Pthreads test and timing harness for Random123 RNGs. + * Uses macros and util_expandtpl.h to "templatize" over all the + * different permutations of RNGs and NxW and R. + */ + +#include "util.h" +#include <sys/stat.h> + +#include "Random123/philox.h" +#include "Random123/threefry.h" +#include "Random123/ars.h" +#include "Random123/aes.h" + +#include "time_misc.h" +#include "util_print.h" +#include "util.h" +#include <pthread.h> + +/* + * Main thread initializes thread_info[i].started to zero, .tid to its own + * pthread_self() as a placeholder. + * Child #i sets thread_info[i].tid to pthread_self() and then + * sets .started. Only child #i ever writes to thread_info[i], and + * does so only once. So searching through thread_info is race-free + * for get_global_id, since it only ever looking for its own pthread_self + * anyway. The write to started needs to be atomic. + * This is all so that we can use the same kernel as OpenCL/CUDA. + * Note that parent keeps its own copy of thread ids returned + * by pthread_create in tids[] to avoid any races with thread_info. + */ +typedef struct { + int started; /* started == 1 means tid contains pthread_self() of thread */ + pthread_t tid; +} ThreadInfo; +static volatile ThreadInfo *thread_info; /* thread_id state, one per thread */ \ +static int thread_count = 12; + +/* Linear search should be fast enough for small thread count... */ +R123_STATIC_INLINE int get_global_id(int x) +{ + int i; + pthread_t me = pthread_self(); + (void)x; /* why is this an arg? */ + for (i = 0; i < thread_count; i++) { + if (thread_info[i].started && pthread_equal(me, thread_info[i].tid)) + return i; + } + fprintf(stderr, "could not find thread %lu\n", (unsigned long) me); + pthread_exit(NULL); +} + +#define KERNEL R123_STATIC_INLINE +#include "time_random123.h" + +#define TEST_TPL(NAME, N, W, R) \ +typedef struct { \ + unsigned kcount; \ + NAME##N##x##W##_ukey_t ukey; \ + NAME##N##x##W##_ctr_t ctr; \ + NAME##N##x##W##_ctr_t *octrs; \ +} ThreadData_##NAME##N##x##W##_##R; \ +\ +typedef struct { \ + ThreadData_##NAME##N##x##W##_##R *tp; \ + volatile ThreadInfo *tip; \ +} ThreadArg_##NAME##N##x##W##_##R; \ +\ +/* thread_run is launched in a new thread by pthread_create */ \ +void *thread_run_##NAME##N##x##W##_##R(void *p) \ +{ \ + ThreadArg_##NAME##N##x##W##_##R *ta = p; \ + ThreadData_##NAME##N##x##W##_##R *tp = ta->tp; \ + volatile ThreadInfo *tip = ta->tip; \ + /* store our thread id for use by get_global_info */ \ + tip->tid = pthread_self(); \ + tip->started = 1; \ + test_##NAME##N##x##W##_##R(tp->kcount, tp->ctr, tp->ukey, tp->octrs); \ + return tp; \ +}\ +void NAME##N##x##W##_##R(NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t kactr, unsigned count, void* unused) \ +{ \ + const char *kernelname = #NAME #N "x" #W "_" #R; \ + double cur_time; \ + int i, n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \ + double basetime = 0., dt = 0., mindt = 0.; \ + ThreadData_##NAME##N##x##W##_##R td; /* same for all threads */ \ + ThreadArg_##NAME##N##x##W##_##R *tap; /* args for thread_run, 1 per thread */ \ + pthread_t me = pthread_self(); /* parent thread id */ \ + pthread_t *tids; /* array of child thread ids */ \ + void *vp; /* return from join */ \ + (void)unused; /* suppress warning */ \ + CHECKNOTZERO(thread_info = (ThreadInfo *) malloc(sizeof(thread_info[0])*thread_count)); \ + CHECKNOTZERO(tap = (ThreadArg_##NAME##N##x##W##_##R *) malloc(sizeof(tap[0])*thread_count)); \ + CHECKNOTZERO(tids = (pthread_t *) malloc(sizeof(tids[0])*thread_count)); \ + for (i = 0; i < thread_count; i++) { \ + thread_info[i].started = 0; \ + thread_info[i].tid = me; \ + tap[i].tip = &thread_info[i]; \ + tap[i].tp = &td; \ + } \ + CHECKNOTZERO(td.octrs = (NAME##N##x##W##_ctr_t *) malloc(sizeof(td.octrs[0])*thread_count)); \ + td.ukey = ukey; \ + td.ctr = ctr; \ + td.kcount = 0; \ + for (n = -2; n < niterations; n++) { \ + if (n == -2) { \ + if (count == 0) { \ + /* try to set a good guess for count */ \ + count = 1000000; \ + dprintf(("starting with count = %u\n", count)); \ + } \ + td.kcount = count; \ + } else if (n == -1) { \ + /* use first iteration time to calibrate count to get approximately sec_per_trial */ \ + if (count > 1) { \ + count = (unsigned)(count * sec_per_trial / dt); \ + dprintf(("scaled count = %u\n", count)); \ + } \ + /* second iteration is to calculate overhead after warmup */ \ + td.kcount = 1; \ + } else if (n == 0) { \ + int xj; \ + /* Check that we got the expected value */ \ + for (xj = 0; xj < N; xj++) { \ + if (kactr.v[xj] != td.octrs[0].v[xj]) { \ + printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \ + printf(" but got\n"); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, td.octrs, 1); \ + if(!debug) exit(1); \ + else break; \ + } else { \ + dprintf(("%s matched word %d\n", kernelname, xj)); \ + } \ + } \ + basetime = dt; \ + if (verbose) { \ + dprintf(("%s %.3f secs\n", kernelname, basetime)); \ + printline_##NAME##N##x##W##_##R(ukey, ctr, td.octrs, thread_count); \ + } \ + td.kcount = count + 1; \ + } \ + dprintf(("call function %s\n", kernelname)); \ + (void)timer(&cur_time); \ + for (i = 0; i < thread_count; i++) { \ + CHECKZERO(pthread_create(&tids[i], NULL, thread_run_##NAME##N##x##W##_##R, &tap[i])); \ + dprintf(("thread %d started\n", i)); \ + } \ + for (i = 0; i < thread_count; i++) { \ + CHECKZERO(pthread_join(tids[i], &vp)); \ + dprintf(("thread %d done\n", i)); \ + } \ + dt = timer(&cur_time); \ + dprintf(("iteration %d took %.3f secs\n", n, dt)); \ + ALLZEROS(td.octrs, thread_count, N); \ + if (n == 0 || dt < mindt) mindt = dt; \ + } \ + if (count > 1) { \ + double tpB = (mindt - basetime) / ( (td.kcount - 1.) * thread_count * (N * W / 8.) ); \ + printf("%-17s %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \ + kernelname, 1e-9/tpB, \ + (unsigned)(N*W/8), td.kcount, mindt, basetime ); \ + fflush(stdout); \ + } \ + free((void *) thread_info); \ + thread_info = NULL; \ + free(td.octrs); \ + free(tap); \ + free(tids); \ +} + +#include "util_expandtpl.h" + +int main(int argc, char **argv) +{ + char *cp; + unsigned count = 0; + int keyctroffset = 0; + void *infop = NULL; + + progname = argv[0]; + if (argc > 3|| (argv[1] && argv[1][0] == '-')) { + fprintf(stderr, "Usage: %s [COUNT]\n", progname); + exit(1); + } + if (argc > 1) + count = atoi(argv[1]); + if ((cp = getenv("TIME_THREAD_NTHREADS")) != NULL) { + thread_count = atoi(cp); + } + printf("Running with %d threads. Try 'env TIME_THREAD_NTHREADS=N %s' to change it\n", thread_count, argv[0]); + + if ((cp = getenv("TIME_THREAD_VERBOSE")) != NULL) { + verbose = atoi(cp); + } + if ((cp = getenv("TIME_THREAD_DEBUG")) != NULL) { + debug = atoi(cp); + } + if ((cp = getenv("TIME_THREAD_OFFSET")) != NULL) { + keyctroffset = atoi(cp); + } + if ((cp = getenv("TIME_THREAD_NUMTRIALS")) != NULL) { + numtrials = atoi(cp); + } + if ((cp = getenv("TIME_THREAD_SEC_PER_TRIAL")) != NULL) { + sec_per_trial = atof(cp); + } +# include "time_initkeyctr.h" + return 0; +} diff --git a/tests/timers.cpp b/tests/timers.cpp @@ -0,0 +1,249 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "util.h" + +#include <Random123/philox.h> +#include <Random123/threefry.h> +#include <Random123/aes.h> +#include <Random123/ars.h> +#include <cstdio> +#include <cmath> +#include <string> +#include <iostream> +#include <sstream> +#include <cstring> +#if R123_USE_X86INTRIN_H +#include <x86intrin.h> +#endif +#include "util_demangle.hpp" +#include "util.h" + +using namespace r123; + +const char *progname; +int debug = 0; +double cpu_hz = -1.0; + +using namespace std; + +namespace{ + template <typename B> void timer(); +} // namespace <anon> + +int main(int argc, char **argv){ + progname = argv[0]; + + const char *envp; + if( (envp = getenv("TIMERS_CPU_GHZ"))){ + cpu_hz = 1.e9 * atof(envp); + } +#if R123_USE_AES_NI + if( argc == 1 || strcmp(argv[1], "ARS")==0 ){ + if(haveAESNI()){ + timer<ARS1xm128i_R<5> >(); + timer<ARS4x32_R<5> >(); + timer<ARS1xm128i_R<7> >(); + timer<ARS4x32_R<7> >(); + timer<ARS1xm128i_R<10> >(); + timer<AESNI1xm128i >(); + }else{ + cout << "Skipping Bijections that use AES-NI instructions that are not available on this platform\n"; + } + } +#else + cout << "This binary is not compiled with AES-NI support. Skipping the ARS bijections\n"; +#endif // R123_USE_AES_NI + + if( argc == 1 || strcmp(argv[1], "AES")==0 ){ +#if R123_USE_AES_OPENSSL + cout << "\n"; + timer<AESOpenSSL16x8>(); +#endif + } + + if( argc == 1 || strcmp(argv[1], "Threefry4x32")==0 ) { + cout << "\n"; + timer<Threefry4x32_R<12> >(); + timer<Threefry4x32_R<20> >(); + timer<Threefry4x32 >(); + } + +#if R123_USE_64BIT + if( argc == 1 || strcmp(argv[1], "Threefry2x64")==0 ){ + cout << "\n"; + timer<Threefry2x64_R<13> >(); + timer<Threefry2x64_R<20> >(); + timer<Threefry2x64 >(); + } + + if( argc == 1 || strcmp(argv[1], "Threefry4x64")==0 ){ + cout << "\n"; + timer<Threefry4x64_R<12> >(); + timer<Threefry4x64_R<20> >(); + timer<Threefry4x64 >(); + timer<Threefry4x64_R<72> >(); + } +#else + cout << "\n64bit types not implemented. Skipping Threefry-Nx64 bijections\n"; +#endif + +#if R123_USE_PHILOX_64BIT + if( argc == 1 || strcmp(argv[1], "Philox2x64") == 0 ){ + cout << "\n"; + timer<Philox2x64_R<6> >(); + timer<Philox2x64_R<10> >(); + } + + if( argc == 1 || strcmp(argv[1], "Philox4x64") == 0 ){ + cout << "\n"; + timer<Philox4x64_R<7> >(); + timer<Philox4x64_R<10> >(); + } +#else + cout << "\n64x64->128bit multiplication is not implmented. Skipping Philox-Nx64 bijections\n"; +#endif + + if( argc == 1 || strcmp(argv[1], "Philox4x32") == 0 ){ + cout << "\n"; + timer<Philox4x32_R<7> >(); + timer<Philox4x32_R<10> >(); + } + + return 0; +} + + +namespace{ + +// To prevent the compiler from noticing that the result of the +// bijection is never used and eliding the entire calculation, we +// accumulate the output of millions of calls to the bijection. All +// the ctr_types are sufficiently container-like that we can just +// loop over the contents, doing += on each value_type +template <typename CtrType> +CtrType& operator+=(CtrType& lhs, CtrType rhs){ + typename CtrType::const_iterator rp = rhs.cbegin(); + for(typename CtrType::iterator lp=lhs.begin(); lp!=lhs.end(); ++lp) + *lp ^= *rp++; + return lhs; +} + +// We've accumulated it, but we still have to use it. A non-zero +// test serves the purpose: +template <typename CtrType> +bool nz(const CtrType v){ + for(typename CtrType::const_iterator vp=v.cbegin(); vp!=v.cend(); ++vp) + if( *vp ) return true; + return false; +} + +#if R123_USE_AES_NI +// The "obvious" solution for ctr_types whose value_type doesn't +// have += defined (e.g., m128i) would be to overload += on the +// value_type. But we can't do that in gcc because m128i is typedefed +// to a fancy compiler-specific builtin type, and you can only overload +// += on classes and enums. So instead we specialize += on the +// array instead of on the value_type: +template<> +r123array1xm128i& operator+=(r123array1xm128i& lhs, r123array1xm128i rhs){ + typedef r123array1xm128i CtrType; + CtrType::const_iterator rp = rhs.cbegin(); + for(CtrType::iterator lp=lhs.begin(); lp!=lhs.end(); ++lp) + lp->m = _mm_xor_si128(*lp, *rp++); + return lhs; +} +#endif + +template <typename B> +void timer(){ + typedef typename B::ctr_type ctr_type; + ctr_type sum = {{}}; + uint_fast64_t N = 1000000; // First try only a few thousand... + B b; + int bytes_per_call = sizeof(ctr_type); + cout << demangle(b) << ": gran: " << bytes_per_call; + + ctr_type c0 = {{}}; + const char *envp; + if((envp = getenv("TIMERS_COUNTER"))){ + std::istringstream iss((std::string(envp))); + iss >> c0; + } + + typename B::ukey_type uk = {{}}; + if( (envp = getenv("TIMERS_KEY"))){ + std::istringstream iss((std::string(envp))); + iss >> uk; + } + typename B::key_type k(uk); + + ctr_type c = c0; + double clk; + ::timer(&clk); + for(uint_fast64_t i=0; i<N; ++i){ + c.incr(); + sum += b(c, k); + } + double dur = ::timer(&clk); + + double bestrate = 0.; + double bestdur = 0.; + uint_fast64_t bestN = 0; + for(size_t t=0; t<5; ++t){ + ctr_type c = c0; + N = (uint_fast64_t)(N*(0.1/dur)); + ::timer(&clk); + for(uint_fast64_t i=0; i<N; ++i){ + c.incr(); + sum += b(c, k); + } + dur = ::timer(&clk); + double rate = N*bytes_per_call/dur; + if( rate > bestrate ){ + bestrate = rate; + bestN = N; + bestdur = dur; + } + } + cout << " (best of 5) " << bestN << " bijections in " << bestdur << " sec. rate: " << bestrate*1.e-9 << "GB/s"; + if( cpu_hz > 0. ) + cout << " cpB: " << cpu_hz/bestrate; + cout << endl; + + if(!nz(sum)) + cout << "Don't let the compiler optimize it all away... sum==0. That's a surprise!\n"; +} + +} // namespace <anonymous> + + diff --git a/tests/ut_Engine.cpp b/tests/ut_Engine.cpp @@ -0,0 +1,246 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// TODO - really do a thorough and complete set of tests. + +#ifdef _MSC_FULL_VER +// Engines have multiple copy constructors, quite legal C++, disable MSVC complaint +#pragma warning (disable : 4521) +#endif + +#include <Random123/philox.h> +#include <Random123/aes.h> +#include <Random123/threefry.h> +#include <Random123/ars.h> +#include <Random123/conventional/Engine.hpp> +#include <Random123/ReinterpretCtr.hpp> +#if R123_USE_CXX11_RANDOM +#include <random> +#endif +#include <cassert> +#include <iostream> +#include <sstream> +#include "util_demangle.hpp" + +using namespace std; +using namespace r123; + +template <typename EType> +typename EType::result_type kat1000(){ + // A zero return says that no KAT is known. This makes + // sense for the ReniterpretCtr-based engines which are + // expected to produce endian-specific results, so we + // don't have known answers for them. + return 0; +} + +#if R123_USE_64BIT +#if R123_USE_PHILOX_64BIT +template <> uint64_t kat1000<Engine<Philox2x64 > >(){ return R123_64BIT(10575809911605703474); } +#endif +template <> uint64_t kat1000<Engine<Threefry2x64 > >(){ return R123_64BIT(17578122881062615727); } +#endif +template <> uint32_t kat1000<Engine<Philox4x32 > >(){ return 1721865298; } +template <> uint32_t kat1000<Engine<Threefry4x32 > >(){ return 874101813; } +#if R123_USE_AES_OPENSSL +template <> uint8_t kat1000<Engine<AESOpenSSL16x8> >(){ return 0237; } +#endif + +#define ASSERTEQ(A, B) assert(A==B); assert(A()==B()); assert(A()==B()); assert(A()==B()) + +struct DummySeedSeq{ + template <typename ITER> + void generate(ITER b, ITER e){ + std::fill(b, e, 1); + } +}; + +template <typename EType> +void doit(){ + EType e; + cout << "doit<" << demangle(e) << ">"; + typedef typename EType::cbrng_type BType; + typedef typename EType::result_type rtype; + typedef typename BType::ctr_type ctype; + typedef typename BType::key_type ktype; + + DummySeedSeq dummyss; + EType ess(dummyss); + assert(ess != e); + + rtype r1 = e(); + rtype r2 = e(); assert( r1 != r2 ); + rtype r3 = e(); assert( r3 != r2 && r3 != r1 ); + + // We've elsewhere confirmed that the underlying bijections actually "work", + // e.g., that they pass the Known Answer Test for some set of test vectors. + // Here, we simply check that the output of the Engine corresponds, in the expected + // way to the output of the underlying bijection. + + // Check that the first few values out of the engine correspond + // to output from the underlying bijection. + BType b; + ctype c1 = {{}}; + ktype k = e.getkey(); + e.seed(); + for(int i=0; i<100; ++i){ + c1[0]++; + ctype rb = b(c1, k); + for(typename ctype::reverse_iterator p=rb.rbegin(); p!=rb.rend(); ++p){ + rtype re = e(); + assert( *p == re ); + } + } + + // Check that discard work as expected, i.e., we can keep two + // engines "in sync" by discarding from one and stepping the other. + EType e2; + assert(e2 != e); + e2.discard(100*c1.size()); + ASSERTEQ(e2, e); + + for(int disc=1; disc<50; ++disc){ + e.discard(disc); + assert( e != e2 ); + for(int j=0; j<disc; ++j) e2(); + ASSERTEQ(e2, e); + } + + // Check that saving and restoring state and the copy constructor + // works as expected. + ostringstream oss; + oss << e2; + string s2 = oss.str(); + int fiftyfive = 55; +#if R123_USE_CXX11_TYPE_TRAITS + // With CXX11, the library has type_traits to prevent + // undesirable type resolution against the templated SeedSeq constructor + EType e3(fiftyfive); +#else + // Without CXX11, we have to be careful to pass in + // a bona fide rtype, and not just something that will promote + // to an rtype, if we want the rtype constructor. + EType e3((rtype(fiftyfive))); +#endif + EType esave(e); + assert(e3 != e2); + { + istringstream iss(s2); + iss >> e3; + } + ASSERTEQ(e3, e2); + assert(e3 != esave ); + { + istringstream iss(s2); + iss >> e3; + } + ASSERTEQ(e3, esave); + + // Check that the constructor-from-rvalue works. + EType e4((rtype)99); + EType e5; + assert(e4 != e5); + assert(e4 != e3); + e5.seed((rtype)99); + ASSERTEQ(e4, e5); + +#if R123_USE_STD_RANDOM + // Check that we can use an EType with a std::distribution. + // Obviously, this requires <random> + uniform_int_distribution<int> dieroller(1, 6); + vector<int> hist(7); + int NROLL = 10000; + for(int i=0; i<NROLL; ++i){ + int roll = dieroller(e5); + hist[roll]++; + } + double chisq = 0.; + double expected = NROLL/6.; + double var = NROLL*5./36.; + for(int pips=1; pips<=6; ++pips){ + double delta = hist[pips] - expected; + chisq += delta*delta/var; + } + // The critical value of chisq with 6 degrees of freedom + // for P=0.01 is 16.81. For P=0.05, it is 12.59 + const double chicrit = 12.59; + if( chisq > chicrit ){ + printf("std::uniform_int_distribution doesn't look random. Chisq = %g. Does this look like the result of a fair set of dice rolls to you?\n", chisq); + for(int pips=1; pips<=6; ++pips){ + printf("%d pips %d times\n", pips, hist[pips]); + } + abort(); // a bit harsh, no? It might just be a rare event at the 5% level... + } +#endif + + // Finally do a kat test. + EType ekat; + ekat.discard(1000); + typename EType::result_type r = ekat(); + typename EType::result_type knownanswer = kat1000<EType>(); + if( knownanswer != 0 && r != knownanswer ) + cerr << "KAT mismatch. The 1000th random from " << demangle(ekat) << " is " << r << " it should be " << knownanswer << "\n"; + assert( knownanswer==0 || r == knownanswer ); + cout << " OK" << endl; +} + +int main(int, char **){ +#if R123_USE_PHILOX_64BIT + doit<Engine<Philox2x64 > >(); + doit<Engine<ReinterpretCtr<r123array4x32, Philox2x64 > > >(); +#endif + doit<Engine<Philox4x32 > >(); + doit<Engine<Threefry4x32 > >(); +#if R123_USE_64BIT + doit<Engine<ReinterpretCtr<r123array4x32, Threefry2x64 > > >(); + doit<Engine<Threefry2x64 > >(); + doit<Engine<ReinterpretCtr<r123array2x64, Threefry4x32 > > >(); +#endif + +#if R123_USE_AES_NI + if( haveAESNI() ){ + doit<Engine<ARS4x32> >(); +#if R123_USE_64BIT + doit<Engine<ReinterpretCtr<r123array2x64, ARS4x32> > >(); +#endif + doit<Engine<AESNI4x32> >(); + }else{ + cout << "AES is compiled into the binary, but is not available on this hardware\n"; + } +#endif +#if R123_USE_AES_OPENSSL + doit<Engine<AESOpenSSL16x8> >(); +#endif + + cout << "ut_Engine: all OK" << endl; + return 0; +} + diff --git a/tests/ut_M128.cpp b/tests/ut_M128.cpp @@ -0,0 +1,151 @@ +/* +Copyright 2010-2016, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <Random123/features/compilerfeatures.h> +#if !R123_USE_SSE +#include <stdio.h> +int main(){ printf("No SSE. Nothing to check\n"); return 0; } +#else + +#include <Random123/features/sse.h> +#include <sstream> + +int main(int, char **){ + r123m128i uninitialized; + __m128i zm = _mm_setzero_si128(); +#if R123_USE_CXX1X_UNRESTRICTED_UNIONS + r123m128i zM(zm); +#else + r123m128i zM; zM.m = zm; +#endif + uninitialized.m = _mm_setzero_si128(); + + // operator bool (or maybe void*) + assert(!uninitialized); + assert(!zM); + + // operator=(__m128i) + // conversion to __m128i + __m128i one = _mm_set_epi32(0, 0, 0, 1); + __m128i two = _mm_set_epi32(0, 0, 0, 2); + r123m128i One, Two; + One = one; + Two = two; + assert(!!One); + assert(!!Two); + r123m128i AnotherOne; + AnotherOne = one; + + assert( AnotherOne == One ); + assert( Two != One ); + __m128i m = One; + AnotherOne = m; + assert( AnotherOne == One ); + + // operator++ (prefix) + ++One; + assert( One == Two ); + assert( One != AnotherOne ); + + // operator+=(R123_ULONG_LONG) + // operator==(R123_ULONG_LONG, r123m128i) + R123_ULONG_LONG ull = 2; + AnotherOne += 1; + for(int i=0; i<1000; ++i){ + AnotherOne += i; + ull += i; + for(int j=0; j<i; ++j){ + assert(One != AnotherOne); + ++One; + } + assert(One == AnotherOne); + assert(ull == AnotherOne); + } + + // Do some additions that require carrying. + // Check the identity behavior of the streams + // as well +#if R123_USE_64BIT + for(uint64_t i=0; i<1000; ++i){ + uint64_t fff = (~((uint64_t)0)) - i; + AnotherOne += fff; + ull += fff; // will overflow + One += fff/2; + One += fff - fff/2; + assert(AnotherOne == One); + assert( !(ull == One) ); + std::stringstream ss; + r123m128i YetAnother; + ss << AnotherOne; + ss >> YetAnother; + + assert( YetAnother == AnotherOne ); + } +#endif + + // Sep 2011 - clang in the fink build of llvm-2.9.1 on MacOS 10.5.8 + // fails to catch anything, and hence fails this test. I suspect + // a problem with the packaging/installation rather than a bug + // in llvm. However, if it shows up in other contexts, some + // kind of #ifndef might be appropriate. N.B. There's a similar + // exception test in ut_carray.cpp + bool caught; + caught = false; + try{ + (void)(One < AnotherOne); + }catch(std::runtime_error& ){ caught = true; } + assert(caught); + + caught = false; + try{ + (void)(One <= AnotherOne); + }catch(std::runtime_error& ){ caught = true; } + assert(caught); + + caught = false; + try{ + (void)(One > AnotherOne); + }catch(std::runtime_error& ){ caught = true; } + assert(caught); + + caught = false; + try{ + (void)(One >= AnotherOne); + }catch(std::runtime_error& ){ caught = true; } + assert(caught); + + // assemble_from_u32<r123m128i> + + std::cout << "ut_M128: OK\n"; + return 0; +} + +#endif diff --git a/tests/ut_ReinterpretCtr.cpp b/tests/ut_ReinterpretCtr.cpp @@ -0,0 +1,51 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <Random123/ReinterpretCtr.hpp> +#include <Random123/threefry.h> +#include <iostream> +#include "util_demangle.hpp" + +using namespace r123; +int main(int, char **){ + r123array4x32 c = {{}}; + r123array4x32 r; + +#if R123_USE_64BIT + ReinterpretCtr<r123array4x32, Threefry2x64> p; + Threefry2x64::key_type kp = {{}}; + r = p(c, kp); + std::cout << demangle(p) << ": " << r << "\n"; +#else + std::cout << "Can't test ReinterpretCtr with R123_USE_64BIT = 0\n"; +#endif + return 0; +} diff --git a/tests/ut_aes.cpp b/tests/ut_aes.cpp @@ -0,0 +1,106 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// Check our AES implementation against the example in FIPS-197 + +#include <Random123/aes.h> +#include <Random123/ReinterpretCtr.hpp> +#if R123_USE_AES_OPENSSL +#include <openssl/aes.h> +#endif +#include <string> +#include <cstdio> +#include <iostream> +#include <cstring> +#include <cassert> + +using namespace std; +using namespace r123; + +#if !R123_USE_SSE +int main(int, char **){ + std::cout << "No SSE support. This test is not compiled\n"; + return 0; +} +#else + +#include "util_m128.h" + +int main(int, char **){ + r123array1xm128i IN, K; + + K.v[0].m = m128i_from_charbuf("0001020304050607 08090a0b0c0d0e0f"); + IN.v[0].m = m128i_from_charbuf("0011223344556677 8899aabbccddeeff"); + // From FIPS-197, this is the official "right answer" + r123array1xm128i right_answer; + right_answer[0] = m128i_from_charbuf("69c4 e0d8 6a7b 0430 d8cd b780 70b4 c55a"); + (void)right_answer; /* don't complain about an unused variable if neither NI nor OPENSSL are enabled. */ +#if R123_USE_AES_NI + if( haveAESNI() ){ + AESNI1xm128i::key_type xk(K); + AESNI1xm128i bx; + AESNI1xm128i::ctr_type x = bx(IN, xk); + + assert( x==right_answer ); + cout << "IN: " << m128i_to_string(IN[0]) << "\n"; + cout << "K : " << m128i_to_string(K[0]) << "\n"; + cout << "AES:" << m128i_to_string(x[0]) << "\n"; + cout << "Hooray! AESNI1xm128i(IN, K) matches the published test vector!\n"; + }else{ + cout << "The AES-NI instructions are not available on this hardware. Skipping AES-NI tests\n"; + } +#else + cout << "The AES-NI Bijections are not compiled into this binary. Skipping AES-NI tests\n"; +#endif + + // And let's do it with AESOpenSSL. But since AESOpenSSL has its own + // format for keys and counters we make a union for the key types and + // use ReinterpretCtr to wrap a union around the counter types. +#if R123_USE_AES_OPENSSL +#if R123_USE_AES_NI + typedef AESNI1xm128i::ctr_type nictype; +#else + typedef r123array1xm128i nictype; +#endif + AESOpenSSL16x8::ukey_type ouk; + _mm_storeu_si128((__m128i*)&ouk.v[0], K.v[0].m); + AESOpenSSL16x8::key_type okey(ouk); + ReinterpretCtr<nictype, AESOpenSSL16x8> osslb; + assert( osslb(IN, okey) == right_answer ); + cout << "Hooray! AESOpenSSL16x8(IN, K) matches the published test vector!\n"; +#else + cout << "The OpenSSL AES implementation is not linked with this binary. Skipping the AESOpenSSL16x8\n"; +#endif // R123_USE_AES_OPENSSL + + return 0; +} + +#endif diff --git a/tests/ut_ars.c b/tests/ut_ars.c @@ -0,0 +1,82 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <Random123/ars.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#if !R123_USE_SSE +int main(int argc, char **argv){ + (void)argc; (void)argv; /* unused */ + printf("No SSE support. This test is not compiled\n"); + return 0; +} +#else +#include "util_m128.h" + +int +main(int argc, char **argv) +{ +#if R123_USE_AES_NI + struct r123array1xm128i c, k, ret; + char m128str[M128_STR_SIZE], *kat; + + if (haveAESNI()) { + c.v[0].m = m128i_from_charbuf("01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"); + k.v[0].m = m128i_from_charbuf("01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"); + ret = ars1xm128i_R(7, c, k); + kat = "2b1623350cd214dc 7740187993411872"; + if (strcmp(m128i_to_charbuf(ret.v[0].m, m128str), kat) != 0) { + fprintf(stderr, "%s: error, expected %s, got %s\n", argv[0], kat, m128str); + exit(1); + } + printf("%s: OK, got %s\n", argv[0], kat); + c.v[0].m = m128i_from_charbuf("00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00"); + k.v[0].m = m128i_from_charbuf("01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"); + ret = ars1xm128i_R(7, c, k); + kat = "2de6b66fa461b668 f380126f32b9cd22"; + if (strcmp(m128i_to_charbuf(ret.v[0].m, m128str), kat) != 0) { + fprintf(stderr, "%s: error, expected %s, got %s\n", argv[0], kat, m128str); + exit(1); + } + printf("%s: OK, got %s\n", argv[0], kat); + } else { + printf("%s: no AES-NI on this machine\n", argv[0]); + } +#else + printf("%s: no AES-NI compiled into this program\n", argv[0]); +#endif + (void)argc; (void)argv; /* unused */ + return 0; +} + +#endif diff --git a/tests/ut_carray.cpp b/tests/ut_carray.cpp @@ -0,0 +1,319 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <Random123/array.h> +#include <iostream> +#include <typeinfo> +#include <sstream> +#include <limits> +#include <assert.h> +#include <vector> +#include "util_demangle.hpp" + +using namespace std; + +template<typename T> +inline static T zero(){ return 0; } + +template<typename T> +inline static T fff(){ return ~T(0); } + +template<typename T> +inline R123_ULONG_LONG ull(const T& t){ return static_cast<R123_ULONG_LONG>(t); } + +template <typename T> +inline uint32_t get32(const T& t, size_t n){ + return t>>(n*32); +} + +#if R123_USE_SSE +template<> +inline r123m128i zero<r123m128i>(){ r123m128i M; M.m=_mm_setzero_si128(); return M;} + +template<> +inline r123m128i fff<r123m128i>(){ r123m128i M; M.m=_mm_set_epi32(~0, ~0, ~0, ~0); return M;} + +template<> +inline R123_ULONG_LONG ull<r123m128i>(const r123m128i& t){ + return _mm_extract_lo64(t.m); +} + +template <> +inline uint32_t get32<r123m128i>(const r123m128i& t, size_t n){ + switch(n){ + case 3: return _mm_cvtsi128_si32(_mm_srli_si128(t.m, 12)); + case 2: return _mm_cvtsi128_si32(_mm_srli_si128(t.m, 8)); + case 1: return _mm_cvtsi128_si32(_mm_srli_si128(t.m, 4)); + } + return _mm_cvtsi128_si32(t.m); +} +#endif + +struct dummySeedSeq{ + typedef uint32_t result_type; + template <typename ITER> + void generate(ITER b, ITER e){ + uint32_t v = 0xdeadbeef; + for(; b!=e; ++b){ + *b = v; + v += 0xbaddecaf; + } + } +}; + +template <typename AType> +void doit(size_t N, size_t W){ + AType uninitialized; + typedef AType atype; + typedef typename atype::value_type vtype; + typedef typename atype::iterator itype; + + assert( R123_W(AType) == W ); + + cout << "doit<" << demangle(uninitialized) << ">"; + // size + assert(uninitialized.size() == N); + + // width + assert(sizeof(vtype)*8 == W); + // data + assert(uninitialized.data() == &uninitialized.v[0]); + + // front + assert(&uninitialized.front() == uninitialized.data()); + + // back + assert(&uninitialized.back() == uninitialized.data()+(N-1)); + + // The ut_carray Random123 unit test uses an empty initializer list to + // construct instances of different r123 arrays, in a test that's + // templated on array type. This works fine for all of the r123 array + // types except r123array1xm128i---i.e., an "array" consisting of a single + // __m128i value. GCC defines __m128i as a single long long, + // + // typedef long long __m128i __attribute__ ((__vector_size__ (16), + // __may_alias__)); + // + // while Intel defines it as a union, + // + // typedef union _MMINTRIN_TYPE(16) __m128i { + // #if !defined(_MSC_VER) + // /* + // * To support GNU compatible intialization with initializers list, + // * make first union member to be of int64 type. + // */ + // __int64 m128i_gcc_compatibility[2]; + // #endif + // /* + // * Although we do not recommend using these directly, they are here + // * for better MS compatibility. + // */ + // __int8 m128i_i8[16]; + // __int16 m128i_i16[8]; + // __int32 m128i_i32[4]; + // __int64 m128i_i64[2]; + // unsigned __int8 m128i_u8[16]; + // unsigned __int16 m128i_u16[8]; + // unsigned __int32 m128i_u32[4]; + // unsigned __int64 m128i_u64[2]; + // + // /* + // * This is what we used to have here alone. + // * Leave for backward compatibility. + // */ + // char c[16]; + // } __m128i; + // + // but PGI defines __m128i as a struct, + // + // typedef struct { + // private: long long m128i_i64[2]; + // } __attribute__((aligned(16))) __m128i; + // + // which can't be initialized with initializer lists before C++11. + + // constructor with initializer. [], at +#ifndef __PGI + AType z = {{}}; +#else + AType z; + z.fill(zero<vtype>()); +#endif + for(unsigned i=0; i<N; ++i){ + assert(!z[i]); + assert(!z.at(i)); + uninitialized[i] = z[i]; + uninitialized[i] += (i+1); + } + + // Copy-assignment + atype iota = uninitialized; + + // begin/end + for(itype p=iota.begin(); p!=iota.end(); ++p){ + assert((int)ull(*p) == 1+ (p-iota.begin())); + } + // cbegin/cend + for(typename atype::const_iterator p=iota.cbegin(); p!=iota.cend(); ++p){ + assert((int)ull(*p) == 1+ (p-iota.cbegin())); + } + + // rbegin/rend + for(typename atype::reverse_iterator p=iota.rbegin(); p!=iota.rend(); ++p){ + assert((int)ull(*p) == iota.rend()-p); + } + + // crbegin/crend + for(typename atype::const_reverse_iterator p=iota.crbegin(); p!=iota.crend(); ++p){ + assert((int)ull(*p) == iota.crend()-p); + } + + // == and != + assert(iota == uninitialized); + assert(!(iota != uninitialized)); + + for(size_t i=0; i<N; ++i){ + atype notequal = iota; + ++notequal[i]; + assert(notequal != iota); + assert(!(notequal == iota)); + } + + // Sep 2011 - clang in the fink build of llvm-2.9.1 on MacOS 10.5.8 + // fails to catch anything, and hence fails this test. I suspect + // a problem with the packaging/installation rather than a bug + // in llvm. However, if it shows up in other contexts, some + // kind of #ifndef might be appropriate. N.B. There's another + // exception test below and one in ut_M128.cpp + // check that at throws + bool caught = false; + try{ + iota.at(N); + }catch(std::out_of_range&){ + caught = true; + } + assert(caught); + + // fill + vtype one = zero<vtype>(); + ++one; + atype aone; + aone.fill(one); + for(size_t i=0; i<N; ++i){ + assert(aone[i] == one); + } + + // swap + aone.swap(z); + for(size_t i=0; i<N; ++i){ + assert(aone[i] == zero<vtype>()); + assert(z[i] == one); + } + + // seed + dummySeedSeq seedseq; + aone = atype::seed(seedseq); + vector<uint32_t> v32( N*((W+31)/32) ); + seedseq.generate(v32.begin(), v32.end()); + size_t jj=0; + uint32_t mask = 0xffffffff; + if( W < 32 ) + mask >>= (32-W); + for(size_t i=0; i<N; ++i){ + for(size_t j=0; j<W; j+=32){ + uint32_t aj = get32(aone[i], j/32); + assert( aj == (mask&v32.at(jj)) ); + jj++; + } + } + + // incr + +#ifndef __PGI + atype a = {{}}; +#else + atype a; + a.fill(zero<vtype>()); +#endif + a.incr(); + a.incr(); + a.incr(); + a.incr(); + assert( ull(a[0]) == 4u ); + assert( N<2 || ull(a[1]) == 0u ); + + a.incr(0xbadcafe); + assert( ull(a[0]) == (mask&(4u+0xbadcafe)) ); + + // Set the zero'th entry to fff and then increment + a[0] = fff<vtype>(); + a.incr(); + assert( a[0] == zero<vtype>() ); + assert( N<2 || ull(a[1]) == (W>8?1u:0xcc)); + + a.incr(); + assert( ull(a[0]) == 1u ); + assert( N<2 || ull(a[1]) == (W>8?1u:0xcc) ); + + R123_ULONG_LONG ulfff = ull(fff<vtype>()); + + a.incr(ulfff); + a.incr(ulfff - 5u); + a.incr(2); + a.incr(2); + a.incr(2); + a.incr(2); + + // operator<< and operator>> + + std::stringstream ss; + ss << a; + AType b; + ss >> b; + assert(a == b); + cout << " OK\n"; +} + + +int main(int, char **){ +#if R123_USE_SSE + doit<r123array1xm128i>(1, 128); +#endif + doit<r123array2x32>(2, 32); + doit<r123array4x32>(4, 32); +#if R123_USE_64BIT + doit<r123array2x64>(2, 64); + doit<r123array4x64>(4, 64); +#endif + doit<r123array16x8>(16, 8); + return 0; +} + diff --git a/tests/ut_features.cpp b/tests/ut_features.cpp @@ -0,0 +1,469 @@ +/* +Copyright 2010-2016, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +// This "unit test" is basically a test of the completeness +// of compilerfeatures.hpp. Each of the pp-symbols in compilerfeatures.hpp +// is supposed to have a definition. We check them all, and +// in some cases, emit some appropriate code to check that +// they reflect reality. +#include <assert.h> +#include <Random123/features/compilerfeatures.h> +#include <iostream> + +struct Outputter{ + Outputter(const char *name, int value){ + std::cout << name << " " << value << std::endl; + } +}; + +// Many symbols rely on the pp-convention of +// expanding undefined values in arithmetic expressions to 0. +// Thus, we can't do something terse like: +// #define Out(Sym) Outputter outputter##Sym(#Sym, Sym) +// Instead, we have to force the preprocessor to evaluate +// the symbol. +// #if Sym +// Otrue(Sym) +// #else +// Ofalse(Sym) +// #endif +#define Otrue(Sym) Outputter outputter##Sym(#Sym, true) +#define Ofalse(Sym) Outputter outputter##Sym(#Sym, false) + +#ifndef R123_USE_X86INTRIN_H +#error "No R123_USE_X86INTRIN_H" +#endif +#if R123_USE_X86INTRIN_H +#include <x86intrin.h> +Otrue(R123_USE_X86INTRIN_H); +#else +Ofalse(R123_USE_X86INTRIN_H); +#endif + +#ifndef R123_USE_IA32INTRIN_H +#error "No R123_USE_IA32INTRIN_H" +#endif +#if R123_USE_IA32INTRIN_H +Otrue(R123_USE_IA32INTRIN_H); +#include <ia32intrin.h> +#else +Ofalse(R123_USE_IA32INTRIN_H); +#endif + +#ifndef R123_USE_XMMINTRIN_H +#error "No R123_USE_XMMINTRIN_H" +#endif +#if R123_USE_XMMINTRIN_H +#include <xmmintrin.h> +Otrue(R123_USE_XMMINTRIN_H); +#else +Ofalse(R123_USE_XMMINTRIN_H); +#endif + +#ifndef R123_USE_EMMINTRIN_H +#error "No R123_USE_EMMINTRIN_H" +#endif +#if R123_USE_EMMINTRIN_H +#include <emmintrin.h> +Otrue(R123_USE_EMMINTRIN_H); +#else +Ofalse(R123_USE_EMMINTRIN_H); +#endif + +#ifndef R123_USE_SMMINTRIN_H +#error "No R123_USE_SMMINTRIN_H" +#endif +#if R123_USE_SMMINTRIN_H +Otrue(R123_USE_SMMINTRIN_H); +#include <smmintrin.h> +#else +Ofalse(R123_USE_SMMINTRIN_H); +#endif + +#ifndef R123_USE_WMMINTRIN_H +#error "No R123_USE_WMMINTRIN_H" +#endif +#if R123_USE_WMMINTRIN_H +Otrue(R123_USE_WMMINTRIN_H); +#include <wmmintrin.h> +#else +Ofalse(R123_USE_WMMINTRIN_H); +#endif + +#ifndef R123_USE_INTRIN_H +#error "No R123_USE_INTRIN_H" +#endif +#if R123_USE_INTRIN_H +Otrue(R123_USE_INTRIN_H); +#include <intrin.h> +#else +Ofalse(R123_USE_INTRIN_H); +#endif + +#ifndef R123_USE_SSE +#error "No R123_USE_SSE" +#endif +#if R123_USE_SSE +Otrue(R123_USE_SSE); +#include <Random123/features/sse.h> +__m128i mm; +#else +Ofalse(R123_USE_SSE); +#endif + +#ifndef R123_CUDA_DEVICE +#error "No R123_CUDA_DEVICE" +#endif +R123_CUDA_DEVICE void cuda_device_func(){} + +// C++11 features +#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS +#error "No R123_USE_CXX11_UNRESTRICTED_UNIONS" +#endif +#if R123_USE_CXX11_UNRESTRICTED_UNIONS +Otrue(R123_USE_CXX11_UNRESTRICTED_UNIONS); +struct defaulted_ctor{ + int i; + defaulted_ctor()=default; + defaulted_ctor(const defaulted_ctor& d) : i(d.i){} +}; +union unrestricted{ + int i; + defaulted_ctor dc; +}; +#else +Ofalse(R123_USE_CXX11_UNRESTRICTED_UNIONS); +#endif + +#ifndef R123_USE_CXX11_STATIC_ASSERT +#error "No R123_USE_CXX11_STATIC_ASSERT" +#endif +#if R123_USE_CXX11_STATIC_ASSERT +Otrue(R123_USE_CXX11_STATIC_ASSERT); +static_assert(true, "this shouldn't be a problem"); +#else +Ofalse(R123_USE_CXX11_STATIC_ASSERT); +#endif + +#ifndef R123_USE_CXX11_CONSTEXPR +#error "No R123_USE_CXX11_CONSTEXPR" +#endif +#if R123_USE_CXX11_CONSTEXPR +Otrue(R123_USE_CXX11_CONSTEXPR); +constexpr int zero() {return 0;} +#else +Ofalse(R123_USE_CXX11_CONSTEXPR); +#endif + +#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS +#error "No R123_USE_CXX11_EXPLICIT_CONVERSIONS" +#endif +#if R123_USE_CXX11_EXPLICIT_CONVERSIONS +Otrue(R123_USE_CXX11_EXPLICIT_CONVERSIONS); +struct explicit_converter{ + explicit operator bool() const {return true;} +}; +#else +Ofalse(R123_USE_CXX11_EXPLICIT_CONVERSIONS); +#endif + +#ifndef R123_USE_CXX11_RANDOM +#error "No R123_USE_CXX11_RANDOM" +#endif +#if R123_USE_CXX11_RANDOM +Otrue(R123_USE_CXX11_RANDOM); +#include <random> +#else +Ofalse(R123_USE_CXX11_RANDOM); +#endif + +#ifndef R123_USE_CXX11_TYPE_TRAITS +#error "No R123_USE_CXX11_TYPE_TRAITS" +#endif +#if R123_USE_CXX11_TYPE_TRAITS +Otrue(R123_USE_CXX11_TYPE_TRAITS); +#include <type_traits> +#else +Ofalse(R123_USE_CXX11_TYPE_TRAITS); +#endif + +#ifndef R123_USE_CXX11_LONG_LONG +#error "No R123_USE_CXX11_LONG_LONG" +#endif +#if R123_USE_CXX11_LONG_LONG +Otrue(R123_USE_CXX11_LONG_LONG); +unsigned long long ull; +#else +Ofalse(R123_USE_CXX11_LONG_LONG); +#endif + +#ifndef R123_USE_CXX11_STD_ARRAY +#error "No R123_USE_CXX11_STD_ARRAY" +#endif +#if R123_USE_CXX11_STD_ARRAY +Otrue(R123_USE_CXX11_STD_ARRAY); +#include <array> +std::array<int, 4> sai4; +#else +Ofalse(R123_USE_CXX11_STD_ARRAY); +#endif + +#ifndef R123_FORCE_INLINE +#error "No R123_FORCE_INLINE" +#endif +inline R123_FORCE_INLINE(int forcibly_inlined(int i)); +inline int forcibly_inlined(int i){ return i+1;} + +#ifndef R123_USE_AES_NI +#error "No R123_USE_AES_NI" +#endif +#if R123_USE_AES_NI +Otrue(R123_USE_AES_NI); +__m128i aes(__m128i in){ + if( haveAESNI() ) + return _mm_aesenc_si128(in, in); + else + return _mm_setzero_si128(); +} +#else +Ofalse(R123_USE_AES_NI); +#endif + +#ifndef R123_USE_SSE4_2 +#error "No R123_USE_SSE4_2" +#endif +#if R123_USE_SSE4_2 +Otrue(R123_USE_SSE4_2); +__m128i sse42(__m128i in){ + return _mm_cmpgt_epi64(in, in); +} +#else +Ofalse(R123_USE_SSE4_2); +#endif + +#ifndef R123_USE_SSE4_1 +#error "No R123_USE_SSE4_1" +#endif +#if R123_USE_SSE4_1 +Otrue(R123_USE_SSE4_1); +int sse41(__m128i in){ + return _mm_testz_si128(in, in); +} +#else +Ofalse(R123_USE_SSE4_1); +#endif + +#ifndef R123_USE_AES_OPENSSL +#error "No R123_USE_AES_OPENSSL" +#endif +#if R123_USE_AES_OPENSSL +Otrue(R123_USE_AES_OPENSSL); +#include <openssl/aes.h> +#else +Ofalse(R123_USE_AES_OPENSSL); +#endif + +#ifndef R123_USE_GNU_UINT128 +#error "No R123_USE_GNU_UINT128" +#endif +#if R123_USE_GNU_UINT128 +Otrue(R123_USE_GNU_UINT128); +__uint128_t u128; +#else +Ofalse(R123_USE_GNU_UINT128); +#endif + +#ifndef R123_USE_ASM_GNU +#error "No R123_USE_ASM_GNU" +#endif +#if R123_USE_ASM_GNU +Otrue(R123_USE_ASM_GNU); +#if defined(__x86_64__) || defined(__i386__) +int use_gnu_asm(){ + unsigned int eax, ebx, ecx, edx; + __asm__ __volatile__ ("cpuid": "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : + "a" (1)); + return (ecx>>25) & 1; +} +#else +int use_gnu_asm(){ return 0; } +#endif +#else +Ofalse(R123_USE_ASM_GNU); +#endif + +#ifndef R123_USE_CPUID_MSVC +#error "No R123_USE_CPUID_MSVC" +#endif +#if R123_USE_CPUID_MSVC +Otrue(R123_USE_CPUID_MSVC); +int chkcpuid(){ + int CPUInfo[4]; + __cpuid(CPUInfo, 1); + return CPUInfo[2]&(1<<25); +} +#else +Ofalse(R123_USE_CPUID_MSVC); +#endif + +#ifndef R123_USE_MULHILO32_ASM +#error "No R123_USE_MULHILO32_ASM" +#endif +#if R123_USE_MULHILO32_ASM +Otrue(R123_USE_MULHILO32_ASM); +#else +Ofalse(R123_USE_MULHILO32_ASM); +#endif + +#ifndef R123_USE_MULHILO64_ASM +#error "No R123_USE_MULHILO64_ASM" +#endif +#if R123_USE_MULHILO64_ASM +Otrue(R123_USE_MULHILO64_ASM); +#else +Ofalse(R123_USE_MULHILO64_ASM); +#endif + +#ifndef R123_USE_MULHILO64_MSVC_INTRIN +#error "No R123_USE_MULHILO_MSVC_INTRIN" +#endif +#if R123_USE_MULHILO64_MSVC_INTRIN +Otrue(R123_USE_MULHILO64_MSVC_INTRIN); +#include <cstdint> +void msvc64mul(){ + uint64_t a=1000000000000000000; + uint64_t b=a; + uint64_t h, l; + l = _umul128(a, b, &h); + assert( l == a*b); + assert( h == 54210108624275221ULL ); +} +#else +Ofalse(R123_USE_MULHILO64_MSVC_INTRIN); +#endif + +#ifndef R123_USE_MULHILO64_CUDA_INTRIN +#error "No R123_USE_MULHILO64_CUDA_INTRIN" +#endif +#if R123_USE_MULHILO64_CUDA_INTRIN +Otrue(R123_USE_MULHILO64_CUDA_INTRIN); +#else +Ofalse(R123_USE_MULHILO64_CUDA_INTRIN); +#endif + +#ifndef R123_USE_MULHILO64_OPENCL_INTRIN +#error "No R123_USE_MULHILO64_OPENCL_INTRIN" +#endif +#if R123_USE_MULHILO64_OPENCL_INTRIN +Otrue(R123_USE_MULHILO64_OPENCL_INTRIN); +#else +Ofalse(R123_USE_MULHILO64_OPENCL_INTRIN); +#endif + +#ifndef R123_USE_MULHILO64_MULHI_INTRIN +#error "No R123_USE_MULHILO64_MULHI_INTRIN" +#endif +#if R123_USE_MULHILO64_MULHI_INTRIN +Otrue(R123_USE_MULHILO64_MULHI_INTRIN); +static int test_mulhilo64_intrin(){ + uint64_t a = R123_64BIT(0x1234567887654321); + uint64_t b = R123_64BIT(0x8765432112345678); + uint64_t c = R123_MULHILO64_MULHI_INTRIN(a, b); + assert( c == R123_64BIT(0x09A0CD05B99FE92E) ); + return c == R123_64BIT(0x09A0CD05B99FE92E); +} +int mulhilo64_intrin_ok = test_mulhilo64_intrin(); +#else +Ofalse(R123_USE_MULHILO64_MULHI_INTRIN); +#endif + +#ifndef R123_USE_MULHILO32_MULHI_INTRIN +#error "No R123_USE_MULHILO32_MULHI_INTRIN" +#endif +#if R123_USE_MULHILO32_MULHI_INTRIN +Otrue(R123_USE_MULHILO32_MULHI_INTRIN); +static int test_mulhilo32_intrin(){ + uint64_t a32 = 0x12345678; + uint64_t b32 = 0x87654321; + uint64_t c32 = R123_MULHILO32_MULHI_INTRIN(a32, b32); + assert( c32 == 0x09A0CD05 ); + return c32 == 0x09A0CD05; +} +int mulhilo32_intrin_ok = test_mulhilo32_intrin(); +#else +Ofalse(R123_USE_MULHILO32_MULHI_INTRIN); +#endif + +#ifndef R123_USE_MULHILO64_C99 +#error "No R123_USE_MULHILO64_C99" +#endif +#if R123_USE_MULHILO64_C99 +Otrue(R123_USE_MULHILO64_C99); +#else +Ofalse(R123_USE_MULHILO64_C99); +#endif + +#ifndef R123_64BIT +#error "No R123_64BIT" +#else +void xx() { + uint64_t a = R123_64BIT(0x1234567890abcdef); + assert ( (a >> 60) == 0x1 ); +} +#endif + +#ifndef R123_USE_PHILOX_64BIT +#error "No R123_USE_PHILOX_64BIT" +#endif +#if R123_USE_PHILOX_64BIT +Otrue(R123_USE_PHILOX_64BIT); +#else +Ofalse(R123_USE_PHILOX_64BIT); +#endif + +#ifndef R123_ASSERT +#error "No R123_ASSERT" +#else +void chkassert(){ + R123_ASSERT(1); +} +#endif + +#ifndef R123_STATIC_ASSERT +#error "No R123_STATIC_ASSERT" +#else +R123_STATIC_ASSERT(1, "looks true to me"); +void chkstaticassert(){ + R123_STATIC_ASSERT(1, "it's ok inside a function too"); +} +#endif + +int main(int , char **){return 0;} diff --git a/tests/ut_gsl.c b/tests/ut_gsl.c @@ -0,0 +1,112 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include <gsl/gsl_randist.h> +#include <stdio.h> +#include "Random123/philox.h" +#include "Random123/threefry.h" +#include "Random123/conventional/gsl_cbrng.h" +#include <assert.h> + +/* Exercise the GSL_CBRNG macro */ + +GSL_CBRNG(cbrng, threefry4x64); /* creates gsl_rng_cbrng */ + +int main(int argc, char **argv){ + int i; + gsl_rng *r; + gsl_rng *rcopy; + unsigned long save, x; + unsigned long saved[5]; + double sum = 0.; + (void)argc; (void)argv; /* unused */ + + r = gsl_rng_alloc(gsl_rng_cbrng); + assert (gsl_rng_min(r) == 0); + assert (gsl_rng_max(r) == 0xffffffffUL); // Not necessarily ~0UL + assert (gsl_rng_size(r) > 0); + + printf("%s\nulongs from %s in initial state\n", argv[0], gsl_rng_name(r)); + for (i = 0; i < 5; i++) { + x = gsl_rng_get(r); + saved[i] = x; + printf("%d: 0x%lx\n", i, x); + assert(x != 0); + } + printf("uniforms from %s\n", gsl_rng_name(r)); + for (i = 0; i < 5; i++) { + double z = gsl_rng_uniform(r); + sum += z; + printf("%d: %.4g\n", i, z); + } + assert( sum < 0.9*5 && sum > 0.1*5 && (long)"sum must be reasonably close to 0.5*number of trials"); + save = gsl_rng_get(r); + + gsl_rng_set(r, 0xdeadbeef); /* set a non-zero seed */ + printf("ulongs from %s after seed\n", gsl_rng_name(r)); + for (i = 0; i < 5; i++) { + x = gsl_rng_get(r); + printf("%d: 0x%lx\n", i, x); + assert(x != 0); + } + /* make a copy of the total state */ + rcopy = gsl_rng_alloc(gsl_rng_cbrng); + gsl_rng_memcpy(rcopy, r); + printf("uniforms from %s\n", gsl_rng_name(r)); + sum = 0.; + for (i = 0; i < 5; i++) { + double x = gsl_rng_uniform(r); + double y = gsl_rng_uniform(rcopy); + printf("%d: %.4g\n", i, x); + sum += x; + assert(x == y); + } + assert(gsl_rng_get(r) != save); + assert( sum < 0.9*5 && sum > 0.1*5 && (long)"sum must be reasonably close to 0.5*number of trials"); + + /* gsl_rng_set(*, 0) is supposed to recover the default seed */ + gsl_rng_set(r, 0); + printf("ulongs from %s after restore to initial\n", gsl_rng_name(r)); + for (i = 0; i < 5; i++) { + x = gsl_rng_get(r); + assert( x == saved[i] ); + printf("%d: 0x%lx\n", i, x); + assert(x != 0); + } + printf("uniforms from %s\n", gsl_rng_name(r)); + for (i = 0; i < 5; i++) { + printf("%d: %.4g\n", i, gsl_rng_uniform(r)); + } + assert(gsl_rng_get(r) == save); + + gsl_rng_free (r); + return 0; +} diff --git a/tests/ut_ua.cpp b/tests/ut_ua.cpp @@ -0,0 +1,63 @@ +/* +Copyright 2013, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#if __cplusplus<201103L +#include <iostream> +int main(int, char**){ + std::cout << "ua.hpp requires C++11. No tests performed\n"; + return 0; +} +#else + +#include <Random123/array.h> +#include <Random123/threefry.h> +#include <Random123/uniform.hpp> + +using namespace r123; +int main(int, char **){ + Threefry4x32 rng; + Threefry4x32::ctr_type c = {{1, 2, 3, 4}}; + Threefry4x32::ukey_type uk = {{5, 6, 7, 8}}; + Threefry4x32::key_type k = uk; + auto a = u01all<float>(rng(c, k)); // returns std::array<float,4> + for(auto e : a){ + std::cout << e << "\n"; + } + c.incr(); + auto b = u01all<double>(rng(c, k)); + for(auto e : b){ + std::cout << e << "\n"; + } + + return 0; +} +#endif diff --git a/tests/ut_uniform.cpp b/tests/ut_uniform.cpp @@ -0,0 +1,173 @@ +/* +Copyright 2013, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + /* ut_uniform.cpp: unit test for uniform.hpp. + + This is a "sanity test" of u01, uneg11 and u01fixedpt. We confirm + that a histogram of few thousand calls to each of the functions + matches a reference histogram. This verifies that the results are + generally sane i.e., they fall within the expected range, and that + they are close to a correct distribution. It is *not* a foolproof + test of correctness, but it should catch portability issues + like errors in r123::make_signed or r123::make_unsigned + or r123::maxTvalue or misunderstandings about std::numeric_limits. + + There is a "known answer test" for uniform.hpp in ut_uniform_IEEEkat.cpp, + but it is only expected to work on machines with strict IEEE arithmetic + and no high-precicision intermediates. See its own comments for + more details. + */ + +#include <Random123/uniform.hpp> +#include <Random123/threefry.h> +#include <stdio.h> +#include <stdlib.h> +#include <map> +#include <string> +#include <sstream> + +using namespace r123; + +template <typename T> +typename r123::make_unsigned<T>::type U(T x){ return x; } + +template <typename T> +typename r123::make_signed<T>::type S(T x){ return x; } + +#define Chk(u, Rng, Ftype) do{ \ + chk<Ftype, Rng>(#u, #Rng, #Ftype, &u<Ftype, Rng::ctr_type::value_type>); \ + }while(0) + +std::map<std::string, std::string> refmap; + +void RefHist(const char* k, const char *v){ + refmap[std::string(k)] = std::string(v); +} + +void fillrefhist(){ +#include "ut_uniform_reference.hpp" +} + +bool checking = true; +int nfail = 0; + +template<typename Ftype, typename RNG, typename Utype> +void chk(const std::string& fname, const std::string& rngname, const std::string& ftypename, Utype f){ + std::string key = fname + " " + rngname + " " + ftypename; + RNG rng; + typedef typename RNG::ukey_type ukey_type; + typedef typename RNG::ctr_type ctr_type; + typedef typename RNG::key_type key_type; + + ctr_type c = {{}}; + ukey_type uk = {{}}; + key_type k = uk; + // 26 bins - 13 greater than 0 and 13 less. Why 13? Because a + // prime number seems less likely to tickle the rounding-related + // corner cases, which is aruably both good and bad. + const int NBINS=26; + + int hist[NBINS] = {}; + for(int i=0; i<1000; ++i){ + c = c.incr(); + ctr_type r = rng(c, k); + for(int j=0; j<ctr_type::static_size; ++j){ + Ftype u = f(r[j]); + //printf("%s %llx, %.17g\n", key.c_str(), (long long)r[j], (double)u); + R123_ASSERT( u >= -1.); + R123_ASSERT( u <= 1.); + int idx = (int) ((u + Ftype(1.))*Ftype(NBINS/2)); + hist[idx]++; + } + } + std::ostringstream oss; + for(int i=0; i<NBINS; ++i){ + oss << " " << hist[i]; + } + if(checking){ + if( oss.str() != refmap[key] ){ + printf("MISMATCH: %s:\n\tcomputed histogram=%s\n\treference histogram=%s\n", + key.c_str(), + oss.str().c_str(), + refmap[key].c_str()); + nfail++; + } + }else{ + printf("RefHist(\"%s\", \"%s\");\n", key.c_str(), oss.str().c_str()); + } +} + +int main(int argc, char **argv){ + checking = (argc==1); + fillrefhist(); + + // 18 tests: 3 functions (u01, uneg11, u01fixedpt) + // x 2 input sizes (32 bit or 64 bit) + // x 3 output sizes (float, double, long double) + Chk(u01, Threefry4x32, float); + Chk(u01, Threefry4x32, double); + Chk(u01, Threefry4x32, long double); + +#if R123_USE_64BIT + Chk(u01, Threefry4x64, float); + Chk(u01, Threefry4x64, double); + Chk(u01, Threefry4x64, long double); +#endif + + Chk(uneg11, Threefry4x32, float); + Chk(uneg11, Threefry4x32, double); + Chk(uneg11, Threefry4x32, long double); + +#if R123_USE_64BIT + Chk(uneg11, Threefry4x64, float); + Chk(uneg11, Threefry4x64, double); + Chk(uneg11, Threefry4x64, long double); +#endif + + Chk(u01fixedpt, Threefry4x32, float); + Chk(u01fixedpt, Threefry4x32, double); + Chk(u01fixedpt, Threefry4x32, long double); + +#if R123_USE_64BIT + Chk(u01fixedpt, Threefry4x64, float); + Chk(u01fixedpt, Threefry4x64, double); + Chk(u01fixedpt, Threefry4x64, long double); +#endif + + if(nfail){ + printf("// %s: FAILED %d Known-Answer-Tests failed\n", argv[0], nfail); + }else if(checking){ + printf("%s: SUCCESS\n", argv[0]); + } + + return !!nfail; +} diff --git a/tests/ut_uniform_IEEEkat.cpp b/tests/ut_uniform_IEEEkat.cpp @@ -0,0 +1,293 @@ +/* +Copyright 2013, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + /* ut_uniform_IEEEkat.cpp - a "Known Answer Test" for uniform.hpp + + This code tests that the compilation environment reproduces + exactly the behavior of u01, uneg11 and u01fixedpt on an x86-64 + system with strict IEEE arithmetic. It is likely to fail on + systems that use 80-bit internal registers (e.g., 32-bit x86), and + systems that are smart enough to fuse floating point multiply and + add into a single, rounded-only-once instruction (e.g., PowerPC, + Fermi, newer ARMs, Haswell, Itanium, etc.). Failures in these + cases are *not* necessarily problematic. */ + +#include <Random123/uniform.hpp> +#include <stdio.h> +#include <stdlib.h> +#include <map> +#include <string> + +using namespace r123; + +std::map<std::string, long double> katmap; + +// Don't inline this. It's called thousands of times in fill_katmap +// and blows out the optimizer in older versions of clang and open64 +// if it's inlined. +void insert(const char *s, long double v){ + katmap[std::string(s)] = v; +} + +void fill_katmap(){ +#include "ut_uniform_IEEEkatvectors.hpp" +#if 0 // helpful for debug, + for(std::map<std::string, long double>::iterator p=katmap.begin(); p!=katmap.end(); ++p){ + fprintf(stderr, "%s -> %La\n", p->first.c_str(), p->second); + } +#endif +} + +template <typename T> +typename r123::make_unsigned<T>::type U(T x){ return x; } + +template <typename T> +typename r123::make_signed<T>::type S(T x){ return x; } + +bool checking = true; +int nfail = 0; +int nuntested = 0; +int notfound = 0; + +#define DO1(T, expr, astr) DoOne<T>(#expr, astr, expr) + +#define DO(i, astr) do{ \ + ChkSignInvariance(#i, i); \ + if(std::numeric_limits<float>::digits == 24){ \ + DO1(float, u01<float>(i), astr); \ + DO1(float, uneg11<float>(i), astr); \ + DO1(float, u01fixedpt<float>(i), astr); \ + }else{ \ + printf("UNTESTED: %s: float does not have a 24 bit mantissa\n", #i); \ + nuntested++; \ + } \ + if(std::numeric_limits<double>::digits == 53){ \ + DO1(double, u01<double>(i), astr); \ + DO1(double, uneg11<double>(i), astr); \ + DO1(double, u01fixedpt<double>(i), astr); \ + }else{ \ + printf("UNTESTED: %s: double does not have a 53 bit mantissa\n", #i); \ + nuntested++; \ + } \ + if(std::numeric_limits<long double>::digits == 64){ \ + DO1(long double, u01<long double>(i), astr); \ + DO1(long double, uneg11<long double>(i), astr); \ + DO1(long double, u01fixedpt<long double>(i), astr); \ + }else{ \ + printf("UNTESTED: %s: long double does not have a 64 bit mantissa\n", #i); \ + nuntested++; \ + } \ + } while(0) + +// u01, uneg11 and u01fixedpt should all depend on the bits, but not the +// signedness of their argument. The templated functions S(i) and U(i) +// return their argument cast to an approprite signed and unsigned type. +// ChkSignInvariance verifies that. +template <typename IType> +void ChkSignInvariance(const std::string& s, IType i){ + if( u01<float>(S(i)) != u01<float>(U(i)) ){ + printf("INVARIANT FAILURE: u01<float>(Signed(x)) != u01<float>(Unsigned(x)) x=%s\n", s.c_str()); + nfail++; + } + if( uneg11<float>(S(i)) != uneg11<float>(U(i)) ){ + printf("INVARIANT FAILURE: uneg11<float>(Signed(x)) != uneg11<float>(Unsigned(x)) x=%s\n", s.c_str()); + nfail++; + } + if( u01fixedpt<float>(S(i)) != u01fixedpt<float>(U(i)) ){ + printf("INVARIANT FAILURE: u01<float>(Signed(x)) != u01<float>(Unsigned(x)) x=%s\n", s.c_str()); + nfail++; + } + + if( u01<double>(S(i)) != u01<double>(U(i)) ){ + printf("INVARIANT FAILURE: u01<double>(Signed(x)) != u01<double>(Unsigned(x)) x=%s\n", s.c_str()); + nfail++; + } + if( uneg11<double>(S(i)) != uneg11<double>(U(i)) ){ + printf("INVARIANT FAILURE: uneg11<double>(Signed(x)) != uneg11<double>(Unsigned(x)) x=%s\n", s.c_str()); + nfail++; + } + if( u01fixedpt<double>(S(i)) != u01fixedpt<double>(U(i)) ){ + printf("INVARIANT FAILURE: u01<double>(Signed(x)) != u01<double>(Unsigned(x)) x=%s\n", s.c_str()); + nfail++; + } + + if( u01<long double>(S(i)) != u01<long double>(U(i)) ){ + printf("INVARIANT FAILURE: u01<long double>(Signed(x)) != u01<long double>(Unsigned(x)) x=%s\n", s.c_str()); + nfail++; + } + if( uneg11<long double>(S(i)) != uneg11<long double>(U(i)) ){ + printf("INVARIANT FAILURE: uneg11<long double>(Signed(x)) != uneg11<long double>(Unsigned(x)) x=%s\n", s.c_str()); + nfail++; + } + if( u01fixedpt<long double>(S(i)) != u01fixedpt<long double>(U(i)) ){ + printf("INVARIANT FAILURE: u01<long double>(Signed(x)) != u01<long double>(Unsigned(x)) x=%s\n", s.c_str()); + nfail++; + } +} + +template <typename T> +void DoOne(const std::string s, const char* astr, volatile T x){ + std::string ss = s + " a=" + astr; + volatile long double ldx = x; + if(checking){ + if( katmap.find(ss) == katmap.end() ){ + printf("NOT FOUND: katmap[%s]\n", ss.c_str()); + notfound++; + }else{ + if(ldx!=katmap[ss]){ + printf("MISMATCH: %s: computed=%.21Lg reference=%.21Lg\n", ss.c_str(), ldx, katmap[ss]); + nfail++; + } + } + }else{ + printf("insert(\"%s\", %#.21LgL);\n", ss.c_str(), ldx); + } +} + +void DO3264(int a){ + const uint32_t maxu32 = std::numeric_limits<uint32_t>::max(); + const uint64_t maxu64 = std::numeric_limits<uint64_t>::max(); + const uint32_t minu32 = std::numeric_limits<uint32_t>::min(); + const uint64_t minu64 = std::numeric_limits<uint64_t>::min(); + + const int32_t maxi32 = std::numeric_limits<int32_t>::max(); + const int64_t maxi64 = std::numeric_limits<int64_t>::max(); + const int32_t mini32 = std::numeric_limits<int32_t>::min(); + const int64_t mini64 = std::numeric_limits<int64_t>::min(); + + char astr[32]; + sprintf(astr, "%d", a); + + DO( minu32 + uint32_t(a), astr ); + DO( minu64 + uint64_t(a), astr ); + DO( mini32 + int32_t(a), astr ); + DO( mini64 + int64_t(a), astr ); + + DO( maxu32 - uint32_t(a), astr ); + DO( maxu64 - uint64_t(a), astr ); + DO( maxi32 - int32_t(a), astr ); + DO( maxi64 - int64_t(a), astr ); +} + +int main(int argc, char **argv){ + if(argc>1){ + checking = false; + printf("/* This file was created by '%s %s' on a reference\n" + " platform, and is #included in the recompilation of %s\n" + " on a target platform. When %s is run with no arguments\n" + " on the target platform, it asserts that the values computed\n" + " on the target platform match the reference values recorded here.\n" + " These reference values were computed on an x86_64 using 32-bit,\n" + " 64-bit and 80-bit IEEE arithmetic for float, double and long double\n" + " respectively. Other platforms with different representations of\n" + " floating point values or different conventions for how intermediates\n" + " are stored and rounded will almost certainly fail these tests\n" + " even though their results might be perfectly valid.\n" + "*/\n", argv[0], argv[1], argv[0], argv[0]); + } + fill_katmap(); + + + DO3264(0); + DO3264(1); + DO3264(2); + DO3264(3); + DO3264(4); + DO3264(5); + + DO3264(63); + DO3264(64); + DO3264(65); + + DO3264(127); + DO3264(128); + DO3264(129); + + DO3264(191); + DO3264(192); + DO3264(193); + + DO3264(255); + DO3264(256); + DO3264(257); + + DO3264(319); + DO3264(320); + DO3264(321); + + DO3264(382); + DO3264(383); + DO3264(384); + + DO3264(639); + DO3264(640); + DO3264(641); + + DO3264(1023); + DO3264(1024); + DO3264(1025); + + DO3264(3070); + DO3264(3071); + DO3264(3072); + + DO3264(5119); + DO3264(5120); + DO3264(5121); + + if(notfound){ + printf("// %s: WARNING: %d tests were not checked because reference values were not compiled in\n", + argv[0], notfound); + } + if(nuntested){ + printf("// %s: WARNING: %d tests were not performed because the floating point rep does not match the IEEE format used to compute reference values\n", + argv[0], nuntested); + } + if(nfail){ + printf("// %s: FAILED %d Known-Answer-Tests failed\n", argv[0], nfail); + printf("Such failures may be due to non-IEEE arithmetic on your platform. In some \n" + "cases, you may be able to recover IEEE arithmetic by pre-defining the\n" + "pp-symbol R123_UNIFORM_FLOAT_STORE to a non-zero value, e.g., adding\n" + "-DR123_UNIFORM_FLOAT_STORE=1 to the compile command line. On some\n" + "systems (notably, 32-bit x86 architectures) this will prevent use of\n" + "extra-wide internal floating point registers and will recover IEEE\n" + "arithmetic. Unfortunately, this will make u01 and uneg11 significantly\n" + "slower, so you may not wish to define it in production code. As far\n" + "as we know, the floating point values returned with the symbol unset\n" + "are perfectly reasonable. They simply don't perfectly match the\n" + "values computed on our reference x86-64 platform with IEEE arithmetic\n"); + }else{ + printf("// %s: SUCCESS\n", argv[0]); + } + + return !!nfail; +} diff --git a/tests/ut_uniform_IEEEkatvectors.hpp b/tests/ut_uniform_IEEEkatvectors.hpp @@ -0,0 +1,2605 @@ +/* This file was created by './ut_uniform_IEEEkat 1' on a reference + platform, and is #included in the recompilation of ./ut_uniform_IEEEkat + on a target platform. When ./ut_uniform_IEEEkat is run with no arguments + on the target platform, it asserts that the values computed + on the target platform match the reference values recorded here. + These reference values were computed on an x86_64 using 32-bit, + 64-bit and 80-bit IEEE arithmetic for float, double and long double + respectively. Other platforms with different representations of + floating point values or different conventions for how intermediates + are stored and rounded will almost certainly fail these tests + even though their results might be perfectly valid. +*/ +insert("u01<float>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=0", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("u01<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("u01<float>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=0", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=0", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L); +insert("u01<float>(mini32 + int32_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=0", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=0", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L); +insert("uneg11<double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L); +insert("u01<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L); +insert("u01<float>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=0", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=0", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=0", -0.999999999999999999946L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000054L); +insert("u01<float>(maxu32 - uint32_t(a)) a=0", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=0", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L); +insert("u01<float>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=0", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999999946L); +insert("u01<float>(maxi32 - int32_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=0", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=0", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L); +insert("u01<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L); +insert("u01<float>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=0", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=0", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999973L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=0", 0.999999999999999999946L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999946L); +insert("u01<float>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("u01<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("u01<float>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1", 5.42101086242752217004e-20L); +insert("u01<float>(mini32 + int32_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=1", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L); +insert("uneg11<double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L); +insert("u01<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L); +insert("u01<float>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000108L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=1", -0.999999999999999999837L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000054L); +insert("u01<float>(maxu32 - uint32_t(a)) a=1", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L); +insert("u01<float>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999892L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999946L); +insert("u01<float>(maxi32 - int32_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=1", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L); +insert("u01<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L); +insert("u01<float>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999919L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=1", 0.999999999999999999837L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999946L); +insert("u01<float>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=2", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("u01<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("u01<float>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=2", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=2", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=2", 1.62630325872825665101e-19L); +insert("u01<float>(mini32 + int32_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=2", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=2", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L); +insert("uneg11<double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L); +insert("u01<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L); +insert("u01<float>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=2", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=2", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000108L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=2", -0.999999999999999999729L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000163L); +insert("u01<float>(maxu32 - uint32_t(a)) a=2", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=2", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L); +insert("u01<float>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=2", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999892L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999837L); +insert("u01<float>(maxi32 - int32_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=2", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=2", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L); +insert("u01<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L); +insert("u01<float>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=2", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=2", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999864L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=2", 0.999999999999999999729L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999837L); +insert("u01<float>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("u01<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("u01<float>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3", 1.62630325872825665101e-19L); +insert("u01<float>(mini32 + int32_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=3", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L); +insert("uneg11<double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L); +insert("u01<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L); +insert("u01<float>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000217L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=3", -0.999999999999999999621L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000163L); +insert("u01<float>(maxu32 - uint32_t(a)) a=3", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L); +insert("u01<float>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999783L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999837L); +insert("u01<float>(maxi32 - int32_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=3", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L); +insert("u01<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L); +insert("u01<float>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999810L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=3", 0.999999999999999999621L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999837L); +insert("u01<float>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=4", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("u01<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("u01<float>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=4", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=4", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=4", 2.71050543121376108502e-19L); +insert("u01<float>(mini32 + int32_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=4", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=4", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L); +insert("uneg11<double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L); +insert("u01<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L); +insert("u01<float>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=4", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=4", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000217L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=4", -0.999999999999999999512L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000271L); +insert("u01<float>(maxu32 - uint32_t(a)) a=4", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=4", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L); +insert("u01<float>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=4", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999783L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999729L); +insert("u01<float>(maxi32 - int32_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=4", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=4", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L); +insert("u01<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L); +insert("u01<float>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=4", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=4", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999756L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=4", 0.999999999999999999512L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999729L); +insert("u01<float>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("u01<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("u01<float>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5", 2.71050543121376108502e-19L); +insert("u01<float>(mini32 + int32_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=5", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L); +insert("uneg11<double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L); +insert("u01<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L); +insert("u01<float>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000325L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=5", -0.999999999999999999404L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000271L); +insert("u01<float>(maxu32 - uint32_t(a)) a=5", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L); +insert("u01<float>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999675L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999729L); +insert("u01<float>(maxi32 - int32_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=5", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L); +insert("u01<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L); +insert("u01<float>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999702L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=5", 0.999999999999999999404L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999729L); +insert("u01<float>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=63", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=63", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=63", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=63", 3.41523684332933896712e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=63", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=63", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L); +insert("uneg11<double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L); +insert("u01<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L); +insert("u01<float>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=63", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=63", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003469L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=63", -0.999999999999999993115L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003415L); +insert("u01<float>(maxu32 - uint32_t(a)) a=63", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=63", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L); +insert("u01<float>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=63", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996531L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996585L); +insert("u01<float>(maxi32 - int32_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=63", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=63", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L); +insert("u01<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L); +insert("u01<float>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=63", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=63", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996558L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=63", 0.999999999999999993115L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996585L); +insert("u01<float>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=64", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=64", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=64", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=64", 3.52365706057788941052e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=64", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=64", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L); +insert("uneg11<double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L); +insert("u01<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L); +insert("u01<float>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=64", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=64", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003469L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=64", -0.999999999999999993007L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003524L); +insert("u01<float>(maxu32 - uint32_t(a)) a=64", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=64", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L); +insert("u01<float>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=64", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996531L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996476L); +insert("u01<float>(maxi32 - int32_t(a)) a=64", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=64", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=64", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L); +insert("u01<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L); +insert("u01<float>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=64", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=64", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996503L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=64", 0.999999999999999993007L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996476L); +insert("u01<float>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=65", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=65", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=65", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=65", 3.52365706057788941052e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=65", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=65", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L); +insert("uneg11<double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L); +insert("u01<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L); +insert("u01<float>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=65", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=65", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003578L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=65", -0.999999999999999992898L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003524L); +insert("u01<float>(maxu32 - uint32_t(a)) a=65", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=65", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L); +insert("u01<float>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=65", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996422L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996476L); +insert("u01<float>(maxi32 - int32_t(a)) a=65", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=65", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=65", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L); +insert("u01<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L); +insert("u01<float>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=65", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=65", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996449L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=65", 0.999999999999999992898L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996476L); +insert("u01<float>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=127", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=127", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=127", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=127", 6.88468379528295315595e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=127", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=127", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L); +insert("uneg11<double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L); +insert("u01<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L); +insert("u01<float>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=127", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=127", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006939L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=127", -0.999999999999999986176L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006885L); +insert("u01<float>(maxu32 - uint32_t(a)) a=127", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=127", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L); +insert("u01<float>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=127", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993061L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993115L); +insert("u01<float>(maxi32 - int32_t(a)) a=127", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=127", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=127", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L); +insert("u01<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L); +insert("u01<float>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=127", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=127", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993088L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=127", 0.999999999999999986176L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993115L); +insert("u01<float>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=128", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=128", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=128", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=128", 6.99310401253150359935e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=128", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=128", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L); +insert("uneg11<double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L); +insert("u01<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L); +insert("u01<float>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=128", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=128", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006939L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=128", -0.999999999999999986068L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006993L); +insert("u01<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L); +insert("u01<float>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=128", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993061L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993007L); +insert("u01<float>(maxi32 - int32_t(a)) a=128", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=128", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=128", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L); +insert("u01<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L); +insert("u01<float>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=128", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=128", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993034L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=128", 0.999999999999999986068L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993007L); +insert("u01<float>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=129", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=129", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=129", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=129", 6.99310401253150359935e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=129", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L); +insert("uneg11<double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L); +insert("u01<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L); +insert("u01<float>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=129", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=129", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000007047L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=129", -0.999999999999999985960L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000006993L); +insert("u01<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L); +insert("u01<float>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=129", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999992953L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999993007L); +insert("u01<float>(maxi32 - int32_t(a)) a=129", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=129", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=129", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L); +insert("u01<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L); +insert("u01<float>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=129", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=129", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999992980L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=129", 0.999999999999999985960L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999993007L); +insert("u01<float>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=191", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=191", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=191", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=191", 1.03541307472365673448e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=191", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L); +insert("uneg11<double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L); +insert("u01<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L); +insert("u01<float>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=191", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=191", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010408L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=191", -0.999999999999999979238L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010354L); +insert("u01<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L); +insert("u01<float>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=191", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989592L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989646L); +insert("u01<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=191", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L); +insert("u01<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L); +insert("u01<float>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=191", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=191", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989619L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=191", 0.999999999999999979238L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989646L); +insert("u01<float>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=192", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=192", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=192", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=192", 1.04625509644851177882e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=192", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L); +insert("uneg11<double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L); +insert("u01<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L); +insert("u01<float>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=192", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=192", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010408L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=192", -0.999999999999999979129L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010463L); +insert("u01<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L); +insert("u01<float>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=192", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989592L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989537L); +insert("u01<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=192", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L); +insert("u01<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L); +insert("u01<float>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=192", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=192", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989565L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=192", 0.999999999999999979129L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989537L); +insert("u01<float>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=193", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=193", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=193", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=193", 1.04625509644851177882e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=193", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L); +insert("uneg11<double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L); +insert("u01<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L); +insert("u01<float>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=193", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=193", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010517L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=193", -0.999999999999999979021L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010463L); +insert("u01<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L); +insert("u01<float>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=193", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989483L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989537L); +insert("u01<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=193", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L); +insert("u01<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L); +insert("u01<float>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=193", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=193", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989510L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=193", 0.999999999999999979021L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989537L); +insert("u01<float>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=255", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=255", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=255", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=255", 1.38235776991901815336e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=255", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L); +insert("uneg11<double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L); +insert("u01<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L); +insert("u01<float>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=255", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=255", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013878L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=255", -0.999999999999999972299L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013824L); +insert("u01<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L); +insert("u01<float>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=255", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986122L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986176L); +insert("u01<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=255", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L); +insert("u01<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L); +insert("u01<float>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=255", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=255", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986149L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=255", 0.999999999999999972299L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986176L); +insert("u01<float>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=256", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=256", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=256", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=256", 1.39319979164387319770e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=256", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L); +insert("uneg11<double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L); +insert("u01<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L); +insert("u01<float>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=256", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=256", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013878L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=256", -0.999999999999999972190L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013932L); +insert("u01<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L); +insert("u01<float>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=256", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986122L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986068L); +insert("u01<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=256", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L); +insert("u01<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L); +insert("u01<float>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=256", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=256", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986095L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=256", 0.999999999999999972190L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986068L); +insert("u01<float>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=257", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=257", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=257", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=257", 1.39319979164387319770e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=257", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L); +insert("uneg11<double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L); +insert("u01<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L); +insert("u01<float>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=257", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=257", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013986L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=257", -0.999999999999999972082L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013932L); +insert("u01<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L); +insert("u01<float>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=257", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986014L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986068L); +insert("u01<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=257", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L); +insert("u01<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L); +insert("u01<float>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=257", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=257", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986041L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=257", 0.999999999999999972082L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986068L); +insert("u01<float>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=319", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=319", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=319", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=319", 1.72930246511437957224e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=319", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L); +insert("uneg11<double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L); +insert("u01<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L); +insert("u01<float>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=319", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=319", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017347L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=319", -0.999999999999999965360L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017293L); +insert("u01<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L); +insert("u01<float>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=319", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982653L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982707L); +insert("u01<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=319", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L); +insert("u01<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L); +insert("u01<float>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=319", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=319", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982680L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=319", 0.999999999999999965360L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982707L); +insert("u01<float>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=320", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=320", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=320", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=320", 1.74014448683923461658e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=320", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L); +insert("uneg11<double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L); +insert("u01<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L); +insert("u01<float>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=320", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=320", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017347L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=320", -0.999999999999999965251L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017401L); +insert("u01<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L); +insert("u01<float>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=320", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982653L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982599L); +insert("u01<float>(maxi32 - int32_t(a)) a=320", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=320", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=320", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L); +insert("u01<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L); +insert("u01<float>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=320", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=320", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982626L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=320", 0.999999999999999965251L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982599L); +insert("u01<float>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=321", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=321", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=321", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=321", 1.74014448683923461658e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=321", -0.999999821186065673828L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L); +insert("uneg11<double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L); +insert("u01<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L); +insert("u01<float>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=321", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=321", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017456L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=321", -0.999999999999999965143L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017401L); +insert("u01<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L); +insert("u01<float>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=321", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982544L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982599L); +insert("u01<float>(maxi32 - int32_t(a)) a=321", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=321", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=321", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L); +insert("u01<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L); +insert("u01<float>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=321", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=321", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982571L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=321", 0.999999999999999965143L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982599L); +insert("u01<float>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=382", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=382", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=382", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=382", 2.07624716030974099112e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=382", -0.999999821186065673828L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L); +insert("uneg11<double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L); +insert("u01<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L); +insert("u01<float>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=382", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=382", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020708L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=382", -0.999999999999999958529L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020762L); +insert("u01<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L); +insert("u01<float>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=382", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979292L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979238L); +insert("u01<float>(maxi32 - int32_t(a)) a=382", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=382", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=382", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L); +insert("u01<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L); +insert("u01<float>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=382", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=382", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979265L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=382", 0.999999999999999958529L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979238L); +insert("u01<float>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=383", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=383", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=383", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=383", 2.07624716030974099112e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=383", -0.999999821186065673828L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L); +insert("uneg11<double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L); +insert("u01<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L); +insert("u01<float>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=383", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=383", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020817L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=383", -0.999999999999999958421L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020762L); +insert("u01<float>(maxu32 - uint32_t(a)) a=383", 0.999999880790710449219L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=383", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L); +insert("u01<float>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=383", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979183L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979238L); +insert("u01<float>(maxi32 - int32_t(a)) a=383", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=383", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=383", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L); +insert("u01<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L); +insert("u01<float>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=383", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=383", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979210L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=383", 0.999999999999999958421L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979238L); +insert("u01<float>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=384", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=384", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=384", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=384", 2.08708918203459603546e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=384", 0.500000119209289550781L); +insert("uneg11<float>(mini32 + int32_t(a)) a=384", -0.999999821186065673828L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=384", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L); +insert("uneg11<double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L); +insert("u01<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L); +insert("u01<float>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=384", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=384", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020817L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=384", -0.999999999999999958312L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020871L); +insert("u01<float>(maxu32 - uint32_t(a)) a=384", 0.999999880790710449219L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=384", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L); +insert("u01<float>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=384", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979183L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979129L); +insert("u01<float>(maxi32 - int32_t(a)) a=384", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=384", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=384", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L); +insert("u01<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L); +insert("u01<float>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=384", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=384", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979156L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=384", 0.999999999999999958312L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979129L); +insert("u01<float>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=639", 1.78813934326171875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=639", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=639", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=639", 3.46402594109118666665e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=639", 0.500000119209289550781L); +insert("uneg11<float>(mini32 + int32_t(a)) a=639", -0.999999701976776123047L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=639", 0.500000178813934326172L); +insert("u01<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L); +insert("uneg11<double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L); +insert("u01<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L); +insert("u01<float>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=639", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=639", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=639", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=639", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034694L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=639", -0.999999999999999930665L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034640L); +insert("u01<float>(maxu32 - uint32_t(a)) a=639", 0.999999880790710449219L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=639", 0.999999821186065673828L); +insert("u01<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L); +insert("u01<float>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=639", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965306L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965360L); +insert("u01<float>(maxi32 - int32_t(a)) a=639", 0.499999850988388061523L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=639", 0.999999701976776123047L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=639", 0.499999821186065673828L); +insert("u01<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L); +insert("u01<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L); +insert("u01<float>(maxi64 - int64_t(a)) a=639", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=639", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=639", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=639", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965333L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=639", 0.999999999999999930665L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965360L); +insert("u01<float>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=640", 1.78813934326171875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=640", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=640", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=640", 3.47486796281604171099e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=640", 0.500000119209289550781L); +insert("uneg11<float>(mini32 + int32_t(a)) a=640", -0.999999701976776123047L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=640", 0.500000178813934326172L); +insert("u01<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L); +insert("uneg11<double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L); +insert("u01<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L); +insert("u01<float>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=640", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=640", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=640", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=640", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034694L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=640", -0.999999999999999930557L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034749L); +insert("u01<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L); +insert("u01<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L); +insert("u01<float>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=640", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965306L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965251L); +insert("u01<float>(maxi32 - int32_t(a)) a=640", 0.499999850988388061523L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=640", 0.999999701976776123047L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=640", 0.499999821186065673828L); +insert("u01<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L); +insert("u01<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L); +insert("u01<float>(maxi64 - int64_t(a)) a=640", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=640", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=640", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=640", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965278L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=640", 0.999999999999999930557L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965251L); +insert("u01<float>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=641", 1.78813934326171875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=641", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=641", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=641", 3.47486796281604171099e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L); +insert("uneg11<float>(mini32 + int32_t(a)) a=641", -0.999999701976776123047L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L); +insert("u01<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L); +insert("uneg11<double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L); +insert("u01<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L); +insert("u01<float>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=641", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=641", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=641", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=641", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034803L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=641", -0.999999999999999930448L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034749L); +insert("u01<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L); +insert("u01<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L); +insert("u01<float>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=641", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965197L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965251L); +insert("u01<float>(maxi32 - int32_t(a)) a=641", 0.499999850988388061523L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=641", 0.999999701976776123047L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=641", 0.499999821186065673828L); +insert("u01<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L); +insert("u01<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L); +insert("u01<float>(maxi64 - int64_t(a)) a=641", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=641", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=641", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=641", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965224L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=641", 0.999999999999999930448L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965251L); +insert("u01<float>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1023", 1.78813934326171875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1023", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1023", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1023", 5.54569411226335517995e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=1023", 0.500000238418579101562L); +insert("uneg11<float>(mini32 + int32_t(a)) a=1023", -0.999999523162841796875L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1023", 0.500000178813934326172L); +insert("u01<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L); +insert("uneg11<double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L); +insert("u01<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L); +insert("u01<float>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=1023", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1023", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=1023", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055511L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=1023", -0.999999999999999889032L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055457L); +insert("u01<float>(maxu32 - uint32_t(a)) a=1023", 0.999999761581420898438L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1023", 0.999999821186065673828L); +insert("u01<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L); +insert("u01<float>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1023", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944489L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944543L); +insert("u01<float>(maxi32 - int32_t(a)) a=1023", 0.499999761581420898438L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=1023", 0.999999523162841796875L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1023", 0.499999821186065673828L); +insert("u01<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L); +insert("u01<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L); +insert("u01<float>(maxi64 - int64_t(a)) a=1023", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=1023", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1023", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944516L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999889032L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944543L); +insert("u01<float>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1024", 2.98023223876953125000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1024", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1024", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1024", 5.55653613398821022429e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=1024", 0.500000238418579101562L); +insert("uneg11<float>(mini32 + int32_t(a)) a=1024", -0.999999523162841796875L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1024", 0.500000298023223876953L); +insert("u01<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L); +insert("uneg11<double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L); +insert("u01<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L); +insert("u01<float>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=1024", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1024", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055511L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888923L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055565L); +insert("u01<float>(maxu32 - uint32_t(a)) a=1024", 0.999999761581420898438L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1024", 0.999999701976776123047L); +insert("u01<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L); +insert("u01<float>(maxu64 - uint64_t(a)) a=1024", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1024", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944489L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944435L); +insert("u01<float>(maxi32 - int32_t(a)) a=1024", 0.499999761581420898438L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=1024", 0.999999523162841796875L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1024", 0.499999701976776123047L); +insert("u01<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L); +insert("u01<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L); +insert("u01<float>(maxi64 - int64_t(a)) a=1024", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=1024", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1024", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944462L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888923L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944435L); +insert("u01<float>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1025", 2.98023223876953125000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1025", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1025", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1025", 5.55653613398821022429e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=1025", 0.500000238418579101562L); +insert("uneg11<float>(mini32 + int32_t(a)) a=1025", -0.999999523162841796875L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1025", 0.500000298023223876953L); +insert("u01<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L); +insert("uneg11<double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L); +insert("u01<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L); +insert("u01<float>(mini64 + int64_t(a)) a=1025", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=1025", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1025", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L); +insert("uneg11<double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055620L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888815L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055565L); +insert("u01<float>(maxu32 - uint32_t(a)) a=1025", 0.999999761581420898438L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1025", 0.999999701976776123047L); +insert("u01<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L); +insert("u01<float>(maxu64 - uint64_t(a)) a=1025", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1025", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944380L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944435L); +insert("u01<float>(maxi32 - int32_t(a)) a=1025", 0.499999761581420898438L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=1025", 0.999999523162841796875L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1025", 0.499999701976776123047L); +insert("u01<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L); +insert("u01<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L); +insert("u01<float>(maxi64 - int64_t(a)) a=1025", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=1025", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1025", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944408L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888815L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944435L); +insert("u01<float>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3070", 6.55651092529296875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3070", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3070", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3070", 1.66479243585149205842e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=3070", 0.500000715255737304688L); +insert("uneg11<float>(mini32 + int32_t(a)) a=3070", -0.999998569488525390625L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3070", 0.500000655651092529297L); +insert("u01<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L); +insert("uneg11<double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L); +insert("u01<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L); +insert("u01<float>(mini64 + int64_t(a)) a=3070", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=3070", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3070", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L); +insert("uneg11<double>(mini64 + int64_t(a)) a=3070", -0.999999999999999666933L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166425L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=3070", -0.999999999999999667096L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166479L); +insert("u01<float>(maxu32 - uint32_t(a)) a=3070", 0.999999284744262695312L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3070", 0.999999344348907470703L); +insert("u01<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L); +insert("u01<float>(maxu64 - uint64_t(a)) a=3070", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3070", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833575L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833521L); +insert("u01<float>(maxi32 - int32_t(a)) a=3070", 0.499999284744262695312L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=3070", 0.999998569488525390625L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3070", 0.499999344348907470703L); +insert("u01<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L); +insert("u01<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L); +insert("u01<float>(maxi64 - int64_t(a)) a=3070", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=3070", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3070", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833467L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999666933L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833548L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999667096L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833521L); +insert("u01<float>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3071", 6.55651092529296875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3071", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3071", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3071", 1.66479243585149205842e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=3071", 0.500000715255737304688L); +insert("uneg11<float>(mini32 + int32_t(a)) a=3071", -0.999998569488525390625L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3071", 0.500000655651092529297L); +insert("u01<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L); +insert("uneg11<double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L); +insert("u01<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L); +insert("u01<float>(mini64 + int64_t(a)) a=3071", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=3071", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3071", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L); +insert("uneg11<double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666933L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166533L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666987L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166479L); +insert("u01<float>(maxu32 - uint32_t(a)) a=3071", 0.999999284744262695312L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3071", 0.999999344348907470703L); +insert("u01<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L); +insert("u01<float>(maxu64 - uint64_t(a)) a=3071", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3071", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999777955L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833467L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833521L); +insert("u01<float>(maxi32 - int32_t(a)) a=3071", 0.499999284744262695312L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=3071", 0.999998569488525390625L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3071", 0.499999344348907470703L); +insert("u01<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L); +insert("u01<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L); +insert("u01<float>(maxi64 - int64_t(a)) a=3071", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=3071", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3071", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833467L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666933L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833494L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666987L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833521L); +insert("u01<float>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3072", 7.74860382080078125000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3072", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3072", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3072", 1.66587663802397756285e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=3072", 0.500000715255737304688L); +insert("uneg11<float>(mini32 + int32_t(a)) a=3072", -0.999998569488525390625L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3072", 0.500000774860382080078L); +insert("u01<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L); +insert("uneg11<double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L); +insert("u01<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L); +insert("u01<float>(mini64 + int64_t(a)) a=3072", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=3072", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3072", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000222045L); +insert("uneg11<double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666933L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166533L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666879L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166588L); +insert("u01<float>(maxu32 - uint32_t(a)) a=3072", 0.999999284744262695312L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3072", 0.999999225139617919922L); +insert("u01<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L); +insert("u01<float>(maxu64 - uint64_t(a)) a=3072", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3072", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999777955L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833467L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833412L); +insert("u01<float>(maxi32 - int32_t(a)) a=3072", 0.499999284744262695312L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=3072", 0.999998569488525390625L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3072", 0.499999225139617919922L); +insert("u01<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L); +insert("u01<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L); +insert("u01<float>(maxi64 - int64_t(a)) a=3072", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=3072", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3072", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833467L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666933L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833439L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666879L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833412L); +insert("u01<float>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5119", 1.13248825073242187500e-06L); +insert("u01<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("u01<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("u01<float>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5119", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5119", 3.33066907387546962127e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5119", 2.77501546047664859884e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=5119", 0.500001192092895507812L); +insert("uneg11<float>(mini32 + int32_t(a)) a=5119", -0.999997615814208984375L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5119", 0.500001132488250732422L); +insert("u01<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L); +insert("uneg11<double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L); +insert("u01<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L); +insert("u01<float>(mini64 + int64_t(a)) a=5119", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=5119", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5119", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000222045L); +insert("uneg11<double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444888L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000333067L); +insert("u01<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277556L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444943L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277502L); +insert("u01<float>(maxu32 - uint32_t(a)) a=5119", 0.999998807907104492188L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5119", 0.999998867511749267578L); +insert("u01<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L); +insert("u01<float>(maxu64 - uint64_t(a)) a=5119", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5119", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999777955L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999666933L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722444L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722498L); +insert("u01<float>(maxi32 - int32_t(a)) a=5119", 0.499998807907104492188L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=5119", 0.999997615814208984375L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5119", 0.499998867511749267578L); +insert("u01<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L); +insert("u01<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L); +insert("u01<float>(maxi64 - int64_t(a)) a=5119", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=5119", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5119", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722444L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444888L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999666933L); +insert("u01<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722471L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444943L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722498L); +insert("u01<float>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5120", 1.25169754028320312500e-06L); +insert("u01<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("u01<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("u01<float>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5120", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5120", 3.33066907387546962127e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5120", 2.77609966264913410328e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=5120", 0.500001192092895507812L); +insert("uneg11<float>(mini32 + int32_t(a)) a=5120", -0.999997615814208984375L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5120", 0.500001251697540283203L); +insert("u01<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L); +insert("uneg11<double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L); +insert("u01<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L); +insert("u01<float>(mini64 + int64_t(a)) a=5120", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=5120", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5120", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000222045L); +insert("uneg11<double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444888L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000333067L); +insert("u01<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277556L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444834L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277610L); +insert("u01<float>(maxu32 - uint32_t(a)) a=5120", 0.999998807907104492188L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5120", 0.999998748302459716797L); +insert("u01<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L); +insert("u01<float>(maxu64 - uint64_t(a)) a=5120", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5120", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722444L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722390L); +insert("u01<float>(maxi32 - int32_t(a)) a=5120", 0.499998807907104492188L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=5120", 0.999997615814208984375L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5120", 0.499998748302459716797L); +insert("u01<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L); +insert("u01<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L); +insert("u01<float>(maxi64 - int64_t(a)) a=5120", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=5120", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5120", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722444L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444888L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999666933L); +insert("u01<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722417L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444834L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722390L); +insert("u01<float>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5121", 1.25169754028320312500e-06L); +insert("u01<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("u01<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("u01<float>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5121", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5121", 3.33066907387546962127e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5121", 2.77609966264913410328e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=5121", 0.500001192092895507812L); +insert("uneg11<float>(mini32 + int32_t(a)) a=5121", -0.999997615814208984375L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5121", 0.500001251697540283203L); +insert("u01<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L); +insert("uneg11<double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L); +insert("u01<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L); +insert("u01<float>(mini64 + int64_t(a)) a=5121", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=5121", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5121", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L); +insert("uneg11<double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444888L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L); +insert("u01<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277664L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444726L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277610L); +insert("u01<float>(maxu32 - uint32_t(a)) a=5121", 0.999998807907104492188L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5121", 0.999998748302459716797L); +insert("u01<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L); +insert("u01<float>(maxu64 - uint64_t(a)) a=5121", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5121", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722336L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722390L); +insert("u01<float>(maxi32 - int32_t(a)) a=5121", 0.499998807907104492188L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=5121", 0.999997615814208984375L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5121", 0.499998748302459716797L); +insert("u01<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L); +insert("u01<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L); +insert("u01<float>(maxi64 - int64_t(a)) a=5121", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=5121", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5121", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722444L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444888L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999666933L); +insert("u01<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722363L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444726L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722390L); +// ./ut_uniform_IEEEkat: SUCCESS diff --git a/tests/ut_uniform_kat_vectors.dat b/tests/ut_uniform_kat_vectors.dat @@ -0,0 +1,2604 @@ +/* This file was created by 'ut_uniform with-arg' on a reference + platform, and is #included in the recompilation of ut_uniform + on a target platform. When ut_uniform is run with no arguments + on the target platform, it asserts that the values computed + on the target platform match the reference values recorded here. + These reference values were computed on an x86_64 using 32-bit, + 64-bit and 80-bit IEEE arithmetic for float, double and long double + respectively. Other platforms with different representations of + floating point values will almost certainly fail these tests + even though their results might be perfectly valid. +*/ +insert("u01<float>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=0", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("u01<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L); +insert("u01<float>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=0", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=0", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L); +insert("u01<float>(mini32 + int32_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=0", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=0", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L); +insert("uneg11<double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L); +insert("u01<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L); +insert("u01<float>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=0", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=0", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=0", -0.999999999999999999946L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000054L); +insert("u01<float>(maxu32 - uint32_t(a)) a=0", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=0", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L); +insert("u01<float>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=0", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999999946L); +insert("u01<float>(maxi32 - int32_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=0", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=0", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L); +insert("u01<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L); +insert("u01<float>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=0", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=0", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999973L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=0", 0.999999999999999999946L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999946L); +insert("u01<float>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("u01<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L); +insert("u01<float>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1", 5.42101086242752217004e-20L); +insert("u01<float>(mini32 + int32_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=1", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L); +insert("uneg11<double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L); +insert("u01<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L); +insert("u01<float>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000108L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=1", -0.999999999999999999837L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000054L); +insert("u01<float>(maxu32 - uint32_t(a)) a=1", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L); +insert("u01<float>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999892L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999946L); +insert("u01<float>(maxi32 - int32_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=1", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L); +insert("u01<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L); +insert("u01<float>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999919L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=1", 0.999999999999999999837L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999946L); +insert("u01<float>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=2", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("u01<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L); +insert("u01<float>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=2", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=2", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=2", 1.62630325872825665101e-19L); +insert("u01<float>(mini32 + int32_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=2", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=2", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L); +insert("uneg11<double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L); +insert("u01<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L); +insert("u01<float>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=2", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=2", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000108L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=2", -0.999999999999999999729L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000163L); +insert("u01<float>(maxu32 - uint32_t(a)) a=2", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=2", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L); +insert("u01<float>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=2", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999892L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999837L); +insert("u01<float>(maxi32 - int32_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=2", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=2", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L); +insert("u01<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L); +insert("u01<float>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=2", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=2", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999864L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=2", 0.999999999999999999729L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999837L); +insert("u01<float>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("u01<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L); +insert("u01<float>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3", 1.62630325872825665101e-19L); +insert("u01<float>(mini32 + int32_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=3", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L); +insert("uneg11<double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L); +insert("u01<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L); +insert("u01<float>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000217L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=3", -0.999999999999999999621L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000163L); +insert("u01<float>(maxu32 - uint32_t(a)) a=3", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L); +insert("u01<float>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999783L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999837L); +insert("u01<float>(maxi32 - int32_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=3", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L); +insert("u01<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L); +insert("u01<float>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999810L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=3", 0.999999999999999999621L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999837L); +insert("u01<float>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=4", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("u01<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L); +insert("u01<float>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=4", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=4", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=4", 2.71050543121376108502e-19L); +insert("u01<float>(mini32 + int32_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=4", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=4", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L); +insert("uneg11<double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L); +insert("u01<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L); +insert("u01<float>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=4", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=4", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000217L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=4", -0.999999999999999999512L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000271L); +insert("u01<float>(maxu32 - uint32_t(a)) a=4", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=4", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L); +insert("u01<float>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=4", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999783L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999729L); +insert("u01<float>(maxi32 - int32_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=4", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=4", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L); +insert("u01<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L); +insert("u01<float>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=4", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=4", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999756L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=4", 0.999999999999999999512L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999729L); +insert("u01<float>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("u01<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L); +insert("u01<float>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5", 2.71050543121376108502e-19L); +insert("u01<float>(mini32 + int32_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=5", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L); +insert("uneg11<double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L); +insert("u01<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L); +insert("u01<float>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000325L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=5", -0.999999999999999999404L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000271L); +insert("u01<float>(maxu32 - uint32_t(a)) a=5", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L); +insert("u01<float>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999675L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999729L); +insert("u01<float>(maxi32 - int32_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=5", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L); +insert("u01<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L); +insert("u01<float>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999702L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=5", 0.999999999999999999404L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999729L); +insert("u01<float>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=63", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=63", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=63", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=63", 3.41523684332933896712e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=63", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=63", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L); +insert("uneg11<double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L); +insert("u01<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L); +insert("u01<float>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=63", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=63", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003469L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=63", -0.999999999999999993115L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003415L); +insert("u01<float>(maxu32 - uint32_t(a)) a=63", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=63", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L); +insert("u01<float>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=63", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996531L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996585L); +insert("u01<float>(maxi32 - int32_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=63", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=63", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L); +insert("u01<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L); +insert("u01<float>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=63", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=63", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996558L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=63", 0.999999999999999993115L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996585L); +insert("u01<float>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=64", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=64", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=64", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=64", 3.52365706057788941052e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=64", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=64", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L); +insert("uneg11<double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L); +insert("u01<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L); +insert("u01<float>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=64", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=64", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003469L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=64", -0.999999999999999993007L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003524L); +insert("u01<float>(maxu32 - uint32_t(a)) a=64", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=64", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L); +insert("u01<float>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=64", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996531L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996476L); +insert("u01<float>(maxi32 - int32_t(a)) a=64", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=64", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=64", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L); +insert("u01<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L); +insert("u01<float>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=64", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=64", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996503L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=64", 0.999999999999999993007L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996476L); +insert("u01<float>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=65", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=65", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=65", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=65", 3.52365706057788941052e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=65", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=65", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L); +insert("uneg11<double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L); +insert("u01<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L); +insert("u01<float>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=65", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=65", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003578L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=65", -0.999999999999999992898L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003524L); +insert("u01<float>(maxu32 - uint32_t(a)) a=65", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=65", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L); +insert("u01<float>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=65", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996422L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996476L); +insert("u01<float>(maxi32 - int32_t(a)) a=65", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=65", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=65", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L); +insert("u01<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L); +insert("u01<float>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=65", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=65", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996449L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=65", 0.999999999999999992898L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996476L); +insert("u01<float>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=127", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=127", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=127", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=127", 6.88468379528295315595e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=127", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=127", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L); +insert("uneg11<double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L); +insert("u01<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L); +insert("u01<float>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=127", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=127", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006939L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=127", -0.999999999999999986176L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006885L); +insert("u01<float>(maxu32 - uint32_t(a)) a=127", 1.00000000000000000000L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=127", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L); +insert("u01<float>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=127", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993061L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993115L); +insert("u01<float>(maxi32 - int32_t(a)) a=127", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=127", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=127", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L); +insert("u01<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L); +insert("u01<float>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=127", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=127", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993088L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=127", 0.999999999999999986176L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993115L); +insert("u01<float>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=128", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=128", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=128", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=128", 6.99310401253150359935e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<float>(mini32 + int32_t(a)) a=128", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=128", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L); +insert("uneg11<double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L); +insert("u01<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L); +insert("u01<float>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=128", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=128", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006939L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=128", -0.999999999999999986068L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006993L); +insert("u01<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L); +insert("u01<float>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=128", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993061L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993007L); +insert("u01<float>(maxi32 - int32_t(a)) a=128", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=128", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=128", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L); +insert("u01<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L); +insert("u01<float>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=128", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=128", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993034L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=128", 0.999999999999999986068L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993007L); +insert("u01<float>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=129", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=129", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=129", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=129", 6.99310401253150359935e-18L); +insert("u01<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=129", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L); +insert("uneg11<double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L); +insert("u01<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L); +insert("u01<float>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=129", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=129", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000007047L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=129", -0.999999999999999985960L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000006993L); +insert("u01<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L); +insert("u01<float>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=129", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999992953L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999993007L); +insert("u01<float>(maxi32 - int32_t(a)) a=129", 0.499999970197677612305L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=129", 0.999999940395355224609L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=129", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L); +insert("u01<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L); +insert("u01<float>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=129", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=129", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999992980L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=129", 0.999999999999999985960L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999993007L); +insert("u01<float>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=191", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=191", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=191", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=191", 1.03541307472365673448e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=191", -0.999999940395355224609L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L); +insert("uneg11<double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L); +insert("u01<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L); +insert("u01<float>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=191", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=191", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010408L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=191", -0.999999999999999979238L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010354L); +insert("u01<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L); +insert("u01<float>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=191", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989592L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989646L); +insert("u01<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=191", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L); +insert("u01<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L); +insert("u01<float>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=191", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=191", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989619L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=191", 0.999999999999999979238L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989646L); +insert("u01<float>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=192", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=192", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=192", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=192", 1.04625509644851177882e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=192", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L); +insert("uneg11<double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L); +insert("u01<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L); +insert("u01<float>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=192", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=192", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010408L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=192", -0.999999999999999979129L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010463L); +insert("u01<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L); +insert("u01<float>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=192", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989592L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989537L); +insert("u01<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=192", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L); +insert("u01<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L); +insert("u01<float>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=192", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=192", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989565L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=192", 0.999999999999999979129L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989537L); +insert("u01<float>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=193", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=193", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=193", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=193", 1.04625509644851177882e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=193", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L); +insert("uneg11<double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L); +insert("u01<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L); +insert("u01<float>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=193", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=193", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010517L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=193", -0.999999999999999979021L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010463L); +insert("u01<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L); +insert("u01<float>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=193", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989483L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989537L); +insert("u01<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=193", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L); +insert("u01<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L); +insert("u01<float>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=193", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=193", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989510L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=193", 0.999999999999999979021L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989537L); +insert("u01<float>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=255", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=255", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=255", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=255", 1.38235776991901815336e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=255", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L); +insert("uneg11<double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L); +insert("u01<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L); +insert("u01<float>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=255", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=255", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013878L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=255", -0.999999999999999972299L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013824L); +insert("u01<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L); +insert("u01<float>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=255", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986122L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986176L); +insert("u01<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=255", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L); +insert("u01<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L); +insert("u01<float>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=255", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=255", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986149L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=255", 0.999999999999999972299L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986176L); +insert("u01<float>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=256", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=256", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=256", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=256", 1.39319979164387319770e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=256", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L); +insert("uneg11<double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L); +insert("u01<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L); +insert("u01<float>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=256", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=256", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013878L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=256", -0.999999999999999972190L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013932L); +insert("u01<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L); +insert("u01<float>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=256", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986122L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986068L); +insert("u01<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=256", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L); +insert("u01<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L); +insert("u01<float>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=256", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=256", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986095L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=256", 0.999999999999999972190L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986068L); +insert("u01<float>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=257", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=257", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=257", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=257", 1.39319979164387319770e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=257", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L); +insert("uneg11<double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L); +insert("u01<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L); +insert("u01<float>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=257", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=257", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013986L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=257", -0.999999999999999972082L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013932L); +insert("u01<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L); +insert("u01<float>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=257", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986014L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986068L); +insert("u01<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=257", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L); +insert("u01<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L); +insert("u01<float>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=257", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=257", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986041L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=257", 0.999999999999999972082L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986068L); +insert("u01<float>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=319", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=319", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=319", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=319", 1.72930246511437957224e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=319", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L); +insert("uneg11<double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L); +insert("u01<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L); +insert("u01<float>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=319", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=319", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017347L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=319", -0.999999999999999965360L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017293L); +insert("u01<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L); +insert("u01<float>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=319", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982653L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982707L); +insert("u01<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=319", 0.999999880790710449219L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L); +insert("u01<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L); +insert("u01<float>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=319", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=319", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982680L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=319", 0.999999999999999965360L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982707L); +insert("u01<float>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=320", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=320", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=320", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=320", 1.74014448683923461658e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=320", -0.999999880790710449219L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L); +insert("uneg11<double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L); +insert("u01<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L); +insert("u01<float>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=320", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=320", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017347L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=320", -0.999999999999999965251L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017401L); +insert("u01<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L); +insert("u01<float>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=320", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982653L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982599L); +insert("u01<float>(maxi32 - int32_t(a)) a=320", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=320", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=320", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L); +insert("u01<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L); +insert("u01<float>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=320", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=320", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982626L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=320", 0.999999999999999965251L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982599L); +insert("u01<float>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=321", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=321", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=321", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=321", 1.74014448683923461658e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=321", -0.999999821186065673828L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L); +insert("uneg11<double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L); +insert("u01<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L); +insert("u01<float>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=321", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=321", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017456L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=321", -0.999999999999999965143L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017401L); +insert("u01<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L); +insert("u01<float>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=321", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982544L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982599L); +insert("u01<float>(maxi32 - int32_t(a)) a=321", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=321", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=321", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L); +insert("u01<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L); +insert("u01<float>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=321", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=321", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982571L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=321", 0.999999999999999965143L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982599L); +insert("u01<float>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=382", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=382", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=382", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=382", 2.07624716030974099112e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=382", -0.999999821186065673828L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L); +insert("uneg11<double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L); +insert("u01<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L); +insert("u01<float>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=382", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=382", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020708L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=382", -0.999999999999999958529L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020762L); +insert("u01<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L); +insert("u01<float>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=382", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979292L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979238L); +insert("u01<float>(maxi32 - int32_t(a)) a=382", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=382", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=382", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L); +insert("u01<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L); +insert("u01<float>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=382", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=382", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979265L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=382", 0.999999999999999958529L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979238L); +insert("u01<float>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=383", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=383", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=383", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=383", 2.07624716030974099112e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L); +insert("uneg11<float>(mini32 + int32_t(a)) a=383", -0.999999821186065673828L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L); +insert("uneg11<double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L); +insert("u01<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L); +insert("u01<float>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=383", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=383", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020817L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=383", -0.999999999999999958421L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020762L); +insert("u01<float>(maxu32 - uint32_t(a)) a=383", 0.999999880790710449219L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=383", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L); +insert("u01<float>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=383", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979183L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979238L); +insert("u01<float>(maxi32 - int32_t(a)) a=383", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=383", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=383", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L); +insert("u01<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L); +insert("u01<float>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=383", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=383", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979210L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=383", 0.999999999999999958421L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979238L); +insert("u01<float>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=384", 5.96046447753906250000e-08L); +insert("u01<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("u01<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L); +insert("u01<float>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=384", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=384", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=384", 2.08708918203459603546e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=384", 0.500000119209289550781L); +insert("uneg11<float>(mini32 + int32_t(a)) a=384", -0.999999821186065673828L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=384", 0.500000059604644775391L); +insert("u01<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L); +insert("uneg11<double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L); +insert("u01<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L); +insert("u01<float>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=384", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=384", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020817L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=384", -0.999999999999999958312L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020871L); +insert("u01<float>(maxu32 - uint32_t(a)) a=384", 0.999999880790710449219L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=384", 0.999999940395355224609L); +insert("u01<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L); +insert("u01<float>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=384", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979183L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979129L); +insert("u01<float>(maxi32 - int32_t(a)) a=384", 0.499999910593032836914L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=384", 0.999999821186065673828L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=384", 0.499999940395355224609L); +insert("u01<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L); +insert("u01<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L); +insert("u01<float>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=384", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=384", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979156L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=384", 0.999999999999999958312L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979129L); +insert("u01<float>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=639", 1.78813934326171875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=639", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=639", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=639", 3.46402594109118666665e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=639", 0.500000119209289550781L); +insert("uneg11<float>(mini32 + int32_t(a)) a=639", -0.999999701976776123047L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=639", 0.500000178813934326172L); +insert("u01<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L); +insert("uneg11<double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L); +insert("u01<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L); +insert("u01<float>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=639", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=639", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=639", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=639", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034694L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=639", -0.999999999999999930665L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034640L); +insert("u01<float>(maxu32 - uint32_t(a)) a=639", 0.999999880790710449219L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=639", 0.999999821186065673828L); +insert("u01<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L); +insert("u01<float>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=639", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965306L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965360L); +insert("u01<float>(maxi32 - int32_t(a)) a=639", 0.499999850988388061523L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=639", 0.999999701976776123047L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=639", 0.499999821186065673828L); +insert("u01<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L); +insert("u01<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L); +insert("u01<float>(maxi64 - int64_t(a)) a=639", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=639", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=639", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=639", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965333L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=639", 0.999999999999999930665L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965360L); +insert("u01<float>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=640", 1.78813934326171875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=640", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=640", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=640", 3.47486796281604171099e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=640", 0.500000119209289550781L); +insert("uneg11<float>(mini32 + int32_t(a)) a=640", -0.999999701976776123047L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=640", 0.500000178813934326172L); +insert("u01<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L); +insert("uneg11<double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L); +insert("u01<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L); +insert("u01<float>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=640", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=640", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=640", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=640", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034694L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=640", -0.999999999999999930557L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034749L); +insert("u01<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L); +insert("u01<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L); +insert("u01<float>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=640", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965306L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965251L); +insert("u01<float>(maxi32 - int32_t(a)) a=640", 0.499999850988388061523L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=640", 0.999999701976776123047L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=640", 0.499999821186065673828L); +insert("u01<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L); +insert("u01<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L); +insert("u01<float>(maxi64 - int64_t(a)) a=640", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=640", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=640", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=640", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965278L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=640", 0.999999999999999930557L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965251L); +insert("u01<float>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=641", 1.78813934326171875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=641", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=641", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=641", 3.47486796281604171099e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L); +insert("uneg11<float>(mini32 + int32_t(a)) a=641", -0.999999701976776123047L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L); +insert("u01<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L); +insert("uneg11<double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L); +insert("u01<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L); +insert("u01<float>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=641", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=641", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=641", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=641", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034803L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=641", -0.999999999999999930448L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034749L); +insert("u01<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L); +insert("u01<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L); +insert("u01<float>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=641", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965197L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965251L); +insert("u01<float>(maxi32 - int32_t(a)) a=641", 0.499999850988388061523L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=641", 0.999999701976776123047L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=641", 0.499999821186065673828L); +insert("u01<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L); +insert("u01<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L); +insert("u01<float>(maxi64 - int64_t(a)) a=641", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=641", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=641", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=641", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965224L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=641", 0.999999999999999930448L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965251L); +insert("u01<float>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1023", 1.78813934326171875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1023", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1023", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1023", 5.54569411226335517995e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=1023", 0.500000238418579101562L); +insert("uneg11<float>(mini32 + int32_t(a)) a=1023", -0.999999523162841796875L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1023", 0.500000178813934326172L); +insert("u01<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L); +insert("uneg11<double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L); +insert("u01<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L); +insert("u01<float>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=1023", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1023", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=1023", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055511L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=1023", -0.999999999999999889032L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055457L); +insert("u01<float>(maxu32 - uint32_t(a)) a=1023", 0.999999761581420898438L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1023", 0.999999821186065673828L); +insert("u01<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L); +insert("u01<float>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1023", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944489L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944543L); +insert("u01<float>(maxi32 - int32_t(a)) a=1023", 0.499999761581420898438L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=1023", 0.999999523162841796875L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1023", 0.499999821186065673828L); +insert("u01<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L); +insert("u01<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L); +insert("u01<float>(maxi64 - int64_t(a)) a=1023", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=1023", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1023", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944516L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999889032L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944543L); +insert("u01<float>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1024", 2.98023223876953125000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1024", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1024", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1024", 5.55653613398821022429e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=1024", 0.500000238418579101562L); +insert("uneg11<float>(mini32 + int32_t(a)) a=1024", -0.999999523162841796875L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1024", 0.500000298023223876953L); +insert("u01<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L); +insert("uneg11<double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L); +insert("u01<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L); +insert("u01<float>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=1024", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1024", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L); +insert("uneg11<double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055511L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888923L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055565L); +insert("u01<float>(maxu32 - uint32_t(a)) a=1024", 0.999999761581420898438L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1024", 0.999999701976776123047L); +insert("u01<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L); +insert("u01<float>(maxu64 - uint64_t(a)) a=1024", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1024", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944489L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944435L); +insert("u01<float>(maxi32 - int32_t(a)) a=1024", 0.499999761581420898438L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=1024", 0.999999523162841796875L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1024", 0.499999701976776123047L); +insert("u01<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L); +insert("u01<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L); +insert("u01<float>(maxi64 - int64_t(a)) a=1024", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=1024", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1024", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944462L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888923L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944435L); +insert("u01<float>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1025", 2.98023223876953125000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1025", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1025", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1025", 5.55653613398821022429e-17L); +insert("u01<float>(mini32 + int32_t(a)) a=1025", 0.500000238418579101562L); +insert("uneg11<float>(mini32 + int32_t(a)) a=1025", -0.999999523162841796875L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1025", 0.500000298023223876953L); +insert("u01<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L); +insert("uneg11<double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L); +insert("u01<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L); +insert("u01<float>(mini64 + int64_t(a)) a=1025", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=1025", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1025", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L); +insert("uneg11<double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888978L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055620L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888815L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055565L); +insert("u01<float>(maxu32 - uint32_t(a)) a=1025", 0.999999761581420898438L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1025", 0.999999701976776123047L); +insert("u01<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L); +insert("u01<float>(maxu64 - uint64_t(a)) a=1025", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1025", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944380L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944435L); +insert("u01<float>(maxi32 - int32_t(a)) a=1025", 0.499999761581420898438L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=1025", 0.999999523162841796875L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1025", 0.499999701976776123047L); +insert("u01<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L); +insert("u01<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L); +insert("u01<float>(maxi64 - int64_t(a)) a=1025", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=1025", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1025", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944489L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888978L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944408L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888815L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944435L); +insert("u01<float>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3070", 6.55651092529296875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3070", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3070", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3070", 1.66479243585149205842e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=3070", 0.500000715255737304688L); +insert("uneg11<float>(mini32 + int32_t(a)) a=3070", -0.999998569488525390625L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3070", 0.500000655651092529297L); +insert("u01<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L); +insert("uneg11<double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L); +insert("u01<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L); +insert("u01<float>(mini64 + int64_t(a)) a=3070", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=3070", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3070", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L); +insert("uneg11<double>(mini64 + int64_t(a)) a=3070", -0.999999999999999666933L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166425L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=3070", -0.999999999999999667096L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166479L); +insert("u01<float>(maxu32 - uint32_t(a)) a=3070", 0.999999284744262695312L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3070", 0.999999344348907470703L); +insert("u01<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L); +insert("u01<float>(maxu64 - uint64_t(a)) a=3070", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3070", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833575L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833521L); +insert("u01<float>(maxi32 - int32_t(a)) a=3070", 0.499999284744262695312L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=3070", 0.999998569488525390625L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3070", 0.499999344348907470703L); +insert("u01<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L); +insert("u01<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L); +insert("u01<float>(maxi64 - int64_t(a)) a=3070", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=3070", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3070", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833467L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999666933L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833548L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999667096L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833521L); +insert("u01<float>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3071", 6.55651092529296875000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3071", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3071", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3071", 1.66479243585149205842e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=3071", 0.500000715255737304688L); +insert("uneg11<float>(mini32 + int32_t(a)) a=3071", -0.999998569488525390625L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3071", 0.500000655651092529297L); +insert("u01<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L); +insert("uneg11<double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L); +insert("u01<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L); +insert("u01<float>(mini64 + int64_t(a)) a=3071", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=3071", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3071", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L); +insert("uneg11<double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666933L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166533L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666987L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166479L); +insert("u01<float>(maxu32 - uint32_t(a)) a=3071", 0.999999284744262695312L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3071", 0.999999344348907470703L); +insert("u01<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L); +insert("u01<float>(maxu64 - uint64_t(a)) a=3071", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3071", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999777955L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833467L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833521L); +insert("u01<float>(maxi32 - int32_t(a)) a=3071", 0.499999284744262695312L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=3071", 0.999998569488525390625L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3071", 0.499999344348907470703L); +insert("u01<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L); +insert("u01<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L); +insert("u01<float>(maxi64 - int64_t(a)) a=3071", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=3071", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3071", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833467L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666933L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833494L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666987L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833521L); +insert("u01<float>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3072", 7.74860382080078125000e-07L); +insert("u01<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("u01<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L); +insert("u01<float>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3072", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3072", 1.11022302462515654042e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3072", 1.66587663802397756285e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=3072", 0.500000715255737304688L); +insert("uneg11<float>(mini32 + int32_t(a)) a=3072", -0.999998569488525390625L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3072", 0.500000774860382080078L); +insert("u01<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L); +insert("uneg11<double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L); +insert("u01<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L); +insert("u01<float>(mini64 + int64_t(a)) a=3072", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=3072", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3072", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000222045L); +insert("uneg11<double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666933L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000111022L); +insert("u01<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166533L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666879L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166588L); +insert("u01<float>(maxu32 - uint32_t(a)) a=3072", 0.999999284744262695312L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3072", 0.999999225139617919922L); +insert("u01<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L); +insert("u01<float>(maxu64 - uint64_t(a)) a=3072", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3072", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999777955L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999888978L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833467L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833412L); +insert("u01<float>(maxi32 - int32_t(a)) a=3072", 0.499999284744262695312L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=3072", 0.999998569488525390625L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3072", 0.499999225139617919922L); +insert("u01<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L); +insert("u01<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L); +insert("u01<float>(maxi64 - int64_t(a)) a=3072", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=3072", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3072", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833467L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666933L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999888978L); +insert("u01<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833439L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666879L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833412L); +insert("u01<float>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5119", 1.13248825073242187500e-06L); +insert("u01<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("u01<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L); +insert("u01<float>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5119", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5119", 3.33066907387546962127e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5119", 2.77501546047664859884e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=5119", 0.500001192092895507812L); +insert("uneg11<float>(mini32 + int32_t(a)) a=5119", -0.999997615814208984375L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5119", 0.500001132488250732422L); +insert("u01<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L); +insert("uneg11<double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L); +insert("u01<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L); +insert("u01<float>(mini64 + int64_t(a)) a=5119", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=5119", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5119", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000222045L); +insert("uneg11<double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444888L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000333067L); +insert("u01<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277556L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444943L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277502L); +insert("u01<float>(maxu32 - uint32_t(a)) a=5119", 0.999998807907104492188L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5119", 0.999998867511749267578L); +insert("u01<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L); +insert("u01<float>(maxu64 - uint64_t(a)) a=5119", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5119", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999777955L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999666933L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722444L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722498L); +insert("u01<float>(maxi32 - int32_t(a)) a=5119", 0.499998807907104492188L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=5119", 0.999997615814208984375L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5119", 0.499998867511749267578L); +insert("u01<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L); +insert("u01<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L); +insert("u01<float>(maxi64 - int64_t(a)) a=5119", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=5119", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5119", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722444L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444888L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999666933L); +insert("u01<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722471L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444943L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722498L); +insert("u01<float>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5120", 1.25169754028320312500e-06L); +insert("u01<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("u01<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L); +insert("u01<float>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5120", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5120", 3.33066907387546962127e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5120", 2.77609966264913410328e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=5120", 0.500001192092895507812L); +insert("uneg11<float>(mini32 + int32_t(a)) a=5120", -0.999997615814208984375L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5120", 0.500001251697540283203L); +insert("u01<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L); +insert("uneg11<double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L); +insert("u01<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L); +insert("u01<float>(mini64 + int64_t(a)) a=5120", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=5120", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5120", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000222045L); +insert("uneg11<double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444888L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000333067L); +insert("u01<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277556L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444834L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277610L); +insert("u01<float>(maxu32 - uint32_t(a)) a=5120", 0.999998807907104492188L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5120", 0.999998748302459716797L); +insert("u01<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L); +insert("u01<float>(maxu64 - uint64_t(a)) a=5120", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5120", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722444L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722390L); +insert("u01<float>(maxi32 - int32_t(a)) a=5120", 0.499998807907104492188L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=5120", 0.999997615814208984375L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5120", 0.499998748302459716797L); +insert("u01<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L); +insert("u01<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L); +insert("u01<float>(maxi64 - int64_t(a)) a=5120", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=5120", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5120", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722444L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444888L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999666933L); +insert("u01<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722417L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444834L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722390L); +insert("u01<float>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("uneg11<float>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L); +insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5121", 1.25169754028320312500e-06L); +insert("u01<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("uneg11<double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L); +insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("u01<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("uneg11<long double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L); +insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L); +insert("u01<float>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L); +insert("uneg11<float>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L); +insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5121", 5.96046447753906250000e-08L); +insert("u01<double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L); +insert("uneg11<double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L); +insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5121", 3.33066907387546962127e-16L); +insert("u01<long double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L); +insert("uneg11<long double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L); +insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5121", 2.77609966264913410328e-16L); +insert("u01<float>(mini32 + int32_t(a)) a=5121", 0.500001192092895507812L); +insert("uneg11<float>(mini32 + int32_t(a)) a=5121", -0.999997615814208984375L); +insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5121", 0.500001251697540283203L); +insert("u01<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L); +insert("uneg11<double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L); +insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L); +insert("u01<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L); +insert("uneg11<long double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L); +insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L); +insert("u01<float>(mini64 + int64_t(a)) a=5121", 0.500000000000000000000L); +insert("uneg11<float>(mini64 + int64_t(a)) a=5121", -1.00000000000000000000L); +insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5121", 0.500000059604644775391L); +insert("u01<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L); +insert("uneg11<double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444888L); +insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L); +insert("u01<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277664L); +insert("uneg11<long double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444726L); +insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277610L); +insert("u01<float>(maxu32 - uint32_t(a)) a=5121", 0.999998807907104492188L); +insert("uneg11<float>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L); +insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5121", 0.999998748302459716797L); +insert("u01<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L); +insert("uneg11<double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L); +insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L); +insert("u01<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L); +insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L); +insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L); +insert("u01<float>(maxu64 - uint64_t(a)) a=5121", 1.00000000000000000000L); +insert("uneg11<float>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L); +insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5121", 0.999999940395355224609L); +insert("u01<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L); +insert("uneg11<double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L); +insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L); +insert("u01<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722336L); +insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L); +insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722390L); +insert("u01<float>(maxi32 - int32_t(a)) a=5121", 0.499998807907104492188L); +insert("uneg11<float>(maxi32 - int32_t(a)) a=5121", 0.999997615814208984375L); +insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5121", 0.499998748302459716797L); +insert("u01<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L); +insert("uneg11<double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L); +insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L); +insert("u01<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L); +insert("uneg11<long double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L); +insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L); +insert("u01<float>(maxi64 - int64_t(a)) a=5121", 0.500000000000000000000L); +insert("uneg11<float>(maxi64 - int64_t(a)) a=5121", 1.00000000000000000000L); +insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5121", 0.499999940395355224609L); +insert("u01<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722444L); +insert("uneg11<double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444888L); +insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999666933L); +insert("u01<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722363L); +insert("uneg11<long double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444726L); +insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722390L); +// ./ut_uniform: SUCCESS diff --git a/tests/ut_uniform_reference.hpp b/tests/ut_uniform_reference.hpp @@ -0,0 +1,19 @@ +RefHist("u01 Threefry4x32 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314"); +RefHist("u01 Threefry4x32 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314"); +RefHist("u01 Threefry4x32 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314"); +RefHist("u01 Threefry4x64 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275"); +RefHist("u01 Threefry4x64 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275"); +RefHist("u01 Threefry4x64 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275"); +RefHist("uneg11 Threefry4x32 float", " 156 139 148 146 159 148 159 168 142 160 156 161 153 143 158 150 180 174 152 163 157 129 166 151 140 142"); +RefHist("uneg11 Threefry4x32 double", " 156 139 148 146 159 148 159 168 142 160 156 161 153 143 158 150 180 174 152 163 157 129 166 151 140 142"); +RefHist("uneg11 Threefry4x32 long double", " 156 139 148 146 159 148 159 168 142 160 156 161 153 143 158 150 180 174 152 163 157 129 166 151 140 142"); +RefHist("uneg11 Threefry4x64 float", " 159 141 148 184 162 142 155 137 173 187 153 140 135 164 144 146 149 151 171 152 148 137 179 146 145 152"); +RefHist("uneg11 Threefry4x64 double", " 159 141 148 184 162 142 155 137 173 187 153 140 135 164 144 146 149 151 171 152 148 137 179 146 145 152"); +RefHist("uneg11 Threefry4x64 long double", " 159 141 148 184 162 142 155 137 173 187 153 140 135 164 144 146 149 151 171 152 148 137 179 146 145 152"); +RefHist("u01fixedpt Threefry4x32 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314"); +RefHist("u01fixedpt Threefry4x32 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314"); +RefHist("u01fixedpt Threefry4x32 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314"); +RefHist("u01fixedpt Threefry4x64 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275"); +RefHist("u01fixedpt Threefry4x64 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275"); +RefHist("u01fixedpt Threefry4x64 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275"); +// ./ut_uniform: SUCCESS diff --git a/tests/util.h b/tests/util.h @@ -0,0 +1,221 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef UTIL_H__ +#define UTIL_H__ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <assert.h> +#include <math.h> +#include <Random123/features/compilerfeatures.h> + +extern const char *progname; +extern int debug; +extern int verbose; + +#if defined(_MSC_VER) +#define NOMINMAX /* tells Windows.h to NOT define min() & max() */ +#include <Windows.h> +R123_STATIC_INLINE double now(){ + LARGE_INTEGER f; // ticks per second + LARGE_INTEGER t; + QueryPerformanceFrequency(&f); + QueryPerformanceCounter(&t); // ticks since epoch + return ((double)t.QuadPart)/((double)f.QuadPart); +} +#else // _MSC_VER +#include <sys/time.h> +R123_STATIC_INLINE double now(){ + struct timeval tv; + gettimeofday(&tv, 0); + return 1.e-6*tv.tv_usec + tv.tv_sec; +} +#endif // _MSC_VER + +/* timer returns difference between current time and *d, also updates *d with current time. */ +R123_STATIC_INLINE double timer(double *d) { + double dold = *d; + *d = now(); + return *d - dold; +} + +/* strdup may or may not be in string.h, depending on the value + of the pp-symbol _XOPEN_SOURCE and other arcana. Just + do it ourselves. + Mnemonic: "ntcs" = "nul-terminated character string" */ +char *ntcsdup(const char *s){ + char *p = (char *)malloc(strlen(s)+1); + strcpy(p, s); + return p; +} + +/* MSVC doesn't know about strtoull. Strictly speaking, strtoull + isn't standardized in C++98, either, but that seems not to be a + problem so we blissfully ignore it and use strtoull (or its MSVC + equivalent, _strtoui64) in both C and C++. If strtoull in C++ + becomes a problem, we can adopt the prtu strategy (see below) and + write C++ versions of strtouNN, that use an istringstream + instead. */ +#ifdef _MSC_FULL_VER +#define strtoull _strtoui64 +#endif +uint32_t strtou32(const char *p, char **endp, int base){ + uint32_t ret; + errno = 0; + ret = strtoul(p, endp, base); + assert(errno==0); + return ret; +} +uint64_t strtou64(const char *p, char **endp, int base){ + uint64_t ret; + errno = 0; + ret = strtoull(p, endp, base); + assert(errno==0); + return ret; +} + +#if defined(__cplusplus) +/* Strict C++98 doesn't grok %llx or unsigned long long, and with + aggressive error-checking, e.g., g++ -pedantic -Wall, will refuse + to compile code like: + + fprintf(stderr, "%llx", (R123_ULONG_LONG)v); + + On the other hand, when compiling to a 32-bit target, the only + 64-bit type is long long, so we're out of luck if we can't use llx. + A portable, almost-standard way to do I/O on uint64_t values in C++ + is to use bona fide C++ I/O streams. We are still playing + fast-and-loose with standards because C++98 doesn't have <stdint.h> + and hence doesn't even guarantee that there's a uint64_t, much less + that the insertion operator<<(ostream&) works correctly with + whatever we've typedef'ed to uint64_t in + <features/compilerfeatures.h>. Hope for the best... */ +#include <iostream> +#include <limits> +template <typename T> +void prtu(T val){ + using namespace std; + cerr.width(std::numeric_limits<T>::digits/4); + char prevfill = cerr.fill('0'); + ios_base::fmtflags prevflags = cerr.setf(ios_base::hex, ios_base::basefield); + cerr << val; + cerr.flags(prevflags); + cerr.fill(prevfill); + assert(!cerr.bad()); +} +void prtu32(uint32_t v){ prtu(v); } +void prtu64(uint64_t v){ prtu(v); } + +#else /* __cplusplus */ +/* C should be easy. inttypes.h was standardized in 1999. But Microsoft + refuses to recognize the 12-year old standard, so: */ +#if defined(_MSC_FULL_VER) +#define PRIx32 "x" +#define PRIx64 "I64x" +#else /* _MSC_FULL_VER */ +#include <inttypes.h> +#endif /* _MSVC_FULL_VER */ +void prtu32(uint32_t v){ fprintf(stderr, "%08" PRIx32, v); } +void prtu64(uint64_t v){ fprintf(stderr, "%016" PRIx64, v); } + +#endif /* __cplusplus */ + +#define CHECKNOTEQUAL(x, y) do { if ((x) != (y)) ; else { \ + fprintf(stderr, "%s: %s line %d error %s == %s (%s)\n", progname, __FILE__, __LINE__, #x, #y, strerror(errno)); \ + exit(1); \ +} } while (0) +#define CHECKEQUAL(x, y) do { if ((x) == (y)) ; else { \ + fprintf(stderr, "%s: %s line %d error %s != %s (%s)\n", progname, __FILE__, __LINE__, #x, #y, strerror(errno)); \ + exit(1); \ +} } while (0) +#define CHECKZERO(x) CHECKEQUAL((x), 0) +#define CHECKNOTZERO(x) CHECKNOTEQUAL((x), 0) + +#define dprintf(x) do { if (debug < 1) ; else { printf x; fflush(stdout); } } while (0) + +#define ALLZEROS(x, K, N) \ +do { \ + int allzeros = 1; \ + unsigned xi, xj; \ + for (xi = 0; xi < (unsigned)(K); xi++) \ + for (xj = 0; xj < (unsigned)(N); xj++) \ + allzeros = allzeros & ((x)[xi].v[xj] == 0); \ + if (allzeros) fprintf(stderr, "%s: Unexpected, all %lu elements of %ux%u had all zeros!\n", progname, (unsigned long)K, (unsigned)N, 8/*CHAR_BITS*/*(unsigned)sizeof(x[0].v[0])); \ +} while(0) + +/* Read in N words of width W into ARR */ +#define SCANFARRAY(ARR, NAME, N, W) \ +do { \ + int xi, xj; \ + unsigned long long xv; \ + for (xi = 0; xi < (N); xi++) { \ + /* Avoid any cleverness with SCNx##W because Microsoft (as of Visual Studio 10.x) silently trashes the stack by pretending that %hhx is %x). */ \ + const char *xfmt = " %llx%n"; \ + ret = sscanf(cp, xfmt, &xv, &xj); \ + ARR.v[xi] = (uint##W##_t)xv; \ + if (debug > 1) printf("line %d: xfmt for W=%d is \"%s\", got ret=%d xj=%d, %s[%d]=%llx cp=%s", linenum, W, xfmt, ret, xj, #ARR, xi, (unsigned long long) ARR.v[xi], cp); \ + if (ret < 1) { \ + fprintf(stderr, "%s: ran out of words reading %s on line %d: " #NAME #N "x" #W " %2d %s", \ + progname, #ARR, linenum, rounds, line); \ + errs++; \ + return; \ + } \ + cp += xj; \ + } \ +} while(0) + +#define PRINTARRAY(ARR, fp) \ +do { \ + char ofmt[64]; \ + size_t xj; \ + /* use %lu and the cast (instead of z) for portability to Microsoft, sizeof(v[0]) should fit easily in an unsigned long. Avoid inttypes for the same reason. */ \ + sprintf(ofmt, " %%0%lullx", (unsigned long)sizeof(ARR.v[0])*2UL); \ + for (xj = 0; xj < sizeof(ARR.v)/sizeof(ARR.v[0]); xj++) { \ + fprintf(fp, ofmt, (unsigned long long) ARR.v[xj]); \ + } \ +} while(0) + +#define PRINTLINE(NAME, N, W, R, ictr, ukey, octr, fp) \ +do { \ + fprintf(fp, "%s %d ", #NAME #N "x" #W, R); \ + PRINTARRAY(ictr, fp); \ + putc(' ', fp); \ + PRINTARRAY(ukey, fp); \ + putc(' ', fp); \ + PRINTARRAY(octr, fp); \ + putc('\n', fp); \ + fflush(fp); \ +} while(0) + +#endif /* UTIL_H__ */ diff --git a/tests/util_cuda.h b/tests/util_cuda.h @@ -0,0 +1,135 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef UTIL_CUDA_H__ +#define UTIL_CUDA_H__ + +#include "util.h" + +#include <cuda.h> +#include <cuda_runtime_api.h> + +// utility macros to check return codes and complain/exit on failure +#define CHECKLAST(MSG) do { cudaError_t e = cudaGetLastError(); if (e != cudaSuccess) {fprintf(stderr, "%s:%d: CUDA Error: %s: %s\n", __FILE__, __LINE__, (MSG), cudaGetErrorString(e)); exit(1); }} while(0) +#define CHECKCALL(RET) do { cudaError_t e = (RET); if (e != cudaSuccess) { fprintf(stderr, "%s:%d: CUDA Error: %s\n", __FILE__, __LINE__, cudaGetErrorString(e)); exit(1); } } while(0) + +typedef struct cuda_info { + int devnum, cores, blocks_per_grid, threads_per_block; + double cycles; + struct cudaDeviceProp dev; +} CUDAInfo; + +// If devstr is none, chooses device with most cores. +static CUDAInfo *cuda_init(const char *devstr) +{ + CUDAInfo *tp; + int i, ndev, cores, devcores; + double cycles; + CHECKNOTZERO(tp = (CUDAInfo *) malloc(sizeof(CUDAInfo))); + CHECKCALL( cudaGetDeviceCount(&ndev) ); + devcores = 0; + if (devstr == NULL) + devstr = getenv("R123EXAMPLE_ENVCONF_CUDA_DEVICE"); + for (i = 0; i < ndev; i++) { + struct cudaDeviceProp cu; + CHECKCALL( cudaGetDeviceProperties (&cu, i) ); + // Number of cores is not available from a query, have to hardwire + // some knowledge here, from web articles about the various generations + // SM or SMX, might also find this info in + // CUDA SDK $CUDA_SAMPLES_DIR/common/inc/helper_cuda.h + // or https://github.com/NVIDIA/nvidia-docker/blob/master/tools/src/cuda/cuda.go + cores = cu.multiProcessorCount; + if (cu.major == 1 && cu.minor >= 0 && cu.minor <= 3) { + // 1.0 (G80, G92, aka GTX880, Tesla [CSD]870) to 1.3 (GT200, aka GTX280, Tesla [CS]10xx) have 8 cores per MP + cores *= 8; + } else if (cu.major == 2 && cu.minor == 0) { + // 2.0 (G100, aka GTX480, Tesla/Fermi [CSM]20[567]0, and GF110, aka GTX580, M2090) + cores *= 32; + } else if (cu.major == 2 && cu.minor == 1) { + // 2.1 (GF104, GF114, GF116 aka GTX [45][56]0) + cores *= 48; + } else if (cu.major == 3) { + // 3.0 (Kepler GK104 aka GTX 680), 3.2 (TK1), 3.5 (GK11x, GK20x), 3.7 (GK21x) + cores *= 192; + } else if (cu.major == 5) { + // 5.0 (Maxwell GM10x), 5.2 (GM20x), 5.3 (TX1) + cores *= 128; + } else if (cu.major == 6 && cu.minor == 0) { + // 6.0 (Pascal P100) + cores *= 64; + } else if (cu.major == 6) { + // 6.1 (Pascal 10xx, Titan Xp, P40), 6.2 (Drive PX2 and Tegra) + cores *= 128; + } else if (cu.major == 7) { + // 7.[025] (Volta and Turing RTX 20[678]0, Titan RTX, Quadro RTX) + cores *= 128; + } else { + int coremultguess = 384; + cores *= coremultguess; + fprintf(stderr, "WARNING: Unknown number of cores per MP for this device: assuming %d, so cpb calculation will be wrong and choice of blocks/grid might be suboptimal\n", coremultguess); + } + /* clockrate is in KHz */ + cycles = 1e3 * cu.clockRate * cores; + printf(" %d: maj %d min %d %s%s ( %d units @ %g MHz ECC=%d %d cores %g Gcycles/s)\n", + i, cu.major, cu.minor, cu.name, cu.integrated ? " integrated" : "", + cu.multiProcessorCount, cu.clockRate*1e-3, cu.ECCEnabled, cores, cycles*1e-9); + if (devstr && strstr(cu.name, devstr) == NULL) { + dprintf(("skipping device %s\n", cu.name)); + continue; + } + if (cores > devcores) { + devcores = cores; + tp->devnum = i; + tp->cores = cores; + tp->cycles = cycles; + tp->dev = cu; + } + } + if (devcores == 0) { + fprintf(stderr, "could not find specified device\n"); + exit(1); + } + tp->blocks_per_grid = tp->cores; /* seems like a good guess */ + tp->threads_per_block = tp->dev.warpSize * 2; + printf("Using CUDA device %d, %d cores, %g cycles, will try %d blocks/grid %d threads/block\n", + tp->devnum, tp->cores, tp->cycles, tp->blocks_per_grid, tp->threads_per_block); + CHECKCALL(cudaSetDevice(tp->devnum)); + dprintf(("cuda_init done\n")); + return tp; +} + +static void cuda_done(CUDAInfo *tp) +{ + dprintf(("cuda_done\n")); + free(tp); +} + +#endif /* UTIL_CUDA_H__ */ diff --git a/tests/util_demangle.hpp b/tests/util_demangle.hpp @@ -0,0 +1,75 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef demangle_dot_hpp_ +#include <string> + +// Every compiler has a demangling library *somewhere*. Unfortunately, they're +// all different... + +#ifdef __GNUC__ + // Clang defines __GNUC__, but clang3.1 with -stdlib=libc++ can't + // find a <cxxabi.h> even though it *can* find the symbols at link + // time. I suspect this is a bug/oversight in the installation + // process (which, in June 2012 is still pretty fluid for libc++), so + // it might be fixed in the future. On the other hand, the API in + // cxxabi.h is locked down pretty tightly, so writing out an explicit + // extern declaration is pretty safe, and avoids a rats nest of + // ifdefs. It is tempting to use clang's __has_include(<cxxabi.h>), + // but it feels like more #ifdefs with no obvious upside. + // + // #include <cxxabi.h> +extern "C"{ + char* + __cxa_demangle(const char* __mangled_name, char* __output_buffer, + size_t* __length, int* __status); +} +#endif +#include <typeinfo> + +template <typename T> +std::string demangle(const T& ignored){ +#ifdef __GNUC__ + int status; + char *realname = __cxa_demangle(typeid(ignored).name(), 0, 0, &status); + std::string ret; + if(status!=0 || realname==0) + ret = typeid(ignored).name(); + else + ret = realname; + free(realname); + return ret; +#else + return typeid(ignored).name(); +#endif +} + +#endif diff --git a/tests/util_expandtpl.h b/tests/util_expandtpl.h @@ -0,0 +1,72 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef TEST_TPL +#error "TEST_TPL not defined before including util_expandtpl.h" +#else +/* + * This is included by various files after defining TEST_TPL to + * expand TEST_TPL for each of the RNGs we want to test. + * TEST_TPL args are the name of the RNG, N, W, and R, + * N being the number of words, W being the wordsize in bits, + * and R being the number of rounds. + */ + +#if TRY_PHILOX2X32 +TEST_TPL(philox, 2, 32, 7) +TEST_TPL(philox, 2, 32, 10) +#endif +TEST_TPL(philox, 4, 32, 7) +TEST_TPL(philox, 4, 32, 10) +#if R123_USE_PHILOX_64BIT +TEST_TPL(philox, 2, 64, 6) +TEST_TPL(philox, 2, 64, 10) +TEST_TPL(philox, 4, 64, 7) +TEST_TPL(philox, 4, 64, 10) +#endif +#if R123_USE_64BIT +TEST_TPL(threefry, 2, 64, 13) +TEST_TPL(threefry, 2, 64, 20) +TEST_TPL(threefry, 4, 64, 12) +TEST_TPL(threefry, 4, 64, 20) +TEST_TPL(threefry, 4, 64, 72) +#endif +TEST_TPL(threefry, 4, 32, 12) +TEST_TPL(threefry, 4, 32, 20) + +#if R123_USE_AES_NI +TEST_TPL(ars, 4, 32, 5) +TEST_TPL(ars, 4, 32, 7) +TEST_TPL(aesni, 4, 32, 10) +#endif + +#undef TEST_TPL +#endif /* TEST_TPL */ diff --git a/tests/util_m128.h b/tests/util_m128.h @@ -0,0 +1,87 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef UTIL_M128_H__ +#define UTIL_M128_H__ +#include <Random123/features/sse.h> + +// The formatting in fips-197 seems to correspond to +// byte[15] [14] ... [0] +__m128i m128i_from_charbuf(const char *s){ + unsigned int bytes[16]; + sscanf(s, "%02x%02x%02x%02x" "%02x%02x%02x%02x" "%02x%02x%02x%02x" "%02x%02x%02x%02x", + &bytes[0], &bytes[1], &bytes[2], &bytes[3], + &bytes[4], &bytes[5], &bytes[6], &bytes[7], + &bytes[8], &bytes[9], &bytes[10], &bytes[11], + &bytes[12], &bytes[13], &bytes[14], &bytes[15]); + return _mm_set_epi8( + bytes[15], bytes[14], bytes[13], bytes[12], + bytes[11], bytes[10], bytes[9], bytes[8], + bytes[7], bytes[6], bytes[5], bytes[4], + bytes[3], bytes[2], bytes[1], bytes[0] + ); +} + +#define M128_STR_SIZE 34 /* minimum size of the charbuf "hex" argument */ + +char *m128i_to_charbuf(__m128i m, char *hex){ + union { + unsigned char bytes[16]; + __m128i m; + } u; + _mm_storeu_si128((__m128i*)&u.bytes[0], m); + sprintf(hex, "%02x%02x%02x%02x" "%02x%02x%02x%02x" + " " + "%02x%02x%02x%02x""%02x%02x%02x%02x", + u.bytes[0], u.bytes[1], u.bytes[2], u.bytes[3], + u.bytes[4], u.bytes[5], u.bytes[6], u.bytes[7], + u.bytes[8], u.bytes[9], u.bytes[10], u.bytes[11], + u.bytes[12], u.bytes[13], u.bytes[14], u.bytes[15]); + + return hex; +} + +#ifdef __cplusplus +#include <string> + +__m128i m128i_from_string(const std::string& s) { + return m128i_from_charbuf(s.c_str()); +} + +std::string m128i_to_string(__m128i m) { + char hex[M128_STR_SIZE]; + + m128i_to_charbuf(m, hex); + return std::string(hex); +} +#endif /* __cplusplus */ + +#endif /* UTIL_M128_H__ */ diff --git a/tests/util_metal.h b/tests/util_metal.h @@ -0,0 +1,113 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef UTIL_METAL_H__ +#define UTIL_METAL_H__ +/* + * has a couple of utility functions to setup and teardown Metal. + * Avoid much boilerplate in every Metal program + * + * Written by Tom Schoonjans <Tom.Schoonjans@me.com> + */ + +#import <Foundation/Foundation.h> +#import <Metal/Metal.h> + +#include "util.h" + +typedef struct umetal_info { + id<MTLDevice> device; + id<MTLCommandQueue> queue; + id<MTLLibrary> library; +} UMetalInfo; + +/* Miscellaneous checking macros for convenience */ +static char *print_metal_errstring(NSError *err) { + if (err == nil) + return nil; + return strdup(err.localizedDescription.UTF8String); +} + +#define CHECKERR(x) do { \ + (x); \ + if (err != nil) { \ + fprintf(stderr, "%s: error %s from %s\n", progname, print_metal_errstring(err), #x); \ + exit(1); \ + } \ +} while(0) + +//#define CHECK(x) CHECKERR(err = (x)) + +static UMetalInfo *metal_init(const char *devstr, const char *metallib) +{ + UMetalInfo *tp; + NSError *err = nil; + NSArray<id<MTLDevice>> *devices; + unsigned i; + unsigned long ndevices; + + /* get list of platforms */ + CHECKNOTZERO(devices = MTLCopyAllDevices()); + ndevices = (unsigned long) devices.count; + dprintf(("ndevices = %lu\n", ndevices)); + if (ndevices == 0) { + fprintf(stderr, "No Metal devices available\n"); + return NULL; + } + dprintf(("found %lu device%s\n", ndevices, ndevices == 1 ? "" : "s")); + CHECKNOTZERO(tp = (UMetalInfo *) malloc(sizeof(UMetalInfo))); + for (i = 0; i < devices.count; i++) { + dprintf(("device %d: %s\n", i, devices[i].name.UTF8String)); + } + + // get default device + tp->device = MTLCreateSystemDefaultDevice(); + + dprintf(("create Metal command queue for device %s\n", tp->device.name.UTF8String)); + CHECKNOTZERO(tp->queue = [tp->device newCommandQueue]); + dprintf(("create Metal library from %s\n", metallib)); + CHECKERR(tp->library = [tp->device newLibraryWithFile: [[NSString alloc] initWithUTF8String:metallib] error:&err]); + + return tp; +} + + +static void metal_done(UMetalInfo *tp) { + + dprintf(("metal_done\n")); + [tp->library release]; + [tp->queue release]; + [tp->device release]; + free(tp); +} + + +#endif /* UTIL_METAL_H__ */ diff --git a/tests/util_opencl.h b/tests/util_opencl.h @@ -0,0 +1,381 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef UTIL_OPENCL_H__ +#define UTIL_OPENCL_H__ +/* + * has a couple of utility functions to setup and teardown OpenCL. + * Avoid much boilerplate in every OpenCL program + */ + +#include "util.h" + +/* We use the old clCreateCommandQueue for max portability since we do not + * use any cmdq properties anyway, avoids a warning. + */ +#define CL_USE_DEPRECATED_OPENCL_1_2_APIS + +#if defined(__APPLE__) || defined(__MACOSX) +#include <OpenCL/cl.h> +#include <OpenCL/cl_ext.h> +#else +#include <CL/cl.h> +#include <CL/cl_ext.h> +#endif + +#define UCL_STRSIZE 128 + +typedef struct ucl_info { + cl_context ctx; + cl_program prog; + cl_device_id devid; + cl_command_queue cmdq; + cl_uint clkfreq, compunits; + size_t wgsize; + int cores; + double cycles; + char vendor[UCL_STRSIZE], devname[UCL_STRSIZE], + version[UCL_STRSIZE], driver[UCL_STRSIZE]; + int computeflags; + cl_device_fp_config fpdbl; + cl_device_type devtype; +} UCLInfo; + +/* Miscellaneous checking macros for convenience */ +static char *print_cl_errstring(cl_int err) { + switch (err) { + case CL_SUCCESS: return strdup("Success!"); + case CL_DEVICE_NOT_FOUND: return strdup("Device not found."); + case CL_DEVICE_NOT_AVAILABLE: return strdup("Device not available"); + case CL_COMPILER_NOT_AVAILABLE: return strdup("Compiler not available"); + case CL_MEM_OBJECT_ALLOCATION_FAILURE: return strdup("Memory object allocation failure"); + case CL_OUT_OF_RESOURCES: return strdup("Out of resources"); + case CL_OUT_OF_HOST_MEMORY: return strdup("Out of host memory"); + case CL_PROFILING_INFO_NOT_AVAILABLE: return strdup("Profiling information not available"); + case CL_MEM_COPY_OVERLAP: return strdup("Memory copy overlap"); + case CL_IMAGE_FORMAT_MISMATCH: return strdup("Image format mismatch"); + case CL_IMAGE_FORMAT_NOT_SUPPORTED: return strdup("Image format not supported"); + case CL_BUILD_PROGRAM_FAILURE: return strdup("Program build failure"); + case CL_MAP_FAILURE: return strdup("Map failure"); + case CL_INVALID_VALUE: return strdup("Invalid value"); + case CL_INVALID_DEVICE_TYPE: return strdup("Invalid device type"); + case CL_INVALID_PLATFORM: return strdup("Invalid platform"); + case CL_INVALID_DEVICE: return strdup("Invalid device"); + case CL_INVALID_CONTEXT: return strdup("Invalid context"); + case CL_INVALID_QUEUE_PROPERTIES: return strdup("Invalid queue properties"); + case CL_INVALID_COMMAND_QUEUE: return strdup("Invalid command queue"); + case CL_INVALID_HOST_PTR: return strdup("Invalid host pointer"); + case CL_INVALID_MEM_OBJECT: return strdup("Invalid memory object"); + case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: return strdup("Invalid image format descriptor"); + case CL_INVALID_IMAGE_SIZE: return strdup("Invalid image size"); + case CL_INVALID_SAMPLER: return strdup("Invalid sampler"); + case CL_INVALID_BINARY: return strdup("Invalid binary"); + case CL_INVALID_BUILD_OPTIONS: return strdup("Invalid build options"); + case CL_INVALID_PROGRAM: return strdup("Invalid program"); + case CL_INVALID_PROGRAM_EXECUTABLE: return strdup("Invalid program executable"); + case CL_INVALID_KERNEL_NAME: return strdup("Invalid kernel name"); + case CL_INVALID_KERNEL_DEFINITION: return strdup("Invalid kernel definition"); + case CL_INVALID_KERNEL: return strdup("Invalid kernel"); + case CL_INVALID_ARG_INDEX: return strdup("Invalid argument index"); + case CL_INVALID_ARG_VALUE: return strdup("Invalid argument value"); + case CL_INVALID_ARG_SIZE: return strdup("Invalid argument size"); + case CL_INVALID_KERNEL_ARGS: return strdup("Invalid kernel arguments"); + case CL_INVALID_WORK_DIMENSION: return strdup("Invalid work dimension"); + case CL_INVALID_WORK_GROUP_SIZE: return strdup("Invalid work group size"); + case CL_INVALID_WORK_ITEM_SIZE: return strdup("Invalid work item size"); + case CL_INVALID_GLOBAL_OFFSET: return strdup("Invalid global offset"); + case CL_INVALID_EVENT_WAIT_LIST: return strdup("Invalid event wait list"); + case CL_INVALID_EVENT: return strdup("Invalid event"); + case CL_INVALID_OPERATION: return strdup("Invalid operation"); + case CL_INVALID_GL_OBJECT: return strdup("Invalid OpenGL object"); + case CL_INVALID_BUFFER_SIZE: return strdup("Invalid buffer size"); + case CL_INVALID_MIP_LEVEL: return strdup("Invalid mip-map level"); + default: return strdup("Unknown"); + } +} + +static const char *cldevtypestr(cl_device_type c) { + switch (c) { + case CL_DEVICE_TYPE_CPU: return "CPU"; + case CL_DEVICE_TYPE_GPU: return "GPU"; + case CL_DEVICE_TYPE_ACCELERATOR: return "ACCELERATOR"; + case CL_DEVICE_TYPE_DEFAULT: return "DEFAULT"; + default: return "UNKNOWN"; + } +} + +#define CHECKERR(x) do { \ + (x); \ + if (err != CL_SUCCESS) { \ + fprintf(stderr, "%s: error %d: %s from %s\n", progname, err, print_cl_errstring(err), #x); \ + exit(1); \ + } \ +} while(0) + +#define CHECK(x) CHECKERR(err = (x)) + +static UCLInfo *opencl_init(const char *devstr, const char *src, + const char *options) +{ +#define UCL_MAX_PROPERTIES 32 +#define UCL_MAX_PLATFORMS 8 +#define UCL_MAX_DEVICES 16 + UCLInfo *tp; + cl_context_properties ctxprop[UCL_MAX_PROPERTIES]; + cl_int err; + cl_platform_id platforms[UCL_MAX_PLATFORMS]; + cl_uint nplatforms, ndevices; + cl_device_id devices[UCL_MAX_DEVICES]; + const char *srcstr[2], *clbinfile, *coremultstr; + unsigned i, j; + int cores, devcores, coremultguess = 0; + + if (devstr == NULL) + devstr = getenv("R123EXAMPLE_ENVCONF_OPENCL_DEVICE"); + + coremultstr = getenv("R123EXAMPLE_ENVCONF_OPENCL_CORES_PER_UNIT"); + if (coremultstr) { + coremultguess = atoi(coremultstr); + dprintf(("setting coremultguess to %d\n", coremultguess)); + } + + /* get list of platforms */ + CHECK(clGetPlatformIDs(0, NULL, &nplatforms)); + dprintf(("nplatforms = %d\n", nplatforms)); + CHECK(clGetPlatformIDs(UCL_MAX_PLATFORMS, platforms, &nplatforms)); + if (nplatforms == 0) { + fprintf(stderr, "No OpenCL platforms available\n"); + return NULL; + } + dprintf(("found %d platform%s:\n", nplatforms, nplatforms == 1 ? "" : "s")); + CHECKNOTZERO(tp = (UCLInfo *) malloc(sizeof(UCLInfo))); + ctxprop[0] = CL_CONTEXT_PLATFORM; + ctxprop[1] = 0; /* will fill in platform in loop */ + ctxprop[2] = 0; + cores = devcores = 0; + for (i = 0; i < nplatforms; i++) { + dprintf(("platform %d: 0x%lx\n", i, (unsigned long)platforms[i])); + clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, UCL_MAX_DEVICES, + devices, &ndevices); + // Sometimes, a platform with no devices will just return a failure instead + // of 0 devices, do not be deterred by that ... + if (err != CL_SUCCESS) { + fprintf(stderr, "%s: error %d: %s from clGetDeviceIDs for platform %d ( 0x%lx )\n", progname, err, print_cl_errstring(err), i, + (unsigned long)platforms[i]); + continue; + } + dprintf(("platform 0x%lx has %d devices:\n", (unsigned long)platforms[i], ndevices)); + for (j = 0; j < ndevices; j++) { + UCLInfo uc; + uc.devid = devices[j]; + CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_NAME, + sizeof uc.devname, uc.devname, 0)); + CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_VENDOR, + sizeof uc.vendor, uc.vendor, 0)); + CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_VERSION, + sizeof uc.version, uc.version, 0)); + CHECK(clGetDeviceInfo(devices[j], CL_DRIVER_VERSION, + sizeof uc.driver, uc.driver, 0)); + CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_MAX_CLOCK_FREQUENCY, + sizeof uc.clkfreq, &uc.clkfreq, 0)); + CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_MAX_COMPUTE_UNITS, + sizeof uc.compunits, &uc.compunits, 0)); + CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_MAX_WORK_GROUP_SIZE, + sizeof uc.wgsize, &uc.wgsize, 0)); + CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_DOUBLE_FP_CONFIG, + sizeof uc.fpdbl, &uc.fpdbl, 0)); + CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_TYPE, + sizeof uc.devtype, &uc.devtype, 0)); + uc.computeflags = 0; +#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV + { + cl_uint nvmaj, nvmin; + if(clGetDeviceInfo(devices[j], CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, + sizeof(nvmaj), &nvmaj, 0) == CL_SUCCESS && + clGetDeviceInfo(devices[j], CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, + sizeof(nvmin), &nvmin, 0) == CL_SUCCESS) { + uc.computeflags = nvmaj*10 + nvmin; + } + } +#endif + cores = uc.compunits; + /* XXX Hardwired knowledge about devices */ + if (coremultguess) { + cores *= coremultguess; + printf("Using override cores per unit %d so %d cores\n", coremultguess, cores); + } else if (strstr(uc.devname, "Cayman") || strstr(uc.devname, "Tahiti")) { + /* + * Most modern AMD compute units (shader cluster?) + * are a 16-lane SIMD Engine with 4 (Cayman) or 5 + * (Cypress) VLIW slots per lane. AMD appears to + * think of each slot as a "stream processor" + * (shader processor) in their marketing i.e. a + * Cayman-based Radeon 6950 with 24 compute units + * has 1536 stream processors. + * With Tahiti/Southern Islands/GCN, each compute + * unit has four vector execution SIMD units, each + * with 16 lanes. So the Tahiti-based Radeon 7970 with + * 32 compute units has 2048 cores/stream processors. + */ + cores *= 16*4; + } else if (strstr(uc.devname, "Cypress")) { + cores *= 16*5; + } else if (strstr(uc.devname, "GTX TITAN X") || + strstr(uc.devname, "GTX 9")) { + cores *= 128; + } else if (strstr(uc.devname, "GTX 6") || + strstr(uc.devname, "GTX 7") || + strstr(uc.devname, "Tesla K2") || + strstr(uc.devname, "Tesla K4") || + strstr(uc.devname, "GTX TITAN")) { + /* Kepler has 192 cores per SMX */ + cores *= 192; + } else if (strstr(uc.devname, "GTX 580") || + strstr(uc.devname, "GTX 480") || + strstr(uc.devname, "C20") || + strstr(uc.devname, "M20")) { + /* + * Fermi has 32 cores per SM. Maybe use + * computeflags to figure this out? + */ + cores *= 32; + } else if (uc.devtype == CL_DEVICE_TYPE_GPU) { + fprintf(stderr, "Unknown # of cores per unit for this device \"%s\", assuming 1, so cpb may be wrong and choice of threads may be suboptimal, fix by setting R123EXAMPLE_ENVCONF_OPENCL_CORES_PER_UNIT\n", + uc.devname); + } + /* clkfreq is in Megahertz! */ + uc.cycles = 1e6 * uc.clkfreq * cores; + dprintf((" %d: device 0x%lx vendor %s %s version %s driver %s : %u compute units @ %u MHz %d cores cycles/s %.2f flags %d fpdbl 0x%lx\n", + j, (unsigned long) devices[j], uc.vendor, uc.devname, uc.version, + uc.driver, uc.compunits, uc.clkfreq, cores, uc.cycles, uc.computeflags, + (unsigned long) uc.fpdbl)); + if (devstr && strstr(uc.devname, devstr) == NULL) { + if (verbose || debug) + printf("skipping device %s\n", uc.devname); + continue; + } + if (cores > devcores) { + ctxprop[1] = (cl_context_properties) platforms[i]; + devcores = cores; + *tp = uc; + } + } + } + if (devcores == 0) { + fprintf(stderr, "%s: No matching devices found\n", progname); + exit(1); + } + tp->cores = devcores; + + // using DEVICE_MAX_WORKGROUP_SIZE as the workgroup size seems to break + // weirdly on NVIDIA SDK 4.0.17 (the returned ctr arrays are all zeros) + // Halving it seems to produce as good or fractionally better performance + // on AMD, so seems a good choice. -- mm, 20110831 + if (tp->wgsize > 2) { + tp->wgsize /= 2; + } + printf("device 0x%lx %s : %d units %d cores %.2f Gcycles/s %lu maxwg %s device\n", + (unsigned long)tp->devid, tp->devname, tp->compunits, devcores, tp->cycles*1e-9, tp->wgsize, cldevtypestr(tp->devtype)); + CHECKERR(tp->ctx = clCreateContext(ctxprop, 1, &tp->devid, 0, 0, &err)); + dprintf(("create OpenCL context for device 0x%lx %s\n", (unsigned long)tp->devid, tp->devname)); + CHECKERR(tp->cmdq = clCreateCommandQueue(tp->ctx, tp->devid, 0, &err)); + /* + * create & compile OpenCL program from source string. Could + * normalize this out of the context but that creates a more + * complex API. + */ + dprintf(("create OpenCL program from source\n")); + + /* If the device has support for double, enable it, might need it for u01.h */ + i = 0; +#define UCLDBL "\n\ +#ifdef cl_khr_fp64\n\ +#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n\ +#elif defined(cl_amd_fp64)\n\ +#pragma OPENCL EXTENSION cl_amd_fp64 : enable\n\ +#endif\n\ +" + if (tp->fpdbl) { + srcstr[i++] = UCLDBL; + } + srcstr[i++] = src; + CHECKERR(tp->prog = clCreateProgramWithSource(tp->ctx, i, srcstr, 0, &err)); + if ((err = clBuildProgram(tp->prog, 1, &tp->devid, options, 0, 0)) != CL_SUCCESS || debug) { + char errbuf[512*1024]; + strcpy(errbuf, "<error report not filled in>"); + cl_int builderr = err; + CHECK(clGetProgramBuildInfo(tp->prog, tp->devid, CL_PROGRAM_BUILD_LOG, + sizeof errbuf, &errbuf[0], 0)); + fprintf(stderr, "%s: OpenCL build for device id 0x%lx %s returned error %d (%s): %s\n", + progname, (unsigned long) tp->devid, tp->devname, builderr, print_cl_errstring(builderr), errbuf); + if (builderr != CL_SUCCESS) + exit(1); + } + if ((clbinfile = getenv("R123_SAVE_OPENCL_BINARY")) != NULL) { + size_t sz, szret; + unsigned char *binp; + FILE *fp; + CHECKERR(clGetProgramInfo(tp->prog, CL_PROGRAM_BINARY_SIZES, sizeof(sz), &sz, &szret)); + CHECKNOTZERO(szret); + CHECKNOTZERO(sz); + printf("szret %lu, sz %lu\n", szret, (unsigned long) sz); + if (szret > 0 && sz > 0) { + CHECKNOTZERO((binp = (unsigned char *) malloc(sz))); + CHECKERR(clGetProgramInfo(tp->prog, CL_PROGRAM_BINARIES, sizeof(binp), &binp, &szret)); + CHECKNOTZERO(szret); + CHECKNOTZERO(fp = fopen(clbinfile, "wc")); + CHECKEQUAL(sz, fwrite(binp, 1, sz, fp)); + CHECKZERO(fclose(fp)); + free(binp); + printf("wrote OpenCL binary to %s\n", clbinfile); + } + } + dprintf(("opencl_init done\n")); + /* XXX Save build programs as .deviceid so we can read them back and run? */ + return tp; +} + + +static void opencl_done(UCLInfo *tp) { + cl_int err; + + dprintf(("opencl_done\n")); + CHECK(clReleaseCommandQueue(tp->cmdq)); + tp->cmdq = 0; + CHECK(clReleaseProgram(tp->prog)); + tp->prog = 0; + CHECK(clReleaseContext(tp->ctx)); + tp->ctx = 0; + free(tp); +} + + +#endif /* UTIL_OPENCL_H__ */ diff --git a/tests/util_print.h b/tests/util_print.h @@ -0,0 +1,58 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef UTIL_PRINT_H__ +#define UTIL_PRINT_H__ + +#include <stdio.h> + +extern int verbose; + +#define TEST_TPL(NAME, N, W, R) \ +void printline_##NAME##N##x##W##_##R(NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t ictr, NAME##N##x##W##_ctr_t *octrs, size_t nctr) \ +{ \ + size_t i; \ + for (i = 0; i < nctr; i++) { \ + if (i > 0) { \ + printf(" [%lu]", (unsigned long)i); \ + PRINTARRAY(octrs[i], stdout); \ + putc('\n', stdout); \ + fflush(stdout); \ + } else { \ + PRINTLINE(NAME, N, W, R, ictr, ukey, octrs[0], stdout); \ + } \ + if (verbose < 2) break; \ + } \ +} + +#include "util_expandtpl.h" + +#endif /* UTIL_PRINT_H__ */