Botan-1.10.12/.mtn-ignore0000664000175000017500000000075412654331322014652 0ustar jackjack00000000000000^Makefile.*$ ^libbotan.*\.so\..* ^[a-z]+\.(exp|lib)$ ^[a-z]+\.(exe|dll)(\.manifest)?$ ^botan-config$ ^botan_all\.(cpp|h)$ ^botan.pc$ ^build$ callgrind.out.* ^check$ ^checks/ecc_testdata/dompar_private.pkcs8.pem$ ^checks/ecc_testdata/rsa_private.pkcs8.pem$ ^checks/ecc_testdata/wo_dompar_private.pkcs8.pem$ ^checks/nist_tests/x509test$ ^doc/_static$ ^doc/examples/.*\.pem$ ^doc/examples/[a-z0-9_]+$ ^src/wrap/perl-xs/Botan.(bs|c)$ ^src/wrap/perl-xs/Makefile(\.old)?$ ^src/wrap/perl-xs/.*blib$ Botan-1.10.12/botan_version.py0000664000175000017500000000036412654332261016014 0ustar jackjack00000000000000 release_major = 1 release_minor = 10 release_patch = 12 release_so_abi_rev = 1 # These are set by the distribution script release_vc_rev = 'git:94a3fa8ae0dc4df67f6e9ba780427e651baa9dfd' release_datestamp = 20160203 release_type = 'released' Botan-1.10.12/checks/bench.cpp0000664000175000017500000001336012654331322015612 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "bench.h" namespace { const std::string algos[] = { /* Block ciphers */ "AES-128", "AES-192", "AES-256", "Blowfish", "CAST-128", "CAST-256", "DES", "DESX", "GOST", "IDEA", "KASUMI", "MARS", "MISTY1", "Noekeon", "RC2", "RC5(12)", "RC5(16)", "RC6", "SAFER-SK(10)", "SEED", "Serpent", "Skipjack", "Square", "TEA", "TripleDES", "Twofish", "XTEA", /* Cipher constructions */ "Cascade(Serpent,AES-128)", "Lion(SHA-256,Salsa20,8192)", "Luby-Rackoff(SHA-512)", /* Cipher modes */ "TripleDES/CBC/PKCS7", "TripleDES/CBC/CTS", "TripleDES/CTR-BE", "TripleDES/EAX", "TripleDES/OFB", "TripleDES/CFB(64)", "TripleDES/CFB(32)", "TripleDES/CFB(16)", "TripleDES/CFB(8)", "AES-128/CBC/PKCS7", "AES-128/CBC/CTS", "AES-128/CTR-BE", "AES-128/EAX", "AES-128/OFB", "AES-128/XTS", "AES-128/CFB(128)", "AES-128/CFB(64)", "AES-128/CFB(32)", "AES-128/CFB(16)", "AES-128/CFB(8)", "Serpent/CBC/PKCS7", "Serpent/CBC/CTS", "Serpent/CTR-BE", "Serpent/EAX", "Serpent/OFB", "Serpent/XTS", "Serpent/CFB(128)", "Serpent/CFB(64)", "Serpent/CFB(32)", "Serpent/CFB(16)", "Serpent/CFB(8)", /* Stream ciphers */ "ARC4", "Salsa20", "Turing", "WiderWake4+1-BE", /* Checksums */ "Adler32", "CRC24", "CRC32", /* Hashes */ "BMW-512", "GOST-34.11", "HAS-160", "Keccak-1600(224)", "Keccak-1600(256)", "Keccak-1600(384)", "Keccak-1600(512)", "MD2", "MD4", "MD5", "RIPEMD-128", "RIPEMD-160", "SHA-160", "SHA-256", "SHA-384", "SHA-512", "Skein-512", "Tiger", "Whirlpool", /* MACs */ "CMAC(AES-128)", "HMAC(SHA-1)", "X9.19-MAC", "", }; void report_results(const std::string& algo, const std::map& speeds) { // invert, showing fastest impl first std::map results; for(std::map::const_iterator i = speeds.begin(); i != speeds.end(); ++i) { // Speeds might collide, tweak slightly to handle this if(results[i->second] == "") results[i->second] = i->first; else results[i->second - .01] = i->first; } std::cout << algo; #if (defined(__GNUC__) && __GNUC__ <= 3) || defined(__SUNPRO_CC) || defined(__ANDROID__) // Work around bug in various compilers where map rev iterators don't work for(std::map::const_iterator i = results.begin(); i != results.end(); ++i) #else for(std::map::const_reverse_iterator i = results.rbegin(); i != results.rend(); ++i) #endif { std::cout << " [" << i->second << "] " << std::fixed << std::setprecision(2) << i->first; } std::cout << std::endl; } } bool bench_algo(const std::string& algo, Botan::RandomNumberGenerator& rng, double seconds, u32bit buf_size) { Botan::Algorithm_Factory& af = Botan::global_state().algorithm_factory(); u32bit milliseconds = static_cast(seconds * 1000); std::map speeds = algorithm_benchmark(algo, af, rng, milliseconds, buf_size); if(speeds.empty()) // maybe a cipher mode, then? { Botan::Algorithm_Factory::Engine_Iterator i(af); std::vector algo_parts = Botan::split_on(algo, '/'); if(algo_parts.size() < 2) // not a cipher mode return false; std::string cipher = algo_parts[0]; const Botan::BlockCipher* proto_cipher = af.prototype_block_cipher(cipher); if(!proto_cipher) { std::cout << "Unknown algorithm " << cipher << "\n"; return false; } size_t cipher_keylen = proto_cipher->maximum_keylength(); const size_t cipher_ivlen = proto_cipher->block_size(); if(algo_parts[1] == "XTS") cipher_keylen *= 2; // hack! std::vector buf(16 * 1024); rng.randomize(&buf[0], buf.size()); while(Botan::Engine* engine = i.next()) { u64bit nanoseconds_max = static_cast(seconds * 1000000000.0); Botan::Keyed_Filter* filt = engine->get_cipher(algo, Botan::ENCRYPTION, af); if(!filt) continue; filt->set_key(Botan::SymmetricKey(&buf[0], cipher_keylen)); if(filt->valid_iv_length(cipher_ivlen / 2)) filt->set_iv(Botan::InitializationVector(&buf[0], cipher_ivlen)); Botan::Pipe pipe(filt, new Botan::BitBucket); pipe.start_msg(); const u64bit start = Botan::get_nanoseconds_clock(); u64bit nanoseconds_used = 0; u64bit reps = 0; while(nanoseconds_used < nanoseconds_max) { pipe.write(&buf[0], buf.size()); ++reps; nanoseconds_used = Botan::get_nanoseconds_clock() - start; } double mbytes_per_second = (953.67 * (buf.size() * reps)) / nanoseconds_used; speeds[engine->provider_name()] = mbytes_per_second; } } if(!speeds.empty()) report_results(algo, speeds); return !speeds.empty(); } void benchmark(Botan::RandomNumberGenerator& rng, double seconds, u32bit buf_size) { for(u32bit i = 0; algos[i] != ""; ++i) bench_algo(algos[i], rng, seconds, buf_size); } Botan-1.10.12/checks/bench.h0000664000175000017500000000075712654331322015265 0ustar jackjack00000000000000 #ifndef BOTAN_CHECK_BENCHMARK_H__ #define BOTAN_CHECK_BENCHMARK_H__ #include #include void benchmark(Botan::RandomNumberGenerator& rng, double seconds, u32bit buf_size); bool bench_algo(const std::string& algo_name, Botan::RandomNumberGenerator& rng, double seconds, u32bit buf_size); void bench_pk(Botan::RandomNumberGenerator&, const std::string&, double seconds); #endif Botan-1.10.12/checks/bigint.cpp0000664000175000017500000002133512654331322016010 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include using namespace Botan; #include "common.h" #include "validate.h" #define DEBUG 0 u32bit check_add(const std::vector&); u32bit check_sub(const std::vector&); u32bit check_mul(const std::vector&); u32bit check_sqr(const std::vector&); u32bit check_div(const std::vector&); u32bit check_mod(const std::vector&, Botan::RandomNumberGenerator& rng); u32bit check_shr(const std::vector&); u32bit check_shl(const std::vector&); u32bit check_powmod(const std::vector&); u32bit check_primetest(const std::vector&, Botan::RandomNumberGenerator&); u32bit do_bigint_tests(const std::string& filename, Botan::RandomNumberGenerator& rng) { std::ifstream test_data(filename.c_str()); if(!test_data) throw Botan::Stream_IO_Error("Couldn't open test file " + filename); u32bit errors = 0, alg_count = 0; std::string algorithm; bool first = true; u32bit counter = 0; while(!test_data.eof()) { if(test_data.bad() || test_data.fail()) throw Botan::Stream_IO_Error("File I/O error reading from " + filename); std::string line; std::getline(test_data, line); strip(line); if(line.size() == 0) continue; // Do line continuation while(line[line.size()-1] == '\\' && !test_data.eof()) { line.replace(line.size()-1, 1, ""); std::string nextline; std::getline(test_data, nextline); strip(nextline); if(nextline.size() == 0) continue; line += nextline; } if(line[0] == '[' && line[line.size() - 1] == ']') { algorithm = line.substr(1, line.size() - 2); alg_count = 0; counter = 0; if(!first) std::cout << std::endl; std::cout << "Testing BigInt " << algorithm << ": "; std::cout.flush(); first = false; continue; } std::vector substr = parse(line); #if DEBUG std::cout << "Testing: " << algorithm << std::endl; #endif u32bit new_errors = 0; if(algorithm.find("Addition") != std::string::npos) new_errors = check_add(substr); else if(algorithm.find("Subtraction") != std::string::npos) new_errors = check_sub(substr); else if(algorithm.find("Multiplication") != std::string::npos) new_errors = check_mul(substr); else if(algorithm.find("Square") != std::string::npos) new_errors = check_sqr(substr); else if(algorithm.find("Division") != std::string::npos) new_errors = check_div(substr); else if(algorithm.find("Modulo") != std::string::npos) new_errors = check_mod(substr, rng); else if(algorithm.find("LeftShift") != std::string::npos) new_errors = check_shl(substr); else if(algorithm.find("RightShift") != std::string::npos) new_errors = check_shr(substr); else if(algorithm.find("ModExp") != std::string::npos) new_errors = check_powmod(substr); else if(algorithm.find("PrimeTest") != std::string::npos) new_errors = check_primetest(substr, rng); else std::cout << "Unknown MPI test " << algorithm << std::endl; if(counter % 3 == 0) { std::cout << '.'; std::cout.flush(); } counter++; alg_count++; errors += new_errors; if(new_errors) std::cout << "ERROR: BigInt " << algorithm << " failed test #" << std::dec << alg_count << std::endl; } std::cout << std::endl; return errors; } namespace { // c==expected, d==a op b, e==a op= b u32bit results(std::string op, const BigInt& a, const BigInt& b, const BigInt& c, const BigInt& d, const BigInt& e) { std::string op1 = "operator" + op; std::string op2 = op1 + "="; if(c == d && d == e) return 0; else { std::cout << std::endl; std::cout << "ERROR: " << op1 << std::endl; std::cout << "a = " << std::hex << a << std::endl; std::cout << "b = " << std::hex << b << std::endl; std::cout << "c = " << std::hex << c << std::endl; std::cout << "d = " << std::hex << d << std::endl; std::cout << "e = " << std::hex << e << std::endl; if(d != e) { std::cout << "ERROR: " << op1 << " | " << op2 << " mismatch" << std::endl; } return 1; } } } u32bit check_add(const std::vector& args) { BigInt a(args[0]); BigInt b(args[1]); BigInt c(args[2]); BigInt d = a + b; BigInt e = a; e += b; if(results("+", a, b, c, d, e)) return 1; d = b + a; e = b; e += a; return results("+", a, b, c, d, e); } u32bit check_sub(const std::vector& args) { BigInt a(args[0]); BigInt b(args[1]); BigInt c(args[2]); BigInt d = a - b; BigInt e = a; e -= b; return results("-", a, b, c, d, e); } u32bit check_mul(const std::vector& args) { BigInt a(args[0]); BigInt b(args[1]); BigInt c(args[2]); /* std::cout << "a = " << args[0] << "\n" << "b = " << args[1] << std::endl; */ /* This makes it more likely the fast multiply algorithms will be usable, which is what we really want to test here (the simple n^2 multiply is pretty well tested at this point). */ a.grow_reg(32); b.grow_reg(32); BigInt d = a * b; BigInt e = a; e *= b; if(results("*", a, b, c, d, e)) return 1; d = b * a; e = b; e *= a; return results("*", a, b, c, d, e); } u32bit check_sqr(const std::vector& args) { BigInt a(args[0]); BigInt b(args[1]); a.grow_reg(16); b.grow_reg(16); BigInt c = square(a); BigInt d = a * a; return results("sqr", a, a, b, c, d); } u32bit check_div(const std::vector& args) { BigInt a(args[0]); BigInt b(args[1]); BigInt c(args[2]); BigInt d = a / b; BigInt e = a; e /= b; return results("/", a, b, c, d, e); } u32bit check_mod(const std::vector& args, Botan::RandomNumberGenerator& rng) { BigInt a(args[0]); BigInt b(args[1]); BigInt c(args[2]); BigInt d = a % b; BigInt e = a; e %= b; u32bit got = results("%", a, b, c, d, e); if(got) return got; word b_word = b.word_at(0); /* Won't work for us, just pick one at random */ while(b_word == 0) for(u32bit j = 0; j != 2*sizeof(word); j++) b_word = (b_word << 4) ^ rng.next_byte(); b = b_word; c = a % b; /* we declare the BigInt % BigInt version to be correct here */ word d2 = a % b_word; e = a; e %= b_word; return results("%(word)", a, b, c, d2, e); } u32bit check_shl(const std::vector& args) { BigInt a(args[0]); u32bit b = std::atoi(args[1].c_str()); BigInt c(args[2]); BigInt d = a << b; BigInt e = a; e <<= b; return results("<<", a, b, c, d, e); } u32bit check_shr(const std::vector& args) { BigInt a(args[0]); u32bit b = std::atoi(args[1].c_str()); BigInt c(args[2]); BigInt d = a >> b; BigInt e = a; e >>= b; return results(">>", a, b, c, d, e); } /* Make sure that (a^b)%m == r */ u32bit check_powmod(const std::vector& args) { BigInt a(args[0]); BigInt b(args[1]); BigInt m(args[2]); BigInt c(args[3]); BigInt r = power_mod(a, b, m); if(c != r) { std::cout << "ERROR: power_mod" << std::endl; std::cout << "a = " << std::hex << a << std::endl; std::cout << "b = " << std::hex << b << std::endl; std::cout << "m = " << std::hex << m << std::endl; std::cout << "c = " << std::hex << c << std::endl; std::cout << "r = " << std::hex << r << std::endl; return 1; } return 0; } /* Make sure that n is prime or not prime, according to should_be_prime */ u32bit check_primetest(const std::vector& args, Botan::RandomNumberGenerator& rng) { BigInt n(args[0]); bool should_be_prime = (args[1] == "1"); bool is_prime = Botan::verify_prime(n, rng); if(is_prime != should_be_prime) { std::cout << "ERROR: verify_prime" << std::endl; std::cout << "n = " << n << std::endl; std::cout << is_prime << " != " << should_be_prime << std::endl; } return 0; } Botan-1.10.12/checks/check.cpp0000664000175000017500000001546612654331322015621 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ /* * Test Driver for Botan */ #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_DYNAMICALLY_LOADED_ENGINE) #include #endif using namespace Botan; #include "getopt.h" #include "bench.h" #include "validate.h" #include "common.h" const std::string VALIDATION_FILE = "checks/validate.dat"; const std::string BIGINT_VALIDATION_FILE = "checks/mp_valid.dat"; const std::string PK_VALIDATION_FILE = "checks/pk_valid.dat"; const std::string EXPECTED_FAIL_FILE = "checks/fail.dat"; int run_test_suite(RandomNumberGenerator& rng); namespace { template bool test(const char* type, int digits, bool is_signed) { if(std::numeric_limits::is_specialized == false) { std::cout << "Warning: Could not check parameters of " << type << " in std::numeric_limits" << std::endl; // assume it's OK (full tests will catch it later) return true; } // continue checking after failures bool passed = true; if(std::numeric_limits::is_integer == false) { std::cout << "Warning: std::numeric_limits<> says " << type << " is not an integer" << std::endl; passed = false; } if(std::numeric_limits::is_signed != is_signed) { std::cout << "Warning: numeric_limits<" << type << ">::is_signed == " << std::boolalpha << std::numeric_limits::is_signed << std::endl; passed = false; } if(std::numeric_limits::digits != digits && digits != 0) { std::cout << "Warning: numeric_limits<" << type << ">::digits == " << std::numeric_limits::digits << " expected " << digits << std::endl; passed = false; } return passed; } void test_types() { bool passed = true; passed = passed && test("byte", 8, false); passed = passed && test("u16bit", 16, false); passed = passed && test("u32bit", 32, false); passed = passed && test("u64bit", 64, false); passed = passed && test("s32bit", 31, true); if(!passed) std::cout << "Typedefs in include/types.h may be incorrect!\n"; } } int main(int argc, char* argv[]) { if(BOTAN_VERSION_MAJOR != version_major() || BOTAN_VERSION_MINOR != version_minor() || BOTAN_VERSION_PATCH != version_patch()) { std::cout << "Warning: linked version (" << version_major() << '.' << version_minor() << '.' << version_patch() << ") does not match version built against (" << BOTAN_VERSION_MAJOR << '.' << BOTAN_VERSION_MINOR << '.' << BOTAN_VERSION_PATCH << ")\n"; } try { OptionParser opts("help|test|validate|dyn-load=|" "benchmark|bench-type=|bench-algo=|" "seconds=|buf-size="); opts.parse(argv); test_types(); // do this always Botan::LibraryInitializer init("thread_safe=no"); if(opts.is_set("dyn-load")) { const std::string lib = opts.value("dyn-load"); #if defined(BOTAN_HAS_DYNAMICALLY_LOADED_ENGINE) global_state().algorithm_factory().add_engine( new Dynamically_Loaded_Engine(lib)); #else std::cout << "Can't load " << lib << "; DLL engines not supported in build\n"; #endif } Botan::AutoSeeded_RNG rng; if(opts.is_set("help") || argc <= 1) { std::cerr << "Test driver for " << Botan::version_string() << "\n" << "Options:\n" << " --test || --validate: Run tests (do this at least once)\n" << " --benchmark: Benchmark everything\n" << " --seconds=n: Benchmark for n seconds\n" << " --init=: Pass to the library\n" << " --help: Print this message\n"; return 1; } if(opts.is_set("validate") || opts.is_set("test")) { return run_test_suite(rng); } if(opts.is_set("bench-algo") || opts.is_set("benchmark") || opts.is_set("bench-type")) { double seconds = 5; u32bit buf_size = 16; if(opts.is_set("seconds")) { seconds = std::atof(opts.value("seconds").c_str()); if(seconds < 0.1 || seconds > (5 * 60)) { std::cout << "Invalid argument to --seconds\n"; return 2; } } if(opts.is_set("buf-size")) { buf_size = std::atoi(opts.value("buf-size").c_str()); if(buf_size == 0 || buf_size > 1024) { std::cout << "Invalid argument to --buf-size\n"; return 2; } } if(opts.is_set("benchmark")) { benchmark(rng, seconds, buf_size); } else if(opts.is_set("bench-algo")) { std::vector algs = Botan::split_on(opts.value("bench-algo"), ','); for(u32bit j = 0; j != algs.size(); j++) { const std::string alg = algs[j]; if(!bench_algo(alg, rng, seconds, buf_size)) bench_pk(rng, alg, seconds); } } } } catch(std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; return 1; } catch(...) { std::cerr << "Unknown (...) exception caught" << std::endl; return 1; } return 0; } int run_test_suite(RandomNumberGenerator& rng) { std::cout << "Beginning tests..." << std::endl; u32bit errors = 0; try { errors += do_validation_tests(VALIDATION_FILE, rng); errors += do_validation_tests(EXPECTED_FAIL_FILE, rng, false); errors += do_bigint_tests(BIGINT_VALIDATION_FILE, rng); errors += do_pk_validation_tests(PK_VALIDATION_FILE, rng); do_x509_tests(rng); //errors += do_cvc_tests(rng); } catch(std::exception& e) { std::cout << "Exception: " << e.what() << std::endl; return 1; } catch(...) { std::cout << "Unknown exception caught." << std::endl; return 1; } if(errors) { std::cout << errors << " test" << ((errors == 1) ? "" : "s") << " failed." << std::endl; return 1; } std::cout << "All tests passed!" << std::endl; return 0; } Botan-1.10.12/checks/common.h0000664000175000017500000000335312654331322015471 0ustar jackjack00000000000000// common code for the validation and benchmark code #ifndef BOTAN_CHECK_COMMON_H__ #define BOTAN_CHECK_COMMON_H__ #include #include #include #include #include #include #include #include using Botan::byte; using Botan::u32bit; using Botan::u64bit; void strip_comments(std::string& line); void strip_newlines(std::string& line); void strip(std::string& line); std::vector parse(const std::string& line); Botan::Filter* lookup(const std::string& algname, const std::vector& params); class Fixed_Output_RNG : public Botan::RandomNumberGenerator { public: bool is_seeded() const { return !buf.empty(); } byte random() { if(buf.empty()) throw std::runtime_error("Out of bytes"); byte out = buf.front(); buf.pop_front(); return out; } void reseed(size_t) {} void randomize(byte out[], size_t len) { for(size_t j = 0; j != len; j++) out[j] = random(); } std::string name() const { return "Fixed_Output_RNG"; } void add_entropy_source(Botan::EntropySource* src) { delete src; } void add_entropy(const byte[], size_t) {}; void clear() throw() {} Fixed_Output_RNG(const Botan::SecureVector& in) { buf.insert(buf.end(), in.begin(), in.end()); } Fixed_Output_RNG(const std::string& in_str) { Botan::SecureVector in = Botan::hex_decode(in_str); buf.insert(buf.end(), in.begin(), in.end()); } Fixed_Output_RNG() {} private: std::deque buf; }; #endif Botan-1.10.12/checks/cvc_tests.cpp0000664000175000017500000005160312654331322016532 0ustar jackjack00000000000000/* * CVC EAC1.1 tests * * (C) 2008 Falko Strenzke (strenzke@flexsecure.de) * 2008 Jack Lloyd */ #include "validate.h" #include #if defined(BOTAN_HAS_CARD_VERIFIABLE_CERTIFICATES) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define TEST_DATA_DIR "checks/ecc_testdata" using namespace Botan; #define CHECK_MESSAGE(expr, print) try { if(!(expr)) std::cout << print << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } #define CHECK(expr) try { if(!(expr)) std::cout << #expr << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } namespace { // helper functions void helper_write_file(EAC_Signed_Object const& to_write, std::string const& file_path) { SecureVector sv = to_write.BER_encode(); std::ofstream cert_file(file_path.c_str(), std::ios::binary); cert_file.write((char*)&sv[0], sv.size()); cert_file.close(); } bool helper_files_equal(std::string const& file_path1, std::string const& file_path2) { std::ifstream cert_1_in(file_path1.c_str()); std::ifstream cert_2_in(file_path2.c_str()); SecureVector sv1; SecureVector sv2; if (!cert_1_in || !cert_2_in) { return false; } while (!cert_1_in.eof()) { char now; cert_1_in.read(&now, 1); sv1.push_back(now); } while (!cert_2_in.eof()) { char now; cert_2_in.read(&now, 1); sv2.push_back(now); } if (sv1.size() == 0) { return false; } return sv1 == sv2; } void test_enc_gen_selfsigned(RandomNumberGenerator& rng) { std::cout << '.' << std::flush; EAC1_1_CVC_Options opts; //opts.cpi = 0; opts.chr = ASN1_Chr("my_opt_chr"); // not used opts.car = ASN1_Car("my_opt_car"); opts.cex = ASN1_Cex("2010 08 13"); opts.ced = ASN1_Ced("2010 07 27"); opts.holder_auth_templ = 0xC1; opts.hash_alg = "SHA-256"; // creating a non sense selfsigned cert w/o dom pars EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.11")); ECDSA_PrivateKey key(rng, dom_pars); key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); EAC1_1_CVC cert = CVC_EAC::create_self_signed_cert(key, opts, rng); SecureVector der(cert.BER_encode()); std::ofstream cert_file; cert_file.open(TEST_DATA_DIR "/my_cv_cert.ber", std::ios::binary); //cert_file << der; // this is bad !!! cert_file.write((char*)&der[0], der.size()); cert_file.close(); EAC1_1_CVC cert_in(TEST_DATA_DIR "/my_cv_cert.ber"); CHECK(cert == cert_in); // encoding it again while it has no dp SecureVector der2(cert_in.BER_encode()); std::ofstream cert_file2(TEST_DATA_DIR "/my_cv_cert2.ber", std::ios::binary); cert_file2.write((char*)&der2[0], der2.size()); cert_file2.close(); // read both and compare them std::ifstream cert_1_in(TEST_DATA_DIR "/my_cv_cert.ber"); std::ifstream cert_2_in(TEST_DATA_DIR "/my_cv_cert2.ber"); SecureVector sv1; SecureVector sv2; if (!cert_1_in || !cert_2_in) { CHECK_MESSAGE(false, "could not read certificate files"); } while (!cert_1_in.eof()) { char now; cert_1_in.read(&now, 1); sv1.push_back(now); } while (!cert_2_in.eof()) { char now; cert_2_in.read(&now, 1); sv2.push_back(now); } CHECK(sv1.size() > 10); CHECK_MESSAGE(sv1 == sv2, "reencoded file of cert without domain parameters is different from original"); //cout << "reading cert again\n"; CHECK(cert_in.get_car().value() == "my_opt_car"); CHECK(cert_in.get_chr().value() == "my_opt_car"); CHECK(cert_in.get_ced().as_string() == "20100727"); CHECK(cert_in.get_ced().readable_string() == "2010/07/27 "); bool ill_date_exc = false; try { ASN1_Ced("1999 01 01"); } catch (...) { ill_date_exc = true; } CHECK(ill_date_exc); bool ill_date_exc2 = false; try { ASN1_Ced("2100 01 01"); } catch (...) { ill_date_exc2 = true; } CHECK(ill_date_exc2); //cout << "readable = '" << cert_in.get_ced().readable_string() << "'\n"; std::auto_ptr p_pk(cert_in.subject_public_key()); //auto_ptr ecdsa_pk(dynamic_cast >(p_pk)); ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast(p_pk.get()); // let´s see if encoding is truely implicitca, because this is what the key should have // been set to when decoding (see above)(because it has no domain params): //cout << "encoding = " << p_ecdsa_pk->get_parameter_encoding() << std::endl; CHECK(p_ecdsa_pk->domain_format() == EC_DOMPAR_ENC_IMPLICITCA); bool exc = false; try { std::cout << "order = " << p_ecdsa_pk->domain().get_order() << std::endl; } catch (Invalid_State) { exc = true; } CHECK(exc); // set them and try again //cert_in.set_domain_parameters(dom_pars); std::auto_ptr p_pk2(cert_in.subject_public_key()); ECDSA_PublicKey* p_ecdsa_pk2 = dynamic_cast(p_pk2.get()); //p_ecdsa_pk2->set_domain_parameters(dom_pars); CHECK(p_ecdsa_pk2->domain().get_order() == dom_pars.get_order()); bool ver_ec = cert_in.check_signature(*p_pk2); CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned cvc certificate"); } void test_enc_gen_req(RandomNumberGenerator& rng) { std::cout << "." << std::flush; EAC1_1_CVC_Options opts; //opts.cpi = 0; opts.chr = ASN1_Chr("my_opt_chr"); opts.hash_alg = "SHA-160"; // creating a non sense selfsigned cert w/o dom pars EC_Group dom_pars(OID("1.3.132.0.8")); ECDSA_PrivateKey key(rng, dom_pars); key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); EAC1_1_Req req = CVC_EAC::create_cvc_req(key, opts.chr, opts.hash_alg, rng); SecureVector der(req.BER_encode()); std::ofstream req_file(TEST_DATA_DIR "/my_cv_req.ber", std::ios::binary); req_file.write((char*)&der[0], der.size()); req_file.close(); // read and check signature... EAC1_1_Req req_in(TEST_DATA_DIR "/my_cv_req.ber"); //req_in.set_domain_parameters(dom_pars); std::auto_ptr p_pk(req_in.subject_public_key()); ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast(p_pk.get()); //p_ecdsa_pk->set_domain_parameters(dom_pars); CHECK(p_ecdsa_pk->domain().get_order() == dom_pars.get_order()); bool ver_ec = req_in.check_signature(*p_pk); CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned (created by myself) cvc request"); } void test_cvc_req_ext(RandomNumberGenerator&) { std::cout << "." << std::flush; EAC1_1_Req req_in(TEST_DATA_DIR "/DE1_flen_chars_cvcRequest_ECDSA.der"); EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.5")); // "german curve" //req_in.set_domain_parameters(dom_pars); std::auto_ptr p_pk(req_in.subject_public_key()); ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast(p_pk.get()); //p_ecdsa_pk->set_domain_parameters(dom_pars); CHECK(p_ecdsa_pk->domain().get_order() == dom_pars.get_order()); bool ver_ec = req_in.check_signature(*p_pk); CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned (external testdata) cvc request"); } void test_cvc_ado_ext(RandomNumberGenerator&) { std::cout << "." << std::flush; EAC1_1_ADO req_in(TEST_DATA_DIR "/ado.cvcreq"); EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.5")); // "german curve" //cout << "car = " << req_in.get_car().value() << std::endl; //req_in.set_domain_parameters(dom_pars); } void test_cvc_ado_creation(RandomNumberGenerator& rng) { std::cout << "." << std::flush; EAC1_1_CVC_Options opts; //opts.cpi = 0; opts.chr = ASN1_Chr("my_opt_chr"); opts.hash_alg = "SHA-256"; // creating a non sense selfsigned cert w/o dom pars EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.11")); //cout << "mod = " << hex << dom_pars.get_curve().get_p() << std::endl; ECDSA_PrivateKey req_key(rng, dom_pars); req_key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); //EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts); EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts.chr, opts.hash_alg, rng); SecureVector der(req.BER_encode()); std::ofstream req_file(TEST_DATA_DIR "/my_cv_req.ber", std::ios::binary); req_file.write((char*)&der[0], der.size()); req_file.close(); // create an ado with that req ECDSA_PrivateKey ado_key(rng, dom_pars); EAC1_1_CVC_Options ado_opts; ado_opts.car = ASN1_Car("my_ado_car"); ado_opts.hash_alg = "SHA-256"; // must be equal to req´s hash alg, because ado takes his sig_algo from it´s request //EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts); EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts.car, rng); CHECK_MESSAGE(ado.check_signature(ado_key), "failure of ado verification after creation"); std::ofstream ado_file(TEST_DATA_DIR "/ado", std::ios::binary); SecureVector ado_der(ado.BER_encode()); ado_file.write((char*)&ado_der[0], ado_der.size()); ado_file.close(); // read it again and check the signature EAC1_1_ADO ado2(TEST_DATA_DIR "/ado"); CHECK(ado == ado2); //ECDSA_PublicKey* p_ado_pk = dynamic_cast(&ado_key); //bool ver = ado2.check_signature(*p_ado_pk); bool ver = ado2.check_signature(ado_key); CHECK_MESSAGE(ver, "failure of ado verification after reloading"); } void test_cvc_ado_comparison(RandomNumberGenerator& rng) { std::cout << "." << std::flush; EAC1_1_CVC_Options opts; //opts.cpi = 0; opts.chr = ASN1_Chr("my_opt_chr"); opts.hash_alg = "SHA-224"; // creating a non sense selfsigned cert w/o dom pars EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.11")); ECDSA_PrivateKey req_key(rng, dom_pars); req_key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); //EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts); EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts.chr, opts.hash_alg, rng); // create an ado with that req ECDSA_PrivateKey ado_key(rng, dom_pars); EAC1_1_CVC_Options ado_opts; ado_opts.car = ASN1_Car("my_ado_car1"); ado_opts.hash_alg = "SHA-224"; // must be equal to req's hash alg, because ado takes his sig_algo from it's request //EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts); EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts.car, rng); CHECK_MESSAGE(ado.check_signature(ado_key), "failure of ado verification after creation"); // make a second one for comparison EAC1_1_CVC_Options opts2; //opts2.cpi = 0; opts2.chr = ASN1_Chr("my_opt_chr"); opts2.hash_alg = "SHA-160"; // this is the only difference ECDSA_PrivateKey req_key2(rng, dom_pars); req_key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); //EAC1_1_Req req2 = CVC_EAC::create_cvc_req(req_key2, opts2, rng); EAC1_1_Req req2 = CVC_EAC::create_cvc_req(req_key2, opts2.chr, opts2.hash_alg, rng); ECDSA_PrivateKey ado_key2(rng, dom_pars); EAC1_1_CVC_Options ado_opts2; ado_opts2.car = ASN1_Car("my_ado_car1"); ado_opts2.hash_alg = "SHA-160"; // must be equal to req's hash alg, because ado takes his sig_algo from it's request EAC1_1_ADO ado2 = CVC_EAC::create_ado_req(ado_key2, req2, ado_opts2.car, rng); CHECK_MESSAGE(ado2.check_signature(ado_key2), "failure of ado verification after creation"); CHECK_MESSAGE(ado != ado2, "ado's found to be equal where they are not"); // std::ofstream ado_file(TEST_DATA_DIR "/ado"); // SecureVector ado_der(ado.BER_encode()); // ado_file.write((char*)&ado_der[0], ado_der.size()); // ado_file.close(); // read it again and check the signature // EAC1_1_ADO ado2(TEST_DATA_DIR "/ado"); // ECDSA_PublicKey* p_ado_pk = dynamic_cast(&ado_key); // //bool ver = ado2.check_signature(*p_ado_pk); // bool ver = ado2.check_signature(ado_key); // CHECK_MESSAGE(ver, "failure of ado verification after reloading"); } void test_eac_time(RandomNumberGenerator&) { std::cout << "." << std::flush; const u64bit current_time = system_time(); EAC_Time time(current_time); // std::cout << "time as std::string = " << time.as_string() << std::endl; EAC_Time sooner("", ASN1_Tag(99)); //X509_Time sooner("", ASN1_Tag(99)); sooner.set_to("2007 12 12"); // std::cout << "sooner as std::string = " << sooner.as_string() << std::endl; EAC_Time later("2007 12 13"); //X509_Time later("2007 12 13"); // std::cout << "later as std::string = " << later.as_string() << std::endl; CHECK(sooner <= later); CHECK(sooner == sooner); ASN1_Cex my_cex("2007 08 01"); my_cex.add_months(12); CHECK(my_cex.get_year() == 2008); CHECK_MESSAGE(my_cex.get_month() == 8, "shoult be 8, was " << my_cex.get_month()); my_cex.add_months(4); CHECK(my_cex.get_year() == 2008); CHECK(my_cex.get_month() == 12); my_cex.add_months(4); CHECK(my_cex.get_year() == 2009); CHECK(my_cex.get_month() == 4); my_cex.add_months(41); CHECK(my_cex.get_year() == 2012); CHECK(my_cex.get_month() == 9); } void test_ver_cvca(RandomNumberGenerator&) { std::cout << "." << std::flush; EAC1_1_CVC req_in(TEST_DATA_DIR "/cvca01.cv.crt"); //auto_ptr ecdsa_pk(dynamic_cast >(p_pk)); //ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast(p_pk.get()); bool exc = false; std::auto_ptr p_pk2(req_in.subject_public_key()); ECDSA_PublicKey* p_ecdsa_pk2 = dynamic_cast(p_pk2.get()); bool ver_ec = req_in.check_signature(*p_pk2); CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned cvca certificate"); try { p_ecdsa_pk2->domain().get_order(); } catch (Invalid_State) { exc = true; } CHECK(!exc); } void test_copy_and_assignment(RandomNumberGenerator&) { std::cout << "." << std::flush; EAC1_1_CVC cert_in(TEST_DATA_DIR "/cvca01.cv.crt"); EAC1_1_CVC cert_cp(cert_in); EAC1_1_CVC cert_ass = cert_in; CHECK(cert_in == cert_cp); CHECK(cert_in == cert_ass); EAC1_1_ADO ado_in(TEST_DATA_DIR "/ado.cvcreq"); //EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.5")); // "german curve" EAC1_1_ADO ado_cp(ado_in); EAC1_1_ADO ado_ass = ado_in; CHECK(ado_in == ado_cp); CHECK(ado_in == ado_ass); EAC1_1_Req req_in(TEST_DATA_DIR "/DE1_flen_chars_cvcRequest_ECDSA.der"); //EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.5")); // "german curve" EAC1_1_Req req_cp(req_in); EAC1_1_Req req_ass = req_in; CHECK(req_in == req_cp); CHECK(req_in == req_ass); } void test_eac_str_illegal_values(RandomNumberGenerator&) { std::cout << "." << std::flush; bool exc = false; try { EAC1_1_CVC(TEST_DATA_DIR "/cvca_illegal_chars.cv.crt"); } catch (Decoding_Error) { exc = true; } CHECK(exc); bool exc2 = false; try { EAC1_1_CVC(TEST_DATA_DIR "/cvca_illegal_chars2.cv.crt"); } catch (Decoding_Error) { exc2 = true; } CHECK(exc2); } void test_tmp_eac_str_enc(RandomNumberGenerator&) { std::cout << "." << std::flush; bool exc = false; try { ASN1_Car("abc!+-µ\n"); } catch (Invalid_Argument) { exc = true; } CHECK(exc); // std::string val = car.iso_8859(); // std::cout << "car 8859 = " << val << std::endl; // std::cout << hex <<(unsigned char)val[1] << std::endl; } void test_cvc_chain(RandomNumberGenerator& rng) { std::cout << "." << std::flush; EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.5")); // "german curve" ECDSA_PrivateKey cvca_privk(rng, dom_pars); std::string hash("SHA-224"); ASN1_Car car("DECVCA00001"); EAC1_1_CVC cvca_cert = DE_EAC::create_cvca(cvca_privk, hash, car, true, true, 12, rng); std::ofstream cvca_file(TEST_DATA_DIR "/cvc_chain_cvca.cer", std::ios::binary); SecureVector cvca_sv = cvca_cert.BER_encode(); cvca_file.write((char*)&cvca_sv[0], cvca_sv.size()); cvca_file.close(); ECDSA_PrivateKey cvca_privk2(rng, dom_pars); ASN1_Car car2("DECVCA00002"); EAC1_1_CVC cvca_cert2 = DE_EAC::create_cvca(cvca_privk2, hash, car2, true, true, 12, rng); EAC1_1_CVC link12 = DE_EAC::link_cvca(cvca_cert, cvca_privk, cvca_cert2, rng); SecureVector link12_sv = link12.BER_encode(); std::ofstream link12_file(TEST_DATA_DIR "/cvc_chain_link12.cer", std::ios::binary); link12_file.write((char*)&link12_sv[0], link12_sv.size()); link12_file.close(); // verify the link CHECK(link12.check_signature(cvca_privk)); EAC1_1_CVC link12_reloaded(TEST_DATA_DIR "/cvc_chain_link12.cer"); EAC1_1_CVC cvca1_reloaded(TEST_DATA_DIR "/cvc_chain_cvca.cer"); std::auto_ptr cvca1_rel_pk(cvca1_reloaded.subject_public_key()); CHECK(link12_reloaded.check_signature(*cvca1_rel_pk)); // create first round dvca-req ECDSA_PrivateKey dvca_priv_key(rng, dom_pars); EAC1_1_Req dvca_req = DE_EAC::create_cvc_req(dvca_priv_key, ASN1_Chr("DEDVCAEPASS"), hash, rng); std::ofstream dvca_file(TEST_DATA_DIR "/cvc_chain_dvca_req.cer", std::ios::binary); SecureVector dvca_sv = dvca_req.BER_encode(); dvca_file.write((char*)&dvca_sv[0], dvca_sv.size()); dvca_file.close(); // sign the dvca_request EAC1_1_CVC dvca_cert1 = DE_EAC::sign_request(cvca_cert, cvca_privk, dvca_req, 1, 5, true, 3, 1, rng); CHECK(dvca_cert1.get_car().iso_8859() == "DECVCA00001"); CHECK(dvca_cert1.get_chr().iso_8859() == "DEDVCAEPASS00001"); helper_write_file(dvca_cert1, TEST_DATA_DIR "/cvc_chain_dvca_cert1.cer"); // make a second round dvca ado request ECDSA_PrivateKey dvca_priv_key2(rng, dom_pars); EAC1_1_Req dvca_req2 = DE_EAC::create_cvc_req(dvca_priv_key2, ASN1_Chr("DEDVCAEPASS"), hash, rng); std::ofstream dvca_file2(TEST_DATA_DIR "/cvc_chain_dvca_req2.cer", std::ios::binary); SecureVector dvca_sv2 = dvca_req2.BER_encode(); dvca_file2.write((char*)&dvca_sv2[0], dvca_sv2.size()); dvca_file2.close(); EAC1_1_ADO dvca_ado2 = CVC_EAC::create_ado_req(dvca_priv_key, dvca_req2, ASN1_Car(dvca_cert1.get_chr().iso_8859()), rng); helper_write_file(dvca_ado2, TEST_DATA_DIR "/cvc_chain_dvca_ado2.cer"); // verify the ado and sign the request too std::auto_ptr ap_pk(dvca_cert1.subject_public_key()); ECDSA_PublicKey* cert_pk = dynamic_cast(ap_pk.get()); //cert_pk->set_domain_parameters(dom_pars); //std::cout << "dvca_cert.public_point.size() = " << ec::EC2OSP(cert_pk->get_public_point(), ec::PointGFp::COMPRESSED).size() << std::endl; EAC1_1_CVC dvca_cert1_reread(TEST_DATA_DIR "/cvc_chain_cvca.cer"); CHECK(dvca_ado2.check_signature(*cert_pk)); CHECK(dvca_ado2.check_signature(dvca_priv_key)); // must also work EAC1_1_Req dvca_req2b = dvca_ado2.get_request(); helper_write_file(dvca_req2b, TEST_DATA_DIR "/cvc_chain_dvca_req2b.cer"); CHECK(helper_files_equal(TEST_DATA_DIR "/cvc_chain_dvca_req2b.cer", TEST_DATA_DIR "/cvc_chain_dvca_req2.cer")); EAC1_1_CVC dvca_cert2 = DE_EAC::sign_request(cvca_cert, cvca_privk, dvca_req2b, 2, 5, true, 3, 1, rng); CHECK(dvca_cert2.get_car().iso_8859() == "DECVCA00001"); CHECK_MESSAGE(dvca_cert2.get_chr().iso_8859() == "DEDVCAEPASS00002", "chr = " << dvca_cert2.get_chr().iso_8859()); // make a first round IS request ECDSA_PrivateKey is_priv_key(rng, dom_pars); EAC1_1_Req is_req = DE_EAC::create_cvc_req(is_priv_key, ASN1_Chr("DEIS"), hash, rng); helper_write_file(is_req, TEST_DATA_DIR "/cvc_chain_is_req.cer"); // sign the IS request //dvca_cert1.set_domain_parameters(dom_pars); EAC1_1_CVC is_cert1 = DE_EAC::sign_request(dvca_cert1, dvca_priv_key, is_req, 1, 5, true, 3, 1, rng); CHECK_MESSAGE(is_cert1.get_car().iso_8859() == "DEDVCAEPASS00001", "car = " << is_cert1.get_car().iso_8859()); CHECK(is_cert1.get_chr().iso_8859() == "DEIS00001"); helper_write_file(is_cert1, TEST_DATA_DIR "/cvc_chain_is_cert.cer"); // verify the signature of the certificate CHECK(is_cert1.check_signature(dvca_priv_key)); } } u32bit do_cvc_tests(Botan::RandomNumberGenerator& rng) { std::cout << "Testing CVC: " << std::flush; test_enc_gen_selfsigned(rng); test_enc_gen_req(rng); test_cvc_req_ext(rng); test_cvc_ado_ext(rng); test_cvc_ado_creation(rng); test_cvc_ado_comparison(rng); test_eac_time(rng); test_ver_cvca(rng); test_copy_and_assignment(rng); test_eac_str_illegal_values(rng); test_tmp_eac_str_enc(rng); test_cvc_chain(rng); std::cout << std::endl; return 0; } #else u32bit do_cvc_tests(Botan::RandomNumberGenerator&) { return 0; } #endif Botan-1.10.12/checks/dolook.cpp0000664000175000017500000001633012654331322016022 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #ifdef BOTAN_HAS_COMPRESSOR_BZIP2 #include #endif #ifdef BOTAN_HAS_COMPRESSOR_GZIP #include #endif #ifdef BOTAN_HAS_COMPRESSOR_ZLIB #include #endif #if defined(BOTAN_HAS_RANDPOOL) #include #endif #if defined(BOTAN_HAS_HMAC_RNG) #include #endif #if defined(BOTAN_HAS_AES) #include #endif #if defined(BOTAN_HAS_DES) #include #endif #if defined(BOTAN_HAS_X931_RNG) #include #endif #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) #include #endif using namespace Botan; #include "common.h" namespace { /* A weird little hack to fit PBKDF algorithms into the validation * suite You probably wouldn't ever want to actually use the PBKDF * algorithms like this, the raw PBKDF interface is more convenient * for actually using them */ class PBKDF_Filter : public Filter { public: std::string name() const { return pbkdf->name(); } void write(const byte in[], size_t len) { passphrase += std::string(reinterpret_cast(in), len); } void end_msg() { SymmetricKey x = pbkdf->derive_key(outlen, passphrase, &salt[0], salt.size(), iterations); send(x.bits_of()); } PBKDF_Filter(PBKDF* algo, const SymmetricKey& s, u32bit o, u32bit i) { pbkdf = algo; outlen = o; iterations = i; salt = s.bits_of(); } ~PBKDF_Filter() { delete pbkdf; } private: std::string passphrase; PBKDF* pbkdf; SecureVector salt; u32bit outlen, iterations; }; /* Not too useful generally; just dumps random bits for benchmarking */ class RNG_Filter : public Filter { public: std::string name() const { return rng->name(); } void write(const byte[], size_t); RNG_Filter(RandomNumberGenerator* r) : rng(r) {} ~RNG_Filter() { delete rng; } private: RandomNumberGenerator* rng; }; class KDF_Filter : public Filter { public: std::string name() const { return "KDF_Filter"; } void write(const byte in[], size_t len) { secret += std::make_pair(in, len); } void end_msg() { SymmetricKey x = kdf->derive_key(outlen, secret, salt); send(x.bits_of(), x.length()); } KDF_Filter(KDF* algo, const SymmetricKey& s, u32bit o) { kdf = algo; outlen = o; salt = s.bits_of(); } ~KDF_Filter() { delete kdf; } private: SecureVector secret; SecureVector salt; KDF* kdf; u32bit outlen; }; Filter* lookup_pbkdf(const std::string& algname, const std::vector& params) { PBKDF* pbkdf = 0; try { pbkdf = get_pbkdf(algname); } catch(...) { } if(pbkdf) return new PBKDF_Filter(pbkdf, params[0], to_u32bit(params[1]), to_u32bit(params[2])); return 0; } void RNG_Filter::write(const byte[], size_t length) { if(length) { send(rng->random_vec(length)); } } Filter* lookup_rng(const std::string& algname, const std::string& key) { RandomNumberGenerator* prng = 0; #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) if(algname == "AutoSeeded") prng = new AutoSeeded_RNG; #endif #if defined(BOTAN_HAS_X931_RNG) #if defined(BOTAN_HAS_DES) if(algname == "X9.31-RNG(TripleDES)") prng = new ANSI_X931_RNG(new TripleDES, new Fixed_Output_RNG(hex_decode(key))); #endif #if defined(BOTAN_HAS_AES) if(algname == "X9.31-RNG(AES-128)") prng = new ANSI_X931_RNG(new AES_128, new Fixed_Output_RNG(hex_decode(key))); else if(algname == "X9.31-RNG(AES-192)") prng = new ANSI_X931_RNG(new AES_192, new Fixed_Output_RNG(hex_decode(key))); else if(algname == "X9.31-RNG(AES-256)") prng = new ANSI_X931_RNG(new AES_256, new Fixed_Output_RNG(hex_decode(key))); #endif #endif #if defined(BOTAN_HAS_RANDPOOL) && defined(BOTAN_HAS_AES) if(algname == "Randpool") { prng = new Randpool(new AES_256, new HMAC(new SHA_256)); prng->add_entropy(reinterpret_cast(key.c_str()), key.length()); } #endif #if defined(BOTAN_HAS_X931_RNG) // these are used for benchmarking: AES-256/SHA-256 matches library // defaults, so benchmark reflects real-world performance (maybe) if(algname == "X9.31-RNG") { RandomNumberGenerator* rng = #if defined(BOTAN_HAS_HMAC_RNG) new HMAC_RNG(new HMAC(new SHA_512), new HMAC(new SHA_256)); #elif defined(BOTAN_HAS_RANDPOOL) new Randpool(new AES_256, new HMAC(new SHA_256)); #endif prng = new ANSI_X931_RNG(new AES_256, rng); } #endif #if defined(BOTAN_HAS_HMAC_RNG) if(algname == "HMAC_RNG") { prng = new HMAC_RNG(new HMAC(new SHA_512), new HMAC(new SHA_256)); } #endif if(prng) { prng->add_entropy(reinterpret_cast(key.c_str()), key.length()); return new RNG_Filter(prng); } return 0; } Filter* lookup_kdf(const std::string& algname, const std::string& salt, const std::string& params) { KDF* kdf = 0; try { kdf = get_kdf(algname); } catch(...) { return 0; } if(kdf) return new KDF_Filter(kdf, salt, to_u32bit(params)); return 0; } Filter* lookup_encoder(const std::string& algname) { if(algname == "Base64_Encode") return new Base64_Encoder; if(algname == "Base64_Decode") return new Base64_Decoder; #ifdef BOTAN_HAS_COMPRESSOR_BZIP2 if(algname == "Bzip_Compression") return new Bzip_Compression(9); if(algname == "Bzip_Decompression") return new Bzip_Decompression; #endif #ifdef BOTAN_HAS_COMPRESSOR_GZIP if(algname == "Gzip_Compression") return new Gzip_Compression(9); if(algname == "Gzip_Decompression") return new Gzip_Decompression; #endif #ifdef BOTAN_HAS_COMPRESSOR_ZLIB if(algname == "Zlib_Compression") return new Zlib_Compression(9); if(algname == "Zlib_Decompression") return new Zlib_Decompression; #endif return 0; } } Filter* lookup(const std::string& algname, const std::vector& params) { std::string key = params[0]; std::string iv = params[1]; Filter* filter = 0; // The order of the lookup has to change based on how the names are // formatted and parsed. filter = lookup_kdf(algname, key, iv); if(filter) return filter; filter = lookup_rng(algname, key); if(filter) return filter; filter = lookup_encoder(algname); if(filter) return filter; filter = lookup_pbkdf(algname, params); if(filter) return filter; return 0; } Botan-1.10.12/checks/ec_tests.cpp0000664000175000017500000007622412654331322016354 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #if defined(BOTAN_HAS_ECC_GROUP) #include #include #include #include #include #include #include using namespace Botan; #include #include #include "getopt.h" #include "validate.h" #include "common.h" #define CHECK_MESSAGE(expr, print) try { if(!(expr)) std::cout << print << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } #define CHECK(expr) try { if(!(expr)) std::cout << #expr << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } namespace { std::ostream& operator<<(std::ostream& out, const PointGFp& point) { out << "(" << point.get_affine_x() << " " << point.get_affine_y() << ")"; return out; } PointGFp create_random_point(RandomNumberGenerator& rng, const CurveGFp& curve) { const BigInt& p = curve.get_p(); Modular_Reducer mod_p(p); while(true) { BigInt x(rng, p.bits()); BigInt x3 = mod_p.multiply(x, mod_p.square(x)); BigInt ax = mod_p.multiply(curve.get_a(), x); BigInt bx3 = mod_p.multiply(curve.get_b(), x3); BigInt y = mod_p.reduce(ax + bx3); if(ressol(y, p) > 0) return PointGFp(curve, x, y); } } void test_point_turn_on_sp_red_mul() { std::cout << "." << std::flush; // setting up expected values BigInt exp_Qx(std::string("466448783855397898016055842232266600516272889280")); BigInt exp_Qy(std::string("1110706324081757720403272427311003102474457754220")); BigInt exp_Qz(1); // performing calculation to test std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_p_secp = hex_decode(p_secp); SecureVector sv_a_secp = hex_decode(a_secp); SecureVector sv_b_secp = hex_decode(b_secp); SecureVector sv_G_secp_comp = hex_decode(G_secp_comp); BigInt bi_p_secp = BigInt::decode(&sv_p_secp[0], sv_p_secp.size()); BigInt bi_a_secp = BigInt::decode(&sv_a_secp[0], sv_a_secp.size()); BigInt bi_b_secp = BigInt::decode(&sv_b_secp[0], sv_b_secp.size()); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP(sv_G_secp_comp, secp160r1); BigInt d("459183204582304"); PointGFp r1 = d * p_G; CHECK(r1.get_affine_x() != 0); PointGFp p_G2(p_G); PointGFp r2 = d * p_G2; CHECK_MESSAGE(r1 == r2, "error with point mul after extra turn on sp red mul"); CHECK(r1.get_affine_x() != 0); PointGFp p_r1 = r1; PointGFp p_r2 = r2; p_r1 *= 2; p_r2 *= 2; CHECK_MESSAGE(p_r1.get_affine_x() == p_r2.get_affine_x(), "error with mult2 after extra turn on sp red mul"); CHECK(p_r1.get_affine_x() != 0); CHECK(p_r2.get_affine_x() != 0); r1 *= 2; r2 *= 2; CHECK_MESSAGE(r1 == r2, "error with mult2 after extra turn on sp red mul"); CHECK_MESSAGE(r1.get_affine_x() == r2.get_affine_x(), "error with mult2 after extra turn on sp red mul"); CHECK(r1.get_affine_x() != 0); r1 += p_G; r2 += p_G2; CHECK_MESSAGE(r1 == r2, "error with op+= after extra turn on sp red mul"); r1 += p_G; r2 += p_G2; CHECK_MESSAGE(r1 == r2, "error with op+= after extra turn on sp red mul for both operands"); r1 += p_G; r2 += p_G2; CHECK_MESSAGE(r1 == r2, "error with op+= after extra turn on sp red mul for both operands"); } void test_coordinates() { std::cout << "." << std::flush; BigInt exp_affine_x(std::string("16984103820118642236896513183038186009872590470")); BigInt exp_affine_y(std::string("1373093393927139016463695321221277758035357890939")); // precalculation std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1 (bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); PointGFp p0 = p_G; PointGFp p1 = p_G * 2; PointGFp point_exp(secp160r1, exp_affine_x, exp_affine_y); if(!point_exp.on_the_curve()) throw Internal_Error("Point not on the curve"); CHECK_MESSAGE( p1.get_affine_x() == exp_affine_x, " p1_x = " << p1.get_affine_x() << "\n" << "exp_x = " << exp_affine_x << "\n"); CHECK_MESSAGE( p1.get_affine_y() == exp_affine_y, " p1_y = " << p1.get_affine_y() << "\n" << "exp_y = " << exp_affine_y << "\n"); } /** Test point multiplication according to -------- SEC 2: Test Vectors for SEC 1 Certicom Research Working Draft September, 1999 Version 0.3; Section 2.1.2 -------- */ void test_point_transformation () { std::cout << "." << std::flush; // get a vailid point EC_Group dom_pars(OID("1.3.132.0.8")); PointGFp p = dom_pars.get_base_point(); // get a copy PointGFp q = p; CHECK_MESSAGE( p.get_affine_x() == q.get_affine_x(), "affine_x changed during copy"); CHECK_MESSAGE( p.get_affine_y() == q.get_affine_y(), "affine_y changed during copy"); } void test_point_mult () { std::cout << "." << std::flush; EC_Group secp160r1(OIDS::lookup("secp160r1")); const CurveGFp& curve = secp160r1.get_curve(); std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_G_secp_comp = hex_decode(G_secp_comp); PointGFp p_G = OS2ECP(sv_G_secp_comp, curve); BigInt d_U("0xaa374ffc3ce144e6b073307972cb6d57b2a4e982"); PointGFp Q_U = d_U * p_G; CHECK(Q_U.get_affine_x() == BigInt("466448783855397898016055842232266600516272889280")); CHECK(Q_U.get_affine_y() == BigInt("1110706324081757720403272427311003102474457754220")); } void test_point_negative() { std::cout << "." << std::flush; // performing calculation to test std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); PointGFp p1 = p_G *= 2; CHECK(p1.get_affine_x() == BigInt("16984103820118642236896513183038186009872590470")); CHECK(p1.get_affine_y() == BigInt("1373093393927139016463695321221277758035357890939")); PointGFp p1_neg = p1.negate(); CHECK(p1_neg.get_affine_x() == BigInt("16984103820118642236896513183038186009872590470")); CHECK(p1_neg.get_affine_y() == BigInt("88408243403763901739989511495005261618427168388")); } void test_zeropoint() { std::cout << "." << std::flush; std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p1(secp160r1, BigInt("16984103820118642236896513183038186009872590470"), BigInt("1373093393927139016463695321221277758035357890939")); if(!p1.on_the_curve()) throw Internal_Error("Point not on the curve"); p1 -= p1; CHECK_MESSAGE( p1.is_zero(), "p - q with q = p is not zero!"); } void test_zeropoint_enc_dec() { std::cout << "." << std::flush; BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); CurveGFp curve(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p(curve); CHECK_MESSAGE( p.is_zero(), "by constructor created zeropoint is no zeropoint!"); SecureVector sv_p = EC2OSP(p, PointGFp::UNCOMPRESSED); PointGFp p_encdec = OS2ECP(sv_p, curve); CHECK_MESSAGE( p == p_encdec, "encoded-decoded (uncompressed) point is not equal the original!"); sv_p = EC2OSP(p, PointGFp::UNCOMPRESSED); p_encdec = OS2ECP(sv_p, curve); CHECK_MESSAGE( p == p_encdec, "encoded-decoded (compressed) point is not equal the original!"); sv_p = EC2OSP(p, PointGFp::HYBRID); p_encdec = OS2ECP(sv_p, curve); CHECK_MESSAGE( p == p_encdec, "encoded-decoded (hybrid) point is not equal the original!"); } void test_calc_with_zeropoint() { std::cout << "." << std::flush; std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp("0xffffffffffffffffffffffffffffffff7fffffff"); BigInt bi_a_secp("0xffffffffffffffffffffffffffffffff7ffffffc"); BigInt bi_b_secp("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); CurveGFp curve(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p(curve, BigInt("16984103820118642236896513183038186009872590470"), BigInt("1373093393927139016463695321221277758035357890939")); if(!p.on_the_curve()) throw Internal_Error("Point not on the curve"); CHECK_MESSAGE( !p.is_zero(), "created is zeropoint, shouldn't be!"); PointGFp zero(curve); CHECK_MESSAGE( zero.is_zero(), "by constructor created zeropoint is no zeropoint!"); PointGFp res = p + zero; CHECK_MESSAGE( res == p, "point + zeropoint is not equal the point"); res = p - zero; CHECK_MESSAGE( res == p, "point - zeropoint is not equal the point"); res = zero * 32432243; CHECK_MESSAGE( res.is_zero(), "zeropoint * skalar is not a zero-point!"); } void test_add_point() { std::cout << "." << std::flush; // precalculation std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); PointGFp p0 = p_G; PointGFp p1 = p_G *= 2; p1 += p0; PointGFp expected(secp160r1, BigInt("704859595002530890444080436569091156047721708633"), BigInt("1147993098458695153857594941635310323215433166682")); CHECK(p1 == expected); } void test_sub_point() { std::cout << "." << std::flush; //Setting up expected values BigInt exp_sub_x(std::string("112913490230515010376958384252467223283065196552")); BigInt exp_sub_y(std::string("143464803917389475471159193867377888720776527730")); BigInt exp_sub_z(std::string("562006223742588575209908669014372619804457947208")); // precalculation std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); PointGFp p0 = p_G; PointGFp p1 = p_G *= 2; p1 -= p0; PointGFp expected(secp160r1, BigInt("425826231723888350446541592701409065913635568770"), BigInt("203520114162904107873991457957346892027982641970")); CHECK(p1 == expected); } void test_mult_point() { std::cout << "." << std::flush; //Setting up expected values BigInt exp_mult_x(std::string("967697346845926834906555988570157345422864716250")); BigInt exp_mult_y(std::string("512319768365374654866290830075237814703869061656")); // precalculation std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); PointGFp p0 = p_G; PointGFp p1 = p_G *= 2; p1 *= p0.get_affine_x(); PointGFp expected(secp160r1, exp_mult_x, exp_mult_y); CHECK(p1 == expected); } void test_basic_operations() { std::cout << "." << std::flush; // precalculation std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffc"; std::string b_secp = "1c97befc54bd7a8b65acf89f81d4d4adc565fa45"; std::string G_secp_comp = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); PointGFp p0 = p_G; PointGFp expected(secp160r1, BigInt("425826231723888350446541592701409065913635568770"), BigInt("203520114162904107873991457957346892027982641970")); CHECK(p0 == expected); PointGFp p1 = p_G *= 2; CHECK(p1.get_affine_x() == BigInt("16984103820118642236896513183038186009872590470")); CHECK(p1.get_affine_y() == BigInt("1373093393927139016463695321221277758035357890939")); PointGFp simplePlus= p1 + p0; PointGFp exp_simplePlus(secp160r1, BigInt("704859595002530890444080436569091156047721708633"), BigInt("1147993098458695153857594941635310323215433166682")); if(simplePlus != exp_simplePlus) std::cout << simplePlus << " != " << exp_simplePlus << "\n"; PointGFp simpleMinus= p1 - p0; PointGFp exp_simpleMinus(secp160r1, BigInt("425826231723888350446541592701409065913635568770"), BigInt("203520114162904107873991457957346892027982641970")); CHECK(simpleMinus == exp_simpleMinus); PointGFp simpleMult= p1 * 123456789; CHECK(simpleMult.get_affine_x() == BigInt("43638877777452195295055270548491599621118743290")); CHECK(simpleMult.get_affine_y() == BigInt("56841378500012376527163928510402662349220202981")); // check that all initial points hasn't changed CHECK(p1.get_affine_x() == BigInt("16984103820118642236896513183038186009872590470")); CHECK(p1.get_affine_y() == BigInt("1373093393927139016463695321221277758035357890939")); CHECK(p0.get_affine_x() == BigInt("425826231723888350446541592701409065913635568770")); CHECK(p0.get_affine_y() == BigInt("203520114162904107873991457957346892027982641970")); } void test_enc_dec_compressed_160() { std::cout << "." << std::flush; // Test for compressed conversion (02/03) 160bit std::string p_secp = "ffffffffffffffffffffffffffffffff7fffffff"; std::string a_secp = "ffffffffffffffffffffffffffffffff7ffffffC"; std::string b_secp = "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45"; std::string G_secp_comp = "024A96B5688EF573284664698968C38BB913CBFC82"; std::string G_order_secp_comp = "0100000000000000000001F4C8F927AED3CA752257"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); SecureVector sv_result = EC2OSP(p_G, PointGFp::COMPRESSED); CHECK( sv_result == sv_G_secp_comp); } void test_enc_dec_compressed_256() { std::cout << "." << std::flush; // Test for compressed conversion (02/03) 256bit std::string p_secp = "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff"; std::string a_secp = "ffffffff00000001000000000000000000000000ffffffffffffffffffffffFC"; std::string b_secp = "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"; std::string G_secp_comp = "036B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"; std::string G_order_secp_comp = "ffffffff00000000ffffffffffffffffBCE6FAADA7179E84F3B9CAC2FC632551"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_comp, secp160r1 ); SecureVector sv_result = EC2OSP(p_G, PointGFp::COMPRESSED); CHECK( sv_result == sv_G_secp_comp); } void test_enc_dec_uncompressed_112() { std::cout << "." << std::flush; // Test for uncompressed conversion (04) 112bit std::string p_secp = "db7c2abf62e35e668076bead208b"; std::string a_secp = "6127C24C05F38A0AAAF65C0EF02C"; std::string b_secp = "51DEF1815DB5ED74FCC34C85D709"; std::string G_secp_uncomp = "044BA30AB5E892B4E1649DD0928643ADCD46F5882E3747DEF36E956E97"; std::string G_order_secp_uncomp = "36DF0AAFD8B8D7597CA10520D04B"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_uncomp = hex_decode ( G_secp_uncomp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_uncomp, secp160r1 ); SecureVector sv_result = EC2OSP(p_G, PointGFp::UNCOMPRESSED); CHECK( sv_result == sv_G_secp_uncomp); } void test_enc_dec_uncompressed_521() { std::cout << "." << std::flush; // Test for uncompressed conversion(04) with big values(521 bit) std::string p_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; std::string a_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFC"; std::string b_secp = "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"; std::string G_secp_uncomp = "0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2ffA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"; std::string G_order_secp_uncomp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_uncomp = hex_decode ( G_secp_uncomp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp160r1(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_uncomp, secp160r1 ); SecureVector sv_result = EC2OSP(p_G, PointGFp::UNCOMPRESSED); std::string result = hex_encode(&sv_result[0], sv_result.size()); std::string exp_result = hex_encode(&sv_G_secp_uncomp[0], sv_G_secp_uncomp.size()); CHECK_MESSAGE( sv_result == sv_G_secp_uncomp, "\ncalc. result = " << result << "\nexp. result = " << exp_result << "\n"); } void test_enc_dec_uncompressed_521_prime_too_large() { std::cout << "." << std::flush; // Test for uncompressed conversion(04) with big values(521 bit) std::string p_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; // length increased by "ff" std::string a_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFC"; std::string b_secp = "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"; std::string G_secp_uncomp = "0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2ffA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"; std::string G_order_secp_uncomp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"; SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_uncomp = hex_decode ( G_secp_uncomp ); BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); CurveGFp secp521r1 (bi_p_secp, bi_a_secp, bi_b_secp); std::auto_ptr p_G; bool exc = false; try { p_G = std::auto_ptr(new PointGFp(OS2ECP ( sv_G_secp_uncomp, secp521r1))); if(!p_G->on_the_curve()) throw Internal_Error("Point not on the curve"); } catch (std::exception e) { exc = true; } CHECK_MESSAGE(exc, "attempt of creation of point on curve with too high prime did not throw an exception"); } void test_gfp_store_restore() { std::cout << "." << std::flush; // generate point //EC_Group dom_pars = global_config().get_ec_dompar("1.3.132.0.8"); //EC_Group dom_pars("1.3.132.0.8"); EC_Group dom_pars(OID("1.3.132.0.8")); PointGFp p = dom_pars.get_base_point(); //store point (to std::string) SecureVector sv_mes = EC2OSP(p, PointGFp::COMPRESSED); PointGFp new_p = OS2ECP(sv_mes, dom_pars.get_curve()); CHECK_MESSAGE( p == new_p, "original and restored point are different!"); } // maybe move this test void test_cdc_curve_33() { std::cout << "." << std::flush; std::string G_secp_uncomp = "04081523d03d4f12cd02879dea4bf6a4f3a7df26ed888f10c5b2235a1274c386a2f218300dee6ed217841164533bcdc903f07a096f9fbf4ee95bac098a111f296f5830fe5c35b3e344d5df3a2256985f64fbe6d0edcc4c61d18bef681dd399df3d0194c5a4315e012e0245ecea56365baa9e8be1f7"; SecureVector sv_G_uncomp = hex_decode ( G_secp_uncomp ); BigInt bi_p_secp = BigInt("2117607112719756483104013348936480976596328609518055062007450442679169492999007105354629105748524349829824407773719892437896937279095106809"); BigInt bi_a_secp("0xa377dede6b523333d36c78e9b0eaa3bf48ce93041f6d4fc34014d08f6833807498deedd4290101c5866e8dfb589485d13357b9e78c2d7fbe9fe"); BigInt bi_b_secp("0xa9acf8c8ba617777e248509bcb4717d4db346202bf9e352cd5633731dd92a51b72a4dc3b3d17c823fcc8fbda4da08f25dea89046087342595a7"); CurveGFp curve(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_uncomp, curve); bool exc = false; try { if(!p_G.on_the_curve()) throw Internal_Error("Point not on the curve"); } catch (std::exception) { exc = true; } CHECK(!exc); } void test_more_zeropoint() { std::cout << "." << std::flush; // by Falko std::string G = "024a96b5688ef573284664698968c38bb913cbfc82"; SecureVector sv_G_secp_comp = hex_decode ( G ); BigInt bi_p("0xffffffffffffffffffffffffffffffff7fffffff"); BigInt bi_a("0xffffffffffffffffffffffffffffffff7ffffffc"); BigInt bi_b("0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45"); CurveGFp curve(bi_p, bi_a, bi_b); PointGFp p1(curve, BigInt("16984103820118642236896513183038186009872590470"), BigInt("1373093393927139016463695321221277758035357890939")); if(!p1.on_the_curve()) throw Internal_Error("Point not on the curve"); PointGFp minus_p1 = -p1; if(!minus_p1.on_the_curve()) throw Internal_Error("Point not on the curve"); PointGFp shouldBeZero = p1 + minus_p1; if(!shouldBeZero.on_the_curve()) throw Internal_Error("Point not on the curve"); BigInt y1 = p1.get_affine_y(); y1 = curve.get_p() - y1; CHECK_MESSAGE(p1.get_affine_x() == minus_p1.get_affine_x(), "problem with minus_p1 : x"); CHECK_MESSAGE(minus_p1.get_affine_y() == y1, "problem with minus_p1 : y"); PointGFp zero(curve); if(!zero.on_the_curve()) throw Internal_Error("Point not on the curve"); CHECK_MESSAGE(p1 + zero == p1, "addition of zero modified point"); CHECK_MESSAGE( shouldBeZero.is_zero(), "p - q with q = p is not zero!"); } void test_mult_by_order() { std::cout << "." << std::flush; // generate point EC_Group dom_pars(OID("1.3.132.0.8")); PointGFp p = dom_pars.get_base_point(); PointGFp shouldBeZero = p * dom_pars.get_order(); CHECK_MESSAGE(shouldBeZero.is_zero(), "G * order != O"); } void test_point_swap(RandomNumberGenerator& rng) { std::cout << "." << std::flush; EC_Group dom_pars(OID("1.3.132.0.8")); PointGFp a(create_random_point(rng, dom_pars.get_curve())); PointGFp b(create_random_point(rng, dom_pars.get_curve())); b *= BigInt(20); PointGFp c(a); PointGFp d(b); d.swap(c); CHECK(a == d); CHECK(b == c); } /** * This test verifies that the side channel attack resistant multiplication function * yields the same result as the normal (insecure) multiplication via operator*= */ void test_mult_sec_mass(RandomNumberGenerator& rng) { EC_Group dom_pars(OID("1.3.132.0.8")); for(int i = 0; i<50; i++) { std::cout << "." << std::flush; std::cout.flush(); PointGFp a(create_random_point(rng, dom_pars.get_curve())); BigInt scal(BigInt(rng, 40)); PointGFp b = a * scal; PointGFp c(a); c *= scal; CHECK(b == c); } } void test_curve_cp_ctor() { std::cout << "." << std::flush; EC_Group dom_pars(OID("1.3.132.0.8")); CurveGFp curve(dom_pars.get_curve()); } size_t test_cve_2016_2195() { EC_Group dom_pars("secp256r1"); CurveGFp curve(dom_pars.get_curve()); size_t fail = 0; const BigInt p = curve.get_p(); try { PointGFp point(curve, p, p - 1); std::cout << "Accepted PointGFp x == p\n"; ++fail; } catch(...) {} try { PointGFp point(curve, p + 1, p - 1); std::cout << "Accepted PointGFp x > p\n"; ++fail; } catch(...) {} try { PointGFp point(curve, p - 1, p); std::cout << "Accepted PointGFp y == p\n"; ++fail; } catch(...) {} try { PointGFp point(curve, p - 1, p + 1); std::cout << "Accepted PointGFp y > p\n"; ++fail; } catch(...) {} // this is allowed (though not on the curve) PointGFp point(curve, p - 1, p - 1); return fail; } } void do_ec_tests(RandomNumberGenerator& rng) { std::cout << "Testing ECC: " << std::flush; test_point_turn_on_sp_red_mul(); test_coordinates(); test_point_transformation (); test_point_mult (); test_point_negative(); test_zeropoint(); test_zeropoint_enc_dec(); test_calc_with_zeropoint(); test_add_point(); test_sub_point(); test_mult_point(); test_basic_operations(); test_enc_dec_compressed_160(); test_enc_dec_compressed_256(); test_enc_dec_uncompressed_112(); test_enc_dec_uncompressed_521(); test_enc_dec_uncompressed_521_prime_too_large(); test_gfp_store_restore(); test_cdc_curve_33(); test_more_zeropoint(); test_mult_by_order(); test_point_swap(rng); test_mult_sec_mass(rng); test_curve_cp_ctor(); test_cve_2016_2195(); std::cout << std::endl; } #else void do_ec_tests(Botan::RandomNumberGenerator& rng) { } #endif Botan-1.10.12/checks/ecc_testdata/CSCA.CSCA.csca-germany.1.crt0000664000175000017500000000153612654331322023116 0ustar jackjack000000000000000Z00 *H=0P1 0 UDE1 0 U bund1 0 U bsi1 0 U456710U csca-germany0 070719152718Z 280119151800Z0P1 0 UDE1 0 U bund1 0 U bsi1 0 U456710U csca-germany00*H=00(*H=4&Cf*0%uׇWډ~0<h,l)S QN*ذ*YҟC%!5f۳r8l@ 9 ),~\4#}ƌLLn}XVrro$ƸNͬ$5Kʣv4&Cf*0%uKm޼:6JKP*hU Zo^^H9_ |V`~u~Ɉl"ƴL+sN cAy8dt)8/b;Botan-1.10.12/checks/ecc_testdata/CSCA.CSCA.csca-germany.1.pem0000664000175000017500000000231012654331322023076 0ustar jackjack00000000000000-----BEGIN CERTIFICATE----- MIIDWjCCAwWgAwIBAgIBATAMBggqhkjOPQQDAQUAMFAxCzAJBgNVBAYTAkRFMQ0w CwYDVQQKDARidW5kMQwwCgYDVQQLDANic2kxDTALBgNVBAUTBDQ1NjcxFTATBgNV BAMMDGNzY2EtZ2VybWFueTAeFw0wNzA3MTkxNTI3MThaFw0yODAxMTkxNTE4MDBa MFAxCzAJBgNVBAYTAkRFMQ0wCwYDVQQKDARidW5kMQwwCgYDVQQLDANic2kxDTAL BgNVBAUTBDQ1NjcxFTATBgNVBAMMDGNzY2EtZ2VybWFueTCCARMwgdQGByqGSM49 AgEwgcgCAQEwKAYHKoZIzj0BAQIdANfBNKomQ2aGKhgwJXXR14ewnwdXl9qJ9X7I wP8wPAQcaKXmLKnObBwpmAOmwVMLUU4YKtiwBCpZytKfQwQcJYD2PM/kQTiHBxOx qSNp4z4hNdJm27NyOGxACwQ5BA2QKa0sflz0NAgjsqh9xoyeTOMXTB5u/e4SwH1Y qlb3csBybyTGuJ5OzawkNUuemcqj9tN2FALNAh0A18E0qiZDZoYqGDAlddD7mNEW vEtt3ryjpaeTnwIBAQM6AAQBNkpLDwEC6VAqudxoVdkLBlpvXl5IOV+DCdV8Eauv 8hdWYH72dX7JiGyiItg8oEsamfpDxam84aOCARAwggEMMDYGA1UdEQQvMC2BGGNz Y2EtZ2VybWFueUBic2kuYnVuZC5kZYYRZmF4Ois0OTIyODk1ODI3MjIwDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQAlkUt5Yj5ZsTM3xYd0fP1NBtx5zAfBgNVHSME GDAWgBQAlkUt5Yj5ZsTM3xYd0fP1NBtx5zBBBgNVHSAEOjA4MDYGCQQAfwAHAwEB ATApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmJzaS5idW5kLmRlL2NzY2EwEgYD VR0TAQH/BAgwBgEB/wIBADArBgNVHRAEJDAigA8yMDA3MDcxOTE1MjcxOFqBDzIw MjcxMTE5MTUxODAwWjAMBggqhkjOPQQDAQUAA0EAMD4CHQDGtB6DAhf9TJO1np4r E3NOCcGC+mP67kEVqO3VAh0A0nk42gG4lRqQZKG2lq7fGBt0logpwTjw6y9iOw== -----END CERTIFICATE----- Botan-1.10.12/checks/ecc_testdata/DE1_flen_chars_cvcRequest_ECDSA.der0000664000175000017500000000023612654331322025004 0ustar jackjack00000000000000!N\_)IG 9N¼;b?o\N%# \y䤝Zж%ի:qyYgɷ_ DE1"* #~ _78ˍRj{La0 nD?cX B L6YnmB!Botan-1.10.12/checks/ecc_testdata/Lidia.cer0000664000175000017500000000173112654331322020166 0ustar jackjack0000000000000000>0  *H 0J1 0 UDE10U TU Darmstadt1 0 U CDC10U LiDIA CA 1:PN0 040705143435Z 090705143034Z0J1 0 UDE10U TU Darmstadt1 0 U CDC10U LiDIA CA 1:PN00  *H 0> @a8q`!Y#YktKQCY4]%Q|Ьۅ˹ax1"!@)?@.O?^z_}QuQ7UԙC @00U0qU j0h0f +m0W0U+Ihttps://www.lidia-ca.cdc.informatik.tu-darmstadt.de/Anmeldung/x509v3.html0U00ܠ٠ֆldap://lidia-ca.cdc.informatik.tu-darmstadt.de:389/cn=LiDIA-CA%20CRL-Signer%201:PN,ou=CDC,o=TU%20Darmstadt,c=DE,dc=LiDIA-CA,dc=lidia-ca,dc=cdc,dc=informatik,dc=tu-darmstadt,dc=de?certificateRevocationList;binary0U00U#0 ln} Y,4ݏ0U ln} Y,4ݏ0  *H DѸY_ my_opt_chr_7`>Ϧj䙅S`Ժ'DdywL-c ,=EDji.U-p人(\Nm >t UP٘74un /p?B my_ado_car_7`/Qq_/.ՋUxCȲ75@1 (37p"=ɏAJV*ꜜdHr/<#){t $Botan-1.10.12/checks/ecc_testdata/ado.cvcreq0000664000175000017500000000035612654331322020423 0ustar jackjack00000000000000g!N\_)IG 9NNZ.e0\+H|zGը|{>>*kw_ DE1"* #~ _78Wd:2\IEIcڿѼX)ִbBDE1"* #~ 00010_78B: 4oqhHS$a;0G )60a Kk:r]ύy7 Botan-1.10.12/checks/ecc_testdata/cvc_chain_cvca.cer0000664000175000017500000000061012654331322022050 0ustar jackjack00000000000000!NC_)B DECVCA00001I 4&Cf*0%uׇWډ~h,l)S QN*ذ*YҟC%!5f۳r8l@ 9 ),~\4#}ƌLLn}XVrro$ƸNͬ$5Kʣvͅ4&Cf*0%uKm޼9w[D+G^]j {YuOk>b.t՘_ DECVCA00001L S_% _$  _78 bFz?lok?[T(JFPm Z | Botan-1.10.12/checks/ecc_testdata/cvc_chain_dvca_ado2.cer0000664000175000017500000000035612654331322022765 0ustar jackjack00000000000000g!N\_)IG 9=9AE;$ؤA Apܽ3ExQ#_ DEDVCAEPASS_78d,$cOq_AՕtǵ3_ DEIS00001L S_% _$ _78 XԞ:]ΙVC8{ˬ]DIkO(8O@+bBotan-1.10.12/checks/ecc_testdata/cvc_chain_is_req.cer0000664000175000017500000000022712654331322022422 0ustar jackjack00000000000000!NU_)IG 9]Uj¿؏̱gVV>AՕtǵ3_ DEIS_78%!\ %-RA"?X kՠ&H.]uBotan-1.10.12/checks/ecc_testdata/cvc_chain_link12.cer0000664000175000017500000000061012654331322022234 0ustar jackjack00000000000000!NC_)B DECVCA00001I 4&Cf*0%uׇWډ~h,l)S QN*ذ*YҟC%!5f۳r8l@ 9 ),~\4#}ƌLLn}XVrro$ƸNͬ$5Kʣvͅ4&Cf*0%uKm޼9^$Z!ԏKtk[9Pa4ߚhc><`{_ DECVCA00002L S_% _$  _78}p9E:]D(@mG`|Y`(wMS7uF//JN@Botan-1.10.12/checks/ecc_testdata/cvca01.cv.crt0000664000175000017500000000062212654331322020645 0ustar jackjack00000000000000!NM_)BDECVCAEPASS00001I 4&Cf*0%uׇWډ~h,l)S QN*ذ*YҟC%!5f۳r8l@ 9 ),~\4#}ƌLLn}XVrro$ƸNͬ$5Kʣvͅ4&Cf*0%uKm޼9_& ngVuKDr( xV҅{r`䒝aZ|>,S#Ð_ DECVCAEPASS00001L S_%_$_78ix IP:uf -w(`[Q(7t, }e}Botan-1.10.12/checks/ecc_testdata/cvca_illegal_chars.cv.crt0000664000175000017500000000062212654331322023355 0ustar jackjack00000000000000!NM_)BDECVCEPASS00001I 4&Cf*0%uׇWډ~h,l)S QN*ذ*YҟC%!5f۳r8l@ 9 ),~\4#}ƌLLn}XVrro$ƸNͬ$5Kʣvͅ4&Cf*0%uKm޼9_& ngVuKDr( xV҅{r`䒝aZ|>,S#Ð_ DECVCAEPASS00001L S_%_$_78ix IP:uf -w(`[Q(7t, }e}Botan-1.10.12/checks/ecc_testdata/cvca_illegal_chars2.cv.crt0000664000175000017500000000062212654331322023437 0ustar jackjack00000000000000!NM_)BDECVCEPASS00001I 4&Cf*0%uׇWډ~h,l)S QN*ذ*YҟC%!5f۳r8l@ 9 ),~\4#}ƌLLn}XVrro$ƸNͬ$5Kʣvͅ4&Cf*0%uKm޼9_& ngVuKDr( xV҅{r`䒝aZ|>,S#Ð_ DECVCAEPASS00001L S_%_$_78ix IP:uf -w(`[Q(7t, }e}Botan-1.10.12/checks/ecc_testdata/ec_for_flex_mes.sig0000664000175000017500000000021112654331322022264 0ustar jackjack00000000000000MGQCMG+ULXRAhLe+GESTVKd+aT3tn46209cLl9LTxDoj1lz/G9Xlw4QpwuCP1TJnRwNySgIwUu+8u32frzcZ2EhNMRrFcyH9t/8GGdvAlszc4k4TSvMK+Rz+5eZ+6hYX3lEsusCY Botan-1.10.12/checks/ecc_testdata/ec_oid_not_in_reg_private_2.pkcs8.pem0000664000175000017500000000054312654331322025603 0ustar jackjack00000000000000-----BEGIN PRIVATE KEY----- MIHaAgEAMIG0BgcqhkjOPQIBMIGoAgEBMCIGByqGSM49AQECFw4aFhluYAAAAAC8 d5mvQORfIMKCpz8jMDIEFwpp6Dq3yY/XFMent6k68ZVN0TLoYuwCBBcF27ytezfC QvUCsMLrgpmKMPgl7QmshQQvBAegDesPaZK6sjNlLdtcbzMdfScPlwnsBYlNHz+Z VzzAHH+at1C946ahHkssjp4CFw4aFhluYAAAAAC8fxYY2GexW7hkdEGPAgEBBB4w HAIBAQQXBJJ/aqWyXJt0gblb7AjQYjSqWnHULjY= -----END PRIVATE KEY----- Botan-1.10.12/checks/ecc_testdata/flex_cert.crt0000664000175000017500000000063412654331322021137 0ustar jackjack0000000000000000E0 *H=010UTest CA0 071129112207Z 081129112207Z01 0 UTest1 0 UDE00*H=00(*H=4&Cf*0%uׇWډ~0<h,l)S QN*ذ*YҟC%!5f۳r8l@  ),~\4#}ƌLLn}4&Cf*0%uKm޼g'a_I]1%̜r0 *H=@0=JiZ'3.r%lUG[qt%@J(G'A`6>=;4⃽o=">Botan-1.10.12/checks/ecc_testdata/insito_expl_ec.pem0000664000175000017500000000217712654331322022165 0ustar jackjack00000000000000-----BEGIN CERTIFICATE----- MIIDJDCCAqmgAwIBAgIRAMIJXZsHSYcafmLTmEPf5m8wDAYIKoZIzj0EAwEFADA7 MQswCQYDVQQGEwJERTETMBEGA1UEChMKRmxleFNlY3VyZTEXMBUGA1UEAxMOSW5T aVRvIFRlc3QgQ0EwHhcNMDgxMDA5MTg1MzUyWhcNMDkxMDA5MTg1MzUyWjA7MQsw CQYDVQQGEwJERTETMBEGA1UEChMKRmxleFNlY3VyZTEXMBUGA1UEAxMOSW5TaVRv IFRlc3QgQ0EwggGFMIIBTQYHKoZIzj0CATCCAUACAQEwPAYHKoZIzj0BAQIxAIy5 HoKjOG0oD11vflDmQd8VL3EJ7VRWtBKx2hl/txEjrNOnKZAdGnGHRwATMQfsUzBk BDB7w4LGPYwVDDxyCArOBa+gwr6ijk+yJ4cTkWXvupH5D4qlgUpQOtTrBKjH3SLO KCYEMASox90izigmizm1VBbwRHwvt33hB9zSpi6IDqU+62LVfLQ5ApXbyZQ6t4aW +lBMEQRhBB0cZPBoz0X/oqY6gbfBP2uIR6PnfvFP49t/yv4MvRDo6CbgNDbWRqrv h7LiR9SvHoq+HXUg+cKkXLHrjpXP1VJitwsp/uxYZOGcBU/5kSkoDkZGIXeRgRFC ggNBJjxTFQIxAIy5HoKjOG0oD11vflDmQd8VL3EJ7VRWsx8WbmysBCWnzzq2r2t/ wxA7iDIC6QRlZQIBAQMyAAM3OveZo7xFgTJqYZ2C1nydlMMZ6d2KuHgS7Q3+SkbS QGy4k7p87QwpLNRhjSPU/qejXjBcMB0GA1UdDgQWBBTLFJODc8gnNtBMOi5lf9qi bQoStjAOBgNVHQ8BAf8EBAMCAQYwFwYDVR0RBBAwDoEMdGVzdEB0ZXN0LmRlMBIG A1UdEwEB/wQIMAYBAf8CAQgwDAYIKoZIzj0EAwEFAANnADBkAjAIqO6/nN20oxQx maPvFCBdPXgTEfsZt8hc3GPO7nCiRGcdn877NNyO+vPGuffE47QCME3P8WHvuUU8 dcrs9ZP/dAX8rRWZ2pTatGjufkwRThYRanM5UMVycsJ6l5Miw1KCyA== -----END CERTIFICATE----- Botan-1.10.12/checks/ecc_testdata/insito_oid_ec.pem0000664000175000017500000000132112654331322021756 0ustar jackjack00000000000000-----BEGIN CERTIFICATE----- MIIB5zCCAWygAwIBAgIRAKiVxgiRp/wH4oOF+uzoC/EwDAYIKoZIzj0EAwEFADA7 MQswCQYDVQQGEwJERTETMBEGA1UEChMKRmxleFNlY3VyZTEXMBUGA1UEAxMOSW5T aVRvIFRlc3QgQ0EwHhcNMDgxMDA5MTg1MzUyWhcNMDkxMDA5MTg1MzUyWjA7MQsw CQYDVQQGEwJERTETMBEGA1UEChMKRmxleFNlY3VyZTEXMBUGA1UEAxMOSW5TaVRv IFRlc3QgQ0EwSjAUBgcqhkjOPQIBBgkrJAMDAggBAQsDMgACE6zPzVimCycfprq0 rfuJY1kBLJBvClZUkRP0qRBIU9c1pnZcJdoC4Nks3Mwf/QZoo14wXDAdBgNVHQ4E FgQUJBauyO+U5gtgw2LqHCG40qle4+owDgYDVR0PAQH/BAQDAgEGMBcGA1UdEQQQ MA6BDHRlc3RAdGVzdC5kZTASBgNVHRMBAf8ECDAGAQH/AgEIMAwGCCqGSM49BAMB BQADZwAwZAIwMtaUw+Hqnm5hB1T1zIc9OEb3VvUAuWFhppbRO87Yo2UZBc/mSVf2 7KHGSRBBJBZ3AjB9KJIaRCacFYOb8aENOgDHlwwtAdQKrjPH1bEVdotmQePS2hIv DNGNLlqllCnQWvU= -----END CERTIFICATE----- Botan-1.10.12/checks/ecc_testdata/link_SHA1.166.crt0000664000175000017500000000153212654331322021206 0ustar jackjack000000000000000V00 *H=0P1 0 UDE1 0 U bund1 0 U bsi1 0 U111110U csca-germany0 070718113047Z 260118102809Z0O1 0 UDE1 0 U bund1 0 U bsi1 0 U88810U csca-germany00*H=00(*H=4&Cf*0%uׇWډ~0< "3L S{Ac3qEqLeb)IQ"J\#}u.kw2".4&Cf*0%uVз~j:ѵulx!D1x1얫|zŞ1*UHw>LS|*#o0Q0 06U/0-csca-germany@bsi.bund.defax:+4922895827220U0U(-ړ` j[0U#0ؼvEMS.Q+0AU :0806 0)0'+http://www.bsi.bund.de/csca0U00+U$0"20070718113047Z20271118102809Z0 *H=?0<Hwu$d*l:vŴ`6vCۭ/CWqBotan-1.10.12/checks/ecc_testdata/link_SHA256.cer0000664000175000017500000000337612654331322021040 0ustar jackjack000000000000000{00 *H=0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0 080220102116Z 280820101014Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U610U csca-germany030*H=00,*H=!Wۡ>f rn;#& ( HnSw0D }Z u,0Wu0AzU&\lJKD0 &\lJKD0ٻ|)\kAҮ~W,KH/'#:DS2bT~5FawE-T\T/i!Wۡ>f q9zaHVBg(肁T3 qdc [5Zϋwjrrҋ%MLگʊ0 06U/0-csca-germany@bsi.bund.defax:+4922895827220U0UK}{k$0U#0dIBڙ~b 30AU :0806 0)0'+http://www.bsi.bund.de/csca0U00+U$0"20080220102116Z20280620001014Z0 *H=H0E!.%œW65!C{aȁs~r Cfrp:}v9[jy{P.0{00 *H=0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0 080220102116Z 280820101014Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U610U csca-germany030*H=00,*H=!Wۡ>f rn;#& ( HnSw0D }Z u,0Wu0AzU&\lJKD0 &\lJKD0ٻ|)\kAҮ~W,KH/'#:DS2bT~5FawE-T\T/i!Wۡ>f q9zaHVBg(肁T3 qdc [5Zϋwjrrҋ%MLگʊ0 06U/0-csca-germany@bsi.bund.defax:+4922895827220U0UK}{k$0U#0dIBڙ~b 30AU :0806 0)0'+http://www.bsi.bund.de/csca0U00+U$0"20080220102116Z20280620001014Z0 *H=H0E!.%œW65!C{aȁs~r Cfrp:}v9[jy{P.Botan-1.10.12/checks/ecc_testdata/my_cv_cert.ber0000664000175000017500000000043612654331322021276 0ustar jackjack00000000000000!N_)B my_opt_carIo a's܋ yaϣ Fre$Z Nh`T5F?[wMVN|c>2 m+k^‹>g_ my_opt_carL S_%_$_7` *d'{1%!Ŕ23E-cSEx(3(ډO%s mDrW\<S֫Yx@,Na].JDCBotan-1.10.12/checks/ecc_testdata/my_cv_cert2.ber0000664000175000017500000000043612654331322021360 0ustar jackjack00000000000000!N_)B my_opt_carIo a's܋ yaϣ Fre$Z Nh`T5F?[wMVN|c>2 m+k^‹>g_ my_opt_carL S_%_$_7` *d'{1%!Ŕ23E-cSEx(3(ډO%s mDrW\<S֫Yx@,Na].JDCBotan-1.10.12/checks/ecc_testdata/my_cv_req.ber0000664000175000017500000000035612654331322021131 0ustar jackjack00000000000000!N_)Io a)$;Fd4c t/92Z52E.=\CByϘE["T`},/ Ӄk]>DѸY_ my_opt_chr_7`>Ϧj䙅S`Ժ'DdywL-c ,=EDji.U-p人(\Nm >t UP٘74un /p?Botan-1.10.12/checks/ecc_testdata/nodompar_private.pkcs8.pem0000664000175000017500000000126412654331322023555 0ustar jackjack00000000000000-----BEGIN PRIVATE KEY----- MIIB0QIBADCCAYcGByqGSM49AgEwggF6AgEBMEUGByqGSM49AQECOgthcsnViAAA AAAAAAAAAAAAAAAAAAAAAAAAAEdshQ7mkmMLkJZUVU4Ol915g3uKHPNUo9AwD+x4 7PkweAQ6Cjd97ea1IzM9NseOmw6qO/SM6TBB9tT8NAFNCPaDOAdJje7dQpAQHFhm 6N+1iUhdEzV7nnjC1/vp/gQ6CprPjIumF3d+JIUJvLRxfU2zRiAr+eNSzVYzcx3Z KlG3Kk3Ds9F8gj/Mj72k2gjyXeqJBGCHNCWVpwR1BAgVI9A9TxLNAoed6kv2pPOn 3ybtiI8QxbIjWhJ0w4ai8hgwDe5u0heEEWRTO83JA/B6CW+fv07pW6wJihEfKW9Y MP5cNbPjRNXfOiJWmF9k++bQ7cxMYdGL72gd05nfPQGUxaQxXgEuAkXs6lY2W6qe i+H3AjoLYXLJ1YgAAAAAAAAAAAAAAAAAAAAAAAAAAABHbIeQSOXYXqco7S6hwduS xOT5ZSNk/c26d1X6bDYvAgEBBEEwPwIBAQQ6CQZ+cOjNmFKHK7JoXGdAPByb7XfI kTIoUEiQxOiDRUH9pUqf0lpcCHhjtTb9hQZ1RGYrjqsccdL6ng== -----END PRIVATE KEY----- Botan-1.10.12/checks/ecc_testdata/private.pem0000664000175000017500000000112712654331322020625 0ustar jackjack00000000000000-----BEGIN PRIVATE KEY----- MIIBjQIBADCCAU0GByqGSM49AgEwggFAAgEBMDwGByqGSM49AQECMQCMuR6Cozht KA9db35Q5kHfFS9xCe1UVrQSsdoZf7cRI6zTpymQHRpxh0cAEzEH7FMwZAQwe8OC xj2MFQw8cggKzgWvoMK+oo5PsieHE5Fl77qR+Q+KpYFKUDrU6wSox90izigmBDAE qMfdIs4oJos5tVQW8ER8L7d94Qfc0qYuiA6lPuti1Xy0OQKV28mUOreGlvpQTBEE YQQdHGTwaM9F/6KmOoG3wT9riEej537xT+Pbf8r+DL0Q6Ogm4DQ21kaq74ey4kfU rx6Kvh11IPnCpFyx646Vz9VSYrcLKf7sWGThnAVP+ZEpKA5GRiF3kYERQoIDQSY8 UxUCMQCMuR6CozhtKA9db35Q5kHfFS9xCe1UVrMfFm5srAQlp886tq9rf8MQO4gy AukEZWUCAQEENzA1AgEBBDB5HVMmAiyXDGqBKoKEHNIk02EMVKKdHqXG6kDInWC/ R4ZVuXK3T8DqJrRX7RHxndk= -----END PRIVATE KEY----- Botan-1.10.12/checks/ecc_testdata/root1_SHA256.cer0000664000175000017500000000337612654331322021147 0ustar jackjack000000000000000{00 *H=0M1 0 UDE1 0 U bund1 0 U bsi1 0U610U csca-germany0 080219162607Z 280819155903Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U610U csca-germany030*H=00,*H=!Wۡ>f rn;#& ( HnSw0D }Z u,0Wu0AzU&\lJKD0 &\lJKD0ٻ|)\kAҮ~W,KH/'#:DS2bT~5FawE-T\T/i!Wۡ>f q9zaHVBg(肁T3 qdc [5Zϋwjrrҋ%MLگʊ0 06U/0-csca-germany@bsi.bund.defax:+4922895827220U0UK}{k$0U#0K}{k$0AU :0806 0)0'+http://www.bsi.bund.de/csca0U00+U$0"20080219162607Z20280619155903Z0 *H=H0E!':ΎyUw|20 Ӂ\Idp 2BL> . EH2SoQn*M)^a0{00 *H=0M1 0 UDE1 0 U bund1 0 U bsi1 0U610U csca-germany0 080219162607Z 280819155903Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U610U csca-germany030*H=00,*H=!Wۡ>f rn;#& ( HnSw0D }Z u,0Wu0AzU&\lJKD0 &\lJKD0ٻ|)\kAҮ~W,KH/'#:DS2bT~5FawE-T\T/i!Wۡ>f q9zaHVBg(肁T3 qdc [5Zϋwjrrҋ%MLگʊ0 06U/0-csca-germany@bsi.bund.defax:+4922895827220U0UK}{k$0U#0K}{k$0AU :0806 0)0'+http://www.bsi.bund.de/csca0U00+U$0"20080219162607Z20280619155903Z0 *H=H0E!':ΎyUw|20 Ӂ\Idp 2BL> . EH2SoQn*M)^aBotan-1.10.12/checks/ecc_testdata/root2_SHA256.cer0000664000175000017500000000337612654331322021150 0ustar jackjack000000000000000{00 *H=0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0 080220093442Z 280820225031Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany030*H=00,*H=!Wۡ>f rn;#& ( HnSw0D }Z u,0Wu0AzU&\lJKD0 &\lJKD0ٻ|)\kAҮ~W,KH/'#:DS2bT~5FawE-T\T/i!Wۡ>f q9zaHVBWq>D\R.864`ebd b0Y(e FatHV.0 06U/0-csca-germany@bsi.bund.defax:+4922895827220U0UdIBڙ~b 30U#0dIBڙ~b 30AU :0806 0)0'+http://www.bsi.bund.de/csca0U00+U$0"20080220093442Z20280620225031Z0 *H=H0E!KYA$C|hK Eqs Sz8=T 2m t$jn0{00 *H=0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0 080220093442Z 280820225031Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany030*H=00,*H=!Wۡ>f rn;#& ( HnSw0D }Z u,0Wu0AzU&\lJKD0 &\lJKD0ٻ|)\kAҮ~W,KH/'#:DS2bT~5FawE-T\T/i!Wۡ>f q9zaHVBWq>D\R.864`ebd b0Y(e FatHV.0 06U/0-csca-germany@bsi.bund.defax:+4922895827220U0UdIBڙ~b 30U#0dIBڙ~b 30AU :0806 0)0'+http://www.bsi.bund.de/csca0U00+U$0"20080220093442Z20280620225031Z0 *H=H0E!KYA$C|hK Eqs Sz8=T 2m t$jnBotan-1.10.12/checks/ecc_testdata/root_SHA1.163.crt0000664000175000017500000000153412654331322021233 0ustar jackjack000000000000000X00 *H=0P1 0 UDE1 0 U bund1 0 U bsi1 0 U111110U csca-germany0 070717105430Z 280117094335Z0P1 0 UDE1 0 U bund1 0 U bsi1 0 U111110U csca-germany00*H=00(*H=4&Cf*0%uׇWډ~0< "3L S{Ac3qEqLeb)IQ"J\#}u.kw2".4&Cf*0%uVз~j:]O-g&\*X4H ob%Nvq?Pywb\a|壂0 06U/0-csca-germany@bsi.bund.defax:+4922895827220U0UؼvEMS.Q+0U#0ؼvEMS.Q+0AU :0806 0)0'+http://www.bsi.bund.de/csca0U00+U$0"20070717105430Z20271117094335Z0 *H=@0=̩mas[{l:wy%aC$C >yăŨǕ aBotan-1.10.12/checks/ecc_testdata/withdompar_private.pkcs8.pem0000664000175000017500000000027512654331322024115 0ustar jackjack00000000000000-----BEGIN PRIVATE KEY----- MGACAQAwGAYHKoZIzj0CAQYNKwYBBAHAbQMBAgkAIQRBMD8CAQEEOgG97/hDkXbJ tgF36JmM7NliJIlDFzTm69KYouwhjPOsh6hKo5NPTtsmHafplOqpUf0TyAhB1Q88 3xA= -----END PRIVATE KEY----- Botan-1.10.12/checks/ecc_testdata/x509_req_test_expl.pem0000664000175000017500000000216712654331322022623 0ustar jackjack00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIDFDCCApgCAQAwaTELMAkGA1UEBhMCREUxCzAJBgNVBAgTAk1EMRIwEAYDVQQH EwlCYWx0aW1vcmUxEzARBgNVBAoTCkZsZXhTZWN1cmUxEDAOBgNVBAsTB1Rlc3Rp bmcxEjAQBgNVBAMUCXRlc3RfemVydDCCAYUwggFNBgcqhkjOPQIBMIIBQAIBATA8 BgcqhkjOPQEBAjEAjLkegqM4bSgPXW9+UOZB3xUvcQntVFa0ErHaGX+3ESOs06cp kB0acYdHABMxB+xTMGQEMHvDgsY9jBUMPHIICs4Fr6DCvqKOT7InhxORZe+6kfkP iqWBSlA61OsEqMfdIs4oJgQwBKjH3SLOKCaLObVUFvBEfC+3feEH3NKmLogOpT7r YtV8tDkCldvJlDq3hpb6UEwRBGEEHRxk8GjPRf+ipjqBt8E/a4hHo+d+8U/j23/K /gy9EOjoJuA0NtZGqu+HsuJH1K8eir4ddSD5wqRcseuOlc/VUmK3Cyn+7Fhk4ZwF T/mRKSgORkYhd5GBEUKCA0EmPFMVAjEAjLkegqM4bSgPXW9+UOZB3xUvcQntVFaz HxZubKwEJafPOrava3/DEDuIMgLpBGVlAgEBAzIAAjv2NeapXSWoiFe/2KBvFS8x lDmexNgl0TK6vgVCDoI2AOVkkJQ9wjqpFsrKG67YlqCBnjArBgkqhkiG9w0BCQcx HhMcYSBmaXhlZCBjaGFsbGVuZ2UgcGFzc3BocmFzZTBvBgkqhkiG9w0BCQ4xYjBg MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgbAMCcGA1UdJQQgMB4GCCsGAQUF BwMCBggrBgEFBQcDBwYIKwYBBQUHAwQwFwYDVR0RBBAwDoEMdGVzdEB0ZXN0LmRl MAwGCCqGSM49BAMBBQADaAAwZQIxAIOkl6jVpL8C2V6zpUqnLQEMC+T8ocxKGxnm +0ZKEgwMCqfD9WJo2C1hZ/1iZPcQmgIwKNMUgDbn16AZZqJCk/2sU0JvqkR0D/Ue FksrSdAxjpnauRDOXMTbzpdsnzAnDNIU -----END CERTIFICATE REQUEST----- Botan-1.10.12/checks/ecc_testdata/x509_req_test_oid.pem0000664000175000017500000000131012654331322022413 0ustar jackjack00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIB1jCCAVsCAQAwaTELMAkGA1UEBhMCREUxCzAJBgNVBAgTAk1EMRIwEAYDVQQH EwlCYWx0aW1vcmUxEzARBgNVBAoTCkZsZXhTZWN1cmUxEDAOBgNVBAsTB1Rlc3Rp bmcxEjAQBgNVBAMUCXRlc3RfemVydDBKMBQGByqGSM49AgEGCSskAwMCCAEBCwMy AAMLt+cMOPYmbgVHwaUFmEJIfYCNpgPyWkIyYHPiY4SF2UC0nTQv7el1+Dpt4Ueo mQGggZ4wKwYJKoZIhvcNAQkHMR4THGEgZml4ZWQgY2hhbGxlbmdlIHBhc3NwaHJh c2UwbwYJKoZIhvcNAQkOMWIwYDAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIG wDAnBgNVHSUEIDAeBggrBgEFBQcDAgYIKwYBBQUHAwcGCCsGAQUFBwMEMBcGA1Ud EQQQMA6BDHRlc3RAdGVzdC5kZTAMBggqhkjOPQQDAQUAA2cAMGQCMC4uFJYZ7CUN rqQrCAxJAqWIuZrKvvlHyu+Q6VibIUjwh2guPNJDmbW/iorXcu3yAwIwbOjPSSMD 5XvumhMwuV6kHmn+5DjCPLUQLuLQhNeU06bExcCuutz5DMVix05w7gox -----END CERTIFICATE REQUEST----- Botan-1.10.12/checks/ecc_testdata/x509_test_privkey_expl_pw123456.pem0000664000175000017500000000133512654331322024714 0ustar jackjack00000000000000-----BEGIN ENCRYPTED PRIVATE KEY----- MIIB4TBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIS+GhX0d3oQkCAggA AgEYMBQGCCqGSIb3DQMHBAjSmLY2CqIVlgSCAZicGlQqDD2ZC8Tmnp43tqUnFnMc ZU6RdY5ys1WQ2Blvn5eKhK0n9yz3b9LvIzs9U6shbBPN/GePeOFFZQi0M9+SIrjj NjpjqaJtUvhPt3tDn0B3o0raWLsJ2TvXxO0UNRZYk1YniGEecCUY/shMPpop6Tns 079QXRNuAqGeEcouKIQcJjGR3GbPbccBUUbkAjrK7f4tMTHOzoei3SJ50IcSh1hh vYbyKFBmxi30gYc95T9VO+XsrDLP4QZXrM6S6o8xkbx1o9hHuGeiSiSOpQ/6iVUt nRMR1GW1MZGQeJazdnccx+8C4iuW9LOfyvA7HEC8F0LLZ6mCGtLcMt8Vk+en24nJ od4W0EqJmcasfbF+VNPNuFzwIPvEzgeyYTp5P6wfc81cqlBMfl1AGKFR8u9372UW PWPcsqrGR3OggRcXvRc+9UKtsLoALel8esZrJzNurqkU10XePUR9Vup3Ke7kvT/o g+uA5vboio3Jy2FoJE/YF0jKDJfbzMWJeSetJwLfrKEvsmdpUf9jeUoaze0S4LzB JHJ+NMg= -----END ENCRYPTED PRIVATE KEY----- Botan-1.10.12/checks/ecc_testdata/x509_test_privkey_oid_pw123456.pem0000664000175000017500000000133512654331322024517 0ustar jackjack00000000000000-----BEGIN ENCRYPTED PRIVATE KEY----- MIIB4TBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIJ7F/jO3zVxQCAggA AgEYMBQGCCqGSIb3DQMHBAjBY6p0ZIHowASCAZg/JGcpBr2lh1x9WUI7J/1jCdwn HvJu+aes3+I57MdI75ca7Z5wixO50pYUWkfexfdkm5k11HVz7ETJuNvVw+p937kI EJtX0ukBsdsgcGcoKFCZG1JIhClqyCnx38CIdE1C8TE/7Yyk5YFMeNP9LbMH9jC5 gAJV9+YSpw1F9q6OOXv61s9uKIHq7VWza77CJKjFNLpn1/5FqTISmDXV3V2Rs8eI j7hFMRBpRnEAA+DOgjuEkTMgF7UR39YTTBooUSzUB4kSlRQxeP7HrulboLB0ukO3 CT5qa/kA9lHJgHYZXNjzS5NzsoZeZcU934AEBm7J2vr/voHYU8zPrgRAmz8D25Gf UH4kaQLZ3LDGlbcba8yjlOYd+x5Rl9H6vKORoqAGN0sLPLAryjzs+vS486SUlRiy LsNqcrSOYoW1MyOYAJajxvUsUDqZyxp64TMegZlyLZGIu2ngFOd1gZsh+T2X3g8C Murum3ynFx+H3HF1JwpZB/gImz+BI8JigUnd4fG2gqvx7wu6cqoaRGJQayilj64O AZU+x5c= -----END ENCRYPTED PRIVATE KEY----- Botan-1.10.12/checks/ecdh.cpp0000664000175000017500000000715212654331322015440 0ustar jackjack00000000000000/* * ECDH tests * * (C) 2007 Manuel Hartl (hartl@flexsecure.de) * 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include "validate.h" #include "common.h" #if defined(BOTAN_HAS_ECDH) #include #include #include #include #include #include using namespace Botan; #define CHECK_MESSAGE(expr, print) try { if(!(expr)) std::cout << print << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } #define CHECK(expr) try { if(!(expr)) std::cout << #expr << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } namespace { void test_ecdh_normal_derivation(RandomNumberGenerator& rng) { std::cout << "." << std::flush; EC_Group dom_pars(OID("1.3.132.0.8")); ECDH_PrivateKey private_a(rng, dom_pars); ECDH_PrivateKey private_b(rng, dom_pars); //public_a.getCurve() PK_Key_Agreement ka(private_a, "KDF2(SHA-1)"); PK_Key_Agreement kb(private_b, "KDF2(SHA-1)"); SymmetricKey alice_key = ka.derive_key(32, private_b.public_value()); SymmetricKey bob_key = kb.derive_key(32, private_a.public_value()); if(alice_key != bob_key) { std::cout << "The two keys didn't match!\n"; std::cout << "Alice's key was: " << alice_key.as_string() << "\n"; std::cout << "Bob's key was: " << bob_key.as_string() << "\n"; } } void test_ecdh_some_dp(RandomNumberGenerator& rng) { std::vector oids; oids.push_back("1.2.840.10045.3.1.7"); oids.push_back("1.3.132.0.8"); oids.push_back("1.2.840.10045.3.1.1"); for(u32bit i = 0; i< oids.size(); i++) { std::cout << "." << std::flush; OID oid(oids[i]); EC_Group dom_pars(oid); ECDH_PrivateKey private_a(rng, dom_pars); ECDH_PrivateKey private_b(rng, dom_pars); PK_Key_Agreement ka(private_a, "KDF2(SHA-1)"); PK_Key_Agreement kb(private_b, "KDF2(SHA-1)"); SymmetricKey alice_key = ka.derive_key(32, private_b.public_value()); SymmetricKey bob_key = kb.derive_key(32, private_a.public_value()); CHECK_MESSAGE(alice_key == bob_key, "different keys - " << "Alice's key was: " << alice_key.as_string() << ", Bob's key was: " << bob_key.as_string()); } } void test_ecdh_der_derivation(RandomNumberGenerator& rng) { std::vector oids; oids.push_back("1.2.840.10045.3.1.7"); oids.push_back("1.3.132.0.8"); oids.push_back("1.2.840.10045.3.1.1"); for(u32bit i = 0; i< oids.size(); i++) { OID oid(oids[i]); EC_Group dom_pars(oid); ECDH_PrivateKey private_a(rng, dom_pars); ECDH_PrivateKey private_b(rng, dom_pars); MemoryVector key_a = private_a.public_value(); MemoryVector key_b = private_b.public_value(); PK_Key_Agreement ka(private_a, "KDF2(SHA-1)"); PK_Key_Agreement kb(private_b, "KDF2(SHA-1)"); SymmetricKey alice_key = ka.derive_key(32, key_b); SymmetricKey bob_key = kb.derive_key(32, key_a); CHECK_MESSAGE(alice_key == bob_key, "different keys - " << "Alice's key was: " << alice_key.as_string() << ", Bob's key was: " << bob_key.as_string()); //cout << "key: " << alice_key.as_string() << endl; } } } u32bit do_ecdh_tests(RandomNumberGenerator& rng) { std::cout << "Testing ECDH (InSiTo unit tests): "; test_ecdh_normal_derivation(rng); test_ecdh_some_dp(rng); test_ecdh_der_derivation(rng); std::cout << std::endl; return 0; } #else u32bit do_ecdh_tests(RandomNumberGenerator&) { return 0; } #endif Botan-1.10.12/checks/ecdsa.cpp0000664000175000017500000003626212654331322015620 0ustar jackjack00000000000000/****************************************************** * ECDSA tests * * * * (C) 2007 Falko Strenzke * * Manuel Hartl * * 2008 Jack Lloyd * ******************************************************/ #include "validate.h" #if defined(BOTAN_HAS_ECDSA) #include #include #include #include #include #include #include #include #include #include "common.h" using namespace Botan; #define TEST_DATA_DIR "checks/ecc_testdata" #define CHECK_MESSAGE(expr, print) try { if(!(expr)) std::cout << print << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } #define CHECK(expr) try { if(!(expr)) std::cout << #expr << "\n"; } catch(std::exception& e) { std::cout << __FUNCTION__ << ": " << e.what() << "\n"; } namespace { std::string to_hex(const SecureVector& bin) { return hex_encode(&bin[0], bin.size()); } /** * Tests whether the the signing routine will work correctly in case * the integer e that is constructed from the message (thus the hash * value) is larger than n, the order of the base point. Tests the * signing function of the pk signer object */ void test_hash_larger_than_n(RandomNumberGenerator& rng) { std::cout << "." << std::flush; EC_Group dom_pars(OID("1.3.132.0.8")); // secp160r1 // n = 0x0100000000000000000001f4c8f927aed3ca752257 (21 bytes) // -> shouldn't work with SHA224 which outputs 28 bytes ECDSA_PrivateKey priv_key(rng, dom_pars); SecureVector message(20); for(size_t i = 0; i != message.size(); ++i) message[i] = i; PK_Signer pk_signer_160(priv_key, "EMSA1_BSI(SHA-1)"); PK_Verifier pk_verifier_160(priv_key, "EMSA1_BSI(SHA-1)"); PK_Signer pk_signer_224(priv_key, "EMSA1_BSI(SHA-224)"); // Verify we can sign and verify with SHA-160 SecureVector signature_160 = pk_signer_160.sign_message(message, rng); CHECK(pk_verifier_160.verify_message(message, signature_160)); bool signature_failed = false; try { SecureVector signature_224 = pk_signer_224.sign_message(message, rng); } catch(Encoding_Error) { signature_failed = true; } CHECK(signature_failed); // now check that verification alone fails // sign it with the normal EMSA1 PK_Signer pk_signer(priv_key, "EMSA1(SHA-224)"); SecureVector signature = pk_signer.sign_message(message, rng); PK_Verifier pk_verifier(priv_key, "EMSA1_BSI(SHA-224)"); // verify against EMSA1_BSI if(pk_verifier.verify_message(message, signature)) std::cout << "Corrupt ECDSA signature verified, should not have\n"; } void test_decode_ecdsa_X509() { std::cout << "." << std::flush; X509_Certificate cert(TEST_DATA_DIR "/CSCA.CSCA.csca-germany.1.crt"); CHECK_MESSAGE(OIDS::lookup(cert.signature_algorithm().oid) == "ECDSA/EMSA1(SHA-224)", "error reading signature algorithm from x509 ecdsa certificate"); CHECK_MESSAGE(to_hex(cert.serial_number()) == "01", "error reading serial from x509 ecdsa certificate"); CHECK_MESSAGE(to_hex(cert.authority_key_id()) == "0096452DE588F966C4CCDF161DD1F3F5341B71E7", "error reading authority key id from x509 ecdsa certificate"); CHECK_MESSAGE(to_hex(cert.subject_key_id()) == "0096452DE588F966C4CCDF161DD1F3F5341B71E7", "error reading Subject key id from x509 ecdsa certificate"); std::auto_ptr pubkey(cert.subject_public_key()); bool ver_ec = cert.check_signature(*pubkey); CHECK_MESSAGE(ver_ec, "could not positively verify correct selfsigned x509-ecdsa certificate"); } void test_decode_ver_link_SHA256() { std::cout << "." << std::flush; X509_Certificate root_cert(TEST_DATA_DIR "/root2_SHA256.cer"); X509_Certificate link_cert(TEST_DATA_DIR "/link_SHA256.cer"); std::auto_ptr pubkey(root_cert.subject_public_key()); bool ver_ec = link_cert.check_signature(*pubkey); CHECK_MESSAGE(ver_ec, "could not positively verify correct SHA256 link x509-ecdsa certificate"); } void test_decode_ver_link_SHA1() { std::cout << "." << std::flush; X509_Certificate root_cert(TEST_DATA_DIR "/root_SHA1.163.crt"); X509_Certificate link_cert(TEST_DATA_DIR "/link_SHA1.166.crt"); std::auto_ptr pubkey(root_cert.subject_public_key()); bool ver_ec = link_cert.check_signature(*pubkey); CHECK_MESSAGE(ver_ec, "could not positively verify correct SHA1 link x509-ecdsa certificate"); } void test_sign_then_ver(RandomNumberGenerator& rng) { std::cout << '.' << std::flush; EC_Group dom_pars(OID("1.3.132.0.8")); ECDSA_PrivateKey ecdsa(rng, dom_pars); PK_Signer signer(ecdsa, "EMSA1(SHA-1)"); SecureVector msg = hex_decode("12345678901234567890abcdef12"); SecureVector sig = signer.sign_message(msg, rng); PK_Verifier verifier(ecdsa, "EMSA1(SHA-1)"); bool ok = verifier.verify_message(msg, sig); if(!ok) std::cout << "ERROR: Could not verify ECDSA signature\n"; sig[0]++; ok = verifier.verify_message(msg, sig); if(ok) std::cout << "ERROR: Bogus ECDSA signature verified anyway\n"; } bool test_ec_sign(RandomNumberGenerator& rng) { std::cout << "." << std::flush; try { EC_Group dom_pars(OID("1.3.132.0.8")); ECDSA_PrivateKey priv_key(rng, dom_pars); std::string pem_encoded_key = PKCS8::PEM_encode(priv_key); PK_Signer signer(priv_key, "EMSA1(SHA-224)"); PK_Verifier verifier(priv_key, "EMSA1(SHA-224)"); for(size_t i = 0; i != 256; ++i) signer.update(static_cast(i)); SecureVector sig = signer.signature(rng); for(u32bit i = 0; i != 256; ++i) verifier.update(static_cast(i)); if(!verifier.check_signature(sig)) { std::cout << "ECDSA self-test failed!"; return false; } // now check valid signature, different input for(u32bit i = 1; i != 256; ++i) //starting from 1 verifier.update(static_cast(i)); if(verifier.check_signature(sig)) { std::cout << "ECDSA with bad input passed validation"; return false; } // now check with original input, modified signature sig[sig.size()/2]++; for(u32bit i = 0; i != 256; ++i) verifier.update(static_cast(i)); if(verifier.check_signature(sig)) { std::cout << "ECDSA with bad signature passed validation"; return false; } } catch (std::exception& e) { std::cout << "Exception in test_ec_sign - " << e.what() << "\n"; return false; } return true; } void test_create_pkcs8(RandomNumberGenerator& rng) { std::cout << "." << std::flush; try { RSA_PrivateKey rsa_key(rng, 1024); //RSA_PrivateKey rsa_key2(1024); //cout << "\nequal: " << (rsa_key == rsa_key2) << "\n"; //DSA_PrivateKey key(DL_Group("dsa/jce/1024")); std::ofstream rsa_priv_key(TEST_DATA_DIR "/rsa_private.pkcs8.pem"); rsa_priv_key << PKCS8::PEM_encode(rsa_key); EC_Group dom_pars(OID("1.3.132.0.8")); ECDSA_PrivateKey key(rng, dom_pars); // later used by other tests :( std::ofstream priv_key(TEST_DATA_DIR "/wo_dompar_private.pkcs8.pem"); priv_key << PKCS8::PEM_encode(key); } catch (std::exception& e) { std::cout << "Exception: " << e.what() << std::endl; } } void test_create_and_verify(RandomNumberGenerator& rng) { std::cout << "." << std::flush; EC_Group dom_pars(OID("1.3.132.0.8")); ECDSA_PrivateKey key(rng, dom_pars); std::ofstream priv_key(TEST_DATA_DIR "/dompar_private.pkcs8.pem"); priv_key << PKCS8::PEM_encode(key); std::auto_ptr loaded_key(PKCS8::load_key(TEST_DATA_DIR "/wo_dompar_private.pkcs8.pem", rng)); ECDSA_PrivateKey* loaded_ec_key = dynamic_cast(loaded_key.get()); CHECK_MESSAGE(loaded_ec_key, "the loaded key could not be converted into an ECDSA_PrivateKey"); std::auto_ptr loaded_key_1(PKCS8::load_key(TEST_DATA_DIR "/rsa_private.pkcs8.pem", rng)); ECDSA_PrivateKey* loaded_rsa_key = dynamic_cast(loaded_key_1.get()); CHECK_MESSAGE(!loaded_rsa_key, "the loaded key is ECDSA_PrivateKey -> shouldn't be, is a RSA-Key"); //calc a curve which is not in the registry // string p_secp = "2117607112719756483104013348936480976596328609518055062007450442679169492999007105354629105748524349829824407773719892437896937279095106809"; std::string a_secp = "0a377dede6b523333d36c78e9b0eaa3bf48ce93041f6d4fc34014d08f6833807498deedd4290101c5866e8dfb589485d13357b9e78c2d7fbe9fe"; std::string b_secp = "0a9acf8c8ba617777e248509bcb4717d4db346202bf9e352cd5633731dd92a51b72a4dc3b3d17c823fcc8fbda4da08f25dea89046087342595a7"; std::string G_secp_comp = "04081523d03d4f12cd02879dea4bf6a4f3a7df26ed888f10c5b2235a1274c386a2f218300dee6ed217841164533bcdc903f07a096f9fbf4ee95bac098a111f296f5830fe5c35b3e344d5df3a2256985f64fbe6d0edcc4c61d18bef681dd399df3d0194c5a4315e012e0245ecea56365baa9e8be1f7"; std::string order_g = "0e1a16196e6000000000bc7f1618d867b15bb86474418f"; // ::SecureVector sv_p_secp = hex_decode ( p_secp ); SecureVector sv_a_secp = hex_decode ( a_secp ); SecureVector sv_b_secp = hex_decode ( b_secp ); SecureVector sv_G_secp_comp = hex_decode ( G_secp_comp ); SecureVector sv_order_g = hex_decode ( order_g ); // BigInt bi_p_secp = BigInt::decode ( &sv_p_secp[0], sv_p_secp.size() ); BigInt bi_p_secp("2117607112719756483104013348936480976596328609518055062007450442679169492999007105354629105748524349829824407773719892437896937279095106809"); BigInt bi_a_secp = BigInt::decode ( &sv_a_secp[0], sv_a_secp.size() ); BigInt bi_b_secp = BigInt::decode ( &sv_b_secp[0], sv_b_secp.size() ); BigInt bi_order_g = BigInt::decode ( &sv_order_g[0], sv_order_g.size() ); CurveGFp curve(bi_p_secp, bi_a_secp, bi_b_secp); PointGFp p_G = OS2ECP ( sv_G_secp_comp, curve ); EC_Group dom_params(curve, p_G, bi_order_g, BigInt(1)); if(!p_G.on_the_curve()) throw Internal_Error("Point not on the curve"); ECDSA_PrivateKey key_odd_oid(rng, dom_params); std::string key_odd_oid_str = PKCS8::PEM_encode(key_odd_oid); DataSource_Memory key_data_src(key_odd_oid_str); std::auto_ptr loaded_key2(PKCS8::load_key(key_data_src, rng)); if(!dynamic_cast(loaded_key.get())) { std::cout << "Failed to reload an ECDSA key with unusual parameter set\n"; } } void test_curve_registry(RandomNumberGenerator& rng) { std::vector oids; oids.push_back("1.3.132.0.8"); oids.push_back("1.2.840.10045.3.1.1"); oids.push_back("1.2.840.10045.3.1.2"); oids.push_back("1.2.840.10045.3.1.3"); oids.push_back("1.2.840.10045.3.1.4"); oids.push_back("1.2.840.10045.3.1.5"); oids.push_back("1.2.840.10045.3.1.6"); oids.push_back("1.2.840.10045.3.1.7"); oids.push_back("1.3.132.0.6"); oids.push_back("1.3.132.0.7"); oids.push_back("1.3.132.0.28"); oids.push_back("1.3.132.0.29"); oids.push_back("1.3.132.0.9"); oids.push_back("1.3.132.0.30"); oids.push_back("1.3.132.0.31"); oids.push_back("1.3.132.0.32"); oids.push_back("1.3.132.0.33"); oids.push_back("1.3.132.0.10"); oids.push_back("1.3.132.0.34"); oids.push_back("1.3.132.0.35"); oids.push_back("1.3.6.1.4.1.8301.3.1.2.9.0.38"); oids.push_back("1.3.36.3.3.2.8.1.1.1"); oids.push_back("1.3.36.3.3.2.8.1.1.3"); oids.push_back("1.3.36.3.3.2.8.1.1.5"); oids.push_back("1.3.36.3.3.2.8.1.1.7"); oids.push_back("1.3.36.3.3.2.8.1.1.9"); oids.push_back("1.3.36.3.3.2.8.1.1.11"); oids.push_back("1.3.36.3.3.2.8.1.1.13"); unsigned int i; for (i = 0; i < oids.size(); i++) { std::cout << "." << std::flush; try { OID oid(oids[i]); EC_Group dom_pars(oid); ECDSA_PrivateKey ecdsa(rng, dom_pars); PK_Signer signer(ecdsa, "EMSA1(SHA-1)"); PK_Verifier verifier(ecdsa, "EMSA1(SHA-1)"); SecureVector msg = hex_decode("12345678901234567890abcdef12"); SecureVector sig = signer.sign_message(msg, rng); if(!verifier.verify_message(msg, sig)) std::cout << "Failed testing ECDSA sig for curve " << oids[i] << "\n"; } catch(Invalid_Argument& e) { std::cout << "Error testing curve " << oids[i] << " - " << e.what() << "\n"; } } // std::cout << "test_curve_registry finished" << endl; } void test_read_pkcs8(RandomNumberGenerator& rng) { std::cout << "." << std::flush; SecureVector msg = hex_decode("12345678901234567890abcdef12"); try { std::auto_ptr loaded_key(PKCS8::load_key(TEST_DATA_DIR "/wo_dompar_private.pkcs8.pem", rng)); ECDSA_PrivateKey* ecdsa = dynamic_cast(loaded_key.get()); CHECK_MESSAGE(ecdsa, "the loaded key could not be converted into an ECDSA_PrivateKey"); PK_Signer signer(*ecdsa, "EMSA1(SHA-1)"); SecureVector sig = signer.sign_message(msg, rng); PK_Verifier verifier(*ecdsa, "EMSA1(SHA-1)"); CHECK_MESSAGE(verifier.verify_message(msg, sig), "generated sig could not be verified positively"); } catch (std::exception& e) { std::cout << "Exception in test_read_pkcs8 - " << e.what() << "\n"; } try { std::auto_ptr loaded_key_nodp(PKCS8::load_key(TEST_DATA_DIR "/nodompar_private.pkcs8.pem", rng)); // anew in each test with unregistered domain-parameters ECDSA_PrivateKey* ecdsa_nodp = dynamic_cast(loaded_key_nodp.get()); CHECK_MESSAGE(ecdsa_nodp, "the loaded key could not be converted into an ECDSA_PrivateKey"); PK_Signer signer(*ecdsa_nodp, "EMSA1(SHA-1)"); PK_Verifier verifier(*ecdsa_nodp, "EMSA1(SHA-1)"); SecureVector signature_nodp = signer.sign_message(msg, rng); CHECK_MESSAGE(verifier.verify_message(msg, signature_nodp), "generated signature could not be verified positively (no_dom)"); try { std::auto_ptr loaded_key_withdp( PKCS8::load_key(TEST_DATA_DIR "/withdompar_private.pkcs8.pem", rng)); std::cout << "Unexpected success: loaded key with unknown OID\n"; } catch (std::exception) { /* OK */ } } catch (std::exception& e) { std::cout << "Exception in test_read_pkcs8 - " << e.what() << "\n"; } } } u32bit do_ecdsa_tests(Botan::RandomNumberGenerator& rng) { std::cout << "Testing ECDSA (InSiTo unit tests): "; test_hash_larger_than_n(rng); test_decode_ecdsa_X509(); test_decode_ver_link_SHA256(); test_decode_ver_link_SHA1(); test_sign_then_ver(rng); test_ec_sign(rng); test_create_pkcs8(rng); test_create_and_verify(rng); test_curve_registry(rng); test_read_pkcs8(rng); std::cout << std::endl; return 0; } #else u32bit do_ecdsa_tests(Botan::RandomNumberGenerator&) { return 0; } #endif Botan-1.10.12/checks/fail.dat0000664000175000017500000000600312654331322015430 0ustar jackjack00000000000000# Botan validation file: expected failures # Each sequence in here should induce an exception on the part of the # filter, or produce the wrong output, or something like that. # This needs a lot more work # MARKER: Block Ciphers [Blowfish] 0000000000000000:245946885754369B: 0000000000000000:245946885754369B:AA 0000000000000000:24594688575436:AA 00000000000000:24594688575436: 0000000000000000:245946885754369B:\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0000000000000000:245946885754369B:\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA [CAST5] 0123456789ABCDEF:238B4FE5847E44B2:0123456712 # MARKER: Hash Functions [SHA-1] A9:19DA91F2603889267DFD77786E07A5B8F067D6 A8:19DA91F2603889267DFD77786E07A5B8F067D62A # MARKER: Cipher Modes (Encryption) [DES/CBC/CTS] 9F8789F30E3ED728:48C597491E0C3C1706:9076D5A743FC9721:A9A6C2AD38E682C1 9F8789F30E3ED72800:48C597491E0C3C1706:9076D5A743FC9721:A9A6C2AD38E682 9F8789F30E3ED72800:48C597491E0C3C1706:76D5A743FC9721:A9A6C2AD38E682 # MARKER: Cipher Modes (Decryption) [DES/CBC/PKCS7] E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF276:\ 4E6F77206973207468652074696D6520666F7220616C6C20:\ 0123456789ABCDEF:1234567890ABCDEF E5C7CDDE872BF27C43E934008C389C0788499A7C05F662C16A27E4FCF276:\ 4E6F77206973207468652074696D6520666F7220616C6C20:\ 0123456789ABCDEF:1234567890ABCDEF E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF276:\ 4E6F77206973207468652074696D6520666F7220616C6C20:\ 1123456789ABCDEF:1234567890ABCDEF E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF276:\ 4E6F77206973207468652074696D6520666F7220616C6C20:\ 0123456789ABCDEF:1234567890ABCDEE 1D2FECD6F0F733F1:AA:DC3A72A9BA8138EC:67E51C4F8403BF6F D90246C39C191E98:AA:45AAF3A76E729062:53C1F28656B05986 [DES/CBC/OneAndZeros] 28582FD8797D3DB5:AA:D404FD15970CB207:88269176E292DE0A A2C23F6A496C7BE9:AA:829E7BE8C8A9B326:106E9D2E19FE874D [DES/CBC/CTS] 1F807F8FB9678124B8:9E1CA14BE6538A35DB:88B23AFD0683D337:BAC170D943D262CE [DES/CFB(1)] 105EFAA6251E7659:C5A1343F4AC4DD7B:C42B0F47482DABA0:48848E073CF89946 105EFAA6251E7659:C5A1343F4AC4DD7B:C42B0F47482DABA0:48848E073CF899 [Base64_Decode] 3D514D3E:31 [Bzip_Compress ] 64484953204953204120425A49503220544553540A:\ 525A6839314159265359FDAED210000009DE0000104000100032604C1020\ 0021A4D1EA0FD2840D03401E19B4D4B254EE89F177245385090FDAED2105 [Bzip_Decompress ] 523A683917724538509000000110: 425A6839314159265359FDAED210000009DE0000104000100032604C1020\ 0021A4D1EA0FD2840D03401E19B4D4B254EE89F167245385090FDAED2100:\ 54484953204953204120425A49503220544553540A 123A6839314159265359FDAED210000009DE0000104000100032604C1020\ 0121A4D1EA0FD2840D03401E19B4D4B254EE89F166245385090FDAED2100:\ 54484953204953204120425A49503220544553540A [Zlib_Decompress ] 68DA734C4A76042247C7A4A4246710D3392D3F3F29B1880B106C380868:\ 416263416263414141626262436341626343666F6F6261720A 78DA73742416700100E0260AB5:\ 3141414141414141414141414141414141414141414141414141414141414141\ 414141414141414141410A Botan-1.10.12/checks/getopt.h0000664000175000017500000000715412654331322015506 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CHECK_GETOPT_H__ #define BOTAN_CHECK_GETOPT_H__ #include #include #include #include #include class OptionParser { public: std::vector leftovers() const { return leftover; } bool is_set(const std::string& key) const { return (options.find(key) != options.end()); } std::string value(const std::string& key) const { std::map::const_iterator i = options.find(key); if(i == options.end()) throw std::runtime_error("Option " + key + " not found"); return i->second; } std::string value_if_set(const std::string& key) const { return value_or_else(key, ""); } std::string value_or_else(const std::string& key, const std::string& or_else) const { return is_set(key) ? value(key) : or_else; } void parse(char* argv[]) { std::vector args; for(int j = 1; argv[j]; j++) args.push_back(argv[j]); for(size_t j = 0; j != args.size(); j++) { std::string arg = args[j]; if(arg.size() > 2 && arg[0] == '-' && arg[1] == '-') { const std::string opt_name = arg.substr(0, arg.find('=')); arg = arg.substr(2); std::string::size_type mark = arg.find('='); OptionFlag opt = find_option(arg.substr(0, mark)); if(opt.takes_arg()) { if(mark == std::string::npos) throw std::runtime_error("Option " + opt_name + " requires an argument"); std::string name = arg.substr(0, mark); std::string value = arg.substr(mark+1); options[name] = value; } else { if(mark != std::string::npos) throw std::runtime_error("Option " + opt_name + " does not take an argument"); options[arg] = ""; } } else leftover.push_back(arg); } } OptionParser(const std::string& opt_string) { std::vector opts = Botan::split_on(opt_string, '|'); for(size_t j = 0; j != opts.size(); j++) flags.push_back(OptionFlag(opts[j])); } private: class OptionFlag { public: std::string name() const { return opt_name; } bool takes_arg() const { return opt_takes_arg; } OptionFlag(const std::string& opt_string) { std::string::size_type mark = opt_string.find('='); opt_name = opt_string.substr(0, mark); opt_takes_arg = (mark != std::string::npos); } private: std::string opt_name; bool opt_takes_arg; }; OptionFlag find_option(const std::string& name) const { for(size_t j = 0; j != flags.size(); j++) if(flags[j].name() == name) return flags[j]; throw std::runtime_error("Unknown option " + name); } std::vector flags; std::map options; std::vector leftover; }; #endif Botan-1.10.12/checks/misc.cpp0000664000175000017500000000243712654331322015471 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include "common.h" void strip_comments(std::string& line) { if(line.find('#') != std::string::npos) line = line.erase(line.find('#'), std::string::npos); } void strip_newlines(std::string& line) { while(line.find('\n') != std::string::npos) line = line.erase(line.find('\n'), 1); } /* Strip comments, whitespace, etc */ void strip(std::string& line) { strip_comments(line); #if 0 while(line.find(' ') != std::string::npos) line = line.erase(line.find(' '), 1); #endif while(line.find('\t') != std::string::npos) line = line.erase(line.find('\t'), 1); } std::vector parse(const std::string& line) { const char DELIMITER = ':'; std::vector substr; std::string::size_type start = 0, end = line.find(DELIMITER); while(end != std::string::npos) { substr.push_back(line.substr(start, end-start)); start = end+1; end = line.find(DELIMITER, start); } if(line.size() > start) substr.push_back(line.substr(start)); while(substr.size() <= 4) // at least 5 substr, some possibly empty substr.push_back(""); return substr; } Botan-1.10.12/checks/mp_valid.dat0000664000175000017500000036762712654331322016336 0ustar jackjack00000000000000# BigInt validation file # These are all in decimal, mostly to help make sure the I/O and decimal # conversion stuff is working. We test the hex conversion in the PK tests # anyway... # Some of the numbers have very simple binary representations (such as # 2^256-2^192-1) while others are chosen 'randomly', mostly by me hitting # random keys into 'bc'. Some where also machine generated with a strong PRNG. [Addition] 0:0:0 0:1:1 1:0:1 1:1:2 1:-1:0 5:-0:5 -5:-0:-5 -0:5:5 255:1:256 65535:1:65536 4294967295:1:4294967296 18446744073709551615:1:18446744073709551616 124536363637272472:124536363637272472:249072727274544944 9223372036854775807:281474976710655:9223653511831486462 9223372036854775807:137438953471:9223372174293729278 # Carry tests 340282366920938463463374607431768211455:\ 340282366920938463463374607431768211455:\ 680564733841876926926749214863536422910 340282366920938463463374607431768211455:\ 340282366920938463463374607431768211450:\ 680564733841876926926749214863536422905 11579208923731619542357098500868790785326998466564056403945758400791\ 3129639935:\ 11579208923731619542357098500868790785326998466564056403945758400791\ 3129639935:\ 23158417847463239084714197001737581570653996933128112807891516801582\ 6259279870 11579208923731619542357098500868790785326998466564056403945758400791\ 3129639935:\ 11579208923731619542357098500868790785326998466564056403945758400791\ 3129639919:\ 23158417847463239084714197001737581570653996933128112807891516801582\ 6259279854 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084095:\ 18446744073709551616:\ 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194658\ 8393177722715635711 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084095:1:\ 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084096 -397942700139194066108348269604271467697661897648384734165029652\ 9192053560111268857919862747528477749805933030612876334500852832\ 5994574657552726381901:\ -342238655038:\ -397942700139194066108348269604271467697661897648384734165029652\ 9192053560111268857919862747528477749805933030612876334500852832\ 5994574657894965036939 2511029185349894083125189792298767815734633609329237357694542628\ 9097725034326735312448621015537884914:\ -365510811543986457345339657399796975273732516080550566276869562\ 81114038842935173436543461:\ 2511029185346238975009749927725314419160635639576500032533737123\ 2470038078045621273605685842101341453 27802650352:\ 660736146705288303126411072388564329913778942:\ 660736146705288303126411072388564357716429294 -134824589995504186480095446370988146623149603821668360871542456\ 6397833766910915722793041224478985289:\ 1151714952286618235856515264359526625702022859705853911311473221\ 8008332987904361457299261161227276764386173666571334749062651694\ 592291882972:\ 1151714952286618235856515264359526625701888035115858407124993126\ 3544623106438129961261044477618561339819775832804423833339858653\ 367812897683 -175405304416816169628682516351336019150390262549968865836182439\ 14226325157426408929602625346567256761818:\ 8652004279835272452069018101603566414024194616420826231795446815\ 19016990:\ -175405304416816169628682516351327367146110427277516796818080835\ 57584922737964766846979445801885737744828 1288447760742982615563987140969486034581770182750513292185554983\ 74:\ 4438163138291508763620522351346106032205489281076979612299536118\ 73695276391917150913346479060246759720475193648:\ 4438163138291508763620522351346106032205489282365427373042518734\ 30093990488865754371523497335298088939030692022 1709484189262457846620911889502097055085989595277300243221975568\ 275935717696463:\ -1646592344139809206374540620411514484579951199941360:\ 1709484189262457846620911887855504710946180388902759622810461083\ 695984517755103 3201758654296371761657093415761871025401806278064180152049287711\ 7023353895132395250905592913967322327352806288308303059519915387\ 7335714942842:\ -282824169696073608987996588238668793593857085654548122761949764\ 0844399275054327390050478930503975773972:\ 3201758654296371761657093415761871025373523861094572791150488052\ 8784685101538538165251044791205372563268366360802870320514867494\ 6831739168870 -403539836054218172590829531210749614210541501474425943996337720\ 4111754181625695349185753326709217:\ 85450213703789913646546187382091037800:\ -403539836054218172590829531210749614210541501474425943996329175\ 3898050391712048802998371235671417 -129216644607347987680152236338235788743165763918415128477552538\ 7363973852756087726243671676713861533673009088319851:\ 8045388958745181755374994252823750582362455317985903504033438417\ 6695557207064326714194569562489510933024274993575473943439469171\ 4971:\ 8045388958745181742453329792088951814347231684162324629716862025\ 8280428729511787977797184286880738308657107322189320576138560339\ 5120 -451986588700926309459451756852005697379481014956007968529234251\ 884946522682901215022086432597024324062240835564200177389:\ 15762983479:\ -451986588700926309459451756852005697379481014956007968529234251\ 884946522682901215022086432597024324062240835548437193910 -390747541211572881697456702205527837411679402562428747433403883\ 1885743634200801846649105209920908153587891040882946582394429615\ 396962188674594744360388466:\ 1938936112365378546948796774781062371570792073982831173929981754\ 54362643521031390:\ -390747541211572881697456702205527837411679402562428747433403883\ 1885743634006908235412567355226028476109784803725867374996146498\ 003964013220232100839357076 -72603710637966201224690926289:\ -136184426422985332615812550349236126405125071507280171067688615\ 06299813289801666559564532:\ -136184426422985332615812550349236126405125071507280171067689341\ 10010451256002891250490821 5607796083571305683140294840679074710788944676935750975947220760\ 3483968107693997028111823994257399379783658853302692762256851623\ 103019589392739:\ -427057313888431079237360487703561848638868677065083968842:\ 5607796083571305683140294840679074710788944676935750975947220760\ 3483968107693997028111396936943510948704421492814989200408212754\ 425954505423897 -220980083850850444349478376253480033771210140515678470878219758\ 0824527899758308:\ 4284407650303949586450021392583759850781770841835415277411207859\ 6443089606598570396235816327987463393971710495985285591895096794\ 994387176281079:\ 4284407650303949586450021392583759850781770841835415277411207859\ 4233288768090065952741032565452663056259609090828500883112899214\ 169859276522771 3388776730880982684241784117615223232127223178833840452685901937\ 0507113927387984766381329515371768224976188337692:\ 349484339542971517481628970179002500341:\ 3388776730880982684241784117615223232127223178833840452685901937\ 0507113927737469105924301032853397195155190838033 8574808963985866072258732162153629808269070752641242695163010155\ 1228144063151688592419555048867068162:\ -383634567691961960211191292397062452265352651123492760493087381\ 707279:\ 8574808963985866072258732162153591444812301556445221576033770448\ 8775878710500565099659061961485360883 23889807888563742283608049816129153552608399262924421832404872043475:\ 995:\ 23889807888563742283608049816129153552608399262924421832404872044470 -654786925833474864669230962582694222611472680701859262466465606\ 239654996048306783957549697781271829257774329538985:\ -276137507159648540503039013089014674747:\ -654786925833474864669230962582694222611472680701859262466465606\ 239654996048582921464709346321774868270863344213732 50463316268089933:\ -140591583463431806921000349498135287589005423318927850947894242\ 9953101385694731575213124136524392343244191305277028999171613076\ 57443381774866237429:\ -140591583463431806921000349498135287589005423318927850947894242\ 9953101385694731575213124136524392343244191305277028999171613076\ 57392918458598147496 1339015021665554488163337105187026760232395594198925052890859936\ 418304234254229440059229155546157793544192:\ 6294037420283433712414743361937677483761554699961644450461297486\ 2247932788230044871756877711635975905661325925915992499702811257\ 81761944353272:\ 6294037420283433712414743361937677485100569721627198938624634591\ 4118200390554000813746128240544575269844368268458286900295102813\ 27919737897464 -241446683:\ -282671163032866994488211995758272717472259277760825940523445628\ 442206062910449311538519756165635175664610569214430918184214:\ -282671163032866994488211995758272717472259277760825940523445628\ 442206062910449311538519756165635175664610569214431159630897 2358605503303452637996081421902056515951744611718383128442445119\ 505739707550326378912342448355046239066896995563581:\ -383043722914532516527336452555126144064884579194968166126094695\ 6860463720730123941973615:\ 2358605503303452637996081418071619286806419446445018602891183678\ 856893915600644717651395491494582518336773053589966 1860794367587960058388097846258490:\ -237344494507203983863096991896035366478949095337787603280:\ -237344494507203983863095131101667778518890707239941344790 -286399096802321907543674770412181810379003627366516307780436082\ 546:\ 6433131620680089024037442172197761714707480582555136398379812339\ 597187475099646442833150194:\ 6433131620680089024037441885798664912385573038880365986198001960\ 593560108583338662397067648 1811803390771023695595378175836278947833228041818597295747524425\ 7214680056902377349016498752054120312533829578576324428322456925\ 9250011493:\ -119912766577350317025030707802803587547945939765717835695952624\ 5067549497129923023348187933280753018204983010837846725666878521\ 137637491:\ 1799812114113288663892875105055998589078433447842025512177929163\ 2707925107189385046681679958726045010713331277492539755755769073\ 8112374002 -641402013955555338114086428916201846520512758110759261762820321\ 4491558550345077676836677565241902214951203461131114985869530775\ 0874152:\ 174441039:\ -641402013955555338114086428916201846520512758110759261762820321\ 4491558550345077676836677565241902214951203461131114985869530757\ 6433113 1272757944308835857208037878018507337530557445422230495561634616\ 5037244198775127175123602392596401935136013522028214622088960493\ 31599624285621:\ 7326562354017884140300121264633612334070903165496641915889499701\ 38457507491850467631029977010:\ 1272757944308835857208037878018507337530557445422963151797036404\ 9177544320039760787457673295761898577051903021729599197163878997\ 99230654262631 -296171972628230:\ -829576609912184321900082369936222286517382010256973151771639172\ 7126741710202086962877467940292139:\ -829576609912184321900082369936222286517382010256973151771639172\ 7126741710202086963173639912920369 7469859140681995100248436821088394448284142227691915206159676323\ 62127522466922882591:\ -20487191102299831461877807785745372724903547246374023:\ 7469859140681995100248436821088189576373119229377296428081818869\ 89402618919676508568 -4:\ -234439009075326480604323496098115161312227136676259000693031887\ 6906455201397017135:\ -234439009075326480604323496098115161312227136676259000693031887\ 6906455201397017139 -448761802739957373377693318750581411296787367117499463888322757\ 67882143882764:\ 20982187786:\ -448761802739957373377693318750581411296787367117499463888322757\ 67861161694978 -601944008264824351134005823298148744369561537910415436895793990\ 7896782179207195666302228625496897271988494:\ 5325663024991554160033166078015937845836527207540797603647364222\ 91735917382015688217276924340984564880:\ -601890751634574435592405491637368584991103172638340028919757517\ 1474490443289813650614011348572556287423614 -737554715636160268477263493571675308338509596629210590529282292\ 3781472871944886871927821129478599825311797681268315326408823018\ 2865250970217610487:\ -30100016097092378349958946184353117306134810372681:\ -737554715636160268477263493571675308338509596629210590529282292\ 3781472871944886871927821129478602835313407390506150322303441453\ 5982557105027983168 -221117706668970434568685275663894630667495895204444708028536428\ 3965878599873864667094550865713828159912:\ -536556043937245689200756579876160678199726920153847573681478030\ 0517383963455858081652308237033460360040921820049494698892905680\ 307378540208:\ -536556043937245689200756579876160678420844626822818008250163305\ 7156330270130817033696755317318824644006800419923359365987456546\ 021206700120 6074122512337108841968521649035076841633691574254417104144285970\ 8190687151580370231498672521465704184848502349798380642493738161\ 63440:\ 301843614094506325875637699:\ 6074122512337108841968521649035076841633691574254417104144285970\ 8190687151580370231498672521465704184848505368234521587556996918\ 01139 -518214776931158149908771340564348982010543985108065053479219152\ 7346598920424997741288096547136515478330872068932567407374262007\ 15673766732196603988:\ -298351725577476937261155258873861370046745453114225573456588840\ 38760353928226157702249175218280718951979:\ -518214776931158149908771340564348982010544014943237611226912878\ 8501857794286367788033549661362088934919712456536106689635839029\ 64848985012915555967 15937412249227240968245047444122:\ 1862146803761694261088224507009788278865690534402542585855766455\ 30381613666540347032550716844628275956253:\ 1862146803761694261088224507009788278865690534402542585855766455\ 30381613682477759281777957812873323400375 -125280101162586858550475042529281076239231054587017617079119695\ 27003855713485846140551107967495813584097081777160:\ -539986280927242338236008809854961759996986302156061552378097160\ 849129372827386927545686899193598721998757419572890:\ -552514291043501024091056314107889867620909407614763314086009130\ 376133228540872773686238007161094535582854501350050 -2454746908:\ -382295712788939478005524215636037018707559207865555237605060467\ 9934415014573879513870030211860839641756441626913419699098985245\ 833920954444218:\ -382295712788939478005524215636037018707559207865555237605060467\ 9934415014573879513870030211860839641756441626913419699098985245\ 833923409191126 -54288706131860071583318409080596095357980447323635:\ -425339410556015631098973742993327323051438456819027069606294261\ 157940297643297240559452124432779202181589763874:\ -425339410556015631098973742993327323051438456819027069606294315\ 446646429503368823877861205028874560162037087509 1418766894051319870818496026367686195459604395660119754151922014\ 257535705077512233275240217434104:\ -111987390206074845527:\ 1418766894051319870818496026367686195459604395660119754151922014\ 257535705077400245885034142588577 -690410131860410477456103857594543515409677479242833618634809302\ 4529626004763532868225501682312348541164651530788457447229874477\ 19420052500874721214723:\ -258469037743394674731135699243278836145549479106673938483740960\ 9897387109736539600623155880918146331681272708396146283818299:\ -690410131860410477456103860179233892843624226554190611067597663\ 9084573915430926716599597781286219638530047537020016256411337794\ 00692760897021005033022 -2326153002179462643778624079324592172489363679671158:\ -109819757548464054181938329012610459679:\ -2326153002179572463536172543378774110818376290130837 -442875225056652548835385770919494174299378557880791141401695920\ 6453045495320705299466107784149485981354180907411034982168391:\ -392477782593742153255217680053880075265812358324465405897205608\ 55741992694947322437679214611686905696:\ -442875225056652548835389695697320111720911110057591680202448578\ 7688877941861295020026963526142180928676618586625646669074087 3047:\ -735645878503131535237769321637196107334337768903902046180401737\ 9719600010085607082927794304834315616579528230750813527764131521\ 4:\ -735645878503131535237769321637196107334337768903902046180401737\ 9719600010085607082927794304834315616579528230750813527764131216\ 7 -89094716573076464980713547115099137014719483620102078148320806773871\ 083148864:\ 89094716573076464980713547115099137014719483620102078148320806773871\ 083148864:0 -89094716573076464980713547115099137014719483620102078148320806773871\ 083148864:\ -89094716573076464980713547115099137014719483620102078148320806773871\ 083148864:\ -17818943314615292996142709423019827402943896724020415629664161354774\ 2166297728 7139718976538104911036273126224339498939049952371944598728684359\ 8407339615555456955143712741779487184644001767776382991377987516\ 772847242986:\ -5821969555717973232123574849275726788359152255219972775831:\ 7139718976538104911036273126224339498939049952371944598728684359\ 8407339615555456949321743186061513952520426918500656203018835261\ 552874467155 -181409752656613138777964092635909379021826360390960647186726991\ 165227400176766831466541160049935205507919070233410228328274:\ -523301382154855044703947051892202646490840761177533623732372519\ 6899184207698424247726764075013505280967149049152973476842478027\ 73107355881667545916901:\ -523301382154855044703947052073612399147453899955497716368281898\ 7117447811608030719594033986665779282734817363818385077341830082\ 81026426115077774245175 6858961373707073067:\ -334051508933893061433844279764271107181974906283364991309903077\ 649971606436918071327072869826471946094594594115614990907:\ -334051508933893061433844279764271107181974906283364991309903077\ 649971606436918071327072869826471946087735632741907917840 -236350989303745694071719069604296168709084242815199446584909401\ 09956689534874971218650241680916564611:\ -189589178757795228335995891331428279524485393011427187469792714\ 4384667023598274379343968662673642819854164720298367788750543006\ 0922528525205:\ -189589178757795228335995891331428279524721744000730933163864433\ 5080709985285365221772120657139491913865160389251855285872408030\ 2603445089816 [Subtraction] 0:0:0 0:1:-1 1:-1:2 100:-100:200 0:-1:1 0:4294967296:-4294967296 4294967296:-4294967296:8589934592 4294967295:-4294967295:8589934590 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084095:\ 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084095:0 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084095:\ -13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084095:\ 26815615859885194199148049996411692254958731641184786755447122887443\ 52806014709395360374859633380685538006371637297210170750776562389313\ 9892867298012168190 17976931348623159077293051907890247336179769789423065727343008115773\ 26758055009631327084773224075360211201138798713933576587897688144166\ 22492847430639474124377767893424865485276302219601246094119453082952\ 08500576883815068234246288147391311054082723716335051068458629823994\ 7245938479716304835356329624224137215:\ -17976931348623159077293051907890247336179769789423065727343008115773\ 26758055009631327084773224075360211201138798713933576587897688144166\ 22492847430639474124377767893424865485276302219601246094119453082952\ 08500576883815068234246288147391311054082723716335051068458629823994\ 7245938479716304835356329624224137215:\ 35953862697246318154586103815780494672359539578846131454686016231546\ 53516110019262654169546448150720422402277597427867153175795376288332\ 44985694861278948248755535786849730970552604439202492188238906165904\ 17001153767630136468492576294782622108165447432670102136917259647989\ 4491876959432609670712659248448274430 # 2^512 - 1 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084095:1:\ 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084094 89094716573076464980713547115099137014719483620102078148320806773871\ 083148864:\ 49505213825110728957828173754776257356620450607893971553289366249708\ 672306581:\ 39589502747965736022885373360322879658099033012208106595031440524162\ 410842283 65894747009896006767807716946835412110318548717263922395390971078905\ 789585431:\ 38842697419255082259907154168620472841946037999026507486310396086843\ 67281358:\ 62010477267970498541817001529973364826123944917361271646759931470221\ 422304073 5950196396451977566902121301707054218364717196893101360011491777\ 7619522537369647091659626133477106071641786829877837558948110242\ 88429224592316636383:\ 8750653273562160761286422180115618621879821429145276197424652349\ 306577311499807887070429373153777028581165316131683348567:\ 5950196396451977566902121292956400944802556435606679179895873155\ 8821308245916885117413102640411332956643707959173543827410339957\ 07263908460633287816 9815262808265519920770782360080149146267723690:\ 1406700576889160928136491935811529134135218991825578039756006074\ 8765650205261663193732434161580120817:\ -140670057688916092813649193581152913413521899182557803877447979\ 40500130284490880833652285015312397127 -390149102941948621568479722346940666704376013734485343840154221\ 6058534125031549938788864908670209347775308945934163371753998650\ 65870417717658815158195790:\ 1456031684988128870809574635750149625240648487837308:\ -390149102941948621568479722346940666704376013734485343840154221\ 6058534125031549938788864908670209347789869262784044660462094397\ 01620567342899463646033098 7473774301764883450943:\ -262563698593678907551573728200523874834027237901855629084919338\ 12453:\ 2625636985936789075515737282005238748340272379765933721025681726\ 3396 3624634325121492202413918675700914884929548559339795200323734966\ 0142296147421019916619944353877490544706223768684758263065399016\ 597969:\ 2574427901445527995149185461475228850098549655325125750771680756\ 4031046245695227927925972232181431549249881995623555170649626659\ 54307425375180:\ -257442786519918474393426343733604209308940080602964015737372875\ 3165754964427226645371577306598198801047497654856131748380204402\ 888908408777211 30129746266682790628283889040897642317014108334116727:\ -158048052389539876256372171547438090363007387136214391586439872\ 4834897608423:\ 1580480523895398762563751845220647586420702155251184813506715738\ 943231725150 -4614735863800137951667138933166372061:\ 87175694379075561307234146162193190462135078700346746992273:\ -87175694379075561307238760898056990600086745839279913364334 -3753904:\ -11269137783745339515071988205310702154422777729974:\ 11269137783745339515071988205310702154422773976070 5925239484953794400820212797381700884029188584554700501406527871\ 71830058864932939900794505955437856926902975870288:\ -205854658295495452479104108497931263758143158076949293929661651\ 111:\ 5925239484953794400820212797381700884029188584556759047989482826\ 24309162973430871164552649113514806220832637521399 -33993701617495591491176844355:\ 3438065097398894672826284379125235190693300918673662774192379185\ 002391232383325160416036963599856704698280:\ -343806509739889467282628437912523519069330091867366277419237918\ 5002391232383359154117654459191347881542635 26876428790838270949718735111909136008255051776703:\ -178112811296681037328619200883114927554699563526876724185996760\ 9117529616872536681035700534316457543887601645022:\ 1781128112966810373286192008831149275546995635268767241859967635\ 993958407710807630754435646225593552142653421725 2059771092932179758019770618974659367350250375647433386639519387\ 69317693429941871882153770641334267205446421916220398066553188:\ 3342500267594994347156312297990633112620923791590960237694328174\ 171473763026:\ 2059771092932179758019770618974659367350250375647399961636843437\ 74970537117643881249041149717542676245208727588046226592790162 5545520403000578843599072515870982842927227412121917598877293331\ 575380404618111609:\ 5991287327241003718821424770352575362437680738923552868139860461\ 945460339860477495902:\ -598574180683800313997782569783670437959475351151143095054098316\ 8613884959455859384293 248039029608125071340:\ 3664608673:\ 248039029604460462667 15425705711415937103627:\ -143550406551774570344004527686898291075408140547412300376755421\ 1132837427846963435621523810229738262235546179779885824:\ 1435504065517745703440045276868982910754081405474123003767554211\ 132837427846963435621523810229753687941257595716989451 5088284720510864560728156892268365268867173823603073291434760082\ 1086:\ 12176160963158:\ 5088284720510864560728156892268365268867173823603073290217143985\ 7928 -354265185659858189476700478770330228855421724619735662285097710\ 5341631254320181588119095376220762923216041205830017303882425678\ 3171761132:\ -486486260736646884318469435312383053458853801109381241820880813\ 5799:\ -354265185659858189476700478770330228855421724619735662285097710\ 5341630767833920851472211057751327610832987746976216194501183857\ 4363625333 -142859621471226831038214482817138481252017914160812187001355640\ 2879770424002218157546599921571184:\ -4054101:\ -142859621471226831038214482817138481252017914160812187001355640\ 2879770424002218157546599917517083 -200931:\ -445588024601304957594828329131607177911517867255705194754496076\ 5970517168228311149083493083504573514296684748300915751495017756\ 5952218520297258834187372:\ 4455880246013049575948283291316071779115178672557051947544960765\ 9705171682283111490834930835045735142966847483009157514950177565\ 952218520297258833986441 105704314890799915321259:\ 8279235459450764155749124384991698144145630668774941008316577611\ 9049069747385436947778487411878749535140554980332961534712093812\ 3226038208:\ -827923545945076415574912438499169814414563066877494100831657761\ 1904906974738543694777848741187874953514055498033295096428060473\ 23310716949 1448979433940064018828919290452280235308901982649341:\ 303926827425887072291878308433008512899006711759770318009:\ -303925378446453132227859479513718060618771402857787668668 -243237595290235750457450892290434789864:\ 1981770207633427640298127306741732109846753330094746386538370200\ 5126562800253466403934608765512316565811954342319565128573969:\ -198177020763342764029812730674173210984675333009474638653837020\ 05126562800253466403934852003107606801562411793211855563363833 294037338365659932242802023634:\ 4401245995535867764294876849802142926077599828776505639975554254\ 356763769548465:\ -440124599553586776429487684980214292607759982877621160263718859\ 4424520967524831 7303853946195223307036710881687367004566538357189824031021831088\ 365362:\ 119286025999378935715794641163321741:\ 7303853946195223307036710881687366885280512357810888315227189925\ 043621 5711673553432872356876026107141104160674262893635054129088049406\ 96550592413192300554016875:\ 15872188842802631759540597:\ 5711673553432872356876026107141104160674262893635054129088049406\ 80678403570389668794476278 1002240129784524388754179399598974973256811336031329881209395070\ 412702275169416754240:\ 5942948247886059134314539354042003351647830595287234900671578947\ 7946474753657206800070515207967709079933420746952:\ -594294824788605913431453935394177933866937815641181696071168145\ 04689663417625876918861120137555006804764003992712 1370431648825444838359719050380239722263203134555431526491525074\ 601463042144798545817957389:\ 3473869878:\ 1370431648825444838359719050380239722263203134555431526491525074\ 601463042144798542344087511 8548280229254726209:\ 3306612503526990498184932043401689273494314593558214198996828084\ 6973981913056248918:\ -330661250352699049818493204340168927349431459355821419899682808\ 38425701683801522709 -190235588326875064895081507959663321759901299630299289585841701\ 1175963029327693964733408210016910253836443785984639809506517193\ 6899503:\ 2489927112752354534228346876280965340763863196622012469575197689\ 4193103779443050843040771191227522843088079031762445684377195650\ 493065096847292797:\ -248992711275425689011161562692991615584345982983961148257150068\ 2315168794955481047333404813087485692518824813430081012223704204\ 8588130268784192300 -180035357552270638928830562379719669053087020435672292804206122\ 8497437075035917720399302198953687023:\ -118756682615304660537085387309407764121711064830726245327571774\ 71384128016458332544642788404765469924496127460164:\ 1187566826152866570013301602455148810654730928638209366255282074\ 8456085955229835107567752487045070622297173773141 -29861551039945217879:\ 1113473025916855642353456146647542930581669082348409639697282960\ 8778892265003199963808382325823762328728689476247937892128298859\ 34:\ -111347302591685564235345614664754293058166908234840963969728296\ 0877889226500319996380838232582376232872868947654655340252775103\ 813 5655329636567611538382182775649579176587072976497579206763033016\ 55328103665512287797108510139837643506491641987188791892506290:\ -2188105671531473889939411772533707:\ 5655329636567611538382182775649579176587072976497579206763033016\ 55328103665512287797108510142025749178023115877128203665039997 -349535960680522202843083381184496349093812380954435872337802226:\ -1829600726218222026679938:\ -349535960680522202843083381184496349091982780228217650311122288\ -1:-6726974989587128275:6726974989587128274 -107142709838121196902389095205618516687047338619382145236348309\ 762148611647954748824:42484103615491:\ -107142709838121196902389095205618516687047338619382145236348309\ 762148654132058364315 -905466304300857697648396075281161213818488784945743608120275996\ 40018921358040178215575723:\ -118922408531468986902800063237122125617455464103913195171141030\ 774109638861272017660698580914239435114280434761425243:\ 1189224085314689869028000631465754951873696943390735876430249093\ 92260760366697656848670981274220513756240256545849520 -554504466708242712880172641672765736000158843011357818285065757\ 3063241939882570324573086267287272360432363387213743735507218270\ 373633222520429:\ -151423255459028627628896755237194376177115:\ -554504466708242712880172641672765736000158843011357818285065757\ 3063241939882570324573086267287272360280940131754715107878321515\ 136438846343314 -5247636471953421659649611318164848102069:\ -4024324110573096565232590473170599175885004:\ 4019076474101143143572940861852434327782935 3941289260601504332248485425387937172318645783859022479504017847\ 2832:\ -503832132195745214503468781543289068482546657912347492184846539\ 3400312:\ 5077734214563467188357172669686770056548653036962065146643505571\ 873144 -559794145880092270356836245052087667531874697277996402772042742\ 07843317583292736333912783829528270272642583004969175230274821:\ -109633110576212669339535976775635762395927171313557427036242111\ 4760163985793453669084013340255712657141281083080320737794421813\ 69365924213118258269679:\ 1096331105762126693395359207962211743867001356299329218274753582\ 8854667077970508970412712618225368242139177439524824425117190872\ 6782919243943027994858 -387523538981733893474792162857729999063252864213028668543507370\ 50533204094183249691110:\ 2428819407377764342156426895396654728835493564788997075896393065\ 230009911546390816091652653701035085361:\ -242881940737776438090878079357004407631470985056199698222167948\ 6532876765897127866624856747884284776471 -2784579005241382005249492720344:\ -164204542616919252351131740123094674:\ 164201758037914010969126490630374330 2009488574208715447478080609723750390524012808225058048517328681\ 00:\ -795957177479360455258269298038670876462147576765875895105714:\ 2009496533780490241082633192416730777232777429700825707276279738\ 14 217570540819:\ 1219550835977204209833842821666933073941855304313684768349807483\ 02158718406063500763434561937200696970170700:\ -121955083597720420983384282166693307394185530431368476834980748\ 302158718406063500763434561937200479399629881 2335319252198456765380587281374076367944:\ -4500271:\ 2335319252198456765380587281374080868215 -393694614027544181700073367147249369966344727230221941008713805\ 434207925307052598:\ -153972676737062409261153899615588515236137907791841623991260363\ 8406802955653131579724891681323455217806580074596028231257978067\ 70:\ 1539726767370624092611538996155885152361379077914479293772328196\ 5898022219816590860252282340511529983964929365416861520049075417\ 2 114832549702862263167:\ 1292186490722995955874527641883028787538667360089228102228659716\ 5773569473039953984775959232814911435097412913078625:\ -129218649072299595587452764188302878753866736008922810222865971\ 65773569473039953984775959232814796602547710050815458 6489502346837936889305337487724547956628371915228387374094443896\ 2663621059310651530729834259117675802940765940789328350084947778\ 66083:\ 1099205476533612407829257935144627350486541654788267826664706620\ 630745291371323154513322608446957760026881954001581:\ 6489502346837936888206132011190935548799113980083760023607902241\ 4780942792663585324422381345404444257807539856319750749816128238\ 64502 1699911441239587542538013131736629773378508702733583789516405216\ 01077152994474340806917796870911557233689087716056557:\ -15409167:\ 1699911441239587542538013131736629773378508702733583789516405216\ 01077152994474340806917796870911557233689087731465724 [Multiplication] 0:0:0 0:1:0 1:0:0 1:-1:-1 -1:1:-1 -1:-1:1 -0:5:0 5:-0:0 -5:-0:0 -0:-5:0 4294967296:4294967295:18446744069414584320 # Tests on sign handling and linear mul 15928512:20395958369873946873946873498674938762987:\ 324877267646037601269025261886125746185503585344 -15928512:20395958369873946873946873498674938762987:\ -324877267646037601269025261886125746185503585344 15928512:-20395958369873946873946873498674938762987:\ -324877267646037601269025261886125746185503585344 -15928512:-20395958369873946873946873498674938762987:\ 324877267646037601269025261886125746185503585344 20395958369873946873946873498674938762987:15928512:\ 324877267646037601269025261886125746185503585344 -20395958369873946873946873498674938762987:15928512:\ -324877267646037601269025261886125746185503585344 20395958369873946873946873498674938762987:-15928512:\ -324877267646037601269025261886125746185503585344 -20395958369873946873946873498674938762987:-15928512:\ 324877267646037601269025261886125746185503585344 # Some tests for comba4 340282366920938463444927863358058067579:\ 340282366920938463463374325956791500548:\ 11579208923731619541729378749232972134965448161202875719419539386122\ 8599533292 340282366920938463463374607431768211455:\ 170141183460469231731687303715884105728:\ 57896044618658097711785492504343953926464851149359812787997104700240\ 680714240 170141183460469231731687303715884697989:\ 255211775190703847597530955573823923340:\ 43422033463993573283839119378257736288536818090295526758568867574118\ 988163260 297747071055821155530452781502797180927:\ 170141183460468022805867689086709264301:\ 50659039041325475543690391927479197318639397862390185708883012434796\ 959187027 14601326942920387013816701832353570086:\ 24264364577528921915881695974297771845:\ 35429192025871610141024926748879851702222338457773664017578783702084\ 5028670 146013269429203870138167018323535700860:\ 242643645775289219158816959742977718450:\ 35429192025871610141024926748879851702222338457773664017578783702084\ 502867000 14601326942920387013816701832353570086:\ 242643645775289219158816959742977718450:\ 35429192025871610141024926748879851702222338457773664017578783702084\ 50286700 146013269429203870138167018323535700860:\ 24264364577528921915881695974297771845:\ 35429192025871610141024926748879851702222338457773664017578783702084\ 50286700 # This one triggered an internal error in the Karatsuba routines pre-1.5.1 84464209123861960605955522581978104887597821936897255830387847065955\ 8899906113628751877643450961:\ 98736951733086678034646082696089517704609210537259909243889983275639\ 1381482452634765035178337262:\ 83397385394360978145497699467080869269009479990938738462835142243431\ 68965095514489024855209740810586369398339972616667107927536797156602\ 16305715905081674268833475056324309733116240691616008782 # Bunch of random tests 65391683115015322641882045438465620784076516421367563767344998373464\ 211053082289513139:\ 14690551177765498638640685224012137037306962019402563878738998365076\ 1050984890:\ 96063986740135661881270234408778414507112892608292678410994214305223\ 58175678639192181958429173932035325313118014847793404794351246657465\ 400198770681540554545469710 1459164589787755339073553407089181299573246969:\ 4955710571301004201072727045590614350659542263:\ 72311973828792724517911747511119452992590495960205135450079047249531\ 44018123225390192150847 3793974577745786452436021977649815501504431203:\ 2923303082707524288431115654231878223978230055:\ 11090937578838235312365399492067271746660860774658228109409108903923\ 640884753924587454406165 101303541515453867913135264584014138619190734343846977507421629791:\ 36729564208551355196057918758932548366821793131129547653209379728:\ 37208349326455106997710672468998674976019345812041319483326955314975\ 51053692760634209776285429196890853333966465984989349956276848 44895767034162990997987303986882660674722497505237491649296190658571\ 47197906588923414435381184370662953551284823547380833018151742197013\ 59303201872276975123159197578062043415450227149917179130060317248184\ 61724742069401359454784533576615919680949125073761586043027941204059\ 690093447093117249681641020785611986:\ 16696330082433130739210985196630214321753266552182432027772967004925\ 52487573743509832387533060375698218277114850491112782115377202073776\ 62825100480410971654051009789510884031202872930809935194297665183801\ 70736075740497155051843194560584923206479837331572253151736065154330\ 02181215131563438851752144164132708:\ 74959454570640520505374182178324326203870806497691482733643463532317\ 75442982425470080130736910895976501997512084030656668411349679742847\ 21690931312000529989464756559726986788294230843854125058213935382088\ 33087270201941766663613578038620398830216648062658181759195126557523\ 37555785758593956590738976578724612143644830770362020115624628734003\ 14793973405636949715493148568894826023486325367366577289710265462268\ 93078189596361078496041841642207401666400444087608269521582499768080\ 07159362627730642339199533209051979652974085966347840098279340160090\ 19527545420793815544675402025957881285966830564213200530247666994380\ 88 31239732497959818638292779200667312725332984706050265703512759466859\ 84736003183931208107094690791134882086398364414246612787541657212152\ 296954515345861259:\ 44486010269203082806521604993132013139417339215738521529001729101974\ 65470989031351517957857643691181436996411785695418178273749379126148\ 152297344989418668:\ 13897310607113977660431400418487955410781290158603183057898927941454\ 42790371799023389229350908578189623154651948470463734628718228022175\ 37160459735416212605027206307627525795256098590275806474422724678539\ 64782315844000916960349331847619603498272594899577643345409426860228\ 282896290162148120168283702192583012 91271582:\ 1044096341139516502862794205655492738851558322471722173871372437\ 43310942332:\ 952963248162153539313947560906101692644945912572602330737192268\ 7571591624552409224 -91271582:\ 1044096341139516502862794205655492738851558322471722173871372437\ 43310942332:\ -952963248162153539313947560906101692644945912572602330737192268\ 7571591624552409224 91271582:\ -1044096341139516502862794205655492738851558322471722173871372437\ 43310942332:\ -952963248162153539313947560906101692644945912572602330737192268\ 7571591624552409224 -91271582:\ -1044096341139516502862794205655492738851558322471722173871372437\ 43310942332:\ 952963248162153539313947560906101692644945912572602330737192268\ 7571591624552409224 -9007685545468534598743641658049346286545924671394080257:\ 2708960019652616340610787776914583117699836940876415749938089814\ 6081690884713840035653793589401490015282276:\ -244014600122770296285710957465763428914667734328300934010213909\ 4856883353826536741655516010662407431799548978798414309377210905\ 45677125226465989158836569253624932 428475864:\ 1642909320501970182957064144199510240834448195404018829560344234\ 44879791407290995292738391711524351126135935031044584272585059146:\ 7039469905757345878447661340893057388183882714889777970681372359\ 9286724999378785107476015314565835105810467743874695068716694731\ 073452144 3804585298456788532803090036944486:\ 9742592765295469751314273699067197683737589672961737725951028020\ 8013084557451228262241241203602290304633025697300826898557186337\ 686135242:\ 3706652520369461349681131925078860959899355051485269139180490532\ 0467536020217182138330427311026318308608257076867490449833762996\ 8681057630927906028048393947534475842175612 -35149344750729324695898480464299390828429941822615:\ 1752615203067497391770113249494248437526672507748487522889401580\ 803582387921659886646983402010731854517398777968222841997058767:\ -616032759879889488930577794740723910260183908336496340745761376\ 2386195653397211971686493794958963315038864032857733526167220510\ 1088470032335610958791871921057479688753244615705 2224887148112689653000916580023252657898661078193469990759133236\ 362617772742210818665763748892926451655031017362736825860:\ -2254472752938568904593125981795197834529:\ -501594745378325694157035263090451802038729306146676277613732491\ 0318865702652093235942446178330845500337957245272966813848791221\ 008304843258214793080794968119940 -326328701700361893997973482656600190641887240518503116265346556\ 55295515493003511016396059566561:\ -21680483:\ 7074963869626767136670866125187215271008195405978317997637869508\ 45488283622299239531287490699813128963 4389513377810870521262475775128351860157070070803223156864617016\ 76781196153736168934878334587194620411888:\ 1591402338122279449286758479905480147444383058415555680119818315\ :\ 6985481852667243947827954917503754523391596798272663056116832798\ 8639257425760121941859610354487659319836581325691828420744517855\ 7475650610301655551351877918657026128720 -5742879080477972131875:-117203:\ 673082656869259767772145625 -41663152776865616597841653055290004804009193:\ 5835026797641751552624640633869101411165325469966866477145:\ -243105612927253227498125135247022492715711849036333775420426222\ 096834839368617968764219011608104393985 4173221:-226716880742:-946139647767009982 -2:-419149616949225277707956479498985786267693664978807:\ 838299233898450555415912958997971572535387329957614 -7465837654969091645574504830799010297689933581098938996:\ -202766795624052324242807175739440132217946363911505883055059139\ 6802793334274781900133686867487904621446567316359570842284699541\ 23774859572282855983153:\ 1513823977947471878037349023375096499530047411943626417913495002\ 9266163268789802231784935230530990513196596039364219349962480236\ 2882318096853516252518151818670572226535777283574688903592768015\ 9878750734388 3279753735679960497081857312:\ -120409079507914667933587089469886612743428895521786295640815348\ 9755449324053336110735728979481112654778080841040146337772577107\ 9932:\ -394912128325868511771837525267263805962903118191080245346895278\ 2101319174909498798792301813784053942666817514010081546325334905\ 4670131212205861739934570662784 4087017444924453990694625061188553846924665921421375573052029701\ 043709060984050262732827338392612774866740696110490073121:\ 3201354694306000008850909268274836475189060544721638298393454399\ 7010152870984867537367271090975150700374414635283625090662581086\ 8464508777654674:\ 1308399248301941463281797376424136020032561422146839113205163993\ 0095140051921364225220153999482159067766281848161373837807682105\ 9323529563247238502827327776282135135915279474234713191582888777\ 1511404594446973439104298431438185694530043948690757478249515261\ 147417554 -179313367402631288677862721876578030440889951889929042528322527\ 8085266134713795430545312954193172520148465554221323897345577960\ 264434757547077538451:\ -33744480794260115381826015778:\ 6050836482472199350882052360070598557985968830769735487227048700\ 2553193437634540742425617610465933528817398184780529934951394335\ 131691780368690568505046871430214639380927679878 3180313045123330718974011402998828102633:\ -395949120505103380356259679899143757026704962287504981215815665\ 380:\ -125924215314748995932963128833366357734780900635789980947564937\ 2075592673896477843481666129302983824945540 78394433139310872652394899769973779113149326061838893498:\ -506317937717:\ -396925077155891232039161994526220415197346559686986697686085602\ 64066 6992304690095528264306828961300165566845561346363146805401105701\ 874655545973774463962200355744318214727682521358902:\ -133619017321721689986267587295828262450483752049648766344634742\ 91685037600448415:\ -934304881504630204568833073073911400366279420013023235031438382\ 2934806501904607000964107025275607243164225972618594885288739045\ 8800341193419320569112624739820560918330202201239246722530352040\ 330 -279747165826180670739009508896477442612565831634509:\ 1001070223323787961662547493417138134890156942660669560843733241\ 4633638061364752177870909932683912027813180522891316:\ -280046557767811427898723527174997897592562433513837063010261215\ 7561198396498373067781895023542952270308263849208412127831845586\ 715174925803969788307318868622842023844 -152342817045381492055715979459468344477216937481934776490228525\ 31778605803188114866165739904589756975:\ -2212835903613879894390831209261230372573882516571420663066:\ 3371096552157007383916181066595556807779212082757370662982557178\ 6303181325061530061815766217946054712863588378057790411549645679\ 971413325974723607366298385350 -6494091656668836641394369738257289569440116499061905611026:\ 1112275782840317521987084233672591688806254182453409490318139855\ 2744964172429976273740793816660934415725201105937791700128767940\ 628761787374194934304:\ -722322088125810479882613158179027486065378866899909715094586413\ 7631103621500568007359634288605863429230875357724233639767911115\ 2068815511020712301669909478881408853498125187530355741482610911\ 208923048035904 1259075970239705718009909682383850925181613342972607875664276820\ 78026:\ -318663749166949940724436640747496455489904112200179629829091439\ 2694468149048117282961429675979014117768927070124265356881836359\ 049426402836926666527884852:\ -401221869162599711356856060105595763645472859526212982202400149\ 5177647664741074762667141421159412849263518723551697751858002053\ 7542672075930439535906386249755965714824568354356750289932068520\ 3787316784029369163777807462152 2209196064019679034549708549203671427517764511470713969280084552\ 75125503453318134640933653347485145888239438775112197321859:\ 124322370280092642752:\ 2746524910923777881431201305680978264281158564024544236980377993\ 0636867162970792373254349391903852439413048040893096230035640839\ 019184047515968 3082058203728546610432890576347992072668373530737159518097003484\ 3125203068791784796435721368414598060677372556794113220896530315\ 739449185455779351233:\ -552090427013053554588518469958636851397777719282856055637956259\ 9226137:\ -170157482977557810525065897604283065952067566293743982849411731\ 4057452157313429551986153220866320527892664570619020242072409661\ 0134368039649413644973455415575096896642638467426667020714240674\ 6077334196123944909716776921 -750276999830609236437180125267494301299136351451377419221886149\ 8911986254315057380891206497595590249266192106292303419043717156\ 81219472681905129612:\ 4205355271908551:\ -315518133662938357806548055254433388492269241826339016138263604\ 4618312099336135707474248962067915083570475597285597855437079628\ 850888491804577876260379972266112212 -891480538085009501272618223055661423871310460861205688650041631\ 6753749755092306432442174291514301244257968406437077389253407330\ 1027650622821713282798669:\ 1823891225274156993815141670030683418070006803521364429343774264\ 50339496570500278332821206013754250417471107492:\ -162596353091593275777884582766611115972439819895849702568800957\ 2367685595981932088283461337162038543383704114341129033405716497\ 0880798827330185683075499346562579922155299739327439570345879557\ 1617840239191503928488539315719099552021212289189718073280973406\ 93528148 2124681182585249920847800665256356364758375848619965937406893722\ 55899052138313727858090571132568351249080019:\ 166675024913973810158544:\ 3541312890416478684229072496000778308444354108581194567659019593\ 9857314201986899403459218685673527418723464730927296640736532532\ 336 1821270812209449323858422000208483696090755511739052940949819411\ 630382944845340233359392421633:\ 2128599324432790723202832411330404647604668944765842006449683716\ 50019:\ 3876755820478193889141631692181181045914395285524928078325690250\ 7363257606428059488182369494828732792776883797717522047063810333\ 3437096328016399478420072360461027 -335011184237031303208123967960797661123087083840830392886248022\ 143119440501379:\ -230989343999262588479185165706529031246884375719671837094628940\ 050182325:\ 7738401367932796012865144293474273194190542200590231371857014534\ 2578579884777706655220887725142189714172038628849075667359933189\ 054779585318363926175 9198355732743233736216530024186914753135748283508055875656089812\ 193:\ 5265840759145098384429490542373787636725124845354712989635142593\ 95934459401303991397630:\ 4843707653459529764586164414557294257741706853681297466140467212\ 4298268715305496704100180574245676306441226124334746402488026433\ 56143901511622354285302590 8714296327732867082392471731937188058841333771145620157971112718\ 8495045603213379592320067530490555856585188563018570084376435672\ 250185088374873:\ 4210349889307237465841484620878589644044295847340349009991385858\ 7615774626884639631625125100679586906920885988199787927848195684\ 62193938751049439136295957:\ 3669023657886054286232729883213956427553614823342184148988934625\ 8269564694550999939890817870432701814483867503196358666291080568\ 3307419798404926447543906006174853340917944983123029252530968474\ 2688682844881192340842766518335434033712938061191158275417587681\ 07991512024470998588265108393429890288461 2981019:\ 4433245119720584557487584549690245587480169135936518003445698498\ 9177614053957189552768994493672410015:\ 1321558793354433725697708180673306621094454631744034296211369269\ 35453261869513407243405875196532834030505285 3371841482115264548260749392909612923666167033836512042138667346\ 1110922005108438730679287361069225:\ -1224839645782921647445211493292528894:\ -412996512659022216647456819920862349778936230990047619735626685\ 9000246454258876625428723876322584511859911068016361053904468404\ 6687150 -339290341643379646242121130133274175571738607527:\ 3271401581452035936363564486098243173858343994842704626634540604\ 0333753792872314861533886742557607640566446319092917014148799834\ 8498182361629081026057:\ -110995496022355374018357458920157866276843573465657648989031507\ 1492983893793639677118229990155541637204519376994267321550212870\ 3024690173524970745190362239190804266551097416929422331908148558\ 3331039 -302193108025958893465396831014238400181355654244499365872812914\ 0671578942520441667218976086488594667623103779245243552871642908\ 5538517727995241:\ 2017851085218627867440914776334445037676170997318580940821659303\ 5046997219650546605682041506090881913886238203842281306969809595\ 246163485422064601589012:\ -609780690975771196107607785560739006824539433569270870499177868\ 0127071341610096112489032765719159734331084718676312427284431166\ 3160752183891441001416955478885614399224358737795082762053960238\ 3642229098982445564368202356432336746046757695325766162758445391\ 517573101567916271503836326565773891892 -35188123484838216734793425643059054080:\ 9000600267361446370368675857998:\ -316714233645582443508665110125938608546684298371094101256326282\ 531840 -287546392987328273673797823271747266125547785306672698267720774\ 608232552065:-724:\ 2081835885228256701398296240487450206748965965620310335458298408\ 16360367695060 7239719440345013275638025455463886572537307213436218405718641390\ 921197615256801869733473418374:\ 1273855558831670011845427584052189147328498974982056877978612327\ 370857472534105245496452412950690926717874:\ 9222356853465202151464594272999727525831895475287638674380433334\ 6933374970835844231896759667044442575039030759210684473734626375\ 4867082551600245844507805177238750672856996150996602083141097106\ 5816876 -467193764317015751447832154618223252689085556761857235622959651\ 6527745:\ 4062614168720459964554950353412675872692580185950353528672485067\ 66348747462819:\ -189802800645215543819126042173342480893460145936335827236015901\ 5836446083789360925533289958276050415814781716398053517857780132\ 893397801668369413155 -256291521346916076469577753590332243088939322304016068224382551\ 5025546499325406138:\ -605053480861014149406513375530972230393655979785947325614347032\ 55672033601321733124376224905086861012031956149097:\ 1550700771061164855884803447589885127420417575088485989466750817\ 5220547092689946197222125349076097067231864772732377382975294424\ 7005994565440548405623573916996459703805738162154040744466006957\ 386 37657585687987148872355696565539718:\ -1434800894234388160687:\ -54031137619832058507887448613713814837731429449464666266 4393856668836163872660314169038850961070596126492582636740923958\ 869429568049592915508:\ -725654263195468754856026662040358630736857297829750596111795962\ 7542041685201743870533093436197634453:\ -318842082361080325483580016771866191199973311649234286812044253\ 9591641099237099919800666371105550379907533870255064162462208188\ 3994207992073068621770789270796474452792924978217098797124 -22262682191673391309862211106958012450603677337242458360760:\ 220733215635032249425562508910063071532478728405839033930940264210:\ -491411342882883504420371271016231681619217410641501118113820080\ 3099803240779721785281408106422401055283687004275837896399600 -1943809061953917342683052893090:\ 7700827546161027851150293971073751401383411867756623153657156490\ 3719544057834222201379883202137441380031452353172493763083243:\ -149689383687721546514336832201365455374120959277626078690972108\ 3971845846592875060793450410610935237925773161603531529842259112\ 43685728191984096169649490870 3786170367178724834730573252874138148565139634940161475730134462\ 072806346795721773969696184:\ 5642009735645474144794852846572624514752624565190901861011302937\ 5113755663421195546:\ 2136161007243476508223846179651669079978058344237194176489154392\ 7622668375501304536598877419397709190638503067245194075783305398\ 2326877049744197485569753314370744763673996464 13489797398057489738508057443:\ -39829491566872094526554950598431919339453350924955014031891083289:\ -537291771704743910798219370322043426391226290103531988511540464\ 278547553363892492512309370027 -323325112374943657482631147177688351925959386858544487312506089\ 86289604167358883842577746321363893167908786:\ -246925431746938028131175064627088867042153744157154625487424933\ 24630571161151476958595194:\ 7983719296781021810724607567340308787943618592037051108694438338\ 2489270621359904712938918152105643713875728369108646194020367483\ 4484438934808794593359943127130153265367987222230213154933289974\ 484 -435100258456539648627052287294649432161393329378094060187883773\ 2690708495675481854054541928447945875268:\ -10155417715410577307402999881053155099930501238885853034128275227:\ 4418624872709263597834477604499556163338660202529113122166495103\ 6300436212506625541915615934966052700868562630468721925914800339\ 297995368984918582710621377945716385836 # comba8 tests (256x256->512) 11579208923731619541729388327330122708943419524243289762333678181937\ 5385575424:\ 74179307167655687693225162271190690968501083926425986337482366849894\ 604086426:\ 85893769551194762664489787067237470111583081643887491027483108939248\ 54152414995879834924747381994424629165311199542893443807287227310529\ 677629685837594624 11574114654373435432769681547953871289980961721498085841658839565237\ 8326940031:\ 10711660777805634592035489333768778748163480146501669697332609614056\ 735426801:\ 12397798998107734697368913960056304565756856899698066529320990905885\ 80174831683647898327881664370985256756518936891247178025618131778049\ 267698975117170831 27006267526871349343129256945225699676622244016828866963870625652221\ 609619338:\ 10706691322561929820710026337093404691680917641214496572907959829962\ 995350055:\ 28914777018473950489193423936996699498718323255670979720398132582868\ 12326099575727022500582226148289338093647474428048875439902371078972\ 17011952607363590 # Karatsuba tests (512x512->1024) 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149083451713845015929093243025426876941405973284\ 973216824503042048:\ 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149083451713845015929093243025426876941405973284\ 973216824503042048:\ 44942328371557897693232629769725618340449424473557664318357520289433\ 16895137524078317711933060188400528002846996784833941469744220360415\ 56232118576598685310944419733562163713190755549003115235298632707380\ 21251442209537670585615720368478277635206809290837627671146574559986\ 811484619929076208839082406056034304 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149083451713845015929093243025426876941405973284\ 973216824503042048:\ 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149083451713845015929093243025426876941405973284\ 973216824503042049:\ 44942328371557897693232629769725618340449424473557664318357520289433\ 16895137524078317711933060188400528002846996784833941469744220360415\ 56232118576598685377983459383275149211060880540032345872695461810342\ 17940303990259531467630757141966678572355892742551472687075667803012\ 238361561335049493812299230559076352 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149085058651889274919368784987519218104008495487\ 966999617338343424:\ 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149085058651889274919368784987519218104008495487\ 966999617338343423:\ 44942328371557897693232629769725618340449424473557664318357520289433\ 16895137524078317711933062342952193277060785350743397497444921769834\ 74555755777883734829695075352889186645794406339299840443362841695908\ 49124479353346416074683250011190629511478487550142982175186156043821\ 992372090244262099992413871225700352 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084095:\ 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084095:\ 17976931348623159077293051907890247336179769789423065727343008115773\ 26758055009631327084773224075360211201138798713933576587897688144166\ 22492847430639474097562152033539671286128252223189553839160721441767\ 29825032171526323881440273437995950679223090335649513062086992526784\ 5538430714092411695463462326211969025 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149083451713845015929093243365709243862344436748\ 347824256271253504:\ 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149083451713845015929093243365709243862344436748\ 347824256271253504:\ 44942328371557897693232629769725618340449424473557664318357520289433\ 16895137524078317711933060188400528002846996785290185531506439882279\ 67948175579511934243229492219161469505115934541754787322072497766508\ 32568813609316312895189314891581055577244380152406865341154204627445\ 048144934853380616505964511432278016 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149083451713845015929093243365709243862344436748\ 347824256271253504:\ 67039039649712985497870124991029230637396829102961966888617807218608\ 82015036773488400937149083451713845015929093243025426876941405973303\ 419960898212593664:\ 44942328371557897693232629769725618340449424473557664318357520289433\ 16895137524078317711933060188400528002846996785062063500625330121359\ 98742154443577980079599561074597766784810090551438150849000845701430\ 39463393843012149940933139094628420823280505085783531419710269806521\ 710678242326571370194267352288198656 13407807929942597099574024998205846127479365820592393377723561443372\ 67729797885965581514188847955651931542202341709841678538338597448558\ 6698740166243034228:\ 13407807929942597099574024998205846127479365820592393377723557015178\ 15690541073572989474743035547506906776301480077261237516040494971968\ 7212579269664735026:\ 17976931348623159077293051907890247336179769789423065727343002177599\ 00942480367760499251857295455939596154105772404450931317906536826768\ 15455762278256937871060873932808316066099592555454681197347421682785\ 09568862593066461743520871555375522976812396705343420538862100685795\ 3308142564518141627105027011868469928 13407807929942597099574024998205846127479365820592393377723557015178\ 15690541073572989474743035547506906776301480077261237516040494971968\ 7212579269664735026:\ 13407807929942597099574024998205846127479365820592393377723561443372\ 67729797885965581514188847955651931542202341709841678538338597448558\ 6698740166243034228:\ 17976931348623159077293051907890247336179769789423065727343002177599\ 00942480367760499251857295455939596154105772404450931317906536826768\ 15455762278256937871060873932808316066099592555454681197347421682785\ 09568862593066461743520871555375522976812396705343420538862100685795\ 3308142564518141627105027011868469928 # 1024x1024->2048 17976931348623159077293051907890247336179769789423065727343008115773\ 26758055009631327084773224075360211201138798713933576587897688144166\ 22492847430639474137785575823367462584850327217807092221598818903544\ 47838349239959440410649295502088991241512540406677820071644448472599\ 8099692362528251405302763273230221311:\ 17976931348623159077293051907890247336179769789423065727343008115773\ 26758055009631327084773224075360211201138798713933576587897688144166\ 22492847430639474124377767893424865485276302219601246094119453082952\ 08500576883815068234246288158970519977814343258692149569327420609321\ 7230604120280344292940337537353777151:\ 32317006071311007300714876688669951960444102669715484032130345427524\ 65513886789089319720141152291346368871796092189801949411955915049092\ 10950881523864482855309433042883335846718668037787037650188893055840\ 73018927951831283900011347985854627812829075980481789955530757008122\ 88824849145421420410206954413439564292684600051414432901225421532791\ 01381942730678481306279979329106412319570512109276383150572147028830\ 25199880085119057947572011024091985929007350883874353448844224836795\ 78442377318748543006187648103374862164234771293283689764786919194438\ 37888284136626985706746129572759980426766233612587290367814732695050\ 64961 17976931348623159077293051907890247336179769789423065727343008115773\ 26758055009631327084773224075360211201138798713933576587897688144166\ 22492847430639474124377767893424865485276302219601246094119453082952\ 08500576883815068234246288147391311054082723716335051068458629823994\ 7245938479716304835356329624224137247:\ 10112023883600526980977341698188264126601120506550474471630442065122\ 46301405942917621485184938542390118800640574276587636830692449581093\ 50152226679734704194962494440051486835467919998525700927942192359160\ 54781574497145975881763537082907612467921532090438466226007979275997\ 0325840394840421469887935413626077183:\ 18178315915112441606652118137376847977749807751714959768073319302982\ 61851561318862742342579398163882332490385301856763596544225202215114\ 31159870857173771592553548685191068103016094862345941793100727824215\ 91038007155695622986473612841033928065392845889702175791770421586624\ 26143899184951734174822450721084185903177062211837438496534372480202\ 97467411486790074725866007726424039330919514310082034160544731735015\ 05505148992020823080165429348056649053453259548580079987024817945821\ 06278219961860441688154154020423122651667491374047530445279534822367\ 96606089062121158502205590789299321244993290459201196063373244192071\ 35201 17976931348623159077293051907890247336179769789423065727343008115773\ 26758055009616165775278099964665396948321782087417396060386782903823\ 07012341545824090641587839835926419363551226096078071585202389405050\ 15136893796472153753067084907045685619026471680211462175364329863209\ 0971267582066228875273648785630167039:\ 16853373139334211634962236163647106877668534177584124119384070108537\ 43835676571529369141974897570650198001067623794312728051154082635155\ 83587044466224506991604157400085811392446533330876168213236987265267\ 57969290828576626469605895138179354113202553484064110376679965459995\ 054306732473403578314655902271012864:\ 30297193191854069344420196895628079962916346252858266280122198838304\ 36419268864745685317012104530668242911371513575805609806190451951607\ 10557715881476395538121318622342054920551385626039497775648111929192\ 11010149235353314669473560070738635821344900819492979642122564308821\ 93832836355009007808239907501987022158846860226885245037291654118972\ 21789040347542992939815493420694907963244430325400081905612531817013\ 53434121697017777687388707760265950247661467236793723639977817395453\ 05333658727917987431471148302830409557728284992844256725143219605511\ 19105089461515317003555642348174884134868178964134073119096779203778\ 9696 # a1 = random 512 bit integer # b1 = (17*a1) mod 2^512 # a = (a1 * 2^512) + a1 # b = (b1 * 2^512) + b1 17930121528120518743193890185292405362795914617726312913105692310966\ 79834089760159821608571760102261884739604751290203318392915809389705\ 18533152042879507565469760620770664602498091326659618430896499562864\ 33097556186753511259807783990999180942484334496111552855551238437298\ 5931442517394084353378720570213259961:\ 17181164400078273397607302623726933788654231870578267885308639434063\ 29050645768615733989348336532688661355059992510519187273205749318328\ 55178025838720042408416717379221896884862317068300037779659390111981\ 97244867335458644846343599813562216158033039927051277398059877872479\ 1239444995247411522594037321941878345:\ 30806036568802130707161344222425760549041581576622091565254201628592\ 14385467809668014385184785152271193843047948236592285206889142604429\ 75839733409984928244101830825691058271214860952936075111998155431716\ 66320122704699248615782786577874030694743967942269571299270175479177\ 49821546067026790701696727687868585663474591471567191830596615534450\ 88805296433793120856742255208087463783715754626092601017174650889346\ 66486074650833697034162201049220647206717383818466106882937622653918\ 76822429098414628373727606690842310063586870064304131814649299854186\ 12692628024925259230119912648154125622594020560204924767989260701214\ 44545 # 4096x4096->8192 46230924351836247700632620916046176424079105466354534064042561034208\ 87179012808190823424753309565308557946849439937602914646826017759588\ 34308955397574010098112170264341488598373518621050984822173335661543\ 05503155484221582314725443772226962279179435429752927046418702379683\ 85046488722729558633796252405133615796333361764094300077585699651413\ 87522520295445886581348613967739679507144536630498779984858498466466\ 53949495585121328172175753765616536867610443894070462179968529055982\ 76558996753670646519698363689763792814553110716478538561711411517385\ 25392668340231371551312445292385216029091676115617060930552232679124\ 82696223439453451825724430911002048100764625928528148630937654751536\ 06304398468385126736497735857773379804983839043683211519322520305495\ 88047388177062785807692948814175519084337222913843071456581602029935\ 54683753460812611659451099340378672619627415242236591287093912255783\ 13140160231289453522976275483766396153309206695863277854402154450459\ 37546852895213179224578947936523539421852140479791200605839865108481\ 29541228564089187837510575385124529321309276742969232912010920107981\ 03957776659416089212281297890809164014975660550116306748020139153256\ 22848023511467181919573893647538869361729907908714966872881945389100\ 86101428:\ 54530990288249437719619266581633527950202167725686915722413802215908\ 13898808427693785305297340466057132347876044193194335670208491816947\ 45347065813804383143878587001488929429088856726119741100265880818083\ 08072469093027021085621909472228082331188302646328041787611120322548\ 39496025029182050271578730610401719162676648561607998168984589242763\ 61184308631479552158835170369552925804999967396481740557274002486324\ 19060734996166150772822594482483029608131347141723539465860333111879\ 99028176225288916692803103016047215834727819406429598388635703974625\ 46062134344556400079860063468483319482068487707023772004276424916600\ 70752394601181923057555584615258415106502514105268940487020754841912\ 85424335310397208518018385485167186844809177247714124187041081497708\ 96511319230068019588583992177882717832582994338933822583078086805742\ 83390233167682320436242724359199417834794808081825191377785708613777\ 86102596609226847851937748841875768625507263876321447582064560528748\ 35920609680394258473797857062463125872573573911021820161622994930998\ 20654635987081600595958107506315942531393518613570935900767436989518\ 52479980745679719049556332080920670567304319030704337342023640878866\ 09889825375285512294624431826722345023789066121979651546281497741903\ 392437648:\ 25210180868467768546757726362059843626852926905412382608676629170550\ 13500472614635251047265443464861022066815047034258382305517605789179\ 87828662358961696066164456254433404354134132444755460484661087112315\ 33092792254341786823634449794876609511305489030701548587221933119990\ 83152382137766693945997257582640307701836825909703642483047169261811\ 29415178374784201058252543144281486261236848516767550523665279551861\ 74465512384172617149107052187550658300617578084736260341723260747161\ 99876271562142167533309479325645255667176279131317552047451026692967\ 20839234037422676688042090117497405271103578405099807691583810119265\ 54336379063605406653618342419878681737223923065560012276952760198274\ 01935961653423534734281217002142980219703525915889622098752381243251\ 51337680928833690966007811584949672395686773570000393884061584225434\ 46095563213259068817841045213587660574716357554630835216272902060443\ 34556862089899310391156917797805143517814316196396914215338901147216\ 79277404380234128913536426196746405226500140030500544578565101666905\ 45355602687691883828602277709718492121846971571916556642975486330113\ 36222756064112088369190359637323581593192113210931211230367909305308\ 34626706120315368242528268242337577529275810260388371559227416421225\ 18288153930546296286935770867979820870699234878779491860155905073232\ 51502558862837164130223049756749662881084284616449485647823253076640\ 97817765026456231979422968578849627137552880186111486959114938973490\ 88961199014636207851962534069247724700485273408823799958467863418841\ 50462661461823344684758580652604422779162692518313890388399982545703\ 35206898267568862459046844795531325319249988156277069565297520226091\ 64600766297485223302985129710063725127737025349700933151412377658954\ 23709434501778907216692625235665266668930171909330255035266777372724\ 58877961350127654808072552639834541127026665379146043251830475968219\ 15018615283403488179263459581211497821758602281724174575392739616669\ 25703910463568680165861589391919447127830393426572990195899393637221\ 86477741974371802750413668808535147675421719142045765725335254381364\ 41785131009861024178374832421597792578801840696203626157231517656464\ 14052894526701810933176118179541201020906393719709492349877490392992\ 00696634018140352649412293680281970033556175696751860800582932013588\ 35349743517428143168973670929259662004881928288066741418602389631277\ 36600832956552929991925721216698487543280154312867126099744478225237\ 72707253967514116707979742986501040393426058104944823682176865543029\ 42410605893761344 # Tests for the asymetric Karatsuba. Historically this code has had # more bugs in it. Getting good test cases can be hard for this stuff 14092703816360934475287812379721584643540920654551533543420378905278\ 43263869087702953436962300677113653357118503684241080095903812797217\ 981771103880205148628392675409404139:\ 85196387648463903836201075338727419426772257423386800834159433024105\ 22722534550698330414221220484658429569965031071685565584585568273727\ 521831711430243837:\ 12006474573536728376030033121297441343323401321882664768043719554452\ 72355962084445501636044192472676171283378029237295859040510289867684\ 42082336586473179649397097120830906529744851914004493486594202273964\ 92849411579105282151504500626551480203959164076691081552725026900241\ 832342905034386191256909160400547992155689411647041343 57586096570152913699974892898380567793532123114264532903689671329431\ 52103259504474008372078212980297151898765610906745757706580551032703\ 6019308994315074097345724415:\ 14396524142538228424993723224595141948383030778566133225922417832357\ 88025814876118502093019553245074287974691402726686439426645137758175\ 9004827248578768524336431105:\ 82903962954674429277182094016068528967498403743392611678986796248035\ 46708705089408694697316410864619322862709322416615890526565883322100\ 81247286886157264936638535413026388243763541729092783487919143933560\ 11669949922966041936103836718052579102251260556254458882685015932709\ 9748064577321171189330220691056136254107213091963928575 # Got this one wrong in early versions of the asymetric Karatsuba code 69328033643988284668153554428298153814569184083886776453465872993395\ 29710746972404168269687728407520676676052832464833364865313305188652\ 27796258747613771385136143521786728820782913230366107236761071531140\ 69858079626875179117509513890923817643832927518504150773412897517798\ 24069151513573630274310883822191771430575394116104021217164852793487\ 74039487132887730707079890109620203394040795732717864706534187311456\ 47616397480632810489298476433897092835849191354914181079718876936239\ 96759799034047278741267946259806379049845381337965241128934112089387\ 26387200493807084368512264417392541693498708056601725438254379619500\ 04878549999476514473638562844231061393907117784824855718620742441873\ 33707730767137725282689693949863277338600908221830652962675544003225\ 784824252054526036890965:\ 69328033643988284668153554428298153814569184083886776453465872993395\ 29710746972404168269687728407520676676052832464833364865313305188652\ 27796258747613771385136143521786728820782913230366107236761071531140\ 69858079626875179117509513890923817643832927518504150773412897517798\ 24069151513573630274310883822191771430575394116104021217164852793487\ 74039487132887730707079890109620203394040795732717864706534187311456\ 47616397480632810489298476433897092835849191354914181079718876936239\ 96759799034047278741267946259806379049845381337965241128934112089387\ 26387200493807084368512264417392541693498708056601725438254379619500\ 04878549999476514473638562844231061393907117784824855718620742441873\ 33707730767137725282689693949863277338600908221830652962675544003225\ 784824252054526036890965:\ 48063762489419715168951981307754794589808870758952639965091476616647\ 54056167932393419567481296681069246248216008267853889839320423981745\ 60479443107279226057663425943342008520701374986979347783572983701184\ 85422697584729139817700527441440371002219958422883649678565900879400\ 20025210106297773515746894906726443036026187076658079744151459354129\ 76880294234848336533442648147663722096199825871118396947178334215521\ 76943880892409643115274415151713386236948639022804530054018234460138\ 65934020545172727964007195157289495135921213561302426988267171336165\ 92297396800884174510773976233843978906677436838567701962214997325767\ 17494685809458185719292759364630203908885946118898336175097083972837\ 89342035200573700398720235821406614593531258231227043379738167751614\ 68684582976839207443768269161778663395778873870774323940683360928515\ 48027194465603770338336645857674917792255648723659298382428421752797\ 57375177034382470966583814365325881784225896969066012430257742547184\ 72418596829523189950619686978201887223055028706607853375875849336866\ 58034693741263352377027728101357005623322435070019152178347117503006\ 68898867912930645058149633650634442077017541758124699937775536013889\ 00090985949751232201541388041823183135436540422469067343022614303960\ 55855903221443598575395492738166423176780792097697804248465562838489\ 55947563036566122615600202990367217608222400507033340848053927107788\ 50110168698504066173013701126736282373942179302874896060705586003228\ 79037941627812442489494360833298836822298442280730034168111230609093\ 310545565906004082962175112065394876123298631225 [Square] 0:0 -1:1 1:1 549755813888:302231454903657293676544 18140671814051116644:329083973865108631122076757343293822736 18446744073709551615:340282366920938463426481119284349108225 85070591670813493966310340604280700927:\ 72370055672222822149686532165239924548184855554193955235705358728264\ 18659329 85070591670813493966310340603475394559:\ 72370055672222822149686532163869766764144178225565969340654319581407\ 26804481 85070591670813493970922026622708088831:\ 72370055672222822157532909328992644361925323993014681825303471075565\ 86946561 85070591670813493980145398659562864639:\ 72370055672222822173225663656498083990682319746609654242487350548038\ 36600321 340282366920938463463374607431768211455:\ 11579208923731619542357098500868790785258941993179868711253083479304\ 9593217025 3138550867693340381917894711603833208069318394046068373092:\ 98505015490986198030697600250359034513838056601414221774853647899383\ 99716620339203600092485547982803495343709640464 3291009114642412084309938365114701009965471749407831540748334692:\ 10830740992659433045228180406808920716548582445089016068317535718032\ 308295472658277178853031537853949474393196307576171250734864 # These set off the bug in word3_muladd_2 with sizeof(word) == 1 251232322172118783022840239225457019863:\ 63117679703995287066909540140557654581113950055128878944628202319505\ 176538769 273689842353342519508740475928754711696:\ 74906129807397480797309133044676004424334564639782656684007505697520\ 079196416 271302823667110475639266093952890097614:\ 73605222129747240032647628582852465568122948805929122728180342334818\ 448492996 319387279021025860024422185475130973014:\ 10200823400045462544411223752203740218511249559589398235010527269723\ 0396244196 293643199753680203052743123832843662352:\ 86226328761579733262787961688682814116999624225084316052032576511892\ 182171904 # word3_muladd_2 bug with sizeof(word) == 2 202324725318880963191371356135299852624:\ 40935294475360631472543732691759944656086403346062162368816126408076\ 119685376 309321842385349400717946354447033364075:\ 95680002176666937035836738263162897574421497416350873907840493696211\ 500605625 233489517300128090786970749707229607527:\ 54517354689046815002040771363970021549478312409815296261172173208794\ 455055729 [LeftShift] 2121258017766159160754962465958381577677890208124499494536189186\ 869637798499791383037162061664492554205374097:204:\ 5453968336700566799508983726051663849667997549076624612345231282\ 8439638899716201006845993775936915589934028192020733447985075402\ 867441526514914927633382250278301101719552 9127815530925814339720645654057304030995143310324020188491605652\ 0167383202307739291645752386748299386607033417580789665740910548\ 485496057884342754125:116:\ 7583092465041842489806678334004575989684288504372713429243106807\ 3821340263788338036051275796540123856480834349684104861172576642\ 18512263948855799232636502228939840695954790558990336000 2720447254558553014578566972012963115777446398846598038146885883\ 1866886314261120634838361392523025566783357944737665:164:\ 6361500986895495805616781332881685455158868774711923425935172754\ 6665493357037199343516238602124200135772591677608344475613159685\ 2488399997844504678061831690534256640 2346814922039931311567833556790864002896525919808081028569793383\ 4008825609596357974972673276604:112:\ 1218535974727059175894407931694205043690238717758619344357411498\ 0976423842428997921600747804778709388243970226872640908420343398\ 4 136766652934857914:106:\ 11095829099781028284216214312551702886842940522496 -401051144733532769909045041716441134958154294462987253741112236\ 561026903932355958855274471955131:63:\ -369904391368386363775763871932535866765470702774151965641848084\ 2144652587998489299622223077809753503943936440270848 2620878467008554581948549874850974711547561914123735587938770041\ 8388598339275821514904454964587607270922729716663659446422771149\ 9620476383257:195:\ 1316121661879758521098806625253965626323323320500789427869263340\ 6367324456851018233189899650111735222276905756611447392283605658\ 6424209018483795579529997393099798973115070359293039187878410704\ 39858176 4986386024639314608574963909430738820138995826850354329027683283\ 7084148930520285795218001501791951858649714264370213994065039723\ 183:24:\ 8365767539475510328001762170072394222505708301016699425463251243\ 0365357678350782716810417828388796339416772455162018414465188948\ 4421398528 -455552309543147716127587827277903635248610246950391821050011180\ 4998378889619941436810075030388024035287640271262080871447338739:\ 87:\ -704933054965487499017626788420861259932661059464379088499410099\ 2559199084336675766400427127749751321008643932765664940335284556\ 99667386383995835821064192 1037757592587696398725288196824188929011363632075879222442626801\ 16359163984447531185310046467135652319371987503:95:\ 4110981359797486520990313529905064933484217701344426282406713957\ 3073026585644903347542613235747258250235327631427113860134353360\ 95122325504 1078541466278039800083311:111:\ 2800053733577506391526406073538574747169164913752227708928 -458929098580755:143:\ -5117230445820379540747782782105603341274706553475212247040 -122928855329072870073433015110819526943336867562196620340919010\ 07272608951275193:11:\ -251758295713941237910390814946958391179953904767378678458202132\ 62894303132211595264 2253797880121520663606973674330182144804901367932449178312384948\ 1031054670305841291542789729087450336886747413803342773383544037\ 2581272420142035100:211:\ 7417269366041670925252065169199359207792625796677651698479867559\ 0580700643261572311187905593603949279149066613049589728766147448\ 5040626948461011388280995781694782614846527093302465736147768556\ 526048195169484800 6442142951860149863781434107200105215105005142361888584824558528\ 2484597164156116892847036815:107:\ 1045297456599241794709977613787275378715930460342137602357284620\ 3705135174457613106078796927549665575893358403516669173432320 5097783526093860243839154243285093453167843731134916160503060680\ 6809190520533632436146045688586:126:\ 4336714610774466073591769540544761879648163769201204653675081413\ 2084346529112353622016096796405522770364375296300671020674092934\ 10304 -331899363008322441533569955164860025843805741291332922663910367\ 2943065616917605415617171113991360901486760154578289560762927508\ 7724:91:\ -821743020962630744101604179924332933222787625033777030204941339\ 2423604240087684356284281911697948345840642580768340681886419299\ 0501324963749459198616746852352 -184253938912501307159324447512804721862709269931381112790263931\ 81321750494139191589459903767473167677816275893773523:152:\ -105190403673940947755727602264308003613546006738759564870362217\ 0667469418523232027185126832293519850235443686300723583174147136\ 58107043639016550258714106195345408 4027173611709683208685144938635076643642081573452904517803697826\ 5275420130:216:\ 4241108819962870257795832303288513204199186270237663098986852370\ 8839925819263809342179370062199525789246961806149451534207820475\ 33392199680 1654910280148247058930466878701929681980555724947453908536393353\ 732583647848670616170583254506:78:\ 5001659417042237892080348861898586734617398707583112481824590338\ 23652150179951382510963323144882735068533089594507264 -353256518864739539912727355980967022578755727546889874982122719\ 759:107:\ -573191472861980058226433447553366186933814120008015485620963412\ 26306829015345625594865954588721152 3358622889967376849369646308014887582255587127977426994425421674\ 4686208321633331897065809513496651:69:\ 1982581020522590603474492135975397792733918369926415317084561070\ 3822831264254057644126980676514200036423975856884416512 -8326918561933317515897484042242279813635:222:\ -561233200828572354853379214799650393202723352144809535912742619\ 21980589457786088539861748815344432096215040 1738239605092625935802720509793:210:\ 2860281191896129448328585042777498571666530315075635885634512550\ 142285038644212151822720172032 1541590531164046827151493969434074217996086405826244177284191842\ 623229626655598394491064824017724575585890968239654882203827:130:\ 2098304299069634414151232805637412871131277307615398366601971342\ 9665834217942888720462643703124214574302721592303513592056859315\ 13427518479162077139334989713768448 1822414219485473007729455052579570934353421556802754634400780753\ 581487672806631709:25:\ 6115007400355837902569347395883763750593834759507216779268585854\ 2958784576028372828684288 5336246625295048457347325312327723275413189882766845079019668950\ 23491709759645168524198853958247909:145:\ 2380045526144475863333782125314997581392105067362688736487270903\ 5095219526391819075074039117499741190364575496806391148745118026\ 089345253900288 -276651306081170196285504936260680311592104354245874357656134941\ 6718897362629511494172851413903784541053958724076679151843367695\ 9748070409785949098743856:225:\ -149170089146918319214991272148007797149650392266859882932532072\ 0896314266755406819672840795334582356690986796948912969229786129\ 8759392443252182124719967927140260518022196506128222178285661500\ 32303899305525355025417633792 -103357876921000174182112715460846616262383449332882137139998255\ 68582685162004410585410474998733490779307256347656936844453628:\ 128:\ -351708629986009787155639181729583046307639877673123732501848524\ 3559886115426724541117518475093181639785217728536729396711614403\ 275792414126622561825487435090362368 1094708276267187017583512230031436979221999105657255772315062187\ 0590945418853726695999585645264076550:76:\ 8271381875782668577777728720058787519656348054693237381352477271\ 29815039067706300744940289871871309203285264026829638860800 -815525457724752321603940535029563571154068567797107498491974746\ 2624523816971433695155984655769263875263814891:185:\ -399932520776254684164524385851380762766645298639846935216904114\ 2896647055743804753583601279854374681737834012702515619494942793\ 50304095670986950350223830081561690112 4052679849880044255138459864411550773099421944874654179650065311\ 7857061613513287290910396020606030441122363087181232793161493035:1:\ 8105359699760088510276919728823101546198843889749308359300130623\ 5714123227026574581820792041212060882244726174362465586322986070\ -248399491197694456686506789360892375748400795979825040399299010\ 53517808438265883:176:\ -237919445383638978127975473390525029152877274034190677596480116\ 8519869938343860007136898454280955008871656020990685920874468986\ 585088 -341602794141123390057384653491582990307091266762526194256752907\ 742814:102:\ -173213194813054140534683117609830955377834183581805190021073324\ 3591496880056169249935512491320672256 -958393530005648757477093349096350288904499954214052393312348399\ 2770943667934610603880158622319612235433869275282625539708353046\ 09:167:\ -179288795303756735253272048111864507295054051907270903858033299\ 1984105913251800521090082264035457471680922762784248326006303327\ 80357892372568802535086338017562314555143800752177152 -244934270799654899396979330417224591920216069659327770883960842\ 308099872348715409398096:24:\ -410931516700830297264139197394514709915731976734558842691872198\ 6944930107966825746000286580736 -2106457461641547906609473458:69:\ -1243433014305839647767580171740431469025056260096 135142685675091:202:\ 8686636920585527698499063657324055240285043487766458873488405392\ 44004900864 -116790541221558472322206451254911347381714818839018118383610841\ 510309754344586351337420036400717803838650415501291198800754587:74:\ -220611094952357360270322465694065886169870282492555195903063877\ 7058528470895456709658637256734101042181231965942902938524566534\ 006236702950668894208 -113662437497188191611046105180147670725123405622356749057822533\ 9374200354866981925638532649150827622554422704805900523233811186\ 7804339566343416115467056:164:\ -265788541608259131511323286352380846617232004964000794820926894\ 1982659118064626109656559724002147778215968030048122363389101341\ 4916257633270717425007538758533769604203658211543099937688495500\ 8515178496 3139835124875473212694109318074161136799592793072048253708819570\ 6031251397956934770541559259048189239569502903816890554914148616\ 8710074892985168204104697:95:\ 1243816837708147260845084661039007547826018395188591656306366764\ 7513402868999491043335036172230767347465042406686594960568733454\ 486595586019513727045751542829562936306306793756164096 5599994070119518146348:199:\ 4499421759449900671784284327121118030698801585196299978528243915\ 527017858726887424 10270683209834825258725306919273690176679518030925177258309490:43:\ 9034188491533697033850866046124648731048958323889347163636163337\ 5107153920 4578000383070746273307:184:\ 1122522427702119950972128384343669227408405080033193267723578847\ 06832894656512 4806080526717717017641435948049790217951184540837962383194474375\ 4177372178226:213:\ 6326741927653364567544399799665952033829979000600292660407440869\ 8862171634248299057579558184663298119372699195026451647955448240\ 7792959291392 -213240753886670778938493896779297584390212374893239014196784169\ 31016786722016582:85:\ -824935210136591658197356601203169660873055716952680926144487605\ 063939313393392322678258809253441593933824 -187286407031666462047035483383441327248520717346072223723620843\ 4454125887374738735368124928725176429609366:134:\ -407873676011864041904214443478531790285593140265704678916369737\ 8659007443902659865299628228125085923760625746613398039989747449\ 2137333668230201344 8621689714197434562630867265841464865623072938828506100870809463\ 96744539349725331277869713700313427547966:97:\ 1366161267647991190642664883853673418069284183801958399635868396\ 0937205383180691314472971265906730508050012658612328503341173152\ 3633152 16955933412697913917032678757506722466737685:229:\ 1462819393593898553961710324275156357656459346902684987437691843\ 5481519688706703310919911715271056730027164958720 2180018258288311836232601230248111131649953969135839015779353659\ 8104321725586576274057148974991731503239472085567581116:165:\ 1019552081247881910408108587819850135603932052219933414781931958\ 7658929796456697439849089055853009742845594506749609005029155283\ 87206223717397886377023326519137153318912 [RightShift] 3163645694280286863843274284995813000413750703767888062060371447\ 2548769377833432476732199026703457620511:71:\ 1339856068247304299517035929669762064048406302964464795193542030\ 8616778680708128951 -14453551017278988424486997167045:183:0 -14453551017278988424486997167045:184:0 -14453551017278988424486997167045:250:0 -243110742861195501591733619507439366721710893401851315001032874\ 934976816617401149916967847829528780962:77:\ -160877194558516235935268045675608004834374082748681492335699377\ 1554731869523279 1578511491667772739870432690812184603408439934845400990951391424\ 2042606791815444346835351458430330984370157647950174636188696067\ 901582998887813:172:\ 2636868630877883693962671763727310843333678410156464570287439347\ 867714845687034115945072876 -369990587551414900909444219626623817296602594145580698921004093\ 03886523992221862362854753622740275252526720452:175:\ -772576394901327014846975657022405166419128733678436351046 664523869708591456637358847652496607157050130461836524747531314:\ 191:211729 -424946102426960838249158490450106473832054726611725352096551869\ 301633439915:132:-78050272313569003846694186065678698 -2477488754280410161548750939069:92:-500 3885576822798328723491155206700259517121985332303318810671479550\ 5721679465077987975131032494226814645578292798864088316633495241\ 72281732561:116:\ 4677092971402698635823599561404354384957452158155534044221842927\ 8654700322373721814974862542990905781201 -7784136527805956:72:0 173:199:0 4615578569620677656625:149:0 4905579994733063495470152932606524195238444602458194107223829134\ 6548096468622028014016518915362921381743841987304665341504653820\ 77:36:\ 7138558422932784735851095949483750439304923351240277562790767311\ 0236786987839191008266816665655527877597839669476765763 6860659646513892651503913841872495917865372347379124495074404003\ 48669:86:\ 8867194763939375066201545129950170866662337 4932993580763155556722299514:18:18817877123882887102975 -278747767898647506540238310041925406724691634519605101611983422\ 6204966588409142854005261436295569885823506142825506136904961441\ 137712103262466261:104:\ -137433260320539729826934608254525294966481185197904919592889909\ 661839883445042061361887992911622135941137977531125 1882169262671501641122532021045100553271183358274828402533612516\ 4:215:0 -113308045504297792964762442633165425691924733661899127245385800\ 0508491250659909229734510933018929528943605300925959716095482095\ 0781551497986883190460:29:\ -211052681327420832523633619087125036291637893136402829075950756\ 7637583707757125105214325586369129883020381072398200102328289477\ 3001878518586 57567025533800:64:0 -132072785244069918116388563501248470774742728409639846537789812\ 5119402223003876981196535555849118422274367340745545:47:\ -938433581467776307621794014588434654731534070106419040781914109\ 4019259860231421876594989980795833320 332:218:0 -559822315679298304410139625796782279674102061246050482023351416\ 534297836795811816038579409314284017985789979551604:185:\ -11415659555585642743745444064957984965053472879394546525917 -165370654266946240954843198912509990578949570887804349975976624\ 7848:193:-131725325 -194216125550322203453264566553636693381698:190:0 -574918037852237888178117788291362893480850545560575590351360319\ 3555180688115045992424767676514653030256481410814556185745502407\ 367635738697301:25:\ -171338927105736103110944565621424583637967868316345092758941745\ 5659860577617599365837802790556744644122267189864682014508695127\ 77556053 22512966965683176238772169284:210:0 -571304627859240495908938310435848221105034147099897333911621990\ 2429210200375110530363596454364595974303366523715867605148466947\ 82:64:\ -309704859338005592964733519326108195603366962254800737268694205\ 05469907491401631445860907279418326766038568169 -309596777436591740355404153813541201302898762127036944631572788\ 15893302883997570045883151320905855931366:104:\ -152642996313836176964502120620181580006920013080253805054740742\ 4297460034 29089712758204609787443669188235835:57:201850430524318292 3772893855139299527739062333307773429569483215869291954483303258\ 8826307095346005890226120725877767624562307811438348806708086825\ 272884:33:\ 4392226523649063342878434729422178852336345258948034553885580109\ 062873187398771509787314655943513804180816259635420144385202 -107286131603440054982169113843212878238243177589333571934531:\ 220:0 -171860798431436300064006491940938069877937918743982288348494291\ 9605122825021394820452085254301230580701:35:\ -500180753970740770641733228522754710510890927235544334248681238\ 27185564005671616773239955489 -736899297617589968040433744284158522983339306401749767611116884\ 1084063920382957413309258573768392475688901297388389668250828837:10:\ -719628220329677703164486078402498557600917291407958757432731332\ 1371156172248981848934822825945695777039942673230849285401200 6494520002849829489554410861273180035603713191696971145227421658\ 53859125361930352324226:199:808309944002185489853551692 -8811428348398:35:-256 -472961757341800595001320983673882525933533190954393100297169797\ 9931906653571844489680727773893833490556432129528242730860714016\ 19:32:\ -110119990385556732071871166972881771142951490114068868639219970\ 906430544647663936244340794484453124239957708155928243204 -950911712685005613285113124954832473131420819362306322439787774\ 9569705:103:-937671343067445278042307956226145570513 -879814295274183624334539929331740552569451467718612745386330333\ 5306363907959342879342226672:194:\ -350406259275000216456910916623341 5510885178270303556262037168746873477241029300667748255749519664\ 7790961278402228092443936180348351958592120159109985931085584854\ 072:127:\ 3239007197543508321556333059695431531874740086907067131644479312\ 48944861718637164159925014157 -532599980357955121299969897485530088860096014928320106613667412\ 7658734:197:-26515022518 -751201308625232459519354741343046361775777470541080710058601279\ 4485802280356383896946090:190:-4786930913611882742357623031549 3399159309738603281217586458627167057868700201720622195013008494\ 5155275705802319966198750893042523074386045050458079803807735428\ 3187:206:\ 3305159424435509522890985455639702285024494664087298807252559331\ 827343 -163860953109333686549278104073264560158695392823410089526219985\ 3597217435977552163706193289327636667043413089396300868558342495\ 10158:28:\ -610429618914923394282453149830045402641204717842527067386433427\ 630818425110560716579181436198814461768944967313222910671808 1169677491246850751212:155:0 1636926214665128743997698266803409352776056144809201:28:\ 6098025346789988666764267782879655632287473 32036789:197:0 -179819529231495425818261190658137469439875298005446780128564386\ 431:217:0 -13881:96:0 -201081314010698664682270171218698566959371060867314287561113777\ 01129681335253:40:\ -182882389718268918552230544463508128464464844789576352524012488\ 18 [Division] 31082702275611665134711390509176302506278509424834232340028998555822\ 468563283335970816:\ 12141680576410806693246636917646993166515042744075872007823827560868\ 1517825325531136:256 31082702275611665134711390509176302506278509424834232340028998555822\ 468563283335970816:\ 12947964052188086825220046400459488806478932301299660383343378609832\ 0524868413554688:240 44966555772413807289969128318278041600000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000000:\ 10000000000000000000000000000000000000000000000000000000000000000:\ 449665557724138072899691283182780416000000000000000000000000000 21098512396730698729871269182769821769128761892761987:3:\ 7032837465576899576623756394256607256376253964253995 105492561983653493649356345913849108845643809463809935:13:\ 8114812460281037973027411224142239141972600727985379 60281463990659139228203626236485205054653605407891394:5:\ 12056292798131827845640725247297041010930721081578278 105210958105812350283560987:65536:\ 1605391816800115208184 29614251982539440611171209425825912338459:524288:\ 56484703030661469671575945712711167 56978246562469415670177504927986945371616100345225344293332816228560\ 0752167:2147483648:\ 265325636428172773077047918587862259576172103850288988525666372052 37676726270241192487393385601963645387543268661126:\ 3162948793160806:11911898906396771271361947212182077 5381521826168870805682913114359466560841856996681731280221235281\ 1509347982906963231033117814383486428722076978472087592957820313\ 6046584241121779503933:\ 9668544070174123246320200737076440955801117408066349193856053605\ 114866903799592820480948520645947171624952907359157045540:\ 55660105462724064753070630466 1723834528325652138144287068293892732593026664886852512770150633\ 2776744620689:880523393623328:\ 19577384778297865485961051332688212998820791370774585297291841 1515496213019297763233177841945187397678421298227998213327928627\ 88716894139006899352549523462891658:\ 2837504714791238631293154232954335398939684196417059468771514311\ 350:53409469422883270966457345156344 9404536008735908917791097512770771428224998938693723982728653696\ 7624988457783138098124870580583091:142622867370:\ 6593988875807797411127801190252266506668676674421094260691453448\ 48811732719710346250661 1392866713189645633121390285073523887805815484659191269343858827\ 8526805205835017180928664701580352738609190657216273081064279937\ 78000446364:\ 3994371100075737516464195988347917583672726362309747721542773781\ 23623981222779902598092910701666748270156408025264:\ 3487073880449504057292395 2676049916504901888523537181437273561212503:\ 9341913943837642277221766393692439892564:286 2596351449981306834637204601381844425730435831169992187762230868\ 9984974618995828593891933726738665906555705360752479986:\ 1206034745333560481629722627489368003481730232554297338790:\ 21527998758138745589857127563572880142324265819094147184332850 5972458816709701659388787816816316579897252032508674599704692592\ 7058649324526265892715874715058327035883363955854176049442032564\ 309441091155243908284:363119954882801248387416067701593:\ 1644761940620239975738766021378227306491031556802927687823754679\ 29691855045229469191916674982018556672788351294907277 1179031947959075688529396972036519234258725785851394295456390535\ 71085372280587925290861953121759382460651235055866819:\ 6944577951175401788316018705171160466581578649464599557174064469\ 156454663085245879135170220436247473693597253951:\ 16977 2026650664981190253207120825245989396597395032888279675327874031\ 6428571783495257002384926183573616802093352971457675644937672443\ 66086144671180173:\ 11631153560785819891286797700491247192758386954476186081000494851:\ 1742433073718499161789694097861808628892528194276009183278062135\ 44214369556426533 2839636837334372650605745847855168203149142969651746071725807516\ 5633540988132586349575016474518431300299708784295829212402097919\ 78638935225269061241787155:\ 1906569338917937819117576221675263213381604280817243982366441014\ 3748504584308116848567559666016129206267348790454121809997280576\ 258634989:\ 148939604732445334 6371345663036222144347827991463755679970672243967017350001151581\ 3149043621560543503748545334895102360498672050891243434943238417\ 147807583195634840:\ 2803012481163625225461909183974367795369310930636762769680881703\ 4432088350353366279882990440057382400481292913134:\ 2273035067040180000190499573423209 3448761565369806483093631443732798385337886837688124530151199904\ 35214907404151562329499651293972622329230621111836:\ 1154398728297611607347339889796530761810873173035278653857672812\ 71070669711745252818396963830424218:\ 2987495984559585 3939766758764969916635508714517181254109527059899723535687606136\ 704576526260284945948460575945132796870670558656976658696699246:\ 2039193601576864286342975169071164596968234:\ 1932021930491755924504494733348282114697992509296048596879364255\ 013992177897790479689 2599570067192469214877296440421668709321992436666111483543544040\ 9558626508316404576861534763496892008536679796682457407142:\ 9865947223638288117488793858111648559036360190603549966937638974\ 384878768890886202494341034:\ 2634891519553273835810191600375 9953582546881861626054758979348156073957328868768555275026281270\ 3558132981561279486898511993570779719758639416109225470113031476\ 11758278075817:\ 72753887765933437843645860013004267290394240181603205482549:\ 1368116928528260130222427481511416637491457702447115334585560552\ 89688431510521935105 2777707354230450548824097922478859820718131575494711827631509815\ 849966141849784996342423141941423856370057172664302140424005921:\ 9887732931045287681192967993534615207992429003750153183843126191\ 7060602813748941:\ 28092459349393082079339190162534632411372212185 135175390055754599158926343035891673287590:4587240067074273761847622538022:\ 29467694753 1474508901852067097539817612956066371267340106475397703336120311\ 3477874932185558462473899178369214022436285310129280494436591650245178:\ 4880369721764333040209711516636996332699096293749849371410907103\ 371872025659064629729192743174282304112524555885248623478:\ 3021305732793 2458344447588213641014490759478425477739674803315383837923650388\ 1993781110774393121943801110702528757067967698929051580978401073\ 21258908424060287326045:\ 4220549808710022650484813532790907621975000231990739804525754365\ 8980362:\ 5824701896693376525879103155093475976637389780048291339267026554\ 0931549290645770 2235359829795993754168620762055024950392775900247276637443301544\ 6834872612125728471199341647165418100481804191461888838714869412\ 86190239242546459829:\ 1079446102417965701004684159063911518960227791488787275338443605\ 347380965151141469660172384738541132220010177148:\ 2070839687862853380670878474716925600 2261859020237326202277047516915478440734386573562935959890434522\ 4642995494057840711903761496596915458217743732578579075270459080\ 0633340:14203382288913876345794743990430:\ 1592479153365299674692434597912939527498958604158881610792107099\ 0007263922267553892387895651241383531760 1627272730547121895847771240538443456605751355188756262440532414\ 6146087377529161595400371637008556124469065:\ 4556444082143966348635739253264:\ 3571365523663868043578518888635769405026391569324510140958668270\ 949379670607 7053322761929289086579214480771179517943045501137109771651701088\ 637150889882789201445500740549670389506:\ 5820761818383944703677222410067006495183070681923349620668953689\ 735114782073218950052335558230765131355225215024903803474:0 72782874795717830428761392759834069051935680000647471818367555:\ 676006789231214575171585611498648177407768:\ 107665893235317651024 2678488124982838045802785770118519145558475116428679203089749164\ 976612334859762291787998110260325948674165281:\ 7944336793457702698467826157627761976858612495202494286895968701\ 65:3371569200324712887203021916554964731360476 [Modulo] 9:7:2 7:9:7 36049713:3409630:1953413 -5:7:2 -14:7:0 0:512568576:0 -0:512568576:0 -512568576:512568576:0 -10062526826820804:29:0 -5:199461981:199461976 -8:7:6 -7:7:0 -6:7:1 -5:7:2 -4:7:3 -3:7:4 -2:7:5 -1:7:6 0:7:0 8254156815303331281824478486972822803470138521315156647307553049\ 3310587284245750487869183215107304761500042605982935676360476706\ 01141527698603403:\ 3106222408827874796097424168822651228359402578430811:\ 595826521675090943156444889338281014934863303289705 136863920521571139850391995526246731:\ 271472461994419020251392394864015015809448271748774:\ 136863920521571139850391995526246731 1828810863480002099820314884714568551379787631093473955109129851\ 510111922379100046301719263372:567966528088927995495333:\ 385016512426968327768361 861:7863900424362475800352483828371:861 31298056599359036104:\ 6834101648969675037772759079916190769657938079502342632053787936\ 8365474573457851465113672049521142215618176993202488827600681:\ 31298056599359036104 301132649529789235293089719211083808148317022029687377:\ 8985923799959631221206612:\ 174445061721403490019281 2281346996471575399039236209159382841371310520671504115347726755\ 6405318252398792419321309385257790020895332595371743866761791127\ 088953387770:\ 9148250100428904287337426958133211831148659494946573378694903126\ 9368755379167072338:\ 5712279541400722125363135520469561121058328307700157395773665287\ 3288007253222581108 18204134548129881201198951067056774604374867858971160:\ 2073934172352760752130567032660041512076751995427049488228564629\ 5445506418304709424209443465714405592187482184410284216568297836\ 202471453:\ 18204134548129881201198951067056774604374867858971160 1965719248782007406536742098914361273948365800827075363669455004\ 986089949754002988457038216772776062129273:55:8 242013738395129963274394550113335771936345:\ 5855690525992972254238170169720083764160159959672754491605994128\ 073126517:242013738395129963274394550113335771936345 25207834098049778316063817949139583672551899941064748428641:\ 2394034335403109766635463364608199166358381072109847929528549615\ 46998:25207834098049778316063817949139583672551899941064748428641 2806019740162818318268355414902530432876592478224294545991479160\ 4283116668034698476687974823971:\ 1582972323756438784786521922113831032463998151772165:\ 1502639578247286068956607674581436779911413521925746 7646186835577905185055298334837136208896759894169440852778842148\ 501161592245256816858212924947738806827200173857627:\ 52896776132731697503809705:\ 24742696196904988498029477 173957948128989810779090250062796172580059019371598891820856745013:\ 1799947313993959943024637237734385080822192208938376976998702929\ 3875551371653028911096579734599831769935491738680281300932262194\ 4984764:\ 173957948128989810779090250062796172580059019371598891820856745013 1013844499640750066199242350792839164:\ 19498430190523094593606790431509419:\ 19424559924072241925296038785858795 8622490124309718848844541942762:\ 2809153572052317438723547427922294488297174937286864313874241961\ 8679887592231751654390695362494978870866660168195696176431350266\ 533:\ 8622490124309718848844541942762 1072609375974667769429773421465107051839877399085576311546582931\ 2311070154546061306145007166868107111741792231898435921633768385:\ 1463259917133913245195500729566820615925140728085869641490936807\ 875627045359340:\ 1136336627131206018599354228978585378999102832169870507738700505\ 866665661308205 434178716356826614868022910336:\ 6634862369769044245968610325063754582:\ 434178716356826614868022910336 1415406337306642091120413528271804224015406023026499:\ 7034899662310880590118948531539534220057245091097123989790225455\ 718320598907482500:\ 1415406337306642091120413528271804224015406023026499 2119242142523650184634691519911880425707508853468661410230000555\ 581608937:\ 2008383355777044545530942339055540267683709901883165870378113231\ 22625039264578687:\ 2119242142523650184634691519911880425707508853468661410230000555\ 581608937 69585923602069681658329224976930117468163915197373271065425178:\ 2020927964630024370658097798162044021281840678272412358937742685\ 874564410640015186840535854739937:\ 69585923602069681658329224976930117468163915197373271065425178 96975588332536394385315130323058:\ 1315802351305852717882890944093568207768868622073415386004618717\ 2175427025633631880306918912341930581398571945990395254404556930\ 1546423248306886079218006:\ 96975588332536394385315130323058 1005028458858291820643604063469013555486792420347821851888080697\ 7432670023176937393067923:\ 9828498588177084544380049:\ 2075442833247971646995411 1189727226195844529530585:\ 6538657640728177165013773329092206385482700449306247249506942167\ 8887069241318642226489470387127398972818622366:\ 1189727226195844529530585 9913890361391387217552509180:38186248654:26592864996 7734726198125785627433577053431512633637067455428717621996818752\ 2575060294193475687274421372950273116057529131026941243649403546\ 7830323368528007:\ 5416039783030069273660577195279406145075794925910316773014188695\ 424126525007469657167631593847463121496915435500645:\ 4964806369541933457271704487044498217022879054817785578812091084\ 454769612571500637156272668116039380758996484864172 71080186231578425712419354407360937437540:\ 1176980859009014803857106593068944458701173958687578469120934483\ 659139465526500936333672752:\ 71080186231578425712419354407360937437540 6766067674766915237012186799976734148500111990982325235714483836\ 083584935230592805199170249391665243373021274113:\ 324423691845570163374834:\ 252059054229526041391927 2823188323141882531578618333354253113311374951152404070296742852\ 061375867436124935489341:\ 1728156565766891281495579170663414558716728498925558384066168759\ 527625796619507427264134231896939288551956874380:\ 2823188323141882531578618333354253113311374951152404070296742852\ 061375867436124935489341 262779290090979866282191640705312933450751046001:\ 1089280788909080319090197382760567576418992525818853374350259176\ 94325561016010292207663524094967470016917014:\ 262779290090979866282191640705312933450751046001 8360271732029582503734310894572886727078012043023629221111060787\ 7138104216267918615216895281636771:555311145:120907711 2366610337862898747408792992366342895990689944827378360469117410:\ 76427322404335731456359122655716444433:\ 30544640615708299605352469363039636872 97771381685586783382636393:2:1 435337671693078154773623349696989:834970971193485102214182395:\ 506732218892181192932591889 2322513198662380013738103320830701289301787295559139301156091472\ 554729188662496855277024270062871128249398241623259939409120778:\ 2:0 4680113793844806249835648380663376025372596959777178380:\ 2904997032241569138092132512949608009650334804336242983698449850\ 529852963482246181:\ 4680113793844806249835648380663376025372596959777178380 2117036483187135:\ 2956811587252136030883436487547510285350147695210005035315279431\ 098717006229487861087796324851514192381549211074032:\ 2117036483187135 5405482742629299751643548818366182062777872542836164736969326959\ 5853544020603118041671461286137567987302593373027659716:\ 4573526887169513117846642791864935937856091980821696964895032993\ 8:16470976317121249525195764490105435306011497015289420117425749982 4359239142132654586747373757743417755349625230737312986309991827\ 8424863374421135266551983:64803544028311:37353941578659 6890135792819098747339200650197811212669835729907537732727533511\ 643927448939258863466836536126445044614:1696179960288:\ 1324995865638 4586314642595210536059912268094819407838151440257177384187072112:\ 2948676315159331003320418147316303300898329201084534802048646109\ 2015178004559585679:\ 4586314642595210536059912268094819407838151440257177384187072112\ 1295408061166295007189929428327291997766033572889635238933149973:\ 1972670797419796219560042479665734511348274052918937432115112357\ 6010380851770692946791:\ 1295408061166295007189929428327291997766033572889635238933149973\ 3293867584681053035957322938418784576730188582989206165304195433\ 9408357109851822801814954109216343414383237957096721562712712888\ 0653015247183660828064748:\ 8765772621072630220689785618513364012217258182568420497034708789\ 586373847828131714253297705781538931737255620107899492006608937806:\ 8601837373552535609108321170415754873427613358207755850219844413\ 541399748799344512722771514163410191291986915042108883348141430988 1377746154164779665651413126473853834067870962817490604919589355\ 6407321117598745222627688834382600647541603271142562521784054:6:2 1667979945553031384209256450228364963479415272610809793730506411\ 9303788198076909155676052962187532066482528524026964557345352216\ 5283446668047080:\ 1259826323514238805985170200301657600905328450695745758777562588\ 7186049156983679189477135784008594900590887239:\ 8186664560221138319073860758641161066866118482696737858152118048\ 749012625273296415253954330502016523386663032 1604558310259870720456999045309843418780215517:\ 2314764593137129686707089727262818413583267016192300531282204770\ 7680963809189153750977995631646696992678572235424774049002424266\ 88494047914464727456:\ 1604558310259870720456999045309843418780215517 1409736422781005655489884086727910650059319122250699179352885575\ 1322893090584507459430329601684018675016713:\ 3037097985924054837918:2373301421797167262781 6701198625704:\ 3208271584698650102424018685293737567361186784549354155908725982\ 8050085877527140878207342707:6701198625704 6570726263552141736792215188836614380398234183174708281848591553\ 9115168019938378584836876558466414158281554497244823448201181:\ 1502182222571155013035645850314652637622098563760970718145694442\ 1198813038883709721878584487611894267955370991921368152768464674\ 7953186479:\ 6570726263552141736792215188836614380398234183174708281848591553\ 9115168019938378584836876558466414158281554497244823448201181 334479763778167:\ 2620180822092752558176129834916304534899606970427451061631144668\ 8169619730877675269585659135601795114355310342255614595194757773\ 7880241235214292696563:334479763778167 # Some that exposed old bugs -19182011317708747655415793663840398231387658659684921854518950675010744\ 798088074160106794721561977563494710663654383617982647307741145787165689\ 415568325855995687160688325738126476982782410876428471011884289880631644\ 788665773228578260075978399410972382915954067959276715042755056729572829\ 093851913104244223672:\ 110589902576771067285674161059371867150853087104563757926013065022800986\ 359888876672387170062905874195180770816843413908369113777424570833424320\ 42777093021:\ 109391537162363400163656468557497811793910234020743027803411478222848317\ 478652922638466903221971706458039541796317994671218746507915453121571156\ 99186806428 -12729002947374921813333325067985579104471306056810166870370214872461518\ 835258302087462325432188644174454003894356884235513517741560628902891180\ 85736535643:\ 857393771208094202104259627990318636601332086981:\ 347124740076798815206019311966363093945724145995 -33561455954313714494272438259200225781962996013006223887793125858291980\ 416548560804296564715491363651855619074936805970007723556609659667595500\ 71261003601:\ 857393771208094202104259627990318636601332086981:\ 69829137374876952908916033728673445025 [ModExp] # Sanity tests # 1:0:1:0 ??? 1:0:2:1 2:103:150:8 3923:380:4033:1 6208938:141338444:179403587:74845992 # Random small test cases 35541290007:27861071413:54405498455:18392163817 33810311815:21623687837:67955609697:6168450286 390846234986723490867:258069:77811797476286981199753:388669864014945308514 # g=2 is a special case in pow_mod.cpp; make sure it's well tested 2:1024:159387639486734986734896734289672398467:\ 101251470522689220420018278313264853126 2:4096:4634968374896:302457470528 2:8190:46349683748963469823749683276389476398467349287:\ 22477714489988909289079275821119423277588139290 2:65537:4634968374896346982374968327638947639846734928734603867934764974\ 978569847636666666666663948673967394673496739673496739486739467:\ 39545100683930137608837226660935619825254176150139370772680647311426\ 83367133155871655171332348089412143539565993577352969480643 # A very big test case. bitsizes: (2624^2395)%2565 79929780860261081309977632552711610540802328270286009268787208946266\ 52959801126270181797858326539991808408501955736107211154089990880864\ 13303849208224219100591662616178697815457369194539353353497852835501\ 41050889822915371610531527622477756791100346237932148802218221147910\ 83764160121545158487346802968250797762918640822953726116267698324397\ 97218709812746716531207101626249641544666652454598936868588048379676\ 16272912941048200311549530333983535276332190445765429717475889329196\ 82723327383286444096495073061099816572815545646462399372759381873394\ 86919484956198277784202729520512749754342112052047850740549446316888\ 78036856294503455545058266059097463500482961705306677988487417742491\ 15342399979893391684184998084322821589461452070845054017545885544579\ 571298686351226398527864005606439403913215:\ 57905475544917604320471424647112496473975795682168523689996102576776\ 26237088778306631051069455546703439634818835586436374397201459270953\ 73320224593906109498830519623033054321336538157343986271182875008898\ 46400895285646814945099135578078712638653971354390893897513549226862\ 42288943235147182911794944000641930092937330351756206882625430975695\ 44517498509112574132890275024912111320852904074917394291149467803521\ 35858911321807178002982306495559510988786798025982798386952917933172\ 94803214105228859170942097230151211488601051217081893388443911838163\ 36005486029723368697022501011466335322002083542926898677979222112122\ 26602746563675308094794277325137581108077975533806822750634437146271\ 95586058676179645844985231821190979452929:\ 10399205046598242703229657351883132701652276964362108506952937688714\ 32748288996020332036899375414937330955428206666889017559888570519250\ 50646752050470991826964779958550793771265289251619085920928563751890\ 69887180372385733236214632572059802975058104127044922162389962101924\ 84687865663461891419811205882677932740064370564080283318891658075996\ 58544432626283448453420230409266259464245167575870377225089095472270\ 35936225873319683727097162939426767650247431692626091054378261933883\ 04444592844359283277150336016415487591544524543727803303478523219741\ 67585351918391390323730198435093034895278122139553159165456287861721\ 05733915744785361299323192153909893286267220726431407206795271107384\ 11115626646378829487932946663804144605711055044827184543371896600950\ 5066861013496859002404865:\ 76383126271403199465553629505580460064061138700480822311446783865005\ 94033351331759734478813350785616549057262115034183484701333480536277\ 68750392900860337148760236002293999903452043982157916536463831543329\ 81510716218290076553514718078562286562453573978032941974718159086704\ 26254141182888039292181731039710070744775875012183282365743418038436\ 68118132938651461047089720835645326444415743163725663534054526664632\ 63369477979502118345322416804826584935088694928774075019074758940531\ 93696779256795084313220287359244619510038817488191412143951928835003\ 09516216069636385063459729195557820282023577637677540172121768705892\ 64355863735811421469235193223472628311338081133201771681274202506343\ 43861119601917402017293095701055272115112783553081034528116130152891\ 276971073856411987253305 958568327191:\ 10820434407851188405104973511902906513518224342681350271810370438073617412:\ 385412694768521967592874726457715560537359750887572236310781387057217187291:\ 124514485573662879135724475226939854111051534076732305767767212261825204773 993:\ 158082274092371197688912481356696199899964270448955828125938845871237934609:\ 195335598174576479907825469879133749630277214529613044392254617116806465841:\ 76319125426811367239700120840606231265432388418754186363393007030575232763 5837:5387594231:\ 52910803894426776035608204231136092295842162542576147924991587830017346711785:\ 41256038256951041015975957103736087906734912779021641091323861709915393683478 11820:\ 349248154095284306437849303504509069624812572044321414531019412890823663:\ 11695070112125499434524238623571455233638695379976237857792518028967433696813:\ 4877591936163920485322716677654737966141266950607206024720481980778956876733 1279509:\ 228828116455132585158359573618073983726467809680019810077325482377363026:\ 596955405275729008892203759914236488647769846458724773926971979942130809:\ 548455744959985761919173432531376978888129348803576565818991241228678799 1169325226204036541181168587818457846915410492286163370049583817559172758:583:\ 1347789004686354026667591408699204029024258192368477695588810277715014901:\ 986753196897611638420753041983500285520492197918271348656818055904410861 39684855714221597676995827906679339738237777820353232844682939092337386955:\ 79808721821529030962053171978817611068275131312667370272216709366985607610:\ 168218000729293476661981768796405354274622797227127241788417326533874081227:\ 10243904434954110191313565832244070050272803217812912164431747671168317597 473396006114590115230521230276516897096:\ 387145532418575837430469368595868663742:\ 554862946848974049157489689418354631387:\ 448855900130388136390865414336576134923 383239913102526615892890047333017777270:\ 5212692713946112175761972297467118924556477:\ 9600330398725582192064124044651400063154809:\ 553434761331054066751131351244038395387413 17023533902565202029648472226171284665775885307:\ 172062909283726569049023770937247425801:\ 2803129820108668499802071463467295777012106623420016438138627500\ 520764503324471534463345465793841061510744977815:\ 1087221030676278725112163308497001956646825599606083907052530601\ 511129847691028000053571012933461738616679305207 6861608600119069162748766903320668621565184418412102985517914652\ 495806067714718757017641467375130420763543:\ 6090170638405015131997058617056249184350028938641981546887188901\ 427704577888167364319592127129279546370159:\ 9244137284483765901488318500741614548852246750950515340492572279\ 249663219793564958021372197661101436416951:\ 4357639256086891490742558173162011739263189633058589469209912059\ 837628983627026566654010174880786564650028 1708391349301269900029298214389921761264445766152620652843393219\ 358035361114524948237829535432550149898389816132:\ 2879295558693495162441272767383253789140301947026867788739382060\ 6202058461437115060253107180150356177029255392:\ 4562451461011443048616592993727831094905333529601929282014937177\ 804484518010765376407040702135536959480150175881:\ 4780971485381051463987885157471185516431563444901967941411376359\ 86642717690683975282976174121121834972342669810 10517206412589906914919094336031596865011:\ 76918459253520716071622848977323758816926:\ 1505994032870020776188597437379504956214103601873594169817828353\ 64671206273170823011738702809865490437980268482169:\ 6782959072847327960243512935142614796318322133888530532951869324\ 5770409979689571346380672589348570036123781607470 11150372599265311570767859136324180752990207:\ 242724485078592151169084549880604092836:\ 5335081937310201228237642071226891497098426337909703107583644285\ 670654712470768061820964879543360755501155583507:\ 5289945663803755598608137950548888139591380435852466790487033227\ 703935262787324650046364967638572584406632742426 931466513478626427306310727788682496419061:\ 217994111091681034507066335081667319859874:\ 961964829688733829104056632507823404588589:\ 833173750092106303567501575871102318441517 33561455954313714494272438259200225781962996013006223887793125858291\ 98041654856080429656471549136365185561907493680597000772355660965966\ 759550071261003601:2:857393771208094202104259627990318636601332086981:\ 466300477512220407817532870461493708182430162598 # Format number:is_prime, where is_prime is 0 or 1 [PrimeTest] 0:0 1:0 2:1 3:1 4:0 65537:1 # This one passes Miller-Rabin with a base of 2, but not with most others 4294967297:0 # Random ones 10416536965533130067:1 62073521899194104903553565787:1 170585900781008069215236465296032411499:1 1443993313735051633697456797423139085424112074517:1 10771372029656662585340604592252023412983364818055143344382694346546\ 2298290643:1 11771372029656662585340604592252023412983364818055143344382694346546\ 2298290643:0 42588518477191145729:0 # The following are of the form p1*p2*p3*...*pn + 1 where px is the x'th prime # This is to make sure the number gets past any checks for small prime factors, # and tests the Miller-Rabin routines. It would be nice to look up or search # for some Carmichael numbers to help this testing some. 32589158477190044731:0 4014476939333036189094441199026045136645885247731:0 1907826688958019501360189182099275775721983966835701205590751690\ 4309700014933909014729740191:0 4445236185272185438169240794291312557432222642727183809026451438\ 704160103479600800432029464271:0 6107692946593319609927894338899785515035614388823837148866549657\ 4810764573680243467182799164806563626522181311132959748531230211:0 6989612506894284794136067796445539076219364950255126280242854713\ 9923075880112964253713561700013194221462347575861905534037645370\ 21369947456703810795390696338067840821591:0 2577426147548683169379880845613862450845254401055092509543183257\ 2701791887072337189992932234179329410389241899414841054215169960\ 1546741832617953638436279944072980418788682453341495300190580109\ 0622787969540076319408964006231:0 Botan-1.10.12/checks/nist_tests/Makefile0000664000175000017500000000031412654331322017661 0ustar jackjack00000000000000 CC=g++ FLAGS=-g -Os -W -Wall -ansi LDFLAGS=-L../.. -lbotan-1.10 CFLAGS=-I../../build/include x509test: x509test.cpp $(CC) $(FLAGS) $(CFLAGS) x509test.cpp $(LDFLAGS) -o x509test clean: rm -f x509test Botan-1.10.12/checks/nist_tests/failure.txt0000664000175000017500000000111712654331322020413 0ustar jackjack00000000000000Known Failures/Problems Policy extensions are not implemented, so we skip tests #34-#53. Tests #75 and #76 are skipped as they make use of relatively obscure CRL extensions which are not supported. In addition, please note that some of the tests have their results altered from what the test result should be according to NIST's documentation. The changes are clearly marked (see x509test.cpp; search for "CHANGE OF TEST RESULT") and there are comments explaining why the results where changed. Currently, tests #19, #65, and #67 have had their results changed from the official results. Botan-1.10.12/checks/nist_tests/readme.txt0000664000175000017500000000244312654331322020224 0ustar jackjack00000000000000 This package contains a program to exercise Botan's path validation algorithm, as contained in the X509_Store object. The data used is NIST's X.509v3 certificate path validation testing data, as found on NIST's web site (version 1.0.7 of the testing data is currently used). The PKCS #7 and PKCS #12 data files have been removed, as they are not used in this test. Currently, some tests fail or are not be run for various reasons (in particular, we don't have support policy extensions yet, so that excludes running a good number of the tests). Even if all of the tests DO pass, that does not imply that Botan's path validation and certificate processing code is bug free, as there are many (*very many*) possible options in X.509 which this testing data does not make use of at all. However, it is helpful for implementation testing and assurance (I have found a good number of bugs using these tests). Currently, we do not make use of the S/MIME or PKCS #12 testing data contained in these tests, because Botan does not support either of these standards. To use this, compile x509test.cpp, and run the resulting executable. The results are written to standard output. Your system must have a POSIX.1 dirent.h, and the code assumes Unix-style paths. Email me with any questions or comments about these tests. Botan-1.10.12/checks/nist_tests/tests/test01/end.crt0000664000175000017500000000121212654331322021761 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.01.0100  *H 04o Y_.pJ#`kˈH~dyFAa%GqPN|j7 F ʋCJjFNm]RG$1}i$3n)oRu*,1ŷ =;R0P0U0U 0 0  `He00U .0U# 0 T0  *H +Oe꥟E>1 )َ_;5Ξ n>-H#r:X]zVйneayCUe;&=^{*BŅ=nCArxiW$K_Botan-1.10.12/checks/nist_tests/tests/test01/root.crl0000664000175000017500000000056312654331322022176 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test01/root.crt0000664000175000017500000000116012654331322022200 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test02/end.crt0000664000175000017500000000121212654331322021762 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.01.0200  *H 0 lНgFo}d#L'>ބkkWuFP,ltj[8!*6.\ݦJ] o'j ~]^pcT:2^'t)RxסˍrHNtWwkN+Botan-1.10.12/checks/nist_tests/tests/test02/int.crt0000664000175000017500000000123112654331322022007 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.0200  *H 09!5 _(% *c魏Ш+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test02/root.crt0000664000175000017500000000116012654331322022201 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test03/end.crt0000664000175000017500000000121212654331322021763 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.01.0300  *H 0#E_REzr9ˋ(J^=pJ"Kܰi sqۢfXc+lG8CƂ5;?ݍI;vsUy0\Vi OdNZk٫R0P0U0U 0 0  `He00U ? ؑ>0U# 0 OF؛0  *H ~6&/I?ۣ;\J4 aeq+C86o_ hu<4 $TNboW YAqҢiN҇䕣lVJ3Botan-1.10.12/checks/nist_tests/tests/test03/int.crl0000664000175000017500000000051712654331322022006 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.03 990101120100Z 480101120100Z#0!0 U0U# 0 OF؛0  *H #Iׄq]s3[{xpE3̺U#RI$NRp"/?;3v׹ ..:Zﮠ$w͒ YUp'u;@6DBotan-1.10.12/checks/nist_tests/tests/test03/int.crt0000664000175000017500000000123112654331322022010 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.0300  *H 0Ekq^H/sTu0'C¬q ՏatD Ǝ=ɤii+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test03/root.crt0000664000175000017500000000116012654331322022202 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test04/end.crt0000664000175000017500000000121212654331322021764 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-CP.02.010 990101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.02.0100  *H 0ثiYxR^Ut8~.bF8׃]嬢wͲ(TRQs)z0)yv)E9^uv{lj^8å?,ypC~> 'YgJR0P0U0U 0 0  `He00U ?UtL0U# 0 &J`͕0  *H \}K*2N WXo7"Clzւ܃P_0>Jj LHDIZ'뿋սA2_[qѻޖMAun)v?4<9k5ǽ^"b!*H]~Botan-1.10.12/checks/nist_tests/tests/test04/int1.crl0000664000175000017500000000051712654331322022070 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.01 990101120100Z 480101120100Z#0!0 U0U# 0 6\Šjv0  *H U٪e`Xׯgx|pMXPxRÆ} ^s0K[o"eo6s^}2c%Ip(!S<}꫽2~na%wV58,ƵGq?Botan-1.10.12/checks/nist_tests/tests/test04/int1.crt0000664000175000017500000000123112654331322022072 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.0100  *H 0X.̈Y8;cHTg? [l'|zEWc'Jo6=hId__>`\`>xFþ'QARGJJ |4(\uc0a0U00U0U 0 0  `He00U 6\Šjv0U# 0 T0  *H 9Ee/ﻁ~8:صo\~9F+^i7T/p_[M*^fW y QgXS٪[ZW7Ȱ;$D6#2`s<?+BHW2q/_Botan-1.10.12/checks/nist_tests/tests/test04/int2.crl0000664000175000017500000000051712654331322022071 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-CP.02.01 990101120100Z 480101120100Z#0!0 U0U# 0 &J`͕0  *H C\4e; ^s/{1)3@X9R#rEu% P̴ᤄ,5#_G_/7:|嚵Of+ K|q&2X} RؒJ* Qz/,kUU!f'UBotan-1.10.12/checks/nist_tests/tests/test04/int2.crt0000664000175000017500000000123112654331322022073 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.010 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-CP.02.0100  *H 0b(ƿ Go# /БW6TjFsMݞi/I{`ՠg?G%1u[<Ƚ|V`Kof{Jx5C-$|RcfrMc0a0U00U0U 0 0  `He00U &J`͕0U# 0 6\Šjv0  *H q5}vCaN$f>e,hSRH>ZyrB^2%A_]m˦mCN=3v߸ɰʖ8 Z,bC¢U$d6vBotan-1.10.12/checks/nist_tests/tests/test04/root.crl0000664000175000017500000000056312654331322022201 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test04/root.crt0000664000175000017500000000116012654331322022203 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test05/end.crt0000664000175000017500000000121212654331322021765 0ustar jackjack0000000000000000 0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.02.0200  *H 0ҭΞ/≳R | 8"/ Qo0˯;= 0M3EjlEE)/5UB8Tw^(c!8cF)iA<QLqw{ R0P0U0U 0 0  `He00U >'u0U# 0 N#0  *H xfӵ\)A% _?+SJӅ+~LʔÉti7:# "(9ִ5McjOE Tݸ;hún Yz< 4%AE`eBotan-1.10.12/checks/nist_tests/tests/test05/int.crl0000664000175000017500000000051712654331322022010 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.02 990101120100Z 480101120100Z#0!0 U0U# 0 N#0  *H @rY\vCd^t ޯc0a0U00U0U 0 0  `He00U N#0U# 0 T0  *H 셫k٭CCUd\6/f53{_s]}F}H"<>d52g1qwǬ4eéMmƿ?XH17:D>GԾaޔ^T<(Jsˋ(Botan-1.10.12/checks/nist_tests/tests/test05/root.crl0000664000175000017500000000056312654331322022202 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test05/root.crt0000664000175000017500000000116012654331322022204 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test06/end.crt0000664000175000017500000000121212654331322021766 0ustar jackjack0000000000000000 0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.030 470101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.02.0300  *H 0VSl):L0 6!*|rIљǸ6g g?8arBC2'0=dtGJ:X?g*cKCdl3{C!-24>:RBf-~=H kbR0P0U0U 0 0  `He00U sx$0U# 0  dp0  *H Jۛp3`4i]dln)ԜGSF`c4u\‡=ַ&?>CTvv/ްTAS-.|+]qU23w>r-f[ܞl{6sBotan-1.10.12/checks/nist_tests/tests/test06/int.crl0000664000175000017500000000051712654331322022011 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.03 990101120100Z 480101120100Z#0!0 U0U# 0  dp0  *H Xa#BG{3> L_ H+(7z&6QE\{XX"SUlS5C^-PEs%jF"F"f'5YMɬb&6`=]ZXϊBotan-1.10.12/checks/nist_tests/tests/test06/int.crt0000664000175000017500000000123112654331322022013 0ustar jackjack0000000000000000 0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.0300  *H 0'\:^uGE>_}ϥUӫc]Pi(4s"ٟo9ۃJhuB+%oD9#I3ٌE6n.ZGk3'l5qTRc0a0U00U0U 0 0  `He00U  dp0U# 0 T0  *H  uX6-|}˚1PŦ\)W+ ѭ)R[c(:JF՘b{Jf vl]{k9 &UjE>k)(0\slI[ 8>:s:BXBotan-1.10.12/checks/nist_tests/tests/test06/root.crl0000664000175000017500000000056312654331322022203 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test06/root.crt0000664000175000017500000000116012654331322022205 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test07/end.crt0000664000175000017500000000121212654331322021767 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.040 500101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.02.0400  *H 0Wb,l 3$ֲRmʻ)W,̈́ [;6٭BSXǕB%i>aۮETDP#>h8ͧ;}A4׌eCZkEoS:!^L>R0P0U0U 0 0  `He00U iM`0U# 0 Xy0IY0  *H QʕjBg@"fGQqĬʝNNk*6ļ<޼y|cŖIVD#*p&Xs`}1t՚Ộ;+ @ݦr|HMdS uewLŘdjZGD4x[*ˤWwJ  6cv*mTG6']j'+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test07/root.crt0000664000175000017500000000116012654331322022206 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test08/end.crt0000664000175000017500000000121412654331322021772 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.050 20500101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.02.0500  *H 0"ʥn"nU-~ Egl5zsJ+nw*~|f(3YJ’;RxO8&̸i٭uX=+í@f  v$ѹȟR0P0U0U 0 0  `He00U w0U# 0 a#.#0  *H k03/ՂL7nS8"eR':/f_vRFDrr돽Q7DȤ4ʋT>ᅡ6!#' (2L40 eQBotan-1.10.12/checks/nist_tests/tests/test08/int.crl0000664000175000017500000000051712654331322022013 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.05 990101120100Z 480101120100Z#0!0 U0U# 0 a#.#0  *H YQ▤B8ڙlI}.msI-F_=wʽ 3x_*dWe<P+\-Rq`wSP&03gczWKc#К3CI\Botan-1.10.12/checks/nist_tests/tests/test08/int.crt0000664000175000017500000000123112654331322022015 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.0500  *H 0wThz*,dKY<[iA)}}c8\2CifQfMg;f~-'熙N@Y$W2J$HY e&IJsڥVT[_(Ac0a0U00U0U 0 0  `He00U a#.#0U# 0 T0  *H Obu(y)3 8Ql&j,<^sSCeŅ,nd j -D Mp.yPst@\wۙ)iWpj2Botan-1.10.12/checks/nist_tests/tests/test08/root.crl0000664000175000017500000000056312654331322022205 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test08/root.crt0000664000175000017500000000116012654331322022207 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test09/end.crt0000664000175000017500000000121212654331322021771 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.03.0100  *H 0-~1q(1Ro2~9ͅbwOi Zd/wd>HtWIMc0a0U00U0U 0 0  `He00U b::;4{0U# 0 T0  *H 1QS`VbႌseuؖD[PR֥)yvnk$97N HoHo`{1 l|{qBQΪ 4)Ǩ0H~LXg+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test09/root.crt0000664000175000017500000000116012654331322022210 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test10/end.crt0000664000175000017500000000121212654331322021761 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.020 980101120100Z 000101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.03.0200  *H 0Lo(E3.*x&Nu^ ' N+˭~-:;IMԟfi7kOV͎f#‰ܱ352hg8Y\ªV""C%bMgQnZR0P0U0U 0 0  `He00U 9l\d0U# 0  B0  *H ' ݢن '5G•,AZï.n{4 u C.?FzOۇȲDfzTEhAp %)2fs]bjL%3Iɲi}B["R1PBotan-1.10.12/checks/nist_tests/tests/test10/int.crl0000664000175000017500000000051712654331322022004 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.02 990101120100Z 480101120100Z#0!0 U0U# 0  B0  *H  5 eJ%kc{ex~,cFGkH(c蝝10Ӯ篆<17R Fߪ zmhe#dJ9s Botan-1.10.12/checks/nist_tests/tests/test10/int.crt0000664000175000017500000000123112654331322022006 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.0200  *H 05pÊDh`}O1E1bd&op#v/0P{;b^/:1*b_yJKCxz#y<_,ÎM.GNOG=c0a0U00U0U 0 0  `He00U  B0U# 0 T0  *H [ _:t3iBNJcM=#DF[gOY:C8-g2u0 с3o4r7)540cE^׮$\2k1Njueh"8y=Wsl^%^R7vrRLBotan-1.10.12/checks/nist_tests/tests/test10/root.crl0000664000175000017500000000056312654331322022176 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test10/root.crt0000664000175000017500000000116012654331322022200 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test11/end.crt0000664000175000017500000000121212654331322021762 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.030 980101120100Z 500701120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.03.0300  *H 0L1s3ҭLmQ&ҭ-דKٞ+jv%"\$lR'L(LuG'nz` l&qgpx9LSsxRcKg%j4c'R0P0U0U 0 0  `He00U Mx0U# 0 "7r0  *H t cϼ=gir1My[B:+k¥m ơ#$ U=fmYٓ@[85e7TY S Ҭ!}$aY/.$S_`Botan-1.10.12/checks/nist_tests/tests/test11/int.crl0000664000175000017500000000051712654331322022005 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.03 990101120100Z 480101120100Z#0!0 U0U# 0 "7r0  *H ~#K+a֢V!@AڟUWNKc?[pBuBKp_^aqDZOM}Apo?*P 7(/?Etuz-PԄx2D0q@Botan-1.10.12/checks/nist_tests/tests/test11/int.crt0000664000175000017500000000123112654331322022007 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.0300  *H 0-(C /gQ7-Eb=tQ5Q4MF;ײ|S^=`'u!O8xhkN5,7mt- q[_c0a0U00U0U 0 0  `He00U "7r0U# 0 T0  *H _$B(%M} vN%@Yx` 5);,L)*JGtV.yʀve @e]qϘ{[sȸ bTxtӵa"m_:w!+B`%H~`CBotan-1.10.12/checks/nist_tests/tests/test11/root.crl0000664000175000017500000000056312654331322022177 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test11/root.crt0000664000175000017500000000116012654331322022201 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test12/end.crt0000664000175000017500000000121412654331322021765 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.040  980101120100Z20500101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.03.0400  *H 0"I[OPäbCYkqɉ(b豨-Aބ=zZ:wؕbApo DC[q2aP!}-@GѯЈzؼua58R0P0U0U 0 0  `He00U }h Dm0U# 0 7Yy0  *H #Ph%qa Botan-1.10.12/checks/nist_tests/tests/test12/int.crt0000664000175000017500000000123112654331322022010 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.0400  *H 0R(s7Cl͗rt-F e ߹(&?V09kj*r#l!I)þߚ/y~lvǨ e:8w =۲V}o(s o9>HZ+oG y?8ȳc0a0U00U0U 0 0  `He00U 7Yy0U# 0 T0  *H kc(H^oĄ'$i#"5y!VR;Z4蘑GvE6>37C+4?.؄RIj u U'dќźGxqur9RvϬ9%Botan-1.10.12/checks/nist_tests/tests/test12/root.crl0000664000175000017500000000056312654331322022200 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test12/root.crt0000664000175000017500000000116012654331322022202 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test13/end.crt0000664000175000017500000000121212654331322021764 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.99.990 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.0100  *H 0dό#c߅r"+P\[5ώ2̝ړBXq2%$# /[z#+TLriV_zĕjnr7~(Н;TR0P0U0U 0 0  `He00U %m60U# 0 9ߦ0  *H e  |0`pL gGlj}TPwR@"# K74]b♮/=jN~]wM?& (4#&n* fx7j_?2{Botan-1.10.12/checks/nist_tests/tests/test13/int.crt0000664000175000017500000000123112654331322022011 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.04.0100  *H 0P2?-l/hSȤq|*6y_٢.E^' !y,g2g0ttK гv`WùF| 7ȕd" Kkz}}{c0a0U00U0U 0 0  `He00U 9ߦ0U# 0 T0  *H \̬ra)"% z plSřT~+ =qK$Z( HcQ_$}|{d?et)^*.M鐏Ovi.4X~32Zԯ`s/ZUf[Botan-1.10.12/checks/nist_tests/tests/test13/root.crl0000664000175000017500000000056312654331322022201 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test13/root.crt0000664000175000017500000000116012654331322022203 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test14/end.crt0000664000175000017500000000121212654331322021765 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government10U Testing1 0 U DoD10U CA1-CP.04.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.0200  *H 0;߽jeB_#W -g b~ZѼ+ok*ZtU XPpF { WUg}@8Wv\gA޷݄?]1 !oEr8£ER0P0U0U 0 0  `He00U .{0U# 0 R9ƧޢC0  *H cIso& #H< /A@}ZguCIAm!0M&X4M[G; 0"'h5);te8 $SϠ|?m\{TPnBotan-1.10.12/checks/nist_tests/tests/test14/int.crl0000664000175000017500000000051712654331322022010 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U CA1-CP.04.02 990101120100Z 480101120100Z#0!0 U0U# 0 R9ƧޢC0  *H fEh@14TGZW ?~BqmҔS?|u,8)tA܀k&G}?qx/`rSEQ&oxnd^(J:HGR[Z$aBotan-1.10.12/checks/nist_tests/tests/test14/int.crt0000664000175000017500000000123112654331322022012 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U CA1-CP.04.0200  *H 0xJ^#&CA˅YIƟC=رsg ؇*<;ӭ"W%/4 1цո?y_;IGr2'c0a0U00U0U 0 0  `He00U R9ƧޢC0U# 0 T0  *H G7i%A=_ |ZJ[E^_q:@>Lk:SkӟoaYpS$IW>k(U*[u*4iFp#BۯN:#ufUQFUBotan-1.10.12/checks/nist_tests/tests/test14/root.crl0000664000175000017500000000056312654331322022202 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test14/root.crt0000664000175000017500000000116012654331322022204 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test15/end.crt0000664000175000017500000000121612654331322021772 0ustar jackjack00000000000000000  *H 0b1 0 UUS10U U.S. Government1 0 U Dod10U Testing10Uca1 - CP.04.03 0 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.0300  *H 0E*tȬ;:g\e :_TufzHA:ט>4/wQCK~*E܋Jvk!sSX]I`Zr>bur4a.oR0P0U0U 0 0  `He00U pWC0U# 0 .0  *H #H;W?Qqp)6nUf5@ wc1#>f{#c.aEv#JMBӻ8;NP"@yvmlmDڄ+e$r~@5 cD޾:ja>k/=@'}&69)c0a0U00U0U 0 0  `He00U .0U# 0 T0  *H & H8j7Zb3 \)lA`+?-Oxw 6lsoQ ܮ KXB )r'޺Y(f%r +2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test15/root.crt0000664000175000017500000000116012654331322022205 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test16/end.crt0000664000175000017500000000122112654331322021767 0ustar jackjack0000000000000000 0  *H 0e1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UCA1 - CP.04.040 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.0400  *H 0.:s5$X!2j2| |eXBYr]'8EɛQ+"m ?8vֶ]\Hb J19 DFa!=L*fɘn 1ۆ*UV׵h Ϥ R0P0U0U 0 0  `He00U G8opOӟG0U# 0 ⢾ 0  *H 85)`z5]WvCv71}T܀Tt6hک~> R++2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test16/root.crt0000664000175000017500000000116012654331322022206 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test17/end.crt0000664000175000017500000000121412654331322021772 0ustar jackjack0000000000000000"0  *H 0`1 0 UUS10U U.S. Government1 0 U Dod10U Testing10UCA1-CP.04.05 0 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.0500  *H 0"Rs}u[ь-W1>i.6$齖ѺG>,ic6}@t짚ЇdM/ =+aC覺#偅o^n9ǵ@Kw抦+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test17/root.crt0000664000175000017500000000116012654331322022207 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test18/end.crt0000664000175000017500000000121212654331322021771 0ustar jackjack0000000000000000$0  *H 0^1 0 UUS10U u.s. GOVERNMENT1 0 U DoD10U TESTING10U ca1-CP.04.060 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.0600  *H 0ײQVmO ˟? |wj[G&}kqֈ̂)i'o߻E?iy>Vh)Ғr6$wp"ZX>‰%׾w/2~R0P0U0U 0 0  `He00U sa9a~0U# 0  dI0  *H 0h$QG7N߻MH2 zc7$ 89Ǹvكp$yL+=bkpt!MfxAq ڏ˪(l[Z XEg[Botan-1.10.12/checks/nist_tests/tests/test18/int.crl0000664000175000017500000000051712654331322022014 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.04.06 990101120100Z 480101120100Z#0!0 U0U# 0  dI0  *H  ;[ fq*2~?'lfN 4fUZӵВd4 _OkQIop;s$̥yR#(5BU*JETi:X] QkBotan-1.10.12/checks/nist_tests/tests/test18/int.crt0000664000175000017500000000123112654331322022016 0ustar jackjack0000000000000000#0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.04.0600  *H 0G_{͒%vP=<Ϟ=|QHc ogR+!:{ Sg)_h{Ϫ?lñ}+4`|5"M[c0a0U00U0U 0 0  `He00U  dI0U# 0 T0  *H mqX<_1\#z?-vYt1MRc<u6ȒB#u%wJM'x'C̛+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test18/root.crt0000664000175000017500000000116012654331322022210 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test19/end.crt0000664000175000017500000000121212654331322021772 0ustar jackjack0000000000000000&0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.05.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.05.0100  *H 0N vL1@:}Tj!:4cXo73(=ϝUhQrX0%{{R9;؊a$I(Kp~Z,|?=YturB%R0P0U0U 0 0  `He00U R*c0U# 0 iH?m(0  *H 8˳ 2HxOP{CAy-w_^0#\jm27< l-os2$p fbzv4\㛳&8o>J?t AM[J1Ƿ"DbCb;s.\Botan-1.10.12/checks/nist_tests/tests/test19/int.crt0000664000175000017500000000123112654331322022017 0ustar jackjack0000000000000000%0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.05.0100  *H 0 !ڋMR{9Óח vYR9WU PZb_0(Ӽxmj1~Vp ,{XI5i0wI✣4c6$Gc0a0U00U0U 0 0  `He00U iH?m(0U# 0 T0  *H X&^*`Lv% ]>ޅ.Ub|*p3]X NjX}g H;'PpWhFT2/`>aqCx8#ssBotan-1.10.12/checks/nist_tests/tests/test19/root.crl0000664000175000017500000000056312654331322022207 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test19/root.crt0000664000175000017500000000116012654331322022211 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test20/end.crt0000664000175000017500000000121212654331322021762 0ustar jackjack0000000000000000(0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.06.0100  *H 0{L E{#۰]6FUJ7>JߏN,ϳ&9P+-ɥA8E~¨wE3s.WS)^_ 0  *H ?>RW2,~O녈Lт|rB-ZQoG̲?vfv}tɑo] N\yo`+ 0ۊl.QiBotan-1.10.12/checks/nist_tests/tests/test20/int.crl0000664000175000017500000000051712654331322022005 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.01 990101120100Z 480101120100Z#0!0 U0U# 0 &> 0  *H nB^5;BnкĖw Ŷ o:`>XZ<Ԑb)?LJ{+5ʹ; c /`U,T 'v"FKkCr@{ 2P7Botan-1.10.12/checks/nist_tests/tests/test20/int.crt0000664000175000017500000000123112654331322022007 0ustar jackjack0000000000000000'0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.0100  *H 0O}AEJx2vvCap=oj R_r/F"'|ٝ8SQyf2@EJX݈B%^i'hs[d+Y %c0a0U00U0U 0 0  `He00U &> 0U# 0 T0  *H ћg'}j d$L1\NA_f)r*v.\-71ctE3 .a s~nӼ>Botan-1.10.12/checks/nist_tests/tests/test20/root.crl0000664000175000017500000000056312654331322022177 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test20/root.crt0000664000175000017500000000116012654331322022201 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test21/end.crt0000664000175000017500000000121212654331322021763 0ustar jackjack0000000000000000*0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.06.0200  *H 0 +G KJ{p49ַY;OY?TL^A Wo%䷀bnfWˊz* q 5e*y(8 C6cXƁwR0P0U0U 0 0  `He00U  "$;0U# 0 h|V9-0  *H mz+rl03,L93ʑvN> }tPc;"l!an*gs!K1uc/ZSeVB۬B=y(LMLoʍ9q,El.MCBotan-1.10.12/checks/nist_tests/tests/test21/int.crl0000664000175000017500000000056312654331322022007 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.02 990101120100Z 480101120100Z0"0 * 990101120000Z0 0 U #0!0 U0U# 0 h|V9-0  *H `fZvT኉HNӱh`4h`h](^/JkVD+{\c@ 2'uLu8}UTђi1;5A\O{AsoH(Ga29X$ܴ" Botan-1.10.12/checks/nist_tests/tests/test21/int.crt0000664000175000017500000000123112654331322022010 0ustar jackjack0000000000000000)0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.0200  *H 0!9h;l ;5 b[9)AUO\TiK#xZ|Jorq5t ބQdM{UZX(pyzd 퍓c0a0U00U0U 0 0  `He00U h|V9-0U# 0 T0  *H 7Zҫ:J@<(.6q7[`A-P8mŁ%=4 Xx/|REu@O2Ty>(?%:SQ]&(vo`y䕣eSۻOsbBotan-1.10.12/checks/nist_tests/tests/test21/root.crl0000664000175000017500000000056312654331322022200 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test21/root.crt0000664000175000017500000000116012654331322022202 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test22/end.crt0000664000175000017500000000121212654331322021764 0ustar jackjack0000000000000000,0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.01.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.01.0100  *H 0,!zb 0y_ѠV۲m6_f)WϋiZͦ2Wٳ0HeӤi80D:?M۸yj@6WD GhmHZ Uܰ{\ZTE9QR0P0U0U 0 0  `He00U lk0U# 0 rF$0  *H c623LY~ϴ.V9NJ(l>9ZWTxji@QW"/V+v(q0=sYams0{zyʌkYǜAq}lKt8V,Botan-1.10.12/checks/nist_tests/tests/test22/int.crl0000664000175000017500000000051712654331322022007 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.01.01 990101120100Z 480101120100Z#0!0 U0U# 0 rF$0  *H Wz)@IWQ'N[aIy+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test22/root.crt0000664000175000017500000000116012654331322022203 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test23/end.crt0000664000175000017500000000121212654331322021765 0ustar jackjack0000000000000000.0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.02.0100  *H 0U1:&;rXZ\:M())0tfuVn)w4_0NsNAX~qj٭\&E1r m1Bi1QZZh( GĹR0P0U0U 0 0  `He00U  6!#0U# 0 ?F0  *H @iu·Z""&|NH{*QhV:2oƟB[X!~` |:C ʇ ¬w'ZIV ޵;IW2hXlqNjƶa2Botan-1.10.12/checks/nist_tests/tests/test23/int.crl0000664000175000017500000000051712654331322022010 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.01 990101120100Z 480101120100Z#0!0 U0U# 0 ?F0  *H &ߡ-ԣ)qPN Vz?v6 !7F7zq$VQTzxkI A㣘\Wqvʾ˔B|UY1%2c%&jB߁~0 Botan-1.10.12/checks/nist_tests/tests/test23/int.crt0000664000175000017500000000122612654331322022016 0ustar jackjack0000000000000000-0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.0100  *H 0ޘ;F7^Z2AN(Ra.74}7v。W[#!}~I^؊Cb\g,\ y?&nYf@ 9;a;g;@`0^0 U00U0U 0 0  `He00U ?F0U# 0 T0  *H ZRji8s3@,P<#q0¦rTU }> 2@# q ٭1l#j 7agmK0p6X(_nKٟԮCvNjBotan-1.10.12/checks/nist_tests/tests/test23/root.crl0000664000175000017500000000056312654331322022202 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test23/root.crt0000664000175000017500000000116012654331322022204 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test24/end.crt0000664000175000017500000000121212654331322021766 0ustar jackjack000000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.02.0200  *H 0 aJIA9)Ȅ8!(Ū81F] }މtlψ5c'$C-r& ]\d̅ge :6lkC&Vd5v[i0f-R0P0U0U 0 0  `He00U ?{:cF0U# 0 +o;=0  *H JE KNqAAHNG *e yR>xj* 1TfF$Ԏ "$R p-XʂndMitz"+"[ 6*,EW M6yPS_Botan-1.10.12/checks/nist_tests/tests/test24/int.crl0000664000175000017500000000051712654331322022011 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.02 990101120100Z 480101120100Z#0!0 U0U# 0 +o;=0  *H 9Fd]?p $g7vJGyT:SGL{@^1|ѼO3c hXxI0?/Q}Tb3ڀx|-%viL$MxBotan-1.10.12/checks/nist_tests/tests/test24/int.crt0000664000175000017500000000123112654331322022013 0ustar jackjack0000000000000000/0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.0200  *H 0x  K&{@ϧɮL^qn#1bÿeݑ* dgKHSSp1}K)ۓuWDyGoFCI5 'yfGZa;7+ c0a0U00U0U 0 0  `He00U +o;=0U# 0 T0  *H ў4\ƐrDy/U-/l0gHƞ~ keˋ{'7NzW;}d:iL ݓ&w8,P 훍'e E/ cFz-$}Botan-1.10.12/checks/nist_tests/tests/test24/root.crl0000664000175000017500000000056312654331322022203 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test24/root.crt0000664000175000017500000000116012654331322022205 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test25/end.crt0000664000175000017500000000121212654331322021767 0ustar jackjack000000000000000020  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.02.0300  *H 0܄6}DU>Vl[qWHWWH8[G؇kA )ؖ03sJ*{ bޮi-sU/5)XȪ<8oLD[/A aM<!R0P0U0U 0 0  `He00U K 0U# 0 >`0  *H X|zӒ5^0c4L?mrx賌#IS,]!`Zyb0 ДqPKRhXC U~;Jg,~KSSyb:t҈8@& Qj#Botan-1.10.12/checks/nist_tests/tests/test25/int.crl0000664000175000017500000000051712654331322022012 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.03 990101120100Z 480101120100Z#0!0 U0U# 0 >`0  *H U"=EEFٯG񧩆vE?lRean;p`xOW'iĒ̶aX^O  cF'Ld+Wi4gaM~J.)"aXjBotan-1.10.12/checks/nist_tests/tests/test25/int.crt0000664000175000017500000000122312654331322022015 0ustar jackjack000000000000000010  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.0300  *H 0,[~b-@Z܀ZqO@v]nTx t+99Oyw CSApA. Zਅc'Ԏ[?ji|Q~Gofa5]0[0 U00U0U 0 0  `He00U >`0U# 0 T0  *H 54Q {׀/H7fr?ù#[ؔLئ(Q@7 ( M`\ܤo*c ϵj#e-`5R2pm7uU!Botan-1.10.12/checks/nist_tests/tests/test25/root.crl0000664000175000017500000000056312654331322022204 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test25/root.crt0000664000175000017500000000116012654331322022206 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test26/end.crt0000664000175000017500000000121212654331322021770 0ustar jackjack000000000000000040  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.040 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.02.0400  *H 0Ÿ]>% 7 EbC>RI{ -j/^,g^<\jzK[f `IJ3udH(#|-D^75etR0P0U0U 0 0  `He00U #MK60U# 0 9+0  *H  '/6l )= Y̹˓4iggicaV 9-z˩P<آ1۵Vϧ3aX;*3Z\AJ ލyaQ;o{xBotan-1.10.12/checks/nist_tests/tests/test26/int.crl0000664000175000017500000000051712654331322022013 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.04 990101120100Z 480101120100Z#0!0 U0U# 0 9+0  *H WkŞH_e;ي;/L9Q6^o3COC(C?CIDh {A;&3Z_WZ>1_S1e%F$0*97Wm*cHedBotan-1.10.12/checks/nist_tests/tests/test26/int.crt0000664000175000017500000000122612654331322022021 0ustar jackjack000000000000000030  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.0400  *H 0hd%BgM}]\J2gqQpVNCſHO0|ae'j5Cڦa_WiRLg؄l.=N‡@MlB%i0_=<֡Bm;`0^0 U00U0U 0 0  `He00U 9+0U# 0 T0  *H  yMǾ8WS{Þ X:ư:ix,UpW*j9SjY;`eIJKd1.Ҙz;k^K!-~JY.F o%/<lWMݣMݱvߤfBotan-1.10.12/checks/nist_tests/tests/test26/root.crl0000664000175000017500000000056312654331322022205 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test26/root.crt0000664000175000017500000000116012654331322022207 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test27/end.crt0000664000175000017500000000121212654331322021771 0ustar jackjack000000000000000060  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.04.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.04.0100  *H 0͝J(gH 9h_Tzv}[xU)N}N qSיkR3a35&![ dK4LQ< 1Mj/&zߌ>T 2F `IR0P0U0U 0 0  `He00U Nõy0U# 0 l˙z'0  *H x^ f k,|pIBotan-1.10.12/checks/nist_tests/tests/test27/int.crl0000664000175000017500000000051712654331322022014 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.04.01 990101120100Z 480101120100Z#0!0 U0U# 0 l˙z'0  *H 2NG;s Z( [)!IU~S@5"ݐ霽02i2}¨S*"$}ђRѧ\ud)kFoI:k>NѾp6V@nw9 Botan-1.10.12/checks/nist_tests/tests/test27/int.crt0000664000175000017500000000122312654331322022017 0ustar jackjack000000000000000050  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.04.0100  *H 0)]F)63v&tssdH˱/XD^9N 02HniȃП; և9%5>c{7AgX^~2HHI]0[0 U00 U0U 0 0  `He00U l˙z'0U# 0 T0  *H slZ}Anj IҖb݁rQlo7`ץ;Q]!Jc{XYWs@~"k/)gmqEo&B 1oLSڀ3٥z`CPv:Botan-1.10.12/checks/nist_tests/tests/test27/root.crl0000664000175000017500000000056312654331322022206 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test27/root.crt0000664000175000017500000000116012654331322022210 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test28/end.crt0000664000175000017500000000121212654331322021772 0ustar jackjack000000000000000080  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.05.0100  *H 0\R7S;aOp6ζ9K.?KxE̱KmF" -[+$]i6*n@ljv- YHL sa.Ӷb5L:l{il8muG<-9[:R0P0U0U 0 0  `He00U x+D\ 0U# 0 '`ŷy0  *H #H`)@e )I)ҨN=JtZ"y*~M=1tx$j, x?Dկ&^892~<9]{4vG<Ƌ=$J>Botan-1.10.12/checks/nist_tests/tests/test28/int.crl0000664000175000017500000000051712654331322022015 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.01 990101120100Z 480101120100Z#0!0 U0U# 0 '`ŷy0  *H +&c_UOO7tZC&bm6Z]wMu搡{#"^ќvo)gj rx4\l &fa_IQ*K}S?ia[`nx8Y87;Botan-1.10.12/checks/nist_tests/tests/test28/int.crt0000664000175000017500000000123112654331322022017 0ustar jackjack000000000000000070  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.0100  *H 0ݥ}gZ:EC۟y3k!J_KF5g)݂6<ؕA&^&} lw)z_PĻ7,^{\+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test28/root.crt0000664000175000017500000000116012654331322022211 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test29/end.crt0000664000175000017500000000121212654331322021773 0ustar jackjack0000000000000000:0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.05.0200  *H 0XzP#xMt.V;1zmhYQ#Nݒ?;Imڸ;MӾ;5>n2]%q/vwy>7;ʫ;zVܮ$_@5UR0P0U0U 0 0  `He00U  &Q930U# 0 EYo0  *H L*aUtXcŴڥ ;[%ϣE:pNP9Wavӎt@SMMXᖺ֎&fdƨ-Ra|̂rVW*Hp{$Botan-1.10.12/checks/nist_tests/tests/test29/int.crl0000664000175000017500000000051712654331322022016 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.02 990101120100Z 480101120100Z#0!0 U0U# 0 EYo0  *H #*EˁB&9; t4GtҘT^!b8O/ 2Q5:)lȖ),E*p"VJ6<?d <$I!U[\:fg >Botan-1.10.12/checks/nist_tests/tests/test29/int.crt0000664000175000017500000000122612654331322022024 0ustar jackjack000000000000000090  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.0200  *H 0*b,'z-ߟ`"3L9LyyYZڞ*)ހNI-\r=xIVH^Ӹu5hOwZLҐWe]Pk=إm`0^0U00 U0U 0 0  `He00U EYo0U# 0 T0  *H `XIjE T6sDzJ R B &eRylK<9GĒk"B@+O6+eOL2v!!yPOj }Tb3z3r'B]%ga{RpR9Botan-1.10.12/checks/nist_tests/tests/test29/root.crl0000664000175000017500000000056312654331322022210 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test29/root.crt0000664000175000017500000000116012654331322022212 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test30/end.crt0000664000175000017500000000121212654331322021763 0ustar jackjack0000000000000000<0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.05.0300  *H 01u&jAta)Y;!}BʕV|NEB9j6(ZX X hEIWޜT %+4ut|]ZGmżQ~5?mR0P0U0U 0 0  `He00U ;-k0U# 0 N5,/0  *H A };CO6G7c=V&3䪪|ba[}OH# X_ADD';=PڤN.M!2Iԋݻxڕ] ՠJ:\$g7 Nـ#tuGBotan-1.10.12/checks/nist_tests/tests/test30/int.crl0000664000175000017500000000051712654331322022006 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.03 990101120100Z 480101120100Z#0!0 U0U# 0 N5,/0  *H $tQ=R}'Q1hN5sڢ|vMXw+{)#<}oP W2qg9ɡbuiE|k>խ4d㝫|ea&{|XZ`^@vBotan-1.10.12/checks/nist_tests/tests/test30/int.crt0000664000175000017500000000122612654331322022014 0ustar jackjack0000000000000000;0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.0300  *H 0DT/b.m(ȖPRJ!@ԉ l;MvGY:03'r{4dO Bb*;^9:JLbg\uiKw ,߅̗`0^0U00 U0U 0 0  `He00U N5,/0U# 0 T0  *H cLXdo3/QVQ轋n dQFľosxdJՏͫNlK_e C.@9X\r#/j+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test30/root.crt0000664000175000017500000000116012654331322022202 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test31/end.crt0000664000175000017500000000121212654331322021764 0ustar jackjack0000000000000000>0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.06.0100  *H 0U:]17΃9:lޔb#}%0ץ=h!$  VfM]Èؑ6G]( W(,<@c6le INX&KR0P0U0U 0 0  `He00U =\g}Q0U# 0 }r.0  *H 95=rzs6De8`0O(ӣ` w$sNvݒш](oXdro l~_pCZsMK3|b:_/3 ?$ ;k_vC}ÑBotan-1.10.12/checks/nist_tests/tests/test31/int.crl0000664000175000017500000000051712654331322022007 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.01 990101120100Z 480101120100Z#0!0 U0U# 0 }r.0  *H ~?O;?+]gSJc9훂75]F9#%%K}(l\JM2]-~$l` yY C_ >_NXbBotan-1.10.12/checks/nist_tests/tests/test31/int.crt0000664000175000017500000000123112654331322022011 0ustar jackjack0000000000000000=0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.0100  *H 0=-{0@- B:6b(w9żY/ѩJŒzNXĦ^>V6 K0rƆq߂ $Et,)5XG[58xL4Ҹx3c0a0U00U0U 0 0  `He00U }r.0U# 0 T0  *H j5m3/U#LԼ矽Egp7WbeE=a V4h2f$9ã>AEOKC[ K_T}@ csy-FxtQ*OlȊBotan-1.10.12/checks/nist_tests/tests/test31/root.crl0000664000175000017500000000056312654331322022201 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test31/root.crt0000664000175000017500000000116012654331322022203 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test32/end.crt0000664000175000017500000000121212654331322021765 0ustar jackjack0000000000000000@0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.06.0200  *H 0_~5Ztmhy)GaJ ] Ќ|*1 |=Vn+YtfLAM=5r 4mkt;0iy:0ܑرO!E dH"^ Lj?rR0P0U0U 0 0  `He00U `7ӄH/o0U# 0 =;PN0  *H &! 2dK dzw? 5\dwJ3HKO a# i؜[.a^wa'q?Jx.AXx/錸7.bvhb]0Botan-1.10.12/checks/nist_tests/tests/test32/int.crl0000664000175000017500000000051712654331322022010 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.02 990101120100Z 480101120100Z#0!0 U0U# 0 =;PN0  *H %z $oN2uinCyGA6X<@pk %Rc׈|L)捥} {amdgJ-I*I83%%6{pea+4iѺZDG x?qBotan-1.10.12/checks/nist_tests/tests/test32/int.crt0000664000175000017500000000122612654331322022016 0ustar jackjack0000000000000000?0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.0200  *H 0&=?=m8cpA*|.妟9WZ퇼y2_hTrE58K 'ok9굛LR!obOѮk3qTx1I0a\U`0^0U00 U0U 0 0  `He00U =;PN0U# 0 T0  *H }r!҆%3jZN*N] j_&ςoy:T"b&s޹?ҥF*1MpoJ)w<=vz'i;vBdpޢޯ%fBotan-1.10.12/checks/nist_tests/tests/test32/root.crl0000664000175000017500000000056312654331322022202 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test32/root.crt0000664000175000017500000000116012654331322022204 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test33/end.crt0000664000175000017500000000121212654331322021766 0ustar jackjack0000000000000000B0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.06.0300  *H 0pjovWgjg;`  Lm˳[H]@w 4\Xb˞ݲ߽;;-O8* aeZݣTCИ{ڂLv6wR0P0U0U 0 0  `He00U $ {&0U# 0 %mV0  *H %F*[[uT.=4^$kz]Gd) 8n4+\g\TEL+`tV@W叐>DiYvB^hJƇ!|yLˆUd7IҪBotan-1.10.12/checks/nist_tests/tests/test33/int.crl0000664000175000017500000000051712654331322022011 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.03 990101120100Z 480101120100Z#0!0 U0U# 0 %mV0  *H (*{V&5qץ"ʏ$#6 {FW^xvyraFy? Sa1hJ~T}vXRG8S-%nДX#7i mrlQDa/ݪh|~ ֞Botan-1.10.12/checks/nist_tests/tests/test33/int.crt0000664000175000017500000000122612654331322022017 0ustar jackjack0000000000000000A0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.0300  *H 0RcK-JjɜQc%oG~wc;Q_ v靖:{a!c'nR\'**oP,o}UuCfydAbBr&` ^i+dS`0^0U00 U0U 0 0  `He00U %mV0U# 0 T0  *H T~G桾}RKuq4/CNX@.paJI {Uq;ٯ?yo8_wok.&}bDgiǼ O@[ -a $C{oD+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test33/root.crt0000664000175000017500000000116012654331322022205 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test34/end.crt0000664000175000017500000000121212654331322021767 0ustar jackjack0000000000000000D0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.0100  *H 0M-py ?X>)uNNx/ $/m&#e- Y >ҧ#DegES ao)a9gRBs"6;wΙ.PeŔnZtHQ+CR0P0U0U 0 0  `He00U {"ZN0U# 0 ;U:t0  *H I >?rU~',l*0X3ןZ$>=j=lGi&[V)w$$9wqO"fHzeqwL ('VpB=uBotan-1.10.12/checks/nist_tests/tests/test34/int.crl0000664000175000017500000000051712654331322022012 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.01 990101120100Z 480101120100Z#0!0 U0U# 0 ;U:t0  *H 1JBPl`- =;F wѓF@h>ں@KjdPjamءIo7dsQ⵽W O^9yBJ5l,uZtLBotan-1.10.12/checks/nist_tests/tests/test34/int.crt0000664000175000017500000000123112654331322022014 0ustar jackjack0000000000000000C0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.0100  *H 0ѐI%X\xtwĉogvdk09oVNQm[K 3b\R s' $2’J1.y0 u Orߔ d#Xvh,d t:v~]yuc0a0U00U0U 0 0  `He00U ;U:t0U# 0 T0  *H pu3/ ր0G !ov'4~ľ\ Lc1 '^< f+P& "ӝ +O!ri];Jz("3\2ASIdn"gBotan-1.10.12/checks/nist_tests/tests/test34/root.crl0000664000175000017500000000056312654331322022204 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test34/root.crt0000664000175000017500000000116012654331322022206 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test35/end.crt0000664000175000017500000000116212654331322021774 0ustar jackjack000000000000000n0נF0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.0200  *H 0pu{@1 ]SOӷ۵Hy|HmyyyjʉxT,5"-DYm6¿gu0s[(h,(\a`b4LM=2iEH/.OV4M:080U0U [_D&0U# 0 2 0  *H <6 OV\E-h{qLEL F筡ß@Kt+ ɫLPŹI:o앑7B~ -7mT }DDO81ŃBotan-1.10.12/checks/nist_tests/tests/test35/int.crt0000664000175000017500000000120112654331322022012 0ustar jackjack000000000000000}0E0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.0200  *H 0A;gSk@ٟq &4 JԾf ka'f$;'{Y:-|ȼI8Botan-1.10.12/checks/nist_tests/tests/test35/root.crl0000664000175000017500000000056312654331322022205 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test35/root.crt0000664000175000017500000000116012654331322022207 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test36/end.crt0000664000175000017500000000121212654331322021771 0ustar jackjack0000000000000000I0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.0300  *H 0ôO78魱"  ^f(FU>1TBP*:HiReC ;fi-\[Uƌ+Yԣw9D\b魉·MWR0P0U0U 0 0  `He00U 2Zfh0U# 0 -PB0  *H DPnGV",'V¬~P1 ,B{=>0M!?Sk!dHd)Ԓq$I%jkX8+" C>/x^ X*]s!O jC➷!PBotan-1.10.12/checks/nist_tests/tests/test36/int1.crl0000664000175000017500000000051712654331322022075 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.03 990101120100Z 480101120100Z#0!0 U0U# 0 L˹A n0  *H ˱;؈|Yô aĄm"~jK&B fb=ΰZ&kU7M@#Y p3ksV9uw&fC{4\r/x\9r%auآBotan-1.10.12/checks/nist_tests/tests/test36/int1.crt0000664000175000017500000000123112654331322022077 0ustar jackjack0000000000000000G0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.0300  *H 0x 3f@fE~2[uvM!nO!L~=vD{雓*dnj#;+@MX`0G}vjY~]r\*5Q\ec0a0U00U0U 0 0  `He00U L˹A n0U# 0 T0  *H )]a[((2Ü֒nٵ4{󙢹(SNd[c64veZЃ<:ve+/*&i[W*c3Xm8}JWN=rJBotan-1.10.12/checks/nist_tests/tests/test36/int2.crl0000664000175000017500000000051712654331322022076 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.03 990101120100Z 480101120100Z#0!0 U0U# 0 -PB0  *H mz(.#5t?ˑ|oa=% q> {yY"yz8h/VjȚb蔓S&i(b-ঠFĸu\ߏBotan-1.10.12/checks/nist_tests/tests/test36/int2.crt0000664000175000017500000000123112654331322022100 0ustar jackjack0000000000000000H0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.030 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.0300  *H 0ZlD4`v0˻J'>/ȉd92/!d!]Z~t!Mzb[÷r :g0>|xn1Q}BFY!xԉ}uc0a0U00U0U 0 0  `He00U -PB0U# 0 L˹A n0  *H ENwy5;=%IQjp,9Efό]Au0lr\ɁjU= ݑg:9tZ%]YtD@I$[VD4W%n ΆzփL2Botan-1.10.12/checks/nist_tests/tests/test36/root.crl0000664000175000017500000000056312654331322022206 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test36/root.crt0000664000175000017500000000116012654331322022210 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test37/end.crt0000664000175000017500000000121212654331322021772 0ustar jackjack0000000000000000L0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.040 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.0400  *H 0_ՌݹO@%1ԙ`C e%>ȑDRtRvF 5A`T>sigعHKdTk_m%^l(|jnV )q?Q&7@D:{9(oLR0P0U0U 0 0  `He00U #h22\0U# 0 4)0  *H KP&1b~OdrAr;2;ubneb/9UP&H K~N.ܚ`9nv)bI}'nU2RAβ1X؅H)yjq= Fwk8 Botan-1.10.12/checks/nist_tests/tests/test37/int1.crl0000664000175000017500000000051712654331322022076 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.04 990101120100Z 480101120100Z#0!0 U0U# 0 -~"L0  *H yHC@.&$ @o/R%[%EOއ, 1DjӮpEĉ&LAFD>ϷJj ,) rn؊{LBotan-1.10.12/checks/nist_tests/tests/test37/int1.crt0000664000175000017500000000123112654331322022100 0ustar jackjack0000000000000000J0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.0400  *H 0> }p+%CyK͓qV_rFC1O70Iͳ)@{kEl`wь᪤1N} "`ggA[V1qCK Epݖko?E_IH+c0a0U00U0U 0 0  `He00U -~"L0U# 0 T0  *H $y2|16?MdC=1Bu5ͦ͞Tۤ_CnH$^&\_l4FvBk0AY:X'rY(vDrao uBotan-1.10.12/checks/nist_tests/tests/test37/int2.crl0000664000175000017500000000051712654331322022077 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.04 990101120100Z 480101120100Z#0!0 U0U# 0 4)0  *H (](~֛5$AȜcITpf{参/jw5d5JH( ''!@m2e2~N]KJaALW,3>LE b>/ˬBotan-1.10.12/checks/nist_tests/tests/test37/int2.crt0000664000175000017500000000123112654331322022101 0ustar jackjack0000000000000000K0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.0400  *H 0`+M봿"ӳi!N7tѷfAPJ{ $Bw%v_)YB"8$g$xCmSdt[4Mjspo\>Botan-1.10.12/checks/nist_tests/tests/test37/root.crl0000664000175000017500000000056312654331322022207 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test37/root.crt0000664000175000017500000000116012654331322022211 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test38/end.crt0000664000175000017500000000121212654331322021773 0ustar jackjack0000000000000000O0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.050 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.0500  *H 0a˷BQ JBs'dkN0Gɗu`CUpV\Qȫb%\VJ Ƴ $W? v;.{K s$&۠džIQ([R0P0U0U 0 0  `He00U i]w7O0U# 0 P0  *H T֧zסI1GgnB<X) ^$2bC T]"1 y%g>= :U/Dnto5$%<#j 8nHg(qUݤeŏ`|>h{>1\1Botan-1.10.12/checks/nist_tests/tests/test38/int1.crl0000664000175000017500000000051712654331322022077 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.05 990101120100Z 480101120100Z#0!0 U0U# 0 s0  *H dͥteBp킥 7OQ%4huI>99a>策صb;&ƯtQ ?㼢HlRK [Z_mu,5hW9fb=Botan-1.10.12/checks/nist_tests/tests/test38/int1.crt0000664000175000017500000000123112654331322022101 0ustar jackjack0000000000000000M0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.0500  *H 0A3WH:s*3 0#9L\W۷7iG +oNSKeS`$NDAn| 3?%_v$cpK X'R/]f^? |c0a0U00U0U 0 0  `He00U s0U# 0 T0  *H XtG0WRO`[,r&ƪ:ȲNjkﺑW-@8$vD,^vL*u!I]`wAh!I~cՈnPTg s߽-q3/׈iNBotan-1.10.12/checks/nist_tests/tests/test38/int2.crl0000664000175000017500000000051712654331322022100 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.05 990101120100Z 480101120100Z#0!0 U0U# 0 P0  *H :bѯ 5+Umls7QkXRJ> !o~T@N"񼈱5+e%7cﴱ;*,)]7yf?v6S18 CE4g/ʱ3SBotan-1.10.12/checks/nist_tests/tests/test38/int2.crt0000664000175000017500000000123112654331322022102 0ustar jackjack0000000000000000N0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.0500  *H 0F27(L6=Z`cN_ZĖ +)#yR Bn+`ڲ/mevHm5kC]5c0a0U00U0U 0 0  `He00U P0U# 0 s0  *H kw>:ܫ?NM "uXZ'T2X؆+Sn/ D)g^#(d_XXu}WJoә fsr$3L"b[Y\Botan-1.10.12/checks/nist_tests/tests/test38/root.crl0000664000175000017500000000056312654331322022210 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test38/root.crt0000664000175000017500000000116012654331322022212 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test39/end.crt0000664000175000017500000000123112654331322021775 0ustar jackjack0000000000000000S0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.0600  *H 0#$Ðh1}nKRUD?IiZvt\鉫؃*mYஂsGC9Hg 9HLÎWzbK8vCRyEeAyɐ5zD#F{IۼÑoc0a0U00U0U 0 0  `He00U 1G&+0U# 0 ҉2a0  *H  GD82>uϦڝh +I5i46rTP a׸U(@LhZ@e+PIEc=$GE Zq-vf 7Botan-1.10.12/checks/nist_tests/tests/test39/int1.crl0000664000175000017500000000051712654331322022100 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.06 990101120100Z 480101120100Z#0!0 U0U# 0 }JRӁ0  *H D. qjtOXCt3dCөy$ؗvO7cܺWOYpKbdXKU᳙!>9eA99ΡqB/A.C4fL`y'$k@ ؝|nBotan-1.10.12/checks/nist_tests/tests/test39/int1.crt0000664000175000017500000000130212654331322022101 0ustar jackjack0000000000000000'P0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.0600  *H 0x0iãv\]FDiT;y;F1Z3Ŧ k{^5YrBpC0!n{ytLJwPug(Ȱ" b00U00U0=U 6040  `He00  `He00  `He00  `He00U }JRӁ0U# 0 T0  *H \RLݵ fMhLVP=jeu$;T$O;csHf[1-;Qy9!,n/fbΌe3"Ԁz-ՠ,`smBotan-1.10.12/checks/nist_tests/tests/test39/int2.crl0000664000175000017500000000051712654331322022101 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.06 990101120100Z 480101120100Z#0!0 U0U# 0 eLL0  *H pLV _5KcnY$uYBM3ڄ`[w}_[}ٻ"?@5GPv.YlL ԗs◒Ph5_ml9:я6n:s:r5HBotan-1.10.12/checks/nist_tests/tests/test39/int2.crt0000664000175000017500000000126312654331322022110 0ustar jackjack0000000000000000Q0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.0600  *H 0 Q7@OB5$z!v.*}F 1T̐ "d0H@qqˎht]:AKrɯ&.#5UG!iJSY@}Q}0{0U00U00U )0'0  `He00  `He00  `He00U eLL0U# 0 }JRӁ0  *H  &c8AޒwQ "FO92ӭޓ]N5!3֎ѥd.kNbw.ፄ[G/ S5:y;`>t)oŅ׷1QABotan-1.10.12/checks/nist_tests/tests/test39/int3.crl0000664000175000017500000000051712654331322022102 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.06 990101120100Z 480101120100Z#0!0 U0U# 0 ҉2a0  *H {N} SdJ j\MhvjVk2ۂ B B-B\IϹ粡ޛ(J.y5P+chgEvlt WM+mBotan-1.10.12/checks/nist_tests/tests/test39/int3.crt0000664000175000017500000000124612654331322022112 0ustar jackjack0000000000000000 R0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.0600  *H 0B1Ѭ<5ۜ򵹶͑|DCq$g~|md#AuYbMcꯨj?K{YН D0uۃ`C2ѥlmw!QCΆȭls*_p0n0U00U0#U 00  `He00  `He00U ҉2a0U# 0 eLL0  *H _gLںi:̩N8!Pgޜb mŦO*i+2,/_[>H8RW_r'g3(!Qǜ8fÃBotan-1.10.12/checks/nist_tests/tests/test39/root.crl0000664000175000017500000000056312654331322022211 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test39/root.crt0000664000175000017500000000116012654331322022213 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test40/end.crt0000664000175000017500000000123112654331322021765 0ustar jackjack0000000000000000W0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.070 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.0700  *H 0Fe`|`AR\2?'j<6O!IЫ]1y^I徧5LrФNfrm=~NkOWCgJ)r/rpFv/ZĨL3<=~%N>ec0a0U00U0U 0 0  `He00U .{W~0U# 0 P2DC0  *H 6_st›jx89=9+mZ_B`h54C_HcEc(9uXU뗚v؎eZP[NZ(3x\\J\|;b~XOh |~BlFfT`Botan-1.10.12/checks/nist_tests/tests/test40/int1.crl0000664000175000017500000000051712654331322022070 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.07 990101120100Z 480101120100Z#0!0 U0U# 0 /z70  *H Q\\qYiÎS7VMW`Cch1~8TU3T*a!z]-y}YTID}-g'G=ܒk ŽmXA9Sܨ]z"a-Botan-1.10.12/checks/nist_tests/tests/test40/int1.crt0000664000175000017500000000126312654331322022077 0ustar jackjack0000000000000000T0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.0700  *H 0ݟ~NȪ~1Lӝ[)Xl?;=ݜ=,/p#N|>}\yoze vyFHW|!bT#xՋVcdO Q~YzEP~WLKʞni:\\=G Vv RzBotan-1.10.12/checks/nist_tests/tests/test40/int2.crl0000664000175000017500000000051712654331322022071 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.07 990101120100Z 480101120100Z#0!0 U0U# 0 I5ѐD0  *H 24zC vPX]׋3;A"n)=u >76.?Roni®S'ԫӧK JtQ0rߠzA23g%BL\JBotan-1.10.12/checks/nist_tests/tests/test40/root.crl0000664000175000017500000000056312654331322022201 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test40/root.crt0000664000175000017500000000116012654331322022203 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test41/end.crt0000664000175000017500000000123112654331322021766 0ustar jackjack0000000000000000[0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.0800  *H 0Xz;=<Pa[7Qo^?YH4SZ8y5=ĭ4Į6F]FV3N}WN6=1” \ɧpSQ #^#f<3NeMac0a0U00U0U 0 0  `He00U ;T&հj"0U# 0 [_d*0  *H 6c!gbQ{A(w)C0<:5ؑgZqU8>u>#.ܢq&rdIOo,z q(szԊK9i<ǂ0CAt0c8cBotan-1.10.12/checks/nist_tests/tests/test41/int1.crl0000664000175000017500000000051712654331322022071 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.08 990101120100Z 480101120100Z#0!0 U0U# 0 \kW0  *H L'7Z a Msglƣ)uc̹$9Lt@*pnk1VG ռ?UH^Eꂔ>r03y>A"([N 1tHӟ8rlp0n0U00U0#U 00  `He00  `He00U \kW0U# 0 T0  *H 6,1U.>)h ?&- SM`7^Woh{7KٖhiWBO(I?rR3EA@Oa0`ȦTs򱺺%\؁sF):ezBotan-1.10.12/checks/nist_tests/tests/test41/int2.crl0000664000175000017500000000051712654331322022072 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.08 990101120100Z 480101120100Z#0!0 U0U# 0 /Lrd0  *H 7PD倯Q'FӀ2A0"J~s%|b3!?ݒO965`ȟ>*Fa_#YUT]d&#\XƜEb^ [n +=pBotan-1.10.12/checks/nist_tests/tests/test41/int2.crt0000664000175000017500000000123112654331322022074 0ustar jackjack0000000000000000Y0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.0800  *H 0\0+jn _.chʕe@2%Qd:%Zh NWV/UUocދQ8Z7]gzbM׮V)6g_PBhlR{nEc0a0U00U0U 0 0  `He00U /Lrd0U# 0 \kW0  *H >Oz8G/~}ʼYXCa3HY 6):ZJ4+QbbGN (+O{\B1h* М |V~Dí)N6|\Botan-1.10.12/checks/nist_tests/tests/test41/int3.crl0000664000175000017500000000051712654331322022073 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.08 990101120100Z 480101120100Z#0!0 U0U# 0 [_d*0  *H `Yid}7!- 8m`5 )=DvKU=%⼦FlufgP'_i(s$?FG^#.ڗe0Q4]6Botan-1.10.12/checks/nist_tests/tests/test41/int3.crt0000664000175000017500000000123112654331322022075 0ustar jackjack0000000000000000Z0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.0800  *H 0˦;%Z?S,ҏJjR.N*+±tԻhj?T?DKZA@-oHYTD8eըQds5q& ,F[Lj܉y,Gc0a0U00U0U 0 0  `He00U [_d*0U# 0 /Lrd0  *H yi 1_ːTT5⬝R"֟Zuz>2ܨӮC?Eϙ_$A='ʮ}w(@m6y2Ȉ(ɜ_uBotan-1.10.12/checks/nist_tests/tests/test41/root.crl0000664000175000017500000000056312654331322022202 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test41/root.crt0000664000175000017500000000116012654331322022204 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test42/end.crt0000664000175000017500000000121212654331322021766 0ustar jackjack0000000000000000`0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.090 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.0900  *H 0 0RMG7/j$)8 Sq4F;*O F407!QSMm*!)5߮mMgΎO+#׫SyE؀UGlHcR0P0U0U 0 0  `He00U wz0U# 0 ŜT.y0  *H +jy qv|e ;|ű޵x$ A*5K2M;03?YgEvUQ ĺ:d" ΙI4>-4R 5'Up::A]|Botan-1.10.12/checks/nist_tests/tests/test42/int1.crl0000664000175000017500000000051712654331322022072 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.09 990101120100Z 480101120100Z#0!0 U0U# 0 Dٸt;V0  *H G:qYM_lKn')|1Ȥp˭" M;NX =L3nd50oogџ.711 oNP{2^Xx믒<0~eL+[>8Botan-1.10.12/checks/nist_tests/tests/test42/int1.crt0000664000175000017500000000126312654331322022101 0ustar jackjack0000000000000000\0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.0900  *H 0ɩ$8ܕ |גZ:  Nr18ɤD9$XB (Ǐl$S9>Vld;@ tJu6 mڅ;|sE2c'.-HX'!+}0{0U00U00U )0'0  `He00  `He00  `He00U Dٸt;V0U# 0 T0  *H $V~JSt|BP7jV3Uє *H_(j(gy> >"fjRr'! 7㡀}Q J6d.釜Hg4$g9Ͷ%AMBotan-1.10.12/checks/nist_tests/tests/test42/root.crl0000664000175000017500000000056312654331322022203 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test42/root.crt0000664000175000017500000000116012654331322022205 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test43/end.crt0000664000175000017500000000116212654331322021773 0ustar jackjack000000000000000n0נe0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.06.0100  *H 0ҫR LȽk7ձ1hD $ۈ1y͈n08G0VJ XgȱiR5;VT0SvSWAA#t6TH9=st\ǀwwo^t\,b1lLE NBotan-1.10.12/checks/nist_tests/tests/test43/int1.crt0000664000175000017500000000124712654331322022104 0ustar jackjack0000000000000000 a0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.0100  *H 0hp}+RH,9晀CӒ[~::IбDw~`u|$bae3o?yڮ)a<Z(LLBTmƸIZZFZ.e9z Rcي8Pbgq0o0U00U0U 0 0  `He00 U$0 0U F/F׼?0U# 0 T0  *H 9$RgQ>_,'`GS3+pYmam1[8' \ )=> Մ T2DG옛T`IWyL⤣߄' 7 G31ɐKBotan-1.10.12/checks/nist_tests/tests/test43/int2.crl0000664000175000017500000000051712654331322022074 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.01 990101120100Z 480101120100Z#0!0 U0U# 0 $zEy0  *H F P6b'eʒ 2OjpLOCKupilC-T)~h\?Rq^Y3u?{;3x9ޒ#MJ&+ jBotan-1.10.12/checks/nist_tests/tests/test43/int2.crt0000664000175000017500000000123112654331322022076 0ustar jackjack0000000000000000b0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.0100  *H 0nDL O,j=,2Ql.:pR^ b }evph0f-3FPr;/| GO=LGX)1^'ο]@wY8̀*fPvBotan-1.10.12/checks/nist_tests/tests/test43/int3.crl0000664000175000017500000000051712654331322022075 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.01 990101120100Z 480101120100Z#0!0 U0U# 0 g܌10  *H 6/Y>=q)Y_!>Mpa(ABL0mHy a*x5s߀<2]2qL cC7K{#b]#`#o#E;_* c˵a89Botan-1.10.12/checks/nist_tests/tests/test43/int3.crt0000664000175000017500000000123112654331322022077 0ustar jackjack0000000000000000c0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.0100  *H 0h0mZ4c|`}FƠ-q7ks`=i5 L2^44f3(vsrB Q6V3m`JS䴂va4hUSïAkaz!\0A%c0a0U00U0U 0 0  `He00U g܌10U# 0 $zEy0  *H L1 O\H ▹m_b1d%%k}t1Lr> CWjYp(=GmQ8u{hYtaOq _pѠ#Py^arf~9eGA@Botan-1.10.12/checks/nist_tests/tests/test43/int4.crl0000664000175000017500000000051712654331322022076 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.01 990101120100Z 480101120100Z#0!0 U0U# 0 ɛ 6!0  *H p=,i(<9Ni޷5!``uHϘn!Ӱi'Py`X2W*c vtL'jyg.K)Phxk;bҕ*AwICBotan-1.10.12/checks/nist_tests/tests/test43/int4.crt0000664000175000017500000000123112654331322022100 0ustar jackjack0000000000000000d0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.0100  *H 0KgVG+sqP8JV?S6f%}H./9](]: O0ޚD[Bj\\_a1eұ%Hq!) sn.m(';0w=%c0a0U00U0U 0 0  `He00U ɛ 6!0U# 0 g܌10  *H s,Aꍧ2rG[(37ᚙRLFF?|ո+(OWKGyPt޳xY dG"g~;0z@^'1= R- X#uRBotan-1.10.12/checks/nist_tests/tests/test43/root.crl0000664000175000017500000000056312654331322022204 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test43/root.crt0000664000175000017500000000116012654331322022206 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test44/end.crt0000664000175000017500000000116212654331322021774 0ustar jackjack000000000000000n0נj0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.06.0200  *H 0+dv:SDW;dSʾAݭHE<3dUk|8sU 5 L%?c CB}>F@AĚx>4E(#KZ_׬aM ާcZEK+:080U0U 0?]6E)eV_kod [l$k! \!Tgs2nAԋ4Sv޶xBotan-1.10.12/checks/nist_tests/tests/test44/int1.crl0000664000175000017500000000051712654331322022074 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.02 990101120100Z 480101120100Z#0!0 U0U# 0 yjowm0  *H vNe˳_Fr%;\U0rl?P jTC1DX וu3KQ4Y{-d3=Z y{Apׄ̑2^ƬQJBotan-1.10.12/checks/nist_tests/tests/test44/int1.crt0000664000175000017500000000124712654331322022105 0ustar jackjack0000000000000000 f0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.0200  *H 0ミY:WlF[ y kuVϨf ̝?O^E{pF5N y5|[vdip*g3y+_Z_|QWιyɖG•E ư;q0o0U00U0U 0 0  `He00 U$00U yjowm0U# 0 T0  *H bkYR73+[_II{Pv_/HV"~'}3u6d/ʠˈ6#2={K:Rb'(6cl+r-וIed6JBotan-1.10.12/checks/nist_tests/tests/test44/int2.crl0000664000175000017500000000051712654331322022075 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.02 990101120100Z 480101120100Z#0!0 U0U# 0 (VU80  *H  _ bL JxiTW>)+sLPzŰ20e|;_\{ z2|W af6wMy|%XO5UGA[\sAPuZw׫;˗,Botan-1.10.12/checks/nist_tests/tests/test44/int2.crt0000664000175000017500000000123112654331322022077 0ustar jackjack0000000000000000g0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.020 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.0200  *H 0ऊƏ}rg48BFȹF΄-^hR&ڲՏĈbksyeH.z˸;uViS ]t4VR2kP{MvybTUoC&GB*.@}7nތ_J[/>qBotan-1.10.12/checks/nist_tests/tests/test44/int4.crt0000664000175000017500000000123112654331322022101 0ustar jackjack0000000000000000i0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.020 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.0200  *H 0$,=`!+by/q=K~$Bz@"|FqjlT)G,+a\DX+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test44/root.crt0000664000175000017500000000116012654331322022207 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test45/end.crt0000664000175000017500000000116212654331322021775 0ustar jackjack000000000000000n0נo0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.06.0300  *H 0R9+RG+JJ&+fb iH"b'׃+2i.{爣/q[tB%s6< )R?+Me/5UՐ 8:080U0U i7Cl0U# 0 :k F0  *H  sjRO C%H?Cqk\f><}&*F+iZk8!Oa /E$k[-rɌ %'*onLܺ'b^DˏOع^Botan-1.10.12/checks/nist_tests/tests/test45/int1.crl0000664000175000017500000000051712654331322022075 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.03 990101120100Z 480101120100Z#0!0 U0U# 0 E%ٚR 0  *H BU]$K5]rTb m  Hp$e7Q]]]xn/A[y85LaB'ذ10xU43 Mo-|*?WܜK"p_5&̈́TGkG3Botan-1.10.12/checks/nist_tests/tests/test45/int1.crt0000664000175000017500000000124712654331322022106 0ustar jackjack0000000000000000 k0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.0300  *H 0PʌŞ,J˩) A~3=]in6OĤT: %IF. ZSϽlAazL` wq1\;- *N#SZ![!"&i'(vB!p7KfBotan-1.10.12/checks/nist_tests/tests/test45/int2.crl0000664000175000017500000000051712654331322022076 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.03 990101120100Z 480101120100Z#0!0 U0U# 0 qc0  *H  !_-{[-\" Q wTԘA/z)Wα+<2d7 !Rzq.8У({W\F[UT+L*SKNQRd ~z/vr5wݹ?/P+UBotan-1.10.12/checks/nist_tests/tests/test45/int3.crt0000664000175000017500000000123112654331322022101 0ustar jackjack0000000000000000m0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.030 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.0300  *H 0Ģe1Pϲ:oGT!k7CQj]TWFADel\,`cR{O%򖞉 dJF=bPpm\?qrhN \wK7>?*Kc0a0U00U0U 0 0  `He00U snC:0U# 0 qc0  *H 4\.j+s~_Sg 7|m6a<26LjߏnڊՈFVcN'! ] @*\0՜+FG\q#X"Gю/7s^[B*9DFuBotan-1.10.12/checks/nist_tests/tests/test45/int4.crt0000664000175000017500000000123112654331322022102 0ustar jackjack0000000000000000n0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.030 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.0300  *H 0ͻ47.y4$2Տ?ůCC W *`Hd xo!zJU^]2ܬ:x!ݿNʩLZeoJ.U-bӥKl3i袊c0a0U00U0U 0 0  `He00U :k F0U# 0 snC:0  *H NP^ yxD ]b@ԡq`h.$Ld"\ ]mt{đ06'r|:_O ī^,,6V7gxttut% &%ÈBotan-1.10.12/checks/nist_tests/tests/test45/root.crl0000664000175000017500000000056312654331322022206 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test45/root.crt0000664000175000017500000000116012654331322022210 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test46/end.crt0000664000175000017500000000121212654331322021772 0ustar jackjack0000000000000000t0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.040 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.06.0400  *H 0&kk[vXa61 ʝ&}qhC\K-'PUA6=7Q~ %tBojײgeQk W#kpӊ1K%Y]@˘5Tsaj R0P0U0U 0 0  `He00U 8ޔ9.0U# 0 &7 0  *H ^ZTcٯt=hGpz=hUp/f6\}E.iXz< )F~%ezjxS۱לdO\4'Botan-1.10.12/checks/nist_tests/tests/test46/int1.crl0000664000175000017500000000051712654331322022076 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.04 990101120100Z 480101120100Z#0!0 U0U# 0 |`40  *H >RKر<χʓpj.|Tc!_^əZ4FItO@fBfG^K78,䄆7'*u,8Uk4]E%i%Botan-1.10.12/checks/nist_tests/tests/test46/int1.crt0000664000175000017500000000124712654331322022107 0ustar jackjack0000000000000000 p0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.0400  *H 0šLFa؄lN$#=%w*`(-ǁU6~NgA]zUNhBbct sL視UT+(m1HG>-=OhW,^ol'J<81dzp'q0o0U00U0U 0 0  `He00 U$00U |`40U# 0 T0  *H 2v 7_{bv>u@PA0ә?2KϪKhH%zk %=z}zv'csJ]F5ޯok*g>T)˃1cBotan-1.10.12/checks/nist_tests/tests/test46/int2.crl0000664000175000017500000000051712654331322022077 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.04 990101120100Z 480101120100Z#0!0 U0U# 0 HAy0  *H -Vzu؋BK$1. Qϯk21W7G!0"6e?iVK141d6j^50068uCa>#i3p>,,]쪻#vt3'֎o*Botan-1.10.12/checks/nist_tests/tests/test46/int2.crt0000664000175000017500000000123112654331322022101 0ustar jackjack0000000000000000q0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.0400  *H 0ǩ!N ցzsfU@U4|wLs*;wu>r|u C@J>w)=';hEL*{C}JimGq(IIuԧئVc0a0U00U0U 0 0  `He00U HAy0U# 0 |`40  *H :X5F!@iic %~yj$Yc(zHɄM_2zŒH2Botan-1.10.12/checks/nist_tests/tests/test46/int3.crt0000664000175000017500000000123112654331322022102 0ustar jackjack0000000000000000r0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.0400  *H 0uc oafL|) n9GNX.[^ŝJ=~vC{*H-OXV>Qɢ$LZ)lf%bG[p6sRbz/ c0a0U00U0U 0 0  `He00U h"Y 0U# 0 HAy0  *H  %:{R 4NœLKPQ&hGڜbwYLuPG[.#amM08)Bm)cZp v#귄9oz?U#OD $뱄5>'=>Ӎalve|Botan-1.10.12/checks/nist_tests/tests/test46/int4.crl0000664000175000017500000000051712654331322022101 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.04 990101120100Z 480101120100Z#0!0 U0U# 0 &7 0  *H rzK$S헪Ϗ^0{|*Q9y.bQ,eOw0$XLz`nuC \߻fKhn1Ul*?U(L fP^Botan-1.10.12/checks/nist_tests/tests/test46/int4.crt0000664000175000017500000000123112654331322022103 0ustar jackjack0000000000000000s0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.0400  *H 0vO2yɖ ~H ,5;H&Ǐ3vp#J>NN4O͡BWzziSd:5cQu~ؤR7Y.|ςƎu2Q撑/#]Dc0a0U00U0U 0 0  `He00U &7 0U# 0 h"Y 0  *H ;od1xH}+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test46/root.crt0000664000175000017500000000116012654331322022211 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test47/end.crt0000664000175000017500000000116212654331322021777 0ustar jackjack000000000000000n0נy0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.050 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.06.0500  *H 02IO{L,\ HKz(X(Gu|9U#M9G|ʼnN#RL"ٯ|fg 65~nj &fzr"ZJh"mIQ85ഓݻ:080U0U J0 0H 0U# 0 j~_I0  *H  Tg[ efެb0G'FZ!Z m޴¤[r%!s}Wm㏡ԳRqYKQjK>S̛G eir]BrpC5`?;k)-B Botan-1.10.12/checks/nist_tests/tests/test47/int1.crl0000664000175000017500000000051712654331322022077 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.05 990101120100Z 480101120100Z#0!0 U0U# 0 !k0  *H  }M z\>O:Lv\)k"I۠L+D)&ABotan-1.10.12/checks/nist_tests/tests/test47/int1.crt0000664000175000017500000000124712654331322022110 0ustar jackjack0000000000000000 u0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.0500  *H 0!KP(.w'5,t13?vIعp[q0o0U00U0U 0 0  `He00 U$00U !k0U# 0 T0  *H ?P?1M'JnӁQ`Yweݿ EP_nVƵ6a[h8&8+ 5rcHÁglUjD*glyi0ш kWVg]pT 'M恁uBotan-1.10.12/checks/nist_tests/tests/test47/int2.crl0000664000175000017500000000051712654331322022100 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.05 990101120100Z 480101120100Z#0!0 U0U# 0 T{0  *H C>u8,~Adb%V}1 A!{EeM 8hAm`).8&͋"c]V-^\:]Uej;k)|UC=gH"twۅSlZBotan-1.10.12/checks/nist_tests/tests/test47/int2.crt0000664000175000017500000000124712654331322022111 0ustar jackjack0000000000000000 v0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.0500  *H 0=vYK AC ~5@|A  _̨ӯ9 zF=-C#1fu`J.&\!n!V!@^{U"F=$2qq0o0U00U0U 0 0  `He00 U$00U T{0U# 0 !k0  *H #Q QK Mybò*,4 >u15fO' jvIJmH&"#.q˂_kvCJ49\iVb;Wsȴ!I%}vWBotan-1.10.12/checks/nist_tests/tests/test47/int3.crl0000664000175000017500000000051712654331322022101 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.05 990101120100Z 480101120100Z#0!0 U0U# 0 ~c0  *H %ּMߩbu. (O?OWݹP< ђJ7izMEH~]70(xFM༼MYfc&uRssĆ&{<f7gHb;W5j0Botan-1.10.12/checks/nist_tests/tests/test47/int4.crt0000664000175000017500000000123112654331322022104 0ustar jackjack0000000000000000x0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.0500  *H 0Ǟ>9{n+ Ѡd oˆѢE`l@d A]/wYFC1M1s]!ٙb<ˡC]v[ҍN=|+wIrNi*߀c0a0U00U0U 0 0  `He00U j~_I0U# 0 ~c0  *H lѢg`Wg [85gR:#Y5z~ 7L V>-SWMX>aU"d!~9+T:?uYdYuʠώG^tbVBotan-1.10.12/checks/nist_tests/tests/test47/root.crl0000664000175000017500000000056312654331322022210 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test47/root.crt0000664000175000017500000000116012654331322022212 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test48/end.crt0000664000175000017500000000121212654331322021774 0ustar jackjack0000000000000000{0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.0100  *H 0-`~1wLA"*lE(6!ER!Nh?lBJR/ʆP0)Ǜ_VZb>Kk&KHs eXYVj IR0P0U0U 0 0  `He00U f7w L&0U# 0 *-0  *H j'-(v%q,= |7PuY"2s`Xsc[pyw"7B;jnp)mYI4xScb}b[j.k$4}Botan-1.10.12/checks/nist_tests/tests/test48/int.crl0000664000175000017500000000051712654331322022017 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.01 990101120100Z 480101120100Z#0!0 U0U# 0 *-0  *H G%\= Á:q*Zi<2t%8! QF93}J@*0k:#% 6!YYtP0߽y(2w\/UI˘s!TᙪH{O=2Botan-1.10.12/checks/nist_tests/tests/test48/int.crt0000664000175000017500000000123112654331322022021 0ustar jackjack0000000000000000z0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.0100  *H 0_O'ȧKONgmmP{WܯfcF-v\ub'd- ;Cvr3j3'1 o+l\Kmyldv7rs𝎵WhG&k u$=%,c0a0U00U0U 0 0  `He00U *-0U# 0 T0  *H ]Q/x>]wr\ cѸsKFO, -ŕu7}.')ĶB0`.#>M| 8 n[R]n0B'Df ESH_N?Xx+P!YBotan-1.10.12/checks/nist_tests/tests/test48/root.crl0000664000175000017500000000056312654331322022211 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test48/root.crt0000664000175000017500000000116012654331322022213 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test49/end.crt0000664000175000017500000000122712654331322022003 0ustar jackjack0000000000000000}0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.0200  *H 0l̬WP 0@P ޑoHu<;X> Dk  XUGo!#}gjA؝F:Ġ!k Y& ۉ_0]0U0#U 00  `He00  `He00U ,Mz0U# 0 Y%a0  *H W&͵۰'mxqXTޑdZUsQ_^O'.1B9Vഗ&v88ҞC4--Icu[,aB(s`=ǂ%0+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test49/root.crt0000664000175000017500000000116012654331322022214 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test50/end.crt0000664000175000017500000000120512654331322021767 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.0300  *H 0ƒB9 F^ <}cʊMg{gi83lK\O?1C:a%'w@{8ӆy;u.&mXԪN Fgt1mt;]kQ'AHkDʋ]M0K0U0U  00U 0U EC|0U# 0 kS0a0  *H y":" vM^ TQL9l hr٧&Eq[en3e$7/92F "Ƥ Sy >x3SdLkf'V-LywWP^lBotan-1.10.12/checks/nist_tests/tests/test50/int.crl0000664000175000017500000000051712654331322022010 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.03 990101120100Z 480101120100Z#0!0 U0U# 0 kS0a0  *H qAMwku|FԢ#RG:[acW')%#xA˭ -QTn'Y=w63؞|>4L7A e[o+fD/;Botan-1.10.12/checks/nist_tests/tests/test50/int.crt0000664000175000017500000000122412654331322022014 0ustar jackjack0000000000000000~0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.0300  *H 0d8nTwiB(`@u=e5I/pDVˇk9V1זp?UoDz`p~bqϻ9C}+ąz"֫zI; ;y,%l @:o qy^0\0U00U0U  00U 0U kS0a0U# 0 T0  *H |I&q3Q01ԑ]Y$m:1/?ւIFL4S %A-G fKsW0e+K}8T:.ග48SLdE$I=m @1RnTBotan-1.10.12/checks/nist_tests/tests/test50/root.crl0000664000175000017500000000056312654331322022202 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test50/root.crt0000664000175000017500000000116012654331322022204 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test51/end.crt0000664000175000017500000000121312654331322021767 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.040 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.0400  *H 0%fp[das jrqwF4>8Q=u.&4]{s6o\6<=K*nZwA"UpLLcez_~??rɥ) i rER0P0U0U 0 0  `He00U  3X~0U# 0 J;0  *H EvT䑖+$(x#~>\v"c m7T]!lPʁv I%="`ox.$;Bh.o,?kCf7b^?'M0枆3FJs湦Botan-1.10.12/checks/nist_tests/tests/test51/int.crl0000664000175000017500000000051712654331322022011 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.04 990101120100Z 480101120100Z#0!0 U0U# 0 J;0  *H pڌ^W\Ͷ/s-j>9'Aj5)Y(MP`WcfoDĺFү&iUAC7` /kɪX_jo_^xBotan-1.10.12/checks/nist_tests/tests/test51/int.crt0000664000175000017500000000123212654331322022014 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.0400  *H 07N0[RppH4R+"\ <Ŀ 7ys[i8D51/ג!\2o`t&[1Ȫ /6Kت]xC=pc0a0U00U0U 0 0  `He00U J;0U# 0 T0  *H 1WeLCYZǠOu8vK?_VL,pC־%LܘMrR@>;o;A XJgKyt1? DQҢ 氵X2ydcBt+Botan-1.10.12/checks/nist_tests/tests/test51/root.crl0000664000175000017500000000056312654331322022203 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test51/root.crt0000664000175000017500000000116012654331322022205 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test52/end.crt0000664000175000017500000000121312654331322021770 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.050 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.0500  *H 0So'baJyۈz"JJVЁTH2;gSxDnE(X% d+;ՄPY[kUKd[Y qfQ-.R0P0U0U 0 0  `He00U MvPA0U# 0 4X0  *H eZ@](U>S-eJf@r'0]&9g-X^X؎U3m{\M"! 'sH- MKfo^3a_CRܾ9nLBotan-1.10.12/checks/nist_tests/tests/test52/int.crl0000664000175000017500000000051712654331322022012 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.05 990101120100Z 480101120100Z#0!0 U0U# 0 4X0  *H 읃;W vPȿOGlox̕r<#q!GG, Y'9yu0-ί6(s/} 4 5ї|Vcsa lDWmI_S*jex:'3B -P)5:+q5|.X'6ȫ[G (Ѯ5Botan-1.10.12/checks/nist_tests/tests/test52/root.crl0000664000175000017500000000056312654331322022204 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test52/root.crt0000664000175000017500000000116012654331322022206 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test53/end.crt0000664000175000017500000000124512654331322021776 0ustar jackjack0000000000000000 0  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.060 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.0600  *H 0i?C ++Na\wyhT L㌰΁T]XC4xGךc, vZKFoq}f pSXf{YB= *oջl0j0U00U )0'0  `He00  `He00  `He00U ʊG 0U# 0 $a{0  *H lrJ.]k} Wf)+w]tH RՄEwm)}> o79YUTޚ&fL-cƨOf3Qn@FڡT|42u+Botan-1.10.12/checks/nist_tests/tests/test53/int.crl0000664000175000017500000000051712654331322022013 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.06 990101120100Z 480101120100Z#0!0 U0U# 0 $a{0  *H 澔-?ޣ լ-[/jD;)π/0'n@띸ew`0V&[v5[W \݌&gb:1 _XH-C0> aBotan-1.10.12/checks/nist_tests/tests/test53/int.crt0000664000175000017500000000126412654331322022023 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.0600  *H 0"O n6=Ŵf?x`+%/$-V FhP",W* to>:ueT Ӵžq.Ty{58;!hEZ%ޯ67# dqʥ}0{0U00U00U )0'0  `He00  `He00  `He00U $a{0U# 0 T0  *H *h5]둮9p#O,Q)۱bh>d9M$\\:I EK=I$xsK6[Q0˪ b1;nA0%̤'uBhBotan-1.10.12/checks/nist_tests/tests/test53/root.crl0000664000175000017500000000056312654331322022205 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test53/root.crt0000664000175000017500000000116012654331322022207 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test54/end.crt0000664000175000017500000000121312654331322021772 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.0100  *H 0C>tZEK7r{Xb+DZ8cW毘hQb~D+t\rs%9 /io[ ɞm:jeEHU`(Ѵr8ȷIS"yR0P0U0U 0 0  `He00U r0U# 0 1S"^0  *H Go Vv/ ^g SD_p:VfdZ(צyTaӓH:1Y?y*P;ųle+Q6Se x]O2m3WBotan-1.10.12/checks/nist_tests/tests/test54/int1.crl0000664000175000017500000000051712654331322022075 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.01 990101120100Z 480101120100Z#0!0 U0U# 0 cᜫ}0  *H w8̣pf' %/g5P]Y qjlv=njxF\!zC+ᄀ? u]5`_ (8]Xֻ!i4֕z nW:42oD/ Botan-1.10.12/checks/nist_tests/tests/test54/int1.crt0000664000175000017500000000123512654331322022103 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.0100  *H 05vwn;0b.Ƒh{jB ]%Aљ#*S#[-AhM)9> |grgR{9eخhf93GPCO! F~!՘C*՘j @rK?6/#x&d,uBotan-1.10.12/checks/nist_tests/tests/test54/int2.crl0000664000175000017500000000051712654331322022076 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.01 990101120100Z 480101120100Z#0!0 U0U# 0 1S"^0  *H dW~)OIt˛Lm.vo )-\hI@N` 8P9*a&`':16mn1[vlDU:~[F NkK.F uBotan-1.10.12/checks/nist_tests/tests/test54/int2.crt0000664000175000017500000000123212654331322022101 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.0100  *H 0(mC>/Jɵn̯'A*gPṁ_]k91:wkJQkBA'% !TǁHbd6WIXhWkhXUOjw-c0a0U00U0U 0 0  `He00U 1S"^0U# 0 cᜫ}0  *H 9-88FwfLXcUיâ/u8aY!4 qxO)6ѱQ69w["J Ln57$'IHQzբ ]Y}\h ˒ 2t(R=r⤎gqBotan-1.10.12/checks/nist_tests/tests/test54/root.crl0000664000175000017500000000056312654331322022206 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test54/root.crt0000664000175000017500000000116012654331322022210 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test55/end.crt0000664000175000017500000000123212654331322021774 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.020 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.0200  *H 09yZc#2oެs{ NH49}lGˮx_HvBe [|SbC当qj~rUc?k92;wkmc0a0U00U0U 0 0  `He00U 0VTΧw0U# 0 4 ] @n0  *H ɥM ?{C~ TQz.}vF;af/b R} }/7їi,< :0 lq)-~o٪/hJԃ\li$Yd3R{NQ=g"".( &bi z*aWzr8(Ǥk˷2b*MVZi)@LYr !0v+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test55/root.crt0000664000175000017500000000116012654331322022211 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test56/end.crt0000664000175000017500000000121312654331322021774 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.0300  *H 0}Sh%ޖ" Dd̺EhTp3+EJҒ_Ӆ}[df푢]% c}-2 bS܈u38'Vth#PW%R0P0U0U 0 0  `He00U .+m0U# 0 6'U0  *H >i|zl4 L@but%x\_@ZᦶS2*$C| hhuA̕CI X[)ZkSwxX}kP eHwj- Botan-1.10.12/checks/nist_tests/tests/test56/int.crl0000664000175000017500000000051712654331322022016 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.03 990101120100Z 480101120100Z#0!0 U0U# 0 6'U0  *H Y-u\DXUܮٽ pPH;SS1xA37|E;mv<&󊯿9z3W$AKrsK2=֭b&ɀ=L$ Botan-1.10.12/checks/nist_tests/tests/test56/int.crt0000664000175000017500000000123512654331322022024 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.0300  *H 0LWe4 w~vAx'Y 6G'fN"=Hxۭs=lz@3}LZezܖD^k:dK+mњW@¬C`/ 16Ȫf0d0U00U0U 0 0  `He00U 6'U0U# 0 T0  *H Ql2*#D_.Uu#⦫i< -,]zmOݴM%!Nϗ[UNe{?Ȍ CsK% wcA 6Wڿ qhϞ#~aZOBotan-1.10.12/checks/nist_tests/tests/test56/root.crl0000664000175000017500000000056312654331322022210 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test56/root.crt0000664000175000017500000000116012654331322022212 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test57/end.crt0000664000175000017500000000123212654331322021776 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.0400  *H 0׆sWkcͰκ_n @{ ARD{V. xeKchkݭc)zo&-w ]JoHDk5 .5ĻW-6k5cʻ~>Új#p>>c0a0U00U0U 0 0  `He00U a^_0U# 0 |K9Ԣ0  *H %EW7 LU50jZR əj5geUjoy3F N =9yd"vcҹ.L<>ޣTh#{KyBotan-1.10.12/checks/nist_tests/tests/test57/int.crl0000664000175000017500000000051712654331322022017 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.04 990101120100Z 480101120100Z#0!0 U0U# 0 |K9Ԣ0  *H oWԥTdsԊ6Ke &ce  |ǩu۪;.};~YSkAڕ{ٓA̹}3{SJwv.2Ol]{q17Xv:٫"%W"Botan-1.10.12/checks/nist_tests/tests/test57/int.crt0000664000175000017500000000123512654331322022025 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.0400  *H 0Ӭ oDu8b`Žfݮnr氍;E{/@kof0d0U00U0U 0 0  `He00U |K9Ԣ0U# 0 T0  *H ! Aɟ `e5 ʐnFfDl15\,v9FU993Mٔp^+DFY.t9h{a'4HCLkԒQ~+ cIet;OVR9x%c*Botan-1.10.12/checks/nist_tests/tests/test57/root.crl0000664000175000017500000000056312654331322022211 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test57/root.crt0000664000175000017500000000116012654331322022213 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test58/end.crt0000664000175000017500000000121312654331322021776 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.050 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.0500  *H 0\(g S溱 H)Y^R%o ~d}{}iM c)[!Y|ר9 FPGP~{?Xol,zYKlQ@۸cR6eR0P0U0U 0 0  `He00U o.S=p0U# 0  Ul`0  *H ^v'j8٣8yߥ4_Pܠ܄ZK2by7n^` M0oR1̓"Ѯތ0tBW]}Gt[&Ñw!)yDuWQ].6'Botan-1.10.12/checks/nist_tests/tests/test58/int1.crl0000664000175000017500000000051712654331322022101 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.05 990101120100Z 480101120100Z#0!0 U0U# 0 KB0  *H .9D TL ]FE#_@,*T^t#4a1&\vNR\:! l"Oq)RP=s,62D tW(;d=Botan-1.10.12/checks/nist_tests/tests/test58/int1.crt0000664000175000017500000000123512654331322022107 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.0500  *H 0Afx&ÅDewӗD?}A~rB}0 6]tn~lh[|MjnxhqW&E:}Ba? jGO Ç p"Ik 7۠}Sf0d0U00U0U 0 0  `He00U KB0U# 0 T0  *H 0b1$ivU08s{sMRHH`E28X"_3,vVI]c" __MEefixvA) hIGg@:iG+CI]#nBotan-1.10.12/checks/nist_tests/tests/test58/int2.crl0000664000175000017500000000051712654331322022102 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.05 990101120100Z 480101120100Z#0!0 U0U# 0 ɫ}L0  *H v^<awizAD4>xn7&COJ͙w/[rMh>*7g=spAˏfF e~9 .;Botan-1.10.12/checks/nist_tests/tests/test58/int2.crt0000664000175000017500000000123512654331322022110 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.0500  *H 0*Dht Ulnm^<mtj?LlٝQUfx3>cx]4=dod3T]8yQv@`%f 1d⣄U7`8D*$jAf0d0U00U0U 0 0  `He00U ɫ}L0U# 0 KB0  *H *$^L(zU퉜i 8& Դ'l#%`;@yK/*4B|)M=Ss~,oWA7E˗@#^"h8C7Wִ$9eOʂ 6UBotan-1.10.12/checks/nist_tests/tests/test58/int3.crl0000664000175000017500000000051712654331322022103 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.05 990101120100Z 480101120100Z#0!0 U0U# 0  Ul`0  *H 25F{tձ=]H WHx·[5 AC}hwi΃oX(Z-gq-86Wj#d[Jr=$.[-faP p̅Botan-1.10.12/checks/nist_tests/tests/test58/int3.crt0000664000175000017500000000123512654331322022111 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.0500  *H 0L|.X-2&yrdVm54_lTa4㛮T⤽5K0N, |XFeC _h y#[tgjsTId_б*v\`5'DƓQf0d0U00U0U 0 0  `He00U  Ul`0U# 0 ɫ}L0  *H mweӳ/2x.2/̂}k%;b+`x' Wp @9TR>_9_M74Kug4iS B.D@? tBotan-1.10.12/checks/nist_tests/tests/test58/root.crl0000664000175000017500000000056312654331322022212 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test58/root.crt0000664000175000017500000000116012654331322022214 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test59/end.crt0000664000175000017500000000123212654331322022000 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.0600  *H 0ݫ#^x#?[Om5Gp٫ih| ve7g(lb<[? Ꮛupf&H}k^p*K;83K؉rk9faM\.`"-,yo8jVetFVY?E~ c0a0U00U0U 0 0  `He00U nK50U# 0 `RcBy0  *H c5v DWrI O6hm o\5A|4&] [\aaL-+$WD޻RKU x!8L \\cXb~JZG+S{G h`Botan-1.10.12/checks/nist_tests/tests/test59/int1.crl0000664000175000017500000000051712654331322022102 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.06 990101120100Z 480101120100Z#0!0 U0U# 0 mC^0  *H s5[Cʳ=&,sP7#ԃBWMw|*S1&{${D'=nd7nV@XpD^4^M|&9O#ass˥ζvS`K@|Botan-1.10.12/checks/nist_tests/tests/test59/int1.crt0000664000175000017500000000123512654331322022110 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.0600  *H 0A/'&PAlK_jT!MI63(5 W8gLc tcGO3Ěئ#Ʀl|io'VI^lq@A Oߪáf0d0U00U0U 0 0  `He00U mC^0U# 0 T0  *H oX pJ W -Q._/ho%.my)DÚU1Yb!QeތM kXx0&*[%No}rЫ`0iAS@T'Botan-1.10.12/checks/nist_tests/tests/test59/int2.crl0000664000175000017500000000051712654331322022103 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.06 990101120100Z 480101120100Z#0!0 U0U# 0 MKC0  *H 4[Rsxqub=4kQ蝁)4L0NH3 mQjO$Jhvτ*ˉpRr_2Pj3*Ojm:O~T|ӵ+Botan-1.10.12/checks/nist_tests/tests/test59/int2.crt0000664000175000017500000000123512654331322022111 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.0600  *H 0O1KTH,Z 1A+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test59/root.crt0000664000175000017500000000116012654331322022215 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test60/end.crt0000664000175000017500000000121312654331322021767 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.070 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.0700  *H 0&^"p|2'yP@Tlup 6k7X7>\6:H:Q0 VÐA|>u ppA_+գFfjZnzs0ˋ??ݶxR0P0U0U 0 0  `He00U I~E0U# 0 Dq F0  *H ^|߅9gycUmZ|1šg1 F\GO<;"WCmC,3j\9Q.2VD4% 䯻#U"P.8vBotan-1.10.12/checks/nist_tests/tests/test60/int1.crl0000664000175000017500000000051712654331322022072 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.07 990101120100Z 480101120100Z#0!0 U0U# 0 ~]0  *H &ք#_T# ˠhqͱVI3R|LUKB2I׭p/H3Q`φ?q9#1%s~辙 D<Â$s)Botan-1.10.12/checks/nist_tests/tests/test60/int1.crt0000664000175000017500000000123512654331322022100 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.0700  *H 0yKg{S'c W^M+#d G@),%$ AGqwг$(S [ +˛o է K7+E%8I2lI=s#W"MLC>Vy#Sf0d0U00U0U 0 0  `He00U ~]0U# 0 T0  *H A" Hxey.=g=#nsvߗ{d5Q̓w'k y۱O.j;/ҫ M}m_#.4P0zɻBWMZ[А^?CNBotan-1.10.12/checks/nist_tests/tests/test60/int2.crl0000664000175000017500000000051712654331322022073 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.07 990101120100Z 480101120100Z#0!0 U0U# 0 $|170  *H .%~ZWA`nswys:bY'!xL}I-N-04UpvrB-żԞ@c!=fƨ x8UH~fӫַQG<4?5>=~-/tzBotan-1.10.12/checks/nist_tests/tests/test60/int2.crt0000664000175000017500000000123512654331322022101 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.070 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.0700  *H 0 >G`Gˀfݘ뀾-0R:Fg>9XV d>P _ű4ֱʈ{/S g*J.bѼx]R#oY12;Xo4f0d0U00U0U 0 0  `He00U $|170U# 0 ~]0  *H Jpqy[("MuPҙO ݿ )eOmW+ /y.s}^SqD_iNȠppWq!]$$qV+Bu{O0QBotan-1.10.12/checks/nist_tests/tests/test60/int3.crl0000664000175000017500000000051712654331322022074 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.07 990101120100Z 480101120100Z#0!0 U0U# 0 <&Q̽W0  *H I;#EgT=/6`gJuF&gyAh=Ư|N\<.ᧁ[]lg< !D3// /i.gW} ?>@?ƉJ=Botan-1.10.12/checks/nist_tests/tests/test60/int3.crt0000664000175000017500000000123512654331322022102 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.070 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.0700  *H 0D4'WrD*ΕQ >h=Cq|3h'"knXuCa#~_.x9(3\mɫDpXU)t!T ;= 1+W 3IhY(m f0d0U00U0U 0 0  `He00U <&Q̽W0U# 0 $|170  *H I1ʧ1:U8GezL3 b0pqG a|^\# kU쳁\.?;O\'kr^nb.pPγ{ %I> EdⓞBotan-1.10.12/checks/nist_tests/tests/test60/int4.crl0000664000175000017500000000051712654331322022075 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.07 990101120100Z 480101120100Z#0!0 U0U# 0 Dq F0  *H 2Ot#4b~ >TF&>۰ 1eH "*k_"xurd"-rmmjs3߆19[@%Ik׌ag-Nq?iBotan-1.10.12/checks/nist_tests/tests/test60/int4.crt0000664000175000017500000000123212654331322022100 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.070 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.0700  *H 0cRѳ  QLj[3w0sg"\e!  e[>܇|Սv-\AGkP LXLMՄ'h[et7VMo WDxS/OIGc0a0U00U0U 0 0  `He00U Dq F0U# 0 <&Q̽W0  *H 'nDE4(|F찅J:pz~ȼZobn f;2-Ȼ|MG)굋i2x}Ocv׷{cw:'ޚ Y4t5+ zvkɕ_C8]eBotan-1.10.12/checks/nist_tests/tests/test60/root.crl0000664000175000017500000000056312654331322022203 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test60/root.crt0000664000175000017500000000116012654331322022205 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test61/end.crt0000664000175000017500000000123212654331322021771 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA5-PL.01.0800  *H 0d ܪhD  (ZżV|3wg|hڬHˬ8H XYXԺaoK/9O5 TU;e*eNI!&3vd(Nc0a0U00U0U 0 0  `He00U =M0U# 0 Sv |0  *H m4?Z=о]LJoZi=VG#Ӽyv`9!K@SPs+l~Y}6yMcHa;72[ʝ0j 7)06IP$vf0d0U00U0U 0 0  `He00U c00U# 0 T0  *H }/`&Lͮ8^`H5qh,%"#OJQ5:<};y"B#U .PMV7,(7Pm!Z ǪߺGԌ'%JĐ"9Botan-1.10.12/checks/nist_tests/tests/test61/int2.crl0000664000175000017500000000051712654331322022074 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.08 990101120100Z 480101120100Z#0!0 U0U# 0 X3tdmM0  *H _@1ӋlziiiD2wF"wV{^3`l3eC[YNz˧cա*%15,R;nY-U ["T}f>y`Botan-1.10.12/checks/nist_tests/tests/test61/int2.crt0000664000175000017500000000123512654331322022102 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.0800  *H 0hxL?Zbƹ> ғk%Q3l+-5"7ӻ|6Ѣ{0n5}]q1aތs(ث]L GE&`r y;A| @oW뮑33EdgH8SzfG),vi[\=aBotan-1.10.12/checks/nist_tests/tests/test61/int3.crl0000664000175000017500000000051712654331322022075 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.08 990101120100Z 480101120100Z#0!0 U0U# 0 `aHs0  *H K ~걃* Tw$/&P^qaOxYl毄c9"%kĺ\s6$+{Xチ3 .^'N`F/1@X՜ըC  Botan-1.10.12/checks/nist_tests/tests/test61/int3.crt0000664000175000017500000000123512654331322022103 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.0800  *H 0ű9$!* #d*bm4SqrhONJwqК#9 ^N wa|HyTwodjV?D%vşC(HڴToxqbB$zEPef0d0U00U0U 0 0  `He00U `aHs0U# 0 X3tdmM0  *H ښ%y׷rzg .$`p(qEE!i )хJ-6g3vt4(5/ygNt+-2yv8eA/05)=RDzE}Botan-1.10.12/checks/nist_tests/tests/test61/int4.crl0000664000175000017500000000051712654331322022076 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.08 990101120100Z 480101120100Z#0!0 U0U# 0 Sv |0  *H rSTq; T}@t -|4?mt.YP hA&$|>5)KA>baF&<{ՒJvݓ]Botan-1.10.12/checks/nist_tests/tests/test61/root.crl0000664000175000017500000000056312654331322022204 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test61/root.crt0000664000175000017500000000116012654331322022206 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test62/end.crt0000664000175000017500000000121312654331322021771 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.090 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.0900  *H 0S9jUJpyeU&dUEa;EHG Y&x#vsFu3!A hJqQ%nX"ܤ@7呇kK `87rڻ\|yR0P0U0U 0 0  `He00U Fp0U# 0 w0  *H y;Wuj6t!Ja5axQW7؋#Um_JeFŲDmof?yL$DQٸ3hk)t kБ?h8q$O&cldַxKLͪBotan-1.10.12/checks/nist_tests/tests/test62/int1.crl0000664000175000017500000000051712654331322022074 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.09 990101120100Z 480101120100Z#0!0 U0U# 0 I à0  *H mw5BvL >fDQk Tr@hby}Q[_τ"KrR-ApUv" *[yY5ʃ,:&G9h30 흤JBotan-1.10.12/checks/nist_tests/tests/test62/int1.crt0000664000175000017500000000123512654331322022102 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.0900  *H 0ew+h+ $$i%=Ƅ665.Nr퐰`NLJ n(’G>]0 c8l>қ쟫[9rkiA'h/X=#ku3t:f0d0U00U0U 0 0  `He00U I à0U# 0 T0  *H vA(ekϟY:~g~i Kd⒠.-J;;HťSbg{*CoW*:lt$] ys%$[ߩJwC o +hRn~\1s.Botan-1.10.12/checks/nist_tests/tests/test62/int2.crl0000664000175000017500000000051712654331322022075 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.09 990101120100Z 480101120100Z#0!0 U0U# 0 G]?e0  *H ^vÉZ}uHg bY>&#" q`C-4|zi0.>41oW lcq=zQ‰B(Idb2r'Botan-1.10.12/checks/nist_tests/tests/test62/int2.crt0000664000175000017500000000123512654331322022103 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.090 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.0900  *H 0K\fNG67A~SvN5<;[I"[6U@]KBk %ۮkddD"avG?~99 2YB5mf0d0U00U0U 0 0  `He00U G]?e0U# 0 I à0  *H 0 0:O;YJftfe8߄$O^_D$wAP&=W`QŷeF`J!$q2Ax&Botan-1.10.12/checks/nist_tests/tests/test62/int3.crl0000664000175000017500000000051712654331322022076 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.09 990101120100Z 480101120100Z#0!0 U0U# 0 o4Ah0  *H hVʿ"x۰fpS4X1Ќ򡬪qyL o\׌Ձ 4Fc^[<M$Ak nUIcUSrIBPen/ PhY> Botan-1.10.12/checks/nist_tests/tests/test62/int3.crt0000664000175000017500000000123512654331322022104 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.090 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.0900  *H 0ηj.g%l/xB_4hﵑ׺@5!*$6n{t__Ulyja&m= fC#oZ׬(V7Rt\`rz϶!f0d0U00U0U 0 0  `He00U o4Ah0U# 0 G]?e0  *H ^ki^ ݽW!{'#Rd/;lV̱L[1| 1sak?ivc{(Q6OLKFf$:T\aTV唬)Vn'Botan-1.10.12/checks/nist_tests/tests/test62/root.crl0000664000175000017500000000056312654331322022205 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test62/root.crt0000664000175000017500000000116012654331322022207 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test63/end.crt0000664000175000017500000000123212654331322021773 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.100 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA5-PL.01.1000  *H 0ݼt,6 ,LX8{TnOO"ժo6P!?M(W/KWVӛ##gTi@@dBaw-@`|Rn5E_ȶ>vBotan-1.10.12/checks/nist_tests/tests/test63/int1.crt0000664000175000017500000000123512654331322022103 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.1000  *H 0R {ώ\=[\05c[44psކNMRP;:%orV6k! 8[|P#p8 Ot%jeٟۤ=Ӗ,[nqU%dDhbr^0U@eТHJwx"Z ^ УꑵnBotan-1.10.12/checks/nist_tests/tests/test63/int3.crt0000664000175000017500000000123512654331322022105 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.100 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.1000  *H 0d/MywTRb}7'h+9KNoG*'*w S6<}h uPV ǶųEyՀ|O$+{;WAfCc0a0U00U0U 0 0  `He00U c8 0U# 0 vӸ H0  *H L|c TqJB 7:Pʻ/G{X چ?8,zRLJa:ό˳:eRt­qYQ9Kzo({ޚhsE$,LwѢBotan-1.10.12/checks/nist_tests/tests/test63/root.crl0000664000175000017500000000056312654331322022206 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test63/root.crt0000664000175000017500000000116012654331322022210 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test64/end.crt0000664000175000017500000000121312654331322021773 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.02.0100  *H 0 ;O4ض-4QDxi _a1ybQ_NJ a n'6`Zu{ 6gxfoU卮ɔRUT/KO];mz7&I(R0P0U0U 0 0  `He00U R$V{50U# 0 eӺ0  *H OfxQױc6'XnBA${3%$H~fa)DSǪiIK2IM{vTƥc wUƘS0fMSj6/4f.˩QHBotan-1.10.12/checks/nist_tests/tests/test64/int.crl0000664000175000017500000000051712654331322022015 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.01 990101120100Z 480101120100Z#0!0 U0U# 0 eӺ0  *H ư̩i oG=N pN)UMv=$94m֤6kn'xv{q7%ý,4)9>< 0O :8a$p ǐ8)v^؍/Botan-1.10.12/checks/nist_tests/tests/test64/int.crt0000664000175000017500000000123212654331322022020 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.0100  *H 0~cqtB[6U\ѻc 覬O&_nv)=p nVt_~2潇>Z*AL^&cuj"\ol#6nmz炁c0a0U00U0U 0 0  `He00U eӺ0U# 0 T0  *H 27sim{Eİ1+ B8ݸ1%pۼ~xey&~N@q`/BoF(d I g{EԦB Uzǵz_1M ;3[\rbBotan-1.10.12/checks/nist_tests/tests/test64/root.crl0000664000175000017500000000056312654331322022207 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test64/root.crt0000664000175000017500000000116012654331322022211 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test65/end.crt0000664000175000017500000000121312654331322021774 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.03.0100  *H 0la=j\xk. FȾ V }Ɍ ]xcHwrكhu~.E\+69-u{AAJzJBQ9dQDj@Ù'Zb9|R0P0U0U 0 0  `He00U g+0U# 0 s't0  *H PnvMʅ) E\ ؠV_ B2_~\,_pݿB~q:@=^ͷx ~bɭ u?ґLfĄZdBotan-1.10.12/checks/nist_tests/tests/test65/int.crl0000664000175000017500000000051712654331322022016 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.03.01 990101120100Z 480101120100Z#0!0 U0U# 0 p#Ũj0  *H  #ZϫNJA<%v7UeaHs՚hbWt\\CD\,rP%7CFs<b@;edLW'Botan-1.10.12/checks/nist_tests/tests/test65/int1.crt0000664000175000017500000000123212654331322022102 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.0100  *H 0w*>Ķ*C!+;5AHP0SuS0; G2L! 6tEU']4/o[p!߷հr֓ɦӋT&ǸϯP=Zr#[㥿6+yGc0a0U00U0U 0 0  `He00U s't0U# 0 T0  *H ;X#|5lpŜj bEj1I.+M١ؖNZ$r\]SL۫fq--At,3k97M2ʏ'k]GGGp8;EoO$ѡsg%Botan-1.10.12/checks/nist_tests/tests/test65/int2.crt0000664000175000017500000000123212654331322022103 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.03.0100  *H 0T]|c{>\-PS VCc4^U^#5 ҽ0y_WzD9E 5/ HhsITe@/D@G#/9/n+]/'9kc0a0U00U0U 0 0  `He00U p#Ũj0U# 0 T0  *H Fby۳(s냿(JX tkApk^)C5GBН**`1&OUUl>w,, OoiXdtun.Botan-1.10.12/checks/nist_tests/tests/test65/root.crl0000664000175000017500000000056312654331322022210 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test65/root.crt0000664000175000017500000000116012654331322022212 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test66/end.crt0000664000175000017500000000121312654331322021775 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.03.0200  *H 0o= ϶m`7 \YYxn}xTċ^r͊W}GqK&t!b:[!\'0O+! {읳:la'&Y6 31[ddLj`" ˥{C/=v z=LvWPAN8屔RBotan-1.10.12/checks/nist_tests/tests/test66/int.crl0000664000175000017500000000056412654331322022021 0ustar jackjack000000000000000p00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.01 990101120100Z 480101120100Z0#0! 990101120000Z0 0 U #0!0 U0U# 0 BPf00  *H x:\6ЬL35sخ*԰#պNP/;Q۪ū?_e^% T9iw$GXpqⶵwAM˝jqt'1sBotan-1.10.12/checks/nist_tests/tests/test66/int.crt0000664000175000017500000000123212654331322022022 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.0200  *H 0sbs_L~;Yd k%ȫCA>!τQ\ܻ kÇ5'w/H}IYՋ kgg)9ACH ۂ zz@711^c0a0U00U0U 0 0  `He00U BPf00U# 0 T0  *H qɀW882 [uGcJ!~-Z4v;0kqV1jY D,WK9,,*~n;B jGJڵB"RĉTz,MSeBotan-1.10.12/checks/nist_tests/tests/test66/root.crl0000664000175000017500000000056312654331322022211 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test66/root.crt0000664000175000017500000000116012654331322022213 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test67/end.crt0000664000175000017500000000121312654331322021776 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.03.0300  *H 0,@f^lUҼ4?übyJ cηj4~S,]nDNYF=\ )sH6cOzE{K9Vome6&$ .;R0P0U0U 0 0  `He00U ŝvȾlJ0U# 0 v-tI0  *H  ZL" tXMJ9/)0Ӫ>aPz$5J|ySi4/\n5W^y̌¯ ,&`q Yp1gjK_fIm̗/,?Botan-1.10.12/checks/nist_tests/tests/test67/int.crt0000664000175000017500000000123212654331322022023 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.0300  *H 04  mNVi T"H,|^N L]y-ץ&FD֚Zeb^rZtCR<^lz~G1- ՔbPܦ]·,GLܓOac0a0U00U0U 0 0  `He00U v-tI0U# 0 T0  *H s *`G`&*d5 u(T)sA| iiwPQ*82ca8˴m6,.(Bbב<:q]O^Ǝ $Botan-1.10.12/checks/nist_tests/tests/test67/int1.crl0000664000175000017500000000056412654331322022103 0ustar jackjack000000000000000p00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.01 990101120100Z 480101120100Z0#0! 990101120000Z0 0 U #0!0 U0U# 0 v-tI0  *H DZvAU 5!̬F^D"Px=kQVAO!̒eY%%Ioꊮ'qhi41 eBi<^Go^*H#Ds'lȫ-'{Y`SBotan-1.10.12/checks/nist_tests/tests/test67/int2.crl0000664000175000017500000000051712654331322022102 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.03 990101120100Z 480101120100Z#0!0 U0U# 0 v-tI0  *H ]+NO/YFhP"LQ_B"a"x8EO%u5sR[w1ߢWÚFxPfacu7|ȌkZF_,\ʱ>L2ت?t$vBotan-1.10.12/checks/nist_tests/tests/test67/root.crl0000664000175000017500000000056312654331322022212 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test67/root.crt0000664000175000017500000000116012654331322022214 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test68/end.crt0000664000175000017500000000121312654331322021777 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.05.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.05.0100  *H 05ihG9åd  9Zҕ22ӷ1ڼML%օ]tNhR8NJ$Ēm wDGp̱݅&U+J 5 h{K4lَkZrCkR0P0U0U 0 0  `He00U cO9wB.w0U# 0 WR0  *H D=P5+Zfv(ǽ184"!)sP%ሙ<5˧͵Okܗ 琒xyN2yꀂ!!1 jRd&R6INlSBotan-1.10.12/checks/nist_tests/tests/test68/int1.crl0000664000175000017500000000061112654331322022075 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.05.01 990101120100Z 480101120100Z0806 990101120000Z0!0 U 0 `He #0!0 U0U# 0 y Ƽ0  *H NhB.zcu|GHAL}_-|Kդ)^"Yx_@j#7% w6L?xM->]0? DքaX7U3óKbILڅ 3B: (Lz+DV*&QDRoc0a0U00U0U 0 0  `He00U y Ƽ0U# 0 T0  *H ^Dwg|B!Ϥ@3#i%8( UR@l=!_kBzϘ2rZe]=LqSQ}?8?eB\F:{hR \_L YLI 2P!Botan-1.10.12/checks/nist_tests/tests/test68/int2.crt0000664000175000017500000000123212654331322022106 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.05.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.05.0100  *H 0^!_C> SLj: ؔ-~-8!Ͳ;f3uRx`0XpEץ";%'9ΜsfiO)SZ>ZNp(xCo+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test68/root.crt0000664000175000017500000000116012654331322022215 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test69/end.crt0000664000175000017500000000121312654331322022000 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.05.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.05.0200  *H 0XMZَN3E(Qk* l/b+,OK(` p@X\2P7TM# .hmx0vو:_C=މӗ&H%a,3dTe4uf1 R0P0U0U 0 0  `He00U ۸ܕB0U# 0 X0  *H " HEvdf`7:3ZT%6m`8 5S4jWᅼm9PB %C]M,0|1dG ͤ9"2M! Botan-1.10.12/checks/nist_tests/tests/test69/int.crl0000664000175000017500000000061112654331322022015 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.05.02 990101120100Z 480101120100Z0806 990101120000Z0!0 U 0 `He #0!0 U0U# 0 X0  *H S frIWu*&$e!n J:#~'qp7`s/IE;0Nπ菢?#-ǚ^k.UBƲ㘰T\>x#ګnBotan-1.10.12/checks/nist_tests/tests/test69/int.crt0000664000175000017500000000123212654331322022025 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.05.0200  *H 0\;\G^KZ!NCPb\@o썾 $'UQ7f2M7+/庁9sG%۬fʃ[|<G c-_Kc󴶴c0a0U00U0U 0 0  `He00U X0U# 0 T0  *H UYTDn/J=|%-QoQ0m #ת0XbXV\_v'Ҕ2v54j /4ՠEsD?*LyCCu"q.d^c\z}Botan-1.10.12/checks/nist_tests/tests/test69/root.crl0000664000175000017500000000056312654331322022214 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test69/root.crt0000664000175000017500000000116012654331322022216 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test70/end.crt0000664000175000017500000000121312654331322021770 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.06.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.06.0100  *H 0Ts[dTpXxثxi1Hv6FmGMMhC}o^ڦ.F 6K"`[HVdoHOcЋ|4pU<z&A<#EN(iPZa.= 3;8bb(!7UX+'Botan-1.10.12/checks/nist_tests/tests/test70/int1.crl0000664000175000017500000000061112654331322022066 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.06.01 990101120100Z 480101120100Z0#0! 990101120000Z0 0 U 8060 U0 `He 0U# 0 _u"X0  *H ź Uk|e~Fp uGd3G욣2 0<Ҥۊxxň&/gʝgub'|"«2x6 d2E@+XҬDGcKkMM2Rqk'?Botan-1.10.12/checks/nist_tests/tests/test70/int1.crt0000664000175000017500000000123212654331322022076 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.06.0100  *H 0k-f8^:d]W/(,ᓚ5!jͨ^uD#VJ{4 C|W QqAE-Ybz[Ib,hmBotan-1.10.12/checks/nist_tests/tests/test70/int2.crt0000664000175000017500000000123212654331322022077 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.06.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.06.0100  *H 0؂[dEwp.3\#|;6|d$_ZiY(/,G迻BprT(3}9uOR:tɐ!Tr\5[\]`C|оOY17c0a0U00U0U 0 0  `He00U ۻh0U# 0 _u"X0  *H 1PѮ(AےI5 ܢܥ׹\l6c6;љO08ΈϗbDA43<.F?.azYev$f"}]@#QF/H;jwٻBotan-1.10.12/checks/nist_tests/tests/test70/root.crl0000664000175000017500000000056312654331322022204 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test70/root.crt0000664000175000017500000000116012654331322022206 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test71/end.crt0000664000175000017500000000121312654331322021771 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.06.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.06.0200  *H 0S<+4>~=KL 5#z7f`XzG5\5[F'wKy-T+XAT~WT(Ä?kek.5e4=7(R0P0U0U 0 0  `He00U j/V0U# 0 SZ2+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test71/root.crt0000664000175000017500000000116012654331322022207 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test72/end.crt0000664000175000017500000000121312654331322021772 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.07.0100  *H 0^BEP@3p{kf`¤ZEyw{ $(Ȗ^F#p4``mW t lE O,â#O7ܼ3ꤳLZ{N?! R0P0U0U 0 0  `He00U aQΫE\0U# 0 sđ,k0  *H YMTvɊ01~+YgaRu[n V< 75~!--]AP(2@z]}~0u3=&&('L[)+T0qd|!LBotan-1.10.12/checks/nist_tests/tests/test72/int.crl0000664000175000017500000000051712654331322022014 0ustar jackjack000000000000000K00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.01 980101060100Z 980101120100Z#0!0 U0U# 0 sđ,k0  *H ;&k[Q諷`B9[䜑ʳZKgG/6mw4j' SqRyn([:c+87_<\3[mj#/G7O@N>;Ea.[z!tBotan-1.10.12/checks/nist_tests/tests/test72/int.crt0000664000175000017500000000123212654331322022017 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.0100  *H 01I I %d'a}V{3 v{TL em] r(ݙN"(3t D+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test72/root.crt0000664000175000017500000000116012654331322022210 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test73/end.crt0000664000175000017500000000121312654331322021773 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.07.0200  *H 0b oH/JTd1[J{$ Ÿ;/ޱS7~`2sN q0 jN+So a\,*b!g16}lqKGS\s$"i#7C6#_ER0P0U0U 0 0  `He00U W-0U# 0 !)0  *H p)Aܹ5e$ЗP[Ws;ډJvPSaw/@;)3U_ݜQjj)-4 B®NO5Jq?/1IUZ ʜX}7rBotan-1.10.12/checks/nist_tests/tests/test73/int.crt0000664000175000017500000000123212654331322022020 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 500101060030Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.0200  *H 0+ĝ>Y9:ΕѴ )!2Qf.͋&6}N C_83g] P^JYī=;23 911)VB]D9"snIn:͝c0a0U00U0U 0 0  `He00U !)0U# 0 T0  *H >g ߬φETd8o~. 3,`ngM%iBp5ťHyGz}w /m KtT 2Oȕjo1KS,4'ȕ_G-3Botan-1.10.12/checks/nist_tests/tests/test73/root.crl0000664000175000017500000000056312654331322022207 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test73/root.crt0000664000175000017500000000116012654331322022211 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test74/end.crt0000664000175000017500000000121312654331322021774 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.07.0300  *H 0gۋiXV>idt=AYbY5}']Wty{a!F/8R= p&ACwIHdʕ15/<6d37@xI1>)BR0P0U0U 0 0  `He00U ` =0U# 0 \%zaR0  *H  tkqD ì3K]`:A.A*T ֐s0DٱXO BpsL\:8OxBvwضWR5g!h>`WIH5`,KdA }Botan-1.10.12/checks/nist_tests/tests/test74/int.crl0000664000175000017500000000052112654331322022011 0ustar jackjack000000000000000M00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.03 990101060100Z20500101120100Z#0!0 U0U# 0 \%zaR0  *H 3 |?^SdPL8CwU]yBotan-1.10.12/checks/nist_tests/tests/test74/int.crt0000664000175000017500000000123212654331322022021 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.0300  *H 0 ƍ] U3k: 9#4h`Äwa\3tؒbIGk.ld- *17̒Х}ۡxPoaoXA'$|3I\k2hR8iCc0a0U00U0U 0 0  `He00U \%zaR0U# 0 T0  *H D`aQ9V@xn)f #(W-->.Yi?ɮ$$t$bMϒ<\ j]'8ljÍJ+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test74/root.crt0000664000175000017500000000116012654331322022212 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test75/end.crt0000664000175000017500000000121312654331322021775 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.08.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.08.0100  *H 0ʖ27F 3H7%./)s )EZdr $>\Sѐ6+ߋYPD䰺eF}肝j;Ȏݱi G|0cMlZ@^ʔCމR0P0U0U 0 0  `He00U cP0U# 0 0{ϡ" 0  *H ;y̳1TUkS7I/cO;slռI:{:!,up#T"!_34Uh36 l+Q'(TU/TN|nzJXSnt_KBotan-1.10.12/checks/nist_tests/tests/test75/int.crl0000664000175000017500000000053612654331322022020 0ustar jackjack000000000000000Z00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.08.01 990101120100Z 480101120100Z2000 U0 U0U# 0 0{ϡ" 0  *H 1tDmu d`.rFV/ҕntzIUxb\qqQpoEI"+ s|W m˂D3ϲLxHJ4MizrBotan-1.10.12/checks/nist_tests/tests/test75/int.crt0000664000175000017500000000123212654331322022022 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.08.0100  *H 0fLIw Twut _L`7o]n+ih@T39A}r֥%wQX߽`! (MĹ]R Xbh(ZKEW836vwbVDx>|c0a0U00U0U 0 0  `He00U 0{ϡ" 0U# 0 T0  *H #ͮZek knIY\aSɣn}@W5ޡsQ9DDk֥jՓef I+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test75/root.crt0000664000175000017500000000116012654331322022213 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/tests/test76/end.crt0000664000175000017500000000121312654331322021776 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.09.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.09.0100  *H 0OU |~?$3h v;V~|k^I 89Qzs,N0MvuY⭊ni#"Rs>)q@稭5gh%4f6XܼzxwR0P0U0U 0 0  `He00U Ԙ'%0U# 0 0@S0  *H 91nY{f[ k(83ncBT>H-rE?}VIfА.JB$8/؂2fN30;[+$N}u=4$V?~tBotan-1.10.12/checks/nist_tests/tests/test76/int.crl0000664000175000017500000000054012654331322022014 0ustar jackjack000000000000000\00  *H 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.09.01 990101120100Z 480101120100Z4020 U0U00U# 0 0@S0  *H  Mv SHuJ ?\tgeu; Vrþ(B]DNl`t$397"(վ~Aب;/Z)%1:X޳Fl~Ҳsݥ3Botan-1.10.12/checks/nist_tests/tests/test76/int.crt0000664000175000017500000000123212654331322022023 0ustar jackjack00000000000000000  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.09.0100  *H 0/._0V/;ƻ81",Ux IĞ C.GifF<C]㼱e*8:$I?]Z"^Q\bs.N@D:3'Ez*]dp~Iu3@ XWYRz7[Ωe)DH`i7_F2 jz 3 Botan-1.10.12/checks/nist_tests/tests/test76/root.crl0000664000175000017500000000056312654331322022212 0ustar jackjack000000000000000o00  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U #0!0 U0U# 0 T0  *H  jg%B_q ޶Gȹ;j~GjYEܳ8(.ZOrX@Z?yǸ{Sp mx>+2l;rm#xF@- Botan-1.10.12/checks/nist_tests/tests/test76/root.crt0000664000175000017500000000116012654331322022214 0ustar jackjack000000000000000l0ՠ0  *H 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor00  *H 03?'A\yҕڣX >NV>!-P.zӸ_WW4ԽM| Nca>=*7<9Hx$F3F7 Cx*+G8060U T0 U00U# 0 T0  *H VaOdÅYJh;!Y.hcmUԠL7&aF8\jGrVxcp&9 b_,=:6>Ru'cNغeZEBotan-1.10.12/checks/nist_tests/x509test.cpp0000664000175000017500000002657512654331322020353 0ustar jackjack00000000000000/* Code to run the X.509v3 processing tests described in "Conformance Testing of Relying Party Client Certificate Path Proccessing Logic", which is available on NIST's web site. */ #include #include using namespace Botan; #include #include #include #include #include #include #include #include std::vector dir_listing(const std::string&); void run_one_test(u32bit, X509_Code, std::string, std::string, std::vector, std::vector); std::map expected_results; u32bit unexp_failure, unexp_success, wrong_error, skipped; void populate_expected_results(); int main() { const std::string root_test_dir = "tests/"; unexp_failure = unexp_success = wrong_error = skipped = 0; try { LibraryInitializer init; populate_expected_results(); std::vector test_dirs = dir_listing(root_test_dir); std::sort(test_dirs.begin(), test_dirs.end()); for(size_t j = 0; j != test_dirs.size(); j++) { const std::string test_dir = root_test_dir + test_dirs[j] + "/"; std::vector all_files = dir_listing(test_dir); std::vector certs, crls; std::string root_cert, to_verify; for(size_t k = 0; k != all_files.size(); k++) { const std::string current = all_files[k]; if(current.find("int") != std::string::npos && current.find(".crt") != std::string::npos) certs.push_back(test_dir + current); else if(current.find("root.crt") != std::string::npos) root_cert = test_dir + current; else if(current.find("end.crt") != std::string::npos) to_verify = test_dir + current; else if(current.find(".crl") != std::string::npos) crls.push_back(test_dir + current); } if(expected_results.find(j+1) == expected_results.end()) { #if 0 std::cout << "Testing disabled for test #" << j+1 << " " << std::endl; #endif skipped++; continue; } run_one_test(j+1, expected_results[j+1], root_cert, to_verify, certs, crls); } } catch(std::exception& e) { std::cout << e.what() << std::endl; return 1; } std::cout << "Total unexpected failures: " << unexp_failure << std::endl; std::cout << "Total unexpected successes: " << unexp_success << std::endl; std::cout << "Total incorrect failures: " << wrong_error << std::endl; std::cout << "Tests skipped: " << skipped << std::endl; return 0; } void run_one_test(u32bit test_no, X509_Code expected, std::string root_cert, std::string to_verify, std::vector certs, std::vector crls) { std::cout << "Processing test #" << test_no << "... "; std::cout.flush(); X509_Code result = VERIFIED; X509_Store store; store.add_cert(X509_Certificate(root_cert), true); X509_Certificate end_user(to_verify); for(size_t j = 0; j != certs.size(); j++) store.add_cert(X509_Certificate(certs[j])); for(size_t j = 0; j != crls.size(); j++) { DataSource_Stream in(crls[j]); X509_CRL crl(in); /* std::vector crl_entries = crl.get_revoked(); for(u32bit k = 0; k != crl_entries.size(); k++) { std::cout << "Revoked: " << std::flush; for(u32bit l = 0; l != crl_entries[k].serial.size(); l++) printf("%02X", crl_entries[k].serial[l]); std::cout << std::endl; } */ result = store.add_crl(crl); if(result != VERIFIED) break; } /* if everything has gone well up until now */ if(result == VERIFIED) { result = store.validate_cert(end_user); X509_Code result2 = store.validate_cert(end_user); if(result != result2) std::cout << "Two runs, two answers: " << result << " " << result2 << std::endl; } if(result == expected) { std::cout << "passed" << std::endl; return; } if(expected == VERIFIED) { std::cout << "unexpected failure: " << result << std::endl; unexp_failure++; } else if(result == VERIFIED) { std::cout << "unexpected success: " << expected << std::endl; unexp_success++; } else { std::cout << "wrong error: " << result << "/" << expected << std::endl; wrong_error++; } } std::vector dir_listing(const std::string& dir_name) { DIR* dir = opendir(dir_name.c_str()); if(!dir) { std::cout << "Error, couldn't open dir " << dir_name << std::endl; std::exit(1); } std::vector listing; while(true) { struct dirent* dir_ent = readdir(dir); if(dir_ent == 0) break; const std::string entry = dir_ent->d_name; if(entry == "." || entry == "..") continue; listing.push_back(entry); } closedir(dir); return listing; } /* The expected results are essentially the error codes that best coorespond to the problem described in the testing documentation. There are a few cases where the tests say there should or should not be an error, and I disagree. A few of the tests have test results different from what they "should" be: these changes are marked as such, and have comments explaining the problem at hand. */ void populate_expected_results() { /* OK, not a super great way of doing this... */ expected_results[1] = VERIFIED; expected_results[2] = SIGNATURE_ERROR; expected_results[3] = SIGNATURE_ERROR; expected_results[4] = VERIFIED; expected_results[5] = CERT_NOT_YET_VALID; expected_results[6] = CERT_NOT_YET_VALID; expected_results[7] = VERIFIED; expected_results[8] = CERT_NOT_YET_VALID; expected_results[9] = CERT_HAS_EXPIRED; expected_results[10] = CERT_HAS_EXPIRED; expected_results[11] = CERT_HAS_EXPIRED; expected_results[12] = VERIFIED; expected_results[13] = CERT_ISSUER_NOT_FOUND; // FIXME: we get the answer right for the wrong reason // ummm... I don't know if that is still true. I wish I had thought to // write down exactly what this 'wrong reason' was in the first place. expected_results[14] = CERT_ISSUER_NOT_FOUND; expected_results[15] = VERIFIED; expected_results[16] = VERIFIED; expected_results[17] = VERIFIED; expected_results[18] = VERIFIED; /************* CHANGE OF TEST RESULT FOR TEST #19 ************************ One of the certificates has no attached CRL. By strict X.509 rules, if there is no good CRL in hand, then the certificate shouldn't be used for CA stuff. But while this is usually a good idea, it interferes with simple uses of certificates which shouldn't (IMO) force the use of CRLs. There is no assigned error code for this scenario because I don't consider it to be an error (probably would be something like NO_REVOCATION_DATA_AVAILABLE) **************************************************************************/ expected_results[19] = VERIFIED; expected_results[20] = CERT_IS_REVOKED; expected_results[21] = CERT_IS_REVOKED; expected_results[22] = CA_CERT_NOT_FOR_CERT_ISSUER; expected_results[23] = CA_CERT_NOT_FOR_CERT_ISSUER; expected_results[24] = VERIFIED; expected_results[25] = CA_CERT_NOT_FOR_CERT_ISSUER; expected_results[26] = VERIFIED; expected_results[27] = VERIFIED; expected_results[28] = CA_CERT_NOT_FOR_CERT_ISSUER; expected_results[29] = CA_CERT_NOT_FOR_CERT_ISSUER; expected_results[30] = VERIFIED; expected_results[31] = CA_CERT_NOT_FOR_CRL_ISSUER; expected_results[32] = CA_CERT_NOT_FOR_CRL_ISSUER; expected_results[33] = VERIFIED; /* Policy tests: a little trickier because there are other inputs which affect the result. In the case of the tests currently in the suite, the default method (with acceptable policy being "any-policy" and with no explict policy required), will almost always result in a verified status. This is not particularly helpful. So, we should do several different tests for each test set: 1) With the user policy as any-policy and no explicit policy 2) With the user policy as any-policy and an explicit policy required 3) With the user policy as test-policy-1 (2.16.840.1.101.3.1.48.1) and an explict policy required 4) With the user policy as either test-policy-1 or test-policy-2 and an explicit policy required This provides reasonably good coverage of the possible outcomes. */ expected_results[34] = VERIFIED; expected_results[35] = VERIFIED; expected_results[36] = VERIFIED; expected_results[37] = VERIFIED; expected_results[38] = VERIFIED; expected_results[39] = VERIFIED; expected_results[40] = VERIFIED; expected_results[41] = VERIFIED; expected_results[42] = VERIFIED; expected_results[43] = VERIFIED; expected_results[44] = VERIFIED; //expected_results[45] = EXPLICT_POLICY_REQUIRED; //expected_results[46] = ACCEPT; //expected_results[47] = EXPLICT_POLICY_REQUIRED; expected_results[48] = VERIFIED; expected_results[49] = VERIFIED; expected_results[50] = VERIFIED; expected_results[51] = VERIFIED; expected_results[52] = VERIFIED; expected_results[53] = VERIFIED; expected_results[54] = CERT_CHAIN_TOO_LONG; expected_results[55] = CERT_CHAIN_TOO_LONG; expected_results[56] = VERIFIED; expected_results[57] = VERIFIED; expected_results[58] = CERT_CHAIN_TOO_LONG; expected_results[59] = CERT_CHAIN_TOO_LONG; expected_results[60] = CERT_CHAIN_TOO_LONG; expected_results[61] = CERT_CHAIN_TOO_LONG; expected_results[62] = VERIFIED; expected_results[63] = VERIFIED; expected_results[64] = SIGNATURE_ERROR; /************ CHANGE OF TEST RESULT FOR TEST #65 ************************* I cannot figure out what exactly the problem here is supposed to be; looking at it by hand, everything seems fine. If someone can explain I would be happy to listen. ************************************************************************/ expected_results[65] = VERIFIED; expected_results[66] = CRL_ISSUER_NOT_FOUND; /************ CHANGE OF TEST RESULT FOR TEST #67 ************************* The test docs say this should be verified. However, the problem being that there is an extra CRL with an unknown issuer. Returning VERIFIED in this case is obviously bad, since the user may well want to know that the CRL in question has no known issuer. So we return CRL_ISSUER_NOT_FOUND instead of VERIFIED. The actual certificate path of course still verifies, but it's kind of an all-or-nothing testing procedure. ************************************************************************/ expected_results[67] = CRL_ISSUER_NOT_FOUND; expected_results[68] = CERT_IS_REVOKED; expected_results[69] = CERT_IS_REVOKED; expected_results[70] = CERT_IS_REVOKED; expected_results[71] = CERT_IS_REVOKED; expected_results[72] = CRL_HAS_EXPIRED; expected_results[73] = CRL_HAS_EXPIRED; expected_results[74] = VERIFIED; /* These tests use weird CRL extensions which aren't supported yet */ //expected_results[75] = ; //expected_results[76] = ; } Botan-1.10.12/checks/pk.cpp0000664000175000017500000006465512654331322015162 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) #include #include #include #endif #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) #include #endif #if defined(BOTAN_HAS_RW) #include #endif #if defined(BOTAN_HAS_ELGAMAL) #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif #if defined(BOTAN_HAS_ECDH) #include #endif #if defined(BOTAN_HAS_GOST_34_10_2001) #include #endif #if defined(BOTAN_HAS_DLIES) #include #include #endif #include #include using namespace Botan; #include "common.h" #include "validate.h" namespace { BigInt to_bigint(std::string input) { while(input.find(' ') != std::string::npos) input = input.erase(input.find(' '), 1); while(input.find('\t') != std::string::npos) input = input.erase(input.find('\t'), 1); while(input.find('\n') != std::string::npos) input = input.erase(input.find('\n'), 1); return BigInt::decode(reinterpret_cast(input.data()), input.length(), BigInt::Hexadecimal); } void dump_data(const SecureVector& out, const SecureVector& expected) { Pipe pipe(new Hex_Encoder); pipe.process_msg(out); pipe.process_msg(expected); std::cout << "Got: " << pipe.read_all_as_string(0) << std::endl; std::cout << "Exp: " << pipe.read_all_as_string(1) << std::endl; } void validate_save_and_load(const Private_Key* priv_key, RandomNumberGenerator& rng) { std::string name = priv_key->algo_name(); std::string pub_pem = X509::PEM_encode(*priv_key); try { DataSource_Memory input_pub(pub_pem); std::auto_ptr restored_pub(X509::load_key(input_pub)); if(restored_pub.get() == 0) std::cout << "Could not recover " << name << " public key\n"; else if(restored_pub->check_key(rng, true) == false) std::cout << "Restored pubkey failed self tests " << name << "\n"; } catch(std::exception& e) { std::cout << "Exception during load of " << name << " key: " << e.what() << "\n"; std::cout << "PEM for pubkey was:\n" << pub_pem << "\n"; } std::string priv_pem = PKCS8::PEM_encode(*priv_key); try { DataSource_Memory input_priv(priv_pem); std::auto_ptr restored_priv( PKCS8::load_key(input_priv, rng)); if(restored_priv.get() == 0) std::cout << "Could not recover " << name << " privlic key\n"; else if(restored_priv->check_key(rng, true) == false) std::cout << "Restored privkey failed self tests " << name << "\n"; } catch(std::exception& e) { std::cout << "Exception during load of " << name << " key: " << e.what() << "\n"; std::cout << "PEM for privkey was:\n" << priv_pem << "\n"; } } void validate_decryption(PK_Decryptor& d, const std::string& algo, const SecureVector ctext, const SecureVector ptext, bool& failure) { SecureVector decrypted = d.decrypt(ctext); if(decrypted != ptext) { std::cout << "FAILED (decrypt): " << algo << std::endl; dump_data(decrypted, ptext); failure = true; } } void validate_encryption(PK_Encryptor& e, PK_Decryptor& d, const std::string& algo, const std::string& input, const std::string& random, const std::string& exp, bool& failure) { SecureVector message = hex_decode(input); SecureVector expected = hex_decode(exp); Fixed_Output_RNG rng(hex_decode(random)); SecureVector out = e.encrypt(message, rng); if(out != expected) { std::cout << "FAILED (encrypt): " << algo << std::endl; dump_data(out, expected); failure = true; } validate_decryption(d, algo, out, message, failure); } void validate_signature(PK_Verifier& v, PK_Signer& s, const std::string& algo, const std::string& input, RandomNumberGenerator& rng, const std::string& exp, bool& failure) { SecureVector message = hex_decode(input); SecureVector expected = hex_decode(exp); SecureVector sig = s.sign_message(message, rng); if(sig != expected) { std::cout << "FAILED (sign): " << algo << std::endl; dump_data(sig, expected); failure = true; } if(!v.verify_message(message, sig)) { std::cout << "FAILED (verify): " << algo << std::endl; failure = true; } /* This isn't a very thorough testing method, but it will hopefully catch any really horrible errors */ sig[0]++; if(v.verify_message(message, sig)) { std::cout << "FAILED (accepted bad sig): " << algo << std::endl; failure = true; } } void validate_signature(PK_Verifier& v, PK_Signer& s, const std::string& algo, const std::string& input, const std::string& random, const std::string& exp, bool& failure) { Fixed_Output_RNG rng(hex_decode(random)); validate_signature(v, s, algo, input, rng, exp, failure); } void validate_kas(PK_Key_Agreement& kas, const std::string& algo, const SecureVector& pubkey, const std::string& output, u32bit keylen, bool& failure) { SecureVector expected = hex_decode(output); SecureVector got = kas.derive_key(keylen, pubkey).bits_of(); if(got != expected) { std::cout << "FAILED: " << algo << std::endl; dump_data(got, expected); failure = true; } } u32bit validate_rsa_enc_pkcs8(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 4 && str.size() != 5) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_RSA) std::string pass; if(str.size() == 5) pass = str[4]; strip_newlines(pass); /* it will have a newline thanks to the messy decoding method we use */ DataSource_Memory keysource(reinterpret_cast(str[0].c_str()), str[0].length()); std::auto_ptr privkey(PKCS8::load_key(keysource, rng, pass)); RSA_PrivateKey* rsapriv = dynamic_cast(privkey.get()); if(!rsapriv) throw Invalid_Argument("Bad key load for RSA key"); RSA_PublicKey* rsapub = dynamic_cast(rsapriv); std::string eme = algo.substr(12, std::string::npos); PK_Encryptor_EME e(*rsapub, eme); PK_Decryptor_EME d(*rsapriv, eme); bool failure = false; validate_encryption(e, d, algo, str[1], str[2], str[3], failure); return (failure ? 1 : 0); #endif return 2; } u32bit validate_rsa_enc(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 6) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_RSA) RSA_PrivateKey privkey(rng, to_bigint(str[1]), to_bigint(str[2]), to_bigint(str[0])); RSA_PublicKey pubkey = privkey; std::string eme = algo.substr(6, std::string::npos); PK_Encryptor_EME e(pubkey, eme); PK_Decryptor_EME d(privkey, eme); bool failure = false; validate_encryption(e, d, algo, str[3], str[4], str[5], failure); return (failure ? 1 : 0); #endif return 2; } u32bit validate_elg_enc(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 6 && str.size() != 7) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_ELGAMAL) DL_Group domain(to_bigint(str[0]), to_bigint(str[1])); ElGamal_PrivateKey privkey(rng, domain, to_bigint(str[2])); ElGamal_PublicKey pubkey = privkey; std::string eme = algo.substr(8, std::string::npos); PK_Decryptor_EME d(privkey, eme); bool failure = false; if(str.size() == 7) { PK_Encryptor_EME e(pubkey, eme); validate_encryption(e, d, algo, str[4], str[5], str[6], failure); } else validate_decryption(d, algo, hex_decode(str[5]), hex_decode(str[4]), failure); return (failure ? 1 : 0); #endif return 2; } u32bit validate_rsa_sig(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 6) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_RSA) RSA_PrivateKey privkey(rng, to_bigint(str[1]), to_bigint(str[2]), to_bigint(str[0])); RSA_PublicKey pubkey = privkey; std::string emsa = algo.substr(7, std::string::npos); PK_Verifier v(pubkey, emsa); PK_Signer s(privkey, emsa); bool failure = false; validate_signature(v, s, algo, str[3], str[4], str[5], failure); return (failure ? 1 : 0); #endif return 2; } u32bit validate_rsa_ver(const std::string& algo, const std::vector& str) { if(str.size() != 5) /* is actually 4, parse() adds an extra empty one */ throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_RSA) RSA_PublicKey key(to_bigint(str[1]), to_bigint(str[0])); std::string emsa = algo.substr(6, std::string::npos); PK_Verifier v(key, emsa); SecureVector msg = hex_decode(str[2]); SecureVector sig = hex_decode(str[3]); bool passed = true; passed = v.verify_message(msg, sig); return (passed ? 0 : 1); #endif return 2; } u32bit validate_rsa_ver_x509(const std::string& algo, const std::vector& str) { if(str.size() != 5) /* is actually 3, parse() adds extra empty ones */ throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_RSA) DataSource_Memory keysource(reinterpret_cast(str[0].c_str()), str[0].length()); std::auto_ptr key(X509::load_key(keysource)); RSA_PublicKey* rsakey = dynamic_cast(key.get()); if(!rsakey) throw Invalid_Argument("Bad key load for RSA public key"); std::string emsa = algo.substr(11, std::string::npos); PK_Verifier v(*rsakey, emsa); SecureVector msg = hex_decode(str[1]); SecureVector sig = hex_decode(str[2]); bool passed = v.verify_message(msg, sig); return (passed ? 0 : 1); #endif return 2; } u32bit validate_rw_ver(const std::string& algo, const std::vector& str) { if(str.size() != 5) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_RW) RW_PublicKey key(to_bigint(str[1]), to_bigint(str[0])); std::string emsa = algo.substr(5, std::string::npos); PK_Verifier v(key, emsa); SecureVector msg = hex_decode(str[2]); SecureVector sig = hex_decode(str[3]); bool passed = true; passed = v.verify_message(msg, sig); return (passed ? 0 : 1); #endif return 2; } u32bit validate_rw_sig(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 5) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_RW) RW_PrivateKey privkey(rng, to_bigint(str[1]), to_bigint(str[2]), to_bigint(str[0])); RW_PublicKey pubkey = privkey; std::string emsa = algo.substr(3, std::string::npos); PK_Verifier v(pubkey, emsa); PK_Signer s(privkey, emsa); bool failure = false; validate_signature(v, s, algo, str[3], rng, str[4], failure); return (failure ? 1 : 0); #endif return 2; } u32bit validate_dsa_sig(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 4 && str.size() != 5) throw std::runtime_error("Invalid input from pk_valid.dat"); std::string pass; if(str.size() == 5) pass = str[4]; strip_newlines(pass); /* it will have a newline thanks to the messy decoding method we use */ #if defined(BOTAN_HAS_DSA) DataSource_Memory keysource(reinterpret_cast(str[0].c_str()), str[0].length()); std::auto_ptr privkey(PKCS8::load_key(keysource, rng, pass)); DSA_PrivateKey* dsapriv = dynamic_cast(privkey.get()); if(!dsapriv) throw Invalid_Argument("Bad key load for DSA private key"); DSA_PublicKey* dsapub = dynamic_cast(dsapriv); std::string emsa = algo.substr(4, std::string::npos); PK_Verifier v(*dsapub, emsa); PK_Signer s(*dsapriv, emsa); bool failure = false; validate_signature(v, s, algo, str[1], str[2], str[3], failure); return (failure ? 1 : 0); #endif return 2; } u32bit validate_ecdsa_sig(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 5) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_ECDSA) EC_Group group(OIDS::lookup(str[0])); ECDSA_PrivateKey ecdsa(rng, group, to_bigint(str[1])); std::string emsa = algo.substr(6, std::string::npos); PK_Verifier v(ecdsa, emsa); PK_Signer s(ecdsa, emsa); bool failure = false; validate_signature(v, s, algo, str[2], str[3], str[4], failure); return (failure ? 1 : 0); #endif return 2; } u32bit validate_gost_ver(const std::string& algo, const std::vector& str) { if(str.size() != 5) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_GOST_34_10_2001) EC_Group group(OIDS::lookup(str[0])); PointGFp public_point = OS2ECP(hex_decode(str[1]), group.get_curve()); GOST_3410_PublicKey gost(group, public_point); std::string emsa = algo.substr(13, std::string::npos); PK_Verifier v(gost, emsa); SecureVector msg = hex_decode(str[2]); SecureVector sig = hex_decode(str[3]); bool passed = v.verify_message(msg, sig); return (passed ? 0 : 1); #endif return 2; } u32bit validate_dsa_ver(const std::string& algo, const std::vector& str) { if(str.size() != 5) /* is actually 3, parse() adds extra empty ones */ throw std::runtime_error("Invalid input from pk_valid.dat"); DataSource_Memory keysource(reinterpret_cast(str[0].c_str()), str[0].length()); #if defined(BOTAN_HAS_DSA) std::auto_ptr key(X509::load_key(keysource)); DSA_PublicKey* dsakey = dynamic_cast(key.get()); if(!dsakey) throw Invalid_Argument("Bad key load for DSA public key"); std::string emsa = algo.substr(7, std::string::npos); PK_Verifier v(*dsakey, emsa); SecureVector msg = hex_decode(str[1]); SecureVector sig = hex_decode(str[2]); v.set_input_format(DER_SEQUENCE); bool passed = v.verify_message(msg, sig); return (passed ? 0 : 1); #endif return 2; } u32bit validate_nr_sig(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 8) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_NYBERG_RUEPPEL) DL_Group domain(to_bigint(str[0]), to_bigint(str[1]), to_bigint(str[2])); NR_PrivateKey privkey(rng, domain, to_bigint(str[4])); NR_PublicKey pubkey = privkey; std::string emsa = algo.substr(3, std::string::npos); PK_Verifier v(pubkey, emsa); PK_Signer s(privkey, emsa); bool failure = false; validate_signature(v, s, algo, str[5], str[6], str[7], failure); return (failure ? 1 : 0); #endif return 2; } u32bit validate_dh(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 5 && str.size() != 6) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_DIFFIE_HELLMAN) DL_Group domain(to_bigint(str[0]), to_bigint(str[1])); DH_PrivateKey mykey(rng, domain, to_bigint(str[2])); DH_PublicKey otherkey(domain, to_bigint(str[3])); std::string kdf = algo.substr(3, std::string::npos); u32bit keylen = 0; if(str.size() == 6) keylen = to_u32bit(str[5]); PK_Key_Agreement kas(mykey, kdf); bool failure = false; validate_kas(kas, algo, otherkey.public_value(), str[4], keylen, failure); return (failure ? 1 : 0); #endif return 2; } u32bit validate_dlies(const std::string& algo, const std::vector& str, RandomNumberGenerator& rng) { if(str.size() != 6) throw std::runtime_error("Invalid input from pk_valid.dat"); #if defined(BOTAN_HAS_DLIES) DL_Group domain(to_bigint(str[0]), to_bigint(str[1])); DH_PrivateKey from(rng, domain, to_bigint(str[2])); DH_PrivateKey to(rng, domain, to_bigint(str[3])); const std::string opt_str = algo.substr(6, std::string::npos); std::vector options = split_on(opt_str, '/'); if(options.size() != 3) throw std::runtime_error("DLIES needs three options: " + opt_str); MessageAuthenticationCode* mac = get_mac(options[1]); u32bit mac_key_len = to_u32bit(options[2]); DLIES_Encryptor e(from, get_kdf(options[0]), mac, mac_key_len); DLIES_Decryptor d(to, get_kdf(options[0]), mac->clone(), mac_key_len); e.set_other_key(to.public_value()); std::string empty = ""; bool failure = false; validate_encryption(e, d, algo, str[4], empty, str[5], failure); return (failure ? 1 : 0); #else return 2; #endif } void do_pk_keygen_tests(RandomNumberGenerator& rng) { std::cout << "Testing PK key generation: " << std::flush; #define DL_KEY(TYPE, GROUP) \ { \ TYPE key(rng, DL_Group(GROUP)); \ key.check_key(rng, true); \ validate_save_and_load(&key, rng); \ std::cout << '.' << std::flush; \ } #define EC_KEY(TYPE, GROUP) \ { \ TYPE key(rng, EC_Group(OIDS::lookup(GROUP))); \ key.check_key(rng, true); \ validate_save_and_load(&key, rng); \ std::cout << '.' << std::flush; \ } #if defined(BOTAN_HAS_RSA) { RSA_PrivateKey rsa1024(rng, 1024); rsa1024.check_key(rng, true); validate_save_and_load(&rsa1024, rng); std::cout << '.' << std::flush; } #endif #if defined(BOTAN_HAS_RW) { RW_PrivateKey rw1024(rng, 1024); rw1024.check_key(rng, true); validate_save_and_load(&rw1024, rng); std::cout << '.' << std::flush; } #endif #if defined(BOTAN_HAS_DSA) DL_KEY(DSA_PrivateKey, "dsa/jce/512"); DL_KEY(DSA_PrivateKey, "dsa/jce/768"); DL_KEY(DSA_PrivateKey, "dsa/jce/1024"); DL_KEY(DSA_PrivateKey, "dsa/botan/2048"); DL_KEY(DSA_PrivateKey, "dsa/botan/3072"); #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) DL_KEY(DH_PrivateKey, "modp/ietf/768"); DL_KEY(DH_PrivateKey, "modp/ietf/1024"); DL_KEY(DH_PrivateKey, "modp/ietf/2048"); DL_KEY(DH_PrivateKey, "modp/ietf/4096"); DL_KEY(DH_PrivateKey, "dsa/jce/1024"); #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) DL_KEY(NR_PrivateKey, "dsa/jce/512"); DL_KEY(NR_PrivateKey, "dsa/jce/768"); DL_KEY(NR_PrivateKey, "dsa/jce/1024"); DL_KEY(NR_PrivateKey, "dsa/botan/2048"); DL_KEY(NR_PrivateKey, "dsa/botan/3072"); #endif #if defined(BOTAN_HAS_ELGAMAL) DL_KEY(ElGamal_PrivateKey, "modp/ietf/768"); DL_KEY(ElGamal_PrivateKey, "modp/ietf/1024"); DL_KEY(ElGamal_PrivateKey, "dsa/jce/1024"); DL_KEY(ElGamal_PrivateKey, "dsa/botan/2048"); DL_KEY(ElGamal_PrivateKey, "dsa/botan/3072"); #endif #if defined(BOTAN_HAS_ECDSA) EC_KEY(ECDSA_PrivateKey, "secp112r1"); EC_KEY(ECDSA_PrivateKey, "secp128r1"); EC_KEY(ECDSA_PrivateKey, "secp160r1"); EC_KEY(ECDSA_PrivateKey, "secp192r1"); EC_KEY(ECDSA_PrivateKey, "secp224r1"); EC_KEY(ECDSA_PrivateKey, "secp256r1"); EC_KEY(ECDSA_PrivateKey, "secp384r1"); EC_KEY(ECDSA_PrivateKey, "secp521r1"); #endif #if defined(BOTAN_HAS_GOST_34_10_2001) EC_KEY(GOST_3410_PrivateKey, "gost_256A"); EC_KEY(GOST_3410_PrivateKey, "secp112r1"); EC_KEY(GOST_3410_PrivateKey, "secp128r1"); EC_KEY(GOST_3410_PrivateKey, "secp160r1"); EC_KEY(GOST_3410_PrivateKey, "secp192r1"); EC_KEY(GOST_3410_PrivateKey, "secp224r1"); EC_KEY(GOST_3410_PrivateKey, "secp256r1"); EC_KEY(GOST_3410_PrivateKey, "secp384r1"); EC_KEY(GOST_3410_PrivateKey, "secp521r1"); #endif std::cout << std::endl; } } u32bit do_pk_validation_tests(const std::string& filename, RandomNumberGenerator& rng) { std::ifstream test_data(filename.c_str()); if(!test_data) throw Botan::Stream_IO_Error("Couldn't open test file " + filename); u32bit errors = 0, alg_count = 0; std::string algorithm, print_algorithm; while(!test_data.eof()) { if(test_data.bad() || test_data.fail()) throw Botan::Stream_IO_Error("File I/O error reading from " + filename); std::string line; std::getline(test_data, line); strip_comments(line); if(line.size() == 0) continue; // Do line continuation while(line[line.size()-1] == '\\' && !test_data.eof()) { line.replace(line.size()-1, 1, ""); std::string nextline; std::getline(test_data, nextline); strip_comments(nextline); if(nextline.size() == 0) continue; line.push_back('\n'); line += nextline; } if(line[0] == '[' && line[line.size() - 1] == ']') { std::string old_algo = print_algorithm; algorithm = line.substr(1, line.size() - 2); print_algorithm = algorithm; if(print_algorithm.find("_PKCS8") != std::string::npos) print_algorithm.replace(print_algorithm.find("_PKCS8"), 6, ""); if(print_algorithm.find("_X509") != std::string::npos) print_algorithm.replace(print_algorithm.find("_X509"), 5, ""); if(print_algorithm.find("_VA") != std::string::npos) print_algorithm.replace(print_algorithm.find("_VA"), 3, ""); if(old_algo != print_algorithm && old_algo != "") { std::cout << std::endl; alg_count = 0; } if(old_algo != print_algorithm) std::cout << "Testing " << print_algorithm << ": "; continue; } std::vector substr = parse(line); #if 0 std::cout << "Testing: " << print_algorithm << std::endl; #endif u32bit new_errors = 0; try { if(algorithm.find("DSA/") == 0) new_errors = validate_dsa_sig(algorithm, substr, rng); else if(algorithm.find("DSA_VA/") == 0) new_errors = validate_dsa_ver(algorithm, substr); else if(algorithm.find("ECDSA/") == 0) new_errors = validate_ecdsa_sig(algorithm, substr, rng); else if(algorithm.find("GOST_3410_VA/") == 0) new_errors = validate_gost_ver(algorithm, substr); else if(algorithm.find("RSAES_PKCS8/") == 0) new_errors = validate_rsa_enc_pkcs8(algorithm, substr, rng); else if(algorithm.find("RSAVA_X509/") == 0) new_errors = validate_rsa_ver_x509(algorithm, substr); else if(algorithm.find("RSAES/") == 0) new_errors = validate_rsa_enc(algorithm, substr, rng); else if(algorithm.find("RSASSA/") == 0) new_errors = validate_rsa_sig(algorithm, substr, rng); else if(algorithm.find("RSAVA/") == 0) new_errors = validate_rsa_ver(algorithm, substr); else if(algorithm.find("RWVA/") == 0) new_errors = validate_rw_ver(algorithm, substr); else if(algorithm.find("RW/") == 0) new_errors = validate_rw_sig(algorithm, substr, rng); else if(algorithm.find("NR/") == 0) new_errors = validate_nr_sig(algorithm, substr, rng); else if(algorithm.find("ElGamal/") == 0) new_errors = validate_elg_enc(algorithm, substr, rng); else if(algorithm.find("DH/") == 0) new_errors = validate_dh(algorithm, substr, rng); else if(algorithm.find("DLIES/") == 0) new_errors = validate_dlies(algorithm, substr, rng); else std::cout << "WARNING: Unknown PK algorithm " << algorithm << std::endl; if(new_errors == 0) // OK std::cout << '.'; else if(new_errors == 1) // test failed std::cout << 'X'; else if(new_errors == 2) // unknown algo std::cout << '?'; std::cout.flush(); alg_count++; if(new_errors == 1) errors += new_errors; } catch(std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } if(new_errors == 1) std::cout << "ERROR: \"" << algorithm << "\" failed test #" << std::dec << alg_count << std::endl; } std::cout << std::endl; do_ec_tests(rng); errors += do_ecdsa_tests(rng); errors += do_ecdh_tests(rng); do_pk_keygen_tests(rng); return errors; } Botan-1.10.12/checks/pk_bench.cpp0000664000175000017500000005053012654331322016304 0ustar jackjack00000000000000/* * (C) 2009-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) #include #include #include #endif #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) #include #endif #if defined(BOTAN_HAS_RW) #include #endif #if defined(BOTAN_HAS_ELGAMAL) #include #endif #if defined(BOTAN_HAS_DLIES) #include #include #include #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif #if defined(BOTAN_HAS_ECDH) #include #endif #if defined(BOTAN_HAS_GOST_34_10_2001) #include #endif using namespace Botan; #include "common.h" #include "timer.h" #include "bench.h" #include #include #include #include #include #define BENCH_FAULT_PROT DISABLE_FAULT_PROTECTION //#define BENCH_FAULT_PROT ENABLE_FAULT_PROTECTION namespace { const char* ec_domains[] = { "secp160r2", "secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1", 0 }; class Benchmark_Report { public: void report(const std::string& name, Timer timer) { std::cout << name << " " << timer << std::endl; data[name].insert(timer); } private: std::map > data; }; void benchmark_enc_dec(PK_Encryptor& enc, PK_Decryptor& dec, Timer& enc_timer, Timer& dec_timer, RandomNumberGenerator& rng, u32bit runs, double seconds) { SecureVector plaintext, ciphertext; for(u32bit i = 0; i != runs; ++i) { if(enc_timer.seconds() < seconds || ciphertext.size() == 0) { plaintext.resize(enc.maximum_input_size()); // Ensure for Raw, etc, it stays large if((i % 100) == 0) { rng.randomize(&plaintext[0], plaintext.size()); plaintext[0] |= 0x80; } enc_timer.start(); ciphertext = enc.encrypt(plaintext, rng); enc_timer.stop(); } if(dec_timer.seconds() < seconds) { dec_timer.start(); SecureVector plaintext_out = dec.decrypt(ciphertext); dec_timer.stop(); if(plaintext_out != plaintext) { // has never happened... std::cerr << "Contents mismatched on decryption during benchmark!\n"; } } } } void benchmark_sig_ver(PK_Verifier& ver, PK_Signer& sig, Timer& verify_timer, Timer& sig_timer, RandomNumberGenerator& rng, u32bit runs, double seconds) { SecureVector message, signature, sig_random; for(u32bit i = 0; i != runs; ++i) { if(sig_timer.seconds() < seconds || signature.size() == 0) { if((i % 100) == 0) { message.resize(48); rng.randomize(&message[0], message.size()); } sig_timer.start(); signature = sig.sign_message(message, rng); sig_timer.stop(); } if(verify_timer.seconds() < seconds) { verify_timer.start(); const bool verified = ver.verify_message(message, signature); verify_timer.stop(); if(!verified) std::cerr << "Signature verification failure\n"; if((i % 100) == 0) { sig_random = rng.random_vec(signature.size()); verify_timer.start(); const bool verified_bad = ver.verify_message(message, sig_random); verify_timer.stop(); if(verified_bad) std::cerr << "Signature verification failure (bad sig OK)\n"; } } } } /* Between benchmark_rsa_rw + benchmark_dsa_nr: Type of the key Arguments to the constructor (A list of some arbitrary type?) Type of padding */ #if defined(BOTAN_HAS_RSA) void benchmark_rsa(RandomNumberGenerator& rng, double seconds, Benchmark_Report& report) { size_t keylens[] = { 1024, 2048, 4096, 6144, 0 }; for(size_t i = 0; keylens[i]; ++i) { size_t keylen = keylens[i]; //const std::string sig_padding = "EMSA4(SHA-1)"; //const std::string enc_padding = "EME1(SHA-1)"; const std::string sig_padding = "EMSA-PKCS1-v1_5(SHA-1)"; const std::string enc_padding = "EME-PKCS1-v1_5"; Timer keygen_timer("keygen"); Timer verify_timer(sig_padding + " verify"); Timer sig_timer(sig_padding + " signature"); Timer enc_timer(enc_padding + " encrypt"); Timer dec_timer(enc_padding + " decrypt"); try { #if 0 // for profiling PKCS8_PrivateKey* pkcs8_key = PKCS8::load_key("rsa/" + to_string(keylen) + ".pem", rng); RSA_PrivateKey* key_ptr = dynamic_cast(pkcs8_key); RSA_PrivateKey key = *key_ptr; #else keygen_timer.start(); RSA_PrivateKey key(rng, keylen); keygen_timer.stop(); #endif while(verify_timer.seconds() < seconds || sig_timer.seconds() < seconds) { PK_Encryptor_EME enc(key, enc_padding); PK_Decryptor_EME dec(key, enc_padding); benchmark_enc_dec(enc, dec, enc_timer, dec_timer, rng, 10000, seconds); PK_Signer sig(key, sig_padding); PK_Verifier ver(key, sig_padding); benchmark_sig_ver(ver, sig, verify_timer, sig_timer, rng, 10000, seconds); } const std::string rsa_keylen = "RSA-" + to_string(keylen); report.report(rsa_keylen, keygen_timer); report.report(rsa_keylen, verify_timer); report.report(rsa_keylen, sig_timer); report.report(rsa_keylen, enc_timer); report.report(rsa_keylen, dec_timer); } catch(Stream_IO_Error) { } catch(Exception& e) { std::cout << e.what() << "\n"; } } } #endif #if defined(BOTAN_HAS_RW) void benchmark_rw(RandomNumberGenerator& rng, double seconds, Benchmark_Report& report) { const u32bit keylens[] = { 1024, 2048, 4096, 6144, 0 }; for(size_t j = 0; keylens[j]; j++) { u32bit keylen = keylens[j]; std::string padding = "EMSA2(SHA-256)"; Timer keygen_timer("keygen"); Timer verify_timer(padding + " verify"); Timer sig_timer(padding + " signature"); while(verify_timer.seconds() < seconds || sig_timer.seconds() < seconds) { keygen_timer.start(); RW_PrivateKey key(rng, keylen); keygen_timer.stop(); PK_Signer sig(key, padding); PK_Verifier ver(key, padding); benchmark_sig_ver(ver, sig, verify_timer, sig_timer, rng, 10000, seconds); } const std::string nm = "RW-" + to_string(keylen); report.report(nm, keygen_timer); report.report(nm, verify_timer); report.report(nm, sig_timer); } } #endif #if defined(BOTAN_HAS_ECDSA) void benchmark_ecdsa(RandomNumberGenerator& rng, double seconds, Benchmark_Report& report) { for(size_t j = 0; ec_domains[j]; j++) { EC_Group params(ec_domains[j]); const size_t pbits = params.get_curve().get_p().bits(); size_t hashbits = pbits; if(hashbits <= 192) hashbits = 160; if(hashbits == 521) hashbits = 512; const std::string padding = "EMSA1(SHA-" + to_string(hashbits) + ")"; Timer keygen_timer("keygen"); Timer verify_timer(padding + " verify"); Timer sig_timer(padding + " signature"); while(verify_timer.seconds() < seconds || sig_timer.seconds() < seconds) { keygen_timer.start(); ECDSA_PrivateKey key(rng, params); keygen_timer.stop(); PK_Signer sig(key, padding, IEEE_1363, BENCH_FAULT_PROT); PK_Verifier ver(key, padding); benchmark_sig_ver(ver, sig, verify_timer, sig_timer, rng, 1000, seconds); } const std::string nm = "ECDSA-" + to_string(pbits); report.report(nm, keygen_timer); report.report(nm, verify_timer); report.report(nm, sig_timer); } } #endif #if defined(BOTAN_HAS_GOST_34_10_2001) void benchmark_gost_3410(RandomNumberGenerator& rng, double seconds, Benchmark_Report& report) { for(size_t j = 0; ec_domains[j]; j++) { EC_Group params(ec_domains[j]); const size_t pbits = params.get_curve().get_p().bits(); const std::string padding = "EMSA1(GOST-34.11)"; Timer keygen_timer("keygen"); Timer verify_timer(padding + " verify"); Timer sig_timer(padding + " signature"); while(verify_timer.seconds() < seconds || sig_timer.seconds() < seconds) { keygen_timer.start(); GOST_3410_PrivateKey key(rng, params); keygen_timer.stop(); PK_Signer sig(key, padding, IEEE_1363, BENCH_FAULT_PROT); PK_Verifier ver(key, padding); benchmark_sig_ver(ver, sig, verify_timer, sig_timer, rng, 1000, seconds); } const std::string nm = "GOST-34.10-" + to_string(pbits); report.report(nm, keygen_timer); report.report(nm, verify_timer); report.report(nm, sig_timer); } } #endif #if defined(BOTAN_HAS_ECDH) void benchmark_ecdh(RandomNumberGenerator& rng, double seconds, Benchmark_Report& report) { for(size_t j = 0; ec_domains[j]; j++) { EC_Group params(ec_domains[j]); size_t pbits = params.get_curve().get_p().bits(); Timer keygen_timer("keygen"); Timer kex_timer("key exchange"); while(kex_timer.seconds() < seconds) { keygen_timer.start(); ECDH_PrivateKey ecdh1(rng, params); keygen_timer.stop(); keygen_timer.start(); ECDH_PrivateKey ecdh2(rng, params); keygen_timer.stop(); PK_Key_Agreement ka1(ecdh1, "KDF2(SHA-1)"); PK_Key_Agreement ka2(ecdh2, "KDF2(SHA-1)"); SymmetricKey secret1, secret2; for(size_t i = 0; i != 1000; ++i) { if(kex_timer.seconds() > seconds) break; kex_timer.start(); secret1 = ka1.derive_key(32, ecdh2.public_value()); kex_timer.stop(); kex_timer.start(); secret2 = ka2.derive_key(32, ecdh1.public_value()); kex_timer.stop(); if(secret1 != secret2) std::cerr << "ECDH secrets did not match\n"; } } const std::string nm = "ECDH-" + to_string(pbits); report.report(nm, keygen_timer); report.report(nm, kex_timer); } } #endif template void benchmark_dsa_nr(RandomNumberGenerator& rng, double seconds, Benchmark_Report& report) { #if defined(BOTAN_HAS_NYBERG_RUEPPEL) || defined(BOTAN_HAS_DSA) const char* domains[] = { "dsa/jce/1024", "dsa/botan/2048", "dsa/botan/3072", NULL }; std::string algo_name; for(size_t j = 0; domains[j]; j++) { size_t pbits = to_u32bit(split_on(domains[j], '/')[2]); size_t qbits = (pbits <= 1024) ? 160 : 256; const std::string padding = "EMSA1(SHA-" + to_string(qbits) + ")"; Timer keygen_timer("keygen"); Timer verify_timer(padding + " verify"); Timer sig_timer(padding + " signature"); while(verify_timer.seconds() < seconds || sig_timer.seconds() < seconds) { DL_Group group(domains[j]); keygen_timer.start(); PRIV_KEY_TYPE key(rng, group); algo_name = key.algo_name(); keygen_timer.stop(); PK_Signer sig(key, padding, IEEE_1363, BENCH_FAULT_PROT); PK_Verifier ver(key, padding); benchmark_sig_ver(ver, sig, verify_timer, sig_timer, rng, 1000, seconds); } const std::string nm = algo_name + "-" + to_string(pbits); report.report(nm, keygen_timer); report.report(nm, verify_timer); report.report(nm, sig_timer); } #endif } #ifdef BOTAN_HAS_DIFFIE_HELLMAN void benchmark_dh(RandomNumberGenerator& rng, double seconds, Benchmark_Report& report) { const char* domains[] = { "modp/ietf/1024", "modp/ietf/2048", "modp/ietf/3072", "modp/ietf/4096", "modp/ietf/6144", "modp/ietf/8192", NULL }; for(size_t j = 0; domains[j]; j++) { Timer keygen_timer("keygen"); Timer kex_timer("key exchange"); while(kex_timer.seconds() < seconds) { DL_Group group(domains[j]); keygen_timer.start(); DH_PrivateKey dh1(rng, group); keygen_timer.stop(); keygen_timer.start(); DH_PrivateKey dh2(rng, group); keygen_timer.stop(); PK_Key_Agreement ka1(dh1, "KDF2(SHA-1)"); PK_Key_Agreement ka2(dh2, "KDF2(SHA-1)"); SymmetricKey secret1, secret2; for(size_t i = 0; i != 1000; ++i) { if(kex_timer.seconds() > seconds) break; kex_timer.start(); secret1 = ka1.derive_key(32, dh2.public_value()); kex_timer.stop(); kex_timer.start(); secret2 = ka2.derive_key(32, dh1.public_value()); kex_timer.stop(); if(secret1 != secret2) std::cerr << "DH secrets did not match\n"; } } const std::string nm = "DH-" + split_on(domains[j], '/')[2]; report.report(nm, keygen_timer); report.report(nm, kex_timer); } } #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) && defined(BOTAN_HAS_DLIES) void benchmark_dlies(RandomNumberGenerator& rng, double seconds, Benchmark_Report& report) { const char* domains[] = { "modp/ietf/768", "modp/ietf/1024", "modp/ietf/2048", "modp/ietf/3072", "modp/ietf/4096", "modp/ietf/6144", "modp/ietf/8192", NULL }; for(size_t j = 0; domains[j]; j++) { Timer keygen_timer("keygen"); Timer kex_timer("key exchange"); Timer enc_timer("encrypt"); Timer dec_timer("decrypt"); while(enc_timer.seconds() < seconds || dec_timer.seconds() < seconds) { DL_Group group(domains[j]); keygen_timer.start(); DH_PrivateKey dh1_priv(rng, group); keygen_timer.stop(); keygen_timer.start(); DH_PrivateKey dh2_priv(rng, group); keygen_timer.stop(); DH_PublicKey dh2_pub(dh2_priv); DLIES_Encryptor dlies_enc(dh1_priv, new KDF2(new SHA_160), new HMAC(new SHA_160)); dlies_enc.set_other_key(dh2_pub.public_value()); DLIES_Decryptor dlies_dec(dh2_priv, new KDF2(new SHA_160), new HMAC(new SHA_160)); benchmark_enc_dec(dlies_enc, dlies_dec, enc_timer, dec_timer, rng, 1000, seconds); } const std::string nm = "DLIES-" + split_on(domains[j], '/')[2]; report.report(nm, keygen_timer); report.report(nm, enc_timer); report.report(nm, dec_timer); } } #endif #ifdef BOTAN_HAS_ELGAMAL void benchmark_elg(RandomNumberGenerator& rng, double seconds, Benchmark_Report& report) { const char* domains[] = { "modp/ietf/768", "modp/ietf/1024", "modp/ietf/2048", "modp/ietf/3072", "modp/ietf/4096", "modp/ietf/6144", "modp/ietf/8192", NULL }; const std::string algo_name = "ElGamal"; for(size_t j = 0; domains[j]; j++) { size_t pbits = to_u32bit(split_on(domains[j], '/')[2]); const std::string padding = "EME1(SHA-1)"; Timer keygen_timer("keygen"); Timer enc_timer(padding + " encrypt"); Timer dec_timer(padding + " decrypt"); while(enc_timer.seconds() < seconds || dec_timer.seconds() < seconds) { DL_Group group(domains[j]); keygen_timer.start(); ElGamal_PrivateKey key(rng, group); keygen_timer.stop(); PK_Decryptor_EME dec(key, padding); PK_Encryptor_EME enc(key, padding); benchmark_enc_dec(enc, dec, enc_timer, dec_timer, rng, 1000, seconds); } const std::string nm = algo_name + "-" + to_string(pbits); report.report(nm, keygen_timer); report.report(nm, enc_timer); report.report(nm, dec_timer); } } #endif } void bench_pk(RandomNumberGenerator& rng, const std::string& algo, double seconds) { /* There is some strangeness going on here. It looks like algorithms at the end take some kind of penalty. For example, running the RW tests first got a result of: RW-1024: 148.14 ms / private operation but running them last output: RW-1024: 363.54 ms / private operation I think it's from memory fragmentation in the allocators, but I'm not really sure. Need to investigate. Until then, I've basically ordered the tests in order of most important algorithms (RSA, DSA) to least important (NR, RW). This strange behaviour does not seem to occur with DH (?) To get more accurate runs, use --bench-algo (RSA|DSA|DH|ELG|NR); in this case the distortion is less than 5%, which is good enough. We do random keys with the DL schemes, since it's so easy and fast to generate keys for them. For RSA and RW, we load the keys from a file. The RSA keys are stored in a PKCS #8 structure, while RW is stored in a more ad-hoc format (the RW algorithm has no assigned OID that I know of, so there is no way to encode a RW key into a PKCS #8 structure). */ Benchmark_Report report; #if defined(BOTAN_HAS_RSA) if(algo == "All" || algo == "RSA") benchmark_rsa(rng, seconds, report); #endif #if defined(BOTAN_HAS_DSA) if(algo == "All" || algo == "DSA") benchmark_dsa_nr(rng, seconds, report); #endif #if defined(BOTAN_HAS_ECDSA) if(algo == "All" || algo == "ECDSA") benchmark_ecdsa(rng, seconds, report); #endif #if defined(BOTAN_HAS_ECDH) if(algo == "All" || algo == "ECDH") benchmark_ecdh(rng, seconds, report); #endif #if defined(BOTAN_HAS_GOST_34_10_2001) if(algo == "All" || algo == "GOST-34.10") benchmark_gost_3410(rng, seconds, report); #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) if(algo == "All" || algo == "DH") benchmark_dh(rng, seconds, report); #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) && defined(BOTAN_HAS_DLIES) if(algo == "All" || algo == "DLIES") benchmark_dlies(rng, seconds, report); #endif #if defined(BOTAN_HAS_ELGAMAL) if(algo == "All" || algo == "ELG" || algo == "ElGamal") benchmark_elg(rng, seconds, report); #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) if(algo == "All" || algo == "NR") benchmark_dsa_nr(rng, seconds, report); #endif #if defined(BOTAN_HAS_RW) if(algo == "All" || algo == "RW") benchmark_rw(rng, seconds, report); #endif } Botan-1.10.12/checks/pk_valid.dat0000664000175000017500000102060512654331322016313 0ustar jackjack00000000000000# Validation File for Public Key Algorithms # Not as comprehensive as it should be # RSA Format: exponent:p:q:message:nonce:output [RSAES/Raw] # Tests for keys 512,520,...,1016,1024 bits, and random messages 3ED19:\ D987D71CC924C479D30CD88570A626E15F0862A9A138874F7016684216984215:\ C5660F33AB35E41CB10A30D3A58354ADB5CC3243342C22E1A5BCCB79C391A533:\ 098825DEC8B4DAB5765348CEE92C4C6A527A172E4A4311399B0B02914E75822F1789B583180AD\ EADE98C200B7B7670D7B9FBA19946F3D8A7FC8322F80CF67C::\ A54A45C5F534A6C727212802CD4B2A0B9D0069EFE32B1D239D3B13958BC49711E1CA5BB499FBF\ 7402B6006E654C719C5FB7614C7C00699866B38445228EC7663 3ED19:\ C5660F33AB35E41CB10A30D3A58354ADB5CC3243342C22E1A5BCCB79C391A533:\ D987D71CC924C479D30CD88570A626E15F0862A9A138874F7016684216984215:\ 098825DEC8B4DAB5765348CEE92C4C6A527A172E4A4311399B0B02914E75822F1789B583180AD\ EADE98C200B7B7670D7B9FBA19946F3D8A7FC8322F80CF67C::\ A54A45C5F534A6C727212802CD4B2A0B9D0069EFE32B1D239D3B13958BC49711E1CA5BB499FBF\ 7402B6006E654C719C5FB7614C7C00699866B38445228EC7663 1F1DD:\ DA78C89EBDDB277831DC1591C26AAB1C11CE9721DBB3AAFAE8F73178BC2D60055:\ CDA647FE7D18AE11DB26331116DD7F0C22D1E79E524D6886768260156827C6E9D:\ CC11049A69951999393D2F48CF7DD27F99C735BC424E538F60EDB512815F88F17B71C27C875D0\ 5BD3DDE4B1573C61F8C91AE22D50BC2AC32422C87C34F2B8A40::\ 946F392678443684494FA6AEC5A862C2825CB3B27B6FB6EA5E9654A9C18503F41E8D6FD34AF40\ 76B5A703E14287F133E6A2B0222FF812309DEBE733543FCE97792 35AF7:\ B6B91AC270B7F066374A83555D690D67F0122398B3BFE69EE955F385A87C7736DF:\ FF43B5A334ED37C059E693C68B9567C41E7EC17A3BFD922EDF50CC000902846A7D:\ C1BDC66E04769D8D104B4FAC19AA8756FEAB153BF57E3FE305F2A6DA718EA7A140D8C4B5A8FC2\ 05E327DCC13554A378F1D19ACEAF5DB3D06266F90EC4C72ED6B5B::\ 73604C1C3F699A56053A627A46502A67D0B604009F811D2E3A296830F5DE6DB0820EF1288A37A\ 3DD47974D339FD06DDBDCA44C53F3A88765F4532A26DAC97BFF7F3A 1EFB3:\ DB08ED25044A98F91CDCD7A92FC81C376A51FF58329E2D2EC54AE71C25C17B639EF:\ B99DBF6E1FD6D5A2986FBB818B6887AA41BADE5761C333EE98B095E7D551CC70865:\ 6BBB92A591C6A9B612EA82FD766100E7B37D8DE8FACDECE322B20E18D7932B854A5594FA67972\ B13D79AA9D37CDE29386644D9FCA609A7717C55EBF568687015A2E0::\ 50825633A36B199F23931AD09DB38DBC8548AACC6A37F1923ABC6F94CE7256427E98E5A433A7F\ 0FDC6DC8C8519B0DFD94A5A98C8AE80D1B502C0EC3592173DCBBC8E5A 22E79:\ FC0A336E6CA2935826038319B45E921F77E4917D978B3177D162FB0CF75058B6EE2B:\ B8551618F76501F4518336A579117533AB27866B44A4D15A4C0999D919024F1C558D:\ 483E61678CFF7AF78306C5E538D0AE750F1B172BA0BECAF561EF7D9C6369F713AD0FDD7C75F56\ F1D4570B668D45563CE7801BD97C6EBB7C9909A9C454369DEAFB57E97::\ ADE77710A5E9C390151CF6E7226E63692367567D1C02A7E5C1554ABE84E487B48EB18BFA20A8B\ F42180BF0AD5A6E1A6FFC7EC45A4CFCFEEF1E3F3333B85C98101FE8E339 EAF1:\ FFE0213AED2397C0663C26A85DC88DD4C95AA61345C4B68492C3FB1F63B61B1AB1CE3:\ FD1DCC4D3B4B474BF2269DB028091B4A4C8AA244D2F2D9C5F55FE449ECF5D2F2DB491:\ BE889EC220BEBD6F542B5FE8E670453333BBBD438EA2DAB4718E72872189FB74E1D1D677C1D45\ 8D769C82D8CE7FE163E2384DFE458C39FB5E8ABB78E5D5D3454CEF0AA74::\ 4213C1FBF227222B30F20340E345ACD86F90656034F3B318E43D3BC1A46A0FCFFA2E0E6998826\ 97025096D999290CC80801E10F5CB9FC0BC52A2170A16B52B9AEEFF6C5FBD 6B7D:\ CEDD0A94A36B76B858DDC6936C74AD06FFDB4924DB40A67A92E1E04B2D8C40F79C323D:\ B78925E051D7502B08DF6E08CCE50079CD135C4E598A0C4401AE7300580ABC4E8EBE03:\ 98F60C8C957EE09B5AA93A4F1260143AD426B5C4A3704DBF02006766910247D2629F867B50DB7\ 00C4BE6BE97571D00BB201B2B3F3A4D663DF47C0F54BC48556E5EBC34AD82::\ 7CB497661BE76C5DF706EB0C0501946ACDC5F29FAEE801A77F8977663C1428136DCBE39A27146\ 272635C3F793546D1EE26850612D784D57C5F3F3F1C14A2DD58E07B06C2773A 3F5DF:\ CFDB1855F00EF13CE24453CA18C30292853D7E67AFE568F0C03E1AFBB68A0FC957559EF:\ BD6E7EDAC9168F48C0B79E5C8DEBFEE0344AFD7DF63632C9F10084605EA7EA2C37DAAEB:\ F34B51F68AE00AB209B178FA4ABA876F1DCF438016CF7054A4E979B1D239C6FE087E492AD69C4\ 7C5F4574DA5C506AB9CE37E6088FC82BCFA7ECAAEC4C14F2C8C7D9144C351D0::\ 94450AA696DB0715A5EB2B4FBE5A9CD4B1396A6DD8748359947C809061E13122C5266368415EA\ 7D4AB343B7981229CAC73BBE2233B3DF2F706DC26F32AA428377A0172AC58C662 17577:\ C3DFA0C60823C8F5355CA1768BABB4A33C3FFC55CE89FD372F5D9B2B2B49DDD23C669A77:\ EF50ED5CD6B6BF898586F8DAACBCBD5FEE637F56936C2535F4F5E30B35B9F5DD8B8D6D61:\ FE19C87AA946B87FB8CA1C274DAC3D67F5E2D67EF2518BA3C1C6779D42E90FADC96C849065908\ D836E74F5932536C2CA8F6B65ADCA245F78C6D4F3230D50264E804B460D6C50B7::\ 13AF743D2FE2542AE28DB8BC52119F3B563C8D800D88ACCBF66EEDF6C418D9919D21A7B4AEB02\ 882CD8BC201CB66DD81953E27BBC29584148CAD99A4AADB5864B403326A56B19F18 3967B:\ EA749A2B3E172EDD565949DFF7C6D6862CD6C0926221E02E48A4C57169DB99058F1AA0B1F:\ FBCE4C37F70845A76B894DA16FE38ABA97AC9BB41502DDBB3B8A324D49ED6BCFE424AEECF:\ 2C6BD8FEDCB431F2F5C4EC93841BC7C96E5AF33CD0A92C40D552F18F27D1021122F1841402059\ 41BCD9943C17FB14EAB112BD0298BBD73280611DD873EDB7F8431840D01618564F7::\ 06D86CBFCCCD3053F2280DF34E2EE6CFD7C8F9A2C2E1F610918C160BEB3D96C677A44B0F26BF73\ 8AE8A94764ECD03AF8F450761CC58698C2D4D62C8357A97EF09811E5AD7272888398 2B62B:\ B9C09DF3CFC53D3C72EA055D8F4C10E4D477CD657D37F0ABAF4EEA736AC1B2628B00726F0D:\ FE01AC6F0BBE2BA6C593FB96A0C24829183D1D99F5CF39909BEF7B2F0D8859D325689CF93F:\ DEAEE8D8F4D64EB0D88BC82DCBF7883558A44886105BEAAA2E193ED843C956521F155A750BEA3\ 76E179B54465574C75E817B38BC51C2451739DCC8F6A55193076E4654CCED925DFDB4::\ AD285E351DF685D52E53BECFF44B24288C323F1E3ECD960D0773D530A7D4D622473222BA35F50\ 78ECD49D2234FEBE178AC099BCAF0C6D11D6309099BEA61DB86AAC27AFC2452034CCD5D A57D:\ EE13F2AF183D15108C8A537E0FE9B39B3ECAF21B3E29995F121C6C0234FAF590102E90B46BD:\ F369E93A0B0B6F459077A41C4548218D32CB0C2F7E3227EB61E06A2D77D5A638DE0DCAFE987:\ BC46B68B8D7CDA2EE172E33D3D4B0A0C3A6174C69920BDDFF99795F36178BE629970182EFF3D3\ A1D796AB6EEEA3FCCA7AC719436718619D86D8BD6F8F4415464899CCC852E104CC5841B::\ 5F85961809D44F4D5FA6161F1F69DCEEF6B4D9B1EAC9378595A329761480B9658CC5C5A2E0AA4\ F63B96E7961AC450C0C37B57BE0956BFB8B4613C9B4FF88C0849E02CFD586AA03847482DA 13B57:\ F7B57711898D0CD9F7A01F3089748199E36657205D9886C225BF2CB2E592745F139B1C4EEFCB:\ BFAA7B146C59824446B21716A991A09742D9A84B94F7F0A16BF0717B2D9C1A4665C3E8C17E35:\ 913167F67F74B1AC7D534A9A6C5DE71227B7F53BCB806897284666E147AF50CB263433F938DD0\ 7B5609DA8E0BE690220B57D99F4051AC8D5D67E86ADE626F1EEB0771C62DAB8F4452A637E::\ 97A5809F41C9AF2CE06CB4E43D96D0762B5317D3DA5B56F38493D4D8A75CB3C7361801887C921\ 0D39B5772BA7F32D302F91CD622CDD9FAB50C3A14AD95824692660D1631AC601C310DB91D61 2FF3F:\ F6F1763D1518036D58CA36D95E429BB9B47B2C064227B8C8875E0B16326A09E8397EA805DA825:\ FF0ADACC5EE6B8D4E5E94985C9DFCC826A650A1AE1CE888ACD44D474483873E855FEC4EE7C235:\ 92D02535AB6B255F85546AB69CE4223E63F4355ECB57DC8DF1F0E56505721A78233A9D94A5B60\ 1537CBEAD6E092F1ED4441B32510883B2CA7C2211D04785E78E5A1AB4EA07E4983DACC4DA1C::\ E131DB04F4578910C3DB88C909BF429D29D02541219925CB4447493CE13BA756D5EAC4D68EBBD\ 3AE853844EBD5E3914F3001A5B722D4EFE0C1203D89B9045440145966B61D3BA1CED4AD32C773\ 22E97:\ E420CB77F5D12BA62595E0472843C39756E9CB097992EE1CD06F96EFA9AC\ C96D664764A674C953:\ E65E2465225710AF7467023D6E9546BFCD04BBFEEEF6A29302B584ED6C9F\ E4ED4E0680ACB9A79F:\ B2D4480F64C8E6D357A260031C3940D93380AAA828FC80171DE482B4788A\ F1373EA3833F2D547\ B5AC63279BFB8E68A2BF5C9721352F650E0F00E1932D9106235B2A99D74D\ 133374CFB08D9FBD0::\ 072FB6A4F6B90C43226E0ED5A5233BE19529055EC3005D161AE60506A98DDD5B5E60C48FFA2DEE\ 0CCD2B4F3F39938D52A5FFD3C48496232C4FD6C05D05E72BACC87087908FEFC6849BD196686D7F 3EF9B:\ F6F758693253F88229EE11BB55982A8D27B424032BDB3FB47DBEE09ED159D54D2B4F3D9B3E540\ 97:\ D3C1DBA4606571FD58FF9CAE5B0B74CA2F496F444C37BBC0672AE5CC22547EC5CA90837A68654\ 77:\ 26B0E340A506CF587FE2AEAA4BBFF8E8A721C5DD9F96823274EC3050C3AE7C04ED8D102044AAA\ 86F4AE7BCDB8D53FB0129B152E4CBEE7C176A7945BDFA561D03554EC6135205A0B0D7FB79B98C\ 63::\ 6D48A0CA04F5E1B1CB5C8C58A14A3F79AE1FE20583D6A22BAAD4BE1F9CDE028935E7246C2DEF2\ BF591BAB9AB2974AC6EE226031207754FF6E0FA032CED158AD41B9183FE13087C5C07624B4192\ B1F1 15465:\ D005A4FCE046350601ACFF864B0D2B2A09E38D5E96F2CCD6AFD0A1C52270FCE297219A52EB10BD\ AD:\ DFDF0E254343E651DD4EB4B04B881B8274565CCCE054DEA6CF2E24B18B1B124B9C455A898C6D98\ 9B:\ 105D43C035EA626D0474851CA5EDCBA0C4848737F0C24653AC2C0025D0076A7164DFC6BE2F383\ 3D34CC52773C4A9E5C29D18CF02558D3A3A0BA45BC142221933923066F745386E4FFCB12600AC\ DEDB::\ 5AD148B4FD171F7CF6D44F69A5A90D96097D20C2119A88692490D9D86F1CF3D00DD0D0D84D71D\ 3634EFD7EADCF1052161608355D1FB00DA6C36679C51BCF079348A62C1D6BD5E094F9CD9095EB\ 828057 1D9AD:\ E2698781666556447427B2E3956F7A8A9C089021158415144C4C48555C4B8AD95862C275C7D31\ 9FDF:\ E7588730EDF12A42C40BF58E0E32E0FEA473D683577C7901F46B26793DD002B6EBA0F9E72D79B\ 1B97:\ B31908872EB8E97BDF94B976F04F24546FEDDD4E20D91B6555DD4B4B8E33EABE577AD922C5EEB\ 3EFE8E060EB69763D9D9072F121DD26097B262A765C1556BBA32AC3D80FF23538ED50CD759480\ 5D8165::\ 94A809E73195D7EB2155623CC8B383C28B971920A4399787809EC0CC2E6B41AC9027C0B939157\ AC45936DE7CA116F625C01EE6419010061B8CD2D0A9047F89FB5B5DB630AC86AA5572A81C326B\ 6906355D 32623:\ C83A47D71C360BC385D1A52A792F209596F5B71A0E1743B7AE19ADEB0C84E3A74288884786AC5\ F5B4D:\ E72046AFE6C5478EC868F602A71316FBED2FDC8D872D48A5EAAA05235EBFC42A4DFB599C13BC6\ 1D8A3:\ 5C5CE3F7AE9AF68B16F451F67057F8C041398A53C6FD194BEC1CBBF0F074C2A45C5C88ED48E4A\ 215E32CDFABDA45C92F24F94CED95E8C2DBCFEFF9506181BAAFB8EB6F5688ACFB42C0AA0DD1DA\ 8CF4B760::\ 1D7BCBCA46326BB722340D45EAD0825F5FB1D6C9FF3C7841C749815500A227990592D599BD210\ 4F53C9D2DE460CE8078222A3FF34218F89FE0065E4FB852E623024987FAC1AD0A12EF239BFFB8\ 781B38A86B 1F471:\ FD762F93472C2FC5B3198306AC6E4D18088B0A65AD4975EE26FDC78C52C4B7CE3E754532E95A5\ B548BF:\ F15450F4E38CB8DAFC3153725CC289DA9F0F218CFC65F6D62BCE770F4D42763CFFADFD26DD236\ 82F419:\ C4BD415792D696D83CAD82285A0E7A06CD7F05455653F13F56DC4D463CEE6753B6237B301A511\ 2D7C8995815650C38113272BD0F6AF0D5D51D7E5EFC82B9DA66242B5A71FC6A6C0436DCBEB86A\ 3C1CCDB75B::\ EBE9C9D258C09B1F708235D5CDC2751923A993A9176241A5554356C752C62F081AEBFF2E13300\ 2B1E70F5902CBE6C8DE8B12080FB9CFE04C1E7EF7036D0A6D07CA091DA3B085FB9159BC5107C7\ 28F55FAA25A2 2DF8F:\ C3362EF39B78C21469D23C2FEC1642D3EB7A7B72695A14FD07A0E6D616B0C50884540BCE16597\ 1AD3833:\ DF631F65CDC45053FDDBA18E67E47F45F14D876E4D89101E531303735B38C883621A2CB7C16AF\ DCBF26B:\ 50F14DFFF4F8B138F12159A52BD7B22BCB6979062C8EFDA7E9923A7EF43996C954EF15524745D\ 3A3E5BE1A57D416B02F11D9F7BE36BBF56CA3CC22DC27DAADB3423B4788B5DC72BD0E6D3083F3\ 303AD92AAD72::\ 5F5BA5370BCD31B61BA12DFACE38C80A3941C76091E3CD629DB5B6BA90415D83EDDE9C640D84D\ 8D671F13974DB70A85ED0956EE53ACBCE54EBC328729630AED05321A2FF3C3FD7F1DCCEE8968F\ 9317FE00FE3244 33801:\ ED0A07AAA76BE91DE67ED0EB199779B16FCA57E376724DDE07B11C538ECA422B15E20D2668E6E\ 76E6023F:\ F053CA61904163A5AD824276A97ADD3153B473CC1A45C401EA87DF2CC9150B2B8BF817499A2A0\ E2EF7C3D:\ 585918DAE91862F4B8AA6F15273D1CDB9FE2ED4D7F0AAE8AB18D2568BB844B37297FD3B7AF38C\ A29C3FD944DF17C62258CB0A4774FCFCF3D46C1D8A96EC87E935D38D9069F337998C7960DE1BF\ 808940E2E5ADD7::\ 978782932C74CE5E40602583D3A3F4C18444692C62F13B571C2FBB0BC3512F5305A90298EE626\ C3E32AFAED17BC3CD85EA6C05A8F84E8262160AD9486EC5706560769494E0B3E90CA6B752DCF2\ 75FEEEBAEB1C78AA 28F63:\ F69378CC655534C08A24FF41A6984AA981AA71574EFBBC565ABC63320F1CB5A20CB599FEDFD12\ 559C884A9:\ C954A6E1207C0C36D39ECA530B5496D91A12175E2BD9FDD2DD897542694DF50292D9313625249\ 3F5FDF347:\ 6D63D56180ACB06BA7DBE50E01F9D50424B9545CD054AFE4BFD6BD4B14B718014F2A9E712B3EB\ EEEC83B1209F895C709186E9D898CC9CED462168B129534CB241D6C06FB2CE1984D04C2434153\ AAC472994AA6D3B3::\ 4A2046DBC2C49E68FB37D77CFF89E2883610F0076AC081FCB9684A4962BF8A21829EB10E94C35\ C5816FADD1F1CFC4405FE9833F79CD363A512DBACC6517D98305FB38F17F5F04CBB3C8E944845\ C3727295CD5A097824 3C283:\ D9E9285C4E77272100900893E78AFF01DE4C6CF03EB8B7B62B4615DC09B58DF98ACCA559DE476\ 255363DB7B:\ E756DE8333A525E410D4E896B4E8C4404B55C919BA168F97B6E0B6D1922CC56EF3BCA5991A3D9\ 822EF04725:\ 3134FD350325ECBC1E8E1E702C1CB3EFA940122410B2A31BF90B7578D8B5370AE8C961CF2824C\ 5D5A8B298F84CA31F57353C432A22C17C9CCA6501250A6B930E4C043E634CD0308057C0E719E2\ 20478022C4A13D27B4::\ 3BF6E6EC491B9615E640A19A9C50AA27AB57E3493F96C4271CAE56C377815CCF2A65867CF9327\ 7948D6ADBDAECFA629E41E72E20974735AC615692DB76EB7CB83F9388FC86C86C615E13CFDBEA\ 9567A95E2D6B61FE6077 E505:\ F0D1129E96239792FF1B59BE8D2B755018BD8CB83DE5D825C04685917762185A62A080DCE9D98\ D389AF0040F:\ F4227E1F8DE368420D5D6069E03709168A8BFAED59C8E85C8294317C6FFB98332D736540CF888\ EEF6C0C5CA7:\ 72D86399CF78FC56C6E3FCFEB75AD0399692D3864AA1060E5D92473E82BC9950D037D478D2130\ 994A2ED377D8ECF987048E0014A1227D818C5913CC1F8646B0EE10961A3189A031073867D7632\ 62BBCCA2FD04AB7DA443::\ AEDA2E28A4DBD01A7F288202D1D3D83BECD2DDAC7E6CB38261CAC58F5DB02916DFF53A9FE8EF5\ 70CC804209081D465560CFE9563C8A217581DF8FAB4E1F7FC22AB8D89A9D1BD9A78C1AFCA5197\ BCF6BC9A8D84AF53A5EBAA 3DEB:\ C09753C0621B13376CECE340B0B0048DA5F4BAA4C8DA1F0E7EA92ED44E5DE757971F155A6AECE\ BE751E485A9B:\ CA4B0930AB38FF92E10A4AAC631797ACAD2924219FBF36E4AF18DC918BB40574B072F23ACC1CC\ 2C4B5ED15187:\ C82FA6530BBF74AB38EAB8C116F5AD50AB007BD36E2BF91B9E14AE69CA2639E6FD928FCDBA3B0\ AE7A1E58142B37167B41885DC2B6E07DB003944BE7D1815F3EC442B47FD4518BF3B31909DAD3D\ 950ADF4FBB212B31C9B62F::\ 03B2926F1560ED49557BA17D127C669D4DA2B37809F14C0ACEE845F6AEA36EAA118125D94F9D9D\ 017C9EFAC9AFB2EBA7C4DA17B95833CE1EDBD846761E0F7872247C23EFE8B2451CD4F5F84C6888\ 159705A9C4AAFC3489C2AB F4E7:\ D8658E89C4E85DD9EB45D4584265686E8D19E9AA823D5C37532C6F9EAE8BE236713DCD3DB23F4\ 14C55D8B6D867:\ DC3A02867F7A3BE96A167491BA202175E8902776A9F3D9A852929F27DEE0FF99F5C321A8D5663\ F7CF074D7AF01:\ A77BC6D9F770F51BAC0612C4939F10AC9F336B61EA6D87E3C5E25B053792D9A90F990A18CFB82\ 08D027D7C63E14FD4076243803D4EF226C4E17C801EAA3265AF361B8434EC8AAC8144777FC005\ 41898C637A7681353C99CD7C::\ 3CD72CDEA001A4F815D1634599DC6BE03371FD68D30D2AD40FB38E1ADD92057E4481822E5977A\ 94EA02F9DEAE1D59DEC6F9158D45D0841A981D4D9FAC7C766A8F9E92BA06B67AE058CF022FE39\ FD7373230B831AF141C3CA721F 10C8F:\ D946C37A4DA5F1D01ECE1ABCCA98DF361D2AE47BD1AF421464106FDCEA6DCBECFF3B91163FF9C\ 0AF06EF9FE368F:\ E3D6B43DDFAD06AAA4941129A4FAB542C41BC55834B4D9BA01C5A4BDEBA010B0EA2D125C23396\ B669B8CDFA5651:\ FCCB925AC2AD6E6E5855455E84E266CAF5E6A397AEA993003E80F3F7D3A1B83E3A1DF9F87233C\ BC3F2969152057EE85254B84260EB6D156DAF844C994F03EEFC0B4446B25D6C1B4C464238871A\ 5EEFB45DC37794DD64E4A8C175::\ 3026BC29CE98BE196930D34F12C2DA7702373BF4B15860DDD5FD61DAE4EF0DBDB353DAAD8091B\ D89723BFAD2AEC3CA127594A9A8F2E7244AD821483EB73B014DB00806A8C5BECAFC92FD79609E\ 7F9469EEA28F21BF4CB1AD468E4D D89D:\ D65E29ADBAD552696C44154EA2C80C23F49A604DF256730AB1BDEE5FCB9D9C2480CB1EBC78830\ DCA559F40ED42F3:\ EEA2E85BCCEB57BA0730F0D01940F79A55B91D2CAFF54B709E7616364B020FF9F640C4AB1884B\ 8EF031523855693:\ 702D36984EFF9FDD16A879C177768B4C497E384E657CCE78C9DB496F0898FC3DE110E46A96798\ 38900A5177027E9AF0907A8074BF553019327FE47DCD86E11E4C545D80AC4275FADD2E0909236\ E55C6846317BED4D286A8B9D5122::\ 3A3E20F621512BA40CBFA6CECA990404275CFD2D6465DF62EC70A3CF0AFAA337D6968EBFE5E66\ B6FF9666BCC800E80F4BCEC9DD33076DEA1033A391AB220DBEEFE6257505F8DA1F61EA0219BE7\ B93A89CEDD5EB1E6895EE81DF52DCD 96B7:\ BA0A5FCBF606CCA93394B2874ACD6B27E8A56B358ADAABE8FE70577C37B13EB508278ABFA5C3D\ 055419150FA77145:\ B8399927DAD237158D4385C3D52A5237BAB2FDE90A50CA601CF8C9A91316D69E8AF3A66DC400F\ 884FFFCCA4B4D6E3:\ 1BDAAE1316925E851F9A25903F3551D8EB7DD69B81A63D9574C961CB8A3F2ADAE7341C82D8C60\ DD6F28D947A40D48063FBDCF4AF69D5B355C0C931850129EB8384CA5B805692EDAD9D5A26C0C9\ D2A02B195BD8617DC39ACA0F349B7E::\ 7660C59184EE406D35A4B6909A5711B2F7053F948DE92C3D75947191406959434B529C035AAB7\ 785DDA4B14D9D741085AE1ACC5113AA0A3E93A26845F0E6A25DC88C4865CA046F35A1EC6E8E4D\ AB59055DC49955021EDF85A50FF3D08D 1CDB:\ DFADFD5EF2FFE2F823AA107FAB9388C6E4614833F697701882301A874CF2D2CC8C5E8D881DE3B\ 1C86D043B0EAEEE87:\ D5483867A334313530C629B9B6386CC1A385716FEF988EA995DE8987380FDC1F2518388107C93\ 9DA0E1F3D869A66FD:\ E1B889BB7FE5A95A69CEFB78A20C748F3F44E9734F7ABCD7D241E9831DCD3B33A36622F21EE32\ FF85FFBB1C56A379D8ED3A0CFF791E61BD6E4822AFC05F22E356CB10899DF3B2D5119BD9350FB\ 901A261995D616FBC5F851D0C787E31A::\ 04D5337CD443A196514E2FF4A3C264481DA91FD1A01C8C819BD376222A824CA6527F7C4884936\ 45808577F17E896A6D9A39B6A3E9CDFDCEAC46A2160752D4F30223FBEC4ACA5A01C3AE3CAFC34\ ADABDF661BF198C7A0EB4C696C60D590E9 FE1D:\ FC7C6FE9C0AEB5586DAD9FE052587B0174899B7BA9336E1F43AA74DA97B6A51C1095255F88F25\ 18070C79CD3D1753E3:\ BA97ED086E482E723CF61B68685946173D5E3E18E08755EDF817671144D752D388C6CFFE89E0A\ A1B0C204E9BDD749DB:\ ACCD4BA9136BDF04D0DE4EEA9DF329AD891D115E2426A3AAAC41F69F2AE156D01BA34B5B2515A\ 7CE7191A0266A7EB280798D6BEE627B65AD3A8D7A5E94603C79DE429D9EF8BC9C4DCCDAD768D0\ BE24E89AD29FDE7978651ED712D17F4269::\ 66F0DA8E2D30844A391FA9320732CB75AB1ECC4D6694B0775DA41D029A8A8FDD0CC7AB74E52D2\ E2D522AE7F336D3A7C21BEAA708C933AFF48BF117C99062D899052B2F9CC5C7C86DB7F2A5CF91\ 95A1CC8E73B82ED6F3B4C7AAFC9760843E15 2F99:\ E2AF62AD078155F452BCDD17DD1F37F73F22652E4D341AE558A261FD958E7304FB6A7DAA6F1D9\ 4F670F2A6163ECCCFD7:\ E716A2EEE122C98651180F8AFB865C6617389489B69462D9A18570A4DA0A1006AFCDE60DE41F3\ 33908DCFD82C31C39EB:\ 1350D7DD6D558BF7B2CC13628D12E6DA39F925D6F966103BF00529005E6B0A90A63FD58A67446\ 7468B065EA3E48636B9B409EB4167443699A47B435ADB68847D1EF00C90BB890AEDC6EB57BC3E\ 8DB01CC990F14E6076AB5E7DFE5B7C5246DC::\ 46DE5E9C22FBBB39C33457C66F4C447E922EA5B4D822BAFA60FA072B83628D34B27316B8FC418\ AEA2FA0C6E495C474BC205DC35F32BE6FADAC38D2BE7E0CD1AF1A548908F0D5C1F97ABBC1A3AB\ C30664E46579E12CC9624DFA7D431D44ED4809 E3D:\ E7D355D9F62F6E79567C02305D34EBE95852FD5E77123BD392ED843E3D28C22FAFF3390E7A1FF\ 42E453730ADDB98598BD:\ D6AF51AA7C89556E79A491895000665242EE272FE3E18E79A6CDD9B7BA694784BF1A9611C9FB1\ 0183105DF0535DA57207:\ 8B7800B682AD7562D7677DF8AE845D1A67582F5400D32CF51B044DC7DD9507C5074BE468AAAE7\ A6C862E7C5267389A93D365CED7E60D70E0FCBCCAEE2ED4CF549B7FE6BB2A3D561AFE19B9EE0D\ 094082921FBF7DA194B884189A659E72989DB2::\ 815912EA98FAD3D186E4E778617398B99482FD96B642B5D97C76B401FD028C0925017DA2938DD\ 756289DA08F8409F73E0D382AC7709AD0924AFABC918380C2A5B00804BDEB99B249FDA0AAC227\ 083861D9961EBDE7A64935E2B71271B9558CACB8 37337:\ C3335C0E3243BB8172670A390A4C6F1D51CC249F8AAFDC77B53CA05912808CB2A7AEFF1A8CF56\ 129D45C80256C6760E9F1:\ C8978DAD5BC81B1DCE811A010274BB838F641C996AE49B186018BFE91EA04A54E8488CF31D9E1\ DD1ED2486CD817CB7F05F:\ 7EE901DD41DF722A51579A4499C02E981D73664634BD6A032BCECC326E1CE5C7247ABF9E62358\ 77312D282F3D3F6613D3B7BB97F963B4437C69C6EDFB6DDEDD519F72BB99E155406A7577AEBA8\ 5390AC7EDC18046D639C70D5EBE3EBD73466DF68::\ 4B2E3B069A2B0559A1BA2E50170C0DC28930B7D2F6954DD02D4FBD2D97975D8FF1E2CA851640E\ D8522DEAC48A7FBCF85DFB18D698F9D3DEFCDDACD99AEBE52651CB2456420497507D3CE55CC4C\ E411249840D776AC2952FA5011C68DF7353F832FEA 4935:\ CFEE1A3877BEEC28653154CC1E158B7DF10BB6BC046A0DA3A4BCBB9545964D34BCDB256508D47\ 7B4C2DAF0C3A15BF602487:\ FB2AD04D99FFA45B66A5A60F1F674107A384D121C5B463177FBEE5964A1B3713BFD37CD051713\ 2B74F85B792DE1EE71E7CB:\ 8E90BB43D3CF22F8A7893F4B36C746259DA901FABECFA8F4667798AB74DAE54C9B2539DFE6B25\ 211EB9A1E169B609B3F84C212B4A568CE1B86157780612E41E90D20B6A1F71507D16992FA88A1\ 1D9C897C8E98CBCFE6B265E31A1B242670E23B5AD4::\ 54F84FCBF1573D4B08E67172693B2BA017EA34E8D27ACB16C9A43B0CFCD0C7CEC122C1B8ABEE8\ FD58CF82F98FED112A31FB4DED936143BB442F947BACED07555041DAF78785C63D3B323347F45\ BA800E78E545FC115D873BEEDEE9AA14D281439141FE DBC5:\ F75E869AD89EC4CF9BB028E3A67A40533FB4BDF8E663DC038E70A19C23B37D49ADE4CFD219C3D\ F67DD18A0CD6869494EC05D:\ C921AA94CC7653F9D02548B5DB56A46FC5304A9308CC0232773537EA52E03D5A2E6CAB5061B5C\ 788B357BFB34C4CA782FCEF:\ 7B766FAA923F1925F89D91707735570A0E856AEF65FB5232A1EAEAFB1966BCADB826120DE38D4\ 6513368A864290B36A5708F970AC9C114743964ACCC95E100AA2AC1A0A4993B34A70BA336968A\ 9C7CCDC264A06BCEA69D47092856FE451BE7892B17F1::\ 5DCBA27ED4BA89D25550AE6587846322D73483F60EE2F128B025C496A0440680FB49B49A57CAC\ 9479ED3210A27BC31F06257878FE3278D79DE65C14083DAD0B29ABC32C4C1DF53019267C69843\ 8FEE0609C3E2492009F2E28B39A04553F6D6B18D16D867 20B7B:\ EE50E2D3362D0950E6A79003E342238AD710D03737EBAE5BAAB7A0A4FD7A7F6AFA814E768D9F1\ 2B16C52A5294A8652E4BD44D:\ C9977D38FACE5D6003FA12B76880D2545BC15A78FBB19DA19FBDBCB5C5916DFF18A35E10E0479\ FF9F5C5D807D219F2A10D64F:\ A298A470C3B161484FC89CB9CCF39F6ED2E141447DF74EF559CB049F2DDBF1DB354864814E961\ 37E790390AF567253B3461D3FE0FD359D8C59268B0E6BB401A17F849414D6B33FB43DB254ED55\ 7CF14A97FBC72CE7F13D1B0F607381D009C88C64889BB7::\ 6C777A801C39D3E984289AA21D01456AFE5946DA4C236373B3FCE7DCF15621DA90871AF969CBC\ 06E671DFA7105892C89BE8649B3F27E28461D1C02C071C7D319F8F5A3D5A53B1A66D033057980\ 7B7F6AE0C897A71367207A7BD3263B10F4C3824BFD11B8C5 C31:\ BFD406DD82D7EB42637387460A82E2948FCBF40F9CBD8025F1B02499ECF9B84D5777C596F3004\ 814F746360BD6F599526E4099:\ EC593281958D49E5E4D8CA8EC3C68A00A19CB520255E19E1A6813E724A0B7A8C7ED9ACD221997\ E2CC915570F702A58CB9B4B1B:\ 06FC724F11105899E12F70570719F342CF56476A1631C7391196F856012032C97B94C10865CE4\ BBBD6D524316B0A6DD4796F56B62FCF585F83DA7D138EAEA0FBD7E9E7074C5F1D835C267D2DFA\ 369EFE75C2D1AB473A29B035750AB3E048A5CAE8CBB7CB7C::\ A34426C6435AAAE6C0A176881E4EC4FA6DCF1963761C36144B109F01BAC3ECC7FCCD63591C708\ 6BE2BF77EEEE7B707CB13D19533FB82AF97F80E430552BA461DB9E6DFB37B573C0B8875C86C90\ 60342235A2727EE1B291F9B8F89A84CDE67FD48BDD923AC1D1 3165:\ E13F572C3892DE9E82619F265EF1D0E028AB2112A9F6B855883837C930AF6C50DE5958B8EF9E7\ 06E8A5BF1FD041FA89D4E1A66F:\ E255C42A2B88D2E4B1FC51167ED335964D980670B30B9EEFC8E896A52DCFFBE8AB5C15D465C06\ 9040312DB7B9D9C62D990A78B5:\ 62505EB7C1E4AB70E230CF8B9974CC32845FCDC37174DFF0CEFF7BB28FB44D4DC9C326393C4B1\ 85E8B2F5E306CD56D33DCDA16DBB33832F3FCB437AD3A31D7205C87BECAFBF42C81CFFB14D430\ 9B1503604015480BA539AA79653455E481A34FD24D6086C04F::\ 00B5D962C18B90010043C6B3B73DAB6644EBDC9BEA758C890F60B8F5694DB3419C29968AA245C\ AFCD6784E91608670E50F6C9E726200ACBA8C776438C2D35E6E0CCD52E2B73EC9F50DF0BC864B\ F45909AFB80AB9CD3DD2C2C1246E7AE78FC759669C43A1D69A5D 139B3:\ E87416D7D28BF6370DBF37061938D4098CE25E503F6974CBB36494B21FE81AE18DA11C25C0077\ E8F147115B259B2663733CA24FF:\ BDE29B664ED4544404CFB420E81CCC2875CC6088A82D193167CCE66EFA4D6E30790D882F4DE4F\ D6852568E8A81B52769C8D4E039:\ 5B514F002EEE84D142DB23D38386460AF5EFDAA7FBDE017347A3AE359573338DE196215D4935A\ E0F8EFD5929FCFF748FEF07FD42C9614635B249130F291DAF70F8193991EB2D7D2B77096395A1\ 12C0E792F76B4049BA7037D4CBC4D2964DE324FD456B52E4D153::\ 662807DC23C41CA24C64A2E5502C389314EBC3C9949E93DA2D2BDF7FB1C1EEC21619C373948A7\ C62F2B902F77B7B5BD5823ABA38991CFE6A60C12FAF6C1FDFAB2AF539CACBCA7F805C33875D89\ 85B3C7642CE9551738C214BAF9F465309CF94F91C2029D5900823C BB4D:\ CF8454329613DFADA528D9556A346FD8566F5B1B42A5EE1E972F0A7B8D03DB800C9A04D93DE07\ ECBF14CD67A11BE27F8909F603B9:\ F67C6ED7DDAD52B15215D9A1798A099BCF20B7D65434CCA74A279BD63CDDF9D27F381410167C6\ 7294535784F860BF22CFB9E90501:\ ABD2BD2EF35FF7CAB549E375FCDD9396CCC9F6D51F390DBB06AFCDFA2690BCF4E7B4EB8FD3470\ 2CF7C272ECB64A8D3EC50F551FE8548DF5D58455D8113940E65D8D32864BFB36CD641410B6013\ 7DA69EDDA58A45EA19834031E788204E4C57B7CCB300F8264F2150::\ 26AB09BA08816E7EE65791E8B5539DD6D19A60A4559315969EF3ECB299334F6A9838502555FC7\ 449D80B3434C4C824805BD1F4BA3537D7C0C8DFE56792AF5664B8337031C393498AAA558FA892\ 78988D33ED4DD0BB896F44ADF623A78F385E135085288BCFDF5E31DD 2EC05:\ C5BBAA73868BB968A5A3693AE84E7FFC58D7B77AFF05BED1B6D2CFBB62207F95CA33CA7BD2900\ 0A1592C9895CA60175C4E8EC9F7F3:\ FEFA4B1CE3D3A3A00FDA17D05E0A95D4AADC7118801B54C04E06A6D6F417D07322EDA0EB9E867\ 2C3CD2C40D90D50D8AEBD61ECA747:\ F294399D778469FDE1D6062DDA214686C51069A8F4EE2DD4056D68E3CAA76FFB149AB5B3F2D09\ 51190411B4795CA893A87CE2832FD728FCBB865491349EF9091BEC02FB4611AEFF9B88E7C5D5E\ 3CB2F26D6311FE4742DC234F12A15DCBFBC09DB18ED8D663EDDF3801::\ 6A01851AB2C0F15AEB5F3C0F7C4ED4B80D0DB1075B25352DBDB2DB7BA6DFBD07AF4C262AD0C61\ 5E8885EDE377738406391BF6402C3A7EE8BEFCF26C91DA0F4D9FABD4A6F06E76047B87B8EE0A5\ D9C8A04B174504F1E3C4E6A4DDFEED36FA4F5E78F63ABF4838A89DB8EA 1B30D:\ D0E3CCBAEEF5BA9BAFAD06D5B5C6727D5AB85B23D1C231BC0A18EE4F166D4EDDAD542BFDDFF0A\ 9185F3EC41216768774239400D7567:\ C55B49B03706EF2293963E81A301DF8856C42FC2C2CB10E1CD36E1F91100C87718D06D20A1C7B\ 0DC125D0029104A6B957513DD1926D:\ 881A8AF4FC9C7F9C48102D904F44829E80A5F8879B8E65792E36B8F15AE189DD36AC9E976BE57\ A69CE59BD455116C3E281C4371CE0A89A4B59B12CEB51948FD3CEB67B8682B966B9874A67AA61\ C497E72AB8516F595B582BB828C94AADCCABB51C00498CF7D5BD8CF005::\ 25816413403B2DC77D9345ECF1B02C9A95F715AA3A46E8EB9DAE5E7953FC30BA601F22CD28DE3\ C0397699C004631FF297CD48985B13629FF9E8527FFDDDEE18E6D371DC0CD75353590C8DF50C0\ 9032D16C3CBDBFB72C0272D4816349B07459C2F7020955B6A88FC03A0DC4 349F1:\ FD6F20281B82FA202413D8E4C9A6873AC3387FF46DEED6E320F80430A1B8B6BD8509FCC0AD982\ DDCB2583CFA2EE092838881C8F292B9:\ D46FC162BE2FEA78106D7111E94AA9CE05067D4577E32400FCFB80085976F75DAD9EC175532B0\ C2E3DB59CEE5F00B02B361754F27A77:\ 0BFEDB7551AD05FA01CBCCD7EFDA1FFE2BEF0959D0707B74047F7CB64A165AFE80737F259D741\ 1D5C0BB7713470325EC4C282D7B4F5CEEDFD9C57383AD0409A76BFA7D9F391BE001F3A3CB535A\ DE0D2726EF9F7D33D805E6A607B19AA83A7457F3911DAE74145E2FE732A0::\ 4685DAE11C6F04EAC0BA5FC5017CAC0F398B0290D128C857D0F791A9D5B0E19329C86461C1D04\ F08EA31FA7B64B899AF5414C3B9183338AFE87278D74A1E7B2B40A7B2973D2C4F13D848A9F81A\ F279622E1CC097296CF370634B0DBE6FD31B6763B6D9F22A5CC1E85A9655AA 38D9F:\ F4F791961203FD4D4015567EC4CE6C4C281900A0E73EC013C766D0211F20CD369B698208EBC76\ F9573942A8FED30CEB201E4508776D31:\ DEEF6180D28D8B4DBADD5274DE22A249FF83E8A3E77F381B01A455FB3BC461BCCED640A6CF399\ B48DCC2B35B5250BF82212F49BF0101B:\ B52F8BF8BF76798AA7F876E0D76D4EB5821186244A5570D26029F2E720B966A610D4275BA74D1\ C369990F6174F6DFB4090F3C6E98E3A0363019FD98C1EB913F0F5AE47095224064FA01EE862DD\ 089A6A16B6AB78719927F571BC04A2D1CCF90906D93C3AB5BBE89FA368385F::\ 455F2109456B04D35ADB476EBD40DE17B5843DFB011872A444B14DBB3EF1EDC9508C16DFEC97B\ 29047F46E5837284AF8A5EF12B28CBF61BAB7EE7B92ED5D60B121FA8EC4B8027FE9A63E24E85E\ 4E7E01817073AA40AEA874710452C3C5067106BFF3F2DA855AB7DF04787D0711 26B67:\ F160B54868F1B3FF0AD90572170B554F75E7F49A579783BD6338F55AD88678DE5AFF6BAEA9F51\ 159CCC80B84B196C357B0B89F58EAFC55:\ CF68CCDA550EB334438AF72DE86D8CF18B0D218E1A15B2061E1EA663083905762427533CE71B4\ 04B965D37124DB8391638C62F5F747E41:\ 41C35AD24402B4D134126B140B75150CA4192AB757E03F243150FFF9B69B721C51DC09716782B\ 494948522185A1EEAF642492DE7B4523896B4A73B264FE8A5739754DE7FD1261047F0446C9B44\ D85EC72262A03EFE848EF19E471BD110D380C0E555D0E8B8377DBFE07B38A8E8::\ B4702064042C93F7B2BE232DC34B8F8EB59554DB7B68B98F1B642A91F1AFA89F6D33BE1DD8B61\ 62767D444B3D8207C578DC83A69F85BDF8E4784A266C9F474A556C1423C54C9940EF602F1063D\ BC0D6CAF08E05D628A2426DA8CF6978A41D4EA0611FA43BC5C6BB92C39F2486468 238D3:\ C607A2D95AB46A416CC4694E087C93E73EBCAFD1738D7B5CFEBC322FE0A1632099A129596C3AE\ 955C77A6171A7BE65E0B9610842556B7AB:\ EDD4D4CA2759A11B0D256830C17CE7DE58E7152B971246CCBB7E52F3863173C1819F633F3AD7D\ 5EE1217F747169718EB8EC14B68DBE6D31:\ EB8006B8C13866902B142447B8A360719CDBFB017B1A9473565648B9940A61B495412881BEC7E\ 023B410186C8F57F555EABB860469C22C155546F78C9DFB957707EA6F4E51E79E1CCFC3A8C7CD\ 8B560EF11C28509F034832DD095F3B378BF2AEAA6ECB1813E0462955825A3EC14B::\ 6ADEE0AECBED2E017022BA21FC0B369E1CA9D7C9A3359A53FDE22A817E0C8A8E4853433CF4C96\ E20B72F0AE6102065C6401C31B87A7CA48EE75494EF31BE7AB42C7B127E558716CC57E9AFF019\ AF32FD0CC1C7A09922A46B3DF31C8094D4F996C87C980AAA49A50FB4F6B97AEA4530 FC65:\ E51741CAD444F02E7F689DEE1AFDAA02C6F7BD29847F3535C988E7284F6434C4CD8FAE24E04AD\ 8AD605155D264DA6DD31AEC0919B3FBCF27:\ EB66E3C33FF2BD0F27072C71455B8CD72B732345FA06B94C2F4A3D799C2E12DDC3BF2EDD59B4D\ 4B29DBBB96C3346DCDE5EC1E3B2030C5565:\ 7C06B972ECB5E6457E7BC929E2095469A724A641F93DA43EF9C2AAE756D2A5558C7F21EE47612\ B57DB9104F90C52567DA8E68208D487AFEDD30F2EFFC3642FF010591075AD1B03D543B1E3E025\ D4529A1D3970BE040AC8CFDA9C5B5B41F2E6E28C7FFE8C2A17123D5CEC05BFA3DBA9::\ 4CCE57B3471D119AB5D0D8EDB148B38C48CCEC514E11E6A00C023448374F011C78E2D1ABDE688\ C3BB2B48733FF9B9523A7AB3B01F6FE116293D8E36080672E4A726E2796ADE6097A2000097350\ C99E36B584B652880930942A6918BB0DE28DB94C846AEEF8151BEE6A3E96D423B32097 C407:\ BE39B346B02ACDF3F067D1CC0689ACA4811AFE9509B1513E9E4B52E6BF648F219253824105114\ E749DF1857758C5A0C54830B1ED96B15E301:\ C1C2031D5F29D74B4ACCAB0C211A1FB29A7087BE34A800AB601363662CD998574314F6A60F76E\ A153DCCE7FE75BC7D13C859B45BED8CFB259:\ E2C9221D1C5B3C297E54881C4A484DC88E229A1F89CB9E03A7A836C0478696ED1448636BE98E0\ 6A549BAF0BE30DA4AC1552B17211662DA4D945F0849900EA02CCAF1215EE1B631D795BE58F572\ CA1B498961780B2C50A88C67A3EDAA950BA986193BF10B3DFF1EE9E0F6D8814F4EA821::\ 0F19E9BEA836057F18CBC1C1A7ED08DAD6D58FE84864755FDAD69BEC2BD1AD9D\ DF0097D21B05268737898F852643F3DAE32FB5097D95B4AD70A74EF2E7AC1E77\ 14FA57436A904AE361EDF9451EC406C9B726DABD0269EA5BB9F92A74BA4808A9\ 51204A92C6EC3AAC9466F2086CDC4EB279 1DB8B:\ E1677D97157A28E686A6DA2327E0DB9B1BB00C0A286D2939348B44B14A1484F5C32F1281D9250\ 3DDEE248145FAB855F41959C7372AED2D7647:\ F86F396FB930A154377F68536927C5EE34F9A948AB1887AF13D296505F4762F459015CA892E5D\ 92F44938E3E4F855130A624322F2D0D5698A5:\ 6F1FBD316F2B02DD8917432A5E941C511C482F93CB179AC4C7DFC34C334932976A1D8FE9D7057\ 1CB02BD8A34125FAF0E0F136E6C3EDB74F3B0F2D8188AB73FB25DA5A3B1D6472B4009A6F53AAE\ 0B58FADDD971B808118230C88AFC628B3DCF85A238053642BCD1F1478BE2B05514A56ACA::\ B3D24948C2D3BFF08B9B3B11818E0517890DE8FFCB40AB7DD40AC1B0FBDA19E2678C67C53C6C3\ F921CC4AAF05CAC7DA47B5CBF6EC5731561CF5F42FAA0A394D1CF7FA4874AE7E344883D3982FF\ B91175E56AC49D21B01859D93787AAC3AC1C24A03D73C93E1E43981D860C7DC4C84D307A53 3CAD5:\ BAF9A508017229DEDAAAC51B93F8E12A8C10E489AD9CF90CEB127EF503C1F56158F92972A3748\ DD4CD20AC162DDC4DA061626176525E9A80365:\ C8504C3E93C15C6241850609EEAED406F18E0E5B9EFB9FD6BFC0D474D35D7BDAA63CA925B3A1F\ 4EDAE9F9A99C1366D6EF5432188EB672EE86A3:\ 6BEB86F20DC86874BC052DC6C032E40E2E555D563D6002A6C269FF9C335680C0BCD901D02583E\ F30A3FC3E68AB218CC47228EF9E6CC14930CF78CA67F5618323C95605D73BEC5389017B77C300\ D0361AFEAB7E97D7215A8B826F91B9BE823D2467032EC6A58A9DF42766CD912F6D3EFE2AE9::\ 765765BCEAEF80D33430417318FD4775357D8DFFFBB4147B60EC0BB7704E5801A6E329B2D7A39\ 587DE75AE2143671AF854213664583C69CDE7A26BF7F108513B9F0BA6CDF81B28A65C7E2AA541\ F4BE5817761F146AB1ECAC76EB2EF1D1FC42A5F4D10C93CC2F3D2556CCA71A0215B96257BCA7 203B3:\ C9336B9F9A8D36E22D93739B8EF9506C3A9A6BB976ADC8777BD29747FF186681B5E77A5ECF525\ 3B1E9AE531EF7B32EB86FEC641AA718916C64CB:\ BC37BB3C56AF232171EE83DE4113C79CF78E675B7E4E1F4F6771384949382CED626507FA5F489\ B3CCFD69E18191C21AFDECE4D9A17BC7EACE0E9:\ 2C4B930C9ADEBCD1E36957E1817989B56304B53B03C9BA009875825CCCF5B0D77A7F7F76164EB\ 0B35DD262817D8E1EB5C498ACF16F4D4CDB0AF8918E54E7F5EFF050283D533598E4E6CD128E58\ CDF5417F520F0980671FEF7CE77E75E64EF2261F27BD50ACA5C68D8FE96F33B85A76337556FF::\ 1327DCEBED97BCEFA5EC0D6F4BFCD98B28AB14C555D31480C81F31E1E0FECC2DC4608E8BED5F2\ AB89237B3B44C46443C4169E25AEEDE620C7625B18B862614DE26DABACCC21901218D667D27C8\ A676EAA261E575579E06532DFFA1EC9E18F23D8A94B6DF6DFB5C52A30F9AFD22B6590081DF745\ 3 2487F:\ DF3FF505147F8C7CD7352E57F5CCC3661B4DA5B003BF7D3DE39761EE8CAD575B64BEB5332DDD4\ C3ED6BA64162633A0453FE4FBF33AF34329C5759:\ BBA02FF73B4C0ED4F774C4A878D696658CACEB13F56C9A936193C28F3FA20A4056213B8A7E710\ 23806DB7C0D49161C59E2F88B00604E442AFB909:\ A527A2D970C829A7C3E0FD2BFFE9590B3A3C8E05C3DF8EA923AF156DDC30222BB304CFFFEFA4D\ F81A63B597FF983052C556E69D6CEDEA86518F9A5A301D03E6686D19E346780EDB5DB589C9047\ C18E6CC6216D4A0C2E14505E744E3DED365DA0F1B1FF00EAD5FEC05E6BC9F7EBE8408AD89757C\ A::\ 57FF544A0A4E5E892217382BE63F656D0CB49582414DA7AD5257C09AAC803D60CBCFAFCCC00E8\ DA84D02AC0059CA11868996F8E163C226FDF23C7C7F7550AF30AADD03A484EA81DE3D6411BA9B\ 0642532A22A57D01953BA8D21814B72AF28EA499070938224BB8F98A0569F00BA55D7D4FE6813\ D43 35AE7:\ CC072B3228FDB247BBCD39BE7CDE954BF98133426E79C6416E8658BE8DF09269BA3E5A5AC0784\ 065895D3E03355DD1DFD7EFF7F0859F317F8A32DF:\ C78470AE335A28BB07ACF2DE39A1C180481C0F5DB37C0B60B97F68D584B24A3C39A4C315D2D20\ 04105D774D966892BB0659DAB963C298FBC7720E7:\ 6B18E5D6236AEB054CDE9DBCCC8710E2F8505F7836AD84B4F90BA5E1F96361871DD99AC16913E\ 8168A74A1B39E607B6FC0E47799A5E55970D53A9D5B0708D7BF7FFF88CB9EFBAA18F6A0101093\ AD2272A1829594206B329783D299DD139F1EBF85C7FDB18330D91223ADAA6EDB317F6C54854D0\ 02F::\ 42F95CD54C8F50ECCE32D08DD5C66A8D2B5D20B3E3A5FF70CB772CB6706120D666EAE0C608E42\ FBFFBB3C064D7810B424A640EC7E01930A76B2EFD6618A8C967F126CFECDC61476C7BD0981A0C\ 86A0A50B5F04166FBDE23479CBFF6430A6C5D433AD4BD7F0F0C9A47D060D795191FD49D8B71DB\ F8111 4813:\ D55EB495A0EDD8784C918DB2C9905CADB34AA873865B61F959CC39F3944444E4E411CA490B323\ FF92A47E780BF90FD861EB630ADA012F4B17C8FB19:\ DF5304947138D4539E8D0DF7F5A521DA90D0A79468FBCE67108DAC5D904ED820444C84FE09C09\ 93DF8CA649AED14E7B77A8C8E96F3EBBDF6FEE063F:\ 407D8F49B0A0162D162DB9E89547FCA67DF28597E3EDF4024225A815CD16C113EBC2406DD8D5A\ 57C7828E80C81F87F6AAC25E69382C4F23B6DAD015EB4A373D48025188A3861E6DD5B6430CD21\ EFBC0DD48B80225810831F23F75E4BE2FB5AE9A6191C633F073463FEC87B33C5B03D6ABC3DF82\ 5EDCE::\ A9FD95925F1EB6A3D6D1396DDD8F459FE31135A07BE71DD9449596F457DF174124B2D9A4993D1\ 15055EFB664EDAFB73D51992E366D6010299E0CA65EA40CA76AF496EF024F72706C04AC618A50\ 823FC4647868F607B6CC6BB489AD6D2041970074452B8A0826D4BB0E9463D296C0DC54D241736\ F59B506 1E497:\ F9DA4CF8C42981521AE47857D0A58BAA9B0D7EB223646D19E3D1F418B980FA9BE962AFB73619A\ 09D3B308E7E42AA3899FB9194C6325C3AA423CEC03B:\ D6E7608CB975895E638794C140060A7B19794890E373274D24D29B786D1510B923CDD83EE844B\ 78035219E4ADFD085A91752B4A0DEFC8CC3411904C9:\ 677C0ABB673F029F63CDC4854CECC572EB8FD3AE9EC5B254CD64803CD853B8AFBB958399D077F\ 8F0F8DF0F109C780B89D317D293953D3C814F8F9EC1E4AAC029B6B895453D951090558DA2614F\ 94DB90ED3E62164D12E2A5ECA60234E153274154B82181FD3B060E84EFB9718F643ADCA016EED\ 2C89D40::\ 21E9AACA4B288AD3843FEA09406E17D94599BB610FFB02C86EA9843076DA91ED2CF55EE3D32C1\ F6C53B5777DDA632D05403DFD77AED342521B988ABED48ADCA7FC1F4E3599949F257A5CC27102\ 18FE6F7E18554C9C26383198808C32B41A4600C19FF249291B788B8C438C999B2872F8CBA86FA\ FE8838E96 12B8D:\ C6C04E18BA8EEA6AD830FE2652FF3547F4F693F41B681B516B2F397BE89C2562D259C0FC3698B\ 326290366331582F687C0DE212C30D1F573A5494DDA9:\ D4D610D560F7AF67828C7602E12EC69F6665DADE3E339619DCCD53518009DA9EB019D4DF7D14D\ 29B1CAEB46AB04A414C50C1073E61BC85310144730F9:\ F55E6FEA0FFF7EE032AD7C94208C337EE80B2AA0F4F2E0D066A05DC8FB528EA638539DB948203\ 33CA86D759086CF2E78E9695BED9B1DBF8DBF3E362801C685F688E36D7C41D37BF4B4DECAE181\ 6070518246FF9B73E807BB91B7057DBC74B8991E0B7E1C79FC1C1F87C780D7221FC476494D1F4\ AB666DB3D::\ 27B21E28A286DD57100FCFD98CCE8C2ED2F1E2D2108E5A02BF96A0125AF563DA0EED6AF54BB8D\ 0D993BA772079EA644A2884E7160776F31F5F11D7BB47495611B30441F990FC107667F740C08B\ 660232EDD4A83484AE029E34326AD69E01EDE3461B54733580773B1DFE807CB54926980213896\ 7F59F59826C 52D9:\ ED557EA9DB53E4E24795FAA88F8414BC67C6354111CA244E2AC0C99C48A0BEF2FA69E69AECC74\ F5E6DC79B0E2EF849C95E881CE9BD5B60516408D8A8D5:\ D08480C28C9228B2E196E5F672272551E456E80086EA3A0300D5440978F35420211823516D2D1\ 30D444602DBEF4E68EAD7AF41F06E970BC95D9E90BA8B:\ EA763D61DFA0624CFE25EEA744FF0AC80C5C85C4ED6A7E8C2303A1CAC4010931EF4D9B9414A98\ ECB5300CAFF1AAFEE877813545EE56F7DD26A6005F142F771F4D3D1A97CA5995F91FEF25B1BB7\ 72B12AFC6A1D37A1CDA7175E5CE22571A3F8CB88664A06FC907FFCBFD5E6BF3FD2BFA98D5993B\ D5D949EE887::\ BC9AC00C07CB8BAB375AC69C14556D39DA85D019BA1D776CBC4857546AD44E857E616EC312839\ E2A9AB55C3432373682255A1CC06BEB9CE7C3973E8B4FC02C1729B992AC40C0B371195E0A5CAF\ 80F074D0608CA75885F63C340C96A1E29237C64AA3D60F9EE59D425D757ECF8CC9009DE2B2AAE\ 8AC3786F639B3 17549:\ E60CA06397622C744F64ECF95F3264F1C8C819FE0D596877859DC7DA2EAF6CFE25907E4D018D8\ FE457EE7113B09AE7E2D14B54A7AD7C1F294FAEA719A2B:\ E3FE78DD4001FC135E4185121D5E8F6BD766DFE45B818DFCC1C2DC9F1E1CD4D1E9F5F7D42582F\ 36A918E7787D446E93DF1CA90AE6A52220D9A1D2683F89:\ C0D448DE6D8C704B5AFBA03AFD8DCFE4CDCA0493A9D64D095B0A19320861E5F42B0EC566B82B1\ BBEB4198815AE19238EBCEDF59FE26E4283E5942CF77CD1B23C5B901A542648D28051B5F99416\ 3C877D57FE27BB3D3B54CB929F9F4C24FC1B05F9EE7BCB7E1414DA3843032657FCE85787A1185\ F2BE2C025D100::\ C9E14845932307783E85CF97F3D9FCAB04C3872E5767E04AE1F954E7A45956CC7FBA483DB7891\ 36702B48446B177F8D36917674732972990053F5896D35D563C975962C4C405F522DD44E5D007\ 2AE7A403AAA1C8DB53E47E87534148B55CCC38896A8105A583D363D3C5EBBCA3076729F69E127\ 2B24F12AB7DC983 189F9:\ C630CD0B8D86A93343EEDDA96B43122C8DC58318F5664950CF34CECDC9EF3796F71675712EDD7\ D08E675F491EFA99383EF1DDECBA36CFB4F2CEABF3BBD4B:\ F9012CA0D0A2C91BC317819EA8EC23127357B84FF6F4B4995BD3DC6EBFDFFE8A7809C42B4C4D6\ 4267CDC77D29FEBAF99355F00B4D64872C7B4A466C7195F:\ C42CF8F1ABF85A849137F421EE51F3B2237D052E89F62D2F8576EDFBAC6D926285096C4F5AB82\ 10D467F2ABC0A8C99FD39EF76EF51CD479B9DA20F082ED598E006E0EFE884D33B59D5F52E969B\ D42F7997447BB052F70AE020E7E1FB6E8BDB90E5B8E53AE483CD29970184BA4BE51747BDC1D75\ 2B214497705D75F::\ A2BFCB298708CC1D0F0E5B3817F669757CA02AF173BD04B6C77ABFD7446331E4E7E2526DA90D2\ E79B60ADC06284F72FF053854CE1EF8E449FFB70333450887EFBEDB4BB833696105AF4109ECE8\ E24FF9AAC5B16C3D3467B081967C1534782C29205706E199ED51D2FC87832C2ED5568EAD28F66\ 8009908AD66834A24 26175:\ BD3E5ED73F6D8751F6B7F6A9791AFB12A42AFC6BD4E2F73C14146945ABFD1073BFA87778B6805\ 891860A636884618ABB924E681C26C44D08A6A2354351EA5:\ D14A005FB2E1CE65F51F36F10C23211BDA04159AA1E25510CC1A7BD643A76B923BA0ED4754516\ 1B50AE0E137EAC684D9064E258D0389818695715431B6695:\ 01224CC754FC5E4922AAE8D64BCF2EE50D13765F80317818CB3973B187BF3C17DED4B3AF27C93\ 8BD0E36F875A6D953808B590444A1B0C161189A93938063C80A78DB5DB689BC4AAC587F0DF6EA\ 119DFFE6CA9B67549005FA4FF451354174175D2AB236B3D6A1E604DF2D5ACAF956AA42B82A5F0\ 3DED91DA07039C464::\ 466BBAB71EF00D9436CDBDC02DA1C7CFD3D59AB48D60E82A87C39097BCF8DFF3D6807D6DD73CA\ D16101245515ACD333DC808C9A894B9BD754F6921C518C5E9E16F71B6009B078E15F53CA3400F\ 0BD927D2416BE129DEE6035BFA74E3D8630A70055C229BA3B0AEA304D8F77A8407DD8998E124B\ 93DBD1EAB29CE11B558 32C0D:\ BFD70BCEA35FB6BC5C4C753CAD49FB6E86985D6F3687AAD9CACA49753676D121AADD87D175D17\ EE5D80B9D6659B00289EC4475BF003D7D400177012ACCB72F:\ EA764CF0C0D3583F0C4B4F9D096E1E4668439343F9A937EFFCC1A0E589BD3B64F4F14D745FF1E\ 38D720E581A64A3045F70B92A6BF2031E67EFF656749EA1D9:\ A4F527A26115BC6402C7DACC1D8925A28D5AB036B56677634DEAE7560EE6F79DF87293564556E\ 155C8CBB934ABE781313AF7DBA88D65D0DEF4975AD6284A5077CA35CE49F1DE12FB46ABBB3072\ C2B17FDDD93D010408F9790A9D1896FFA362C43FE3B61B6065A09F715E97B353BB471F2AD94F1\ 15CAF8A5FDE6B91826E::\ 80C7B635AD6C6499764DE4AD8F9EE1654FC83763B4097E4AFF6713EF1B3C7D627B291CDAF41D9\ D8567758D6F9107AF7ECD0021DA4F54FBF979F1C1AF24993B46347008F51BA00F3AE1386B5C9A\ D29B378FE434CC6B620CB2239CE94D5C2755FEE67621649B526505A49451F4469B29003DF8396\ C2213475FE7CC671CF0D7 D6A9:\ DD24EA4BA93BCCEA6C7676405EA6F04F13838390AFC51713DAFE299D36362C525F6C2D1CD4DB1\ 5DA08B743005F46E243BF34F285A9458575DD61C31F12A2DE5:\ C152185775ADD140C1FF045BCADC81A81DB36BDFB61B6581F78B29B9130F8B7F3D31C508524E0\ B487F441F01BA831D8C05F23CF47D14B35DFA5402F0A9C003F:\ 14815E63D355877FF38F110A6B5BBDC86633936B9B28669E66E6DAEBC85A213D40C63080C5DDA\ 21237D04602C02DD480E753E4230206DC216263E56E129566D094D5B574ADAD461C04D3D20145\ 855F94E02ADD5854E89C48EF18330C5F9BBF7D1EC9638E4ABD835755DB84ADE864E3AD2DF04D6\ 26E91ABD952EF451292CB::\ 2A432208D0CC726487A772598BE3DA4799B484D4C28ADF06E2A914BDF7ACF826080BD56DFCBC9\ C1E8DB37AD3D57E2EB42CC5589E4DFB2AAC63B7F61A05FF744CDF6D68441694947B2EE1003D33\ E25F706C4EA70EF39DE831B520B39FB7DC02EF7A9427ABF86900053DD316BDE944ED001CAD53F\ 4C6E68C336B3050AF52B081 34213:\ E35B81A5A1B6199B689C0484C332C4E9CF8237BA3B3215A3C50B9FA9704BEE13BBF8D96B8FCB7\ 16390A4A52D9E0D8066F4C171DE3007C0E3CCAF7E7ED0A3974D:\ BBBDE5B062860702D894E1B70C555330E8CAC1688484C94DD8C9029487E181FD32B3E4A263789\ 43B5AA33DA24676E240973076712FFD89A66A9B58C5BA83C69D:\ 96BA67D8ACBE483DB6CADA644C2D8A30710395047775A43D5DEC9F2C1E81D2B5D3D926B27DE20\ 7A7000189AC87F10ED06DE57793C301A9B05958537C9E5D486B3769BF41E9B18904C5D1EFF9B5\ A90C040E1E5FF21E872A06FFA9C5F0BE274A346F425D46BD3B666CE2C0D9843DC4067C04CE019\ FE447131D78A610A5BD648C::\ 7A7667774523649C72636F1A0599A0D1865B32A14E9C50201849A6DAD8AB96D1CBCE55054BAF7\ 31947DDF6645937C9C39D9F11ACB9D2A3DBC7C16EC7CD5CE13AC82C85DDE8213E769A6440B67C\ 1A78A1A8BE142D50A9CF127EA9BE1BA252B21460A4C8A196B50D7DF022E289B6C0977D13C2D57\ FD0F4F90675C7E8F018EC780F # RSA PKCS8 format: KEY:message:nonce:output:password # If password is not specified, the key had better either be an unencrypted # PKCS #8 key, or encrypted using the empty string as a password. [RSAES_PKCS8/Raw] -----BEGIN PRIVATE KEY-----\ MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEArpub5dL9a8aZji3a\ w3205ODGa/HgXylGNDWCanG5V6smkqiDZfpr2Ldh+HL4hZCIe5NOBf3DsTCocit4\ BMyBxwIBAwJAdGe9Q+H+R9m7tB6R16kjQ0CER/aVlMYuzXkBnEvQ5RuqUIthLugh\ lUEHgzdj+vd8magYEJnkatQ3v43GeIYYuwIhANrmAnvA+cpZoFav67qxSSn8jSZl\ A2QMncJquHvLvBRNAiEAzDPU9d6kbx81gAO0J9vUI5iKA4gTiQRUkmgeUoRHSGMC\ IQCR7qxSgKaG5mrkdUfRy4Yb/bNu7gJCsxPW8dBSh9K4MwIhAIgijfk/GEoUzlVX\ zW/n4sJlsVewDQYC4wxFaYxYL4WXAiAxtWZl8m1fSBhTkhLJJ7ZZqAojlyTkPYJZ\ q3JR3z0fZg==\ -----END PRIVATE KEY-----:\ 01B40EAED76EC2A26C41DF58CC23516E7974537ADDB1D3ECD0DCBAA4F09458AC\ 49675A20D51CC2415DA2992AC5EA983E5EEBB83B9C8C276C68E11158756904BE::\ 32E6A9BFF82BF351E96292947AC218E977AEEB069D09CF438DA0B96478DF7A18\ 53EB8BA770C16B5024D31B6C2D2F83E867AA37C9AD42E7F13369F171BDF2308D -----BEGIN PRIVATE KEY-----\ MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAxYJRkiu+shjNapT3\ ra+jaefGrLY6mH96JR9cbnBCZhNktqLa8Cn0y4rJVGuScwtqYKpmy46jS3d+AEqy\ MOf2fQIBAwJBAIOsNmFyfyFl3kcN+nPKbPFFLx3O0br/psNqPZ71gZlhFzvXDpH2\ pis8mkPPCn15KPe81S9vjaZVYzxiAZLpVWsCIQDmkmjzvCF/8Eq8ReiBlWjA1b0H\ FV+IcMbHs4RzBDv2KQIhANtKd1FZFnuaZSWozIEhbOwXUh/vB8ZhMKFyMzzQTgA1\ AiEAmbbwon1rqqAx0tlFq7jwgI5+BLjqWvXZ2netogLSpBsCIQCSMaTg5g79EZjD\ xd2ra53yuja/9K/ZliBroXd94DQAIwIgZjnLdn9+HnIRhfrix52NDS5nY9yaisGu\ kQlWG2ag2AY=\ -----END PRIVATE KEY-----:\ 01453FBFA6B146374602261D86822493E2CCC960B75D2A124B182EC70F22FFBF\ 673F7E0EF0C54536C76B534DED77E1D044AA30FB075A0D52733C19825E1941C6::\ AAADBBBEA2716C35EAD89736AA97A8FFF0078A07F48A9888294929B8917297CC\ 53AA9CBA9FA9D80791F24F749BB1133D0A48C2117572DB73C5813881F4B5087A -----BEGIN PRIVATE KEY-----\ MIIB4wIBADANBgkqhkiG9w0BAQEFAASCAc0wggHJAgEAAmEAotk6TE/qf3yBOcQL\ jo0t6KVeOgtNLwCwP2dR7wp4bFTWUpMOx/Y4dQ+2izzRl5neyEHxIaUc11jMuua1\ s+HW58L3WifM04yT9BQ5gkxxZuqA3+UjKeD9fs/qP+y0CDULAgMBAAECYGCO4xVa\ kVWUMl9ZEe0tYto+K3fJObOz+c0uaxOMpsi9KPN/RNVl9iXa8kbvAeudDNx8FfI7\ 1u9FDLFfmZsSqDR/VVAvkMwXu4zg5uc9xmwhefdY+URTdt9IshAdlgMiaQIxANJ+\ YtpDxwL1ROjnNEWKnrCd4gVsMBSsn+zRw0pUw3iVDt0kVllxXVMhbR+NNNNRTwIx\ AMYN9PgfUr07e5p/3xE5rXJJpBTKktVB0APHORafHsauhs2rBd7F62ZWMfdTdb3Z\ hQIwG9557hYNMloQ7pk19YMd8Zplw3wIfaRBZFR9e8jvPHbXyfW2rQ7yYUBKt2O1\ u8jHAjAd7uQUUB+gLApNWoArSU1WlZyv68Hva0f2GjkdmyT6oEwNb4iul7kxOVvJ\ 5ppH/EUCMF13TTGrTH9qiNUHOoS8RLZmPoNwjePw02BYUBcLEwhUw+AbR12FlNf2\ O3iiv1ounw==\ -----END PRIVATE KEY-----:\ 010E1F619D8F90D37563050B014DEB3FA3E9B735F8D28D625682D6A4663E6B33\ 4C8B94E91A24BD8F88C29A890F85C9B36F80E8675275C9A8F79F4D5DDDB89129\ 4325125D4ACFECD291875BA10C24547BA43CE2F7B1AB9FA84AEC0627A59750E8::\ 296F935C38845C940F820C379F8032101EA4003CED8BEEE212F2C6F72EB430C0\ ADF48B7ECDDB296544D8FAE80E2FFF084671E88A88334EB8E718FE8B2524358C\ CF9EC32CEDF93087CBD39E784FA66B3BD32A427D69EEC93607A8352955C774E1 -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIICETAbBgkqhkiG9w0BBQMwDgQI164w6OtruCcCAggABIIB8HCD8Ae9Zia6ppjK\ OgZTy4I85VqUgHT1lcOjveqRTtnKeexhbhwR+M8kN4p4wiCHoLu+kNp2lX56Id7+\ wt+PnN4HofDGkepxS7bve4emEIJN3TLMS1ux17Ste7cJMs4KAKLbtwh5E/slQeAz\ /uEpTpKnyfDXbI21GxRdiJtHQuw7z+RpX1uuOIZB9t4dE5QSASdbtDJsrvekcNaV\ tDxzWkZ1BoXcf2otaEW9yzFWlVCuerzc+IcsAtyt3GUuOkLAoY82TQ5XuJFpc2XX\ J1GVtncjReFdzLyb1gZePiEyE9TZDtbzR2Q/iJkJE61hgNIptCwhe4nvHzMs+fGV\ 8zsudkfzvsgwb05qHt9CJVSs6Hd0frCJsqahpQSsiNUoV3SD2EsH44T5gJrTg3Ke\ DJu46uIpMyM8VbFc5Ra6CSOuD5udSx2yV1klx7bMHWONzTOCLZnaZVT9cKC/4og/\ em3A9OdPrfAZouqZsQ3j8u7ZS9Qun9WOZApjRxD1vObuz2VPHglIxp/ckvDJ8BJt\ Sb4QEqFwe+Vd6tBiBTmK7Is8Fji5Ummbx0tLMSd/Xtw6jBtrrzyf85ywnFAAoTyZ\ Or4ey/Mf5KDp4LscmXVgkAauBn/Q/wWjK+rdjTBMUW8eQFiLsQnv6087sLSdEUSm\ jg3w4Mg=\ -----END ENCRYPTED PRIVATE KEY-----:\ 012E1CD97DB414715594E404B8B0BA9C3928CDC2CCF5F71C712C462B7BC44B90\ F36869701C7DE17111C575CA752F66AE583371242868409A9486C5104B10A03E\ 780AAE94878F0599547A63C9AAC97802FCE926255167BFE5ED84F5389496760D::\ 3ACD3EC198014D833BBF4DF281C82C96777C9534584CC926F9DEC42E7C1F846B\ 582A267B95EE4CDAAEA7AA953330BE584BDAF75089FCAF66D386AFAE39C9BF70\ B9D21C0E4C6590C67302AAC0A8917A3F33A39F7F921820E8DF6E6DF85CD6B6E2:\ password -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIICoTAbBgkqhkiG9w0BBQMwDgQIXbcBBmYh+DoCAggABIICgFFUCKS9lRmjJR33\ Gndp+hSXD7IHV1kpR6ayZcbGGfYlqsDc63yaWcLiROTQzZ+DMYxaFxePhd8tKtLP\ 38iw/MyXa6IRAYA/C6JHPsXATrKRc+Og8cD5pCxc4STCrt0Wg/SCWl7V6nbnnWco\ vfOBUHXmflnvQYMEUahsu6lZkR0wJeSyK8G5dMKb4IZ6vOffADQ0U8UuYYK+ymfJ\ bv5XKXhfje0Iesg6eReLdQMxLI1CURCg4oio1aQsfTosa0wJ9deSry0cjXk7K4c+\ 7MROei4UWXT0Otv1CFYR6zbmBrFbds+CY7EaqoVzgsBcNPLmWWdFlrKebquGc8xy\ HoIvJ9e/YSnE+YU+C/LapQpmyXoqcQB/Gr4Zdrb3+5ED5WYzgVY+jw8z2f2DAGJt\ bdzzL9JvFuEG4iZ1vNi9TSy9CyEgoqTyxfcLlHZY9BG2iIhu8pajkjnYmrxodSQB\ uRyYNJ/T9vFOJGUWHbe9Zii82TedNUBnF0G0e/aRMxBT6wQUrsB4Q2P6ntIIHuaW\ 8q0lhOG7MRnC1FtQ+qSrzpMTX9i/01F0YXegnzeiww4ROMTcO4vUtIRmF55LZv0v\ 8YOjZClzYQP6nNhpHX/+jDpZy+4GFXPVmiOhqjnqJtRbclu+CcDZG6NRFH2V9vrg\ P+leIuPeA4hV20lbkG3xxrlnxEUAqMNCC+uwj1zTVdNKY8AlWK7umsdWiAPIIITY\ GQCn/D/Jom7PzbMSVa4HmvsGntPxXP4PxrwErWbCNOZpE2fe0y+tiZidaoQZqmUj\ UDvM5gYsamu9O5UcEes6QneMr6+NakYwWNl14V3jNB480sI5z8R5bmJW+tGRmYr7\ /+MveWY=\ -----END ENCRYPTED PRIVATE KEY-----:\ 01C4B6CAAFF5ABF4FA027C945EE26974E77DAF3FDE5F51899CD64DD7DDDCAE09\ A164D350597E445481C1E8DFA352538ACF03C9AD621A37FEF184D5CE6083D701\ E8AB5141299695AA577E89FAD0DD849FE04E4C4268834159071628689AFF6982\ AABBC3D451597EA8D708A2A7E52646C5749207DD1648361D5F5E85F95EEF7B08::\ 8095B914D477DE2AE3F2AC7648B32EB497B7C1F4FF298D4B82F0A77298574E94\ 530DD9FF57A205499100D5920999182E1CED1F25971B27C0C3BCB06F0507305E\ E90AD35A00469341B47A6E2E1BB7DD792F6543F74D1FDC2CDBD433DC7C9728F5\ 58DA656E5134FC174723012151360E0310B31D4112FF5CC5829B0709F8EE7303:\ alt.alien.vampire.die.die.die -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIICoTAbBgkqhkiG9w0BBQMwDgQIfbv0EM4sRhcCAggABIICgIOfgSDzsjOhLX+b\ 1h3lXZiIw4nhiyV9q88CDEyB0x5y+aNkWipVetWoRPqZ6oAD6qE4yGQRhJuSa0o7\ SzHQlZ7aqBAjtiNXw3Q7yeAP9lagXLolhnIovOKbhyj9iyblgKQgzTerbevaDgp/\ jYTWXutKLhvjZeYVH1lRBgQYw3z1jIQQDRxw5ok4sYwD0/fpv9WtQ0Rr7XvdDRDB\ PUhDqEu8GelR+qO7yH3M8Q5qhnTxHRpDWRU+K7f3XRNwJQTdiwWJtSJtUdrSpqYV\ cqhDzejL3BJZRTcMbjsmq/uABwL5X9prXG2M6j2+9SrQQTWFQrLsyRIGXfKbKN8i\ wFXaUNzGFKMskk7N6ywkiLMvAIhcaDO2ATm1bHunAcTeuIfdJfdpSWcQ6oz9x9Re\ ACnWiQ0CRRYQlSYib/u0tt28rwOvCj4F/dSSUMyXegVz0gq3koGNwk3pbHEVvvUm\ 1bqiGQSr2d7DJ+ffe5IoIWB9cUgLeTFP4BBC1hegjDfTsaGEYPVFv5Qxi6W0BaN8\ cq/HVWofFqu9jXeGgFq1W0IjYU7zftoVc9DyKor6ffDoDzYbNcivd8OcDydLnRVI\ aofPN+fBAREXHuSz3cYr+arBe5PLbaHTz0iCi4zZUCWU83Usz8oLAtwkK/Ta4rDR\ KLdv8RB3C3z4r811tWuTrgvoZeG2a4Xa94rb6okHWqOXbSHV00Z2eaqqLIuc89eX\ JDu1iJrfARsaCN/Xu9unUnJWBRcqGzWgDRMSjnOoUhTCtjKqF3WDTsOfS1n8RSQs\ F0zMsrXMiHXrWfcN4gDB8q/uz/laLapd8BTp6IZ0oygsHc9J5OHy36TLfoPhObo5\ HcVJbxc=\ -----END ENCRYPTED PRIVATE KEY-----:\ 01C84780E9F341C7AC81703D1E1727D134E08DE7F80636F38284BC4EE3D55F95\ 9DA715879A564E46D8BF83F6D6AAC70B8A55F2825B2875DDAC312B90068B25A4\ 323A2BCC9079126838965F0F40261ACB7B0C4DD634C3B3E1F4DF71FB6A969F9C\ D0CA6860437AC97C10288B514EA51CCAB169A0E52C54C62133371C9DCDBB399D::\ A22AF2E3FDC9AD8215510CF6B55118A720DE36C84DE8CE00FA769325E03BB0CA\ 81BBD2960E834543443472E58754F9ECDE84D32B4F7CB2C2A5A14A60CA91C908\ 0D3AA675E56E53B2198627938C9B00ADAC3F07A50AB0622833F2DAD34C73D0EC\ 5717613E02A58936EEA60928C1A894C589FE4995607B1AF62C2BE8FD3E8ABB83:\ foofoofoo_bar # PBES2 encrypted (DES-EDE) -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIzgSAjcnspfUCAggA\ MBQGCCqGSIb3DQMHBAiupWhsYLF7rQSCAoC8ySMPx/GEUvnlb4pj/KjYaeyUJ7En\ 9jzyLKNhfP2L+aCLao3FRSXEz3UL/Bzqx15XW96xfADw+LOXbVfM+HDyDwTm8W33\ XQbjSyTCf+4hG+XZdzCppTo5jlGLv+3St6Tx/V4D4GbN7mZnO9tSHKim2qPzITE4\ PCiV1pzDkOFDz/BtOEqL4AQaelBHldyyTrsSBuBVk5iN20mZ5SiEA7bhSuyBxIYW\ QAqo2/M1JSvqXzXfgcLUNWG02ROmEc1hEvGIdZZAnjVHRUaC8oecTZlROCGyQ0ec\ 5HJt+hSVTtjVvVYRyR9k0Qn+E2tz1VBLFTxXdL2bD+vbGXhHUKLG0NM1Ks9Xea7s\ YHTGb1wvwxAGh9MoK4bWeEl14fDRIlDlEnHtt6CpF+hXhOcI1UU9MHDQhXqA6E5w\ +0FtnGMdxd/RgSkOvkvmMzTlbBGnA2W93R3Vv66iiDVIUO4DMAxOSlH4lZmn4kiG\ gXHIu2BpYiR/CaeKCGDW1L5Ii/T5gnxYz6rKE1NJihRlrCplGe3ip9Ra7K4h+yA4\ S3P2OuTjImCwBI1uL65vwnPLvdKuA6exGtI6eTyoyL3XN8Wt8LAXQwn1ijVNMXej\ f/9zQnrdkhgYwQU5yvCi5yi5ewGi+Lqfo4rxJV2lt2b2wDfHoUULFVpIHlpUsWnR\ aVIwa0t7S5gq/lFRxbnhsHBREJgZWP9kN1XHv8hrEcyedFO4aFj2J6I9GX1vvqrp\ F5o4a38RBjfmR8FDsH9Au7IvuuH/TUipBybgCbIUyvQADexibuthq5MI2lpmS53c\ vo6QOp6bwusFSPUE/qbDoW4lX9SWi3vF/RcQs1j7opsDbhqQk+G05h0R\ -----END ENCRYPTED PRIVATE KEY-----:\ 3BA94D8CC1749902F4599D63A527DACA74870714BC794813247D000DCF31BC57\ E285CE5A1236EFD1956723B800C3C19094185EAAD7C744DA4917E34D3DCE5FCE\ F4E6D797510B7A5BA67087ABBFB69FCEE5D8A98AD9A3D3B2AEE9876B9358562F\ 460A0D6C4B5D98E3D305D6B944832859CFB01072C6FCEB5D0558BA7D101458BD::\ 1185126E43C7B5F8D15523E65DAEEB6526CDCF2C8901DC7A1EC836C22CD4C344\ 1C24B16AC8ABC3E00A95C6BD03EBEC74DCA1EBD0DA6E61395452587B36DCD734\ 7184C9005177839FEDA5273007DD0AAC0E8C87A3EEA71F7DBEDDC7FDDD637A2D\ FCA2FA1215DE8C332ED4BA093B6443C65B32AF294D8A56A1BF8702C1B9086E36:\ foo # PBES2 encrypted (DES-EDE) -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBoTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQItEsDvV486kcCAggA\ AgEYMBQGCCqGSIb3DQMHBAgzfU6L9FUlJgSCAViXz0OqV1SBvbiF0sEH8GsMQJwB\ Q1RVEjyO8uncdbujalyVCeLukh/H0W0unlgceVMSdN7/nQBitkGkvLSoWRv9hYc/\ UlkCMcq4R3Fx2hLF6Yquq/DyBgF57LVyOpomRa/Kj8TYjfZkx3JXJnRsqjoLhTbH\ USzwv3DkKV5gljZqLTXdPAYFyWw28GAb+3iNfzwhudblH5JXaZ3X0GWSJEium0UC\ WPpvBGlNOUyoMFo44q100ywORYAWl/Cc7UNXWMFLQT773FypPsx+bcWpA6Lmx665\ POrVFb4rTh+AGX9f6Kp/yfgY1VJxuju55imTaHIHZUf6phAnwoTDI+UIZTw1IwHT\ JdYbYaxjEZglCx0u9wZT5J9IwQVKT7/eLjowV4GS8zDr/tlssDMixQboJ/dRmUYp\ jcwhnv36cThFx6GoqWMA7ShTVT//QDpvBbebuDOnlSmqq+5qmw==\ -----END ENCRYPTED PRIVATE KEY-----:\ 35489193F2E4B7B7FC7A52CB4A3AE2F7F97C02CBF43A60934CBD8AC221592666\ 92767C6C587BAE7B73E63EA470A07EA67927923FEC2ACDDB1ADDDAC75E8FFA15::\ 29772BC15B6095A66060CC76884B3E4C77A2330A880D9FE64B007C1DF792CBA5\ B3422F9BDDF51C48E567F114776566653A7F7DDDB8686BFCEBC94B224D7CB0B3:\ i_am_very_poor # PBES2 encrypted (DES) -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBnjBABgkqhkiG9w0BBQ0wMzAeBgkqhkiG9w0BBQwwEQQI9uqEGDMT/W0CAggA\ AgEIMBEGBSsOAwIHBAiMfWZMW3qofASCAVgcAhB3yW1aNLIQaoo+WlTe6IRLjKWF\ itkCW4/m6qJRvR0Yy5BTyDy5mD4QyOcVwvPGUPs6q5R+tjfbBb1orWttBDXvQn38\ OMD8qV7voCVlDgljidAtSLmHOHy1jq7gCeyKdyC3XEMX1RZa9NIS5/fyJtrcQKxd\ ktclLolFkiujbGH5i+LiRHWJBE8+9StxBdO+v0PE0FYR7vwxj05xKieg4UiKAVfp\ C3+iX5XpVqMI+FTqtz/+4sm51ZgGRpz3vmNRJWqh3VqDWiwN8/w53qceDfjmNm5T\ SfyA0K0dfSkaylprLFd666567HjDXGJlxtA4nM8N1yahRWMz/ufSd1u70dfN9l2L\ mjghOP+WWverl+Td1cNHRE7/rvkOuhwLJpC4rnZHA4rnIxzwcQmsapk8rsu0S3I4\ tdZEBhRZsoswIVQo030K6x9DZHMSIpghSc6BlMmu2Jbnew==\ -----END ENCRYPTED PRIVATE KEY-----:\ 35068206D5C287A47F95BD8ECD11E557D86EDDC993FCAD94F03D86C1BC97E2B2\ 68E637ED1A6B0EE459214E0F61099B74469AD36A3A37217182C42B0C48A4B413::\ 261D5A9298BE592400EE703BC27C2A16761F6C855607D9AA62A9B36307FC5100\ 6EEE06E59C55C9606FFBCF8DF74A98B5C9FBD17F0D7ABB867B4A7CB8DD5DC15D:\ give_me_$$$ # The first bunch are from an RSA DSI document [RSAES/EME1(SHA-1)] 10001:\ D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ 4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ 6628194E12073DB03BA94CDA9EF9532397D50DBA79B987004AFEFE34:\ 18B776EA21069D69776A33E96BAD48E1DDA0A5EF:\ 354FE67B4A126D5D35FE36C777791A3F7BA13DEF484E2D3908AFF722FAD468FB\ 21696DE95D0BE911C2D3174F8AFCC201035F7B6D8E69402DE5451618C21A535F\ A9D7BFC5B8DD9FC243F8CF927DB31322D6E881EAA91A996170E657A05A266426\ D98C88003F8477C1227094A0D9FA1E8C4024309CE1ECCCB5210035D47AC72E8A 10001:\ D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ 4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ D94AE0832E6445CE42331CB06D531A82B1DB4BAAD30F746DC916DF24D4E3C245\ 1FFF59A6423EB0E1D02D4FE646CF699DFD818C6E97B051:\ 2514DF4695755A67B288EAF4905C36EEC66FD2FD:\ 423736ED035F6026AF276C35C0B3741B365E5F76CA091B4E8C29E2F0BEFEE603\ 595AA8322D602D2E625E95EB81B2F1C9724E822ECA76DB8618CF09C5343503A4\ 360835B5903BC637E3879FB05E0EF32685D5AEC5067CD7CC96FE4B2670B6EAC3\ 066B1FCF5686B68589AAFB7D629B02D8F8625CA3833624D4800FB081B1CF94EB 10001:\ D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ 4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ 26521050844271:\ E4EC0982C2336F3A677F6A356174EB0CE887ABC2:\ 42CEE2617B1ECEA4DB3F4829386FBD61DAFBF038E180D837C96366DF24C097B4\ AB0FAC6BDF590D821C9F10642E681AD05B8D78B378C0F46CE2FAD63F74E0AD3D\ F06B075D7EB5F5636F8D403B9059CA761B5C62BB52AA45002EA70BAACE08DED2\ 43B9D8CBD62A68ADE265832B56564E43A6FA42ED199A099769742DF1539E8255 10001:\ 0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B3\ 38AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43:\ 012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46D\ B09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7:\ 8FF00CAA605C702830634D9A6C3D42C652B58CF1D92FEC570BEEE7:\ 8C407B5EC2899E5099C53E8CE793BF94E71B1782:\ 0181AF8922B9FCB4D79D92EBE19815992FC0C1439D8BCD491398A0F4AD3A329A\ 5BD9385560DB532683C8B7DA04E4B12AED6AACDF471C34C9CDA891ADDCC2DF34\ 56653AA6382E9AE59B54455257EB099D562BBE10453F2B6D13C59C02E10F1F8A\ BB5DA0D0570932DACF2D0901DB729D0FEFCC054E70968EA540C81B04BCAEFE720E 10001:\ 0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B3\ 38AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43:\ 012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46D\ B09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7:\ A7EB2A5036931D27D4E891326D99692FFADDA9BF7EFD3E34E622C4ADC085F721\ DFE885072C78A203B151739BE540FA8C153A10F00A:\ 9A7B3B0E708BD96F8190ECAB4FB9B2B3805A8156:\ 00A4578CBC176318A638FBA7D01DF15746AF44D4F6CD96D7E7C495CBF425B09C\ 649D32BF886DA48FBAF989A2117187CAFB1FB580317690E3CCD446920B7AF82B\ 31DB5804D87D01514ACBFA9156E782F867F6BED9449E0E9A2C09BCECC6AA0876\ 36965E34B3EC766F2FE2E43018A2FDDEB140616A0E9D82E5331024EE0652FC7641 10001:\ 0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B3\ 38AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43:\ 012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46D\ B09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7:\ 2EF2B066F854C33F3BDCBB5994A435E73D6C6C:\ EB3CEBBC4ADC16BB48E88C8AEC0E34AF7F427FD3:\ 00EBC5F5FDA77CFDAD3C83641A9025E77D72D8A6FB33A810F5950F8D74C73E8D\ 931E8634D86AB1246256AE07B6005B71B7F2FB98351218331CE69B8FFBDC9DA0\ 8BBC9C704F876DEB9DF9FC2EC065CAD87F9090B07ACC17AA7F997B27ACA48806\ E897F771D95141FE4526D8A5301B678627EFAB707FD40FBEBD6E792A25613E7AEC 10001:\ 0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B3\ 38AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43:\ 012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46D\ B09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7:\ 2D:B600CF3C2E506D7F16778C910D3A8B003EEE61D5:\ 018759FF1DF63B2792410562314416A8AEAF2AC634B46F940AB82D64DBF165EE\ E33011DA749D4BAB6E2FCD18129C9E49277D8453112B429A222A8471B0709939\ 98E758861C4D3F6D749D91C4290D332C7A4AB3F7EA35FF3A07D497C955FF0FFC\ 95006B62C6D296810D9BFAB024196C7934012C2DF978EF299ABA239940CBA10245 10001:\ 01BF01D216D73595CF0270C2BEB78D40A0D8447D31DA919A983F7EEA781B77D85F\ E371B3E9373E7B69217D3150A02D8958DE7FAD9D555160958B4454127E0E7EAF:\ 018D3399658166DB3829816D7B295416759E9C91987F5B2D8AECD63B04B48BD7B2\ FCF229BB7F8A6DC88BA13DD2E39AD55B6D1A06160708F9700BE80B8FD3744CE7:\ 087820B569E8FA8D:\ 8CED6B196290805790E909074015E6A20B0C4894:\ 026A0485D96AEBD96B4382085099B962E6A2BDEC3D90C8DB625E14372DE85E2D5B\ 7BAAB65C8FAF91BB5504FB495AFCE5C988B3F6A52E20E1D6CBD3566C5CD1F2B831\ 8BB542CC0EA25C4AAB9932AFA20760EADDEC784396A07EA0EF24D4E6F4D37E5052\ A7A31E146AA480A111BBE926401307E00F410033842B6D82FE5CE4DFAE80 10001:\ 01BF01D216D73595CF0270C2BEB78D40A0D8447D31DA919A983F7EEA781B77D85F\ E371B3E9373E7B69217D3150A02D8958DE7FAD9D555160958B4454127E0E7EAF:\ 018D3399658166DB3829816D7B295416759E9C91987F5B2D8AECD63B04B48BD7B2\ FCF229BB7F8A6DC88BA13DD2E39AD55B6D1A06160708F9700BE80B8FD3744CE7:\ 6CC641B6B61E6F963974DAD23A9013284EF1:\ 6E2979F52D6814A57D83B090054888F119A5B9A3:\ 02994C62AFD76F498BA1FD2CF642857FCA81F4373CB08F1CBAEE6F025C3B512B42\ C3E8779113476648039DBE0493F9246292FAC28950600E7C0F32EDF9C81B9DEC45\ C3BDE0CC8D8847590169907B7DC5991CEB29BB0714D613D96DF0F12EC5D8D3507C\ 8EE7AE78DD83F216FA61DE100363ACA48A7E914AE9F42DDFBE943B09D9A0 10001:\ 027458C19EC1636919E736C9AF25D609A51B8F561D19C6BF6943DD1EE1AB8A4A3F\ 232100BD40B88DECC6BA235548B6EF792A11C9DE823D0A7922C7095B6EBA5701:\ 0210EE9B33AB61716E27D251BD465F4B35A1A232E2DA00901C294BF22350CE490D\ 099F642B5375612DB63BA1F20386492BF04D34B3C22BCEB909D13441B53B5139:\ 4A86609534EE434A6CBCA3F7E962E76D455E3264C19F605F6E5FF6137C65C56D\ 7FB344CD52BC93374F3D166C9F0C6F9C506BAD19330972D2:\ 1CAC19CE993DEF55F98203F6852896C95CCCA1F3:\ 04CCE19614845E094152A3FE18E54E3330C44E5EFBC64AE16886CB1869014CC578\ 1B1F8F9E045384D0112A135CA0D12E9C88A8E4063416DEAAE3844F60D6E96FE155\ 145F4525B9A34431CA3766180F70E15A5E5D8E8B1A516FF870609F13F896935CED\ 188279A58ED13D07114277D75C6568607E0AB092FD803A223E4A8EE0B1A8 10001:\ 027458C19EC1636919E736C9AF25D609A51B8F561D19C6BF6943DD1EE1AB8A4A3F\ 232100BD40B88DECC6BA235548B6EF792A11C9DE823D0A7922C7095B6EBA5701:\ 0210EE9B33AB61716E27D251BD465F4B35A1A232E2DA00901C294BF22350CE490D\ 099F642B5375612DB63BA1F20386492BF04D34B3C22BCEB909D13441B53B5139:\ B0ADC4F3FE11DA59CE992773D9059943C03046497EE9D9F9A06DF1166DB46D98\ F58D27EC074C02EEE6CBE2449C8B9FC5080C5C3F4433092512EC46AA793743C8:\ F545D5897585E3DB71AA0CB8DA76C51D032AE963:\ 0097B698C6165645B303486FBF5A2A4479C0EE85889B541A6F0B858D6B6597B13B\ 854EB4F839AF03399A80D79BDA6578C841F90D645715B280D37143992DD186C80B\ 949B775CAE97370E4EC97443136C6DA484E970FFDB1323A20847821D3B18381DE1\ 3BB49AAEA66530C4A4B8271F3EAE172CD366E07E6636F1019D2A28AED15E 10001:\ 03B0D3962F6D17549CBFCA11294348DCF0E7E39F8C2BC6824F2164B606D687860D\ AE1E632393CFEDF513228229069E2F60E4ACD7E633A436063F82385F48993707:\ 02E4C32E2F517269B7072309F00C0E31365F7CE28B236B82912DF239ABF39572CF\ 0ED604B02982E53564C52D6A05397DE5C052A2FDDC141EF7189836346AEB331F:\ AF71A901E3A61D3132F0FC1FDB474F9EA6579257FFC24D164170145B3DBDE8:\ 44C92E283F77B9499C603D963660C87D2F939461:\ 036046A4A47D9ED3BA9A89139C105038EB7492B05A5D68BFD53ACCFF4597F7A686\ 51B47B4A4627D927E485EED7B4566420E8B409879E5D606EAE251D22A5DF799F79\ 20BFC117B992572A53B1263146BCEA03385CC5E853C9A101C8C3E1BDA31A519807\ 496C6CB5E5EFB408823A352B8FA0661FB664EFADD593DEB99FFF5ED000E5 10001:\ 03B0D3962F6D17549CBFCA11294348DCF0E7E39F8C2BC6824F2164B606D687860D\ AE1E632393CFEDF513228229069E2F60E4ACD7E633A436063F82385F48993707:\ 02E4C32E2F517269B7072309F00C0E31365F7CE28B236B82912DF239ABF39572CF\ 0ED604B02982E53564C52D6A05397DE5C052A2FDDC141EF7189836346AEB331F:\ 15C5B9EE1185:49FA45D3A78DD10DFD577399D1EB00AF7EED5513:\ 0812B76768EBCB642D040258E5F4441A018521BD96687E6C5E899FCD6C17588FF5\ 9A82CC8AE03A4B45B31299AF1788C329F7DCD285F8CF4CED82606B97612671A45B\ EDCA133442144D1617D114F802857F0F9D739751C57A3F9EE400912C61E2E6992B\ E031A43DD48FA6BA14EEF7C422B5EDC4E7AFA04FDD38F402D1C8BB719ABF 10001:\ 04A6CE8B7358DFA69BDCF742617005AFB5385F5F3A58A24EF74A22A8C05CB7CC38\ EBD4CC9D9A9D789A62CD0F60F0CB941D3423C9692EFA4FE3ADFF290C4749A38B:\ 0404C9A803371FEDB4C5BE39F3C00B009E5E08A63BE1E40035CDACA5011CC701CF\ 7EEBCB99F0FFE17CFD0A4BF7BEFD2DD536AC946DB797FDBC4ABE8F29349B91ED:\ 684E3038C5C041F7:\ 3BBC3BD6637DFE12846901029BF5B0C07103439C:\ 008E7A67CACFB5C4E24BEC7DEE149117F19598CE8C45808FEF88C608FF9CD6E6\ 95263B9A3C0AD4B8BA4C95238E96A8422B8535629C8D5382374479AD13FA3997\ 4B242F9A759EEAF9C83AD5A8CA18940A0162BA755876DF263F4BD50C6525C560\ 90267C1F0E09CE0899A0CF359E88120ABD9BF893445B3CAE77D3607359AE9A52F8 10001:\ 04A6CE8B7358DFA69BDCF742617005AFB5385F5F3A58A24EF74A22A8C05CB7CC38\ EBD4CC9D9A9D789A62CD0F60F0CB941D3423C9692EFA4FE3ADFF290C4749A38B:\ 0404C9A803371FEDB4C5BE39F3C00B009E5E08A63BE1E40035CDACA5011CC701CF\ 7EEBCB99F0FFE17CFD0A4BF7BEFD2DD536AC946DB797FDBC4ABE8F29349B91ED:\ 4046CA8BAA3347CA27F49E0D81F9CC1D71BE9BA517D4:\ DD0F6CFE415E88E5A469A51FBBA6DFD40ADB4384:\ 0630EEBCD2856C24F798806E41F9E67345EDA9CEDA386ACC9FACAEA1EEED06ACE5\ 83709718D9D169FADF414D5C76F92996833EF305B75B1E4B95F662A20FAEDC3BAE\ 0C4827A8BF8A88EDBD57EC203A27A841F02E43A615BAB1A8CAC0701DE34DEBDEF6\ 2A088089B55EC36EA7522FD3EC8D06B6A073E6DF833153BC0AEFD93BD1A3 10001:\ 0749262C111CD470EC2566E6B3732FC09329469AA19071D3B9C01906514C6F1D26\ BAA14BEAB0971C8B7E611A4F79009D6FEA776928CA25285B0DE3643D1A3F8C71:\ 06BC1E50E96C02BF636E9EEA8B899BBEBF7651DE77DD474C3E9BC23BAD8182B619\ 04C7D97DFBEBFB1E00108878B6E67E415391D67942C2B2BF9B4435F88B0CB023:\ 47AAE909:43DD09A07FF4CAC71CAA4632EE5E1C1DAEE4CD8F:\ 1688E4CE7794BBA6CB7014169ECD559CEDE2A30B56A52B68D9FE18CF1973EF97B2\ A03153951C755F6294AA49ADBDB55845AB6875FB3986C93ECF927962840D282F9E\ 54CE8B690F7C0CB8BBD73440D9571D1B16CD9260F9EAB4783CC482E5223DC60973\ 871783EC27B0AE0FD47732CBC286A173FC92B00FB4BA6824647CD93C85C1 10001:\ 0749262C111CD470EC2566E6B3732FC09329469AA19071D3B9C01906514C6F1D26\ BAA14BEAB0971C8B7E611A4F79009D6FEA776928CA25285B0DE3643D1A3F8C71:\ 06BC1E50E96C02BF636E9EEA8B899BBEBF7651DE77DD474C3E9BC23BAD8182B619\ 04C7D97DFBEBFB1E00108878B6E67E415391D67942C2B2BF9B4435F88B0CB023:\ D4738623DF223AA43843DF8467534C41D013E0C803C624E263666B239BDE40A5\ F29AEB8DE79E3DAA61DD0370F49BD4B013834B98212AEF6B1C5EE373B3CB:\ 7866314A6AD6F2B250A35941DB28F5864B585859:\ 0AB14C373AEB7D4328D0AAAD8C094D88B9EB098B95F21054A29082522BE7C27A31\ 2878B637917E3D819E6C3C568DB5D843802B06D51D9E98A2BE0BF40C031423B00E\ DFBFF8320EFB9171BD2044653A4CB9C5122F6C65E83CDA2EC3C126027A9C1A56BA\ 874D0FEA23F380B82CF240B8CF540004758C4C77D934157A74F3FC12BFAC 10001:\ 0A02EF8448D9FAD8BBD0D004C8C2AA9751EF9721C1B0D03236A54B0DF947CBAED5\ A255EE9E8E20D491EA1723FE094704A9762E88AFD16EBB5994412CA966DC4F9F:\ 092D362E7ED3A0BFD9E9FD0E6C0301B6DF29159CF50CC83B9B0CF4D6EEA71A61E0\ 02B46E0AE9F2DE62D25B5D7452D498B81C9AC6FC58593D4C3FB4F5D72DFBB0A9:\ 050B755E5E6880F7B9E9D692A74C37AAE449B31BFEA6DEFF83747A897F6C2C82\ 5BB1ADBF850A3C96994B5DE5B33CBC7D4A17913A7967:\ 7706FFCA1ECFB1EBEE2A55E5C6E24CD2797A4125:\ 09B3683D8A2EB0FB295B62ED1FB9290B714457B7825319F4647872AF889B304094\ 72020AD12912BF19B11D4819F49614824FFD84D09C0A17E7D17309D12919790410\ AA2995699F6A86DBE3242B5ACC23AF45691080D6B1AE810FB3E3057087F0970092\ CE00BE9562FF4053B6262CE0CAA93E13723D2E3A5BA075D45F0D61B54B61 10001:\ 0A02EF8448D9FAD8BBD0D004C8C2AA9751EF9721C1B0D03236A54B0DF947CBAED5\ A255EE9E8E20D491EA1723FE094704A9762E88AFD16EBB5994412CA966DC4F9F:\ 092D362E7ED3A0BFD9E9FD0E6C0301B6DF29159CF50CC83B9B0CF4D6EEA71A61E0\ 02B46E0AE9F2DE62D25B5D7452D498B81C9AC6FC58593D4C3FB4F5D72DFBB0A9:\ 8604AC56328C1AB5AD917861:EE06209073CCA026BB264E5185BF8C68B7739F86:\ 4BC89130A5B2DABB7C2FCF90EB5D0EAF9E681B7146A38F3173A3D9CFEC52EA9E0A\ 41932E648A9D69344C50DA763F51A03C95762131E8052254DCD2248CBA40FD3166\ 7786CE05A2B7B531AC9DAC9ED584A59B677C1A8AED8C5D15D68C05569E2BE780BF\ 7DB638FD2BFD2A85AB276860F3777338FCA989FFD743D13EE08E0CA9893F 10001:\ FC8D6C04BEC4EB9A8192CA7900CBE536E2E8B519DECF33B2459798C6909DF4F1\ 76DB7D23190FC72B8865A718AF895F1BCD9145298027423B605E70A47CF58390\ A8C3E88FC8C48E8B32E3DA210DFBE3E881EA5674B6A348C21E93F9E55EA65EFD:\ D200D45E788AACEA606A401D0460F87DD5C1027E12DC1A0D7586E8939D9CF789\ B40F51AC0442961DE7D21CC21E05C83155C1F2AA9193387CFDF956CB48D153BA\ 270406F9BBBA537D4987D9E2F9942D7A14CBFFFEA74FECDDA928D23E259F5EE1:\ F735FD55BA92592C3B52B8F9C4F69AAA1CBEF8FE88ADD095595412467F9CF4EC\ 0B896C59EDA16210E7549C8ABB10CDBC21A12EC9B6B5B8FD2F10399EB6:\ 8EC965F134A3EC9931E92A1CA0DC8169D5EA705C:\ 267BCD118ACAB1FC8BA81C85D73003CB8610FA55C1D97DA8D48A7C7F06896A4D\ B751AA284255B9D36AD65F37653D829F1B37F97B8001942545B2FC2C55A7376C\ A7A1BE4B1760C8E05A33E5AA2526B8D98E317088E7834C755B2A59B12631A182\ C05D5D43AB1779264F8456F515CE57DFDF512D5493DAB7B7338DC4B7D78DB9C0\ 91AC3BAF537A69FC7F549D979F0EFF9A94FDA4169BD4D1D19A69C99E33C3B554\ 90D501B39B1EDAE118FF6793A153261584D3A5F39F6E682E3D17C8CD1261FA72 10001:\ FC8D6C04BEC4EB9A8192CA7900CBE536E2E8B519DECF33B2459798C6909DF4F1\ 76DB7D23190FC72B8865A718AF895F1BCD9145298027423B605E70A47CF58390\ A8C3E88FC8C48E8B32E3DA210DFBE3E881EA5674B6A348C21E93F9E55EA65EFD:\ D200D45E788AACEA606A401D0460F87DD5C1027E12DC1A0D7586E8939D9CF789\ B40F51AC0442961DE7D21CC21E05C83155C1F2AA9193387CFDF956CB48D153BA\ 270406F9BBBA537D4987D9E2F9942D7A14CBFFFEA74FECDDA928D23E259F5EE1:\ 53E6E8C729D6F9C319DD317E74B0DB8E4CCCA25F3C8305746E137AC63A63EF37\ 39E7B595ABB96E8D55E54F7BD41AB433378FFB911D:\ FCBC421402E9ECABC6082AFA40BA5F26522C840E:\ 232AFBC927FA08C2F6A27B87D4A5CB09C07DC26FAE73D73A90558839F4FD66D2\ 81B87EC734BCE237BA166698ED829106A7DE6942CD6CDCE78FED8D2E4D81428E\ 66490D036264CEF92AF941D3E35055FE3981E14D29CBB9A4F67473063BAEC79A\ 1179F5A17C9C1832F2838FD7D5E59BB9659D56DCE8A019EDEF1BB3ACCC697CC6\ CC7A778F60A064C7F6F5D529C6210262E003DE583E81E3167B89971FB8C0E15D\ 44FFFEF89B53D8D64DD797D159B56D2B08EA5307EA12C241BD58D4EE278A1F2E 10001:\ ECF5AECD1E5515FFFACBD75A2816C6EBF49018CDFB4638E185D66A7396B6F809\ 0F8018C7FD95CC34B857DC17F0CC6516BB1346AB4D582CADAD7B4103352387B7\ 0338D084047C9D9539B6496204B3DD6EA442499207BEC01F964287FF6336C398\ 4658336846F56E46861881C10233D2176BF15A5E96DDC780BC868AA77D3CE769:\ BC46C464FC6AC4CA783B0EB08A3C841B772F7E9B2F28BABD588AE885E1A0C61E\ 4858A0FB25AC299990F35BE85164C259BA1175CDD7192707135184992B6C29B7\ 46DD0D2CABE142835F7D148CC161524B4A09946D48B828473F1CE76B6CB6886C\ 345C03E05F41D51B5C3A90A3F24073C7D74A4FE25D9CF21C75960F3FC3863183:\ BCDD190DA3B7D300DF9A06E22CAAE2A75F10C91FF667B7C16BDE8B53064A2649\ A94045C9:\ 5CACA6A0F764161A9684F85D92B6E0EF37CA8B65:\ 6318E9FB5C0D05E5307E1683436E903293AC4642358AAA223D7163013ABA87E2\ DFDA8E60C6860E29A1E92686163EA0B9175F329CA3B131A1EDD3A77759A8B97B\ AD6A4F8F4396F28CF6F39CA58112E48160D6E203DAA5856F3ACA5FFED577AF49\ 9408E3DFD233E3E604DBE34A9C4C9082DE65527CAC6331D29DC80E0508A0FA71\ 22E7F329F6CCA5CFA34D4D1DA417805457E008BEC549E478FF9E12A763C477D1\ 5BBB78F5B69BD57830FC2C4ED686D79BC72A95D85F88134C6B0AFE56A8CCFBC8\ 55828BB339BD17909CF1D70DE3335AE07039093E606D655365DE6550B872CD6D\ E1D440EE031B61945F629AD8A353B0D40939E96A3C450D2A8D5EEE9F678093C8 5:\ C7FBA2CB9FB24C6034C9E239E9350080AC8B9CB2DC8D428C5A1DA72767179679\ 1021093809F5F79052ACACA1EC1ED7E019818D8B2D417E8FC60812EE1A67992B:\ FD06033468C106ADBCAA26AC4B6BD24CF4919EA5EEB99458D6E3C758ED606D63\ 9AA3D3B0BC36CFCAEC3507AD0280BF6E9F9C3EBCF41A0B33A95CC6EEBBDD57EF:\ 7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ 1A025CC4A2C1B8488760786162C62EC677F6546F329D84E6EE0DA11379573D17\ 92526104BF637DE57807C4394C492919021DD81ADECE3530D8D2BC1802EC2E88\ A46C9C5E8FF11E34D7476530B7E11DE0236992DE293355494471223263664199\ 01CA2F27E4A996512BDC650D76280A54D1DE2BE17D6E59EE1D156745036D8DC5 11:\ EECFAE81B1B9B3C908810B10A1B5600199EB9F44AEF4FDA493B81A9E3D84F632\ 124EF0236E5D1E3B7E28FAE7AA040A2D5B252176459D1F397541BA2A58FB6599:\ C97FB1F027F453F6341233EAAAD1D9353F6C42D08866B1D05A0F2035028B9D86\ 9840B41666B42E92EA0DA3B43204B5CFCE3352524D0416A5A441E700AF461503:\ D436E99569FD32A7C8A05BBC90D32C49:\ AAFD12F659CAE63489B479E5076DDEC2F06CB58F:\ 1253E04DC0A5397BB44A7AB87E9BF2A039A33D1E996FC82A94CCD30074C95DF7\ 63722017069E5268DA5D1C0B4F872CF653C11DF82314A67968DFEAE28DEF04BB\ 6D84B1C31D654A1970E5783BD6EB96A024C2CA2F4A90FE9F2EF5C9C140E5BB48\ DA9536AD8700C84FC9130ADEA74E558D51A74DDF85D8B50DE96838D6063E0955 11:\ C078DF95FFF0FC15570627120760AE74601094E47D0C879075B1F1A3EC33B255\ 3490AB1484E588C18A62A166876C5FD1F9790C265CD5ECB5ADA8BE03D5ACE4DF:\ CDECBA049D6379CAF66158D85E5A1CA40ECFB849E832109B6E018DBE5F2DC8D8\ 63DDC8DF00D93BBAD5AA1EEEF896AEF694D253C11B806547D8F3621F6C0B7041:\ 7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ 40BD2CCDFEB88BDBF6AE80EE37045142EEBA60D51063335F6145BD30223A1635\ D18C4E67FAD80D158BFA711A6BBCCCE8980A171027083D2D4E6B7DA2C465ADDB\ D1F44350C51A9E03D808EB5784F0A3602B7E23903CE4530DF3D45829375E1113\ 7FCD639874F71E68742B9C145D21ADF4C4C8416B54AC4A01B25AB4CF1570CFBD 13:\ C975657B7786E7335EA9B72E0DFE6FA895F5F7CE9E559CED9E6C9960ECECFCC1\ EC9D515BD14849E798B4D699F7C2898B6C256A63EA5F33D2FD77A51232B722A3:\ D502E40CEA5B850C45E3BDE7E05EF0B13F4AE0DE9D93FCE969E5A119191785A6\ 3E5C181BD0CB3F440A1B519B3961B2FB519A8526BF29A3DA6DAC68261F70149B:\ 7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ 4B4B2F855CE4E8D5675589DE93335E31C1EC3ADA263855252DF49BD4836DBF29\ 3E07BE72C537B9C7685B38F7C838E067BC9172DF032C1F7AE337310A41A5F103\ B00E662E3F78E04C234825A3DA6D31CC84D591EF5E8FE970ECC2C0B23E280463\ 25D88534EC256FED8C501034F8017C771983A07EB60E396F97418AD903282B59 67:\ BEDC7B14D1A21178D999DAAF657792371C8E55D29DA042030BBCAF411D36FDD2\ F2A1F79DBEF6B61AF19A750562ED9C7A73386929951C9D330789504FB322C99B:\ DA9ACA1C011181903DD4C24863408D49E4E134283CE92C65C842B753FBFBA463\ 4024837D6C1C17C18254BD8CA696F85BFCEB2578BD41B2584F2F47D6B12C18F7:\ 7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ 11C86DA2269774A6F24161A81B25D913B1A8C9F7332D066F96AE896221BF0B30\ 63C2254FF1B082721C18BE2BC3F0B1E0CEC028D8CEF7C762E985A6C327ECEE03\ 6070B9BCA0E6E41EF72B8404C7874CBA08E2D05612D69D11DD14C1EA42E605A2\ 92AB1C5A19C2F0EF39441225C783BC573775A28857F8AEFFF4C7748C164C8A79 FFFB:\ C7479D7196291025D82523AC1840AAF09C3FF8844A444A9FED1C63996FD34566\ B75FB997746D175CB1B253C470AF4CBC5A0EB9969A85EF32A12C75053B8D7681:\ EC73649E669157A56375BEC8AA903491543605C6A55AA7E4C804A0A8854C1363\ 56485CF4595B5922FF408E2A364F19F8BA82D658CD179118227BAC50046802B1:\ 4920414D20534F20475245415421204920414D20534F20475245415421:\ 67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ B73D7477B95133222DF24ECE7F6FC3E183DC7378503F2DB0E95CCBCAD9134CB4\ 7F5CEBDBE94AB4063E473A5168CB7402E75B2423E5774FB328D2D463AB79D62D\ 46DBC2AE11382F90AB2D63CC061816991062C17B08FF6D29DB1F646C57BF122A\ 1F23017207DF6630B739134995B250260907096971F530E8006B06534A333974 11:\ FAEC2B060722051B29D1A7E1D3E060CE3CCBCB29CCFC68819F26BB7566B7C5BB\ D02C16C5A99E7F8EC22AA7050175DEA2C6C8939A24FBFD9015DA5C33C9E13985\ F6E788E3BB02771A4B273B4C9D376E8204E469EE1433CE4ADEE78FF6B0B96445\ 673D5A0CB10156647B5F0418CC47A3469C6D0027D6AAEBC402D2DDBA1DA5B693:\ D4795D21407AB236151E75957B45907F27BCFCDC38A0D9E322B1F2810FADA359\ 61527F1834B1909BDAFDD8D6B779C60694E36380BA45CFC786FD28C8310AEE62\ 30432FBA0996E87D22F7792D101EA4C171AAE38956762E3EDB2DCC8919BA0269\ F9CDE6B3D95F6D9EC93D22D118FCC837B2EE5990D6E84CB181D3416FCFFA9A23:\ 7730307421:67C6697351FF4AEC29CDBAABF2FBE3467CC254F8:\ 67114A6F725F764D578FFB44F36CEB3A2B51CDEB1183AEA7201337DF4D2F9A0E\ 7DADE80202AD35BE2C5A209E493D31437189B95C86B53EE4B849536F94782E03\ 35E1501978588A525192001D2D1B1C521A31F94ADC1A3119D50E07318246D352\ 61F44EB0C2677F0E358E486A82E2B971996C926474F3199A4686ABAE7AFE130F\ BF419FDB7B92CB69D8FCB7FD1536234C9B82409474F9968BF16CFBDFBB57EA34\ C01436A684B8C521A435462CB6A6EBDB5DA4D97AAD2662738810DBC40C2616D3\ 241D47085D53D92518BB24D26B2D7E8404ABE334E6C4848DEE793F0EB6B61ACA\ D0BAAFB220CB2C9ECBCF9667ACA41661B21E0A68E187DCBB39C3D7C5C31A7771 # These catch a bug in versions before 0.8.7 10001:\ D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ 4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ 54657374206F6620454D453120286F75745B305D3D3D6F75745B315D3D3D3029:\ 55BF28124E5DCC8B92E4419464AAD74B9D489259:\ 21154AF8EAAB2063615CE16397CB0AE8FA55C94D8DB6A1738F90CE17B1F2B77C\ 57A5E2B7D892FCE8715B950070C2AEDCC6972A5B06BB20607D948FE755E24EBC\ 408456375121DB3A0205F45030DC840EBFF0ED359449B670B3AB77B9E8167658\ DD73AE971C6B131F77C3A5143974393A2121F2F457146C7AA22DD56A7EEE86EB 10001:\ D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ 4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ 454D45313A20286F75745B302C312C325D3D3D3029:\ 825B0D7E7CCA6E1DE021437268D678C0CB8427D2:\ 039FB7DCBC3ED3DC57BF06055A269E47C00119FBF1F55FEF6E4174F9859C1BBE\ FC40B0A73E128FC5DF5DC6DA3C292BD13E428CB90A181983FA2383B092375B1B\ 66FB2263174CD75266AD03B1DA49FC5BF69ED911017ACB87FA405DC118E8EE69\ 26C7ADE4392802C8CBD26D7534B8347F9C6C40F7CB776857F45EFF31D6D17CA5 10001:\ D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ 4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ 454D45313A20286F75745B302C312C325D3D3D3029:\ 20A708C1E55F288CFAE84EE6A521D3268234673B:\ 80960E4DF6DBD44A685EF7175BDCC12A53EC5DB0C8CD2866D72C120274D0F525\ 88A71E97B449B65A9E0D36AF3A6C3437440163444EA9CC03C26FC52596576B54\ 67CAFB8F171A2156135FD8CE93F7BA2E1418A4646E977DE60B19F1E7140B28EF\ C241AB3068FD4F0B70332962F253D67B6FC41D60806D0E6B62A81C759C24F405 [RSAES_PKCS8/EME1(SHA-1)] -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIICoTAbBgkqhkiG9w0BBQMwDgQIvr4d1PWvUvsCAggABIICgHacnCUtLfHl6orN\ 3TlqanvKYD4NVYiXpM4lhPbOk43UDH4iR+uEXmoGbt6HCjDJuFLt8HNcxMO0jrrZ\ fjD14doLd5Byv8oldAKBHz4GHP2wGxb0l5vPqHE9WgDN/NKke35TJLuzkrV104K+\ hir+LhhwDsDCV71jqsVL7ld2+AxCKF8+1uC+uSOoD91tFAXPLt2BApqByMJ59OMQ\ MK5LKsTQJivywXSyQHVXVTCkJyx0jiChpr/ns+ABsZ7BVD8B+C2QTY4j9w4F80ms\ dJkdEmmiRtIIPZoHrLKisPjLWE2oBgMxwfgE0twL6LgjMPAKaXPX5z9rmD+is0D7\ BovbmCVNDLNvIB0z3ehP/EzP9V2WtPfpjwnKL746+Hy4h5bdt7pVUYjWiTxXpiAr\ twjm8R5OUseNYrsVf2mitm8VRF97egF9BTQ74kUDQPKvwDSfVxkaOPttfo7xB0j2\ GYRgXOsO/fosiafakBs3ARLJ7U8vjq2JtkTbKBtWvlJQmc3VHALZ64Ukt7epOlV3\ W+hE1Hd6YnAuzCQIgPW8TtJkcSeUbH2NtR1ZCY7hUnLmqbiLAVqNezmYg5HIKZIQ\ /IWMonvvrJimIRzz9F+EUIGM1JjgMrIIQ2zHIB8Hp0IhLNel+pWtSAZ/CDSTbOkP\ An63u+Btp0CNGaIYPBNkW3rN9rKSRn85QFAU54LKRrtY3agVJs8VCH/jU1nBNl+P\ pti1MKjJGAa8yCjn15jLBmS/PSRmLT04XwlDEuxBrfsAy8zScQkvMYLlVUj0JXJj\ uEsBmm2wi8aCsD7cylqyflyePKOSAlig88cmFGWR37nq2HP8Gfi6IrzSFcLFyeOi\ SJjGj3U=\ -----END ENCRYPTED PRIVATE KEY-----:\ B2207519BAFEA1FFA5561CE47F903CE59DA9FE82DA7D4C867A92F28F180D:\ FC0DBB14EEF2D2FBD6D75C7D920D96F5057C45DA:\ C1659606D25D6D3274B0380373D8F0F740EECFBE0E7C5AF20F22ADFE54063E0D\ B5AA23737992C216A66550E8B0D1730684588B1CA0FEAC63680A7EAC2EB6DD73\ EA5B2DFDFE2A41C47D28027E9400FD71A2A8109271993C629A39A9B006AA11AB\ E798FCB1297BCA3B42CE1BFCE817928DC3BDD7661BFB2CFEA5B1C2D02B48B821:\ ilikepie -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBgTAbBgkqhkiG9w0BBQMwDgQIeNQ67v0/C1QCAggABIIBYDTbkO1cl0ur+Osz\ kTIQYqsi+YChtwLeTE0HipSPbuvlsFI5eoQvKjaEZjSMjsZwT6hX9zVbaclDFu7o\ fOzrEwGSGXoquFzS0GfbtynnUhk1IAPviLRdesPFCrRWFByaTRC4y2G3zT0bopo+\ Q6as/Tk28V88dpN7qC0Q5GlAaPTzc2PAy9FGc4lnu71WGQQOVByZ4LFomBPez2F8\ S95H85Q0OZADlp+7gGUjUtlhZqlmn0b1OGNIsU9Ua4VntOFODr2AWMhoKpmZ2nNd\ 9Nc97uwP4jx1F8hfQP3/eRlG/FgYPX9FtVPAmKV8NA1QoBIIrfW0T8/JDnOYsxA1\ /EwyNoamD1UJ3xq0kHS9a6c1zU00l7fgc1Cn+qECu93FxAffVN/cpA/+QwQwNXhs\ ypmHWNSJuTUwx+MvjO/aEUAaGFN5HNwiwjOgoPecnSbHyPeyc7Fy6fVp6bjYuCJH\ gjnIOR4=\ -----END ENCRYPTED PRIVATE KEY-----:\ A3208DF23DFB014D257B4C3D7238A857AD:\ 0E151CD5DD9014F9BCE7BB3500D1E3A7EF3F36F8:\ 374FCFFE225903D58CE988FC469AF9B6D660A90A48FFB7DCE207888D871587D5\ 0494260231664CB03C18A427B04BED666770B503B6EF08632A00D9D03888B1A0:\ unguessable_password -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBgTAbBgkqhkiG9w0BBQMwDgQIfovX98csqwwCAggABIIBYA3nZapMLCVG6H+1\ GVg9ThDA2RPjb5bI24AU8UcRV08Tw81SMQmZ3BCFgcbUlcEAM8BlGfc3g4KbxSt0\ P8o0/ImCsZG4tcjQqw10CjQkG7Wg4WrKJ7wVUoKenR+9vPkzDtAFLctNqfWgbtmX\ hD/O0twe0NT3puypunDReKq0HRu4LnMnXBzSNg9FHFvW95KU3JX6Lk0Yt77Lb0nk\ 663We9Tdr5kQnONjai5Q9gPst8suI6K9miInimPWgPSyCVy8Yp9Epl660QOpS3P4\ mSg5ZPCT3pzcyKdSK/I1HfFSuXfP8+XYixjNHGjX3TZWl/x0g0EACowNlKQi63s2\ 9MRpBpMxu5Y/AhrpZ2GwUPQnFxmJXKOIXoSaTSzAW15QwfBGybB9F2goM3KM+xEY\ g177HF0JWHexJGbMurT8shUjwrxFb190hoHIUYsmVN2qRT4tFNsUYAGjDAE287SW\ YX8pFFg=\ -----END ENCRYPTED PRIVATE KEY-----:\ 8F6B78A9F0D0F35BEFD38B:25D6DBAA5DEA01099646C5DD25589A10C414B6AE:\ 0091AA69E80C2690C78B99D5BB71002BDF019B12CC6ED5F7ADB0D2AF7284D1E2F\ E14E372C71FEBBCE91309D7D18EC979DACCFE11799E31BEFF9B4D25D2B9DEF8DD:\ akira -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBgTAbBgkqhkiG9w0BBQMwDgQI4boeHBzsmTgCAggABIIBYNQg9WdcjfVuPIof\ D5/vhwOE3m3fxFqPmEeGf1m6729KiaVGuICWos3o0+rca6zGwulfUe++yARG4TW4\ Ug/kjQhYVBZ6C+0cU8HmkpyO7mNcOrIGLJVgYmfcZbIm5DKS4g8vdLLF+mC7ic3n\ ccBmbAN7JpPUjUiPVLlmNU691TajXdf0H14oKvmagjW9revy6KPrp9Hm0DkA5k9m\ eMc6CyVk5IUijwEQyl5kwgCZMvR1N5ojum+FS5/+m4oOOPlowypEWPJYIIrH8vqv\ bL/ZrBN1BsNKo2vkFvgs2AUJWhtuCdOI30HpVuI9t8crCZ2jHD1N+UdPQK474xhj\ 7/kTvM+LxAJm5ZKbcTJ8IlwVvEKvjN3+NPHpOIhThNI7IuBiLbljf5Q2hO68fUrL\ D+6blox9MfSfpObyHzAk1sz9TnglnwgszUnnQDnF0akbR0sjmAntr2J0SPQ04Ore\ GMrVEDI=\ -----END ENCRYPTED PRIVATE KEY-----:\ E729D4D596553F96AF:36FBC9529B999745EF9F19DF5A7C4E783013C661:\ 02A9176EF95FD74880B641C1E67367F3780B59456EBBDC05A4B6EEC3D3F8B8ED\ E063DD1E2300E24CFABF475C8F3BCCF987C043A9A839976ED7B3995752EB3A746B:\ It's my hobby, Sakura-chan -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBgTAbBgkqhkiG9w0BBQMwDgQIikN0UUeS0WcCAggABIIBYB5e4OfogtTUEoKL\ N1xxteoWJirrMjzmXFVbief3OhiPTrLLAHZxQFdvnljURvY3UTUCDAJsBwgVfQlt\ v0sYNdgxCv3seyb4f+MmDQKppHcaoPUfoE6R7J35lwE8eZs7S7sQIhA2loBuYrGf\ V7GJ1nr0zWzb+JfRoOypMWbt0f06PMfJGdjd9dWaiR01L8PAHwwNNNREtbobrGcc\ 9jrw3bUDwMW/hkJIIrrPbQ41OqIJsQ09x+1VVBqaqcS/dy9wnB6FmUT8xvGY8YMx\ ru23dTzd7ONBVWmhOq3Sov6o0i2eaFG8U656/L64qlw74lAUgJOVlZ8YNUEgaegc\ rOSDDAe04/Piddbq8wpgpkB3pqJzFkleNVSBfduZaQ5azdtgpNKahIneAPbltnKm\ hJVZ9OZImRKQaVOVZfqM5dJoohTrvTee+rT4n9O6/YcBgoP3QtTscPLSHyaQB8+A\ X2ppo4M=\ -----END ENCRYPTED PRIVATE KEY-----:\ 45A04558B8:6587ECBA1C8A7BA7C2A8B4DAE9D4076D85CAA2FE:\ 011F8E0F8A7FAF157D2C5938B137AE3A8A2158F9784E1F09E205A7C7C71505E7\ D50DB8E967B1CC637EDB766B12570328B7C7832DAE3F79C25D14F26DF0729F72\ 6C80:qwerty -----BEGIN PRIVATE KEY-----\ MIIB4QIBADANBgkqhkiG9w0BAQEFAASCAcswggHHAgEAAmEAsgsx0714GvWOspp9\ CrFOjZ+rSKi2q1nt22CJM/vGvtVr3wfCvaszroOths+vl8OzNFWJWXLQjYx6vsiX\ n5lcQyzeXW7Qd9VCRGoTwgd6aVvhHjfqEBttQVDJmFf+R1wrAgELAmBAvkCqFlo4\ WUsprIqPhkscOg+9VJ+EILOVl3e1z+suHw/0AtJzhBLLGJwxBbQ3L+N3a0aQYOwP\ uiYXuJbt7KzaKWnFP0XHzme+6X3zOGai7+2xM0CkIiAzNqdHJ49xneMCMQDkL4WP\ uwc4vo4biGjfjqqdb29RLR3JLZ+b3C9c0LZYlW7oA/L4zeaWs1TvobkCuWMCMQDH\ vwG8rUApjgPiBI+xv9ZNy4wt07LJMAVbi8oIW6nQsqSO5wVT764dxyilCXrMMJkC\ MHx3AwiUj5NQqpqnfwWTouGCmc8v4bONP8lg1AQUwI1oyCF2hIe2IK9Ki2tvfDAI\ BwIwNnnpM3URf7JeJl5VvB0L5qvgaZbTqzukXskIjep0IaUVm1ZHRW/pqwfFREhn\ TvX7AjA/Z/CkJNDAkHNUTW67+VzPRulGiW4+Lzs0f+laa/ZL9SizJ1nS+HtUeREG\ Ya7AO/g=\ -----END PRIVATE KEY-----:\ F5BF1834145D40D0A09D6331204035F76EB7DC981734E09CD1D755B46484675A\ 447F8E58DDCE287D6B8CAE8BCCE3833A9A5F:\ C91DFAC04EBDD389B0A172520B3D189C6E19FDFB:\ 75CBD6ABBDDA5A8DF4470955E212778FD872B0816E659C42F9D796A48ED86EAE\ FFAE39EB4D25A218A5EB6252DAC6A73DA23B35D967286C673FC9A603AC9B2803\ A8F75BAA72A22A3601FC0A1AD9923CF8A75B749126E2C98BD3AEB4EE2FE3452F # The actual (internal) name is PKCS1v15, so test out the aliasing code. [RSAES/EME-PKCS1-v1_5] 5:\ DA8D6D0AE1B959B8A446CE3807F195BC6737491490206535AC8F85E5D6E5C18F:\ F74FE3F3CFC5BDF517A50A887676E7CC2D20C509758B7657ACAB73DFDD581D07:\ 426C696E672D426C696E672E:\ C66FF974AC57FF20D15AADF04D472ECF48F945F50945822FDA962591C160072A\ AFAC9AB61302ABAD458A2528D610C73DCD:\ 11F10A948BAE2ED28555EE8B36028C8AE3001E8AE76DA4567A59DD59EE8B490E\ 54617009CF6E346360BE39E22B432DD7B50F0C41BEB1A6DF655E486FD5D822AA C3E9:\ B90114E3BA96AD3076C08F63255E07A6BA0F46C0EC9332EB9081EA81100FFF2E\ D3F886DB2DE1CE4F01ABD44D477DA8E61B66C65A9FB666B1CA8F79FC7B3EF25F:\ E67921A8F5C8C04169E8CCEDE6EE147CB3B1E139BFA6CB6789E24238CBBA10AD\ 522B4BBA6F3B3138C7B038856F01C3735B2B61FDB18A47DB57D5B4B5B52B6E77:\ 426C696E672D426C696E672E:\ 8D4557C36F53ECB344131ADE3F85684BD10DCE1B84BB9B95A8AAF565D73283C4\ 46251D7FAFAF6C84FB216C627EEBEBD0F38C0E4C2849BB5FD95E453C9F4729E8\ B54E0AA5700EA7ED197A0A64DA43AA33A0D232ED403F2DD5C519FD070242DBA4\ 6FAA023D4FCA255AABB85A9AEC28DB83A6:\ 9642171747FA6A731DF3D17AE28EC0AA0FB8E4046CDC0170335610B1FEBA9673\ 8E4A7FB6BD7761A035B41161696A2270AD429C09980005307A6F154B65F6CCAE\ 0C7C9CC1FC2E61BB52B5AE4AB41618023B673201D14C83DFADFDCB21BC7EF65F\ CB497A7625E324F1ABE70B045D465051C4668A02B5F38F25606FACFAF62296FD 11:\ F233C84BB80BD0BCA772A629AFAE474650A81C10B863747364DF21776B1ED919\ 39FE9011E45B6C317F7C913F1A2E9395797C2E778FB97A0B1F57AEF663213557:\ FB5B0E26BDD59E3494998727361831FDEC1715C0DB65E0FFF318A2BE9B33993B\ 76984F868CA9179807F29C1DE6C5489C1D43C76BBB7959BBF85922016BCECC43:\ 4C65742773206F7665727468726F772074686520676F7665726E6D656E742120\ 286D616B65207375726520746F20656E6372797074207374756666206C696B65\ 207468617429:\ 2D76481668E437FBFD3DF446DF2BC5F7F0EAA857CB913E739D5CDB6042D32ACD\ BD332E5A99EDD3B4B210FC2937440EF8EDA3EEDE33D7B7:\ 7B8F8AAC5BBC997CD4A1DE682FBB96AC8E80C6FC2102B1E7926D9AAD97BC10A4\ 6F981BE12F8F1B51F9A9E1F8D8B7AED9CC42F2AC0420368341D994D942071766\ 79B5F2187FB6BD8F962B678CC379009D0A82ABB9933093371B71C6CDECEED957\ EE08962B0A94C7DCF40325E5CE38C61C81D327AAE5E140F345597EE7774B8A11 11:\ C768A0691EA020997054C37D371440D61BBE79DA842AB00DB0FED730D00BEFB7\ A466BEFED1BD928211E7E3F56B59A275135C80EF31B6F7348EAA7887E798FE41:\ E12F3186A97838D1D57671508F249E538C85DCFD34CFEC3A98DF3A16C9559408\ 5A7F706FBAD2ABB69D654BDF2EF64C11A0B20CF70BA9AF62E416031C090F6D8B:\ 57616E7465643A20437574652063727970746F2067726F757069652E20507265\ 66657261626C792066656D616C652E:\ 22FA636CF24BFC2DAA1ED4FFA8D8D65370A45AD16A24454A2132ABA993A935B6\ EAF3932BF7AFCC89CCE080CC4AD06914148C164C659A24468DAC947B73BE7B5B\ 09FC516E16EF7E89AE02F590EC23:\ A0DF6D9AB85D31C7AF2E9748005C10E245A25987BA91990046FAD410E9640CE9\ DDB51D11E8A05423D80CA8AEA69AA08A42D58AC8609B0D1390F4FBB6E48EE8D4\ FB031A13CBA1050240E1CB5C03793CA0ECBCD543718B3DF51F6ED411512ACE95\ FACCEF2A127D731AC0E25A47722C07FFD1A1DD5DFE0B1EEF6EDEB3C8C654AAD4 1300D:\ E8E314B7ECD4CEDE513D6E229A3A3A0E1D0DAF974ABDA9997E1978972FD0863A\ FFD6259861CFC26F136DEBD1ED9CB227E091823C21DD79B57E8ECF67B9293113:\ CE47F1506E6DDA70A95A6EC56E34B9F3F929D15C92DD4AC537162C6E3BD6C4EB\ FD3C51D08BA61216685A333062EBABA4B5E647C81550C7FBE132A1D48D7EF00D:\ 486F7720646F2049206C6F766520746865653F20204D7920616363756D756C61\ 746F72206F766572666C6F77732E:\ 25B8D6560A33737B64EE77A02D5A3BA53F0F165468CCB98E7DBC6DFFA4C29033\ A209E8B6821A3A7CF9EE89C02B42CD25F62FAFCE56B80E703897A3299F78520B\ A251DAC421CC5A0B52E0E4B15FBB1E:\ 5A188A2132B9331B1072BCEA281DAE53070C0AAB0722D583BC7FE767BC85443B\ 5E36286AC568246781792CE04FCEA86D26124F14F3E8ADB69CF1E8A0A1D86E3E\ 0AC0F141C18CCA5F1B8228AC2996E81938B6593F37A603A41128D4CC0D453610\ 42B5F86539BDBAC1B1867E4FE351F599E955B452F675B0945093FE8310A70C9F 13271:\ D4AA40364C695FC262073498EAE363EAE585720A8AA211D37CC2BB74ABDAE7A8\ B6D9C55D5D8E3A0E4D3B39D57D543E8A17F697FBBD45E32EC53B9240188F7EF5:\ D4420A0041902AFD838833F2EF3AD89AFCF3EF66CA5B20036692BDC45FF861B2\ 0BE756CE35DCEC97A7BDD28DBBC09315E5B7E0249E61772436CA728C7639A8B5:\ 5768617465766572206F63637572732066726F6D206C6F766520697320616C77\ 617973206265796F6E6420676F6F6420616E64206576696C2E:\ 25C23B57F9C9E9A3A2C08F3320214F5365B1A70417F5A6AFDAEFDCF76D4CCA56\ 3D9F9625E2BA783733DE9691108973AF66BDE07A7E8854035B972387BEEA4DBD\ 4A2081CF:\ 985B3B945917B229B8274441C174B1748627F6A83986AAE295745694174928AF\ 8D6E3D309A8FDEB57F3BFB73AF2B776D13278028E7A7CFDD3F489AD3A46B2045\ 409683AABDD1C01CDF60ED850D4C918608ABC5B58C9BE3A438DB0D6D6B9C1019\ C9498E17233D5092165471B0A1DAECE0A68104539FB85C51648176E8B7AEC1B4 1A11:\ 32A4716E0F397B9340565530800F691F9E457C2C5F8ABF0A8F62971B89B43584\ EFCD7EF66765E8BF6B84163D914364F855DF8F6C82DD49BEF76EDB1397257215:\ 360C8C90CA0B2216B342A9681EEF05BB8CF8DE2AB8F0997C97738AA32B88B956\ D94515E35FE96238974AE8A8F0164E0FBE25C1161D7A1E9D170B821FEAD5A3CD:\ 4772617669746174696F6E2063616E6E6F742062652068656C6420726573706F\ 6E7369626C6520666F722070656F706C652066616C6C696E6720696E206C6F76\ 652E20202D2D20416C626572742045696E737465696E:\ DADE975E4B9FCE8E3010EB1568FFDF1BCDED9A454796A0DFA6F793093A2FBE25\ 813FC6EADC4225:\ 06DE6646853E49A067C85492FCA580E49D286981CCFDC4E13B5642489CC19E80\ 3A69116BC2D75CD005B768F3FE7AA780BF7E5A2A3EA53085619946DB4B3E9DB7\ 592A8D060CDF185B3AB2C1BD551587EA8AC3745FEF60D945387B27C2001CF7A9\ EAE9A086AA58B769A59CC4D09BCF9E100ED630EE44889F341C8DCCF52F003CF1 [RSAES_PKCS8/EME-PKCS1-v1_5] -----BEGIN PRIVATE KEY-----\ MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAt1wZLCQfj0PUKyhr\ fWhKMm1DnCH+sT6xKHwPiyH1UTbaMaXjoKLKdfwK42UwDgJHGcSfQ9/ZYjj97o8P\ 8YiBSwIBAwJAej1mHW1qX4KNchryU5rcIZ4tEsFUdinLcFK1B2v44M4Z6+AwBTtS\ Kb4KbbDsY3vruqonUnKa/wxxIhzZdero+wIhAO59Gs349up2k0gUJhwl+ght6JOs\ cjb84p4QGQfob0EvAiEAxNK6zZ/S5MDLsyq1sVLOXRPc0JvBuebDtitKwdg44qUC\ IQCe/hHepfnxpGIwDW69bqawSUW3yEwkqJcUCrtamvTWHwIhAIM3JzO/4e3V3SIc\ eSDh3ui36IsSgSaZ187Hhyvle0HDAiEAmIKQMDlgg/7bJV+gm28s7qMpWyFfT+HI\ oGFH/wROJlI=\ -----END PRIVATE KEY-----:\ A7AAF7FC80A74D35A163A575173A094DB366949207150DBFFF1D0B9DB01A43:\ 77BA577E606EF4A69F7C66726923ECDAB4EFF065BCAB972AD9EEF7478C09:\ AF1F80B3057046EDE4EB139FE4954141350325E0D8291D1431F73FB601F57DA6\ 05D986965EC3B141E7BD467108EC29003C7F56315E11FA89708588B7A562A738 -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBgTAbBgkqhkiG9w0BBQMwDgQIndH0S5IM+YwCAggABIIBYPxUf3adJCBZMSwg\ whFKB9mFbB++xWg9UxkyZwpUsqReJMloMmtyYqGhAVvR753CWAkSi/l4cUK9hwnO\ zs0vbQcU8MfwihHed61SwDqVHN2gp76KwdFtXKAsPlQ2WHBp2azO4VySxIYu8yMr\ zpl5o6dnKqX9p0m38OcuMOvWiWjUbPdtNKPP9/t9xUY2dYdxoOJ02h2dWRH1bYth\ jXFD5Zf0dgv958tcsUvCd6Omn6zyYvm0k0j8XFr3btJN6msWALYadCN7QrrJDsZL\ eKD+a5eu3AYHA7Kk4or3AAKGH4LfDN/JsFe+Z9PO1xdxwwEf75mJbOyG4LQWkDP9\ +pUPkPY311fcblEOx9Vin5c3is/+QnackDvnKjwU7JhP7mLHk5sRwDVswN1DPA+c\ mlC3M8/Bib94M3ts/U6EjE4r+JW3/bVsVslKelJ2zOEiqt9HK+wZBb38NgGWwrBZ\ 7Ik3umA=\ -----END ENCRYPTED PRIVATE KEY-----:\ 6ECA65B7FDB0986062B70E8C68171DCAF736:A83BC3A6BA075EDE453B7338CEE\ 83BB8F5AE8B5968E3A99462181DC4E73F943B66E433F43D0E8E6F08DA14:\ 1346A7E48F0ED39B333041451A0A293DBD8E1C906B21200A1AAC228DB8C9FC0A\ 9A24DD2B434E2279051106BD625AE24DD1554704E57EC48D659AA3E9515D2B41:\ password -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBgTAbBgkqhkiG9w0BBQMwDgQIjb2KJZiMO9cCAggABIIBYHQXbyKPzgfuHZYm\ b81zMQ7Kk4w5O+3XrNpFjSiRppkx3stZphGJ6vtI6NwDKb7mCf7arfeCzMIiF+gg\ n4j27huU1KRl8SRSD9qaLaqrYrHOCpxnG3owavB8LtWacGQq3tD1/pyw/DXM/H3F\ bdOd4q2ByvvltRAREy+0PjAwRaGBCdF3bEUP+ikIZ1zUUAhGalil1H8pPTf+8W04\ /4NvlCyhWPqNwUEZJhFzzO1IRrAWSvn0PZAg0CHsNGHVwCRGB5/MfdEvvn6D31V2\ wDFR/BzgNmPo7jFo7x83C/RRP/HCHHMhfTg3LHxehf1oCGI65Pj04PyHkYSNmyXz\ QbQoP/Z6cTcbC250Q/2AT0xPamF9eAnhAcvu8QRq7M7wQQtW1z2+B/kvA5mf2020\ 4mGslEX3Iz08lZcdMwghw0xwVBZW+VCB1y07JXE8KxAhlsEj6aIbwg0KBM+d+npX\ Ddyijnc=\ -----END ENCRYPTED PRIVATE KEY-----:\ 64E8425A6B898502A081B6B78A0546F4BF2DEB85E187ED:57893B2A6A4AA7863\ 785AB8FFA68E81F3239BDA659E704833319DF5E3377AEC911AA90F205B1:\ 871A94A51ED756EAD36EE976354D2D6DE467CA5B8C9D198FAFA6D5B24BFA674A\ 20F89CF53B85F75F7E17481E212F2BF543AEC428B841C79E3E36CFD75BB7CA8D:\ pkcsv15_isnt_very_secure -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBgTAbBgkqhkiG9w0BBQMwDgQIbcPIyX5hozwCAggABIIBYIL0VCCWjld4Zk1N\ 0s3+Uec+axsZm1cuOEm6KKqiSDUPA5bIwWJFTksEWqEfspq6VkQVGGD95hQY4a7u\ PflXcQ2PcFeTe5vvKNcQ/5lnSY56gidhFIHYEUQMPXjzkruxzbnLMBN5Cc4oFf15\ YnF4B3uZjsb9e0k7hb1h7lSbf1/Y2du1xdbhvXhF3q/uoCsrnxeGnjKIwesA9skS\ U8gdojj96STbZl78HZ9vbS+RP9Dtg73qCQkeWnMz4pES9GZ1u9HJ7Q/D4sU/NaOq\ Gg5y/WW1oNqI6Q8hTtat6oWE0pBnD5q8xuovlycEk9PJbh/b4waGh5Lc/CFUV75b\ gxAbqn9OIzeXVZsKnHU+JQpgX3x/3+dGHKGd54w1N/0a+N8YUNyYXxyDlU7f4zNp\ fuc2uwzfxFm4spigfxTTul+E90SMMZOIVHSp58cakq+ibeprcp2zMJcxO2EpXfas\ GfgFhK0=\ -----END ENCRYPTED PRIVATE KEY-----:\ 1548C7CEC500A26A59D493176E3B6ECECDC23FFBC485D75E4E20C978AD14F9C2\ 5CC19021C1328B1A061E317559A04326628222:66832C587BB0FC43A7380A:\ 022092438BAB2CF4A6C50D71EE39419E2E11C9E9644E0B9C2221EF81098FE318\ 8E9BE0E6E27C02A742571C0BD757C6B7F2160DCFA9A734AB6E90BDB0EF27DCD567:\ whereismymind [RSASSA/EMSA1(SHA-1)] 5:\ BE88E0EF4EC64120FBD9E0CC62E931D0DCB02D7FBC59FC6B\ 3E919777E5178DA0E1C83696670F02DF3166D8ACB5B09A15:\ EC1C473C7D3ED0B090C7DEC82343B1E3C5E6018947DC6820\ 17941BA4754715A8599D779A340FD85FC6613A1757D5B51B:\ 4920686F70652049276C6C2062652061626C6520746F2066\ 696E6420776F726B20746869732073756D6D6572::\ 9F35898F6508FB66FBF266C8D057F4FA9FB875213FA62051AFC62ABA177D42F4\ B37FBC6F7236B01F27C1A856EA2F8CBDF88AD9FB4FEFDE0065BB7FE6F8978225\ 074A8F220C3D328C50070A953BB4E852B3F56E84594CD289A14F8F8717F5A4D1 4F:\ F1066D3E8128C009B795BBC5AC0988D73A981C108E631AC43424D63E6C964FDE\ 6B0E331D4A1FE6CEF3B744607723F4BDB1F9683D69651813AC03C757ED2412A1:\ C00F576BC6CD63F75ECA04FB7FA5CABCC3287CBCBF99EC456CB75E9F56E2D20A\ 7F8C99BE857FA9E819BFE02C08D0405CC5045BB97C3F766F734390D881B27DEB:\ 447564652C2077686572652773206D79206361723F::\ AD50D554C24FDE2B4D312C64D17B25F471C32CF76E54430BE37CAD31E6C961C3\ 4957AB1B4D1D2AC6782B4A979118CF7FE58BA40FB0900C2C2F5BFF26134C9489\ 136EC16EFA0E82A9B01F1C6AE744E4D4C4D126FC6466AEBA86353E83D69065AB\ A220F460AD4AE3AB3083732290FED091D4675864EBA47B0DCB7C858264574360 [RSASSA/EMSA2(SHA-1)] 11:\ BEFBF638255034EFF995CF15A610243A48784CEFB89CF10A11982F5ADFA0C5F2\ 49B373E33900A1A4A957F38A1EBFD49C4C74A2D7E74EEF2168F18424C6B6A843:\ E538D5D8FE4A5800F16398B7732FCDCBBA9D397A8E77A67204458F0A89F13BEC\ 8AADE35E2346F489FF7005398596BA8A496D48D114BDBCC6D9CE292EE6ED7C93:\ 447564652C2077686572652773206D79206361723F::\ 4B9BE36BE0AAACC62FFA857A34D8032BE865C0D757C7A7827AD5D5C6DF6C5FD6\ FD32A2EB0E851A0D04258FDBB94849CA2AD78FFA2CCC56070219B8AC198D0F98\ 165956D027A6D0325619B8C1458F01EC6A34DA517D89F3F3046AED0F169A2797\ 442FB6E586C6099B7CBE4F07682ACF751E291123AC5DF312088A9D84A54A7D54 # An official IEEE 1363 test vector, sort of. The vector in question is using # the RSA2 signing primitives, where the output is "modulus - signature" if # signature is greater than modulus/2. So we just use the intermediate result, # since Botan doesn't support the RSA2 scheme 3:\ D8CD81F035EC57EFE822955149D3BFF70C53520D769D6D76646C7A792E16EBD8\ 9FE6FC5B606B56F63EB11317A8DCCDF203650EF28D0CB9A6D2B2619C52480F51:\ CC1092495D867E64065DEE3E7955F2EBC7D47A2D7C9953388F97DDDC3E1CA19C\ 35CA659EDC3D6C08F64068EAFEDBD91127F9CB7EDC1748711B624E30B857CAAD:\ 616263::\ A6B496F4A802AF9092F1F561931D84DBD0B943EF34C102B94DD51AB01E1054BC\ 0E0572A1FB2DB034569883F382B74E449F6C80C4060FBC0FFBD3A9CA9D66685B\ 90873007D207C1D64C692D0111157BB976A4551E72DDC83C767A9D75A4746C51\ 9B73CE52C2BFBD1C3C431D254FE8BB4308FEA486787F239FD2944390DA49DE45 [RSASSA/EMSA2(SHA-224)] 10001:\ FBB75326D3DC76F89BB46C6D66A8CE0F0E2167309750D5CA6158BF7306DA8C6ED2D0E9D62524\ 8977ED06900A5C23CC1F:\ D92E794F850892F13B6CBBCE1C67E1C670ACF8DCF8DEEA2DF958529C1CF5D89E30D5D05787A2\ 5602AAFFA5B5007800B3:\ 7072696F6E636F7270::\ 0EEA6057C2FE9892BE77B7A7E38E00EF2537D4E8EE7F2B856CBD4B29C7B5E38299D02B2A8459\ 91C2A8F4AC6BFA5E58A34139716B20CDD27471F549037D07DB76A02C3372AE2FAFDA3BF1414E\ 9BFF71C0DFA03AA0409D62CC9D5FEEAA7B42D52A 10001:\ D620C17FD01B4B8986B2C4934F2B78CF9EA43B862D70AB88763E2B133D7398E4E6633D8DD408\ 05D02EC5F2E59C0EB19A85B87D2F2EBFEB2E8189B2E21C71368D:\ E0B20464041EC9EC74FE86CC00D7191A1F6730E05C80ECE6B7714CE158ED72BDF3215D96E3E8\ ADDB4D8123B6006509362BE8B2EFC853C959AAB0D21C09A2B835:\ 7072696F6E636F7270::\ A10AD2439FA7F9638298CAD2E8BD18830A580555F0D0A71CB2DAAB2392ED61FB6C3659FA706D\ 434C7F373761165580D9E3B4B72423AE3C27F71C53DE3DD812BB064C3F52A86C2C5E42BA10BA\ F4C90E2064D988B56C59186B48D16B151FFDA0859FE41C585D388884EBF6B2E570A69F5EF5B5\ D96E005BF353076662F7697DEA3A 10001:\ E3BAAE58893F9DEE6CFF0F0551AE0C95B1E8EC0F3F7C9E271C6DB3D84A24EB37FF785425FE90\ 6D9B9A4905CCAAA6CB95658635FB58BAA6691383DBFC3B05E403:\ CEE7816F245FE20C99EB54A067340ED98A2003958186E78E2F9BAC8242E6F894FAA2726374E8\ 86CB3B718399BF5DA67B2558E086993897BEF2F6C580C7E04201:\ 7072696F6E636F7270::\ 85EFECF3B1EEB4386A61AA4AB0D0A4335F64C56C24C258AECEE4CA8547638F52858FFB7842EA\ 399E3EC97C882891E9B52A76D3A4B76BBB843D6165EF06181BC887B342900C0EDFD42EC35596\ 7AD052A76A760EF2130499A24FD9A059C79C334C586AB44C400278C5DEA17BFA9CC5127CBF39\ 2DC74B65458627A34437A8AE9FDE 10001:\ FA1CAC0BF58B08369A927D3B2FDE1C1F926A2EA31F26C2AA49EBA42DFBB8661E79660928D476\ D5F82D0C370BD6514F492A8D4AA95039B0E5D1E5512E257532A0AC6BE1C294F75253A2B2255C\ 7B7A84EC7D0E0A34BD67CED0E9BCC1897B3D4897:\ F6366AEBC742DA02A8B5884B0AF4A0DC24F8A7652D1F30E5A176C8ABEE3AC5527429EC62A3C1\ 6715A782D4BE9B8C40721909F4B5D466836050C637479DAE39528DC284ADADEB0471FFAB90F2\ 368784977B8F21F53BFFBD4D065DBDC19CBED061:\ 7072696F6E636F7270::\ 7F721D5DD07950287F217BC11C130E32567BD45E538A1FAD278CF25A66150448B486BCDBFC4A\ D3FB81A4EFC7E6081DC6613982940D1149C514AF67351B9E096C8977B5F9776BFEC7CD70C56C\ 666C49BFE9618F4ACF281F6CFC3B2F5B91BD7CE3DBBE643EF0B5BE9CB133CD3C22A2355CE87B\ 10E538A4AD3A098CC7E7125409765F22B5D78D5F3F0603EE6721C68C2D5F22C84B7714067BDF\ 28B82091CD1B9943F9D619F501F5C0D418425B63AB2BE2DB5A43BF8455E6ADB7B60C86C606699D69 [RSASSA/EMSA2(SHA-256)] 10001:\ EFBF3A50D1165B053F78FF95134BA3AE221F7ED5E7037675B633557899978B154F1E4A505E3A\ 3A10247FD4FC3F8698B7:\ CA052EDE74D1308CE00551FD8E9DE9BC5F9DAD3ABFB6EDF14820480D3FB9E468A02DFF23B6D0\ C0E009544091CEC9108B:\ 7072696F6E636F7270::\ 38FBB52FF41301D176F11DD6A536AEC2161DD783C455556CCFD51468292C8C68AEE955EE4947\ DFCE5D090A5DC81A7ED925623DE7C52A4872303002CD89A7A63798F29D13337274AE0F59886A\ 62EE58FDF73CFA29DD7B1BF4CA8A23B803B68E67 10001:\ CCEAD3D62F90C7E9F3E8E59F8989C4FFDD4921D7B6A2309B967CADB0B844362D4FC9A23A8ED2\ 8DFBF908A87FB04D880D7C1B68B8AA0B7CB5CD46656328189AFF:\ CD9F8E596AF2C90F2811086F8D3AD8EB35E83593CCC09ECD57874DC98EF5120CA2F8EEE1FE73\ 1220578CDFD5CB31D019825904D8FB7811CA99C017C1963E1D4B:\ 7072696F6E636F7270::\ 1891F9604BC85FCE085AEC5C8221D0E06119A5B1E1D399764CEF9BC732F01A3C4A29D31FEA49\ 72EFCFA749A900CC8FD1238EAA90B7B04F0A092BBC90E5C01B5B6F7022193290CD2237F6509F\ 84150D542842BA98157D1C69C067DB357F52013632F6961533D7672D05394E76C219EF532ED1\ BBAD1A5AC7AF5A0CE36C1173A8E1 10001:\ CC1D8027CE1F5163B3D5DC6DCC63DD14E5685894437A1A8734CC4AA4EE5CC8BFF96298D4FCBD\ 2208C17C3A069D0B4E1EE6B43A553DDBECB2ABCAB7F0CFA9CE01:\ EDFFF64FC3E0CBAD1F36B472E868B0317DEEF27854D40179FC875DCE1C5CE3D3BADE0AFD191E\ 4661B5931844C56C53E53409B824DE0EC24E2C7C04508F022A6D:\ 7072696F6E636F7270::\ 86E1AAF65A3C352A514148D8C3B8CBB77E7C59CF001E2AA7850CBBB703D2684160A362ACE398\ 71EA60207044F9E266FF9BEC03E647E0A30B74CF24B45161619F1DBDDE0FEF6B491337EE2D66\ BF2E9E5B5BB8E4C568D580C8584DBD4F758194523A34218631978DAF8BF8364D6C4399063DCB\ E866029E6418F4D0BE384B66AF19 10001:\ E92BE18C86C96D98C8C47C9C279C42EC136D8CAB91F74DBD383611DEE72977411CDA0188146C8\ 9CEAF6AF4674CBDC56D0045F94033868EA7AD2871C349EC885FC832F394425A70BFFE5652A569\ 8AB3884A0780162A4B9E6DEBF3D091E1D7BE29:\ D18F7F50ECEDE65887B004C7A9D715F1DE87D8FE37A14302848AD1C93A0502267A6A0E446F480\ 9F6F8FE43B934A456BD10975E819B7F2037EAB3BAFD5E699354B8B7384467CE25D80F8FB6F231\ CBE28D39E55D2ABEF2107D719D0A758676D7B7:\ 7072696F6E636F7270::\ AB183E642A3A50775FE8F158DE2085CF02C1F78A55DAD193D1F0F68DE45BCF8AE6812CCB81D47\ 6C27D4ECF63D9F1D9E9C5EEFA269CE214AF5A8FF24D933DABAEC2080491DA4BBB9654473C06A6\ BAE99095C247515611B5A45D0E02E8AED9D708D20E823288D5761ECF80AC72D307260B9443747\ 4923AA53D34058147709CA35105B98C7039D1ADD75F0E38FEAE7E3121331937C0A01399177698\ 7522E43AC1072182C98BFA3D28940D03B0CF0533E41A42DC574A835BC57D77396B43D4A007A4 [RSASSA/EMSA2(SHA-384)] 10001:\ DEC98FD436DE44985FDC398C4EDDD4356AE3D95A2A7CD0DDF5CCBC47C35405F85F05599C59A3C\ CD143E5B663C4435F29:\ D2556E2A05CEBC6D61F7485D1F8D4CA410D2EFB65055D461AD1D28031B4478261C5DC5C9B58AD\ C7C4C609C7CA0A30F15:\ 7072696F6E636F7270::\ 36495268E4297C9F416915F3F9057C1B772FE6ED204995A2C30FBBDADEF3CDCF38420E3A11014\ 1BCC8BDD06F688B139E6D8BE97CF3201E48585B4391CE9CF2ADB91B5C20991B2AFC5C6A6F5E84\ 5E055971631E066391D962FB265FF3D90F3530 10001:\ FC488F1438DA425D701C068382AB37E85798CA4D7A6A151A20C7ECCA84CDAE3EDD3AC22F6ABF0\ 01107DA6188382F0CD8B5B591EEF45DF60C016FD22B6AB91F97:\ E8A7CD9F6BE666AF5F10A81EBA40BE26B69A20A6F090C43035268B65AB7742D1410FC28F16D18\ 090F776E7162771765A757F754A8EFD75FAA83BC9258ACD9999:\ 7072696F6E636F7270::\ 09EFAA53EBF1FA0A23B84EA68DC7292F235C7F2A2EB555FC85F73A11A7A3785AF4284BE98840A\ 4F6D289647B04FAC1D867EE0EFD1E95E060FE4D2D766D11B03E678607E474621A0F5212139146\ 00977E8F3F31FB0E678D1C79079ECF39F5EC6FD2F62480C0C3F1DCEE06139ED661B33A32CCD1B\ 213F7557F6CF87A0425BBE88C 10001:\ F74FAFF1F8533804A2ED81EA92E9872505551954DF623503615B558EFCA368D32C7CC10B39679\ 160E0FDABEB0DDB874469677C2DDF45E369FAC599F4EBBCD5C5:\ BBB2824D01BF3A3820C349D77CB6761081590767A8BD5753AAF71893C9220080ADF01D89D5217\ FE714FCAD68AFEAD388F103DA7273AE2A67414198CE7022DD29:\ 7072696F6E636F7270::\ 858691CD4D14CD74841AEA3CF1564734D939CB7D8B4341BA1F74D88FDA993761AA5D850B258BD\ BEB228BECCC0F6B6C0EF96A3DEDC43A7078BF05D9FF4EA0224184572DEB43D77F0C9162CE6919\ 2EE3E50402579317B56838AEAC091369F216F19D271E7141149F1A5760071A65F08515D722633\ 6C9C5EA6CF35691B1C92451C4 10001:\ F6B23AAC1C0FD29065D68C3DE26B5868E7ECEB7CCB2AA9A2DAD4497678E77547AD8BA78BFED51\ 3D2C303355B7850184A3C6DA974322ACA6CC553393BD532B8ABCFD02B961A5CDF81ADBC9F5A6F\ A36D55652428788BA133741055635911595947:\ F2C5190C41D49FAD95CE70CF1CD086F32F9C154E856156DC95007215B2D1C01F485370AB4A091\ C919168732C99FA57BCF44A6041EDFC878EEC65EC54C0360A6320AFFEE19EFE7A4A0F62137A29\ 98BACFD7D364320FA178C8724EEBAC65D0E7DF:\ 7072696F6E636F7270::\ 9A399CE7D50ECA7184290BE01D43FF7D570F0A2232D385182AA068EA0FB097691C197B25ADF90\ 9397CC0648AE74029DA3477DB95CA4F3328E5E4CDA4A4BC67BF1D34020C8D9AA24B56861B0365\ 92D207026CFE4AA04B0B2ABDEF3911320D948776304FA648B60A18F7D07018804476E904213D0\ 9B1E99C31E66A8F37B4BBC1A57A753069BF9024C3636AD3690CC1FC1E6DEA4211F5E49F7F1DBE\ 2B94C31C19B0DFFDF41949D1AA6337BDFF1336486FFEF1369C3770C837FA2E1526B93A64CBB2 [RSASSA/EMSA2(SHA-512)] 10001:\ F37DB2223CC3E4FB8D7FB028992B01A553CBDBCC700386BFA1A21422F1D15BE3E6E0CAAB5A7EB\ 5F0A58E4FDDEF70AEDD:\ C490D201792C50C9840EB241B736093E647E27159EBEB336295985847E866FD5C44103ABCA57E\ BA86AD3E6159D485755:\ 7072696F6E636F7270::\ 7F175F5E66601757E1B0ABC051602FDAE2B652B69B551BB35F8C6B295F580DD0D27360E91B8D5\ 3184D3E1C1606690ED84EFB9C2A5122936BB94C4ED7FA49D40195508499FB87249BC1FE07DAB2\ 17970EAAB46809BC6925D3AE54ECF6F62E76A9 10001:\ DF3B69AB64C8CB728CAFCC27A18233789AF1423A6D916860A4FCEF21FBA4DEEC43DE4A8E7BBB3\ 272F55FEE50565BB18A1B944B73EE20F13DAD9444BF9225505D:\ FE7079379535E7BAB62DA87263F089364FAAA27796DACA16C7C82D29FED8FFC93C1E8B3B65431\ 4D336AF98932708EA37BDC150BA749A28DB4F12492966B51FFD:\ 7072696F6E636F7270::\ 786C58FA17D5A5A5B411B0A85F3306062D27978B84C9ACCFA79665E1C951AFB2746CD0FF03616\ 0BCCCBAAB15E7848E8E8582168804B0520867AA15F44456B018051AB290C9FE72AA121E5A1CF8\ 8B761C9F73B81F329B76DD2A4FF2A7F7905418B3343136C524089D368948CB9223A2FBD35C14A\ 3B994BAA333F5CFD60BCF47B8 10001:\ FC3439077A50A7A006CD1077683A5A5BE8E4B9B66CA0AB80AE5DEB4315D746DE493F354A3E172\ D080132BEEB7F17B80CDC10E7301289CBEEA18A80D20F0387FD:\ F20A00C5C12DB0F8E57C98DF1F69F76F14BA9E2137FFD7AC228DB02D2EFC1D574B9DA545A331E\ 0D906D57075FA15B7CD6ABC58362703DB9E9670709D33C9C1B1:\ 7072696F6E636F7270::\ 8DC903239378EA69E965121FD519C85D1D136D67126626EA93A31EA3706410E420984A6443AC8\ 731AEC98BA412CF4E2B39F2BE7308065F7BABAA15D25E126C996D7244D499C5E907B58441426A\ 407F001F62AAEC4274EF84AAD979FE504B05E277CD1B06A74DBB838EB7A20DC34D19B2CAB5206\ 351AF53BB968651CA4116F54B 10001:\ DCA8E48536240777EFE1290C0C89DB9492B33BD5767F7B8C12BC9659D21D35D253C054469FFC2\ 574EEED15509093B7606C59EB108A4F4EF4576BD84D2B61922A4CD3587E0A92D3A95AB3CDEE4F\ 31410CB1270F369E9E395524E22AD261609A05:\ CAF14E53927C9C38D0EEE7DDA60162B9FD3A270EC0B8B301BAA41F880527FBF015BABE0413DFC\ FF22338E8E1FED4F2026FAF720373F2ED955EE5252F486B13BAE0930E5012D0149B1780053029\ 96D967370C272513E20CAD5721F49A46869E4F:\ 7072696F6E636F7270::\ 3697C05A657A8904C792E750515BCB11751D2D4C4C1460FA6055A10A2C5F2320CFF2D82C0CF08\ 6E2E213CF5C4A4BE890F5C0A9F98789710646A500DA83333AE1CC6A24E99167B97B7E7EC06FDC\ 789037DF23F6FD1608695643C7D7C6462A0B37AD926FCA364A826DE539CC89419C99397C7FA1F\ 1CD244B0C7D3C27E77B6A4D4806E749B1291A23F8F3E6873BC8DE349F871530AE11CF4EC42E27\ B6E3BACAA3DD6A40AE51463EDE39B510E94F0A177328F868C91B5C35F13AF0FEF0AA4AD88B4D [RSASSA/EMSA2(RIPEMD-128)] 10001:\ C6C21C5648183B9EF1AD5A7FEBD163C247F324CC8E4D1D57604B1CBF2E7FD20E501ED4E23C984\ A19D67B006A46131597:\ CCD27CFDADBD21DFE2E63324DA85389CC9DC4EEBEA55505E271A8BEFA966ABBD9AD57B714B09F\ 580B9E87C6BAE1FC2C3:\ 7072696F6E636F7270::\ 63F9A46002EEDF74A3B21A58AF360C78A0389A6FA469CC6C7F3F37B9298CB666C59CF993CD3EE\ 741C8D6896F61135D2223C3D02B0AE001DF8EC270968F8E999FFD7575F437747E2C0B4181EB3A\ CFE51ADAD24924D75E86EFA2DF4531FFD1A718 10001:\ D9111254AD4B5B0403A9E3DD027F9C121A48A4B2ED5AB5F47E3F9C7EFC7CD1956AF1079EF2D78\ B80034E9AF2455FEAEE955D718964E89C7588992B1E6D1022D5:\ B8E8CA6745A849EC7F3471C1C83EFAD8AE65A8D5551A6924B45869D40ECCAE5B784A353F84301\ EDC6A8365CDB25768B4BCEE67382E05E15367DF3F4274F06599:\ 7072696F6E636F7270::\ 38CDF4F149F7CAE46ECC24C32F98F30A73DA6B57F0281009493CBCCEE2B902F66DCCCFDEBB142\ 2992BBB4D62030D24FF6674C27163CE4015A3BC899CFE6A01ACC06A7E0CC36754ABFAD8D19F5E\ 7372747557FC9B2F5F8F19563F33AFD0D4E3CAF639657922468457E44032E72E865517E095B72\ 8E8ED3169D37B45374E53D692 10001:\ D130C34C595669CA5711EEEFE6176671DAE51D8841D0571A70C9F0B0A3DC9A7409B0AAEC4BE23\ 37B45163FC8A41AD5A16AF72462E0FDE6224D15082AEFFB5BB7:\ E4DE294D95CD57AED2F82B8487FC20FBBD3A8E5C6A35D9BAF5C7DE67AE8FEC8BA82634A5654B9\ 3340D447F62367A861F10D1ED976D2B9CB0C856336F514BC301:\ 7072696F6E636F7270::\ 9CC6743EA34FB010B0B64975E37CF4C90BEDC063B9CA90F543CCA616C67D16A8EA0883DCAE11F\ BA595CA8D42F45DA84532E8173149A55196D01E45588FF372A1D95DEBC58353B3892810F43F58\ A935E85AFF87B46BCB77C6176422E887BA3671F44BD6112DB0E4A56B44BBED76EFDB01B079C43\ FE9AD593E65162C9FDB92B42A 10001:\ F63306C54246545F8A552CA5E15BA425F1B2E096D8FFA17E8E2DB786FBB50D2D3EDC94D676955\ E69B98A87674B4CBAD9651A99BA4D53B78B60F3A9ED4C871102D0E3A3576009439D55FA412191\ D55F93EDBF0239DA1F60B5B68F270A629642B1:\ EC9F3A07B1783A510793763A9D1B8F190E4ECA35165AF643E9C8365897D9803C3DE5BBAB35C37\ D43475A9E4062C1B8A2FBA574C4C44778D75BA3706B4242ECB976EC0F58D0D04CE4D9B9E2465C\ 0723B3F0970F04C8E8236A9FAED6797CD87401:\ 7072696F6E636F7270::\ 3D2E76A438D4B927C4578B27EAAD666CC041D4495A14A462A530BC81AF115D961C4CF840E9B14\ 6C83BE619E9D7730ACC4589DC17665CB4B10A19E021BF4E5BD0F7A1CAF720BC4677B809F6E2BD\ 6A15B94590A5DA3F03E83D819B1A429F22D595D2D042468EF602944508915C88480AAE928ABA3\ 2B4CC8FB4C7125496623912FCEBFF28D8DB33CAF008AB6B7195019DF8BAC96E23238EA8EC60D1\ C9527D91EC4018AA23A50B8B3998BB70006EC441334C1301D0A47C160FCE995A14831A737681 [RSASSA/EMSA2(RIPEMD-160)] 10001:\ DC6B9418363C6D83813A2588C0C4DFE5105F3A7305D5A0539E157379DFA832D7F9C59FD8FAD36\ 2A716D111A374D6865F:\ CF72057C7ACAC7F030000803AE1EEFB72C3812727FF304FAC9B086C2248BB36936AC9200C4605\ BD7142BC3C17EB144E5:\ 7072696F6E636F7270::\ 3D2F44712403CAD3F07AC10278811EF59DE6441522F323CB3CD1C287B233B5FAC7EC2A3398383\ FCD4A0AF6E404392707C72B22CA1C503C6FAEE3F3E992AE9D02C38564173CB492C9ED2EAA9664\ 859A06EBCAC73836DC80F7282D604A43B41BDE 10001:\ CBF2B084B2F9A826A2A1E1C6C3889E5B43A906B6A773AC56F44CC06E92F36EB5F624BDC0E550E\ 25DF80B9720988819FA79675DC4A9D28E86BFE0D95EE2A8B851:\ E56C1DB39B5B2DC6893D4383433C33FD78B1260660B7FC2313B9ED808126D685AD9F2EA7DCAD6\ 5B8FF78F2D9F2BEBCE9A3EA33D68C2D4A2995DA2DBD50E32951:\ 7072696F6E636F7270::\ A10E2A0C3743B0C8E9C4BA0AC71A60A368E98F0BE67623A22FBBE958FB590A31E2E07B016E55F\ EDFCC8472F9CA002BC6F0A107FD77E839D77D24E65B48AE6688AA1309C3E8727C62337792DD43\ 0FBA8ACBB1B3F730C8D316F66683E13D892EA35E57E145E1F54AA0B786E19561BBB910C4D7997\ D88852923C5D84DFFC9EF8644 10001:\ EBD673DDF90D8CBA51137B6F81EE230365F912C58B4D4792914C7FC8FFF9618CF494A59F31B8B\ 0DEC407F28FABF6F95360C8F42D2C1B4D8D485BE42A25646CE5:\ E0AB6EA0A78039FED1A9192B22E0E3131717B79824DB21EC6013C34C63F60D1AD7E73DF2BA71B\ F29279995EAA8C4116EB783199E3A0ADE2E1F597BC3A011C1FF:\ 7072696F6E636F7270::\ 2AAF175A74264765198AFE9556BA61BE30069B909D8D13C31B7EB5051ACCC2BCD80D51C0D0407\ 0A7C0BDA0E9C2F88E531D2CD0B27DABA850AD37F7B7390914AB1E40EA4C27F700D91C6F17D177\ FACBD439A98CA75CD8B4D1DEC88A975A03C9727A75815A47909D490920CD9C9A7C7E1FBE63F7B\ A724F4985B84C283176E0A28E 10001:\ F74DA54D764C5C4A5FA36661C976F579BD857ECB969B94078A16179B109D92021BFD8D09EFC05\ B889874489E631F1132194FB5B7970A74ACEB17984C6AA2132BDE2C2C8770F63E36A85DCFA080\ 7DE2FA3DCF16CB34A2AC9A95078613193ADE47:\ C71F05592CBA0FCA8879FE18C8A251C49386C45BE0A0BB96A60AA434E369050660293A61A56AD\ B2D2B14A5DEC650539151A30007C2E5313298B240CD8C4DC83E93B1C8F9D74D622587C4FDC080\ 0D14C5900413DA7BCAE98C41E8731486D9D2D3:\ 7072696F6E636F7270::\ 86BC93AF170E1C26E10914E9D403FBC6B5CCD3F2B5EF2E2D94118E4DD024A82095EC8B6F71BFF\ 2CF91F0528CF7ACA12F2C74DCBC01D1DBD52A87A369AABE406F62F3FCC975826EAC8F56D3482E\ 2FD396D06F5BB1CFED3EC5B3C08AB318FDE17A7807054BDBE44EB0BDABCCFE3A627569B58EF91\ FD8BC9E06B2EA40AE55E3C124418D6CD469F8F9552176B0229240660325E452802CEB3A01D726\ 9460AD098FB25A8ABB98F122F3ACB84B7158954DDFFC6FB3EEAF3615877D7BDE533CE8A6A8BA [RSASSA/EMSA2(Whirlpool)] 10001:\ C29370B3C4A445B4E638BA903092A7E6110DC8B5317FCD1E0729110C2324FC266CD6F2AE787EF\ 67CB219AA8CC382C3FB:\ F5489C8111D841E2D4FBCF7FA2A06ABBC451B730835D41786D3CC4AAA3B31CA63A6E7D3FD2C26\ 79272A682D1BA40565B:\ 7072696F6E636F7270::\ 79C185314A87A5518D05B68A26889DA466A04D66497704D8FD0566B263F9FF4250D214B1A27EF\ D557D79C9EBADF08A6715183D0225D45CA81A643898572B24DAF7FCCA7856F36D0168EE480A89\ E15836B7235ACF83E75A83628424E7B058A61B 10001:\ C249C71113E5E469BA2689A821439024EDBFF7E1C01378BA65E4E8FD0ED377D6ED03F4935C4F0\ F203CCD9F9CDDE6B59D313A7F76760C680E9DAF0FB2C6A30593:\ B9C9A9BDC0FFB402EA1996E46C51E654AA7CA62400FE0441E8DA7F78E4A70D00348B54F5B664D\ C0DF24DD760888D65A81D4380D3BDFCD2241EDAA777F8A4EC89:\ 7072696F6E636F7270::\ 2B7BB8B433BB6696562290BFE540BAEA1EF89D22DEAE1B5EAC8EE950772D0AADC6234CB598CFA\ 9FB2179AF94D320A177A8468C5AB8EA7AD71A14552001FC4FC578E0A1D1BB5D862B35EFC075E4\ 9FB085F3195CB1D332CD07881978BA4729B1B3C180D8D2FDF63D3F7E0E9C6A93B1AB70323BFD3\ 203520F28AF06E1CEE43D6C54 10001:\ DE2341F362821590F880B50B5AC864447DE5AF850BAF4D1B9FE89887DB107C9C94F4B978F6556\ DE0D976E640F40590EA06557BA9FD53834AB3084A8717F9B91D:\ CF5B9021453ABE9351007DC6F8B325F2A4FEAE0FDBB1AC667BC6CABCF9EC296D7230C2988ECF7\ 0425917718CB60B1397A40E5368CB68CB8B4C216FE7B4A1B6D7:\ 7072696F6E636F7270::\ 2402FDCA5051000AAB63E930AEDB1DFF71D8EB1BD0AEF2E9038D62E90849B9890BD5460C8A4B3\ 611C05F967E53F4E789DCDB0A1855BDA841C4DC92056B8B49F8056C5FD2651AD2ABAB6FE85493\ 31912CF0C0142590357964879E5C875143D589B5D7FD5BB210A51EE77F3447092ED2C6BF16FD8\ 935E9A509371CBB790B1AEE32 10001:\ CE1C752C02B795269599B060A5B88B6D1736B0B61534F841C316FEDDA6F429BF517821C21F924\ CA115A3CFC902F35080354D036026717A720AFF85B4F1BBDA360A2D98207E6A6933659DB50B51\ CF213F71908E0841417650DB80B5FE776CB885:\ D6B9456FE2A050A0795BFA09025866CEDF378D2124FAC433B07366E0B16390A2C1463333136B9\ 79C2DB9006681185B3ED23223BD0B96BAE8F1F3CE173F7D405CE79FCAC09C4151A012D84B775C\ 445B6BD8C836F06005FC8994961B57B62C8C9D:\ 7072696F6E636F7270::\ 7748BFC3043893FCFBF4CBDD3F9BA00F995DB6183C39777D4545CA57287EDC6D5D6B620AD26EA\ EA1FE60F4B809831614CC4D78A209BCE6CD712D4D3CC71623962F4EC7FC8519E861206E26AA9B\ 0B6FB1E16D0816E19B00F63E0701189688214FC063CE6835D1007794AE86E23A515C261B54E5F\ 963FC519FD8F4FE26FBBF7A445CA379857CD037753788E1A278F12BE61EB62AB7099FED68E8CA\ 78F2A5D35E873CBEC10B612FCB5A11084AF8D99A85EBB8685D54FA4E4EF5362A421D760346F0 [RSASSA/EMSA3(Raw)] 10001:\ EC52390A18D0746B6CEED07F19FEA4C259BD24828E864DA60B13E6E125B21AC62B8FCA7EAFC98\ E1FFF88909C250317C790254EEE922535C45A1D6CFAF3A73BBB:\ B855A27256300A0DFAF83F8FF98FAC15112EE4A1498C2F70277529A4A968250321834347B5244\ BC0E019934742993FCAA113DB15F6B24B74AA134600E127C8F7:\ 3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ 0E5FEDDAABCAC45E40ED484C89742408A1225204246EF04BF0F5FC87CF97EBB68EB3911E54824\ 0B5528FDA1E1C6D1DFFC2A70480466900FA7524ADEBA694B291CDCDF2560D9D6F70364AECF20F\ 504876AA1DDB8C69897E52DE92A13FD9E4684AD9EB8256A5723B1CCD34D4E552D9E2A5FA8B48F\ AE13AF7CAE023450D65731DE8 10001:\ 1C136DA3E140F55A5F07C1F314FBE3D97E4A69DF7456E95E4E06405375071405\ 426D81261E4D1D089754D50C4C4AF42BF4D:\ 1F7303CD6DC61CC6833563E83C3AF5706E20BC7651257C0F890F2C8B1CB78554\ EE43715EBC1D026908CD78F56B489B33F03:\ 3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ 01E6EF82D25EE46471883D373869C553A54E0C256968958FBAC41D79C571940E523B96494360E\ EEEC45DA943F94CE44DDBDFBF141E8F7B251E44EC47B64DDEEE2873C4B78A849242F3377F135E\ EFC9AD4658061F575516C7B19321A3120D0BB3B11BC7 10001:\ C0E2F8859C52B2455C02E64F14D55CA27D91E802586702E028093D623153C63EBD03EBFB0C891\ 563C893E3DD5A7DF4DF7EB29FF7D4E7C14A3002FDDCF3B8617F:\ FD058A73BB8BA46BB8F23BDA37BA33706BCA2E8B648DA3FB5D76A3C46DED8A2438A43A3E84D3B\ 5CA22C4DC30B0A607557032C53F6D95B825F18BDF1DC188EA27:\ 3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ B2D322A392288D260F4D0AF6A3412A3F11B97A141367559FE3F2BDEEF208E14F2987E63B5C6A8\ 56190B37BE98A36A217AB8E49862427851A2C0E3FBFB8B1A2845A14DF7170B045833A8B2CC663\ F481432E9B4B72E1AF141ACFF368C8DEEFECDBB35598BD5B815C3B26BB496BCEFE5CA308D56AF\ 870F3D92CCBCC9D3642FEDAD5 10001:\ E283F14941AC5DCFFA0A7C20B057885F75846966D15A88A02DC9837ED39EAB7D493CEA91D54F1\ 8EDCB0F8574CA257635663DD92B8881F0BCA3DDBEF415A8801B:\ BB743C0E63157B359737BA7615DEEDF953B79CFB99A266BFAA05253F5E04051647450CEF0F7E7\ 15E6CA7A09A907B8F80EE99A4269E02714B9854C9B4D192941D:\ 3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ 5D71634BD519BF992AC97451C3BD856735498D963A37FD4E5F36E4611EAC7002CE762607EFAA8\ A50FE0A054084E5DA46B99AC242733444087F94D7EF0FE1B0297EAFE035D13B4AE75BEF37B5BC\ DB2F38C2216320351E09D277B3D6AAE701236550EA44B8AFB6A75B21721CA5C780DEE26244072\ 8A245036385CF917310DA42D6 10001:\ EA7D376F36A655748DBC105361285D9E2DD5A90F7087380EE6EA1EC931BEFCC76BD8FF1C0E9C2\ 05A4271FA5CFF3260BFE92319737CFEBCA0AFD56C0EF5A5DC404416F642E188A9574700687A71\ 937C2EBD6B4A047C4D35C901C6E28BAEC7EE03:\ D6770E9C288C807D4E0BF8A4BAC4AA70E7A83E2E394BC448F0874B909C061392F4FBF51DB10F2\ C87E117F242B222A31B74A9BD72522062AD87BEDE477D47A96A2D74477E7A9936E14F3488D3CF\ 620024A8EE42133ADBC7C49526D74804CD15A7:\ 3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9::\ 5559398D21B7EF94223BB1BFFC8BB230640737A3F6D1E780DC59CF23A188206C1BF85EF086FBC\ 9D44B76B70F09E86C464AE53301CA8F31C704F5BA0CA4348B505FAB3B0940FFD831EDEBD22F8D\ 1215FA1CD0EB8ED678A3C7D4C713EBC8EC613F5D9B4BBC2E4AC47E403207E43C79E8F6EA12E7D\ B8FA08D723864EA8D9580A274E84E2FFC3C57F366ED0CAEC9790F4B7E82B3E8419CE0F6143965\ 74F95CA498DDB75EB23AEC063C2B81251895F4A119A3B579D56011DCD412EF2B24FA4725D5FD [RSASSA/EMSA3(MD2)] 10001:\ 33D48445C859E52340DE704BCDDA065FBB4058D740BD1D67D29E9C146C11CF61:\ 335E8408866B0FD38DC7002D3F972C67389A65D5D8306566D5C4F2A5AA52628B:\ 45766572796F6E65206765747320467269646179206F66662E::\ 05FA6A812FC7DF8BF4F2542509E03E846E11B9C620BE2009EFB440EFBCC66921\ 6994AC04F341B57D05202D428FB2A27B5C77DFD9B15BFC3D559353503410C1E1 [RSASSA/EMSA3(MD5)] 11:\ F8C72F6AD1A116B15688E6DDB4458E1CD69A21E4330AAB1F1024CA09AEA20C57\ C1A1D3DFB612928E7FEEE51987D5898A24817F9A389A39A0E5A7C43CF30A16D9:\ DDA05F490F538B6F09B2C1D14D85E66DC724D8B77D3218958A8AD6D1E9DC62D3\ 05A1FD010251CF0AD2BE511464CF33E5D8F7108E4E6E0FDBE0ED524A95DBF027:\ 556E7265717569746564206C6F7665207375636B732E::\ 7B558B0763B621830BDAF0AF9BD183A026041051579C303F351DCBC9DC168444\ 75D54EF5CCCEF59467015C4E4F8E17FF233BDE1D69B01DE46837884DFC265664\ C5384E734555E5811259A206A05126EE70C2C1ED36A7EC2FD4F71F4F637EEF5C\ 833F92FAC30062434C43788DFB75B85BAF05227F5B1258CBC9EFF3F1D7BB9916 10003:\ D53E981F3D9AE9628B5038C8E48CBB944534522E8293145A3A98B855C4BB091E\ 67493348454DFDE02FF3C7148E313B917A199415937407B4856A98E50A570BDF:\ CE8671329A80756167093EEFDB10D2E0E0906BDBC58C4A1A8E8FF1CD2AD25086\ 8C79F360A357B7EDC1A7220CF698D0565385ECCC9FFBB89EE76EFAA6B70E8881:\ 426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ 723320616E64206C306E2E20416E64207468652052656E64657A766F75732E::\ 319F7DA1448E5BA7EDAC7A5FB422A401481E895E0508D1C0FDEDA2AC51DE1D39\ 913F0D412E6E6D9313141992A202FBEFF3BD333542C88F626457046190AEB16F\ F2A499DF5820240A5248074445B2D54DDF0C298F57B61D89EEABE7ABC728D4BD\ E82834BA594C2231F2757A7FCD047039D3A3FE220571F30C41B5C25FDDE4FE87 5:\ 314C5009A2E3B5B5C7C2E1C2A44AD98921F8005CD2C2AAB617F4DE5932FD5599\ 391584977B46ACB1020DE1E106E6B2861C2A6E0C980C151860967E51372E19F09:\ 331C1FA43BF7B78EEC60EB3627954A971FC50357F1ABDA7EFBF758793A75D601\ 6154DD9F5F878CFFDA6C5DD4F88BB5958C4D6EF4633DB0F3E578382BD69B2D567:\ 2831303238206269742074657374206F6620504B4353233129::\ 0484FEA19814279782BD0732A7A7E29738B2B2DF0D0D2928253921990B4F3908\ F69B968FAF934C227FAF39BD35DBFD82F1C9BEAE66C4977E3AF69E0567635E18\ A7D831D5C66A75AD8D80A6BC994EDBBE7D6F7FEC327A1E2055AA81720B336530\ 05C2CE87DF23E4A286D5A3CFF376643B969134C49E6929CC69A23E4137CE9AC719 7:\ 436D230A470CA8401CA047FF1AEBAFF72FECC04A3D085576866701D5B2108D7B\ 355E8AFBEF3A687EEB6FBFF7C1152769E100EC77D72D000D6460E99C68BE30065:\ 57CDC664033ACB369AD87F6624A1342CD57E95F1CA0B44386AABD1664B511690\ 10AD4D724A900DBA16A8F10411800C15A91BE59D10ABF7147B4C291B0B0DE3AFB:\ 2831303239206269742074657374206F6620504B4353233129205075752120::\ 13AB41A8252B19A23ECC3781A7AA969ABF929AA562418750B9347F140F2C6DEE\ BD760C27F650D403D4BC692B1BB9C99B0A8CB20D75502C3B451AEFE81BB1278E\ 23A4B7F5C3C438064CFC25890F68ED689EC7815F015C018BDCE766EE3A4A1535\ 19020BEAEC16F56F5559B8413BF0C4240645D2D8EF69B023639B336F1A2BD2A622 3:\ 77757FAB85AED403810500EC7FF71C2D702A2681F4152757A6F553B3BFE264D8\ 78800D4D8021F95A425FF61153BBB9536BC67E92B5DA6FF752EC17B7F812A3DE9:\ 686C51FF0113EE267F13E63615215EF4988EF8EE5D519B41BCE5F405CFA73E7F\ FD01E8B16727733A9F09F9E8114FDE3E6E40E93CB6B0D6DBAEBA9CE2368BBAFD3:\ 2831303330206269742074657374206F6620504B4353233129205075752120::\ 0F017BEC0E1206F2F7BD50500898EA57A1E798FBE0D8C66594F85064E1CD7FF6\ FD528D562667C9B1D75492B83131CB1262906ABD657B3B15871CDE20F871D81D\ E98CDF6FD87C5753A0A9E8C223BA1F1761273B9BF8756ACBDC0BD7E6E1CDCFAB\ 3C1722F1B3053ED85CE3CAA15A843112788E779E463BBF51BE3B51243CB14E6FF1 B:\ 800CE163A96B6457B06761B5D3869E44137E7213E39ADE143127E9A539E1B0D8\ 1B28C3B950E90F437EF6ED8B983C0EDCA9A63B0B995A06230769069576CE144C3:\ 92A8C827CFD05C51EFA0BE5C958ED88B9813948B99A20042E3F54A8FF71F2FD3\ 5BC83DE9A242CBB3760071EDD6980C3BA7204B5CFB625FAC1367CB2DC83200CB7:\ 2831303330206269742074657374206F6620504B4353233129205075752120::\ 38DE0D39AECE20C3DA94E1B869C09F04BD22C072B1DB012E986DEEA9E254A5DD\ 5E6A946901EFC92A5EBABE010603125B60FD594A3D974986F58F6FC714473334\ 27B1FDC960512C121E8C81F0354EB956698EEE49A4F989390950B679E03A0B6D\ 964EBA3829C52C989A1ADDAE430D600188F1A215BB306EDFDE6E512E23F113C52C 5:\ A9E8F0A318CB66175E30DA2291CD2EDCD9A48DBDE30CC6D4AE4E479452DCB873\ 370599E4417350FA1F70E2F9B918C2284DF773680950983BBE35743010439A9F1:\ 83BAD868C9AD825C6C6CADE47F55F4D89974B2056293DA9C3D867EC11147720D\ F048357E3331384C0EE2F6AFD28B9B8746BCA799C8896190C6879C1F59BD1B363:\ 2831303331206269742074657374206F6620504B4353233129205075752120::\ 192283FBAF7B9018D464D30A428689046AE3E25A499F8E437096800E09F4883B\ E72626B9C0B50E982C5D53B6C733CECB6FF5C3CC2958BCE854BE89AA1D166361\ ADFC0CA4B23D7A5D404B0F75ADE3FB134C965E427233F743925AB36DD45564F0\ 7FEC46F424A61977645E0C4D275A2BFB65A403FE14B20210B0CD3ED319C9D31420 723B:\ D7AFE0CDE0A05A44FEA97C7710960C3F1D7341279C025CBE16D4038C8EEF49BD\ A81F1149AD31B33DE594C97431C52AF0F2D52198E3847CCE0AD02C5D6BFFE39D\ 52824BD671CE867AC0E219612A2AB769D82DCEA187E8AAA02428FCDE8ACCBDEF:\ BA36A3D8F1F8AFFC57251452119236A532516ECBE4CF5AA6AC44533F4CA9995A\ DA0FD9B0A742941AACA7FF0B12F2D317B046F5C3BC0609B519C4F564604D2969\ 19F677D590AF519ED70DE189ADEC8E024286D4C2E8866F7056E2333AF584E847:\ 47697665206D652073747566662E::\ 5C9417A66AE951AFD8900FF15463CBEC5D01DB8D771BE4BC35FBB2416D2D4D1D\ 89151E3CE6AFBC4F676627B538511C40EA1361FC2AE34DA5DE06C6507EF6FE27\ E362830230F3B990AE26221960B459CAF308246EB6183FBB75A38A89A1A34A2D\ D4466F18832917AC3A68AE63A8920FFC7F3353802D8E18F760F00B3BC62D5981\ 0F7F132CCB8C4A5EE2F2ABD6EC2A8FE03911F1336D70A4BBA00DDE153683CA0A\ F730619C15AF48AC2021DF431C675874BD10B42432260EC07FAF5C2E93DE868F 7205:\ DEFB5C1A68C464B3190677215DD4D5098673AC1B510684135E5BF2AA8EF07395\ 6F29BE13C058AFD613308000261A2C90D8A8328AC2DCFBD65AD132B5D32FEDA8\ FDF4601AA0BBCE72B56B1C01C65E6B2F3F1DAB6975574B70160BC2DA2F72F658\ 9FB9C35A8DEC519F7E4759CA4E71EB27C3CE37BF6152134B477CD8E9F5656D23:\ EF363BC1C200BA863315BE1EBB8D0FBD5445D168BD8802D9E0DA108D4ABA276F\ 64C54006D180B53DDB655692740BE6FFAFE82565526E45626683C5CEFB768E64\ 6CA0348F5D70F435247775C5DCDFF681D955480EE5C41A2E739DDF27F321F24D\ A4022998624D43FD566453C4603F2207A4CE906660D0D6EEFDCBC6B0585A633B:\ 47697665206D652073747566662E::\ 693E0EB1075D852FC14E4C3E54CC180F9B215A663C53AA85FE3F8777F25EF089\ 8871C922DE5508B7CD068559DEAAF1BB2C8FF590CDA7586BB8D8CD2FED31122F\ E09A858ACE8BE7CDBD7DCEB1FB6E80ED4D1E203EA60DA5B4FC4127D3B649FE4E\ F4991394F4B28AE8D2FF33A4B89FF8E18B9656137C43F4F950FB013882C1CCAB\ 486289B162256038F882AECFA6A5FC0B377A1B61F95B34ABCE4562805E614859\ 22B36B10C1DABAB069BDFE0EFBA0C44587CCB4FEB6839E6B2F7F07B2E90EFC1F\ C8FA953FD56D603AE54458AFDEBDBDB99BCC29733194E1DF5DB9E7E63E993756\ A043443A254CF4E41A171A65BE4DD3CF5AA4079F3AA69D220615B0BF935134E0 71BB:\ EED87D797D13FDD31AAD41AC7F88FED35F6483D4AC6989FDDCB540C04E69E2B5\ 085FF650613BDF8B8BCFF09E328176B8C6E5E8608A6B0BC6EA2C6461BC060FD7\ B884A9155FB7DA583F95EA9EC896AE8C678454D9D9337C9E21F658E6B5B2EAE9\ A8477E7D2A3F9115625A1D429087C3DA4DC71E7C9A08A44C91697B564A8ECE7C\ E7BFF1C626F6C2D898E512CEED855A64090648FF5B71B385B551658B04F29D81\ A00C6DA0600375D7BCB26AAE5E211EFA97AB806DABB4D783C5F8FE61BEE81565:\ E9E6B997D92FB0DB4162D4412326D008CEA106665DEEBFC9B819E5B044A7B98B\ 3E628887BAE89C86066FFDBADFD0A52715DADCE0F4A2CCCBCCCBB095A2DD0014\ FD8BEE4FEDEB95F19C1B7CF694E2C505BD614D06E18F362713A3DCAA41DA398D\ 29D507698D4B3FB1D8C070285A4B8A4808BE4BF60299D4E6912BA4C43CAB65D9\ 5B06F96FF50838E13B4938084C4D736FFB28477B30E4FBCD4C6826D1250B3A85\ 68DC0A7A0997CB2669DA44D925FCBD248ACDED9F5930DC805F019014AA806781:\ 47697665206D652073747566662E::\ D0C2D44B72627C4CDF868393F38BA331742F7C553F930DBD85C2F52E8C57CEB5\ 08C31D7284DFCAD0EE161F298AB52D0B3E04FB0A6D1785F7EF0AD2B527F1DB04\ 50831A832F3F1D46357F042970DFEA8F81BBEC44B2B99272D15D6ED9587F116D\ 97E572B6534B4ED107BF43AA3DE758C074B4EB391B9AE3BDFE6D4A4FB2180A60\ A1EC259E22825FDEADD6A13B19F011045EE8DDEF14EB404A0063DE0D953E9245\ EF022943AF6476118600E6A726994C94309571C47B2155C9459D8BC757CB226C\ 057820443E593B4A78023F5D8BAA64BB48DD46C4AA77CE39E256A6388E2FC59C\ E2B453AF687DA37A2C6D7E10D8328D25FF1CDE51926BB27C6200A590C8BA4BF4\ 274CC8E72CCD10271F14018573A1F41F9F1C582FC102D7621C2AC5078A14DAAB\ 36D26E055B3AA6DFBE6BE1C463C4415891086DECA173D99495188FA21F497E9D\ 270FDEB830B3F9D62F15CC843AE19F490717E9A7979139175BB7240F706851A0\ F56BAD12970F2E0F031C313F93C9DAD4AAD0A26592D5E618B9E73566E68DCF72 6FC1:\ F34CAEA3D0B3D9BBEA6519414CDBAAF20A44AB2014D51545961B5917FF2D8F40\ ADB5971ACB2116B7C5600DB30D8F80D54F54DDDE605A4AB5C7A4269A5678508A\ 545BB9EC585EA877EDC4C23C2370F44DB68A2FCEB73C09307CF22468CC4F51A4\ 2C1EF139FCE1867598F909931E7C364AFF8B5C1B60FAD396A641FE949888C6A0\ C2FFF84FD7EB476B1292FACFF2DFB7F8B48934ED0352615E1AD701491C47098A\ 49920DCA9C9BE01C1C70F4AFC9BCFE869362816E21C552BBB918F521FD57688C\ 018969C6C48308D18589C2EC486A8C84E41263F594BC35993F15BD23BCE1EAB3\ 185D0828F441064D38D84148367DA2F6FFC9C29510ABABEBC33F6E525090C7B3:\ FF433D0B39AE58722F5A84FBF7A09D31AC8D7A8A78C30E00EDB3B062C635C6DB\ 29472989F3039DB7319AC5F806E02BFAD02BFE61C01BDAD786DEFA6445E6F36E\ CB3773B5A509E14BD414491DF694D4C5E798A33B1E4A0D371DA83B4C7B8D8D9C\ 7C8AAD77FE9ADC5CC67CFA0C9DC0772435EC455A6BC7F65D43E1B5653A80064A\ E4EA6D910F509E16BBA32C3949BE9037F52A9A96AE49ACE787BEB0FF28E6061D\ DB8004F4B34F65FB96DB8173AC72ACD89CFAA3428944612D4509546A3CBD0AB1\ 5B8C9CCCECF2D634CEF7D7DBB2DB35C107E7E3E6AAD6C8C73FF22166FADF2C6B\ 4F788889B7720A43EA2DA69203BE545C5A7897A8B9971E5EED87C3D57072A985:\ 426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ 723320616E64206C306E2E20416E64207468652052656E64657A766F75732E::\ C4F7914A7930FF55A16083CCF84D72F03C900374BF60145EDEF156AF48ADCBCC\ 51AD3912EF0F27A84AACE8CF7DB7EDFC2133BE617EDA7AD5C69C82C2BC1532CC\ 04B005CE6349EC5F4951BDECCA0D65AA5A07923570A23F51A30C972B0966B2C7\ FC3D0821D14555A2A2EF281AB0D533F5C37FA6B3A683B794C8770CCD41BBE418\ 262D1D6EFB98108BEFA271BA5441FCF68FDFAA450E02AEB78AAE5FBE8FE02D37\ EFF8D7D250503F6BD5E6805BEDF3177FBBF8DEEEE4D2A36BEC34106B7E2FA7ED\ 1874C9023B6B71CBA87ED2954D0B0F52C1C51D8242B4012AA22689F9FCCA74C4\ C1BEB23DA240C6FA183A2AFC494615382D3AB7C3A96601C2097B381C5EB5F530\ AF1DA74FB05BDBC52B5F08030CB8C3518D8B9AE17A6164A781493FA7827E1E95\ 7EE09D0277019DE3304C03FA8071F8A4C720290DCF4ADEBA54C93BA3B71F886C\ D20D959424599480BC35D7F6D6A3B0A112BCB5CD99F16DEF87B08816497E9B6A\ 6FA9D28049239776B0266AA28557D3B811B48FEB601E6CA16951CB899D6F56C7\ 828E37201420A9A51360750698BAD1DB0567BE0A3CE32CFEF34566FCEAC272FF\ 944FB8990C29A3430A5CFE9048D8F595B47AFA93CD910FEB471139FC9D992EEC\ BDC0DD304AD20F551D2AC1AF97AA7C2F058DEDD9302BB7EAA3210748B49BBA81\ 95BC3B83719656AC55773D0A49A9F74F0DA0FFFA76BAF700F430EFCE96DF961C [RSASSA/EMSA3(SHA-1)] 10001:\ 33D48445C859E52340DE704BCDDA065FBB4058D740BD1D67D29E9C146C11CF61:\ 335E8408866B0FD38DC7002D3F972C67389A65D5D8306566D5C4F2A5AA52628B:\ 45766572796F6E65206765747320467269646179206F66662E::\ 0610761F95FFD1B8F29DA34212947EC2AA0E358866A722F03CC3C41487ADC604\ A48FF54F5C6BEDB9FB7BD59F82D6E55D8F3174BA361B2214B2D74E8825E04E81 10001:\ D7103CD676E39824E2BE50B8E6533FE7CB7484348E283802AD2B8D00C80D19DF:\ C89996DC169CEB3F227958275968804D4BE9FC4012C3219662F1A438C9950BB3:\ 74657374::\ A7E00CE4391F914D82158D9B732759808E25A1C6383FE87A5199157650D4296C\ F612E9FF809E686A0AF328238306E79965F6D0138138829D9A1A22764306F6CE 11:\ D255E2DEC6F7B4A61424CCDBAA356FAC0D29CA7912EC755AD4C72D8F4C4ADA5B\ 51790C518C074098C5CF97CF651AD8F5D2D3926BC16872D69DF533ADCF71251D:\ DAF30344A35FE911419B2BFB9C8B461B57A1FAB11DA8451391357AEA6B81348F\ 5CCC4E23B38D3DBA82603CC52AA5F1BDC6F37015246F33CD02C3027F557A265D:\ 7730307421::\ A372D1D551F9260896C2513932A0828748086C5AAE2E8B5DFADEA3250E9A8748\ 3C9DBA5D6F3513202510C2970624C1EFDE858C432DE7E50ADCDC7D639C30AE8D\ 9D3B6E521AAC286D8613223066559148E6B06EFCEF9799541447C468D6B49ABD\ E9B51B14B34E475B3D04A6747DEB2CCAC5400D1032DD977C0A98D79A74EB38AE 11:\ BFE1C1173207E6E33F699074865B0C285CDB92A7973DD2DE1E10F525E845DDA0\ 2A2145CE553BC039DFEE68AA6826855F9DD8398820536BCF83EF422E2E75A93F:\ C542F0BF4CB661A6D3B0FBC3952BC85BF7C8A13F81F3D66A78A39A1A4480A172\ 26B913A53D0AF44775D76E611030782BEFFD979C74BF3483A709FF1A58F140A7:\ 556E7265717569746564206C6F7665207375636B732E::\ 0B43E57A2A216D15795C2538ADFE794FF0D4342CE4F61D0D0A5E7F38A2968F9D\ 6A032DF4B772DC7E0AEE89B5BC829D3F0BBB05758F0B95A10CF8B26677862737\ CC3277443E4B5D162182B326723E210A3E2D8E6E9BFDC7C935CA2BF4E57036A5\ A83661AC1EACC4033E79FD2B9EC525623B1EBA9F13BD70822EEFD0EF443B0993 10003:\ C739CEC54F45D25B3B4D69D70CAE94F2B5299A406F4F045076ACD84687A59E8A\ 1AFBE7DBE229186EC588D12397E401CE51A42BEA67CB6B10C984C117E2CB876B:\ D549FD1428B28FBFC7CFE760D16AD9E4BD6129AB407AD79D4B964F6362B78DDF\ AF20C8EA51471CD49A5E329F49420571F3A6E30E781BEB80CEB1CD7E07F57D61:\ 49742773206D7920626972746864617920746F646179212053656E64206D6520\ 736F6D657468696E6721::\ 1EE0E873EE0EBF9DCFD452596D731936F8115BD3EFDFA2D1383CDCF04B97DCE6\ ED35853C19ECBCADAE81E431BD31ACBF9E4CD709D2490E552853FD523D6C680E\ C59A0E6E51DC0BBDC4E783608BACF3B6648931B5DCC2979D932652A42D9F0EFC\ 6B1E6AAA85C97BF5DF88736BBDAF33139B729FB0340C89CED70AD556097EBA0F 10003:\ BAE8E1ECE4B7E06903A894BCDB1E4B576D8C7719D23343814D6EA2B65E26EA06\ ED68DAA07048917EA74B8A75B6DF6BB68060BE68F3C0594EF99DAD5CAF9C2A75:\ F1C1AF40EBC0BBD628E105246AC61FBDFE7C926156D8A644F6297C758500DC4E\ 943B392014068978BEBB3ACDEB73358D1E1F035DB73D01BDCF0536928EBDE885:\ 49206D65616E206974212053656E64206D6520736F6D657468696E6721204E4F\ 5721203A29::\ 4D0AC8B75C4338C456533A431596339617955F786998BA05BFE41A4BE24AEBAD\ DF92201340E076E7384BB8E211FBEC7662573C1F63915E3033CD6C351D7CDAB8\ AED5F3458AFFEBEFAB21612BF742EE012674D04AAD37C592775A55D6F78C6674\ DFC0F927303F486E82AFDAFE28A55660E91687FEC0CA2AEDDC83512BEADA05B2 11:\ FBBB490DE6F5F485B0A25B71394A393488AF8131B5391C8D3F99ADAB2B5B1F89\ 87B9556C5FBF2F85DD56BA0F9507C500787E07C88726476F56A07491CC4FB97F:\ E1C5F70CC3DA03313682723C22241CEC93AAE0455B59501F4E6603E790A06083\ 3710E9CFBD2D8472E193C0B9433B2290CF303389B3CEED97CD1F5C934AFDCAF3:\ 57687920646F204920616C7761797320656E64207570206C696B696E67206769\ 726C7320696E206C6F6E672D7465726D2072656C6174696F6E73686970733F::\ 4AE5B5600003871EDF01BC589DBDE5F5F8B558AF6F286D09572555FB4D34F640\ 173F0D17AEB67E18D05CD598595C78AA4E1246DDB0D311F38E3E21C02241F4F5\ 542B872DA50ADFE17407DC115C14DCB35847C3AFF8914967D8714B89CECC5745\ C353D9831AE5B2C666A3077D5AC1131160AA59113193278587308D3E5BAED895 3:\ B6E4B50A4B61F147CC30C319CCEBEA1BB8151EE3012BFD2C80E8B13DBAE1657E\ 7AED914E80A26A4D1FCAFED54BF4457D609A33C6AE7631DE9A310E3EFD4353F1:\ B841BF00069AE6F05A68CB11FF5E6389ED0C8AC9D2DBDD24CF0E0076B05FC226\ E771C0D06C220908A559E5BF6626537B265B8D9C50E05E214724155F1C14A7E1:\ 4920616D20736F20677265617421204920616D20736F2067726561742120::\ 24D98B51D0419DD3D987D7E51528F571790AC78D2C80F36F64C7B4E05D90239E\ 8A5D9D7F46D636741B9F9A1DA58E58002D268A814528A4BF6B0AEE3B8EFEF0BD\ 72C956E4895FAA28E3EBD13E7EFD46A7BDFC3872D220EF4A2455E6CCCC407411\ C2274D7F2BEDF4A727B569BFAE999F910BF69F5689DB7686328F97DED76C64E5 7:\ 1343E65E7C11BE13536BB8BB569AAF091119ADE46FDCA9AE627910A39F9F909B\ F921EDD9AB862813AA5AA5969620FD97ABD051352C89A336E420D1BCFB37A9CDF:\ 10A76D6261BE5FB018492566D9819028CA13B55A982C8A2A7CA31520124AB832\ 0F583BD5003F0E800775664DE2718481C15C841888350BF980D8F3EC017B9D851:\ 4920616D20736F20677265617421204920616D20736F20677265617421202831\ 3032352062697429::\ 0069212B4D49B93D56DBFD35534686BC4CE5EF057D3E5EB08E38C0CAC44A33C8\ 1ACF7E54ACB2F7D7029F63778B55D63C31E0FEBED8AF57050EC46E7C6B857112\ B8A1FA0B4D5C11F976D01B5F56EBF55C678393CECFC801E51D6040A3631A0E77\ 56F9E81E2FF7A03E1B8A20F7DFAE90CF631043029AFFE3F615A54EA68ED470B393 3:\ 1F16A49C815B9878A399B22419F0D948B33E8D7367A9F5928ED63146FEA7C69F\ 6C8A0EACA711970E370FB87CA3CCCDA71E1DBA9A12DBC003ED79F545876BFDA7D:\ 1F5C7840900C1C2E18340C156F8BE4EE70A4A0603412E689602C93B09FDD205E\ 23A775E7E1EAD3078EF9D5487D8A2EA5BABE8EE94AA0536CBA268B3BE7AD4B519:\ 4920616D20736F20677265617421204920616D20736F20677265617421202831\ 3032362062697429::\ 030551DE7296296876189AC2155EA4F80B3A68EF2A51F926494821E038A52548\ 4BDCA8CC4525D4BD04BEE373313D79DFEC59E22F21FB853C688FF9DA4CDCF6D1\ 2255BECED6DF3EFDED6046D4381D69B89EF17B892685707AE7B49E2205D95F73\ 0A1A003638FBCDDE5F4A5AEB028252F46195DB3CA1C708AAE22ACA7687B0DD2401 7:\ 2037B35FDD14FACFA8B6DC8F48EC575F43CE8E2B5B89375A6FDDE1CFB66DACB9\ 8D7C57CE0F025BC7DD15533233AFCCBF392C0CB9DD79F49334D31F1FC0D17465D:\ 21265626E63E26739C0D086C3F19D7C8DA5B2FCD1452CE5290FF16F80AE6CDC3\ 49722661765B5AE418F23FBDAE4048C4FBB845822B2264C012ED6A8A257365F69:\ 4920616D20736F20677265617421204920616D20736F20677265617421202831\ 3032372062697429::\ 0090FD2E6B167F5B8E68AD965C170F87E2DDC69BA9312DE03B79018C90A80BF1\ 67704999C1A1B8AD31041428DBFE74FD89B398F5682F252DE85E19F33830CA2B\ B775966C01EFCD6F95A5334DCEF07A0DF1F1114C21FEAA03D619EBCA60010F47\ F671C35D754BD63DD5045E45CA21F7CB15FE2731AB27D91162D52320A540B17AE1 # Following were genererated by Crypto++ 5.5.2 11:\ B7B1C37488F9585ABEE4F6C1255E70726F9FEC2532D86321:\ C22463589E6BFBF3D9ACEC3D29F978BA3CD80D48478F40ED:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20\ 64617461206D696E696E672C206578706572742073797374656D732C2063727970746F\ 6772617068792C2073746567616E6F6772617068792C20646563656E7472616C697A65\ 64207472757374206D616E6167656D656E742C206661756C7420746F6C6572616E6365\ 2C207265706C69636174696F6E20616E642063616368696E672C2073656C662D686561\ 6C696E6720736F6674776172652C20776972656C65737320636F6D6D756E6963617469\ 6F6E732C20656D6265646465642073797374656D732C206D6963726F6B65726E656C20\ 617263686974656374757265732C206D7574616E74732C206379626F726765722E0A0A\ 776520646F6E277420746F79::\ 7019481E38A7ECA4D6E865FA22BFECBEE46963D4582419C3C79A272ED88630B4152AD9\ 336B08DE71B5C45FCE6C45B925 11:\ D83C1647F81DF86BD9F30E06C54CB22CDFB1BAA3224FBEE7:\ E57DB05FC990CFDE83B59433D37C69CA6079AB4EBC103C59:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20\ 64617461206D696E696E672C206578706572742073797374656D732C2063727970746F\ 6772617068792C2073746567616E6F6772617068792C20646563656E7472616C697A65\ 64207472757374206D616E6167656D656E742C206661756C7420746F6C6572616E6365\ 2C207265706C69636174696F6E20616E642063616368696E672C2073656C662D686561\ 6C696E6720736F6674776172652C20776972656C65737320636F6D6D756E6963617469\ 6F6E732C20656D6265646465642073797374656D732C206D6963726F6B65726E656C20\ 617263686974656374757265732C206D7574616E74732C206379626F726765722E0A0A\ 776520646F6E277420746F79::\ 340E91C744AB8748E6891202979BDDFBA6003FFDAE83584359BF6FA5CAAFC8E811598C\ 5985CAFBC679417B64F6F42B02 11:\ CC1416D18974D023AF2D6FCA7BEEE85FCE5F036739E2AD8D89032C591C3B50498971F4FC2E25\ 384B789001D6526F4733963F2D98BCE1BA53121D15CE51C0C237:\ EB2CB9DEAA582AEA4B7322C77308CADABCB824A2E511B93CBCF60A0DD6AFDA456A7FCEC6F7DE\ F2F7CD3EE32C36BBD2A4445F2C6DDE86BD3881B25CFA6B4EE279:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 3B2CB445D8A533B0C3CF4C05EA87C266902EDB4CDF9BCB0289340253DD3110753D0712AA51FE\ 91CD0E59B73226BE63673FEABFE472BBF136B0C8F4A803284FE3DAD892233A8E81C97406E065\ C5AADC4DA86746EA88E7E107FCFE1C925AEF5E5E4C13E76BE2129F114527A467A6227FE22BB0\ 2B6866ADBA5F6B11E8F85DFB4A8E # Generated by Crypto++ 5.5.2 [RSASSA/EMSA3(SHA-224)] 11:\ BA54D5BBCC6D8E5A4DB29FF530C38DFBA7F970DDD062B74AB768F4E44353CA6DD790F4ADD677\ 38BAFE49D30ECDF22C55A856440F43D718433D5A508BF6A77183:\ F08BDCEE74246EDD61D1FFCECE322630219FC68EFB5337AC80AA88630D2332654397759B18BD\ F709004AFC150F2EE339B60F72E16C1BA3B6EEF910F698C2EDA1:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 9B3E6BA1DC0AF7133861A0EA2B956BE516918292AB708FF762548DCFBB02B1742AA3331DEF07\ 7504718F827C13E27F9102EE7B93D36E601C5A3E687F2F7289A20BDA7BDD1463BC2BED074AB9\ 8E7A4F3A0ECD579E8F40679D877DA0A8A7B97115A1CB965FD0B3BB65C84F62E5BE38E6C2E328\ D8940DA14522E53075386712B8A4 11:\ EB5C08446CE56F03AB2B0AE7A4D9E4EF1FE2D706FB226577B03CEF9F004B3FD258814319F586\ BFBAC234DBB5E9ADA33F638DB333FA948824C0C5F917E05201B03CAB20558F7D7CDB0DE42549\ D51EBA4CF93068433F02727472C2559626D47A8E071B0AD848FD5B35965FB8E06DB4F65995CA\ E876227DDD8A34C401ABE5BCB11D:\ F4833CD56CEF4C9DACE2039CA3FB287172CF37C899D1D3267EC0D14EB967E42859A001CFA440\ 9DC1D8BA4952C5EA13D12FC4C016617F9062778E5B9F3BF0FB79C2870BE355F39BACC4B6178F\ FD0B7A1C8B545A3FC781C1A2D54A962A93F7E41CE144B6C6E22AD3CF61DDB05A8F27508DD5AB\ 6725D8D0579732E621C33360ED7B:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ D685C80FB40EC09FC602880E6E55BCBA96332964505BA8BDFB8A181DC6700C2CBCDE6BD35E13\ 32E56FC5F6E2F80AAD046F9CCBBA36A6E3CB115969A2AF661CBAD42AC0D3C22662CFDE9C8544\ E41018E88D5BD173AA59D0FE5FD0731730C44261E792F7958C76D7587CDDDF9AF0B99D70BFB7\ 4D6DCA952ADDCBBBAA711E6226E2568E532AE8DBF2BA2AE80F35DFCE1EFCC11BF68C100B32B4\ 8B2D4E22D782B42C97DF8B18164B3E73CC6A129F99E11AF30830A54376C9A5BE4A7F7B3C0115\ F2B595EC5A4D841D55048E6BB226FC53D5998079E5F38D51BD1281B77E9E69E44DF8F1ED0F6A\ BC10D2E11B941ABE6238ECEEFDC277EE6719B43F54317E98029AB437 10001:\ F75306FB8700184C998959EB1D271B3DBAB883726D270E21B91CA78C1BD148D1D428533853A8\ 8E4AB4E4CB033CF27E2A8A6C1A12880206D6B4D74A9373F35B5F:\ E615C504FD127394B4522FF5BC0143C93A07636D184B9B40DF6461E3BAACC23AA1937C52B06E\ 95849692465060D092713D36B9E49FD76CA86D2389CF1B0F1A73:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 04C401283813191B750C8F6CEE6C41C1C9ADB7CBE26685E568D046D7F073775F19F9ACA0A43A\ B9A6C200C07174C6AC6A67E89B6367DBA7135DC5C2236218BE42B7DEC0A40C1E165BF24F9B33\ E69AB196B8FAADBDCAA657512B1641AF7D0DBBB9BE1BFD8895C6B79EA30C104A5DF1380182D3\ D2C9B553D59F564DB82D7940E18A # Generated by Crypto++ 5.5.2 [RSASSA/EMSA3(SHA-256)] 10001:\ B6661EB38B9C75A91E65FE5E6743C6949D6415D57CC4BCE84ED81E39EB8B4A77A867A15A3415\ 5B7E1CCCF972D6A06D73:\ B85D9FA07D4F7CE1CF05150256FCE15BF7E647CDA350DDC574E72104DBDAF1F1F87930D1FAD8\ C8E3094746ABE9E8C46B:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 275AB9846DD6999FDF4FC46F0E454B3CFF8C125096C0880DA957D65766A6298EDB41AE0F33DB\ 9FB15F9369E98B2738B37FF7165175E529B2349961C48B9459432FD58795052ADC2506D0B5F8\ 37879E771C66F59880F1371D78290B03F86454F9 10001:\ EF97A42D03FAA9A42A22D161B7819A932C4C5FAF5338A6E57C4379AE8C0A32C924B1398A53E1\ 37409B322A0E793090361417290C159D7B34A6A62A0D2E84D997:\ DAA28E8CB6CCBF9A4EA5884AF7C791DC08BAEFEAB75F23EADE53A7D29D26B35CBE806C65886C\ 70597A03007949F556924E7D60E5298689E4D5F4E46311E48BAB:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 23223B652D5D0A17866DE55C77ECDA94A3B69ABB8CE335E5ACC03FE33A7D2D8257FF4227036D\ CAAD05820C135E2E5F332A01D77BE4FB3013529F6B1B9255669FFB64C134DBF01995CBF24C17\ 35AE0028381B40A657E5C28D983478632C7975CD0C776CD8CFC3796DE7D8FDA86A0112ECE359\ 361B35EB6DBDC7F5E44D469AED13 10001:\ D3B065134310F6A02A68E78829DBE58C5AFB148D95B30C7E54D8F463F0A66DFD3A78E2A15A26\ 18D5C6C972AD2BB14785E524CAFBA3B652C94D8F2579FA9C1F05:\ F2CD098B9EBBD2B5AD589C30FD963EACD78D559190EB4D06880C8BA12EB55404D43AD51562D4\ BC9B61B304AE664D22290AC6F4E20601A4DB97FE16A5DD0ACA5F:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 382C32D8EED4F7364BF68925FBE83338957605B064109AFF275457A3EE9BE4FD1EC1EBFBB3A4\ 72C3395F44DDBF378FEFEFC2B64CBFBC9C557B315DF6E8016FE3BBACB56A7DD3505F16A5F4A2\ 469250C77CEAFD2DE55D2FE96250E50CE813D529A909B8262456FFEF298D7472A8F5264CE667\ 24ABDB9F65C64C3747227804BCD1 10001:\ C24FBEA1E9F303117CF19C1EAC7721AF5DC228E39007336E48B1462CB5E7D2C9E61A69E8F501\ FD26E71F5D881398A5FDE56FF565EED8715AA2CC0B46D78DB74F083253649A22E0C99DAABC26\ 3E87FE3F713A1270FBE3843FA596F35D43E577FB:\ E346A9F2672A70264D5F2EAC6F17FEFA50457ACF92F30F4E849ADDDE6F3B95FDB6E17F55B939\ D50FEE1D2F6114B0F7FB74AE8B4AACDD491FB085B2ED7D125A32121DFA87F2319F8357BEE127\ F103EB1B31D98A52403498476A1E34F18B6CBAFB:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 8F4A78545DD1F10329A692EC66DBAE0B5D3302FCF6AA2561DF2CC73FA16C71EA947C919BA326\ 50A7C1F7938BDCF75C4E77CFEA7BAB8A083EDB531F95B4A67CF93CB5EDFE6B4BA07CEF887CA6\ 10C9A917C374399BE8CCD4B84BD15295C02028502348278E50A64D4B990E9F754C64FD55B8C4\ E6E7EF8A2A2182864159A1BA012F325B3BF7F1B23D44593B749E51F382C290FBC6AD65EF5011\ 47F3A9A5A92AC5EBE4C82E259A212E52C95F94BA91CDFA88DF26BED55E4305EB08675A430CAC5B04 # Generated by Crypto++ 5.5.2 [RSASSA/EMSA3(SHA-384)] 10001:\ D6392D7E84F9A7233FAEE9B2F386C7921BC9974393EB3581EAFA66D8E7DDFB75BC2F0AF8A674\ 6563FF9C80A420B56BD1:\ D6D02FCFD0CEBEC15844AB927C37BAE12E8EFD552FF706B3B632A30E5FC14C39BC0ACF423C73\ C412BC8AF0A473276283:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 8CF24497F9C2DDB9183822444F2074CA22C5D51B52E3F513919EA69BDA0082B9C40680EB813B\ E914E95EB9DACD3A3A238AAA675FB7DEFD55D2F981D5B3D6B9467DB8060081AE6F56EC7C0FC6\ E6E078D614497ECF896DE4DAA4F679F683FE0A2D 10001:\ E39E5402011ED488B404C162C767046DFF79619DBA222F7EBF8B0FF0525F1213DA8316DCFB6B\ 35E22987CDF373EBD91F9467491391345DB4F15DE2D1928563A5:\ D1B9E418890830E84D570E5209BFE6BC5A619C01F27E7EEDC1DD8FF0153B5891FEBC94A1843B\ FFE8F8D3CEB9351CA75EE208AE2A9EC08DD52445AB3194489553:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 64A89B5FFD98351CEFC750C278B2E4A8808EFD83EA57FE6752AE245E058A2BB821DF2AE980F1\ 9618C2C6201CE72FE46F9E9CD0502B12EEE6A9E180B3FF61C97640CC82DB7D583FB17A78BA88\ 86884FEDB1D4F27929A203069B142FC314D27E4342AAFFC5100F7BDFF8162CAA98DC3A8A1F5C\ 5DD7B7234F67F1AEB34D911E7CD6 10001:\ C773EB83CEAF603D4C2D187CCE60A2564C7358C318E8817E183BDFA03BFBDE7EAB98A3A42E97\ 30F5E9D6F0849B438C7AB00E3B3032DEE05CBF32888BD63245CD:\ BE95654D6DB5FDEFA2D3CB805687BD08D859982896071C433CA0C5051A44D8F49F1311BD35C4\ 9C8B6CA0CA746BE1ECF2126302758A5423BC0926AF4E96517931:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 519A0A554D5C8B4E749CDD92C21DCD8CBD5BB4494E9F15C91876F073756A896EE5A983A9AB72\ 6CCC6BDC0AA093B6643D683BFAAFE5BCD1A637ACBCA2B14C652C4926671A12275D4B3BEAA8A9\ D5C57182B7AD6F8C89FE6A2555C8B8057A431FFF5BF1902E52183FFAD4D916563EA765809E92\ 6C626505FBDCE74ECD70F1EADEDD 10001:\ F914636EBBB1EBF51B642B8B8DE6BBB43390119D517139C9C6072C60A16E9E4CBD0598F929FF\ D6B25C904CEFF6A434FD101B095E3AB5D454D07D813DF7823CEE33F638519BD2103E014DE215\ 0B6D8BAFAA698BB5619930FB39C64C3C1C31E72D:\ F06C3A4F26E3144A3030B8424C41A7709812EEDABF37FB919DECA5554EF2AA2AFB4DB9A0986D\ 10ECFBA5897F43A7709FE7D3526C57A6EFAEFC116E26ECE0C577A63CF83638EB24911FAF54E0\ C468215BAA4151178ACF872D2E5B3399A97C31F7:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 3577C7731A6D1E436F66F4367AE53EC80A3B632A8755DA97CA1DC7B5B7D6A946CA0D6AD0BA2B\ B6C0EB8E2BC74725B606C00D6E96C87B75E73FD80F68DA2C829C57963855A85A66FD857FBF2C\ 7BF584501E5ED58BA06D5CE73FAA45BBE2F5C806409507A7F403E95FBC2971E0B7F399603F5E\ EC3A67F4C912369A9FE03467AF0139CAF9D92A1364ECA159FBA485A73A10B9AA33667810707F\ E8061F3632C43178BBA3C5113734F50A6360347A6119F87AD6A7A2308C9E42FA5FE096558586AC0D # Generated by Crypto++ 5.5.2 [RSASSA/EMSA3(SHA-512)] 10001:\ FF1414834AF27B94F7818DC435D95D756FCC9F4F4DD9B25FFDC23BDACB511DAA9F76E39B411D\ AD20D543AF198F8CC867:\ F025AE2AC9135A5E23B1D90E17DEEAA872D45E6700CF011015E949429D320142EC0A802B7863\ C8BDF99313FDAF2BF5CF:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 0C98A091C5B53A71F0BA4FD4CE5F58B0773070C05DB916B4FCFE5298267F28C457322A3AB262\ E44079CE440DB56997AFCF30AF33E13DE774D066F07B92CBB8B6321F2DD967A94524DF050A1C\ 67AAA05D28C232472FAB214CE819792DD1147750 10001:\ B876A61A8F19113F9D5396BDDB5F54FFCCF8A35D1255979C797246F96D94D99A5B000B2DE9AB\ 81D1BBD16FFAAA092029500472F1FAAEADDC9E8D077F2E694B81:\ DB86AB91CF13E90943B0D18016DADF2C4702AC4D6989299CF8338C3AB1620C8532D5297929D0\ C1A0F76AA4D4DFC78D5D407399EEF35483BA6C8ACCC0A0C09C05:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 84E79B96AA2A3C43EA41FA415ECBF88D3DF93C15D8378EBC51CE114B6FAB16A8B07A3DD9148E\ D1018A0E0385B19BE2AAEF0CB7603E3493DAA92C1ADB18EC5489BBCEAB9FDBEC41B423109A74\ 551425DBEA6A52A61530ACB8F955D102EBDCD15F2C96F01461DC1F196A87ED25F0B61DEB24B9\ B7A02324B095219D3EB01855A40F 10001:\ D37A85110EE0F0CF8843EDFA1480F3CA4798798B5B592AD80F40C9E42BD21B162979F6002F64\ EDDAC84E1D6DF41E02ABBC85D862B9ABE6B38FA9193701826CC9:\ F3DA6327A3276EC647E5B1B9E8846314C2F7B5E84D3DA78E1EF18714158CAA3D700F438A03A4\ D45A8B7422943F64ADCD582271BC30A687F6FF73A26263E89621:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ C18FF41DB165E740B5BE6D649E9C5F01E4C84862FA453DBD12485975F4BA802A460AC263AB1F\ BCB53ABD46CA057C195A70381A83707515B154E2B5DA3529C8986034C47F6AE706D06B96D5A2\ 4B9A370276CF93129DB3519C15BCB2A35150C7EFE1B06CAFDD7DAA0B111E10DEBCCF53C04CF7\ 5D86DCD03F9B2C20336EC3FCD1C8 10001:\ C1CC91EFC0B3EA7938897E5675CE09E44A531492742770EA9C2AF96F7614F6ED4B6A17E85DBE\ F6A24652CAACEA68E4E0F4100BAABE78F744668A973727B3B188194190F67D6E4E152E1498F9\ 45E7714CAAE6C37E215E2511596720C7B9DE49AD:\ EB4D1A619C6E3947B9E3B07C84DD87244E130251B3F9C5D22B0162DBDA3BDFFED664C14848E9\ 9B02523B3D382D15546F8414888E4D3F95DD542F48C46CEFE19A85F36D98DBFC4BBBF3B5A1E6\ 0BCE38DC5DFC787C5D4C3B72011CAB73912A41F3:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 0437766509CEEFEA9ABC433289884E578D65BA463C572ED61BF3A48AE34769E8DDA73F2F4898\ 431068D518C16B7057467D7402796A0665A7FC7C4D8FD30077D4ABC08CB1E5207D78F130843D\ 42928F1968F49A87481B1B40B441E6E1135025BB23F8A9EA1F43F27EDF03FCF36EDFBE418A89\ F7C11184571D8D80AFCEDF41A4F93FCFBD73A39D7BFAC2E263FCF91D4264E8571D044B1D568B\ BA6F228FD47324132B2274EBF26CD4BC7520A2DBFFFBEE41A5DF72A5D8FD2C6647E62C28F04995AB [RSASSA/EMSA3(RIPEMD-160)] # Generated by Crypto++ 5.5.2 10001:\ BB305054066BEE5B66E9C651583F6B5F4005D3CE970520CDF277EF463EF1EF1B10E9428C6BCA\ 4254F42E40F0040C7577:\ BE54384C3A200BBB597B8A59F8165D553B24B2A9F96236521580AB79924EBC6095E0905E58A7\ C1BB302DFDA4FE489395:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 05C9082DAF39A7A706F6AE5CC1FE1A26F820301257DCDDB7B4DD91DB01B472E4C855E1AE6108\ C32967659C69169197949BA58A194FFDE8449911FD5A8E7751A4E15CCED118DF2FF677D89827\ 99A76B59409BC76A31E696B26FEA324EC2CB6558 10001:\ D59E1378C1E752ACA0454839C11AA792AB2F0064920CABC3697A1701671DE4178103D8C619BA\ 12B453B3575BAD2E61CDD02C4509F188FF01B052121E2EB8634F:\ F9761A2C67B685690846BD6746F0741FEACF188808B441CC66A54FA21B68C9CCA6F1BE26BD3C\ CD67C11C0B6CD048CA5904A56F368D16843EE1E086B4A8461C6B:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 50971DC72D885146BCD0AE6D48271A71FEA3EFBD2B23F94F07333F421939F44DF8CA92CE88C0\ 10A65540F904D6FF9E2C4A4A0755CB21D6181581BB77FC58042A1A6F9993B24BC048B06F1985\ A08CF902C06B0DAEB3997DB94398FC26C7E3EAF0D0787BFA3370C1E5E186F2064B803679B05E\ 481F0363895240FF54FF88E03C59 10001:\ EA0E165F4F81A6A6ED0FC49F26DE95FB7C42ACE29E650EBFFA2B1093389C987EC43B601B02E0\ D3596D9718062CB071576D31BECB98E53570187CA122F3E20A83:\ B731579363899B63B6E8857F983E0AFB56CD07EA8D3225A7A182BA2EAB6D3BDE2CC43620447E\ A2D76947A7BD83439213271002261749F3E9F31E30209106F945:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 5A7A06EAA128549977CD5C0CDD8E1E4689EBEEB06B6EDDC2E39FEBE7BCF4D0068CB14CA8FF11\ 853C00A868F3B520F6503EED8055E9801AF20A277232C037079ECF06AEFD91CFAF387E4EC0C1\ 2C8D4635C5FA5FEFAD2F67E770FD7FD4115FF98A9B4883FC9D2BBD236126AB45EA3A05BF9F0A\ 355BD5F2AEA9158C4D70DF4A83FD 10001:\ DBB4D78472CE88FD41DAF8F0A6AE2D147BF34EDFFCD14B3855F5CE7C2ADA8AD08569BEA843B1\ B568BE73BC7A567175114F8F493BBA87E777426828CDF044E08D1DB7E54231221FC64DE7A993\ EF4281687EBC11E654E58BDAB125E289CFECC779:\ D8CD194A4EA3650C927355B187BFE4367604F4BCE10D7633529455A6D11B8AE2745F9A3F0C99\ D85853D0D645F25D7C9D03AAE28AA85FA3F434D72BBDCDB74AF5B2910B1BDBA9618FB5ADDA0F\ 34E201003E832764A55E6B625F2BB66DC124ECB1:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 85A0774004DF91004DF8A118EEB46EBEFFE690C964BC2F4D1429C76FB19B44969BA80C492FAD\ BCAC6E36A1F118C3AB8E9BBE0DCE93E7B938E97177B3621CAAB19F1CBDC0AE9261B774782FDC\ D2DB62AEB93F2EFB16386C5D1439A5CA6545D59FA11BD330BC0F49336FADF0A7EBF2636F6037\ 364DAFAEA4FEC9C290D34CF68FB1D9698E36385E56058CE62C0D25B98F95DA416AE9A5697CD2\ 6305D8DA193C7BA1AB9F66EDAC9087C9495B4B40B50D9812F2F2F6FB9FBDAD19B243FAFDCA7CEF2A [RSASSA/EMSA3(Tiger)] 10001:\ D402D64E23A5EA4FE4A256B14BBDF89832C814E0400B3C9673774073AE5D6EEE039C0744D486\ 3A0492DE49D402066A69:\ FE7202E1A686745A0576A21FF1603090EA5CE042BBC943ED9BD4E931271542C77A12E6E1B5E5\ FEEC5B90B5EA27D90237:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 908DD085BB0A924EECEA7F3DBDCDEFB8989A1F6971DE434F227289733F24D3F66AFF294BBF9D\ 23E80CCA352F232076397D5A862D4AE32DDC901C67416FECEAD311714105FF46044B0996CCC3\ 2938CE2EB5A95EC8E0631516BCA3855C82A712B7 10001:\ E826441E9CEDB949A69AE8C15C088F507B3095CAF8BDADF49F317DEABF45113F70E90910C182\ EC1A2C433FCFF181CECC9211BAF3943517FCB32383F4CCBE526B:\ C3B08505952722C91C384AA7962FDB3F96B27EDA6D7C65D081D924BCF8CF8AC6B8BECD12AA81\ BD8D0B6CC8CA4646240A66A3718F89DC324C5E315D40F90AA51B:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 0F41FBA33B6E3A11EF94F8FD736431288C277B2E00DEE94B447FECD215E61E19B383687911BF\ B2F46C0A9EF1AA3A787487C88A8C43006BC7D4D6C1D6137939B6B815D532EACFE05FEA6BC3A7\ 57E2A625F4188CE30792D6C75F205EB2C6515FC639780A86E1ED56C32CB223C7FBA8479682AC\ 24FCCC993F32EF55F818DC2F018E 10001:\ E493B0520556D6D50DACBF90EC41772CAE3873000EF163A94CE9F52BEF1F7962D7933E727ED3\ EB4F03633CB3868F59BEC993B7DDF28FAA315456CA381D6650D5:\ B996BB66BDF65F2FFDE68C156848DEC56BECEFBB6604CB0FE04A404D592CD13EC44DC0C5511B\ 25B7D5AB808B3FC16873BFF19210AD7245FC806062A6C72F3A47:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 0AF90FE65CB6FCB7BE90C5090943DC697534F9ED3A384FCE6F85AD5FDA36644D4BD68A0EC363\ 98E7F704796244B4793DF320F6D034D62AA4ECC579474D4EEA0E5F91C82F729B5A62A8314022\ 9C5DA882A6EB0D7DBC3436B73D1B493BFD7ECD32E11716A424A5FB2195A7865D1DCB05FCB95C\ BED76FC52A85DE2AA9A9C2AA29D2 10001:\ C0800968E0C6E46099141267F195911D4EE36876E7D79DC6CB679FB1FE7C18387100CA9702F8\ 3E373EDB3799CBD97BBE966FE8B4A344BA4CCE3FEF86275ED0C42A1089B90C63010A135064EC\ 79769D2FC2B44ACC280AA7601329C8EB6E9C1AEB:\ D939658B1F8C590B3A190CBCDFB9CAD087033FBCD775D18EA9EE5461EBFDB3286A488D196F03\ 426A939BC387A864E1657FFFD1C31651D8A7CBD6E57190C98590EE97BAE08CC29FB9822B4949\ 321BBEE59E9F8E5CBA8A62A1F3BE75E8F24DAFD1:\ 7072696F6E636F7270202D20676C6F62616C20696E6672617374727563747572652C20646174\ 61206D696E696E672C206578706572742073797374656D732C2063727970746F677261706879\ 2C2073746567616E6F6772617068792C20646563656E7472616C697A6564207472757374206D\ 616E6167656D656E742C206661756C7420746F6C6572616E63652C207265706C69636174696F\ 6E20616E642063616368696E672C2073656C662D6865616C696E6720736F6674776172652C20\ 776972656C65737320636F6D6D756E69636174696F6E732C20656D6265646465642073797374\ 656D732C206D6963726F6B65726E656C20617263686974656374757265732C206D7574616E74\ 732C206379626F726765722E0A0A776520646F6E277420746F79::\ 05C402CB39615771565E3F6E2C2CBC81B7528EFB38D19CB493E6F3525198D7B2604706811FC8\ A28D9AE028C31326E5C43D1EF9F02FA74D12C9D8EB3639520BD190F2084E34DAFD70E761C9EB\ 1D410034A90A8475410E5DA5DDC5B5628060B1CEDE86E8C86D1ABFF24F2EFD725BEAB66957E2\ 464B57379308556D2E93F28743F4A652785B29247A5DB2A3D913C3B5C19ECC8F46FEB3C3C41A\ 4360D557BDE14022897F312FEE1F964508DE44A4B5CA23AF1D2A2D00C2183D0D5733E3CC3EF76A7D # These are (some of) the official RSADSI PSS test vectors, # plus a few specially constructed ones at the end [RSASSA/EMSA4(SHA-1)] 10001:\ E7E8942720A877517273A356053EA2A1BC0C94AA72D55C6E86296B2DFC967948\ C0A72CBCCCA7EACB35706E09A1DF55A1535BD9B3CC34160B3B6DCD3EDA8E6443:\ B69DCA1CF7D4D7EC81E75B90FCCA874ABCDE123FD2700180AA90479B6E48DE8D\ 67ED24F9F19D85BA275874F542CD20DC723E6963364A1F9425452B269A6799FD:\ 10AAE9A0AB0B595D0841207B700D48D75FAEDDE3B775CD6B4CC88AE06E4694EC\ 74BA18F8520D4F5EA69CBBE7CC2BEBA43EFDC10215AC4EB32DC302A1F53DC6C4\ 352267E7936CFEBF7C8D67035784A3909FA859C7B7B59B8E39C5C2349F1886B7\ 05A30267D402F7486AB4F58CAD5D69ADB17AB8CD0CE1CAF5025AF4AE24B1FB87\ 94C6070CC09A51E2F9911311E3877D0044C71C57A993395008806B723AC38373\ D395481818528C1E7053739282053529510E935CD0FA77B8FA53CC2D474BD4FB\ 3CC5C672D6FFDC90A00F9848712C4BCFE46C60573659B11E6457E861F0F604B6\ 138D144F8CE4E2DA73:A8AB69DD801F0074C2A1FC60649836C616D99681:\ 2A34F6125E1F6B0BF971E84FBD41C632BE8F2C2ACE7DE8B6926E31FF93E9AF98\ 7FBC06E51E9BE14F5198F91F3F953BD67DA60A9DF59764C3DC0FE08E1CBEF0B7\ 5F868D10AD3FBA749FEF59FB6DAC46A0D6E504369331586F58E4628F39AA2789\ 82543BC0EEB537DC61958019B394FB273F215858A0A01AC4D650B955C67F4C58 10001:\ D17F655BF27C8B16D35462C905CC04A26F37E2A67FA9C0CE0DCED472394A0DF7\ 43FE7F929E378EFDB368EDDFF453CF007AF6D948E0ADE757371F8A711E278F6B:\ C6D92B6FEE7414D1358CE1546FB62987530B90BD15E0F14963A5E2635ADB6934\ 7EC0C01B2AB1763FD8AC1A592FB22757463A982425BB97A3A437C5BF86D03F2F:\ 859EEF2FD78ACA00308BDC471193BF55BF9D78DB8F8A672B484634F3C9C26E6478AE1026\ 0FE0DD8C082E53A5293AF2173CD50C6D5D354FEBF78B26021C25C02712E78CD4694C9F46\ 9777E451E7F8E9E04CD3739C6BBFEDAE487FB55644E9CA74FF77A53CB729802F6ED4A5FF\ A8BA159890FC:E3B5D5D002C1BCE50C2B65EF88A188D83BCE7E61:\ 8DAA627D3DE7595D63056C7EC659E54406F10610128BAAE821C8B2A0F3936D54DC3BDCE4\ 6689F6B7951BB18E840542769718D5715D210D85EFBB596192032C42BE4C29972C856275\ EB6D5A45F05F51876FC6743DEDDD28CAEC9BB30EA99E02C3488269604FE497F74CCD7C7F\ CA1671897123CBD30DEF5D54A2B5536AD90A747E 10001:\ E7E8942720A877517273A356053EA2A1BC0C94AA72D55C6E86296B2DFC967948\ C0A72CBCCCA7EACB35706E09A1DF55A1535BD9B3CC34160B3B6DCD3EDA8E6443:\ B69DCA1CF7D4D7EC81E75B90FCCA874ABCDE123FD2700180AA90479B6E48DE8D\ 67ED24F9F19D85BA275874F542CD20DC723E6963364A1F9425452B269A6799FD:\ BC656747FA9EAFB3F0:056F00985DE14D8EF5CEA9E82F8C27BEF720335E:\ 4609793B23E9D09362DC21BB47DA0B4F3A7622649A47D464019B9AEAFE53359C\ 178C91CD58BA6BCB78BE0346A7BC637F4B873D4BAB38EE661F199634C547A1AD\ 8442E03DA015B136E543F7AB07C0C13E4225B8DE8CCE25D4F6EB8400F81F7E18\ 33B7EE6E334D370964CA79FDB872B4D75223B5EEB08101591FB532D155A6DE87 10001:\ 016601E926A0F8C9E26ECAB769EA65A5E7C52CC9E080EF519457C644DA6891C5A1\ 04D3EA7955929A22E7C68A7AF9FCAD777C3CCC2B9E3D3650BCE404399B7E59D1:\ 014EAFA1D4D0184DA7E31F877D1281DDDA625664869E8379E67AD3B75EAE74A580\ E9827ABD6EB7A002CB5411F5266797768FB8E95AE40E3E8A01F35FF89E56C079:\ DABA032066263FAEDB659848115278A52C44FAA3A76F37515ED336321072C40A\ 9D9B53BC05014078ADF520875146AAE70FF060226DCB7B1F1FC27E9360:\ 57BF160BCB02BB1DC7280CF0458530B7D2832FF7:\ 014C5BA5338328CCC6E7A90BF1C0AB3FD606FF4796D3C12E4B639ED9136A5FEC\ 6C16D8884BDD99CFDC521456B0742B736868CF90DE099ADB8D5FFD1DEFF39BA4\ 007AB746CEFDB22D7DF0E225F54627DC65466131721B90AF445363A8358B9F60\ 7642F78FAB0AB0F43B7168D64BAE70D8827848D8EF1E421C5754DDF42C2589B5B3 10001:\ 016601E926A0F8C9E26ECAB769EA65A5E7C52CC9E080EF519457C644DA6891C5A1\ 04D3EA7955929A22E7C68A7AF9FCAD777C3CCC2B9E3D3650BCE404399B7E59D1:\ 014EAFA1D4D0184DA7E31F877D1281DDDA625664869E8379E67AD3B75EAE74A580\ E9827ABD6EB7A002CB5411F5266797768FB8E95AE40E3E8A01F35FF89E56C079:\ 52A1D96C8AC39E41E455809801B927A5B445C10D902A0DCD3850D22A66D2BB07\ 03E67D5867114595AABF5A7AEB5A8F87034BBB30E13CFD4817A9BE7623002360\ 6D0286A3FAF8A4D22B728EC518079F9E64526E3A0CC7941AA338C437997C680C\ CAC67C66BFA1:FCA862068BCE2246724B708A0519DA17E648688C:\ 007F0030018F53CDC71F23D03659FDE54D4241F758A750B42F185F87578520C3\ 0742AFD84359B6E6E8D3ED959DC6FE486BEDC8E2CF001F63A7ABE16256A1B84D\ F0D249FC05D3194CE5F0912742DBBF80DD174F6C51F6BAD7F16CF3364EBA095A\ 06267DC3793803AC7526AEBE0A475D38B8C2247AB51C4898DF7047DC6ADF52C6C4 10001:\ 01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ 58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ 01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ 65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ 594B37333BBB2C84524A87C1A01F75FCEC0E3256F108E38DCA36D70D0057:\ F31AD6C8CF89DF78ED77FEACBCC2F8B0A8E4CFAA:\ 0088B135FB1794B6B96C4A3E678197F8CAC52B64B2FE907D6F27DE761124964A\ 99A01A882740ECFAED6C01A47464BB05182313C01338A8CD097214CD68CA103B\ D57D3BC9E816213E61D784F182467ABF8A01CF253E99A156EAA8E3E1F90E3C6E\ 4E3AA2D83ED0345B89FAFC9C26077C14B6AC51454FA26E446E3A2F153B2B16797F 10001:\ 01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ 58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ 01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ 65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ 8B769528884A0D1FFD090CF102993E796DADCFBDDD38E44FF6324CA451:\ FCF9F0E1F199A3D1D0DA681C5B8606FC642939F7:\ 02A5F0A858A0864A4F65017A7D69454F3F973A2999839B7BBC48BF7864116917\ 9556F595FA41F6FF18E286C2783079BC0910EE9CC34F49BA681124F923DFA88F\ 426141A368A5F5A930C628C2C3C200E18A7644721A0CBEC6DD3F6279BDE3E8F2\ BE5E2D4EE56F97E7CEAF33054BE7042BD91A63BB09F897BD41E81197DEE99B11AF 10001:\ 01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ 58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ 01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ 65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ 1ABDBA489C5ADA2F995ED16F19D5A94D9E6EC34A8D84F84557D26E5EF9B02B22\ 887E3F9A4B690AD1149209C20C61431F0C017C36C2657B35D7B07D3F5AD87085\ 07A9C1B831DF835A56F831071814EA5D3D8D8F6ADE40CBA38B42DB7A2D3D7A29\ C8F0A79A7838CF58A9757FA2FE4C40DF9BAA193BFC6F92B123AD57B07ACE3E6A\ C068C9F106AFD9EEB03B4F37C25DBFBCFB3071F6F9771766D072F3BB070AF660\ 5532973AE25051:986E7C43DBB671BD41B9A7F4B6AFC80E805F2423:\ 0244BCD1C8C16955736C803BE401272E18CB990811B14F72DB964124D5FA7606\ 49CBB57AFB8755DBB62BF51F466CF23A0A1607576E983D778FCEFFA92DF7548A\ EA8EA4ECAD2C29DD9F95BC07FE91ECF8BEE255BFE8762FD7690AA9BFA4FA0849\ EF728C2C42C4532364522DF2AB7F9F8A03B63F7A499175828668F5EF5A29E3802C 10001:\ 01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ 58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ 01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ 65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ 8FB431F5EE792B6C2AC7DB53CC428655AEB32D03F4E889C5C25DE683C461B53A\ CF89F9F8D3AABDF6B9F0C2A1DE12E15B49EDB3919A652FE9491C25A7FCE1F722\ C2543608B69DC375EC:F8312D9C8EEA13EC0A4C7B98120C87509087C478:\ 0196F12A005B98129C8DF13C4CB16F8AA887D3C40D96DF3A88E7532EF39CD992\ F273ABC370BC1BE6F097CFEBBF0118FD9EF4B927155F3DF22B904D90702D1F7B\ A7A52BED8B8942F412CD7BD676C9D18E170391DCD345C06A730964B3F30BCCE0\ BB20BA106F9AB0EEB39CF8A6607F75C0347F0AF79F16AFA081D2C92D1EE6F836B8 10001:\ 01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ 58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ 01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ 65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ FEF4161DFAAF9C5295051DFC1FF3810C8C9EC2E866F7075422C8EC4216A9C4FF\ 49427D483CAE10C8534A41B2FD15FEE06960EC6FB3F7A7E94A2F8A2E3E43DC4A\ 40576C3097AC953B1DE86F0B4ED36D644F23AE14425529622464CA0CBF0B1741\ 347238157FAB59E4DE5524096D62BAEC63AC64:\ 50327EFEC6292F98019FC67A2A6638563E9B6E2D:\ 021ECA3AB4892264EC22411A752D92221076D4E01C0E6F0DDE9AFD26BA5ACF6D\ 739EF987545D16683E5674C9E70F1DE649D7E61D48D0CAEB4FB4D8B24FBA84A6\ E3108FEE7D0705973266AC524B4AD280F7AE17DC59D96D3351586B5A3BDB895D\ 1E1F7820AC6135D8753480998382BA32B7349559608C38745290A85EF4E9F9BD83 10001:\ 01BD36E18ECE4B0FDB2E9C9D548BD1A7D6E2C21C6FDC35074A1D05B1C6C8B3D5\ 58EA2639C9A9A421680169317252558BD148AD215AAC550E2DCF12A82D0EBFE853:\ 01B1B656AD86D8E19D5DC86292B3A192FDF6E0DD37877BAD14822FA00190CAB2\ 65F90D3F02057B6F54D6ECB14491E5ADEACEBC48BF0EBD2A2AD26D402E54F61651:\ EFD237BB098A443AEEB2BF6C3F8C81B8C01B7FCB3FEB:\ B0DE3FC25B65F5AF96B1D5CC3B27D0C6053087B3:\ 012FAFEC862F56E9E92F60AB0C77824F4299A0CA734ED26E0644D5D222C7F0BD\ E03964F8E70A5CB65ED44E44D56AE0EDF1FF86CA032CC5DD4404DBB76AB85458\ 6C44EED8336D08D457CE6C03693B45C0F1EFEF93624B95B8EC169C616D20E553\ 8EBC0B6737A6F82B4BC0570924FC6B35759A3348426279F8B3D7744E2D222426CE 10001:\ 029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ 9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ 020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ 7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ 9FB03B827C8217D9:ED7C98C95F30974FBE4FBDDCF0F28D6021C0E91D:\ 0323D5B7BF20BA4539289AE452AE4297080FEFF4518423FF4811A817837E7D82\ F1836CDFAB54514FF0887BDDEEBF40BF99B047ABC3ECFA6A37A3EF00F4A0C4A8\ 8AAE0904B745C846C4107E8797723E8AC810D9E3D95DFA30FF4966F4D75D1376\ 8D20857F2B1406F264CFE75E27D7652F4B5ED3575F28A702F8C4ED9CF9B2D44948 10001:\ 029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ 9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ 020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ 7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ 0CA2AD77797ECE86DE5BF768750DDB5ED6A3116AD99BBD17EDF7F782F0DB1CD0\ 5B0F677468C5EA420DC116B10E80D110DE2B0461EA14A38BE68620392E7E893C\ B4EA9393FB886C20FF790642305BF302003892E54DF9F667509DC53920DF583F\ 50A3DD61ABB6FAB75D600377E383E6ACA6710EEEA27156E06752C94CE25AE99F\ CBF8592DBE2D7E27453CB44DE07100EBB1A2A19811A478ADBEAB270F94E8FE36\ 9D90B3CA612F9F:22D71D54363A4217AA55113F059B3384E3E57E44:\ 049D0185845A264D28FEB1E69EDAEC090609E8E46D93ABB38371CE51F4AA65A5\ 99BDAAA81D24FBA66A08A116CB644F3F1E653D95C89DB8BBD5DAAC2709C89840\ 00178410A7C6AA8667DDC38C741F710EC8665AA9052BE929D4E3B16782C16621\ 14C5414BB0353455C392FC28F3DB59054B5F365C49E1D156F876EE10CB4FD70598 10001:\ 029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ 9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ 020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ 7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ 288062AFC08FCDB7C5F8650B29837300461DD5676C17A20A3C8FB5148949E3F7\ 3D66B3AE82C7240E27C5B3EC4328EE7D6DDF6A6A0C9B5B15BCDA196A9D0C76B1\ 19D534D85ABD123962D583B76CE9D180BCE1CA:\ 4AF870FBC6516012CA916C70BA862AC7E8243617:\ 03FBC410A2CED59500FB99F9E2AF2781ADA74E13145624602782E2994813EEFC\ A0519ECD253B855FB626A90D771EAE028B0C47A199CBD9F8E3269734AF416359\ 9090713A3FA910FA0960652721432B971036A7181A2BC0CAB43B0B598BC62174\ 61D7DB305FF7E954C5B5BB231C39E791AF6BCFA76B147B081321F72641482A2AAD 10001:\ 029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ 9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ 020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ 7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ 6F4F9AB9501199CEF55C6CF408FE7B36C557C49D420A4763D2463C8AD44B3CFC\ 5BE2742C0E7D9B0F6608F08C7F47B693EE:\ 40D2E180FAE1EAC439C190B56C2C0E14DDF9A226:\ 0486644BC66BF75D28335A6179B10851F43F09BDED9FAC1AF33252BB9953BA42\ 98CD6466B27539A70ADAA3F89B3DB3C74AB635D122F4EE7CE557A61E59B82FFB\ 786630E5F9DB53C77D9A0C12FAB5958D4C2CE7DAA807CD89BA2CC7FCD02FF470\ CA67B229FCCE814C852C73CC93BEA35BE68459CE478E9D4655D121C8472F371D4F 10001:\ 029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ 9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ 020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ 7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ E17D20385D501955823C3F666254C1D3DD36AD5168B8F18D286FDCF67A7DAD94\ 097085FAB7ED86FE2142A28771717997EF1A7A08884EFC39356D76077AAF8245\ 9A7FAD45848875F2819B098937FE923BCC9DC442D72D754D812025090C9BC03D\ B3080C138DD63B355D0B4B85D6688AC19F4DE15084A0BA4E373B93EF4A555096\ 691915DC23C00E954CDEB20A47CD55D16C3D8681D46ED7F2ED5EA42795BE17BA\ ED25F0F4D113B3636ADDD585F16A8B5AEC0C8FA9C5F03CBF3B9B73:\ 2497DC2B4615DFAE5A663D49FFD56BF7EFC11304:\ 022A80045353904CB30CBB542D7D4990421A6EEC16A8029A8422ADFD22D6AFF8\ C4CC0294AF110A0C067EC86A7D364134459BB1AE8FF836D5A8A2579840996B32\ 0B19F13A13FAD378D931A65625DAE2739F0C53670B35D9D3CBAC08E733E4EC2B\ 83AF4B9196D63E7C4FF1DDEAE2A122791A125BFEA8DEB0DE8CCF1F4FFAF6E6FB0A 10001:\ 029232336D2838945DBA9DD7723F4E624A05F7375B927A87ABE6A893A1658FD4\ 9F47F6C7B0FA596C65FA68A23F0AB432962D18D4343BD6FD671A5EA8D148413995:\ 020EF5EFE7C5394AED2272F7E81A74F4C02D145894CB1B3CAB23A9A0710A2AFC\ 7E3329ACBB743D01F680C4D02AFB4C8FDE7E20930811BB2B995788B5E872C20BB1:\ AFBC19D479249018FDF4E09F618726440495DE11DDEEE38872D775FCEA74A238\ 96B5343C9C38D46AF0DBA224D047580CC60A65E9391CF9B59B36A860598D4E82\ 16722F993B91CFAE87BC255AF89A6A199BCA4A391EADBC3A24903C0BD667368F\ 6BE78E3FEABFB4FFD463122763740FFBBEFEAB9A25564BC5D1C24C93E422F750\ 73E2AD72BF45B10DF00B52A147128E73FEE33FA3F0577D77F80FBC2DF1BED313\ 290C12777F50:A334DB6FAEBF11081A04F87C2D621CDEC7930B9B:\ 00938DCB6D583046065F69C78DA7A1F1757066A7FA75125A9D2929F0B79A60B6\ 27B082F11F5B196F28EB9DAA6F21C05E5140F6AEF1737D2023075C05ECF04A02\ 8C686A2AB3E7D5A0664F295CE12995E890908B6AD21F0839EB65B70393A7B5AF\ D9871DE0CAA0CEDEC5B819626756209D13AB1E7BB9546A26FF37E9A51AF9FD562E 10001:\ 03F2F331F4142D4F24B43AA10279A89652D4E7537221A1A7B2A25DEB551E5DE9\ AC497411C227A94E45F91C2D1C13CC046CF4CE14E32D058734210D44A87EE1B73F:\ 034F090D73B55803030CF0361A5D8081BFB79F851523FEAC0A2124D08D4013FF\ 08487771A870D0479DC0686C62F7718DFECF024B17C9267678059171339CC00839:\ 30C7D557458B436DECFDC14D06CB7B96B06718C48D7DE57482A868AE7F065870\ A6216506D11B779323DFDF046CF5775129134B4D5689E4D9C0CE1E12D7D4B06C\ B5FC5820DECFA41BAF59BF257B32F025B7679B445B9499C92555145885992F1B\ 76F84891EE4D3BE0F5150FD5901E3A4C8ED43FD36B61D022E65AD5008DBF3329\ 3C22BFBFD07321F0F1D5FA9FDF0014C2FCB0358AAD0E354B0D29:\ 081B233B43567750BD6E78F396A88B9F6A445151:\ 0BA373F76E0921B70A8FBFE622F0BF77B28A3DB98E361051C3D7CB92AD045291\ 5A4DE9C01722F6823EEB6ADF7E0CA8290F5DE3E549890AC2A3C5950AB217BA58\ 590894952DE96F8DF111B2575215DA6C161590C745BE612476EE578ED384AB33\ E3ECE97481A252F5C79A98B5532AE00CDD62F2ECC0CD1BAEFE80D80B962193EC1D 10001:\ 03F2F331F4142D4F24B43AA10279A89652D4E7537221A1A7B2A25DEB551E5DE9\ AC497411C227A94E45F91C2D1C13CC046CF4CE14E32D058734210D44A87EE1B73F:\ 034F090D73B55803030CF0361A5D8081BFB79F851523FEAC0A2124D08D4013FF\ 08487771A870D0479DC0686C62F7718DFECF024B17C9267678059171339CC00839:\ 328C659E0A6437433CCEB73C14:\ 9AEC4A7480D5BBC42920D7CA235DB674989C9AAC:\ 0BC989853BC2EA86873271CE183A923AB65E8A53100E6DF5D87A24C4194EB797\ 813EE2A187C097DD872D591DA60C568605DD7E742D5AF4E33B11678CCB639032\ 04A3D080B0902C89ABA8868F009C0F1C0CB85810BBDD29121ABB8471FF2D39E4\ 9FD92D56C655C8E037AD18FAFBDC92C95863F7F61EA9EFA28FEA401369D19DAEA1 10001:\ 04F0548C9626AB1EBF1244934741D99A06220EFA2A5856AA0E75730B2EC96ADC\ 86BE894FA2803B53A5E85D276ACBD29AB823F80A7391BB54A5051672FB04EEB543:\ 0483E0AE47915587743FF345362B555D3962D98BB6F15F848B4C92B1771CA8ED\ 107D8D3EE65EC44517DD0FAA481A387E902F7A2E747C269E7EA44480BC538B8E5B:\ 0F6195D04A6E6FC7E2C9600DBF840C39EA8D4D624FD53507016B0E26858A5E0A\ ECD7ADA543AE5C0AB3A62599CBA0A54E6BF446E262F989978F9DDF5E9A41:\ A87B8AED07D7B8E2DAF14DDCA4AC68C4D0AABFF8:\ 086DF6B500098C120F24FF8423F727D9C61A5C9007D3B6A31CE7CF8F3CBEC1A2\ 6BB20E2BD4A046793299E03E37A21B40194FB045F90B18BF20A47992CCD799CF\ 9C059C299C0526854954AADE8A6AD9D97EC91A1145383F42468B231F4D72F237\ 06D9853C3FA43CE8ACE8BFE7484987A1EC6A16C8DAF81F7C8BF42774707A9DF456 10001:\ 04F0548C9626AB1EBF1244934741D99A06220EFA2A5856AA0E75730B2EC96ADC\ 86BE894FA2803B53A5E85D276ACBD29AB823F80A7391BB54A5051672FB04EEB543:\ 0483E0AE47915587743FF345362B555D3962D98BB6F15F848B4C92B1771CA8ED\ 107D8D3EE65EC44517DD0FAA481A387E902F7A2E747C269E7EA44480BC538B8E5B:\ 9906D89F97A9FDEDD3CCD824DB687326F30F00AA25A7FCA2AFCB3B0F86CD41E7\ 3F0E8FF7D2D83F59E28ED31A5A0D551523374DE22E4C7E8FF568B386EE3DC411\ 63F10BF67BB006261C9082F9AF90BF1D9049A6B9FAE71C7F84FBE6E55F02789D\ E774F230F115026A4B4E96C55B04A95DA3AACBB2CECE8F81764A1F1C99515411\ 087CF7D34AEDED0932C183:FBBE059025B69B89FB14AE2289E7AAAFE60C0FCD:\ 0A40A16E2FE2B38D1DF90546167CF9469C9E3C3681A3442B4B2C2F581DEB385C\ E99FC6188BB02A841D56E76D301891E24560550FCC2A26B55F4CCB26D837D350\ A154BCACA8392D98FA67959E9727B78CAD03269F56968FC56B68BD679926D83C\ C9CB215550645CCDA31C760FF35888943D2D8A1D351E81E5D07B86182E751081EF 10001:\ 07EEFB424B0E3A40E4208EE5AFB280B22317308114DDE0B4B64F730184EC68DA\ 6CE2867A9F48ED7726D5E2614ED04A5410736C8C714EE702474298C6292AF07535:\ 070830DBF947EAC0228DE26314B59B66994CC60E8360E75D3876298F8F8A7D14\ 1DA064E5CA026A973E28F254738CEE669C721B034CB5F8E244DADD7CD1E159D547:\ 8D80D2D08DBD19C154DF3F14673A14BD03735231F24E86BF153D0E69E74CBFF7\ B1836E664DE83F680124370FC0F96C9B65C07A366B644C4AB3:\ 0C09582266DF086310821BA7E18DF64DFEE6DE09:\ 10FD89768A60A67788ABB5856A787C8561F3EDCF9A83E898F7DC87AB8CCE7942\ 9B43E56906941A886194F137E591FE7C339555361FBBE1F24FEB2D4BCDB80601\ F3096BC9132DEEA60AE13082F44F9AD41CD628936A4D51176E42FC59CB76DB81\ 5CE5AB4DB99A104AAFEA68F5D330329EBF258D4EDE16064BD1D00393D5E1570EB8 10001:\ 07EEFB424B0E3A40E4208EE5AFB280B22317308114DDE0B4B64F730184EC68DA\ 6CE2867A9F48ED7726D5E2614ED04A5410736C8C714EE702474298C6292AF07535:\ 070830DBF947EAC0228DE26314B59B66994CC60E8360E75D3876298F8F8A7D14\ 1DA064E5CA026A973E28F254738CEE669C721B034CB5F8E244DADD7CD1E159D547:\ 45013CEBAFD960B255476A8E2598B9AA32EFBE6DC1F34F4A498D8CF5A2B4548D\ 08C55D5F95F7BCC9619163056F2D58B52FA032:\ 9D5AD8EB452134B65DC3A98B6A73B5F741609CD6:\ 07EB651D75F1B52BC263B2E198336E99FBEBC4F332049A922A10815607EE2D98\ 9DB3A4495B7DCCD38F58A211FB7E193171A3D891132437EBCA44F318B280509E\ 52B5FA98FCCE8205D9697C8EE4B7FF59D4C59C79038A1970BD2A0D451ECDC5EF\ 11D9979C9D35F8C70A6163717607890D586A7C6DC01C79F86A8F28E85235F8C2F1 10001:\ 08DAD7F11363FAA623D5D6D5E8A319328D82190D7127D2846C439B0AB72619B0\ A43A95320E4EC34FC3A9CEA876422305BD76C5BA7BE9E2F410C8060645A1D29EDB:\ 0847E732376FC7900F898EA82EB2B0FC418565FDAE62F7D9EC4CE2217B97990D\ D272DB157F99F63C0DCBB9FBACDBD4C4DADB6DF67756358CA4174825B48F49706D:\ E2F96EAF0E05E7BA326ECCA0BA7FD2F7C02356F3CEDE9D0FAABF4FCC8E60A973\ E5595FD9EA08:435C098AA9909EB2377F1248B091B68987FF1838:\ 2707B9AD5115C58C94E932E8EC0A280F56339E44A1B58D4DDCFF2F312E5F34DC\ FE39E89C6A94DCEE86DBBDAE5B79BA4E0819A9E7BFD9D982E7EE6C86EE68396E\ 8B3A14C9C8F34B178EB741F9D3F121109BF5C8172FADA2E768F9EA1433032C00\ 4A8AA07EB990000A48DC94C8BAC8AABE2B09B1AA46C0A2AA0E12F63FBBA775BA7E 10001:\ 08DAD7F11363FAA623D5D6D5E8A319328D82190D7127D2846C439B0AB72619B0\ A43A95320E4EC34FC3A9CEA876422305BD76C5BA7BE9E2F410C8060645A1D29EDB:\ 0847E732376FC7900F898EA82EB2B0FC418565FDAE62F7D9EC4CE2217B97990D\ D272DB157F99F63C0DCBB9FBACDBD4C4DADB6DF67756358CA4174825B48F49706D:\ 04DC251BE72E88E5723485B6383A637E2FEFE07660C519A560B8BC18BDEDB86E\ AE2364EA53BA9DCA6EB3D2E7D6B806AF42B3E87F291B4A8881D5BF572CC9A85E\ 19C86ACB28F098F9DA0383C566D3C0F58CFD8F395DCF602E5CD40E8C7183F714\ 996E2297EF:C558D7167CBB4508ADA042971E71B1377EEA4269:\ 33341BA3576A130A50E2A5CF8679224388D5693F5ACCC235AC95ADD68E5EB1EE\ C31666D0CA7A1CDA6F70A1AA762C05752A51950CDB8AF3C5379F18CFE6B5BC55\ A4648226A15E912EF19AD77ADEEA911D67CFEFD69BA43FA4119135FF642117BA\ 985A7E0100325E9519F1CA6A9216BDA055B5785015291125E90DCD07A2CA9673EE 10001:\ CFD50283FEEEB97F6F08D73CBC7B3836F82BBCD499479F5E6F76FDFCB8B38C4F\ 71DC9E88BD6A6F76371AFD65D2AF1862B32AFB34A95F71B8B132043FFEBE3A95\ 2BAF7592448148C03F9C69B1D68E4CE5CF32C86BAF46FED301CA1AB403069B32\ F456B91F71898AB081CD8C4252EF5271915C9794B8F295851DA7510F99CB73EB:\ CC4E90D2A1B3A065D3B2D1F5A8FCE31B544475664EAB561D2971B99FB7BEF844\ E8EC1F360B8C2AC8359692971EA6A38F723FCC211F5DBCB177A0FDAC5164A1D4\ FF7FBB4E829986353CB983659A148CDD420C7D31BA3822EA90A32BE46C030E8C\ 17E1FA0AD37859E06B0AA6FA3B216D9CBE6C0E22339769C0A615913E5DA719CF:\ 883177E5126B9BE2D9A9680327D5370C6F26861F5820C43DA67A3AD609:\ 04E215EE6FF934B9DA70D7730C8734ABFCECDE89:\ 82C2B160093B8AA3C0F7522B19F87354066C77847ABF2A9FCE542D0E84E920C5\ AFB49FFDFDACE16560EE94A1369601148EBAD7A0E151CF16331791A5727D05F2\ 1E74E7EB811440206935D744765A15E79F015CB66C532C87A6A05961C8BFAD74\ 1A9A6657022894393E7223739796C02A77455D0F555B0EC01DDF259B6207FD0F\ D57614CEF1A5573BAAFF4EC00069951659B85F24300A25160CA8522DC6E6727E\ 57D019D7E63629B8FE5E89E25CC15BEB3A647577559299280B9B28F79B040900\ 0BE25BBD96408BA3B43CC486184DD1C8E62553FA1AF4040F60663DE7F5E49C04\ 388E257F1CE89C95DAB48A315D9B66B1B7628233876FF2385230D070D07E1666 # These have specially constructed seeds that result in leading # bytes of the output being 0 (this was a problem in version prior # to 0.8.7) 10001:\ D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ 4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ 454D5341342074657374206F66206C656164696E67203073:\ 5C7F7F0932FC4FF8555C3875CE3A0F86BF5B744E:\ 049C40560875766E164A89B2D19D91EF2AABAB4AC182657CAD93680319D8CDBE\ 3CABCF3E87BF41C16013AC4E3D2DEBFB8F89E9E057012B8EDFD0310E24E2BBF4\ 3D54B2664DF3AC82D7E8913ABE29D0A022277EB74D2E0C8C5F4C3F46FABB35D9\ 32A4A713A82FC9464581D9B1F43A2AFB9AB8177DEE8C38CC9F15A7E8F3F9B4D3 10001:\ D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ 4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ 454D5341342074657374206F66206C656164696E67203073:\ B0E37FD9119056FBC17F9C726B0AE7829350F93D:\ 82E54D1CD28D562D85DD3774636C65313CF26628076FC16A4D25AACCB566FCC8\ 77401BB44DFCB8ADBC6E595D515146D227E9AE6D4D585759F435642DFF2BB1EA\ 3AC72E633C05FB3DC0D8E63395099D5A535DF6EA89341E36D73808D5116299EE\ C827BB2B6C3141AC0A5698DCDC252B7EDC3A5C24DE75287EEB60F45A37DFBEA3 10001:\ D32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30A\ F38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D:\ CC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C\ 4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77:\ 454D5341342074657374206F66206C656164696E67203073:\ E4AE5BB1DD6DF73F8F75E441DA531F0E493AC0A7:\ 8A64E30AEC76B278B08FF3BF61B7FF439DC2B0F6B789459F1386C0FBF24AF863\ EFC5A58C5E9CB841EA08D2E22E40293B1876BBB976947038AEEAA36B1751FF97\ 13B9F7BD306D9360CC8D78B7A607F9CA7B4C18C308D85330E534337998D97D6F\ 70F828D6AD1C9C7F6916476127993E4E6F7D596BA6C246F0EB7312A02D09BFB3 [RSAVA/Raw] # The key that generated this signature isn't valid by PKCS #1 rules, # because the private exponent was set to (p-1)*(q-1) instead of # lcm(p-1,q-1). So if we generated a key with similiar exponent and # modulus, we'd use a different private exponent and thus generate a # different signature here. But it still will verify, so test that. 10001:\ A8AE5BF022EE5183FCD4C4DC3E2BE75F0641308FF7A066597A89CB55B2975AA1\ 4CAC475FEF9EC736186BA28E4B5D7B8F7CFA605B9A53DA5C1584F07663678940\ 1CC0D0CD65CC85962C228DC5E89CC496067859FB5EA9F579EC9F5643444A28A7\ 9000F9ADD1F9B7849EAA3FD3FC5DC002BCA413D7EBF8E6C9392AB5E40C09470D\ 21A9C705732EB027075836692FA90A997B4939799085C5E6E896BC35D58B857B\ 9A9D0CF32D9C0E4B7AF6ABCF501E5D6D55E2987E22586CDB964BF11F3F54740B\ E31337E539D48780D9192B22CBCEBCE2228CA9668ACD6292207E02AE7A77E576\ BC811E3DB0FA56D5FFE53EE6C715F2973A70C29AF72AA6BFFC985F2DC5E9369D:\ 0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0068656C6C6F20776F726C64:\ A88A260DF63E7241BFB42C05F50B5FF470CEB7B4E47353C94C0EBF620309841F\ CD84FFA08B164411CA9D2066FA02D8223AC19250212409E241446C22C9B85B23\ 38E6C8545E722427FB6798EAD8488106B01F15EE3E8574C85DCCFD407FAAD4F7\ 05D397551E4BF32CE484DE76514DBF805B5361CB3B1B221FE3AD12734E8542D4\ B4D53962D0B0A80B11DC789EC08B050F28CB75363B8BD1F545839953271DB734\ 0C749C3B979C0A11C46E9D590446C8D3B75907B3F0B3F164A8F72D302B383B2B\ D1248E9D86EAEBEBCB0623FAEA616CDE51CFFE5BE3D0BF140F053B05B6A17B6A\ 4F7B733F0042DC9AF4EA737031DB170EB5F691859B5EDA13C82B8EE69D7B2732 # These test verification with various seed sizes. Botan cannot actually create # such a signature, since seed sizes != size of hash are not allowed. These # were created by some RSA PSS test code, with various salt sizes. This is not # an exhautive test (obviously), but from this, and a careful reading of # emsa4.cpp, it looks like Botan's EMSA4 will accept any valid EMSA4 message # representative. # Format for verification: e:n:message:signature [RSAVA/EMSA4(SHA-1)] # No salt 10001:\ AABBFB1E4E6F15D4D59E50C25998870956ED9E822D3DD899CAB0FA597B4D1C0E\ 61997501FD1C6E9D756BDCBE9BF49C7FA32926F3FDB387D83296BE35EF360872\ 350AE98C934D760BE7A933CFE85DFB99621D32105AC89496C9F001FE9CEAB097\ C8DD55D6FD3D913496106BB04F265ED12F8ACD5F4B3FD7129809CA8D80E2E1D3:\ B841D0374D3C86E67B67BDF00B:\ 1060A74E3EF067A9B17754500B16B8C9F6B3B453FB290C71FCAE779DD37A6B9A\ 24A45D1560DF5E4BC31143E6197AB15684236D8FE578E022495897F70451FD90\ 2BFA5703947EDFF0B63BF1140C63AE1C8D369A87B192E8BF6A3D486E909C3979\ 703806010367CA0E0026F8920EA766B7E3759E23954D0EC2F746E6046FC14758 # No salt 10001:\ AABBFB1E4E6F15D4D59E50C25998870956ED9E822D3DD899CAB0FA597B4D1C0E\ 61997501FD1C6E9D756BDCBE9BF49C7FA32926F3FDB387D83296BE35EF360872\ 350AE98C934D760BE7A933CFE85DFB99621D32105AC89496C9F001FE9CEAB097\ C8DD55D6FD3D913496106BB04F265ED12F8ACD5F4B3FD7129809CA8D80E2E1D3:\ 0F1D14F9:\ 7D4F2EE63FF4B46A09EBB8F9E2F58B4634234B890F7270FDF3454CD2EEAF1BAC\ AC3516BB5D0F678365E5226034032D6AD49069ED9C7B8BE471BFC6D9BBE3327C\ BA545675212A5552948524E52567FCE84D9D211191AAB864153C08DFC7576703\ C21FB9315578A0F1C167FF4D2B810578DC98FBC1235A4CD62ED89BD092C31C00 # 1 byte salt 10001:\ A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ 720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ 474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ 36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ AEAD5A03023E17D894226CB2C7C77D5D4341E8BF7F1453140D58B427B40B0B18A9:\ 27ABB6E27D9DBA0F9E5DB3607BF04E20112150A779EAF67D4AA76D50A6060F70\ 03BB33BE5A580789E567C3768AF938BDBADE712F7344B72655118636095EA8D6\ 97888B9382BF3030D56A685079980A992A9BED3AF0DC81AE4316AF31681A3BDD\ 78CC4E83FD3C227A9984C261ADF36D201AA417243A28BA47488BD81CB1DA63A4 # 2 byte salt 10001:\ AABBFB1E4E6F15D4D59E50C25998870956ED9E822D3DD899CAB0FA597B4D1C0E\ 61997501FD1C6E9D756BDCBE9BF49C7FA32926F3FDB387D83296BE35EF360872\ 350AE98C934D760BE7A933CFE85DFB99621D32105AC89496C9F001FE9CEAB097\ C8DD55D6FD3D913496106BB04F265ED12F8ACD5F4B3FD7129809CA8D80E2E1D3:\ 6A4BAEE539612920ECB3075EF6C31BD7EEA01F43:\ 36F7211C290577ED0CF54007551BA65943C388BF2AE58F12E8BF7B6E7339348F\ 2534E7515232D0AD72AD8F6EA173FA3D21DE13D392DE10C457DDA7C569AAAE17\ 0C8806A3ACA457461EFBAA7EC870947ABE2D5A91821B9254EA34A74E95E7648E\ D98A7ACD2300D4FC88C8B968E0AE68DF9BFF849E53AF03A2E12965C1453AAFC4 # 3 byte salt 10001:\ CB6484FE402A7E96E3E43AC26CBF3FED47FBDF6921D40072FC27FA110CFF8D94\ EDAC5E119D0801CEC89875BBB6FBD838BD0FB7F7F7FA62FAEA798CC6975F43ED\ CADA7947BABA41DBDEB321E273C870973A9E741791380886B4B131165EDDFCF4\ F162E17AD36E8D7A763502920527DFA9CDFF0D1046914195D2924D4075DEA235:\ 0F50:\ 707E1B680D4D7E2CD102ED7AF2B63AE63CAD9266476418F330FB739FD052A777\ 4A0182624E81C3AD14C12BA5BA1D99315217D84EA1FAABF4A90E7CFF19875351\ 46D4944AE27E2C84F313E5E5A22C5B86A88333DBBC4D17425F180C6B0F4BFD3E\ 9F03DE21B422EC125DA6FF2835A93CEBED8C1283568E04BB634CAC410D144B91 # 4 byte salt 10001:\ A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ 720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ 474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ 36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ 5C3DB99915C8F7EEACB045ECBB7C35C06D4ED5A96AA9025A49093B70D7C2EDD4\ 85930D18DEB57C0282563F2B07FBA63245FDC773CF851985475DFB4F6FA335BE\ 1B4C2C28A294E84E50172AA585B382BE1E1038FBD02F2BD37691D85A18346AD0\ 4CC81948698FF248CFAF33E222EA8B5FCAEC0E5AA8F753521EC47BCB756E05CF\ 95E4365E06A69BB6C99A34A62939B478AC1209FFACC49BA4027749801D4A9F58\ 3395B34340:\ 9705B191BE8BD52D3E6CA1743DACDA5EDC1C7665B6EBC769A5983BB74D2F52C7\ 9F94954DC8CAB9A44FB3B387A0FF2843311CDA640DC39BA975518B511DF87064\ B17709804D707DA08A315F14D24CF6385310A62D7F6C47689B66C4A12F449FC9\ 5796F1821EA6838DE2941D0725B55EC860CB553B36878C2BA3994DCD0A8992FF # 5 byte salt 10001:\ CB6484FE402A7E96E3E43AC26CBF3FED47FBDF6921D40072FC27FA110CFF8D94\ EDAC5E119D0801CEC89875BBB6FBD838BD0FB7F7F7FA62FAEA798CC6975F43ED\ CADA7947BABA41DBDEB321E273C870973A9E741791380886B4B131165EDDFCF4\ F162E17AD36E8D7A763502920527DFA9CDFF0D1046914195D2924D4075DEA235:\ F1FE75913B7A152626C287B1287B6ED4A04EB546950C0414B2D7AAF82DF8F255\ E08E20A2CACD2399C4304FD9F77B9CF8B2A244C15ABC25DCFE1B144F2B125AF7\ 91B05877E11BEAF3ECC75FC9:\ 87337D2D71F36C4452216459D55586634D755C84D9D8F80D058E029A1CB61A6D\ 4819E3993B623AF90FF915AC585AE6088DF7565A2A205D6282252EA0863A7F12\ F07A06189F2E2C4EC6B27EBDF3955ADC7C85B803C612D44B9EA5D5FC0B7F15D8\ AC704D83DEC3D8F84808C2AA5F984FD06D1456B4EF875C33A7346051514DCECC # 6 byte salt 10001:\ CB6484FE402A7E96E3E43AC26CBF3FED47FBDF6921D40072FC27FA110CFF8D94\ EDAC5E119D0801CEC89875BBB6FBD838BD0FB7F7F7FA62FAEA798CC6975F43ED\ CADA7947BABA41DBDEB321E273C870973A9E741791380886B4B131165EDDFCF4\ F162E17AD36E8D7A763502920527DFA9CDFF0D1046914195D2924D4075DEA235:\ 04F7B2C9BEEE7F00FD42C651A3492E6F61816AB3B0903477CFB49B2DDE8AB64D\ 898019C6C937FE653A92C1BD992A3304F357:\ 14949A71A7AF9EC4364DDF90E5A7C4283F8FEF7DD3A544FFA4B1BCEC5FEA6C21\ 4FE7C9105393E72D308CA0994F6F900479219439B8FDC850E15404C024AB757B\ F7DDF35B0CEC668AEAAAB5039EC81F739C160DD57B26ACDECE905F608AB0396F\ 9DE8F99A53F765D37FB625C8E90C68B4E5B32AEF48C0FDA39B7314FCE942A9E9 # 7 byte salt 10001:\ A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ 720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ 474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ 36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ 71D2C0843ACA68C291953E66:\ 4C22BC81446B062A561D9A922E959036E7763B0803DD84168C48AC51DBE79A12\ 9D017E22BF9DA19996C09BE7369C4F0808ACC2E708DFF48AA2AD41EF78F5F97B\ 914FFE079BE9F9D30E67049BA28BEE714FE622A18A3524FC7E58ED7C451714F1\ 4718F4475814B6D9A6590845D9CF6FEA2DCD313CFD580B47D5BEF6960CB0E463 # 9 byte salt 10001:\ A8802DFF63A68E53D5B4AEFDF9BFBDDC2F3FF809D248CBC4AA250AE710830671\ 4ECD4BA4C465298C7E7EFAAD9ED969BDD23D851D31BAD61FA942B24A60D34469\ F2774133D488E82E66B01FE4C7C8CDF95CB194D721FBE3B98FFC61D31F07D8CE\ E32318EFF73E374755CBCB3785D93772A414DA3C25B240B16F40C83723448861:\ 9D5116B54CBA7970742B66BE6924D122A1D7E570F037DA06B29A2B34175C8F94\ 28D1E8E908EF492892AFD6B08019EED0123F32B74D04324DDB98171ADE66347C\ 1FFB56BD1B05E1CECE2ADD838BD95CDEB74E36A51B69F2602322593462182437\ AF357BB63EF748F45CDDB66BE5357E9701C8B21C6613857432CB99C91CDFCB72\ 54D087B361CCF05E77AF961F023E83416D9FF539A572A5C89117FE1506AF6633\ 5321A0CB7BF096DA0590D2E79FA60DD7A38B9DF2D352673F5A31A873111E3C8D:\ A73BC3BD89ADF92FF2B8EE3B5430849301C322074696BD58FCA3D0C113BC9CD7\ 9D6D822FCE31ABF1C276C1272D045E5FD92BAE9FBC07EE54742D3342A2B03E85\ 47B1DC94E86C5D08A13708780952498CE3EF3B07710E5777683C9630821248A9\ D38BEC8AB7C77DF1CA6E695F0289443C13A8A4834D97CE6DCBB6782A70F866B1 # 10 byte salt 10001:\ A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ 720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ 474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ 36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ 75352B85B47E73B18E8CD9608354ACCA4DF8E2B73313C681A8119D6578CAF8F9\ A52EB4710B97D334D2CD49C365BC0E0BB89D63CEBE3EC62055E7948C9DF696B4\ 06EAB60881B0371F5AE092D0A43ED9AD307D026B2CB6477AF5ACC32919D470C3\ 9C9BAA71B0FA78F8687BF762C399407BB39C59727AF3B61DF3EA486E473D4CC8\ D67805E8810F:\ 7F51B49FA57C4EC7AC72A90C9EBB51F6E21E3B6EE67E6DE32119AC9FCF97FB19\ 09F74491CDE182ECBED994B66EEC44AC817A8F620444BB6520A3A223BE4AFA78\ B50F11C057FA4F4835D55283157F5C8AE60A2A46D0CB9D4BE3411FD3505F0FAC\ 5202ED1C0629575B59001488B30E9F12E738F2B388C7EF8A82684CBA43115010 # 11 byte salt 10001:\ A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ 720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ 474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ 36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ DA40B3B401DEED4DBCC3848CC729C8B5FD169A140914C40FEB752E2D3F2F7EFA\ A97CE26BABE4099BDBBAA522BB09DB37A1D06CB53A3BF7D621:\ 328E325D4F95D0013019B97F5936EBB347F1E5B01A559560518C1C47DC044343\ 92BD2168DA08668E4EEA9A06A5CED7C9076BF7CAC667503FE6B7903953958BAB\ B31EE9B29E356274F7136F35F5224A1BF50F3663D002B6220C3EA8572C1368D1\ 1D3C6DD6E1F3D700811257EF8B46246C2A6A975C08DEA782003F5CD45703FD22 # 16 byte salt 10001:\ AABBFB1E4E6F15D4D59E50C25998870956ED9E822D3DD899CAB0FA597B4D1C0E\ 61997501FD1C6E9D756BDCBE9BF49C7FA32926F3FDB387D83296BE35EF360872\ 350AE98C934D760BE7A933CFE85DFB99621D32105AC89496C9F001FE9CEAB097\ C8DD55D6FD3D913496106BB04F265ED12F8ACD5F4B3FD7129809CA8D80E2E1D3:\ 1C79CF64CCAA6C913ABAA5A555558BC251:\ 0C9485139F787BB6EFBF23783CEC74A53DFF16937FA6E76BF120D15ACF87D848\ 0B7EACED7B44ACD2A87C92A3F5AB185B81664AE248C7557C2766656C05A5D206\ DD110E0E97F4F63364BB396F8431ECA2352FF84B4DB5F54FFAB155768624489F\ D6E7C40282D1F9D85674D21E01571FD24423461F3D04D9595C43BFEB8EC586E3 # 19 byte salt 10001:\ A7DB819EAAF3E6876B927ED6EEA94B97E20D06753C7555A7440631216FF4E943\ 720DE7BE6364B8DE17E663705549051F04141D8612214BC269CC09FBDF1F561E\ 474A2ECA28ADDE3530CA339015F23CEE63750C508A1416FE5D1AEF5AA09BBA7F\ 36CFC02874B15DCA913E35B52B281D32B1CEBD22EAF3C629123988FE78FD0561:\ 3096922A62DABF6B98A4480D2F86629D1992FFE1545869DCE5E69F810EB793C5\ ABFFAEE2EEB846644C8BE8E31942BA16FE51B7988F355999CFFBA28CFB9DDB1B\ 5F4919790B7E63E37F00289C6CD42F56F7520A2DDA73AEA4BCB2D10053AB9720\ B201D52AAE450BF22AF2C4E3AC:\ 43F583905ED6D2D53045C60E472FC1FED12EBD88C190EE810F9576E262F3881F\ BF006211DD5943A48BAC7FF21C4317BC28E4968C98FF6E0F94C055FB104555C1\ E7B533F9DDC49D200CAA8C2F62C5EDC6A9E9E76290DDEBF38BAEC88EEF8B32B3\ DE804FF19627C04B13261CE2EF2101619CA1D6BDF3C5C7DEDCF21E18726081CE # Format: KEY:message:signature # These tests are copies of a couple above. The only reason they exist # is to test parsing of RSA public keys in X.509 format. [RSAVA_X509/EMSA4(SHA-1)] -----BEGIN PUBLIC KEY-----\ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqu/seTm8V1NWeUMJZmIcJVu2e\ gi092JnKsPpZe00cDmGZdQH9HG6ddWvcvpv0nH+jKSbz/bOH2DKWvjXvNghyNQrp\ jJNNdgvnqTPP6F37mWIdMhBayJSWyfAB/pzqsJfI3VXW/T2RNJYQa7BPJl7RL4rN\ X0s/1xKYCcqNgOLh0wIDAQAB\ -----END PUBLIC KEY-----:\ B841D0374D3C86E67B67BDF00B:\ 1060A74E3EF067A9B17754500B16B8C9F6B3B453FB290C71FCAE779DD37A6B9A\ 24A45D1560DF5E4BC31143E6197AB15684236D8FE578E022495897F70451FD90\ 2BFA5703947EDFF0B63BF1140C63AE1C8D369A87B192E8BF6A3D486E909C3979\ 703806010367CA0E0026F8920EA766B7E3759E23954D0EC2F746E6046FC14758 -----BEGIN PUBLIC KEY-----\ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn24GeqvPmh2uSftbuqUuX4g0G\ dTx1VadEBjEhb/TpQ3IN575jZLjeF+ZjcFVJBR8EFB2GEiFLwmnMCfvfH1YeR0ou\ yiit3jUwyjOQFfI87mN1DFCKFBb+XRrvWqCbun82z8AodLFdypE+NbUrKB0ysc69\ IurzxikSOYj+eP0FYQIDAQAB\ -----END PUBLIC KEY-----:\ 5C3DB99915C8F7EEACB045ECBB7C35C06D4ED5A96AA9025A49093B70D7C2EDD4\ 85930D18DEB57C0282563F2B07FBA63245FDC773CF851985475DFB4F6FA335BE\ 1B4C2C28A294E84E50172AA585B382BE1E1038FBD02F2BD37691D85A18346AD0\ 4CC81948698FF248CFAF33E222EA8B5FCAEC0E5AA8F753521EC47BCB756E05CF\ 95E4365E06A69BB6C99A34A62939B478AC1209FFACC49BA4027749801D4A9F58\ 3395B34340:\ 9705B191BE8BD52D3E6CA1743DACDA5EDC1C7665B6EBC769A5983BB74D2F52C7\ 9F94954DC8CAB9A44FB3B387A0FF2843311CDA640DC39BA975518B511DF87064\ B17709804D707DA08A315F14D24CF6385310A62D7F6C47689B66C4A12F449FC9\ 5796F1821EA6838DE2941D0725B55EC860CB553B36878C2BA3994DCD0A8992FF [RSAVA/EMSA4(SHA-224)] 10001:\ B8961C3F4D6A9DC27FAE6C30229E1DA910AF796C4EFB2E97DB11E636A7D6ED94672BE33FD7771\ 75CD0D879D805D06F1C9B2A064DCCFB38A63BD768BC092A0AC3740FE390452492A4BB1C2ECD38\ C771264D0B2FF0496AF5CD6D139287ED3200A9:\ 7072696F6E636F7270:\ B7530DA7632263B5AA4B0DC9FCBC3BCDF8B44EE2B4BECFD90BDEC108F50EBE325BE6F4EC8900B\ A1C345F2B6F59FB625C3D99BC6F04D99704144B05C2ACDD61927D3EBD886650E933774DF72EED\ 0A5A3AA2810C17B56F877D989AF3A469950D0B 10001:\ CA76759F53C1F5F771C00A7C6E09E20754132CEE14C671ACAF687DD4006CCC54F34018C554601\ 18DA1036951EF27EB3211138369D9C3C5EB1C3960A9F6DE7794798E2B33856EB0120CA6771CAA\ 824F1F00FFB4596604700676A6C117C87E12EAEFB6476CD4D83A08C6A6A2EAB3ABC3B71FAF967\ 9EA09735DCC8849ACF80F3705:\ 7072696F6E636F7270:\ B4816EA318CD92A64FBCF77C4E42E283534B2C500652DF6D88FF24130EB5C84350E9F52E4822B\ F60D7C4AE4FA11C811A7A0B4DF93C0215BC9B3D04337BC044E1994959D67E0E33121C9CDE1C50\ 699B6C00966160F51C606334E15EBF60FBB8C76EFBBBA51460C75D30DE0F47863A1020885F5A4\ DF8AAA397C03AA409833380B1 10001:\ EA70F789F0117223878E296C191838EC52A63918C0B47E02430331182938F8590CB3295FEE645\ 9A90C9923A888F0FCCEF8D422D75B60DCA3ADD01D6C738472211CECE779420FD4BD381C04C572\ F9AFF554CABB6532C6361F78EE0AAB4FF5A1FA33C5FE7EF3AFE1C5F6CFEA0BA25B0CC4C6FC396\ BF30535D69928282B6E20371B:\ 7072696F6E636F7270:\ 4FAF0FB7EEBB26B9BA778D092B42CEECBBA36B4DBBBE35C6B383439F23F2062642CB3D091BA77\ C4E1C46280E85C8C40A24FCEF5CDC9F4E383A54B19BB3BCD8B5DC28070CD5FFCA1525F6A655CE\ 672EF96438F375E6483ACEB338180B24FAD3E4F67B58E246D0BCE09DFEDF5249F30517DA52FDE\ 9340EE69B1B1316B81C2E2E1E 10001:\ FA294359ECC80FF6077B2BC558710A384A24A72CBF61FBDFF3820BA2DE987906A93FD7591BB0D\ CCB7FA287343876FEB5CF5ABAE579D01A5626C7924FDA429BEADB924CA9E49F99074A850F7084\ F7E8747E9A7531BAF576524994AEEDA1CFF1D561B3D16793310280626A2FD0A942324FD04E6B9\ B80AE0A9CBFC3D8E0D5CA12CE5D04C3C49ABF871D62366A8657342690EA73CE1EC68F65A1835D\ 48B4008346E8EECBCC4FA48C7D62E8844C149AAA4E75717DDE3F38F72FE37CE1269B3C2BF7A7:\ 7072696F6E636F7270:\ EB6106EBBC6F7F29B503E7AED4CF9FD01F75F2C11433DE73188AC19A9A41D59F995107AD9F8B6\ 57B0718226245A4C149E352BF5D129F53971E30A4DE702876528EA67A8EBFD096396B7229BA9D\ 6DA710DB37613F5FB1F3993B391741CE8E11EE0C324E3F33CFBEB78DB0F270B0C0CC7D3497F85\ 94EC262D88EF9E03EBFD9E26ECE0921006C521A4B1B41D75BD79B5534B183893A18FE183DCCD1\ 506B22E0E7FEF53E56B74870B62EDD262AA45F3FA9CBFC18045A549D5E202D2D20E08322799D [RSAVA/EMSA4(SHA-256)] 10001:\ 9E244363D137F1E002C5071CD7E7B7F59823770FADDF1D3D8AF934438C9B6A97258BD5FC0390F29\ 971DDEB394E7D2A6E1C8422368D6A5EB7E1F51E6472546EED2CAF1AD242AFD03C1A4FDD8894B305\ EE31EEA8F8A36C099A00478EC29D11E17F:\ 7072696F6E636F7270:\ 73F68238B7F19889120893C903258DBE620171982CAD9D155892CDEFECB3C153224D8A94BFD13B4\ 691A4D51175756186AE4F689B6A1A1432EA255C0E8DD844E9C055397090C110C632EB6E24BA5ACA\ 380239D399BF010E1451293DB948D4274C 10001:\ C34649A69B6C468C51A93B54B7FC54BA7287C14563867406FC87FD98E0B70B307811FD2A7EC2646\ 4D50B5A0213A04C4567CD22B22F2DB162DD464E617A7445A8ECA9DDF71BE38AA32F44181E20922A\ 7AE9851282478741FF69B24158EED69568B0B27AE54FA043F778DC54DD2B23E3D5E0C00113181CC\ DAD35E04573018155AF:\ 7072696F6E636F7270:\ 3CFA8F2D410D5BE87DA2B644BD6615CE3588C7E4B261F05C18673F24CB570355A7F5D41BBF62F85\ 9BC0CDD5300CCA3DBF2B2AF13DDF455DD6D919811836B22BD4280EFAD24DF30EA185D7357C89599\ CF0C08A22F4D03162295379E842215DEBEA0DA0AE985F355AF392DD0F9F8A6A1F2827AF781630C5\ D2A2B917C5544B3206C 10001:\ B3705A2FBAEB5B8A311150C3EC5315B29C7FB17F9A0680B0CC0A6E463113D9DB68FBD8CEB8C12FB\ 833639F29C76136B70320D0C9A5C4F191ED419598FD4D876ABFD815C1D4E0AA594C1C5D08EB56D3\ 707263CD1F9A09C12F5E9717177E39986F82EA2F65780D2121C537D9D14BA7BED64B46365A898B4\ 5FC1D5386BA954B613B:\ 7072696F6E636F7270:\ 417D26DAAC12A39FEDA2C17EA2ED932AF9544DA11E6BB84B0E9D4758A57FBD9878457171DE72B88\ 8EF7AF40183EE7FDF81044512232D7199C11CF52A53CDE62022352EA747292FB3187EE51B2A17E9\ AF8DABA658DB6C4A5E4F07A5CF2E9203295E59B1916F526C1EF8F84F72CBA70065EFF5D4BA0467C\ B77165BAC3ACE21462D 10001:\ A323715CEF7F9FB81BDA579ADD3CB75FFF4051DD5D7ED2B0D3A48DE237A003831042C44A7E9FBD5\ 55F791C350B1C8424384D1E005E54ACFD67C8747EDC8DD8DC9A5AA48D0EFE5CC127CA706E1E7670\ 8A0130519572A1FCB35CBEBC8575454EF6A72DC2F2A6394E1FB593FD60AA9BDB84C99523B91F371\ 7E263793301685BD380357134BB56AC499AA80B887A28596C2208BD4CA7910CAFDDDB565A788F02\ 1C295F3C3DDB064271D917D986D72BAE38C1BC8A6644320F61C84E71FC5BA378D681:\ 7072696F6E636F7270:\ 7BBB18C1CA207CE639E323DF26B14475CD407995EC612F6D53ECEE977D4400E4BFC198ADF8B40BF\ E27363241A1F9541F01677AAD98F87E93998935146A8F77E7FFBD3DE59A2E22E5766409733F06EA\ 2993620A27122B71C4D9DE755E70C703B4EC6AF5F314E0F720B656FDA93E2B3EE9A1688D711174E\ 0D72D0D486DE36DCE1F9DA031EA46FBD6156B1E7A65A25B42696C9ACCD453D8E467313DA76F70DB\ 225D3C44E133E65E8BCC177D065F53BB81AF13076AB0695AD2205040CD9B4DF851FD [RSAVA/EMSA4(RIPEMD-160)] 10001:\ BB3066B7BA3873399F0B957B6993E7E4AE7D97E1D3579F2AD45F48ABDA8730C74B09A4DBFB5F6A9\ 0769BA261D5FE0F7290A06F91FB8C9B45AEA37EF61CC7F5C407960F89C0699890C2C49C10E18BB6\ 42FA27FB8B38E9A1E406114027F914E587:\ 7072696F6E636F7270:\ B24136372B7716310F83846719F61CB4F86B11855BE752E85AE6DE9CAAD99746693B255666DFEB8\ C4A709C93A9DD1B2A08A9BE75831DA000AFA7D6230212C40F0DA59AB8B6291D1CC1DBA24D86D92F\ C318F764E905E0BE2CCE73E074498A7DC6 10001:\ 86BC0A053525DD69C5D827DD664A07063C6099565D3AF545DEC168BA5FDDA7E355D426266D7D6CC\ FE204E53390D2287347593201D5798F937A9A06B853FDCD3516526EC3F697B3F519611B9D124286\ 54A5C7A6EC1872067B308DB2EC172963160FB17DEC45D27792A39CB3F398D48282B6536A0B1E6A9\ 911005DDBE73EA8787D:\ 7072696F6E636F7270:\ 0795B1835ED3412E4EF2DA7DF692D04E959D5204331C6CA3D978F48F319A79B3A1A51CB584E56B0\ 572853527B1C2F99CA3390C91E006466AAD7628A0FA48887397A865F864D6921575CCF186D3FA56\ 9EAF9137EB626A9FB920466FC042AE9B6FB6B8D7EEB4F8193E7DC175B9093FA3E49FBE4D6D472F3\ F38289A755933234C46 10001:\ ED1782D5C4807EA628D68A733D736B5438B1A9D9340537576FCC55BDF0121AA423659B67576DA2A\ 3FB8B06009CBB1A009B5010C7A76FA8F1A50BEA540E9A6AFC0E48A95A2FE849F41075E94494E11E\ 459B8AD5D0311900C6DD0FD9215B0A5B33DB0B49B9BE67597D57F636AA3B3E4677AEC213E419EB2\ 777D752A1613334AB15:\ 7072696F6E636F7270:\ 375AC6A2B3CC508CDE09109C1FA52980098EA989C2021CC19D74097A7D67B07F599F3FA0C65B02B\ DA6FCCBA9219D33A1F07219B616C30B1D455311726FE2470F63B86A02DE283391272D85B77C6D83\ 4ACE4246B692E1B4B512D5E72F3192142E765E38553CD3FCA435D129C7543F777997D8715A2CBE2\ B15A5659CDC67DA72F5 10001:\ B4B8E2EC2E25925A087F2731D8FBE4D180681A229D190B58F829099E3781F1A850D564999EBD14B\ 0FC4D8BAC48642FD38B7DC9E2DE709FE8C14FDB2477B72BBC58EC0F5FA6A810E44B2C84E207CBDB\ 1BC7A0358AD6F60CF9061EFCD40A3CF665FC976BF167F8A610D747A1075B7C3753131E78967106A\ D2F20D5BB1E28D6A0D3D722B2F044670B20530FD1F7983513D7F3527A662571A3AE98E1DAFF9403\ 04B2BA6481B766DB0812AC4BBCD1B87E2A29A74565A5C82A2821F6F1E1B5C764690B:\ 7072696F6E636F7270:\ 32631E346368C620BAF6FA5475F04B56FB60BA5CA67D1E3E22805ED5910ECEE71777FE198279831\ 51E88AA1F9E57E96FDC536CE2F927AA3B34A94441E72FB498A649864488D976A0A4AB7B6490451A\ 4F4712A3AF3587579A791CF8CB18EA4AD388B5C34F6BF54E9CB0F4AC5EA21EA2AA42A2266EA755D\ 5EFFC02FD41C583E1CBDA53C1821BB79FB392D68A4524B0F65EBB64FF6656C52BF54D5774DF2D91\ 6C9B793E206E0D5351D7B4D18DE3CA4CCFA8F7A3ABFB36048C9297F7512B3FDA70F7 # RW Format: exponent:p:q:message:output [RW/EMSA2(SHA-1)] 2:\ F21624A28732743BBE9B1A2B320CA31EF4A127456547ACDF5C523995E25A990B:\ BC6EDE730E7CEC8993A6E6296EA8DFBBC7D46615122F23F635FF988E284E31CF:\ 5075752E:\ 44CB3C6CD992A656AC2D8C92E044FCCC60FAA1B47FE153E7BA4B647136DA4A42\ 88BD50FB0935E3B9180AF477F8B88E1EA1106569CCAB8D354E0A7E3AC92D70B3 2:\ F2E5CDF6CA7387C132242CE031CEC8FE2CEAFA8530EC9795F16605B1CBD97BCB:\ DA330E4440FE5CD00A37A738DDFBDD5623A31FAE273AD98E41DA0D3DB937CEBF:\ 4C6F7665207375636B732E20556E7265717569746564206C6F7665207375636B\ 73206D6F72652E:\ 5AB035B8E6415D691951DBCEACC6A61987599000A590A414363BF52FB95C5BAB\ C12812152C5BCBC6A443C68B971EE0AA5E864C9FF9ABE0A85BB86FA544239958 2:\ 13CE5CDF6CA7387C132242CE031CEC8FE2CEAFA8530EC9795F16605B1CBD978A3:\ 14FE360AA550965F93CE76E4B01F55FBFDD7A049B2761817505CB6959A73A4C07:\ 4C6F7665207375636B732E20556E7265717569746564206C6F7665207375636B7\ 3206D6F72652E:\ 0085AC363AEA57F36E348936599A77167BAF17194D250787F347C710019558A9F\ 773DDC25A2216DA694D38E03CAA4F7423BDF03DB0E75161221906222FC9E0F23D 2:\ 1947A060ECFEFA3F8DDED8AE580D45B02D82DE108496AFC322FFD14EA02B7BFE3:\ 1E1384A66A21500DEE4DC2B36F43EF398B1C50BDEE7600CD4340B663471F0F16F:\ 4A65737369652048616E68616D20697320612064616D6E2063757465206769726C:\ 00BE5B2A5EE3CB613ABE4548C856F6C8F8B4B9EAD3795675E59E4DDC4A015D019\ 2F29B6352CDD913C289961BE57F84005F0BBD3AE7E2BBE73DABC50B2201923CC0 2:\ 1AA83F51426F2BDA398221C48E8D322EF66D59098D0418E0C2B06DE6EA2F97D33:\ 1E4C7924C9E6D7ABDB372B112601D4C091FAE6C8FEB518595DF436FE9B354E26F:\ 492077616E742061206472696E6B2E204E6F772E:\ 010E8838216B05B4C2739B65AB2A7ABC114A046E3CD37CF1E97815ECA53750B1B\ F486A9BA684B9FE2D983BBA5F9D97565F0DCF6A5176C169EC67B6BB6C9616CEA6 2:\ 22C9D42C6803B9AC87F641E9465D300DE8898694427D138761C4A5B121B0632DB:\ 25DA5C05701C99EDDF0FBAA61DCDBA404C05D860DD539E06B0AECA7E56354DEA7:\ 54657374696E6720766172696F7573206B657973697A657320666F72205257207\ 369676E6174757265733A2035313220746F203531392C20616E642031303234:\ 0191F1BA45BC571445612D8C1A7818B52DFF78566E6CCFF7AB55B2F35FA21210C\ 951F171E27A2921032718AE01BB4F209164BA0B21A5842D1925B35D09C7538050 2:\ 388F732F05B06F5BA10816242E8F75A000E235C97174F57931E8D845442147F8B:\ 2F3758EBE44182841FB1743D3BA6AEEC0AEC5758660E1DB37C818199B90A1A307:\ 54657374696E6720766172696F7573206B657973697A657320666F72205257207\ 369676E6174757265733A2035313220746F203531392C20616E642031303234:\ 046C31E4EA320DF130FE1F361184DDC03713BBAC169E08266B91655B42A01F39E\ 1E3FF781B04B2F44B2504F37ACC9688C1ADD7EB94A998779EFCDFBEB9FAFFC82D 2:\ 4AE4F716610D77E35A6FA2FEAAAC3E92706B996414C012EF72BCBE86E3F1A97BB:\ 5145D9E08DA9021E87080C437BE1835B06E5C9ECCDA8E7CF7E30F682D0CB1A9F7:\ 54657374696E6720766172696F7573206B657973697A657320666F72205257207\ 369676E6174757265733A2035313220746F203531392C20616E642031303234:\ 01BF0E20BF646E5E427B8D28CBAF696D7AA6B6DE878BB91C295D5559B1FA9A94F\ 114FF61C11C0BC97066C2FC919815B0FD150CE70F63D696CEA4D5D1D7BDEDC035 2:\ 6AA3DB8710567A30D7E9E61956962D4E4D50BC0510C2238D9136A93CC5DC3A73B:\ 6CAC9FF49F1035D179668B399927A610608788A8C884B76A94A6DDBCA94A52327:\ 57414E5445443A2043757465204A6170616E657365206769726C667269656E64:\ 1695A91578EBC67ED86C20EC4886B2E3895E11A7647D22FFB41091E1C7A3CA0DC\ E091A1FCBACB859C4A5C8B3B841C0F0F7039BEFEA790A423114F35F9D809DBCD2 2:\ 9EADA4F7D1BEC405BC2BFB4F836E19A488E079030F8C09DE76810B9E63FB41873:\ AD5DEBCF83372200B106812A6A7CF3A702C35BAF4FC095617794314EBCAC4DE47:\ 476F6C642073747564733F213F204576656E20746865204D544120756E6465727\ 374616E647320746865206E65656420666F722074686520424C494E472D424C494E4721:\ 203FCE80570CA0DA3C2D50634A33BAACEA6D397618F36620EE10DE4E6A51018C0\ BADE98DF220E47DBA140AEAE910A28F3177D4349740EC05A5EB7BA280D7BF8F34 2:\ E39815FB87BACBCCF779BC66EA0AE9784FC95E0DA094E9BEDE99FB45F73E2078\ 3038AE0488539A2CE982B4F180FC71858F2E5759E61E2C5A5FAFA435BA3A62A3:\ CDC7D5FE3805572EA3FF554C086C7DD4020A3CE48DF5A09A5CEB75E6AABCD338\ F800F362448E87CE7E1A55331ADF2BBF3A22B3E6134035FDA52D9578FD3F72F7:\ 57687920696E20746865206E616D65206F6620616C6C20746861742069732067\ 6F6F6420616E6420686F6C792061726520796F752072656164696E6720746869\ 733F213F21:\ 05BDC911B3F19F2201EDF6CCC792A68BCEC40506F00112A6DCAEEAA2D7A62192\ 931D8968F7312EBFE7F7646CED6A8948E58327862527EFD960F15CD8EC74D1DF\ 1FDC37F369A4A844D15DB7ACC6DB5ADA884B119148929439D5305B6916D0A081\ 1D395E6A28042F83D1154FF45DA6A79A3801858031A2C91EA699C02DD6055CC2 2:\ EF86DD7AF3F32CDE8A9F6564E43A559A0C9F8BAD36CC25330548B347AC158A34\ 5631FA90F7B873C36EFFAE2F7823227A3F580B5DD18304D5932751E743E9281B:\ F5BB4289C389D9019C36F96C6B81FFFBF20BE0620C6343E2B800AEFB1B55A330\ 8CC1402DA7A2A558579A2A5146B30CB08E3F20B501081248F2F1DE36CDFCE9DF:\ 2CA039854B55688740E3:\ 1AF029CBEC9C692CE5096E73E4E9A52EC9A28D207A5511CCEC7681E5E3D867A4\ AE2E22DE4909D89196A272F1B50DE6FA3248BCA334D46E0D57171A790B6F4697\ E7BA7047DB79DECD47BD21995243DEBBF25915DDBC93C45875C14DE953792257\ C5C6825C905AFF40109C8CC7E793123D47AC1B5B6304A436CFA9BEEC8E0054E7 2:\ EF86DD7AF3F32CDE8A9F6564E43A559A0C9F8BAD36CC25330548B347AC158A34\ 5631FA90F7B873C36EFFAE2F7823227A3F580B5DD18304D5932751E743E9281B:\ F5BB4289C389D9019C36F96C6B81FFFBF20BE0620C6343E2B800AEFB1B55A330\ 8CC1402DA7A2A558579A2A5146B30CB08E3F20B501081248F2F1DE36CDFCE9DF:\ 2119A954F1AC0F3DCDB2:\ 60C3CCF4F086B15B7F850B445F384333F7AE5A4B5EDE2820C7233239E1B86D6E\ 4B4FCA4F50B087CE1DF17DA5D62672A17F2CF87A2875BBD9B138CAF6863821D6\ A4D553E9EB64C9254A8F9A6B960E57E39069D65E3F561AA1FA91643D42FEEFB9\ 270D34AB0861DEA1E234EA587F580503D46A1989D413DAC2FFE0FC4CA663CE68 2:\ EF86DD7AF3F32CDE8A9F6564E43A559A0C9F8BAD36CC25330548B347AC158A34\ 5631FA90F7B873C36EFFAE2F7823227A3F580B5DD18304D5932751E743E9281B:\ F5BB4289C389D9019C36F96C6B81FFFBF20BE0620C6343E2B800AEFB1B55A330\ 8CC1402DA7A2A558579A2A5146B30CB08E3F20B501081248F2F1DE36CDFCE9DF:\ 7A4C634DE6F16315BD5F:\ 308A5D65224201BED626CC83FB901EC84874EE03B2E7AB4E752EDBDE024C754E\ 3CC9841CA062100A8843DE9183354B4E0596E8C68F1605828287884F0F9BA696\ 8FC7A9F0CA09418A8485B90465E5D3F96CE4995A5FC7A6E5ABD9CC06BB8A2C3C\ 8109F72EAE67FB4C108852C881CA645B3C5586F27F12FF3028ADE56E32AD9434 02:\ 0BC31C063F43B3ADE2CD633D554913339071D6EBED5FD665FC5DD7D47B80721A\ 976C3B14FBD253F0F988C354725289F2897D7FB62C5C74AF7D597A1E22AAFBA1D3:\ 0F816BF0ADD559AFDA38B008E4087F6A38B575C56FFF453056EAAAB3381C9552\ 0969546F954D458D48E44850938B1DB471CF4B40AFC47E067FB5BCE67BA98BE8D7:\ EF0F1D56F4E5D587C212:\ 3E544FEBB6623F5D392003B729FE2BFC20E2CB3ECAC22734DFCA55150254E616\ A41C5E54CE3B50FBC2FE2363EE9AF9B15C70615497B0A458F8AB6D850992EEEB\ 56D65F87EA1BD6E2B4B7E40A0F5E1635C7DDB17110C61039CF712D3524C9C2C1\ F35D9163BE5C70276F46634514BE16EC09602782E88FE74EAEB2F50CBB0E3B5C4A 02:\ 0BC31C063F43B3ADE2CD633D554913339071D6EBED5FD665FC5DD7D47B80721A\ 976C3B14FBD253F0F988C354725289F2897D7FB62C5C74AF7D597A1E22AAFBA1D3:\ 0F816BF0ADD559AFDA38B008E4087F6A38B575C56FFF453056EAAAB3381C9552\ 0969546F954D458D48E44850938B1DB471CF4B40AFC47E067FB5BCE67BA98BE8D7:\ EC5CC4228C3C70EE8F35:\ 228BAA85062F10DCC9D99A23D340BC4B9E463D8AB86A6781A6D2143564303E2D\ C78772BF68449BE1E2711A68D5A15CF04A23573FB3870454308F583BBB5F2467\ 069EF1395431E70F91BD56D846DC8DB2E88AB3D26A9770660B87A76D6C3575DE\ 512BAFA8A0B901AD15B7D8E8BE2F176A182D16A9609F19A4298416245873175805 02:\ 0BC31C063F43B3ADE2CD633D554913339071D6EBED5FD665FC5DD7D47B80721A\ 976C3B14FBD253F0F988C354725289F2897D7FB62C5C74AF7D597A1E22AAFBA1D3:\ 0F816BF0ADD559AFDA38B008E4087F6A38B575C56FFF453056EAAAB3381C9552\ 0969546F954D458D48E44850938B1DB471CF4B40AFC47E067FB5BCE67BA98BE8D7:\ FEF5EE07C74118DA30B9:\ 2637E16E2599B6EC2F4728C73D3B29F483C2B881F1E1969C426027605EF080E9\ B17D258D5E1EBC6472A2501E04CF19C144537FCB38A1DA00D948EBD39FA11322\ D9230B62E2C12AEDB366BD85A2089588A8D52E941FD986D89828A342B83438A9\ 60B6FD87E9AD025AD75A692AA9DFEA873A9467B42D84879E85C5D11EFAB347FBED 02:\ FA880A456F9C205A26E02C3357536531DEC150BE0EF8747F69EA30D987FF7DD8\ 9E9A1075EBD39F04FA495BD26D8408A8DE69113A9FBB52F20713D1D046A76B47\ 8CF77C46454A7AFDA2EF418F63FAF67C947D898BCA109F3275999E8F2E60E2C0\ EEC133FF69E71A2D396632670B52D8EA03F7589D8144AB580B1D3E60EFA1280B:\ BADCC718DD2D761C4893C4831D56ADA30FC5C7C148D473BEDF7615B7E821B92F\ 319676CE278349F1309FB3D264C1A22BDE71B221354C7A4D31117B3EC3C9D480\ 2E0A26BD8EC05D28B6502C65F35C687AF7F8396B963ED029A2C5AE38DD7C5C96\ 2A953C113C0F590957AB19A6E2AFDA6DB84F22C0C31AE243DEBD2920FBE9FBDF:\ 15E7B7B7ED0F176B6799:\ 39FF4B5FA50AE498F3C91A655E6865840D1FC401EE02DBC8460A59DEB8816E66\ 80F712B7BAF8D4DC11A3B54BF906BE698306F0449BB43F3F223B944D930A1A3C\ 718E8A9E2EEDEC5A07AB817C26A80CC2A2EE2846A597EAB8A999D38DB9849016\ 6F2574524038BBDF24B4E4622C843210C6B94987638C6976562EA9727385B152\ 614C18349BD54AD95DE33D5354954B505E5259CCDA47E3CECEF3154F6E5481E5\ 36BAB568146A0BFCB66573714A7BA7ABE0385115720687F33D9C6EF6BB60272F\ 1272CF349990E3A2FBCCE180B730792101089B164AE5A001F5263F7493AF148D\ 6E0953E311AD12E4202D35F96DD30885663B5101F9B05675FCD2FCC4FCC4DDFF 02:\ FA880A456F9C205A26E02C3357536531DEC150BE0EF8747F69EA30D987FF7DD8\ 9E9A1075EBD39F04FA495BD26D8408A8DE69113A9FBB52F20713D1D046A76B47\ 8CF77C46454A7AFDA2EF418F63FAF67C947D898BCA109F3275999E8F2E60E2C0\ EEC133FF69E71A2D396632670B52D8EA03F7589D8144AB580B1D3E60EFA1280B:\ BADCC718DD2D761C4893C4831D56ADA30FC5C7C148D473BEDF7615B7E821B92F\ 319676CE278349F1309FB3D264C1A22BDE71B221354C7A4D31117B3EC3C9D480\ 2E0A26BD8EC05D28B6502C65F35C687AF7F8396B963ED029A2C5AE38DD7C5C96\ 2A953C113C0F590957AB19A6E2AFDA6DB84F22C0C31AE243DEBD2920FBE9FBDF:\ B36724C92954C38D0288:\ 3C8CD3614555568BBECA99174B7B203D0BC6FABE9E6FFE0C41EB4D9A2C601D23\ 93CA1E01B7D7E99337758AC914C9F151311E5AE6708DAF1D8C825DA471652C6E\ 13A8FE5802D7AE097BFC899A4EC8CA235B5982B9058C53AAD52823ACF692290E\ B8823C126635AB0BBF101C2B3149AB16183FA2DBB049DDB99C5E83723E4D4693\ CA3A08588AA868C677D42ABDAA6586EF192391D276C5E5AF0763ACCA6293F062\ 50C51FDC2AD369CD44EB5F654E98761C881DDEC08E795FFB229B20522349B071\ 4059E18B7B23A48875EAB12ED3F0A011D3A985DD7384B0046F39FA6C1A331F3D\ 4C5125100BA58666935C68A7A10849D9C74850BAB82AE15EC950A283F3E7DAD8 # Format: e:n:message:signature [RWVA/EMSA2(SHA-1)] 02:\ E5EB47BC1F82DB3001FAAEABC5BBE71B7D307B431889AC10255262281EC5F5AF\ 8A790BD7BBEC5EFFFA442CF2C3FD5CA4778763B9D15AEAC0B9B71BDB13DA8272\ 7F4967AC685975F8FF05A763C864D100B7CC1142102AA2DD343EA1A0AB530255\ 195C3A6400ECAB7B27EFF9B01EF6D37381FA6FB5401347F195354396772E8285:\ 2A51DF4AF88613D91A37:\ 6FF18F4471E1A8F850C910A181A9F28E69AACD8E8126969605E000A853197541\ AF9047E5D17315BF062B9CD8DF91196F0343285D9E31D5C72560C156782B6D0E\ 5AF8F06D7DCDD8CABEC01B2438C168C40C21F6A8794648361BD2AEE13573A49E\ CA07A7EED97C0B9C5B1E508869E4CFD5FE1771924B1CF5A4BFF7D4379E5CD59F 02:\ E5EB47BC1F82DB3001FAAEABC5BBE71B7D307B431889AC10255262281EC5F5AF\ 8A790BD7BBEC5EFFFA442CF2C3FD5CA4778763B9D15AEAC0B9B71BDB13DA8272\ 7F4967AC685975F8FF05A763C864D100B7CC1142102AA2DD343EA1A0AB530255\ 195C3A6400ECAB7B27EFF9B01EF6D37381FA6FB5401347F195354396772E8285:\ 1CF8DDD95D780A89D7CF:\ 539C266B0313E0E256ED98EEF13E6AE64CED90C160A4999B3D47CBDA5285DAB0\ E0678C0E079CE9B8EB23E10EDFACFC19A80EEBB8F38ED5B5D6C8A988AB8CEC40\ A5A5BA102F75586167EAB6D5BF0CE8FF30C656895800F6F1B37D69FBBAF9055F\ 7505DBEB537C0F986A1B5F0270DC12A640FFCB626F9763FDCFEFA1208C104003 02:\ E5EB47BC1F82DB3001FAAEABC5BBE71B7D307B431889AC10255262281EC5F5AF\ 8A790BD7BBEC5EFFFA442CF2C3FD5CA4778763B9D15AEAC0B9B71BDB13DA8272\ 7F4967AC685975F8FF05A763C864D100B7CC1142102AA2DD343EA1A0AB530255\ 195C3A6400ECAB7B27EFF9B01EF6D37381FA6FB5401347F195354396772E8285:\ F6959926E6D9D37D8BC0:\ 249E1066542618CE0D236A7174708F801E7AB257931E9967A65C483ED66FB585\ 98F99B6664AF0EAE221E2A6B271D7D17875ED02BF7FE35AA0786023858521CB7\ 9FEE0D134D9DDA609B0270FC9804BB6BF74AD90AE11EB339353533DC0D5A69E6\ B8758212B86024ED563767EA5D9B59655E0B8CC21244F720BA4ED663BF668E3A 02:\ B660EB18786256C993EBC6DCB5892EAC342F6D91229B73DC5D04F1AFB9BB0DD4\ EB0B48895F514B4C9AFEAF86E91226F2299126D37528CE374E89CC312C06F47C\ 81112BF5CA60FFC33B98318E04A17627269F1AF461B6CB40F3BE03B0113FB2D8\ 404E154C7191306B36FD3EFA73C784AD9189115D0BB1BD82B850D000E7CC8D2035:\ 2C9EA313EACF2C5DA43A:\ 1FEFF88814BB53E447E1E955AC8F1AF597C15C3866033E337AFBAB8627306F2E\ C1276621FF2176C89323CE32EA20F6AEC2CC271F1ED749408B2A3E43A23A44D6\ A3F38DCDDCAB696B239110AA7ECF12C6681B0E97E6FFF1B72F4F6D796BF82B94\ 50AB8B3D28CA9D220BDF84ACCEA1DA5EDA0B470C3A82BBDD77B4C2723297608BD4 02:\ B660EB18786256C993EBC6DCB5892EAC342F6D91229B73DC5D04F1AFB9BB0DD4\ EB0B48895F514B4C9AFEAF86E91226F2299126D37528CE374E89CC312C06F47C\ 81112BF5CA60FFC33B98318E04A17627269F1AF461B6CB40F3BE03B0113FB2D8\ 404E154C7191306B36FD3EFA73C784AD9189115D0BB1BD82B850D000E7CC8D2035:\ 0B9554FFE4F6ADAB2C76:\ 095952F24D9FBEF3A93A932865F4BDBB522CF24EBE153CE4BBB24CF301A1C7B5\ 1FE47B94F8F8B211CBC5A926FF6BAF9A6BBF7E15975D2DCCB95EF01AB7E64168\ 7870B0D01FC18B6B16FE17D3FC82931FBBCD4FD18C7F9588CEE8491876D72F98\ F2E7EEA90C12907210D6859053ADC7178B87BF8B4826954D6986FE761E71E1B7EA 02:\ B6DEE7375BF4385043B3CC2AC5CACBC14AD11A17574738DD2BD84D2D1E6C74E1\ 6066C2A5C35BC3B87839858AFB5EE5E8ABFAB408F38772866F6F833F39FAB248\ 3A2C34ED55AD7098F9F63D4EC70B7950F02DAAAAB10781A0008F993C4027E381\ 6BFD45C52F59452A7B28873513DCE415A84FC8BC06601567F91EC41647DA2304\ 5B6E01E24516724ACC02947AD5AA2DBA4D952BC4F49D18ADA0B0F7CC5D488814\ B921C0BC2B33D8828D80130DF7D79B0992CEC40D3BC7217D4A4DFF3699345E44\ DAC968575194845AA7B60DCF3C712D9B0A384824C3579B40DBA265457D50F69F\ 02A140884D89B7FDEE9F0A787E76A37C58C92CF2D3818C72097D41B3FAA7AA95:\ 00AA5515CDAE5CD0F0DC:\ 30EECA6B48D796552F5A6A3C11F28D730FA077422CAAB34FDEB879AE0F71DF21\ 330E2F3BE5BF3A8CA372EBCD3DFA7C81B3398C31B0972D0B857926CB39732351\ AACEB8276D52B9D82F9C245FA0F1CF49E785A2BC00FF27FBCF777F84D05BEF17\ FCC0505820B029AC8F0CE17D2469372CE47E1428BB941004FE170EF87163E072\ 98EFFCC1BFA7E7CB1F572C340CAA075A5962A15B69CE937BC7EFB492F501FC88\ CBF0119C351C8498782091EF6EFB19120195E5FF51DF86F90E90FAEB225AA2EE\ 43AB4E8358101C0348C7E3859B9DEBA19464C74B74AC48A0B73FC8D2E7F8033E\ 86208F0792B6E5B6DE36C99DEF604949811D1671EF6B0A4781B4E7A0A72AD855 02:\ B6DEE7375BF4385043B3CC2AC5CACBC14AD11A17574738DD2BD84D2D1E6C74E1\ 6066C2A5C35BC3B87839858AFB5EE5E8ABFAB408F38772866F6F833F39FAB248\ 3A2C34ED55AD7098F9F63D4EC70B7950F02DAAAAB10781A0008F993C4027E381\ 6BFD45C52F59452A7B28873513DCE415A84FC8BC06601567F91EC41647DA2304\ 5B6E01E24516724ACC02947AD5AA2DBA4D952BC4F49D18ADA0B0F7CC5D488814\ B921C0BC2B33D8828D80130DF7D79B0992CEC40D3BC7217D4A4DFF3699345E44\ DAC968575194845AA7B60DCF3C712D9B0A384824C3579B40DBA265457D50F69F\ 02A140884D89B7FDEE9F0A787E76A37C58C92CF2D3818C72097D41B3FAA7AA95:\ B8E2FB9EAE22FB2C0021:\ 416D33F8C213CF81F805F54FC1D4E7C6A588A0965F1C9CAEEA1D41452E20935A\ AF2D30F957584B56621035430212A428E27A2F687CA9DBB596C19864AE692EF7\ BBA730F3D70CC2DDE15AB71E1E350C0C316EFA1A831ACD1441598B112482487D\ F72F58ED318182C7CD0906FE39C5655BF1313F29A15D60A6178CBF600C7FBFF8\ 994840ED649C3C4026A463B3EA39C692B7D112B128BE49E1E32D4A7FF8D45132\ 83D8DCD9CCB8FB7300BE0BDD4C44DAA2F7049B3AD83437093E623442AC69B489\ 11CDA21E95E0775041F67F6E6AE01DCE646AEC20908E7C1B693600FE41ABA85A\ C0C778641E46C419083E41773C749DB3E1BD8FD764E271860D2D7F8E11BD6AB3 02:\ B6DEE7375BF4385043B3CC2AC5CACBC14AD11A17574738DD2BD84D2D1E6C74E1\ 6066C2A5C35BC3B87839858AFB5EE5E8ABFAB408F38772866F6F833F39FAB248\ 3A2C34ED55AD7098F9F63D4EC70B7950F02DAAAAB10781A0008F993C4027E381\ 6BFD45C52F59452A7B28873513DCE415A84FC8BC06601567F91EC41647DA2304\ 5B6E01E24516724ACC02947AD5AA2DBA4D952BC4F49D18ADA0B0F7CC5D488814\ B921C0BC2B33D8828D80130DF7D79B0992CEC40D3BC7217D4A4DFF3699345E44\ DAC968575194845AA7B60DCF3C712D9B0A384824C3579B40DBA265457D50F69F\ 02A140884D89B7FDEE9F0A787E76A37C58C92CF2D3818C72097D41B3FAA7AA95:\ 8C8C306A629373BAE647:\ 0E9A00045FFD399D9DA9D0D7E543CF9FFD098BC23E72DD7763A64F22C7F0479C\ E866E31438B8F7DE31A18F35AF419BED6C67BE1540614D3310DD24F019E14FCC\ 3AF73743F4C143D4B79CDF35C752A300F0A8251CCFF4AAF18785C533A7DF1A20\ AFE6770DEBD1B8BA2C83B2E345A04F833CD173E998FF9840C2F8A370FFDCFF5F\ D95CBD71B25FC9972192470FD145975344F64C2F6D68CB3513F48F9FC070021B\ EE8F6A4282D098C44DF655CE415E89B97994AE3ABE85986C7EE0AC348EF2A4F5\ 2D102EA80836E77E81AD3678803E53C83CF2F30D2D4950FB6B038CCB3F2690A9\ 381EB34D6C09E88C090AB05E28047DC490EB8A1282FEB38E82FB0B18309284C4 02:\ B6DEE7375BF4385043B3CC2AC5CACBC14AD11A17574738DD2BD84D2D1E6C74E1\ 6066C2A5C35BC3B87839858AFB5EE5E8ABFAB408F38772866F6F833F39FAB248\ 3A2C34ED55AD7098F9F63D4EC70B7950F02DAAAAB10781A0008F993C4027E381\ 6BFD45C52F59452A7B28873513DCE415A84FC8BC06601567F91EC41647DA2304\ 5B6E01E24516724ACC02947AD5AA2DBA4D952BC4F49D18ADA0B0F7CC5D488814\ B921C0BC2B33D8828D80130DF7D79B0992CEC40D3BC7217D4A4DFF3699345E44\ DAC968575194845AA7B60DCF3C712D9B0A384824C3579B40DBA265457D50F69F\ 02A140884D89B7FDEE9F0A787E76A37C58C92CF2D3818C72097D41B3FAA7AA95:\ FA95400C2B14E064F76A:\ 3F67F9DBEB88E6AD057BEDC3D97030555A908867EC578A6CA572137CB61C2103\ 6AADE6DDC5592EC7CCB6B263E51B4C886A51904C858040E493D64B9ACE5BAA50\ C4A66D04ACCDFE0039D8541C4363DEFFCF93BDF5F5CC1FB64855D956B5EFD42D\ 4C9B96B9CBAA97A32F02AAB307674E53404E6836DB5C96B59572ADBFD1113B87\ 608ACE6D0898CB02E35575CC28D38A9FF8C1C4AD36BAA991DEFAB533F0A6C9C2\ F0F0815F1D659ED576E5DB18494A54B6817D9E34A134F3B9A0F1E8C77FC204B6\ EE087C0445A7036C935117E338D092F6E1FF4DF7605525C409456A5195233A17\ 6B29B2FD8FB2808D0412FCA0541B2BB6800BD8BB9DC9DC25230166071E8D961E # Format: KEY:message:k:sig:passphrase [DSA/EMSA1(SHA-1)] -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBGDBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIKioqKioqKioCAggA\ AgEYMBQGCCqGSIb3DQMHBAgqKioqKioqKgSB0C1Q0dDyQ+/aB6Rid4iU+Kytf/dl\ y0cmCXyXGWwZhoc0fqq9FwUyoxDFkZgpdYCgInJvW52O5kkgAAYYZdBSziQU4E7n\ I6KUeZDYDqJU6VgkK9V1k4JoBKS13L68NwLawvXS+iDcSUoV3C591ynOVMeGsMgv\ FLhGimZW7KaqaUVnqfcHuKp8UfboW6aqrjknltDeHixpTOduOsTzJUrxGMM/o/iV\ BKSYqmkNrJmNIq0kqOyYBvxgwsfYO3cBPkB5gVBK1qtlg/gwsAA/sDOqyLU=\ -----END ENCRYPTED PRIVATE KEY-----:\ 426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ 723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ 868788898A8B8C8D8E8F9091929394959697989A:\ 19F24178D7369B619E566C5256C49EA648B68CC22C1999EFC24BD22471563EC1\ 5435356577466CAD:lrbbmq -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBmTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIhoeIiYqLjI0CAggA\ AgEYMBQGCCqGSIb3DQMHBAiOj5CRkpOUlQSCAVCe8zFeu43ErHj8bV0SwfCflqCh\ WsKecYnHronPutGoumfIOc3vAOsm+H7MdBv7RI8VYcoSd7ccVKCrbrxT7sYpHw7H\ 2gxq4I3IUDjDRr/IcuDCzztP5fm5dcuIgs5qDZdqphYo4L1BNs4XLphK4E1RqW6T\ UfNHUzrY1Rh26x8HRgd1Zr7O+J1A2ZvlopHIpwT6Byb1SQBiwvI2S3P63yPeqDZy\ s8wDfcL8+xbpKu8qVN4/D33vQh4F6Ptmdv0xXJuQUij820h+LcFhj+0xRmUae9PB\ dp8ykyAS5QB+29j2R5YXR93ANtH9q6uAWeRPv08XryEl9WBQy2h6vPOM2NNJJAhw\ V5rx1HHa+NLJHPaSsTtgiXEC4/9HeMRNIRpwm/aaYyUtx8Y8zamXNf5sfs/RIp5Z\ n2XIqLzaahgk+xm5C+pqqMAclBkLhT4iX4GvcE0=\ -----END ENCRYPTED PRIVATE KEY-----:\ 426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ 723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ DBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEF:\ 4B4471C82B030F2C2115B65309DF23A8B6AE1EEAE0C4AF91DAD7CFA7D3DFC6B2\ 5D5FE99E7FE4BF62:cdarzowkkyhid -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBmTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQI29zd3t/g4eICAggA\ AgEYMBQGCCqGSIb3DQMHBAjj5OXm5+jp6gSCAVA3igMQIZIcNy49pBMJeSd/a6q0\ oICNlYtfNlACbx6K23do+QjlwjgUzUkhpBWzVVNzSxNI7mUgqcFOF7OrBNQWldl3\ F940k5OrNU0GZCPhZLIT3cIpkiyXSN+DGpMTH5pis+g5f2IG2TKgTz+fVyZ39qUC\ Be+9sbTVElrF5eYjpMsGzgZW8t33hHH5hvpiXjCqKl49IApI/56EoATwYV/JHJRI\ sC4m4M+8zYyXHJRiUMnLFgEZK+8M9S8jQf/tXtmT7Ua4ddc3XAhhSJ5zeRupLSI1\ KEyKjq9T0uf3snhslzw7Vk6XRiUQS9I+QGnfXfW2ZLLji2gA54K/C+yC+UaM2yrV\ HipE6cWA7f/uWQH/Hn9Al5vjWnY/Vb0WHx54lYVps9Mlaga5vIQcFsxrTS1ZQvHw\ bygjEqFWhZNCSDQjvvFnelOqKOoq6cYcWmfwSeQ=\ -----END ENCRYPTED PRIVATE KEY-----:\ 426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ 723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B8:\ 76EC77EFBCE0F6B01C1AA676ADC3AC6409950FB79EC0DD25E6A76CE85447715F\ 91AB563454FE3242:scdxrj -----BEGIN PRIVATE KEY-----\ MIIBSwIBADCCASsGByqGSM44BAEwggEeAoGBAP795cm2680csLqzJLxt8vzriDGR\ 5cPejI7Sa3BtZNF9JkBLExBeClf891HGVhmc59HI7CSkVwKycD/HXXmNE6VCm4Ju\ FmT5ENfw3OERv7Wac7sI9PenVT8qc3vfVi0lRcSvx9vXlfqNEEJBWIPV+s03NZLv\ AAOKv0WQF0B6TtIRAhUA1wYYSyBGcR6bjdb2mt7KjxgCNtMCgYBO9ZCSK5GnL8Lo\ Mz2/fQnl+/Gtu8REi6ZiwPDrMhjS/7DsLq9eL8OFzZAh85q0rGzVe0d2tow0bm6d\ DYINiLcmiuH1TwRqYYvOecg2Ek3K/+w76b4An8IY/vtvg/9nx1izTuhyEhG7RZr3\ yV9bc6caqfPjcIppb6FZ5ikOeTBR0wQXAhUAwi5MTj9OW+mLNUQQUTiUFOy+ZMs=\ -----END PRIVATE KEY-----:\ 426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ 723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B9:\ 22E16319CB7FCC90CA03D66B1550FBEB6121AB426E1AE3618A3F8A65C0457A91\ E1E80D6EB35C8277: -----BEGIN PRIVATE KEY-----\ MIIBSwIBADCCASwGByqGSM44BAEwggEfAoGBANsWdaItyazuSLhac0WrnmYSEKcO\ ydCRzbSxSvp/QNn46SVucs4UdyCm+YqGchYVdL4MGLNu4H/VXW4D5vU/206YEPm5\ sqLj0zba9/hohpwb+vHTg9Ak/EX/E+mr8z28TeHkg3LRX18EclzHjKe/zl7r0WlS\ MbOz27LP4f5uKBUTAhUAyr5cJPSqLKo/EFDJsuzXb1KFgg0CgYEAxY953m2fa6IF\ vcOJtSpk8KLe/8ZsGbugnFHBaHz+QWt+2sJauf/eTh2hyi48wEmWsAmyI2Jz64u5\ WrXdJG6Y0DhcwJhbKts5wbztDIL3NAWxuppyGd89dJubaWElqyat81bQtIf7IuLB\ KgXoL1Ci6BznryfA7cuv3ZPe5aefsgoEFgIUM6rqDcBQGunu3douZ54MG5I7Ve0=\ -----END PRIVATE KEY-----:\ 426C696E672D426C696E672E2053686F75746F75747320746F20744F332D6833\ 723320616E64206C306E2E20416E64207468652052656E64657A766F75732E:\ 9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB1:\ 033A7684B382E2D2DE424111A110A7A326BA2158AED4BAC034815B8D3CDE92B2\ D71A5CE03092079C: -----BEGIN PRIVATE KEY-----\ MIIBOQIBADCCARoGByqGSM44BAEwggENAnkAwD9dAnTwxHobWWmnm8IVsVZuKY8w\ cjg4YwWmib0iv+wvwhiKon2XNhbtErdg9uqnTPXJJ5dYAVf1cq11jKidgW37g0P+\ J046VzuAdGjtWaxqcP8KuqBPIu72NK8c6Q2q59LYYS023XY/pvEf5JRSkmk38bgY\ CK0pAhUAsPZ+YCHrRD4mQrzJXv3dtmWJumcCeQCwP26D/4ElPV4uQ9QilY5wcprT\ ZzTGSzXTb8WAFHTT89dJjlwqQpAdIiBKrJmyKfWTEpqWtVMr8ugcGhdA1HjOzYTD\ hsD2kOIYFfuKXmP68902Mpak+WbjsnLaJF4KfC9PrzUL/6ZGF+YSFexN0KvP1rCo\ eno7RrEEFgIUHmzIejm5tPDB8oEZD9WD+5zm7Hs=\ -----END PRIVATE KEY-----:\ 49206F6674656E20646F207468696E6773204920656E6A6F7920617420746865\ 2074696D652C20627574206C61746572206665656C2064697367757374656420\ 77697468206D7973656C6620666F7220656E6A6F79696E67:\ 8788898A8B8C8D8E8F909192939495969798999B:\ 4AF54C9F782C3B4B1D5000985F684B64D5EF030F7952FEEFA06475487BAA979D\ AF382E53BE6C4D5A:rcby -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBiTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIh4iJiouMjY4CAggA\ AgEYMBQGCCqGSIb3DQMHBAiPkJGSk5SVlgSCAUC8VXV4fX+c+kMB1JpVinAEo/XN\ U9LzjtAS6C4hUUV5VZQHKNKp8HiOdc65BWrpLOPc72kuNAgb+KjYunVWSCD6k7pX\ Tm1XHIhbm54dsLynwY/F5jiNcSVKP0115E+WuJ5A4ps6sO0mk/UMzmH6IMmmNeK/\ pmqK+Gcw63tYchYNXoY6gYAlEHlxF0QijPw2mV93Jl+pxWEwFvkttGmtPCBwCXLx\ AdNRy9B4RSeaNaAMcALM0X/IrEx3owhoV9LAs8fUViJlVlI3BuVNofXCXeMU2vxv\ Ax8d3H+CECKAMbtyGL8tBmVE0HKd5ubpjGQpHBW9egaagwSNvQFiXJKAUm9ST1uA\ 4iZgRW0sOEOyNNgWUbxUoI+OYmcDiMbGBzv2JeO/yVFQolmgzflqlE6L3JJ6yqc6\ y6wZBPcO7I4uLnzuIQ==\ -----END ENCRYPTED PRIVATE KEY-----:\ 49206F6674656E20646F207468696E6773204920656E6A6F7920617420746865\ 2074696D652C20627574206C61746572206665656C2064697367757374656420\ 77697468206D7973656C6620666F7220656E6A6F79696E67:\ 9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B2:\ 00F04C3A7E9D31CC7C76BAA9246F5A0BFC3B552BC3593C856C5AF7E7E7B2224C\ 05445802A7D726C6:cdyg -----BEGIN PRIVATE KEY-----\ MIIBOQIBADCCARkGByqGSM44BAEwggEMAnkAtqJA6Mv/8I9ZVRd/288VFQUCcTPA\ qkAfIn9ZP0aUqDJfRuchnUFrOWkzp0QUTA0eFVMwt3T+R2iL7Rp7HwFbAXLictS1\ SzGX2CSCgOS4xGDYb8H7s6n/U4twEdQQfRsqKu4Z+gSdpfZStfFKZ0dYA9skEhI8\ m7NPAhUAnoE2PuOpzxxrKPJtMLBvcW3m46cCeB6j1vT7dpPk4RV8L79QL7S5aJsn\ 5uK9HR3mIdntB2OXTm67qD+pHbVZuYfhrtrM97e72jopd/diGOlwZ0h0iL9xklxq\ NvSlcuvRWCrlXk4NsJnUGm+fY6YUnWWuyhVVW/rLdD8xwkqP/us3TBdzN6Hhwk1J\ oB9JKAQXAhUAlmo1ft2RX6ivJhmvitzUcFwvvOQ=\ -----END PRIVATE KEY-----:\ 49206F6674656E20646F207468696E6773204920656E6A6F7920617420746865\ 2074696D652C20627574206C61746572206665656C2064697367757374656420\ 77697468206D7973656C6620666F7220656E6A6F79696E67:\ 838485868788898A8B8C8D8E8F90919293949597:\ 01224EAC2D585D92840280C76FB57306222E42800075D2AB872F08A8709651A2\ 219B1E7FAF242103: # Format: KEY:message:DER_sig [DSA_VA/EMSA1(SHA-1)] -----BEGIN PUBLIC KEY-----\ MIHwMIGoBgcqhkjOOAQBMIGcAkEAp7fQiSIN41Jmp5D6sTiK5uZqM+NRrtZHVPwP\ gicmBY7jLGKeSK7CNlaPTVkgKeQ04p7YCyLfMWk33vMYiAndOwIVAOoV8IwGiIXb\ Rcm44dWRfdsOJI8BAkBUtk78F7Kf8X7/5eapEczOy4i8h8F0QkYQp7CZVONaPi3T\ i2HA64tp3zM/z1WEEmO6wC4I5UrY9a84ckwLIwp8A0MAAkAS1f/NjG3z1z7Fhx7x\ koG5Oitf7m9ER3YzYJEe/vQ1mtDcgiNnAV33SOCz02jfaFr7+H3AdI5KzDXTB8HB\ 2sQw\ -----END PUBLIC KEY-----:\ 00BF86875B7DE45A29680AD78B41CF13BA70DA1DFB8500:\ 302C02147FF68E7723C6D6718D4B5BFD04069D4F86F48A1402147E78482F2BF0\ 37283BDE610C957E75CCFB5E1785 -----BEGIN PUBLIC KEY-----\ MIIBUTCB6AYHKoZIzjgEATCB3AJhANh0wGx4pOKnBg64l80gNBxTm0ql7BlotR9A\ jFdGqVBK9BZTU7sqGRSgQx4WLiLvJZB9VRmYo0pBWd7/YKS/yufwytojoirhXhz/\ IG5KkKbUZI+uWnFUFD+8YBiJo7hYtwIVANVZFYUPbGdHhTuhnGII8o33i3yHAmAr\ nFyiH8nbC3hVOFq/ba0ftJ1HD/gRIKIhdjJP+BmDb9epR/45W8dgvPwZr8NCix4G\ iJhaDt3B5ozEsFVtG2Wguk9tONZocCQByx48+tP0ELWhfHvsSv+gMrd+AeVzg34D\ ZAACYQCmvNmEahHpA348XBaXHK9qVJIm7JIS9v1Zx7w10UUSe9fha2BKH+DCirfL\ HVD5L1Ll3mJVJH/j+uO1PMZu5Sbuw7SDN/fNSMnpU/0krR8eZ65B3Strd3tM/vQ3\ fS083Gc=\ -----END PUBLIC KEY-----:\ E58DEDE156818EFCDDC72022EEB5D457CF25032BC6:\ 302E0215009BB427CCD68D7269D3692A29489026F9AFA71745021500AAC0B52E\ 5C8BDEFD0E7B3F81189C50CA8C46A3E1 -----BEGIN PUBLIC KEY-----\ MIIBtjCCASsGByqGSM44BAEwggEeAoGBAMtC1tIjltuwKtWprTwYrEpO5ClbyUvd\ BTIvUuYLrAaai7mGCSXbGRBXAHPS4hLQjUPZ7JuWYiLA2/WEttUP0Ai8P+oGsMKX\ DIP31KifdwNHa3jckrPS1mMgA2xVDm/nIM07HxquQ3mXuM3YJ8Di47yqvlAoOeZP\ e8fgPLe76zPJAhUAwy/14/bLpyDtp3898V+kSbHKb+ECgYBHUenqYLWd/ZNUXWCo\ hihbT2FmS8kxCjiVsqhAd1YfXe+KyPKR+N5r2qfwoN87L/7jNO6Mm90T+OxEsfKu\ HZMBAwwOXN54eGBjiJhQYAAryMQuwFV8KICbgOG8FyJDUjo9P6qaqmezV1ibqqsr\ SVqHE6BjEgqU7T7ee6JbhdHWyQOBhAACgYAJDkq1oVGgIE+HdMGjj1LPclk51Euk\ Fd1GMt+RLxB7Yt6Ism0txDoBE/aTbIi/b2bNCShn0y+Sr8+KT/6kYElwIfN9y1ZZ\ mFlp+idxV25J7VpcMnSwlkaFuP+gmPkesXImQafs1NAgMvbLtAqmARO8OX3bO3o6\ fz7eifelYX+8dQ==\ -----END PUBLIC KEY-----:\ EAD985D13D2A1217AD620068A2CF985F031F37BD22:\ 302D02144CEAA8139F1A477CB91B77B9B20CD66F13291B0402150082191AD5BC\ 88067D833F7DB0629527B1A19EF36F # The reason for these tests it to make sure that EMSA1 shifts the hash over # properly (because the 192-bit Tiger hash is bigger than the smaller q). [DSA/EMSA1(Tiger)] -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBCDBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIg4SFhoeIiYoCAggA\ AgEYMBQGCCqGSIb3DQMHBAiLjI2Oj5CRkgSBwErzYywRqfwW9IxzqzsovFjnZK0Z\ KNpUiGOk4CJxENZd0/qt6ap3AaspM9u9xsfhO6WOK5eDimQDpN+lBsqhrKbmErWK\ 9ngRAE3/vj6DlO5RHn01E57fr+aQE1kigjhHaNPwAYZXEKlBqS1SxSYd26LlwcjT\ JrRqblCY4cBjCBGtzvVJK3escwTELNTZGgTr4X0A3sX4jCs/b/+MRt67cfb1SYOI\ hmojiK/EqJ978yCZu8YPtQFo68Vq/RTuaHvUEA==\ -----END ENCRYPTED PRIVATE KEY-----:\ 54686973206973206D6F73746C792061207465737420666F7220454D5341312028736563\ 6F6E64207465737429:C40DA376ACBB379890ACDFB021E02A:\ 041A7C1033F50A295DA0C4D436BD612466FB65ECE1357D4770BF93413F2F:\ lorellnmpapq -----BEGIN ENCRYPTED PRIVATE KEY-----\ MIIBEDBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIxA2jdqy7N5gCAggA\ AgEYMBQGCCqGSIb3DQMHBAiQrN+wIeAqKgSByLDSSPDO/Ck1yLY91WOlFZzkM+jZ\ P4jSwPOiJljd7+2i7+zBAe2LCkVyQZ+WMsScjNVvmYvmP9wucmMnj98XdpZuXScd\ 1GLkFurNB6MFJqW/jKUURrHWEwkIZiUlKVObnDyMdAk6PS/xpfRkDdQfqIvCTsyf\ X5uscHniJlAfqUMAsiMUGUgyunrZj63DVpoP89mj4E6Ep6WuSmjF48QwbAHuYPBs\ gwCpLRTCgr8EBF0WtZT+V4RzTmAG1qYyYEV0wdpiG0d5Pn7M\ -----END ENCRYPTED PRIVATE KEY-----:\ 492077616E7420736F6D65207069652E:8182838485868788898A8B8C8D8E90:\ 6DD27F32F0012698CECB2D8BE550ED662111608A6586A481CC7E2E4C5CB4:\ khopkmcoqh -----BEGIN PRIVATE KEY-----\ MIG6AgEAMIGhBgcqhkjOOAQBMIGVAkAA8HR2W1fHj8t8G9/BzpO5z1Ea5YnMTwMS\ /ozvaNrdRuRf+RuNGAEer1deRluO3BrQlknECrK+0BxpzfPT51qPAg8m1F08NAua\ +OtE3W4FMysCQAC+p3SjytVnkwVRSkxKcdSsbBv9NbW+TGQrxWE6KqfRoxN/Tov8\ +iZbtXywoSMLpPjP+oi/LQQtJTV7B07mRwQEEQIPJIiuAFmX4/IH2oOwMoAZ\ -----END PRIVATE KEY-----:\ 54686973206973206D6F73746C792061207465737420666F7220454D534131:\ 25ECC0ED4CE7118A72D133704D002A:\ 14593FBF63EAC64976987524044D8B11AB9A95B4B75A760FE22C45A3EFD6: # ECDSA format is group name:private key:message:nonce:signature [ECDSA/EMSA1(SHA-1)] # From ANSI X9.62 secp192r1:\ 1A8D598FC15BF0FD89030B5CB1111AEB92AE8BAF5EA475FB:\ 616263:\ FA6DE29746BBEB7F8BB1E761F85F7DFB2983169D82FA2F4E:\ 885052380FF147B734C330C43D39B2C4A89F29B0F749FEAD\ E9ECC78106DEF82BF1070CF1D4D804C3CB390046951DF686 x962_p239v1:\ 7EF7C6FABEFFFDEA864206E80B0B08A9331ED93E698561B64CA0F7777F3D:\ 616263:\ 656C7196BF87DCC5D1F1020906DF2782360D36B2DE7A17ECE37D503784AF:\ 2CB7F36803EBB9C427C58D8265F11FC5084747133078FC279DE874FBECB0\ 2EEAE988104E9C2234A3C2BEB1F53BFA5DC11FF36A875D1E3CCB1F7E45CF brainpool160r1:\ 1CA8A0ACE60292D2813D992C4EC7A4BCDF611C0:\ 43727970746F2B2B20352E362E312045434453412074657374206D7367:\ 9CB692B33F02179D1A6F2A0669FD8DAAF17E4FC4:\ 672EAFD043D30BAE7CA826828333FA70F10A14C7\ 0F49C076BB26178277D8E490D0C77F7A9649DE31 [ECDSA/EMSA1(SHA-224)] secp224r1:\ 42D126D0E51F3D6AA9B4D60BD1290853AA964A9C8698D5D5BDBAADEB:\ 45434453412074657374206D657373616765203230313130323135:\ E1F6B207B4FC896879A51F65E85DB94CEB633FEC765739E689847D64:\ A4C80AAF3D7B61200E66D6F41EC66D3D65E9E38DC06A88FE3B7F6C4C\ 8A5CEE4E04FE240464EA2DBB52489D3FAC1CDE6DA24A0E4C6598BCD2 brainpool224r1:\ 47B5CCE9EED463CED28666DA57DA9D0A8BDD3F000CCFC0AE6054F1AD:\ 43727970746F2B2B20352E362E312045434453412074657374206D7367:\ 9E9D0C9E67FF5785C3AD89195567CD3990D54C628788F26DB926F5B6:\ 40369F41BD0D15C92DFB855779DBF439376FB6EDC4153E9B99019B79\ 40FEF076FC8D610EC12AFC9CC43A150BD0190E507622E6623906D6B8 [ECDSA/EMSA1(SHA-256)] secp256r1:\ 368E89CC30AE7A3B4B4903C30C238C010257FE97DB85AF35982A7960A0DBD2F3:\ 43727970746F2B2B20352E362E312045434453412074657374206D7367:\ E2AAB3BD3AB1999651CD903F5385B8EC2EDA84C43B7801F08608C179DD373369:\ CBED1CE0D581020D2F89174EC2DE450C1D547BAC3DCEECCDD476A6AADF46D24F\ C456F43F351605CC40FC2A000B4D291042B5AEEA7A783DF89FC86666D832DACF secp256r1:\ 6CC691616D2C996A8F00A31C2EBF4E35C5EFFEAAFA2266F800768D5BF8EA2C1B:\ 45434453412074657374206D657373616765203230313130323135:\ C1DDAA59A4E0B5D95EB873C33BC465C6782EBF7BC43DB18058C9EC4816AD2A11:\ A8369164EF54A67303760B77AA62C4DE8122396908EA5B06DBCC2BC48264C832\ ADB3A8855019D5AFF789EC1F276AD38A03AAF41F88593B74E5CB9DF7E4BD4922 brainpool256r1:\ 4EC702404A8047A08206721DE33F02E1F06B14E09A5582171EA9BB8AB3C9BC14:\ 43727970746F2B2B20352E362E312045434453412074657374206D7367:\ A9952A1B896FB2C2AEA88EA578E2A5323114978A765E03E397969DC0F282708C:\ 54F843E89B084EEE1CFFED09F222DF041CD46DB0C48833667BA0790ECD603089\ 5304039A927714E79E5FCDB1D043E093FD85C8DD98B835CD6C7BB492C05357E5 brainpool256r1:\ 416D7FCEB966DF966CAE7BE2608C5C4D8939A7B5B3CF6D3E441A64886AC5FAD7:\ 43727970746F2B2B20352E362E312045434453412074657374206D7367:\ A07978494C1B301C1E44467853CD367624549E0E9F5092C0100A53F877AD2EF6:\ 93935B733CCC6A8702191664346135D1D6320D86A2346DFCA41AEDFBC4260435\ A4A9C66485C02BC2DCC858364173FAE00EA02529BA21B56BBBB2EAA4B811416D [ECDSA/EMSA1(SHA-384)] secp384r1:\ 100CC52F0263DCB12FDB9E50D44A4C84831A98756265DF0CBFD092D27A739821\ 043BFE282E2C8FAD46948C1F0365DD0C:\ 45434453412074657374206D657373616765203230313130323135:\ C27CC4947F7CA7AF386AF5BEA88582685A043BB3C83C0C8B2A4BB1E53A3971FA\ 8161168E332B2F3735A50BB3E8694F43:\ C8B93B3C4B97B87A918522F423E26194F1AEA2B83FE890893C15928B79BCAC75\ F66AB47309378A54771ED46AF6AA453BFD2404EECFCCE19ACE11E5D5883EE40A\ 300A42BD9AC79E77E507DE9EAE0B54034DB17355EE2111990ED226701D4ED7EC secp384r1:\ 4AF67D00B7A8D964B38CC52CBC808D4693595A5B330E0B3EA52BDCD619D41B85\ 6961BDAC571D9BC93D16A9B1C4D5CC2F:\ 45434453412074657374206D657373616765203230313130323135:\ 8C5D8DDCF8AF127174577A60F9B5512813E33EA8E45B471F343806FBF68663E9\ 915B81A33F6AD22007D57818023AF982:\ FF83C10E8D84777D17B724957B83E1500F578F1096C48BE2BCACE73E6681CDD6\ A34F66CA2AF31241FAF85AEE2528438DA6BED934D75ACCF2E41176D8B661AB58\ B7B867D802C38B39E8227F9CF0865072D381948FFFF637D8FB9B37BEC6AE0772 brainpool384r1:\ 19AD48ECFB30F115AEF41CAFD29B265A586399C0F95166017AA7DB894413A2AE\ 821B7BE4F4E7B6BBC22A4E2EB1CC0865:\ 43727970746F2B2B20352E362E312045434453412074657374206D7367:\ 83928FD1219F1C6D5B128C0ECD2E39A83399CE609382D41890D43FD476318E0C\ 26264E98E0D5A0DBCC28A8C01C2D63D7:\ 4B800A206ED7807C0F15798509164709E94ED73B5E02B10D65F45B6C2B7FD694\ 37F3B5D1342DAF0988CA100B8875C739\ 2CFA819E10B76CFE12B2C6485D8326B66E6256CD2F4A6DFEB9B2B7BDD732EA9E\ 9D5398DDECCBEAAF3FD53D554AA1FADD [ECDSA/EMSA1(SHA-512)] secp521r1:\ 1511908E830069DAD59E8BA8F1BD4045612A4844805F61F7ECD92A1DEE1877B7\ E62A57860314820C97FFC972732E3C4C0AE837103692E85B3A11B49EB3E20EF1599:\ 45434453412F53484128353132292074657374206D6573736167652032303131\ 30323135:\ 01C352020AAA6D14B6FC2B78FD46209A9EEF6A357CD8B5D53738E3D655FE7A80\ 8396E1DC5742058D05F2D76C8CBF4832BE0580A6FD7B4C7426656D17680DEAAEEEC2:\ 0138A515C79EECAAB50139FB5D9EF5A771CC1C0999F2E54B5A1A9370EA8ADCFD\ DDD6E9933A39EDA0862F3ECAEBD49EA5ED58D93DA8F72B1CFB11E52A1528AEC8\ 63870060D717B29AD6D36DE953A4753FAC58629429EF4DD8F98B5A4F5504C5B2\ 29C23C609905632CD8D839DC472693698D7A149E8F3F17462F86BA0A7A895D80\ 583A46E9 brainpool512r1:\ 1433AE89858BE7DD9346AF015FEC69F0556982FFEB9CCEF7FB1CE71155F7620C\ ED4A6ACD0F35461A17C8370C4E600BECBACC0F7C1D2D1A2C00203A0E6626C21C:\ 43727970746F2B2B20352E362E312045434453412074657374206D7367:\ AA72BC70ABD9E078DDE47F5440E75A93F136F6EAA5267F591E0D3F562DE48BD8\ FED21B9E3F6F5560250566A00C7AAE7E57770BFC7D18A3E7750DC6C7083CC5B0:\ A058CD406C7F2D87FBBDDDD1870C67D1ACBD222D45A929565101842EDFAEFB89\ 3CF07AD22CAC0F3350A7D1300741AB5ECE38498F196690CBCEDBF8C866995E5C\ 17F48EA66EB70ADE68F6C16103BE54DD004230270E1F8CAC2D6BD47F717C0D1B\ 1E335FA4AAA5212321EE93E55FED129D781912A0D87B78A5B569DA272B3C9469 brainpool512r1:\ 83DBEFECAF8CFF78C575BE9659C1A104767979497AD9B589B1B13705C71F1DEF\ AF5CA76C8700236CE2392268E0133CAADE358E3D4F2E64CB4AB8517079E3EFA0:\ 43727970746F2B2B20352E362E312045434453412074657374206D7367:\ A110CC7BEF64F5C0349344025B97B151C735408BD2BC0D0CC4E54642EA0DF33E\ 829E85916086B51624B830BB2CDF53DAD9003A6D194115051139DBC3E81DF197:\ 3254388208915E0EEB99DA89AA198C6FDB1A31B21D3B69EF8EFE4848AE78C32A\ 4C489347510A9DD04125BBE95F847E14A2DF3267A0A6D1B5EC442B130C9B5DD1\ 924FCD9F365897570329BFEC41FBAF42961210F3FF850DE5736FFBAAB09C5C03\ E0058BD51C8A8EF0FF221F31CF93FE59572ADA3CFEC7016085258A45D1E8544C # ECC verification format is group name:public key:message:signature [GOST_3410_VA/EMSA1(GOST-34.11)] gost_256A:\ 0400B6F1D75EF48902B0C2302F52CCC71233EC55B903061673AAA586A2B5\ 864048EA2675E8FD8DB1FEDFC7DD40E3CF3A319EE3130E0BE9FDF994B625\ BC1885F271:\ :\ FE406F383A54127453AED406FA9A3B610B28F89FC918C07A5A75289E97B3A991\ AA3CB0563295A3E281BA368DF8471DE0A4150B3CFCEA575D8A9CC9779035EC36 gost_256A:\ 04BFE0BA366BE575E45C5BBA339C51ACD75D517008A9D3169E3CCEA6EF08\ 046DA74312382D835BEEA1C561A75AFCAFDA0F75A4E5D9787F9DB2870A03\ 2AC1D90465:\ :\ F3AFCBE1398DDC01F0A9E4B45397F3ACD8F343399BD2805FB6293E9CB871123A\ B7AB61F33E0B70166C355963BB80B8F6DF54F7F6A43872295CD42B6ACF7DF678 # From RFC 5933 (via Bert Hubert) gost_256A:\ 03773DC3F032886D56439A9F17490B680570043F757252C1F60819D6C30DBF1469:\ 00010C0300000E1070DBD880386D4380E954076578616D706C65036E657400\ 03777777076578616D706C65036E6574000001000100000E100004C0000201:\ 66ED09C0A6C97E22CB4E66BCA61D2082FDF6924F3A717C43B531B2D43FEE76DB\ B0F490A7901B009CCDF87252EBE1790A9AB1A6A444DBACA3E264AF21D18B5E83 # NR Format: p:q:g:y:x:message:k:output [NR/EMSA1(SHA-1)] # Trickiness: in some of these, we put a leading 0 digit on the nonce (k). This # is to work around iteractions between the way we generate the random numbers # inside the particular algorithms, the way that we 'fix' the RNG so it # produces the output we want, and the sizes of some of the numbers (usually # off bit sizes, eg not a multiple of 8). It's a horrible hack. I wish I could # figure out a better way of doing this... FCA682CE8E12CABA26EFCCF7110E526DB078B05EDECBCD1EB4A208F3AE1617AE\ 01F35B91A47E6DF63413C5E12ED0899BCD132ACD50D99151BDC43EE737592E17:\ 962EDDCC369CBA8EBB260EE6B6A126D9346E38C5:\ DE0B54EFABF297087EE623D5CA5588C64828EF4FDE4FFBAE1ECD2006776B05B1\ 1B81EA3CDE9BC3964C1687C5325BF43D7CCEFA0D0A86BE5DFFDDD0D1143DCD75:\ D057B29DA96809BDC761F3210E467BBA5931B3C406581B268121FA5625C2F850\ 8B95ABC87CB061A8C32FA04E67397762F69A23ED42ABE051BD761DED4BD61582:\ 78E2D47D180E4EADD866235F5CFE0E487E862226:\ FCABA2CF434AC8DCFCEC:\ 91F1D3A9C129D91120EA3F6486A079AA695AB632:\ 44EC399FAA3853B7F7313FCCB3A30B82B20A18C45E53188FC58B0E3C141A0851\ BAEA0A7723C71A94 DC523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A81EA8E7\ 8C3F8A60E6A05C151C61430743C19B4F1BA140EAAFB0235F93E83CF2995FF0F3:\ BC1624A28732743BBE9B1A2B320CA31EF4A127456547ACFF:\ 829D8EE7A7221DC83F22F85FB5FC955E4D1E30563151D87AA82F1466E379A991\ 3351026B996C05413B01AB6E1AA83A8B3A30F0BFF50E118F0806A59209B3DB91:\ 8F8340D8E87FCFDE0BA81B45003DA97B7FDD21B4C1F256463507E56CA0F0FD25\ FBA142C93E23AACAA89289379B953FA55B3E143164A035E470104A9A984B083A:\ 4CCBC8427B955CE5D0263D682AC2B8BF7861ED6226B848F8:\ 5075752E:A876034938F576056B00569E4706963C8B28D23E03AEABE2:\ 3097CCDF824E2BB33089DAA042551335625D9802A2BDE54C10810881157C8DC3\ 7E2ADC8195251FBE040B919D56512F57 19A61288F2865F83256E77DBD8D651E6481A3DBFFD5F76777ACFC8C7F7F67BBF\ 112ABE08CF39A751295EAE6D388DA7D469CD312DA63C024304948A6C6AEC9732D:\ 1ACDF5C523995E25A96ABE93502691F3411D3A6CB:\ 50438F2395561269EE8DB64D7AB5602F3BA1544BB997A33CC5090B24B0911872\ 377669726D11BFCA63922CC669DB9D4B87D031079D10990012FFCFC54BBC8068:\ DF49BE748682A13BC2EDB80D5E4C793E429F6F5F1F042A18ED8515529AB2F1B2\ 1E0F9E824C3F6C65FA04DB99E3D8C6A1DE6E052EEBFDF98F5655A58680A964F7:\ 16226B848F79E4E38E49D072AEEAE3AF4C3E1CF6B:\ 5075752E:019E4706963C8B28D23E03AEABE27C7B294EEC2337:\ 006AAA75DD2B3A7AE867D2DA3581D04AE2AAA5905C0074F8C1507136682A93A2\ 3A89504DC0FEA5603946 2AC218404B476913794A81EA8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E\ 6296EA8DFBBC7D46615122FB2F836005517F32C1DF25ABCE53CAC404E95E72675:\ 1ACDF5C523995E25A96ABE93502691F3411D3A6CB:\ 65052FC9728732E830ABDDC1AF7F1DAFB410BF1FB02A5414D718DDF0A867B8F1\ C22EF2654B66C4EC538F34A4BAEE73981F86D07366EB672D2EEECFC347EA4674:\ 29F696C36E3BDF9B3945A031481EA7CF153ACAB0B689CAB7B799FFA9B5042929\ 234AE9C64D72690FDA8932E7C9AA808ED242E5E06AC68279544CA0B0BDC21F7F:\ 120FEB207F73754A9A42CD019FD2AC263476AF3CE:\ 5075752E:019540EEBCCFFBC202BB81AD78F1E046F4D4597F53:\ 013D9A09041BA0E9DD2ECE20C5042F5442DD14C8F00113A3C080CB2B8FCC156D\ 33E7FB8966032FE1570D C7ACDF5C523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A8\ 1EA8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E6296EA8DFBBC7D4661512\ 2F23F635FF988E284E3018C2C5347734940F7A0B045A5C9A61288F2865F83256\ E77DBD8D651E6481A3DC0CE0373D9A1EC8FC785D39DBF228112FB58056F7B0E9:\ C1624A28732743BBE9B1A2B320CA31EF4A127459D:\ 92EC521C2E2C415DF4DE9675A934648149CB0DB1BDC2B11A59D276B1408DA81E\ D2070E5A311EFD6D7A01B1D327331A7D5C830B781B9CC08D385EAB22AECFC558\ 3052C387ADD3F5FBEC04C1240BD3F48CC2482334F58606C0EC62DEAEEBFF0AC3\ BC4ED688EA0E27DCE1FCA166CF67741D1FC0EBD7F19E10554C5218C0A5FA7BB0:\ C0F8288391AC019CC4CFD7DEB3D85ECBCEE4386A4655E9FE68AB66B30098C7B4\ 8601B106B3EEA4F5D71995BB0FDFA27870B83ECF6F7EE4842B2C623367AF864E\ 0439A3D1125D7E697B085ED98AB85981D4C72BF10B2E2DDE9FD6D53D29D68AB2\ DD87122F58EB8C8E9C52E2C1E346A192F12CCB472CD54DAF600E0E93EE06DA19:\ 64E6970384247DDE2C94701DEE2BD4255785BCA10:\ 5075752E:0AF20FE4162B721067160E55F9BC980AAC8A51BFCC:\ 05B325CB3BAC1A189B132F8F88DB1389958604305104AB71A2C77D8A9C902655\ 9C2E1765D44A81A1178B 1ACDF5C523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A81E\ A8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E6296EA8DFBBC7D46615122F2\ 3F635FF988E284E3018C2C5347734940F7A0B045A5C9A61288F2865F83256E77D\ BD8D651E6481A3DBFFEC15AEB9410B3CB207A15FB0737509DFACD160A39DC3:\ C1624A28732743BBE9B1A2B320CA31EF4A127459D:\ 9C78F55BBBF7C3B8AC9EE5F94F3DD9A20A521F933FB57A035CF27659EC01BC859\ D1DE6F187791E92DD4F6F547707B7DB7586678E7DCC58F08897E3E552F2BB2ECC\ 61F4F06F4685F382DB34EB23ED93BF22FC7FC2E9C0A4151344CD22AD014B0ABFD\ C715A199E4EE599F09967E07282624F6F520FE79752B94FD6B32A1BEA8D6D:\ 4C9421E17B605A89976C7274DA20BD5BB94DEAEBF07CB926B4D33C9B9C1E5939E\ 4BC1DB1BDA3CD1CD7828F17456666D243CB05DF5C02B430B25D41EB5E6CC466E6\ 7A5AC7D89EE3830690E3590588EA0CAD1883E299D2B9984B9234C6A49194BE1BA\ 31D5CD8F744177064622E696318B4C15AC1C94854F63473F695F2F517807F:\ 69E4706963C8B28D23E03AEABE27C7B294EEC2338:\ 47656E6B696B656E67617220466C61726521:\ 0A9A8513912E5A2AA2375A50A53E505C0F8D4D0A7F:\ 082B6655BB32ED12D90CA95B8DDCBE36DA1DF3C96F009F88917FCB93F04D6198D\ 438A1EF1FB732914332 3ACDF5C523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A81EA\ 8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E6296EA8DFBBC7D46615122F23F\ 635FF988E284E3018C2C5347734940F7A0B045A5C9A61288F2865F83256E77DBD8\ D651E6481A3DC0091CB01E4ECF2CE88F83F8CE4E39290A544519A92FAFF:\ 3C1624A28732743BBE9B1A2B320CA31EF4A1274569:\ 1CC1C87EDAF647CBD7356D6B162BC027C549063734D50446C9FD5DF04EE59547BC\ B4022D7BD4784DDD0C890B3D17357E1C679BF2BF5688B647982816D63E1CE6254D\ 551211B03D7547B72D734152499257C0E8D45C33B192B62280D365B921881E644A\ A31C11888EBAAF02791415F433C5635AF09A8FAC366797F40D18365576B:\ E43E4F1FDD4D7C26D80916ED6A8E5748A4F900B2F6042E1FD2A42B55240258BEAC\ FD494DFD669CEACD659F8DBBC7649ECBBF1B2DECDD1BE41142BC8A420E05F7A92E\ 3E23DCF021E8363E7027A0B896A456FE087A4CF5AFEBF5702FC8E64B82AE9369CF\ BEBB174A7080F6911D4D03677671A7011DFB18B1E2B807FF1ECDACE6B9:\ 169E4706963C8B28D23E03AEABE27C7B294EEC2338:\ 47656E6B696B656E67617220466C61726521:\ 2A9A8513912E5A2AA2375A50A53E505C0F8D4D0A7F:\ 34CD8EEF38DE00C87C2281ADEA5A597E85AFB8BDB42F59C80618D6EDB7361EF766\ 74C0D535B31BDA3A9A 7ACDF5C523995E25A96ABE93502691F3411D3A6C19AAC218404B476913794A81EA\ 8E78C3F8A60E6A05B71066EDE730E7CEC8993A6E6296EA8DFBBC7D46615122F23F\ 635FF988E284E3018C2C5347734940F7A0B045A5C9A61288F2865F83256E77DBD8\ D651E6481A3DC00A927480187FDEA61E094D4DBCCD2A60F4B5E9F613829:\ 3C1624A28732743BBE9B1A2B320CA31EF4A1274569:\ 74C4E94AFFBFD290B2F15EF802B81F51A1F4C872687FE373BC410C9CAC231F8AE6\ 9F0D48921AB3497334E5D692E6DCF5F8A7A64C571E1DFFE0D4361CD3EE6B74FED9\ 5AFF2C67C616B1D6C9A072973B33510D86CD64080388D757ECE5DF8BAD1D4DA42F\ 021A35C5A7225591470AC32F8699772AE9562FDAD76F811F3131FAF9259:\ 3C9A8741FBBF7AC5A245F138922CD64EE798B62AA99931D050A71650D12B3FFBEF\ E1AA95450A6DCFD526D9BE866089BD400FD2D6F4921533F5BB10FDC559C67FAEE8\ 4C75A8A611A57D83E69E26991E2B3F9B1224B61BECAB77D249F5F83DF42B284E3C\ 89565EB5D875573A61066275D3A8D2C90897CDA7DC4D02CA0AFF4A14DB5:\ 169E4706963C8B28D23E03AEABE27C7B294EEC2338:\ 47656E6B696B656E67617220466C61726521:\ 2A9A8513912E5A2AA2375A50A53E505C0F8D4D0A7F:\ 3255F933B90A659F32A2CEBDAD6C3465A494A87D350255D303139C95B0B60D3258\ A060B4510B0F26B22A C537448C630CDBA7C285B31E420F2BEA827EC72309E3D707251350BAFA3DB9FAAA\ 889769A43A2B48A08B46D18842BDA591EE3FDF95A3E3D6A2137BB273E2FB7632C5\ D7F620122DBED2574A5C9F6F34123132A3A1A6F7C5E105C129375A3733245580C3\ 659A11D4FBA7D50C116FE2D9BA950D6E03A0D20FA083056B38B3A3000C3:\ 2C0094AEAA23065124FC9C8ED04E1006D9403F4BB9:\ 834E982235B6DB4EF6EC52025C56C3A5BB4533BBB83F99C2BD12A200A0FCEC8840\ 94075F74F9D7BD5E4C1F4FA719E082EAC7F4C8A7AC5799F9F614C974E4C84A0487\ AACA50CB2D7ED3A1FDE75D5147D8EA9654BB2E0D19C807188A64A5B4FAF05A52DD\ AE1EAFA74146E28A1BC61B8C57192CC404D139F760DD3943E94B547930C:\ 470421750B0C8EF53949D4474F8DE8ADE8CCBF57FB1BB29238968074D9D703286A\ E7BB845F8BAF54C865FCBF89AC0668F7941A2EEF751D9E477543133CB5BA4FEAE1\ 59A877ADC3D590ED0AD0EBA0D0AC1134B7B1BBCCCAE4B26E1452C0A9308B476DAC\ D13B3BBAF3B7764BE5C2D9805DBD0640CF2D82FAABB58A4C4F1322E11D9:\ 2B9C9338848ACEB05F7C4F412F401C769616D48324:\ 49276D206A757374206C656164696E67206D79206C696665206F66207175696574\ 206465737065726174696F6E2E:\ 2B51BC665CF466B2CEC3DCA92F6D8F0F02F6A4F05E:\ 26DA0260F10D5C283D85A29399B341384B295B01EE2B2BF011377942FE9DA24B07\ 1B87D83E4167B0B5C8 1E9FFA630130BC80BC709C3FCA6F819848DA96CC300AE868236F4AE5F93ED150B3\ 7FF1DF910C28996364F2E737E574811F85DCEC79AFF30B76C4415E742A2519D596\ ED1227EF561CEBCE6BC029A10B71BE3C88DA1486774B985F5AE5CA97B3ABF3CBDE\ F7C35402BE0029AC89BEEB2E3BAA596D913B046168E38F02291023BAE525:\ 2BE48B895976B2E8C34B129EB01DD76697C0C16829:\ C4AB3CB5A673050E19379A28C6A044AD1E85FB66C4D52DFB640B1ACC103D31242D\ 68B19E11F0058F6507E9582094393B43160EF231CF73588CB6B02C4884898EA886\ DC2EBF9C85E0FA567464D649C17562A15E5CA5A6E8E2F93CC30454AB3DA0D5DEAF\ 833F78B734ED3374AB5FFB9A110DA42C27AD87762EFEB112EBC88B103E3:\ 14707CF4838E01CD359472ACDA71737D51D0BEBC61D0F825275265E42EACA744D4\ 587249D54F901C0BD4F64B0879D4035EC9EDB40C222A15C7113701F8096D6E5CAA\ 3288CA411C7C8DB6B923E933CB297760ECE68EAD0A9CF22CCA855448717399A8E5\ 94DA9925D0CE334BC8434C32CAA225026F03443FD0B74499F3D82127E830:\ 1902ECD8813827AE27FA8033C1DE6A65093BBA1469:\ 49276D206A757374206C656164696E67206D79206C696665206F66207175696574\ 206465737065726174696F6E2E:\ 260FE1BF1BC190EB4014A860AD06DAACF0E62B5C2D:\ 073B5E19E15868A062940B6904BC19083869FECF5E0FAA319A9FD3D414F405D16F\ 11D8EC0EE01B489277 33752A90D9CB3CE0672B72DDC545B97314D990EA3B6B86BB493F1256737CC3EEE6\ 1B1390F29E5E6A733998ED28B04527E05A19EE0994795318587ADDD8FC45C6A0E3\ B8D83FE78BBDDE6C8BF74BF1A11A1785CB13F894B99E536AB152F5CC6DDBE4DF0A\ E0B3323085AD6C851D18AC2C6C7A5D9F6F5F6297049C9943F9A9C050DD4B:\ 3B67337DCC5D5318D237B3CC48D05E60B7CFBA17CB:\ 4085148908A5902F01579635FE4BA536F3C5FA00B458A178A2A487D8ADDB0BB4F0\ 6DB1D740975F937FDF4D368444F85E210FD2576242DD0FCA58B3EE0595AA85BBB3\ 73D72B5E03C2C26B6C9AAB1C2D29669AE586347649A011F7428E05F727DB6AF5F2\ 5DF9338D668866E48014F0AE18B84675DB2A1BC9358D1613EB1DBFE2263:\ 24C4791E394B5A015AF827BB0638ED99C394AE67A913A21A04EDD2DEC49166BE7D\ 15CB82DBC0A64AF31C0EDA89B1E7FCEA26F421931AC663215B71516E406EB2677B\ A4C48C759EC28623833ECE3B2836EBE4FD2405A93695C6C15D8D87ADC8F34162BE\ B0C2030D59417C8B7275076C1DD64B278051A4813DCF815CFF3325D0BC5A:\ 15DFFDB80E7F4698D43771C5F4ADE8C9CD4DFA9832:\ 49276D206A757374206C656164696E67206D79206C696665206F66207175696574\ 206465737065726174696F6E2E:\ 2C6C5DDC20577082E4711D5F1327B0A8EEAA166617:\ 2AB302E2CFF9D76ADF6B8B348621D5E9A3D8D68F982DF65DFC1E84A31C40C1501C\ 367752E42743FD967A 6A4F538DD1BDFB47B448BB75B0B01837973251C2F2CE4D0C9075685333998DA6A2\ 07B9E5F6624B3F80009877842D334A8D23422AF7D74465A98608BF34390B66C1ED\ 36C83D3EB047DEFCBC62679BBE7D966CB9801CEA54BCA7D88D8511CC4B16A2BF4C\ 9724AA861AD69737FC86ACBAD6D7B3CA756C2C3BD07001741071F60C367F:\ 380DC2F4A7A781B34B0182939CCFAA95F837AAE5FD:\ 4EF29DC07DAEB84A86C077853672D2B37BC8B068923861685ABD55A95BAF109443\ EFF1B8B14A3B8713E095DB5CCEB6BB52D90EB136699CD017A98F77DB536410B447\ C70CA8AF4B940D957E68EC0BBE3415C496CB70DD95CBF1F4E63C789EB06DB4548F\ 0B073C95DFFABAE82FDBFDB740D188FC94298857D2EEA9BE482ECF228C51:\ 339533E7F3414DE16F4F01A63E2E8705956A63921433B6D01CBF87D2CB7FE174FE\ AC1C11856344B017BD123642CFC91EF3B7403F79E88F1CA8EE5B4CCE4C6FD18F89\ 03849C722407D7B864AFC6D81D04A40A9578D004D3E9E4A8BC0DAE6D7BA15EA57D\ 60F486AEBC187343F299DB3CCD1602D70291EE1836C08D28723B9F0AF472:\ 13ABB2B93794CB0F4058A4FDB9B266E5AC74681017:\ 44616D6E20697420776F6D616E21204D616B65206D6520612070696521:\ 23AEAF18FB8F0D808218A587F86C16B16AA5DFA48E:\ 07D6C64CF9FF00D7B8D9191C160ABF50D61E3B90281C06D436B4CBDB6CB380E84A\ 0D0AAB183A11E527BD # ElGamal format: p:g:x:y:message:nonce:ciphertext [ElGamal/Raw] C2742F0AB4664BDDE65B66471C32BBD5A383491C1C8FE71A7525B5C301B1CAE7\ A48317D2ABE8C078CEE424899FEC4D876891BCF3E401E4BF339E27C1ACB97E39\ 83ECFB81E1C74093E8206CC794DD180E5B646EB1D195455092859F981FDB3C39\ 47B179FD9DA4C96A1F716570149B0E5E91AFE7168F4B5B92797B1E374AED6097:\ D:3571A939ADCC0E0A61F8FE6720372DA9FB130C33757B101BED87CF677B77F94:\ 380BF24E9D162C61E95E2E84EDC0F9E56EADF564F5BE33D7A46BC4E0BBCF9151\ 5129E2A547583E576154A216AC035C11523111F877A4B56EE4C459ED645C63DC\ 52D4131D865DD4BA8D057F9FC1EB77352A13037CA23BC2BDE49794B3AB5A611F\ D106ADC74D9F48FEC91DB1EC77AE70EC9408EA0E750D1CA4B2E437E4233F3E32:\ 02AD1D776D591520E4D8BEF8B21CC2F54FB4EB788E52ECEBE13564435DA66284\ D51A6A6696E615EF599786CE4CBEFAFF066E0A1CD8868454EB5CE0CA99241B29\ E1D1492CF2712C2C101B3F3779034683AD8271098C2E3FBAA83901A97D9645FA\ 5815AF79F4F638ECBE09020003F434D708914899C668F34830E70F4CAF0803:\ 0A5842A8D0C1B07E5DE6FD3E0C6B1108523D4D35417F:\ 5B99F58B48F3D473327075F2FF4EEA3C8C1FEB0B241F042864610D6FC512A81F\ 431A965724195DB71C3B84B6B9F1DFAE0DAE60E7CDA957703D10FCCDA45CDD0E\ F8C8F76AA4F51F3EDAD8E5085B97D69523A3EAC89D67CDFDDCF0A30491A98BE2\ FD6C5E69C3A2C95300B9DB4EDF2111E7613EF7B2CA430D0CFFBDECF6A7BE592A\ 853B404B6910C48A0204ED3430691E766FBAF21A428B9F833C5932C053C616EE\ B59850150A22331A8FB5AF2065B595E4F08881B1DB7CB85A28A33F4449890739\ 679CCAA431A9205210995BEA68759B475BE4183A975C9D042FBBEDF589AB6AF0\ 17D7523B2CC90CD63526BC584F1E9EF42ABAAA9238987D7F73B94E323C6AADFD FE25EB971E3488A92A4BE75E51050B0824E69B18AC433B5AE7DE98EBCCE8AAA6\ 301237489ABD17A52EA9759AEC87D0E90F7766D64096A49CA99EFBEC82049898\ 06F5C49479FCB6CE8B881BC28F19732F0325786E7DAC54F8C216B6C84562C88F:\ 5:CC4D3B878DB91C340CEBA8495CB5F703ED90AB24BD793E4470125CC:\ 4B722A9E2DC991CEEA1D596586D245EB9B8129515AD66688CEFDBF84FDFF8C19\ 4A2D2BCB2AA82C47CA9FBB3FFB86BFC5CB4676B4DC4A2FF006AC3D578010C9FA\ E140822DBF9DC26CCCE1701B8CF08740ADEBA1CB94056FB33FA2E88DE84CD477:\ 02C1ED6A171875F055809F12BC61829961CC740935C6DCC468FA663E8D1A7DE9\ E0555E3EA99476436743FC5C76D3E041055FAEB7641907F8E2F1F94061B22E72\ B7CD39EDD7A6367828CCDC000301CEA7D91CB1E8A3E20DC85FAA23EF6D08E6:\ F42F854C10C9DD14A6712594A31326A1FD2CF5:\ 9E47FB001BDDB12F2D8E0FA5501A7EAC1B185FDFC7D2FF3E4461B0D75D626F51\ 56DEDD4D25F13C6C1F5F9A1F916058045705F5E82F748E9B6F0DC95D572B8DC2\ 770159092EECA13946F0522FE2A859705009B615818A1B4F98E8DD38CF00DE74\ 6ABD5F3852D93F8D9299DE18EB763F11E41A8B9660C5F056538EED431BB8E219\ 9D9012F50C7FBEF5AAD35ECCD7F141CD9AC6553315A2699D6718F50EBDCEAE62\ A11ACC466E8533EDBAF13C15B5532B323EBF283B108F892DBFCEA21231DFD548 FCA682CE8E12CABA26EFCCF7110E526DB078B05EDECBCD1EB4A208F3AE1617AE\ 01F35B91A47E6DF63413C5E12ED0899BCD132ACD50D99151BDC43EE737592E17:\ DE0B54EFABF297087EE623D5CA5588C64828EF4FDE4FFBAE1ECD2006776B05B1\ 1B81EA3CDE9BC3964C1687C5325BF43D7CCEFA0D0A86BE5DFFDDD0D1143DCD75:\ 841CBF70BC6E95C7E5ABAE60DC6538EE:\ 12C0A0D25B072D8698FD929B8EA219874E4EB6A7FB7D7EB5857A246235D70F6C\ 950118914598E62ACC2EE8E061B560A1FE272B9CA163A7C134E1D6767910ECD:\ 47E586A7E7D98C116A6F553F652E57BF:\ BEF5E7EFAA76C52A8ECEE604EDAFD31B:\ CD70DE085B0C586B4E64097EA3AB4CE0B60A71B0F640FE4468F4F940412EDBD\ D9035EEC602530CFF81B2CDC35805264A866E4689DDBADC3438575B6337118B\ B23A5AB7710F85F2A4E1E0DBEC5652FEF73C868747ECB7043BA08241A0879A2\ DC588D3EC14ED552E62B1B111646FF4DFA9050754240A46A840EA5EB1D97712F2BB FCA682CE8E12CABA26EFCCF7110E526DB078B05EDECBCD1EB4A208F3AE1617AE\ 01F35B91A47E6DF63413C5E12ED0899BCD132ACD50D99151BDC43EE737592E17:\ DE0B54EFABF297087EE623D5CA5588C64828EF4FDE4FFBAE1ECD2006776B05B1\ 1B81EA3CDE9BC3964C1687C5325BF43D7CCEFA0D0A86BE5DFFDDD0D1143DCD75:\ AA3837AF7A7ECF6DB7E0B702A054363C:\ 74349C465B92635C1692BB6F2932E06C1BDF3FC81E78DEBD661BB1DBF1FAC1DC\ C24EA052A119CFD272CCA2BE1E6BDF4579A7D69C739E8A412D4AACDDFE9EDFB5:\ 74BC8D009250F4CD2E08BC556EE01449:\ A2951BE393736E39E9D209FE978C7546:\ 6D6ED1C6E519C628CACC7981A5BBE487F6E013B26448D711911698CEEAA4F746\ 182A716602183A746FC35B022BD7B27EF079F7164309653D148D0CE91907FF6C\ 4A9001A0CCA2A0A163F3F93200C2E40A957919CB84AC35B928E026F1827E6D4A\ 9B986B592BE39861538414D5EA6980248FD3C3C0CDEE372F392D5AC46DB8EEFB FCA682CE8E12CABA26EFCCF7110E526DB078B05EDECBCD1EB4A208F3AE1617AE\ 01F35B91A47E6DF63413C5E12ED0899BCD132ACD50D99151BDC43EE737592E17:\ DE0B54EFABF297087EE623D5CA5588C64828EF4FDE4FFBAE1ECD2006776B05B1\ 1B81EA3CDE9BC3964C1687C5325BF43D7CCEFA0D0A86BE5DFFDDD0D1143DCD75:\ 8FAF3D43EA4C7EEEFB9C08807D90B160:\ F9AD56F050A9FBF969A0A7D2A56BE409BA0EFCF23CCED06980E5A8965EBC6C30\ 08858AA845370F56C1BAB31177C2BB76DBFA9E04FE89DCCEA67BCED6C55ADD8F:\ 01AFE1A93EDB9CD3E3715523C952478D:\ 9500DDCD404618F64A2063BC19941A6E:\ 0636C3F1C63C54CAB4B48B6EF0ECBFF00BA6AB70DF4DB6266D0785351B37279D\ 41D957D16CAB48C64035DCB2A1CD75BAC298C8ECAE8057D87071EADAA5DA6E2B\ 69B5F353B5753F7E24DA81ABAD40059CD73CFA6E78CAB1C7DA418D55E5DBD42F\ A4F2B876A25B4AF63588C80E0DB11E8BAB1531960E951C08C1A68C8FAE0DA87C E9E642599D355F37C97FFD3567120B8E25C9CD43E927B3A9670FBEC5D8901419\ 22D2C3B3AD2480093799869D1E846AAB49FAB0AD26D2CE6A22219D470BCE7D77\ 7D4A21FBE9C270B57F607002F3CEF8393694CF45EE3688C11A8C56AB127A3DAF:\ DEEE9EF5ED1516CE7E695E672B8CEE45E6CD7B36E0E6385F894BA86163F6F3E6\ C6D4E8A81146D4017DEFDD71CBD90FA0247659B88B7CC1C894F48269FD4F1AAC\ 0A30538DFF6B3FC76CFB131C9E7965B58858AB0A43B557335912A8AA547F9568:\ FF4FD921EDD9618570ADA5C59C2A01ABBB9A51:\ BDF5D785E7621256CAEB307A92AED0BCBC34B6ABCC568C200D413585AEF1E686\ 9C60E87001A664A8FF8645C3F79E1667BC2769D82605C3B1AB1A0DC2734AE831\ 32652544275F5C59CCA355BAA02D9DB3796A6B6CCECC14BD85B02A2C18EC7EC8:\ 58E72BD0F04B11:\ EF07721FF6B28A8A3B4EBC95C16B13A83649B7:\ C7B6ACADBBCFD3A34EDA31CE9CA7F7889FBB2DF5C6C25793EB974591BF0EDE93\ 637B6A95E8075BDB2A987039D92487665465C98AAD0C123FA00BB9736170E780\ 69AA32DFBEB07099A0B7D439AA807A2D3D6F9F913EBC673F9F8CD5D3C0E9DD0D\ 988EAC4D8204928C2DA8ECD1FA3A598FCBFFEF5017DB8542D123CF69E8C92EB9\ 56F10DC995AE6B6564967D5C12A07BA35607C54CC3F10A36FF3603DD7CC14906\ 64610002977CE8C4A4EFFBD1421C902D4D8DFF81D014E1AB55F239E0F2FD28AB E9E642599D355F37C97FFD3567120B8E25C9CD43E927B3A9670FBEC5D8901419\ 22D2C3B3AD2480093799869D1E846AAB49FAB0AD26D2CE6A22219D470BCE7D77\ 7D4A21FBE9C270B57F607002F3CEF8393694CF45EE3688C11A8C56AB127A3DAF:\ DEEE9EF5ED1516CE7E695E672B8CEE45E6CD7B36E0E6385F894BA86163F6F3E6\ C6D4E8A81146D4017DEFDD71CBD90FA0247659B88B7CC1C894F48269FD4F1AAC\ 0A30538DFF6B3FC76CFB131C9E7965B58858AB0A43B557335912A8AA547F9568:\ B3BF90978FB3EF96E40F2AE8260F42B908EE1E:\ 578C33240691D5351BCDF2C727BEDF8C4B956EB32520ED93DB034D00EF69C44E\ 523639DCE55E09631D8EB6C6D6760CE10C510AA68847B7CEED43A3749F653B5B\ 2BAE4B07F95F85DA8F058F8DA2A0D07A2F0C5B009E63C06B638FA1B43CE7F7A9:\ C37AA41207A357DBCCFBE93DC45C5BD91D29FD29CBA29B26AC437A9B560C3BEA:\ A36338E4D7815E6A4B178E951BEF073C6D5A7F:\ D824C94623313298600CC20203F8A40006CAFCFC8F883C99AC09DBAE4B95E6DB\ 9FB5737E24D9D7E39B603893076BC81A2BC0C0D608B32B353972B57066535DAA\ C49E3F7F2A0E243618EEE01C5AB3AFAE1D55E3A1DB33CF713E5187AD51D55144\ B1A108354ECA651E55F85F253FE73C1C15FA5EDDDA47467BD0425F09E3C41565\ 48E71896659C618B84FD72BA176E2DEEECD8B15F2C05F870697EA464B8827374\ 2BD6ECBA5164424F34EBB9E13E31683A16712901818C7E5F502720FBCB075EA1 E9E642599D355F37C97FFD3567120B8E25C9CD43E927B3A9670FBEC5D8901419\ 22D2C3B3AD2480093799869D1E846AAB49FAB0AD26D2CE6A22219D470BCE7D77\ 7D4A21FBE9C270B57F607002F3CEF8393694CF45EE3688C11A8C56AB127A3DAF:\ DEEE9EF5ED1516CE7E695E672B8CEE45E6CD7B36E0E6385F894BA86163F6F3E6\ C6D4E8A81146D4017DEFDD71CBD90FA0247659B88B7CC1C894F48269FD4F1AAC\ 0A30538DFF6B3FC76CFB131C9E7965B58858AB0A43B557335912A8AA547F9568:\ EE639A2B80F4FBBB96B82A0DA6ACF23124A1A1:\ 5D13E05491C00E0FAE1245BFE0E374F2753CBF1926352FB4180F11D740A2F6BC\ 8486C0E0F52D2990773ACFE01CD4AE6F428D55092FF33144C2D9F37692BC1230\ 89D9E77ED393C495ACBEAE7A9E927F4AF1D0E845D2EE93E733BCD0D50268A47:\ 36FDC0501B44AF:\ 832BC01DB63F958D47B6962AEAA74C0831A6AB:\ 62E46CDF100BADF4419215256BEC8427DD0388D1B60B5A8675532C0934351BA0\ 036AF58032AB6C4DB829F1A0C8217FBF2CB9C10A5C60FF285919BCAF238E89FB\ AA4771CAD13D4A69AB2C1FFF0A44D2F9287F1E70D58210AE859074B3969EE800\ A9D1507BA48582BD1E03CC234B0CB11408BE0932763EDC99CA4BEC6E496A4522\ 37F920972C629714EA2F1FF212460C23B66DB56BC73E94743D32D2CD3536A17A\ 136F56D7F7C24E3B8F102F48BBB21633279D3E584E71DC37B436104CA69A6BB3 FD7F53811D75122952DF4A9C2EECE4E7F611B7523CEF4400C31E3F80B6512669\ 455D402251FB593D8D58FABFC5F5BA30F6CB9B556CD7813B801D346FF26660B7\ 6B9950A5A49F9FE8047B1022C24FBBA9D7FEB7C61BF83B57E7C6A8A6150F04FB\ 83F6D3C51EC3023554135A169132F675F3AE2B61D72AEFF22203199DD14801C7:\ 469603512E30278CD3947595DB22EEC9826A6322ADC97344F41D740C325724C8\ F9EFBAA7D4D803FF8C609DCD100EBC5BDFCFAD7C6A425FAEA786EA2050EBE983\ 51EA1FDA1FDF24D6947AA6B9AA23766953802F4D7D4A8ECBA06D19768A2491FF\ B16D0EF9C43A99B5F71672FF6F0A24B444D0736D04D38A1A1322DAF6CDD88C9D:\ A0A2CF6E5C2C3157078FE232D88778DD7A864507FEF:\ 23020176F56436414B28AA4246433075433AC50C81C803275AB4BFB132D8A42A\ 27B69E40D9A219F36546801348E0191E7CEA23AA70B7EDBD52A44D0FA48946F9\ 0211186E58DAD6C7D2E9207379F31FEF083224FDE665576AC0A1EF193CE23FE0\ 8DB42715CE27A6E00DE4F373F92A221759C1E318161302ADC3CE9F1229290D46:\ DF72B687F62AFEA3A51195EE876E4C87708F7ABB8D2D5DD72B68256DAC6D:\ 0B333C9C486C5F3A96F37D00133ADD18113376C9BE76:\ 4156CF437A39C415B212AAA34C9AACAFA3F3113F53BB75E0BD3D759089E21754\ EF89B4BA1A8B37E5EDA13F8A2F87D16F03F3B6FE19A5CF799B17D83F7B5E9A22\ 5F324AAD7D46E80A1DAFCA337A3F500930A7831D1F3785763EB9A6994063CED0\ 33177E1CA2770B751B3053C1445ADFEAED790E49E4685A05B9563D1EF32BD321\ 971D541B525D648EA7C8741D8FA7E46293D46A0F4345BE73EA4FAF1E4C16BCBE\ 11C53BA0FCBA2975BD37F11FE5ADA8731CAED3C403EA6E43AE47ADAA7E284334\ 04AD3ADE6AA8E12BFC374BADAAFB167F3AAF91DC6F8398003E5F8528E8D4773F\ 800D48C8EDDAEDD72A3870E97679F946CE27FB692BC11677757A28F3899A3DA8 FD7F53811D75122952DF4A9C2EECE4E7F611B7523CEF4400C31E3F80B6512669\ 455D402251FB593D8D58FABFC5F5BA30F6CB9B556CD7813B801D346FF26660B7\ 6B9950A5A49F9FE8047B1022C24FBBA9D7FEB7C61BF83B57E7C6A8A6150F04FB\ 83F6D3C51EC3023554135A169132F675F3AE2B61D72AEFF22203199DD14801C7:\ 469603512E30278CD3947595DB22EEC9826A6322ADC97344F41D740C325724C8\ F9EFBAA7D4D803FF8C609DCD100EBC5BDFCFAD7C6A425FAEA786EA2050EBE983\ 51EA1FDA1FDF24D6947AA6B9AA23766953802F4D7D4A8ECBA06D19768A2491FF\ B16D0EF9C43A99B5F71672FF6F0A24B444D0736D04D38A1A1322DAF6CDD88C9D:\ B81133CD81461728FBE2D40682850CBC1176BBF24D9:\ 650BDDC18070CC54F0DC4DFBBF4B3144749D7D219E4122E27092FB005F82612D\ 39B652486DFF5B628FBE626B54D70FC5F3C11E5E4C7CCB5CBC78E528AC70E740\ 302FA043581A55A93EBB7143E807C056748702353A65715E39A86F3F1F90FD00\ FBBB817D7C48A465A1DBC8DE5D8CDCE259D129D02EB673A4181B9CC88B7636A6:\ F73BB7E5C8A5619380:\ 0AD9527B09EAD1E59B4A1CAF58C861B69A856AB8AA80:\ C9881464A37749949D66D75CD9B7A8ACAD33DD1FAC7561F684E9CB5343D2ED15\ 969D7EDB4135518B50F0FEC9A9559C1D5E44DAB42C14BBDE2D2711EA4D02D7F2\ 7D1A9BCFEC9E8B73FA64BA3C54707FDDE7D5BE695E17FB9D259FB576FD4E57D6\ 6C8F727DC236E2A6E9FD01709D34B8D09F7DD3890F003EBE616042B4E0A8A00F\ 6C3F34DE7E002FE72A84AF8D014D64E8CD08B9B56CC3A6BBE6F966B92105A92C\ 5ABF4F2BF735670622F6213FE9739FAD65692E1C0EBF708A47E18600A22972A5\ A3DA0F22D11C581D46F734151A083FF757E961351EB183B467A859FBB9ED1DAC\ 396FA405701FD6E3A62EB126E93648C3C6DFA9C4DBF3C005880F4799F66B310E # DH format: p:g:privkey:pubkey:finalkey:keylen # where privkey is our private key, pubkey is the other users public key, and # keylen is the output size we want (often this is ignored; if it's not there, # keylen=0 is assumed) # Raw: Use the straight output of DH as the key (bad idea in practice) [DH/Raw] 813E0E814BEE676DBD3D9D28ED73D36735D21FF6457236F68D3D6145560C0FAB:02:\ 66277A816EEEF66675319C2AEBF2E8D6154EE359370E8E1B194AAA1B9A20FABC:\ 3B4C5FEFBA6AC0A402C6AE132540B7312C93DCB3259530F3A45F7A2C408C920D:\ 5D9A64F9E54B011381308CF462C207CB0DB7630EAB026E06E5B893041207DBD8 8732EC631F04F7AE57F66AD4A481AB4462AE26400348AC764D679311C41C5EF6\ 5BF618A6E0742A27D59A18868FC7A131DFF158C83ADA310EFA493CB86CC2966B:02:\ 0AAA1D96792CE097CD533208550433ECDAECF557F1DB669A5A0ADE4284B5272C\ 12D46FEA0E9A549B28130CBBB76C36C9122BBD0AA3D3D1C055731DA91F28A99E:\ 675F1A653994E03B986BA4FA13A2B51C4493B310EBFA5EDE77D493CD243FEDCF\ FFBE9731D3E50A4586EB405FBAFE446E71EB7DF638C1ED43EE3DE69A7363BB61:\ 65F79BCC47862E02DDE775B8FC7B1D0CBA094B753E502D49A446868768\ 1F178CEE98016210E136E80255FC8FDECC4D38D91EBC82C94B17652BDC7569AC383F39 FAD40DCD165ACBDA7D4BB0FA4830F5B27A27D9A01A66A60BB177CC31CED51DBE\ 9B269227BED5BCDD18E217A98D9BE4E55D0498717AB21A4BC1A32BD32D7BB6B3:02:\ 8A2264FE1D57CE13B9D16448C25626CB4A5E254A9A158DEC352C2CF36864F986\ 2021AFAAFDB8F5FBB51282A19A2251C91AF08173E71EED2B2BA7BD3378F3355F:\ 2B86E1EBADFBB7F10C9807602F90EB2BBFE9D77FDFA743777B8CC212892E54DB\ D01CA7F4023EEF2A56BA9277778A80BC27EC86298E22030469A0EF3D49B57C3E:\ 290BF0265BAAD40A5853BAF3CC18B315982FF282C82D7332DA6A8826E789330D\ 875F29F57D9A622DB7DDF156CF4440EDB8455BC32859FA2A178D42528FA64136 95A2F3D72B3D394EFDE4C055EF6C6E4E7A598242D0F2D2F9F31A2BB5191D7CB4\ 7FDFBDE16BC277BEEBBE02079632F2374CFCF4F9719C154DF8A9BAE52A8D7127:05:\ 2B600D6C9CF358D21D41E0DEE2B3C81520FC617420F63B2ADD9E64D2B13954B1\ AB117B40B6A1EDA56237DA1ED34DF9643FA471C2B4AFB5A00455DE9A0FBAF399:\ 6A097559AEA851EB6DB23A0D45A5060F32F50961BBBEF3D22A01B4EC229E651C\ 932958088814DFF54E9647FAAABEB555EA966542C24F28980B2A47A902798B55:\ 4ED3B2ED6B3E8446D8E1C3D2BCA00FB939464874BB6750BDE5F5DACFE9F81959\ 7E96F6B1DBA27C785553383AE87188019734A160B6BA5396760B88EC1F2A0E92 86B7815320710E1415DC26FC566F64866BD5AE7FD8DA39F42CFD3533C80B4E37\ 402557B45D027EBDB8BBBFE66769942408E2FB00A9433597BB20B9312A9F84A7\ F767F7A5851A35F1A4C2A89AD1DC977F45689183C9836C96AA5DA075CFF03419\ B45B885D83DCC4C0E3FEE66E76212CCCA1382FE314E4846EA0BEB29772FA625B:02:\ 21716E2202D31407E8471E0575465FAC1D309A30C90C9FA498F1718BA4047E7A\ 831E85E0E358C847CA4DC9DE47F007279D4BB22107889E5B7BE0D02F8519D585\ 2A1DCFD54F0AED08906797D9382BBD6F7B4712850F8981E855D6A6769807722B\ 7D93FEF6B822533C2A51CEF857AB9359A36AE6A3B7035AB6C0B7B4660953DAB9:\ 07BC618157B3FD72B2D80494B73AA7A5E5F40BF4A5537E4FD878D3CB6C9B0D70\ D6A3CB3B35BE49259E7BFCFCBE9FE133B0133924A8CAFB4317005165416F7343\ 42F1593C71854B696ABFEA7E3AABBE99F1ABC745AF0E56AF283DEB81CDD91F26\ B1FAF1EDE40D97B1E3370339841AA28A99A638DCA7958631BD6ED0BE6A470525:\ 2B6D9504C1D7ACAD9652CF79A6A0630EA9D19C197E908E992BC318BE2867FAE3\ C1AD5BE83E6E4AA1CBE0347774038F20ACD790DEA82B2A5862BF21FA4A1AB464\ AE985CA8AC4E5076AD0843E144C1305759BA047446A3A7F2426BE0C724F26900\ 9B54447B6A970876E5E4C613356805014D6060039C081AFB046863CA9BE9C848 # The primes and generators in the next three are from RFC 2412: "The OAKLEY # Key Determination Protocol" FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ 020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ 4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:02:\ 70F70628FC92FFAB93039B31EFC65E760121EA6632F9D37189767CE01D4A7C5F\ 782022DB71857281E270A7AAAD68467C2825635FC198208F749A5BF25C444D12\ 74F6F760E068FE11A7B7FAADC154EBE77DFBD2F9A399BF1710C75291E6B33E53:\ 35F4FE8E20A94672FECC2F8C24597541E7A1EDBF76C0D0A92FDC6E99CA016F4A\ 3F315E42A5CFAF0A50541E420F2ABB632A2609336077CB8E0320CAAD94796478\ 8B26954B847E08B1AE08FC3D2D0F9DCD449A890B2E4448E4B2D106DFA887FB61:\ 1835BAAC22790A32874BAD6465BBFA22BEA8A8FFF9847814273311E715FFED51\ 5AFEFAFBDB88F5F6059A874B8ECA325553D2399B36BDAF703E23D9BA426B440A\ B9B3232319E82F60651B5D9610FF5F62D9676AB0CC691DAD9373E14407515B06 FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ 020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ 4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\ EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF:02:\ A71FB45046F3E7058521C35F08200AF51A0193D68776BABC6F5571BCF092A77D\ D44E7B4E5AA450A7C4FD142DF648C03BA1C6944941B3A5C2F2515177B23CFC01\ 09825B85029798C6D3EF8C46D9C85A71558AF8CAA411B270EA3FDDD7D3586784\ DF92CCFAD908096A0FB647B18A62D7E4AEDAA26D9F4E1247BB208232FA9EFB9C:\ 51F0590A0593A41182A1E132E68E33D28F67CE0BF42C6BEFF057EB10255BB78D\ 0BA2517603700FFBEE570EA1591F56468EA7AEAFBE03B10D3B7A04271B94F819\ 0031DADD2D852F8778D9A88486C89EF3C5FF4F478D4E21660A0B1542FB58FE82\ FF89FD8E10334A455C937EA11FBE28A8188C1DA05B014FAC2A28A273AA517082:\ 78E5A35AEBE11E2A6EE2AC7CF250BB6D14D4194E4B4F863388B403A6D4F77179\ 2399B005B60876A2B54F38B10E80D7FABD5CA0260DA7F49D3C8BC319EAB0DCE9\ 8DB256D55A3D286FB4A92D426908121A48FBE08BCAFBB2CCBD79CF2422ADC0BF\ 7FD6D32BBD7179CC92C5B6F3A0A66F75521119B054C9C890A5508FB82DFCF947 FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ 020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ 4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\ EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05\ 98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB\ 9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF:02:\ 4E83BC69DEB2E98884E5BEACD0331AD07869BC0CB3025B4882670A9AF4FF1F62\ 8FE59526733B16B43D90D976EF55BE00A95C7846F447374451565D6470373096\ C93448F390EBE47E63F22F1840AD1E006F09A85B75EB69DCA9D3D823F9D3F32D\ 81A03DB69CE3A9D35B7999B3F1F692F795805411762570D247B55F02EB64A3C9\ CDE4EDF05BB008BE68863FA5A01E7BAC582B189A6C5D845E1216C91F2152B708\ DAB6F985EF5E220C86D2B5CD50739F6A8F6E86527072777EB3940E8F12FDB8FF:\ 3F11982BD3DFBFFCDB49F3B4E401A004C42DB40DB314990413064C5B63D6E0D1\ E1A5178FAB51AF92AE6B7184DDD06F76B6EF9366247A8CD5ABBE13C61468BFCD\ BA7CD147EA543D567433E691EFBE80DDBBED90CD2F606EE4C36E568AA00EFDC7\ 8CC2D6F8F98C09E781B120421BF98A8EEB2A1064D93085105307A46CAC09B27B\ 4D1FDD6E3000574FA348D2632865D7958BF64A3A858A8605370F73DD82A1D79F\ 66071E312328BFB4D965BC51044DB4F981C00E23128AA00ABC3F908A2690E0:\ 142195F7212A66E8E79E6CBCBB092107C38051B998A46110A759B2DD35DB9371\ 68AB11CE2AF35F8C9263C585FAE7FFF37B9080F65B6AF33A983D8177455F9D90\ 5ACADB57DBFF67A27D4947C999A2B5CAD13BEDAF05BB2A197654740F54C932D8\ 4580F6B954F57C0A42317CC77036346CB8FB3BB07A72497C74BE7A454AA98BCD\ 458F85B323119565C650AE6F884BAD489BFE34B4A7116412E5FA6920355DCA65\ 24110068A5BFA93E1CACB6A9A3B4FF47A760107AE212279D86C1A333AAC0E7BE [DH/KDF2(SHA-1)] B842DBEC0BBC87979604EA9E14FEA8FB0DCB4BB09653621A7363A54A9DE9332B\ 1D878344D9D98BB06FD14C79315C7B097A7CEAAF4B0F66A422ADDFFF200CA78B:3:\ 7036B197651B364DFF16DCABAE5C6D:\ 9AA69B0066B495822A5586AF3FC19933E5EBF46B715B90DFBBD5393F58926AB3\ 8D02834A54E06798315558C7E274A193D5D9360AC855DA792BFCFE7FC635E213:\ EDE06CF771:05 C5344A976F327A107D669D4835946362AC3CC1B1198770826CE684958E70B288\ E5FD065BD2368CB172391B8D046DB93FB1C3ACC0103435EBE8A75C706F63B8E3:3:\ EFF15251EAB928852C16CA1517E1DC:\ 4772265D1FDB3FC3F2FFB5DFE863FE8D93E871D5B20D697A49BE130DB9B0561E\ B118B8E8513CC9A6C07CA9647363CEDBF5C0AFDEF41AF7D6BC0F0E6BFAD50672:\ 02F0A9B8677D7874494627C1AE8B1507:16 B9E01426AE646FF40980427636195AAA04DB2D9FC12ECDB4398812D1AE99B885\ 0396A2D6B0CFCFED532DA21A6DC58A491B75833985AF38D97727F44EFC8B2DB7:2:\ E0E9E13CEE9C43CAE541A8ECD0FDAE:\ 9E549B7F385537D7CE2E0F332D6F98E5865DCA0E6C633B110CFAAB832B4EF75A\ 62617B58C33F9F4D0D957FB0218CB9363C2C6CC4C8DFCD9FDC35D401A69382E1:\ 6F6B153DC35648A59C2A43398318F90CC1015C:19 6591F4A4899EE64DCADDE9E5ABF3A9BC409857F4F7372435F4A45C27E5B0C2CE\ 3E6E35D9FE555B49B80BC978D1B4E7EAFAF7C93A08FB3D9A48C59C9BC596C720B:3:\ BAF42B613C37B6FB6409D33D9B89DB:\ C275194FE458D0ED562103E3FE7765AF9639B1C826BD329A60028013B8EE48245\ 487A91EE6B221D29DD30D17FF0C35B55C3CA435BE482EED716A60D266D350A7:\ 5A70601B0668BA303F8FBFC90FBA82B9D589BD586C576B414A6AF17F9B386C7020:33 # DLIES format is p:g:priv1:priv2:message:ciphertext # p and g are DH parameters # priv1 is the private key of the party encrypting the message # priv2 is the private key of the party decrypting the message # The underlying SVDP is Diffie-Hellman [DLIES/KDF2(SHA-1)/HMAC(SHA-1)/16] FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ 020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ 4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\ EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF:2:\ A6963780ACB9D2C5C410D502AE60F027A807AB5BBE5:\ 88EF9E0354C67E9EB781A8BE95DD281A215CA1DCFD3:\ AB5BBE0D:\ 538F9C9CAC3EEB460B6D40B4AC331EBD3E2F3065E515177F47A083D1AC71533B\ F3B2931F52D71A99CA0804A633E1948F3B286453EA6CF0DD83C6DD1D2BD93B20\ F4942D9679CFDE5856DD81E152E1E5ADD023324B945CE68425B025AE5D0CF86C\ 0D33244A60AF6045BD57018FFE5F84A9BF82193242FF32A64691586AAA298FE5\ 31CF06A56412DFEC3AD1F50FF8CD296310E5BB4D06E15AB0 FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ 020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ 4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\ EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF:2:\ C2D89AA7566998A9E90E22F9244C84F68B55473594C:\ AF719F4ACF99CD35BB3B71F0DCBF27F6A4268D91264:\ C43BB390:\ C04F6BD6D1BFBDE74E775FB391A29B2D6FB7EE84C13D2061291DBA8708E406B0\ A6788F69F7DFEBE4CA35B31917EACD7D36CDBEBDCC51567ADF3F287F57592A0F\ 73E1C990B807E0A67ACAE3F07361DF123C59E0A95CFCA9DEB3C7CCDC47C925F9\ 75AF0948B3DE9EC1E34EED30391FD4080D77DD07F091E3D5D89BC158A96485B2\ 8477AA95D62EFB9FA1D2B44A38A698F81C9518355BAE8B74 FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ 020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ 4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:2:\ B8BBACE15066DF21FC2ADF8F2FB47776D98716F5:\ EB2EDB317A29CE6BD580D1BBDBDA5585450D9B7B:\ 3B06E0705DC9DBA971AA624393984D5B:\ 2AB9B180CEF08E761EDB4D7B7C538FBA0FD37BACE9416789A0DD6551F2DDC602\ 5C76A663F1AAD5000EC03418A6220ABA6D3DC5EA82D7340E2FFCB5665AD3A222\ 3CDFF9C39889CBE31E44CD31BCFDCEFCF2A9916FD39E2720A7B826F7E6998F73\ 4F251C71DC970AF3FB12949C14AA759966733BFC976CAD0BE71FC5DBE285200E\ 75647C62 FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ 020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ 4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:2:\ B2A1040661E071F702CB2190ACAF3CC532FE1DC2:\ 8A9B563FD9A12356EC7851943CF453AF7236A596:\ DD92A05E19BBAD4A33CEFFA0FA2727E9:\ 3F0300C53C0BB02A3EF2EFCC751EE5D98AE991730C1C2FE39D11A74D32D892AD\ 63A9EECA09BBBE606FB426E03BBD480FD224E09712BB85FE649D543CBC23113A\ 39F9102C65D31DF330ADF233735C1D60D1BCDE22744392D2D9DE50393984F276\ A33DD85F763ED1226B88DF1662554AD27820F66A995FE1481189A2B8C3071D0C\ 32EE9960 FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ 020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ 4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:2:\ C56BAF8FAC2AB023B2995F5958D5E929C7501555:\ 9F48260F8B6FF09E0F71B97EFA50E2469F316C3D:\ 174E756AF8FFB51990BF3C69688D3A7F0B388F2BCE62A095BC12CD6DA2C2AD65:\ B99BBBC64F6320060200E6FFE7D1FE6E5EEA79DF142111AF88D377037BD91863\ 41B7A7A27F2AE8BB77282B8EA13D821DD77186412CA3B9B5E1650A0D20687B1C\ 8D556FD7D547D475F71BBD7D6417311F535A9A6D95CEA8AFD1146B1A1741828E\ 8AD46B058507A67111CB62132350EEAC1212D90535677855E17B1DA9DC4CE790\ C4B917B1359123226FE62DCCE5475721F09CEA23 FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74\ 020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437\ 4FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF:2:\ F54BB009FFFFD728677F76CFF2B1BDF05F24226C:\ F6F5DFFCEA9F09A784C15BEACBDE88C0F58D19F7:\ 75DAD921764736E389C4224DAF7B278EC291E682044742E2E9C7A025B54DD62F:\ C591E27A2C12742A959652F5F341F558CA0C7DAF2E6B5ACE32DCAAF459553BA2\ 3EF0235EAFD86A7F2D70587239D858484E5CD36122C2B9F6E410C7A9C307B2A2\ A084BB1B634A15AC9F09E38EAF421D14C5A07B6EB5EDE6915E8DE9D3D9D01DBD\ 8822FBD79BA7FF3DF921B5451BBD9A12AB41FD4DAB829599BC2736B23753063C\ 0C5FFCBA7DB06DE26D3C441D126FC1A46531F593 Botan-1.10.12/checks/timer.cpp0000664000175000017500000000240312654331322015647 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include "timer.h" #include #include Timer::Timer(const std::string& n, u32bit e_mul) : name(n), event_mult(e_mul) { time_used = 0; timer_start = 0; event_count = 0; } void Timer::start() { stop(); timer_start = get_clock(); } void Timer::stop() { if(timer_start) { u64bit now = get_clock(); if(now > timer_start) time_used += (now - timer_start); timer_start = 0; ++event_count; } } u64bit Timer::get_clock() { return Botan::get_nanoseconds_clock(); } std::ostream& operator<<(std::ostream& out, Timer& timer) { //out << timer.value() << " "; double events_per_second_fl = static_cast(timer.events() / timer.seconds()); u64bit events_per_second = static_cast(events_per_second_fl); out << events_per_second << " " << timer.get_name() << " per second; "; std::string op_or_ops = (timer.events() == 1) ? "op" : "ops"; out << std::setprecision(2) << std::fixed << timer.ms_per_event() << " ms/op" << " (" << timer.events() << " " << op_or_ops << " in " << timer.milliseconds() << " ms)"; return out; } Botan-1.10.12/checks/timer.h0000664000175000017500000000217712654331322015324 0ustar jackjack00000000000000 #ifndef BOTAN_BENCHMARK_TIMER_H__ #define BOTAN_BENCHMARK_TIMER_H__ #include #include #include using Botan::u64bit; using Botan::u32bit; class Timer { public: static u64bit get_clock(); Timer(const std::string& name, u32bit event_mult = 1); void start(); void stop(); u64bit value() { stop(); return time_used; } double seconds() { return milliseconds() / 1000.0; } double milliseconds() { return value() / 1000000.0; } double ms_per_event() { return milliseconds() / events(); } double seconds_per_event() { return seconds() / events(); } u64bit events() const { return event_count * event_mult; } std::string get_name() const { return name; } private: std::string name; u64bit time_used, timer_start; u64bit event_count, event_mult; }; inline bool operator<(const Timer& x, const Timer& y) { return (x.get_name() < y.get_name()); } inline bool operator==(const Timer& x, const Timer& y) { return (x.get_name() == y.get_name()); } std::ostream& operator<<(std::ostream&, Timer&); #endif Botan-1.10.12/checks/validate.cpp0000664000175000017500000003530112654331322016323 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ /* Validation routines */ #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_PASSHASH9) #include #endif #if defined(BOTAN_HAS_BCRYPT) #include #endif #if defined(BOTAN_HAS_CRYPTO_BOX) #include #endif #if defined(BOTAN_HAS_RFC3394_KEYWRAP) #include #endif using namespace Botan; #include "validate.h" #include "common.h" #define EXTRA_TESTS 0 #define DEBUG 0 namespace { u32bit random_word(Botan::RandomNumberGenerator& rng, u32bit max) { #if DEBUG /* deterministic version for tracking down buffering bugs */ static bool first = true; if(first) { srand(5); first = false; } u32bit r = 0; for(u32bit j = 0; j != 4; j++) r = (r << 8) | std::rand(); return ((r % max) + 1); // return between 1 and max inclusive #else /* normal version */ u32bit r = 0; for(u32bit j = 0; j != 4; j++) r = (r << 8) | rng.next_byte(); return ((r % max) + 1); // return between 1 and max inclusive #endif } bool test_cryptobox(RandomNumberGenerator& rng) { #if defined(BOTAN_HAS_CRYPTO_BOX) std::cout << "Testing CryptoBox: " << std::flush; const byte msg[] = { 0xAA, 0xBB, 0xCC }; std::string ciphertext = CryptoBox::encrypt(msg, sizeof(msg), "secret password", rng); std::cout << "." << std::flush; try { std::string plaintext = CryptoBox::decrypt(ciphertext, "secret password"); std::cout << "." << std::flush; if(plaintext.size() != sizeof(msg) || !same_mem(reinterpret_cast(&plaintext[0]), msg, sizeof(msg))) return false; std::cout << std::endl; } catch(std::exception& e) { std::cout << "Error during Cryptobox test " << e.what() << "\n"; return false; } #endif return true; } bool keywrap_test(const char* key_str, const char* expected_str, const char* kek_str) { std::cout << '.' << std::flush; bool ok = true; #if defined(BOTAN_HAS_RFC3394_KEYWRAP) try { SymmetricKey key(key_str); SymmetricKey expected(expected_str); SymmetricKey kek(kek_str); Algorithm_Factory& af = global_state().algorithm_factory(); SecureVector enc = rfc3394_keywrap(key.bits_of(), kek, af); if(enc != expected.bits_of()) { std::cout << "NIST key wrap encryption failure: " << hex_encode(enc) << " != " << hex_encode(expected.bits_of()) << "\n"; ok = false; } SecureVector dec = rfc3394_keyunwrap(expected.bits_of(), kek, af); if(dec != key.bits_of()) { std::cout << "NIST key wrap decryption failure: " << hex_encode(dec) << " != " << hex_encode(key.bits_of()) << "\n"; ok = false; } } catch(std::exception& e) { std::cout << e.what() << "\n"; } #endif return ok; } bool test_keywrap() { std::cout << "Testing NIST keywrap: " << std::flush; bool ok = true; ok &= keywrap_test("00112233445566778899AABBCCDDEEFF", "1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5", "000102030405060708090A0B0C0D0E0F"); ok &= keywrap_test("00112233445566778899AABBCCDDEEFF", "96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D", "000102030405060708090A0B0C0D0E0F1011121314151617"); ok &= keywrap_test("00112233445566778899AABBCCDDEEFF", "64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"); ok &= keywrap_test("00112233445566778899AABBCCDDEEFF0001020304050607", "031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2", "000102030405060708090A0B0C0D0E0F1011121314151617"); ok &= keywrap_test("00112233445566778899AABBCCDDEEFF0001020304050607", "A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"); ok &= keywrap_test("00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F", "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"); std::cout << "\n"; return ok; } bool test_bcrypt(RandomNumberGenerator& rng) { #if defined(BOTAN_HAS_BCRYPT) std::cout << "Testing Bcrypt: " << std::flush; bool ok = true; // Generated by jBCrypt 0.3 if(!check_bcrypt("abc", "$2a$05$DfPyLs.G6.To9fXEFgUL1O6HpYw3jIXgPcl/L3Qt3jESuWmhxtmpS")) { std::cout << "Fixed bcrypt test failed\n"; ok = false; } std::cout << "." << std::flush; // http://www.openwall.com/lists/john-dev/2011/06/19/2 if(!check_bcrypt("\xA3", "$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq")) { std::cout << "Fixed bcrypt test 2 failed\n"; ok = false; } std::cout << "." << std::flush; for(u16bit level = 1; level != 5; ++level) { const std::string input = "some test passphrase 123"; const std::string gen_hash = generate_bcrypt(input, rng, level); if(!check_bcrypt(input, gen_hash)) { std::cout << "Gen and check for bcrypt failed: " << gen_hash << " not valid\n"; ok = false; } std::cout << "." << std::flush; } std::cout << std::endl; return ok; #endif } bool test_passhash(RandomNumberGenerator& rng) { #if defined(BOTAN_HAS_PASSHASH9) std::cout << "Testing Password Hashing: " << std::flush; const std::string input = "secret"; const std::string fixed_hash = "$9$AAAKhiHXTIUhNhbegwBXJvk03XXJdzFMy+i3GFMIBYKtthTTmXZA"; std::cout << "." << std::flush; if(!check_passhash9(input, fixed_hash)) return false; std::cout << "." << std::flush; for(byte alg_id = 0; alg_id <= 2; ++alg_id) { std::string gen_hash = generate_passhash9(input, rng, 2, alg_id); if(!check_passhash9(input, gen_hash)) return false; std::cout << "." << std::flush; } std::cout << std::endl; #endif return true; } } bool failed_test(const std::string&, std::vector, bool, bool, std::string&, Botan::RandomNumberGenerator& rng); std::vector parse(const std::string&); void strip(std::string&); u32bit do_validation_tests(const std::string& filename, RandomNumberGenerator& rng, bool should_pass) { std::ifstream test_data(filename.c_str()); bool first_mark = true; if(!test_data) throw Botan::Stream_IO_Error("Couldn't open test file " + filename); u32bit errors = 0, alg_count = 0; std::string algorithm; std::string section; std::string last_missing; bool is_extension = false; u32bit counter = 0; while(!test_data.eof()) { if(test_data.bad() || test_data.fail()) throw Botan::Stream_IO_Error("File I/O error reading from " + filename); std::string line; std::getline(test_data, line); const std::string MARK = "# MARKER: "; if(line.find(MARK) != std::string::npos) { if(first_mark) first_mark = false; else if(should_pass) std::cout << std::endl; counter = 0; section = line; section.replace(section.find(MARK), MARK.size(), ""); if(should_pass) std::cout << "Testing " << section << ": "; } strip(line); if(line.size() == 0) continue; // Do line continuation while(line[line.size()-1] == '\\' && !test_data.eof()) { line.replace(line.size()-1, 1, ""); std::string nextline; std::getline(test_data, nextline); strip(nextline); if(nextline.size() == 0) continue; line += nextline; } if(line[0] == '[' && line[line.size() - 1] == ']') { const std::string ext_mark = " "; algorithm = line.substr(1, line.size() - 2); is_extension = false; if(algorithm.find(ext_mark) != std::string::npos) { is_extension = true; algorithm.replace(algorithm.find(ext_mark), ext_mark.length(), ""); } #if DEBUG if(should_pass) std::cout << "Testing " << algorithm << "..." << std::endl; else std::cout << "Testing (expecting failure) " << algorithm << "..." << std::endl; #endif alg_count = 0; continue; } std::vector substr = parse(line); alg_count++; if(should_pass && (counter % 100 == 0 || (counter < 100 && counter % 10 == 0))) { std::cout << '.'; std::cout.flush(); } counter++; bool failed = true; // until proven otherwise try { failed = failed_test(algorithm, substr, is_extension, should_pass, last_missing, rng); } catch(std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } if(failed && should_pass) { std::cout << "ERROR: \"" << algorithm << "\" failed test #" << alg_count << std::endl; errors++; } if(!failed && !should_pass) { std::cout << "ERROR: \"" << algorithm << "\" passed test #" << alg_count << " (unexpected pass)" << std::endl; errors++; } } if(should_pass) std::cout << std::endl; if(should_pass && !test_passhash(rng)) { std::cout << "Passhash9 tests failed" << std::endl; errors++; } if(should_pass && !test_bcrypt(rng)) { std::cout << "BCrypt tests failed" << std::endl; errors++; } if(should_pass && !test_keywrap()) { std::cout << "NIST keywrap tests failed" << std::endl; errors++; } if(should_pass && !test_cryptobox(rng)) { std::cout << "Cryptobox tests failed" << std::endl; errors++; } return errors; } bool failed_test(const std::string& algo, std::vector params, bool is_extension, bool exp_pass, std::string& last_missing, Botan::RandomNumberGenerator& rng) { #if !EXTRA_TESTS if(!exp_pass) return true; #endif std::map vars; vars["input"] = params[0]; vars["output"] = params[1]; if(params.size() > 2) vars["key"] = params[2]; if(params.size() > 3) vars["iv"] = params[3]; std::map results = algorithm_kat(algo, vars, global_state().algorithm_factory()); if(results.size()) { for(std::map::const_iterator i = results.begin(); i != results.end(); ++i) { if(i->second == false) { std::cout << algo << " test with provider " << i->first << " failed\n"; return true; } } return false; // OK } const std::string in = params[0]; const std::string expected = params[1]; params.erase(params.begin()); params.erase(params.begin()); if(in.size() % 2 == 1) { std::cout << "Can't have an odd sized hex string!" << std::endl; return true; } Botan::Pipe pipe; try { Botan::Filter* test = lookup(algo, params); if(test == 0 && is_extension) return !exp_pass; if(test == 0) { if(algo != last_missing) { std::cout << "WARNING: \"" + algo + "\" is not a known " << "algorithm name." << std::endl; last_missing = algo; } return 0; } pipe.reset(); pipe.append(test); pipe.append(new Botan::Hex_Encoder); Botan::SecureVector data = Botan::hex_decode(in); const byte* data_ptr = &data[0]; // this can help catch errors with buffering, etc size_t len = data.size(); pipe.start_msg(); while(len) { u32bit how_much = random_word(rng, len); pipe.write(data_ptr, how_much); data_ptr += how_much; len -= how_much; } pipe.end_msg(); } catch(Botan::Algorithm_Not_Found& e) { std::cout << "Algorithm not found: " << e.what() << std::endl; return false; } catch(Botan::Exception& e) { if(exp_pass || DEBUG) std::cout << "Exception caught: " << e.what() << std::endl; return true; } catch(std::exception& e) { if(exp_pass || DEBUG) std::cout << "Standard library exception caught: " << e.what() << std::endl; return true; } catch(...) { if(exp_pass || DEBUG) std::cout << "Unknown exception caught." << std::endl; return true; } std::string output; if(pipe.remaining()) { /* Test peeking at an offset in Pipe/SecureQueue */ size_t offset = random_word(rng, pipe.remaining() - 1); size_t length = random_word(rng, pipe.remaining() - offset); Botan::SecureVector peekbuf(length); pipe.peek(&peekbuf[0], peekbuf.size(), offset); output = pipe.read_all_as_string(); bool OK = true; for(size_t j = offset; j != offset+length; j++) if(static_cast(output[j]) != peekbuf[j-offset]) OK = false; if(!OK) throw Botan::Self_Test_Failure("Peek testing failed in validate.cpp"); } if(output == expected && !exp_pass) { std::cout << "FAILED: " << expected << " == " << std::endl << " " << output << std::endl; return false; } if(output != expected && exp_pass) { std::cout << "\nFAILED: " << expected << " != " << std::endl << " " << output << std::endl; return true; } if(output != expected && !exp_pass) return true; return false; } Botan-1.10.12/checks/validate.dat0000664000175000017500001542106212654331322016322 0ustar jackjack00000000000000# Main Botan validation file # This has test vectors for block ciphers in ECB mode, stream ciphers, # hash functions, MACs, KDFs, PBKDFs, encoders/decoders, and block # cipher modes (CBC, CTS, CFB, OFB, CTR, XTS, and EAX) # MARKER: Block Ciphers # Block cipher format is plaintext:ciphertext:key [AES-128] 00112233445566778899AABBCCDDEEFF:69C4E0D86A7B0430D8CDB78070B4C55A:\ 000102030405060708090A0B0C0D0E0F 506812A45F08C889B97F5980038B8359:D8F532538289EF7D06B506A4FD5BE9C9:\ 00010203050607080A0B0C0D0F101112 5C6D71CA30DE8B8B00549984D2EC7D4B:59AB30F4D4EE6E4FF9907EF65B1FB68C:\ 14151617191A1B1C1E1F202123242526 53F3F4C64F8616E4E7C56199F48F21F6:BF1ED2FCB2AF3FD41443B56D85025CB1:\ 28292A2B2D2E2F30323334353738393A A1EB65A3487165FB0F1C27FF9959F703:7316632D5C32233EDCB0780560EAE8B2:\ 3C3D3E3F41424344464748494B4C4D4E 3553ECF0B1739558B08E350A98A39BFA:408C073E3E2538072B72625E68B8364B:\ 50515253555657585A5B5C5D5F606162 67429969490B9711AE2B01DC497AFDE8:E1F94DFA776597BEACA262F2F6366FEA:\ 64656667696A6B6C6E6F707173747576 93385C1F2AEC8BED192F5A8E161DD508:F29E986C6A1C27D7B29FFD7EE92B75F1:\ 78797A7B7D7E7F80828384858788898A B5BF946BE19BEB8DB3983B5F4C6E8DDB:131C886A57F8C2E713ABA6955E2B55B5:\ 8C8D8E8F91929394969798999B9C9D9E 41321EE10E21BD907227C4450FF42324:D2AB7662DF9B8C740210E5EEB61C199D:\ A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 00A82F59C91C8486D12C0A80124F6089:14C10554B2859C484CAB5869BBE7C470:\ B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 7CE0FD076754691B4BBD9FAF8A1372FE:DB4D498F0A49CF55445D502C1F9AB3B5:\ C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA 23605A8243D07764541BC5AD355B3129:6D96FEF7D66590A77A77BB2056667F7F:\ DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE 12A8CFA23EA764FD876232B4E842BC44:316FB68EDBA736C53E78477BF913725C:\ F0F1F2F3F5F6F7F8FAFBFCFDFE010002 BCAF32415E8308B3723E5FDD853CCC80:6936F2B93AF8397FD3A771FC011C8C37:\ 04050607090A0B0C0E0F101113141516 89AFAE685D801AD747ACE91FC49ADDE0:F3F92F7A9C59179C1FCC2C2BA0B082CD:\ 2C2D2E2F31323334363738393B3C3D3E F521D07B484357C4A69E76124A634216:6A95EA659EE3889158E7A9152FF04EBC:\ 40414243454647484A4B4C4D4F505152 3E23B3BC065BCC152407E23896D77783:1959338344E945670678A5D432C90B93:\ 54555657595A5B5C5E5F606163646566 79F0FBA002BE1744670E7E99290D8F52:E49BDDD2369B83EE66E6C75A1161B394:\ 68696A6B6D6E6F70727374757778797A DA23FE9D5BD63E1D72E3DAFBE21A6C2A:D3388F19057FF704B70784164A74867D:\ 7C7D7E7F81828384868788898B8C8D8E E3F5698BA90B6A022EFD7DB2C7E6C823:23AA03E2D5E4CD24F3217E596480D1E1:\ A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 BDC2691D4F1B73D2700679C3BCBF9C6E:C84113D68B666AB2A50A8BDB222E91B9:\ E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 BA74E02093217EE1BA1B42BD5624349A:AC02403981CD4340B507963DB65CB7B6:\ 08090A0B0D0E0F10121314151718191A B5C593B5851C57FBF8B3F57715E8F680:8D1299236223359474011F6BF5088414:\ 6C6D6E6F71727374767778797B7C7D7E 3DA9BD9CEC072381788F9387C3BBF4EE:5A1D6AB8605505F7977E55B9A54D9B90:\ 80818283858687888A8B8C8D8F909192 4197F3051121702AB65D316B3C637374:72E9C2D519CF555E4208805AABE3B258:\ 94959697999A9B9C9E9FA0A1A3A4A5A6 9F46C62EC4F6EE3F6E8C62554BC48AB7:A8F3E81C4A23A39EF4D745DFFE026E80:\ A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA 0220673FE9E699A4EBC8E0DBEB6979C8:546F646449D31458F9EB4EF5483AEE6C:\ BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE B2B99171337DED9BC8C2C23FF6F18867:4DBE4BC84AC797C0EE4EFB7F1A07401C:\ D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 A7FACF4E301E984E5EFEEFD645B23505:25E10BFB411BBD4D625AC8795C8CA3B3:\ E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 F7C762E4A9819160FD7ACFB6C4EEDCDD:315637405054EC803614E43DEF177579:\ F8F9FAFBFDFEFE00020304050708090A 9B64FC21EA08709F4915436FAA70F1BE:60C5BC8A1410247295C6386C59E572A8:\ 0C0D0E0F11121314161718191B1C1D1E 52AF2C3DE07EE6777F55A4ABFC100B3F:01366FC8CA52DFE055D6A00A76471BA6:\ 20212223252627282A2B2C2D2F303132 2FCA001224386C57AA3F968CBE2C816F:ECC46595516EC612449C3F581E7D42FF:\ 34353637393A3B3C3E3F404143444546 4149C73658A4A9C564342755EE2C132F:6B7FFE4C602A154B06EE9C7DAB5331C9:\ 48494A4B4D4E4F50525354555758595A AF60005A00A1772F7C07A48A923C23D2:7DA234C14039A240DD02DD0FBF84EB67:\ 5C5D5E5F61626364666768696B6C6D6E 6FCCBC28363759914B6F0280AFAF20C6:C7DC217D9E3604FFE7E91F080ECD5A3A:\ 70717273757677787A7B7C7D7F808182 7D82A43DDF4FEFA2FC5947499884D386:37785901863F5C81260EA41E7580CDA5:\ 84858687898A8B8C8E8F909193949596 5D5A990EAAB9093AFE4CE254DFA49EF9:A07B9338E92ED105E6AD720FCCCE9FE4:\ 98999A9B9D9E9FA0A2A3A4A5A7A8A9AA 4CD1E2FD3F4434B553AAE453F0ED1A02:AE0FB9722418CC21A7DA816BBC61322C:\ ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE 5A2C9A9641D4299125FA1B9363104B5E:C826A193080FF91FFB21F71D3373C877:\ C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 B517FE34C0FA217D341740BFD4FE8DD4:1181B11B0E494E8D8B0AA6B1D5AC2C48:\ D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 014BAF2278A69D331D5180103643E99A:6743C3D1519AB4F2CD9A78AB09A511BD:\ E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA B529BD8164F20D0AA443D4932116841C:DC55C076D52BACDF2EEFD952946A439D:\ FCFDFEFF01020304060708090B0C0D0E 2E596DCBB2F33D4216A1176D5BD1E456:711B17B590FFC72B5C8E342B601E8003:\ 10111213151617181A1B1C1D1F202122 7274A1EA2B7EE2424E9A0E4673689143:19983BB0950783A537E1339F4AA21C75:\ 24252627292A2B2C2E2F303133343536 AE20020BD4F13E9D90140BEE3B5D26AF:3BA7762E15554169C0F4FA39164C410C:\ 38393A3B3D3E3F40424344454748494A BAAC065DA7AC26E855E79C8849D75A02:A0564C41245AFCA7AF8AA2E0E588EA89:\ 4C4D4E4F51525354565758595B5C5D5E 7C917D8D1D45FAB9E2540E28832540CC:5E36A42A2E099F54AE85ECD92E2381ED:\ 60616263656667686A6B6C6D6F707172 BDE6F89E16DAADB0E847A2A614566A91:770036F878CD0F6CA2268172F106F2FE:\ 74757677797A7B7C7E7F808183848586 C9DE163725F1F5BE44EBB1DB51D07FBC:7E4E03908B716116443CCF7C94E7C259:\ 88898A8B8D8E8F90929394959798999A 3AF57A58F0C07DFFA669572B521E2B92:482735A48C30613A242DD494C7F9185D:\ 9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE 3D5EBAC306DDE4604F1B4FBBBFCDAE55:B4C0F6C9D4D7079ADDF9369FC081061D:\ B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 C2DFA91BCEB76A1183C995020AC0B556:D5810FE0509AC53EDCD74F89962E6270:\ C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 C70F54305885E9A0746D01EC56C8596B:03F17A16B3F91848269ECDD38EBB2165:\ D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA C4F81B610E98012CE000182050C0C2B2:DA1248C3180348BAD4A93B4D9856C9DF:\ ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE EAAB86B1D02A95D7404EFF67489F97D4:3D10D7B63F3452C06CDF6CCE18BE0C2C:\ 00010203050607080A0B0C0D0F101112 7C55BDB40B88870B52BEC3738DE82886:4AB823E7477DFDDC0E6789018FCB6258:\ 14151617191A1B1C1E1F202123242526 BA6EAA88371FF0A3BD875E3F2A975CE0:E6478BA56A77E70CFDAA5C843ABDE30E:\ 28292A2B2D2E2F30323334353738393A 08059130C4C24BD30CF0575E4E0373DC:1673064895FBEAF7F09C5429FF75772D:\ 3C3D3E3F41424344464748494B4C4D4E 9A8EAB004EF53093DFCF96F57E7EDA82:4488033AE9F2EFD0CA9383BFCA1A94E9:\ 50515253555657585A5B5C5D5F606162 0745B589E2400C25F117B1D796C28129:978F3B8C8F9D6F46626CAC3C0BCB9217:\ 64656667696A6B6C6E6F707173747576 2F1777781216CEC3F044F134B1B92BBE:E08C8A7E582E15E5527F1D9E2EECB236:\ 78797A7B7D7E7F80828384858788898A 353A779FFC541B3A3805D90CE17580FC:CEC155B76AC5FFDA4CF4F9CA91E49A7A:\ 8C8D8E8F91929394969798999B9C9D9E 1A1EAE4415CEFCF08C4AC1C8F68BEA8F:D5AC7165763225DD2A38CDC6862C29AD:\ A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 E6E7E4E5B0B3B2B5D4D5AAAB16111013:03680FE19F7CE7275452020BE70E8204:\ B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 F8F9FAFBFBF8F9E677767170EFE0E1E2:461DF740C9781C388E94BB861CEB54F6:\ C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA 63626160A1A2A3A445444B4A75727370:451BD60367F96483042742219786A074:\ DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE 717073720605040B2D2C2B2A05FAFBF9:E4DFA42671A02E57EF173B85C0EA9F2B:\ F0F1F2F3F5F6F7F8FAFBFCFDFE010002 78797A7BEAE9E8EF3736292891969794:ED11B89E76274282227D854700A78B9E:\ 04050607090A0B0C0E0F101113141516 838281803231300FDDDCDBDAA0AFAEAD:433946EAA51EA47AF33895F2B90B3B75:\ 18191A1B1D1E1F20222324252728292A 18191A1BBFBCBDBA75747B7A7F78797A:6BC6D616A5D7D0284A5910AB35022528:\ 2C2D2E2F31323334363738393B3C3D3E 848586879B989996A3A2A5A4849B9A99:D2A920ECFE919D354B5F49EAE9719C98:\ 40414243454647484A4B4C4D4F505152 0001020322212027CACBF4F551565754:3A061B17F6A92885EFBD0676985B373D:\ 54555657595A5B5C5E5F606163646566 CECFCCCDAFACADB2515057564A454447:FADEEC16E33EA2F4688499D157E20D8F:\ 68696A6B6D6E6F70727374757778797A 92939091CDCECFC813121D1C80878685:5CDEFEDE59601AA3C3CDA36FA6B1FA13:\ 7C7D7E7F81828384868788898B8C8D8E D2D3D0D16F6C6D6259585F5ED1EEEFEC:9574B00039844D92EBBA7EE8719265F8:\ 90919293959697989A9B9C9D9FA0A1A2 ACADAEAF878485820F0E1110D5D2D3D0:9A9CF33758671787E5006928188643FA:\ A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 9091929364676619E6E7E0E1757A7B78:2CDDD634C846BA66BB46CBFEA4A674F9:\ B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA BABBB8B98A89888F74757A7B92959497:D28BAE029393C3E7E26E9FAFBBB4B98F:\ CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE 8D8C8F8E6E6D6C633B3A3D3CCAD5D4D7:EC27529B1BEE0A9AB6A0D73EBC82E9B7:\ E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 86878485010203040808F7F767606162:3CB25C09472AFF6EE7E2B47CCD7CCB17:\ F4F5F6F7F9FAFBFCFEFE010103040506 8E8F8C8D656667788A8B8C8D010E0F0C:DEE33103A7283370D725E44CA38F8FE5:\ 08090A0B0D0E0F10121314151718191A C8C9CACB858687807A7B7475E7E0E1E2:27F9BCD1AAC64BFFC11E7815702C1A69:\ 1C1D1E1F21222324262728292B2C2D2E 6D6C6F6E5053525D8C8D8A8BADD2D3D0:5DF534FFAD4ED0749A9988E9849D0021:\ 30313233353637383A3B3C3D3F404142 28292A2B393A3B3C0607181903040506:A48BEE75DB04FB60CA2B80F752A8421B:\ 44454647494A4B4C4E4F505153545556 A5A4A7A6B0B3B28DDBDADDDCBDB2B3B0:024C8CF70BC86EE5CE03678CB7AF45F9:\ 58595A5B5D5E5F60626364656768696A 323330316467666130313E3F2C2B2A29:3C19AC0F8A3A3862CE577831301E166B:\ 6C6D6E6F71727374767778797B7C7D7E 27262524080B0A05171611100B141516:C5E355B796A57421D59CA6BE82E73BCA:\ 80818283858687888A8B8C8D8F909192 040506074142434435340B0AA3A4A5A6:D94033276417ABFB05A69D15B6E386E2:\ 94959697999A9B9C9E9FA0A1A3A4A5A6 242526271112130C61606766BDB2B3B0:24B36559EA3A9B9B958FE6DA3E5B8D85:\ A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA 4B4A4948252627209E9F9091CEC9C8CB:20FD4FEAA0E8BF0CCE7861D74EF4CB72:\ BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE 68696A6B6665646B9F9E9998D9E6E7E4:350E20D5174277B9EC314C501570A11D:\ D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 34353637C5C6C7C0F0F1EEEF7C7B7A79:87A29D61B7C604D238FE73045A7EFD57:\ E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 32333031C2C1C13F0D0C0B0A050A0B08:2C3164C1CC7D0064816BDC0FAA362C52:\ F8F9FAFBFDFEFE00020304050708090A CDCCCFCEBEBDBCBBABAAA5A4181F1E1D:195FE5E8A05A2ED594F6E4400EEE10B3:\ 0C0D0E0F11121314161718191B1C1D1E 212023223635343BA0A1A6A7445B5A59:E4663DF19B9A21A5A284C2BD7F905025:\ 20212223252627282A2B2C2D2F303132 0E0F0C0DA8ABAAAD2F2E515002050407:21B88714CFB4E2A933BD281A2C4743FD:\ 34353637393A3B3C3E3F404143444546 070605042A2928378E8F8889BDB2B3B0:CBFC3980D704FD0FC54378AB84E17870:\ 48494A4B4D4E4F50525354555758595A CBCAC9C893909196A9A8A7A6A5A2A3A0:BC5144BAA48BDEB8B63E22E03DA418EF:\ 5C5D5E5F61626364666768696B6C6D6E 80818283C1C2C3CC9C9D9A9B0CF3F2F1:5A1DBAEF1EE2984B8395DA3BDFFA3CCC:\ 70717273757677787A7B7C7D7F808182 1213101125262720FAFBE4E5B1B6B7B4:F0B11CD0729DFCC80CEC903D97159574:\ 84858687898A8B8C8E8F909193949596 7F7E7D7C3033320D97969190222D2C2F:9F95314ACFDDC6D1914B7F19A9CC8209:\ 98999A9B9D9E9FA0A2A3A4A5A7A8A9AA 4E4F4C4D484B4A4D81808F8E53545556:595736F6F0F70914A94E9E007F022519:\ ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE DCDDDEDFB0B3B2BD15141312A1BEBFBC:1F19F57892CAE586FCDFB4C694DEB183:\ C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 93929190282B2A2DC4C5FAFB92959497:540700EE1F6F3DAB0B3EDDF6CAEE1EF5:\ D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 F5F4F7F6C4C7C6D9373631307E717073:14A342A91019A331687A2254E6626CA2:\ E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA 93929190B6B5B4B364656A6B05020300:7B25F3C3B2EEA18D743EF283140F29FF:\ FCFDFEFF01020304060708090B0C0D0E BABBB8B90D0E0F00A4A5A2A3043B3A39:46C2587D66E5E6FA7F7CA6411AD28047:\ 10111213151617181A1B1C1D1F202122 D8D9DADB7F7C7D7A10110E0F787F7E7D:09470E72229D954ED5EE73886DFEEBA9:\ 24252627292A2B2C2E2F303133343536 FEFFFCFDEFECED923B3A3D3C6768696A:D77C03DE92D4D0D79EF8D4824EF365EB:\ 38393A3B3D3E3F40424344454748494A D6D7D4D58A89888F96979899A5A2A3A0:1D190219F290E0F1715D152D41A23593:\ 4C4D4E4F51525354565758595B5C5D5E 18191A1BA8ABAAA5303136379B848586:A2CD332CE3A0818769616292E87F757B:\ 60616263656667686A6B6C6D6F707172 6B6A6968A4A7A6A1D6D72829B0B7B6B5:D54AFA6CE60FBF9341A3690E21385102:\ 74757677797A7B7C7E7F808183848586 000102038A89889755545352A6A9A8AB:06E5C364DED628A3F5E05E613E356F46:\ 88898A8B8D8E8F90929394959798999A 2D2C2F2EB3B0B1B6B6B7B8B9F2F5F4F7:EAE63C0E62556DAC85D221099896355A:\ 9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE 979695943536373856575051E09F9E9D:1FED060E2C6FC93EE764403A889985A2:\ B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 A4A5A6A7989B9A9DB1B0AFAE7A7D7C7F:C25235C1A30FDEC1C7CB5C5737B2A588:\ C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 C1C0C3C2686B6A55A8A9AEAFEAE5E4E7:796DBEF95147D4D30873AD8B7B92EFC0:\ D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA C1C0C3C2141716118C8D828364636261:CBCF0FB34D98D0BD5C22CE37211A46BF:\ ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE 93929190CCCFCEC196979091E0FFFEFD:94B44DA6466126CAFA7C7FD09063FC24:\ 00010203050607080A0B0C0D0F101112 B4B5B6B7F9FAFBFC25241B1A6E69686B:D78C5B5EBF9B4DBDA6AE506C5074C8FE:\ 14151617191A1B1C1E1F202123242526 868784850704051AC7C6C1C08788898A:6C27444C27204B043812CF8CF95F9769:\ 28292A2B2D2E2F30323334353738393A F4F5F6F7AAA9A8AFFDFCF3F277707172:BE94524EE5A2AA50BBA8B75F4C0AEBCF:\ 3C3D3E3F41424344464748494B4C4D4E D3D2D1D00605040BC3C2C5C43E010003:A0AEAAE91BA9F31F51AEB3588CF3A39E:\ 50515253555657585A5B5C5D5F606162 73727170424140476A6B74750D0A0B08:275297779C28266EF9FE4C6A13C08488:\ 64656667696A6B6C6E6F707173747576 C2C3C0C10A0908F754555253A1AEAFAC:86523D92BB8672CB01CF4A77FD725882:\ 78797A7B7D7E7F80828384858788898A 6D6C6F6EF8FBFAFD82838C8DF8FFFEFD:4B8327640E9F33322A04DD96FCBF9A36:\ 8C8D8E8F91929394969798999B9C9D9E F5F4F7F684878689A6A7A0A1D2CDCCCF:CE52AF650D088CA559425223F4D32694:\ A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 00000000000000000000000000000000:0EDD33D3C621E546455BD8BA1418BEC8:\ 80000000000000000000000000000000 00000000000000000000000000000000:C0CC0C5DA5BD63ACD44A80774FAD5222:\ 40000000000000000000000000000000 00000000000000000000000000000000:2F0B4B71BC77851B9CA56D42EB8FF080:\ 20000000000000000000000000000000 00000000000000000000000000000000:6B1E2FFFE8A114009D8FE22F6DB5F876:\ 10000000000000000000000000000000 00000000000000000000000000000000:9AA042C315F94CBB97B62202F83358F5:\ 08000000000000000000000000000000 00000000000000000000000000000000:DBE01DE67E346A800C4C4B4880311DE4:\ 04000000000000000000000000000000 00000000000000000000000000000000:C117D2238D53836ACD92DDCDB85D6A21:\ 02000000000000000000000000000000 00000000000000000000000000000000:DC0ED85DF9611ABB7249CDD168C5467E:\ 01000000000000000000000000000000 00000000000000000000000000000000:807D678FFF1F56FA92DE3381904842F2:\ 00800000000000000000000000000000 00000000000000000000000000000000:0E53B3FCAD8E4B130EF73AEB957FB402:\ 00400000000000000000000000000000 00000000000000000000000000000000:969FFD3B7C35439417E7BDE923035D65:\ 00200000000000000000000000000000 00000000000000000000000000000000:A99B512C19CA56070491166A1503BF15:\ 00100000000000000000000000000000 00000000000000000000000000000000:6E9985252126EE344D26AE369D2327E3:\ 00080000000000000000000000000000 00000000000000000000000000000000:B85F4809F904C275491FCDCD1610387E:\ 00040000000000000000000000000000 00000000000000000000000000000000:ED365B8D7D20C1F5D53FB94DD211DF7B:\ 00020000000000000000000000000000 00000000000000000000000000000000:B3A575E86A8DB4A7135D604C43304896:\ 00010000000000000000000000000000 00000000000000000000000000000000:89704BCB8E69F846259EB0ACCBC7F8A2:\ 00008000000000000000000000000000 00000000000000000000000000000000:C56EE7C92197861F10D7A92B90882055:\ 00004000000000000000000000000000 00000000000000000000000000000000:92F296F6846E0EAF9422A5A24A08B069:\ 00002000000000000000000000000000 00000000000000000000000000000000:E67E32BB8F11DEB8699318BEE9E91A60:\ 00001000000000000000000000000000 00000000000000000000000000000000:B08EEF85EAF626DD91B65C4C3A97D92B:\ 00000800000000000000000000000000 00000000000000000000000000000000:661083A6ADDCE79BB4E0859AB5538013:\ 00000400000000000000000000000000 00000000000000000000000000000000:55DFE2941E0EB10AFC0B333BD34DE1FE:\ 00000200000000000000000000000000 00000000000000000000000000000000:6BFE5945E715C9662609770F8846087A:\ 00000100000000000000000000000000 00000000000000000000000000000000:79848E9C30C2F8CDA8B325F7FED2B139:\ 00000080000000000000000000000000 00000000000000000000000000000000:7A713A53B99FEF34AC04DEEF80965BD0:\ 00000040000000000000000000000000 00000000000000000000000000000000:18144A2B46620D32C3C32CE52D49257F:\ 00000020000000000000000000000000 00000000000000000000000000000000:872E827C70887C80749F7B8BB1847C7E:\ 00000010000000000000000000000000 00000000000000000000000000000000:6B86C6A4FE6A60C59B1A3102F8DE49F3:\ 00000008000000000000000000000000 00000000000000000000000000000000:9848BB3DFDF6F532F094679A4C231A20:\ 00000004000000000000000000000000 00000000000000000000000000000000:925AD528E852E329B2091CD3F1C2BCEE:\ 00000002000000000000000000000000 00000000000000000000000000000000:80DF436544B0DD596722E46792A40CD8:\ 00000001000000000000000000000000 00000000000000000000000000000000:525DAF18F93E83E1E74BBBDDE4263BBA:\ 00000000800000000000000000000000 00000000000000000000000000000000:F65C9D2EE485D24701FFA3313B9D5BE6:\ 00000000400000000000000000000000 00000000000000000000000000000000:E4FC8D8BCA06425BDF94AFA40FCC14BA:\ 00000000200000000000000000000000 00000000000000000000000000000000:A53F0A5CA1E4E6440BB975FF320DE6F8:\ 00000000100000000000000000000000 00000000000000000000000000000000:D55313B9394080462E87E02899B553F0:\ 00000000080000000000000000000000 00000000000000000000000000000000:34A71D761F71BCD344384C7F97D27906:\ 00000000040000000000000000000000 00000000000000000000000000000000:233F3D819599612EBC89580245C996A8:\ 00000000020000000000000000000000 00000000000000000000000000000000:B4F1374E5268DBCB676E447529E53F89:\ 00000000010000000000000000000000 00000000000000000000000000000000:0816BD27861D2BA891D1044E39951E96:\ 00000000008000000000000000000000 00000000000000000000000000000000:F3BE9EA3F10C73CA64FDE5DB13A951D1:\ 00000000004000000000000000000000 00000000000000000000000000000000:2448086A8106FBD03048DDF857D3F1C8:\ 00000000002000000000000000000000 00000000000000000000000000000000:670756E65BEC8B68F03D77CDCDCE7B91:\ 00000000001000000000000000000000 00000000000000000000000000000000:EF968CF0D36FD6C6EFFD225F6FB44CA9:\ 00000000000800000000000000000000 00000000000000000000000000000000:2E8767157922E3826DDCEC1B0CC1E105:\ 00000000000400000000000000000000 00000000000000000000000000000000:78CE7EEC670E45A967BAB17E26A1AD36:\ 00000000000200000000000000000000 00000000000000000000000000000000:3C5CEE825655F098F6E81A2F417DA3FB:\ 00000000000100000000000000000000 00000000000000000000000000000000:67BFDB431DCE1292200BC6F5207ADB12:\ 00000000000080000000000000000000 00000000000000000000000000000000:7540FD38E447C0779228548747843A6F:\ 00000000000040000000000000000000 00000000000000000000000000000000:B85E513301F8A936EA9EC8A21A85B5E6:\ 00000000000020000000000000000000 00000000000000000000000000000000:04C67DBF16C11427D507A455DE2C9BC5:\ 00000000000010000000000000000000 00000000000000000000000000000000:03F75EB8959E55079CFFB4FF149A37B6:\ 00000000000008000000000000000000 00000000000000000000000000000000:74550287F666C63BB9BC7838433434B0:\ 00000000000004000000000000000000 00000000000000000000000000000000:7D537200195EBC3AEFD1EAAB1C385221:\ 00000000000002000000000000000000 00000000000000000000000000000000:CE24E4D40C68A82B535CBD3C8E21652A:\ 00000000000001000000000000000000 00000000000000000000000000000000:AB20072405AA8FC40265C6F1F3DC8BC0:\ 00000000000000800000000000000000 00000000000000000000000000000000:6CFD2CF688F566B093F67B9B3839E80A:\ 00000000000000400000000000000000 00000000000000000000000000000000:BD95977E6B7239D407A012C5544BF584:\ 00000000000000200000000000000000 00000000000000000000000000000000:DF9C0130AC77E7C72C997F587B46DBE0:\ 00000000000000100000000000000000 00000000000000000000000000000000:E7F1B82CADC53A648798945B34EFEFF2:\ 00000000000000080000000000000000 00000000000000000000000000000000:932C6DBF69255CF13EDCDB72233ACEA3:\ 00000000000000040000000000000000 00000000000000000000000000000000:5C76002BC7206560EFE550C80B8F12CC:\ 00000000000000020000000000000000 00000000000000000000000000000000:F6B7BDD1CAEEBAB574683893C4475484:\ 00000000000000010000000000000000 00000000000000000000000000000000:A920E37CC6DC6B31DA8C0169569F5034:\ 00000000000000008000000000000000 00000000000000000000000000000000:919380ECD9C778BC513148B0C28D65FD:\ 00000000000000004000000000000000 00000000000000000000000000000000:EE67308DD3F2D9E6C2170755E5784BE1:\ 00000000000000002000000000000000 00000000000000000000000000000000:3CC73E53B85609023A05E149B223AE09:\ 00000000000000001000000000000000 00000000000000000000000000000000:983E8AF7CF05EBB28D71EB841C9406E6:\ 00000000000000000800000000000000 00000000000000000000000000000000:0F3099B2D31FA5299EE5BF43193287FC:\ 00000000000000000400000000000000 00000000000000000000000000000000:B763D84F38C27FE6931DCEB6715D4DB6:\ 00000000000000000200000000000000 00000000000000000000000000000000:5AE3C9B0E3CC29C0C61565CD01F8A248:\ 00000000000000000100000000000000 00000000000000000000000000000000:F58083572CD90981958565D48D2DEE25:\ 00000000000000000080000000000000 00000000000000000000000000000000:7E6255EEF8F70C0EF10337AAB1CCCEF8:\ 00000000000000000040000000000000 00000000000000000000000000000000:AAD4BAC34DB22821841CE2F631961902:\ 00000000000000000020000000000000 00000000000000000000000000000000:D7431C0409BB1441BA9C6858DC7D4E81:\ 00000000000000000010000000000000 00000000000000000000000000000000:EF9298C65E339F6E801A59C626456993:\ 00000000000000000008000000000000 00000000000000000000000000000000:53FE29F68FF541ABC3F0EF3350B72F7E:\ 00000000000000000004000000000000 00000000000000000000000000000000:F6BBA5C10DB02529E2C2DA3FB582CC14:\ 00000000000000000002000000000000 00000000000000000000000000000000:E4239AA37FC531A386DAD1126FC0E9CD:\ 00000000000000000001000000000000 00000000000000000000000000000000:8F7758F857D15BBE7BFD0E416404C365:\ 00000000000000000000800000000000 00000000000000000000000000000000:D273EB57C687BCD1B4EA7218A509E7B8:\ 00000000000000000000400000000000 00000000000000000000000000000000:65D64F8D76E8B3423FA25C4EB58A210A:\ 00000000000000000000200000000000 00000000000000000000000000000000:623D802B4EC450D66A16625702FCDBE0:\ 00000000000000000000100000000000 00000000000000000000000000000000:7496460CB28E5791BAEAF9B68FB00022:\ 00000000000000000000080000000000 00000000000000000000000000000000:34EA600F18BB0694B41681A49D510C1D:\ 00000000000000000000040000000000 00000000000000000000000000000000:5F8FF0D47D5766D29B5D6E8F46423BD8:\ 00000000000000000000020000000000 00000000000000000000000000000000:225F9286C5928BF09F84D3F93F541959:\ 00000000000000000000010000000000 00000000000000000000000000000000:B21E90D25DF383416A5F072CEBEB1FFB:\ 00000000000000000000008000000000 00000000000000000000000000000000:4AEFCDA089318125453EB9E8EB5E492E:\ 00000000000000000000004000000000 00000000000000000000000000000000:4D3E75C6CD40EC4869BC85158591ADB8:\ 00000000000000000000002000000000 00000000000000000000000000000000:63A8B904405436A1B99D7751866771B7:\ 00000000000000000000001000000000 00000000000000000000000000000000:64F0DAAE47529199792EAE172BA53293:\ 00000000000000000000000800000000 00000000000000000000000000000000:C3EEF84BEA18225D515A8C852A9047EE:\ 00000000000000000000000400000000 00000000000000000000000000000000:A44AC422B47D47B81AF73B3E9AC9596E:\ 00000000000000000000000200000000 00000000000000000000000000000000:D16E04A8FBC435094F8D53ADF25F5084:\ 00000000000000000000000100000000 00000000000000000000000000000000:EF13DC34BAB03E124EEAD8B6BF44B532:\ 00000000000000000000000080000000 00000000000000000000000000000000:D94799075C24DCC067AF0D392049250D:\ 00000000000000000000000040000000 00000000000000000000000000000000:14F431771EDDCE4764C21A2254B5E3C8:\ 00000000000000000000000020000000 00000000000000000000000000000000:7039329F36F2ED682B02991F28D64679:\ 00000000000000000000000010000000 00000000000000000000000000000000:124EE24EDE5551639DB8B8B941F6141D:\ 00000000000000000000000008000000 00000000000000000000000000000000:C2852879A34D5184E478EC918B993FEE:\ 00000000000000000000000004000000 00000000000000000000000000000000:86A806A3525B93E432053C9AB5ABBEDF:\ 00000000000000000000000002000000 00000000000000000000000000000000:C1609BF5A4F07E37C17A36366EC23ECC:\ 00000000000000000000000001000000 00000000000000000000000000000000:7E81E7CB92159A51FFCEA331B1E8EA53:\ 00000000000000000000000000800000 00000000000000000000000000000000:37A7BE002856C5A59A6E03EAFCE7729A:\ 00000000000000000000000000400000 00000000000000000000000000000000:BDF98A5A4F91E890C9A1D1E5FAAB138F:\ 00000000000000000000000000200000 00000000000000000000000000000000:4E96ACB66E051F2BC739CC3D3E34A26B:\ 00000000000000000000000000100000 00000000000000000000000000000000:EE996CDD120EB86E21ECFA49E8E1FCF1:\ 00000000000000000000000000080000 00000000000000000000000000000000:61B9E6B579DBF6070C351A1440DD85FF:\ 00000000000000000000000000040000 00000000000000000000000000000000:AC369E484316440B40DFC83AA96E28E7:\ 00000000000000000000000000020000 00000000000000000000000000000000:0A2D16DE985C76D45C579C1159413BBE:\ 00000000000000000000000000010000 00000000000000000000000000000000:DA3FDC38DA1D374FA4802CDA1A1C6B0F:\ 00000000000000000000000000008000 00000000000000000000000000000000:B842523D4C41C2211AFE43A5800ADCE3:\ 00000000000000000000000000004000 00000000000000000000000000000000:9E2CDA90D8E992DBA6C73D8229567192:\ 00000000000000000000000000002000 00000000000000000000000000000000:D49583B781D9E20F5BE101415957FC49:\ 00000000000000000000000000001000 00000000000000000000000000000000:EF09DA5C12B376E458B9B8670032498E:\ 00000000000000000000000000000800 00000000000000000000000000000000:A96BE0463DA774461A5E1D5A9DD1AC10:\ 00000000000000000000000000000400 00000000000000000000000000000000:32CEE3341060790D2D4B1362EF397090:\ 00000000000000000000000000000200 00000000000000000000000000000000:21CEA416A3D3359D2C4D58FB6A035F06:\ 00000000000000000000000000000100 00000000000000000000000000000000:172AEAB3D507678ECAF455C12587ADB7:\ 00000000000000000000000000000080 00000000000000000000000000000000:B6F897941EF8EBFF9FE80A567EF38478:\ 00000000000000000000000000000040 00000000000000000000000000000000:A9723259D94A7DC662FB0C782CA3F1DD:\ 00000000000000000000000000000020 00000000000000000000000000000000:2F91C984B9A4839F30001B9F430493B4:\ 00000000000000000000000000000010 00000000000000000000000000000000:0472406345A610B048CB99EE0EF3FA0F:\ 00000000000000000000000000000008 00000000000000000000000000000000:F5F39086646F8C05ED16EFA4B617957C:\ 00000000000000000000000000000004 00000000000000000000000000000000:26D50F485A30408D5AF47A5736292450:\ 00000000000000000000000000000002 00000000000000000000000000000000:0545AAD56DA2A97C3663D1432A3D1C84:\ 00000000000000000000000000000001 80000000000000000000000000000000:3AD78E726C1EC02B7EBFE92B23D9EC34:\ 00000000000000000000000000000000 40000000000000000000000000000000:45BC707D29E8204D88DFBA2F0B0CAD9B:\ 00000000000000000000000000000000 20000000000000000000000000000000:161556838018F52805CDBD6202002E3F:\ 00000000000000000000000000000000 10000000000000000000000000000000:F5569B3AB6A6D11EFDE1BF0A64C6854A:\ 00000000000000000000000000000000 08000000000000000000000000000000:64E82B50E501FBD7DD4116921159B83E:\ 00000000000000000000000000000000 04000000000000000000000000000000:BAAC12FB613A7DE11450375C74034041:\ 00000000000000000000000000000000 02000000000000000000000000000000:BCF176A7EAAD8085EBACEA362462A281:\ 00000000000000000000000000000000 01000000000000000000000000000000:47711816E91D6FF059BBBF2BF58E0FD3:\ 00000000000000000000000000000000 00800000000000000000000000000000:B970DFBE40698AF1638FE38BD3DF3B2F:\ 00000000000000000000000000000000 00400000000000000000000000000000:F95B59A44F391E14CF20B74BDC32FCFF:\ 00000000000000000000000000000000 00200000000000000000000000000000:720F74AE04A2A435B9A7256E49378F5B:\ 00000000000000000000000000000000 00100000000000000000000000000000:2A0445F61D36BFA7E277070730CF76DA:\ 00000000000000000000000000000000 00080000000000000000000000000000:8D0536B997AEFEC1D94011BAB6699A03:\ 00000000000000000000000000000000 00040000000000000000000000000000:674F002E19F6ED47EFF319E51FAD4498:\ 00000000000000000000000000000000 00020000000000000000000000000000:292C02C5CB9163C80AC0F6CF1DD8E92D:\ 00000000000000000000000000000000 00010000000000000000000000000000:FA321CF18EF5FE727DD82A5C1E945141:\ 00000000000000000000000000000000 00008000000000000000000000000000:A5A7AFE1034C39CCCEBE3C584BC0BE05:\ 00000000000000000000000000000000 00004000000000000000000000000000:4FF5A52E697E77D081205DBDB21CEA39:\ 00000000000000000000000000000000 00002000000000000000000000000000:209E88DC94C9003000CE0769AF7B7166:\ 00000000000000000000000000000000 00001000000000000000000000000000:5DEE41AF864CB4B650E5F51551824D38:\ 00000000000000000000000000000000 00000800000000000000000000000000:A79A63FA7E4503AE6D6E09F5F9053030:\ 00000000000000000000000000000000 00000400000000000000000000000000:A48316749FAE7FAC7002031A6AFD8BA7:\ 00000000000000000000000000000000 00000200000000000000000000000000:D6EEE8A7357A0E1D64262CA9C337AC42:\ 00000000000000000000000000000000 00000100000000000000000000000000:B013CA8A62A858053E9FB667ED39829E:\ 00000000000000000000000000000000 00000080000000000000000000000000:DF6EA9E4538A45A52D5C1A43C88F4B55:\ 00000000000000000000000000000000 00000040000000000000000000000000:7D03BA451371591D3FD5547D9165C73B:\ 00000000000000000000000000000000 00000020000000000000000000000000:0E0426281A6277E186499D365D5F49FF:\ 00000000000000000000000000000000 00000010000000000000000000000000:DBC02169DD2059E6CC4C57C1FEDF5AB4:\ 00000000000000000000000000000000 00000008000000000000000000000000:826590E05D167DA6F00DCC75E22788EB:\ 00000000000000000000000000000000 00000004000000000000000000000000:34A73F21A04421D9786335FAAB49423A:\ 00000000000000000000000000000000 00000002000000000000000000000000:ED347D0E0128EE1A7392A1D36AB78AA9:\ 00000000000000000000000000000000 00000001000000000000000000000000:EE944B2FE6E9FC888042608DA9615F75:\ 00000000000000000000000000000000 00000000800000000000000000000000:9E7C85A909EF7218BA7947CFB4718F46:\ 00000000000000000000000000000000 00000000400000000000000000000000:811AE07A0B2B1F816587FA73699AE77D:\ 00000000000000000000000000000000 00000000200000000000000000000000:68466FBF43C2FE13D4B18F7EC5EA745F:\ 00000000000000000000000000000000 00000000100000000000000000000000:D20B015C7191B219780956E6101F9354:\ 00000000000000000000000000000000 00000000080000000000000000000000:5939D5C1BBF54EE1B3E326D757BDDE25:\ 00000000000000000000000000000000 00000000040000000000000000000000:B1FDAFE9A0240E8FFEA19CE94B5105D3:\ 00000000000000000000000000000000 00000000020000000000000000000000:D62962ECE02CDD68C06BDFEFB2F9495B:\ 00000000000000000000000000000000 00000000010000000000000000000000:B3BB2DE6F3C26587BA8BAC4F7AD9499A:\ 00000000000000000000000000000000 00000000008000000000000000000000:E0B1072D6D9FF703D6FBEF77852B0A6B:\ 00000000000000000000000000000000 00000000004000000000000000000000:D8DD51C907F478DE0228E83E61FD1758:\ 00000000000000000000000000000000 00000000002000000000000000000000:A42DFFE6E7C1671C06A25236FDD10017:\ 00000000000000000000000000000000 00000000001000000000000000000000:25ACF141550BFAB9EF451B6C6A5B2163:\ 00000000000000000000000000000000 00000000000800000000000000000000:4DA7FCA3949B16E821DBC84F19581018:\ 00000000000000000000000000000000 00000000000400000000000000000000:7D49B6347CBCC8919C7FA96A37A7A215:\ 00000000000000000000000000000000 00000000000200000000000000000000:900024B29A08C6721B95BA3B753DDB4D:\ 00000000000000000000000000000000 00000000000100000000000000000000:6D2182FB283B6934D90BA7848CAB5E66:\ 00000000000000000000000000000000 00000000000080000000000000000000:F73EF01B448D23A4D90DE8B2F9666E7A:\ 00000000000000000000000000000000 00000000000040000000000000000000:4AD9CDA2418643E9A3D926AF5E6B0412:\ 00000000000000000000000000000000 00000000000020000000000000000000:7CAEC8E7E5953997D545B033201C8C5B:\ 00000000000000000000000000000000 00000000000010000000000000000000:3C43CA1F6B6864503E27B48D88230CF5:\ 00000000000000000000000000000000 00000000000008000000000000000000:44F779B93108FE9FEEC880D79BA74488:\ 00000000000000000000000000000000 00000000000004000000000000000000:9E50E8D9CFD3A682A78E527C9072A1CF:\ 00000000000000000000000000000000 00000000000002000000000000000000:68D000CBC838BBE3C505D6F814C01F28:\ 00000000000000000000000000000000 00000000000001000000000000000000:2CB2A9FEC1ACD1D9B0FA05205E304F57:\ 00000000000000000000000000000000 00000000000000800000000000000000:01EB2806606E46444520A5CC6180CD4B:\ 00000000000000000000000000000000 00000000000000400000000000000000:DAA9B25168CC702326F217F1A0C0B162:\ 00000000000000000000000000000000 00000000000000200000000000000000:3E07E648975D9578D03555B1755807ED:\ 00000000000000000000000000000000 00000000000000100000000000000000:0B45F52E802C8B8DE09579425B80B711:\ 00000000000000000000000000000000 00000000000000080000000000000000:659595DA0B68F6DF0DD6CA77202986E1:\ 00000000000000000000000000000000 00000000000000040000000000000000:05FF42873893536E58C8FA98A45C73C4:\ 00000000000000000000000000000000 00000000000000020000000000000000:B5B03421DE8BBFFC4EADEC767339A9BD:\ 00000000000000000000000000000000 00000000000000010000000000000000:788BCD111ECF73D4E78D2E21BEF55460:\ 00000000000000000000000000000000 00000000000000008000000000000000:909CD9EC6790359F982DC6F2393D5315:\ 00000000000000000000000000000000 00000000000000004000000000000000:332950F361535FF24EFAC8C76293F12C:\ 00000000000000000000000000000000 00000000000000002000000000000000:A68CCD4E330FFDA9D576DA436DB53D75:\ 00000000000000000000000000000000 00000000000000001000000000000000:27C8A1CCFDB0B015D1ED5B3E77143791:\ 00000000000000000000000000000000 00000000000000000800000000000000:D76A4B95887A77DF610DD3E1D3B20325:\ 00000000000000000000000000000000 00000000000000000400000000000000:C068AB0DE71C66DAE83C361EF4B2D989:\ 00000000000000000000000000000000 00000000000000000200000000000000:C2120BCD49EDA9A288B3B4BE79AC8158:\ 00000000000000000000000000000000 00000000000000000100000000000000:0C546F62BF2773CD0F564FCECA7BA688:\ 00000000000000000000000000000000 00000000000000000080000000000000:18F3462BEDE4920213CCB66DAB1640AA:\ 00000000000000000000000000000000 00000000000000000040000000000000:FE42F245EDD0E24B216AEBD8B392D690:\ 00000000000000000000000000000000 00000000000000000020000000000000:3D3EEBC8D3D1558A194C2D00C337FF2B:\ 00000000000000000000000000000000 00000000000000000010000000000000:29AAEDF043E785DB42836F79BE6CBA28:\ 00000000000000000000000000000000 00000000000000000008000000000000:215F90C6744E2944358E78619159A611:\ 00000000000000000000000000000000 00000000000000000004000000000000:8606B1AA9E1D548E5442B06551E2C6DC:\ 00000000000000000000000000000000 00000000000000000002000000000000:987BB4B8740EC0EDE7FEA97DF033B5B1:\ 00000000000000000000000000000000 00000000000000000001000000000000:C0A3500DA5B0AE07D2F450930BEEDF1B:\ 00000000000000000000000000000000 00000000000000000000800000000000:525FDF8312FE8F32C781481A8DAAAE37:\ 00000000000000000000000000000000 00000000000000000000400000000000:BFD2C56AE5FB9C9DE33A6944572A6487:\ 00000000000000000000000000000000 00000000000000000000200000000000:7975A57A425CDF5AA1FA929101F650B0:\ 00000000000000000000000000000000 00000000000000000000100000000000:BF174BC49609A8709B2CD8366DAA79FE:\ 00000000000000000000000000000000 00000000000000000000080000000000:06C50C43222F56C874B1704E9F44BF7D:\ 00000000000000000000000000000000 00000000000000000000040000000000:0CEC48CD34043EA29CA3B8ED5278721E:\ 00000000000000000000000000000000 00000000000000000000020000000000:9548EA34A1560197B304D0ACB8A1698D:\ 00000000000000000000000000000000 00000000000000000000010000000000:22F9E9B1BD73B6B5B7D3062C986272F3:\ 00000000000000000000000000000000 00000000000000000000008000000000:FEE8E934BD0873295059002230E298D4:\ 00000000000000000000000000000000 00000000000000000000004000000000:1B08E2E3EB820D139CB4ABBDBE81D00D:\ 00000000000000000000000000000000 00000000000000000000002000000000:0021177681E4D90CEAF69DCED0145125:\ 00000000000000000000000000000000 00000000000000000000001000000000:4A8E314452CA8A8A3619FC54BC423643:\ 00000000000000000000000000000000 00000000000000000000000800000000:65047474F7222C94C6965425FF1BFD0A:\ 00000000000000000000000000000000 00000000000000000000000400000000:E123F551A9C4A8489622B16F961A9AA4:\ 00000000000000000000000000000000 00000000000000000000000200000000:EF05530948B80915028BB2B6FE429380:\ 00000000000000000000000000000000 00000000000000000000000100000000:72535B7FE0F0F777CEDCD55CD77E2DDF:\ 00000000000000000000000000000000 00000000000000000000000080000000:3423D8EFC31FA2F4C365C77D8F3B5C63:\ 00000000000000000000000000000000 00000000000000000000000040000000:DE0E51C264663F3C5DBC59580A98D8E4:\ 00000000000000000000000000000000 00000000000000000000000020000000:B2D9391166680947AB09264156719679:\ 00000000000000000000000000000000 00000000000000000000000010000000:10DB79F23B06D263835C424AF749ADB7:\ 00000000000000000000000000000000 00000000000000000000000008000000:DDF72D27E6B01EC107EA3E005B59563B:\ 00000000000000000000000000000000 00000000000000000000000004000000:8266B57485A5954A4236751DE07F6694:\ 00000000000000000000000000000000 00000000000000000000000002000000:669A501E1F1ADE6E5523DE01D6DBC987:\ 00000000000000000000000000000000 00000000000000000000000001000000:C20C48F2989725D461D1DB589DC0896E:\ 00000000000000000000000000000000 00000000000000000000000000800000:DE35158E7810ED1191825D2AA98FA97D:\ 00000000000000000000000000000000 00000000000000000000000000400000:4FE294F2C0F34D0671B693A237EBDDC8:\ 00000000000000000000000000000000 00000000000000000000000000200000:087AE74B10CCBFDF6739FEB9559C01A4:\ 00000000000000000000000000000000 00000000000000000000000000100000:5DC278970B7DEF77A5536C77AB59C207:\ 00000000000000000000000000000000 00000000000000000000000000080000:7607F078C77085184EAA9B060C1FBFFF:\ 00000000000000000000000000000000 00000000000000000000000000040000:9DB841531BCBE7998DAD19993FB3CC00:\ 00000000000000000000000000000000 00000000000000000000000000020000:D6A089B654854A94560BAE13298835B8:\ 00000000000000000000000000000000 00000000000000000000000000010000:E1E223C4CF90CC5D195B370D65114622:\ 00000000000000000000000000000000 00000000000000000000000000008000:1CBED73C50D053BDAD372CEEE54836A1:\ 00000000000000000000000000000000 00000000000000000000000000004000:D309E69376D257ADF2BFDA152B26555F:\ 00000000000000000000000000000000 00000000000000000000000000002000:740F7649117F0DEE6EAA7789A9994C36:\ 00000000000000000000000000000000 00000000000000000000000000001000:76AE64417C297184D668C5FD908B3CE5:\ 00000000000000000000000000000000 00000000000000000000000000000800:6095FEA4AA8035591F1787A819C48787:\ 00000000000000000000000000000000 00000000000000000000000000000400:D1FF4E7ACD1C79967FEBAB0F7465D450:\ 00000000000000000000000000000000 00000000000000000000000000000200:5F5AD3C42B9489557BB63BF49ECF5F8A:\ 00000000000000000000000000000000 00000000000000000000000000000100:FB56CC09B680B1D07C5A52149E29F07C:\ 00000000000000000000000000000000 00000000000000000000000000000080:FF49B8DF4A97CBE03833E66197620DAD:\ 00000000000000000000000000000000 00000000000000000000000000000040:5E070ADE533D2E090ED0F5BE13BC0983:\ 00000000000000000000000000000000 00000000000000000000000000000020:3AB4FB1D2B7BA376590A2C241D1F508D:\ 00000000000000000000000000000000 00000000000000000000000000000010:58B2431BC0BEDE02550F40238969EC78:\ 00000000000000000000000000000000 00000000000000000000000000000008:0253786E126504F0DAB90C48A30321DE:\ 00000000000000000000000000000000 00000000000000000000000000000004:200211214E7394DA2089B6ACD093ABE0:\ 00000000000000000000000000000000 00000000000000000000000000000002:0388DACE60B6A392F328C2B971B2FE78:\ 00000000000000000000000000000000 00000000000000000000000000000001:58E2FCCEFA7E3061367F1D57A4E7455A:\ 00000000000000000000000000000000 [AES-192] 00112233445566778899AABBCCDDEEFF:DDA97CA4864CDFE06EAF70A0EC0D7191:\ 000102030405060708090A0B0C0D0E0F1011121314151617 2D33EEF2C0430A8A9EBF45E809C40BB6:DFF4945E0336DF4C1C56BC700EFF837F:\ 00010203050607080A0B0C0D0F10111214151617191A1B1C 6AA375D1FA155A61FB72353E0A5A8756:B6FDDEF4752765E347D5D2DC196D1252:\ 1E1F20212324252628292A2B2D2E2F30323334353738393A BC3736518B9490DCB8ED60EB26758ED4:D23684E3D963B3AFCF1A114ACA90CBD6:\ 3C3D3E3F41424344464748494B4C4D4E5051525355565758 AA214402B46CFFB9F761EC11263A311E:3A7AC027753E2A18C2CEAB9E17C11FD0:\ 5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 02AEA86E572EEAB66B2C3AF5E9A46FD6:8F6786BD007528BA26603C1601CDD0D8:\ 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 E2AEF6ACC33B965C4FA1F91C75FF6F36:D17D073B01E71502E28B47AB551168B3:\ 969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 0659DF46427162B9434865DD9499F91D:A469DA517119FAB95876F41D06D40FFA:\ B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 49A44239C748FEB456F59C276A5658DF:6091AA3B695C11F5C0B6AD26D3D862FF:\ D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE 66208F6E9D04525BDEDB2733B6A6BE37:70F9E67F9F8DF1294131662DC6E69364:\ F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C 3393F8DFC729C97F5480B950BC9666B0:D154DCAFAD8B207FA5CBC95E9996B559:\ 0E0F10111314151618191A1B1D1E1F20222324252728292A 606834C8CE063F3234CF1145325DBD71:4934D541E8B46FA339C805A7AEB9E5DA:\ 2C2D2E2F31323334363738393B3C3D3E4041424345464748 FEC1C04F529BBD17D8CECFCC4718B17F:62564C738F3EFE186E1A127A0C4D3C61:\ 4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 32DF99B431ED5DC5ACF8CAF6DC6CE475:07805AA043986EB23693E23BEF8F3438:\ 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 7FDC2B746F3F665296943B83710D1F82:DF0B4931038BADE848DEE3B4B85AA44B:\ 868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 8FBA1510A3C5B87E2EAA3F7A91455CA2:592D5FDED76582E4143C65099309477C:\ A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 2C9B468B1C2EED92578D41B0716B223B:C9B8D6545580D3DFBCDD09B954ED4E92:\ C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE 0A2BBF0EFC6BC0034F8A03433FCA1B1A:5DCCD5D6EB7C1B42ACB008201DF707A0:\ E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC 25260E1F31F4104D387222E70632504B:A2A91682FFEB6ED1D34340946829E6F9:\ FEFE01010304050608090A0B0D0E0F10121314151718191A C527D25A49F08A5228D338642AE65137:E45D185B797000348D9267960A68435D:\ 1C1D1E1F21222324262728292B2C2D2E3031323335363738 3B49FC081432F5890D0E3D87E884A69E:45E060DAE5901CDA8089E10D4F4C246B:\ 3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 D173F9ED1E57597E166931DF2754A083:F6951AFACC0079A369C71FDCFF45DF50:\ 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 8C2B7CAFA5AFE7F13562DAEAE1ADEDE0:9E95E00F351D5B3AC3D0E22E626DDAD6:\ 767778797B7C7D7E80818283858687888A8B8C8D8F909192 AAF4EC8C1A815AEB826CAB741339532C:9CB566FF26D92DAD083B51FDC18C173C:\ 94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 40BE8C5D9108E663F38F1A2395279ECF:C9C82766176A9B228EB9A974A010B4FB:\ D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC 0C8AD9BC32D43E04716753AA4CFBE351:D8E26AA02945881D5137F1C1E1386E88:\ 2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 1407B1D5F87D63357C8DC7EBBAEBBFEE:C0E024CCD68FF5FFA4D139C355A77C55:\ 48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 E62734D1AE3378C4549E939E6F123416:0B18B3D16F491619DA338640DF391D43:\ 84858687898A8B8C8E8F90919394959698999A9B9D9E9FA0 5A752CFF2A176DB1A1DE77F2D2CDEE41:DBE09AC8F66027BF20CB6E434F252EFC:\ A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE A9C8C3A4EABEDC80C64730DDD018CD88:6D04E5E43C5B9CBE05FEB9606B6480FE:\ C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDC EE9B3DBBDB86180072130834D305999A:DD1D6553B96BE526D9FEE0FBD7176866:\ 1A1B1C1D1F20212224252627292A2B2C2E2F303133343536 A7FA8C3586B8EBDE7568EAD6F634A879:0260CA7E3F979FD015B0DD4690E16D2A:\ 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354 37E0F4A87F127D45AC936FE7AD88C10A:9893734DE10EDCC8A67C3B110B8B8CC6:\ 929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE 3F77D8B5D92BAC148E4E46F697A535C5:93B30B750516B2D18808D710C2EE84EF:\ 464748494B4C4D4E50515253555657585A5B5C5D5F606162 D25EBB686C40F7E2C4DA1014936571CA:16F65FA47BE3CB5E6DFE7C6C37016C0E:\ 828384858788898A8C8D8E8F91929394969798999B9C9D9E 4F1C769D1E5B0552C7ECA84DEA26A549:F3847210D5391E2360608E5ACB560581:\ A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBC 8548E2F882D7584D0FAFC54372B6633A:8754462CD223366D0753913E6AF2643D:\ BEBFC0C1C3C4C5C6C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA 87D7A336CB476F177CD2A51AF2A62CDF:1EA20617468D1B806A1FD58145462017:\ DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8 03B1FEAC668C4E485C1065DFC22B44EE:3B155D927355D737C6BE9DDA60136E2E:\ FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 BDA15E66819FA72D653A6866AA287962:26144F7B66DAA91B6333DBD3850502B3:\ 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334 4D0C7A0D2505B80BF8B62CEB12467F0A:E4F9A4AB52CED8134C649BF319EBCC90:\ 363738393B3C3D3E40414243454647484A4B4C4D4F505152 626D34C9429B37211330986466B94E5F:B9DDD29AC6128A6CAB121E34A4C62B36:\ 54555657595A5B5C5E5F60616364656668696A6B6D6E6F70 333C3E6BF00656B088A17E5FF0E7F60A:6FCDDAD898F2CE4EFF51294F5EAAF5C9:\ 727374757778797A7C7D7E7F81828384868788898B8C8D8E 687ED0CDC0D2A2BC8C466D05EF9D2891:C9A6FE2BF4028080BEA6F7FC417BD7E3:\ 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABAC 487830E78CC56C1693E64B2A6660C7B6:6A2026846D8609D60F298A9C0673127F:\ AEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA 7A48D6B7B52B29392AA2072A32B66160:2CB25C005E26EFEA44336C4C97A4240B:\ CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8 907320E64C8C5314D10F8D7A11C8618D:496967AB8680DDD73D09A0E4C7DCC8AA:\ EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 B561F2CA2D6E65A4A98341F3ED9FF533:D5AF94DE93487D1F3A8C577CB84A66A4:\ 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324 DF769380D212792D026F049E2E3E48EF:84BDAC569CAE2828705F267CC8376E90:\ 262728292B2C2D2E30313233353637383A3B3C3D3F404142 79F374BC445BDABF8FCCB8843D6054C6:F7401DDA5AD5AB712B7EB5D10C6F99B6:\ 44454647494A4B4C4E4F50515354555658595A5B5D5E5F60 4E02F1242FA56B05C68DBAE8FE44C9D6:1C9D54318539EBD4C3B5B7E37BF119F0:\ 626364656768696A6C6D6E6F71727374767778797B7C7D7E CF73C93CBFF57AC635A6F4AD2A4A1545:ACA572D65FB2764CFFD4A6ECA090EA0D:\ 80818283858687888A8B8C8D8F90919294959697999A9B9C 9923548E2875750725B886566784C625:36D9C627B8C2A886A10CCB36EAE3DFBB:\ 9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA 4888336B723A022C9545320F836A4207:010EDBF5981E143A81D646E597A4A568:\ BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8 F84D9A5561B0608B1160DEE000C41BA8:8DB44D538DC20CC2F40F3067FD298E60:\ DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 C23192A0418E30A19B45AE3E3625BF22:930EB53BC71E6AC4B82972BDCD5AAFB3:\ F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314 B84E0690B28B0025381AD82A15E501A7:6C42A81EDCBC9517CCD89C30C95597B4:\ 161718191B1C1D1E20212223252627282A2B2C2D2F303132 ACEF5E5C108876C4F06269F865B8F0B0:DA389847AD06DF19D76EE119C71E1DD3:\ 34353637393A3B3C3E3F40414344454648494A4B4D4E4F50 0F1B3603E0F5DDEA4548246153A5E064:E018FDAE13D3118F9A5D1A647A3F0462:\ 525354555758595A5C5D5E5F61626364666768696B6C6D6E FBB63893450D42B58C6D88CD3C1809E3:2AA65DB36264239D3846180FABDFAD20:\ 70717273757677787A7B7C7D7F80818284858687898A8B8C 4BEF736DF150259DAE0C91354E8A5F92:1472163E9A4F780F1CEB44B07ECF4FDB:\ 8E8F90919394959698999A9B9D9E9FA0A2A3A4A5A7A8A9AA 7D2D46242056EF13D3C3FC93C128F4C7:C8273FDC8F3A9F72E91097614B62397C:\ ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8 E9C1BA2DF415657A256EDB33934680FD:66C8427DCD733AAF7B3470CB7D976E3F:\ CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 E23EE277B0AA0A1DFB81F7527C3514F1:146131CB17F1424D4F8DA91E6F80C1D0:\ E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304 3E7445B0B63CAAF75E4A911E12106B4C:2610D0AD83659081AE085266A88770DC:\ 060708090B0C0D0E10111213151617181A1B1C1D1F202122 767774752023222544455A5BE6E1E0E3:38A2B5A974B0575C5D733917FB0D4570:\ 24252627292A2B2C2E2F30313334353638393A3B3D3E3F40 72737475717E7F7CE9E8EBEA696A6B6C:E21D401EBC60DE20D6C486E4F39A588B:\ 424344454748494A4C4D4E4F51525354565758595B5C5D5E DFDEDDDC25262728C9C8CFCEF1EEEFEC:E51D5F88C670B079C0CA1F0C2C4405A2:\ 60616263656667686A6B6C6D6F70717274757677797A7B7C FFFE0100707776755F5E5D5C7675746B:246A94788A642FB3D1B823C8762380C8:\ 7E7F80818384858688898A8B8D8E8F90929394959798999A E0E1E2E3424140479F9E9190292E2F2C:B80C391C5C41A4C3B30C68E0E3D7550F:\ 9C9D9E9FA1A2A3A4A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8 2120272690EFEEED3B3A39384E4D4C4B:B77C4754FC64EB9A1154A9AF0BB1F21C:\ BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 ECEDEEEF5350516EA1A0A7A6A3ACADAE:FB554DE520D159A06BF219FC7F34A02F:\ D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4 32333C3D25222320E9E8EBEACECDCCC3:A89FBA152D76B4927BEED160DDB76C57:\ F6F7F8F9FBFCFDFE00010203050607080A0B0C0D0F101112 40414243626160678A8BB4B511161714:5676EAB4A98D2E8473B3F3D46424247C:\ 14151617191A1B1C1E1F20212324252628292A2B2D2E2F30 94959293F5FAFBF81F1E1D1C7C7F7E79:4E8F068BD7EDE52A639036EC86C33568:\ 323334353738393A3C3D3E3F41424344464748494B4C4D4E BEBFBCBD191A1B14CFCEC9C8546B6A69:F0193C4D7AFF1791EE4C07EB4A1824FC:\ 50515253555657585A5B5C5D5F60616264656667696A6B6C 2C2D3233898E8F8CBBBAB9B8333031CE:AC8686EECA9BA761AFE82D67B928C33F:\ 6E6F70717374757678797A7B7D7E7F80828384858788898A 84858687BFBCBDBA37363938FDFAFBF8:5FAF8573E33B145B6A369CD3606AB2C9:\ 8C8D8E8F91929394969798999B9C9D9EA0A1A2A3A5A6A7A8 828384857669686B909192930B08090E:31587E9944AB1C16B844ECAD0DF2E7DA:\ AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 BEBFBCBD9695948B707176779E919093:D017FECD91148ABA37F6F3068AA67D8A:\ C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4 8B8A85846067666521202322D0D3D2DD:788EF2F021A73CBA2794B616078A8500:\ E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8FAFBFCFDFE010002 76777475F1F2F3F4F8F9E6E777707172:5D1EF20DCED6BCBC12131AC7C54788AA:\ 04050607090A0B0C0E0F10111314151618191A1B1D1E1F20 A4A5A2A34F404142B4B5B6B727242522:B3C8CF961FAF9EA05FDDE6D1E4D8F663:\ 222324252728292A2C2D2E2F31323334363738393B3C3D3E 94959697E1E2E3EC16171011839C9D9E:143075C70605861C7FAC6526199E459F:\ 40414243454647484A4B4C4D4F50515254555657595A5B5C 03023D3C06010003DEDFDCDDFFFCFDE2:A5AE12EADE9A87268D898BFC8FC0252A:\ 5E5F60616364656668696A6B6D6E6F70727374757778797A 10111213F1F2F3F4CECFC0C1DBDCDDDE:0924F7CF2E877A4819F5244A360DCEA9:\ 7C7D7E7F81828384868788898B8C8D8E9091929395969798 67666160724D4C4F1D1C1F1E73707176:3D9E9635AFCC3E291CC7AB3F27D1C99A:\ 9A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 E6E7E4E5A8ABAAD584858283909F9E9D:9D80FEEBF87510E2B8FB98BB54FD788C:\ B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4 71707F7E565150537D7C7F7E6162636C:5F9D1A082A1A37985F174002ECA01309:\ D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 64656667212223245555AAAA03040506:A390EBB1D1403930184A44B4876646E4:\ F4F5F6F7F9FAFBFCFEFE01010304050608090A0B0D0E0F10 9E9F9899ABA4A5A6CFCECDCC2B28292E:700FE918981C3195BB6C4BCB46B74E29:\ 121314151718191A1C1D1E1F21222324262728292B2C2D2E C7C6C5C4D1D2D3DC626364653A454447:907984406F7BF2D17FB1EB15B673D747:\ 30313233353637383A3B3C3D3F40414244454647494A4B4C F6F7E8E9E0E7E6E51D1C1F1E5B585966:C32A956DCFC875C2AC7C7CC8B8CC26E1:\ 4E4F50515354555658595A5B5D5E5F60626364656768696A BCBDBEBF5D5E5F5868696667F4F3F2F1:02646E2EBFA9B820CF8424E9B9B6EB51:\ 6C6D6E6F71727374767778797B7C7D7E8081828385868788 40414647B0AFAEAD9B9A99989B98999E:621FDA3A5BBD54C6D3C685816BD4EAD8:\ 8A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 69686B6A0201001F0F0E0908B4BBBAB9:D4E216040426DFAF18B152469BC5AC2F:\ A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4 C7C6C9C8D8DFDEDD5A5B5859BEBDBCB3:9D0635B9D33B6CDBD71F5D246EA17CC8:\ C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 DEDFDCDD787B7A7DFFFEE1E0B2B5B4B7:10ABAD1BD9BAE5448808765583A2CC1A:\ E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6F8F9FAFBFDFEFE00 4D4C4B4A606F6E6DD0D1D2D3FBF8F9FE:6891889E16544E355FF65A793C39C9A8:\ 020304050708090A0C0D0E0F11121314161718191B1C1D1E B7B6B5B4D7D4D5DAE5E4E3E2E1FEFFFC:CC735582E68072C163CD9DDF46B91279:\ 20212223252627282A2B2C2D2F30313234353637393A3B3C CECFB0B1F7F0F1F2AEAFACAD3E3D3C23:C5C68B9AEEB7F878DF578EFA562F9574:\ 3E3F40414344454648494A4B4D4E4F50525354555758595A CACBC8C9CDCECFC812131C1D494E4F4C:5F4764395A667A47D73452955D0D2CE8:\ 5C5D5E5F61626364666768696B6C6D6E7071727375767778 9D9C9B9AD22D2C2FB1B0B3B20C0F0E09:701448331F66106CEFDDF1EB8267C357:\ 7A7B7C7D7F80818284858687898A8B8C8E8F909193949596 7A7B787964676659959493924F404142:CB3EE56D2E14B4E1941666F13379D657:\ 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4 AAABA4A5CEC9C8CB1F1E1D1CABA8A9A6:9FE16EFD18AB6E1981191851FEDB0764:\ B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 93929190282B2A2DC4C5FAFB92959497:3DC9BA24E1B223589B147ADCEB4C8E48:\ D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6E8E9EAEBEDEEEFF0 EFEEE9E8DED1D0D339383B3A888B8A8D:1C333032682E7D4DE5E5AFC05C3E483C:\ F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E 7F7E7D7CA2A1A0AF78797E7F112E2F2C:D593CC99A95AFEF7E92038E05A59D00A:\ 10111213151617181A1B1C1D1F20212224252627292A2B2C 84859A9B2B2C2D2E868784852625245B:51E7F96F53B4353923452C222134E1EC:\ 2E2F30313334353638393A3B3D3E3F40424344454748494A B0B1B2B3070405026869666710171615:4075B357A1A2B473400C3B25F32F81A4:\ 4C4D4E4F51525354565758595B5C5D5E6061626365666768 ACADAAABBDA2A3A00D0C0F0E595A5B5C:302E341A3EBCD74F0D55F61714570284:\ 6A6B6C6D6F70717274757677797A7B7C7E7F808183848586 121310115655544B5253545569666764:57ABDD8231280DA01C5042B78CF76522:\ 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4 DEDFD0D166616063EAEBE8E94142434C:17F9EA7EEA17AC1ADF0E190FEF799E92:\ A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 DBDAD9D81417161166677879E0E7E6E5:2E1BDD563DD87EE5C338DD6D098D0A7A:\ C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6D8D9DADBDDDEDFE0 6A6B6C6DE0EFEEED2B2A2928C0C3C2C5:EB869996E6F8BFB2BFDD9E0C4504DBB2:\ E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE B1B0B3B21714151A1A1B1C1D5649484B:C2E01549E9DECF317468B3E018C61BA8:\ 00010203050607080A0B0C0D0F10111214151617191A1B1C 39380706A3A4A5A6C4C5C6C77271706F:8DA875D033C01DD463B244A1770F4A22:\ 1E1F20212324252628292A2B2D2E2F30323334353738393A 5C5D5E5F1013121539383736E2E5E4E7:8BA0DCF3A186844F026D022F8839D696:\ 3C3D3E3F41424344464748494B4C4D4E5051525355565758 43424544EAD5D4D72E2F2C2D64676661:E9691FF9A6CC6970E51670A0FD5B88C1:\ 5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 55545756989B9A65F8F9FEFF18171615:F2BAEC06FAEED30F88EE63BA081A6E5B:\ 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 05040B0A525554573C3D3E3F4A494847:9C39D4C459AE5753394D6094ADC21E78:\ 969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 14151617595A5B5C8584FBFA8E89888B:6345B532A11904502EA43BA99C6BD2B2:\ B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 7C7D7A7BFDF2F3F029282B2A51525354:5FFAE3061A95172E4070CEDCE1E428C8:\ D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE 38393A3B1E1D1C1341404746C23D3C3E:0A4566BE4CDF9ADCE5DEC865B5AB34CD:\ F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C 8D8C939240474645818083827C7F7E41:CA17FCCE79B7404F2559B22928F126FB:\ 0E0F10111314151618191A1B1D1E1F20222324252728292A 3B3A39381A19181F32333C3D45424340:97CA39B849ED73A6470A97C821D82F58:\ 2C2D2E2F31323334363738393B3C3D3E4041424345464748 F0F1F6F738272625828380817F7C7D7A:8198CB06BC684C6D3E9B7989428DCF7A:\ 4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 89888B8A0407061966676061141B1A19:F53C464C705EE0F28D9A4C59374928BD:\ 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 D3D2DDDCAAADACAF9C9D9E9FE8EBEAE5:9ADB3D4CCA559BB98C3E2ED73DBF1154:\ 868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 00000000000000000000000000000000:DE885DC87F5A92594082D02CC1E1B42C:\ 800000000000000000000000000000000000000000000000 00000000000000000000000000000000:C749194F94673F9DD2AA1932849630C1:\ 400000000000000000000000000000000000000000000000 00000000000000000000000000000000:0CEF643313912934D310297B90F56ECC:\ 200000000000000000000000000000000000000000000000 00000000000000000000000000000000:C4495D39D4A553B225FBA02A7B1B87E1:\ 100000000000000000000000000000000000000000000000 00000000000000000000000000000000:636D10B1A0BCAB541D680A7970ADC830:\ 080000000000000000000000000000000000000000000000 00000000000000000000000000000000:07CF045786BD6AFCC147D99E45A901A7:\ 040000000000000000000000000000000000000000000000 00000000000000000000000000000000:6A8E3F425A7599348F95398448827976:\ 020000000000000000000000000000000000000000000000 00000000000000000000000000000000:5518276836148A00D91089A20D8BFF57:\ 010000000000000000000000000000000000000000000000 00000000000000000000000000000000:F267E07B5E87E3BC20B969C61D4FCB06:\ 008000000000000000000000000000000000000000000000 00000000000000000000000000000000:5A1CDE69571D401BFCD20DEBADA2212C:\ 004000000000000000000000000000000000000000000000 00000000000000000000000000000000:70A9057263254701D12ADD7D74CD509E:\ 002000000000000000000000000000000000000000000000 00000000000000000000000000000000:35713A7E108031279388A33A0FE2E190:\ 001000000000000000000000000000000000000000000000 00000000000000000000000000000000:E74EDE82B1254714F0C7B4B243108655:\ 000800000000000000000000000000000000000000000000 00000000000000000000000000000000:39272E3100FAA37B55B862320D1B3EB3:\ 000400000000000000000000000000000000000000000000 00000000000000000000000000000000:6D6E24C659FC5AEF712F77BCA19C9DD0:\ 000200000000000000000000000000000000000000000000 00000000000000000000000000000000:76D18212F972370D3CC2C6C372C6CF2F:\ 000100000000000000000000000000000000000000000000 00000000000000000000000000000000:B21A1F0BAE39E55C7594ED570A7783EA:\ 000080000000000000000000000000000000000000000000 00000000000000000000000000000000:77DE202111895AC48DD1C974B358B458:\ 000040000000000000000000000000000000000000000000 00000000000000000000000000000000:67810B311969012AAF7B504FFAF39FD1:\ 000020000000000000000000000000000000000000000000 00000000000000000000000000000000:C22EA2344D3E9417A6BA07843E713AEA:\ 000010000000000000000000000000000000000000000000 00000000000000000000000000000000:C79CAF4B97BEE0BD0630AB354539D653:\ 000008000000000000000000000000000000000000000000 00000000000000000000000000000000:135FD1AF761D9AE23DF4AA6B86760DB4:\ 000004000000000000000000000000000000000000000000 00000000000000000000000000000000:D4659D0B06ACD4D56AB8D11A16FD83B9:\ 000002000000000000000000000000000000000000000000 00000000000000000000000000000000:F7D270028FC188E4E4F35A4AAA25D4D4:\ 000001000000000000000000000000000000000000000000 00000000000000000000000000000000:345CAE5A8C9620A9913D5473985852FF:\ 000000800000000000000000000000000000000000000000 00000000000000000000000000000000:4E8980ADDE60B0E42C0B287FEA41E729:\ 000000400000000000000000000000000000000000000000 00000000000000000000000000000000:F11B6D74E1F15155633DC39743C1A527:\ 000000200000000000000000000000000000000000000000 00000000000000000000000000000000:9C87916C0180064F9D3179C6F5DD8C35:\ 000000100000000000000000000000000000000000000000 00000000000000000000000000000000:71AB186BCAEA518E461D4F7FAD230E6A:\ 000000080000000000000000000000000000000000000000 00000000000000000000000000000000:C4A31BBC3DAAF742F9141C2A5001A49C:\ 000000040000000000000000000000000000000000000000 00000000000000000000000000000000:E7C47B7B1D40F182A8928C8A55671D07:\ 000000020000000000000000000000000000000000000000 00000000000000000000000000000000:8E17F294B28FA373C6249538868A7EEF:\ 000000010000000000000000000000000000000000000000 00000000000000000000000000000000:754404096A5CBC08AF09491BE249141A:\ 000000008000000000000000000000000000000000000000 00000000000000000000000000000000:101CB56E55F05D86369B6D1069204F0A:\ 000000004000000000000000000000000000000000000000 00000000000000000000000000000000:73F19BB6604205C6EE227B9759791E41:\ 000000002000000000000000000000000000000000000000 00000000000000000000000000000000:6270C0028F0D136C37A56B2CB64D24D6:\ 000000001000000000000000000000000000000000000000 00000000000000000000000000000000:A3BF7C2C38D1114A087ECF212E694346:\ 000000000800000000000000000000000000000000000000 00000000000000000000000000000000:49CABFF2CEF7D9F95F5EFB1F7A1A7DDE:\ 000000000400000000000000000000000000000000000000 00000000000000000000000000000000:EC7F8A47CC59B849469255AD49F62752:\ 000000000200000000000000000000000000000000000000 00000000000000000000000000000000:68FAE55A13EFAF9B07B3552A8A0DC9D1:\ 000000000100000000000000000000000000000000000000 00000000000000000000000000000000:211E6B19C69FAEF481F64F24099CDA65:\ 000000000080000000000000000000000000000000000000 00000000000000000000000000000000:DBB918C75BC5732416F79FB0C8EE4C5C:\ 000000000040000000000000000000000000000000000000 00000000000000000000000000000000:98D494E5D963A6C8B92536D3EC35E3FD:\ 000000000020000000000000000000000000000000000000 00000000000000000000000000000000:C9A873404D403D6F074190851D67781A:\ 000000000010000000000000000000000000000000000000 00000000000000000000000000000000:073AEF4A7C77D921928CB0DD9D27CAE7:\ 000000000008000000000000000000000000000000000000 00000000000000000000000000000000:89BDE25CEE36FDE769A10E52298CF90F:\ 000000000004000000000000000000000000000000000000 00000000000000000000000000000000:26D0842D37EAD38557C65E0A5E5F122E:\ 000000000002000000000000000000000000000000000000 00000000000000000000000000000000:F8294BA375AF46B3F22905BBAFFAB107:\ 000000000001000000000000000000000000000000000000 00000000000000000000000000000000:2AD63EB4D0D43813B979CF72B35BDB94:\ 000000000000800000000000000000000000000000000000 00000000000000000000000000000000:7710C171EE0F4EFA39BE4C995180181D:\ 000000000000400000000000000000000000000000000000 00000000000000000000000000000000:C0CB2B40DBA7BE8C0698FAE1E4B80FF8:\ 000000000000200000000000000000000000000000000000 00000000000000000000000000000000:97970E505194622FD955CA1B80B784E9:\ 000000000000100000000000000000000000000000000000 00000000000000000000000000000000:7CB1824B29F850900DF2CAD9CF04C1CF:\ 000000000000080000000000000000000000000000000000 00000000000000000000000000000000:FDF4F036BB988E42F2F62DE63FE19A64:\ 000000000000040000000000000000000000000000000000 00000000000000000000000000000000:08908CFE2C82606B2C15DF61B75CF3E2:\ 000000000000020000000000000000000000000000000000 00000000000000000000000000000000:B3AA689EF2D07FF365ACB9ADBA2AF07A:\ 000000000000010000000000000000000000000000000000 00000000000000000000000000000000:F2672CD8EAA3B98776660D0263656F5C:\ 000000000000008000000000000000000000000000000000 00000000000000000000000000000000:5BDEAC00E986687B9E1D94A0DA7BF452:\ 000000000000004000000000000000000000000000000000 00000000000000000000000000000000:E6D57BD66EA1627363EE0C4B711B0B21:\ 000000000000002000000000000000000000000000000000 00000000000000000000000000000000:03730DD6ACB4AD9996A63BE7765EC06F:\ 000000000000001000000000000000000000000000000000 00000000000000000000000000000000:A470E361AA5437B2BE8586D2F78DE582:\ 000000000000000800000000000000000000000000000000 00000000000000000000000000000000:7567FEEFA559911FD479670246B484E3:\ 000000000000000400000000000000000000000000000000 00000000000000000000000000000000:29829DEA15A4E7A4C049045E7B106E29:\ 000000000000000200000000000000000000000000000000 00000000000000000000000000000000:A407834C3D89D48A2CB7A152208FA4ED:\ 000000000000000100000000000000000000000000000000 00000000000000000000000000000000:68F948053F78FEF0D8F9FE7EF3A89819:\ 000000000000000080000000000000000000000000000000 00000000000000000000000000000000:B605174CAB13AD8FE3B20DA3AE7B0234:\ 000000000000000040000000000000000000000000000000 00000000000000000000000000000000:CCAB8F0AEBFF032893996D383CBFDBFA:\ 000000000000000020000000000000000000000000000000 00000000000000000000000000000000:AF14BB8428C9730B7DC17B6C1CBEBCC8:\ 000000000000000010000000000000000000000000000000 00000000000000000000000000000000:5A41A21332040877EB7B89E8E80D19FE:\ 000000000000000008000000000000000000000000000000 00000000000000000000000000000000:AC1BA52EFCDDE368B1596F2F0AD893A0:\ 000000000000000004000000000000000000000000000000 00000000000000000000000000000000:41B890E31B9045E6ECDC1BC3F2DB9BCC:\ 000000000000000002000000000000000000000000000000 00000000000000000000000000000000:4D54A549728E55B19A23660424A0F146:\ 000000000000000001000000000000000000000000000000 00000000000000000000000000000000:A917581F41C47C7DDCFFD5285E2D6A61:\ 000000000000000000800000000000000000000000000000 00000000000000000000000000000000:604DF24BA6099B93A7405A524D764FCB:\ 000000000000000000400000000000000000000000000000 00000000000000000000000000000000:78D9D156F28B190E232D1B7AE7FC730A:\ 000000000000000000200000000000000000000000000000 00000000000000000000000000000000:5A12C39E442CD7F27B3CD77F5D029582:\ 000000000000000000100000000000000000000000000000 00000000000000000000000000000000:FF2BF2F47CF7B0F28EE25AF95DBF790D:\ 000000000000000000080000000000000000000000000000 00000000000000000000000000000000:1863BB7D193BDA39DF090659EB8AE48B:\ 000000000000000000040000000000000000000000000000 00000000000000000000000000000000:38178F2FB4CFCF31E87E1ABCDC023EB5:\ 000000000000000000020000000000000000000000000000 00000000000000000000000000000000:F5B13DC690CC0D541C6BA533023DC8C9:\ 000000000000000000010000000000000000000000000000 00000000000000000000000000000000:48EC05238D7375D126DC9D08884D4827:\ 000000000000000000008000000000000000000000000000 00000000000000000000000000000000:ACD0D81139691B310B92A6E377BACC87:\ 000000000000000000004000000000000000000000000000 00000000000000000000000000000000:9A4AA43578B55CE9CC178F0D2E162C79:\ 000000000000000000002000000000000000000000000000 00000000000000000000000000000000:08AD94BC737DB3C87D49B9E01B720D81:\ 000000000000000000001000000000000000000000000000 00000000000000000000000000000000:3BCFB2D5D210E8332900C5991D551A2A:\ 000000000000000000000800000000000000000000000000 00000000000000000000000000000000:C5F0C6B9397ACB29635CE1A0DA2D8D96:\ 000000000000000000000400000000000000000000000000 00000000000000000000000000000000:844A29EFC693E2FA9900F87FBF5DCD5F:\ 000000000000000000000200000000000000000000000000 00000000000000000000000000000000:5126A1C41051FEA158BE41200E1EA59D:\ 000000000000000000000100000000000000000000000000 00000000000000000000000000000000:302123CA7B4F46D667FFFB0EB6AA7703:\ 000000000000000000000080000000000000000000000000 00000000000000000000000000000000:A9D16BCE7DB5C024277709EE2A88D91A:\ 000000000000000000000040000000000000000000000000 00000000000000000000000000000000:F013C5EC123A26CFC34B598C992A996B:\ 000000000000000000000020000000000000000000000000 00000000000000000000000000000000:E38A825CD971A1D2E56FB1DBA248F2A8:\ 000000000000000000000010000000000000000000000000 00000000000000000000000000000000:6E701773C0311E0BD4C5A097406D22B3:\ 000000000000000000000008000000000000000000000000 00000000000000000000000000000000:754262CEF0C64BE4C3E67C35ABE439F7:\ 000000000000000000000004000000000000000000000000 00000000000000000000000000000000:C9C2D4C47DF7D55CFA0EE5F1FE5070F4:\ 000000000000000000000002000000000000000000000000 00000000000000000000000000000000:6AB4BEA85B172573D8BD2D5F4329F13D:\ 000000000000000000000001000000000000000000000000 00000000000000000000000000000000:11F03EF28E2CC9AE5165C587F7396C8C:\ 000000000000000000000000800000000000000000000000 00000000000000000000000000000000:0682F2EB1A68BAC7949922C630DD27FA:\ 000000000000000000000000400000000000000000000000 00000000000000000000000000000000:ABB0FEC0413D659AFE8E3DCF6BA873BB:\ 000000000000000000000000200000000000000000000000 00000000000000000000000000000000:FE86A32E19F805D6569B2EFADD9C92AA:\ 000000000000000000000000100000000000000000000000 00000000000000000000000000000000:E434E472275D1837D3D717F2EECC88C3:\ 000000000000000000000000080000000000000000000000 00000000000000000000000000000000:74E57DCD12A21D26EF8ADAFA5E60469A:\ 000000000000000000000000040000000000000000000000 00000000000000000000000000000000:C275429D6DAD45DDD423FA63C816A9C1:\ 000000000000000000000000020000000000000000000000 00000000000000000000000000000000:7F6EC1A9AE729E86F7744AED4B8F4F07:\ 000000000000000000000000010000000000000000000000 00000000000000000000000000000000:48B5A71AB9292BD4F9E608EF102636B2:\ 000000000000000000000000008000000000000000000000 00000000000000000000000000000000:076FB95D5F536C78CBED3181BCCF3CF1:\ 000000000000000000000000004000000000000000000000 00000000000000000000000000000000:BFA76BEA1E684FD3BF9256119EE0BC0F:\ 000000000000000000000000002000000000000000000000 00000000000000000000000000000000:7D395923D56577F3FF8670998F8C4A71:\ 000000000000000000000000001000000000000000000000 00000000000000000000000000000000:BA02C986E529AC18A882C34BA389625F:\ 000000000000000000000000000800000000000000000000 00000000000000000000000000000000:3DFCF2D882AFE75D3A191193013A84B5:\ 000000000000000000000000000400000000000000000000 00000000000000000000000000000000:FAD1FDE1D0241784B63080D2C74D236C:\ 000000000000000000000000000200000000000000000000 00000000000000000000000000000000:7D6C80D39E41F007A14FB9CD2B2C15CD:\ 000000000000000000000000000100000000000000000000 00000000000000000000000000000000:7975F401FC10637BB33EA2DB058FF6EC:\ 000000000000000000000000000080000000000000000000 00000000000000000000000000000000:657983865C55A818F02B7FCD52ED7E99:\ 000000000000000000000000000040000000000000000000 00000000000000000000000000000000:B32BEB1776F9827FF4C3AC9997E84B20:\ 000000000000000000000000000020000000000000000000 00000000000000000000000000000000:2AE2C7C374F0A41E3D46DBC3E66BB59F:\ 000000000000000000000000000010000000000000000000 00000000000000000000000000000000:4D835E4ABDD4BDC6B88316A6E931A07F:\ 000000000000000000000000000008000000000000000000 00000000000000000000000000000000:E07EFABFF1C353F7384EBB87B435A3F3:\ 000000000000000000000000000004000000000000000000 00000000000000000000000000000000:ED3088DC3FAF89AD87B4356FF1BB09C2:\ 000000000000000000000000000002000000000000000000 00000000000000000000000000000000:4324D01140C156FC898C2E32BA03FB05:\ 000000000000000000000000000001000000000000000000 00000000000000000000000000000000:BE15D016FACB5BAFBC24FA9289132166:\ 000000000000000000000000000000800000000000000000 00000000000000000000000000000000:AC9B7048EDB1ACF4D97A5B0B3F50884B:\ 000000000000000000000000000000400000000000000000 00000000000000000000000000000000:448BECE1F86C7845DFA9A4BB2A016FB3:\ 000000000000000000000000000000200000000000000000 00000000000000000000000000000000:10DD445E87686EB46EA9B1ABC49257F0:\ 000000000000000000000000000000100000000000000000 00000000000000000000000000000000:B7FCCF7659FA756D4B7303EEA6C07458:\ 000000000000000000000000000000080000000000000000 00000000000000000000000000000000:289117115CA3513BAA7640B1004872C2:\ 000000000000000000000000000000040000000000000000 00000000000000000000000000000000:57CB42F7EE7186051F50B93FFA7B35BF:\ 000000000000000000000000000000020000000000000000 00000000000000000000000000000000:F2741BFBFB81663B9136802FB9C3126A:\ 000000000000000000000000000000010000000000000000 00000000000000000000000000000000:E32DDDC5C7398C096E3BD535B31DB5CE:\ 000000000000000000000000000000008000000000000000 00000000000000000000000000000000:81D3C204E608AF9CC713EAEBCB72433F:\ 000000000000000000000000000000004000000000000000 00000000000000000000000000000000:D4DEEF4BFC36AAA579496E6935F8F98E:\ 000000000000000000000000000000002000000000000000 00000000000000000000000000000000:C356DB082B97802B038571C392C5C8F6:\ 000000000000000000000000000000001000000000000000 00000000000000000000000000000000:A3919ECD4861845F2527B77F06AC6A4E:\ 000000000000000000000000000000000800000000000000 00000000000000000000000000000000:A53858E17A2F802A20E40D44494FFDA0:\ 000000000000000000000000000000000400000000000000 00000000000000000000000000000000:5D989E122B78C758921EDBEEB827F0C0:\ 000000000000000000000000000000000200000000000000 00000000000000000000000000000000:4B1C0C8F9E7830CC3C4BE7BD226FA8DE:\ 000000000000000000000000000000000100000000000000 00000000000000000000000000000000:82C40C5FD897FBCA7B899C70713573A1:\ 000000000000000000000000000000000080000000000000 00000000000000000000000000000000:ED13EE2D45E00F75CCDB51EA8E3E36AD:\ 000000000000000000000000000000000040000000000000 00000000000000000000000000000000:F121799EEFE8432423176A3CCF6462BB:\ 000000000000000000000000000000000020000000000000 00000000000000000000000000000000:4FA0C06F07997E98271DD86F7B355C50:\ 000000000000000000000000000000000010000000000000 00000000000000000000000000000000:849EB364B4E81D058649DC5B1BF029B9:\ 000000000000000000000000000000000008000000000000 00000000000000000000000000000000:F48F9E0DE8DE7AD944A207809335D9B1:\ 000000000000000000000000000000000004000000000000 00000000000000000000000000000000:E59E9205B5A81A4FD26DFCF308966022:\ 000000000000000000000000000000000002000000000000 00000000000000000000000000000000:3A91A1BE14AAE9ED700BDF9D70018804:\ 000000000000000000000000000000000001000000000000 00000000000000000000000000000000:8ABAD78DCB79A48D79070E7DA89664EC:\ 000000000000000000000000000000000000800000000000 00000000000000000000000000000000:B68377D98AAE6044938A7457F6C649D9:\ 000000000000000000000000000000000000400000000000 00000000000000000000000000000000:E4E1275C42F5F1B63D662C099D6CE33D:\ 000000000000000000000000000000000000200000000000 00000000000000000000000000000000:7DEF32A34C6BE668F17DA1BB193B06EF:\ 000000000000000000000000000000000000100000000000 00000000000000000000000000000000:78B6000CC3D30CB3A74B68D0EDBD2B53:\ 000000000000000000000000000000000000080000000000 00000000000000000000000000000000:0A47531DE88DD8AE5C23EAE4F7D1F2D5:\ 000000000000000000000000000000000000040000000000 00000000000000000000000000000000:667B24E8000CF68231EC484581D922E5:\ 000000000000000000000000000000000000020000000000 00000000000000000000000000000000:39DAA5EBD4AACAE130E9C33236C52024:\ 000000000000000000000000000000000000010000000000 00000000000000000000000000000000:E3C88760B3CB21360668A63E55BB45D1:\ 000000000000000000000000000000000000008000000000 00000000000000000000000000000000:F131EE903C1CDB49D416866FD5D8DE51:\ 000000000000000000000000000000000000004000000000 00000000000000000000000000000000:7A1916135B0447CF4033FC13047A583A:\ 000000000000000000000000000000000000002000000000 00000000000000000000000000000000:F7D55FB27991143DCDFA90DDF0424FCB:\ 000000000000000000000000000000000000001000000000 00000000000000000000000000000000:EA93E7D1CA1111DBD8F7EC111A848C0C:\ 000000000000000000000000000000000000000800000000 00000000000000000000000000000000:2A689E39DFD3CBCBE221326E95888779:\ 000000000000000000000000000000000000000400000000 00000000000000000000000000000000:C1CE399CA762318AC2C40D1928B4C57D:\ 000000000000000000000000000000000000000200000000 00000000000000000000000000000000:D43FB6F2B2879C8BFAF0092DA2CA63ED:\ 000000000000000000000000000000000000000100000000 00000000000000000000000000000000:224563E617158DF97650AF5D130E78A5:\ 000000000000000000000000000000000000000080000000 00000000000000000000000000000000:6562FDF6833B7C4F7484AE6EBCC243DD:\ 000000000000000000000000000000000000000040000000 00000000000000000000000000000000:93D58BA7BED22615D661D002885A7457:\ 000000000000000000000000000000000000000020000000 00000000000000000000000000000000:9A0EF559003AD9E52D3E09ED3C1D3320:\ 000000000000000000000000000000000000000010000000 00000000000000000000000000000000:96BAF5A7DC6F3DD27EB4C717A85D261C:\ 000000000000000000000000000000000000000008000000 00000000000000000000000000000000:B8762E06884900E8452293190E19CCDB:\ 000000000000000000000000000000000000000004000000 00000000000000000000000000000000:785416A22BD63CBABF4B1789355197D3:\ 000000000000000000000000000000000000000002000000 00000000000000000000000000000000:A0D20CE1489BAA69A3612DCE90F7ABF6:\ 000000000000000000000000000000000000000001000000 00000000000000000000000000000000:700244E93DC94230CC607FFBA0E48F32:\ 000000000000000000000000000000000000000000800000 00000000000000000000000000000000:85329E476829F872A2B4A7E59F91FF2D:\ 000000000000000000000000000000000000000000400000 00000000000000000000000000000000:E4219B4935D988DB719B8B8B2B53D247:\ 000000000000000000000000000000000000000000200000 00000000000000000000000000000000:6ACDD04FD13D4DB4409FE8DD13FD737B:\ 000000000000000000000000000000000000000000100000 00000000000000000000000000000000:9EB7A670AB59E15BE582378701C1EC14:\ 000000000000000000000000000000000000000000080000 00000000000000000000000000000000:29DF2D6935FE657763BC7A9F22D3D492:\ 000000000000000000000000000000000000000000040000 00000000000000000000000000000000:99303359D4A13AFDBE6C784028CE533A:\ 000000000000000000000000000000000000000000020000 00000000000000000000000000000000:FF5C70A6334545F33B9DBF7BEA0417CA:\ 000000000000000000000000000000000000000000010000 00000000000000000000000000000000:289F58A17E4C50EDA4269EFB3DF55815:\ 000000000000000000000000000000000000000000008000 00000000000000000000000000000000:EA35DCB416E9E1C2861D1682F062B5EB:\ 000000000000000000000000000000000000000000004000 00000000000000000000000000000000:3A47BF354BE775383C50B0C0A83E3A58:\ 000000000000000000000000000000000000000000002000 00000000000000000000000000000000:BF6C1DC069FB95D05D43B01D8206D66B:\ 000000000000000000000000000000000000000000001000 00000000000000000000000000000000:046D1D580D5898DA6595F32FD1F0C33D:\ 000000000000000000000000000000000000000000000800 00000000000000000000000000000000:5F57803B7B82A110F7E9855D6A546082:\ 000000000000000000000000000000000000000000000400 00000000000000000000000000000000:25336ECF34E7BE97862CDFF715FF05A8:\ 000000000000000000000000000000000000000000000200 00000000000000000000000000000000:ACBAA2A943D8078022D693890E8C4FEF:\ 000000000000000000000000000000000000000000000100 00000000000000000000000000000000:3947597879F6B58E4E2F0DF825A83A38:\ 000000000000000000000000000000000000000000000080 00000000000000000000000000000000:4EB8CC3335496130655BF3CA570A4FC0:\ 000000000000000000000000000000000000000000000040 00000000000000000000000000000000:BBDA7769AD1FDA425E18332D97868824:\ 000000000000000000000000000000000000000000000020 00000000000000000000000000000000:5E7532D22DDB0829A29C868198397154:\ 000000000000000000000000000000000000000000000010 00000000000000000000000000000000:E66DA67B630AB7AE3E682855E1A1698E:\ 000000000000000000000000000000000000000000000008 00000000000000000000000000000000:4D93800F671B48559A64D1EA030A590A:\ 000000000000000000000000000000000000000000000004 00000000000000000000000000000000:F33159FCC7D9AE30C062CD3B322AC764:\ 000000000000000000000000000000000000000000000002 00000000000000000000000000000000:8BAE4EFB70D33A9792EEA9BE70889D72:\ 000000000000000000000000000000000000000000000001 80000000000000000000000000000000:6CD02513E8D4DC986B4AFE087A60BD0C:\ 000000000000000000000000000000000000000000000000 40000000000000000000000000000000:423D2772A0CA56DAABB48D2129062987:\ 000000000000000000000000000000000000000000000000 20000000000000000000000000000000:1021F2A8DA70EB2219DC16804445FF98:\ 000000000000000000000000000000000000000000000000 10000000000000000000000000000000:C636E35B402577F96974D8804295EBB8:\ 000000000000000000000000000000000000000000000000 08000000000000000000000000000000:1566D2E57E8393C19E29F892EA28A9A7:\ 000000000000000000000000000000000000000000000000 04000000000000000000000000000000:883C878FED70B36CC09D040F9619DD19:\ 000000000000000000000000000000000000000000000000 02000000000000000000000000000000:06734593A974965790E715594FC34AA9:\ 000000000000000000000000000000000000000000000000 01000000000000000000000000000000:F19B389948D9A45534E5BD36C984134A:\ 000000000000000000000000000000000000000000000000 00800000000000000000000000000000:D8410DFC14FA6D175EC968EA8CAC514C:\ 000000000000000000000000000000000000000000000000 00400000000000000000000000000000:7E6C6EBB4029A177CF7B2FDD9AC6BB7A:\ 000000000000000000000000000000000000000000000000 00200000000000000000000000000000:4B51DD4850DC0A6C3A46D924003D2C27:\ 000000000000000000000000000000000000000000000000 00100000000000000000000000000000:2E510A9D917B15BE32A192B12A668F23:\ 000000000000000000000000000000000000000000000000 00080000000000000000000000000000:88F6F79962B0FB77FEA8E7C632D3108E:\ 000000000000000000000000000000000000000000000000 00040000000000000000000000000000:A3A35AB1D88DAF07B52794A0F065383A:\ 000000000000000000000000000000000000000000000000 00020000000000000000000000000000:DC6CC878433E2B3BB193049A4ECBFC53:\ 000000000000000000000000000000000000000000000000 00010000000000000000000000000000:EFCD3763EB7B1A415938248A9A5B4FD5:\ 000000000000000000000000000000000000000000000000 00008000000000000000000000000000:AB7E9FB9A66DBE5BB44854F07D9015EE:\ 000000000000000000000000000000000000000000000000 00004000000000000000000000000000:8B8E9D3365F8F6743ECF7E33E99255A4:\ 000000000000000000000000000000000000000000000000 00002000000000000000000000000000:54D37B4F176FF3D8F6AFC866066D8572:\ 000000000000000000000000000000000000000000000000 00001000000000000000000000000000:E83310889480FBF3C00342E3126D0D02:\ 000000000000000000000000000000000000000000000000 00000800000000000000000000000000:D321AB2511F92F098174AA2DE6E85DA2:\ 000000000000000000000000000000000000000000000000 00000400000000000000000000000000:D8E3F40B1112D5149D58C481DFA9983F:\ 000000000000000000000000000000000000000000000000 00000200000000000000000000000000:2454C4E0806639DDF19854D6C68054AD:\ 000000000000000000000000000000000000000000000000 00000100000000000000000000000000:A5506D410F7CA32F3955DD79D9D09418:\ 000000000000000000000000000000000000000000000000 00000080000000000000000000000000:7908EE40677699568A7DC1AA317C7E4E:\ 000000000000000000000000000000000000000000000000 00000040000000000000000000000000:B4B7B29DD43B2F5CF765E25192273982:\ 000000000000000000000000000000000000000000000000 00000020000000000000000000000000:92AFE9668159BEFFE2A86F8503260164:\ 000000000000000000000000000000000000000000000000 00000010000000000000000000000000:5C36A232FBA6D187A84657AD4028B18F:\ 000000000000000000000000000000000000000000000000 00000008000000000000000000000000:A2E994DFAB3A798DF8F54F6DA87E58E2:\ 000000000000000000000000000000000000000000000000 00000004000000000000000000000000:6CDAB10A72ADF77D71D0765BAAE95631:\ 000000000000000000000000000000000000000000000000 00000002000000000000000000000000:9FE3C801BCAAF7BB800F2E6BF3278E21:\ 000000000000000000000000000000000000000000000000 00000001000000000000000000000000:B459D90D9A6C392E5493BC91CF5A0863:\ 000000000000000000000000000000000000000000000000 00000000800000000000000000000000:0518A9FA5007F6787E0FB4E5AC27D758:\ 000000000000000000000000000000000000000000000000 00000000400000000000000000000000:BED9795415D28599700ED7952384A963:\ 000000000000000000000000000000000000000000000000 00000000200000000000000000000000:F0140421173D60251EF6CAB0229B1B50:\ 000000000000000000000000000000000000000000000000 00000000100000000000000000000000:460EB4652B3F6779EA28CB11B37529ED:\ 000000000000000000000000000000000000000000000000 00000000080000000000000000000000:C4283D351C960A6AC13CD19CCF03AE38:\ 000000000000000000000000000000000000000000000000 00000000040000000000000000000000:6815A10047B2C834A798EBDCC6786C75:\ 000000000000000000000000000000000000000000000000 00000000020000000000000000000000:99BA19F0CDD5990D0386B32CE56C9C4C:\ 000000000000000000000000000000000000000000000000 00000000010000000000000000000000:DE76F62C61E07915162DA13E79679DEC:\ 000000000000000000000000000000000000000000000000 00000000008000000000000000000000:DD0325D6854803D06D1D2277D5FB8D67:\ 000000000000000000000000000000000000000000000000 00000000004000000000000000000000:580B71A41DE37D6FAC83CCB0B3BB1C97:\ 000000000000000000000000000000000000000000000000 00000000002000000000000000000000:E9B1AB470A1B02EF0FF5E6754A092C96:\ 000000000000000000000000000000000000000000000000 00000000001000000000000000000000:8590620F5AF5993B7410282F4126BC1F:\ 000000000000000000000000000000000000000000000000 00000000000800000000000000000000:8D4914D2F1B22B2E268E66E532D29D7C:\ 000000000000000000000000000000000000000000000000 00000000000400000000000000000000:FD826CE48E62C5E30867044B86BA4B56:\ 000000000000000000000000000000000000000000000000 00000000000200000000000000000000:100E7B831C9F35FA1271F5F1316C6FCF:\ 000000000000000000000000000000000000000000000000 00000000000100000000000000000000:0A2DD0C17F68B996AA96C007003D0B31:\ 000000000000000000000000000000000000000000000000 00000000000080000000000000000000:C95F68C57E06B0A2E1F623C83C5D80BF:\ 000000000000000000000000000000000000000000000000 00000000000040000000000000000000:571CAFC92C7C8A5EC54C0741E186905C:\ 000000000000000000000000000000000000000000000000 00000000000020000000000000000000:22514353E95312C112255E1EED0B2DF6:\ 000000000000000000000000000000000000000000000000 00000000000010000000000000000000:791A8BF462BD17580BD9152C6D11C6C5:\ 000000000000000000000000000000000000000000000000 00000000000008000000000000000000:5882A0178D548F84A165DB809C60DC28:\ 000000000000000000000000000000000000000000000000 00000000000004000000000000000000:3CE4A90EED4458CA6039E42DDADB71C3:\ 000000000000000000000000000000000000000000000000 00000000000002000000000000000000:D3CBAB261207A16BE2751E77044FD7C9:\ 000000000000000000000000000000000000000000000000 00000000000001000000000000000000:24E32B698A7B32217093628B01F424AB:\ 000000000000000000000000000000000000000000000000 00000000000000800000000000000000:9F6AFC0AF27CF565110C77E3C24F4F5B:\ 000000000000000000000000000000000000000000000000 00000000000000400000000000000000:E088AA5CDA20EF267BB039B00C72C45B:\ 000000000000000000000000000000000000000000000000 00000000000000200000000000000000:5CF1018B7E0BA1775601C2E279900360:\ 000000000000000000000000000000000000000000000000 00000000000000100000000000000000:3B1A7388B89FB9416AD8753CF5AF35D2:\ 000000000000000000000000000000000000000000000000 00000000000000080000000000000000:137FA4ED00AFCD9F5D8BC0D14BD5837A:\ 000000000000000000000000000000000000000000000000 00000000000000040000000000000000:806F5C9B663559BB56F234881E4A3E60:\ 000000000000000000000000000000000000000000000000 00000000000000020000000000000000:8069A449152292DF2DE8642992C632B6:\ 000000000000000000000000000000000000000000000000 00000000000000010000000000000000:37C6CF2A1ABD1B1F1922B46C7B4A280D:\ 000000000000000000000000000000000000000000000000 00000000000000008000000000000000:7A2835260E5A0AA2B5DC301800EC8438:\ 000000000000000000000000000000000000000000000000 00000000000000004000000000000000:EE81FAF2F9058213FFCACF281CB8509E:\ 000000000000000000000000000000000000000000000000 00000000000000002000000000000000:57F22D93C37129BA331FDBA38E005A1E:\ 000000000000000000000000000000000000000000000000 00000000000000001000000000000000:EC798782E87B7D9F780CC3C3A46519B5:\ 000000000000000000000000000000000000000000000000 00000000000000000800000000000000:43EA28497F5D40E3A4744FA2EDAA42DE:\ 000000000000000000000000000000000000000000000000 00000000000000000400000000000000:91F004E7DEBF41B3414DD8C5C317372C:\ 000000000000000000000000000000000000000000000000 00000000000000000200000000000000:C249EAE54E7B4DF43B938C1B4CC28314:\ 000000000000000000000000000000000000000000000000 00000000000000000100000000000000:32C289D7EEFB99D2F17AD7B7D45FE1EC:\ 000000000000000000000000000000000000000000000000 00000000000000000080000000000000:A675FB2E8DDBF810CEF01CF2B728CD2B:\ 000000000000000000000000000000000000000000000000 00000000000000000040000000000000:A418AAAB6E6921CC731AA8A349386080:\ 000000000000000000000000000000000000000000000000 00000000000000000020000000000000:2E2B0F44863E67D9B0215C4ABD60417F:\ 000000000000000000000000000000000000000000000000 00000000000000000010000000000000:F0AF7CB19E911D481F6426DAEFDD2240:\ 000000000000000000000000000000000000000000000000 00000000000000000008000000000000:CB1304DAAA2DF6878F56AC2E0F887E04:\ 000000000000000000000000000000000000000000000000 00000000000000000004000000000000:B1B70A7E6A0CD1916D9B78BEA19084AE:\ 000000000000000000000000000000000000000000000000 00000000000000000002000000000000:0CDE9F9BE646A5FCE3436B794A9CFC65:\ 000000000000000000000000000000000000000000000000 00000000000000000001000000000000:68C7946D476A0A36674B36AFD7E5DF33:\ 000000000000000000000000000000000000000000000000 00000000000000000000800000000000:48770159A07DD8DFFF06C80105F8D57C:\ 000000000000000000000000000000000000000000000000 00000000000000000000400000000000:665E62801B3260E3C45BD3BE34DFDEBE:\ 000000000000000000000000000000000000000000000000 00000000000000000000200000000000:4159C1F686BFBE5B0E50BDB0DA532B69:\ 000000000000000000000000000000000000000000000000 00000000000000000000100000000000:6333100A5A4AD917DC2D4E78A04869A3:\ 000000000000000000000000000000000000000000000000 00000000000000000000080000000000:866A4519AB1D199F25886B89D0539ACC:\ 000000000000000000000000000000000000000000000000 00000000000000000000040000000000:EC0CFD37E4CBC7E8BE385283F7AEA75A:\ 000000000000000000000000000000000000000000000000 00000000000000000000020000000000:CA2F383AACCA0810AA13F3E710621422:\ 000000000000000000000000000000000000000000000000 00000000000000000000010000000000:1D0EEF6870444F950937831EC0A55D98:\ 000000000000000000000000000000000000000000000000 00000000000000000000008000000000:37839B35ED6801E7670496D479A95017:\ 000000000000000000000000000000000000000000000000 00000000000000000000004000000000:02317C8C7098C4F94AB867AC7A49DD8D:\ 000000000000000000000000000000000000000000000000 00000000000000000000002000000000:FFB4CB4E3F7F8BF3367EBD43236518B4:\ 000000000000000000000000000000000000000000000000 00000000000000000000001000000000:36BEDEF1E4AA3E4A40A305741713FCBF:\ 000000000000000000000000000000000000000000000000 00000000000000000000000800000000:B2DFE3C4870269C1E3FEEC39161540D9:\ 000000000000000000000000000000000000000000000000 00000000000000000000000400000000:147EF2518AD45DA0026056ECBF6A3DFA:\ 000000000000000000000000000000000000000000000000 00000000000000000000000200000000:027A75E4DE635790E47ACE90D7928804:\ 000000000000000000000000000000000000000000000000 00000000000000000000000100000000:C4CF3CCB59BF87D0AFBD629F48CFBB7B:\ 000000000000000000000000000000000000000000000000 00000000000000000000000080000000:35165C93F564C97E1C32EF97E8151A87:\ 000000000000000000000000000000000000000000000000 00000000000000000000000040000000:449DE37F7D5A1BBD628ABBE7E061701D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000020000000:B1D45EAF218F1799B149BAD677FE129F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000010000000:BE08AC6DB6BD0583AA9D2ABC71C73DCD:\ 000000000000000000000000000000000000000000000000 00000000000000000000000008000000:BCC835BD3DF1A79E4C7C145B899A5C25:\ 000000000000000000000000000000000000000000000000 00000000000000000000000004000000:3D311EA611FF5AF371301C58A8E9912D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000002000000:A5A1BEA594ACC7CA80F09EA5ADDB5C71:\ 000000000000000000000000000000000000000000000000 00000000000000000000000001000000:0F09492429FE7222D6CD8190D9F2FFBF:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000800000:816D2220A16B8AAEE71364FD43636C6F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000400000:D7E8702408419ED73191B107EAF75A0B:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000200000:9B170EFB1E235B433C78E276BEA082F0:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000100000:03BBECC5598AE974430F29395522F096:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000080000:DB53517766C0E8CF42059607CBA89380:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000040000:2E2AF4B7931F0AEFFAC5471148A5BB97:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000020000:C872C0408266403B984F635FF5683DE4:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000010000:15DCF750B0E3A68AD1F4EFD07E8967B4:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000008000:B41092048E9E6A749F6FD8CE515A23A3:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000004000:4DA9267D62507994312BD5C99ADDE730:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000002000:9E2FCA6D1D626E9C6A924EBF7DBF618A:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000001000:E092E8D7EF2C2465AEFB2493C3063590:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000800:1C0E58DA37D1068378A88DBE2EDE4E10:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000400:19063F854232B8509A6A3A6D46809959:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000200:447FB09E54EFA285F7530F25C4EA0022:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000100:F6ABE86321BE40E1FBFDAFED37CC1D9B:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000080:4E8506CD006666341D6CF51F98B41F35:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000040:53995DE0009CA18BECAFB8307C54C14C:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000020:2006BF99F4C58B6CC2627856593FAEEA:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000010:2DA697D2737CB30B744A4644FA1CBC6E:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000008:47A22ACDB60C3A986A8F76ECD0EA3433:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000004:FDAA17C2CDE20268FE36E164EA532151:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000002:98E7247C07F0FE411C267E4384B0F600:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000001:CD33B28AC773F74BA00ED1F312572435:\ 000000000000000000000000000000000000000000000000 [AES-256] 00112233445566778899AABBCCDDEEFF:8EA2B7CA516745BFEAFC49904B496089:\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F 834EADFCCAC7E1B30664B1ABA44815AB:1946DABF6A03A2A2C3D0B05080AED6FC:\ 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 D9DC4DBA3021B05D67C0518F72B62BF1:5ED301D747D3CC715445EBDEC62F2FB4:\ 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E A291D86301A4A739F7392173AA3C604C:6585C8F43D13A6BEAB6419FC5935B9D0:\ 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 4264B2696498DE4DF79788A9F83E9390:2A5B56A596680FCC0E05F5E0F151ECAE:\ 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E EE9932B3721804D5A83EF5949245B6F6:F5D6FF414FD2C6181494D20C37F2B8C4:\ A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 E6248F55C5FDCBCA9CBBB01C88A2EA77:85399C01F59FFFB5204F19F8482F00B8:\ C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE B8358E41B9DFF65FD461D55A99266247:92097B4C88A041DDF98144BC8D22E8E7:\ F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 F0E2D72260AF58E21E015AB3A4C0D906:89BD5B73B356AB412AEF9F76CEA2D65C:\ 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E 475B8B823CE8893DB3C44A9F2A379FF7:2536969093C55FF9454692F2FAC2F530:\ 40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 688F5281945812862F5F3076CF80412F:07FC76A872843F3F6E0081EE9396D637:\ 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E 08D1D2BC750AF553365D35E75AFACEAA:E38BA8EC2AA741358DCC93E8F141C491:\ 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 8707121F47CC3EFCECA5F9A8474950A1:D028EE23E4A89075D0B03E868D7D3A42:\ B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE E51AA0B135DBA566939C3B6359A980C5:8CD9423DFC459E547155C5D1D522E540:\ E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 069A007FC76A459F98BAF917FEDF9521:080E9517EB1677719ACF728086040AE3:\ 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E 726165C1723FBCF6C026D7D00B091027:7C1700211A3991FC0ECDED0AB3E576B0:\ 30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 D7C544DE91D55CFCDE1F84CA382200CE:DABCBCC855839251DB51E224FBE87435:\ 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E FED3C9A161B9B5B2BD611B41DC9DA357:68D56FAD0406947A4DD27A7448C10F1D:\ 80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 4F634CDC6551043409F30B635832CF82:DA9A11479844D1FFEE24BBF3719A9925:\ A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE 109CE98DB0DFB36734D9F3394711B4E6:5E4BA572F8D23E738DA9B05BA24B8D81:\ D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 4EA6DFABA2D8A02FFDFFA89835987242:A115A2065D667E3F0B883837A6E903F8:\ 70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 5AE094F54AF58E6E3CDBF976DAC6D9EF:3E9E90DC33EAC2437D86AD30B137E66E:\ 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE 764D8E8E0F29926DBE5122E66354FDBE:01CE82D8FBCDAE824CB3C48E495C3692:\ C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 3F0418F888CDF29A982BF6B75410D6A9:0C9CFF163CE936FAAF083CFD3DEA3117:\ E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E E4A3E7CB12CDD56AA4A75197A9530220:5131BA9BD48F2BBA85560680DF504B52:\ 10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 211677684AAC1EC1A160F44C4EBF3F26:9DC503BBF09823AEC8A977A5AD26CCB2:\ 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E D21E439FF749AC8F18D6D4B105E03895:9A6DB0C0862E506A9E397225884041D7:\ 60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 D9F6FF44646C4725BD4C0103FF5552A7:430BF9570804185E1AB6365FC6A6860C:\ 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE 0B1256C2A00B976250CFC5B0C37ED382:3525EBC02F4886E6A5A3762813E8CE8A:\ B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 B056447FFC6DC4523A36CC2E972A3A79:07FA265C763779CCE224C7BAD671027B:\ D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE 5E25CA78F0DE55802524D38DA3FE4456:E8B72B4E8BE243438C9FFF1F0E205872:\ 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 A5BCF4728FA5EAAD8567C0DC24675F83:109D4F999A0E11ACE1F05E6B22CBCB50:\ 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E 814E59F97ED84646B78B2CA022E9CA43:45A5E8D4C3ED58403FF08D68A0CC4029:\ 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 15478BEEC58F4775C7A7F5D4395514D7:196865964DB3D417B6BD4D586BCB7634:\ 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E 253548FFCA461C67C8CBC78CD59F4756:60436AD45AC7D30D99195F815D98D2AE:\ A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 FD7AD8D73B9B0F8CC41600640F503D65:BB07A23F0B61014B197620C185E2CD75:\ C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE 06199DE52C6CBF8AF954CD65830BCD56:5BC0B2850129C854423AFF0751FE343B:\ F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 F17C4FFE48E44C61BD891E257E725794:7541A78F96738E6417D2A24BD2BECA40:\ 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E 9A5B4A402A3E8A59BE6BF5CD8154F029:B0A303054412882E464591F1546C5B9E:\ 40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 79BD40B91A7E07DC939D441782AE6B17:778C06D8A355EEEE214FCEA14B4E0EEF:\ 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E D8CEAAF8976E5FBE1012D8C84F323799:09614206D15CBACE63227D06DB6BEEBB:\ 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 3316E2751E2E388B083DA23DD6AC3FBE:41B97FB20E427A9FDBBB358D9262255D:\ B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE 8B7CFBE37DE7DCA793521819242C5816:C1940F703D845F957652C2D64ABD7ADF:\ E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 F23F033C0EEBF8EC55752662FD58CE68:D2D44FCDAE5332343366DB297EFCF21B:\ 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E 59EB34F6C8BDBACC5FC6AD73A59A1301:EA8196B79DBE167B6AA9896E287EED2B:\ 30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 DCDE8B6BD5CF7CC22D9505E3CE81261A:D6B0B0C4BA6C7DBE5ED467A1E3F06C2D:\ 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E E33CF7E524FED781E7042FF9F4B35DC7:EC51EB295250C22C2FB01816FB72BCAE:\ 80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 27963C8FACDF73062867D164DF6D064C:ADED6630A07CE9C7408A155D3BD0D36F:\ A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE 77B1CE386B551B995F2F2A1DA994EEF8:697C9245B9937F32F5D1C82319F0363A:\ D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 F083388B013679EFCF0BB9B15D52AE5C:AAD5AD50C6262AAEC30541A1B7B5B19C:\ F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E C5009E0DAB55DB0ABDB636F2600290C8:7D34B893855341EC625BD6875AC18C0D:\ 20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 7804881E26CD532D8514D3683F00F1B9:7EF05105440F83862F5D780E88F02B41:\ 48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E 46CDDCD73D1EB53E675CA012870A92A3:C377C06403382061AF2C9C93A8E70DF6:\ 70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 A9FB44062BB07FE130A8E8299EACB1AB:1DBDB3FFDC052DACC83318853ABC6DE5:\ 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE 2B6FF8D7A5CC3A28A22D5A6F221AF26B:69A6EAB00432517D0BF483C91C0963C7:\ C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 1A9527C29B8ADD4B0E3E656DBB2AF8B4:0797F41DC217C80446E1D514BD6AB197:\ E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E 7F99CF2C75244DF015EB4B0C1050AEAE:9DFD76575902A637C01343C58E011A03:\ 10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 E84FF85B0D9454071909C1381646C4ED:ACF4328AE78F34B9FA9B459747CC2658:\ 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E 89AFD40F99521280D5399B12404F6DB4:B0479AEA12BAC4FE2384CF98995150C6:\ 60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 A09EF32DBC5119A35AB7FA38656F0329:9DD52789EFE3FFB99F33B3DA5030109A:\ 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE 61773457F068C376C7829B93E696E716:ABBB755E4621EF8F1214C19F649FB9FD:\ B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 A34F0CAE726CCE41DD498747D891B967:DA27FB8174357BCE2BED0E7354F380F9:\ D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE 856F59496C7388EE2D2B1A27B7697847:C59A0663F0993838F6E5856593BDC5EF:\ 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 CB090C593EF7720BD95908FB93B49DF4:ED60B264B5213E831607A99C0CE5E57E:\ 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E A0AC75CD2F1923D460FC4D457AD95BAF:E50548746846F3EB77B8C520640884ED:\ 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 2A2B282974777689E8E9EEEF525D5C5F:28282CC7D21D6A2923641E52D188EF0C:\ 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E 909192939390919E0F0E09089788898A:0DFA5B02ABB18E5A815305216D6D4F8E:\ A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 777675748D8E8F907170777649464744:7359635C0EECEFE31D673395FB46FB99:\ C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE 717073720605040B2D2C2B2A05FAFBF9:73C679F7D5AEF2745C9737BB4C47FB36:\ F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 64656667FEFDFCC31B1A1D1CA5AAABA8:B192BD472A4D2EAFB786E97458967626:\ 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E DBDAD9D86A696867B5B4B3B2C8D7D6D5:0EC327F6C8A2B147598CA3FDE61DC6A4:\ 40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 5C5D5E5FE3E0E1FE31303736333C3D3E:FC418EB3C41B859B38D4B6F646629729:\ 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E 545556574B48494673727574546B6A69:30249E5AC282B1C981EA64B609F3A154:\ 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 ECEDEEEFC6C5C4BB56575051F5FAFBF8:5E6E08646D12150776BB43C2D78A9703:\ B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE 464744452724252AC9C8CFCED2CDCCCF:FAEB3D5DE652CD3447DCEB343F30394A:\ E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 E6E7E4E54142435C878681801C131211:A8E88706823F6993EF80D05C1C7B2CF0:\ 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E 72737071CFCCCDC2F9F8FFFE710E0F0C:8CED86677E6E00A1A1B15968F2D3CCE6:\ 30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 505152537370714EC3C2C5C4010E0F0C:9FC7C23858BE03BDEBB84E90DB6786A9:\ 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E A8A9AAAB5C5F5E51AEAFA8A93D222320:B4FBD65B33F70D8CF7F1111AC4649C36:\ 80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 DEDFDCDDF6F5F4EB10111617FEF1F0F3:C5C32D5ED03C4B53CC8C1BD0EF0DBBF6:\ A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE BDBCBFBE5E5D5C530B0A0D0CFAC5C4C7:D1A7F03B773E5C212464B63709C6A891:\ D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 8A8B8889050606F8F4F5F2F3636C6D6E:6B7161D8745947AC6950438EA138D028:\ F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E A6A7A4A54D4E4F40B2B3B4B539262724:FD47A9F7E366EE7A09BC508B00460661:\ 20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 9C9D9E9FE9EAEBF40E0F08099B949596:00D40B003DC3A0D9310B659B98C7E416:\ 48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E 2D2C2F2E1013121DCCCDCACBED121310:EEA4C79DCC8E2BDA691F20AC48BE0717:\ 70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 F4F5F6F7EDEEEFD0EAEBECEDF7F8F9FA:E78F43B11C204403E5751F89D05A2509:\ 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE 3D3C3F3E282B2A2573727574150A0B08:D0F0E3D1F1244BB979931E38DD1786EF:\ C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 B6B7B4B5F8FBFAE5B4B5B2B3A0AFAEAD:042E639DC4E1E4DDE7B75B749EA6F765:\ E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E B7B6B5B4989B9A95878681809BA4A5A6:BC032FDD0EFE29503A980A7D07AB46A8:\ 10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 A8A9AAABE5E6E798E9E8EFEE4748494A:0C93AC949C0DA6446EFFB86183B6C910:\ 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E ECEDEEEFD9DADBD4B9B8BFBE657A7B78:E0D343E14DA75C917B4A5CEC4810D7C2:\ 60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 7F7E7D7C696A6B74CACBCCCD929D9C9F:0EAFB821748408279B937B626792E619:\ 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE 08090A0B0605040BFFFEF9F8B9C6C7C4:FA1AC6E02D23B106A1FEF18B274A553F:\ B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 08090A0BF1F2F3CCFCFDFAFB68676665:0DADFE019CD12368075507DF33C1A1E9:\ D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE CACBC8C93A393837050403020D121310:3A0879B414465D9FFBAF86B33A63A1B9:\ 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 E9E8EBEA8281809F8F8E8988343B3A39:62199FADC76D0BE1805D3BA0B7D914BF:\ 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E 515053524645444BD0D1D6D7340B0A09:1B06D6C5D333E742730130CF78E719B4:\ 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 42434041ECEFEE1193929594C6C9C8CB:F1F848824C32E9DCDCBF21580F069329:\ 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E EFEEEDECC2C1C0CF76777071455A5B58:1A09050CBD684F784D8E965E0782F28A:\ A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 5F5E5D5C3F3C3D221D1C1B1A19161714:79C2969E7DED2BA7D088F3F320692360:\ C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE 000102034142434C1C1D1A1B8D727371:091A658A2F7444C16ACCB669450C7B63:\ F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 8E8F8C8DB1B2B38C56575051050A0B08:97C1E3A72CCA65FA977D5ED0E8A7BBFC:\ 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E A7A6A5A4E8EBEAE57F7E7978CAD5D4D7:70C430C6DB9A17828937305A2DF91A2A:\ 40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 8A8B888994979689454443429F909192:629553457FBE2479098571C7C903FDE8:\ 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E 8C8D8E8FE0E3E2ED45444342F1CECFCC:A25B25A61F612669E7D91265C7D476BA:\ 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 FFFEFDFC4C4F4E31D8D9DEDFB6B9B8BB:EB7E4E49B8AE0F024570DDA293254FED:\ B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE FDFCFFFECCCFCEC12F2E29286679787B:38FE15D61CCA84516E924ADCE5014F67:\ E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 67666564BAB9B8A77071767719161714:3AD208492249108C9F3EBEB167AD0583:\ 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E 9A9B98992D2E2F2084858283245B5A59:299BA9F9BF5AB05C3580FC26EDD1ED12:\ 30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 A4A5A6A70B0809365C5D5A5B2C232221:19DC705B857A60FB07717B2EA5717781:\ 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E 464744455754555AF3F2F5F4AFB0B1B2:FFC8AEB885B5EFCAD06B6DBEBF92E76B:\ 80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 323330317675746B7273747549464744:F58900C5E0B385253FF2546250A0142B:\ A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE A8A9AAAB181B1A15808186872B141516:2EE67B56280BC462429CEE6E3370CBC1:\ D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 E7E6E5E4202323DDAAABACAD343B3A39:20DB650A9C8E9A84AB4D25F7EDC8F03F:\ F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E A8A9AAAB2221202FEDECEBEA1E010003:3C36DA169525CF818843805F25B78AE5:\ 20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 F9F8FBFA5F5C5D42424344450E010003:9A781D960DB9E45E37779042FEA51922:\ 48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E 57565554F5F6F7F89697909120DFDEDD:6560395EC269C672A3C288226EFDBA77:\ 70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 F8F9FAFBCCCFCEF1DDDCDBDA0E010003:8C772B7A189AC544453D5916EBB27B9A:\ 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE D9D8DBDA7073727D80818687C2DDDCDF:77CA5468CC48E843D05F78EED9D6578F:\ C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 C5C4C7C6080B0A1588898E8F68676665:72CDCC71DC82C60D4429C9E2D8195BAA:\ E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E 83828180DCDFDED186878081F0CFCECD:8080D68CE60E94B40B5B8B69EEB35AFA:\ 10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 98999A9BDDDEDFA079787F7E0A050407:44222D3CDE299C04369D58AC0EBA1E8E:\ 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E CECFCCCD4F4C4D429F9E9998DFC0C1C2:9B8721B0A8DFC691C5BC5885DBFCB27A:\ 60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 404142436665647B29282F2EABA4A5A6:0DC015CE9A3A3414B5E62EC643384183:\ 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE 33323130E6E5E4EB23222524DEA1A0A3:705715448A8DA412025CE38345C2A148:\ B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 CFCECDCCF6F5F4CBE6E7E0E199969794:C32B5B0B6FBAE165266C569F4B6ECF0B:\ D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE BABBB8B97271707FDCDDDADB29363734:4DCA6C75192A01DDCA9476AF2A521E87:\ 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 C9C8CBCA4447465926272021545B5A59:058691E627ECBC36AC07B6DB423BD698:\ 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E 050407067477767956575051221D1C1F:7444527095838FE080FC2BCDD30847EB:\ 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 00000000000000000000000000000000:E35A6DCB19B201A01EBCFA8AA22B5759:\ 8000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:5075C2405B76F22F553488CAE47CE90B:\ 4000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:49DF95D844A0145A7DE01C91793302D3:\ 2000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E7396D778E940B8418A86120E5F421FE:\ 1000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:05F535C36FCEDE4657BE37F4087DB1EF:\ 0800000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D0C1DDDD10DA777C68AB36AF51F2C204:\ 0400000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1C55FB811B5C6464C4E5DE1535A75514:\ 0200000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:52917F3AE957D5230D3A2AF57C7B5A71:\ 0100000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C6E3D5501752DD5E9AEF086D6B45D705:\ 0080000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A24A9C7AF1D9B1E17E1C9A3E711B3FA7:\ 0040000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B881ECA724A6D43DBC6B96F6F59A0D20:\ 0020000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:EC524D9A24DFFF2A9639879B83B8E137:\ 0010000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:34C4F345F5466215A037F443635D6F75:\ 0008000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:5BA5055BEDB8895F672E29F2EB5A355D:\ 0004000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B3F692AA3A435259EBBEF9B51AD1E08D:\ 0002000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:414FEB4376F2C64A5D2FBB2ED531BA7D:\ 0001000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A20D519E3BCA3303F07E81719F61605E:\ 0000800000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A08D10E520AF811F45BD60A2DC0DC4B1:\ 0000400000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B06893A8C563C430E6F3858826EFBBE4:\ 0000200000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0FFEE26AE2D3929C6BD9C6BEDFF84409:\ 0000100000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4D0F5E906ED77801FC0EF53EDC5F9E2B:\ 0000080000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8B6EC00119AD8B026DCE56EA7DEFE930:\ 0000040000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:69026591D43363EE9D83B5007F0B484E:\ 0000020000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:27135D86950C6A2F86872706279A4761:\ 0000010000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:35E6DB8723F281DA410C3AC8535ED77C:\ 0000008000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:57427CF214B8C28E4BBF487CCB8D0E09:\ 0000004000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:6DF01BF56E5131AC87F96E99CAB86367:\ 0000002000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3856C5B55790B768BBF7D43031579BCF:\ 0000001000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1E6ED8FB7C15BC4D2F63BA7037ED44D0:\ 0000000800000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E1B2ED6CD8D93D455534E401156D4BCF:\ 0000000400000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:EFBCCA5BDFDAD10E875F02336212CE36:\ 0000000200000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0B777F02FD18DCE2646DCFE868DFAFAD:\ 0000000100000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C8A104B5693D1B14F5BF1F10100BF508:\ 0000000080000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4CCE6615244AFCB38408FECE219962EA:\ 0000000040000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F99E7845D3A255B394C9C050CBA258B1:\ 0000000020000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B4AFBB787F9BCFB7B55FDF447F611295:\ 0000000010000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:AE1C426A697FAF2808B7EF6ADDB5C020:\ 0000000008000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7572F92811A85B9BDD38DEAD9945BCAE:\ 0000000004000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:71BC7AA46E43FB95A181527D9F6A360F:\ 0000000002000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:5542EF2923066F1EC8F546DD0D8E7CA8:\ 0000000001000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:6B92317C7D623790B748FDD7EFC42422:\ 0000000000800000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0FE7C097E899C71EF045360F8D6C25CF:\ 0000000000400000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4ECE7EE107D0264D04693151C25B9DF6:\ 0000000000200000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:FD6AE687CBFCA9E301045888D3BB9605:\ 0000000000100000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:476B579C8556C7254424902CC1D6D36E:\ 0000000000080000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4133CBCDFDD6B8860A1FC18665D6D71B:\ 0000000000040000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3B36EC2664798C108B816812C65DFDC7:\ 0000000000020000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:364E20A234FEA385D48DC5A09C9E70CF:\ 0000000000010000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4A4BA25969DE3F5EE5642C71AAD0EFD1:\ 0000000000008000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E42CBAAE43297F67A76C1C501BB79E36:\ 0000000000004000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:23CEDEDA4C15B4C037E8C61492217937:\ 0000000000002000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A1719147A1F4A1A1180BD16E8593DCDE:\ 0000000000001000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:AB82337E9FB0EC60D1F25A1D0014192C:\ 0000000000000800000000000000000000000000000000000000000000000000 00000000000000000000000000000000:74BF2D8FC5A8388DF1A3A4D7D33FC164:\ 0000000000000400000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D5B493317E6FBC6FFFD664B3C491368A:\ 0000000000000200000000000000000000000000000000000000000000000000 00000000000000000000000000000000:BA767381586DA56A2A8D503D5F7ADA0B:\ 0000000000000100000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E8E6BC57DFE9CCADB0DECABF4E5CF91F:\ 0000000000000080000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3C8E5A5CDC9CEED90815D1F84BB2998C:\ 0000000000000040000000000000000000000000000000000000000000000000 00000000000000000000000000000000:283843020BA38F056001B2FD585F7CC9:\ 0000000000000020000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D8ADC7426F623ECE8741A70621D28870:\ 0000000000000010000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D7C5C215592D06F00E6A80DA69A28EA9:\ 0000000000000008000000000000000000000000000000000000000000000000 00000000000000000000000000000000:52CF6FA433C3C870CAC70190358F7F16:\ 0000000000000004000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F63D442A584DA71786ADEC9F3346DF75:\ 0000000000000002000000000000000000000000000000000000000000000000 00000000000000000000000000000000:549078F4B0CA7079B45F9A5ADAFAFD99:\ 0000000000000001000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F2A5986EE4E9984BE2BAFB79EA8152FA:\ 0000000000000000800000000000000000000000000000000000000000000000 00000000000000000000000000000000:8A74535017B4DB2776668A1FAE64384C:\ 0000000000000000400000000000000000000000000000000000000000000000 00000000000000000000000000000000:E613342F57A97FD95DC088711A5D0ECD:\ 0000000000000000200000000000000000000000000000000000000000000000 00000000000000000000000000000000:3FFAEBF6B22CF1DC82AE17CD48175B01:\ 0000000000000000100000000000000000000000000000000000000000000000 00000000000000000000000000000000:BAFD52EFA15C248CCBF9757735E6B1CE:\ 0000000000000000080000000000000000000000000000000000000000000000 00000000000000000000000000000000:7AF94BC018D9DDD4539D2DD1C6F4000F:\ 0000000000000000040000000000000000000000000000000000000000000000 00000000000000000000000000000000:FE177AD61CA0FDB281086FBA8FE76803:\ 0000000000000000020000000000000000000000000000000000000000000000 00000000000000000000000000000000:74DBEA15E2E9285BAD163D7D534251B6:\ 0000000000000000010000000000000000000000000000000000000000000000 00000000000000000000000000000000:23DD21331B3A92F200FE56FF050FFE74:\ 0000000000000000008000000000000000000000000000000000000000000000 00000000000000000000000000000000:A69C5AA34AB20A858CAFA766EACED6D8:\ 0000000000000000004000000000000000000000000000000000000000000000 00000000000000000000000000000000:3F72BB4DF2A4F941A4A09CB78F04B97A:\ 0000000000000000002000000000000000000000000000000000000000000000 00000000000000000000000000000000:72CC43577E1FD5FD14622D24D97FCDCC:\ 0000000000000000001000000000000000000000000000000000000000000000 00000000000000000000000000000000:D83AF8EBE93E0B6B99CAFADE224937D1:\ 0000000000000000000800000000000000000000000000000000000000000000 00000000000000000000000000000000:44042329128D56CAA8D084C8BD769D1E:\ 0000000000000000000400000000000000000000000000000000000000000000 00000000000000000000000000000000:14102D72290DE4F2C430ADD1ED64BA1D:\ 0000000000000000000200000000000000000000000000000000000000000000 00000000000000000000000000000000:449124097B1ECD0AE7065206DF06F03C:\ 0000000000000000000100000000000000000000000000000000000000000000 00000000000000000000000000000000:D060A99F8CC153A42E11E5F97BD7584A:\ 0000000000000000000080000000000000000000000000000000000000000000 00000000000000000000000000000000:65605B3EA9261488D53E48602ADEA299:\ 0000000000000000000040000000000000000000000000000000000000000000 00000000000000000000000000000000:C5E5CAD7A208DE8EA6BE049EFE5C7346:\ 0000000000000000000020000000000000000000000000000000000000000000 00000000000000000000000000000000:4C280C46D2181646048DD5BC0C0831A5:\ 0000000000000000000010000000000000000000000000000000000000000000 00000000000000000000000000000000:5DD65CF37F2A0929559AABAFDA08E730:\ 0000000000000000000008000000000000000000000000000000000000000000 00000000000000000000000000000000:31F2335CAAF264172F69A693225E6D22:\ 0000000000000000000004000000000000000000000000000000000000000000 00000000000000000000000000000000:3E28B35F99A72662590DA96426DD377F:\ 0000000000000000000002000000000000000000000000000000000000000000 00000000000000000000000000000000:570F40F5D7B20441486578ED344343BE:\ 0000000000000000000001000000000000000000000000000000000000000000 00000000000000000000000000000000:C54308AD1C9E3B19F8B7417873045A8C:\ 0000000000000000000000800000000000000000000000000000000000000000 00000000000000000000000000000000:CBF335E39CE13ADE2B696179E8FD0CE1:\ 0000000000000000000000400000000000000000000000000000000000000000 00000000000000000000000000000000:9C2FBF422355D8293083D51F4A3C18A9:\ 0000000000000000000000200000000000000000000000000000000000000000 00000000000000000000000000000000:5ED8B5A31ECEFAB16C9AA6986DA67BCE:\ 0000000000000000000000100000000000000000000000000000000000000000 00000000000000000000000000000000:627815DCFC814ABC75900041B1DD7B59:\ 0000000000000000000000080000000000000000000000000000000000000000 00000000000000000000000000000000:9EF3E82A50A59F166260494F7A7F2CC3:\ 0000000000000000000000040000000000000000000000000000000000000000 00000000000000000000000000000000:878CD0D8D920888B5935D6C351128737:\ 0000000000000000000000020000000000000000000000000000000000000000 00000000000000000000000000000000:E44429474D6FC3084EB2A6B8B46AF754:\ 0000000000000000000000010000000000000000000000000000000000000000 00000000000000000000000000000000:EBAACF9641D54E1FB18D0A2BE4F19BE5:\ 0000000000000000000000008000000000000000000000000000000000000000 00000000000000000000000000000000:13B3BF497CEE780E123C7E193DEA3A01:\ 0000000000000000000000004000000000000000000000000000000000000000 00000000000000000000000000000000:6E8F381DE00A41161F0DF03B4155BFD4:\ 0000000000000000000000002000000000000000000000000000000000000000 00000000000000000000000000000000:35E4F29BBA2BAE01144910783C3FEF49:\ 0000000000000000000000001000000000000000000000000000000000000000 00000000000000000000000000000000:55B17BD66788CEAC366398A31F289FFB:\ 0000000000000000000000000800000000000000000000000000000000000000 00000000000000000000000000000000:11341F56C0D6D1008D28741DAA7679CE:\ 0000000000000000000000000400000000000000000000000000000000000000 00000000000000000000000000000000:4DF7253DF421D83358BDBE924745D98C:\ 0000000000000000000000000200000000000000000000000000000000000000 00000000000000000000000000000000:BAE2EE651116D93EDC8E83B5F3347BE1:\ 0000000000000000000000000100000000000000000000000000000000000000 00000000000000000000000000000000:F9721ABD06709157183AF3965A659D9D:\ 0000000000000000000000000080000000000000000000000000000000000000 00000000000000000000000000000000:19A1C252A613FE2860A4AE6D75CE6FA3:\ 0000000000000000000000000040000000000000000000000000000000000000 00000000000000000000000000000000:B5DDB2F5D9752C949FBDE3FFF5556C6E:\ 0000000000000000000000000020000000000000000000000000000000000000 00000000000000000000000000000000:81B044FCFFC78ECCFCD171AAD0405C66:\ 0000000000000000000000000010000000000000000000000000000000000000 00000000000000000000000000000000:C640566D3C06020EB2C42F1D62E56A9B:\ 0000000000000000000000000008000000000000000000000000000000000000 00000000000000000000000000000000:EA6C4BCF425291679FDFFD26A424FBCC:\ 0000000000000000000000000004000000000000000000000000000000000000 00000000000000000000000000000000:57F6901465D9440D9F15EE2CBA5A4090:\ 0000000000000000000000000002000000000000000000000000000000000000 00000000000000000000000000000000:FBCFA74CADC7406260F63D96C8AAB6B1:\ 0000000000000000000000000001000000000000000000000000000000000000 00000000000000000000000000000000:DFF4F096CEA211D4BBDACA033D0EC7D1:\ 0000000000000000000000000000800000000000000000000000000000000000 00000000000000000000000000000000:1EE5190D551F0F42F675227A381296A9:\ 0000000000000000000000000000400000000000000000000000000000000000 00000000000000000000000000000000:F98E1905012E580F097623C10B93054F:\ 0000000000000000000000000000200000000000000000000000000000000000 00000000000000000000000000000000:E7D43743D21DD3C9F168C86856558B9A:\ 0000000000000000000000000000100000000000000000000000000000000000 00000000000000000000000000000000:632A9DDA730DAB67593C5D08D8AC1059:\ 0000000000000000000000000000080000000000000000000000000000000000 00000000000000000000000000000000:E084317000715B9057BC9DE9F3AB6124:\ 0000000000000000000000000000040000000000000000000000000000000000 00000000000000000000000000000000:61F9EF33A0BB4E666C2ED99101919FAB:\ 0000000000000000000000000000020000000000000000000000000000000000 00000000000000000000000000000000:6DC1D68A11834657D46703C22578D59A:\ 0000000000000000000000000000010000000000000000000000000000000000 00000000000000000000000000000000:53AC1548863D3D16F1D4DC7242E05F2C:\ 0000000000000000000000000000008000000000000000000000000000000000 00000000000000000000000000000000:E82CD587A408306AD78CEAE0916B9F8C:\ 0000000000000000000000000000004000000000000000000000000000000000 00000000000000000000000000000000:0FD2D40EA6AD17A3A767F0A8600D6295:\ 0000000000000000000000000000002000000000000000000000000000000000 00000000000000000000000000000000:AD84CC8255ADB39DFCA23F92761AE7E9:\ 0000000000000000000000000000001000000000000000000000000000000000 00000000000000000000000000000000:F4F20CF7D51BEE7DA024A2B11A7ECA0B:\ 0000000000000000000000000000000800000000000000000000000000000000 00000000000000000000000000000000:5057691B85D9CE93A193214DB0A016B6:\ 0000000000000000000000000000000400000000000000000000000000000000 00000000000000000000000000000000:0F58C960876390BDEF4BB6BE95CAA1EE:\ 0000000000000000000000000000000200000000000000000000000000000000 00000000000000000000000000000000:9A3E66EEBC21BC0BD9430B341EF465FA:\ 0000000000000000000000000000000100000000000000000000000000000000 00000000000000000000000000000000:20415035F34B8BCBCB28ABF07F78F0D4:\ 0000000000000000000000000000000080000000000000000000000000000000 00000000000000000000000000000000:AC89FC7BA10479EBF10DE65BCEF89B3C:\ 0000000000000000000000000000000040000000000000000000000000000000 00000000000000000000000000000000:068FA75A30BE443171AF3F6FEB1A20D2:\ 0000000000000000000000000000000020000000000000000000000000000000 00000000000000000000000000000000:50E02F213246C525A8C27700CA34B502:\ 0000000000000000000000000000000010000000000000000000000000000000 00000000000000000000000000000000:227DA47D5A0906DB3AB042BB0A695FB6:\ 0000000000000000000000000000000008000000000000000000000000000000 00000000000000000000000000000000:8663AC30ED12514F1DE46777F4514BFC:\ 0000000000000000000000000000000004000000000000000000000000000000 00000000000000000000000000000000:A987D4BC12E1DE9F4B6DF43567C34A8B:\ 0000000000000000000000000000000002000000000000000000000000000000 00000000000000000000000000000000:6D5A0370F599ACA605F63B04E5143D0C:\ 0000000000000000000000000000000001000000000000000000000000000000 00000000000000000000000000000000:9809266E378B07B7AFDB3BAA97B7E442:\ 0000000000000000000000000000000000800000000000000000000000000000 00000000000000000000000000000000:8F753252B30CCCACE12D9A301F4D5090:\ 0000000000000000000000000000000000400000000000000000000000000000 00000000000000000000000000000000:032465F6C0CE34D41962F561692A1AFF:\ 0000000000000000000000000000000000200000000000000000000000000000 00000000000000000000000000000000:C50E9AD5BEB8F3B00821DD47FF8AC093:\ 0000000000000000000000000000000000100000000000000000000000000000 00000000000000000000000000000000:9C6FEA3D46268D54A6829B2AD25BB276:\ 0000000000000000000000000000000000080000000000000000000000000000 00000000000000000000000000000000:0FD8575E87706F561343D7B3A41E044A:\ 0000000000000000000000000000000000040000000000000000000000000000 00000000000000000000000000000000:BEE9BEB3739540D88CBCE77925F0A114:\ 0000000000000000000000000000000000020000000000000000000000000000 00000000000000000000000000000000:D24EAEE7FFFBAC3D6F26C2DCE0DCDE28:\ 0000000000000000000000000000000000010000000000000000000000000000 00000000000000000000000000000000:47771A90398FF0F7FA821C2F8F5E1398:\ 0000000000000000000000000000000000008000000000000000000000000000 00000000000000000000000000000000:4639741B6F84B135AD118C8249B64ED0:\ 0000000000000000000000000000000000004000000000000000000000000000 00000000000000000000000000000000:8EE5505EC85567697A3306F250A27720:\ 0000000000000000000000000000000000002000000000000000000000000000 00000000000000000000000000000000:7C8A19AC1AEFBC5E0119D91A5F05D4C2:\ 0000000000000000000000000000000000001000000000000000000000000000 00000000000000000000000000000000:5141B9B672E54773B672E3A6C424887B:\ 0000000000000000000000000000000000000800000000000000000000000000 00000000000000000000000000000000:B5A2D3CD206653C6402F34FB0AE3613D:\ 0000000000000000000000000000000000000400000000000000000000000000 00000000000000000000000000000000:0F5BD9408738231D114B0A82753279A3:\ 0000000000000000000000000000000000000200000000000000000000000000 00000000000000000000000000000000:FEF033FF4268EA487FC74C5E43A45338:\ 0000000000000000000000000000000000000100000000000000000000000000 00000000000000000000000000000000:A3EDC09DCD529B113910D904AD855581:\ 0000000000000000000000000000000000000080000000000000000000000000 00000000000000000000000000000000:AB8FBB6F27A0AC7C55B59FDD36B72F1C:\ 0000000000000000000000000000000000000040000000000000000000000000 00000000000000000000000000000000:EEA44D5ED4D769CC930CD83D8999EC46:\ 0000000000000000000000000000000000000020000000000000000000000000 00000000000000000000000000000000:6972276803AE9AA7C6F431AB10979C34:\ 0000000000000000000000000000000000000010000000000000000000000000 00000000000000000000000000000000:86DEAA9F39244101818178474D7DBDE9:\ 0000000000000000000000000000000000000008000000000000000000000000 00000000000000000000000000000000:88C6B466EA361D662D8D08CBF181F4FE:\ 0000000000000000000000000000000000000004000000000000000000000000 00000000000000000000000000000000:91AB2C6B7C63FF59F7CBEEBF91B20B95:\ 0000000000000000000000000000000000000002000000000000000000000000 00000000000000000000000000000000:2DFE6C146AD5B3D8C3C1718F13B48E01:\ 0000000000000000000000000000000000000001000000000000000000000000 00000000000000000000000000000000:C7CFF1623451711391A302EEC3584AAA:\ 0000000000000000000000000000000000000000800000000000000000000000 00000000000000000000000000000000:089FE845CC05011686C66019D18BE050:\ 0000000000000000000000000000000000000000400000000000000000000000 00000000000000000000000000000000:08C8410B9B427211A67124B0DCCEAD48:\ 0000000000000000000000000000000000000000200000000000000000000000 00000000000000000000000000000000:8D91592F5566085254784606334D7629:\ 0000000000000000000000000000000000000000100000000000000000000000 00000000000000000000000000000000:3298FEAAF2E1201D6299FF8846639C97:\ 0000000000000000000000000000000000000000080000000000000000000000 00000000000000000000000000000000:C497CB9F0BDFE0EFC8C2F3F90760AA72:\ 0000000000000000000000000000000000000000040000000000000000000000 00000000000000000000000000000000:2788AFD046E0309CBE4424690DA2AB89:\ 0000000000000000000000000000000000000000020000000000000000000000 00000000000000000000000000000000:E9891707F25EF29FEE372890D4258982:\ 0000000000000000000000000000000000000000010000000000000000000000 00000000000000000000000000000000:DB041D94A23D45D4D4DCED5A030CAF61:\ 0000000000000000000000000000000000000000008000000000000000000000 00000000000000000000000000000000:FFAFDBF0ECB18DF9EA02C27077448E6D:\ 0000000000000000000000000000000000000000004000000000000000000000 00000000000000000000000000000000:2DAAA42A7D0A1D3B0E4761D99CF2150A:\ 0000000000000000000000000000000000000000002000000000000000000000 00000000000000000000000000000000:3B7A54CB7CF30ABE263DD6ED5BFE8D63:\ 0000000000000000000000000000000000000000001000000000000000000000 00000000000000000000000000000000:EEFA090174C590C448A55D43648F534A:\ 0000000000000000000000000000000000000000000800000000000000000000 00000000000000000000000000000000:9E15798731ED42F43EA2740A691DA872:\ 0000000000000000000000000000000000000000000400000000000000000000 00000000000000000000000000000000:31FBD661540A5DEAAD1017CFD3909EC8:\ 0000000000000000000000000000000000000000000200000000000000000000 00000000000000000000000000000000:CDA9AE05F224140E28CB951721B44D6A:\ 0000000000000000000000000000000000000000000100000000000000000000 00000000000000000000000000000000:0C5BC512C60A1EAC3434EFB1A8FBB182:\ 0000000000000000000000000000000000000000000080000000000000000000 00000000000000000000000000000000:AA863610DEEEEB62D045E87EA30B59B5:\ 0000000000000000000000000000000000000000000040000000000000000000 00000000000000000000000000000000:6AC2448DE568D279C7EEBE1DF403920C:\ 0000000000000000000000000000000000000000000020000000000000000000 00000000000000000000000000000000:E2011E3D292B26888AE801215FD0CB40:\ 0000000000000000000000000000000000000000000010000000000000000000 00000000000000000000000000000000:E06F3E15EE3A61672D1C99BADE5B9DBE:\ 0000000000000000000000000000000000000000000008000000000000000000 00000000000000000000000000000000:BB7027F0548CF6712CEB4C7A4B28E178:\ 0000000000000000000000000000000000000000000004000000000000000000 00000000000000000000000000000000:061EC21FB70FADBDF87C3BD2AE23825B:\ 0000000000000000000000000000000000000000000002000000000000000000 00000000000000000000000000000000:4C21F26FE94ABBAC381352375314C3EB:\ 0000000000000000000000000000000000000000000001000000000000000000 00000000000000000000000000000000:F7CEE6DD99909C2B569EEDA61ED8942E:\ 0000000000000000000000000000000000000000000000800000000000000000 00000000000000000000000000000000:CE98C4A876C65E4CCB261EBB1D9DF7F5:\ 0000000000000000000000000000000000000000000000400000000000000000 00000000000000000000000000000000:A5491881CF833C3604ABC08044F402AC:\ 0000000000000000000000000000000000000000000000200000000000000000 00000000000000000000000000000000:A1BA16E64CCCB3087D57A768507B0BFC:\ 0000000000000000000000000000000000000000000000100000000000000000 00000000000000000000000000000000:D55951E202D2949EBD3BE43120C738BF:\ 0000000000000000000000000000000000000000000000080000000000000000 00000000000000000000000000000000:EBB8E43069E69F450EFEC65DCD52B7FD:\ 0000000000000000000000000000000000000000000000040000000000000000 00000000000000000000000000000000:2B292135663B4AA5ABFE9423D57E7EE9:\ 0000000000000000000000000000000000000000000000020000000000000000 00000000000000000000000000000000:E91BF974B3BE3AD966249D8655292A85:\ 0000000000000000000000000000000000000000000000010000000000000000 00000000000000000000000000000000:384365998EAA9562236CC58F6ADF9610:\ 0000000000000000000000000000000000000000000000008000000000000000 00000000000000000000000000000000:C2E997012AA3D4D8D359C9A947CBE69F:\ 0000000000000000000000000000000000000000000000004000000000000000 00000000000000000000000000000000:F49421204148BA213BE87E2D5C22B0BF:\ 0000000000000000000000000000000000000000000000002000000000000000 00000000000000000000000000000000:82ED0ED9953AA92E4DF30929CA65C00F:\ 0000000000000000000000000000000000000000000000001000000000000000 00000000000000000000000000000000:291EB1D11653C8479437C74A977F5106:\ 0000000000000000000000000000000000000000000000000800000000000000 00000000000000000000000000000000:BCB997B1939B8983ABD550D6025683E3:\ 0000000000000000000000000000000000000000000000000400000000000000 00000000000000000000000000000000:1FBA2592C6F489775CAADA71F9B983E9:\ 0000000000000000000000000000000000000000000000000200000000000000 00000000000000000000000000000000:969F66F217AF1A3DB9E41C1B29039824:\ 0000000000000000000000000000000000000000000000000100000000000000 00000000000000000000000000000000:A54BB7D6B17E423AC0A7744C19073CB8:\ 0000000000000000000000000000000000000000000000000080000000000000 00000000000000000000000000000000:B0AC6E6578D1021F47DCF9748A32EAD5:\ 0000000000000000000000000000000000000000000000000040000000000000 00000000000000000000000000000000:B87B361C3B7B194C77A4358D4669153E:\ 0000000000000000000000000000000000000000000000000020000000000000 00000000000000000000000000000000:46A133847F96EAA8282A799DC8899D58:\ 0000000000000000000000000000000000000000000000000010000000000000 00000000000000000000000000000000:2265EC3A9F2D5C9547A091CC8CFB18EA:\ 0000000000000000000000000000000000000000000000000008000000000000 00000000000000000000000000000000:54CBF3A6FC4FE56D426117AA1FFD1DDE:\ 0000000000000000000000000000000000000000000000000004000000000000 00000000000000000000000000000000:5312877CCEAB6CFB0905394A370A8003:\ 0000000000000000000000000000000000000000000000000002000000000000 00000000000000000000000000000000:7190BD6EC613FE38B84ECFE28F702FE4:\ 0000000000000000000000000000000000000000000000000001000000000000 00000000000000000000000000000000:D1FA5B9CA89A43B04C05F0EF29EF68CD:\ 0000000000000000000000000000000000000000000000000000800000000000 00000000000000000000000000000000:808285751548ED934FD1056D2D9AE8BA:\ 0000000000000000000000000000000000000000000000000000400000000000 00000000000000000000000000000000:2758DEF3E7B95A9AE89777BE64D5A6CF:\ 0000000000000000000000000000000000000000000000000000200000000000 00000000000000000000000000000000:07D81F87DB3E0ACC82B01E08FB22F3C1:\ 0000000000000000000000000000000000000000000000000000100000000000 00000000000000000000000000000000:8DA250E5553D650711A75EE1CB4FD1C7:\ 0000000000000000000000000000000000000000000000000000080000000000 00000000000000000000000000000000:A93D946BD0E87F32719DF5F158CEE669:\ 0000000000000000000000000000000000000000000000000000040000000000 00000000000000000000000000000000:03945236EC2A4D4EAF30B8ABEB54330D:\ 0000000000000000000000000000000000000000000000000000020000000000 00000000000000000000000000000000:11CC35301F24B79DDE31AEA2D1354F88:\ 0000000000000000000000000000000000000000000000000000010000000000 00000000000000000000000000000000:E73715B3E8D9A290F44AE6FFBF247E5D:\ 0000000000000000000000000000000000000000000000000000008000000000 00000000000000000000000000000000:7345E07732B71CB158BBF64CCA5C5B96:\ 0000000000000000000000000000000000000000000000000000004000000000 00000000000000000000000000000000:6E128F296D24705A1924FD9B70C4ED04:\ 0000000000000000000000000000000000000000000000000000002000000000 00000000000000000000000000000000:95A789776F036783FBD330947083F54F:\ 0000000000000000000000000000000000000000000000000000001000000000 00000000000000000000000000000000:360DEC2533EA4AA2E3E54FD3DE2906EB:\ 0000000000000000000000000000000000000000000000000000000800000000 00000000000000000000000000000000:E68EFD7FECF4D601EA22727BD764965B:\ 0000000000000000000000000000000000000000000000000000000400000000 00000000000000000000000000000000:9065C64A8BFF44AC33EDBB611CF83D7B:\ 0000000000000000000000000000000000000000000000000000000200000000 00000000000000000000000000000000:8F33C8DF2A7A51CE8090E8F123BC3723:\ 0000000000000000000000000000000000000000000000000000000100000000 00000000000000000000000000000000:807F391FFBA8291BA625623210F99018:\ 0000000000000000000000000000000000000000000000000000000080000000 00000000000000000000000000000000:5E8B3F3A701522CE5CAA761C929D6292:\ 0000000000000000000000000000000000000000000000000000000040000000 00000000000000000000000000000000:3BA404DC38735A78289E3809E8364835:\ 0000000000000000000000000000000000000000000000000000000020000000 00000000000000000000000000000000:D23BEDBAD229F8305DC425B6B759DCC9:\ 0000000000000000000000000000000000000000000000000000000010000000 00000000000000000000000000000000:44880F21CF5913040AE376AEE2A10AD8:\ 0000000000000000000000000000000000000000000000000000000008000000 00000000000000000000000000000000:9BC98E29D057C0E828C3B5CCE69256C1:\ 0000000000000000000000000000000000000000000000000000000004000000 00000000000000000000000000000000:B293CC7A975DA141A68279368057CC41:\ 0000000000000000000000000000000000000000000000000000000002000000 00000000000000000000000000000000:8D60FB87ACD91385B313BE5F1D7BD30F:\ 0000000000000000000000000000000000000000000000000000000001000000 00000000000000000000000000000000:2C8E56132D70291B303C48FDF75543CD:\ 0000000000000000000000000000000000000000000000000000000000800000 00000000000000000000000000000000:D1F80035B826791F6CE4E59B7DB1BB0D:\ 0000000000000000000000000000000000000000000000000000000000400000 00000000000000000000000000000000:42CE6224FC36469339A133DD08173BD4:\ 0000000000000000000000000000000000000000000000000000000000200000 00000000000000000000000000000000:61817155EA41BCBA2AF7F06AE7CBF585:\ 0000000000000000000000000000000000000000000000000000000000100000 00000000000000000000000000000000:D1923A9866068D2EF5FB77D57C3315B6:\ 0000000000000000000000000000000000000000000000000000000000080000 00000000000000000000000000000000:B37CBDB5D719F49691CA968EF2E84140:\ 0000000000000000000000000000000000000000000000000000000000040000 00000000000000000000000000000000:EC974E653A055D7F8F22171030F68E1D:\ 0000000000000000000000000000000000000000000000000000000000020000 00000000000000000000000000000000:DDE5D3B9AAD9C32213BB3675A822499C:\ 0000000000000000000000000000000000000000000000000000000000010000 00000000000000000000000000000000:D3B6E9216EA1AE57EB1C628A3C38AB78:\ 0000000000000000000000000000000000000000000000000000000000008000 00000000000000000000000000000000:82C99ECC69472B7E96324B042AE8B87A:\ 0000000000000000000000000000000000000000000000000000000000004000 00000000000000000000000000000000:97144DC5338C43600F84439C0AA0D147:\ 0000000000000000000000000000000000000000000000000000000000002000 00000000000000000000000000000000:400AC4A0BBADA1DB2121EB144C7E5209:\ 0000000000000000000000000000000000000000000000000000000000001000 00000000000000000000000000000000:EFD9D550EB419ED278F4885A490AB54C:\ 0000000000000000000000000000000000000000000000000000000000000800 00000000000000000000000000000000:2AB7816E149B7C0404C88A8857793670:\ 0000000000000000000000000000000000000000000000000000000000000400 00000000000000000000000000000000:5B591DFF9E8DEE15BAD24C025DBCA481:\ 0000000000000000000000000000000000000000000000000000000000000200 00000000000000000000000000000000:0C06633E30721C3749F49AD8CBF2B754:\ 0000000000000000000000000000000000000000000000000000000000000100 00000000000000000000000000000000:96D6D31A41B5123B2035FD91A921D4CA:\ 0000000000000000000000000000000000000000000000000000000000000080 00000000000000000000000000000000:E7F6C34D86668BC2805CA7793C5E86AD:\ 0000000000000000000000000000000000000000000000000000000000000040 00000000000000000000000000000000:F46DFF5FF500D6879C4D3E45CF0CF0F3:\ 0000000000000000000000000000000000000000000000000000000000000020 00000000000000000000000000000000:60D842D9C61DA7495C116197B7CECBBE:\ 0000000000000000000000000000000000000000000000000000000000000010 00000000000000000000000000000000:D45B24EDB673353EBDF248B8FA06B67A:\ 0000000000000000000000000000000000000000000000000000000000000008 00000000000000000000000000000000:119EAEBCC165D0BD02C0D35DC82EF992:\ 0000000000000000000000000000000000000000000000000000000000000004 00000000000000000000000000000000:E673143680414ADA301D0ED34626B9FE:\ 0000000000000000000000000000000000000000000000000000000000000002 00000000000000000000000000000000:6B6CFE160A6263631B292F879EEFF926:\ 0000000000000000000000000000000000000000000000000000000000000001 80000000000000000000000000000000:DDC6BF790C15760D8D9AEB6F9A75FD4E:\ 0000000000000000000000000000000000000000000000000000000000000000 40000000000000000000000000000000:C7098C217C334D0C9BDF37EA13B0822C:\ 0000000000000000000000000000000000000000000000000000000000000000 20000000000000000000000000000000:60F0FB0D4C56A8D4EEFEC5264204042D:\ 0000000000000000000000000000000000000000000000000000000000000000 10000000000000000000000000000000:73376FBBF654D0686E0E84001477106B:\ 0000000000000000000000000000000000000000000000000000000000000000 08000000000000000000000000000000:2F443B52BA5F0C6EA0602C7C4FD259B6:\ 0000000000000000000000000000000000000000000000000000000000000000 04000000000000000000000000000000:75D11B0E3A68C4223D88DBF017977DD7:\ 0000000000000000000000000000000000000000000000000000000000000000 02000000000000000000000000000000:779B38D15BFFB63D8D609D551A5CC98E:\ 0000000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000:5275F3D86B4FB8684593133EBFA53CD3:\ 0000000000000000000000000000000000000000000000000000000000000000 00800000000000000000000000000000:1CEF2074B336CEC62F12DEA2F6AB1481:\ 0000000000000000000000000000000000000000000000000000000000000000 00400000000000000000000000000000:1AEF5ABBAD9D7160874578DCD8BAE172:\ 0000000000000000000000000000000000000000000000000000000000000000 00200000000000000000000000000000:46C525DB17E72F26BF03216846B6F609:\ 0000000000000000000000000000000000000000000000000000000000000000 00100000000000000000000000000000:E24411F941BBE08788781E3EC52CBAA4:\ 0000000000000000000000000000000000000000000000000000000000000000 00080000000000000000000000000000:83A3DEDD1DD27018F6A6477E40527581:\ 0000000000000000000000000000000000000000000000000000000000000000 00040000000000000000000000000000:B68F8A2CDBAB0C923C67FC8F0F1087DE:\ 0000000000000000000000000000000000000000000000000000000000000000 00020000000000000000000000000000:649944A70C32BF87A7409E7AE128FDE8:\ 0000000000000000000000000000000000000000000000000000000000000000 00010000000000000000000000000000:2846526D67387539C89314DE9E0C2D02:\ 0000000000000000000000000000000000000000000000000000000000000000 00008000000000000000000000000000:A9A0B8402E53C70DD1688054BA58DDFD:\ 0000000000000000000000000000000000000000000000000000000000000000 00004000000000000000000000000000:4A72E6E1B79C83AC4BE3EBA5699EED48:\ 0000000000000000000000000000000000000000000000000000000000000000 00002000000000000000000000000000:B0E36B867BA4FF2B77D0614B0E364E4C:\ 0000000000000000000000000000000000000000000000000000000000000000 00001000000000000000000000000000:49B57DE141F6418E3090F24DDD4014B6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000800000000000000000000000000:A6C0D5B9797258E1987AC5F6CD20146D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000400000000000000000000000000:426CF4BDCAA369175965D26E7C71EEA2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000200000000000000000000000000:E27F484CE54BC99BC1A52BDA3B518A26:\ 0000000000000000000000000000000000000000000000000000000000000000 00000100000000000000000000000000:D16D186284C7E6EE64B8104E0EF20BA5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000080000000000000000000000000:6431F8538AD54E1E044A9F71F8EF556B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000040000000000000000000000000:ECD57CEB451D27EB96C55B2042257E8E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000020000000000000000000000000:4F0F188DC911B1954AFBC734C9F68872:\ 0000000000000000000000000000000000000000000000000000000000000000 00000010000000000000000000000000:B54DEF0337626B65614E81EDFDE620F3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000008000000000000000000000000:6655D8074CAE0B90B0D3A3FE72D4D9DB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000004000000000000000000000000:C6B74B6B9EB4FC0C9A237DB1B616D09A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000002000000000000000000000000:D7B5D076EA56EC2B20791D7AD51CCF8F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000001000000000000000000000000:FE160C224BF003CE3BDDC90CB52ED22C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000800000000000000000000000:5E00DA9BA94B5EC0D258D8A8002E0F6A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000400000000000000000000000:09AC6DCFF4DACFF1651E2BA212A292A3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000200000000000000000000000:B283617E318D99AF83A05D9810BA89F7:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000100000000000000000000000:0B5F70CCB40B0EF2538AE9B4A9770B35:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000080000000000000000000000:43282BF180248FB517839B37F4DDAAE4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000040000000000000000000000:DDBD534C8B2E6D30A268F88C55AD765B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000020000000000000000000000:A41A164E50EC2D9F175E752B755E0B5C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000010000000000000000000000:37BFF99FF2F7AA97779E4ADF6F13FB10:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000008000000000000000000000:9BA4F7BD298152903A683C4CEC669216:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000004000000000000000000000:5FB750C7CE10DE7B4504248914D0DA06:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000002000000000000000000000:3E748BFA108E086F51D56EC74A9E0FB9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000001000000000000000000000:31D4E56B99F5B73C1B8437DF332AFB98:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000800000000000000000000:9DC6717B84FC55D266E7B1D9B5C52A5F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000400000000000000000000:8EF8BA007F23C0A50FC120E07041BCCD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000200000000000000000000:C58F38E1839FC1918A12B8C9E88C66B6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000100000000000000000000:B695D72A3FCF508C4050E12E40061C2D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000080000000000000000000:5D2736AD478A50583BC8C11BEFF16D7A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000040000000000000000000:DF0EACA8F17847AD41F9578F14C7B56B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000020000000000000000000:E5AA14AD48AD0A3C47CC35D5F8020E51:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000010000000000000000000:11BE6C8F58EBD8CEF1A53F591A68E8CE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000008000000000000000000:ECFE7BAFCBF42C1FEE015488770B3053:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000004000000000000000000:E552649F8D8EC4A1E1CD6DF50B6E6777:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000002000000000000000000:521C0629DE93B9119CDB1DDC5809DDEA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000001000000000000000000:CB38A62A0BAB1784156BA038CBA99BF6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000800000000000000000:76CCEE8AAACD394DE1EEF3DDA10CB54B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000400000000000000000:6AFF910FA1D5673140E2DB59B8416049:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000200000000000000000:064A12C0EF73FB386801BF4F35F3120D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000100000000000000000:2240E374929D5B1BB8FF0FFDDDF640EC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000080000000000000000:D4BA15C904C7692185DE85C02052E180:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000040000000000000000:1714A315AB0166728A44CD91D4AE9018:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000020000000000000000:6C970BDD9F0E222722EA31A1D12DD0AD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000010000000000000000:F5956EDF02BD36A401BBB6CE77C3D3FB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000008000000000000000:0CA11F122CCD7C259DC597EED3DF9BC4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000004000000000000000:50109AB4912AD2560B206F331B62EB6C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000002000000000000000:DBE7C91A4175614889A2D4BEFD64845E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000001000000000000000:0D3322853A571A6B46B79C0228E0DD25:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000800000000000000:96E4EE0BB9A11C6FB8522F285BADDEB6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000400000000000000:96705C52D2CFCE82E630C93477C79C49:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000200000000000000:C50130AED6A126149D71F3888C83C232:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000100000000000000:4816EFE3DEB380566EBA0C17BF582090:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000080000000000000:0390857B4C8C98E4CF7A2B6F3394C507:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000040000000000000:422E73A02025EBE8B8B5D6E0FA24FCB2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000020000000000000:3271AA7F4BF1D7C38050A43076D4FF76:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000010000000000000:D2074946F0D37B8975607BFC2E70234C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000008000000000000:1A509194C1270AB92E5A42D3A9F8D98B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000004000000000000:512438946360CCC4A5C6D73F6EED7130:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000002000000000000:98CFCDEC46EBEA1A286B3004F2746A0D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000001000000000000:A1CF369949677A3AF3D58E3EABF2741B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000800000000000:D84C2E1A0E4A52166FA8FF6889D1E5E2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000400000000000:4AD91CCEEF60119B5078FD162D2735DE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000200000000000:2860793D818E97AAFF1D339D7702438D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000100000000000:6F9068BE73364AE250D89D78A6C9CE6F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000080000000000:024FC3FEF4883FEB1A8DD005305FECCE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000040000000000:08A61FE0816D75EA15EB3C9FB9CCDED6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000020000000000:449C86DFA13F260175CE39797686FFA4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000010000000000:4FFFFC29A59858E1133F2BFB1A8A4817:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000008000000000:19425D1F6480B25096561295697DC2B7:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000004000000000:31974727ECDD2C77C3A428FC3A8CB3FC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000002000000000:A57CD704B3C95E744D08DF443458F2F5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000001000000000:486D8C193DB1ED73ACB17990442FC40B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000800000000:5E4DBF4E83AB3BC055B9FCC7A6B3A763:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000400000000:ACF2E0A693FBBCBA4D41B861E0D89E37:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000200000000:32A7CB2AE066A51D2B78FC4B4CFCB608:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000100000000:677D494DBB73CAF55C1990158DA12F14:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000080000000:082A0D2367512ADF0D75A151BFBE0A17:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000040000000:5E5BB7337923C482CE8CBA249E6A8C7D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000020000000:D3001BA7C7026EE3E5003179530AFCFC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000010000000:46EC44F8931E629FE8FD8961312EDDE1:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000008000000:C5F8ECD79C7B30E81D17E32079969310:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000004000000:5B8AD6919E24CAEBCC55401AEE0C9802:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000002000000:C2302B7E701B5CC7F8B29E3516DBBFA6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000001000000:A1D04D6A76F9F7A94D49FAA64A87F244:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000800000:7FB6F92D35B5CB6C631600EDB9E860BA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000400000:B2EF7078BCFACE07AEEC3F9B48830EB3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000200000:F475A7493D24C7036E53390374C378B3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000100000:B36802AC987377A37BD8EADC97C57D60:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000080000:ADDCD3D19689C4DDC738CE5F69DC9505:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000040000:0DAF8CA22884915403C0F0BB1F4BD74F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000020000:4AF36BAE2660503B3248E4685059FD05:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000010000:7D5631814DD8E917D97A0D514C743971:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000008000:BC3352500FC0CBB9DB5B5F6B491C1BE8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000004000:6A4A30BA87E87AF65C90AEB7AFEDC76B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000002000:77E6125897668AC8E73E8C79A6FF8336:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000001000:3FA9D39104EBB323C7AAAA248960DD1E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000800:FAD75AD76AB10ADC49036B250E229D39:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000400:2FACAA5FE35B228A16AC74088D702EC4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000200:88B6CBCFDFEF8AD91720A1BB69A1F33E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000100:C7E9D250998632D444356242EF04058D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000080:B14DAD8D3D9153F46C0D3A1AD63C7A05:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000040:60ABA678A506608D0845966D29B5F790:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000020:482DC43F2388EF25D24144E144BD834E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000010:1490A05A7CEE43BDE98B56E309DC0126:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000008:ABFA77CD6E85DA245FB0BDC5E52CFC29:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000004:DD4AB1284D4AE17B41E85924470C36F7:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000002:CEA7403D4D606B6E074EC5D3BAF39D18:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000001:530F8AFBC74536B9A963B4F1C4CB738B:\ 0000000000000000000000000000000000000000000000000000000000000000 # From the 'official' Blowfish vectors (mostly by SSLeay, aka OpenSSL) [Blowfish] 0000000000000000:245946885754369A:0123456789ABCDEF 0000000000000000:4EF997456198DD78:0000000000000000 0000000000000000:F21E9A77B71C49BC:FFFFFFFFFFFFFFFF 004BD6EF09176062:452031C1E4FADA8E:584023641ABA6176 0123456789ABCDEF:0ACEAB0FC6A0A28D:FEDCBA9876543210 0123456789ABCDEF:7D0CC630AFDA1EC7:1111111111111111 0123456789ABCDEF:A790795108EA3CAE:1F1F1F1F0E0E0E0E 0123456789ABCDEF:C39E072D9FAC631D:E0FEE0FEF1FEF1FE 0123456789ABCDEF:FA34EC4847B268B2:0101010101010101 01A1D6D039776742:59C68245EB05282B:7CA110454A1A6E57 0248D43806F67172:1730E5778BEA1DA4:07A1133E4A0B2686 02FE55778117F12A:CF9C5D7A4986ADB5:49E95D6D4CA229BF 059B5E0851CF143A:48F4D0884C379918:0113B970FD34F2CE 072D43A077075292:7A8E7BFA937E89A3:4FB05E1515AB73A7 0756D8E0774761D2:432193B78951FC98:0170F175468FB5E6 1000000000000001:7D856F9A613063F2:3000000000000000 1111111111111111:2466DD878B963C9D:1111111111111111 1111111111111111:61F9C3802281B096:0123456789ABCDEF 164D5E404F275232:5F99D04F5B163969:37D06BB516CB7546 1D9D5C5018F728C2:D1ABB290658BC778:018310DC409B26D6 26955F6835AF609A:D887E0393C2DA6E3:04689104C2FD3B2F 305532286D6F295A:55CB3774D13EF201:1C587F1C13924FEF 3BDD119049372802:2EEDDA93FFD39C79:07A7137045DA2A16 42FD443059577FA2:353882B109CE8F1A:04B915BA43FEB5B6 437540C8698F3CFA:53C55F9CB49FC019:49793EBC79B3258F 480D39006EE762F2:7555AE39F59B87BD:025816164629B007 51454B582DDF440A:A25E7856CF2651EB:3849674C2602319E 5CD54CA83DEF57DA:B1B8CC0B250F09A0:0131D9619DC1376E 6B056E18759F5CCA:4A057A3B24D3977B:1F08260D1AC2465E 762514B829BF486A:13F04154D69D1AE5:43297FAD38E373FE FFFFFFFFFFFFFFFF:014933E0CDAFF6E4:0000000000000000 FFFFFFFFFFFFFFFF:51866FD5B85ECB8A:FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF:6B5C5A9C5D9E0A5A:FEDCBA9876543210 0123456789ABCDEF1111111111111111:7D0CC630AFDA1EC72466DD878B963C9D:\ 1111111111111111 FEDCBA9876543210:CC91732B8022F684:57686F206973204A6F686E2047616C743F 424C4F5746495348:324ED0FEF413A203:\ 6162636465666768696A6B6C6D6E6F707172737475767778797A FEDCBA9876543210:F9AD597C49DB005E:F0 FEDCBA9876543210:E91D21C1D961A6D6:F0E1 FEDCBA9876543210:E9C2B70A1BC65CF3:F0E1D2 FEDCBA9876543210:BE1E639408640F05:F0E1D2C3 FEDCBA9876543210:B39E44481BDB1E6E:F0E1D2C3B4 FEDCBA9876543210:9457AA83B1928C0D:F0E1D2C3B4A5 FEDCBA9876543210:8BB77032F960629D:F0E1D2C3B4A596 FEDCBA9876543210:E87A244E2CC85E82:F0E1D2C3B4A59687 FEDCBA9876543210:15750E7A4F4EC577:F0E1D2C3B4A5968778 FEDCBA9876543210:122BA70B3AB64AE0:F0E1D2C3B4A596877869 FEDCBA9876543210:3A833C9AFFC537F6:F0E1D2C3B4A5968778695A FEDCBA9876543210:9409DA87A90F6BF2:F0E1D2C3B4A5968778695A4B FEDCBA9876543210:884F80625060B8B4:F0E1D2C3B4A5968778695A4B3C FEDCBA9876543210:1F85031C19E11968:F0E1D2C3B4A5968778695A4B3C2D FEDCBA9876543210:79D9373A714CA34F:F0E1D2C3B4A5968778695A4B3C2D1E FEDCBA9876543210:93142887EE3BE15C:F0E1D2C3B4A5968778695A4B3C2D1E0F FEDCBA9876543210:03429E838CE2D14B:F0E1D2C3B4A5968778695A4B3C2D1E0F00 FEDCBA9876543210:A4299E27469FF67B:F0E1D2C3B4A5968778695A4B3C2D1E0F0011 FEDCBA9876543210:AFD5AED1C1BC96A8:F0E1D2C3B4A5968778695A4B3C2D1E0F001122 FEDCBA9876543210:10851C0E3858DA9F:F0E1D2C3B4A5968778695A4B3C2D1E0F00112233 FEDCBA9876543210:E6F51ED79B9DB21F:F0E1D2C3B4A5968778695A4B3C2D1E0F0011223344 FEDCBA9876543210:64A6E14AFD36B46F:F0E1D2C3B4A5968778695A4B3C2D1E0F001122334455 FEDCBA9876543210:80C7D7D45A5479AD:\ F0E1D2C3B4A5968778695A4B3C2D1E0F00112233445566 FEDCBA9876543210:05044B62FA52D080:\ F0E1D2C3B4A5968778695A4B3C2D1E0F0011223344556677 [Camellia-128] # From RFC 3713 0123456789ABCDEFFEDCBA9876543210:67673138549669730857065648EABE43:\ 0123456789ABCDEFFEDCBA9876543210 # Nessie 00000000000000000000000000000000:6C227F749319A3AA7DA235A9BBA05A2C:\ 80000000000000000000000000000000 00000000000000000000000000000000:F04D51E45E70FB6DEE0D16A204FBBA16:\ 40000000000000000000000000000000 00000000000000000000000000000000:ED44242E619F8C32EAA2D3641DA47EA4:\ 20000000000000000000000000000000 EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF:5CA8B8A4B8AF15A6184259831B18BBB5:\ EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:25DD9EB9DD67FBC6E8431F56F4FBE651:\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [Camellia-192] # From RFC 3713 0123456789ABCDEFFEDCBA9876543210:B4993401B3E996F84EE5CEE7D79B09B9:\ 0123456789ABCDEFFEDCBA98765432100011223344556677 # Nessie 00000000000000000000000000000000:1B6220D365C2176C1D41A5826520FCA1:\ 800000000000000000000000000000000000000000000000 FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE:A2F5A98929658AF4A9700B9923DAF014:\ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE [Camellia-256] # From RFC 3713 0123456789ABCDEFFEDCBA9876543210:9ACC237DFF16D76C20EF7C919E3A7509:\ 0123456789ABCDEFFEDCBA987654321000112233445566778899AABBCCDDEEFF 00000000000000000000000000000000:2136FABDA091DFB5171B94B8EFBB5D08:\ 8000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E18B0CB1980124504B46A46A6F4273F3:\ 0000000000000200000000000000000000000000000000000000000000000000 00000000000000000000000000000001:9CDB269B5D293BC5DB9C55B057D9B591:\ 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000001\ 0000000000000000000000000000000200000000000000000000000000000004\ 0000000000000000000000000000000800000000000000000000000000000010\ 0000000000000000000000000000002000000000000000000000000000000040:\ 396154111ADEFC500CF6E5C99038BC179CDB269B5D293BC5DB9C55B057D9B591\ 3D4B2CDE666761BA5DFB305178E667FB6A3F25AAB7E92D9CF378E5D9C040F26B\ 7C92854D801A1648F65CA81813DDBF83BA664AC39855518DFDEE10D1B3111FAE\ 7A6985778D3A66E97F23E01F0D0E45E78B1F247802E47C91BEE2AA34ECFD7A01:\ 0000000000000000000000000000000000000000000000000000000000000000 # First one is from RFC 2144. The rest were done with OpenSSL and bits taken # from /dev/urandom [CAST-128] 0123456789ABCDEF:238B4FE5847E44B2:0123456712345678234567893456789A 0D5ED4BF2C101A00:851769123481EEBD:51D35D2CFC978231CC8D404C05F20778 D6AA8EAE1E559AAE:C7FAFAFC64204DDE:3148F2F7A5EC9832C918B3FCE3A882D4 F2504FFBB8970532:6371C64A362D2A06:23CA10AC5007672EAAC2A652A1033051 4B1E9D8F450B7342:9CC2B912173553F3:69698114EB6B0C7DA021394E8294BA81 26D7BA5E58E367FC:A2D1FCB23EDBE861:E29067C7B82F2BB5787A95961C4B145B 960370DF205DF0C9:E1F5DCA58544FE69:724096996EA7E796847CC954DDB02F21 3E16104523173535:EF4B1D186287F9E4:C44CD3B7C176A89B849AEC9D1A834D25 6AB0B4F6FBDFE766:273B54BDF2B5588C:F5A1E7B8DF1852E0A12E150665812CE1 76300E213C3F9D73:6C51876F5EA9CE03:1BCBC553F08BA5AE3DC87E3A08D720A5 22A5191C0722F0D8:F1E19892EE7A4E51:0265563A752CB548404FEBA1C7231FA7 D20430D1B98AE949:79E576FC40F1DC98:9C553CF85065EC9EFE0A6526070DF766 1C7401D639A47971:BD2172A2ED5F5C02:1895E906311E100D6F189B0622248BC3 B8591CA50C7E763D:573F3DB3C43731FA:616A2B2C30F26B1386CD8B1E9E15D77E CDA3984E06CC637A:2525D6596ACE9CD1:14422858FA163B7C5267FF819773CE1D 5B5A603C9C090115:3729DAB86CB1CCF7:172E65C14E746EE6203025E94171D520 9F9881CA42D7024C:9C3C573D7B958521:3E9FB858087C4E937A408EC1352482B1 4A5C46FD61058258:2A1E5FD727F67F13:A32E8B1498839F6017802758076B0BFC EBBB828350790FDA:78FC70F88D1622ED:E303C6052387C310524721A2E461E89A 5097EDFFDFC0CA5B:3ABDD3B9A69C7330:3B3DE3DA709304F69F1DD00F00A05064 8F950AE00DD2F279:2C62AFD2C641CCE8:C36EC561C6E005B5FC5F03F2A90B097E D23B8A5E996E263D:31A202CC0F9FB2B7:202F39862076420EA9DF9DECCDC507AB 8D953359228A4C76:AA454DE10B7A6863:CCD6F6AAEEB788E928CECF99440BBF07 D2E9C19314726F4D:B744FAB9846F35E4:017779EA29084F30B867FDDFF56A2158 F4C032C960A5B463:EDA7B0739A0638EE:CE44271A18D709DCC62648F709C1CBE2 81A0FD9AA423ED36:C3CCCC1389F1D712:B9F0598CFA6D4F92294C4BA43ED360F2 B7E0072AE1CBEE65:AEF33EEDCCC2E47F:5A6C06E02E3D5177D26F0D63DF839057 F5810D9F1D639F82:A7A88EFA33ACF56E:547DF75C2FCFF20C1ED3A77AF1AD66E8 984A16BE2CD649AC:444FC61F5CAB5A14:9CC9412E02C03D423E055D340BC74460 8BC57E1C4D4DB959:6AAFD5AD02B48AAD:D2E4D28086A37BF2927C9477C8184907 E79C0E003AE33C71:DCD139EFE59F5B1B:AFE83744D296834750A5AEC59C1FA546 5E8EB11FF48AE593:947A1A1472AF838E:B933E959F7D492EACA22E7DF1C179C79 FD9072FAB981B8AA:57A9C621EF5BE045:6DC4F66D0812A820134C3F61E398195E 53515B1ABC74C9FB:C87A6000F80DADAF:4FA0C134D50DDCAE2FA8828479149C61 1086DE79B6DC0C18:102FFA93ECBB99CF:7A6ECA7EAAF393694A32AF561FF7E056 351228904431D12A:DC8B4548DA69C92D:42400F970D5E6E38DE297B365C0704D3 889F00F0EC62610F:3AEC2335A78EC8F9:50D77ED75F69D9FD89C0B58A5374CC8E 05CC553B50019A76:7A3F48D2954FB957:321E02B40C3F7D9D55A5135620685DC8 D30DBA7A648B2CE9:242C1509768F5F9E:DA1CA8F596F04697592CE210752FD08D 1917132061B5B572:28FDDE7607EBE08D:9C56B69695DB96CEDBF1133386D13768 8420D1986EBBABFC:EAACBF83A093CB44:9F79CA83F4FDCCACA166BF18BF1B0CC2 # From my AES CD, I'm guessing [CAST-256] 00000000000000000000000000000000:66918B620F075819CDE620469D5F39B8:\ 80000000000000000000000000000000 00000000000000000000000000000000:C842A08972B43D20836C91D1B7530F6B:\ 2342BB9EFA38542C0AF75647F29F615D 00000000000000000000000000000001:4DBF11C2CA26D5A712578A5C18E8487B:\ 00000000000000000000000000000000 00000000000000000000000000000000:1B386C0210DCADCBDD0E41AA08A7A7E8:\ 2342BB9EFA38542CBED0AC83940AC298BAC77A7717942863 80000000000000000000000000000000:D64AD4962DCF990CB9EB1BEF19A21B98:\ 000000000000000000000000000000000000000000000000 00000000000040000000000000000000:0154FF22D769EB57AE14D7ECDD60C1D8:\ 000000000000000000000000000000000000000000000000 80000000000000000000000000000000:D64AD4962DCF990CB9EB1BEF19A21B98:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000001:4DBF11C2CA26D5A712578A5C18E8487B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:41C30E3025A7E66F6AE733DFDC861341:\ 0000000000000000000000200000000000000000000000000000000000000000 00000000000000000000000000000000:4F6A2038286897B9C9870136553317FA:\ 2342BB9EFA38542CBED0AC83940AC2988D7C47CE264908461CC1B5137AE6B604 0000000000000000000000000C9B2807:963A8A50CEB54D08E0DEE0F1D0413DCF:\ 2342BB9EFA38542C0AF75647F29F615D 000000000000000000000000EE356B0F:B25683CD9188DB9307F8A1236B53DE86:\ 2342BB9EFA38542CBED0AC83940AC298BAC77A7717942863 000000000000000000000000B2E9D805:AAB348855CAC0DC7BDF2FA02757A2154:\ 2342BB9EFA38542CBED0AC83940AC2988D7C47CE264908461CC1B5137AE6B604 [DES] 059B5E0851CF143A:86A560F10EC6D85B:0113B970FD34F2CE 4E6F772069732074:3FA40E8A984D4815:0123456789ABCDEF 666F7220616C6C20:893D51EC4B563B53:0123456789ABCDEF 68652074696D6520:6A271787AB8883F9:0123456789ABCDEF 5CD54CA83DEF57DA:7A389D10354BD271:0131D9619DC1376E 0756D8E0774761D2:0CD3DA020021DC09:0170F175468FB5E6 1D9D5C5018F728C2:5F4C038ED12B2E41:018310DC409B26D6 480D39006EE762F2:A1F9915541020B56:025816164629B007 26955F6835AF609A:5C513C9C4886C088:04689104C2FD3B2F 42FD443059577FA2:AF37FB421F8C4095:04B915BA43FEB5B6 0248D43806F67172:868EBB51CAB4599A:07A1133E4A0B2686 3BDD119049372802:DFD64A815CAF1A0F:07A7137045DA2A16 16393BCDD6560506:9966ADCFC53BF968:0A3FDDC8350AFF39 DC7FC6CF0358ECC0:A47A7485661F7085:10DD6DCD5C89E151 305532286D6F295A:63FAC0D034D9F793:1C587F1C13924FEF F786D02413C574FC:54C160D369F62AE3:1EB00767BDEE584E 6B056E18759F5CCA:EF1BF03E5DFA575A:1F08260D1AC2465E 905EA29AEEA26E07:2292E9AEBEE6A4B6:28EE445D8A21C534 164D5E404F275232:0A2AEEAE3FF4AB77:37D06BB516CB7546 51454B582DDF440A:7178876E01F19B2A:3849674C2602319E 68FF9D6068C71513:84595F5B9D046132:3CDE816EF9EF8EDB 762514B829BF486A:EA676B2CB7DB2B7A:43297FAD38E373FE 437540C8698F3CFA:6FBF1CAFCFFD0556:49793EBC79B3258F 02FE55778117F12A:5A6B612CC26CCE4A:49E95D6D4CA229BF 1F508A50ADB3D6E2:470204969876604A:4BB53ECFEFB38DDE 072D43A077075292:2F22E49BAB7CA1AC:4FB05E1515AB73A7 004BD6EF09176062:88BF0DB6D70DEE56:584023641ABA6176 5AA1D62806AE0EAD:6DB0F280FEF2B564:5F2B51F59E781D9C 7E1B1C6776833772:EB11CD3C72F7E90E:699C920D7CE1E0B1 5DBFB47C5F471136:9C8B904D4D772BE7:7AC2FDEEE4C79746 01A1D6D039776742:690F5B0D9A26939B:7CA110454A1A6E57 4DE2F0926CF598D7:BA107655991DF529:7FC92C3098ECF14A F45E6819E3108559:F0C76BA556283B2F:9AB645E268430854 51D4EAAAC6D76553:BF3C6E8FD15BA861:A6B0AE88F980011A 6A89626EA8038511:1067B36913CBCC47:BAFEBAFAFEAEEAFF 7B0313C0D3A866F9:E49E15E4F46F10E9:BB2420B5FEE5A6A1 9D4A44AEFCE79965:77B2ECC9278E9714:BEBAFBEABAFFEAAF 59BCDFC253424CB5:0A50ABBBCD07061A:C38C6F20230D9ED5 D6C059A85EE2B13E:25977533635BEB5B:C6F974504D954C7E F9E4821DFCAA5466:48EC3A79399E9A00:CB959B7FFD94F734 35E8554BAD60FB29:993A3AF0BC0D77A4:CFB23034323CD19A 9F97210D75B7E6DF:4729E3396E57AE4E:D4D861035745F2C8 FFFFFFFFFFFFFFFF:B5CE4F28FDEB21E8:E36972FC4BEC7587 323837024123C918:7F28BF28ADFA1CF0:E91A71A7ED5EB0EF 37DFE527086AF0A0:5F53C6C87760256E:EBBBBAEBFBBEFABA 20678F45B5B8AC00:7CC8ECF2638CC808:EBBEEEAEBBBBFFFF 78481ED0C5A7C93E:4CA3A08300EA6AFC:FBEAFFEEFFEEABAB E2CCD415AC25412A:BD85B3B659AB7276:FD8A675C0ED08301 CCCC5BDFD9029507:DA57553D7D55775F:FFFFFFFFFFFFFFFF 0000000000000000:23083A3CA70DD027:D5D44FF720683D0D 0100000000000000:6F353E3388ABE2EF:D5D44FF720683D0D 95F8A5E5DD31D900:8000000000000000:0101010101010101 95F8A5E5DD31D900:8000000000000000:0000000000000000 DD7F121CA5015619:4000000000000000:0101010101010101 2E8653104F3834EA:2000000000000000:0101010101010101 4BD388FF6CD81D4F:1000000000000000:0101010101010101 20B9E767B2FB1456:0800000000000000:0101010101010101 20B9E767B2FB1456:0800000000000000:0001010101010100 55579380D77138EF:0400000000000000:0101010101010101 6CC5DEFAAF04512F:0200000000000000:0101010101010101 0D9F279BA5D87260:0100000000000000:0101010101010101 D9031B0271BD5A0A:0080000000000000:0101010101010101 424250B37C3DD951:0040000000000000:0101010101010101 B8061B7ECD9A21E5:0020000000000000:0101010101010101 F15D0F286B65BD28:0010000000000000:0101010101010101 ADD0CC8D6E5DEBA1:0008000000000000:0101010101010101 E6D5F82752AD63D1:0004000000000000:0101010101010101 ECBFE3BD3F591A5E:0002000000000000:0101010101010101 F356834379D165CD:0001000000000000:0101010101010101 2B9F982F20037FA9:0000800000000000:0101010101010101 889DE068A16F0BE6:0000400000000000:0101010101010101 E19E275D846A1298:0000200000000000:0101010101010101 329A8ED523D71AEC:0000100000000000:0101010101010101 E7FCE22557D23C97:0000080000000000:0101010101010101 12A9F5817FF2D65D:0000040000000000:0101010101010101 A484C3AD38DC9C19:0000020000000000:0101010101010101 FBE00A8A1EF8AD72:0000010000000000:0101010101010101 750D079407521363:0000008000000000:0101010101010101 64FEED9C724C2FAF:0000004000000000:0101010101010101 F02B263B328E2B60:0000002000000000:0101010101010101 9D64555A9A10B852:0000001000000000:0101010101010101 D106FF0BED5255D7:0000000800000000:0101010101010101 E1652C6B138C64A5:0000000400000000:0101010101010101 E428581186EC8F46:0000000200000000:0101010101010101 AEB5F5EDE22D1A36:0000000100000000:0101010101010101 E943D7568AEC0C5C:0000000080000000:0101010101010101 DF98C8276F54B04B:0000000040000000:0101010101010101 B160E4680F6C696F:0000000020000000:0101010101010101 FA0752B07D9C4AB8:0000000010000000:0101010101010101 CA3A2B036DBC8502:0000000008000000:0101010101010101 5E0905517BB59BCF:0000000004000000:0101010101010101 814EEB3B91D90726:0000000002000000:0101010101010101 4D49DB1532919C9F:0000000001000000:0101010101010101 25EB5FC3F8CF0621:0000000000800000:0101010101010101 AB6A20C0620D1C6F:0000000000400000:0101010101010101 79E90DBC98F92CCA:0000000000200000:0101010101010101 866ECEDD8072BB0E:0000000000100000:0101010101010101 8B54536F2F3E64A8:0000000000080000:0101010101010101 EA51D3975595B86B:0000000000040000:0101010101010101 CAFFC6AC4542DE31:0000000000020000:0101010101010101 8DD45A2DDF90796C:0000000000010000:0101010101010101 1029D55E880EC2D0:0000000000008000:0101010101010101 5D86CB23639DBEA9:0000000000004000:0101010101010101 1D1CA853AE7C0C5F:0000000000002000:0101010101010101 CE332329248F3228:0000000000001000:0101010101010101 8405D1ABE24FB942:0000000000000800:0101010101010101 E643D78090CA4207:0000000000000400:0101010101010101 48221B9937748A23:0000000000000200:0101010101010101 DD7C0BBD61FAFD54:0000000000000100:0101010101010101 2FBC291A570DB5C4:0000000000000080:0101010101010101 E07C30D7E4E26E12:0000000000000040:0101010101010101 0953E2258E8E90A1:0000000000000020:0101010101010101 5B711BC4CEEBF2EE:0000000000000010:0101010101010101 CC083F1E6D9E85F6:0000000000000008:0101010101010101 D2FD8867D50D2DFE:0000000000000004:0101010101010101 06E7EA22CE92708F:0000000000000002:0101010101010101 166B40B44ABA4BD6:0000000000000001:0101010101010101 0000000000000000:95A8D72813DAA94D:8001010101010101 0000000000000000:0EEC1487DD8C26D5:4001010101010101 0000000000000000:7AD16FFB79C45926:2001010101010101 0000000000000000:D3746294CA6A6CF3:1001010101010101 0000000000000000:809F5F873C1FD761:0801010101010101 0000000000000000:C02FAFFEC989D1FC:0401010101010101 0000000000000000:4615AA1D33E72F10:0201010101010101 0000000000000000:2055123350C00858:0180010101010101 0000000000000000:DF3B99D6577397C8:0140010101010101 0000000000000000:31FE17369B5288C9:0120010101010101 0000000000000000:DFDD3CC64DAE1642:0110010101010101 0000000000000000:178C83CE2B399D94:0108010101010101 0000000000000000:50F636324A9B7F80:0104010101010101 0000000000000000:A8468EE3BC18F06D:0102010101010101 0000000000000000:A2DC9E92FD3CDE92:0101800101010101 0000000000000000:CAC09F797D031287:0101400101010101 0000000000000000:90BA680B22AEB525:0101200101010101 0000000000000000:CE7A24F350E280B6:0101100101010101 0000000000000000:882BFF0AA01A0B87:0101080101010101 0000000000000000:25610288924511C2:0101040101010101 0000000000000000:C71516C29C75D170:0101020101010101 0000000000000000:5199C29A52C9F059:0101018001010101 0000000000000000:C22F0A294A71F29F:0101014001010101 0000000000000000:EE371483714C02EA:0101012001010101 0000000000000000:A81FBD448F9E522F:0101011001010101 0000000000000000:4F644C92E192DFED:0101010801010101 0000000000000000:1AFA9A66A6DF92AE:0101010401010101 0000000000000000:B3C1CC715CB879D8:0101010201010101 0000000000000000:19D032E64AB0BD8B:0101010180010101 0000000000000000:3CFAA7A7DC8720DC:0101010140010101 0000000000000000:B7265F7F447AC6F3:0101010120010101 0000000000000000:9DB73B3C0D163F54:0101010110010101 0000000000000000:8181B65BABF4A975:0101010108010101 0000000000000000:93C9B64042EAA240:0101010104010101 0000000000000000:5570530829705592:0101010102010101 0000000000000000:8638809E878787A0:0101010101800101 0000000000000000:41B9A79AF79AC208:0101010101400101 0000000000000000:7A9BE42F2009A892:0101010101200101 0000000000000000:29038D56BA6D2745:0101010101100101 0000000000000000:5495C6ABF1E5DF51:0101010101080101 0000000000000000:AE13DBD561488933:0101010101040101 0000000000000000:024D1FFA8904E389:0101010101020101 0000000000000000:D1399712F99BF02E:0101010101018001 0000000000000000:14C1D7C1CFFEC79E:0101010101014001 0000000000000000:1DE5279DAE3BED6F:0101010101012001 0000000000000000:E941A33F85501303:0101010101011001 0000000000000000:DA99DBBC9A03F379:0101010101010801 0000000000000000:B7FC92F91D8E92E9:0101010101010401 0000000000000000:AE8E5CAA3CA04E85:0101010101010201 0000000000000000:9CC62DF43B6EED74:0101010101010180 0000000000000000:D863DBB5C59A91A0:0101010101010140 0000000000000000:A1AB2190545B91D7:0101010101010120 0000000000000000:0875041E64C570F7:0101010101010110 0000000000000000:5A594528BEBEF1CC:0101010101010108 0000000000000000:FCDB3291DE21F0C0:0101010101010104 0000000000000000:869EFD7F9F265A09:0101010101010102 0000000000000000:88D55E54F54C97B4:1046913489980131 0000000000000000:0C0CC00C83EA48FD:1007103489988020 0000000000000000:83BC8EF3A6570183:10071034C8980120 0000000000000000:DF725DCAD94EA2E9:1046103489988020 0000000000000000:E652B53B550BE8B0:1086911519190101 0000000000000000:AF527120C485CBB0:1086911519580101 0000000000000000:0F04CE393DB926D5:5107B01519580101 0000000000000000:C9F00FFC74079067:1007B01519190101 0000000000000000:7CFD82A593252B4E:3107915498080101 0000000000000000:CB49A2F9E91363E3:3107919498080101 0000000000000000:00B588BE70D23F56:10079115B9080140 0000000000000000:406A9A6AB43399AE:3107911598090140 0000000000000000:6CB773611DCA9ADA:1007D01589980101 0000000000000000:67FD21C17DBB5D70:9107911589980101 0000000000000000:9592CB4110430787:9107D01589190101 0000000000000000:A6B7FF68A318DDD3:1007D01598980120 0000000000000000:4D102196C914CA16:1007940498190101 0000000000000000:2DFA9F4573594965:0107910491190401 0000000000000000:B46604816C0E0774:0107910491190101 0000000000000000:6E7E6221A4F34E87:0107940491190401 0000000000000000:AA85E74643233199:19079210981A0101 0000000000000000:2E5A19DB4D1962D6:1007911998190801 0000000000000000:23A866A809D30894:10079119981A0801 0000000000000000:D812D961F017D320:1007921098190101 0000000000000000:055605816E58608F:100791159819010B 0000000000000000:ABD88E8B1B7716F1:1004801598190101 0000000000000000:537AC95BE69DA1E1:1004801598190102 0000000000000000:AED0F6AE3C25CDD8:1004801598190108 0000000000000000:B3E35A5EE53E7B8D:1002911598100104 0000000000000000:61C79C71921A2EF8:1002911598190104 0000000000000000:E2F5728F0995013C:1002911598100201 0000000000000000:1AEAC39A61F0A464:1002911698100101 # Tests all sboxes 01A1D6D039776742:690F5B0D9A26939B:7CA110454A1A6E57 5CD54CA83DEF57DA:7A389D10354BD271:0131D9619DC1376E 0248D43806F67172:868EBB51CAB4599A:07A1133E4A0B2686 51454B582DDF440A:7178876E01F19B2A:3849674C2602319E 42FD443059577FA2:AF37FB421F8C4095:04B915BA43FEB5B6 059B5E0851CF143A:86A560F10EC6D85B:0113B970FD34F2CE 0756D8E0774761D2:0CD3DA020021DC09:0170F175468FB5E6 762514B829BF486A:EA676B2CB7DB2B7A:43297FAD38E373FE 3BDD119049372802:DFD64A815CAF1A0F:07A7137045DA2A16 26955F6835AF609A:5C513C9C4886C088:04689104C2FD3B2F 164D5E404F275232:0A2AEEAE3FF4AB77:37D06BB516CB7546 6B056E18759F5CCA:EF1BF03E5DFA575A:1F08260D1AC2465E 004BD6EF09176062:88BF0DB6D70DEE56:584023641ABA6176 480D39006EE762F2:A1F9915541020B56:025816164629B007 437540C8698F3CFA:6FBF1CAFCFFD0556:49793EBC79B3258F 072D43A077075292:2F22E49BAB7CA1AC:4FB05E1515AB73A7 02FE55778117F12A:5A6B612CC26CCE4A:49E95D6D4CA229BF 1D9D5C5018F728C2:5F4C038ED12B2E41:018310DC409B26D6 305532286D6F295A:63FAC0D034D9F793:1C587F1C13924FEF # Tests the permutation 0000000000000000:88D55E54F54C97B4:1046913489980131 0000000000000000:0C0CC00C83EA48FD:1007103489988020 0000000000000000:83BC8EF3A6570183:10071034C8980120 0000000000000000:DF725DCAD94EA2E9:1046103489988020 0000000000000000:E652B53B550BE8B0:1086911519190101 0000000000000000:AF527120C485CBB0:1086911519580101 0000000000000000:0F04CE393DB926D5:5107B01519580101 0000000000000000:C9F00FFC74079067:1007B01519190101 0000000000000000:7CFD82A593252B4E:3107915498080101 0000000000000000:CB49A2F9E91363E3:3107919498080101 0000000000000000:00B588BE70D23F56:10079115B9080140 0000000000000000:406A9A6AB43399AE:3107911598080140 0000000000000000:6CB773611DCA9ADA:1007D01589980101 0000000000000000:67FD21C17DBB5D70:9107911589980101 0000000000000000:9592CB4110430787:9107D01589190101 0000000000000000:A6B7FF68A318DDD3:1007D01598980120 0000000000000000:4D102196C914CA16:1007940498190101 0000000000000000:2DFA9F4573594965:0107910491190401 0000000000000000:B46604816C0E0774:0107910491190101 0000000000000000:6E7E6221A4F34E87:0107940491190401 0000000000000000:AA85E74643233199:19079210981A0101 0000000000000000:2E5A19DB4D1962D6:1007911998190801 0000000000000000:23A866A809D30894:10079119981A0801 0000000000000000:D812D961F017D320:1007921098190101 0000000000000000:055605816E58608F:100791159819010B 0000000000000000:ABD88E8B1B7716F1:1004801598190101 0000000000000000:537AC95BE69DA1E1:1004801598190102 0000000000000000:AED0F6AE3C25CDD8:1004801598190108 0000000000000000:B3E35A5EE53E7B8D:1002911598100104 0000000000000000:61C79C71921A2EF8:1002911598190104 0000000000000000:E2F5728F0995013C:1002911598100201 0000000000000000:1AEAC39A61F0A464:1002911698100101 # Vectors randomly generated using OpenSSL 0CEB1136A85AD37A:9CE3A1058A483F55:309A4B21A2067196 9BBBD2F50EC248A8:7694CA89548B0A3B:CA61DEF25C51A5A0 FF82E00A54C33870:ADF2C2D3F57C12EC:054F6AC2C779D51A 3E33A822C3C3573A:91481544C1349FD2:AB28E5763F23361A 8BB2EC62E042C9BF:62F0E53062A010B9:A9C631D31852201F 4844511C42049973:C7265CA05D9F3253:3D90CADF843BBA1B 38F11633A3766D10:66D55E36CCE18435:B6006A2C549DEA94 746BC597A7501FF0:0032D9CA6E094980:070A848D67D7701C FA5F22A6A7DDBB8B:91ECEFD28E217506:A12AE6006E8F8D37 8D3D08E33FBB298D:CF132CE973D16AA3:9998A725FB90FDE4 397CA570B07AF49E:4C2959260E6C27DC:F111F3AFD4602715 6ACFBFF2962511A9:2D325409EF2CD744:EF97EA242CCBAC00 EB5167B434A4595A:483EA80264F0DCF6:9080E3410BFCDB73 E72EDA1F8AE27EB9:0E4AF25FBDD5A85E:8A37156BE5515D5D B0F7D48AA74DD638:7F6747AEF2C9EAC9:DF09A6387CFE9A6B 334A69684C8B728A:6717F2AD848DEAF7:B4FCAFFB540653E5 A78C724DA4DC969D:AC6A97ECE16A8892:183972A45732379A 4310191D687F40D6:C9B0C9CA84CFC141:979D352937F85083 F630889FB4B5ED90:6166F3231EC1EAD9:5CEDCE103F7F73C4 C9C7BFE95A2F77FD:B6C234EAF4A39B1F:4AD1B967A715F5A9 43E2B87BB55A3038:B9BE452E0E4EA44D:F883F548F16E692A 42AA788D751F49A5:5302E3BA833E598A:D75198DF25CC1345 63E22CDF499763C3:70E8BD70BCE301CB:7033D4C5D9B36096 665976555719E76F:65769A95FB144DE9:76B7EAC1DB819238 12DD07305BC143DE:A5E73B90A3E75586:76FC0A292121B094 45A11A91EF86DDA6:6E2C2CC2A2333C88:B775628F1EC6520C 537FEBCB1219673B:D578B8AA85351F91:65BF73315A05061C F5F17039BA37C1C0:3D6A8E5991C3AEBB:E772317D24F6D307 D0530A774112DC14:307AE98F2B6864D0:461E02D82081CA3A A46F062CBB7BFC33:A9D2B0940F0A7F58:08FF3D9BDE9EEA8E A47F14BAA946FB7B:4E79EBEFD716D85F:4D92A8AE6F9C6A35 692A27DA86F2E283:29961C5FD6744638:FB1C7BB97C7ED50C 74D5CD027725903C:B8A8076072E55000:C9B0558D7C353C5E 2311E3818223DFA9:17A4E5989E9C9A3D:60D82E111EEEDEA8 984B849763274BD3:205C2B2AEDB6052D:76DB3E3505FD3A95 9852C739E74737B7:525CBAD9C2D50EA0:558EF761EEE52DCF 6C4236CFAEFF63EC:E1AD916DED6850F4:AC340D97D96CF29E 1A95C43E9C7D5339:B60E5C4C76CE51C6:50F5C29F83C8F2BF 7DBE4645B2C169F4:285276D256091B2E:C7BF9EB44254ACA6 841DEAE87A860986:799A5A58E5CE9D59:FE80AB20EAC7AD16 1529ACE917CA5AB4:AAB07F8FDBDC494E:B012DE369D9B7436 86462C0AD4003FEC:51310B7C123C64C4:61896A3271D3E2B2 A67151571BE9AB07:3024667AFF88ADAB:8514D38254A5A55F B314608B183F3329:AA966A7A395FFAE7:F607C0CD0FAFCC60 84B322B129ABACDF:C50F0D6E439E8490:10EEC9E7F07A51D3 E296E275356AA9A0:B3963851F7DEB2C3:32F4E03E3B10DB42 4DF2292E321837F6:1D017CE1B3C03380:52205900EE0836E6 88A2C60FB19E5983:77763644264C8FB8:A481D9B2C7FDA435 06CA0C88A4347E12:F1FCAEAF30C63870:404025B368276238 FEFD2DF531FE9112:8F49A08722BB14F0:657486656993AC7B # From http://people.csail.mit.edu/rivest/Destest.txt 9474B8E8C73BCA7D:8DA744E0C94E5E17:9474B8E8C73BCA7D 0CDB25E3BA3C6D79:8DA744E0C94E5E17:8DA744E0C94E5E17 0CDB25E3BA3C6D79:4784C4BA5006081F:0CDB25E3BA3C6D79 1CF1FC126F2EF842:4784C4BA5006081F:4784C4BA5006081F 1CF1FC126F2EF842:E4BE250042098D13:1CF1FC126F2EF842 7BFC5DC6ADB5797C:E4BE250042098D13:E4BE250042098D13 7BFC5DC6ADB5797C:1AB3B4D82082FB28:7BFC5DC6ADB5797C C1576A14DE707097:1AB3B4D82082FB28:1AB3B4D82082FB28 C1576A14DE707097:739B68CD2E26782A:C1576A14DE707097 2A59F0C464506EDB:739B68CD2E26782A:739B68CD2E26782A 2A59F0C464506EDB:A5C39D4251F0A81E:2A59F0C464506EDB 7239AC9A6107DDB1:A5C39D4251F0A81E:A5C39D4251F0A81E 7239AC9A6107DDB1:070CAC8590241233:7239AC9A6107DDB1 78F87B6E3DFECF61:070CAC8590241233:070CAC8590241233 78F87B6E3DFECF61:95EC2578C2C433F0:78F87B6E3DFECF61 1B1A2DDB4C642438:95EC2578C2C433F0:95EC2578C2C433F0 [DESX] 94DBE082549A14EF:9011121314151617:\ 0123456789ABCDEF01010101010101011011121314151617 B83DF91F844FF695:FA942810AC8355C0:\ E874076EF40EDA62908D12ADF2B7B9ECDA474BF3FEDCDA11 4EF5D7337D420403:B2C3C73B303BE0D7:\ 2AF5602DA83F821A69C81B1B83EFA70A3B4E3C1D546BF825 8D3C8F07A610FD51:5712559676CABA44:\ BEB7DF4A710FACB364183EEBCA3EE934A5B470031CE64A03 B39949A845EF61C1:3769F87FB393D49F:\ 46312600F8B5F05AFAA080D26672B9C44AF057D694702AB5 B00E6572A847D27A:6B1C14571BC9EBCE:\ 25A3EAE6D9FB10E86E14032BB652262CD1D7ED74A2BFC75B 07608C7CB2B11972:CD627B22E13ECCD4:\ 3D5BEA2C2216E30CE961882A593608CB5BA96FC656AF7487 C2B7BCC1EA18B54A:66EF45BEA20DDAAF:\ 5AD28C1D67C65E4D5F4A9DB38C32827BC6C4FE098996F017 59004793279BBEFA:F0B6AC1318F01331:\ 8A94FCBF30415180EF79881D32C8C061E4527DE53BF5915D [TripleDES] 0123456789ABCDE7:7F1D0A77826B8AFF:0123456789ABCDEFFEDCBA9876543210 4E6F772069732074:3FA40E8A984D4815:0123456789ABCDEF0123456789ABCDEF 42FD443059577FA2:AF37FB421F8C4095:04B915BA43FEB5B604B915BA43FEB5B6 AFA4284FCCEAA61A:32527D5701D92B90:4BC59E2C68ACA60767A9A4B623BBBCCC 50B503A331D5B5CC:E46A59E18B0C41E3:B955BB7861FDE77E7DC6418475457FE1 3404435D5DF2CB47:644DD68EA73053AE:C0557629EAA72ABD4C102C5DC9CE8B47 C7D80E955D1B6627:9FE1C5A12CCE6DD9:9EAA94DA916F30092E79DACDCDCC45C0 BDCBE8929CD0E12F:F2B6430450AB348B:A55279671807D9B71FE62A77341249F8 4B7A96B7051C64FC:1555F08B2DE690A0:672E20826AD49C3DF7579FAB3752479E 902F4EDD44EAF3C1:3CE357EBA0FB3E26:0CE61EDE2659B413AB9F717AE4AFAD3E 39C0F8E4C85CD70D:882DE9B6D0209A58:E878020815AE517CD2808B6571EAC2B4 F77A1947A921B209:E10DBEE5615F312E:D891CA20919F06A054BA3943C7DABA16 06D0416E0F0DB7CE:0CEC5D1E59D7E347:4909AED1F94EB77B6CACBCAE2B25689A F7BB3A396D73D8A8:F893B6B2A15D3FCE:8B9A5C13B0B118A1EE35EB912866FFA6 BD35E3134B90CCBC:12A7AF172FD0CA7F:FA7911D664326074B42E2F38E599B288 E046B7F5707DA4FC:32B6A3FC72C7C480:406903B340B8637928FDE8058BDD6710 58EB1DC16C482213:A6C6234A8BBAA116:37A2B53E2AF8F6C9A73B39F919D969DE 4BD0F4854297FBDE:F4AB771861457DC6:711F2CECDB92B2E201DFEFA79FA7BA2F 42FD443059577FA2:AF37FB421F8C4095:\ 04B915BA43FEB5B604B915BA43FEB5B604B915BA43FEB5B6 736F6D6564617461:18D748E563620572:\ 0123456789ABCDEF5555555555555555FEDCBA9876543210 7371756967676C65:C07D2A0FA566FA30:\ 0352020767208217860287665908219864056ABDFEA93457 0123456789ABCDE7:DE0B7C06AE5E0ED5:\ 0123456789ABCDEFFEDCBA987654321089ABCDEF01234567 0123456789ABCDE7:7F1D0A77826B8AFF:\ 0123456789ABCDEFFEDCBA98765432100123456789ABCDEF 4115E551299A5C4B:F7A0822FC310686C:\ 1EF743A68D629F68A5E3136C36AD7953A835CF849BB4EC3C D5AB44E0FE46E1B5:02AED9BF72ECA222:\ B7D560BE49C3936728EF0BF57B602D2EB7E5C631DD7F753E B4077DFDB721D88C:F76ABA838B1C4372:\ D2D98706E9AB867647D244BDCDBCD5EF8B4DBC9CF4F35493 890E98AB385FA1A1:187087C77790C3B2:\ 153B963004101D12683E8F87116001B8C5526475510B5036 02D5DA6D5F247CD2:89FC7DF1E7913163:\ 45E4275DCCC5D8B5A27993C16D9960CA939C023E2763216A 5AF9E5A3525E3F7D:8FCC7A8BC337E484:\ F6C2474B33934EA76E6C841D9B1E86E37189095A895A3E5A 12864DDE8E694BD1:5B4DDE8F000A5A9B:\ 5B4F6D3185EFBAE97D58ED9CC75E2BAE655D2CEFB2DD09CD 0123456789ABCDE7:C95744256A5ED31D:\ 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF 68652074696D6520:6A271787AB8883F9:\ 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF 4E6F772069732074:3FA40E8A984D4815:\ 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF 94A8A0655AF71024:A427AA4C6234817E:\ C9B6D82EF93DD4C7AC365AB2D9280EB39DD92C0CE3F72BDE 2881AE1EF7DC8DE2:5C009647DE419151:\ 704A6378B5C72C3F1617B97508777FACF8E2205C66D29279 462EC3631C8C0DA9:52E8D6E3F54404C3:\ 9D5DF5B9222F4E04197A0E194AFBD4BA0225D1472F925076 941F85F14CC3E9F8:3FE08C51BC513AD9:\ 8374C4173F715AA127877D3BEFB8C0B2FF5987E12B112FD9 99A30F38CE575814:5C02AECC12404AB6:\ CD5BCCEC928C04E91E4CFC715E10E029E01F870FB98E7B34 69F80C7EAF46CBAD:9FF8BCB5707A0ED9:\ 59345A37BE821AA78E0BD97259C54BEBB1F644B78B1FD310 62522184CE03EFF7:0E98911465E30E76:\ E3C22C1AAAAF0FBF61A170BC24361F274B404E36C8F1794A DED10258F58DAA03:2CD2D1F377C13A53:\ C0E492C873EFE871E534A2A30600418D636C3FC76C4E9EA6 AFC190AF21D37A39:E7B312CCC287374C:\ DC80FA652BBB01186C6CFDDF55E109808F6CCEC99DEE3633 8A206F645001553B:B824E9E801940B83:\ 276B5FC5C5255AE2484114EAC33CD228A7BEAA9487D9A729 2095D9F03C7EC366:537201E0D3FFCECE:\ 70890F38A3A6744162356109589DC20ABF2D3AD8E989A77F D51A8F5310D314DE:7EE4FEA9B78CB899:\ 86164AB6C13CA0AD6B35EEDDDE102428C822C22DB1326661 B0317287CC8D536B:118293DE51E43D00:\ 98D2D51E2916D25237DAFC6B5CFBB5AED7CCD916BF243004 A8BF0F3A57822AFE:9FD4F7B0500C0F53:\ BBA72F7362A8E3BA6EE190C4E0AC25560BB0DF1097F94C13 C16B7EAD2367C87D:9FE31F892EB7E617:\ 6F9DD25B6ACAB7019A548B6B0E1AA35AFEF95D89DB20FB11 C5E3D11391C7875B:0B5BC8B430785004:\ 1670F96FC4D670CF3BEC580AE1735FE3DFB3E0377FEC16C8 CCCBFFFAB48110DB:08E145136C8112C4:\ 3B55AC7156436FCA1D639BC33541F91AD0BE7525C3D0E823 039391950AC5937C:5251FDDBD6E2E70D:\ D24A2A7340C974E68265C4DFACE67041852889ADDF1216AF 41BD298935B10395:228EDD3DA5B00098:\ 777EAD928BFB661003A4E0F0920CD161A2C03963C816F1F3 FFC524C0B0F48806:092D1465E01D9356:\ 6335EA2F228A811B7B70AE47BF13F8D456A717BC2AC1F301 2E499BC53CFEB666:87B59F9BD6ADE17C:\ EFACE1D2899E742C6A65EB523447B6001E2FE3DB1D6BD904 8250B551ADAEE699:A286D77E36481FA8:\ DA0BB6DD13B7707C674C72DD1A7C1B3FD03B13832C8CFC13 F48717AE3466F0F5:403CB3AFDA050BFB:\ 0F6997BD4AFACC4E2228180FA60A683D13C6E237325BC671 8308D7DDC9BE043C:08FF7FB8D322FE1E:\ 77790E57117F767476AE9E623A839D1B5B596623CB193C08 DA0EDCDC26C81F71:5E54344C7E8CF8A0:\ 1A34BA494ADC8ED74B6AD1EDAF317DA506FBDA7A0D0DD40C [GOST-28147-89(R3411_94_TestParam)] # The test vectors included in Crypto++ 5.6.0 0DF82802B741A292:07F9027DF7F7DF89:\ BE5EC2006CFF9DCF52354959F1FF0CBFE95061B5A648C10387069C25997C0672 1354EE9C0A11CD4C:4FB50536F960A7B1:\ B385272AC8D72A5A8B344BC80363AC4D09BF58F41F540624CBCB8FDCF55307D7 6693D492C4B0CC39:670034AC0FA811B5:\ AEE02F609A35660E4097E546FD3026B032CD107C7D459977ADF489BEF2652262 99E2D13080928D79:8118FF9D3B3CFE7D:\ 320E9D8422165D58911DFC7D8BBB1F81B0ECD924023BF94D9DF7DCF7801240E0 D1E787749C72814C:A083826A790D3E0C:\ C9F703BBBFC63691BFA3B7B87EA8FD5E8E8EF384EF733F1A61AEF68C8FFA265F D4C05323A4F7A7B5:4D1F2E6B0D9DE2CE:\ 728FEE32F04B4C654AD7F607D71C660C2C2670D7C999713233149A1C0C17A1F0 8742D9A05F6A3AF6:2F3BB84879D11E52:\ 35FC96402209500FCFDEF5352D1ABB038FE33FC0D9D58512E56370B22BAA133B F86506DA04E41CB8:96F0A5C77A04F5CE:\ D416F630BE65B7FE150656183370E07018234EE5DA3D89C4CE9152A03E5BFB77 # Generated by OpenSSL's gost89.c and GostR3411_94_TestParamSet # This implementation was written by CryptoCom who is a Russian # company active in standardizing GOST usage in the IETF, etc 66320DB73158A35A:4732FE56B7854AF7:\ 67C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339FC99A 3E017E97EADC6B96:4CDDBE526625E368:\ 255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC67 75D8BE6189F95CBB:4FD8C167F5C05C76:\ 8F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C94 14735AC55E4B7963:DFCD9EFC3FA9BAFB:\ A8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64C5 0BE11A1C7F23F829:E0BB12ECA3001350:\ 3B706424119E09DCAAD4ACF21B10AF3B33CDE3504847155CBB6F2219BA9B7DF5 167241EC4441196D:2361B9315757145A:\ FA7F444FD5D2002D294B96C34DC57D297ED55FDA3214D99BD79F7A0EF8972DF2 2EDD19A28A1D950C:0B4CB6EE4CDBC46E:\ 8DAF30DA74AD04F28263CCB577A6504E45CB5C3D628A2F79FC706540B27EAD3F 634BCA6A5D11B73A:990D426E1415B346:\ 8161C1F80712474CDDA3893F2DB8B829291D69DB9C161ACAF3336C7D51018AD2 E9E4E1E217ED0467:83F7B229D74D5068:\ B5407AE2F9320C225075FDEC8C17B67F4A22FD9B24876D87D238F13049A86AFE 40140A581D78BB49:D48ADCE9AE2DF9A7:\ 620153EE18096E622B6BFE4FF26BD6C4A3C8F4ED705FEB5943CC3B5AB93FC11C [GOST-28147-89(R3411_CryptoPro)] 167241EC4441196D:A4BA7733087BF46B:\ FA7F444FD5D2002D294B96C34DC57D297ED55FDA3214D99BD79F7A0EF8972DF2 2EDD19A28A1D950C:9F5F0C9271672126:\ 8DAF30DA74AD04F28263CCB577A6504E45CB5C3D628A2F79FC706540B27EAD3F 634BCA6A5D11B73A:68E44CBA27E3B0C3:\ 8161C1F80712474CDDA3893F2DB8B829291D69DB9C161ACAF3336C7D51018AD2 E9E4E1E217ED0467:0B9B79E1AFE9D61F:\ B5407AE2F9320C225075FDEC8C17B67F4A22FD9B24876D87D238F13049A86AFE 40140A581D78BB49:5C960D01D404702D:\ 620153EE18096E622B6BFE4FF26BD6C4A3C8F4ED705FEB5943CC3B5AB93FC11C 705616C1D3DE72D4:C934D4A3CDF6725C:\ 3AD1D828517CC8B001F0CA84010B3A0968AF11272336DE5A91A7AD69B49E7EEE EBEF9233826BE3C4:E29B5234B9903B4B:\ CE3C58CF4893D9B042EAD76520B5C0B15C6D1A100B99FF7BEF153DC2F4AF96C2 87826FF76C95C3C3:ABDC9E8C2A556516:\ 55BA2A7570EA26CC5741DD62DADCDEC9F11B8CE5CA22A8B5113AE993A5CC58FA 35FC60B2FFDA201E:391DD791413EAF33:\ D6A025B07C037A6E1E0653E828FB9E3A3587CDDA5325D4DAA743D113D995D6AF 3BE742AA8B844EB7:06798A7B621A4F7F:\ E07306086FA442A42B107F7F355359DD972BF070C0C71FF5C37FA7C259C7E039 [IDEA] 7409000000000000:E18315C171B83765:ED1BCC9E9267925F3132BA3A8CF9B764 D53FABBF94FF8B5F:1D0CB2AF1654820A:729A27ED8F5C3E8BAF16560D14C90B43 848F836780938169:D7E0468226D0FC56:729A27ED8F5C3E8BAF16560D14C90B43 819440CA2065D112:264A8BBA66959075:729A27ED8F5C3E8BAF16560D14C90B43 6C2E3617DA2BAC35:1569E0627007B12E:729A27ED8F5C3E8BAF16560D14C90B43 0808080808080808:F5DB1AC45E5EF9F9:9D4075C103BC322AFB03E7BE6AB30006 0102030405060708:97BCD8200780DA86:3A984E2000195DB32EE501C8C47CEA60 05320A6414C819FA:65BE87E7A2538AED:006400C8012C019001F4025802BC0320 0000000100020003:11FBED2B01986DE5:00010002000300040005000600070008 0102030405060708:540E5FEA18C2F8B1:00010002000300040005000600070008 0019324B647D96AF:9F0A0AB6E10CED78:00010002000300040005000600070008 F5202D5B9C671B08:CF18FD7355E2C5C5:00010002000300040005000600070008 FAE6D2BEAA96826E:85DF52005608193D:00010002000300040005000600070008 0A141E28323C4650:2F7DE750212FB734:00010002000300040005000600070008 050A0F14191E2328:7B7314925DE59C09:00010002000300040005000600070008 0102030405060708:3EC04780BEFF6E20:0005000A000F00140019001E00230028 0000000000000000:0001000100000000:00000000000000000000000000000000 D5D5D5D5D5D5D5D5:75F7C7005EA47839:D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 4A4A4A4A4A4A4A4A:759A3CB94586706D:4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A 0000000000000000:AA553A5DEC50E4A4:00000000000000040000000000000000 0000000000000001:0013FFF500120009:00000000000000000000000000000000 000000010002000301020304050607080019324B647D96AFF5202D5B9C671B08\ FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328:\ 11FBED2B01986DE5540E5FEA18C2F8B19F0A0AB6E10CED78CF18FD7355E2C5C5\ 85DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C09:\ 00010002000300040005000600070008 C309000000000000A02A000000000000B03D000000000000C942000000000000\ 2B4C000000000000A04E0000000000009857000000000000C860000000000000\ 0063000000000000F2660000000000008698000000000000729D000000000000\ 34A000000000000023A500000000000010AE00000000000025AE000000000000\ 30D600000000000064DB000000000000BCE1000000000000F6E7000000000000\ 4AEC00000000000080F9000000000000E0FE00000000000061FF000000000000:\ 9C3C4F44BB50DF7367DAD70E6FED04E0AEB0344116C6E41F66A1A304E822132D\ 8AFCC1727259D93DD6E742EAEF2FD8C03EAD7890DC4EFACBB8776F3439A3DB1B\ 55D47DC6BC4A43349BA9E85FE178CD1ADBDD4E9D19CA1E7659341251586E1386\ 4A8C4E93A2616A0C18890A622452AD9FD09CB1A9CDC83ABF2FCFA325FA011731\ 9C924852D426132D05DA82EEBC3C261A6036C6477FBE3F65C40B8B02C2F9D8C8\ B3084034AB3873CF22F20759C145ECCE92CE6B557D6DB959DA0B8AD4E0DFBCEA:\ F2022315280960F16FD09741D13F693A 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4\ ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B96\ 8F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C94\ 75D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD\ 1F231EA81C7B64C514735AC55E4B79633B706424119E09DCAAD4ACF21B10AF3B\ 33CDE3504847155CBB6F2219BA9B7DF50BE11A1C7F23F829F8A41B13B5CA4EE8\ 983238E0794D3D34BC5F4E77FACB6C05AC86212BAA1A55A2BE70B5733B045CD3\ 3694B3AFE2F0E49E4F321549FD824EA90870D4B28A2954489A0ABCD50E18A844\ AC5BF38E4CD72D9B0942E506C433AFCDA3847F2DADD47647DE321CEC4AC430F6\ 2023856CFBB20704F4EC0BB920BA86C33E05F1ECD96733B79950A3E314D3D934\ F75EA0F210A8F6059401BEB4BC4478FA4969E623D01ADA696A7E4C7E5125B348\ 84533A94FB319990325744EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA54\ D835E8D466826498D9A8877565705A8A3F62802944DE7CA5894E5759D351ADAC\ 869580EC17E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83B4692F3A\ FFAF271693AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8ED9612EC\ 453902D8E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC7AA6F2\ B4A8CA99B2C2372ACB08CF61C9C3805E6E0328DA4CD76A19EDD2D3994C798B00\ 22569AD418D1FEE4D9CD45A391C601FFC92AD91501432FEE150287617C13629E\ 69FC7281CD7165A63EAB49CF714BCE3A75A74F76EA7E64FF81EB61FDFEC39B67\ BF0DE98C7E4E32BDF97C8C6AC75BA43C02F4B2ED7216ECF3014DF000108B67CF\ 99505B179F8ED4980A6103D1BCA70DBE9BBFAB0ED59801D6E5F2D6F67D3EC516\ 8E212E2DAF02C6B963C98A1F7097DE0C56891A2B211B01070DD8FD8B16C2A1A4\ E3CFD292D2984B3561D555D16C33DDC2BCF7EDDE13EFE520C7E2ABDDA44D8188\ 1C531AEEEB66244C3B791EA8ACFB6A68F3584606472B260E0DD2EBB21F6C3A3B\ C0542AABBA4EF8F6C7169E731108DB0460220AA74D31B55B03A00D220D475DCD\ 9B877856D5704C9C86EA0F98F2EB9C530DA7FA5AD8B0B5DB50C2FD5D095A2AA5\ E2A3FBB71347549A316332234ECE765B7571B64D216B28712E25CF3780F9DC62\ 9CD719B01E6D4A4FD17C731F4AE97BC05A310D7B9C36EDCA5BBC02DBB5DE3D52\ B65702D4C44C2495C897B5128030D2DB61E056FD1643C871FFCA4DB5A88A075E\ E10933A655573B1DEEF02F6E20024981E2A07FF8E34769E311B698B9419F1822\ A84BC8FDA2041A90F449FE154B48962DE81525CB5C8FAE6D45462786E53FA98D\ 8A718A2C75A4BC6AEEBA7F39021567EA2B8CB6871B64F561AB1CE7905B901EE5:\ 9C142A22EDF81444F47272B80A037C169E304393537CECE8003BD80F7B054406\ 3B4A141F9A99D3C6820BAD98BECD914804F389EB2A50E1E2CF22161FC78B9366\ 0E07E2686E70AC0715299C4796F3559FDA802E61CB4ABBF42BAE516BD09FA410\ 085A0A92C6F32A3797D19808D3B3D049B605852E970E5A1B8031D3DC34B5A273\ F54ED35E21D780204F4B3C512596237153BE9FAF74A44E9A9DCBE96D628AA58B\ 1E3363A94DF540230B38A1ACA440432640E5387D92F1CC1A16F8628A4CB6229F\ 513AB926300668CF97B27643C9C9D0C3030D0CDFBBCB69C3DB199E5D392A97A5\ 1DE6C9881AE5612A69FA0EA026F2F254B929201AFB3AFC8D977C3ED6E12F0118\ 92037D0F49B0144E07A0F0556F0BAC9B3F829C233265439AF711E0B5DD6EC813\ FD51281E8AA6F031B096C64EE8F03E041FE4DC6B5441141F2D4A308CE8EA77C6\ 483E3CF565EC49CF27A0B13F28D3C63AD7FB6B3A96579D30C9D65F7BA86E56DA\ 6D14AF3C7D170CB5BF5F21C70C1771354DA2850CFF8D9250273828C1FE60C4AC\ 086049404E3D63E04935F03B057B4783B13CF49757A8B5ABB3D2E37E54B881D2\ 36F7DF7FE80E4AE33E9125F54AA96D96BFB15607F0800B215CBF9BB0F7E29080\ D8504E9BC1F78256593B9565E5AA5FA22032A47041B453D1B154A8D24CD59CF9\ AA6A8E55363F3DF2B6307ABA5134D67B0DF0AE4FE77F23BF7DF8504FE9DC7F32\ A8562E2DF585E639847DD624E55B0D0DCCDA72D0F1E072D82D4BC135DC5F7F91\ 30956D401FAB1456527FE087A436C1511CDFEA58202D200E1817E360E8400AAE\ 83B073A63596B033D7E83C6CAB7FDD7069C3B1718EAF60B937CD2458255E68FC\ D9514FD14AA6E27EC76E75F95F0A678A0F64D49C1B9B8F8DA56DDB8CE640FF6E\ 7195F4A679165F9996F3DDF992E3CB4ED9E9084AFC0038E4BEFB467CC8170AF8\ F004082BBCB137BBD45C124BE8CEDC89DD565A24830889CE4B9781FC18803BDA\ 1A0A4EB70DA35887B02F18CFF9329E2B7C31B0F5F0648E0508379B52C8FF91CE\ F939A040A8C20F2F27ED65553680729A2181B3B3C4AA02BFF8DF0A9228A87BBF\ 52B48F473D0F9070C76E4DB6F09FFDFEB629BD0E1944B7016AF34187E2985AEA\ E30D6480A58F649A0C858E1F1458388A9E822A306AC1AA7465882DE78F242EF7\ B0CB45D68A057F00D8609587922C8FAD6F1A7FFA34BF2175FC516730A61CF82C\ 6F866C978CC292BCC1F91E6AF1785FCDAA9A43A01E6AEE91E222F8AF8C989F2A\ 4C50B7A1D45BC15E11E5E6E6EF720506B8DF564648BEBFE272C0A77D41295865\ 108150CDB3620970A37DB94F1CC35E434DC33434D99871F6141EB57C9E648AD1\ BF70E2B7FCEB81EA871DD92F19C366EA532CA4A7BEF9242128B7ADDD308B58FF\ F5594CB4156A03C6A6ED3F27E8DB20FB2F4208422B7E9E0A4E63A0122560CFBC:\ 67C6697351FF4AEC29CDBAABF2FBE346 # Randomly generated by OpenSSL A1F4C5FC0AF894FB:1F88AD254A1653CB:69E2F555209FCA21ED36E0243F043537 55E31A38B2C91116:8D57CB7AFB401E55:BC0ED7C4A90FE4760B3D971F0F2589F6 6C63D3EFB9E767E2:5FECC51182CFA3EA:E0903EB04098B1193779E7837EF374D8 07E16715F575C6AD:81EBE19020C63877:78A2E29FCFF77C6934B7C0D7F9460D65 AF16AF335D1C53F0:6E7F0349BA9A2F99:53B644EADCA240EF4FB193A4FEAD3C7E 4BAF9D1CA9564352:1BC57C3D253EA065:AB33C28DBED80BE30F88F56BAF75F18D 2C03EB635242836C:45568161D2A6B3BC:1C878288A669E69F656E8B8D4FA60C1D 4645D6FD4B431D49:DA31365F4FE20B03:09F745F9D80E874001C4008995657B20 65FD887479EF85E9:590F2F58016B29E0:5E5A441ADEBB77B5548150D65BA74DC0 1B7503845C01C69B:0116653D1E4771ED:21986D04FED8F785438D4A7F0AD67E84 B192B778DB10F094:FF4E8C609577BF85:1D2257B3AC17EF9A823D599097E634A4 6538A21F7261A796:7AF53C7D0D2621C5:6E7A13AE1390E83C40803CB2D79B0C34 374283BA8FED5710:20378450E2DDA9E8:21EFC7A3A3201371A48119DBA1C9660D 2CD068FD837909FC:EF3FFF871FE5E8CB:6EF803708E8E6403A994BCB639FF5A53 F19905A6B0C7F1B0:42C993EADBC0F90D:772FCA0BE2265EFDE56A1995F458DEB1 2FC8EB4404380042:259EDC1951191AB0:70BD64087B18BE3EC0559A2CFDA3E192 4CA2060D4DE998E4:73C1905EF950BA3B:7ECF0B93035A2DE807F51E5B2E277379 733BCA91EBB85351:B9F6B1C7F328552B:798F64226CDBD83728D75A43C7BB1AB0 2ED93449D2D9AB3A:F06B2E9D94997C93:2DDD0BA7F3F7693679D55B98A22CCC3E F1A2FBC4FDAC6F02:DEEFBBD448842BE7:F31BD19412BF7A97DEC264E90DD14E99 CDAC1D020B9BB4EB:639B4D4EC1E3FC8F:226D0AD448F8E5079FEAB206179A38EB 0FC2061537F6CDB7:DEA26F56AB3D71E4:B023E8B5627738F655280AB14768569C 0AD0F7ECB7470F6B:11704E9F8D98D9FB:C6A319DCECC13FB4F22E9B9D60BD0EDD 281A1B2461363A64:DAC5D4E8E380B604:6FC37F80D03EC7FF1ABB39AD57FEEF34 A323BFD529B106F2:C8B452EBA3EAC1F7:2E90E4BD3B0BC846CE40BCDA46B99B9F 7F707ED4B2317EFF:2B4FAEF56F09598A:AC2F2007D0263D4BC6D15CA76094CC1D 864EA8E4528FDEA6:DE47CD0ECE03A7AC:A14EEDEBCA1A938997A4E11137D6552F 4CF5E2391DA8C6BF:C44AB604C4DA9CA3:0075696D1F9554F6B10BABD8A04D90EB 3EC6651C50DDD961:FCE10C5093AFC8FD:354B4929963917272B53C79D33558C33 06E48DB5ED0894C9:A3D93B6558B290E5:A5E048C95424FADFC5E5406585273662 4A22DAE25C7878DA:A920F8208EE65ECE:75A944A0A97A7BDCE371BA0FA1665FAC D9C0EBA7F6CE3065:9917CE029BB7A5DA:15227F375BA59F5E69BC2F6C668A98E4 6FA8111B12652436:E605449753A66A1C:AFE2D0EF5F64861DA13BE5EC6CBCC70C F4BC17D0578D7507:D22BC6485392A026:8881DD1044ECEDD9D4E7FC97FAD92FD0 4BA7280181F4B3AB:12DD636191A47981:A0EA022FEF899E36435DF969F1F3E4B6 9CC6F4CF3EBF7246:9BBF1E0D107A06F4:CC287CF7E36F70591D5E67FCD7BF4BC9 98839DD58F08952E:9F928A91E928383F:A835B2A0502F5AABA3992C063B0E1C30 6D6A06A129272985:864667E4DAC671E5:3DEF6557F2C753A5FC87A540F7A2557B 80CBC5085F87A69A:126748837E2FEDF5:E8409A5C304760EBC6B260C75C9EDEF2 89F8C4D164BBBD01:AB8A227357D184BC:8C736D86BE799E87F1C1CC35E5EEF6AE 2B96920DD5A6F2C8:94E03FB08F83296B:E4A20A94B1E7068974CEE5E2580E15D9 11D5722A2E1CF306:FA90183D4CDF8CB7:81CAC6E859BE54B8CE81ED7B07C271FA 41B3C351152390FA:3CE8A7D2232F93C6:7B0B045B44D79CB025DEDB0E85D160BE D8F830B019895550:07DC1606AB5F8F4D:1422160720C9BD46404FEFB8EF4E2C4A 8D30F965EA9BFCAA:CCDC2F07B5DEA3E5:5CCD1802EA48F00211A1EFA909F30538 C513A5932E08D791:BD668AC3EC4C47CE:2FFF4098384EE4546E93238C0F426668 4D85463A62844915:5E2248C33CBFD913:4C4F6F82FE2518EE3A99F76E04C8499A 7726B39BD69776A3:6A8704EB3291EDA6:FC3D1A043ECABA559309E64B064B0446 97EEA1C90CE93D1C:729BF317F46E2418:56ABF74AA472BF0CB06610D12A018877 1A0CB89B6E03E337:7702BED5FBAF6E7B:8E5126BD9FE220ECBC2153CDEDA49FD9 26B71F27904E140F:CDCC5F2849977C1D:2C18883E1F19A980AD4A58DB9F2D12D9 BEB0D17F512C5730:BFCFA36E02B0B2BB:F6BB19FE9DD4A7719881A38625D1455D F47B9D6A20D7B889:FB73C16CEB58CEB0:6A624B6FDC084DA5A509988B14436092 31DC5A59C38C6CC9:A1EF35EAFD03DFD9:107DC93EC9E886F16FA922A3D82DC9DC 9E0D57C76D2BC40D:48B35198E0C58C36:6EDB60CBF889596C42DF6655C84B2DD1 8A2A1818B39A6122:7FE7C18658678A8E:08327A955B100FF0A7FA52EFE78FDBF8 AC0EA182D4D22207:E5377B9CB0EDCEFB:FA541FD32F11D73934B6E53309DB89FA F4AA78E30D4375E5:1D29D101F192843C:36F11D98390A7EB5AA4C4EFD3AE9BB9E B337AF7DB5339DA6:E6136A8BC04D20DE:DA1FF6FA235D6067AF99F3462A16BAD8 867BEF1B45DBD114:B78595C1B5CB812A:B51BF3480873947E698F71D9EF21D75E 18CEA1A2B234320D:A6064120EDDC07D5:178BF50C7CE2A00C6AB48CE3569FDA58 47F33BBEAF84E34A:F575D48B7CCCC578:28EA779EB6C91650B52102935DE37AAC 5FFC2BAB521A603F:37CBDE6E69F5AB5F:766D0648B278DF1C0C41698287162A03 35B116F3F4481906:D001E3ACD70AF4BA:FEDF724C31DB14EB591C156C67EF6750 281F4D0A68E4E87C:A54B8A84FDAFDF5C:801481FE995D9E75205D8A6D0D510E90 8A2DE90960587781:F2BD898AFF28D968:505E0077E52C5729F73182ACDF34E9BC 50D31FB5A2F057CA:C85C933B348F1008:5057B6FF91D6B4C2375B2A6F4A2FBF7E 4EB2A5C16C4706DD:73EEECB5E25EC480:964818358CC500A2F781BCDC7AC66916 64F00EA613578183:DC583C63E88943DC:D5765D05E10F5B7AD1FDAA2351AFF84C 25E266652BEEA0FE:294EF257ACA9A0DB:413A2CBED2D4D93C7B46E7AB5A43875C AB3869040AEC6682:82035F37DBE794AC:EC2F93A4E069F36926E36FDB584A5637 6DF6A322B10646EE:D0BC320330F3C642:A82DDD856546FD0634CD8BBF241864B6 916202B8E932EECF:894C0ADA76AFDD24:A7BA17A0D592EED086A170100C9918E5 71CA562E57FDF716:F070CD1AB26DBB0E:D701ED927D25B3A6DE2F017DF630F7EF D7745FEA5883955E:E71065382556D351:FE0A9320AEE0B0510D84186EC805CC80 B57ECB0D0AB5BE27:DB84A6443E85C873:BB330B162D990B33CE1E60583EF23225 82724F9780EDE924:31D9744D66BFF613:FF7E72A5D193A35A2093717DAA3CD4EF 8307456C3AE8C4E8:02C4F752D9BEE3AC:B2BFD1313C129C13A35A4B59F608F930 1A81AC5339D80170:FD6CF5D07C7A9A76:8D533208F3316C4CD216D42EB1BC5D0A 23F4D1448E8C2302:A6D4756A911311FC:403F55A1621DDD6F78A33893F0762D8E 15E5476B963232EA:39474EF9B640AC8B:5F319D855168FC8153E29633111794A9 331A8615EE6239AE:7DA9F36C7BA77B5F:99C0AE0DEEF10CC2E6673D106DDA6871 D2C818116B98D56A:0AAD3489968B1C6A:B24AA6EA353F9E7BFFF2DCB8BE9B7A52 3299ED7461B4A3F2:94453FE1A0A1EDA7:8BEED6720296F7E9FBF7BD1B07ED9762 4D042C1E63DA6200:188E679808DDDD46:815ECDF71E3996E437DF4C976B527862 7102E6F388639C00:269AA83817DB1985:A6DD5F374508255677C19FC396E134CD D4CB7FEC03126E6A:9789ED9BE3491CB1:BB6A08BAF6F14C33BBED0F775CDA3020 DECC7ACF2A42B8EF:BC081CF6F5A629C0:6221926E9528A75155B2BF6ED12DB1F6 A598473440C9A21F:24B0514DA6EDEA34:8A5D51CBBF6BE005F9878F3ED6B61729 0A4202140AE807A6:1728AB88720894DC:FD6286C960579D105AD239774C91368F F0920407531D711F:B41EBF00195D90AF:20B923BD442044E6A2BBF8F00D079B88 5BD41996465764CB:BCEFFE91A2F6FE87:3E70468A0D26E01832F5A6E35D3FBD99 E33A034F8014AF17:420C903E06671BA8:7500E220E0A3E58BEF63AA137D307794 7B85CBB342D56D2B:147E04274EACF056:40FB6C1F452CE0611D34E73D73629B78 5E74CE033490E610:4F910CEAB804E971:492C60D310221CBBAF3BFCC04E595225 7ABC6034C9E6B95C:21CF5A0D1A5BA08C:F057A5BB95F19EED5ED31BA0C3B71121 E7604AA5ACAF6E29:5A48559ACECEF95E:C658B4CB59FC9F9794B17DC994790797 DC3B63395657191A:1FF2C84F7F1EF838:8FC30F8C24F6C644916C9E3460BA5289 5C51EF1CAE759BA1:7D0B65F194116C8A:BA445EF71240F3AFFD91B79A5FA8AB81 285CE845695AA8FE:8E7EC2D0D3A836BC:5D753304438FDC2D035BC07820076AD5 DC977E1613710FA8:7667822C280FC236:72A06AAFD85DE66B9293B50E6AE8B28B 34841A026684E7C7:529003250F713079:0306706ABEF3D7225DFB146DE5EFB29B F10FB61FE6EB85A0:E4A62E2C4775D5AB:FFDAB83F911295F1F99E684DD9FF0B18 D4BA2913B79C5B8F:7886BB8D9FB046D4:DC5D319F729E73ED847FB468EDDCE977 EABD3EB7B477D262:366D6CC9503798EB:C8B0948B2A5ED4812F1FBE21ABB609A1 8FF4BFD40B22E74E:30C7A64C5C6861A5:09853AEE4B50B52B3086C3860B8BDF97 0EF4B58DC8DB9AB7:98254A729AB2957B:F44422594AF65EEEA95CB013E8244A3F 69F168F103621CE2:6071635D378F7B72:6DD7F582664163682678561417A645BC D16F65826AA18FE6:2226A7D8D6981F2E:7746A113E13987DBD18B394F67D1821E E652CB782CB22176:995B99DC17FDC5EC:892C8B9C34C5FFBC75E15316F1585D7F 44EC60577E52EF53:DEADF8476A61ACB2:EB2140E309DF68D184A31E5853314488 95C4BA55E48ACB41:23995FC714AA8A4F:1ABD37DF22EFAC175DF941CC0EDD29F0 23EBEF88C86BC886:56E06DD1032256D9:D0C38AE628CCA13070A1633150381F91 493C1E2E04FF04D2:7E042D9E5AC1F3EC:48AC07496841116306D48764C1E705F9 C2B35E68716744E7:0B47ADA35271DD5E:66566C2E4449EC7A02A7C930F65940B0 FFC6A8AD209956AB:7E64EC4D49B958F5:7AA0B380E4414CA991E141BD6231CC0C 0471B06CA4FCAADB:A6F22D9C1E923746:70354888F66B6C0AD28E682DE32C39E5 C05931E79316A4F1:2998E9FE07ACCC1F:E4CCD004C11D238E3A03EDECEDD65988 C8E7076836A52774:6D5C280418972012:DA829DE8347A0778DC215BF2540089D4 C26400002E57C5A4:A08AD2CEB56A4B19:1E96A8A8BB01AA88FEB15712F0A6DA8D 5E5ED4AE448BCE09:AC419DC48C0E6E7D:87F756A77FEDBD8031B0086EA344AE6B A755EF02795F7CBF:4E01D7A7B8689D99:81D79E0EC9D881149AB6D41DE9200F04 C569F03D3FEC14AF:9CCBCE811D222ECB:6EEC3E96D32CA0BC967AF758FB6805EF 7AEB6D193C727CCE:981F83863C75A8AD:07B0FC3E6308EB4A5298163E80600120 95B563DC5D7A4995:6F165E831FE132F1:C810A5C61CA63CCB8BE9E0590959CD90 79AC1C7EC0745282:31FE39BCD41067C0:1E76304D445E8BB18117B1EA3E750EDB DBED2CD9B003FD2F:BF698BF256DFAB35:E466F39C4B58269CF854A4221D2A5CEC 900D341BD28B335B:0858DB68F69BEFD0:59A6E62DB5E1F41DDB228D1CBD60D950 6FD7FABEF3F68ADA:20E9497D9A98F12B:68A0AB43F383E1CA7E9B96B70E010016 0B16023CA7F3320D:008127A50C977A3E:939A4D66FD3CABBE37DBE25F404D7FD3 B91AF472920780F9:C5493F95C16A4953:00A20A1EE48FD2341B1F7F1DCE810755 2DFBCF72932B1513:96465C98AE90B56D:C0808AC11EDFCE49EAC9A05B503C156C 8C83A23C871952CE:958433FEEF466F82:840492015802ED28322683A1B4FD3059 1A24D2868B8229C2:B2A10B890DC9E641:ABC74042E5B79998889438020ACDA9FB 85563E107D1AC98E:D4448D4099E6D02A:4F19664B83FC466B03A936D6C3B6F522 61AC5FD8DF0FA3DC:58EAFB1779142C2D:391AA3DF9ECE4160E0BB9AE663EB326B 2AEA3358CA197938:98EEDF26EFA4C614:505E946D9C6568E6DA133F9615AFC0B3 57138F04DCF6AE31:716AD93EF3236735:8836B04E34F67B894D28C30DA60328F8 B57776534391612D:5300738AB7F94CE0:0AD06D65EF01D64C0D8227AF7A7F4295 8625E74BCDBFC00D:98C27F1B9A9ABAE7:6DBBEC86D97D7FC0DB27BF6423659E4E 14E2DD1CF23B2B0F:1814A2577534D5E8:FB924FC8A20249EF71C470ADCBB2AE13 322E55BB623E0FC4:F219520BAF8B676B:467AED141F65682959BFD457939F23EB 931320B39312BF72:DC355192DC7B11E7:140B0407B8717834F2C0707102D67A41 04F5E2A164655DB1:3B9A799A75792D85:F4FC422DDB7B0E13DFE5C92E5DB69BC3 22B6A63021AE2763:5F1DC1759615BE32:72081E59495031A370FB1CCD08B61743 729C1EBCB2E563B4:41CA6A52CAC6A9BC:3F8253356F0DFFDA9F7E961132D9B2CD 252AA0E1EF450353:DC44622F3A805838:9036A0142CBD1850E1CC093DB58AE579 10A5F919718785BF:B3E6ED4A5C006A75:7A01C0B58B936543B8201D9AA9BC3163 05C62E7F7FE4CF2C:1C939D9192E83462:E0B0427FE2C90210C1603F7C0C9474C5 CB12A73FD1165172:67AA122DAFAC90D5:B85945DC5F787A3BCDCBABE014B7A573 1A686808A77106E4:9D81B526A87880AA:2CED2179B30725A0E819AEA55CE68B61 0AE5D2C3A631D879:020605D916B40B84:D6F034BD03CE80931D88EA75752EF08B A7AA74C2607781EF:91D215BA6DBC21D5:F9C00FAF37163FF1FA5B8F433F685836 FC2A91EB756D481E:60DA8ADD7547CBC0:1DFF21EDEBC139D7B7CBCDE6F4A34584 A6BCDDEE18C6819E:9805E419C2F2BB3E:46A7578EFAD674A224FAC4E2BED579AC D682589A7FB9AE31:3439865A758C9678:BC31A699CC327FD5E140C9A6C0211028 E83BEA1B7970658A:1662B5047011D310:B527197C6B375AF0EE863BBD0759EB96 E20D2FED40630E50:10F47ABBC320281F:FD990F2F4439E65D4FFEF0420D18CCB8 63444C8712811AB2:994FE928C4321878:3869A36D42923E94724D1B05BB875AB0 9A558554C9163EEE:555154F50F57CCF1:E64049A1F719AF0D499135129095C8FD 42F2A3FE0437BC5C:2BAA4CAD9FC4E082:F36AC6126F70DEB39DA8729D5B22ACA8 862C924495BA12A7:4C3660678AF3AD0D:E1B6991593A5D361C08C3CB0812D6944 8C67D089B29FA40D:4CDBF023BEEB2916:B2ADD4040673D0FE3ADA0B00E013194A 256BB416AFB1BB22:8F730A9BFE8A6D92:6A707425E5BC3011AD82574D5C6EA9F1 AC3D85D4C4E32C77:65A0A4681E370092:D2E59FFE11A6EB98F9AC07AEA56238EC ABA6D4DA0781086A:1D2305C43699ECCC:BE2217AA1919BC76A43F575E9C395525 CB39BD9B648C27BC:F4BCD97D736E7143:B209ECCEBE3C1B39EE99D881213606E6 77ABA9017A2F6678:6881CF5F4B920808:5062054F6D1C6261C3C1E4EC854BA49E 79740D3FDFA6CDBB:AE662AF4D41E106E:5ED1E657D8AB1A468B1C5B39A48BE0A5 CDEF858FE5E0B0A4:F11AA4D6CC002412:AA224B767B062DE29709F4E10B777BE5 B9B1EF495E954F66:F8A33058962BA146:DA32F95EEBB72A127F79122819234BFC DB9C0ABFA81C0D80:9856D1DAF01C992E:3775682058F6BC094A96C4877A7F9657 BE447A6EBA16A7A2:986C7B461B5102FC:E366C94CB0971CBA20791BD358EABCBB CA564022587EC839:D3AAFF01F19DB316:07BB49AA8F9A13F2025E9DD758B1E764 E2929C1DE30E4B15:EB1A484E5C81DEF9:9124A3C9DF4CED607FDCBAB5027B5B93 35F3D96407C21EF9:C7244325B6DD77F6:39A2D8A3047C1DFACBEB37861E8B43D6 1BAE4770DE602791:4E662AC45C3B2119:FB4502BA2C86D59FBF6FA8C5FAA87183 2B1CEEF376A5E4B0:FBDDEE951ABB0314:DD010D18C37746B65AFF34083A4146A5 3CBF8B60D71FB10A:9A8FBD56DC0EA257:72D53C88260E3566882813053E1AE5ED 47C4AC498293BF13:7E1398E65A69E038:C2C97338FBD29E50FD37205751B3C6A6 120997CB681C2C4F:7968DB51E243F084:5F0E47261B6DEE64439879EDCD39E85B DB1698876385005F:2AA4C93967E4F698:4ADC396F403CF5C12F850BB907A344D0 AAA50519795B86B7:6A1096066173528C:8822968CE682CEB0DD9E913B77578C49 2CA4D5AA24A0064B:EF4FF1117DEBB3B3:1F42C3C5D30F64964D86FD6F212E3EBC 637B3EFDC062ABB5:9AEC362D13402BF3:3863E37A03F33E5C010B10BD83F3D63A E0C32EAAF6E27FE3:03FF41F08C2B4F85:34DE1C4A720E1C519FF9B3B5AF1FC23F 70DF29326A19F0AA:1EE92ABEC6D87204:E4B43787664CE36DD85A904AC8437EE3 AA2623FEF71A6FF4:581D8645CF5C04F2:87472BF040EAC616FC3186A071E75472 79397AEA3D9A815A:DE4315993AC9D4AB:7A34E8066CCD634F810CE2AA6916E9F5 CC3E9F4728AC9653:5A359381C542D310:527D10ED0649948237D77BB836B90312 12E1E88F656032FB:FEDD8EF190D4DCB2:3C89E04C0CFD726FC81158CFB3567C66 7199333B8F1726EF:9ED8AA463A0DE876:781AD832234CA52B7DB7EF037CA6840F FEE0782CFABE980B:2DA0DBB1BBB8FED3:AF3CDA80C37352B53A00290FFFE66EED C5C8E3ED1C1B1B16:6EB4148C4BF47628:A7976FE071BC4C2C4EDC90669970AF6D 545164FC513490D5:39398B0CB44C30FC:9B8349BBB21480212BBA391113EE4251 177992889360D533:C9E1D8EF29C5DD0E:AE08A1563F6CB18E5CC29DCFD94F9E50 78CCE5F4022F5F38:986D99D2B90474F7:F9395E856A8C8712DB0E1D9BCF35F2C0 8D89708C4486A4A9:C27F30929D508EA2:F83192CFDFFC02CAC0B109AE5CF28AEF EF0CE502FE9F2E65:A5680B7651E10453:ADC0100230B5DAAB8F4C0D5C3A99A220 43078217088A3B74:C81DAE4CE6588027:6642EFA393625B328A6D56806F97B06C 28A2DF1C597A04BE:7444940ED63BB2CA:2341CCBCFDBA06C1253111C60BE2EDDF 6C8BBC0168E7D0AE:7A8027A6DA52F0EC:78BBB2E2171B41352E11F39072B4E758 30004B05206CDB1D:A46A041AFEEDBF40:CC8EAF044C0F14E0D3E55238E5B4998C F912DC1D46120017:8159899680CFB85D:4C09C4DF6B6CB3A0518E75A3110C00A6 0177139E2A42ECE3:54329CA36D7BB6A0:92C6277D7458B8829ABA3694C1E57023 F91991F3D9344291:31CC16538CAD3B09:6C220265056BC8669851FA3F4CFDE20C C3111EC8062BEE07:F1F5176541E23DA8:07D0B4472B194B6F45235002141B33C9 8EAE7470FD58E40F:73407FEC8B5F9CEC:5BAF6F94066F39A8E17F81A88BCA2796 919C2933E680FA63:F9CFFBE679B632AF:AFB398D08C965498A868DEAC783D8B80 5A0C5CF55E5FB1AE:FF4FF500A7B1D85A:44E3E8AC53DA1946F65A48245A971929 3B365723C86441BD:4575F4EC34C2003B:6F2716CC391B9F0C7549266C68342F17 078E1AF25A6E3789:BE784416E9E60086:21E16892CEFF320DA6ABD1BE4DED257F F5725A15102E12A5:DC5EF80C3DEF85DB:716B9680A132954B598DA6E5A8BB8FE5 4892E6A118C98D0C:9DB54C62F330CD19:F226C53CA0B076A19A11B9AC778EA80B 075A3B54B6AE5238:9D91D515D7E76D18:B98400EACDD225EFAA3B29B6F72C022E A0FDC39F4644E6FE:7629ADF27EE957A7:634EA1C85D5961B4064F79852A11895D 668BFBAE93632D2E:9C047ECD1D88CE54:03EE4BCBA4086C212CAF28CD82C1A761 5E29070652D84B8B:AFAF619C3C3B3EA9:34243F927E529230DC4B5AA91D29B9A1 AB8F3263F732EC68:E196D05DAA04340C:3BF57A19C8A578663AA2194B3DFC8D5E BF5B8209F7E51A4C:A8E625E6F01A991F:718E5A9042D2002E803E7D8A95FF685B 3950FBC2A4D4B08F:54993FCAE1E3A2C9:9F791471044D714BE42BF1A8379BFC4E 440032587CCAEBBB:BAFCF4891F7B36ED:1BA3B781AD0C56BC2238657F9E0ECCAF BF985E7D8CC0E9F6:150F02B73459DB7C:29564761914E2EB3B5C43D445A1FA586 E3A691DBF1AA6542:8945528C8A6A7C42:1B97452D22DF6133A1065A0D6ACEF22F 20FCF337280FE0A1:2BBEE84B85AEE536:F5DA75F1C6D67254F00A1B526C97398B 28FDBF9CB423D8C0:FD07C80CCAE8AFDD:F5319B677CEAEF0DC3ED3171A821685B 627E00241301B398:8B3B0207D07C9E44:5E080A6AE298F8AC3D973F2290C476D0 CD0A751D2A6AE1A3:02E6D0E6A8D8989F:990FB6F8400592914B84894BE4E21A10 C4D06F926C611932:C8E6C4A166B0F504:904BFA4707A8EEE73D4576D5AB8D1A23 96DABE49F56D7565:2915EDFF6F1517C6:3BC2F67E113C0DF4FE2C49B09A73E989 9796DF8FF33629A6:C696AC43D47D184B:A30C3A933E1730816EF1D34518584B55 ACA911063728C943:0E11408AAD0D31A9:8475D6C9961A26235244A253FA965A97 0D445D5AD38DD6AF:FF6821F5BA54A2EF:438DC01CF937135B19F6046872B91E43 5C42CE355071C8E1:74C716E95331967A:A62D9F85B36F780D2083C2EF8EF07ACD 2DA11D3A751C0205:FF14E8E0BD5EDA1B:ACF3AFEF6A098D23C702F057749B8910 DC033BFDED9C70DF:E1328AC8450969A6:9C5AB450156A1C0128FE670A186ED675 1D59C57CE84AEA8A:A5885ACE3498599A:657940713BA4A55E8F675814131833A4 CF264D0BD49DF66E:27ABE5E153A4C3D2:C842C6F7692D4D35BB450E4E7C25D62B 1893406AE69D2DFC:AAD72C276D9E69D3:3EB0E4E5092BEBEBAEF96276F47CE468 44B5AAF4D5D79A92:B28D5F8AA0A1C8D5:CD5C440B413C62D84A4C519636B9C0C6 845D5EF1F9C1BFFA:90B3C70D906525E9:6AA1376D5ABB85B745D01A6D8A78C493 3494ECC94DDAE854:A98639C5B52E3628:A049D4719E78ED18131B626CB9806840 7915E2553D0581F7:DE0EC36C073CC537:0B5D4EE79C26227E934F4FD4A369BF73 2BB7F7432BEB3411:530FE0CCFD2A8C4C:F0F851C1B5575A54A2D542590C492E2A F34831E1A02E5A6A:3833E804F421A8EA:76CA1B648BA4C687BBE674BC55E55A9E F1F2DB3BED1C265D:83D9F9ABFE402754:248A15A95F5EF2F53F7712FA6E9762B3 F668409DEE092798:C0036965EED4C79F:39A675C7C8309641E75F42642F98539B D9F33E0E10E47FF3:07065B582D4F41ED:77EDF425AB34448E2D207CFA63A7572B 6B21BD7F255183F0:8556839147C9C697:07988D4DCBDC5856D0B16ECED076FE89 D92C1326029B5E9C:5F1BF1FC637CFEC4:CFFEE541307F3ABF60965DFB9851F638 3417EB62AAA8F79D:15EE04C3C203FA24:C03CFEDB59CEB0FCC1C1A9C85B3F2DC1 020A44BBDBFD626E:CDB9F1AF2717197B:F22FC0E8E591A93B781B967E17236F94 F8541C9B31FFE235:116AF4FE8BDACAF7:7215ADA2904083156A49DFC72EA6B783 3019034342F842ED:61B1176EC9E01187:7890F2AB2D5337CE85B8D52CC8A039E4 CE00C04C6C8437AC:28525C77AD6FC0B8:1B97DA37CFD018E4D2C8A619FFC35F50 68C4BCDDF19BAA36:A6E0CAF72EE75906:935332BD00F2DFE776C9662C8F4A0CC3 4B323E423FF15160:AD3D825F885DC436:200E81A5D15A938ECEDD9ABEACBA1EF3 73C78A6B18AA5763:ACF80ADEE2980877:FF9744CA77C270C1753B7BFBD16F2F0C 1EC549094DC418BB:0B660CCC9E2FD121:05CE1F98BAF5BF73A4DE0877DA21BA44 E4B7EC33C430F7BE:109B7807CE1E146D:D90C92A972C201D184F0C85CD21B0C96 32F022B9930C0D36:F8F4F8A2E16177B9:6E1985A8066D60CFC21FF3A620F9B376 00E7E77150176B72:63F6FDD518E8D982:0000B3569BE5A91E94BF6684443B1D5A ED0020DB7F893F9E:DADB6760EF0C5D45:390000E7291B05E590F733F60FE32D6B 9E30007B23AE1904:6F80890BFFAB514E:4F2A0000F702A704238482F6DDE12624 E41E5900820EDC94:2809809E29782F4F:CC301B0000C6E838CAC91B972CD843E8 6CDF6488005C518F:D2E83193787C1A8B:C111A9EF00003832E8388A614D717759 45086AD893004084:8D7DD8F46D2E21D8:64BE7002EE0000594EA205424036AC8D 7610D7883D750033:6377DF4C959B088E:B04BA96B0C2B00004414D2523B079870 E036C15C24544100:045EB493788F0157:CF87BB9A6AB1CB0000BA666EC4BCC4D7 00D5E98F37D74ECB:B0B861C2CC285A41:7A91ECA485D4A7A80000A7AA40E6C6CC 09000C87CFFBC0D5:F765ED0254553E8E:81956FF834D487A8810000084AEE7D1C 475A00BC0B2FF249:677FD2F453362DF4:EFB78A788A0E0C571DD80000E23558B3 9851E4006BF265C8:15058A03573F3A4B:495F198853B2A602FF46B30000F71F2C 6353FEB6005C7715:72195116B5244D9E:DF597069EE83B6E29B0D298E0000ECB0 E62D3D732A00854F:A9B997921FE91757:5F8334EBD1A4B51387B8BE6D5E000090 D0796D8D7487009C:0A69FE9C2FDB99FE:4B9B76C00E4F2E431CD70A572EE20000 0F7A885CBDD6B700:360B140CFE90F66B:00FB0FA1A19B42750C43F869251DA800 0069D3A0691CF423:57930C18EBF855AC:00009F0A1C5F738C9A0067FFF353F7D2 1900A63E56603D9A:A37093DA9BCAE8D1:5B0000794F371B08EB82008CADB108DD 8FAF0024EA437E2C:023D8A583DFDEB04:0016000047DACA0F7A1B3E45B2DE2903 F8956000F44C9363:D8E6AD7DEFF79268:CE24E90000A13DF8ACA26B543552C6CC 81E55C21009FE23B:782E42ABEB69CEA4:4E4FC3CC000001A50FEC6AB8E9912502 2F16443A8000DC47:5A3EF28BD1AA787F:FB9E06BA2800004F0980DDA5D4505784 2676AC2DFC7900DA:7D181E6251E6A7B3:C809C47A6C2A0000BD5AAB3395DE471C 89967E5A8D04F500:F3DE18BF33466F72:D80272B7E308F60000D0D45553FA51DC 00A697D30C1CCFD6:D8BD6BEF7C28D098:1FC5705EF403560900006741E6AF1C50 A200462288D91DEE:057F522F2457C7CB:6D40571DFB56841494000011F89FFAAE 083000BB9A0FFFE9:6A881071A5920D4B:5A11649D78F485A4C70A00009576B4EE 0BCF11006855317D:DFE70DEAE707F002:AF7A363699FAD5095F50EC0000A47EEC 9877931D00DA961B:6D44D2CE87076D60:4ECAF61E5C67E184CC5E70CF0000D5FC EBC8BB40090003A7:8E06F01F564B0E3E:AF81444CC1ECFDB56D1225DF6700007D B5B93F01E2E70047:5D941B605FA7426E:AF4D154BFE14606A91F96BF529FE0000 A42551007EDA4C00:F0D12E7B0E7792F1:0096BB79FAF812308F905CC4B52ED800 005D08AA73C9FB8A:43E76E1A3EFEB592:0000DCF81BF9E570FCECB62D215A75D4 F8007FF8EDD8AFB9:9B7AD7CA57EF5DF1:330000563D5804F2140305F57D6EFE19 F9A300633200B23F:487FE441C62B0423:AEB90000A3F2754576F2E81D014AB3B1 0BB04400FE649D25:9202DD63C1113DE1:00BAF10000DAFF62549D46978E84578A 0E7DCDE700F8523B:05BF95F4AE49BD3C:23B1692100001EB81F704895BA6F89CF 418E5BAC2A006BF3:9357E91A3C3476D7:025B180C1400004DCF61FCC41D77507F 972EBBC6250D0009:39189DEA6E9D4B5B:88E2B14CF33000000896F148369ACC0A E6B82D0009772100:F35ED1CE8C15594F:E77F27457BD13400006BA9C12435B21F 00096C31CA9679BD:3D1E54F215E69460:787B47B4BA5C7AE900000E3F96FFECDF CB00931CC816A2E5:1A7F7AD46F16F9BB:44F07CDCD86B29F2780000E3908EC0D7 B1A1004237BE2C18:A226C2A0F5D69DA7:5107A9E297BD6ED07574000055A5F0AF EA9BB2009DAD4912:D2EA98B2940FB5E3:7A518CB4D637F7DFD41A5D0000345714 F30367A7001B1005:EC80878CB6FE880F:9F331C8575022F9A0DAFE6080000C99A 854DF822B2006EBB:9B7BB2D159B2F37F:D40EBDA6FC5A7FAB29EEAF2AF5000071 2A520D5857BB00FB:25F14A7C7E1E02B3:F324FAD327E9D959584E3862E13F0000 03D2A2E706C6A900:433725BED51C4F54:009C9874395C88CF04C826EED65C4D00 00B98EA1D39C6842:25DFA84D24B46CAA:0000C8F8D6BB801FDE22B197F1A6E5B4 DA00E23270D329F5:719781009013272A:D7000081F51FAC169A6ED69956E456B7 0F39006D63151F90:FF573BA8C9540D7E:18FC0000E21DA381CDC71C3DD15B97C5 53121D00E40F624D:7CC255708A07395B:844061000076D6202283A9742E0BBD13 CBF8147800190019:B51D90162BFA3B52:2E538ED40000A15D3FFFA23A617B347E 977B10EE1D003712:AD84DC81A5EA50A6:B513E999B3000082DB6F5801E9650D61 F4D0A7BA7DB0000A:C5426D2C403ED09D:66DEE1483BD3000003917E8882D77BB0 E544BB76CD2B5100:6C653919A1E0C084:7AE9F41279784900001B00232FBD1920 004F3E11A0F560FF:FF17EDE487849114:CA1AB422157D74910000378557D44536 E200F25C642D4289:41310F914A105C70:9425BDC0B2EBF4CDF50000A492AEEE77 A2F2005D26A79D60:25C7FC5B80757200:FE310906BEEEDE55DEDE0000A061154F 849D1000A79DC401:DBAFFB54900B99CC:EACB3CB4D4A533BB66BE6A0000AB20B3 EE0A880F00D1CC3C:1D45B4C072EC3893:F26EF5DB480C4569E0977A3D0000E88C 01BA9AECDB005371:35418199AF42D87A:E0CADEF2B7C8DA97EFC25140DA0000AC D75932EE169300D0:F52B8E07CD95D128:D3CF5C2F4C97CCED75BE446ED6270000 D183FC38324CDA00:ECBC71EB2E17DC5A:003F188C1904B6B7F6C14EA393599800 00F63B1551CE3FB1:DCCDCE980B8F53FB:00008F330E389D6D8C759025A73B0F4D 73007315B631D42C:FEFB6E47E0913958:E80000B995B8B5B7012331DEB18B17E3 918A00AC1FE3BEB7:96E18EBBBC84F820:E9470000D586B0B87E62B9F2AA0CEDCB 6C4BE70034417166:2233574BBFB37A47:0B722500005C3BF867275AE43912CB41 579D81C500B37B08:284761ECA5AE4D8D:CBFC29E10000A00051235EDAA9B4E90C B0632CA13B006D91:77A21967A910E4B0:47F3F9CEB300008A411860CA30676173 110AB0B74835001F:A0C0B6A90315B41B:B49E9FB3667A00008D35B8302A2E3FE5 FB631C5B0D8A6D00:3C21A854AD831504:BBC8596413675B00006897EF67EDD14D 00F05A000352CA7F:CB164FEF25E0D62A:8329212347EA2EB400001CBBD08CF5DE 780070AACA69878C:7F789323A50DDE56:A055853B4E0843152C00005F452804D4 1DD700413C203186:CC355BD664B0A9C1:2BCBC21612DA339F979100007EBAB0E4 2BB01100705AD581:AE453CCAEEDFABCE:DD6F4817817D8AABF9C3A90000668450 5FB94F850063181F:03833C51E297D936:009ED73BC35BF76DD480342600001440 46C17CAACB00A242:EC6EFF8167F35D74:762307A655DB2DED925F1AD5D5000090 1F9C7CBA044000DB:E383EEFA935DCBFE:5762D3C970C7D7140CF5E1C6DDEE0000 6658A1F0D70A2100:839F662509406DA2:003121CE9826F685AC5DCBD51FA81C00 0084C508986E2762:C45D727344BCA366:0000BAFC3B6684E9CAE26E2A51B8D2B7 49005892EA319D10:FB4D505B13FBBAED:2E00000EAAB656F92F0007965ABA6D6C A8E7005578C53974:D0D4DD42CA42B8B7:92980000CBE225278A7B3C7A7DE69A35 97756B00255781BE:CDE5C028BB80CEF4:F20D660000A5D7647224CE32F139ADEE 1E57BBF90019301C:6CBE3727B8B0C3A3:9102EEEC0000793BFD15C30AA5EAA94A 249B4EDA62005187:0E66EDEEC9093E1B:FF93238C670000B99C2E91E15939D6B1 605BF46181D700F0:07D0EE1AB4F82F05:D005C51DE6700000D26AAE0442CAB9C4 5999811287EFF300:A767C32D85CB0311:9E3A2695908A89000090E75D1AB81EDD 00B9486C88FA039F:49852C9BF77952A1:C4ABF59B7185DD460000E0EBEAEF136F 4700605F3130BE76:D04C0BD08DC431A4:0C235BEC758B4D46DE0000DDAFE816E2 B17A00CB2A5C5EA0:E990AF9440CAA261:64DADE3DE21483B352F30000173BB8AD 3A75A600BE66B998:F79AAFDDBFB00ED7:9D3D66E09D5E5A11F67B940000031BC0 D7FED4EC00AF9516:03641077F0CFC0D3:9ABB92CE570A884BF048E7180000B852 BE22BC11AF002EB2:8E64899F1DCA1784:71E6A68A90875150CB9D110958000066 D3137A569D910073:3EECE97BB80D548A:83207306634833B4F7592EC4CA7E0000 5BF3EE3BF5E7DC00:15ED3B45209747A8:00C41B6795275751DB42AF77442F5700 00A709FBF07436DF:3571E5635D0BF407:00004EF57C7E3A7BA01419C60C080F2D 06004AEB60290B42:4F21AFAD884330BB:5F000045014A6ECF98F421DD289C55E6 7BDA00CD32B3B1FF:520937683AD5675C:12CE000033406D9AF884C84CD6DDCD21 838374006643B143:47BB11AF631FFB5D:35C251000040AAC84B90B889D0A24D8B 77C34A1500E95667:88DB931F156F5445:370567E0000026DF3BB5BAB73207C749 BE620F73AC0068BE:ABE4640EABBFE340:640455AE31000092B9386D9CFE4ADA20 48CDF31F6C0A009B:084203C1BD3A658C:5B13FD6446290000CCA1F2F0D341C718 23399EC96B9B4100:BE3E576D35FCA745:88B89A7EAD61670000D8C490A0C4FA36 00DDACBA7C185AC9:52BD247982A561E2:0BB8A5C30B7ADF860000E55F515B2926 B50045B0FEF1621E:763B83D026874BFE:96DCCA0A25EFD962960000AF7DD4254E B6880059216DB5A9:E665B554ED12D8C6:6601F4C2AC654C1381BA000073447B02 39521B00F3D72E95:60F3EA47071F5306:5D494C989D3665352EA74B0000CA342F 953CA28D00AD9898:0F2C05BA11B2B8F4:79FBED035100F698DDE99EEC00005DDD FE4A28C143008952:6973F45BC603F9BA:EE04B71567F014F7F763F0ADE400005D 8890123697F5000C:A95049D6AC47E7AE:63597101B3A8336FE99E8A76875B0000 95533AA66EB7CB00:391CF1D308C67292:0012B2CB4F003EF195BC1414D6540400 003D8F50A0E537A1:22C19CF341DB7CE1:00002DB7D757486930606F2FC7045F64 3D00863574901463:E5F948AC91493AD7:2900009BB26F083A61B0026163042AE7 597300AE3E2440A3:2055962B4045F983:C6D60000E4538CF8C0456846DEF4F62D 4A4471000EB0F045:343F5A228725CB59:37DF430000F338B8995333A55F08241D 95E4A397007E0C98:9B7A68A66565BF92:21F6AC3200000AC6134F909B262ABF45 49B954C71700B39B:4ED5370451EFE68F:85C5A3A2A5000092B1200B7A21026857 F37CCCA968E600A2:19B7CF5AAA1B3982:978A0012E5D70000C4DD7951439D9075 66826CD1026EB800:EB43FEF9EF68F5E8:08FEE636F11EE9000023E7C6E6391CE1 0038F00D37D87617:B5FB0F31785A62E7:22FB9C48B908873D0000CC334F8ECAD4 3E002551E14202FE:E60B4B8827C32C45:A6674F378AEA5615820000158D7F428F D0FF0072DDBA174E:03FB49171B487274:58870F8E541EAA612B5700004E0CCFD3 4AFBF200DC1CA63C:E86F1ED9B5F2BDE9:DD9E8B78F04A65AFCBF1AC0000EEB486 C9ECD9EA00FD7324:3C929A746C599E13:C13A59987AEF8C4B4EC3A87700004629 03738D499B001F95:A10BAC400EA235D3:EF39A0BBDDB2F976795853A6A70000A2 5A5BC6AA243C001D:ABBF1B2A1B1C7EDB:EF70882E7E3B1286B1115DCB8B2E0000 640598E874440000:FB5B53FFDA4AE2B1:00268897396591A96671BAE6835CEE00 00F195A06A3A8DEE:21870177D8463B27:0000FA74B64B61582897AA5F85A580D0 CF0095E2C5BB96A3:49FC16F142F6B04D:920000751D3E04FC3D70848FEE2C8A4A EC5300EF494C40A0:53F5E36D9C42526F:9CF30000A0259B7A8CBCAA62D9326400 A5A6E800A291949F:9C93982278A28B8F:3FF4A700001DE8887802A58848039E14 7505A80B006EC907:CCC97DB1F9700494:8831C67B0000C629DE8F43A2842DCE45 BFE978B8C900A7BA:8450C52D333152BC:3FABC6EA510000549F6EA0ABED81761A 2123D1105B2000C8:4F1DA3B7848F7A00:913F4029C2FD0000A0C526F4ADE6C876 9517D1A98BFC6900:61B272A808305B45:A501B4B7AF5BF00000E38350CAE4AF92 00101D45B3B4F245:5FA1D7209BAD5FD2:6ABFBD71ECE9D8120000C6ECB50EBBBF 8C005E7AD75D5D78:199B787CA91776D8:5B657D628773EBC999000077F8E75435 2EEC00C410CC826F:278A95BF49240E42:2AF96D2E03087B4AF6000000BCF73EDA 4904D500D78A9F0E:397E12BE77633D76:2AFD4E989C9CC10D821FA4000002F95B 0614FC13005971AB:C1CC70E18E244A6A:4ED02D605500B6B98D5EC7180000F61F B928318683002594:61F26AF133A64689:39685AB8B0B0787B5761F8477F0000E6 427F4CBAB9C40023:DAB73E5C3E533D71:156652C914C9CABD835EAC0C02A50000 B5AAF71A1D863200:4017699A8336070D:00B52760FF461B21EAD6D68F8B6E6100 002B3D27CE1DEDEC:9567515235BAD0EC:00001B2B3DC232FA625F5542C16C59E0 FC003F97BA171F07:273B74F309D5C6AB:230000CFA6068E57307ACCDA2B550748 FFF60003BE4510BD:1EAE8EDC01F5FF11:8B210000D8C532EE1E016738D7AD1689 1A05730041342D4B:B92F6C453B192ADB:A4959A00000326639A573B79C5857DA3 AEB42C6900628B42:A7489C7D07147226:B28CC4130000F85DC68AE7A87C1DBE97 5DB907497C008FEE:22F54C713A076B1D:76DE82835900000820D5DB67DB8E65B0 7C2860EE183600A5:49892090BC7F0551:23E9FA3F7DFF0000904A028020985348 0D5222ED6F816100:C1103CC4549AA574:DFA73EB8D9A6D9000049FC581CACFF59 00E3F77B95074963:97D6FEC499DA8B04:F2CC3E9A54C972AF00001ED95A7136DC EA0020AE7F1610A8:8F6589E66FD224CE:7623606A0EE1F8AFE900004AAFD16505 B922006F9152E846:8A77F6831E030CBB:28A6BFA833FE45F96C7F00006364D2E8 124FCF005D4B9516:5C5497CD35FAD71B:BD24A27EE9F5A9D7C070270000E375B7 7BE5B07C0019E760:587AD202A11B3DC0:59B26F3A3D381643C6BF305E000017B9 86EE9343E700BF3B:5B1A0B6C08AC87C6:6683A3DFD65AE3090DFDF4CC0F0000CF 849631C57F710077:656B5C536FB6CC79:532B823D801D590FC11588E1E9C00000 4BB2914542E2FB00:CFC0815374FD0C1B:00EF36B04F6A32447C3436594E618B00 00E5B6AE4E1F04BC:B889980FB94C6B43:000079E7BDFCB56E6CD2504326F7A05E 8000550EE1F4163B:F15C9759B51FE740:9D000090BBA22501CC3D289620344CFE 7B880038C192AF9D:43C2B447D3BA0C59:9E150000BD4147F02B1774E627B4B629 5B35710020F18DF9:127D3522FECBA756:6BED1E00007411FEE04065CDFFFA6BCF 52223B3700E9D842:03B749CFF1E6C4C5:55EAF5DF000000BD649B386531093092 77D33E252B00796E:CD4E93288046C1FE:BCDEB8A0AB0000BC2B61484D72F74261 C201377F005800AC:35886B5494D1077F:C4E9F884CFF600006B2118DBD4C23172 4203C3683617C700:AD4E16B645BD381C:111B4112EE4B430000EA7572062FE19B 00A925E6CDCA8787:C1874B1A18A25AD9:9B6AED103D1247820000B4F12B8A6570 8100027ADFE381CB:9E1E67617BE12123:D31D1824E780FA7D1C000072040C4E4D 43AC007918BEC51E:8954A8628F6073A0:E766029C528400A81CF000006D4A819A F1394C005E54D8C9:CA83AD379209D949:C755621F8B81EDA16C094C0000340D28 921F09A5006C9C5D:E050650A0EFF64AE:1A5FACF05ED2356D3A5FD23D00004B8A 9C2DC2DB4D001297:A4CA5E9D472CFF6C:30AFD17D4AB9E6D148EA8A92E40000EF E79FB1B4A49700F1:F75468D5CC3954BA:02322ACAE0B6700E7D82445B7AE60000 D400A5AAC4BAB700:1AC41DA1F48BBEBC:000001D4F9600F91B2CD1975EAD58100 00852E54441918B1:65185050DDE7C809:00009E8291898B9E961C3B2BEE43316F 01007EF2BB26A601:A866E8FE026031F7:57000019D59FB182721C98FA4C8E8159 77E90016E2D57409:AD476E7180FC80F1:09B90000B8AA6CB18683542EB1E1FF4C D73DD20032F3AD08:28F91CF76FA4DF45:F8031C00007891A8A240FCA992D0B913 83DAF01E0006CB29:69143710EE5A8C73:87BD381600003DE9342FED8F961D979C AE2CF2733B00D3B6:643546FE48876F41:ACA61121BE000027F1B6D102FD3961A6 1F9A8F74B9B900EC:7C7DE0F4A345D90F:79368D955A5B0000541E1EDFD47D6032 8B6248D2FD693F00:777B184E2D373FD2:3994D0035AB18E0000E14EBF062253DE 004383DA5687DD0F:2E33EE3C80B03AA3:CB05F743DDDDBB1800000CDABA6F7082 4700DBB3C47A79D9:A9FEEC660D58F74F:7B8034C0387A15C2890000B8B7EE44AB DC8A00992CB890BE:00768BB855022EB8:A7B9EEF171C2BD96193000002A452412 CF6F0B00E8BE9CBB:50EF6E3D4C8186FA:4966648D0D24BD8A47137900000FF58F 8CEB523F00FEBD62:47A692CBB77E3094:D313A88DFC9919BC83A5F70C0000CBEE DFE43077AF0046D2:C49D7ED471A33390:2C7334D72D28BD4991B27976F10000A3 A80A61EA43ED00FF:71CD051906E9A827:6F8B3E9B3EE594685B1BAB08E81E0000 3356F9540109D200:6477D5BF8948F942:0087A1D456585893EA218FFAB998F200 0015F9BA89E0070E:E411797E5ACA7A34:00002BB85339EF5E5D18F0E8008F42FE 7400869928902188:591CDBE69845DECA:810000551FA49B6E0257DF16F60120DB CA4400FB5B4F3CCD:F21BA22C66243D7F:56CF000016BB754C80DCF86B50E0BCE9 079CC900CE8D9824:89D4843D4E496542:6EAF8800004AE2758A491A45F3A49F60 7CD8815F00823DF1:294EFEE87CD9F6EA:4E7980B70000F3B9625F09D08DC9D536 E993C60ABB0036CD:ED87467617F4715E:B24B949D0D00005E79CFB4C695CC7682 F1116845981A0041:90D6DDF669F5A4AB:36990D8EB4CF0000A61D7AC92953D590 1630B706F44C6B00:34B15DF951D3114E:310024F6D3C390000095EE57E871D83D 006352FFEEDFA3E0:ADEDB3A6C0472082:69627F5EF0294C160000051D531728BC E600F2A11F1D60E9:546494BF27CF9BAD:535549708D93FFFAAE0000C47F66AD22 12100060BB5A7C60:BAECA338CCA4A540:87C4B4C31EE8568D6EF40000D66986CF 2DADEF00AF8FFD13:58E3E38C6DFD23CE:D20E0C0EB3DD4C92A18806000028A92C 43263CD0005E45D2:A1CB693BB73C8282:7E660BF195FC3D651C927F8E000085BD 915C2A153900C3AE:2C324F7AD676DD01:A18B8DF4228195D6273289252A0000C7 16973A764ED700CC:0042D6D810E51234:89F557F3DCC2478682F9A746B70B0000 729FCEB1769F2700:3B8DD866347F3C12:004D652ACB1F74CD984174350CC88400 00940B86CB15DBCC:91DF44E34428321B:0000F2708A6D18D1BAEEEF6C618C0EEC 1E009CACCE5E4B57:36A72C67FEA71DD6:3600005455F0F4BFEBE03E37F1A5D391 DB630084270EEA71:5A75F5BCB581F078:EC70000086CA353F3F38784B440E7B2B 48A0C900DCCFFC53:FC779AFD4EE05356:D3D8C9000055C5FA0B09530819ECC2D0 B2D763CB004D729A:39C55AC867CBBD0E:45F4D2B80000E78E7199F0F0B2E2A67B E8C2AE5BE70052A9:7B842C4E1B4360CF:EA730C0680000039A13B4069D0718FA1 38C71268B7150070:AEC3A0ED452221A1:DC340096A4CE000032B772BF3F706A0A 0CF17BC67C288900:19C197698A765E06:D58DD7A445FC2500007CC749B73823D4 0054DE83BDFDDEAB:6E01249199FE3322:48EA721821935A9700006EA093FE21AF 6700F2050642E50B:CBE6CDFB6289FD7A:C6A697FD248B8476B300009DF15FBE5B 370F009211C51E13:F80008FCD23823A6:4E92C17C0552C32915AB00001488853C E3D4FB006D7E2048:8E8F8CF995C71171:6E7B7F4D9C6E74297E93C30000AEC95A 266CCE370000B7D9:8392D507AEF1C999:7156D4AFAC1C2716D4C493FF0000E0A3 89715DD84B00A877:DB319D867BE6F5EA:6BA79216829469E486A15E58BE0000AB 4D2DAAD3FA020031:7497F67FFE71486A:5ABF097E08456B3D2365C54D7AD80000 2A9EC46663F40E00:DC9777DD2553296F:0086298EB766301EC6E64DF9BF3A1800 00F1F54E9A6DC02F:DD3780BA7B16263E:00002F79F90D1DC67F047452CB95E1C4 74000A0E9ACB88AF:E77A9B550D731164:7F0000FE37B43BAFC74D392E5FA06975 94360078C737AAD7:04A17234628802E8:BE21000089A1840B71A5C68F4A4A32F1 8BF4F800EE7BFF5D:F244EAEEC5072D9B:ED65970000BD224C0437DC9F010C44F1 826837CD00BB0898:05DB95245B3B175F:51F7E6350000931538B48D6F0A8270CB E4412B7327002012:989AF943448FF64D:25A16F78BD00003EDEAC10D86E59A0C3 D71D7109FECB0072:A1389295EBAF0F72:E3701E3714A200000AB226A55C447407 767EF7AEF3CAA900:ECE04FCCBFDA84DB:E4A0AC28EA269700009DAD6CD2E1F0C2 0085CEC40E37DE72:D506ED9634352AF9:EA46F14603B3F1B3000089DB9A07A212 7E00B573B2B56DB0:3C7D916C612D6C6D:EE042F10350A3F824100004759009A0B 409900D3F359A7AA:0402B0D166C562FB:6BF869D7953D476E3F7B0000E9A2F766 8BEEB6000757F14A:803B9943069DE4CC:948986E810FED4CDC434270000887908 85218E2800777319:5D4D710B47111D9E:DF75364489CE5CA5499C1E9900007956 D4659B115000E6F5:F1535CDCD422F70F:7297F8C7A3E983D47CCA04098A000083 2A0D9FBA320D009D:A830EC0A0C700181:43A74F8F64AE65BA6915D95EAC620000 0EAFF9E79E22E400:E8C444A639C28AED:00224C24A7D084B77FC18ED3EA2E0B00 008B322DF1816D52:0F810DA2BD5E2203:0000D712F43ADCFED1A9CBCB22CF4E2B 21006874A08B7DA9:D2E3EED16501E0F1:AC000016255D3D8E7F9DC60844C8E5EB 3D600001421332C9:5ADA46B4E6ED7396:31230000FDCE8D418A2AD59630E3B54A 1925E700BCBE480D:DD75CA1376BF4E43:87AD9B00002C142672046D7D1914832A FE95691300B4B938:5EAF07F852F1335A:A0D2AE630000E673148BA974CACB74CF 4A51204D1D00A7BD:D369B44DE778C5AC:C29993616D0000F6B88C40426C971CB0 010264DC3159009A:6050FFF2D7DE8517:AE011C7A16E8000094130EB7C82CD4B6 54C23864C6E67100:C846131ECD974EAF:D1918B16DD54970000844052BCC2B288 005CA93A9FA5CEA9:E225EC5890787888:40C3D98253E2C06F00005628F914678C BA00792365BE88AE:6A8C12DA66EA9595:37B0B3CD389C875BBF000091411E61CA DFEE00E54435255E:39CC7776BEC81C90:4DA603D49F6830E3B14F000001B18BFD BE9BB6004AFDB5B1:E70AB60E29A55AA4:5A7CC2861C3989B5F09B9100000E03F2 6C2C99C80044DBBC:DD165030CFB74177:9E93015F09085EB4FBFD352400006A3F BAD143510100BBC6:847E7BAC90EF08A9:014C89D7790CE632665EB557B600008C 108B4CAD993300BE:949B5376E26551DA:94A2FA1B3BDABE5F4E4B6945AF9A0000 C779A209E5254E00:030B0A813E7302E2:0098EC83BC69794459037F407F240900 # Test vectors taken from ARIB STD-T63-35.203 V6.0.0 [KASUMI] EA024714AD5C4D84:DF1F9B251C0BF45F:2BD6459F82C5B300952C49104881FF48 D3C5D592327FB11C:DE551988CEB2F9B7:8CE33E2CC3C0B5FC1F3DE8A6DC66B1F3 62A540981BA6F9B7:4592B0E78690F71B:4035C6680AF8C6D1A8FF8667B1714013 # Checked against Crypto++ 2.3, so we're compatible with somebody, at least. [Luby-Rackoff(SHA1)] 1112131415161718191A1B1C1D1E1F2021222324\ 25262728292A2B2C2D2E2F303132333435363738:\ 2015B3DB2DC49529C2D26B1F1E86C65EC7B946AB\ 127503CB92F07C0DD4ECD3D7700F31FA0268D381:\ 00112233445566778899AABBCCDDEEFF 00112233445566778899AABBCCDDEEFF10213243\ 5465768798A9BACBDCEDFE0F2031425364758697:\ 84ACC1578337453D0F94FE2A09EAAE844B2BDE24\ 0F6D6225A0AD87EB3773BC29C2B85B51FD068674:\ 00112233445566778899AABBCCDDEEFF0123456789ABCDEFFEDCBA9876543210 [MARS] F94512A9B42D034EC4792204D708A69B:225DA2CB64B73F79069F21A5E3CB8522:\ CB14A1776ABBC1CDAFE7243DEF2CEA02 4DF955AD5B398D66408D620A2B27E1A9:A4B737340AE6D2CAFD930BA97D86129F:\ 86EDF4DA31824CABEF6A4637C40B0BAB 93A953A82C10411DD158860838874D95:4FA0E5F64893131712F01408D233E9F7:\ D158860838874D9500000000000000000000000000000000 1344ABA4D3C44708A8A72116D4F49384:458335D95EA42A9F4DCCD41AECC2390D:\ FBA167983E7AEF22317CE28C02AAE1A3E8E5CC3CEDBEA82A99DBC39AD65E7227 00000000000000000000000000000000:DCC07B8DFB0738D6E30A22DFCF27E886:\ 00000000000000000000000000000000 DCC07B8DFB0738D6E30A22DFCF27E886:33CAFFBDDC7F1DDA0F9C15FA2F30E2FF:\ 00000000000000000000000000000000 33CAFFBDDC7F1DDA0F9C15FA2F30E2FF:62D0D531FD18BAC77177CEB2395EF18F:\ 00000000000000000000000000000000 62D0D531FD18BAC77177CEB2395EF18F:FC444017478822797D800F790622D77B:\ 00000000000000000000000000000000 FC444017478822797D800F790622D77B:D584ED203C50582BCBF74B0469417EDC:\ 00000000000000000000000000000000 D584ED203C50582BCBF74B0469417EDC:7134D3EF595D573FE88E18CE5CB2E612:\ 00000000000000000000000000000000 7134D3EF595D573FE88E18CE5CB2E612:9172072F22CFC72234A7697D73412DB9:\ 00000000000000000000000000000000 9172072F22CFC72234A7697D73412DB9:06B0DDCAAE6EA44BD0C509CE2BC838AC:\ 00000000000000000000000000000000 06B0DDCAAE6EA44BD0C509CE2BC838AC:77512E7A4A90D6D5CD66637DEEF1FD52:\ 00000000000000000000000000000000 77512E7A4A90D6D5CD66637DEEF1FD52:8BC4E466ABE0E2F8FD76019B8237F36E:\ 00000000000000000000000000000000 8BC4E466ABE0E2F8FD76019B8237F36E:77D40822866C0DD51E0594AA81E5F1B5:\ 00000000000000000000000000000000 77D40822866C0DD51E0594AA81E5F1B5:B8AB0608C7976E1D8F57B2BA493C7503:\ 00000000000000000000000000000000 B8AB0608C7976E1D8F57B2BA493C7503:ED4AFE77CE3A2F8C00D0A5E4FDF23426:\ 00000000000000000000000000000000 ED4AFE77CE3A2F8C00D0A5E4FDF23426:1B52C34EDB3826E2BF564E4E3A8C9FA6:\ 00000000000000000000000000000000 1B52C34EDB3826E2BF564E4E3A8C9FA6:AE7E643A355B4847D4F1DBD126518993:\ 00000000000000000000000000000000 AE7E643A355B4847D4F1DBD126518993:3E144191008102E869184D9714BAE7CF:\ 00000000000000000000000000000000 3E144191008102E869184D9714BAE7CF:89ABFA208A52F85CA60F296CE99FC97A:\ 00000000000000000000000000000000 89ABFA208A52F85CA60F296CE99FC97A:FA092A3DD37EF94837715BBC72C9008F:\ 00000000000000000000000000000000 FA092A3DD37EF94837715BBC72C9008F:8A2288E53B2F0DD376ED385911BB4BB9:\ 00000000000000000000000000000000 8A2288E53B2F0DD376ED385911BB4BB9:0CD12B0AEC2BA1C57F06E268A4BF5966:\ 00000000000000000000000000000000 0CD12B0AEC2BA1C57F06E268A4BF5966:0B86524D05D0963C1BDF538290156686:\ 00000000000000000000000000000000 0B86524D05D0963C1BDF538290156686:79031361A2E423A7C4D1613C3873C0A0:\ 00000000000000000000000000000000 79031361A2E423A7C4D1613C3873C0A0:DD66BC447E835A9F426D0A2267850461:\ 00000000000000000000000000000000 DD66BC447E835A9F426D0A2267850461:4294DCCF31F54E693179449F25B514CC:\ 00000000000000000000000000000000 4294DCCF31F54E693179449F25B514CC:0A402C1A0F2EB568EDB7252AFDA4192B:\ 00000000000000000000000000000000 0A402C1A0F2EB568EDB7252AFDA4192B:FFACF106A37C74D17009E2566E611BE0:\ 00000000000000000000000000000000 FFACF106A37C74D17009E2566E611BE0:99E058DA9540E6B5C5A869CB9204010B:\ 00000000000000000000000000000000 99E058DA9540E6B5C5A869CB9204010B:8D616AB19B75842DC5EF102CE4BB2A51:\ 00000000000000000000000000000000 8D616AB19B75842DC5EF102CE4BB2A51:06C7C640672895C3CCFD52DB2CD9D51B:\ 00000000000000000000000000000000 06C7C640672895C3CCFD52DB2CD9D51B:EB2B67E27ABCB5C06DA3D3EECEC8A25B:\ 00000000000000000000000000000000 EB2B67E27ABCB5C06DA3D3EECEC8A25B:62EC35DC05A0BA40FE5D33A0B974C152:\ 00000000000000000000000000000000 62EC35DC05A0BA40FE5D33A0B974C152:A4CB55D7881ACC44F868C8BCFE098091:\ 00000000000000000000000000000000 A4CB55D7881ACC44F868C8BCFE098091:5CEE73CEBCAA22DF78C8C9FB8A47E5D3:\ 00000000000000000000000000000000 5CEE73CEBCAA22DF78C8C9FB8A47E5D3:62FCD19C3AC4370A4CC58AA619B0EA2F:\ 00000000000000000000000000000000 62FCD19C3AC4370A4CC58AA619B0EA2F:3583E618DAC3CE4347FD0E8AE6D6F5E9:\ 00000000000000000000000000000000 3583E618DAC3CE4347FD0E8AE6D6F5E9:2B307B42E0B9EF2D2EC3EEA07D339A87:\ 00000000000000000000000000000000 2B307B42E0B9EF2D2EC3EEA07D339A87:29A212AF4220054975D7C2AE9242AFA8:\ 00000000000000000000000000000000 29A212AF4220054975D7C2AE9242AFA8:67D5BD878FF66CDB33A4DD07EB634F91:\ 00000000000000000000000000000000 67D5BD878FF66CDB33A4DD07EB634F91:53944CA7C3BBBBE32C9BA9D8A8B765D6:\ 00000000000000000000000000000000 53944CA7C3BBBBE32C9BA9D8A8B765D6:9213B43D06D0AB7ECCC5CA751C5DBAA8:\ 00000000000000000000000000000000 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:97778747D60E425C2B4202599DB856FB:\ 000000000000000000000000000000000000000000000000 97778747D60E425C2B4202599DB856FB:885C6C280610DA436936E3C5AEEB9512:\ 000000000000000000000000000000000000000000000000 885C6C280610DA436936E3C5AEEB9512:749935A9971B7060043018F95329A530:\ 000000000000000000000000000000000000000000000000 749935A9971B7060043018F95329A530:05F0D089DE79801B3BE3D3D1361628DD:\ 000000000000000000000000000000000000000000000000 05F0D089DE79801B3BE3D3D1361628DD:35F8044736D1FF4142460E4E72610700:\ 000000000000000000000000000000000000000000000000 35F8044736D1FF4142460E4E72610700:B7028947854FE0C670E1E7416C2803DC:\ 000000000000000000000000000000000000000000000000 B7028947854FE0C670E1E7416C2803DC:D4F8A703F24F7E0AC5807EADADCA8CC9:\ 000000000000000000000000000000000000000000000000 D4F8A703F24F7E0AC5807EADADCA8CC9:77F1D30164CD2984C52ACEC02CAE2CD9:\ 000000000000000000000000000000000000000000000000 77F1D30164CD2984C52ACEC02CAE2CD9:CE509EEFF43FB5C22A9756B023573775:\ 000000000000000000000000000000000000000000000000 CE509EEFF43FB5C22A9756B023573775:B9D5ACCA79E9719979DA1E657C391F07:\ 000000000000000000000000000000000000000000000000 B9D5ACCA79E9719979DA1E657C391F07:9E3B2E46FC6E2D71D46AF0D5CF36B456:\ 000000000000000000000000000000000000000000000000 9E3B2E46FC6E2D71D46AF0D5CF36B456:D8104637E81C52CCEFB0AFE87F4BAF85:\ 000000000000000000000000000000000000000000000000 D8104637E81C52CCEFB0AFE87F4BAF85:C7F9AF5B41E9EB5387DB1D122E483F0E:\ 000000000000000000000000000000000000000000000000 C7F9AF5B41E9EB5387DB1D122E483F0E:D7ACF96A441BB267B591FBCEECB0494F:\ 000000000000000000000000000000000000000000000000 D7ACF96A441BB267B591FBCEECB0494F:DA2234B06D83F32064A78AD3C5303D73:\ 000000000000000000000000000000000000000000000000 DA2234B06D83F32064A78AD3C5303D73:70EF6DCDD349CD7F1D1A0EB3CB18C8C7:\ 000000000000000000000000000000000000000000000000 70EF6DCDD349CD7F1D1A0EB3CB18C8C7:DA093FB2C0F00258D8D9F216C91C0C9C:\ 000000000000000000000000000000000000000000000000 DA093FB2C0F00258D8D9F216C91C0C9C:26EAEEAE8FBE4835E5C43CBF3249CBB6:\ 000000000000000000000000000000000000000000000000 26EAEEAE8FBE4835E5C43CBF3249CBB6:35692A1CC8E9FBB99DEE2AD149EE7F33:\ 000000000000000000000000000000000000000000000000 35692A1CC8E9FBB99DEE2AD149EE7F33:6929CAD6052F809A2850D7E754C11C8D:\ 000000000000000000000000000000000000000000000000 6929CAD6052F809A2850D7E754C11C8D:5F4E499D26ED1D290D9A187FB7B7FB14:\ 000000000000000000000000000000000000000000000000 5F4E499D26ED1D290D9A187FB7B7FB14:BC5B30B2BAE077710A9DF5686794965F:\ 000000000000000000000000000000000000000000000000 BC5B30B2BAE077710A9DF5686794965F:41661F98160A6556815A15B1C1C2E080:\ 000000000000000000000000000000000000000000000000 41661F98160A6556815A15B1C1C2E080:EC2E71697E742ABDBB5FE516E50DBAD5:\ 000000000000000000000000000000000000000000000000 EC2E71697E742ABDBB5FE516E50DBAD5:CB104FF2203633E97573D308923C7AE9:\ 000000000000000000000000000000000000000000000000 CB104FF2203633E97573D308923C7AE9:C47B77D5FAD3535CFAE0BE60B48C741E:\ 000000000000000000000000000000000000000000000000 C47B77D5FAD3535CFAE0BE60B48C741E:BCA5C36E33821A60CAF6E2DA72956C5E:\ 000000000000000000000000000000000000000000000000 BCA5C36E33821A60CAF6E2DA72956C5E:B780AA350F6EFB3B805E505A2D32249F:\ 000000000000000000000000000000000000000000000000 B780AA350F6EFB3B805E505A2D32249F:8857D872D91FE8937E292C8948C0AF24:\ 000000000000000000000000000000000000000000000000 8857D872D91FE8937E292C8948C0AF24:4FCF851C845CBD7D7C528F55B8E84662:\ 000000000000000000000000000000000000000000000000 4FCF851C845CBD7D7C528F55B8E84662:BDDEE7D374D810E3658670F46054F99B:\ 000000000000000000000000000000000000000000000000 BDDEE7D374D810E3658670F46054F99B:16A4F2C3A95B296FBB7F8DEC6F70A9D0:\ 000000000000000000000000000000000000000000000000 16A4F2C3A95B296FBB7F8DEC6F70A9D0:2583F970ED6970C6D0963015D67217B6:\ 000000000000000000000000000000000000000000000000 2583F970ED6970C6D0963015D67217B6:0E7BB2CDF9CD553709D2BE4E9497D2F3:\ 000000000000000000000000000000000000000000000000 0E7BB2CDF9CD553709D2BE4E9497D2F3:A6D82EE721AAF1BA1BC3EBD8C75ABA9F:\ 000000000000000000000000000000000000000000000000 A6D82EE721AAF1BA1BC3EBD8C75ABA9F:C1211304A35315EC827DAE80B3F29BBB:\ 000000000000000000000000000000000000000000000000 C1211304A35315EC827DAE80B3F29BBB:4F0842F2D9EA5CD1AB743A8626DA6BE7:\ 000000000000000000000000000000000000000000000000 4F0842F2D9EA5CD1AB743A8626DA6BE7:BF39E62B863AFFFAD3DEE960962E03AE:\ 000000000000000000000000000000000000000000000000 BF39E62B863AFFFAD3DEE960962E03AE:147C3CB084958D3FBB9D4223D3126BF3:\ 000000000000000000000000000000000000000000000000 147C3CB084958D3FBB9D4223D3126BF3:6E76BEF9304B115EFC1C9002FBB848A0:\ 000000000000000000000000000000000000000000000000 62E45B4CF3477F1DD65063729D9ABA8F:0F4B897EA014D21FBC20F1054A42F719:\ 0000000000000000000000000000000000000000000000000000000000000000 0F4B897EA014D21FBC20F1054A42F719:9A4D42A7F27D42E542286ACF6650CF8A:\ 0000000000000000000000000000000000000000000000000000000000000000 9A4D42A7F27D42E542286ACF6650CF8A:5E5F71257B5156C075FDC4BCBE996527:\ 0000000000000000000000000000000000000000000000000000000000000000 5E5F71257B5156C075FDC4BCBE996527:5A8112FB681B184766069A229BC0E1B6:\ 0000000000000000000000000000000000000000000000000000000000000000 5A8112FB681B184766069A229BC0E1B6:2169853AD199721728B2F41FF6C3F316:\ 0000000000000000000000000000000000000000000000000000000000000000 2169853AD199721728B2F41FF6C3F316:FD3954D96EF5B4078F5C301BAF15A3DE:\ 0000000000000000000000000000000000000000000000000000000000000000 FD3954D96EF5B4078F5C301BAF15A3DE:DB1F3D03E0012505E354B2F4D7C7A255:\ 0000000000000000000000000000000000000000000000000000000000000000 DB1F3D03E0012505E354B2F4D7C7A255:375CECE4E897512373B86A82A6A660D5:\ 0000000000000000000000000000000000000000000000000000000000000000 375CECE4E897512373B86A82A6A660D5:4CDA1DDDD8849D47609D7D9803FD67D6:\ 0000000000000000000000000000000000000000000000000000000000000000 4CDA1DDDD8849D47609D7D9803FD67D6:20A6C90C54A118487C173AE3166EF219:\ 0000000000000000000000000000000000000000000000000000000000000000 20A6C90C54A118487C173AE3166EF219:F4A0164DFC1F38E967F3DDE74B7B0CAD:\ 0000000000000000000000000000000000000000000000000000000000000000 F4A0164DFC1F38E967F3DDE74B7B0CAD:638D1B47820C0FD0A1BFA5FB05AE9087:\ 0000000000000000000000000000000000000000000000000000000000000000 638D1B47820C0FD0A1BFA5FB05AE9087:CDE141CD9E784912B6BEFD62003FE253:\ 0000000000000000000000000000000000000000000000000000000000000000 CDE141CD9E784912B6BEFD62003FE253:84276E8EB17CB38307F3ACFE9480A771:\ 0000000000000000000000000000000000000000000000000000000000000000 84276E8EB17CB38307F3ACFE9480A771:27BA4090E1929A7E65D0C5078039A677:\ 0000000000000000000000000000000000000000000000000000000000000000 27BA4090E1929A7E65D0C5078039A677:264E4F150552D0D5F81583635189EED1:\ 0000000000000000000000000000000000000000000000000000000000000000 264E4F150552D0D5F81583635189EED1:F052005B58BE2C8981575BA5C31D812C:\ 0000000000000000000000000000000000000000000000000000000000000000 F052005B58BE2C8981575BA5C31D812C:807E73C57A18CA88CA0F58C2FFD06394:\ 0000000000000000000000000000000000000000000000000000000000000000 807E73C57A18CA88CA0F58C2FFD06394:C317C6C0411947887DFCE0A9B2270B5F:\ 0000000000000000000000000000000000000000000000000000000000000000 C317C6C0411947887DFCE0A9B2270B5F:8ACD4164453A4C1C0DACBC8C2ED0896C:\ 0000000000000000000000000000000000000000000000000000000000000000 8ACD4164453A4C1C0DACBC8C2ED0896C:2BA5D280D05FBAF78A8B55BF5FD8D343:\ 0000000000000000000000000000000000000000000000000000000000000000 2BA5D280D05FBAF78A8B55BF5FD8D343:DDF70B8350ED845F6D875B0C85961D39:\ 0000000000000000000000000000000000000000000000000000000000000000 DDF70B8350ED845F6D875B0C85961D39:039FD445F0A6D65698D5146D498C8BDB:\ 0000000000000000000000000000000000000000000000000000000000000000 039FD445F0A6D65698D5146D498C8BDB:22AE4D552D09558DEEEFC9518C01F4E2:\ 0000000000000000000000000000000000000000000000000000000000000000 22AE4D552D09558DEEEFC9518C01F4E2:D5947EA67A7BD88DA577A28254EE44EF:\ 0000000000000000000000000000000000000000000000000000000000000000 D5947EA67A7BD88DA577A28254EE44EF:22698C92691EE76CAD72880F577EFEC3:\ 0000000000000000000000000000000000000000000000000000000000000000 22698C92691EE76CAD72880F577EFEC3:10ECA6E5E499742DDEC48434B767EBA1:\ 0000000000000000000000000000000000000000000000000000000000000000 10ECA6E5E499742DDEC48434B767EBA1:3D97E93A44C2CB1CE9AF5770A4BD1A34:\ 0000000000000000000000000000000000000000000000000000000000000000 3D97E93A44C2CB1CE9AF5770A4BD1A34:F89C438D5311FC8235C632629CE1F3A0:\ 0000000000000000000000000000000000000000000000000000000000000000 F89C438D5311FC8235C632629CE1F3A0:4114C623ADF6DB0958FFA2DC27A2A828:\ 0000000000000000000000000000000000000000000000000000000000000000 4114C623ADF6DB0958FFA2DC27A2A828:980089430C89563A5510DF5196E07040:\ 0000000000000000000000000000000000000000000000000000000000000000 980089430C89563A5510DF5196E07040:1D1FEFBD55AA23487CD2DEC4D370302D:\ 0000000000000000000000000000000000000000000000000000000000000000 1D1FEFBD55AA23487CD2DEC4D370302D:73A8AAE732EF445F3462353181168B23:\ 0000000000000000000000000000000000000000000000000000000000000000 73A8AAE732EF445F3462353181168B23:1D8116306AF7D70FE419226F35251687:\ 0000000000000000000000000000000000000000000000000000000000000000 1D8116306AF7D70FE419226F35251687:84EFA8A595B06C91A5A083440DAF5B50:\ 0000000000000000000000000000000000000000000000000000000000000000 84EFA8A595B06C91A5A083440DAF5B50:630EECD4A8A957A610765E01A1D07C45:\ 0000000000000000000000000000000000000000000000000000000000000000 630EECD4A8A957A610765E01A1D07C45:825A47AD6FCE09FEDB5D8F07DE6A2707:\ 0000000000000000000000000000000000000000000000000000000000000000 825A47AD6FCE09FEDB5D8F07DE6A2707:0C472D25510DD0592B5130FB4272DECA:\ 0000000000000000000000000000000000000000000000000000000000000000 0C472D25510DD0592B5130FB4272DECA:3DA22A91B605A540E474383672C8D06C:\ 0000000000000000000000000000000000000000000000000000000000000000 3DA22A91B605A540E474383672C8D06C:9A1C14309E4B246C9E7B485A7F41D046:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B3E2AD5608AC1B6733A7CB4FDF8F9952:\ 80000000000000000000000000000000 00000000000000000000000000000000:8655D5CCAF76A3A8AA09841F04689465:\ 40000000000000000000000000000000 00000000000000000000000000000000:F611F21A70C0AB5FB3D52AD5E8196E09:\ 20000000000000000000000000000000 00000000000000000000000000000000:6676D02EAE3EE58FA396BE40A3A6A234:\ 10000000000000000000000000000000 00000000000000000000000000000000:786E147E5D66764A16DFE1DCB10F3F13:\ 08000000000000000000000000000000 00000000000000000000000000000000:FDDBC84DA51496AD1CA2B7013B93FFA8:\ 04000000000000000000000000000000 00000000000000000000000000000000:B5A0BB3A8E7FEAC192B7BF8080E2CC81:\ 02000000000000000000000000000000 00000000000000000000000000000000:9A4802E8BF4426467617E9A44072EB76:\ 01000000000000000000000000000000 00000000000000000000000000000000:BE279F4EE696EC5B07820A1066F110CD:\ 00800000000000000000000000000000 00000000000000000000000000000000:4BBB919E52C258960549FAE9DD5FF524:\ 00400000000000000000000000000000 00000000000000000000000000000000:6B077B5DE4C9961DC6E11053662E3CFB:\ 00200000000000000000000000000000 00000000000000000000000000000000:755358499858F166C9DEAF2E79B3EDA3:\ 00100000000000000000000000000000 00000000000000000000000000000000:632644AA2ACB4FB3214E9E5BFF57D4D8:\ 00080000000000000000000000000000 00000000000000000000000000000000:DD3F06DD5A90BD7EA3F4B1BFB56E4ABB:\ 00040000000000000000000000000000 00000000000000000000000000000000:B2FB07551FD5B549C857020356B99D45:\ 00020000000000000000000000000000 00000000000000000000000000000000:5DE9EF4627A3EB6FD3920C322ECE9FAB:\ 00010000000000000000000000000000 00000000000000000000000000000000:A8D37D0254E1C908AAD02631B614A0C6:\ 00008000000000000000000000000000 00000000000000000000000000000000:91372C769C1E64DE0FDDC1C63436B623:\ 00004000000000000000000000000000 00000000000000000000000000000000:4F8FF5063FFF638497733E1526EE27BD:\ 00002000000000000000000000000000 00000000000000000000000000000000:5157ECB5597AC6A8D761E97517C65C0F:\ 00001000000000000000000000000000 00000000000000000000000000000000:117B9349CFFD2066452CC0FE204C18A5:\ 00000800000000000000000000000000 00000000000000000000000000000000:AE0AF51926529A3F354F7585578F6439:\ 00000400000000000000000000000000 00000000000000000000000000000000:B2723B8D2D61497DBF44FF9D70E48C0E:\ 00000200000000000000000000000000 00000000000000000000000000000000:464B3EB2A0F8A394DA239E0D0D62EDE2:\ 00000100000000000000000000000000 00000000000000000000000000000000:AA03D30E1CE0E91DC360B1E538017F05:\ 00000080000000000000000000000000 00000000000000000000000000000000:B1EDF5E18160BF8E16F386D999BF65BE:\ 00000040000000000000000000000000 00000000000000000000000000000000:85F1BDD358B23675328841103F1DCE65:\ 00000020000000000000000000000000 00000000000000000000000000000000:38DEA42C35E5758C7C5CCF451936DFCB:\ 00000010000000000000000000000000 00000000000000000000000000000000:E484E7CB2D35D5AE92939B06864A0E6B:\ 00000008000000000000000000000000 00000000000000000000000000000000:53B7E22F63F4D8AAC66D148619A7691D:\ 00000004000000000000000000000000 00000000000000000000000000000000:0042A8EDB756329533D82ED13386E648:\ 00000002000000000000000000000000 00000000000000000000000000000000:44BBDB223AFCC69EB69C5D07AF10E5D8:\ 00000001000000000000000000000000 00000000000000000000000000000000:C5B1739AF4C0AE459BF11144132D0979:\ 00000000800000000000000000000000 00000000000000000000000000000000:151BBFAECB027BAB90C8DA3E4743F033:\ 00000000400000000000000000000000 00000000000000000000000000000000:376786816F319B96A19B134143952FE5:\ 00000000200000000000000000000000 00000000000000000000000000000000:3E94AC897203461EFD9EED441F66AE9F:\ 00000000100000000000000000000000 00000000000000000000000000000000:61A93766162F0B01EDC84D47B1D4ECAA:\ 00000000080000000000000000000000 00000000000000000000000000000000:B21FA9D0AC731750F15B47FFF2BC4030:\ 00000000040000000000000000000000 00000000000000000000000000000000:BDE8813E0E4EAE6CECCBC4C6BD10C610:\ 00000000020000000000000000000000 00000000000000000000000000000000:50A5AE30DC3432F3060EE3628B274FFB:\ 00000000010000000000000000000000 00000000000000000000000000000000:E3DA95B76AD9E29F0B3F14DD33C670AC:\ 00000000008000000000000000000000 00000000000000000000000000000000:969DC8A583DED13E53042450FA4BE8FA:\ 00000000004000000000000000000000 00000000000000000000000000000000:D7CB0D2F9BFF048CBD8CBD8452361611:\ 00000000002000000000000000000000 00000000000000000000000000000000:E056677749114108153C6AC262EC0396:\ 00000000001000000000000000000000 00000000000000000000000000000000:E5572F1812044977D4309B8D675CAE48:\ 00000000000800000000000000000000 00000000000000000000000000000000:F00C1AB95B5CE3D3ACC2162E7A7F0262:\ 00000000000400000000000000000000 00000000000000000000000000000000:AB33C3682E0C1BFA627F4932AE4AAD94:\ 00000000000200000000000000000000 00000000000000000000000000000000:EE5B68820CB978CAACA22B1D590E31CF:\ 00000000000100000000000000000000 00000000000000000000000000000000:8ACACFB9E872873E315D84657613756B:\ 00000000000080000000000000000000 00000000000000000000000000000000:75CD1E528E5B6DB21BC8E44E70E5ECFA:\ 00000000000040000000000000000000 00000000000000000000000000000000:3195CE6F460654E6FC00672755A5B7C3:\ 00000000000020000000000000000000 00000000000000000000000000000000:8ACC17F3EDF59AA02DBBA93F27AD11D0:\ 00000000000010000000000000000000 00000000000000000000000000000000:DD82C41281BE711F7E5DCDCDC6CBBF6F:\ 00000000000008000000000000000000 00000000000000000000000000000000:971ABFC0649C9ABE7DE583799F31DD9D:\ 00000000000004000000000000000000 00000000000000000000000000000000:9CD8E45DE9909A8146956F2B581AE664:\ 00000000000002000000000000000000 00000000000000000000000000000000:095314A316B4DB9CE6F2CDDEC59ECE89:\ 00000000000001000000000000000000 00000000000000000000000000000000:B626E1C40D644E2E72370CA4A3528576:\ 00000000000000800000000000000000 00000000000000000000000000000000:002E4294BD6DDE3E3BFFB0CF5A5A7D4B:\ 00000000000000400000000000000000 00000000000000000000000000000000:DA89C327F041BEBDB09E835ED2A2DDBE:\ 00000000000000200000000000000000 00000000000000000000000000000000:9BC999880C14C9358CA89C435B1FDB00:\ 00000000000000100000000000000000 00000000000000000000000000000000:D0C92CFF98EB228C6C19B405E6EFEE77:\ 00000000000000080000000000000000 00000000000000000000000000000000:FAE5C83332BB176704F0E73B27442C0C:\ 00000000000000040000000000000000 00000000000000000000000000000000:DC9FB83F80E56CAF1DB807B5921927E8:\ 00000000000000020000000000000000 00000000000000000000000000000000:6FBB39934CC2627EE4F93343F50EB9D4:\ 00000000000000010000000000000000 00000000000000000000000000000000:02A31EDEF8DEA2DE3307748BF4DC1C54:\ 00000000000000008000000000000000 00000000000000000000000000000000:8C433C3D2005B30996ADA41F896436AC:\ 00000000000000004000000000000000 00000000000000000000000000000000:ED04C68D4D73C6EE193E0FC9E2CBD1B0:\ 00000000000000002000000000000000 00000000000000000000000000000000:515E01A6F25A4F1B2B57B27DECBFF195:\ 00000000000000001000000000000000 00000000000000000000000000000000:30A07996E5C40C41786FC75B9C56325B:\ 00000000000000000800000000000000 00000000000000000000000000000000:279C94707B0732D210DA7B619158825A:\ 00000000000000000400000000000000 00000000000000000000000000000000:07552A95AC44BB11CD34428C858FD19F:\ 00000000000000000200000000000000 00000000000000000000000000000000:BA67FC2E51DA92EA19079B237B42C9D8:\ 00000000000000000100000000000000 00000000000000000000000000000000:40387C974070B484E0DBAAFD5ADA0243:\ 00000000000000000080000000000000 00000000000000000000000000000000:3BF99A29B17D84BE5F8DC315616061F8:\ 00000000000000000040000000000000 00000000000000000000000000000000:D4EF00C794D337961FD9E3B5AF7A67A5:\ 00000000000000000020000000000000 00000000000000000000000000000000:1C77C28A6CBF3CBB24F2686ED3A408E2:\ 00000000000000000010000000000000 00000000000000000000000000000000:F93568CD7CBA7A6E9B9DD7144F1D4ABB:\ 00000000000000000008000000000000 00000000000000000000000000000000:C3BCD1F7F268E2806CCF0498C85D2E3E:\ 00000000000000000004000000000000 00000000000000000000000000000000:2FD2F0DEB5DBF7EB3B9050042E56A9A9:\ 00000000000000000002000000000000 00000000000000000000000000000000:2150DEB8C7C6327227A772031FF64047:\ 00000000000000000001000000000000 00000000000000000000000000000000:3E8B4B1CBB877B6F612BFB391043CFC3:\ 00000000000000000000800000000000 00000000000000000000000000000000:2376F56DFEB40C9348D758CA068C2127:\ 00000000000000000000400000000000 00000000000000000000000000000000:AABB351CA9BDCDACCD8E966766FF1C59:\ 00000000000000000000200000000000 00000000000000000000000000000000:212EF966B6CEECC65B5B0AE6A9DAA099:\ 00000000000000000000100000000000 00000000000000000000000000000000:99C95AC67935AE473E2EF3907DDCE5B3:\ 00000000000000000000080000000000 00000000000000000000000000000000:125DC68286DB1F81E6CD3D0C9EF8B922:\ 00000000000000000000040000000000 00000000000000000000000000000000:CC55D94C0102A12D87454DB8BA8E654C:\ 00000000000000000000020000000000 00000000000000000000000000000000:3F1E089ACAD719F7DB9292A770038475:\ 00000000000000000000010000000000 00000000000000000000000000000000:EC4D155D404F72B4BE88D1E17C345822:\ 00000000000000000000008000000000 00000000000000000000000000000000:276F8AECA95C7F65CD95B77680955548:\ 00000000000000000000004000000000 00000000000000000000000000000000:7D78CE850C26BB18B8631CDFF0A5E597:\ 00000000000000000000002000000000 00000000000000000000000000000000:6345692D62E879A058F342D5226A036D:\ 00000000000000000000001000000000 00000000000000000000000000000000:E19D5A2899061B7B5537EA6DF0390FE8:\ 00000000000000000000000800000000 00000000000000000000000000000000:4FAB8BB80E979853052BA0B19EF8521D:\ 00000000000000000000000400000000 00000000000000000000000000000000:E84EE11321AF1C0AE6430C4F600270B4:\ 00000000000000000000000200000000 00000000000000000000000000000000:73048F29C44F0953DFCC6B5380D36977:\ 00000000000000000000000100000000 00000000000000000000000000000000:16280B84B187AE90E25121AB297620FA:\ 00000000000000000000000080000000 00000000000000000000000000000000:FAAE881E9FA9DCA876B668CCAFA12B6A:\ 00000000000000000000000040000000 00000000000000000000000000000000:46A73C4A4516E1E0BE2140E175A7225F:\ 00000000000000000000000020000000 00000000000000000000000000000000:01C71A7B0BD6410894C9234A4250ABB4:\ 00000000000000000000000010000000 00000000000000000000000000000000:EA8CEF3C1E8EF94D4A17A4D4C1C28C32:\ 00000000000000000000000008000000 00000000000000000000000000000000:13BB356657B36C0D023047B324443468:\ 00000000000000000000000004000000 00000000000000000000000000000000:B14DCC5250036260131B3D92B1B26C18:\ 00000000000000000000000002000000 00000000000000000000000000000000:261E07BADC6E4BBB0EAD9ECCAE179821:\ 00000000000000000000000001000000 00000000000000000000000000000000:1D40D508EB8878251EC5C01D8E9949BB:\ 00000000000000000000000000800000 00000000000000000000000000000000:735BDCA8DF0C58679161E99BED3B8D3E:\ 00000000000000000000000000400000 00000000000000000000000000000000:49C907F757494623F8E8519F4A5D13A0:\ 00000000000000000000000000200000 00000000000000000000000000000000:AB858C224E5A3ADDF5A7549A98EEAF94:\ 00000000000000000000000000100000 00000000000000000000000000000000:7C7A62A1DBF206572A323682E0441458:\ 00000000000000000000000000080000 00000000000000000000000000000000:7461D6F4D609F8BCA9CAB4EB559C71C3:\ 00000000000000000000000000040000 00000000000000000000000000000000:2F646495150F4F9CA06B77281C1150FD:\ 00000000000000000000000000020000 00000000000000000000000000000000:A0C27498F797D6A9F513640AFE6CC316:\ 00000000000000000000000000010000 00000000000000000000000000000000:8D511A840453125335AB8DF8C64FA8E8:\ 00000000000000000000000000008000 00000000000000000000000000000000:9E64465740D81CCB74713A144F636985:\ 00000000000000000000000000004000 00000000000000000000000000000000:804499E6C6E8790988747009D3B3C66D:\ 00000000000000000000000000002000 00000000000000000000000000000000:59EBC223BAC60B13198C9AF47066274E:\ 00000000000000000000000000001000 00000000000000000000000000000000:CCA216CC095954AFD3DE594C91A26310:\ 00000000000000000000000000000800 00000000000000000000000000000000:06FF525F42EFF20A548DA1B7DCD1FFF8:\ 00000000000000000000000000000400 00000000000000000000000000000000:B2F1FD473FCA588111E6EB9DCE82CFA9:\ 00000000000000000000000000000200 00000000000000000000000000000000:557307573D2E5225AD6EDADDF1FCAB68:\ 00000000000000000000000000000100 00000000000000000000000000000000:CA159F81D155071BDCA701174C69184D:\ 00000000000000000000000000000080 00000000000000000000000000000000:41491AE31AB75E3ACA41B1A2CB75C1D9:\ 00000000000000000000000000000040 00000000000000000000000000000000:C3B4B9419C0E19D4A851C2DAD2954268:\ 00000000000000000000000000000020 00000000000000000000000000000000:6E3DD6DF183B80A0FF5D2D0A4B25A2C8:\ 00000000000000000000000000000010 00000000000000000000000000000000:EC69E1BD0815AE6C83876B75E58A7EB6:\ 00000000000000000000000000000008 00000000000000000000000000000000:8F5766DE11517F63A60459B1EDC32D44:\ 00000000000000000000000000000004 00000000000000000000000000000000:8A74C64985345925D8A6AB8E6A0D3589:\ 00000000000000000000000000000002 00000000000000000000000000000000:F65B8E5EAF04B33AD5FCF1B14874E059:\ 00000000000000000000000000000001 00000000000000000000000000000000:FD04E0B77403BBDC72A370240B45B92D:\ 800000000000000000000000000000000000000000000000 00000000000000000000000000000000:CB0B4AC08E20385D31CF468B52B356E2:\ 400000000000000000000000000000000000000000000000 00000000000000000000000000000000:C39B63B4A8F7BF5C3CC61141584DE462:\ 200000000000000000000000000000000000000000000000 00000000000000000000000000000000:C63F433FF98BEE849D75D0F0402C9273:\ 100000000000000000000000000000000000000000000000 00000000000000000000000000000000:9433992C094CDBEC06199B0517970B5D:\ 080000000000000000000000000000000000000000000000 00000000000000000000000000000000:FA8B068AD3C2C32F99EF1A4F76C409AF:\ 040000000000000000000000000000000000000000000000 00000000000000000000000000000000:014617D6109068C39137EE0CC522163E:\ 020000000000000000000000000000000000000000000000 00000000000000000000000000000000:41B87685C649AD72C32D9390C23CF34B:\ 010000000000000000000000000000000000000000000000 00000000000000000000000000000000:6836281F31AA9120DC144E26074491EC:\ 008000000000000000000000000000000000000000000000 00000000000000000000000000000000:C4163CB0CA1315C3D0115D495E0FF701:\ 004000000000000000000000000000000000000000000000 00000000000000000000000000000000:F0B8F3585636D2785FF619523C4365B9:\ 002000000000000000000000000000000000000000000000 00000000000000000000000000000000:6E1740E818B450955C6B7612DBBA0DAE:\ 001000000000000000000000000000000000000000000000 00000000000000000000000000000000:192A2FAAC85794EB20E43645E2E1B749:\ 000800000000000000000000000000000000000000000000 00000000000000000000000000000000:5CA4011E7024A4978B58E1DFA9278625:\ 000400000000000000000000000000000000000000000000 00000000000000000000000000000000:498152C714A2CEFD692AC99DB90CDDBD:\ 000200000000000000000000000000000000000000000000 00000000000000000000000000000000:DEB3A9FEB22886C511A057AB858BB4DD:\ 000100000000000000000000000000000000000000000000 00000000000000000000000000000000:D60466B1EA5C1C7A5DDFDA049A685B50:\ 000080000000000000000000000000000000000000000000 00000000000000000000000000000000:62A0EE49A6333815350E9C9CD7CB24D2:\ 000040000000000000000000000000000000000000000000 00000000000000000000000000000000:3AE70846AFDCC299B32EB9DE118070B8:\ 000020000000000000000000000000000000000000000000 00000000000000000000000000000000:5118414720E424364E15B5EDC8E64559:\ 000010000000000000000000000000000000000000000000 00000000000000000000000000000000:42F9E38F7FB493D6048C63F804F5AD62:\ 000008000000000000000000000000000000000000000000 00000000000000000000000000000000:71043DAA3CF78997D9965DE84B150FA6:\ 000004000000000000000000000000000000000000000000 00000000000000000000000000000000:55B0DF5816DD16D2EB5CDDC5478D0652:\ 000002000000000000000000000000000000000000000000 00000000000000000000000000000000:CA853E905496251FF856259149FB5CCA:\ 000001000000000000000000000000000000000000000000 00000000000000000000000000000000:BEF7C892708F0369378EA80C0EB9DD4A:\ 000000800000000000000000000000000000000000000000 00000000000000000000000000000000:3E7D986D91BEE75E597999C3E7372F06:\ 000000400000000000000000000000000000000000000000 00000000000000000000000000000000:8877D8DAF98680C7EC03C870BAFB66F9:\ 000000200000000000000000000000000000000000000000 00000000000000000000000000000000:493B8E5D02D01A6C98DDF4D016F4932D:\ 000000100000000000000000000000000000000000000000 00000000000000000000000000000000:E372455C9A44DCD5AEA803A276B2C5C3:\ 000000080000000000000000000000000000000000000000 00000000000000000000000000000000:92FCA63F71BCD0C950231E104D833246:\ 000000040000000000000000000000000000000000000000 00000000000000000000000000000000:1630F75A2F31B1998725D849CC2ADA9A:\ 000000020000000000000000000000000000000000000000 00000000000000000000000000000000:E3B636FC5BE0F05A036AEDF4DE7154BD:\ 000000010000000000000000000000000000000000000000 00000000000000000000000000000000:DBC8BD2D128A11715152306E19C9D1F9:\ 000000008000000000000000000000000000000000000000 00000000000000000000000000000000:AEFB45876EE3B0025A2D26A7A20E2A72:\ 000000004000000000000000000000000000000000000000 00000000000000000000000000000000:C7F1370CD98539026B8FD0968F7A8247:\ 000000002000000000000000000000000000000000000000 00000000000000000000000000000000:6D09CC037CDFD06ECAC142630A599C4F:\ 000000001000000000000000000000000000000000000000 00000000000000000000000000000000:94C29805153DB7FE4834BD261F0CA87E:\ 000000000800000000000000000000000000000000000000 00000000000000000000000000000000:B509BAF1EAB92764F8085764968CD111:\ 000000000400000000000000000000000000000000000000 00000000000000000000000000000000:E6ECD9CCAF93F302250A90E3C083C22E:\ 000000000200000000000000000000000000000000000000 00000000000000000000000000000000:1419D2C7A7A8F7AB5D78B327770EE8F7:\ 000000000100000000000000000000000000000000000000 00000000000000000000000000000000:984FA23C883200CFA802FCBF1DE752A2:\ 000000000080000000000000000000000000000000000000 00000000000000000000000000000000:003BFBA6334DEDFF7A3652DFDC73D04A:\ 000000000040000000000000000000000000000000000000 00000000000000000000000000000000:B21EC3CCD1303B81744348C64B5E5984:\ 000000000020000000000000000000000000000000000000 00000000000000000000000000000000:58557001247E8AFE91399042E723751B:\ 000000000010000000000000000000000000000000000000 00000000000000000000000000000000:0EF33C5A09600898D9FFE6AF5A06C2B6:\ 000000000008000000000000000000000000000000000000 00000000000000000000000000000000:AA0E866FEE8227BF6A8FDA4B318920AB:\ 000000000004000000000000000000000000000000000000 00000000000000000000000000000000:839A0DA3DB2718EEBB917B4CE37D23BF:\ 000000000002000000000000000000000000000000000000 00000000000000000000000000000000:BA3292A8130B2708EEBC5B2478B52C17:\ 000000000001000000000000000000000000000000000000 00000000000000000000000000000000:49B2A8F2FC9639B5918176993D96646A:\ 000000000000800000000000000000000000000000000000 00000000000000000000000000000000:21967CDE8F85ED1600F359F376CD18CA:\ 000000000000400000000000000000000000000000000000 00000000000000000000000000000000:6CCA94D43AB4B3A82FA4E514D928E644:\ 000000000000200000000000000000000000000000000000 00000000000000000000000000000000:3C76EAC404CF1E23B0A159C919A60206:\ 000000000000100000000000000000000000000000000000 00000000000000000000000000000000:F9DE0E78E8CC16D3A99D7642DEA13DB0:\ 000000000000080000000000000000000000000000000000 00000000000000000000000000000000:5B74643F1DEA8CA49078E4BF54B856CA:\ 000000000000040000000000000000000000000000000000 00000000000000000000000000000000:0E07FE27FBFAB005FF7EF334C3320736:\ 000000000000020000000000000000000000000000000000 00000000000000000000000000000000:477810CB11FC7E68144960AAD5372A64:\ 000000000000010000000000000000000000000000000000 00000000000000000000000000000000:A638D2171A231AFF384C97A7E9EFF6B6:\ 000000000000008000000000000000000000000000000000 00000000000000000000000000000000:9EA186F9AA6BE6D395E92474CCB9CAA3:\ 000000000000004000000000000000000000000000000000 00000000000000000000000000000000:7F6A295094E5512EDEA0B7206B977270:\ 000000000000002000000000000000000000000000000000 00000000000000000000000000000000:2DD07726A9333391A6EB41F4859A1627:\ 000000000000001000000000000000000000000000000000 00000000000000000000000000000000:515847FB17843E42C936A6201DF28563:\ 000000000000000800000000000000000000000000000000 00000000000000000000000000000000:35B29379EABD877B458FC4A4FB532931:\ 000000000000000400000000000000000000000000000000 00000000000000000000000000000000:B986149A6E871ACD8E3E1E5F5928C889:\ 000000000000000200000000000000000000000000000000 00000000000000000000000000000000:84D0A488FB56ADB915B553B2EDDBCC41:\ 000000000000000100000000000000000000000000000000 00000000000000000000000000000000:63B2B5A4D51E076D673044C71DC68B02:\ 000000000000000080000000000000000000000000000000 00000000000000000000000000000000:F388AD195E35B2892E586B830D728440:\ 000000000000000040000000000000000000000000000000 00000000000000000000000000000000:8FA923E8949678F76205CF4CBE07FF2F:\ 000000000000000020000000000000000000000000000000 00000000000000000000000000000000:ACCF2708E75B4CF48E45B641B81C1F41:\ 000000000000000010000000000000000000000000000000 00000000000000000000000000000000:0A7C295579AD4296447B7E56EB719ED3:\ 000000000000000008000000000000000000000000000000 00000000000000000000000000000000:06572AAB88739B2BDEE8E1E9CCA22883:\ 000000000000000004000000000000000000000000000000 00000000000000000000000000000000:2CF0CA3DB58CDC62890D386B07A4145F:\ 000000000000000002000000000000000000000000000000 00000000000000000000000000000000:CEFAEB3CEAA5959FAB15E884D46E9F09:\ 000000000000000001000000000000000000000000000000 00000000000000000000000000000000:57EB477F0573D6C75E45EE8606B5A2B6:\ 000000000000000000800000000000000000000000000000 00000000000000000000000000000000:C55F45149DE0FD18F2588B2B9F54CC22:\ 000000000000000000400000000000000000000000000000 00000000000000000000000000000000:ABCA7BE4CCC597AD8783C24EAB8BF17D:\ 000000000000000000200000000000000000000000000000 00000000000000000000000000000000:702F3D046E8651BF40D6A5914D8AC8B5:\ 000000000000000000100000000000000000000000000000 00000000000000000000000000000000:2C6424E1EF097C8FB44138C8A5160AE7:\ 000000000000000000080000000000000000000000000000 00000000000000000000000000000000:3F0E8296D93C233CBBE22623CCB66A52:\ 000000000000000000040000000000000000000000000000 00000000000000000000000000000000:D828348AFD520F98ED31F0B9FA4C48B1:\ 000000000000000000020000000000000000000000000000 00000000000000000000000000000000:BA7A4AA5F32D16DF08ABAA63E72F8BAD:\ 000000000000000000010000000000000000000000000000 00000000000000000000000000000000:9211FA0B1161E094BE702157D4CAFC73:\ 000000000000000000008000000000000000000000000000 00000000000000000000000000000000:1A4D5C52FDDEE81374295341F950055D:\ 000000000000000000004000000000000000000000000000 00000000000000000000000000000000:9544A653B635734B0FBC84E6C64B1AD5:\ 000000000000000000002000000000000000000000000000 00000000000000000000000000000000:8B7E7EE1A74570F35183E15D05114BD0:\ 000000000000000000001000000000000000000000000000 00000000000000000000000000000000:6567CE30F21EE879D60359CEE9AD3EC0:\ 000000000000000000000800000000000000000000000000 00000000000000000000000000000000:E5078C9B9B7572A60822A44150C6A4F4:\ 000000000000000000000400000000000000000000000000 00000000000000000000000000000000:51DFF3FE97481F08F6D5B66480AEE6D5:\ 000000000000000000000200000000000000000000000000 00000000000000000000000000000000:E84E478B15FB1BCD50E3CA9936FE9E01:\ 000000000000000000000100000000000000000000000000 00000000000000000000000000000000:FC614E54348A78E28ADB5DFB11130ADC:\ 000000000000000000000080000000000000000000000000 00000000000000000000000000000000:0F872CF9F54CE981ED17E41B23ED616C:\ 000000000000000000000040000000000000000000000000 00000000000000000000000000000000:AFCC9646ED78283BD19092853223F347:\ 000000000000000000000020000000000000000000000000 00000000000000000000000000000000:35D5A827B175D776F8F90F30F41A1C4B:\ 000000000000000000000010000000000000000000000000 00000000000000000000000000000000:B55980544140E694FCDFCE7C251C121C:\ 000000000000000000000008000000000000000000000000 00000000000000000000000000000000:244C4A55D5EEC8BD55C4F0D295ED2541:\ 000000000000000000000004000000000000000000000000 00000000000000000000000000000000:B3700314BD37894991C2FD4355B26845:\ 000000000000000000000002000000000000000000000000 00000000000000000000000000000000:43F3C6FFB517CD6E8EE1AEFCAA6FDE06:\ 000000000000000000000001000000000000000000000000 00000000000000000000000000000000:0F1A3E34821335E4EC22D404155192C2:\ 000000000000000000000000800000000000000000000000 00000000000000000000000000000000:22C59B22CC6A1E0EA313346F461324CD:\ 000000000000000000000000400000000000000000000000 00000000000000000000000000000000:2A90EF00D977A82EBDF6681F33D7DC1C:\ 000000000000000000000000200000000000000000000000 00000000000000000000000000000000:4B36176A8C174A635BF96A5B46BCF54C:\ 000000000000000000000000100000000000000000000000 00000000000000000000000000000000:E344C5213246712CAA2A056A6EE1868F:\ 000000000000000000000000080000000000000000000000 00000000000000000000000000000000:8F75D3C2ABBF84F3AA5E1734D6CC76A6:\ 000000000000000000000000040000000000000000000000 00000000000000000000000000000000:2258F75A5FC2B667DD0B28039CEA784C:\ 000000000000000000000000020000000000000000000000 00000000000000000000000000000000:D74F3EA90D02FC4908FDDCBE5849152E:\ 000000000000000000000000010000000000000000000000 00000000000000000000000000000000:0DCD8607E57390DD609717338591B205:\ 000000000000000000000000008000000000000000000000 00000000000000000000000000000000:594419C26F408B721F82ACCAC2DF1D5B:\ 000000000000000000000000004000000000000000000000 00000000000000000000000000000000:12D0F6A150858F64F0C88061CE592C11:\ 000000000000000000000000002000000000000000000000 00000000000000000000000000000000:5351E750DE5C9322AFA2885FB83C623B:\ 000000000000000000000000001000000000000000000000 00000000000000000000000000000000:7C120675A918C2C728149D332A196586:\ 000000000000000000000000000800000000000000000000 00000000000000000000000000000000:CDCA42B4E3ED64C2D37812847D7377CC:\ 000000000000000000000000000400000000000000000000 00000000000000000000000000000000:E4B73F8C0D9A40A67ACB9837CF8006DB:\ 000000000000000000000000000200000000000000000000 00000000000000000000000000000000:A863A13ED52E8BFD6652FEE291837B1D:\ 000000000000000000000000000100000000000000000000 00000000000000000000000000000000:64F9790C0BBD5C234FFADF0037485BB1:\ 000000000000000000000000000080000000000000000000 00000000000000000000000000000000:37A8AA3E38B937D92E1E41EC5E157FE0:\ 000000000000000000000000000040000000000000000000 00000000000000000000000000000000:F84D2A60A99BA9C17848BFBFBFEA0271:\ 000000000000000000000000000020000000000000000000 00000000000000000000000000000000:01AD547F2E1A713AC0B3D3E332A044A6:\ 000000000000000000000000000010000000000000000000 00000000000000000000000000000000:ED06A9B6EB5E24DF2CDA83564080AE93:\ 000000000000000000000000000008000000000000000000 00000000000000000000000000000000:3682650D35D3247471F3EB10A173479D:\ 000000000000000000000000000004000000000000000000 00000000000000000000000000000000:E3BD985B5B7C83F841F2F2A37A2974B3:\ 000000000000000000000000000002000000000000000000 00000000000000000000000000000000:EEA30254CF0FD6379A7203FC2328EEB6:\ 000000000000000000000000000001000000000000000000 00000000000000000000000000000000:4F2C052C360DA20FF826DFA98429AAA5:\ 000000000000000000000000000000800000000000000000 00000000000000000000000000000000:5F4CE32E4D55F0EB15799A3C46E1C40A:\ 000000000000000000000000000000400000000000000000 00000000000000000000000000000000:2EBE1C941F8247BBA3E85A04BA10B27C:\ 000000000000000000000000000000200000000000000000 00000000000000000000000000000000:9F41738ADB0CD8B4DD048527FCCFC23B:\ 000000000000000000000000000000100000000000000000 00000000000000000000000000000000:0E9F502FEE59A16CC5CEEDC82FD98E1A:\ 000000000000000000000000000000080000000000000000 00000000000000000000000000000000:56DC540BBAFB42B9817B4D464993DBCE:\ 000000000000000000000000000000040000000000000000 00000000000000000000000000000000:7421D3EB41769680565DD67683FE6737:\ 000000000000000000000000000000020000000000000000 00000000000000000000000000000000:777D08A4999E79A97CDBAFA5B6C33D12:\ 000000000000000000000000000000010000000000000000 00000000000000000000000000000000:4F3145690B092FAEDEBC672FE0ABC1EC:\ 000000000000000000000000000000008000000000000000 00000000000000000000000000000000:C221E4ABE2DD5ABA26DC29B6F3E421C6:\ 000000000000000000000000000000004000000000000000 00000000000000000000000000000000:EC48948223D3086FA730F6F81C103E8B:\ 000000000000000000000000000000002000000000000000 00000000000000000000000000000000:38B03357B1A0719A4E04FC3725B66400:\ 000000000000000000000000000000001000000000000000 00000000000000000000000000000000:A9458E67FD55DFB7F5D43344D7B8D994:\ 000000000000000000000000000000000800000000000000 00000000000000000000000000000000:C82BBCFE8E647A4915E578BB6BB410EC:\ 000000000000000000000000000000000400000000000000 00000000000000000000000000000000:27DA68521E57EFBC401640232896ABC7:\ 000000000000000000000000000000000200000000000000 00000000000000000000000000000000:DD6C4A6784C293F1D6B334731298C043:\ 000000000000000000000000000000000100000000000000 00000000000000000000000000000000:C2C4A691BD77C60869E6C030E357B7DF:\ 000000000000000000000000000000000080000000000000 00000000000000000000000000000000:EDA41EF6E7863F1A7D718E31A7D0AB0F:\ 000000000000000000000000000000000040000000000000 00000000000000000000000000000000:7915CF01D36808B875E1561FB88ECF2D:\ 000000000000000000000000000000000020000000000000 00000000000000000000000000000000:033826639ABFCBA709DEECD8F32306D5:\ 000000000000000000000000000000000010000000000000 00000000000000000000000000000000:B7CE1348B2832FABD58542A59319C947:\ 000000000000000000000000000000000008000000000000 00000000000000000000000000000000:479E3B195B3F9BE75AA2D0931F179495:\ 000000000000000000000000000000000004000000000000 00000000000000000000000000000000:6B9E7F0C5050E8CD232722C33261135D:\ 000000000000000000000000000000000002000000000000 00000000000000000000000000000000:063F64EDD05343702B76BE045A9D1DDD:\ 000000000000000000000000000000000001000000000000 00000000000000000000000000000000:E1AE2D5667E440C0A44EF9CC91AA10CC:\ 000000000000000000000000000000000000800000000000 00000000000000000000000000000000:A64A692A55AF5D1C99794707BA00E670:\ 000000000000000000000000000000000000400000000000 00000000000000000000000000000000:B975AC5AFA03D77D7361AACFF32E1B39:\ 000000000000000000000000000000000000200000000000 00000000000000000000000000000000:267A1379C257776BE4CA75C8B1A59EF6:\ 000000000000000000000000000000000000100000000000 00000000000000000000000000000000:ED392DDA2AD879B58405B41FAA7A56A1:\ 000000000000000000000000000000000000080000000000 00000000000000000000000000000000:4DECF57B85B75F1A78431A972CC873F6:\ 000000000000000000000000000000000000040000000000 00000000000000000000000000000000:5F9D95B7F415376A6665BDF645E5C6AC:\ 000000000000000000000000000000000000020000000000 00000000000000000000000000000000:5929FF53CC9876F923C6D19D3D101F18:\ 000000000000000000000000000000000000010000000000 00000000000000000000000000000000:D6CF5F18474D3A44D0BE029EE879E6FA:\ 000000000000000000000000000000000000008000000000 00000000000000000000000000000000:8860A98873A8DBFFDC4D7835F3D59BB7:\ 000000000000000000000000000000000000004000000000 00000000000000000000000000000000:4B506DF2FF9DA5672F55624AFE5374E8:\ 000000000000000000000000000000000000002000000000 00000000000000000000000000000000:B4D6692D5AAE39519C0AAB97597A5521:\ 000000000000000000000000000000000000001000000000 00000000000000000000000000000000:7185FA267D3926EA0804F07A91398C37:\ 000000000000000000000000000000000000000800000000 00000000000000000000000000000000:8C3BD232227C1C1B214186A603D85115:\ 000000000000000000000000000000000000000400000000 00000000000000000000000000000000:5300AFD8D507A60ACB0907B4D3E3D2B0:\ 000000000000000000000000000000000000000200000000 00000000000000000000000000000000:D8A16D32AE71F991EE2C1C19153B146D:\ 000000000000000000000000000000000000000100000000 00000000000000000000000000000000:32B3F26C1415BF7F82B6A637843F4C21:\ 000000000000000000000000000000000000000080000000 00000000000000000000000000000000:E416420B5F736F39328D36181992A720:\ 000000000000000000000000000000000000000040000000 00000000000000000000000000000000:619918287897135AD5516BA12A0FC6D7:\ 000000000000000000000000000000000000000020000000 00000000000000000000000000000000:69830C559F08DDCEEB6F83900DC14626:\ 000000000000000000000000000000000000000010000000 00000000000000000000000000000000:BB451FB76A7B1FE65E0332DE6E6712A3:\ 000000000000000000000000000000000000000008000000 00000000000000000000000000000000:AF2DE55E1EFFAF00EBF4EAEE45B29A4C:\ 000000000000000000000000000000000000000004000000 00000000000000000000000000000000:CA31B9A81450A198A073A299C7DF14C9:\ 000000000000000000000000000000000000000002000000 00000000000000000000000000000000:4FF7E9FADFCFFBB2DD3F23214B407180:\ 000000000000000000000000000000000000000001000000 00000000000000000000000000000000:B8BC9344751D34B0BFE353E5F3A9E309:\ 000000000000000000000000000000000000000000800000 00000000000000000000000000000000:4589951B936D1948299548D199E0612F:\ 000000000000000000000000000000000000000000400000 00000000000000000000000000000000:61B33E9A6A14F21B12D00832385F9BCA:\ 000000000000000000000000000000000000000000200000 00000000000000000000000000000000:652B66FBC2B192ACA177D4C16ACB1E3F:\ 000000000000000000000000000000000000000000100000 00000000000000000000000000000000:81A252288A18D4E4EC1F919FE34BD4C8:\ 000000000000000000000000000000000000000000080000 00000000000000000000000000000000:4D38323769C7AEFBF838F51A57E21C0E:\ 000000000000000000000000000000000000000000040000 00000000000000000000000000000000:C07D35D5788A04FEEBA6A337453DEFCA:\ 000000000000000000000000000000000000000000020000 00000000000000000000000000000000:6692591964FF5304D877DDE631E55AC2:\ 000000000000000000000000000000000000000000010000 00000000000000000000000000000000:1792F89A673DFE67A04BAC230317BFD3:\ 000000000000000000000000000000000000000000008000 00000000000000000000000000000000:0EC45273FAA59A4C6AA56C0BDF9DC1C4:\ 000000000000000000000000000000000000000000004000 00000000000000000000000000000000:273575F8DB870005ED51F0F1FB962A35:\ 000000000000000000000000000000000000000000002000 00000000000000000000000000000000:D9EDC0E324D69F3CAB465E3F63AC4CD3:\ 000000000000000000000000000000000000000000001000 00000000000000000000000000000000:647B9C834502295B5D46AE962ABD9059:\ 000000000000000000000000000000000000000000000800 00000000000000000000000000000000:3C8B932E1E8C1E9FD4629AF03D16D717:\ 000000000000000000000000000000000000000000000400 00000000000000000000000000000000:9FD433DAE0C3B5C35C7CA5468B4AF8DE:\ 000000000000000000000000000000000000000000000200 00000000000000000000000000000000:916E8226F1925A4C7E0056E8951B4609:\ 000000000000000000000000000000000000000000000100 00000000000000000000000000000000:A53FCF269CF194C323B2C2A5B82571E2:\ 000000000000000000000000000000000000000000000080 00000000000000000000000000000000:51C6D510F3053D502D141C99FBB28618:\ 000000000000000000000000000000000000000000000040 00000000000000000000000000000000:040E54E63CCF8E5D6EE6A27EEDCC02AB:\ 000000000000000000000000000000000000000000000020 00000000000000000000000000000000:DE90BD5F4C96E4F52EC9200D9E298DCD:\ 000000000000000000000000000000000000000000000010 00000000000000000000000000000000:87233EAEFC125F7C6E1FE329CC415520:\ 000000000000000000000000000000000000000000000008 00000000000000000000000000000000:71B61DD72D4FBD96542E73A5E5BD7CA5:\ 000000000000000000000000000000000000000000000004 00000000000000000000000000000000:F5F6E1B6215062A2547C1A7C84EB8E86:\ 000000000000000000000000000000000000000000000002 00000000000000000000000000000000:2DD740E5E0E0CBE72EBDF2808410D55F:\ 000000000000000000000000000000000000000000000001 00000000000000000000000000000000:EA4FCDBA1EB0C533938AA9FA32B740F3:\ 8000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B8E6D5134AB08E553AD5785B33D66111:\ 4000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:2D7805B2B86764E8FC3DD6E2EFB1532D:\ 2000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B9449A4D8C53639D0A6751DB3695B325:\ 1000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B2C6850F1AAAF7CD2E9B3FC1F5433FDC:\ 0800000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7D124E20CE475B66BEA88399FF95C8C0:\ 0400000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D5F5ED2CDEC8D3043BD0C58238AF2820:\ 0200000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:051135A86EADA21353CB5FFD7A58408E:\ 0100000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:FEF406FC9C405AFB959C796E4ED0AF0D:\ 0080000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:52DA5222BB9974AE66CC9BB77E1F15E8:\ 0040000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F5DC2C5F98AF6CF4BCC23ECEEAF213AD:\ 0020000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:09DF90DE791250ACBE170DC643780CF2:\ 0010000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3FA812132A21BEB83162C33B28CC242C:\ 0008000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CEE571785850DD567A75D9E244660C66:\ 0004000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:642BB005B38790E518E53A53373C2474:\ 0002000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E3EBE5FA1C748BCB125602F8B7911FAE:\ 0001000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C863C98E1C09C28B4A05B5FBCE64DF28:\ 0000800000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B4BAB3A731F8CCD8A09A5D3AFF77BE60:\ 0000400000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1A3FC4F1DE42F1AC5DA5F88701E6F292:\ 0000200000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:FF43862813E9F1CFEF044F4B8CFED265:\ 0000100000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8F2785A7E28C1910580BBFD989A7F0D3:\ 0000080000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:26059027035B43615A7996D19FED9D42:\ 0000040000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8CD8416F37E3BA1B5D6D0838F6B6E604:\ 0000020000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:BB0BD60CD950DE5E0B9AAF78FF9A30DB:\ 0000010000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B99C1D4F98B68E8CD7495D16F3260D7D:\ 0000008000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4F1A4F8D20456CFE0EF0E39DE6C71B9C:\ 0000004000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F453DB1AB45A6F5834F9908E1A15D4F7:\ 0000002000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:DA25287B7CD050E9B3E2074ED3B49FCF:\ 0000001000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:BAB2AE0FF7C4902697DE88ED7F2FA06C:\ 0000000800000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:ABE6F6C9D29A58B985A91782EE28CF3E:\ 0000000400000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:5C59FBE090DB3D75D7A5A8FD76F8A3DB:\ 0000000200000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:DCA806B1D0BAFCEAB015EC19A3E5C7FA:\ 0000000100000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1BA870E6D62FEB16E6C2AA1128AE5ABA:\ 0000000080000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0FE91367D4C178DD313C6AB7F3D5149A:\ 0000000040000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:BFE27CB1B52150E0636A81473148B018:\ 0000000020000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F79BE17022979D01E3AFFB3499556DC4:\ 0000000010000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A2F2B772060C53A539B5A3FE4C935171:\ 0000000008000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:DB97947A8B14B3E3859068A0288285F6:\ 0000000004000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1FD086FE698C5E092A8E0C9EE527714A:\ 0000000002000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8ADAB79B444DDDF86B8D53D2A9112881:\ 0000000001000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C36CEC9730A74CE94CF2EA5C7B0EC3ED:\ 0000000000800000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:033629A0675A45A11BE7924137D711EC:\ 0000000000400000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D5C22EF288E7D2D04BC04B57B702A03F:\ 0000000000200000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1FD290A5EB2E278C6396625034EB268C:\ 0000000000100000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:05C35E0CB6D27E6E9D680368B2ABA9B5:\ 0000000000080000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B0194CDF7510FE98EDF9464259378FAF:\ 0000000000040000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:043729754E5B1F63408F62742E5F2765:\ 0000000000020000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:24A2746042EC7970E8AB59589AD63775:\ 0000000000010000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7BDEF0A2EF8B637C4C3C5D001BAB5F85:\ 0000000000008000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0221B515A1559D96E9C3CBFB929E96A9:\ 0000000000004000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7E975026E5771D90EDA081B72C0BC77C:\ 0000000000002000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7C7F9F98B4739C9774F84E75E5B30A95:\ 0000000000001000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A4E176B7C98D76BC6662BBB3E606BA9C:\ 0000000000000800000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7FDBDA5910B26D8D3FE42987B09430C0:\ 0000000000000400000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7B134F40F8E10D8287B8E6FC0BDE45E8:\ 0000000000000200000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CF3C98CC0CAFB2935385C0B5D8F07857:\ 0000000000000100000000000000000000000000000000000000000000000000 00000000000000000000000000000000:FB71BA47019735DA4082D68A1A587BDB:\ 0000000000000080000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E9D45576FC1A56DAFB48ABFB90A1DE4B:\ 0000000000000040000000000000000000000000000000000000000000000000 00000000000000000000000000000000:AE9408DC1A007CA9C13F2F9D12FC4F71:\ 0000000000000020000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B407201A6A44CB236468709B181BCA23:\ 0000000000000010000000000000000000000000000000000000000000000000 00000000000000000000000000000000:06E1A40D4F7534E24538D26802AF9E98:\ 0000000000000008000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3468992A9D6F274286611D1E5DB327BA:\ 0000000000000004000000000000000000000000000000000000000000000000 00000000000000000000000000000000:635748DEDCB4E65B76E818D09994D19A:\ 0000000000000002000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C2A0DACC741E90029F16CDA81BEB8D0C:\ 0000000000000001000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D20B9853FC98ED3FCFA4C3B9781352D3:\ 0000000000000000800000000000000000000000000000000000000000000000 00000000000000000000000000000000:869B106388046F6F5F9AE5ADC1F23BC2:\ 0000000000000000400000000000000000000000000000000000000000000000 00000000000000000000000000000000:4F9BF7227D943B80C97B2FED132098FE:\ 0000000000000000200000000000000000000000000000000000000000000000 00000000000000000000000000000000:7232A96D275C409349A0382BAE576274:\ 0000000000000000100000000000000000000000000000000000000000000000 00000000000000000000000000000000:ADAF9B3E14B8CC101A2F143B373517B7:\ 0000000000000000080000000000000000000000000000000000000000000000 00000000000000000000000000000000:813E38DF25E4356EAFC7ECEB75270FD4:\ 0000000000000000040000000000000000000000000000000000000000000000 00000000000000000000000000000000:46D6957C76223046E232EEBB661CCE59:\ 0000000000000000020000000000000000000000000000000000000000000000 00000000000000000000000000000000:1714E3EDD2A7BFE4FC35D4B6034E4184:\ 0000000000000000010000000000000000000000000000000000000000000000 00000000000000000000000000000000:445ED35901D4608FAC3BCD59E685E77C:\ 0000000000000000008000000000000000000000000000000000000000000000 00000000000000000000000000000000:236F86A3A59F563611C9A1A9C8DF045C:\ 0000000000000000004000000000000000000000000000000000000000000000 00000000000000000000000000000000:FC0739E82EF130E533C77FA15BD85B57:\ 0000000000000000002000000000000000000000000000000000000000000000 00000000000000000000000000000000:EDC81185A966066433F1B19BE7659080:\ 0000000000000000001000000000000000000000000000000000000000000000 00000000000000000000000000000000:9D0ED59542D4851F7812B29640739765:\ 0000000000000000000800000000000000000000000000000000000000000000 00000000000000000000000000000000:4BA903B83FD4A443564723403BD7D431:\ 0000000000000000000400000000000000000000000000000000000000000000 00000000000000000000000000000000:5DA2CD3D64EDCB29588F02BFED3D575B:\ 0000000000000000000200000000000000000000000000000000000000000000 00000000000000000000000000000000:E66697B697E8881555F5B358A2EB7628:\ 0000000000000000000100000000000000000000000000000000000000000000 00000000000000000000000000000000:7DE9B3320A7872088B1417AAC4E841ED:\ 0000000000000000000080000000000000000000000000000000000000000000 00000000000000000000000000000000:236D82828CE9A9471B51DDCDA350C542:\ 0000000000000000000040000000000000000000000000000000000000000000 00000000000000000000000000000000:CF250F09887F0B9300FF865810A2E03F:\ 0000000000000000000020000000000000000000000000000000000000000000 00000000000000000000000000000000:0103157DB999DF64D6C6DACB16F15F78:\ 0000000000000000000010000000000000000000000000000000000000000000 00000000000000000000000000000000:EA918B3C7929C992E6F0D7B0DD6B8A59:\ 0000000000000000000008000000000000000000000000000000000000000000 00000000000000000000000000000000:FB853888B1D95F9C7BB7630231C9108E:\ 0000000000000000000004000000000000000000000000000000000000000000 00000000000000000000000000000000:46E63459DCC0514DD200BF82B6AEEA0B:\ 0000000000000000000002000000000000000000000000000000000000000000 00000000000000000000000000000000:19051C0A056D4B56DFF08C52FBBD4547:\ 0000000000000000000001000000000000000000000000000000000000000000 00000000000000000000000000000000:055240C320AC09978BE4EC0EE9E40123:\ 0000000000000000000000800000000000000000000000000000000000000000 00000000000000000000000000000000:E0D04118BAD95366416C6D715507646B:\ 0000000000000000000000400000000000000000000000000000000000000000 00000000000000000000000000000000:888C70E963419AA6446123CD9685252C:\ 0000000000000000000000200000000000000000000000000000000000000000 00000000000000000000000000000000:E060A32AF3CD8A525C60A8EB4BEB5B24:\ 0000000000000000000000100000000000000000000000000000000000000000 00000000000000000000000000000000:36A235722A72A5BD05896B74EBB39E35:\ 0000000000000000000000080000000000000000000000000000000000000000 00000000000000000000000000000000:665A781CF1F7839FA4E7EF66F5B47D45:\ 0000000000000000000000040000000000000000000000000000000000000000 00000000000000000000000000000000:8156E976338FB48ED3E469F1485EAA06:\ 0000000000000000000000020000000000000000000000000000000000000000 00000000000000000000000000000000:BA853DF1B7622D17A549624B234082F8:\ 0000000000000000000000010000000000000000000000000000000000000000 00000000000000000000000000000000:3A411EF75149822F0C4E998587BA0CAD:\ 0000000000000000000000008000000000000000000000000000000000000000 00000000000000000000000000000000:EA33525A7CC7C74340773389A764513E:\ 0000000000000000000000004000000000000000000000000000000000000000 00000000000000000000000000000000:E007DDE8158568CF80C470745E455EEE:\ 0000000000000000000000002000000000000000000000000000000000000000 00000000000000000000000000000000:C140AE31D6B8AB675539344B9D857A89:\ 0000000000000000000000001000000000000000000000000000000000000000 00000000000000000000000000000000:8C86266079ABCEE926A5EF6F80F50308:\ 0000000000000000000000000800000000000000000000000000000000000000 00000000000000000000000000000000:CD77B23315E31DF96FABD6E427184F9F:\ 0000000000000000000000000400000000000000000000000000000000000000 00000000000000000000000000000000:A72E93628614A603E59ECC5C766A639B:\ 0000000000000000000000000200000000000000000000000000000000000000 00000000000000000000000000000000:00EE192F18F06F5799B9593DE71B2FBE:\ 0000000000000000000000000100000000000000000000000000000000000000 00000000000000000000000000000000:A79378A27F39485A2A6757A953DE8D63:\ 0000000000000000000000000080000000000000000000000000000000000000 00000000000000000000000000000000:38353F1349680DF284CF7D59272D435B:\ 0000000000000000000000000040000000000000000000000000000000000000 00000000000000000000000000000000:0960EF878BE3F63CB8A25AFDEE9272F8:\ 0000000000000000000000000020000000000000000000000000000000000000 00000000000000000000000000000000:CB52EEC84DD320FB74A13DF2D4AF5B64:\ 0000000000000000000000000010000000000000000000000000000000000000 00000000000000000000000000000000:89525CFDCCC1A572987EEEC44507942D:\ 0000000000000000000000000008000000000000000000000000000000000000 00000000000000000000000000000000:894183826F3CD163F2BDCE8FD123BCBD:\ 0000000000000000000000000004000000000000000000000000000000000000 00000000000000000000000000000000:152FAB85782DD050EF29C8C7E95C5941:\ 0000000000000000000000000002000000000000000000000000000000000000 00000000000000000000000000000000:6C8CC544D1E6B9B8ACEB723A6E903710:\ 0000000000000000000000000001000000000000000000000000000000000000 00000000000000000000000000000000:9D1DCFEFD9CAEB5934AA93278F8E0988:\ 0000000000000000000000000000800000000000000000000000000000000000 00000000000000000000000000000000:86473616CFE39825E9F93B4A5D1518F0:\ 0000000000000000000000000000400000000000000000000000000000000000 00000000000000000000000000000000:3EC955C39DC4442411A578115482A331:\ 0000000000000000000000000000200000000000000000000000000000000000 00000000000000000000000000000000:117C11E5DAFA73A4CBA2E599582DF463:\ 0000000000000000000000000000100000000000000000000000000000000000 00000000000000000000000000000000:371B4F0F917CDC7F028CF90072EA6C0C:\ 0000000000000000000000000000080000000000000000000000000000000000 00000000000000000000000000000000:F6EAC5AC916431427022EE688D4E8248:\ 0000000000000000000000000000040000000000000000000000000000000000 00000000000000000000000000000000:5E7787153D1C5E94A860600D0FE0F695:\ 0000000000000000000000000000020000000000000000000000000000000000 00000000000000000000000000000000:44888E6DD958A843AF2143DA81986196:\ 0000000000000000000000000000010000000000000000000000000000000000 00000000000000000000000000000000:F3B940BFEFF393BFDAF0C435D262961C:\ 0000000000000000000000000000008000000000000000000000000000000000 00000000000000000000000000000000:40781DABC58A81B11FAA4039E6F73345:\ 0000000000000000000000000000004000000000000000000000000000000000 00000000000000000000000000000000:7685B120BD850BD6D7A618E023D42BA0:\ 0000000000000000000000000000002000000000000000000000000000000000 00000000000000000000000000000000:8088416E7FEDB30B1883DF50E29CD4D1:\ 0000000000000000000000000000001000000000000000000000000000000000 00000000000000000000000000000000:B0C9ED5257B103131AB5DBECC16D1547:\ 0000000000000000000000000000000800000000000000000000000000000000 00000000000000000000000000000000:01C8B821C4683B586CD8096A0DC4FDAA:\ 0000000000000000000000000000000400000000000000000000000000000000 00000000000000000000000000000000:4CA16F058B3AE1E2B3774E3DF99087CA:\ 0000000000000000000000000000000200000000000000000000000000000000 00000000000000000000000000000000:620D06B8EFBFDD1EE274D5EAE42B8F0E:\ 0000000000000000000000000000000100000000000000000000000000000000 00000000000000000000000000000000:34CF934F88C0D631B3D80BE0A5671B11:\ 0000000000000000000000000000000080000000000000000000000000000000 00000000000000000000000000000000:F8AB4045BD0CD95486B921B7430E74A0:\ 0000000000000000000000000000000040000000000000000000000000000000 00000000000000000000000000000000:96ECEC4088D81E2EF27D74A96E2614DC:\ 0000000000000000000000000000000020000000000000000000000000000000 00000000000000000000000000000000:EB0152474310B99F0F8F0DFD6D67962C:\ 0000000000000000000000000000000010000000000000000000000000000000 00000000000000000000000000000000:74DA68DA599D7DD37918F24F7654DC4D:\ 0000000000000000000000000000000008000000000000000000000000000000 00000000000000000000000000000000:F766AD686EB2BAF2950974F78968F510:\ 0000000000000000000000000000000004000000000000000000000000000000 00000000000000000000000000000000:A2D18CF5C770587E19DBD6FFEBD52FAE:\ 0000000000000000000000000000000002000000000000000000000000000000 00000000000000000000000000000000:DDADE16C2B9E78715FC281197149E4F0:\ 0000000000000000000000000000000001000000000000000000000000000000 00000000000000000000000000000000:79931CFAC3FD4F540E53905538B5E122:\ 0000000000000000000000000000000000800000000000000000000000000000 00000000000000000000000000000000:93F88DDDE5004BD8998CDB7A1BD1EE4D:\ 0000000000000000000000000000000000400000000000000000000000000000 00000000000000000000000000000000:011A413B2CC8E56A94A5C6D3932B3C3B:\ 0000000000000000000000000000000000200000000000000000000000000000 00000000000000000000000000000000:C509B737BBC749EE466ADF8142F52B28:\ 0000000000000000000000000000000000100000000000000000000000000000 00000000000000000000000000000000:514332276B9E9299F9F722B63752B0A8:\ 0000000000000000000000000000000000080000000000000000000000000000 00000000000000000000000000000000:D9F3A75F94986D0A1AB14258934C21D1:\ 0000000000000000000000000000000000040000000000000000000000000000 00000000000000000000000000000000:6FE84CDC49C9A8A55D85EA1A1D5C0DD9:\ 0000000000000000000000000000000000020000000000000000000000000000 00000000000000000000000000000000:0C85C65BD9DE393D2FEA3BE5AC7BAB67:\ 0000000000000000000000000000000000010000000000000000000000000000 00000000000000000000000000000000:904C7F2E8084FC10D59480C3DE1CB1A4:\ 0000000000000000000000000000000000008000000000000000000000000000 00000000000000000000000000000000:52C696236B4B7EE6B03B8876DEA8DD45:\ 0000000000000000000000000000000000004000000000000000000000000000 00000000000000000000000000000000:A0D46DAEA95CB4968F62BD9B3F8075A8:\ 0000000000000000000000000000000000002000000000000000000000000000 00000000000000000000000000000000:51BE75B32A05384D2A2E08CB1EAB5F63:\ 0000000000000000000000000000000000001000000000000000000000000000 00000000000000000000000000000000:1123151EB432831D2C65A90ED1D0A429:\ 0000000000000000000000000000000000000800000000000000000000000000 00000000000000000000000000000000:A26350A8FF6C10FCBA736D46FC26BF69:\ 0000000000000000000000000000000000000400000000000000000000000000 00000000000000000000000000000000:FF85BEF6CF6674FA5EE40EC9FB9052FF:\ 0000000000000000000000000000000000000200000000000000000000000000 00000000000000000000000000000000:6ED96DB33AB981AF27894AC436CB4D62:\ 0000000000000000000000000000000000000100000000000000000000000000 00000000000000000000000000000000:B38DE9B3C4D6D128101B02FDD05E3BF8:\ 0000000000000000000000000000000000000080000000000000000000000000 00000000000000000000000000000000:11E05766EBB66AB211E2D9653EF3144D:\ 0000000000000000000000000000000000000040000000000000000000000000 00000000000000000000000000000000:F6A196E085116E5BC21732A2EF9ACAF4:\ 0000000000000000000000000000000000000020000000000000000000000000 00000000000000000000000000000000:BC2A6753CA41E306A0500E97B38D8A9A:\ 0000000000000000000000000000000000000010000000000000000000000000 00000000000000000000000000000000:773A687B1FC97918943C1B66EF693354:\ 0000000000000000000000000000000000000008000000000000000000000000 00000000000000000000000000000000:C6E2112CCDBD821D2B9068B285C5192B:\ 0000000000000000000000000000000000000004000000000000000000000000 00000000000000000000000000000000:EA69C8E28021801EE9A14809848D781F:\ 0000000000000000000000000000000000000002000000000000000000000000 00000000000000000000000000000000:6290745CD4CB62DE172F8AB30966EB57:\ 0000000000000000000000000000000000000001000000000000000000000000 00000000000000000000000000000000:1051EE4C389B96B1365B417C74EFBF10:\ 0000000000000000000000000000000000000000800000000000000000000000 00000000000000000000000000000000:52B6F3EE6655128999EEE3831E708D76:\ 0000000000000000000000000000000000000000400000000000000000000000 00000000000000000000000000000000:5BDE19A1D741ECE40CE98CD02F02AD75:\ 0000000000000000000000000000000000000000200000000000000000000000 00000000000000000000000000000000:36EF5E803A68F6AC20D92FB14E2AFDF5:\ 0000000000000000000000000000000000000000100000000000000000000000 00000000000000000000000000000000:B3E1E30B78FBBCA07F065A422D33410B:\ 0000000000000000000000000000000000000000080000000000000000000000 00000000000000000000000000000000:5FA0E6C8E6C1FCD613975A18348484CB:\ 0000000000000000000000000000000000000000040000000000000000000000 00000000000000000000000000000000:B74E4A2406EEB2AB836AED857754A612:\ 0000000000000000000000000000000000000000020000000000000000000000 00000000000000000000000000000000:52EBF44DB69347A22DF8CA0ABAE3D668:\ 0000000000000000000000000000000000000000010000000000000000000000 00000000000000000000000000000000:986B7B05D1E9639779D034047FC3B780:\ 0000000000000000000000000000000000000000008000000000000000000000 00000000000000000000000000000000:1846AF7EB612C5C356DAF4FE42108444:\ 0000000000000000000000000000000000000000004000000000000000000000 00000000000000000000000000000000:22AD41F78567C6D5C2266486404168DC:\ 0000000000000000000000000000000000000000002000000000000000000000 00000000000000000000000000000000:73409A5B03D08BCEE496F7255417DEC5:\ 0000000000000000000000000000000000000000001000000000000000000000 00000000000000000000000000000000:32C47FAEB48DA7847B3C5B063153B049:\ 0000000000000000000000000000000000000000000800000000000000000000 00000000000000000000000000000000:5514F66B91C06AD15BE581AA99F5961B:\ 0000000000000000000000000000000000000000000400000000000000000000 00000000000000000000000000000000:38AF52E0648030498BA94D0BBF819B8A:\ 0000000000000000000000000000000000000000000200000000000000000000 00000000000000000000000000000000:91D48EEE9A769F0753C6A6DC1037405D:\ 0000000000000000000000000000000000000000000100000000000000000000 00000000000000000000000000000000:2CA3F3F2BB2332984A97E5274462E7AF:\ 0000000000000000000000000000000000000000000080000000000000000000 00000000000000000000000000000000:806EE4C1C6432102E40A21F03222B0E1:\ 0000000000000000000000000000000000000000000040000000000000000000 00000000000000000000000000000000:E8BBDC90505FE81AB2024274BB2FA258:\ 0000000000000000000000000000000000000000000020000000000000000000 00000000000000000000000000000000:307920977ADAD0EEDEBA2CB8AF83D3CE:\ 0000000000000000000000000000000000000000000010000000000000000000 00000000000000000000000000000000:6B0A17013DFAAD05442FA8B298043438:\ 0000000000000000000000000000000000000000000008000000000000000000 00000000000000000000000000000000:BA6EC60065FA6C9679D7E47FC1B85479:\ 0000000000000000000000000000000000000000000004000000000000000000 00000000000000000000000000000000:F1AA580B5E904BED235ACE85C0E009D0:\ 0000000000000000000000000000000000000000000002000000000000000000 00000000000000000000000000000000:9092A797F7024CC218B4A3575F4F7D63:\ 0000000000000000000000000000000000000000000001000000000000000000 00000000000000000000000000000000:CF404B154F2A8388DA9ED1E93AC78894:\ 0000000000000000000000000000000000000000000000800000000000000000 00000000000000000000000000000000:1B32215E25E3EB15FE4BED2F2F31281E:\ 0000000000000000000000000000000000000000000000400000000000000000 00000000000000000000000000000000:999B92E27EC161089F45DB53D036C8F0:\ 0000000000000000000000000000000000000000000000200000000000000000 00000000000000000000000000000000:B2F7DBFD67DBC260A7CFCD9C90FEF16F:\ 0000000000000000000000000000000000000000000000100000000000000000 00000000000000000000000000000000:7BD9AA3B08F103C796EE8023EF474F0A:\ 0000000000000000000000000000000000000000000000080000000000000000 00000000000000000000000000000000:483121AF85F36EA159BE2EB5802FBF21:\ 0000000000000000000000000000000000000000000000040000000000000000 00000000000000000000000000000000:AE2788C2115CB466713687AB06FE5E46:\ 0000000000000000000000000000000000000000000000020000000000000000 00000000000000000000000000000000:ADE758D100ABEEB7BA80BF257781494D:\ 0000000000000000000000000000000000000000000000010000000000000000 00000000000000000000000000000000:6DF30205652926EB339833F2EDD8472E:\ 0000000000000000000000000000000000000000000000008000000000000000 00000000000000000000000000000000:031E86B2AD4D83A4A19BCAF191F9B65A:\ 0000000000000000000000000000000000000000000000004000000000000000 00000000000000000000000000000000:F605CCC9E46B1792EA2F0B4124924F42:\ 0000000000000000000000000000000000000000000000002000000000000000 00000000000000000000000000000000:A70E3286C50B8DD8306109AB59119510:\ 0000000000000000000000000000000000000000000000001000000000000000 00000000000000000000000000000000:6922EEA4B8AE7BFECE899009848A33DA:\ 0000000000000000000000000000000000000000000000000800000000000000 00000000000000000000000000000000:1DD856F5453D1D61860E48035BFDADC7:\ 0000000000000000000000000000000000000000000000000400000000000000 00000000000000000000000000000000:9AE9BEC5D195B32BD52623EF21CF2AA3:\ 0000000000000000000000000000000000000000000000000200000000000000 00000000000000000000000000000000:C89ADA0E7DF448DE2155DB7C3E3EAAF2:\ 0000000000000000000000000000000000000000000000000100000000000000 00000000000000000000000000000000:0D176C6E373B2A3B3408AD24BE258365:\ 0000000000000000000000000000000000000000000000000080000000000000 00000000000000000000000000000000:8C2E48AF6FE6305B58EF5B950061E93C:\ 0000000000000000000000000000000000000000000000000040000000000000 00000000000000000000000000000000:2E81D19464919FFB1886E81C46AEDE37:\ 0000000000000000000000000000000000000000000000000020000000000000 00000000000000000000000000000000:7169BEE79D4DCC57F771A43AA0A80EF1:\ 0000000000000000000000000000000000000000000000000010000000000000 00000000000000000000000000000000:425223474892BA95538DAFF58F3DD0D3:\ 0000000000000000000000000000000000000000000000000008000000000000 00000000000000000000000000000000:B2650BF17E26E9A4F6484DD2992517D9:\ 0000000000000000000000000000000000000000000000000004000000000000 00000000000000000000000000000000:71936A21362F80ECCED8FC955FF159F3:\ 0000000000000000000000000000000000000000000000000002000000000000 00000000000000000000000000000000:E09665C274E582FFD6BCD0663BD6EA12:\ 0000000000000000000000000000000000000000000000000001000000000000 00000000000000000000000000000000:3E8D36D10E6AB4454154A226B7D6E50E:\ 0000000000000000000000000000000000000000000000000000800000000000 00000000000000000000000000000000:5D008338DDD66164591A9B98B23323CA:\ 0000000000000000000000000000000000000000000000000000400000000000 00000000000000000000000000000000:6BC5ACE2FA017CCC5CD0A8E88AF73B28:\ 0000000000000000000000000000000000000000000000000000200000000000 00000000000000000000000000000000:C115E4646FC054C50C2BBEC7C20C94F7:\ 0000000000000000000000000000000000000000000000000000100000000000 00000000000000000000000000000000:2CEB602F3C61BE94AF96FD012BB3190C:\ 0000000000000000000000000000000000000000000000000000080000000000 00000000000000000000000000000000:5A04F68F56580702891E4ECF6C600C92:\ 0000000000000000000000000000000000000000000000000000040000000000 00000000000000000000000000000000:D6A0DC0D5FB91B6478B9A1AAA586431B:\ 0000000000000000000000000000000000000000000000000000020000000000 00000000000000000000000000000000:E38BB33BF982D61BB2CD980BFCE4C2BF:\ 0000000000000000000000000000000000000000000000000000010000000000 00000000000000000000000000000000:B47BF164959077E378396A175020AC95:\ 0000000000000000000000000000000000000000000000000000008000000000 00000000000000000000000000000000:CC5CEE68ABBFDC2DFE32FD3A1E433932:\ 0000000000000000000000000000000000000000000000000000004000000000 00000000000000000000000000000000:A8180BBB689F29A560296FF24C785DC4:\ 0000000000000000000000000000000000000000000000000000002000000000 00000000000000000000000000000000:DCCBE0BB943D3B772010A08C11E82763:\ 0000000000000000000000000000000000000000000000000000001000000000 00000000000000000000000000000000:0439C5D8BB8BDD7FCB3A3281BD8A3A3F:\ 0000000000000000000000000000000000000000000000000000000800000000 00000000000000000000000000000000:2864CEAE94E09933190479BEA2515040:\ 0000000000000000000000000000000000000000000000000000000400000000 00000000000000000000000000000000:2AFF33A00C93057FE56EDCBBB65987BB:\ 0000000000000000000000000000000000000000000000000000000200000000 00000000000000000000000000000000:38C6B37E80EC873DE0A0ABEB9803438F:\ 0000000000000000000000000000000000000000000000000000000100000000 00000000000000000000000000000000:1D9428E92329672C0E902F6AA6AFC874:\ 0000000000000000000000000000000000000000000000000000000080000000 00000000000000000000000000000000:2AB8CC1998977DF208C97B2D0DC86C54:\ 0000000000000000000000000000000000000000000000000000000040000000 00000000000000000000000000000000:2E42C343E7E489916E2F2C0AD2AFFFB1:\ 0000000000000000000000000000000000000000000000000000000020000000 00000000000000000000000000000000:571C17477C9FB6C334718983E0B25859:\ 0000000000000000000000000000000000000000000000000000000010000000 00000000000000000000000000000000:3ABAD289F84A4B75412C82D8AD9BD739:\ 0000000000000000000000000000000000000000000000000000000008000000 00000000000000000000000000000000:E91C1A5E57DD295A7F4AC1687F6B8DB6:\ 0000000000000000000000000000000000000000000000000000000004000000 00000000000000000000000000000000:60CEAEC342165320652D7ED13FDAC05A:\ 0000000000000000000000000000000000000000000000000000000002000000 00000000000000000000000000000000:DA854CEC00C19BB97F7D8292ABAEB5BB:\ 0000000000000000000000000000000000000000000000000000000001000000 00000000000000000000000000000000:6BC45EBD7172512E5F6D51C60E271ACF:\ 0000000000000000000000000000000000000000000000000000000000800000 00000000000000000000000000000000:6604FAE8ECBC741D0F46D90AA235CAF6:\ 0000000000000000000000000000000000000000000000000000000000400000 00000000000000000000000000000000:5F95FA50CF7CDD4B619DCB8D6E0B7873:\ 0000000000000000000000000000000000000000000000000000000000200000 00000000000000000000000000000000:C98C198A5A988E2911302C22BFDC4890:\ 0000000000000000000000000000000000000000000000000000000000100000 00000000000000000000000000000000:4B5818505B80DA67A206BF3107DF2B4C:\ 0000000000000000000000000000000000000000000000000000000000080000 00000000000000000000000000000000:B2EA813634A26DC5894BFC4BB070E147:\ 0000000000000000000000000000000000000000000000000000000000040000 00000000000000000000000000000000:B6DDED10D2E8B13D7C758692C844017B:\ 0000000000000000000000000000000000000000000000000000000000020000 00000000000000000000000000000000:F2DC2468DF800E237C026F968CC3AAE2:\ 0000000000000000000000000000000000000000000000000000000000010000 00000000000000000000000000000000:EBCCE81109DCF1B9793AB60BD062F033:\ 0000000000000000000000000000000000000000000000000000000000008000 00000000000000000000000000000000:1BC015DC9E1B9DBB68293EB93D65088F:\ 0000000000000000000000000000000000000000000000000000000000004000 00000000000000000000000000000000:F718F0FC2A276D6CBB7A2BD59BBC3DB0:\ 0000000000000000000000000000000000000000000000000000000000002000 00000000000000000000000000000000:D89BE6BDD07222EF8297FDD246C3DA09:\ 0000000000000000000000000000000000000000000000000000000000001000 00000000000000000000000000000000:7013B55968A743157C4959DE2068AC57:\ 0000000000000000000000000000000000000000000000000000000000000800 00000000000000000000000000000000:758199FCB16B8ADF9B1350A02B10B735:\ 0000000000000000000000000000000000000000000000000000000000000400 00000000000000000000000000000000:29D38DC5215AA1F3CAEC044C8B472696:\ 0000000000000000000000000000000000000000000000000000000000000200 00000000000000000000000000000000:F5E1BCA4497ED2B1D871B5877C5BE3A8:\ 0000000000000000000000000000000000000000000000000000000000000100 00000000000000000000000000000000:C7388535D265CBFCEDE6423CC29F33A4:\ 0000000000000000000000000000000000000000000000000000000000000080 00000000000000000000000000000000:84992BD0280C4CDF8B1587D42AA63605:\ 0000000000000000000000000000000000000000000000000000000000000040 00000000000000000000000000000000:197E91D0F0261D975BA1F6FAA7983E51:\ 0000000000000000000000000000000000000000000000000000000000000020 00000000000000000000000000000000:644BDF2B1508CFF2E8D791DADC5D4BD6:\ 0000000000000000000000000000000000000000000000000000000000000010 00000000000000000000000000000000:D7BB8C6C07F21F648CE87A17A0589334:\ 0000000000000000000000000000000000000000000000000000000000000008 00000000000000000000000000000000:B6718CB65E557AF3C25D03770AD6B1FA:\ 0000000000000000000000000000000000000000000000000000000000000004 00000000000000000000000000000000:F32E30ADD384B71F7254A15B4042E1F6:\ 0000000000000000000000000000000000000000000000000000000000000002 00000000000000000000000000000000:B5C218F26198EE763B863EDA24446609:\ 0000000000000000000000000000000000000000000000000000000000000001 80000000000000000000000000000000:D962EFEBA75817BF6ED24BBBB5B7820D:\ 00000000000000000000000000000000 40000000000000000000000000000000:639B9F07305BCC1D2E64CE3D1671304A:\ 00000000000000000000000000000000 20000000000000000000000000000000:33ACF35AF3FF94B4C0A59C9035C99E79:\ 00000000000000000000000000000000 10000000000000000000000000000000:C18D6444EE8DEAECC4697D021B9694D2:\ 00000000000000000000000000000000 08000000000000000000000000000000:37DDA7DC913E6253679EB4A1906AE47C:\ 00000000000000000000000000000000 04000000000000000000000000000000:1DED0AB726E2358CCB57451EB5A1711A:\ 00000000000000000000000000000000 02000000000000000000000000000000:BFB43CD34EEC7C0A34CD77759E1396CE:\ 00000000000000000000000000000000 01000000000000000000000000000000:607C0F5FB6A489AED3D3238FB0C51D37:\ 00000000000000000000000000000000 00800000000000000000000000000000:0EBFB100FBBA1A66319743F846383323:\ 00000000000000000000000000000000 00400000000000000000000000000000:8ECA01741C7622FB9EB41FD9826EEA32:\ 00000000000000000000000000000000 00200000000000000000000000000000:BC7CABCFE201ECE01A42C2F4C49C1237:\ 00000000000000000000000000000000 00100000000000000000000000000000:6DD5E5FFF9A41C637553AC4873E118F6:\ 00000000000000000000000000000000 00080000000000000000000000000000:009DFBAA196DF5257E6F48F3310DDD58:\ 00000000000000000000000000000000 00040000000000000000000000000000:9A41BD1783AFB149865D341334D8DA3D:\ 00000000000000000000000000000000 00020000000000000000000000000000:9D3A9D9EA90505D970CA6C1FB39CBE11:\ 00000000000000000000000000000000 00010000000000000000000000000000:35495878D00360B50D980A6C7B193F2F:\ 00000000000000000000000000000000 00008000000000000000000000000000:81D74A81C7F5A5316314B02C6DB4BAA6:\ 00000000000000000000000000000000 00004000000000000000000000000000:4B0B95251D8737013E01F73B71DBEBFE:\ 00000000000000000000000000000000 00002000000000000000000000000000:8793996649604702198290E258A151DF:\ 00000000000000000000000000000000 00001000000000000000000000000000:99F161837DF7F24E3748C2BBCD71417F:\ 00000000000000000000000000000000 00000800000000000000000000000000:305049B5511EA8FBD5C36AB3E62E59EE:\ 00000000000000000000000000000000 00000400000000000000000000000000:89BF8940DD39B51B35E70F62137AE5EA:\ 00000000000000000000000000000000 00000200000000000000000000000000:301847CD9DA64B1BFD9E781056457761:\ 00000000000000000000000000000000 00000100000000000000000000000000:04B0F6A6C8BE9C4A771701DA1F2BD512:\ 00000000000000000000000000000000 00000080000000000000000000000000:91898CFEE3784B0299A655391057081E:\ 00000000000000000000000000000000 00000040000000000000000000000000:6515031342504BAC93832D74B18DE5F9:\ 00000000000000000000000000000000 00000020000000000000000000000000:D98ED2EEACB67C0FFDDA9724C309DF25:\ 00000000000000000000000000000000 00000010000000000000000000000000:4F963C1680E07CA4DD7C3759F848D2CC:\ 00000000000000000000000000000000 00000008000000000000000000000000:B51D85DC8C8F5A7EA15EFBEDBCBFC9E4:\ 00000000000000000000000000000000 00000004000000000000000000000000:F7C45BC3FA262A837C670776238C767E:\ 00000000000000000000000000000000 00000002000000000000000000000000:5E912791AC2F572389999FD369EC8E37:\ 00000000000000000000000000000000 00000001000000000000000000000000:7E8C9BA80ADC579747B1E4616D7EC9B3:\ 00000000000000000000000000000000 00000000800000000000000000000000:BF99640F187DB0C2944B959050B62F6D:\ 00000000000000000000000000000000 00000000400000000000000000000000:C5E61399609A0BE02A916D48A8A64C63:\ 00000000000000000000000000000000 00000000200000000000000000000000:07B4116F41B82767CB72E2E64CC046E3:\ 00000000000000000000000000000000 00000000100000000000000000000000:AB696B5F4E7ABDFCEC1D2DEDAC05E2A0:\ 00000000000000000000000000000000 00000000080000000000000000000000:50654EE25CF9E493B0B7138EE74BC166:\ 00000000000000000000000000000000 00000000040000000000000000000000:BDA01373F42BFC2B0F723366A46E1FF1:\ 00000000000000000000000000000000 00000000020000000000000000000000:AE25CD3DF7FC7BB8A2E645EBD79D2A29:\ 00000000000000000000000000000000 00000000010000000000000000000000:644664257BFAD3A0CF16D683A026A72A:\ 00000000000000000000000000000000 00000000008000000000000000000000:3AD0281E1F1225280383D5B7A3E90B04:\ 00000000000000000000000000000000 00000000004000000000000000000000:23F2882568F472EBC1B519122823441C:\ 00000000000000000000000000000000 00000000002000000000000000000000:8DE047245D62895A7E5852CEE8379A4F:\ 00000000000000000000000000000000 00000000001000000000000000000000:21ADF95994B6FEC5DA6FC40FEA782D79:\ 00000000000000000000000000000000 00000000000800000000000000000000:F2834B5587D63C382DBC397101EBB64F:\ 00000000000000000000000000000000 00000000000400000000000000000000:884C3D3850DC3EFFEAA0DB8785BEC5E5:\ 00000000000000000000000000000000 00000000000200000000000000000000:71AB2DB59AE3AAF781DAB5CAD1007975:\ 00000000000000000000000000000000 00000000000100000000000000000000:7793380505B20B6CDA1A2CEB6AF6D76D:\ 00000000000000000000000000000000 00000000000080000000000000000000:6A986D4B71CC337450CA165B110414AB:\ 00000000000000000000000000000000 00000000000040000000000000000000:EEC535764784A680C2852BD4B00ED6AC:\ 00000000000000000000000000000000 00000000000020000000000000000000:431A4B03918BD1A65D3523D63C7CBCA9:\ 00000000000000000000000000000000 00000000000010000000000000000000:6E657880D84A51B2241109E82B2A7EEE:\ 00000000000000000000000000000000 00000000000008000000000000000000:B4D163CFD4279B1F9DA0E1FC8616940C:\ 00000000000000000000000000000000 00000000000004000000000000000000:552143C6F2B0A0AB82B2AD487BD74DF4:\ 00000000000000000000000000000000 00000000000002000000000000000000:A8CED7B931A5AD407DDEF7F4510DBA70:\ 00000000000000000000000000000000 00000000000001000000000000000000:55BB234ED4164A9CC028C9C9DADA8A06:\ 00000000000000000000000000000000 00000000000000800000000000000000:0576F9792BA215C89BE0C86D8B3E84B6:\ 00000000000000000000000000000000 00000000000000400000000000000000:C117C7A4AF79DEECC8C18E8138BD4F78:\ 00000000000000000000000000000000 00000000000000200000000000000000:92FC2FDE8E99F5ECF5DFFB2B005C3790:\ 00000000000000000000000000000000 00000000000000100000000000000000:F3C94469F9B4166B76A7DA55FC45EE2B:\ 00000000000000000000000000000000 00000000000000080000000000000000:4C3A60421F79015B99A9B928477CC451:\ 00000000000000000000000000000000 00000000000000040000000000000000:ED6A1AF53574213F41812E8F5D41536B:\ 00000000000000000000000000000000 00000000000000020000000000000000:AF39A2A89D48B0A2F519B39F3DD4A7E9:\ 00000000000000000000000000000000 00000000000000010000000000000000:7F75ED2F965C9ED280CFA16B934E81D9:\ 00000000000000000000000000000000 00000000000000008000000000000000:B92C3EEB72B6BFD288E1F38D64248E93:\ 00000000000000000000000000000000 00000000000000004000000000000000:6FE1E1883D78ADF9FD415265A539D61C:\ 00000000000000000000000000000000 00000000000000002000000000000000:D5ABB34FC2D207FB0F8DF60DA81B9661:\ 00000000000000000000000000000000 00000000000000001000000000000000:751327283356553AF48AB6ED21DCE7C5:\ 00000000000000000000000000000000 00000000000000000800000000000000:B826F4F7B5C5DF743C87EE73119D71FF:\ 00000000000000000000000000000000 00000000000000000400000000000000:ACC2FA1CBD0FA5F8AAF147396AA72EF1:\ 00000000000000000000000000000000 00000000000000000200000000000000:F9F02491D78EA3B140D368CA71F0D6D4:\ 00000000000000000000000000000000 00000000000000000100000000000000:A414990595D6E5E3C657B3190A1AE3C6:\ 00000000000000000000000000000000 00000000000000000080000000000000:478FCFBDB52A6CDA402217483E26604F:\ 00000000000000000000000000000000 00000000000000000040000000000000:DE5E798198E306A2FF47F4F2DB7B3E2F:\ 00000000000000000000000000000000 00000000000000000020000000000000:B42E74D15CA26D9CC358A5E2B1F9DD70:\ 00000000000000000000000000000000 00000000000000000010000000000000:2800BCF67B76D76F7D0070950A85A20C:\ 00000000000000000000000000000000 00000000000000000008000000000000:808F9BE49A31AD5D0A62094A55372D64:\ 00000000000000000000000000000000 00000000000000000004000000000000:DAA7291D3A3289EAD026121F8CE16151:\ 00000000000000000000000000000000 00000000000000000002000000000000:93D7139BC6A67316FFAFEC2ACC89D245:\ 00000000000000000000000000000000 00000000000000000001000000000000:15D1444811E90AD554E50973F32B8AD6:\ 00000000000000000000000000000000 00000000000000000000800000000000:636FF061A2FCA2EAA8DFD3A195E8BA4F:\ 00000000000000000000000000000000 00000000000000000000400000000000:A2FBB57034BCF5E89E1495C216A44917:\ 00000000000000000000000000000000 00000000000000000000200000000000:7B370D533113C91233BBDC73B14B121F:\ 00000000000000000000000000000000 00000000000000000000100000000000:F21BC7D2EB7541EB3F0B40394FA064C7:\ 00000000000000000000000000000000 00000000000000000000080000000000:BAAD725D1BEBC934FEC792D158163DD5:\ 00000000000000000000000000000000 00000000000000000000040000000000:ED50A592E0D2DE126BC97FD8DAD20919:\ 00000000000000000000000000000000 00000000000000000000020000000000:11DB39B92B98A4719FE345FC44082787:\ 00000000000000000000000000000000 00000000000000000000010000000000:43B1AA58C190006D5EA3F6B708B90509:\ 00000000000000000000000000000000 00000000000000000000008000000000:8A19FB44B5962288640F48B27286904A:\ 00000000000000000000000000000000 00000000000000000000004000000000:C19B0558E72BABB1B9275EE8B48B9017:\ 00000000000000000000000000000000 00000000000000000000002000000000:587D8A04B1958388D69F26E4106D8232:\ 00000000000000000000000000000000 00000000000000000000001000000000:B53EB6177E1BC1C083E743878F476003:\ 00000000000000000000000000000000 00000000000000000000000800000000:A42E251AF82C03E4ADB9E5872AD8F7B2:\ 00000000000000000000000000000000 00000000000000000000000400000000:E2585AE29C6054CBDA85B6AA00D88C90:\ 00000000000000000000000000000000 00000000000000000000000200000000:3F6364A00BDCF925C6D62BA15DF56234:\ 00000000000000000000000000000000 00000000000000000000000100000000:6ECB0E56F218E4D1E790C34BBBCA06B8:\ 00000000000000000000000000000000 00000000000000000000000080000000:02ACC5470DD8D223ECB12339750D3BC0:\ 00000000000000000000000000000000 00000000000000000000000040000000:D67A590C0AB3B3E47406D19DB9F0A21F:\ 00000000000000000000000000000000 00000000000000000000000020000000:2B5CF7D06148DF6448016FB40FBF9F53:\ 00000000000000000000000000000000 00000000000000000000000010000000:4D635C044E9ACA243BA1F68268789D41:\ 00000000000000000000000000000000 00000000000000000000000008000000:0118FE9B311429CC06F01AA150D1FF08:\ 00000000000000000000000000000000 00000000000000000000000004000000:1E8AB1853E0D2F0E9FD49FE5285611AD:\ 00000000000000000000000000000000 00000000000000000000000002000000:E521BDB90371FAEC980E1EAC85C10137:\ 00000000000000000000000000000000 00000000000000000000000001000000:E2B8BB4A2EDF3DA04F6934EEF903DF17:\ 00000000000000000000000000000000 00000000000000000000000000800000:75528623E760DD71612DA5F9374EC616:\ 00000000000000000000000000000000 00000000000000000000000000400000:1FCEBEA2DDEDF905D645E1A03E2584EF:\ 00000000000000000000000000000000 00000000000000000000000000200000:4AC71EB7EBDA9AD47531FCAB0D34FA5A:\ 00000000000000000000000000000000 00000000000000000000000000100000:0458B8910A076F39CAAE517F5E3E4D59:\ 00000000000000000000000000000000 00000000000000000000000000080000:F5D01E6C7FA961F6AA1B94FFBFA59672:\ 00000000000000000000000000000000 00000000000000000000000000040000:652473292C5C5764658F8E1FF91B21F8:\ 00000000000000000000000000000000 00000000000000000000000000020000:05D5357FD61285F1B9FC19EB2BBF01C8:\ 00000000000000000000000000000000 00000000000000000000000000010000:2D379505C15DD6C1AD7544CB375720E1:\ 00000000000000000000000000000000 00000000000000000000000000008000:D5918DFA1A722206C89E7B5D518BB28D:\ 00000000000000000000000000000000 00000000000000000000000000004000:30C3BBEC945657A6EC5B9222BC36DB0B:\ 00000000000000000000000000000000 00000000000000000000000000002000:041305F2248F1FD0EC6181B4D6B619D3:\ 00000000000000000000000000000000 00000000000000000000000000001000:C275B6410A77513E4F33C21F9BC11924:\ 00000000000000000000000000000000 00000000000000000000000000000800:EECA71E0036A80BBAAAE62400EA1A237:\ 00000000000000000000000000000000 00000000000000000000000000000400:1025F24952D1691730DAD7CAF09C32C0:\ 00000000000000000000000000000000 00000000000000000000000000000200:FB7830146AC03E32BE6D03A4AE839E97:\ 00000000000000000000000000000000 00000000000000000000000000000100:A91E3D5B9DDC4F0315E718B4C190CBA9:\ 00000000000000000000000000000000 00000000000000000000000000000080:79FBBF61CB27651FBA333B9FFAF60F31:\ 00000000000000000000000000000000 00000000000000000000000000000040:FF598CBF22746883F86DAD6D679DC85E:\ 00000000000000000000000000000000 00000000000000000000000000000020:FA0ED9A5406FC13E532FDB74988A9554:\ 00000000000000000000000000000000 00000000000000000000000000000010:36DEA77F6832D3C81776801AFF839069:\ 00000000000000000000000000000000 00000000000000000000000000000008:262855946EE434D4F0DF924BAB0311BE:\ 00000000000000000000000000000000 00000000000000000000000000000004:01FF81B0107BEFA8427260954C7CD50C:\ 00000000000000000000000000000000 00000000000000000000000000000002:61DF2C54CDF545F8E774D50C8FF59752:\ 00000000000000000000000000000000 00000000000000000000000000000001:45F21B1FD1099CB36C64435337BAB3E3:\ 00000000000000000000000000000000 80000000000000000000000000000000:4433FCCBF2D4AA14783835D0968BB7A6:\ 000000000000000000000000000000000000000000000000 40000000000000000000000000000000:D565448D0753F08C6108B10CCEB4F213:\ 000000000000000000000000000000000000000000000000 20000000000000000000000000000000:1F2B7678DB0B0C33F2F5531FCB71D97E:\ 000000000000000000000000000000000000000000000000 10000000000000000000000000000000:8025160E9E0DF83CAC559816D3BA4AEA:\ 000000000000000000000000000000000000000000000000 08000000000000000000000000000000:A0F5D4524C743641214BD088EE9A4A0F:\ 000000000000000000000000000000000000000000000000 04000000000000000000000000000000:A2981925C529529B068FC1109A509836:\ 000000000000000000000000000000000000000000000000 02000000000000000000000000000000:AF60EDCB3C0FE50E4FE093509C1A87F6:\ 000000000000000000000000000000000000000000000000 01000000000000000000000000000000:6F475AF136CC10485515C95773A74AD2:\ 000000000000000000000000000000000000000000000000 00800000000000000000000000000000:6E09A8F5626CE2364668F8254F192E5A:\ 000000000000000000000000000000000000000000000000 00400000000000000000000000000000:5DE55C749F91D9392A87CA423F00FF95:\ 000000000000000000000000000000000000000000000000 00200000000000000000000000000000:4CD217660FCE3BD43999AC8353503118:\ 000000000000000000000000000000000000000000000000 00100000000000000000000000000000:94B45B0665BCB3FC486CFD980546E934:\ 000000000000000000000000000000000000000000000000 00080000000000000000000000000000:F924999F0213FE2DE932D1D072FBD38B:\ 000000000000000000000000000000000000000000000000 00040000000000000000000000000000:B64F96119ED3F9FD37A826E7A48C4F94:\ 000000000000000000000000000000000000000000000000 00020000000000000000000000000000:63E59879D0A422CD030E51727F379CC0:\ 000000000000000000000000000000000000000000000000 00010000000000000000000000000000:62B160854BBA6DB3EB960EDF53A60663:\ 000000000000000000000000000000000000000000000000 00008000000000000000000000000000:39A8147579540CC5A1F32F87768A4E3B:\ 000000000000000000000000000000000000000000000000 00004000000000000000000000000000:1B201066BC1D0173089BD0346C57630C:\ 000000000000000000000000000000000000000000000000 00002000000000000000000000000000:2818D6897E7AF26CF08409C1BBCDA8FC:\ 000000000000000000000000000000000000000000000000 00001000000000000000000000000000:8BCE5EE56402A19BB29979A05AB3EFF8:\ 000000000000000000000000000000000000000000000000 00000800000000000000000000000000:4F8B1F65E7CE872E514B53BE8DE8759A:\ 000000000000000000000000000000000000000000000000 00000400000000000000000000000000:3145B8EBF046F533D5378BBDF9C9E4F8:\ 000000000000000000000000000000000000000000000000 00000200000000000000000000000000:49E18ADC2929D19B61389C698DCEE532:\ 000000000000000000000000000000000000000000000000 00000100000000000000000000000000:BC7C0A8FDBEB8B63608F0BEF9C1E396F:\ 000000000000000000000000000000000000000000000000 00000080000000000000000000000000:89F15AD40BB43B2284B3563F2C974023:\ 000000000000000000000000000000000000000000000000 00000040000000000000000000000000:BB60A7897D5F438651EE13C02B5AA790:\ 000000000000000000000000000000000000000000000000 00000020000000000000000000000000:946FB4349CE2935BE1CCE99A2A01A6C9:\ 000000000000000000000000000000000000000000000000 00000010000000000000000000000000:90EA5937B4E393E34B4E60C787B33E2F:\ 000000000000000000000000000000000000000000000000 00000008000000000000000000000000:C5884097BC796E63B3046CB031919D15:\ 000000000000000000000000000000000000000000000000 00000004000000000000000000000000:06DC71C7CB99EF0B2EA4379CE5451E81:\ 000000000000000000000000000000000000000000000000 00000002000000000000000000000000:8A85BC61EAF50F065CB769B48243E51B:\ 000000000000000000000000000000000000000000000000 00000001000000000000000000000000:482E708D7AAA9637674AE923E2128BB5:\ 000000000000000000000000000000000000000000000000 00000000800000000000000000000000:1977127839A3FD886B5ACF2753A28D9F:\ 000000000000000000000000000000000000000000000000 00000000400000000000000000000000:39A993ED3ED7F4A1557FF18ADFE55CCD:\ 000000000000000000000000000000000000000000000000 00000000200000000000000000000000:8995CF677F032B100EF2FBA632AA4D67:\ 000000000000000000000000000000000000000000000000 00000000100000000000000000000000:B54C94BC29029F9DC78BAE0908B543C9:\ 000000000000000000000000000000000000000000000000 00000000080000000000000000000000:CD0A7D015E352D8B27687ED66B45C64D:\ 000000000000000000000000000000000000000000000000 00000000040000000000000000000000:F4E89BBAAA6DCB96952662F88DB0A60D:\ 000000000000000000000000000000000000000000000000 00000000020000000000000000000000:37FA1912B2636F3982A768C5208267B3:\ 000000000000000000000000000000000000000000000000 00000000010000000000000000000000:C5F27B0B8B93C4F693510EDAB0560073:\ 000000000000000000000000000000000000000000000000 00000000008000000000000000000000:EAD47638DF1D0AB1D3441D5B77A7459D:\ 000000000000000000000000000000000000000000000000 00000000004000000000000000000000:A9198F0441AAA6B84DB891AF859145E0:\ 000000000000000000000000000000000000000000000000 00000000002000000000000000000000:99604EEF14A27550AA1F58510BC6C745:\ 000000000000000000000000000000000000000000000000 00000000001000000000000000000000:133CE0B0F01E22DB16B51F6074A570E0:\ 000000000000000000000000000000000000000000000000 00000000000800000000000000000000:6E2503C056B37957BC00249175B6A829:\ 000000000000000000000000000000000000000000000000 00000000000400000000000000000000:8076A054B269283F5063CF9EDAFF721E:\ 000000000000000000000000000000000000000000000000 00000000000200000000000000000000:6ADC87C1A40ABF8DA9FF4DA863C4AAA1:\ 000000000000000000000000000000000000000000000000 00000000000100000000000000000000:676953B542456DDD155467F7F6E51C2A:\ 000000000000000000000000000000000000000000000000 00000000000080000000000000000000:441D72C0FB4A79E4451B9B0D3571E1E4:\ 000000000000000000000000000000000000000000000000 00000000000040000000000000000000:642DC2A4A84229406ADFE681FD1D2F51:\ 000000000000000000000000000000000000000000000000 00000000000020000000000000000000:CA1DF7DBF4163F601ED11216767E8C79:\ 000000000000000000000000000000000000000000000000 00000000000010000000000000000000:F8EBCE557E084052E74A5DEB45439D6A:\ 000000000000000000000000000000000000000000000000 00000000000008000000000000000000:589606504D2BBC4A85507D61AD1AE6E1:\ 000000000000000000000000000000000000000000000000 00000000000004000000000000000000:5627DFEFE159A8FEF32FDC29321CC705:\ 000000000000000000000000000000000000000000000000 00000000000002000000000000000000:BFC074B43DD81ED778082FB83AAB8D8D:\ 000000000000000000000000000000000000000000000000 00000000000001000000000000000000:6DF74B1434C13343CAE51F38BABDF4BF:\ 000000000000000000000000000000000000000000000000 00000000000000800000000000000000:1C9B11549C831CE68C7CE061F1CCFCEE:\ 000000000000000000000000000000000000000000000000 00000000000000400000000000000000:31D07F177D35A6EE067C75C5B1F3D728:\ 000000000000000000000000000000000000000000000000 00000000000000200000000000000000:D4B7FA191B9414FF3D293BC76C2E12A6:\ 000000000000000000000000000000000000000000000000 00000000000000100000000000000000:9D7AA5550DAE2B1B7D608147009DFE2B:\ 000000000000000000000000000000000000000000000000 00000000000000080000000000000000:5266FA9AB29440558FB71EDA1B43BFBA:\ 000000000000000000000000000000000000000000000000 00000000000000040000000000000000:2CF722D01CB1EAE802C78FB22AF095B2:\ 000000000000000000000000000000000000000000000000 00000000000000020000000000000000:B3C02698C56AB6D3EFCB90AC81CBD787:\ 000000000000000000000000000000000000000000000000 00000000000000010000000000000000:FBF4F2DC7FD1A9F6D4C8B8BFA3AA81FB:\ 000000000000000000000000000000000000000000000000 00000000000000008000000000000000:32D300D0B845E26F7A0505AAB453E0B2:\ 000000000000000000000000000000000000000000000000 00000000000000004000000000000000:EAA724538478C450FE5E893DFD206D5B:\ 000000000000000000000000000000000000000000000000 00000000000000002000000000000000:346E15BA10E1B15D2DE2A862C8BAB645:\ 000000000000000000000000000000000000000000000000 00000000000000001000000000000000:67E87A345284D00742FF8E0D6C67C677:\ 000000000000000000000000000000000000000000000000 00000000000000000800000000000000:D9FF605AF934D4EA36BB4D4678D250A5:\ 000000000000000000000000000000000000000000000000 00000000000000000400000000000000:C6BAAD911C8D06461FEB1C8FD73A1163:\ 000000000000000000000000000000000000000000000000 00000000000000000200000000000000:AFE155824F95065479A7326AF6FFAD5C:\ 000000000000000000000000000000000000000000000000 00000000000000000100000000000000:DAFA519AB33BC01A665BD43D7B578716:\ 000000000000000000000000000000000000000000000000 00000000000000000080000000000000:AB1A3C2AEA2AB0873FCE9B193AC3CE26:\ 000000000000000000000000000000000000000000000000 00000000000000000040000000000000:DB4E325C5F0C6A2A80A97FB53629CA42:\ 000000000000000000000000000000000000000000000000 00000000000000000020000000000000:AA0B63CE9363BCDC1840FE6DF3EEF598:\ 000000000000000000000000000000000000000000000000 00000000000000000010000000000000:564F6ED396958B6CD1C5156F30F12BD3:\ 000000000000000000000000000000000000000000000000 00000000000000000008000000000000:59CAEE5DD9D6D8A17DCD5761F285ACCD:\ 000000000000000000000000000000000000000000000000 00000000000000000004000000000000:4CAC1BC4EBF467854A15DDBC9410E30E:\ 000000000000000000000000000000000000000000000000 00000000000000000002000000000000:9D432A8BC205B2DAE6ED10E5D2573DB5:\ 000000000000000000000000000000000000000000000000 00000000000000000001000000000000:A1B2A6D98E8331CA5D2605C5053AE8D8:\ 000000000000000000000000000000000000000000000000 00000000000000000000800000000000:CD3676661A44F4509EFBFFB4ED5AD60D:\ 000000000000000000000000000000000000000000000000 00000000000000000000400000000000:0E367EE025F2FF821D5F0B89FCECFFA9:\ 000000000000000000000000000000000000000000000000 00000000000000000000200000000000:5F60D9B6A93F1F1B531A9D26C7465114:\ 000000000000000000000000000000000000000000000000 00000000000000000000100000000000:E5753FFD3DF072BCD07292484E9AF749:\ 000000000000000000000000000000000000000000000000 00000000000000000000080000000000:25F43090C51DFE3C48DB6F391B489669:\ 000000000000000000000000000000000000000000000000 00000000000000000000040000000000:AE817F28DEE664D2B9739BF93AA73B1E:\ 000000000000000000000000000000000000000000000000 00000000000000000000020000000000:F1D08CAFE3F5E56C18237E777C731DDD:\ 000000000000000000000000000000000000000000000000 00000000000000000000010000000000:6ECFB7B90D05650F97B5D6D7F677ECE9:\ 000000000000000000000000000000000000000000000000 00000000000000000000008000000000:FEA1BF5FD0BCFA04E0D906B4C5F8C51A:\ 000000000000000000000000000000000000000000000000 00000000000000000000004000000000:0739D17249C17E813B7716212E4E32F3:\ 000000000000000000000000000000000000000000000000 00000000000000000000002000000000:81AA866868D538D53194B5B5D7014BD0:\ 000000000000000000000000000000000000000000000000 00000000000000000000001000000000:E3CC87289C585148267231499BADA0F0:\ 000000000000000000000000000000000000000000000000 00000000000000000000000800000000:2016EF8808F2B5C38B0F790C5A81E9F7:\ 000000000000000000000000000000000000000000000000 00000000000000000000000400000000:7F06EC5E639B36CD7482E5D3568DD54E:\ 000000000000000000000000000000000000000000000000 00000000000000000000000200000000:9A066E0A89EDFF5F26F00F8CC76710B7:\ 000000000000000000000000000000000000000000000000 00000000000000000000000100000000:49A6ED8109D54E6628CD4F6418B788D4:\ 000000000000000000000000000000000000000000000000 00000000000000000000000080000000:4C3F149C3D7A196B8F61AFF5691950FB:\ 000000000000000000000000000000000000000000000000 00000000000000000000000040000000:85B54F82B4586B3396C2200DFF3B26CC:\ 000000000000000000000000000000000000000000000000 00000000000000000000000020000000:705B756847815F1D0DA8D55A45F91BF5:\ 000000000000000000000000000000000000000000000000 00000000000000000000000010000000:4C81CA819469B5A80EB6AF78BB91570D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000008000000:5D057D02E17129A43E0B68D9425917CA:\ 000000000000000000000000000000000000000000000000 00000000000000000000000004000000:E472655E64E637CCD7D1FD3D46970F34:\ 000000000000000000000000000000000000000000000000 00000000000000000000000002000000:05B3391A2CABBED3F1AE0EBAEF6D61B3:\ 000000000000000000000000000000000000000000000000 00000000000000000000000001000000:96D1DAD8F5083314D8185517614E2E3B:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000800000:B4054DBFE0DB6487C90505273A5FF3B1:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000400000:4E766330F2C22059E59B5C8972AA2AFC:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000200000:78AB8FC7997E2B63B59DC80F4F560D95:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000100000:059181B7493B3D66B61CC663B58D7860:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000080000:4149CD202F19C2BBF631FC2BA8FFDF41:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000040000:6465A8757C3E9E5D9A98EEF1CEE37324:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000020000:06A7F1D391336FFBEA9986A82BAFFD02:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000010000:6204BFF718C247F7A909C4FD4CB6444D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000008000:4B815F5F654E7C6E9B135D14773BF419:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000004000:D18FBE3FAACC1722641E66DB74220E98:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000002000:6E473DD470E74E9066FE07297434D8A4:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000001000:E6FD048EB622EE77A092E1818472C477:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000800:2DCD5664A1151BF563F25E86B69767E4:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000400:3455215DFA380B77C931C262A38B01EE:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000200:7470C0914B4AA37DB90DCDD87A253D94:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000100:CB15F18A9A66397EAC67FAC2BA875EE5:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000080:5F273D6F25D09AFE351CE02016E18218:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000040:CA995621063500658C47AAD5C89BE0FE:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000020:70724F68B3D09917AB7286449BCC71F3:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000010:10769D43746A1DBFB7CEEDD1EB9EBB0E:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000008:87F113ABDF184062224235392A20AF11:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000004:7D237E25D34FEC04FC635884B1342EC3:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000002:435B4DA29136AAA1275EF16F5394A235:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000001:70051777D259550440C9BB7884DFFBFA:\ 000000000000000000000000000000000000000000000000 80000000000000000000000000000000:7DEC45D013733A2FC3ACB05AC5EDCDA0:\ 0000000000000000000000000000000000000000000000000000000000000000 40000000000000000000000000000000:A0CEAF180B51BFD4781D46CD10160457:\ 0000000000000000000000000000000000000000000000000000000000000000 20000000000000000000000000000000:498CEEDE242280926B1583FB4A2F9073:\ 0000000000000000000000000000000000000000000000000000000000000000 10000000000000000000000000000000:39E60B423F54786849C6E0BA2AF6BDD3:\ 0000000000000000000000000000000000000000000000000000000000000000 08000000000000000000000000000000:CA6680EA57E0FE1628DC26EA79C948EA:\ 0000000000000000000000000000000000000000000000000000000000000000 04000000000000000000000000000000:CA14A0AF4CF3D1C3615204EB95F216CC:\ 0000000000000000000000000000000000000000000000000000000000000000 02000000000000000000000000000000:2D5A5029679E795D4F49CF1E7AA525FF:\ 0000000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000:5AAD27C9EABDAAD2296718BB0118871E:\ 0000000000000000000000000000000000000000000000000000000000000000 00800000000000000000000000000000:80CA60282018A1DD71762D84750EB459:\ 0000000000000000000000000000000000000000000000000000000000000000 00400000000000000000000000000000:E2250B330EC2C407295F2A1BC8B33330:\ 0000000000000000000000000000000000000000000000000000000000000000 00200000000000000000000000000000:210CEBA6B53AC0DE78757CDC785C6A35:\ 0000000000000000000000000000000000000000000000000000000000000000 00100000000000000000000000000000:053FC841A2E3D6037B34CB9C7CCC0CFB:\ 0000000000000000000000000000000000000000000000000000000000000000 00080000000000000000000000000000:DED4DA1EFC0FCF248E9DA7885CA54A32:\ 0000000000000000000000000000000000000000000000000000000000000000 00040000000000000000000000000000:BAE5DF7B5CB001EFCB26C5AA2DD2588D:\ 0000000000000000000000000000000000000000000000000000000000000000 00020000000000000000000000000000:9DD5C8DC680CC10FAF75B19331ED9FCD:\ 0000000000000000000000000000000000000000000000000000000000000000 00010000000000000000000000000000:D348D0D2E64F7C6B3EBC0844EA93A77E:\ 0000000000000000000000000000000000000000000000000000000000000000 00008000000000000000000000000000:E3AEE8A29AD4A08D979F08F030650A24:\ 0000000000000000000000000000000000000000000000000000000000000000 00004000000000000000000000000000:272797A77F83C01290E213B511A1659E:\ 0000000000000000000000000000000000000000000000000000000000000000 00002000000000000000000000000000:B2E84007CACDA6638F4391ACCC8DD245:\ 0000000000000000000000000000000000000000000000000000000000000000 00001000000000000000000000000000:EAA21531B492A737DDCB7EF2D8D4022A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000800000000000000000000000000:0DCF4259CFB5D0DEFA7C1DD26C5AE728:\ 0000000000000000000000000000000000000000000000000000000000000000 00000400000000000000000000000000:1B3596ABDAB6FE10E574A0505AE5EC1F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000200000000000000000000000000:0B07CA48F49D189E2E343D83D54784A1:\ 0000000000000000000000000000000000000000000000000000000000000000 00000100000000000000000000000000:BB4977183CE7D829F90C1A4A0C0AD921:\ 0000000000000000000000000000000000000000000000000000000000000000 00000080000000000000000000000000:A30AAD2751895E667AF64C24F127EE00:\ 0000000000000000000000000000000000000000000000000000000000000000 00000040000000000000000000000000:1D407E4971F586E8BAFD780411DAB446:\ 0000000000000000000000000000000000000000000000000000000000000000 00000020000000000000000000000000:287E1CBFA05A25B90B94B0D1769DB4BE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000010000000000000000000000000:FEEE919F6634BFDEFD6950CA84FE7DDE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000008000000000000000000000000:DEBC950100E5BDB2B972D96B110CAAFB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000004000000000000000000000000:7E2B207B3204FF65ABD0E286E8FCFD88:\ 0000000000000000000000000000000000000000000000000000000000000000 00000002000000000000000000000000:E46FA1ACDA975397F893DA874257B063:\ 0000000000000000000000000000000000000000000000000000000000000000 00000001000000000000000000000000:48B472378DDB8297A1E70DB24B3B5784:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000800000000000000000000000:51E73F78E9E3DF78C460BD1D1D6F9D02:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000400000000000000000000000:A140D05B56E36B690DE8E5CC7CA2DA96:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000200000000000000000000000:4775063A5B2DB92E0A97A975DFD161AD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000100000000000000000000000:AD6913069340B8B88A42F09975A03E96:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000080000000000000000000000:CE03AA97EC230AF5130F7B49CF11F749:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000040000000000000000000000:CE235004F77A37CA2405AB272AE1F278:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000020000000000000000000000:0207B9546C956A9B96FC6FF8D8B25FF9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000010000000000000000000000:72284643B100DFEDAB7243D372000289:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000008000000000000000000000:2B97D40D51A9C400AC8F72285CB9D947:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000004000000000000000000000:16DEF3EF31FB9E0A9E11FE5DBD10FF6D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000002000000000000000000000:B8C5BEAB5058E1F8F31AC2537DFC2A04:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000001000000000000000000000:96240AFD00164E5BA929C470CC2EDFCD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000800000000000000000000:8255F69C848F0601DFA944E7DAA07B03:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000400000000000000000000:31D19233EB697EC50C087C6761658C22:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000200000000000000000000:0E267CDC580C17C21F207BB6A14A2A61:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000100000000000000000000:84F60557F8302489621586BC45B52D1D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000080000000000000000000:C6D5B38F47BB5298C521E41B9B722B44:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000040000000000000000000:384D3E44D70F9FD1783D7B86DC7C0B79:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000020000000000000000000:542B27EBC9FA37FA8CECF14E73545CB6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000010000000000000000000:04B5915863477F621C976F47ED7A6242:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000008000000000000000000:571E6627E25993D157D7306937A0F62F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000004000000000000000000:A256299F34E93EBEC69E04CFFF3476A0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000002000000000000000000:F202A1227405A4CDFC9308819B189FCB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000001000000000000000000:F99B66FEB8E9FFA89164A8EC1B8F1C85:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000800000000000000000:3C70D7CD09111B15069F54809724F1B0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000400000000000000000:B88FDCFD41AD34AE92091D31E90C585C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000200000000000000000:2A80BE073D50FCF2B7FA44A39F777AE1:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000100000000000000000:65F620832AD465A2AA6A14129F382DEE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000080000000000000000:A4518AD23FA96370D83BD3B2FBAA54C9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000040000000000000000:22AB117786B312AD84C9C2CAF1E2C2CF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000020000000000000000:33C719DCCF25FCF76916B80C632ADD00:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000010000000000000000:7D95F59DB32ECC39D00DA9DF113AA2EF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000008000000000000000:376278196B5EE68F2B57B51B4D07A849:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000004000000000000000:F6EBAD4990425CD9BBF97D5AC51D33DE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000002000000000000000:2C64F1A0EB9601E7B5A29E9237040E39:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000001000000000000000:0D6E4B7D38620761D65CCDDE9EDDB24F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000800000000000000:FB954442EDC07197FAE86E9A0D714903:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000400000000000000:4B2CC93726DEE48282FA27816FEDC5D6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000200000000000000:75EBA30DFEE4BE2CEFAF7D097D08BE4E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000100000000000000:90A9750293D227B3F75839A1B1B72A1D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000080000000000000:EA6A6BADD96680C06A0F3FF72A89A3B9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000040000000000000:027957EFFC5F8D54F5E31DEFA4EA5B1C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000020000000000000:689E796B7CA20D52ABCA6E02DFF2FA19:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000010000000000000:D0894BC5EC6BB6548C2DEF7D271C5A84:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000008000000000000:B3AD04752FE8B3CED3BC0C721CFFA017:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000004000000000000:75EBEAA918EE7713AB6B555911A8895B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000002000000000000:4507EAC65B6F8825147535212B810659:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000001000000000000:488887A888AD9C4208981298C32C8802:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000800000000000:8516A2448258784F9CE88A4DF07E12BB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000400000000000:34C35EAEF661E815B02FAE1D82A5C6FC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000200000000000:88927ABABC4DCDBE547729DC8486C912:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000100000000000:E3F2B4AD45A40E8F61A1A002EBB1A6B4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000080000000000:7B8C8A12DFFF1B31E9BBBC9AB1BF191E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000040000000000:12896559E9F9818A45895A850949641F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000020000000000:0ABC2B5B0BE224FCC494D1EF9930663E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000010000000000:1975B8F3DBFEF1B3F68150526EFDFD9A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000008000000000:531360071C6EDFCE4194DD34F282687A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000004000000000:D7D44699A83FAA21673C244155E57276:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000002000000000:1AECF6542049C8ADAE288158FAB8797B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000001000000000:EB40D7F5FADCE30126B34463B1FCFB43:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000800000000:FEFA8ED45925FD4F51AA06EADD1D08CE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000400000000:7E36A1A7FC162B85AAC263DCA957F534:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000200000000:E5C330087D678D159C00C27CBBDC9F61:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000100000000:8F56044BB6E9321DADC1F21A70F1E8C5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000080000000:8714D0D553AD80DDCABE3E9DB67CFE11:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000040000000:B72D92FFF02A78AC4682ABAF141D77C9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000020000000:9550FBBFD4A34816E2FD792AC339D49D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000010000000:84981AB5DFBE8422A2086D0E5E470254:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000008000000:7BD5A92C5957B09FA5AA9F1A34E17943:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000004000000:B603FAB9ED51424992A737BBC1E910D6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000002000000:2E396DFC0B28E28353C2F97BA982C13D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000001000000:D4CC605A1C64E8A98592A8CD05AAFED0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000800000:26C58B071D9116B0123CB99734CFAAF2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000400000:3C9D6B460A2364020F55A70E41B5B2E5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000200000:40569C782ACA0CB05042D0F54967545B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000100000:7340B7EB0B49722A28D0F06056D8878C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000080000:8FA7508A26413C633B77FC418AE0EE80:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000040000:4EA014A1F02840246644548A9C09629D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000020000:B44678D49E3F80D998A94CB542CFBF83:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000010000:756FEB41FE20E403C5C1715AB9D0E58A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000008000:F061519982CD7D2C1451CB2BCA567F21:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000004000:43B291C8A4BBF59612F896EF8DE8C801:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000002000:8512D67DA5F121630DF707E1B87901A3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000001000:1CE9CE4393434F7A0BCD3F4424B95575:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000800:8DEE20BD926E0AEA8F5163FCF8D594E5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000400:B504027202FA9A205A36ACFF47E22CB5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000200:3B88E059888E28B7E61F2602A5361A4D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000100:264BE9E31092B5F5FAE3C90A8544E036:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000080:82ED5DDBF256FB53432873A896699723:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000040:AE8D4DC3B948546E1F0DB6173A7DA5D2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000020:01CD700F9FAAD9182FADAA2E62B9814C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000010:000C12107A21E608CFCC1285E1057373:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000008:3FCD4604A02D1142032433FF551F0F23:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000004:D049B0BD078583621E4841BC9F53B11F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000002:BAAEF3F9A301A25EE35FE6D6C054E06C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000001:5A991DB3C1149C0C16A523B8FC413C8D:\ 0000000000000000000000000000000000000000000000000000000000000000 # First 2 vectors from an expired Internet Draft (which is what I used to # implement the code). The rest are from NESSIE. [MISTY1] 0123456789ABCDEF:8B1DA5F56AB3D07C:00112233445566778899AABBCCDDEEFF FEDCBA9876543210:04B68240B13BE95D:00112233445566778899AABBCCDDEEFF 0A0A0A0A0A0A0A0A:DAD2CFFB201C00DF:0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0B0B0B0B0B0B0B0B:EBCF435B23CFB4C9:0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B 0C0C0C0C0C0C0C0C:92E00981E5350015:0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C 0D0D0D0D0D0D0D0D:CD70199048ADB686:0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0E0E0E0E0E0E0E0E:ACAD6C19AE66EB41:0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0F0F0F0F0F0F0F0F:4ECFE751E0E6A16F:0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F 1010101010101010:C7A91953216F1B61:10101010101010101010101010101010 1111111111111111:0227EB3422109682:11111111111111111111111111111111 1212121212121212:5B88EB8714B2CE08:12121212121212121212121212121212 1313131313131313:E325B133AB02C021:13131313131313131313131313131313 1414141414141414:93A4074EE9C38AE3:14141414141414141414141414141414 1515151515151515:15AB85B70F337868:15151515151515151515151515151515 1616161616161616:7EFD6E05D384512F:16161616161616161616161616161616 1717171717171717:C1E46E7B54BAD271:17171717171717171717171717171717 1818181818181818:956504E0F372D380:18181818181818181818181818181818 1919191919191919:667C8BB548330E81:19191919191919191919191919191919 1A1A1A1A1A1A1A1A:1F8787DF7582DCD0:1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A 1B1B1B1B1B1B1B1B:47F4EAF5BA82C610:1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1C1C1C1C1C1C1C1C:0F772431C6E54F3C:1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C 1D1D1D1D1D1D1D1D:51CF4361B3EF3EAC:1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D 1E1E1E1E1E1E1E1E:7AC52498328C66BE:1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E 1F1F1F1F1F1F1F1F:9C4E0F782BBBD830:1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F 8181818181818181:2FFAF44121E4F834:81818181818181818181818181818181 8282828282828282:4EED79D6916AA112:82828282828282828282828282828282 8383838383838383:12B62B3C7FCAA24B:83838383838383838383838383838383 8484848484848484:F7FAF70C7E4ED8B7:84848484848484848484848484848484 8585858585858585:C58EC8FEE9DD45CF:85858585858585858585858585858585 8686868686868686:A6159BD7C1E24B82:86868686868686868686868686868686 FFFFFFFFFFFFFFFF:651F3092AFA551D0:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [Noekeon] # From the Nessie reference code 00000000000000000000000000000000:BA6933819299C71699A99F08F678178B:\ 00000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000:\ BA6933819299C71699A99F08F678178BBA6933819299C71699A99F08F678178B\ BA6933819299C71699A99F08F678178BBA6933819299C71699A99F08F678178B\ BA6933819299C71699A99F08F678178BBA6933819299C71699A99F08F678178B\ BA6933819299C71699A99F08F678178BBA6933819299C71699A99F08F678178B:\ 00000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:52F88A7B283C1F7BDF7B6FAA5011C7D8:\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 52F88A7B283C1F7BDF7B6FAA5011C7D8:5096F2BFC82AE6E2D9495515C277FA70:\ BA6933819299C71699A99F08F678178B [RC2] # First three came from RFC 2268, the rest were randomly generated by OpenSSL FFFFFFFFFFFFFFFF:278B27E42E2F0D49:FFFFFFFFFFFFFFFF 1000000000000001:30649EDF9BE7D2C2:3000000000000000 0000000000000000:2269552AB0F85CA6:88BCA90E90875A7F0F79C384627BAFB2 D8886B78E580404D:90748F6F07EF2836:1D FE9C2CDD8C027870:EC184E6CEC40D9F5:5049 A7E13BC9F22C595B:67A28EB51250764E:C4F82F 7177755D3F54A920:62A6F69BFE164A05:9190277A D9DCB373FD4ABCB3:B80190D7B249614B:481B0F86EA 4B138DDE007975AD:7FD56A6AA67F6C83:499825B0D117 971F30AF097B7350:5DFC9E205A2D14B8:4920D4274A62EA F95DCF9157489637:4AC1643B949984EA:405F1C56CEFE4013 1026140C4E7301D1:283EB71029EDE89A:AD6AF2DC8463BAB7C6 36773B9B092E5FB1:FE60654754ADA82B:3BB04A71CB0D23A7DFCB CBB90C2F7F42158C:30CFDEFED10675CC:0A6CC3F130AFD069222EEC B07CDC0A13DD350A:3B050F6208CC43CE:6A9DB0629A46CA98E9F99450 C0B69D0AD97D154E:BBA1918C34881835:200BCA0DCF0497C3DBF9A025D8 649B5F71F3B3BDBA:349369793550565D:7C5DD0AC485AD056C57F4B15ABE7 30B3ED77DBECDF2F:25174AD01E0BE2BC:65D6250D40CEDA1CB7A3CE29414ED4 E5D64497786FB2D7:BAE8FA177F46151C:56B594BB2938E08B9504D189AD39EADB 2009AF9845F4D0E1:4508CBDEAC304883:48E5FB1C74186717F17C9B7EA8F40827 8D7BF299E1DD2710:D5C504FF23ADE3A2:2E7C56B9A41B512817B702615EBA38A0 66E588E1E54E69FA:FB599477D9EF7C14:68229077C5E04998A73CAC26265BC454 3526264FB3AAD439:789C2F4906D4DD94:B2851A27F152B3B8D21FE19FE080DE93 51F9D8B75E99850A:992215897C1C4D4E:A63FACCE8ED417ADDBE36262E334C934 7643ADF384C7D876:280FBCA90127A9B7:68A2CD033B11F329BBF0E952FBDDADEF 61649CC1BB265F04:C04617D4C7F4688B:6562CAA391B7AD91F6F953860C142D53 7027B6111FE67F27:526E8225707ED477:97FF0C4C1D58254DE89140EECFF8A15B 450500AFA05B83ED:5E55E20A0D0E3226:FDA85236CFEEFF046973CF46C182B41C 51E3A05332220E12:05B42A4CC45321EB:2F1810D1FCFC98C847DA1D21BCA75712 # Again, test vectors courtesy of our friends OpenSSL and /dev/urandom. # Except the first few; I think they're from RFC 2040 [RC5(12)] 0000000000000000:21A5DBEE154B8F6D:00000000000000000000000000000000 21A5DBEE154B8F6D:F7C013AC5B2B8952:915F4619BE41B2516355A50110A9CE91 F7C013AC5B2B8952:2F42B3B70369FC92:783348E75AEB0F2FD7B169BB8DC16787 2F42B3B70369FC92:65C178B284D197CC:DC49DB1375A5584F6485B413B5F12BAF 65C178B284D197CC:EB44E415DA319824:5269F149D41BA0152497574D7F153125 9E1916F381491CCE:172A7A0BA70282E9:C0 B97800C223082F9F:B5B1708AF59CCAD4:DBEC F39054061481EB24:64CC1E0066FCA2AA:DA735B 7622BA5D3D51D560:FFCB9EA21917C3DE:0656F579 A15418BC11B2F0E1:B52821179E5CB9B9:A59FB3DA35 73B02BE42685EA56:308C21EFE81621EA:32594FCCFFEE 8CD5121F09DB7DFA:70921F59F5CD29AD:80E92B27999910 532955C8EEBC75CF:CBFBB1E0A1A693F2:925498B73A9CAED6 BC8B5CF722EEBCAC:F233FBDDC09D9561:3C379D8B11F23CC0F9 EFABA1B87E0236FE:A573453E1BF7B74B:AED34B49E719D6157F93 5248601C102C10C0:D96D76C05F5E4478:729B301AFAAB8FCADBEE25 EF6671A5A29EDEF8:9EC6407003B827B1:982644C13B1AA070437C1144 5EF9939F903D5AD3:8D9D5B5D12448231:3BADA3BBA56BF23EF64E0D208B FEF8CD62F9DC8D1E:8FAF5F9D6A4A0A7B:BDD77CE81D8AF0B50ABE418F45F7 C330D9BDC20D794D:0F74E03240C58D70:4AB4A9A4A31B700ECCB0FF23441F82 502E1C61223F5522:86CC15281600FA7D:3668476363B42815FF575A65006DAC49 62ECF065C5723856:5F8E3E9341B32B71:AEE7D59BFFC7FD4A2932C937C7277A2830 CF8DDCB5035B3CC1:2D688A1A2A8DCA18:3A1CCFABC9F8C46F96FB8B58D02A1F9EC514 D595EBBAFE479CCC:8AE450DB2A9A7C37:834BC680E250D2A3B5B2D5B03FF14F2F65E412 9F24230CB25BC86E:EE922AA0AC2EB904:39A787D483A6E52FAEF9FBD2EC3CDF81A39495DA EE68DE3FEEC31750:E71038E4AB9F475F:DD7ECA8D1145431F60F2B749FB576F82011BB65005 9464C68A5E6FCE5C:54534C495295FEE4:51FEB601EDA05F5D3D903FA957E6E06B81E640E6DFBE A91EACB2C38F78EC:997EBFE794F83F65:\ 0EF8C830DDE1838F1554195CAE006E69DD050C255B17FC 170D65C9396BFAE0:3B21E9B59F37FF96:\ 5C47BF0F8E6D0E7A445188E361E4A76A9C48CD9738791293 D5961EA7B7C02063:15C33DA775B4154B:\ 44822C91949958ADAF7E938395113A4BCE343D39C30B3CBE70 2C9A50C06A12E865:F060DD9CDBEA5738:\ 284FE5889A02AC1C83F9D1C62AC15AEAA08532EB478447B7A599 780A3BD50CF78B15:D263CFB83966D499:\ 37F29AA9FDF4758489AD07C168965A73DB335049BDE60400BC19A7 39EBCCE8CD770C35:BF040B7D806BEDA5:\ 8ED81E58E34274D0B72318A14812D1E50D117437B1F303AC72F75057 E823EB34847F1551:489177CA2F6E7189:\ AE591161BDC88AD08FF582EBEDB93A172C235E08E244AACA2F433CF1A5 3C4DB181401E588C:E2CCD84073236831:\ D1464349DB7C4D43777B3A44B4DC611C1F4DCCEF296D7A6E38443C773D60 128787704DDA4240:6BE471CF49A4C1CE:\ 1234D3D3AFB98F7D24D63E3A829D7EBA96A16B516638B79F59F38FD6C75766 28FE4812E9137CFB:18B5499EF0C1F9B4:\ FAC10D2B235098D973E8E81997EC9189197DAFE989E4B3A18E6D3C0150BF48CE 725F91D74F3F3C66:F398FC47F4FEA520:\ 4780C11A3CD65D21435AAEC988609495A4DEF6C8FFF6AAE1B26C70BC6C336F73 4C706FD69646BA98:5B9A776AEAD6304A:\ ED7E67F4D658C34693F0962687DB46628587EA2D35DB81C1129F00FA69833E1B 3361F4771047397D:DED25E1BD3872DD0:\ 5DB32571B70E3A66FEAD8ACC3F0C4F3A2A6E41A8ACF3D94E73EA0F91176FC3DB D840360511EB9840:D95E6398EC528F68:\ 674C6060F45869214A7AA9BF0FA8F54AFCA92D06A0366EA8C4FEF4C8E79A53CB DBBC3D4D45847930:74A00B919BE23D16:\ FB0A5141B81EDEAC27DEA6D4789083AA487B7D830E0041E1E2D167A1355BD858 5FF081C8F197D3ED:48305C0741ECBED9:\ 291FF645CA077953ECE2EF2AE8EA10A127E6D2A1DF4582A5A7B513227C8294C8 30B8BAE80C26B18D:57F443D4060FAC4D:\ A967EC9902F212F1D2D6645AB7C81F0DD1BF4439C131AABD7B8233836615F9F4 E75EBB4AA43E6C45:A29B91450C2A637E:\ 0A30C331D6015E8A0F64E33994263741D996435CFBA3253CBD64B03A5E000310 B53DD82028EBB35E:39718235AC88956E:\ 1B5E8C38D611847842ACE7CB7CCEDDF152F5043141B462E4704E729C57404D1D # All random OpenSSL-generated vectors; not one is in any way official. :) [RC5(16)] 1CA702F26A04AF21:8105DD6EDD4051FB:2B 78195A51EF592AFF:89055B0265E67032:0957 5BB2A022E7EDCCBF:94AD2F68A2D3E83C:698855 3B8B7A2F20DA627F:CB4B25A4A493287F:F62251DF C450CB97E69F2E94:77644E7454A72221:CB8CE363E0 B7057F70F43A993B:E411E3023FCA87FC:1FE3BBD63969 BE9976C68D70D0AA:FDBA816DB72A874C:F9EACED56552BD 6D340411F05E3B31:F58D02EEB481AFB6:BB0C6E15883513C7 B3844D3B7CAF9F3D:21133B09AABC3C07:3312EEB8E2B619738A 2FBA65761241EAD7:99D16F970CF37B73:9CD7B7EAA3C7C0F2A962 8B1DC2A2D8E02FC3:4643C45523471F25:347469C239C728FC135965 A372047B4271030F:731303538F359918:3001E738EC0D082C1A80D84F 4E666F689DB1FF6E:AE11B65FD7E4AB67:7BFF831DE2C51FD9426AB7424A 5D440679051B3A6D:2B4BE8A815F9A35D:3DADAB349343D1CFA3009B49ABE1 E461164D61914F95:32CF5B9FC95C48CA:D967EE11872B8C04EE0C4BCEE700EB 4AB29FEF7BB5FC5C:2518AA1C85B4600C:32F94338D7D70B4A5537FAEE03730745 53D49E42AB3AC1FC:02419E4BFDBF550E:1D158F49A2D6878739C61FE6D2E37C11E9 F99F9DD38CED0DB1:58E4BD6BBAE8565B:95EC4B43FC098B966E151F1B94EDC28D846A 4263C4FE2AB9B990:D267474CE38E6E9C:414326FF6F61C54E2932B56ABADB2496DEBB80 375AEE48D204DEED:61600764332D10C0:B99CA2E96FB0C85A8633010AA6EC8C3DC6CC0EF8 02B884BC12569B3F:86B0ED3E4CB4759F:1C4C076CA04C611316AA5D71659F163428479D929B 8AF5B9C53FDAE8B2:37091EFCD093D1D6:EA42742CF00A91F7CD9C63650EF450D20E34732A420C 9C42CAEEA47E2A06:BC1D42AFBE2CB8E5:\ BEBE3CB5B711C83E150F2DA7A864AE63CF336D9E0EE282 DD4B4CABDD5D5E35:31076D5D6EA4DE13:\ 3A0603293C5F5A1CCF9DB9337DCA010F243B29A6A2EB3455 597699EDD1B4DD7D:95FA85725C0AE0DE:\ 00752D67E4E1CCC4ABC7C50B3188181FE664EABF7ED476BC3E 5E2DEED62635DB75:828E88B5D91A7DB4:\ 23B5163E359A7FE8BBD3704F1EA98B712A15FB6FA6D8BFC3AF0E 041BBDF41357E288:2FE24A38A1AE4D61:\ 041C609CFA10BAFD30D34D986B762A959146E7DEE3481DF8A8C70D E8D46EFBAB44EF65:BA01FBBCF2FE39D6:\ 4CD0194425DF24845BABFB6895BAA18F45C395E8BADC196F36403C30 0A382E03FB85CFCC:571B98B3E9710D58:\ 7D7CC7017CF9DA5A74E8A7F2D36E5CC016710C43A9CB3C0B9DFB771EED A3D86E1D88602802:EBBB0C7614414D7C:\ CBA9B751F404F861E1DA95FFC2D11C686F84D8508D9A1743E5B9A006DA8B 017E4B4EFEF05D71:3EE25FA34042CDE6:\ 28967E8AEBD065D3B5ED27158F953512035515ED3B388E2DA336E9705F16D4 9AD01B01AFEA67C0:249B074FC69E1042:\ 3257D40C6B4EBDF8CAEC563CFE94201E1A843B31F2C9B720FC58C8214B7E2C2B 1EE20108D1089F69:28FA504AB46349D7:\ 4120A9CA90A38A4E16E8323E6B9CB1D2CBA0594253AE578A1A64518B32ABCB20 306786E25C18C9F0:76A525501E857BE5:\ 246F010FB9F2DDD99412824C602C7FB48C9F6A3B81688A4404E1F5EA21296599 D0FCF3DC590D5A53:91A9699905107EEA:\ 754D9753401A56E2096D71C30102B885159CF5CE7305D93020ECE035869E0BC7 83D2C97FFECD78A2:95FE3BD241FE9E5F:\ 534F366548F16D3825EDD61EAD00EF650DDC8E040B7955F68D240691AC34F840 2D7F3F25DE4C0F05:31BD01CB7BA808E4:\ 3B2CCDDFC5371E5F2FF9E119E0E13B730193E563296865BADA20781A2E0FFE2D 140AF01EB286A1DE:098B274A3F2D50EA:\ DED645862D8B88517F26EC729B8538BB6CE46D869E6D568A20DDC4D253E70749 DB58306587587FFD:20E71B55168E5ACD:\ D3C38159C3DB49A62E2369BF4BFEAF9EBDAF8E19B6FE9CB579E52C083FF70AB2 0A55DD3E3A425245:1489079C596FB1BB:\ 2C15C8A0354DCA1FAF296FBF3FD8E64FD7B9C65EF2EA65B6E216943A551A2CFA 37EC03CAA189CBAE:99FB7B05635AB5AA:\ 8777192F49C195BAACCFF2096964683CFCF0009B2C57477B759F57B1C32C07F9 [RC6] # From the RC6 AES submission package 80000000000000000000000000000000:F71F65E7B80C0C6966FEE607984B5CDF:\ 00000000000000000000000000000000 40000000000000000000000000000000:8CF4A482491CD207289D810C2BB29930:\ 00000000000000000000000000000000 20000000000000000000000000000000:80EF45D42327E3AED39CD45C4E3E6197:\ 00000000000000000000000000000000 10000000000000000000000000000000:F28D8DF12AC0837A0919254980B674F9:\ 00000000000000000000000000000000 08000000000000000000000000000000:9FB984DCBA5B0BDFFCFD97B02B648800:\ 00000000000000000000000000000000 04000000000000000000000000000000:46F7091CD30CCCF570AFC116F8446492:\ 00000000000000000000000000000000 02000000000000000000000000000000:77B517AA59EC7D3381188936BDEACCBD:\ 00000000000000000000000000000000 01000000000000000000000000000000:40D5D97CFFDC390AC35C2734F44CF9FF:\ 00000000000000000000000000000000 00800000000000000000000000000000:B5A6B7C92EFCB55D349B63066AC1E009:\ 00000000000000000000000000000000 00400000000000000000000000000000:152F0F5EA10FAFD0E63494C5FBDCC469:\ 00000000000000000000000000000000 00200000000000000000000000000000:61F669BF2B32CD27CF6278392C988510:\ 00000000000000000000000000000000 00100000000000000000000000000000:53A63CEE35DF00C73577B9255F55C855:\ 00000000000000000000000000000000 00080000000000000000000000000000:6E46B92E23344321A19321DF136CE9C5:\ 00000000000000000000000000000000 00040000000000000000000000000000:22F1261FAB993350F6ED41DA5D69B9B8:\ 00000000000000000000000000000000 00020000000000000000000000000000:0901BC0A1DB5CC87CDA91EF5F5FF46BC:\ 00000000000000000000000000000000 00010000000000000000000000000000:2EE65B377C16BE9517BA12F63189DE64:\ 00000000000000000000000000000000 00008000000000000000000000000000:74BD6FAA83668952E2D546A66B7A8243:\ 00000000000000000000000000000000 00004000000000000000000000000000:08FB4817F040B54E995B722C483C399E:\ 00000000000000000000000000000000 00002000000000000000000000000000:5630614200E248D1644B58E3694D8BA6:\ 00000000000000000000000000000000 00001000000000000000000000000000:659A3A27C9F3B0BBC65FC4C15D19051E:\ 00000000000000000000000000000000 00000800000000000000000000000000:FF3B39DCB459EE4FFAFCAC8C7331A6BE:\ 00000000000000000000000000000000 00000400000000000000000000000000:19F0727A66BD056DCB5541EDE14B4662:\ 00000000000000000000000000000000 00000200000000000000000000000000:D0DE4B5B30A294C8A3838B70387C93B6:\ 00000000000000000000000000000000 00000100000000000000000000000000:37BDB0A854686484E5EB52239D6C16C4:\ 00000000000000000000000000000000 00000080000000000000000000000000:3CC7113F6E6833C9BFB4EE07371488A5:\ 00000000000000000000000000000000 00000040000000000000000000000000:A56737C45AC4DBF2417243C2E3B40133:\ 00000000000000000000000000000000 00000020000000000000000000000000:B0A5C817B1E2C307A4BBF8258DF5F41B:\ 00000000000000000000000000000000 00000010000000000000000000000000:F2112329EFA070476BD515679C887FC6:\ 00000000000000000000000000000000 00000008000000000000000000000000:1AD2023CEC89B9436D03CCB9893C21C2:\ 00000000000000000000000000000000 00000004000000000000000000000000:6BA3E774FCDD02379C6CF2F7BF28B914:\ 00000000000000000000000000000000 00000002000000000000000000000000:A2F8638B0A4014F0641A3CB8A13B5ED9:\ 00000000000000000000000000000000 00000001000000000000000000000000:877FEDF7CACCBF0BD7BB5BB236BA96D5:\ 00000000000000000000000000000000 00000000800000000000000000000000:C9298A9A01C1F276E2E1E04226BF3D5C:\ 00000000000000000000000000000000 00000000400000000000000000000000:4E01DB16789DE364085416DE25871A59:\ 00000000000000000000000000000000 00000000200000000000000000000000:FD3B5DA07D0054DD10FFB79440AB3A00:\ 00000000000000000000000000000000 00000000100000000000000000000000:A2508E8BD26E2FB9944C27F04D60FAA0:\ 00000000000000000000000000000000 00000000080000000000000000000000:E9A43055D71335545A6A514F08B868BB:\ 00000000000000000000000000000000 00000000040000000000000000000000:587D5B71730D0B59BFBC0A93675B32F3:\ 00000000000000000000000000000000 00000000020000000000000000000000:90076413F890E8FFF04F1031C779C91F:\ 00000000000000000000000000000000 00000000010000000000000000000000:FAC9F46E9A1346646EE5C7CED45A84B9:\ 00000000000000000000000000000000 00000000008000000000000000000000:471F0738C4F4937E4253161F28086803:\ 00000000000000000000000000000000 00000000004000000000000000000000:A76F843041C4AED8241850B316D252A3:\ 00000000000000000000000000000000 00000000002000000000000000000000:5C5FD0334332A39924DB0CC7F0867C2E:\ 00000000000000000000000000000000 00000000001000000000000000000000:07B6EDDEF27EE890EBC8FFA187D84438:\ 00000000000000000000000000000000 00000000000800000000000000000000:11BB0F2DC24461F5E70D2830ED8A7463:\ 00000000000000000000000000000000 00000000000400000000000000000000:0AB1A99B63CB8E07290AC60D0A4F1FF3:\ 00000000000000000000000000000000 00000000000200000000000000000000:A26B0AFC4D55E7D61518C54E7C1BED01:\ 00000000000000000000000000000000 00000000000100000000000000000000:50C8C2B68E06CFCB98785E5AD3D5B09D:\ 00000000000000000000000000000000 00000000000080000000000000000000:ACA305D5D0D1E74FC51AC8C92A72FEA7:\ 00000000000000000000000000000000 00000000000040000000000000000000:5AF970E570BC1652C82FB4B0945D5410:\ 00000000000000000000000000000000 00000000000020000000000000000000:00C224433138C1A4BD60571AA35580BC:\ 00000000000000000000000000000000 00000000000010000000000000000000:4EBE79726DAAF4702B075A5898B26075:\ 00000000000000000000000000000000 00000000000008000000000000000000:8109EE81B1679CEC42DB80D9530AD2F6:\ 00000000000000000000000000000000 00000000000004000000000000000000:403B11B8181D460E9AC0172CBE6DD45F:\ 00000000000000000000000000000000 00000000000002000000000000000000:CDE78E92B5A84717AD9B4162E3B14BFA:\ 00000000000000000000000000000000 00000000000001000000000000000000:A173D6BEBAA05EC54A47C7E554415963:\ 00000000000000000000000000000000 00000000000000800000000000000000:EF31AD6CBFA7857ACF0C28294BDEF8B8:\ 00000000000000000000000000000000 00000000000000400000000000000000:209A30C46E41540C7B0AC8C4822DA253:\ 00000000000000000000000000000000 00000000000000200000000000000000:AF770103EC57EBEB913C83D99F58B6AC:\ 00000000000000000000000000000000 00000000000000100000000000000000:17D0C179EF34DE7F8EC7698A5371EC00:\ 00000000000000000000000000000000 00000000000000080000000000000000:E0285A3F97607250CDB89BF92CBD1F41:\ 00000000000000000000000000000000 00000000000000040000000000000000:D76BA3CE5E4DC974D4803ADB9F821A57:\ 00000000000000000000000000000000 00000000000000020000000000000000:B66579D4159CF0B0114011C0298EBDA3:\ 00000000000000000000000000000000 00000000000000010000000000000000:B9761796C787B51852E4C3130B8B662D:\ 00000000000000000000000000000000 00000000000000008000000000000000:D5C638801B97A1C2584ED42132F44109:\ 00000000000000000000000000000000 00000000000000004000000000000000:E54A021B145B7B7761487BCDFD0B032F:\ 00000000000000000000000000000000 00000000000000002000000000000000:3EB3AFE73582EFAB0396108B5E0CDEEC:\ 00000000000000000000000000000000 00000000000000001000000000000000:463E10507A26B708A1DFF3763276F5C9:\ 00000000000000000000000000000000 00000000000000000800000000000000:0EEBF8D85AE19EB24C810CEF565FA77B:\ 00000000000000000000000000000000 00000000000000000400000000000000:86CA894EEFD1CEAAEA70E00CD14645F6:\ 00000000000000000000000000000000 00000000000000000200000000000000:989B0FC1FFE4BA6F7CC0F1EDEEB5B932:\ 00000000000000000000000000000000 00000000000000000100000000000000:42916ED17877E58933D3D8CEDA8DD7B3:\ 00000000000000000000000000000000 00000000000000000080000000000000:88C0369158F2FEFFB4CF14130CE10B3B:\ 00000000000000000000000000000000 00000000000000000040000000000000:DB8976E1DDA56553340236F47F8E9CEF:\ 00000000000000000000000000000000 00000000000000000020000000000000:C6207672C411F088ACAD20814C66254A:\ 00000000000000000000000000000000 00000000000000000010000000000000:A792CF60F44A15D63FB293F9FCF879AC:\ 00000000000000000000000000000000 00000000000000000008000000000000:8F733746F91273D97ADA41D3A7D5A9E3:\ 00000000000000000000000000000000 00000000000000000004000000000000:5DA8F191833E6198689710D5A03EE262:\ 00000000000000000000000000000000 00000000000000000002000000000000:D6DB9CEB7E821F6DF4CB1E99105E07AA:\ 00000000000000000000000000000000 00000000000000000001000000000000:05F308FFAEA3E1E754974435CE0B77C3:\ 00000000000000000000000000000000 00000000000000000000800000000000:73B8639AAD53AFA1B24165E0C9FD397E:\ 00000000000000000000000000000000 00000000000000000000400000000000:AF45FDC65FD5F153E29A8D5032650AAD:\ 00000000000000000000000000000000 00000000000000000000200000000000:A8BB045FB5B867E85FCAD328E13756C9:\ 00000000000000000000000000000000 00000000000000000000100000000000:DD053128C46C78C4414CE3234C16AEB3:\ 00000000000000000000000000000000 00000000000000000000080000000000:B0C82152D1D9E21D7C3F33E1FC9B4D68:\ 00000000000000000000000000000000 00000000000000000000040000000000:11B56480D5C718A77A1BEA30CC3A53CF:\ 00000000000000000000000000000000 00000000000000000000020000000000:92C99F843674DED7F20A258C57253726:\ 00000000000000000000000000000000 00000000000000000000010000000000:63B218D069CE9CAF52EF97614BDACFF9:\ 00000000000000000000000000000000 00000000000000000000008000000000:76096721043A016C095D95DD02980289:\ 00000000000000000000000000000000 00000000000000000000004000000000:87AF16066939B8C4D90E242917DB05CF:\ 00000000000000000000000000000000 00000000000000000000002000000000:F7E0C931B7204308AB5020F106BBA0EF:\ 00000000000000000000000000000000 00000000000000000000001000000000:C697B3602711749580713737729E7049:\ 00000000000000000000000000000000 00000000000000000000000800000000:AF314640B147719EC1B4ABE27CDB58F5:\ 00000000000000000000000000000000 00000000000000000000000400000000:B67DAC5BF73AF7546D2FDC3BC142708D:\ 00000000000000000000000000000000 00000000000000000000000200000000:AC53D20E3C06FF82DE52470BCCE1B283:\ 00000000000000000000000000000000 00000000000000000000000100000000:7D65047AF522F01856FDD83A9AAA147A:\ 00000000000000000000000000000000 00000000000000000000000080000000:709D6454033E3FCF8962CAD39B0DC4BD:\ 00000000000000000000000000000000 00000000000000000000000040000000:7B8058E46789EF51D18700511D20CB70:\ 00000000000000000000000000000000 00000000000000000000000020000000:738088C404D8850041AD6B690CC6B65A:\ 00000000000000000000000000000000 00000000000000000000000010000000:7DFDFD55B53D4CD704F96CF93311AFC4:\ 00000000000000000000000000000000 00000000000000000000000008000000:1DBE62C57AF741D9F2FBF9A340E772C9:\ 00000000000000000000000000000000 00000000000000000000000004000000:E7349BAB7CB458736436943DB0CC411D:\ 00000000000000000000000000000000 00000000000000000000000002000000:64E229BF2AF893510358CB0DBEF7E97F:\ 00000000000000000000000000000000 00000000000000000000000001000000:4C632CF8C75AD0DDE8316A7B35F871CC:\ 00000000000000000000000000000000 00000000000000000000000000800000:2517115CB13E681F0EEA2206C26AD5C4:\ 00000000000000000000000000000000 00000000000000000000000000400000:8ED5E9D7005D980B078E7F58B47E591E:\ 00000000000000000000000000000000 00000000000000000000000000200000:8DBCD253443534B2B8BC698A03166ABE:\ 00000000000000000000000000000000 00000000000000000000000000100000:02F34EAB6CC1DBC8809F3D0EB80FA493:\ 00000000000000000000000000000000 00000000000000000000000000080000:47E5B71162F75B84D7A699A31FFA29DE:\ 00000000000000000000000000000000 00000000000000000000000000040000:B6C1EA2B410D1704058E905EB967C503:\ 00000000000000000000000000000000 00000000000000000000000000020000:4383238CE44E30ECDFC90A70EA4C9E96:\ 00000000000000000000000000000000 00000000000000000000000000010000:9314DFBB44D530768B159DAABCBD439F:\ 00000000000000000000000000000000 00000000000000000000000000008000:12D7C80912C299C4F668278FA494D580:\ 00000000000000000000000000000000 00000000000000000000000000004000:49FB1EACCA3B1743E15014010E9963DF:\ 00000000000000000000000000000000 00000000000000000000000000002000:0DF48D3B128AA63496DBE0CD11083495:\ 00000000000000000000000000000000 00000000000000000000000000001000:13240392854D6290A4BE08999843105B:\ 00000000000000000000000000000000 00000000000000000000000000000800:3D4B8705340C3225CE5A724917BA92B4:\ 00000000000000000000000000000000 00000000000000000000000000000400:425DCCF406AD46F2F565BBBC72FE234B:\ 00000000000000000000000000000000 00000000000000000000000000000200:88C09509CBB95339726C196E63346418:\ 00000000000000000000000000000000 00000000000000000000000000000100:90724430636A3DB610F25332BE2FEBE6:\ 00000000000000000000000000000000 00000000000000000000000000000080:044B4FAED3EA17338630E828B9960CA7:\ 00000000000000000000000000000000 00000000000000000000000000000040:4A59243AEB65BAA4F7432498FD87EF62:\ 00000000000000000000000000000000 00000000000000000000000000000020:4324DF8817589D894674B3F311256E9F:\ 00000000000000000000000000000000 00000000000000000000000000000010:0527269F9FA9E9CC01A03CFA59FD3854:\ 00000000000000000000000000000000 00000000000000000000000000000008:96CA56F9EFAA393F521679E0B6ACF231:\ 00000000000000000000000000000000 00000000000000000000000000000004:DA7A328F8A5BF03DD42BC52DEC5C4B15:\ 00000000000000000000000000000000 00000000000000000000000000000002:5FE3D4C46DB294523166AB46208E0711:\ 00000000000000000000000000000000 00000000000000000000000000000001:2519B9240C21C1F980FB722AD8CB793E:\ 00000000000000000000000000000000 80000000000000000000000000000000:A600B72AAC4DFB5271DC45F563FAE428:\ 000000000000000000000000000000000000000000000000 40000000000000000000000000000000:A7B1D7CBFBAB741B41744FF9100529B4:\ 000000000000000000000000000000000000000000000000 20000000000000000000000000000000:D9AAAA866BAB0D68AFFC39CF9888B8C6:\ 000000000000000000000000000000000000000000000000 10000000000000000000000000000000:32B0048A204036E1B45DE285E87E57B8:\ 000000000000000000000000000000000000000000000000 08000000000000000000000000000000:7267FEE7E04ACEB47C8FCC4096720484:\ 000000000000000000000000000000000000000000000000 04000000000000000000000000000000:FF0C22F756C2F5EBDC6610F085D74383:\ 000000000000000000000000000000000000000000000000 02000000000000000000000000000000:A6264FBCB2926C6181AA6F5551244B2F:\ 000000000000000000000000000000000000000000000000 01000000000000000000000000000000:D3A5B8FB3CBAA98419D394BB4C66B9D7:\ 000000000000000000000000000000000000000000000000 00800000000000000000000000000000:F9FE5D1BA274021F041023CD9AC20399:\ 000000000000000000000000000000000000000000000000 00400000000000000000000000000000:7307F7DEBBEFD911B0B590A0667E093D:\ 000000000000000000000000000000000000000000000000 00200000000000000000000000000000:4D8A3B987A1E66E72B3FFA520DDD57BB:\ 000000000000000000000000000000000000000000000000 00100000000000000000000000000000:0F444C0A7334947DBCB43D72F897E72F:\ 000000000000000000000000000000000000000000000000 00080000000000000000000000000000:448F29B848D7CFDA617D8A64AC518B0C:\ 000000000000000000000000000000000000000000000000 00040000000000000000000000000000:261B4EA7CD31F46C4FBF684395ED7FB8:\ 000000000000000000000000000000000000000000000000 00020000000000000000000000000000:25FA5AD347C57047749B15B97FE8ABE6:\ 000000000000000000000000000000000000000000000000 00010000000000000000000000000000:F7E13200EBA3F6E8E9F37B092B907961:\ 000000000000000000000000000000000000000000000000 00008000000000000000000000000000:9C934B121791B35AFE509A0D5A04BBF2:\ 000000000000000000000000000000000000000000000000 00004000000000000000000000000000:3C0F9D40F9608091CDFD831DD6D215EA:\ 000000000000000000000000000000000000000000000000 00002000000000000000000000000000:97D7D2AF2F635D43E536E0A5AA18C61E:\ 000000000000000000000000000000000000000000000000 00001000000000000000000000000000:1E41EB291C07ECF0908D49A9CBFAB57E:\ 000000000000000000000000000000000000000000000000 00000800000000000000000000000000:C9CCEB56AF06C494582F2C966EEEFD07:\ 000000000000000000000000000000000000000000000000 00000400000000000000000000000000:4B21E0D2942CCD21501F698ACA866BD0:\ 000000000000000000000000000000000000000000000000 00000200000000000000000000000000:BA0DC6ACC50486AD389EF65B5677DE19:\ 000000000000000000000000000000000000000000000000 00000100000000000000000000000000:EB80DE49F3D5605D9C3CE426EC80FAFD:\ 000000000000000000000000000000000000000000000000 00000080000000000000000000000000:D6984153BF67512062F876966BD190F3:\ 000000000000000000000000000000000000000000000000 00000040000000000000000000000000:AC789910F3458D59C5090BE936C6682A:\ 000000000000000000000000000000000000000000000000 00000020000000000000000000000000:5D64A268407F791DBDAFD0E5C6399A64:\ 000000000000000000000000000000000000000000000000 00000010000000000000000000000000:2B4F25AC69BA3AD941BBD4E1ECC75E79:\ 000000000000000000000000000000000000000000000000 00000008000000000000000000000000:FB943544937F3A34DFA0548C0257CE53:\ 000000000000000000000000000000000000000000000000 00000004000000000000000000000000:125A04339B61FA79FA3757576EC4FAA1:\ 000000000000000000000000000000000000000000000000 00000002000000000000000000000000:160B88277AC4C81603BD37ECA4FD73DC:\ 000000000000000000000000000000000000000000000000 00000001000000000000000000000000:4D65B09355F893E26C85E85955767604:\ 000000000000000000000000000000000000000000000000 00000000800000000000000000000000:1EE56A4AB4811DC3B17401CBAA8F5A15:\ 000000000000000000000000000000000000000000000000 00000000400000000000000000000000:6214728772DBD2CDA3124BA8BA2ABF38:\ 000000000000000000000000000000000000000000000000 00000000200000000000000000000000:328B60EDD6FD150934A30100286E07B5:\ 000000000000000000000000000000000000000000000000 00000000100000000000000000000000:2C976B076409056EA7489C7658BB34B9:\ 000000000000000000000000000000000000000000000000 00000000080000000000000000000000:D592EBBA861BBCC369DA99F832B0A773:\ 000000000000000000000000000000000000000000000000 00000000040000000000000000000000:E6F48FB373724153FFFC51758527C6E8:\ 000000000000000000000000000000000000000000000000 00000000020000000000000000000000:6C397B0BF5992740BD6A787F16BD511C:\ 000000000000000000000000000000000000000000000000 00000000010000000000000000000000:2CA57FEE77351E747799C8855780C63F:\ 000000000000000000000000000000000000000000000000 00000000008000000000000000000000:194C42AA377D361BBDF283693171FFDB:\ 000000000000000000000000000000000000000000000000 00000000004000000000000000000000:61832D4C637CCE219D2FBB36ACF7992E:\ 000000000000000000000000000000000000000000000000 00000000002000000000000000000000:945D2B20B9FD48F1961D04DBBA1708B5:\ 000000000000000000000000000000000000000000000000 00000000001000000000000000000000:EC152810AA2771AA5E871949BF12B6F1:\ 000000000000000000000000000000000000000000000000 00000000000800000000000000000000:E87712941A7EE80510D53509311196B7:\ 000000000000000000000000000000000000000000000000 00000000000400000000000000000000:776820A0500F2D90D4DF36F50C395674:\ 000000000000000000000000000000000000000000000000 00000000000200000000000000000000:64958DB0758C1E80FCFCBB9FC6195E6D:\ 000000000000000000000000000000000000000000000000 00000000000100000000000000000000:37F27D1D918D463B0668A470DE898AB9:\ 000000000000000000000000000000000000000000000000 00000000000080000000000000000000:AA71549A4B290289C7060D76FF5A20BC:\ 000000000000000000000000000000000000000000000000 00000000000040000000000000000000:95EF0C6213EB7CF56186D76BFA617174:\ 000000000000000000000000000000000000000000000000 00000000000020000000000000000000:2F6A4BD794419F9F34CFD0FED825B6CD:\ 000000000000000000000000000000000000000000000000 00000000000010000000000000000000:882C2B9E19854367479F0EE25D086F4E:\ 000000000000000000000000000000000000000000000000 00000000000008000000000000000000:D246FD18C625C1846741544EC4CE60B6:\ 000000000000000000000000000000000000000000000000 00000000000004000000000000000000:9EAF5A8C5673BE9F488D5C7B6521BD8C:\ 000000000000000000000000000000000000000000000000 00000000000002000000000000000000:9E7A685F738CB391FAE6ED184087630C:\ 000000000000000000000000000000000000000000000000 00000000000001000000000000000000:5E0AC39E49825B2424C7263AA8824232:\ 000000000000000000000000000000000000000000000000 00000000000000800000000000000000:0B06C4805E20BC990E601E5610A1BEAD:\ 000000000000000000000000000000000000000000000000 00000000000000400000000000000000:78A99615E809CA88F6F6C6E9AFA532FF:\ 000000000000000000000000000000000000000000000000 00000000000000200000000000000000:9ACF5CC740AA37663000C89C5F8EE8D8:\ 000000000000000000000000000000000000000000000000 00000000000000100000000000000000:35D76EBA8F59CA6A78FC2942AC5F7F43:\ 000000000000000000000000000000000000000000000000 00000000000000080000000000000000:39AD4C9AE2B4D46EF693303B54B53546:\ 000000000000000000000000000000000000000000000000 00000000000000040000000000000000:EA0833009C96171EAA2BFDEF50DEE473:\ 000000000000000000000000000000000000000000000000 00000000000000020000000000000000:868A8E86F525E50D3FF33A094A3AE119:\ 000000000000000000000000000000000000000000000000 00000000000000010000000000000000:3DBB9A366A2A3A660F027191B3613B95:\ 000000000000000000000000000000000000000000000000 00000000000000008000000000000000:E4CDE1FC6D811CDC25328CDAC8D0AD2B:\ 000000000000000000000000000000000000000000000000 00000000000000004000000000000000:332010FB6E39F82F00DC1FF6B6F8CFE6:\ 000000000000000000000000000000000000000000000000 00000000000000002000000000000000:00293BFE5BB3DA2D3652D4E06EE361B2:\ 000000000000000000000000000000000000000000000000 00000000000000001000000000000000:9BC99B26E0114669EFE218BF014A15AA:\ 000000000000000000000000000000000000000000000000 00000000000000000800000000000000:43C358B6DAB480D0EAEB96DCE57E5B85:\ 000000000000000000000000000000000000000000000000 00000000000000000400000000000000:9842333B8E9FCEC35A8779CCCA7D025A:\ 000000000000000000000000000000000000000000000000 00000000000000000200000000000000:5A47529DB0D103DCC34D2ADD3A19C53F:\ 000000000000000000000000000000000000000000000000 00000000000000000100000000000000:8F705A89D4C6EE7E27A14792EC49B652:\ 000000000000000000000000000000000000000000000000 00000000000000000080000000000000:6D4B9905F05096B23D6C13565588F012:\ 000000000000000000000000000000000000000000000000 00000000000000000040000000000000:23DDD34E8598F013C0559B3312341DBA:\ 000000000000000000000000000000000000000000000000 00000000000000000020000000000000:7B5AE9F49ACC68F2FEECB2823C3868A9:\ 000000000000000000000000000000000000000000000000 00000000000000000010000000000000:09F8EED21EB8EE33C02B90637EF24E6B:\ 000000000000000000000000000000000000000000000000 00000000000000000008000000000000:00A2E8DB0417F61EAABAD6E9BF13E4BC:\ 000000000000000000000000000000000000000000000000 00000000000000000004000000000000:CF5DB5AA31599EEDB5A3143E08D23672:\ 000000000000000000000000000000000000000000000000 00000000000000000002000000000000:E09B69B9C0E3365C0EDA54AB3310A5AC:\ 000000000000000000000000000000000000000000000000 00000000000000000001000000000000:33650F826366AEC9A09D7D038708737D:\ 000000000000000000000000000000000000000000000000 00000000000000000000800000000000:E84A1EE9A00BA66952B24A6E6AD0C002:\ 000000000000000000000000000000000000000000000000 00000000000000000000400000000000:11B1E0969380A0A24E876D6470872796:\ 000000000000000000000000000000000000000000000000 00000000000000000000200000000000:D88FCA95FA29C35FDCD9467715F102D7:\ 000000000000000000000000000000000000000000000000 00000000000000000000100000000000:A78B86EF0E6959C08F70C810AF8E99CD:\ 000000000000000000000000000000000000000000000000 00000000000000000000080000000000:A83E4F27E34360C8033CBC304EBBDF0C:\ 000000000000000000000000000000000000000000000000 00000000000000000000040000000000:0AA5B4F05A0B42358ABF19F6E55F66D2:\ 000000000000000000000000000000000000000000000000 00000000000000000000020000000000:5C2AC2588982E3CCE99994101FC0A21A:\ 000000000000000000000000000000000000000000000000 00000000000000000000010000000000:60A3E107674A0B7F7B931C6EC35BC747:\ 000000000000000000000000000000000000000000000000 00000000000000000000008000000000:123D266844DFFF63DA93C4D806325660:\ 000000000000000000000000000000000000000000000000 00000000000000000000004000000000:08170908422DCB46EEB046F3D7E4AE3A:\ 000000000000000000000000000000000000000000000000 00000000000000000000002000000000:13754D93DC4807807A9535388553FB47:\ 000000000000000000000000000000000000000000000000 00000000000000000000001000000000:DFA9741DD3883E39FED5716A706A65EC:\ 000000000000000000000000000000000000000000000000 00000000000000000000000800000000:CA5C3DCA7BE84DCBE33BF5238EA3F4B0:\ 000000000000000000000000000000000000000000000000 00000000000000000000000400000000:6EBEED89B297D6918FA5CEAB7A0E985E:\ 000000000000000000000000000000000000000000000000 00000000000000000000000200000000:3F79AB2119DEBCC44675E340C25B7D85:\ 000000000000000000000000000000000000000000000000 00000000000000000000000100000000:A7739DE45E6051EBBDC2F0365859BEE0:\ 000000000000000000000000000000000000000000000000 00000000000000000000000080000000:CEA0C2B3C653B7553605BACCFDD62DF8:\ 000000000000000000000000000000000000000000000000 00000000000000000000000040000000:7F9742EEE96193CA8981739712F73045:\ 000000000000000000000000000000000000000000000000 00000000000000000000000020000000:F0103101F4EC92C0CB48145FF34CF51F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000010000000:55A8A3B02951558F343C160E7F86288D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000008000000:3F9206DB4F3083E8F6EEC33CFE2C1BBF:\ 000000000000000000000000000000000000000000000000 00000000000000000000000004000000:F012723B2F08A28A5E24BB959FA5EFDD:\ 000000000000000000000000000000000000000000000000 00000000000000000000000002000000:1A28919DB3AB4A53D5A0E1E566982DF7:\ 000000000000000000000000000000000000000000000000 00000000000000000000000001000000:E17C960B43B7E926C83DF749C6A5532F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000800000:16DF63CFB77D31CC782C0ED3190136AD:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000400000:1643D697AC4075EC6FE609472FA4C678:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000200000:AD76BF6119FFC36369980D3466CF6570:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000100000:554E53F64D99F89A5BAA7FD5B70E0BD1:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000080000:BDC10FF10FA5E3A41B096C870666DECB:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000040000:6B12E2408646228502972EA7580B05E1:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000020000:B9583810806D5A491B2F69FFF2D2A327:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000010000:E8E9F4A50B834DDEF307503AECD8A3BC:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000008000:D7F4A1C7F7954E789BD61007866FFA80:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000004000:953D7D0FD6DDD25CA25FA23C9322339F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000002000:CD4E607B4324CEC7372DE19CEA5AEF78:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000001000:9B5C29709E0F0E586383EAB29E884009:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000800:28B822B70E7430E44182C2BBAED4D88D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000400:D2325AF7325642138C355BC4ACAF938F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000200:F4D1A000EC3A370B5A6386355CEE010C:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000100:F9D198D9FDC650AFA72320AD4826506B:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000080:5024595BEB4DAA2239D495BB023757EA:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000040:8A6CDA8F518CA2FB0A860C5567C60104:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000020:D6D90C40B07164436453E8312A633109:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000010:3E73330AE10DF1B8B81D9CA72221E192:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000008:5029AE60BF118AA69E47B235C3551490:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000004:7299F32614EA0BD98D2375CA643EC47F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000002:DF4A7B804A4D3A13113529C509F8BAF6:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000001:3EFC3791618B7D832BFA6AE030C09122:\ 000000000000000000000000000000000000000000000000 80000000000000000000000000000000:30F5C183F6C81A72F39B618B086CC2DE:\ 0000000000000000000000000000000000000000000000000000000000000000 40000000000000000000000000000000:DB11AFAAB4946101911DF90AFED8AC0D:\ 0000000000000000000000000000000000000000000000000000000000000000 20000000000000000000000000000000:1487FC298DBDA9C520CC5851B17D4079:\ 0000000000000000000000000000000000000000000000000000000000000000 10000000000000000000000000000000:2321D38ACCAAEA5DBA682E7BDCE095AB:\ 0000000000000000000000000000000000000000000000000000000000000000 08000000000000000000000000000000:C4DB11197AE15CF9DFE7D0F3457EC94C:\ 0000000000000000000000000000000000000000000000000000000000000000 04000000000000000000000000000000:1054BFF1A1564172460A0194B57EBE6C:\ 0000000000000000000000000000000000000000000000000000000000000000 02000000000000000000000000000000:2340568047F06139D03FE0A3C75CDBF1:\ 0000000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000:3FA18912A1C05E244663BD9A9B5D4046:\ 0000000000000000000000000000000000000000000000000000000000000000 00800000000000000000000000000000:7220FA3179267839BB03569E43056BE8:\ 0000000000000000000000000000000000000000000000000000000000000000 00400000000000000000000000000000:C7D49A32A6B93D1323EFD7B99FC0A5F7:\ 0000000000000000000000000000000000000000000000000000000000000000 00200000000000000000000000000000:C30D9FFB19F2090109AD40FDAB73176B:\ 0000000000000000000000000000000000000000000000000000000000000000 00100000000000000000000000000000:54CA1E1FD38713CD454A07339385739F:\ 0000000000000000000000000000000000000000000000000000000000000000 00080000000000000000000000000000:034516E874272A5A325EB9D54831B6F7:\ 0000000000000000000000000000000000000000000000000000000000000000 00040000000000000000000000000000:42650A58269E311A3B4F7BC414D1488A:\ 0000000000000000000000000000000000000000000000000000000000000000 00020000000000000000000000000000:8D4916888A02DC18E1EE95B005C58E18:\ 0000000000000000000000000000000000000000000000000000000000000000 00010000000000000000000000000000:B192C07FB927170DF62D6C44819BCD6F:\ 0000000000000000000000000000000000000000000000000000000000000000 00008000000000000000000000000000:973C835241ED02CBE39699AF2FFC150A:\ 0000000000000000000000000000000000000000000000000000000000000000 00004000000000000000000000000000:F9630817124B0787237D76697D66341F:\ 0000000000000000000000000000000000000000000000000000000000000000 00002000000000000000000000000000:51E98EC760A328E35B8D77289726AFC3:\ 0000000000000000000000000000000000000000000000000000000000000000 00001000000000000000000000000000:FC2E80BE856AE38BE0682E8C273616AE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000800000000000000000000000000:A440C29E6F4D6C3540D6C8DB6B02DE4F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000400000000000000000000000000:E04312CB849684A440114B40C242F1E0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000200000000000000000000000000:2186FC5F5947AAF6626DCAAFFFB47829:\ 0000000000000000000000000000000000000000000000000000000000000000 00000100000000000000000000000000:D357AAA0B4548EB23E9CF1B5D33487C3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000080000000000000000000000000:02239634F2A7CB81D1CACA279659C637:\ 0000000000000000000000000000000000000000000000000000000000000000 00000040000000000000000000000000:2EF92962D2F7D0A4B075992C3F8FA9C3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000020000000000000000000000000:F197F67C65438532F17DDBE41F87BA17:\ 0000000000000000000000000000000000000000000000000000000000000000 00000010000000000000000000000000:6A9387BE237C03056921A9F85AB7A394:\ 0000000000000000000000000000000000000000000000000000000000000000 00000008000000000000000000000000:5BE801A4767AD211AF20B295E4EB9F72:\ 0000000000000000000000000000000000000000000000000000000000000000 00000004000000000000000000000000:D38007A33C45B295D06FA99660E8C6E4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000002000000000000000000000000:C87746C9F5405E9BBBB53D17544AD016:\ 0000000000000000000000000000000000000000000000000000000000000000 00000001000000000000000000000000:142BB703DC8B4E870165F987B94A3D06:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000800000000000000000000000:3C25BD8199CD580D684BD7EC53601EED:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000400000000000000000000000:283CC22E28A7E48B9FB34F5454A1EB92:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000200000000000000000000000:BE6FA799CE3E6BB239EE35FEF2744A14:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000100000000000000000000000:99BF63EEB37E1C7E8686B28A0F13E120:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000080000000000000000000000:01308C588EC24E97B75A1D32F8C3E770:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000040000000000000000000000:F820CB9552F6800049E51037DD238E7B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000020000000000000000000000:BBC26F6098B0F4D2235FC139041EB78F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000010000000000000000000000:836E3B15AA777DEA46606FCC7C2FAB65:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000008000000000000000000000:AAB58970926FE6CFC4017F23FB44C287:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000004000000000000000000000:1DEEF417C2192D50694D1DF67F960E6E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000002000000000000000000000:4E4EA43FAD14AF207C311D98A1DB4B24:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000001000000000000000000000:E0731CEF0FAF7AE36B4FCB9E1AB95488:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000800000000000000000000:C6FF60796386126058694CAA35BFF163:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000400000000000000000000:AEA22D742BA1919C43E0A42719B1A9C8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000200000000000000000000:843793D2EF2427D745B9B35BC0AD0555:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000100000000000000000000:3C805CED7CBDEF4F896113D95D4BD975:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000080000000000000000000:5157A8B222432635BEBD29BDAA9C490B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000040000000000000000000:D7A88C8E82EB2F2BB827E56F33E7B1C3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000020000000000000000000:DA55FBE256EF08F565A70D870B969B27:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000010000000000000000000:951F6F33FD34701F7C79FC94EFB119CF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000008000000000000000000:BE2BD92D9F3DBFD3225B7488FFEC09C1:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000004000000000000000000:3C560897DF4AC5F3C33818E2597E90B0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000002000000000000000000:52C4110C36C90E3A54921B3F1AAB66C0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000001000000000000000000:9DCED6AECC426A4DFB6B648490A7D002:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000800000000000000000:F2631BD62B10761B923DD415ADCCC59B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000400000000000000000:2B1E1C0D54367440A122D31058057A42:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000200000000000000000:544C870FBF43AB7CFCF114E00B05D974:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000100000000000000000:1E8B06D5FDF11BF70AD8F8748F7F6C33:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000080000000000000000:582BE6419DB732C646B80E8C8966C7CC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000040000000000000000:2AB0AEAAF06EAD0BA24CCDD46BCAC4D2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000020000000000000000:32ABA6C20CFFB3D81A4D3288BF4BDFB1:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000010000000000000000:AB8F8FB0A91662A4E3C54C395BDD6711:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000008000000000000000:F154670ADDE837119060F4ECE9D7B636:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000004000000000000000:64CE436BCC7AAC1DE95D6CECC28C46C2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000002000000000000000:17A6371CFEAD87CBB6A545D9F9973155:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000001000000000000000:532AC851EF076F571D6B1C9418D7E2E9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000800000000000000:8CA057121128472C01EF7F6EC39EC63F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000400000000000000:283DF89A06A93492543BCA4D5DB109E9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000200000000000000:2A07389C26321F9F7AF46897D80E3CCF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000100000000000000:1473BBE037060B30273908A495C2F622:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000080000000000000:C937D109334A404B55CEE675092A2D2C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000040000000000000:0CAA09146104F478E231268F03EA4FB9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000020000000000000:7FCA0541DC09F947145B69C93E0E382F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000010000000000000:16739ED42CEF90CA03B686FF13A29A6C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000008000000000000:911BB934A7D6ED03A5AF9DF7A28E8129:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000004000000000000:3974614212BA6A30AC9541B7776CC29B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000002000000000000:8D17F86E8423398AB06E739B112048FB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000001000000000000:76A0AC6091D6DAF57C303E02D5AE8F97:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000800000000000:98C8AD3C3AB0EFB14DF2C96EC4A5923C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000400000000000:3AF0B1C79917659CF8E5B91D4ED31ED3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000200000000000:0F6C180C0D449B35A3C7026E513DA0D9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000100000000000:646F2B75831CA1CB950B5CC79F320F6F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000080000000000:2877CB6CFED0900A25FE65367B8DF5DC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000040000000000:5122F1C85198E03E269D90BDA811A8AD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000020000000000:7FEC2A1C88A6E72D22FE71B513B1C34D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000010000000000:1176120721DC2C20A1ED31F1572ECBB8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000008000000000:932B4B9980CF29A3EC9B982A2C0215CE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000004000000000:BFE6D2C8354E83D26AEF557E2AD1C2EF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000002000000000:FE4C742734F30C62964D5917C5B63723:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000001000000000:1663275B61F3FACEB365D56D8B51AE33:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000800000000:32EB39C865C149CF81E27D8AE0A91BDB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000400000000:0229846F9F8150006A27D62E60A762DE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000200000000:B88BACF0AFFAA2C5CAAC4C7036785A74:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000100000000:C61820350B4DAF92077DB18B2563C050:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000080000000:D4ABF17AA49B24F71DD5151339951D1B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000040000000:D7C632D6C753246A176B659DBCEF61D8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000020000000:1F34C055C434A025ADD592A5397D2D35:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000010000000:C399CB8A665E35A23F660C2F8C3D8FE9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000008000000:09E11B6D984BD70089CB2360448A4B60:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000004000000:E243F7445FCCF52878F8B83BE492EABA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000002000000:389F39873BDF652BC4F9043E30AD7CE0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000001000000:0669295AA4EA970860CF675D6469F765:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000800000:35C5F9A85171DC889BFD5332E6C8E0D7:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000400000:E07600A31EA2F2F781EBC12A3DDC936E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000200000:FB4CBEC86740711F59995673EB73ADE8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000100000:E572F84C3AEFB9DFCE042B39E68EA160:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000080000:A87AB39149865D45B1E43D35D8C65001:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000040000:4E5215E398BD5D0F7223348581D18158:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000020000:2524BA2E297D0D2B26797441A7CDB01E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000010000:3DCE8EB2F6FBDBB7A33A26FF6485D4AE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000008000:28EC64C3D0C3AA145F21F4067322573B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000004000:EC6E0084F98693A0D3AD1E4790716ACE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000002000:F09BD8B4646FBAC5556B4F0B816B35EB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000001000:9CC8722245E3CD23DF490353DCACC9E0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000800:C73465C832CC907D4F79035E67F9AE29:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000400:F311B9CF73CF5A8FAFB9DBEECC67B9E1:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000200:56494DBCF09A6019B1C6CEE3DB0C844B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000100:0364CB9DAF55D765BC5CCD46B58FA718:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000080:4DAFE2AAED6E49C98A7B8B979C32E6DB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000040:2F5BECD180A9449CE7A1ECCCB34057B1:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000020:1C8B0DF1D643B9376B3E40B847850DFD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000010:674A46D61796154EC5DE8EC7EDA4BD3A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000008:8F111A48A7C598EFF1CBCB43414A7791:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000004:CBD9C99FB47C9518151222D6F8B07446:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000002:D449C5BE9B01257543932AF7B8777F69:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000001:283D43A1CEA6187A31581D1606BB8B7A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1AD578A02A08162850A15A1552A17AD4:\ 80000000000000000000000000000000 00000000000000000000000000000000:912E9CF1473035A8443A82495C0730D3:\ 40000000000000000000000000000000 00000000000000000000000000000000:3D3E851A80ABAF221761931747473048:\ 20000000000000000000000000000000 00000000000000000000000000000000:96CFC0510819EEB7FCDF2CC7BEABEF77:\ 10000000000000000000000000000000 00000000000000000000000000000000:FB787268EC3C583A3685973B861AEF8D:\ 08000000000000000000000000000000 00000000000000000000000000000000:2AE927525C73250D954B619EDAC718BE:\ 04000000000000000000000000000000 00000000000000000000000000000000:00298D1DB6C6DA02E28E49C63B4A5795:\ 02000000000000000000000000000000 00000000000000000000000000000000:7E32F418910C9AC8701292B5F96346F3:\ 01000000000000000000000000000000 00000000000000000000000000000000:9FC6C21A562A049AD320EAA0D43C1998:\ 00800000000000000000000000000000 00000000000000000000000000000000:7A0BD66C361D641DFD313CBE23F69A57:\ 00400000000000000000000000000000 00000000000000000000000000000000:C2E2CAD226964597A98C388B27127EA1:\ 00200000000000000000000000000000 00000000000000000000000000000000:B7F4837AC6F1F808D8EBBF1D08077FB4:\ 00100000000000000000000000000000 00000000000000000000000000000000:0495E1AEDA7A9EC9ACBF38FE41CB08FA:\ 00080000000000000000000000000000 00000000000000000000000000000000:E001020E1D0C05BE072695F3F48F07B2:\ 00040000000000000000000000000000 00000000000000000000000000000000:608CE7A12C9EEC348FF674FB9F8D1972:\ 00020000000000000000000000000000 00000000000000000000000000000000:916BEC60955C1A3540B4C245F4D3B94B:\ 00010000000000000000000000000000 00000000000000000000000000000000:B2B91EC4EFE12CD4EDDA71ED52B278B1:\ 00008000000000000000000000000000 00000000000000000000000000000000:0CA46CF5275313AB3D9494A5BB7D786A:\ 00004000000000000000000000000000 00000000000000000000000000000000:E679B7C6F661AE52BA5199EC24D4E542:\ 00002000000000000000000000000000 00000000000000000000000000000000:043FAB3A991B3FEC872AC747640731CB:\ 00001000000000000000000000000000 00000000000000000000000000000000:EF8C38151A67B9A51E0935BBA14D9E22:\ 00000800000000000000000000000000 00000000000000000000000000000000:2D4515423CFCF372B5632C2879A71267:\ 00000400000000000000000000000000 00000000000000000000000000000000:2420A9327B9D2426C19F755BC3D8BD88:\ 00000200000000000000000000000000 00000000000000000000000000000000:2151D88643EE81D8D23B44D22E2B0D65:\ 00000100000000000000000000000000 00000000000000000000000000000000:AEFA6F32E963CB2D4D89E673B503DDAC:\ 00000080000000000000000000000000 00000000000000000000000000000000:43DBE4D6B1BA3F05F16D73B2F80A12DF:\ 00000040000000000000000000000000 00000000000000000000000000000000:ED8C9B25558CAD4EF9469364BE97CA30:\ 00000020000000000000000000000000 00000000000000000000000000000000:BDE5B1DC5053F94670599CBE6845604B:\ 00000010000000000000000000000000 00000000000000000000000000000000:4529434499884BE7C4E6D009F3D5353E:\ 00000008000000000000000000000000 00000000000000000000000000000000:B3D4C642173189B9295912E860CF6880:\ 00000004000000000000000000000000 00000000000000000000000000000000:651F1B1629535AD03D5C296D560FDE1F:\ 00000002000000000000000000000000 00000000000000000000000000000000:8A380594D7396453771A1DFBE2914C8E:\ 00000001000000000000000000000000 00000000000000000000000000000000:395FE0214AC536428C86737514B6237F:\ 00000000800000000000000000000000 00000000000000000000000000000000:ACEFAC47A7AB6E635EA9F85EF74DEFF3:\ 00000000400000000000000000000000 00000000000000000000000000000000:8C208E26E96D9DFA248010D8C1CFDB3B:\ 00000000200000000000000000000000 00000000000000000000000000000000:D3AE8AE99B3A84C3721EAA57C8EB17B1:\ 00000000100000000000000000000000 00000000000000000000000000000000:40D8DA37A8A6591A203F2A38AB05A08D:\ 00000000080000000000000000000000 00000000000000000000000000000000:F0580D0B864E8C03638A33499B36C9A5:\ 00000000040000000000000000000000 00000000000000000000000000000000:10F19634C2D1006B0C208AA303065B0F:\ 00000000020000000000000000000000 00000000000000000000000000000000:7D43298935D0AF6DB498542752666C99:\ 00000000010000000000000000000000 00000000000000000000000000000000:456AD1F19D18900B4F85EB64E06DF643:\ 00000000008000000000000000000000 00000000000000000000000000000000:08C83A53955102F6E60C2CB0F6C02443:\ 00000000004000000000000000000000 00000000000000000000000000000000:351C1035006BC7475DF60694859BB491:\ 00000000002000000000000000000000 00000000000000000000000000000000:BB47464DFF62381AD4A93684D00A817F:\ 00000000001000000000000000000000 00000000000000000000000000000000:514AC91B28081BD0E0CAE22D766257DF:\ 00000000000800000000000000000000 00000000000000000000000000000000:7758C19B083A62E6F2CAAD2B4C3DF4DC:\ 00000000000400000000000000000000 00000000000000000000000000000000:46B352EAC71542E417619E0360221673:\ 00000000000200000000000000000000 00000000000000000000000000000000:648D51C6F9522FE38108BBFD34015F22:\ 00000000000100000000000000000000 00000000000000000000000000000000:DCD800CC104B9C098AB4B931C7538F00:\ 00000000000080000000000000000000 00000000000000000000000000000000:E40601C1632937FA769C58BE63DEB056:\ 00000000000040000000000000000000 00000000000000000000000000000000:BC968175089F3864C81124A55AA445EC:\ 00000000000020000000000000000000 00000000000000000000000000000000:05479ACFA5A7C6BC89FE432D8D25A366:\ 00000000000010000000000000000000 00000000000000000000000000000000:8DDF91E221B4C2043C079F5F0ED63EA7:\ 00000000000008000000000000000000 00000000000000000000000000000000:66C47E3E339FFD404A61547E54ED0F7F:\ 00000000000004000000000000000000 00000000000000000000000000000000:3D622A36A3375D2EFFF3B49363F25755:\ 00000000000002000000000000000000 00000000000000000000000000000000:C2E42DDC662F226D09908E2CFDD03D32:\ 00000000000001000000000000000000 00000000000000000000000000000000:3221BC8032E72E0DE7580480A99DFD7D:\ 00000000000000800000000000000000 00000000000000000000000000000000:C65A142D036E99D1A4DA370D964A8A44:\ 00000000000000400000000000000000 00000000000000000000000000000000:E9C03F4840645726563582AA30464D1E:\ 00000000000000200000000000000000 00000000000000000000000000000000:93C2F8237D526E910F007FA0CF0608A8:\ 00000000000000100000000000000000 00000000000000000000000000000000:6F3A45184B87581E98B7B0D873F8B315:\ 00000000000000080000000000000000 00000000000000000000000000000000:D3569BAB0FDD360451E113895B39D0E2:\ 00000000000000040000000000000000 00000000000000000000000000000000:4002FF10DDB6FCB6669AE3FED696B2EC:\ 00000000000000020000000000000000 00000000000000000000000000000000:B265C44F675800A3B498FFA91C440654:\ 00000000000000010000000000000000 00000000000000000000000000000000:092E77F2537EE742D627EA8628E473E9:\ 00000000000000008000000000000000 00000000000000000000000000000000:441859995F05E1C06D118CFFB389C9CE:\ 00000000000000004000000000000000 00000000000000000000000000000000:844480BB205810808DC1F87C2B5281E9:\ 00000000000000002000000000000000 00000000000000000000000000000000:4B2E7C3B31CFC0CA5B51EA589DFFC9AC:\ 00000000000000001000000000000000 00000000000000000000000000000000:D55D552EA89C267FF3B0AF688CF00D78:\ 00000000000000000800000000000000 00000000000000000000000000000000:6AD19E9DD39381C8A02F3CC6F60C8048:\ 00000000000000000400000000000000 00000000000000000000000000000000:271ED37DB771414743EB781B2B315841:\ 00000000000000000200000000000000 00000000000000000000000000000000:ED0A833C87FE6CDC56E021BCD3099508:\ 00000000000000000100000000000000 00000000000000000000000000000000:6DBE8FEEB66CF747FFEC4E6D3D2D6BB0:\ 00000000000000000080000000000000 00000000000000000000000000000000:79460469EFEA89FA576B526B17709D4E:\ 00000000000000000040000000000000 00000000000000000000000000000000:5C3C35EC3D15CFAE719221549293A6AC:\ 00000000000000000020000000000000 00000000000000000000000000000000:607106E18F8C8A6E725AF44A491D891A:\ 00000000000000000010000000000000 00000000000000000000000000000000:1C22A5627309A238E2CE5A39BE370243:\ 00000000000000000008000000000000 00000000000000000000000000000000:FB6D4F017D84E9B74C2A59204A2EA0D6:\ 00000000000000000004000000000000 00000000000000000000000000000000:B66A30712DB3BD6B580678BDA72CC5B5:\ 00000000000000000002000000000000 00000000000000000000000000000000:59C93B2A53BE699840E29D78ACF05DE0:\ 00000000000000000001000000000000 00000000000000000000000000000000:AD37DFE5DCBB5A50228537BF24ED0159:\ 00000000000000000000800000000000 00000000000000000000000000000000:C9FAB85DCB8DA12A7C9416B267F21486:\ 00000000000000000000400000000000 00000000000000000000000000000000:EC797A0F6EBED4C257BC7FC1D7BD0100:\ 00000000000000000000200000000000 00000000000000000000000000000000:629D633D7A7C345A3A3CF66565E298E1:\ 00000000000000000000100000000000 00000000000000000000000000000000:859D400CC95F29E7131561F4D7E4DD12:\ 00000000000000000000080000000000 00000000000000000000000000000000:932CFF2E8A828C61BA537E186F559E93:\ 00000000000000000000040000000000 00000000000000000000000000000000:62FA5692938CB84279C7E399BA10E08D:\ 00000000000000000000020000000000 00000000000000000000000000000000:50321207B2A375B12F4630F3F1909B08:\ 00000000000000000000010000000000 00000000000000000000000000000000:63978A72D0ACAF85676EAA2D1EE01F3C:\ 00000000000000000000008000000000 00000000000000000000000000000000:20721CCA68AE0451687D82534A360173:\ 00000000000000000000004000000000 00000000000000000000000000000000:9223A844EAB1CA5D3A43EBC4C5CF01C8:\ 00000000000000000000002000000000 00000000000000000000000000000000:70E162CC61AC398CF4D9DBE62FD653CE:\ 00000000000000000000001000000000 00000000000000000000000000000000:082CED7A4969FD3C8131BF9AE57754DB:\ 00000000000000000000000800000000 00000000000000000000000000000000:169070D4658D94C12041D14EC60A2B0A:\ 00000000000000000000000400000000 00000000000000000000000000000000:960E45070B5BA767F1A3117851ECF9DA:\ 00000000000000000000000200000000 00000000000000000000000000000000:4AAAA999C2421953E3607CA202D4C1DE:\ 00000000000000000000000100000000 00000000000000000000000000000000:E4B97E5B2BA83D2038B5D08EB792F92F:\ 00000000000000000000000080000000 00000000000000000000000000000000:ECBC7F9C422FC676152CC7E40391D730:\ 00000000000000000000000040000000 00000000000000000000000000000000:55EBABC43A33305FB82B39A88A737FFF:\ 00000000000000000000000020000000 00000000000000000000000000000000:C1BDA064749B2B7A9E9378137462F800:\ 00000000000000000000000010000000 00000000000000000000000000000000:BDDD0163E4CEAC2C614ABDA9EBE15F3D:\ 00000000000000000000000008000000 00000000000000000000000000000000:B767CF0E6717B409743AE41C56A2054D:\ 00000000000000000000000004000000 00000000000000000000000000000000:AD897CFAED8FBBD9A3006F7EB2A7C601:\ 00000000000000000000000002000000 00000000000000000000000000000000:2929929D821D010A1A30E9CF4415F809:\ 00000000000000000000000001000000 00000000000000000000000000000000:0C861D39741060051855648B385708B5:\ 00000000000000000000000000800000 00000000000000000000000000000000:4BA018EA1AFF5C0A9CF368592B08FD34:\ 00000000000000000000000000400000 00000000000000000000000000000000:4377CD44B655A0ABC40E5B9D3A480EC6:\ 00000000000000000000000000200000 00000000000000000000000000000000:2F604E94C9CD1DCB730AB0AF407FEDBD:\ 00000000000000000000000000100000 00000000000000000000000000000000:44A3514094941B7E497BCFE0D746BA48:\ 00000000000000000000000000080000 00000000000000000000000000000000:1235A968A7D12BA7042E7E63A897DBED:\ 00000000000000000000000000040000 00000000000000000000000000000000:0BA061C7AD274E004B2E06D3D5FC784D:\ 00000000000000000000000000020000 00000000000000000000000000000000:E0DB8CE28D1C2F6B692B230A7AB0CB44:\ 00000000000000000000000000010000 00000000000000000000000000000000:ED4BBD535080655AF3F4D71709B1B8D5:\ 00000000000000000000000000008000 00000000000000000000000000000000:92D183FBE0BD07A0884EBD1963A193BE:\ 00000000000000000000000000004000 00000000000000000000000000000000:995BB9E75386C99DA3038C3C6340C838:\ 00000000000000000000000000002000 00000000000000000000000000000000:4914DA6C7A8E1AB8297A9D280DE576F9:\ 00000000000000000000000000001000 00000000000000000000000000000000:6415185D85078CE80F46C6E09EDB8B78:\ 00000000000000000000000000000800 00000000000000000000000000000000:8B2908466F8BD3C1C3A4A5EAFCC0FF92:\ 00000000000000000000000000000400 00000000000000000000000000000000:425BF2FCF5DD8B0013773F9A0DC09B0D:\ 00000000000000000000000000000200 00000000000000000000000000000000:9AC35220BE56E453B73CD887B299D06E:\ 00000000000000000000000000000100 00000000000000000000000000000000:41900EF8223D019F1BC3E8EA68FC763C:\ 00000000000000000000000000000080 00000000000000000000000000000000:9D294A574144109A9C6DE8E90EE517B6:\ 00000000000000000000000000000040 00000000000000000000000000000000:4146D6BB7AE455D93EAF43753C7AE693:\ 00000000000000000000000000000020 00000000000000000000000000000000:4155B7D12FD12F96FD39C576FDD41422:\ 00000000000000000000000000000010 00000000000000000000000000000000:1AF1E634B06211668CE2410D5EDCA968:\ 00000000000000000000000000000008 00000000000000000000000000000000:815739510622BFE08EEE06B772368524:\ 00000000000000000000000000000004 00000000000000000000000000000000:E2F7D8411181A21B02C1466E750056C2:\ 00000000000000000000000000000002 00000000000000000000000000000000:13095792D8B1D771378839C912CA3C41:\ 00000000000000000000000000000001 00000000000000000000000000000000:8301730C7D5FEFC416BEEC1104C51E36:\ 800000000000000000000000000000000000000000000000 00000000000000000000000000000000:F7EF83BDD4C3D5B30E805C351DB87200:\ 400000000000000000000000000000000000000000000000 00000000000000000000000000000000:A236EB8595FDF9239C658D58342EF566:\ 200000000000000000000000000000000000000000000000 00000000000000000000000000000000:236397EB9EEDA5EA8BF4A42864A5A39F:\ 100000000000000000000000000000000000000000000000 00000000000000000000000000000000:21C3DD416D64F6055C8C3977EEFB4652:\ 080000000000000000000000000000000000000000000000 00000000000000000000000000000000:59128F63BD9D834C3EECA5A5299417D1:\ 040000000000000000000000000000000000000000000000 00000000000000000000000000000000:0F95FA4C48DE95391B45A460B92B22BF:\ 020000000000000000000000000000000000000000000000 00000000000000000000000000000000:5073FABD5FA03D153108B9A5F2128C78:\ 010000000000000000000000000000000000000000000000 00000000000000000000000000000000:B83872427919126F2C976D45872B7596:\ 008000000000000000000000000000000000000000000000 00000000000000000000000000000000:73F8E6C4181758AFA29945E970C8F854:\ 004000000000000000000000000000000000000000000000 00000000000000000000000000000000:B72DC39B9A72EFFA047E3657B1F02B1B:\ 002000000000000000000000000000000000000000000000 00000000000000000000000000000000:081F1C50BF964CCC01949363A1A1C76C:\ 001000000000000000000000000000000000000000000000 00000000000000000000000000000000:D4A2AB8B904BE542386CC2342AC354D6:\ 000800000000000000000000000000000000000000000000 00000000000000000000000000000000:BC94C45B53BB5281BFF16F7BC7CCD26E:\ 000400000000000000000000000000000000000000000000 00000000000000000000000000000000:7D976240134D43279AB809A3EC1BAB8E:\ 000200000000000000000000000000000000000000000000 00000000000000000000000000000000:BE18D342080322DBBCEDBB83C7F11CA5:\ 000100000000000000000000000000000000000000000000 00000000000000000000000000000000:D1359D29060E0003C78066A900C90C00:\ 000080000000000000000000000000000000000000000000 00000000000000000000000000000000:FD0A7E670B7E9B57C913D38E4649715E:\ 000040000000000000000000000000000000000000000000 00000000000000000000000000000000:C9DFB5B1CB3E079CFC027E67DA61EC2A:\ 000020000000000000000000000000000000000000000000 00000000000000000000000000000000:10FDD69900FBC470499EDF0AFF655430:\ 000010000000000000000000000000000000000000000000 00000000000000000000000000000000:565721A361F5F0EB44366DEC1D6841BE:\ 000008000000000000000000000000000000000000000000 00000000000000000000000000000000:07AD173E39A769D345277F4CFD16BBA8:\ 000004000000000000000000000000000000000000000000 00000000000000000000000000000000:8E89B6B70A10D1866ED4D139A0E6565C:\ 000002000000000000000000000000000000000000000000 00000000000000000000000000000000:88A431DD4CBBD94778AE53A36EE246DE:\ 000001000000000000000000000000000000000000000000 00000000000000000000000000000000:F4C8E31B64506E9BDE6BB682DBCEF50A:\ 000000800000000000000000000000000000000000000000 00000000000000000000000000000000:5B0E256E4EAB25AEC08CD2CE5547334D:\ 000000400000000000000000000000000000000000000000 00000000000000000000000000000000:EDBAA578C13D7D215057EAD4F03B9E1C:\ 000000200000000000000000000000000000000000000000 00000000000000000000000000000000:7EA37DB8EB1B362E370A43DF1ADB2F0A:\ 000000100000000000000000000000000000000000000000 00000000000000000000000000000000:8B7C67AE8F749C4EFB7418788D369DEC:\ 000000080000000000000000000000000000000000000000 00000000000000000000000000000000:34D3A7E87A4B1B3FAC60672A3D82F40D:\ 000000040000000000000000000000000000000000000000 00000000000000000000000000000000:4FE628152A1D46CF6DA78D5F17255877:\ 000000020000000000000000000000000000000000000000 00000000000000000000000000000000:3460A571D035B6DA52AA8E59702B79C0:\ 000000010000000000000000000000000000000000000000 00000000000000000000000000000000:CA2375E2E96AB28C7FC3E61B6561B07C:\ 000000008000000000000000000000000000000000000000 00000000000000000000000000000000:7E33319A69017428DDBD979D3F6982C6:\ 000000004000000000000000000000000000000000000000 00000000000000000000000000000000:49DA8B8AD80A6BBA1003FF6B8D06E3D8:\ 000000002000000000000000000000000000000000000000 00000000000000000000000000000000:CCE4C841B39187943DCCA5EB8BBF1221:\ 000000001000000000000000000000000000000000000000 00000000000000000000000000000000:3B42FA9129BF36F87E445589460A19BD:\ 000000000800000000000000000000000000000000000000 00000000000000000000000000000000:3E397A22C64A8C09B5B59A9D397B0A96:\ 000000000400000000000000000000000000000000000000 00000000000000000000000000000000:159AB9C871FB3EB373A94721E9F0743A:\ 000000000200000000000000000000000000000000000000 00000000000000000000000000000000:9C2DECEEFEDF2475C26EFFEA3A0E2920:\ 000000000100000000000000000000000000000000000000 00000000000000000000000000000000:0FCC4399113E6BF62A23F657BEF97224:\ 000000000080000000000000000000000000000000000000 00000000000000000000000000000000:2FCA4167B034D9EDAC4E12828B911600:\ 000000000040000000000000000000000000000000000000 00000000000000000000000000000000:3F9434872C4E49EB8718EDB8896CFF2E:\ 000000000020000000000000000000000000000000000000 00000000000000000000000000000000:8168025815D16028078007C9E1370331:\ 000000000010000000000000000000000000000000000000 00000000000000000000000000000000:F0FBF790B49553EC3963805CC2F6AA7E:\ 000000000008000000000000000000000000000000000000 00000000000000000000000000000000:951C45D26A548A9A6152CCBC00D3C6FA:\ 000000000004000000000000000000000000000000000000 00000000000000000000000000000000:845DCC97B1F8CD3254D2B29A59C7AE41:\ 000000000002000000000000000000000000000000000000 00000000000000000000000000000000:6694A168D387E4FB3291A376B938136D:\ 000000000001000000000000000000000000000000000000 00000000000000000000000000000000:9569359A00659B9645565857398C982F:\ 000000000000800000000000000000000000000000000000 00000000000000000000000000000000:417C97D7F56216FFEBE64A73F8D81168:\ 000000000000400000000000000000000000000000000000 00000000000000000000000000000000:8C46288B3314B9E1BC91E3C901C784A8:\ 000000000000200000000000000000000000000000000000 00000000000000000000000000000000:8EB78926977246F186274D88A4B0E6B3:\ 000000000000100000000000000000000000000000000000 00000000000000000000000000000000:51E819059AB0325A2DF7F8CF49A54353:\ 000000000000080000000000000000000000000000000000 00000000000000000000000000000000:56A59894FC1972B03D66D6C43688138B:\ 000000000000040000000000000000000000000000000000 00000000000000000000000000000000:CB772637B59AD2330ACC8CC2FA7A338B:\ 000000000000020000000000000000000000000000000000 00000000000000000000000000000000:1E3759E5BBE19EA0F66FBB0702F07440:\ 000000000000010000000000000000000000000000000000 00000000000000000000000000000000:2112CFD246447D95F1A6BFF65A044121:\ 000000000000008000000000000000000000000000000000 00000000000000000000000000000000:8A7E580BAC4406B297E12B472C2748E3:\ 000000000000004000000000000000000000000000000000 00000000000000000000000000000000:349ABE7C34357C7C719BD48AB62DF95C:\ 000000000000002000000000000000000000000000000000 00000000000000000000000000000000:5EDB9089B865DAC899854DACE9DBBDBC:\ 000000000000001000000000000000000000000000000000 00000000000000000000000000000000:C82372837C0B459699779683785CE09C:\ 000000000000000800000000000000000000000000000000 00000000000000000000000000000000:B26532F7C0FDFF76BFADD7178E7A2A7A:\ 000000000000000400000000000000000000000000000000 00000000000000000000000000000000:965F80C599BF6AA85CA2199C785EDAF1:\ 000000000000000200000000000000000000000000000000 00000000000000000000000000000000:8434DFE0C8717514FB0F8A4FF46930B6:\ 000000000000000100000000000000000000000000000000 00000000000000000000000000000000:10D701937E2944C7B48BAA32DA64C6A5:\ 000000000000000080000000000000000000000000000000 00000000000000000000000000000000:9A401E466C3686609B7B92FC6C57EA3B:\ 000000000000000040000000000000000000000000000000 00000000000000000000000000000000:E3442053C50265AEBEFD327633E449B1:\ 000000000000000020000000000000000000000000000000 00000000000000000000000000000000:7DF5EC480DEFA928687A35116989A7E2:\ 000000000000000010000000000000000000000000000000 00000000000000000000000000000000:EB2D38038A867146E3999D3E4DACE2BD:\ 000000000000000008000000000000000000000000000000 00000000000000000000000000000000:AE420A68558A2A50085331D8C46D7685:\ 000000000000000004000000000000000000000000000000 00000000000000000000000000000000:049B78384DE81BB815C48CC565DC1029:\ 000000000000000002000000000000000000000000000000 00000000000000000000000000000000:38EDCB5D37E043621F1EB80C78E40657:\ 000000000000000001000000000000000000000000000000 00000000000000000000000000000000:928C462D2AE8B7B45C252D0CAE80B34C:\ 000000000000000000800000000000000000000000000000 00000000000000000000000000000000:B3AD5D661D6DACFD57C214FDB9384491:\ 000000000000000000400000000000000000000000000000 00000000000000000000000000000000:9785657218402C1F3D1A40E73B015359:\ 000000000000000000200000000000000000000000000000 00000000000000000000000000000000:302355F21D129456A3EC58CD4C74D334:\ 000000000000000000100000000000000000000000000000 00000000000000000000000000000000:7322A935E1F65E2F341F778D0A55DAC0:\ 000000000000000000080000000000000000000000000000 00000000000000000000000000000000:7EEEF0009743F18E1E08F5CB02CFA104:\ 000000000000000000040000000000000000000000000000 00000000000000000000000000000000:82FA95B00BA5C8D71CB372895E91F7AD:\ 000000000000000000020000000000000000000000000000 00000000000000000000000000000000:44E308A9BAE6315936931C0D6F3472A4:\ 000000000000000000010000000000000000000000000000 00000000000000000000000000000000:A0F7760CB5F12B2F7F7451688DCC6DB3:\ 000000000000000000008000000000000000000000000000 00000000000000000000000000000000:249CBF1A9027A9D4A049DCC61C100631:\ 000000000000000000004000000000000000000000000000 00000000000000000000000000000000:AE5191679DB49836EBD11781E1A9E809:\ 000000000000000000002000000000000000000000000000 00000000000000000000000000000000:6F0F72E56952895F7425A34EB97D0D41:\ 000000000000000000001000000000000000000000000000 00000000000000000000000000000000:E4C8937EA026250290E85A2AA4B3A338:\ 000000000000000000000800000000000000000000000000 00000000000000000000000000000000:0D1B7815F62D8C6DB79E9755EB5CC047:\ 000000000000000000000400000000000000000000000000 00000000000000000000000000000000:3B8DA219500F670D2D32C753F613E646:\ 000000000000000000000200000000000000000000000000 00000000000000000000000000000000:DC16F91F486975C2762AAEF8E4C66543:\ 000000000000000000000100000000000000000000000000 00000000000000000000000000000000:7CC222B3C5866AC0F27A60C9D9713981:\ 000000000000000000000080000000000000000000000000 00000000000000000000000000000000:B7F625FC185B3ACEF820AF59570370FD:\ 000000000000000000000040000000000000000000000000 00000000000000000000000000000000:8AA59EA7476AFE267D7745A2A5E1D0CB:\ 000000000000000000000020000000000000000000000000 00000000000000000000000000000000:DDB9E4AA397029E10ED5F1984513280B:\ 000000000000000000000010000000000000000000000000 00000000000000000000000000000000:C92B81F3061A4ABC6C35D1B0AF2BA410:\ 000000000000000000000008000000000000000000000000 00000000000000000000000000000000:05F510BA96377001A23093980C02FBCD:\ 000000000000000000000004000000000000000000000000 00000000000000000000000000000000:A22D14EBC78B338735CA0AAD155B0114:\ 000000000000000000000002000000000000000000000000 00000000000000000000000000000000:C562318B01D5235CCD4DC3D3A8B10DA0:\ 000000000000000000000001000000000000000000000000 00000000000000000000000000000000:FA248CAA2F7C4B029054A31917BE9B47:\ 000000000000000000000000800000000000000000000000 00000000000000000000000000000000:FCC4E2E3C6E5DB8DECBF2493E3A52B9A:\ 000000000000000000000000400000000000000000000000 00000000000000000000000000000000:C5D23718F33ADC9F8B3B35263E47248A:\ 000000000000000000000000200000000000000000000000 00000000000000000000000000000000:773E59C9CA8EFD081E1CFD4F3DF4BC16:\ 000000000000000000000000100000000000000000000000 00000000000000000000000000000000:9A5E5AB516ECEA600952D25684DFF5E9:\ 000000000000000000000000080000000000000000000000 00000000000000000000000000000000:4EB9B9CC17E48F68423C884D64091022:\ 000000000000000000000000040000000000000000000000 00000000000000000000000000000000:0CCD75BECA8406EBF53CB0ABB1B46B23:\ 000000000000000000000000020000000000000000000000 00000000000000000000000000000000:0242108DABD2ED9886E8ABD70AA97B29:\ 000000000000000000000000010000000000000000000000 00000000000000000000000000000000:C52A6EB2958C995465C4F870F1A8269E:\ 000000000000000000000000008000000000000000000000 00000000000000000000000000000000:5FD2C7F3C81B013B96EC3ACBB0688175:\ 000000000000000000000000004000000000000000000000 00000000000000000000000000000000:1E63A0B10B0293A8572FD7749ACB9A53:\ 000000000000000000000000002000000000000000000000 00000000000000000000000000000000:9E1D466FA752C13AF4296CFFB8566DB2:\ 000000000000000000000000001000000000000000000000 00000000000000000000000000000000:BA1A69D7AD2869734A4954553D4EF249:\ 000000000000000000000000000800000000000000000000 00000000000000000000000000000000:EC2E7D615474B0B08D47AFCBE4FD8402:\ 000000000000000000000000000400000000000000000000 00000000000000000000000000000000:5C295AA2183B5FB9498094DB774244D1:\ 000000000000000000000000000200000000000000000000 00000000000000000000000000000000:1C5A17D1BE0D9EDCF339DB3D2631F236:\ 000000000000000000000000000100000000000000000000 00000000000000000000000000000000:CF6E9758B39149E3E29FB66CD58D0976:\ 000000000000000000000000000080000000000000000000 00000000000000000000000000000000:4F3FF2CAB95F678D85207691BFDAB811:\ 000000000000000000000000000040000000000000000000 00000000000000000000000000000000:463F1FCDF4A918300A93D7BED72F788B:\ 000000000000000000000000000020000000000000000000 00000000000000000000000000000000:CA5C88802CF0520C6521B106F4A58977:\ 000000000000000000000000000010000000000000000000 00000000000000000000000000000000:95C83D16F101B16E82D9DF9108A6805A:\ 000000000000000000000000000008000000000000000000 00000000000000000000000000000000:F98E0BE43F35A4CD52F93FD0877C1638:\ 000000000000000000000000000004000000000000000000 00000000000000000000000000000000:3B0D41F3A12DE6BDACFCA225F1344D77:\ 000000000000000000000000000002000000000000000000 00000000000000000000000000000000:BCB6197992A90A62497B53EC8E7E5857:\ 000000000000000000000000000001000000000000000000 00000000000000000000000000000000:9CA86B881701310C33F6CB2911ED777E:\ 000000000000000000000000000000800000000000000000 00000000000000000000000000000000:DDF4EBC89B16643E7B4F0B43AB3FC443:\ 000000000000000000000000000000400000000000000000 00000000000000000000000000000000:650AA74CDF7C5E92720E02A87ECA8FB2:\ 000000000000000000000000000000200000000000000000 00000000000000000000000000000000:F44E947B2A18F15189884E55EAC372CD:\ 000000000000000000000000000000100000000000000000 00000000000000000000000000000000:A4CC79AB8F6ABA941D400B45C32DA248:\ 000000000000000000000000000000080000000000000000 00000000000000000000000000000000:3C49EE1D3E4D8FD1E5CE9C793511F2E7:\ 000000000000000000000000000000040000000000000000 00000000000000000000000000000000:49199A91A32424357890F5C8E08E168C:\ 000000000000000000000000000000020000000000000000 00000000000000000000000000000000:438EBCC76304C4231DCDBDF85A876A85:\ 000000000000000000000000000000010000000000000000 00000000000000000000000000000000:DD04C176440BBC6686C90AEE775BD368:\ 000000000000000000000000000000008000000000000000 00000000000000000000000000000000:1DBAE21DF9D10630D8E9BA704AA3A6E2:\ 000000000000000000000000000000004000000000000000 00000000000000000000000000000000:F46B5DF361FF1A58AD233A2884E9B73B:\ 000000000000000000000000000000002000000000000000 00000000000000000000000000000000:DBD49C75B6CCA6CCEF0423FF3941922A:\ 000000000000000000000000000000001000000000000000 00000000000000000000000000000000:2C62774D20D574A487057A24280EBBC9:\ 000000000000000000000000000000000800000000000000 00000000000000000000000000000000:A6E24FFF68DF51B5613692D4098F7E22:\ 000000000000000000000000000000000400000000000000 00000000000000000000000000000000:A961B427D5FCD129EE29830DBD2952DD:\ 000000000000000000000000000000000200000000000000 00000000000000000000000000000000:7F637C136F8A57358DD5229B5E3BC38C:\ 000000000000000000000000000000000100000000000000 00000000000000000000000000000000:6FC5A39B35D2EF01B808E20C05DB9DDE:\ 000000000000000000000000000000000080000000000000 00000000000000000000000000000000:95E085E82A0883C8F6C1C83D6F4DF270:\ 000000000000000000000000000000000040000000000000 00000000000000000000000000000000:BDEE30731D4CD3593E46D9A8222485CC:\ 000000000000000000000000000000000020000000000000 00000000000000000000000000000000:508B5BB4ECCE303014D5A9ABB47DD30D:\ 000000000000000000000000000000000010000000000000 00000000000000000000000000000000:047832614B07AEABC28A39D5E72007C9:\ 000000000000000000000000000000000008000000000000 00000000000000000000000000000000:C1D4B662EE239A6DB9262B23C561B677:\ 000000000000000000000000000000000004000000000000 00000000000000000000000000000000:E567714DF47D43F1505D318C8D553062:\ 000000000000000000000000000000000002000000000000 00000000000000000000000000000000:CDF70F29AFD13EC6820D2C126D053DC4:\ 000000000000000000000000000000000001000000000000 00000000000000000000000000000000:182F2FD0ADC68D8DC72B08AC17E642C1:\ 000000000000000000000000000000000000800000000000 00000000000000000000000000000000:5DAA43AFBCD59026C0C410072A263673:\ 000000000000000000000000000000000000400000000000 00000000000000000000000000000000:E0C6DD7A8971A7D21AFAE153F115D658:\ 000000000000000000000000000000000000200000000000 00000000000000000000000000000000:4ED2DAA970922690D8CDF6CDFDA2E8D3:\ 000000000000000000000000000000000000100000000000 00000000000000000000000000000000:C1F929B679E007B1DDBBE896CE91C8C5:\ 000000000000000000000000000000000000080000000000 00000000000000000000000000000000:2323F5569BA740E14E05E0FB0914CE44:\ 000000000000000000000000000000000000040000000000 00000000000000000000000000000000:875AFCE0522E00712AB29E0E77BA57D2:\ 000000000000000000000000000000000000020000000000 00000000000000000000000000000000:A6185ECBDEFEB900335BAB38D95D7583:\ 000000000000000000000000000000000000010000000000 00000000000000000000000000000000:1331B89B377EA2A88A181907300BC50C:\ 000000000000000000000000000000000000008000000000 00000000000000000000000000000000:FC9D177C5B5D072E041D6C2F9EE6B536:\ 000000000000000000000000000000000000004000000000 00000000000000000000000000000000:5BCE1EA4FD0CC1EDE325DCEB55790565:\ 000000000000000000000000000000000000002000000000 00000000000000000000000000000000:937FE02D20FCB72F0F57201012B88BA4:\ 000000000000000000000000000000000000001000000000 00000000000000000000000000000000:5280E7768E573DC74DB90ABDC10422FE:\ 000000000000000000000000000000000000000800000000 00000000000000000000000000000000:0995E2D8E83C853C58ECF916E8067C3A:\ 000000000000000000000000000000000000000400000000 00000000000000000000000000000000:98DF44D404B5BD54CA5D55D08E7F1B12:\ 000000000000000000000000000000000000000200000000 00000000000000000000000000000000:9FD5F1165CD60FA5229CF03080428664:\ 000000000000000000000000000000000000000100000000 00000000000000000000000000000000:B4AE95212E3E8FFD6B27D4F0CC079CCA:\ 000000000000000000000000000000000000000080000000 00000000000000000000000000000000:878BD051874AB0BAC12EA94C60CC2671:\ 000000000000000000000000000000000000000040000000 00000000000000000000000000000000:3B0F2EF2A0849425063F49E65DF4D3AB:\ 000000000000000000000000000000000000000020000000 00000000000000000000000000000000:07D4297668485EBBF0F9266C203407E2:\ 000000000000000000000000000000000000000010000000 00000000000000000000000000000000:C2ECFB79C073BD453BDD2323C77FF80D:\ 000000000000000000000000000000000000000008000000 00000000000000000000000000000000:5173B04FC7C211CA17161164B79D0AE7:\ 000000000000000000000000000000000000000004000000 00000000000000000000000000000000:5135A445A721783AACD06930D39F72C4:\ 000000000000000000000000000000000000000002000000 00000000000000000000000000000000:A511E849B1B75DC94B1D73D957B53D78:\ 000000000000000000000000000000000000000001000000 00000000000000000000000000000000:42312B67F192D72B73689C712D60EAB7:\ 000000000000000000000000000000000000000000800000 00000000000000000000000000000000:30C89A160855BC3F339A170B715DD482:\ 000000000000000000000000000000000000000000400000 00000000000000000000000000000000:8DC19A7A97319A3309B98797A59954FA:\ 000000000000000000000000000000000000000000200000 00000000000000000000000000000000:D0AA5A8B9DFF98E18281E5FF20CCA3DE:\ 000000000000000000000000000000000000000000100000 00000000000000000000000000000000:AFA70EF4B45EA22E90108B834019120A:\ 000000000000000000000000000000000000000000080000 00000000000000000000000000000000:2801C6A5C0547CB988A2137A559D12B0:\ 000000000000000000000000000000000000000000040000 00000000000000000000000000000000:D791F5709D4AFE0642955F1B072F144E:\ 000000000000000000000000000000000000000000020000 00000000000000000000000000000000:35BB50E6D59A693709DE9B88CC8581F6:\ 000000000000000000000000000000000000000000010000 00000000000000000000000000000000:9B58CC95279539C1AF0BBC274A62F5C8:\ 000000000000000000000000000000000000000000008000 00000000000000000000000000000000:F51803FF4EA1B0F0AFF1C68C5C98CB3A:\ 000000000000000000000000000000000000000000004000 00000000000000000000000000000000:975B5309F1D3ACE9BA08B3D2D3FCB43E:\ 000000000000000000000000000000000000000000002000 00000000000000000000000000000000:D53CD9381EA85B0C106C22DA611F7336:\ 000000000000000000000000000000000000000000001000 00000000000000000000000000000000:393270B47546F1BFE35690ACCAC0FEBD:\ 000000000000000000000000000000000000000000000800 00000000000000000000000000000000:53E21284948996FC03ED9BCC34B45B61:\ 000000000000000000000000000000000000000000000400 00000000000000000000000000000000:AD9CA2740670DA740C75703A8859382B:\ 000000000000000000000000000000000000000000000200 00000000000000000000000000000000:AC9C2960E3061E56D8B9A1CDD3EED010:\ 000000000000000000000000000000000000000000000100 00000000000000000000000000000000:E5F68B122D15823F131DEA0468977D70:\ 000000000000000000000000000000000000000000000080 00000000000000000000000000000000:7EB7C6460FE9885BC96AFD4D4B65E90E:\ 000000000000000000000000000000000000000000000040 00000000000000000000000000000000:409147483ADC22592CA41224D35BB323:\ 000000000000000000000000000000000000000000000020 00000000000000000000000000000000:AB61745316651F61F4E2CC1DFBF8135C:\ 000000000000000000000000000000000000000000000010 00000000000000000000000000000000:88977EAD91ECF9C83F33EBE41FB7410C:\ 000000000000000000000000000000000000000000000008 00000000000000000000000000000000:9DC923136A1882D73CB412C986103481:\ 000000000000000000000000000000000000000000000004 00000000000000000000000000000000:9914219ED77B8FA772B4B8C53F9AD2FC:\ 000000000000000000000000000000000000000000000002 00000000000000000000000000000000:B9A0FA2324625650A2052D691E7DE9C3:\ 000000000000000000000000000000000000000000000001 00000000000000000000000000000000:5172978A58543DE597060983FD799F1B:\ 8000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0F86AECE7ACE09A8EAC0345C935BE91A:\ 4000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8C8D6ACDB23AE4B5BEE4E2C15273286F:\ 2000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:11395D4BFE4C8258979EE2BF2D24DFF4:\ 1000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D50183337FD8B3FAEF06C78B2ECFC40F:\ 0800000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F3969970B4E37D9FFD9BD886200D7C0F:\ 0400000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:FF101A14CCB71863E0B51E8583D22760:\ 0200000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0CACB5AB8A51226134656220DBF23228:\ 0100000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:BF75C54F53A3F374DC549BE280F6C6E0:\ 0080000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1DC755ED6128DC50826E65632C7672D6:\ 0040000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D7A46C3A378DB6A9C041D7DB1835DE3F:\ 0020000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:175FDB12EFB7E7D950777FE12BAAC953:\ 0010000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1A5C489CB6E0608EADAF3DBFA8B5FD1B:\ 0008000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7FD567FB07007A65CA8D98D4BF66F7F1:\ 0004000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3256E4481641ED28938AD6471414CD04:\ 0002000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A2AD960B437DCD0669681BBBC30F0CF1:\ 0001000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:FB04B658FA923EA9CD5FB98BE54989DE:\ 0000800000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F3F43741881655CF074E36BD655F420B:\ 0000400000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:637DCF9D891EAD8D85A842BE0DC8261F:\ 0000200000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E663749A2786E3BA3833348A9CE5E7F0:\ 0000100000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:76F0F7C439E25C54A9BC7AEA05640882:\ 0000080000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:2CDE682FC40895F1E2464739FAD230DD:\ 0000040000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3242FE919ADFDCE04F163EBE772AD51D:\ 0000020000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CE05F79A80B2947B13BD22EE37FB3F79:\ 0000010000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:5345BDE33281A0CB4A899A4F18C57563:\ 0000008000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:2E971691DDFD33D36738C08A517B0B44:\ 0000004000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:EE144813E2194B18F1593C44932F170F:\ 0000002000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F626C435E30ABA4FA6F6DCA30CC08833:\ 0000001000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8AD30F69BD7446793C36676755D05F57:\ 0000000800000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:56851CB7277CBE4AE9AFF86E5BD49F90:\ 0000000400000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CA864AC764D6B9B9141A08146CFA7F56:\ 0000000200000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:484518D9A3C6CF7B7B92393DBBF78E42:\ 0000000100000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:093F44542B0E41E300C11AE77A48C6C4:\ 0000000080000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:6D9856ADC56605F70EF069D639C9D977:\ 0000000040000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3FFB2FF7C5457744CABDFB89C0BBA7E8:\ 0000000020000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:6D8254191931BE754D64F70FE3E226C7:\ 0000000010000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:23F3CC55C460EE949A9934C7E5C06CCB:\ 0000000008000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8739DA7F4A9D821EAA7A349E25741DAA:\ 0000000004000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:73E724C08890501275A0559621526948:\ 0000000002000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4CC6569D4F6207DDB03B232BFA8AA481:\ 0000000001000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:52A6D921AEF99205822B361D8D9DD998:\ 0000000000800000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:970E1899AEEEB7CCD26F854CA25214E2:\ 0000000000400000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D1DEFC8AC21C95160CF71612AAC55A8C:\ 0000000000200000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D8C2A3AD65F16024265714C21B8A70C5:\ 0000000000100000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:55DE20482FAE35A03F0D57B7546EB980:\ 0000000000080000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:81BCA41F11D12EE26326E042E74961AF:\ 0000000000040000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:6D8D5C30A508436401396224D4E417B5:\ 0000000000020000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0FA1ECAB0B3C598C51372A5AAF6E1315:\ 0000000000010000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:945BF2690A9CE9ED8009004039E1E743:\ 0000000000008000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:73618AD5FD3A9740CB92C3F870C772B9:\ 0000000000004000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A7BAB4D0765D66F06FCB85A42D4CF0EE:\ 0000000000002000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:2A659EA8BF9EA163976C33A0B7463A56:\ 0000000000001000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4D9D5CC19BF1B2D48EF2CF4CD313D3E3:\ 0000000000000800000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0D7A26F850BDD2A633689367901BC2A4:\ 0000000000000400000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1A1235352EC6CD1A7A1913E77EF7CE4D:\ 0000000000000200000000000000000000000000000000000000000000000000 00000000000000000000000000000000:5FDC541376BAF15D5AC011B9C0B74E75:\ 0000000000000100000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CB8DCB7AD04598E8337747E02A8DF16E:\ 0000000000000080000000000000000000000000000000000000000000000000 00000000000000000000000000000000:2855A6EEA8B20B8B25EDEE37A7D7E976:\ 0000000000000040000000000000000000000000000000000000000000000000 00000000000000000000000000000000:58B5CD00D833233E718DBEAABCC48E8F:\ 0000000000000020000000000000000000000000000000000000000000000000 00000000000000000000000000000000:6DF58A11F96B67C330ED10FFFB1E6D74:\ 0000000000000010000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8FD74AAB8D136DCF1B398D1174AA343B:\ 0000000000000008000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A81E2F57E80761E361DB1008AC1ABDD8:\ 0000000000000004000000000000000000000000000000000000000000000000 00000000000000000000000000000000:BDD939E7A93F6FECC762E2E3321DFEC7:\ 0000000000000002000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C281060452693278B48AD9076911EC39:\ 0000000000000001000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C06C159EEAFF3CB4B509DB604060F537:\ 0000000000000000800000000000000000000000000000000000000000000000 00000000000000000000000000000000:757CED2216A9912B5FBFA1E623077E5D:\ 0000000000000000400000000000000000000000000000000000000000000000 00000000000000000000000000000000:9606EDC198F44F955F510FA525E9C80C:\ 0000000000000000200000000000000000000000000000000000000000000000 00000000000000000000000000000000:ADE8D3FAE7A4651855E053F42FFF7905:\ 0000000000000000100000000000000000000000000000000000000000000000 00000000000000000000000000000000:398BA679B6C0A63479F0C6FE25614F01:\ 0000000000000000080000000000000000000000000000000000000000000000 00000000000000000000000000000000:FB77ECA9DEF62902240E4BF3806F3A64:\ 0000000000000000040000000000000000000000000000000000000000000000 00000000000000000000000000000000:B4313D0A9D34B21F69021A5458680579:\ 0000000000000000020000000000000000000000000000000000000000000000 00000000000000000000000000000000:BDC7C4ED3B989BF8288E8B4ACDE3FEEA:\ 0000000000000000010000000000000000000000000000000000000000000000 00000000000000000000000000000000:430A2DAFFA822532FD4843DF9CBAF824:\ 0000000000000000008000000000000000000000000000000000000000000000 00000000000000000000000000000000:16A2DEBA266577150B6DC34995902C99:\ 0000000000000000004000000000000000000000000000000000000000000000 00000000000000000000000000000000:5902382C7675AF5C52A6ADF349454276:\ 0000000000000000002000000000000000000000000000000000000000000000 00000000000000000000000000000000:0D912AA37CFB56223C6ED9E04B3D563F:\ 0000000000000000001000000000000000000000000000000000000000000000 00000000000000000000000000000000:1FD8880BE6A6E51C0C0E9C2866127F7D:\ 0000000000000000000800000000000000000000000000000000000000000000 00000000000000000000000000000000:BC4079EE5CDB86BDD8FAE650E2931D98:\ 0000000000000000000400000000000000000000000000000000000000000000 00000000000000000000000000000000:C52E414FC84C978FAD8CFA103844C306:\ 0000000000000000000200000000000000000000000000000000000000000000 00000000000000000000000000000000:DF6291B74EF77E82A8FB7C207213125F:\ 0000000000000000000100000000000000000000000000000000000000000000 00000000000000000000000000000000:530424A0F23CD90074F2D672A4FF3A96:\ 0000000000000000000080000000000000000000000000000000000000000000 00000000000000000000000000000000:83ED777537F5EE3E5769B8A07476A6AB:\ 0000000000000000000040000000000000000000000000000000000000000000 00000000000000000000000000000000:5357341784EAB13F104FBAEFC69B726B:\ 0000000000000000000020000000000000000000000000000000000000000000 00000000000000000000000000000000:6DBACA4C68AD93373CBEB1DB0963F33F:\ 0000000000000000000010000000000000000000000000000000000000000000 00000000000000000000000000000000:EFA128916DF70D852574EC8507625CC8:\ 0000000000000000000008000000000000000000000000000000000000000000 00000000000000000000000000000000:0BD55284AC672E1A2F248FB89C22B514:\ 0000000000000000000004000000000000000000000000000000000000000000 00000000000000000000000000000000:E3222E0E2770496C443ED562ECBFC368:\ 0000000000000000000002000000000000000000000000000000000000000000 00000000000000000000000000000000:6B689B6DB9374E072B45A7807DAAB132:\ 0000000000000000000001000000000000000000000000000000000000000000 00000000000000000000000000000000:3215A725BCFBB120926F8BBCE41FC3EC:\ 0000000000000000000000800000000000000000000000000000000000000000 00000000000000000000000000000000:F2475FE25BEF963862CF66C91DA0250B:\ 0000000000000000000000400000000000000000000000000000000000000000 00000000000000000000000000000000:5E1CC549BB39348529FD279DFE5E1FFC:\ 0000000000000000000000200000000000000000000000000000000000000000 00000000000000000000000000000000:1A8EDD22AA0FE906267DF710DE8DB007:\ 0000000000000000000000100000000000000000000000000000000000000000 00000000000000000000000000000000:EE139CE12F8205D4EECCE6D7FD23B01F:\ 0000000000000000000000080000000000000000000000000000000000000000 00000000000000000000000000000000:FD84D87207D7BE3A79272CC9DF65E1E6:\ 0000000000000000000000040000000000000000000000000000000000000000 00000000000000000000000000000000:CE01B0EEA6BF6D981AFFB07FE1DD164E:\ 0000000000000000000000020000000000000000000000000000000000000000 00000000000000000000000000000000:1BCCA9BD22179B1C941947643FB01F0F:\ 0000000000000000000000010000000000000000000000000000000000000000 00000000000000000000000000000000:87A581347DF02FF9973A0622DF673804:\ 0000000000000000000000008000000000000000000000000000000000000000 00000000000000000000000000000000:1EDEB75B65B365582AB5AA265037FA55:\ 0000000000000000000000004000000000000000000000000000000000000000 00000000000000000000000000000000:807DD7E0418803258EF677BA9345CF51:\ 0000000000000000000000002000000000000000000000000000000000000000 00000000000000000000000000000000:70CE90D345621481A99DC8EE1A62DCD5:\ 0000000000000000000000001000000000000000000000000000000000000000 00000000000000000000000000000000:BB51E835284E0F7B74C053151F07D207:\ 0000000000000000000000000800000000000000000000000000000000000000 00000000000000000000000000000000:0240317EC3AFA5D4610C545C0D507367:\ 0000000000000000000000000400000000000000000000000000000000000000 00000000000000000000000000000000:9B77B76CA91662A9CB067267F0560C65:\ 0000000000000000000000000200000000000000000000000000000000000000 00000000000000000000000000000000:2219ED37D533B05CDC20B16F45D3DBD9:\ 0000000000000000000000000100000000000000000000000000000000000000 00000000000000000000000000000000:BC5A33AF9E4591BD4CF53B20728C3F85:\ 0000000000000000000000000080000000000000000000000000000000000000 00000000000000000000000000000000:68628B89F58C20E5195DB795C0A41489:\ 0000000000000000000000000040000000000000000000000000000000000000 00000000000000000000000000000000:5D177DE234B6288510163F2351750215:\ 0000000000000000000000000020000000000000000000000000000000000000 00000000000000000000000000000000:6015D7BA2F33B88B2BE0016E022E05FE:\ 0000000000000000000000000010000000000000000000000000000000000000 00000000000000000000000000000000:2D203E35B97E3B315C17D9F0F80ACDA0:\ 0000000000000000000000000008000000000000000000000000000000000000 00000000000000000000000000000000:E5800AF9BF96D6B7ED3A2AED899CA456:\ 0000000000000000000000000004000000000000000000000000000000000000 00000000000000000000000000000000:1163E6F8F1DE919686C138089EFA7986:\ 0000000000000000000000000002000000000000000000000000000000000000 00000000000000000000000000000000:2180B46E9EAC63A165BE63DAE17889A4:\ 0000000000000000000000000001000000000000000000000000000000000000 00000000000000000000000000000000:3D751DC36B1046AC808D8275B48697AC:\ 0000000000000000000000000000800000000000000000000000000000000000 00000000000000000000000000000000:DF022C5EFCEB5D3FE7E72DDF11D16EA3:\ 0000000000000000000000000000400000000000000000000000000000000000 00000000000000000000000000000000:C706AB7A20E0D038143B78D9D12EC1A4:\ 0000000000000000000000000000200000000000000000000000000000000000 00000000000000000000000000000000:8AFB006F196B00DAE7F0B36C9E88A3B9:\ 0000000000000000000000000000100000000000000000000000000000000000 00000000000000000000000000000000:BED70262ED524A5C6A495092E2543993:\ 0000000000000000000000000000080000000000000000000000000000000000 00000000000000000000000000000000:088A58A7351C7A7AF594035514DE0757:\ 0000000000000000000000000000040000000000000000000000000000000000 00000000000000000000000000000000:F5DF0BB68AB377B12321365C05480EA8:\ 0000000000000000000000000000020000000000000000000000000000000000 00000000000000000000000000000000:512DC8D603A7E4C8031D3566F141B233:\ 0000000000000000000000000000010000000000000000000000000000000000 00000000000000000000000000000000:50342EA0E9E81EC53E3683C8C1471602:\ 0000000000000000000000000000008000000000000000000000000000000000 00000000000000000000000000000000:8AAB01E320B17FD9945D725F5EA904BA:\ 0000000000000000000000000000004000000000000000000000000000000000 00000000000000000000000000000000:76FB320065713C165DECBE5DAFDD79BD:\ 0000000000000000000000000000002000000000000000000000000000000000 00000000000000000000000000000000:A8AD014D22CD8FCC9557438B8228253A:\ 0000000000000000000000000000001000000000000000000000000000000000 00000000000000000000000000000000:6017A9EB6F3336882FCCEDEC746C62F6:\ 0000000000000000000000000000000800000000000000000000000000000000 00000000000000000000000000000000:2EDF94990EB0F4BAFE1F5903102FE874:\ 0000000000000000000000000000000400000000000000000000000000000000 00000000000000000000000000000000:4EC81B0FA8FAE0025AF09D26F1F200EA:\ 0000000000000000000000000000000200000000000000000000000000000000 00000000000000000000000000000000:AF7F474333E74691E5D01A3A841F8096:\ 0000000000000000000000000000000100000000000000000000000000000000 00000000000000000000000000000000:28FCE531836F2A255CA19DE6F53841E8:\ 0000000000000000000000000000000080000000000000000000000000000000 00000000000000000000000000000000:6282A41053316B1A4027488E6F747003:\ 0000000000000000000000000000000040000000000000000000000000000000 00000000000000000000000000000000:3668527987AC38A3F7C052A20B668F24:\ 0000000000000000000000000000000020000000000000000000000000000000 00000000000000000000000000000000:4C3473FE666072653E29354F07EF02B5:\ 0000000000000000000000000000000010000000000000000000000000000000 00000000000000000000000000000000:0A51D7A5B347225798EDE5663940F32F:\ 0000000000000000000000000000000008000000000000000000000000000000 00000000000000000000000000000000:D3CA3A8821A3D094CF63CF12136A1249:\ 0000000000000000000000000000000004000000000000000000000000000000 00000000000000000000000000000000:FBC5E4B37A69AD5F21E53F88E55AB95D:\ 0000000000000000000000000000000002000000000000000000000000000000 00000000000000000000000000000000:CCCAAA0A2DEFD357EE31C2CFEC9D0E8E:\ 0000000000000000000000000000000001000000000000000000000000000000 00000000000000000000000000000000:93348B5393560AA416C6E6F0C99A58F7:\ 0000000000000000000000000000000000800000000000000000000000000000 00000000000000000000000000000000:13AC66E49E23A8D3582AA7117F7A8F2F:\ 0000000000000000000000000000000000400000000000000000000000000000 00000000000000000000000000000000:C403AD02F23055CEE08281E7D0C7EB2A:\ 0000000000000000000000000000000000200000000000000000000000000000 00000000000000000000000000000000:65DFD53B699B191CE7A6610A405083DC:\ 0000000000000000000000000000000000100000000000000000000000000000 00000000000000000000000000000000:3D6F7E99F6512553BB983E8F75672B97:\ 0000000000000000000000000000000000080000000000000000000000000000 00000000000000000000000000000000:92BA0D580A954F8C8494A840F0252AEF:\ 0000000000000000000000000000000000040000000000000000000000000000 00000000000000000000000000000000:958D8C9141CE21DBD69E19BA1E4F67AA:\ 0000000000000000000000000000000000020000000000000000000000000000 00000000000000000000000000000000:E508796197F539FCDC917ECAB19507E0:\ 0000000000000000000000000000000000010000000000000000000000000000 00000000000000000000000000000000:2200A6914A2050E99A55FB3BF20315E4:\ 0000000000000000000000000000000000008000000000000000000000000000 00000000000000000000000000000000:627C0B2401EE6C095404CD7AA59EA67E:\ 0000000000000000000000000000000000004000000000000000000000000000 00000000000000000000000000000000:75159B707278DFE6FD8A024B9FF0D5A8:\ 0000000000000000000000000000000000002000000000000000000000000000 00000000000000000000000000000000:F47982BE40C39306ACF25A120BC1B4E0:\ 0000000000000000000000000000000000001000000000000000000000000000 00000000000000000000000000000000:01CAABEF85A1E081EA6983079A90EA34:\ 0000000000000000000000000000000000000800000000000000000000000000 00000000000000000000000000000000:7F473CD21A453BF74CC76184D6F5496F:\ 0000000000000000000000000000000000000400000000000000000000000000 00000000000000000000000000000000:659442FD57B94862529D3E4C530826FE:\ 0000000000000000000000000000000000000200000000000000000000000000 00000000000000000000000000000000:88A9140C094A695716A2966B1A8078A0:\ 0000000000000000000000000000000000000100000000000000000000000000 00000000000000000000000000000000:28CCFC1BB6180AA7373DA1F5A54E47EA:\ 0000000000000000000000000000000000000080000000000000000000000000 00000000000000000000000000000000:53DFD8CB845FD279B337B52DBBA3CF4C:\ 0000000000000000000000000000000000000040000000000000000000000000 00000000000000000000000000000000:1BB5B100DFE6BA16983AD4A0F09FD50B:\ 0000000000000000000000000000000000000020000000000000000000000000 00000000000000000000000000000000:A896AE30D529D4ACFFCF5B763309CD28:\ 0000000000000000000000000000000000000010000000000000000000000000 00000000000000000000000000000000:F40A1B359A9B6B1197276C71222371F4:\ 0000000000000000000000000000000000000008000000000000000000000000 00000000000000000000000000000000:9FDE11C9E6CF9A1E9089820FD928767C:\ 0000000000000000000000000000000000000004000000000000000000000000 00000000000000000000000000000000:7771A5A99B099A2C861D084E790958A2:\ 0000000000000000000000000000000000000002000000000000000000000000 00000000000000000000000000000000:BE1907AA5CA148A0282850401C48AF71:\ 0000000000000000000000000000000000000001000000000000000000000000 00000000000000000000000000000000:8E47D50827FD36B62C0D3BD36F863198:\ 0000000000000000000000000000000000000000800000000000000000000000 00000000000000000000000000000000:81AA1751209F9173258CD1625DB65E07:\ 0000000000000000000000000000000000000000400000000000000000000000 00000000000000000000000000000000:1EE8FE72574BD819C97A0DEA2A5E0B64:\ 0000000000000000000000000000000000000000200000000000000000000000 00000000000000000000000000000000:031BA0B3EFCAE9B08793C8107C277A27:\ 0000000000000000000000000000000000000000100000000000000000000000 00000000000000000000000000000000:34C8DFD0DC4BA5240CA21BF4959EEF6B:\ 0000000000000000000000000000000000000000080000000000000000000000 00000000000000000000000000000000:C7A4DA0D5892A185D35447DB904511B5:\ 0000000000000000000000000000000000000000040000000000000000000000 00000000000000000000000000000000:7A8B9982B6C8AE1B5DC02FC1D9AFA2E0:\ 0000000000000000000000000000000000000000020000000000000000000000 00000000000000000000000000000000:C77E0DFB29402C587C6DD97E0BD09ABA:\ 0000000000000000000000000000000000000000010000000000000000000000 00000000000000000000000000000000:1AA2FD990BD0B0715B18482088DE0844:\ 0000000000000000000000000000000000000000008000000000000000000000 00000000000000000000000000000000:31C2D486FDA54BAB4286A02D260918AC:\ 0000000000000000000000000000000000000000004000000000000000000000 00000000000000000000000000000000:545F5A95E159B5F0DDF544B60F9C28C3:\ 0000000000000000000000000000000000000000002000000000000000000000 00000000000000000000000000000000:45C84895AF0393588C67D9CDD5E4D7E2:\ 0000000000000000000000000000000000000000001000000000000000000000 00000000000000000000000000000000:745BF4AF94A92D32FFE44B41AEF39320:\ 0000000000000000000000000000000000000000000800000000000000000000 00000000000000000000000000000000:13C47C2F92F91D72F34381AC9A81473D:\ 0000000000000000000000000000000000000000000400000000000000000000 00000000000000000000000000000000:8836D5AA076110FCD5BD66F3BECB39F6:\ 0000000000000000000000000000000000000000000200000000000000000000 00000000000000000000000000000000:11EDE6F221E96C7515B1256DF055FBC3:\ 0000000000000000000000000000000000000000000100000000000000000000 00000000000000000000000000000000:4E3BE7D6830703A6185CF0BDBE7F5BE4:\ 0000000000000000000000000000000000000000000080000000000000000000 00000000000000000000000000000000:6A1ABDA47972CFF536946A1C7D380810:\ 0000000000000000000000000000000000000000000040000000000000000000 00000000000000000000000000000000:74031DB865D2FC8319A320FFAC4694D8:\ 0000000000000000000000000000000000000000000020000000000000000000 00000000000000000000000000000000:E1F751F11027548C057075E8D8F880EA:\ 0000000000000000000000000000000000000000000010000000000000000000 00000000000000000000000000000000:AF24FA74CA96D89088C9018AA60E1D53:\ 0000000000000000000000000000000000000000000008000000000000000000 00000000000000000000000000000000:0E5214D31B2C9219F6C9686A35F210FF:\ 0000000000000000000000000000000000000000000004000000000000000000 00000000000000000000000000000000:2A72E2E692463EE8846C94A483C27E25:\ 0000000000000000000000000000000000000000000002000000000000000000 00000000000000000000000000000000:2B9C3298626F11072D7B1D80B47A841F:\ 0000000000000000000000000000000000000000000001000000000000000000 00000000000000000000000000000000:7468CAA1A5FFC828BE5A752C33132E90:\ 0000000000000000000000000000000000000000000000800000000000000000 00000000000000000000000000000000:29C75ADD5EDE2680C169FF9FD9177331:\ 0000000000000000000000000000000000000000000000400000000000000000 00000000000000000000000000000000:9BA78930CDD3357A2D84A49725902E8F:\ 0000000000000000000000000000000000000000000000200000000000000000 00000000000000000000000000000000:F190AC4C43E202F925B5FD1E4CA62DD6:\ 0000000000000000000000000000000000000000000000100000000000000000 00000000000000000000000000000000:5716FB34A1A6B40C35B2BA860F12163E:\ 0000000000000000000000000000000000000000000000080000000000000000 00000000000000000000000000000000:43B90548889A171E85515AB05EC76856:\ 0000000000000000000000000000000000000000000000040000000000000000 00000000000000000000000000000000:B4DE6F86875147F5276D584CEC11AFB4:\ 0000000000000000000000000000000000000000000000020000000000000000 00000000000000000000000000000000:3DA6C1A8937583BF6491B2E9C52081E6:\ 0000000000000000000000000000000000000000000000010000000000000000 00000000000000000000000000000000:9A54FCD26D9754ADD5F8967EF551EAB0:\ 0000000000000000000000000000000000000000000000008000000000000000 00000000000000000000000000000000:F0DCFA56A7E41A859276A6F8927B561D:\ 0000000000000000000000000000000000000000000000004000000000000000 00000000000000000000000000000000:5881A8AE181F16B64CD0C455389F511C:\ 0000000000000000000000000000000000000000000000002000000000000000 00000000000000000000000000000000:E9F7AD45D9EA9AA4C830B89EEC61C1B5:\ 0000000000000000000000000000000000000000000000001000000000000000 00000000000000000000000000000000:9118B623A63BFC69A9AAB868D752460B:\ 0000000000000000000000000000000000000000000000000800000000000000 00000000000000000000000000000000:2D208D46FB2177C243C539FCCD4A1E9D:\ 0000000000000000000000000000000000000000000000000400000000000000 00000000000000000000000000000000:2A4F52A297F20E428222008D9BE4A23B:\ 0000000000000000000000000000000000000000000000000200000000000000 00000000000000000000000000000000:EBCFDD28550C9654374590EC4BFD1CDC:\ 0000000000000000000000000000000000000000000000000100000000000000 00000000000000000000000000000000:FABB99266FC741241F6CFC0CED776A11:\ 0000000000000000000000000000000000000000000000000080000000000000 00000000000000000000000000000000:FBDEC944B2303E3A08A964E24130D10D:\ 0000000000000000000000000000000000000000000000000040000000000000 00000000000000000000000000000000:9897E33E6052ABA1F07233BCEF531E32:\ 0000000000000000000000000000000000000000000000000020000000000000 00000000000000000000000000000000:509DCA41B038225B30D8B7880D52999D:\ 0000000000000000000000000000000000000000000000000010000000000000 00000000000000000000000000000000:3F70238F99F2AF394C31308D68F1707C:\ 0000000000000000000000000000000000000000000000000008000000000000 00000000000000000000000000000000:E6FF6426E9025DD6519837F71A6C3636:\ 0000000000000000000000000000000000000000000000000004000000000000 00000000000000000000000000000000:F222502AEF77C1F21DB79B08F7AB8CA2:\ 0000000000000000000000000000000000000000000000000002000000000000 00000000000000000000000000000000:C17D2C00477C1AA20B539BE8174E7202:\ 0000000000000000000000000000000000000000000000000001000000000000 00000000000000000000000000000000:0F7B12AE962AF9C0C8CDCAA288FC6E12:\ 0000000000000000000000000000000000000000000000000000800000000000 00000000000000000000000000000000:0E740EE58431521A622122AEFB163CE2:\ 0000000000000000000000000000000000000000000000000000400000000000 00000000000000000000000000000000:CF0B94FECAC6F67070306654FE198449:\ 0000000000000000000000000000000000000000000000000000200000000000 00000000000000000000000000000000:604EA1D0711ACB8E545C0A88976008F9:\ 0000000000000000000000000000000000000000000000000000100000000000 00000000000000000000000000000000:71D03D8F6F917FDF5B612180454F3699:\ 0000000000000000000000000000000000000000000000000000080000000000 00000000000000000000000000000000:A6BCFE7B73EDCE71DB36AF00B01C37EC:\ 0000000000000000000000000000000000000000000000000000040000000000 00000000000000000000000000000000:93D761851BB991221AE77968459787DD:\ 0000000000000000000000000000000000000000000000000000020000000000 00000000000000000000000000000000:F117E4D5C88CC1C067C88AE38A5BF1D5:\ 0000000000000000000000000000000000000000000000000000010000000000 00000000000000000000000000000000:B534328DA555A9B69AC2A5B08E3CE47E:\ 0000000000000000000000000000000000000000000000000000008000000000 00000000000000000000000000000000:7BDFB785D866B6487790B9F6164F5EBD:\ 0000000000000000000000000000000000000000000000000000004000000000 00000000000000000000000000000000:5B3BB41E43D02901F5A0231768347B38:\ 0000000000000000000000000000000000000000000000000000002000000000 00000000000000000000000000000000:917216669DB1600015F2FE7CBDDA0FF4:\ 0000000000000000000000000000000000000000000000000000001000000000 00000000000000000000000000000000:C79B582FC430C0187D7B1D7B1E79BDB9:\ 0000000000000000000000000000000000000000000000000000000800000000 00000000000000000000000000000000:B9A43998AED6BB7B79C91BB4C2530F4E:\ 0000000000000000000000000000000000000000000000000000000400000000 00000000000000000000000000000000:0B24EBDF9A1D129F5E8397AB7412BC74:\ 0000000000000000000000000000000000000000000000000000000200000000 00000000000000000000000000000000:96D523E4EF1C888C72460DEBA8D58B78:\ 0000000000000000000000000000000000000000000000000000000100000000 00000000000000000000000000000000:85708C4539C8B06DD787AFDD06A3FE24:\ 0000000000000000000000000000000000000000000000000000000080000000 00000000000000000000000000000000:67A106762D2F46B7880750BCF987054C:\ 0000000000000000000000000000000000000000000000000000000040000000 00000000000000000000000000000000:8F46E37371E81C389CA94A8272A14FC8:\ 0000000000000000000000000000000000000000000000000000000020000000 00000000000000000000000000000000:92DC700C11BBE46DA9559CAA7BA662F0:\ 0000000000000000000000000000000000000000000000000000000010000000 00000000000000000000000000000000:90D2B52984DA214F392EF4EAC26A04FE:\ 0000000000000000000000000000000000000000000000000000000008000000 00000000000000000000000000000000:832D440D62996C5BFCB7FAA08DEB4D2C:\ 0000000000000000000000000000000000000000000000000000000004000000 00000000000000000000000000000000:69B7F725BA2B0539F6B45F2C8495D571:\ 0000000000000000000000000000000000000000000000000000000002000000 00000000000000000000000000000000:CE78A2AA25F818D87C46367579FAE698:\ 0000000000000000000000000000000000000000000000000000000001000000 00000000000000000000000000000000:F5E3E4DA4FC90F25F7D6679F076CA32E:\ 0000000000000000000000000000000000000000000000000000000000800000 00000000000000000000000000000000:F7618B001BC19F0195BD21021D9545B6:\ 0000000000000000000000000000000000000000000000000000000000400000 00000000000000000000000000000000:D84E1E36E1100913C7AFDBFE5009EDEA:\ 0000000000000000000000000000000000000000000000000000000000200000 00000000000000000000000000000000:9DB2838E3903829913D2AEE6465202FD:\ 0000000000000000000000000000000000000000000000000000000000100000 00000000000000000000000000000000:361AFBF61BDB378CCF2B76C01469BAA2:\ 0000000000000000000000000000000000000000000000000000000000080000 00000000000000000000000000000000:DC4C998046574B4CC447154F663E8EBD:\ 0000000000000000000000000000000000000000000000000000000000040000 00000000000000000000000000000000:0D890EFA71666BE0A38B423BAD47C90F:\ 0000000000000000000000000000000000000000000000000000000000020000 00000000000000000000000000000000:F39C444538E646A2BD59B443F68C51D5:\ 0000000000000000000000000000000000000000000000000000000000010000 00000000000000000000000000000000:9C6D37340E8F5EA22213E17A9F720238:\ 0000000000000000000000000000000000000000000000000000000000008000 00000000000000000000000000000000:3A23813329F978C1C6C3BE1715011283:\ 0000000000000000000000000000000000000000000000000000000000004000 00000000000000000000000000000000:CE24D63AFA37E2A659A21CF770109BB4:\ 0000000000000000000000000000000000000000000000000000000000002000 00000000000000000000000000000000:DF329017478D86B2C360D55BC2B2ADCF:\ 0000000000000000000000000000000000000000000000000000000000001000 00000000000000000000000000000000:BC5EFA1FBF848776746FD7826656E25C:\ 0000000000000000000000000000000000000000000000000000000000000800 00000000000000000000000000000000:A3E4185241C566DD2CF8117D4D7699F4:\ 0000000000000000000000000000000000000000000000000000000000000400 00000000000000000000000000000000:EF7BBDEB18879C11E2979DCC601CB620:\ 0000000000000000000000000000000000000000000000000000000000000200 00000000000000000000000000000000:FDC76A95F9C87E394F82A787D7406D40:\ 0000000000000000000000000000000000000000000000000000000000000100 00000000000000000000000000000000:B224E2BECACF6773B9941516195ED06B:\ 0000000000000000000000000000000000000000000000000000000000000080 00000000000000000000000000000000:B3951D0CF640BB7BD8F3D9948745FF9E:\ 0000000000000000000000000000000000000000000000000000000000000040 00000000000000000000000000000000:F9C8966E2874F736765B89DA10EF4611:\ 0000000000000000000000000000000000000000000000000000000000000020 00000000000000000000000000000000:3750F26BAB98833AB30444C0821A594C:\ 0000000000000000000000000000000000000000000000000000000000000010 00000000000000000000000000000000:D369C2B7C2337D67A87CD5B4EB45D290:\ 0000000000000000000000000000000000000000000000000000000000000008 00000000000000000000000000000000:F3A44B0F53DCC9F79E1AFA8ABB022C84:\ 0000000000000000000000000000000000000000000000000000000000000004 00000000000000000000000000000000:6E47C47F3940D369EC703E974AB350B6:\ 0000000000000000000000000000000000000000000000000000000000000002 00000000000000000000000000000000:1100DE2A57C47C2EB63277537ADE5716:\ 0000000000000000000000000000000000000000000000000000000000000001 # From the NESSIE submission 01010101010101010101010101010101:EFB2C7DD69614683DAB0BC607036C425:\ 01010101010101010101010101010101 02020202020202020202020202020202:A1AE9D211867538B100BD121BA6A3ADC:\ 02020202020202020202020202020202 03030303030303030303030303030303:8E77797CEC40C34AD3A3230975AE760E:\ 03030303030303030303030303030303 04040404040404040404040404040404:91086B2221C3FC8E254A97B611D83239:\ 04040404040404040404040404040404 05050505050505050505050505050505:95CA7F3CA2269A73B4964BD7A6A3DEA0:\ 05050505050505050505050505050505 06060606060606060606060606060606:BD7EB1B707AA5F801070B9C94F64A5C6:\ 06060606060606060606060606060606 07070707070707070707070707070707:37CE0ADCFAA89DD737CB15193DCBA48E:\ 07070707070707070707070707070707 08080808080808080808080808080808:37B6051557E2E535EE8B4955AC5DCB82:\ 08080808080808080808080808080808 09090909090909090909090909090909:33D6A06EB3B16C0C6078BF56F2966AB2:\ 09090909090909090909090909090909 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A:521D3B74BA74D29362708CFE62E357AB:\ 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B:CDD5D57C2ABED59CEACAA9352103751F:\ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C:173D2D1CABD12095742C3045EC50899A:\ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D:A85D680132CCF78F2918A9698D6431D6:\ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E:C8137067650576081E34565121681374:\ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F:EDC375FEF71B83B2BE5187F82D0180EA:\ 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F 10101010101010101010101010101010:54FD2A83F505EE40F4F6F4F94198ED48:\ 10101010101010101010101010101010 11111111111111111111111111111111:10CC2D64A5306366D8D594B8CDB4FBD3:\ 11111111111111111111111111111111 12121212121212121212121212121212:13E3A82E121BC3CCA5C703FCAC451E22:\ 12121212121212121212121212121212 13131313131313131313131313131313:1D8753BFF6930FA77FD7819F5935C422:\ 13131313131313131313131313131313 14141414141414141414141414141414:A6FF617A5D0395407BEEC3A311A0CBCB:\ 14141414141414141414141414141414 15151515151515151515151515151515:034D4716AC68312E05C9497E9FC9430A:\ 15151515151515151515151515151515 16161616161616161616161616161616:690D68007F51E2E8C9516EF9EE64F85D:\ 16161616161616161616161616161616 17171717171717171717171717171717:EF1396B41E8AF9BD6B2EBDEB7CC1A91B:\ 17171717171717171717171717171717 18181818181818181818181818181818:9A20B52BFC5EB501F027978FBD684A1B:\ 18181818181818181818181818181818 19191919191919191919191919191919:7A1A35FAD281601D522188B546CE1800:\ 19191919191919191919191919191919 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A:F715BBB8000B577E6EF5D698511E8D03:\ 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B:09E83FD6F11C656ACAA1D1FAAF02F086:\ 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C:41561B53A60A9FBB25304169789461BB:\ 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D:B47BB77008C75F854861994479DA3E7B:\ 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E:811CE0CFEB49117D6ED593FBFD5E6CD6:\ 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F:C9479F831ECEBCFCB91F99FD6379A962:\ 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F 20202020202020202020202020202020:FF2C70AB530B889BFF5F3C902DE6209A:\ 20202020202020202020202020202020 21212121212121212121212121212121:695A8754A7A6F18C4F3C6EE9CE0EA103:\ 21212121212121212121212121212121 22222222222222222222222222222222:2E2DFBB0C8BD286E87625F61A2F7D887:\ 22222222222222222222222222222222 23232323232323232323232323232323:CE8E66F871157B0182653B625074CB02:\ 23232323232323232323232323232323 24242424242424242424242424242424:C32823388E5ADBD6AA14186CE0400A4E:\ 24242424242424242424242424242424 25252525252525252525252525252525:EDEA3E4740736BC47A7891609B86CE9E:\ 25252525252525252525252525252525 26262626262626262626262626262626:2B2DDCA5AD969636475196D462F5B2A5:\ 26262626262626262626262626262626 27272727272727272727272727272727:5C46E5F8DD4E7DC61474CB8DFC3E04F0:\ 27272727272727272727272727272727 28282828282828282828282828282828:6670EBB8C7E041121C5C5E449B675FD2:\ 28282828282828282828282828282828 29292929292929292929292929292929:808DC7740040F39A6D3CBFAAC5228A23:\ 29292929292929292929292929292929 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A:15ECD6020C001F45262A1256AF7B066D:\ 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B:C937773A54DC09B0CC52756A7EEEF178:\ 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C:B8AB07101FC58ED64BBE203F31F892D4:\ 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D:FC429A3B703812E0AAD1A325A23E33DE:\ 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E:C4FFFE21B89FFCC6EC721D49E870ECEC:\ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F:D218CB13BC19296A50B5612A3721C1E2:\ 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F 30303030303030303030303030303030:573FF72784A1CEBD97FED191A3B979EF:\ 30303030303030303030303030303030 31313131313131313131313131313131:4D44F703C1E1C39C3A2EDF5639394702:\ 31313131313131313131313131313131 32323232323232323232323232323232:50F09502DB7FCF0095E5F8219DCA5A3C:\ 32323232323232323232323232323232 33333333333333333333333333333333:9533F79F724484B169CB32EB7FAD0168:\ 33333333333333333333333333333333 34343434343434343434343434343434:9EB8075BAB79DD8BBF7ECAD69C6B13CE:\ 34343434343434343434343434343434 35353535353535353535353535353535:E5450816410E771677D879F0A6ED86BD:\ 35353535353535353535353535353535 36363636363636363636363636363636:07B20FB465C2F4FABC042A07E3163DEA:\ 36363636363636363636363636363636 37373737373737373737373737373737:26B4CFBE7FDB3B3253E9F5D499DAD6C0:\ 37373737373737373737373737373737 38383838383838383838383838383838:4FD4E8956C0808613A5EA19A9D753800:\ 38383838383838383838383838383838 39393939393939393939393939393939:FA74B3A2F745D440E74851D1C0D8679B:\ 39393939393939393939393939393939 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A:9D6FC40588769E07EC406A0CEBEC99F2:\ 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B:53602388866685FC37681EBC9BC46F73:\ 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C:AB4532B652BDD0FC8ED4034CF3C11A24:\ 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D:66EFBCE5A3C3795A50C1A6B999CC3E71:\ 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E:1CAC1DEB42C55E3A3FEB261ED2FB3F50:\ 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F:31D98EA0E6B439432C3A6BB8E25D600D:\ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F 40404040404040404040404040404040:898FD889A6AA36447C89D8CCC8B4043A:\ 40404040404040404040404040404040 41414141414141414141414141414141:AA74AA28D307802D28EDF73B58BD3BA3:\ 41414141414141414141414141414141 42424242424242424242424242424242:57F1920F30A23C74DA3CD9CF78F4328C:\ 42424242424242424242424242424242 43434343434343434343434343434343:2C30C357FB5A8F9D531CE0F17E1286F3:\ 43434343434343434343434343434343 44444444444444444444444444444444:C6E5EB2B3F9A7744A0128B93A4145A7B:\ 44444444444444444444444444444444 45454545454545454545454545454545:0DBF0AD86C57F7D25A0CE61F6A6148EE:\ 45454545454545454545454545454545 46464646464646464646464646464646:5F64A9BC4359153FF2572195A12F52D3:\ 46464646464646464646464646464646 47474747474747474747474747474747:B6099EE04520977CB7B1DE88E2120FA1:\ 47474747474747474747474747474747 48484848484848484848484848484848:77AE144A7A3883038561F239C5312F09:\ 48484848484848484848484848484848 49494949494949494949494949494949:DF0FE7423AA1CF40C8FD45253817FE33:\ 49494949494949494949494949494949 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A:CE4E05EC0EE20A8A4B27937B7B8ECED4:\ 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B:BAB91404D49876BEE288311BA3C7456A:\ 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C:9DC6BCB030F1FBC24ADBF6EA5238E507:\ 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D:BFACD02D59B26640B80B1886CD6E7D03:\ 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E:2076B2B836A8C545B3C103050E7AFF41:\ 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F:653B5B9A9751451C89DF56D79CFD07EF:\ 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F 50505050505050505050505050505050:7F4060C7776DEED87F7F9B26BEAFA428:\ 50505050505050505050505050505050 51515151515151515151515151515151:B7072058AEF8AA25604ACE1531C81C59:\ 51515151515151515151515151515151 52525252525252525252525252525252:40A0515E8F01E55C60F70E0DAE4A1D31:\ 52525252525252525252525252525252 53535353535353535353535353535353:9805BD832CBCBEE6B439D866F3ED53F9:\ 53535353535353535353535353535353 54545454545454545454545454545454:81334B63525932E8B9342094A8DBB917:\ 54545454545454545454545454545454 55555555555555555555555555555555:59670A6CBA2E729FEDD36389481541A4:\ 55555555555555555555555555555555 56565656565656565656565656565656:84B3279AE90EACB5BF863DC17AE9212E:\ 56565656565656565656565656565656 57575757575757575757575757575757:13F3BDFA7EF33A97F496692361AE6167:\ 57575757575757575757575757575757 58585858585858585858585858585858:080F06D07DC2B4D0B748FA9F28946B0C:\ 58585858585858585858585858585858 59595959595959595959595959595959:72B8521961C711E79AA30616F0B70687:\ 59595959595959595959595959595959 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A:75082BB9C98676FBB964DBDCD25705A2:\ 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B:C00D2666ED3FAF0F01FEEB01A9883B1B:\ 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C:C70DBF746F722EBC18A4F4B115193ED4:\ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D:6283561914D3FABEE1FDD1747515C2D4:\ 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E:7AAABB3AE21BBA557AE89A0D9B99816C:\ 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F:4010AB7D9F7237DE123450ECA31B0900:\ 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F 60606060606060606060606060606060:3E4B358F1A26A197BF3B65B0DB4FB7E5:\ 60606060606060606060606060606060 61616161616161616161616161616161:2E9D9D04453C0698FB444CFA3340E0B8:\ 61616161616161616161616161616161 62626262626262626262626262626262:99ABC39983649030A48BAEDA6E718E8A:\ 62626262626262626262626262626262 63636363636363636363636363636363:39478E48FACF3E28870082DFB51A817B:\ 63636363636363636363636363636363 64646464646464646464646464646464:1BCA5B87AFEB4D9090910E02E3040CFD:\ 64646464646464646464646464646464 65656565656565656565656565656565:30B0F7101370BB69E7B20D13050AB876:\ 65656565656565656565656565656565 66666666666666666666666666666666:CC000CAA9DEB82E9766CD98B9DE131DE:\ 66666666666666666666666666666666 67676767676767676767676767676767:AEDA25322DEA94FA8345FD467992B1D8:\ 67676767676767676767676767676767 68686868686868686868686868686868:14D0D8253551FC65B1DE9DB1C3F0AB6A:\ 68686868686868686868686868686868 69696969696969696969696969696969:67D32FDC0CD1AAC1F20E3F5FDFC986C0:\ 69696969696969696969696969696969 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A:3D8101226BBB3F4FFD40E68EF5F93626:\ 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B:684F017186FCC8AC24342CC54BF2FA6C:\ 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C:4AD0F6751D4DE121269F0FCCD99EFE68:\ 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D:FDF357681BD91A83E2632698C1525CE0:\ 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E:AC2698CD31DE9AC9740F53D467902FCB:\ 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F:ED011F6CD9356CBA1E4715D60AB112A6:\ 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F 70707070707070707070707070707070:724926624439B1C8694571BC103CFCED:\ 70707070707070707070707070707070 71717171717171717171717171717171:C2725BBB0E4945AF08A6A7F1A9AF211A:\ 71717171717171717171717171717171 72727272727272727272727272727272:0ABD84E7FF8FD3F826B4AFBE3AF2B653:\ 72727272727272727272727272727272 73737373737373737373737373737373:404BEFC70C072CAEE758CC3E697E946D:\ 73737373737373737373737373737373 74747474747474747474747474747474:0106FFAEE3A63E7B80004B044F864032:\ 74747474747474747474747474747474 75757575757575757575757575757575:AE43C4368B1FC9B98DB952887C4316B1:\ 75757575757575757575757575757575 76767676767676767676767676767676:FAC2FD894C5AEBC38A45034F38D44075:\ 76767676767676767676767676767676 77777777777777777777777777777777:09831AB86A3DF171F1961A8E9F40BDD0:\ 77777777777777777777777777777777 78787878787878787878787878787878:DFC3FE2EC8C90B113BB11F76F3636E3D:\ 78787878787878787878787878787878 79797979797979797979797979797979:E9B9BB30C6D86061FA1812FF08CBC65A:\ 79797979797979797979797979797979 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A:0FC606C92CCFE70FEDAAE3DB6C443762:\ 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B:85DEC6534601D8B6B11B9060C8A42DF2:\ 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C:1250BEB80BC3D145284DF9188CCA5C50:\ 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D:318E30C9CCEBCA2A7F546A49052AF9A4:\ 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E:49FCFE05AEF655D83155DB617ED581BA:\ 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F:91EF1DED08B8BC59A916B5739195C758:\ 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F 80808080808080808080808080808080:B5BCEC5D9EC2161530284CD96653C250:\ 80808080808080808080808080808080 81818181818181818181818181818181:3B26ABD6B5688159301921809DF64FB1:\ 81818181818181818181818181818181 82828282828282828282828282828282:DAEA518A364BC404EEDD6903474BB56D:\ 82828282828282828282828282828282 83838383838383838383838383838383:37C8EBDBCE1501AAD18A395AAADCB415:\ 83838383838383838383838383838383 84848484848484848484848484848484:399FB3321F29829924CE72FBE9ED2756:\ 84848484848484848484848484848484 85858585858585858585858585858585:A88E685E95E838E27AC3024370BFE12F:\ 85858585858585858585858585858585 86868686868686868686868686868686:4C56F71EC80909EC98673D808F42321E:\ 86868686868686868686868686868686 87878787878787878787878787878787:4EFA656E3F35C570C8DC4EA5524B436C:\ 87878787878787878787878787878787 88888888888888888888888888888888:808FA06393685AB9143C82CA4B954BE4:\ 88888888888888888888888888888888 89898989898989898989898989898989:D107696CCF562B2CC2901D50E1BFE320:\ 89898989898989898989898989898989 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A:98CF296ACAFAF704D6C91D1997202E47:\ 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B:5A023E5B18861A1FFCCC26F487EBF80F:\ 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C:8570554F91C1D8366FF6EC2097F110C3:\ 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D:E1CE24B74C513C884992C98DFCF70BFB:\ 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E:23F536F1876F44FFB7727D0FAF9F2D70:\ 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F:D877DD242B0C7CC05D9600419385A3EF:\ 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F 90909090909090909090909090909090:2896226A5A298578E2C999AF4F382DE7:\ 90909090909090909090909090909090 91919191919191919191919191919191:B54F6E5FB8F33608A8DFAEAD8EF27B98:\ 91919191919191919191919191919191 92929292929292929292929292929292:45CF4F783116E562F104B107BD3D10F3:\ 92929292929292929292929292929292 93939393939393939393939393939393:93F404FF83D493315E2E9665AC2013C5:\ 93939393939393939393939393939393 94949494949494949494949494949494:1A5664813121482F4DBE1026104D84A8:\ 94949494949494949494949494949494 95959595959595959595959595959595:AEE4A82CE2FF23E91A497269B82530F6:\ 95959595959595959595959595959595 96969696969696969696969696969696:E001B8A93500C4D49F8A9A372A1E8A61:\ 96969696969696969696969696969696 97979797979797979797979797979797:FB23B31999D3D84AFD55600B9EA722CD:\ 97979797979797979797979797979797 98989898989898989898989898989898:9572170C51A1198373B6ADBAB87AE454:\ 98989898989898989898989898989898 99999999999999999999999999999999:65CCAA1321D8CB3CA18462C37DBBE4E1:\ 99999999999999999999999999999999 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A:3E942B1978B989CAC106E4575E6729A7:\ 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B:3E9AA5B6EC22E250368E9806041F6AA2:\ 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C:717479032B7D79C5236436D8AE0F3AB5:\ 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D:2643B168C234D5E0205E212C5CF669F4:\ 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E:A79DE0F9F3BE54CF4B453A1836F7F491:\ 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F:CF0836AC18F99D130EE85DE0ACDBE063:\ 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0:F12ABC04BB0C7F6F794EF428E57F15FA:\ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1:383E9B4B9D663B8527E6FAB4A7892832:\ A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2:432103C74F3C2D68315CDD2831EF8F71:\ A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3:E06519949E2F6E8B00E15CD58054BB4A:\ A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4:34A14A8B9E5869C25A9C604300BEC911:\ A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5:0FB01A7B7F093C400E2FB08E709F7675:\ A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6:51D28B7FDD1C3EA5ED21EBD1D8B7499D:\ A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6 A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7:3F6FCB543C8771ABFABDD72E0E788FD7:\ A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8:045A187E0A7009AB426A78B251CA088E:\ A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9:BF28504290089DB7D289785147BD5D9A:\ A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:1297E67DBA4B264248FCDAF3B9E3FE4B:\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ABABABABABABABABABABABABABABABAB:8177E1C48AB5578DBB3C4AA36EEEEF5C:\ ABABABABABABABABABABABABABABABAB ACACACACACACACACACACACACACACACAC:97E785AED832ACF1D419DC01219704D4:\ ACACACACACACACACACACACACACACACAC ADADADADADADADADADADADADADADADAD:23D059447EDB76B0F9B41006399CC087:\ ADADADADADADADADADADADADADADADAD AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE:7320A4A66FE238B9E1A932F9942DCFAA:\ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF:4D8D7376C26FE0AFAA27B61ED1882721:\ AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0:DEF37D094186DE7209801C7D2D93F61A:\ B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1:536A8AACDB1156AC2E2D7DD0499BFA5F:\ B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1 B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2:F57A2E78B976A57642DC8BFAFB3480B2:\ B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2 B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3:88177315699E7AE0D5B4B07046ED5990:\ B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4:02F65559B9AA547A5EA54EB6A8E48960:\ B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4 B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5:F2F02BC7D56F7594E37DB7DF94C1B9C1:\ B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5 B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6:2691BEACD805DC3C69B0295A7308CFD8:\ B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7:A3A67B09425720C8AAB79DA8F44A8E8A:\ B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7 B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8:DBC7ABF1DD510B5D3A6BA898670B6361:\ B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9:FA1B51E10654E448C32EFCD7A986CAF0:\ B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9 BABABABABABABABABABABABABABABABA:C63D856771FC45E5102B14B41A79CB7E:\ BABABABABABABABABABABABABABABABA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB:9030C8326D2B75D1979DC1C3B80796B9:\ BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC:B11A41E18A535F8F3B343135C73A4670:\ BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD:BC6F04C2D75634E0054CCE755DE717A7:\ BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE:AAFAD1353CD8C6469751190678362F03:\ BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF:9DD8ACCD8D2A504AAE205BAD997F20DE:\ BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0:0FCBA053A6E5DE5D0E6B9395BDE2BD18:\ C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1:E3AD2507E0F6BCDCC3D50728E12BF962:\ C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2:0AB51BDC22FFF1458CB4D3D08EDB164C:\ C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3:FBF3371047AB698FCFC81442B134AD26:\ C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4:D026FC11B7B1BB47B020D7A8320A174B:\ C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5:FAE26B00CAD7DD254EDBB84688A846E9:\ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5 C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6:91F547F8129DB5B465DF57F0A03E58FE:\ C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7:AECA4D2C88D33F6A0CEAE619259E3982:\ C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8:32AAB72FE2809153140156909B52F414:\ C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9:91EDBD3465D1216B3564F094455F0ECC:\ C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9 CACACACACACACACACACACACACACACACA:4D14F0124000E96F09938906B99415BA:\ CACACACACACACACACACACACACACACACA CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB:297F6B5BF3A01B1D87B7B74DF4E9DC2F:\ CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:BCCE55DCAFF6BB7B4D0CAFD112E87FCD:\ CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:D7A1E8E4624689000AD7AFB06982D8FE:\ CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CECECECECECECECECECECECECECECECE:D59DAF6299A27A5DE36F7090B777673F:\ CECECECECECECECECECECECECECECECE CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF:A5ACE3553FB387187CCFF88C3DEE1ED7:\ CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0:2CCF6DD6EBEE7C4A4C5586EBF792AC57:\ D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0 D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1:695849E45DE312A07C5E8A6C1C20D6B8:\ D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2:5E14D156D004D484E040C354F13A8F63:\ D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3:E4CD1852605EDC0FF576A8310FED4883:\ D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3 D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4:BC7EB0533C90715C314362B1FBDC3545:\ D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5:AFBDF9336F9CAC06313181937FF1849E:\ D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6:B590131983C4E266BDE99D577C493B67:\ D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6 D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7:90921A3641666DE025E42B1BDC891FBA:\ D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8:E3B79B1EC3FA41E7EB3C575ED197588D:\ D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8 D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9:5D9B53924BFCB123BEF8F3C5431103F2:\ D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 DADADADADADADADADADADADADADADADA:12BB6C3773F42D7AB2BD711C3DA6B1F9:\ DADADADADADADADADADADADADADADADA DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB:A0D2449463DDB310E0D4D0B547043FA0:\ DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC:B1E70695E833951DA0C4B38CDA067ACD:\ DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:19AA0D4A04DD8C93935FCB3F39A0D2CD:\ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE:98E4BAC98E4B1559B07E3A323D352964:\ DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF:4B88F29F1DCB339CEF6C80EF949272BA:\ DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0:8F3C7931AC39D8B62C643BB3AC2C731B:\ E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1:D620AC385CAA42FD228176995C7EEC61:\ E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2:D99A20E342818B37A21C87F35C19D559:\ E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3:0817FC31D13725B3F64790470C883F22:\ E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3 E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4:945FE4DAEEE2AAA1EFE80022311B1040:\ E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4 E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5:F5976BFF2CE360F3A75CACB10B1B26E6:\ E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6:4D7118A0D1DE4AB7E43765B2E2AE0EE2:\ E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7:FC428DC79787BBAC03937C6C0FEDA673:\ E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7 E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8:6DF3580C31F389C898CC905582BCD920:\ E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8 E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9:6B74DC42605029718F4D0C060547CC8B:\ E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9 EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA:B587D402AA54E60DB655B4164847ACA1:\ EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB:16313A473EFCB6D965C5F1426785B472:\ EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB ECECECECECECECECECECECECECECECEC:734356F14E8A6C5775A4638BBDFCE111:\ ECECECECECECECECECECECECECECECEC EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED:F66FFD7385B4A87A9E2865D70864DAA6:\ EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE:FB7FA84127D218FDE6A24CA30379ECCC:\ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF:4FADBE831B78D6B3C59DCE8B4293BB79:\ EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0:DA219657EA1AB63EA46306C2D0B69186:\ F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1:34BE2E9CB3C4047884CB291416D037C7:\ F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2:384BAAE4DB758555E2DB6E2995E0CAEC:\ F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3:7338107A3D9BF3E8C67936E1CB77A22A:\ F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4:217BC7820BB5A9183D95BF7E99180B87:\ F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5:56BA9C916AECDC51203CB6BA5FEE8D3B:\ F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6:8CCA87B86BEB5CCD11A594F20AD5D1B8:\ F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7:CD0230DBA2982BE4F126FB2E80AB2C24:\ F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8:A3E46629CF9D1D6DD1A6DE82B86C5934:\ F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9:AE18D7C35968E90CECA036CF586EB963:\ F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA:3B0261B9DA91346FAD84DD9CC9EC4A37:\ FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB:9F3E91301511409E1F997A080F9A9424:\ FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC:F1BF5CCE9A7D5FBE759A579640348692:\ FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD:D192CBC80E653C12C647C1EBEB56AE10:\ FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE:64F5B3E91B4CC3C35AFB6793FCEC836A:\ FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:EFB109978422E50FDCB05335D050D0D7:\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF # From "The RC6 Block Cipher" v1.1 - August 20, 1998 00000000000000000000000000000000:6CD61BCB190B30384E8A3F168690AE82:\ 000000000000000000000000000000000000000000000000 02132435465768798A9BACBDCEDFE0F1:688329D019E505041E52E92AF95291D4:\ 0123456789ABCDEF0112233445566778899AABBCCDDEEFF0 00000000000000000000000000000000:8F5FBD0510D15FA893FA3FDA6E857EC2:\ 0000000000000000000000000000000000000000000000000000000000000000 02132435465768798A9BACBDCEDFE0F1:C8241816F0D7E48920AD16A1674E5D48:\ 0123456789ABCDEF0112233445566778899AABBCCDDEEFF01032547698BADCFE [SAFER-SK(10)] A0A1A2A3A4A5A6A7:41246B65F1DC6AFA:01020304050607080000000000000000 A0A1A2A3A4A5A6A7:5CBD77B03626FE3B:00000000000000000102030405060708 9091929394959697:9EAA4DF1E0EFF445:00000000000000010000000000000001 98999A9B9C9D9E9F:4CC14838399E532D:00000000000000010000000000000001 B9BA26C1B67F9692:75AF0AEF94E54122:053D79C5CFC7E2A3244F888CB0336DBF 382395FB04EA1FD6:8162DBDC5984CAD0:438C2106DD87C2A0741F66A28D75A962 0C07884F2D4B7645:64C8047DEBBE6895:8A5CB47F29F8B1C79EFDDC95EAA8DA2A FD8CD3214D56917A:3360F9F4A25D0D5A:885588FCDBDDF30BDD55D6AD097594A7 D2A9B8F6A027F02A:D750587CC46CF3B7:D020D65E6FEF3C7FD60413E04C71F8B1 18AC5F07FCF872E7:557368277E129BE6:228A5CFEF727066B2E682DC8E40CD629 4438471711225573:B75E4C4155A67C4F:360495E7E4784CAA34E42C12F125B71A 5ED88B627B5C899D:B356A077F9DB11DC:850F94815381C03111F45EFEE704AB48 # From RFC 4269; the first vector also matches the one given in the # PDF "Test Vectors for Modified SEED", from # http://www.kisa.or.kr/seed/seed_eng.html [SEED] 000102030405060708090A0B0C0D0E0F:5EBAC6E0054E166819AFF1CC6D346CDB:\ 00000000000000000000000000000000 00000000000000000000000000000000:C11F22F20140505084483597E4370F43:\ 000102030405060708090A0B0C0D0E0F 83A2F8A288641FB9A4E9A5CC2F131C7D:EE54D13EBCAE706D226BC3142CD40D4A:\ 4706480851E61BE85D74BFB3FD956185 B41E6BE2EBA84A148E2EED84593C5EC7:9B9B7BFCD1813CB95D0B3618F40F5122:\ 28DBC3BC49FFD87DCFA509B11D422BE7 [Serpent] D29D576FCEA3A3A7ED9099F29273D78E:B2288B968AE8B08648D1CE9606FD992D:\ 00000000000000000000000000000000 2D62A890CEA3A3A7ED9099F29273D78E:717EB02EB81A2E939D54ACA91087112D:\ 00000000000000000000000000000000 D29D576F315C5C58ED9099F29273D78E:0D809C5EE82F477EBA7B956DBB23463B:\ 00000000000000000000000000000000 2D62A890315C5C58ED9099F29273D78E:0F0190D616F5294112FFB7884E8B37F9:\ 00000000000000000000000000000000 D29D576FCEA3A3A7126F660D9273D78E:41BA1B505386B7428B88338188F7E718:\ 00000000000000000000000000000000 2D62A890CEA3A3A7126F660D9273D78E:A3348230BF5CFA552F88D22463D9703A:\ 00000000000000000000000000000000 D29D576F315C5C58126F660D9273D78E:115351622E016BCA26918D17E13225F6:\ 00000000000000000000000000000000 2D62A890315C5C58126F660D9273D78E:7EE4E3F2C46FE52ECBDA044C585717DC:\ 00000000000000000000000000000000 D29D576FCEA3A3A7ED9099F26D8C2871:563A8403FF5309D62370B1DCF5A11EDD:\ 00000000000000000000000000000000 2D62A890CEA3A3A7ED9099F26D8C2871:2F7D73602B70CD2553E44C1D3F170126:\ 00000000000000000000000000000000 D29D576F315C5C58ED9099F26D8C2871:155BBD9BE3A965B345E834718F651CEF:\ 00000000000000000000000000000000 2D62A890315C5C58ED9099F26D8C2871:6CC65E8C5C566E894817350F497816F1:\ 00000000000000000000000000000000 D29D576FCEA3A3A7126F660D6D8C2871:EEFA51FC91FEBB6E9F8CB141CC0EB6AF:\ 00000000000000000000000000000000 2D62A890CEA3A3A7126F660D6D8C2871:3C6F8380CBD3C996167F2F0E90E71B75:\ 00000000000000000000000000000000 D29D576F315C5C58126F660D6D8C2871:6C87EB62A4975356B28DCBF6A64A0BD1:\ 00000000000000000000000000000000 2D62A890315C5C58126F660D6D8C2871:07206D48FE6DBE19D50314B90AC87B83:\ 00000000000000000000000000000000 AA26D561F567520E8AE47528C24C18D7:35706F9B26007071AD8105CFAA1C1E2F:\ 00000000000000000000000000000000 31A2193D9A97FED6922B17AAA6372B74:F7FEAE5CEC4D11477F24E6B200906870:\ 00000000000000000000000000000000 BE5DEBD559E303C9C92B174A5107BBFE:3C0E29E2950F2AC2DACD63DEEB5C7EFA:\ 00000000000000000000000000000000 B626D8F65EDCCDF3AEE475C8A1837722:9FDB9F3B740563D5518287DC981FC9CB:\ 00000000000000000000000000000000 41DDE7C1F1631F5FDED4F42746471BD6:46D4B5A5A86FEC08FE70D18297DCF510:\ 00000000000000000000000000000000 51D238BA86176EFE39E4695AAEB73B52:72DDBE038DA040EBB12C509F5940A212:\ 00000000000000000000000000000000 EA5926CADAD8018962E469BA920CB8BF:DDEB59F02132BE4581FC23EABAA960D6:\ 00000000000000000000000000000000 1EA9062E4D9CEDD5FAD4F4C7990367A4:341D9352E36DFD6E4EAF0F6F439BC8CE:\ 00000000000000000000000000000000 B966E5C5D2277288C61B96A559CC84AF:73A9AB3164FF30350F2DC08E939A104D:\ 00000000000000000000000000000000 B6A6583C5AACFCD6212B0BD8AEF3C6A9:6DF0C2C28F8E2D44468A61278BB6B429:\ 00000000000000000000000000000000 A11DDBD175639341052B0B384678D8D9:4DAE45AE0CAA032FC97CD4D8C57FB83B:\ 00000000000000000000000000000000 352299B71DD880E29D1B96452DB86540:BA8AFCAE22070BC882D3A42B38A09E65:\ 00000000000000000000000000000000 6E5D67CBD2233FD96DD4E85519F8C8FF:BC787554E0C28FE2787025A98E0E09F0:\ 00000000000000000000000000000000 15E936EA422C6CFE751B8AD79DB36621:86B80E7CB3786BCA23C7124354EA541B:\ 00000000000000000000000000000000 CED9A660F5589101511B8A37464C94C9:27F18C72F85905209F5603255B3F4DDD:\ 00000000000000000000000000000000 5992083E0D98A0C436D4E8B529F8C568:EDD2E4CF5B93C4312E5ED4F052C37897:\ 00000000000000000000000000000000 C8069CA67710BEB0973E53F6CF83F5B8:BBAE1F0CD912C15C0D6D531272BE5CDC:\ 00000000000000000000000000000000 209715348597D7935E59FCCDF462573A:538D750947CCE6E77C30A12732210008:\ 00000000000000000000000000000000 F55F291D8B1A23EBBC59744F266F0AF0:DEF3EBA592B3C325CBE4422B28708AE9:\ 00000000000000000000000000000000 B5F454770B8E202D32B69CF3C519564C:8629BE92247614A971C111CBAAC07503:\ 00000000000000000000000000000000 91447D195D011E605F6AD3EDD4FC375F:D591160C54C6980F2FB1289A290FB8C5:\ 00000000000000000000000000000000 39D8DFB5BFAE1EFD70243FA5C3592FD2:DD4E7DF8A2D94C073CE393A5D8F3BCC3:\ 00000000000000000000000000000000 80ADA9A56ED30915F209FC358BD23B13:16EA9B34329DEC0DC264A89531096063:\ 00000000000000000000000000000000 B762E58E9BC97C5B493EF8528DF0817D:81DDE46038411A21D84C46437D655E3C:\ 00000000000000000000000000000000 4163A1972ED201DBF666AB3F1506F316:E3D84AE8D29F438C93FD6F09A7E93E9B:\ 00000000000000000000000000000000 A429DB53BB101C18DCC2E4A1E6CC9F76:EA5A252DFD300488151DFBF42E0E0BDC:\ 00000000000000000000000000000000 D9E13DD7B37EE0096808CC1D4222E646:BE5932C7D8D87A02A6638ADECCFC10B0:\ 00000000000000000000000000000000 4190EB60B88C95F231EC6D7E20CCD8BF:D511BB2C012F08F1DB69B6CEC7BEC9A7:\ 00000000000000000000000000000000 1591F916E4E78577C46B226D0BFF2D18:4FA2AE41F506315E9D47F1538CBBF7DC:\ 00000000000000000000000000000000 2A112D319CADD403DED8F45A858A5864:BA00755699ECBE4DE4F507C11495880A:\ 00000000000000000000000000000000 65A3B7F6A32DB892F14275DD6934953D:EB81259E6EEC5F63DD0B3A4D7A304369:\ 00000000000000000000000000000000 AFB47A94B46DD4070782C7778D0BCAEB:CBDF5E6AA6C4D2D2112C5DA41BF7A998:\ 00000000000000000000000000000000 040F6C0CCF32860A3659483242B7938A:B80F05173C3009141E435A54787D9B11:\ 00000000000000000000000000000000 783C76251AB9E2AF1A7AAE0C103F7022:A4B00C8DE27F64FAE825F68446414CFF:\ 00000000000000000000000000000000 B4CE06347BCC27D88D8F9517511489BA:9EC055EC16A197AAC35C42DAF73EFDC5:\ 00000000000000000000000000000000 1D5F46424382FC14A88D11101713EC27:6D6EAAAADDD78F048D5DE03ADF132344:\ 00000000000000000000000000000000 A7D01D3962F7EE0506ABB0CB05BE3CFD:A29C8E4D019EFD52F5B3A924F78283FB:\ 00000000000000000000000000000000 DF77E42579E404C59D1F2D6282742AA8:21CA94A86C4B89E7D6A31A47EF13153C:\ 00000000000000000000000000000000 7C94C333B3129977B82B602FC6C34DBE:54765313C008E10DE032EF1CAADBA78D:\ 00000000000000000000000000000000 65930D441118388F839C48E87B3E1BA7:52929868115B6062648DE05D79EB026F:\ 00000000000000000000000000000000 33CA3DE47EFBC84D7FE3F5232F61FECF:49CBD717BD816CC9875BBC3F53C47FEB:\ 00000000000000000000000000000000 B4FE9AA29F6DEE99AAA46C6570C7EE94:8F4F803A44EEFB7322536211C9345763:\ 00000000000000000000000000000000 68BE8C46506743BF1B3C8A8826A4A609:6695C1F06CD1B4F465741F4518024AAA:\ 00000000000000000000000000000000 1CC8D6A3BE440FE4405E60C5318EA5C9:BE03C9515368E75890EC686BFE2FF646:\ 00000000000000000000000000000000 D00215D6061EA7A71E11B75A1D26430D:C3E2D4D0E8D0B41C30C8D87C13A49AD3:\ 00000000000000000000000000000000 CDF77148A39069E3BCF653FCE49366C9:4DF17345CF351AA676DD7B49938F7A52:\ 00000000000000000000000000000000 0F99BD50EDF7302DD7856AB5D615ED28:0172427A635F7D98BE4918C5AE2CB716:\ 00000000000000000000000000000000 66B77651ECF45BA521AD382EF3924728:794179D58EA6DBE6C47789543EE4C942:\ 00000000000000000000000000000000 447D7F32776EBC002D2D5BF157B65831:96FFDD0C7A8B148E2A56D23613001F07:\ 00000000000000000000000000000000 2AAB6D16B7D60DCE7F04B82155F24D84:FA241459469101FB4BCEACE6B5400592:\ 00000000000000000000000000000000 E58BB7447F6D10E7A004FBBA0191E9F1:F3789C8F92D55B6F6AA2F15DA3E3360D:\ 00000000000000000000000000000000 DE491798D0F7C403EA23C5BE065ACA64:240734AB5298B82E77547C5598D78F9B:\ 00000000000000000000000000000000 B7E4DFC5707B8BD443C44E60CA4FB33A:C987AE5A52023829ADECAB587EEC9FF7:\ 00000000000000000000000000000000 0F697B4EBA007B17E87D34AA5820BABE:D4F00A5171634F670D9A66641FF418C3:\ 00000000000000000000000000000000 B202A50E105E4C16EFB7E3CEB213D8B9:CEDEA26248AD109772F8FA6CE6840C10:\ 00000000000000000000000000000000 E5F9ED7FE679B4BB49F6CAF8423F4847:BB0CCA155A25E4506AA2872023E3DD42:\ 00000000000000000000000000000000 0EF0B59EE379CF782DF0B241FA0A481C:1558C66C18CDD1BF7FEABC12CA775765:\ 00000000000000000000000000000000 01297B97E8BA8CC43663B8F0587515CF:B9126AD2C22415E0D1DD0C46DFF4FACA:\ 00000000000000000000000000000000 04489483EC2124D4CE0C0D3532104B7E:3EA18AB75E496036A5B39C799223A40C:\ 00000000000000000000000000000000 2CB4E6700F324861F2675CF83D3E46E4:2F2599FCE02040B2B6511E6E0CCC4FF6:\ 00000000000000000000000000000000 79A4343D86C34E6F7FEA9F653E9510E2:9790DFE1ACA13EC9AD806E92925AC60A:\ 00000000000000000000000000000000 C48B333E3A297E4F078917922EB4112C:789BE31FE49273B1B9D23F3266E4E3D4:\ 00000000000000000000000000000000 8972CCBADC5B0506545466096C1D681B:E6B883BF48E1D41DBD59C5A1A5CF0D37:\ 00000000000000000000000000000000 07237CA5F80AFE75C531A1AC3C1AB011:C01C0D59B22FAD158C64FB7D9EB947E2:\ 00000000000000000000000000000000 530FA49A50BEBC8DF5B6551AD9DEA834:4839197697C73DBFFE1EFFA41418F1A8:\ 00000000000000000000000000000000 A37E6DCFD78A9367E0FD779EADD0E662:AD630EB9AC6CEBB004DB1FD6F7498CA1:\ 00000000000000000000000000000000 39B126834F71A6094145AE2C544C99D5:CF5F4208B97871A91F63C34E008E515F:\ 00000000000000000000000000000000 21C00D004653C7C46A48DBD99C58D420:11F9C2167F6C6151B1BD5BE2FBF8F415:\ 00000000000000000000000000000000 1D18D1F2EA9B2175E26F4BBBC6482EC0:C239C8DA7E469B1B360DE30B20CA948C:\ 00000000000000000000000000000000 2248571B13111E356A35583A346B533A:813394500C7B0A98B09360729C4C8990:\ 00000000000000000000000000000000 AC4E8230E1608BC860D3B15CCC3368F6:4C6E93F6A3D8FB4A0B0A84BCABFBA324:\ 00000000000000000000000000000000 9ABFF385FB69343F3155F005D1596C9B:50F442C56402B11FD9D1FB3BD13363BA:\ 00000000000000000000000000000000 52BD6F4E00AF26D08C240999EE8FC068:348D5F27D16C2716257F3AAA15283D5C:\ 00000000000000000000000000000000 E13E6BEC7B8EF6A26CF9EEFFFCB4BB8D:80048BF39DBBCBC3E5F11B523AF6E0AD:\ 00000000000000000000000000000000 5D4DDF9DFD43D9F269875972C5FDCCFE:F68CF795EE3094B23F312CDF347C4024:\ 00000000000000000000000000000000 C921BF10C4CAB3382CE78D35AEF5F36E:89009C9DB4733E7141FDB3212A412A55:\ 00000000000000000000000000000000 0EE30D5BA455F2105A1383E5234B25D6:3A5732BFCACCA7BCAE28BA212E2AE4CA:\ 00000000000000000000000000000000 7F30A307539BAF2BFA49E502F5FDB8C8:4D5F7C864D5A976FE623661D16CBEB36:\ 00000000000000000000000000000000 53DC7D23C91E3A3A993DDA2812406581:C93A2A92366C3C68E968814ED86B9EB3:\ 00000000000000000000000000000000 DBED8AB859453434ACB9E9F00CC077F7:D57191D7507746469BE9F27BAF5341D9:\ 00000000000000000000000000000000 6EE7D04DE056DBEBF6F76D646F5DDDE9:09E07FD8F84AE4909724703908D45358:\ 00000000000000000000000000000000 FAEE35C526B6D55284C50EA16B64BE75:52B5F265E0896C74F9A56962DD186EBF:\ 00000000000000000000000000000000 D1705E0D4414A331C698D0B5E7989F36:3BC372D47BB6298CE06DFE595B21AA6C:\ 00000000000000000000000000000000 FB1B87236E1B410800F4DEE6ECD1B475:EA0BB90C4B1DCB1D3A558FDEB539094F:\ 00000000000000000000000000000000 4DAAE23B2D96FA15733F64DD467B7B0B:FF9A1304937373A6BA1281A6C98A68A2:\ 00000000000000000000000000000000 0F61F575FD7CB6AC4EBC7E71D0F829BC:296A56189308CC6225FE28975AFF009E:\ 00000000000000000000000000000000 6D982DF029336B52CE5366EA1F707506:DE7FF6D41A3E69D6C21237C11BF41744:\ 00000000000000000000000000000000 D5D957B00EF19E7AE697F7BCA7766EE3:FFB2D4E3F9E2EF13969C8C885499D568:\ 00000000000000000000000000000000 FD18E498687DFBEFB5067ECFF123767A:0DAE1FDF0C4BDD0C39F7B920AE9A5A5A:\ 00000000000000000000000000000000 2F147D418659A6B46C6720090BC853AF:EF325356C760D3469E780E8E9F1A4C44:\ 00000000000000000000000000000000 F5BD9A33B96599C94EFD295F22197D8E:D49C47B7CDEE3C8DA1FD9706B9FD1EC4:\ 00000000000000000000000000000000 7D1929516793AC62EB5667DF9230E7B7:916A025A18196132AEFF32BF23E56808:\ 00000000000000000000000000000000 F6F185D1D9E5EF5E681B4E184FC803F0:3DCECA80A345D536020E821D67A4C42F:\ 00000000000000000000000000000000 8DCF813E1D32B6A462980606D5DA6C25:FD658AD24B0381E823217B2CF21F41E4:\ 00000000000000000000000000000000 311E5045D5D9FB6A9D65BE54391CEE38:98A92CBF1276C729261107A77511A3B5:\ 00000000000000000000000000000000 DB40EFC568A20FF65ACB58D46A0089AE:DAE0F812A9360561FE22DC8AB7F308BF:\ 00000000000000000000000000000000 3FBAD200F06A92BAB275AA0FB972FDD5:D024879EC26117A5C5B46447F3462520:\ 00000000000000000000000000000000 20DC7FDC121EAFE9084B3B6A223DAFCC:578341CB5831659ACA48B684404B45A0:\ 00000000000000000000000000000000 3B07F74CD998A7CCE14E4FC9D427E7B3:6E776DF83149BE88CB7C3C3E85C52F1B:\ 00000000000000000000000000000000 6469947C896B34C73AED82A38EFD7F42:C29EC8D5E338F0F928A86D7BA58CFEA9:\ 00000000000000000000000000000000 D26A6C2DEC69974265FF4452ED78F9AC:2F9F52D492D6694BD8D660CD7EF25D08:\ 00000000000000000000000000000000 392B09B430F1BBEF1806301374D5491C:0D5DA605AA771221251247CE79A2170A:\ 00000000000000000000000000000000 51B13ED142E6753C3D22FBA60CD56D7A:CF1774242D11FD50D33651BA798DC586:\ 00000000000000000000000000000000 F2CE749AE7D2A8E88E74EC43F50A6D83:7BF824A096D89F306543AC012F041ED8:\ 00000000000000000000000000000000 48B1659A4894EF28ABD7A17E2BE14507:130F39B7C637E478E8D195DE909C98F9:\ 00000000000000000000000000000000 2055A572782886EDC765497F6EED3860:A2E4F4E46D105904CFCC86C42E961ACD:\ 00000000000000000000000000000000 BE4D786EA252B372FBEC796CA944218D:D252DAD9045BECD279C72E53CB32491E:\ 00000000000000000000000000000000 AB720985752D3CED567366A2D66B5135:14D0B9D509F67CC6808B7CFCB64A180C:\ 00000000000000000000000000000000 2990B16179DFF02E3BE5329204CCE071:941A767F37377743639DF4C048C28CC6:\ 00000000000000000000000000000000 4AF02F69409FFFC5CD3E85912C68E384:26B7C40C96737897958DD86100F3B94D:\ 00000000000000000000000000000000 D5D43ED9513ACC71CC0380B7394DF738:8693A664C7E7546C5A6E23EB2E71CF83:\ 00000000000000000000000000000000 3B9BBA2992308915335F3FA0A0E12A7E:90DD602148161FFDE08D4983310DE0F2:\ 00000000000000000000000000000000 3EABFE15DFA13C3AED5A235D9616573F:1ADFB865A7ED2B588BCD0C346AA75BCD:\ 00000000000000000000000000000000 5357004733F6764F2495D7F602FD022A:F58BBA768C585C74583A71C7ADCBC5F6:\ 00000000000000000000000000000000 C5A1B211FA6D99D16C222B19DBE89806:AFCDD53A8A91AB62D4CA3915C5564473:\ 00000000000000000000000000000000 3E0995AD461831F731F5B5E8FAD4A32D:5FB04B5BA62C0DCDF8267567A166DEAD:\ 00000000000000000000000000000000 AC411EBC593D98A7573F0B03D18AAC71:6FB6C6D44F2E2F8E8D0FE03E639CA510:\ 00000000000000000000000000000000 CDD08D46B811A65FC48C34CE53C59273:869346200E0172F2EBE0FE696CA3206E:\ 00000000000000000000000000000000 53DB8DD086EDC157FD32EAE98974E659:1CD6CF6FBFEB98FAC7DDCD894374B66B:\ 00000000000000000000000000000000 BB380D75D07B8BD9A28F64D3F28FE126:646258E3B266E237572F050B7DD3C021:\ 00000000000000000000000000000000 A8DA4DE3772765676DF3035C5A6834B8:E8B76AC77E9BFFAB29C56A12F57FE5E1:\ 00000000000000000000000000000000 611E145BE9A042495037D07CE05A9C9D:717F5F9EC522FD63B46DE9A1F6CD3DFF:\ 00000000000000000000000000000000 B9EDDBD7DF2571DE135FA8F59E6F5E89:7FB7A904184FC463C453BFF8BC72912C:\ 00000000000000000000000000000000 BC70C6C532A9D8244AD957961652413E:C4AC50B64A9481062AEEA13B014A8C62:\ 00000000000000000000000000000000 9A977CDD70FB7B78F3CA0075A7F310D5:E8EED73C37662A48C6CA2FE299C50CFD:\ 00000000000000000000000000000000 CB1BDEEAC3B70C36FA65C5DF048EC7D6:5118E27A48630ECE2595DCE5C44DB8C1:\ 00000000000000000000000000000000 17C72CA5E39979F512AB6011D12FFE7E:9C88B75ECB151EA0F1F4376C8B1B2897:\ 00000000000000000000000000000000 B27637FDEE19BAB2EF984C20BEE9DDA1:053AECA22ABC1BAD69DF4A41457B7460:\ 00000000000000000000000000000000 242243B52292ADDEEA14D6711A809279:EB1C28238D1B7612FDADC261D8456040:\ 00000000000000000000000000000000 BCB05C0C37CE62E13718A4DC5D621759:BD3E796894AF2B24A2899615B76CE2FF:\ 00000000000000000000000000000000 F1F023BA8CD1278324FDADDF3D445FB4:0339029B1DA61D7EE7B8B774163A3589:\ 00000000000000000000000000000000 89459F7AA6ADD48B6E06AAF1AC94B488:6E460FEC45A03803F3F355C9DF9BE119:\ 00000000000000000000000000000000 8C0EC9B97B507BEDC21F02E8618EF5D1:EA1C2DF3021D879FC96D43FD0E67D653:\ 00000000000000000000000000000000 730E499138F578E5DD6896CD2415E278:237947AF67F07E80E0D2F3657BF80EF6:\ 00000000000000000000000000000000 8747CD711F39542D3ECD9C3EF11EDFCC:F292F6D7289ABC04D56AB7EE165DADCF:\ 00000000000000000000000000000000 EFDBAE4C02A4107E9BF71D14B380ED18:E44920E63171DCC895A0D26073ABC120:\ 00000000000000000000000000000000 A32A5731115EBB36AB0EB2D0435B0CD2:DCE9D7EB5A29646CA29D017D84671F4C:\ 00000000000000000000000000000000 648B7ADA19C5771CCDDE7D7FD8506C02:8BC336B3F819C5B95B5AB298AA5853A5:\ 00000000000000000000000000000000 FDEFA249896CED942F1560A2AD3D139B:F2686F27FB99CCEF669DA54F90EB839D:\ 00000000000000000000000000000000 4CE7F6748F7392F1FFC41F850E6BEB39:8D2143F8CE3DAE97CB36F9297ED0FAAF:\ 00000000000000000000000000000000 289106867C6A9F0046AF56EA694382C2:CE37C384B398767AFA386F923116C295:\ 00000000000000000000000000000000 E8389ADF540B748F3E9C8C553A9163BC:3B6CB9999BD604C41A6B979AFA58DDD5:\ 00000000000000000000000000000000 90EBF973D07E55241F5D435A7582931D:EE539308E76F1F6202769E1BAE8105E3:\ 00000000000000000000000000000000 DA1A98DE32FD428D031A411929DB7504:EEFDB3E1F832574F234D8129A2A7BECE:\ 00000000000000000000000000000000 DB6E1AE2CA58D3BBE82C52BA78EB9132:FB0C6C046B6E469132FC1E6D6467D299:\ 00000000000000000000000000000000 E218EEBE311B476B257DAAC37CB19BF5:069A62FA5C38E1C3F599E1F1D977ACDB:\ 00000000000000000000000000000000 122E5E3D0F9787804FD260AED930EAAE:D62B5083A1A2B3E8B26D38E58875BC8B:\ 00000000000000000000000000000000 6DDF3961CC91F485601683CB28355E6E:9ED29AA0A1F244935003BAE7951F90D8:\ 00000000000000000000000000000000 4B5409AD15C3F64DDF4B4636E17C9EF0:E7E2B8F0E936B4A9C0749F814582D1F1:\ 00000000000000000000000000000000 370AB733167272FCC2D30497CBBD3B18:0FE76FCA68F0E3CA774DA899A3423A81:\ 00000000000000000000000000000000 51816B90928F39AE99B6B8E7158DBCF6:24C9CE99EDE5980D94CB0D93B3CE05DE:\ 00000000000000000000000000000000 FB8CA3CCA3D18BD6D57B94CEDE433940:E07C63764F102CF1E1FE98068B97DBC3:\ 00000000000000000000000000000000 9AA179B7064787F10A64C3CFC4ECE5FA:754FE2C1C97B5108164D0166CE7D71A8:\ 00000000000000000000000000000000 18A7119DBF80C5C4BEE14716D5E69F7B:9A843E069C5564C071A941331A002905:\ 00000000000000000000000000000000 0CF4DCA9009625FED6E6181CE2EE8612:1E1CA36CC5342007172C1261959768C4:\ 00000000000000000000000000000000 FD53D3A5CF0AE84E6CD4F53336903AEB:F39D64F848DF16A5E6F3D03DC459A4DB:\ 00000000000000000000000000000000 4190FAF3D1F5B836F34B6E0D786802B4:30243B37B0AA5D7143F3AEAB57BE46C2:\ 00000000000000000000000000000000 E62ECCCF59A672463BCFBB384B5535C6:4CC047EF63B6D3CD41A5E2E2462570D1:\ 00000000000000000000000000000000 AE41BD59502A0CC6DAE7E9421854F7C4:17892D8679C543B025EE84230BC8B8C2:\ 00000000000000000000000000000000 8F094A8E5134FB06CC1E77D0542AE5F6:CFCD1A77DA12D6C79622EE61C4994F2F:\ 00000000000000000000000000000000 B11E3D28143AF33E2151E20DC9EFDB23:A31237E0F2CB986413E3323557EA1C3A:\ 00000000000000000000000000000000 E9637CE7F9CE8B647E560EEE8249B679:37F2B64F5FAA034E5A80C36E3D0A7AC6:\ 00000000000000000000000000000000 D41B8500710948B58294F5A77391EC36:E12FB1156FCFF78FA862AAF199437E48:\ 00000000000000000000000000000000 0AD9BB60CA674E99F7451383605E6112:A03BC6579A199A2F2E4CDC3353CAD7DF:\ 00000000000000000000000000000000 87BA07D6AE903577E59674C3280D59B3:D2BF2C2DE6F8FD4F879D16F96948226B:\ 00000000000000000000000000000000 92CD3EF1DF2102592B7B934E30971274:3CDC2CEAF4AD7A0E9973117B724136C8:\ 00000000000000000000000000000000 CDC62C36124C52D43864CF072D664410:4B9581DAB0FA33AA0C458E0F33C8F641:\ 00000000000000000000000000000000 A264DEC31ADDA880DB44D3D71C56F947:249D99A653422A9A01E5D6FC627883C9:\ 00000000000000000000000000000000 683D38A1C9416EC1121A5B9853B80B07:0C576DEA6233A44810146E0ED3D91127:\ 00000000000000000000000000000000 02E07632B8E1501FBED252B7491109B5:0AD78847637AD074B143DBA3ABF6A369:\ 00000000000000000000000000000000 6075E57D9CF6038882173A7F1E0B6B3C:54470D4B79E9376E68202C84E7FFAA0E:\ 00000000000000000000000000000000 FC44FFC49644133BA8F38B6B413F9B29:86BE58BB56E46A838E665A087D0AD1F9:\ 00000000000000000000000000000000 51C42552F01FEFDA492F6AB73584850F:482DAB7D2E967D6C3311BB6EB2F31C81:\ 00000000000000000000000000000000 10944915AACC670E23F4ED5CD98060B7:7C5F56D22104F4C73DE80EEF912CD774:\ 00000000000000000000000000000000 2E712621DB2DE5988041135782E613AD:ECDA11FD5472CCB163AC8CA311A5DF73:\ 00000000000000000000000000000000 0E3424038BC7047EDDDF0F3CB39F67CA:53E0F05DF0D4982708585E87D0789DBD:\ 00000000000000000000000000000000 0D94BD2667DDF384170B7CC0B725AF75:996E17E32523578DFF2B760CB49FA31D:\ 00000000000000000000000000000000 DD3E7CBFA877D46641F36CE6119D7CFF:DA019370BCEB7F587FB078D59A948891:\ 00000000000000000000000000000000 42FE27B2956E244C76F1625F22A889B6:3117DFE6E8641573030640CB6F5A9556:\ 00000000000000000000000000000000 2911CCE1311117276FB3B7DF33B55108:F0CCEFB7E412E3C83CCB1C16B275D840:\ 00000000000000000000000000000000 07F139B45971C6A2840A87BC94715F51:44AC477F1E12DAC54F7D9F4AB4D597AE:\ 00000000000000000000000000000000 CDF9F06DEB9BEC8B7D3FCAFEAF215E1A:36BD74FE0E68C6E4D791A526EEE0AF07:\ 00000000000000000000000000000000 F9EDCF2F43AB9BF55BE12A50F1B96367:12E01CAE32687BFADAD694D2B52AAC7E:\ 00000000000000000000000000000000 440233A437679347D8D7E98FC967C278:81F7C43030989F9D5B41E4FAD422EE1C:\ 00000000000000000000000000000000 5BFD6EEDCA5FE8CD57348FFE1128E804:780F4FF8F6DBE3F2F48BC65F0E737831:\ 00000000000000000000000000000000 D59500075A5D6F3412A6F4D6E70421A5:E2317139E45C8A5CF542745B79EB1E98:\ 00000000000000000000000000000000 0B875ADEC58FBC95198C49C9F5FB1767:1CC7DBD69CFDF1108744C12D5B249684:\ 00000000000000000000000000000000 56A7FF028345172C4C2447674C662509:ED35240E15DBE9E0A2F13BAE0471BDB9:\ 00000000000000000000000000000000 A5612F7E740B3B66CEDD046F0A5A1A88:3E563E21742D0210553A9BBB356FAA24:\ 00000000000000000000000000000000 BF49727B6A2B10E7708CCCD4BF24EDD5:33D2A385C1E5C675FCCBCEE0E43F1329:\ 00000000000000000000000000000000 CECF03B03EBCFA19C00056E19495FFBF:F075312AA58C03DF583FA16E730FAF56:\ 00000000000000000000000000000000 A7AF5CBE81D125FF604D583A50B8C00D:C4A6996A7F826F0D7126ECE1CF01E615:\ 00000000000000000000000000000000 67F6C13577041F4BF64F47D4C87DD9B7:C1C4C033CBFAF73A2D0D477C2B32275E:\ 00000000000000000000000000000000 FFD59439BD6B6C022AAB2F40C7ABB76D:E41211B5585A2E17881643C80B2521A3:\ 00000000000000000000000000000000 489D934A474700C49AFA42309C44A29F:7E94137A70C5A5757ABB58977C753626:\ 00000000000000000000000000000000 CC9D4E7E3A40D3E7B82D52FE59C15A28:C2DF7A7DCB4FA5E1BEC3FA0EC9FC06E1:\ 00000000000000000000000000000000 5B94C5125C4DE35E5587A93708E2E748:CAF50E7CE7623CA7970473867D069C5C:\ 00000000000000000000000000000000 79257DD42E664E92177DEF817CF86C93:F162F9C2E0AE24F10ADA56C3AB72C918:\ 00000000000000000000000000000000 4C9FEFCBB009C651D19337B0DE1B71FF:8231DB207B117B719E2C18E35C8EDF61:\ 00000000000000000000000000000000 5C17514070A79F2298252F43EB95240F:D6E1035BB55EFE63DAE750E874122D08:\ 00000000000000000000000000000000 7587363E4FBAB6BAC0A96E2E301E2F9C:BF0E4C121F4D92ADC66A58850D87B336:\ 00000000000000000000000000000000 2F34D0857475621D88F67B4AC932F63F:DC26468C5DB40EB9B69E2B968B6C9BBD:\ 00000000000000000000000000000000 1CC86603D53675CCC0360A362D62AA13:C3C9DCCB758A317630FB54186BEBB710:\ 00000000000000000000000000000000 13E024CF1C4EC5EC12DDFBE451462E9A:DC386958E72F8F51BC13191A5B34F3B4:\ 00000000000000000000000000000000 C9537865387154E4FFA9600D3643ABDC:1305E15912CC66A2B376EAD51CC48648:\ 00000000000000000000000000000000 A0B4CEE79237877C1431AD4CEA5CAD1A:074F192AC9EE825F569FD1674554C3C3:\ 00000000000000000000000000000000 4CAE87180B737168FE61765A2C13F393:ACC37301367543AB4FBE6310858A68EE:\ 00000000000000000000000000000000 73F66077FF86A53A528B7443D15DE894:32AFF7B87AE33CEA4539800A700510AA:\ 00000000000000000000000000000000 CADC2699AB888BAA7C61ABF4CCDE097C:B4FBD33EA3006CCF44514E2DFD6E994D:\ 00000000000000000000000000000000 F9A02333EC078EC9386949BEAEE3E77D:BB3D1AB3F206FE54EA92C9F452735F7F:\ 00000000000000000000000000000000 592D7FC9A5D85637C46DC7A80EA0344B:AFBE7E97575E89299AFD84BB85AFA1DD:\ 00000000000000000000000000000000 27585AF5E51E71F754FE0065C109896F:C15BFBA06F1BE380A4DB959AF9810676:\ 00000000000000000000000000000000 B999BC62DE1F2703CDCCB873176B342C:DC91C862BB49B7D23A01A13C92E0F4BB:\ 00000000000000000000000000000000 990FE45A78668A51DD3A2198DC94E8E8:97C3D586BFD3F6DE6F8F839F3CC9F9DE:\ 00000000000000000000000000000000 E12074137236C60691EC10AE3AC3CEB8:787A51EA74E1060766D4728B07C3AE5E:\ 00000000000000000000000000000000 B1AFE403781D9C75D2D10623D913BC55:241CF4705AED389F6B46D0AC8E797FE9:\ 00000000000000000000000000000000 C25657A5D97B31F96BB7DE1442622248:D5811CC2D865EF53B64E5A7CF59C467C:\ 00000000000000000000000000000000 2E8ADB82E854873F66B1DFC087318433:A09F4AA2E0E51767D051C1FC114E9D30:\ 00000000000000000000000000000000 F68DA1B6489815BC440C3D897A0F853A:36AB29DB1A0E7B295D8F61A56526526A:\ 00000000000000000000000000000000 18ACD883A6BD96CA32C7579981CAF789:92DD5D2080CF51484C93ADE891361EF5:\ 00000000000000000000000000000000 B0C3AEA8F19EAFB8FD7E986EC6FA3266:4F207BFC5E10812C827B13777360E6AC:\ 00000000000000000000000000000000 5E2D15D529FCE2A605E7CA372BD1B33B:C5E89179B2D955D740866AEA628F9C27:\ 00000000000000000000000000000000 B6527DE3B567C10C10709CB44801789B:11E9B1353CCCDDFCCC63D14674F20709:\ 00000000000000000000000000000000 6C7C9922FE4E48A3DC85D4672A5064E5:44C1528E8555388AF8B21E74078E9C15:\ 00000000000000000000000000000000 BAA1457430B8D5D3BF7E12AE9BE3FDD0:3BB8312ACB386EC82150C59BE2CCED37:\ 00000000000000000000000000000000 C210ECB8699792F39E7CCCBDB9671A24:90543622D6642AB3A24D7B31AD96152F:\ 00000000000000000000000000000000 3DF1FF376D026324BB657FECA2A03AC5:CFA51C14006B922AAE044051BF4CC446:\ 00000000000000000000000000000000 7470247B84F34BFE5B9F388FF30C7649:78FA69F113F617A4EF68699C28B6514E:\ 00000000000000000000000000000000 E4413068106FE78F7C5BD3223AB22F9B:D8F8E4217C642BA8AE8A91D49DDD7A8E:\ 00000000000000000000000000000000 95DCCB623977758D63621B6D6F9EE9EE:46FD7A6DE88C7607D9F2B0DE2CD366DC:\ 00000000000000000000000000000000 92B11A8AE5474A5FA0969A4B205FF0FA:A4D66D791EE8D4894FDF61BEC36F9A77:\ 00000000000000000000000000000000 81F5CA98D085E7F3EEB8B7EC9A7587D5:26E14F3BFC53B8247C829E29AAF36978:\ 00000000000000000000000000000000 FCB53FCAFCD1B14ABBB8DDA290A295C4:B0DF814B15FB6F0AA321E44A322C8CDE:\ 00000000000000000000000000000000 DEA998B86C1AE2AC866DBAB93AEF5AD1:1DA3F40C119AF23D85E434ACD90BCE50:\ 00000000000000000000000000000000 0884D66B4E154E3CD5A13384A181F229:1DE817E7AFB8B87698C86285633027F6:\ 00000000000000000000000000000000 65512F9F2F937A058172B0B255A67B67:8308565021CE65DA96CBEFABAFDB03E2:\ 00000000000000000000000000000000 D166E04AB120B82AD72B63243F9857C3:C5D055C3792C34A2C0830F174EF60F4E:\ 00000000000000000000000000000000 81B86BCD54B212E09D94ED7A6053D136:697642EE1D288AD0E0004F7CDE0D11B9:\ 00000000000000000000000000000000 B27258323A5CB9997B729799B2DF709F:FC4F383D27CDA4AF3DE9962DE95A9C9A:\ 00000000000000000000000000000000 BC9E6A0F55ABB6AC49F8A41B8F2DFFA2:34CBAF03126E517DE3F851A505A2995F:\ 00000000000000000000000000000000 891E3708A695636C791A7954B2263075:08461134E1B40126FC24D3BF0DF1E743:\ 00000000000000000000000000000000 FC48B079D9649987B24A15F9E0A3E00F:2BDD51F61CDEB752E07A4AD3AE3D7FBD:\ 00000000000000000000000000000000 2034B9788B8AFAB21791389E1ABC01D9:658E89F1B0F1EC177855A8DA60EAE99F:\ 00000000000000000000000000000000 F974D4DEE825FE43C97ECE434B4D2885:A0FB5361050AF4D2236AF62C0BC73D78:\ 00000000000000000000000000000000 B611BBE6722CF09DB817A04B2E047909:FD6A9802E511A1C8D89447CBC18438D0:\ 00000000000000000000000000000000 27212C758C0A0DA224131CECF3FCDD37:C47C31032D5D6E5D81634367B4AD06BE:\ 00000000000000000000000000000000 595066C1FF549B917C318676A408DEDD:8FFAD5759EF79843A30BF236D3BC81E4:\ 00000000000000000000000000000000 91A284663826FE81E6D615B870BC5EC6:9D5AE4A39CAC235A5E732761F2C33B10:\ 00000000000000000000000000000000 BDA05A5C43C64FAD2F8D5D980AB8E682:9EEA78142CC9453D3589FDBABC2FDA68:\ 00000000000000000000000000000000 840D3899332A3089F213B71356AB50F0:F8DC249385A0AD72AA2D7E2BE22C088C:\ 00000000000000000000000000000000 6DDEAF850B8DE1D95B17538ED3B1257A:0D05DC4CF2879722AB30EC1C651F27CA:\ 00000000000000000000000000000000 433CBB6339EFEF9C73AF53A947AF1695:0DE8E406EECEC22E6319E164C71EF908:\ 00000000000000000000000000000000 1C437E29DCC4F4B06B7E3E35CB989CFC:B1661E31685AEC6E05A759E29BC8F221:\ 00000000000000000000000000000000 9C3B693D9826980B8512C357CFDF1B41:2558229759A3A835E99B60F457BD9C23:\ 00000000000000000000000000000000 C073EA45C292185CD446767F1E885C0B:BFB3FAA751C802F63A4E88D5B075EDFF:\ 00000000000000000000000000000000 517ABC892B0F7E341D31952AD76B4F0F:8362B9BE129084442BADAB1E1937C661:\ 00000000000000000000000000000000 BBC92940F2DAF0C3AEBF4187F57136A7:32A3B0F226F0442161FFFCE8B130EFFF:\ 00000000000000000000000000000000 4DF202C89337B3476B725B6EA0854046:D398608144210678B768791182ED5A93:\ 00000000000000000000000000000000 A53098F2C8BD8222D8D1B437344C5B30:263B4FFB812546C2547CF19EB0751289:\ 00000000000000000000000000000000 A470D019D0A22DC6AD220E4CCEFBB6BE:03D99CD24B403EBAF4D56BFF5BF180D7:\ 00000000000000000000000000000000 6E577625743EB0874AE21B8355CA0D81:0469204FD9B02B490E9B1CC4EFB4D83B:\ 00000000000000000000000000000000 395EF2B04C035E1E966003CFE6599B1B:BDB2A2C17E50B034777A04E107264F31:\ 00000000000000000000000000000000 7B07AC9AABE733D9865F2D1E586C40A4:2B0785EA30561102C79AF30C095ABE1D:\ 00000000000000000000000000000000 51ABD478A711854204F64B6881F76852:C771AAB5D264A1E6E8AE7CC19F00D4E6:\ 00000000000000000000000000000000 57DB85FDFA9DFD533A6987A3FAD322A7:CC388408802856093A6C11BE5290581F:\ 00000000000000000000000000000000 C4E5BFB3E17AD60B5A5829014820B5C5:2E3269861EA631CDB2383C29D4D506A2:\ 00000000000000000000000000000000 4829C08DBFB9059FF867E9DF9A703D27:D15BAB5E15235503A5D8C795C96CE704:\ 00000000000000000000000000000000 2C4CEC15D7F8C6A4B240F67A33BDA4BB:21567729EA6C8DD3EC43DC715167C6CD:\ 00000000000000000000000000000000 7AD911480D5819AC796825B394F59957:7822F4F8946068FFB9124EA563A8BF1F:\ 00000000000000000000000000000000 423B4B359B1FB480187686E67A236B5B:B846A438131E0B4C5D239CAA95064058:\ 00000000000000000000000000000000 7BC28B5D37150A879F378EF1BD7D1EA0:8469A91626AB6D5356BA6891919B61E3:\ 00000000000000000000000000000000 CFEB7408AD592ED2D6C5A697EF23EF66:BE31A1248B97A5ADFF4B66C555B50402:\ 00000000000000000000000000000000 EBDAB6F971A393F2F06DB086A48FA53F:7C729F296DBAC0EC710639A1B14D2222:\ 00000000000000000000000000000000 2565D77254F3627F767EFB1CF14269DA:F0CF793A693B57EBBEDC7ECBE6472444:\ 00000000000000000000000000000000 D1C2D5E6589B714A1945271DE12A81BA:B6DF513288A4DED5CE147BEF740FFAEF:\ 00000000000000000000000000000000 3A4583DE24164F317C5A1A93B9305402:491D13F5238037889DEE07B607E21DC9:\ 00000000000000000000000000000000 ACB28C12990D69408E6021499156CCF0:2156CCFA4FB525F384E4C73335189422:\ 00000000000000000000000000000000 AEB020A13AB7ED94FBF69BE0AB407678:B2E8D35C8C0AE750A343AC9E64D11287:\ 00000000000000000000000000000000 2D9F0E92AEBBA0117AD2C3287BA51187:DA6AD4DFE5884A1ECB2EB6BB95BD036F:\ 00000000000000000000000000000000 55306BD6170500DBF2732E3FACF7C698:862B27C7CDEF0373E27E924BAA8552AE:\ 00000000000000000000000000000000 79505474B2EDC21FCE061DA97167DC76:9E4193947309A7167ABE371B7051E049:\ 00000000000000000000000000000000 73A093E22E3CB8671BA64C0EE14AC3CB:CCEFE03CE2EA144E50976F18BAF1B354:\ 00000000000000000000000000000000 D0501BDB4D423F058D06D2105FEE293C:A4988B0B18EC938244DCB35C82BE3EED:\ 00000000000000000000000000000000 023E136719CB97F52CDBEE3089394F62:AFF56FC36889B2EB49035F1218CD847E:\ 00000000000000000000000000000000 48EC313A173DC1C99079251ADCE3B7D3:3ACB20C17A5FACAC7F1B1BBFAFAF3E30:\ 00000000000000000000000000000000 2352B804B425F689995BB40A6FB33A04:A1DC974297F042A6ED4403AA5A344BCD:\ 00000000000000000000000000000000 E61C4C2AE973E6D6AD1CFC376E369B98:BC67FEC8D78DBF170F5A646072911204:\ 00000000000000000000000000000000 0571F553FC3559FE0B72598DCA3C8684:79A7DAB3EEB1A4F8C70CAB9D8AEF16CA:\ 00000000000000000000000000000000 4B01043AE8459456522F50A67DBD752F:DDF39B3663B310031C90C5A8C366DD2F:\ 00000000000000000000000000000000 C0793DC7F42F64CEA0FA90B9F95A8B2B:45579EC1B6FB2121C1943547FB846ABB:\ 00000000000000000000000000000000 B8C74F4C943A9CAC6C9A78E1824EC318:F8A2465668526210660C10A140ADFBBE:\ 00000000000000000000000000000000 EAB4FCD6326E0391BBAAB3C29527CDD9:ED54FF83DEBD9D4E2B4B6580FAA9DE09:\ 00000000000000000000000000000000 470AFEF36697D24C06982FF4331AFF26:5EF558685DE9AA79856D7A7059FC48AF:\ 00000000000000000000000000000000 350CD1B0E4AB2B41DBEAD22397F9272C:ED71E97B759F9A361D5893FA91A66AFD:\ 00000000000000000000000000000000 B847B4B1DAC15B83B7E7CF4836742CB8:C7471FEAD8C9368076E47018C3033109:\ 00000000000000000000000000000000 785115A2B6F073597A37DA4F2031C94D:33A86ABE68E69A42BE5565104833B20A:\ 00000000000000000000000000000000 4B20B005906093B2C01D99473056A74B:5C7098151542379A4DE40DFC04C46D24:\ 00000000000000000000000000000000 DFC6D2C78186F1BDD8A54CB2515837E6:6347D893780909693882E89D5D79263D:\ 00000000000000000000000000000000 393A041CA6555C4A53AAE66B5AEA4200:14F25D790263B1364E9128E730ED5B1F:\ 00000000000000000000000000000000 14DD5281E350E0805853C94BD9016AAC:6A3F4B41E35727F7A50CAC5F55A6AA56:\ 00000000000000000000000000000000 21EC9D29F9CFCBD4981EF5C69A12F057:866EC808A008ABAACB5475763CA00AD7:\ 00000000000000000000000000000000 9F2D5E03E6B12849107717FB1BC16025:018BDA98D7601F0531607DE8BB4CCF1B:\ 00000000000000000000000000000000 160B4F410FF5EE520FC768FF484F21AA:C4B17C980D4D4718FAE5586B908D41D2:\ 00000000000000000000000000000000 82DE5A5F07149CFE150905E6F9786AC1:3E824827A39B6219CFF1C3ED52CDCDD9:\ 00000000000000000000000000000000 3E5DE770A898C7DD4120B0CE207CC089:50219CA05A510433481D6D12E36BD4D6:\ 00000000000000000000000000000000 4E13E9B2E1CCFCA49DA3A6D8D85D5245:D44E0C864E5E538C2D1FB62E63512F69:\ 00000000000000000000000000000000 B40580746E450E2E0EED4A9B7F104E83:D1EAA4CE78B40BEC8E505AFEB992B304:\ 00000000000000000000000000000000 C48EE7B9A0AFA7519BB606968869DF17:7CEE0F216823CFEB5087DEE426BCDDEE:\ 00000000000000000000000000000000 0E177D4B50286A120A5ECF0969AA069D:36011D7266887FD904C95921488512C8:\ 00000000000000000000000000000000 BD0431A51ECBCB80220B3BBDB13B5732:F826B9EF289CABEFE753E90346D727B7:\ 00000000000000000000000000000000 7D007D5A6A2F26680458BE5C345E08A8:E798CE8B9B0BDF637DB2D3162EA2D3AB:\ 00000000000000000000000000000000 891DDB587CEEAE3F6F5F6D470C9667BB:CB09FA09ADBB747CB29EA2FF5E5C9792:\ 00000000000000000000000000000000 AC95F9EBB80B0E5994E0BACEBDFFB56D:966D3A3B90FEDD37C2CD616304F90C81:\ 00000000000000000000000000000000 CD723A1E9EBA8A9FB1D0F6D544953AAE:17294A27F2DB0F6501C95B669CF726AF:\ 00000000000000000000000000000000 C3FF8EFA00F672EEFC63F752CBD7D136:1EC5F82A3F4F49A6E44557A9A8297EF6:\ 00000000000000000000000000000000 8B4A66F04202B64A112D733F79A91CEF:E4DB812D84FF9B6B4314A21AA756F7E0:\ 00000000000000000000000000000000 DA250D691E273D62227B024768962F1D:5886F7436189C242A9C422F0BB572EF1:\ 00000000000000000000000000000000 F0BAB5E01B892AC144743983F6E8D566:B9528FD6EA14018AA38AB00009D10226:\ 00000000000000000000000000000000 B89DC4BDB7D7F6757144960C86634754:0D19223B03ED7F99033160FF246C84E5:\ 00000000000000000000000000000000 EBE504EC3BC160485B7CE65EA2A19785:880C1B4FFFD70736E8BD518ECE5B17EA:\ 00000000000000000000000000000000 2FCD1A4986E31A98361B90B4E74E7475:930C22171DAD582B85CEED022AF43D16:\ 00000000000000000000000000000000 14873B831B719DB9901CAB9FF563A851:2313DA90A38D6C59FEF0894DA350CF58:\ 00000000000000000000000000000000 A473DA95CB0B4C244699D8DFB4C2DE8F:45DB7B9E5FCA9A440F530DFE85AF64BB:\ 00000000000000000000000000000000 027A8941207C3630ACCF39EFB26A80A3:52C9F6F83608D31015D10CC7EF7C144D:\ 00000000000000000000000000000000 33DE5CAC12F645367076B88306388990:7DAB9967790C06A87F33888372568FC7:\ 00000000000000000000000000000000 92D8177CD2FCB399FCA7452284FC7748:43DE770DCD53EFEE430C76428474CBAA:\ 00000000000000000000000000000000 DD201A0D1654D3483B8953F87D0E48C7:EF3E3A528E851DCD493DFD8F823E4364:\ 00000000000000000000000000000000 DAE0E891214688020D99E6CD00DE4C01:347E7C0C421FE54A8C8CD27B8665321E:\ 00000000000000000000000000000000 EA9BD3F71C846DCA01001F562E76989F:0B4E96149B5E626A93C975A402193846:\ 00000000000000000000000000000000 3295F4905FD6722814D2933E226CDE48:71DC22BE06655F3B953379E3FE2B377E:\ 00000000000000000000000000000000 5819F527AA6C571EE35EF99F05300881:97D6108F2679638278EF8C99C7A7FC06:\ 00000000000000000000000000000000 00B34FCC58B29046CB519EDCE34A5BCB:123ECFFED7975F1FEC75D6EDB904E663:\ 00000000000000000000000000000000 B6D79518E3D17CC84FA44C5F951834B7:A5950E42996C2C09567AF382325E23CC:\ 00000000000000000000000000000000 25FBFAF468DEA60D982F23C50E6FD9FE:248DB0FFBC9F4501C122007BF395427F:\ 00000000000000000000000000000000 21C0F5D729E9799FDDC7353568EC3FFD:4BD385DD0D2D3B9FA44AC799355355B7:\ 00000000000000000000000000000000 C273D81BA6A15FAE72C08FC06BF95C1E:A52497BF1F74F58FBAB8B64431E8C3BE:\ 00000000000000000000000000000000 395450944A685821818603DA1B9F1BC0:0E96C89302DC1981B90EA546DAD5FAA5:\ 00000000000000000000000000000000 14616A135522A7C35B2534580606A204:97A1547D2C4668B3598ABA7865DBD33A:\ 00000000000000000000000000000000 AE4F32993A77A53EA6687BFA3A83CFDA:817215D2F46916D13B5B6862CD13ECDD:\ 00000000000000000000000000000000 86BA6D9579C903BB160A7A4AC18DBF31:909DFD858826F1F00CB6EEEB1CAF9DA8:\ 00000000000000000000000000000000 6BE21799427582127E942B4D34461E04:5FFCD94BC401F32F827791EA980609F3:\ 00000000000000000000000000000000 8496B480BF89717FD1819B0AA53CC33C:95BE56001901C98C595393455399F0D8:\ 00000000000000000000000000000000 FA70BA75B820F851DF973160BFB07C9B:75259AA8E1AE7CDBF6AED6B3E068929D:\ 00000000000000000000000000000000 00DFB0623FE65356B04FDDC1B28289D1:B87A487B4ADD0222754510189DBFEE89:\ 00000000000000000000000000000000 AF4676B327402F8F6C61A047DCCD434F:852014F8BFC2BDD51F16CD8D083B0EF9:\ 00000000000000000000000000000000 C6C342C67C699603ED3CDC5A7DE9BA55:C442DE6F7FC76EBDF529D198DAA68509:\ 00000000000000000000000000000000 7902D25C9FA2A0A5932E4FC70BFC2C27:FC4326CAB1549370D95F9D4B0E8F85AD:\ 00000000000000000000000000000000 BD681CF631503024FD6241A1F3BAE7F0:1B9C959CDF8AD16245264F5E4A9E319D:\ 00000000000000000000000000000000 3503193D1F3252DFF9AC83311C763700:D07C6880E968DEBD2941C4FEF1D2251F:\ 00000000000000000000000000000000 0492643AC9969F4460C1FC0804A4619F:D4E92987DEFF3CCCDE33C8B590122B6E:\ 00000000000000000000000000000000 FA9A1D95EAEDB684909E9F683E69FCB9:108D34BC88CD8D59E8486FDF82FA62EF:\ 00000000000000000000000000000000 22564DFD262798164A2939BFFDCEB281:06B77B0D8FDCDCC3586C1CA2502626ED:\ 00000000000000000000000000000000 45F93E6EFA2EFD9A0C71EE9285EFA29D:2E2D5BB4037B2E2FDDA09D8BE9F4EAFB:\ 00000000000000000000000000000000 806873410FD9DD61A715E277F08BA4C0:83F7323F69379CC15B75C23BF236221B:\ 00000000000000000000000000000000 77F3A397DD6079EF077C2A8565AA980C:98EDDE96A3C905129A6D5E398AA9D73F:\ 00000000000000000000000000000000 44F8CFB955F7171EFB8DEF067E2D673A:EC80B9B03CBEFBB70F33D3170C606671:\ 00000000000000000000000000000000 AF94A4F2482B49FF677E75E559A3BC29:9B7F527280418569953F83AAA6D94800:\ 00000000000000000000000000000000 54FD46CC08BEA6D09F4F8CCB2FE62864:C0CEFD5BE629252F9CF37C0EC16C1755:\ 00000000000000000000000000000000 21BAC32D30F1DE944D1F5275FACEDF47:D0737904989C17ACD06A5F9A5DBD48EB:\ 00000000000000000000000000000000 B1D9D5644A5D66BC8E51E5BF6E90E338:D8F948251535FCD67A0CDFB2F0E0258F:\ 00000000000000000000000000000000 3B9C3639E11FAF597A40A8D13CCC27CB:5C144E59D0C09671EC3CAB5A0CE39392:\ 00000000000000000000000000000000 AAD39B21BD9C45D92DD8B03F8ADF8295:063A2EB89956EEF09BC4A57DD23D6A77:\ 00000000000000000000000000000000 198816B1AAC8BD77E416606A77DC6998:240AEA2F55274B8A80198B8758B733C1:\ 00000000000000000000000000000000 612083F9D31C0AE6CDDFDE9E7421F1E5:21986590C1F285694603769D3AF6D7E0:\ 00000000000000000000000000000000 C0EE1A1F02820CA8EBBFF11B78855C5C:77E8A31F8AA17DE52DA7CB0D1C0E61F2:\ 00000000000000000000000000000000 57167699F08E77A6B075EA4D9988D384:6A3F8EDEE484A2C4CF375ECA4F0ABE8A:\ 00000000000000000000000000000000 5C5B9F6DD482F121F6B7EDA76BC98D64:8043E71AAAB12504944BE7149558755A:\ 00000000000000000000000000000000 9F7051BF58E623116C3A9982140AEFB5:F838E64CD3C5A8578246D5B6665004E0:\ 00000000000000000000000000000000 EDE3AB4922717E465A2BB8BF98464CB0:863BDF8DB9344C685C6C25AF1D95537D:\ 00000000000000000000000000000000 1DD33935C51869A29D6DC8B7B62DB731:6639463A8E9FF3EC2988D64C2791242E:\ 00000000000000000000000000000000 181A77E8054E8180F503D0501B479A48:7A37ECBF8705A4D58576CAFFA4F4E7BB:\ 00000000000000000000000000000000 58246965C1554A72E20BA7C61A52E3BE:18509EB535EB4CBF20026872A4F6862F:\ 00000000000000000000000000000000 3FBC39E715EE2B54022D9FCB33E07995:3C80350C1EEE381E2069AC95ED8009A2:\ 00000000000000000000000000000000 FA5BE2C6C03C878B520502B6D24FC80D:E0E69BE51245C8EDD65CC4CF714C9446:\ 00000000000000000000000000000000 6C037028C56B4BA67FC37C32A8F9A80E:28B5349E4A4C92157BC0205A7F47C588:\ 00000000000000000000000000000000 E9BA61E5B601690936348FC4258AC830:4CA1FE7B0A3E84E71C54DCCDBC606367:\ 00000000000000000000000000000000 9435CBBF42A71716C4A74208CD0769D5:EA6043518C041C3AB12D14864D9B707B:\ 00000000000000000000000000000000 7FFD7CF31F0E4B34FA6622E8DA4C6EBD:EAFF664EDE5BFA29021E0DB91EE522CC:\ 00000000000000000000000000000000 5D995FEDC45CD61D83F1BB40DA911AB1:803BB0CDC8C8F63DF714BD906AFDCD10:\ 00000000000000000000000000000000 216018840FF6B12272E6E9ABC014B037:2662B6DE572DFC8E654F528BCDC25B96:\ 00000000000000000000000000000000 8A64E9D30422E7EB189885ABD947EB10:E41903DF1CC561A16EF2D1ACD8FC67DF:\ 00000000000000000000000000000000 E8A317FAF7BA8191E4AE5DF588EFB0A4:6848773A5F6A0CB4014EBDD7243C626C:\ 00000000000000000000000000000000 610A7A480A667E50ECC3921DC2487868:C353E8C4B8781BF0B38E5714F5D56D03:\ 00000000000000000000000000000000 4DD3385F15F88D8E1D9FD368F550C7DA:DAAADFC4A39AC95A2A63CB17E0BEC906:\ 00000000000000000000000000000000 6E5DD5F8B67658FC703EBC8048C8C99E:F5935C19F405DF2F9FC7FAFA93028DBE:\ 00000000000000000000000000000000 6DA0C2E3B1E9852AF9F7F19707CBBC23:3AEFA41D48FC7B0A75EC269C1D5EC39D:\ 00000000000000000000000000000000 DA49E4D68C12D599B55E9BF0DA4CB219:3AE5405F74A0A1BB9C587B535FA84068:\ 00000000000000000000000000000000 F928FFEBA72BEDB77511765BDA6CD09B:71AFC5F59B95266F50DC494937A12423:\ 00000000000000000000000000000000 2548AF21AEEF8DFE3FF04DDF8B5B405A:E5B7287515DE852442E24D983A492AFD:\ 00000000000000000000000000000000 0DF7A17E3291AA86F4402E4FEEA5C611:C95A329A8D0C765919D8AC2658374D72:\ 00000000000000000000000000000000 D82CD8AB2BCD70DAB76C334B62FD46DC:64042CE2997637FD2501FA2275D094E4:\ 00000000000000000000000000000000 4B3AAC33855B8C2B67F298A99550066D:265D7119DC9EB745253F62C5B71E4BFF:\ 00000000000000000000000000000000 EF4DFC627069CF6E4F90F6605B9D7A72:F1FCDB6D6922794847BD591B395A6803:\ 00000000000000000000000000000000 4F401C4E26E5A7EBAEEB7C0B47CF770F:3381E7818CB696D62A72D3709296419B:\ 00000000000000000000000000000000 CBCE84F167FC5EFB3E9FB589DA7DEA76:45B39802476C6AD971B70D6DEE9EC64E:\ 00000000000000000000000000000000 429887390F9849375EA60D25BC41B4A6:4E5542591DD991B333CA1FA550368AE0:\ 00000000000000000000000000000000 59CCBA357AED070D53E97C07432F3FF2:77DB690B1FD2149F4C61E6CEC1967FCB:\ 00000000000000000000000000000000 F8B071CB7617A7AC837632B2E0393B47:20704383926600B03B22647D311A48E5:\ 00000000000000000000000000000000 9C5E9C47A7DE9438906878A1969E556D:C9AD815DF2EE5D6705F53E5FB57C4A8B:\ 00000000000000000000000000000000 335B50784CFBCF5EC5592470D8779CEA:A8D4489612DFED5F1E06A057DAC16D4E:\ 00000000000000000000000000000000 D5D3BFD6E8DC346925D458768045E7FF:B8B48D5A3D41D025F4BB4D0590FD8AAD:\ 00000000000000000000000000000000 06CFD19EB8ACA85331941A4C7F3BBF49:CEA1EB1D90A4CC5333EFB7EC0985278A:\ 00000000000000000000000000000000 4BD937898ED831811FA7EFE0885E41F9:7FA882D5AB9253E40897D9A02F634B8B:\ 00000000000000000000000000000000 64CC47590F6288969950876FAB92B506:E56FC52CB8680995DFCAC872C03198EB:\ 00000000000000000000000000000000 6875E36276E349CFCB56DF8E8F3F3A77:831207645E69DCF55F2EB06E7920ACBA:\ 00000000000000000000000000000000 5AB3E0CD4A7CCD85EB017E01D2A9E41C:1487AE58CD0547B8CDAC543ABD7A167F:\ 00000000000000000000000000000000 D6194FB4E11083575F1A321B1DE7C36B:90FA45F0B592E717B7FE674FDEAFD09C:\ 00000000000000000000000000000000 6B44AF3816BB543D52A72C8419247EC7:B27A4DC5B007C97A34A5A71E3F9948AA:\ 00000000000000000000000000000000 0C34F5F71974696A870143913E300002:AD09BF00D24EE0B36CC244DD2BBD3416:\ 00000000000000000000000000000000 9714F33B633228BD25873FDD8A748687:468D78EC6C9DB6331996A7148D7B8D0E:\ 00000000000000000000000000000000 B655B88BDEE3C192CA7E94C115155400:E6FF459DABE888DF3B8E3B0A4E03CD1B:\ 00000000000000000000000000000000 2E10337DDCC5AB4D9A47A7E11EE28819:5523C37014F6663C466549508680AD2B:\ 00000000000000000000000000000000 91DC264E08F890E673DA508130B22132:1F5A4FBEE2294C1E9AD13226CA316C8B:\ 00000000000000000000000000000000 5A961589B16BB11F43228C265A41F4F0:C41F0C276AF8840C1E40F7CDE2C9E703:\ 00000000000000000000000000000000 9279B9E8010A5D5A636A690F480689C1:0C0FE02E45C512FCFBE86186077B880C:\ 00000000000000000000000000000000 588FBCF959D31348507A315577077299:DADDB24A58CE1913C7E050BFBD6DB060:\ 00000000000000000000000000000000 2B7D25F58492426C7ED9676A234DAA73:EC6F70F88767324589B114D49A3D0435:\ 00000000000000000000000000000000 86265091666FA3CB492A6D0B89134FA7:1132BD6B7C2E314329B8C41B3591088F:\ 00000000000000000000000000000000 1D930835D9E22CBB1DC2B32D760B5212:B0FDC9C797ADFC372A32C90E780A18AA:\ 00000000000000000000000000000000 99488407CD0E84B85BD54A4208D9E74A:2D702A81CA33FC44E78423F7CA3579CC:\ 00000000000000000000000000000000 2A2D29555BD65B655F4C351B6CA77F9F:AEAEA1C6D2752DEB743828BE4FD5164E:\ 00000000000000000000000000000000 4130B6271FF1AC8B2E80D7358BC0010A:4A93D8F4A10503D03B61D028142B7317:\ 00000000000000000000000000000000 78BBC849A8E335A3C50F03ACFDB40A0C:CFC2F763D9A43797D7B554B31818B00D:\ 00000000000000000000000000000000 15F7DD0F5AAB45D18CE3FC22E2E0D7A7:B53C28497405CC58DB87E5B036D7A09F:\ 00000000000000000000000000000000 B70975EBBFF142F85BF7A7C46FA969FD:B1F6FF9DA37954AC1CE21F87130DE8E9:\ 00000000000000000000000000000000 682F741F13133286E864170D3423F016:406918CEB508D45A0BF1DAE0936AB561:\ 00000000000000000000000000000000 3FA4581C08D59B03776031143357AC6B:27E92647DD1A9B830FACFB746A8EA4A3:\ 00000000000000000000000000000000 D8BAEF6AC40C0656D5E9D99AB7F422F0:3BBB779C4310EC11923976AC5ADA20F2:\ 00000000000000000000000000000000 18C8BFE83B9C5E73E17EA3CB0FFE35F3:31A3694FAA9166C155CF659E222B6CD8:\ 00000000000000000000000000000000 02178D030AA8FB92095B8D773750BB29:1B56685208E68A64CB98C2EB8FD269E6:\ 00000000000000000000000000000000 C4CFCF7F00A5890089F3E2E6D4A71B4A:33A0170AFE4B9054A68646C79D5F7E06:\ 00000000000000000000000000000000 7B3DAD4BEC66EBEAEA116A09F1C7810E:34FA87844A31FEE5E4BC5A45B2025FFA:\ 00000000000000000000000000000000 E6B59BD0BE313076624A7F27B431D394:A8FD8E9567EA205B33BA60B7FD3713F1:\ 00000000000000000000000000000000 C806EDD853EABF4ABA609D2302B5A4A4:9FCEE6BAAA491D95905D114A21EA0586:\ 00000000000000000000000000000000 530C29591F1EB65C53B66621D815294D:43C79D90E33D1D2B5790B515D202C79D:\ 00000000000000000000000000000000 45480830977917AD000A73B062730761:D8FCA5649A8DDF403409C7B20E49EF30:\ 00000000000000000000000000000000 3C73226C97B0B6A6F199C5B9EA4936F9:244CA0E37F5CA9ABAEF1E316016B0273:\ 00000000000000000000000000000000 759A68CB477B3C4677B591E4490F6F66:DADC95A4CF085B656FB8A247270C6CBD:\ 00000000000000000000000000000000 31295A526C3ABDEDA7CD2B4C4EAC18AF:D8FF5475210EB64CE418EBB062A2AC9C:\ 00000000000000000000000000000000 90E6839484DB6BAB6ABD1A1C4B3F5097:E0B100775EBE4EE6CDE976AF97F7E67C:\ 00000000000000000000000000000000 A77E0B16C5C8AC7DCAC28EF2A377C749:2326C55E35CB224F2916B76D25DAB006:\ 00000000000000000000000000000000 473DE39D6CBED119488590D147A050DE:D45FE4E35DD7E7E8F9C1BE95A3E9AB99:\ 00000000000000000000000000000000 8EDEBB741BE502D3D71F6EB76588D43D:6C85C0C1989880CD89519E5D0F24D2D4:\ 00000000000000000000000000000000 BD77E505D265E0694E18F0DD27614AFC:95345EADB67814C36CB333178F1E6385:\ 00000000000000000000000000000000 FFBDD477A86FA149AABF241A6875F2BF:F7978D6E572A04C5301B4784E96E85C5:\ 00000000000000000000000000000000 878FD448E7DD0A988F3E14BA24A873C7:F5D13F5045698167AC816AD85D08CB68:\ 00000000000000000000000000000000 4724D176D8301A560D9F629C43EF0631:CDCA92D92C0C13944D85AAF6342EE16C:\ 00000000000000000000000000000000 92DDE5DCCF0B92737200C96A7FC2980C:984340AE315F1E35ED7B4D64E7C2109C:\ 00000000000000000000000000000000 D0D5CDFD07003A970D866E9AEBCE49B2:D29523676BFF8722E8E7D4E27ECB7BDF:\ 00000000000000000000000000000000 16D71101E006335AE4EA841B01EDF8EC:9DC42A4574CF4689B1A579B6058A72B1:\ 00000000000000000000000000000000 57263798FAFFB2D1937ED13E9F75F6A6:63D7927C182B59693C7619502C7F09A6:\ 00000000000000000000000000000000 1E06BC75D5473C2E2E214B794722D8EB:FF4445966B84099830C2C4AF3D16C2B3:\ 00000000000000000000000000000000 5B0873294D3044BFC3547C58AA7EDFE4:293FE32A6E13E78417E60C2AC673E908:\ 00000000000000000000000000000000 48B51CD888F14526A701EA3B7686A926:C600CE6D9925A7F29CBDEA5F86EB3968:\ 00000000000000000000000000000000 54DD519813388689F773FA12DBF09E37:7988CC0311DB4DB779342F1CD9C69CB1:\ 00000000000000000000000000000000 7DFC43D180470BFAB6970E619CDF4489:1E2BF65651E3D2F4FC43E6B8E60C2EDB:\ 00000000000000000000000000000000 ED3A0A72AFD441AE48CA0E80F5CAFA99:BBC9EEC98F2F3EB38CE8C3A534AE08FC:\ 00000000000000000000000000000000 9AA5D6C7CFA410FB74D753D3C329D5F6:C90111B9CB525A91F9EAFD987357934B:\ 00000000000000000000000000000000 A254B55BE1A577D34CFAC4967C67E3EE:632D34BE39094B67B3A5CD0651294626:\ 00000000000000000000000000000000 9FBE68B5013190B559D8488D1D18EEC3:E564E92FC5724970CAFE238F39498DA2:\ 00000000000000000000000000000000 3D0E0B9BDC3613B8818CE559748EB180:E682F9AA990E90424FB62BEEB9A87669:\ 00000000000000000000000000000000 23504A5F517D06CFBD6A6CD35A7C6F53:7B95F58B6C101AC54526A1C844D2233C:\ 00000000000000000000000000000000 C3A79D45029979CAAE2B80944CB46381:1E067070C2DFE6FDA961250EBB0904DB:\ 00000000000000000000000000000000 C47FCAC34AD3B94C3C14B1B05E4C4E8C:A661F602ED2B08E4A67605608AFC8485:\ 00000000000000000000000000000000 30E235BBE9548847BC9FFFCB356DCAE5:B2E14131FF6A7043B944DD4C299F9AD6:\ 00000000000000000000000000000000 309CECD7E237BF2BDA45F780B2106414:A2B8FF6B6A4F6C8AD3E5ACEAACE028E4:\ 00000000000000000000000000000000 76D0AF5DF7E20CC6462A16826EB2A65C:58621016906E05D0644A1315F117707B:\ 00000000000000000000000000000000 FE8372E4F0E4E733B16F7284C9928C2C:CD96F8F422D51EFB6451D1C8BC039464:\ 00000000000000000000000000000000 B01E5DB74E62A0115812DD8CD93B8823:B2EAA3CA7F51B22456A9DA1DD31F63E4:\ 00000000000000000000000000000000 2EE4409B33787E6C88625E25C66B693F:103044B5227E28AA2C33D537D69165CC:\ 00000000000000000000000000000000 3F23DF226924DD9E3426035EFF30F285:4D9FDA109583D3611B560CBA61E4CC9B:\ 00000000000000000000000000000000 96F02851CC614DE4560AD8DB80237601:104B264BA70B885E1BA6A8150EA83B1B:\ 00000000000000000000000000000000 CA428A790029D7F4AD63E19CEAFABEB1:FF9D67EC4DD1ABB5ACD03567298F5A3D:\ 00000000000000000000000000000000 F461D29B4120E93DA0E59C89A01CDFC1:6F3C9F8E5DC2D724436F3236C6616D33:\ 00000000000000000000000000000000 654A6C8DC762FCA2B308F7CD8A8FB066:7ACAA703CDAA690F749A0BEB9E4B871B:\ 00000000000000000000000000000000 B037B6F04D8F2F9478AB4A206EAAE041:DD3410E458F7F7B58EB1E491C39CDF84:\ 00000000000000000000000000000000 641739E7AC8221F13A6430283CCA424D:279F7F9E6F090C5CAC5B17EAC662AD38:\ 00000000000000000000000000000000 2634969CE81073EF9A69FE3B71936057:8061C87922DD5CDBD3AC6E37391F52C2:\ 00000000000000000000000000000000 BBCFEC986F23B9697354BB39A8481DD5:EF453D6F902687D29B9C6AC8394F9229:\ 00000000000000000000000000000000 DB2C55A7BB7D0C67BEBACFA60239FF5E:054788911085F32DE12FE3C0D6A2A5C7:\ 00000000000000000000000000000000 4DDBE332134ECB725A9450E5BF5CB187:37F645A215E8350746108086F428F64A:\ 00000000000000000000000000000000 256FDA74A1F7DDC78A0735AC5BF4B8EC:37F645A215E83507B9EF7F790BD709B5:\ 00000000000000000000000000000000 496F0D60F09C3322F2AC1414CD32834C:37F645A2EA17CAF8B9EF7F790BD709B5:\ 00000000000000000000000000000000 4DEBBD2461C99EDD3BB3C3CBF415DA07:C809BA5D15E8350746108086F428F64A:\ 00000000000000000000000000000000 D1B3A0FCE628A7653B62E11724FF534F:C809BA5DEA17CAF8B9EF7F790BD709B5:\ 00000000000000000000000000000000 DC77BDEC8DB018A61688F61EC5DA3F72:C809BA5D15E83507461080860BD709B5:\ 00000000000000000000000000000000 6F878A0A25A34ADB37459BA9AA864169:C809BA5DEA17CAF846108086F428F64A:\ 00000000000000000000000000000000 C97D56C65C479B6A3C98032FCB30D327:37F645A2EA17CAF8461080860BD709B5:\ 00000000000000000000000000000000 CA7D368A299F613C8793C8B197C5B4AB:37F645A2EA17CAF8B9EF7F79F428F64A:\ 00000000000000000000000000000000 C81B7DDC7F57D9D5E4782FDB7FF24DC3:C809BA5D15E83507B9EF7F79F428F64A:\ 00000000000000000000000000000000 2ED61014612B71DED403559BAB7B3582:C809BA5D15E83507B9EF7F790BD709B5:\ 00000000000000000000000000000000 75E6A753077E01A99AE22C1641FFCE50:C809BA5DEA17CAF8461080860BD709B5:\ 00000000000000000000000000000000 B6405E813236600DC256134B92542CBE:37F645A215E83507461080860BD709B5:\ 00000000000000000000000000000000 2009F95CF623369018B643B06C8E3012:37F645A2EA17CAF846108086F428F64A:\ 00000000000000000000000000000000 7D03DB38DCE478EB8D3EF1E78C0388D5:37F645A215E83507B9EF7F79F428F64A:\ 00000000000000000000000000000000 F9165467CB794721F028CBE1ADAD3183:C809BA5DEA17CAF8B9EF7F79F428F64A:\ 00000000000000000000000000000000 D29D576FCEABA3A7ED9899F2927BD78E:130E353E1037C22405E8FAEFB2C3C3E9:\ 000000000000000000000000000000000000000000000000 2D62A890CEABA3A7ED9899F2927BD78E:AA2F3365C15EBDC02F2C4468BCB4E950:\ 000000000000000000000000000000000000000000000000 D29D576F31545C58ED9899F2927BD78E:1B4F0CF494AB7C5D850B8F88A025E5AF:\ 000000000000000000000000000000000000000000000000 2D62A89031545C58ED9899F2927BD78E:B98DD45724870D7B3B0532D9D07EE7AD:\ 000000000000000000000000000000000000000000000000 D29D576FCEABA3A71267660D927BD78E:CFFFA1BB54F8229F54E8B3D9E34710E1:\ 000000000000000000000000000000000000000000000000 2D62A890CEABA3A71267660D927BD78E:86C1ADC8B236AF043A118F13EBEEF15E:\ 000000000000000000000000000000000000000000000000 D29D576F31545C581267660D927BD78E:9064AA652AF016DD80AE3B3791502F63:\ 000000000000000000000000000000000000000000000000 2D62A89031545C581267660D927BD78E:131984E1FEEEBE8862E406E12B6D8CD9:\ 000000000000000000000000000000000000000000000000 D29D576FCEABA3A7ED9899F26D842871:D2E19BADECC2105CC8BF847075785184:\ 000000000000000000000000000000000000000000000000 2D62A890CEABA3A7ED9899F26D842871:9DD896881D2AA0A0B3F8D6C7BD057588:\ 000000000000000000000000000000000000000000000000 D29D576F31545C58ED9899F26D842871:416FC2C9B866CDC518476481F94D438A:\ 000000000000000000000000000000000000000000000000 2D62A89031545C58ED9899F26D842871:0AC42C6E7CB6A77F6F63A0660175C274:\ 000000000000000000000000000000000000000000000000 D29D576FCEABA3A71267660D6D842871:6E281CBD633696F0209E9C7326E49555:\ 000000000000000000000000000000000000000000000000 2D62A890CEABA3A71267660D6D842871:CB9B1CAD03C62AEDC359CC64CA0D8F85:\ 000000000000000000000000000000000000000000000000 D29D576F31545C581267660D6D842871:206369617D077201588ACF59463FC393:\ 000000000000000000000000000000000000000000000000 2D62A89031545C581267660D6D842871:7558A3AD44F85079E3FF9E60FE30D652:\ 000000000000000000000000000000000000000000000000 2AA28347376F4408FB7A29AEF0D05657:85B06641EF0DB99D153D9A9C9AEA1B24:\ 000000000000000000000000000000000000000000000000 C3364F3FA909A07410B75D8AE5BB65D0:BDB9EF83D8EB4ECB7C89FC7D491E5172:\ 000000000000000000000000000000000000000000000000 4CD9A151AAFB1BCB7BB75D6A9399FF7A:582C1174BA7B9FC276BF780A9A93567A:\ 000000000000000000000000000000000000000000000000 47B292F6AC508B53EF7A294E630D3322:FFF0E8A57D5FC4D34678DC62E95A226E:\ 000000000000000000000000000000000000000000000000 B3CDED6131EF45D99F48B827F4D95FD6:8C59577DC6B0C80FC97DD6E4D3DBFF88:\ 000000000000000000000000000000000000000000000000 D3447EBA470D665E8B7A33FC6FAF33F2:3DC9513EF47DC38E2154DA643544CC51:\ 000000000000000000000000000000000000000000000000 29493048AAD0130BE07A331C9390F63B:0FA6A8CF364435CC213F54F8773C87BE:\ 000000000000000000000000000000000000000000000000 DC3F5CACCC00BB778B48B8C79A196520:4826FD43F7F116D9201891F553FD556A:\ 000000000000000000000000000000000000000000000000 48F2A141203F740C7485CC0318D4982D:C20C38D1E7E25E25ED990326A1797488:\ 000000000000000000000000000000000000000000000000 C4B646BEA922A87460B747D86F6F802D:FE5C4361C70143F52C66A8E766692C87:\ 000000000000000000000000000000000000000000000000 2389837737FFDDC174B74738F662CEDF:3222B40C6BAC43150FC753F1E6EE3793:\ 000000000000000000000000000000000000000000000000 45329BB7AED08A421F85CCE36C2629E0:0F83C029C9B964789CA6668006F79DF8:\ 000000000000000000000000000000000000000000000000 2CC9394921BF75DDEF48A2751976987D:CD1702934609E17DE4DAE5188596E763:\ 000000000000000000000000000000000000000000000000 D66F7EEA40266E5E0485D6511F2F2021:DA6D2243BBBA3199169C51CA80B03BE6:\ 000000000000000000000000000000000000000000000000 BC4DE44037D4D5011085D6B1F4C0CE4F:30B9CDB6F185ED17DACAC0C4A377594B:\ 000000000000000000000000000000000000000000000000 DB145C3CCE80BA668448A295686689CC:B981920A5773E47347EAD2A82041F08A:\ 000000000000000000000000000000000000000000000000 251F428D867649A818246A6A5A89501C:15FF894626A6F8C6C9508A171BC1C661:\ 000000000000000000000000000000000000000000000000 A41144E37C63D88B89A8A4C961EAF166:A64D2728DD4CB4723C19326B293DEEBA:\ 000000000000000000000000000000000000000000000000 CFBD07846AFD2BA8E1AD63697DFAD335:7897147055D06DBA61866021D876D126:\ 000000000000000000000000000000000000000000000000 4D93A6438527BE295F94487DD084505E:F0363408AF7BF5BB057CC80E10954D2A:\ 000000000000000000000000000000000000000000000000 0855984A5B6C6C2E3ECEA329356575C3:161059A0D9DE6230B51EAA19BDC84CE9:\ 000000000000000000000000000000000000000000000000 7E979A12FBBFF7FBD96860F0FC64CE27:977C5DAFEA87FC36E92333151AB63C61:\ 000000000000000000000000000000000000000000000000 2088DC2D3E22E480ECFD9A6C76BA2AF7:E7DEF1020109FA00053579B665DDE397:\ 000000000000000000000000000000000000000000000000 B9A8E6AA4E2C99159690D6D204EBEFF0:9E9A02C1952FD2F4C2BE158C10718654:\ 000000000000000000000000000000000000000000000000 E8E06F34C44498900254EFD4F5C99D83:159A90193D7479E0203A929D701C421D:\ 000000000000000000000000000000000000000000000000 1ACE901C77B74E96ECE1462369D7F0B4:F2906FD2C3373B7F0FAC2213131067EF:\ 000000000000000000000000000000000000000000000000 4BF18736FB7021F610E4D7B76CF09F7C:D50E7103A0B29E33EB28D4C843F9557B:\ 000000000000000000000000000000000000000000000000 A76F8B6EB992AE14212A5C2C8809D314:76CC8905AE4B4BE31992E6CDD3F7EA81:\ 000000000000000000000000000000000000000000000000 10DC23B443D51E8F5B5D2F5CFEF9FBB3:A6E61F6CCFF0B2437B5BAB2688A73CEA:\ 000000000000000000000000000000000000000000000000 0F7FFE39F36C8983C922E3704005792F:0D9B7AC709073EDEB0B1A5FAD45DB084:\ 000000000000000000000000000000000000000000000000 8B564AA20FC6488302124D039EDA47BB:7FE01A5559DA077ABF385C8B4319B018:\ 000000000000000000000000000000000000000000000000 EA57D4B949E192A51D6414FCC8315C21:99450709D21B61589509EEE8A1C526E0:\ 000000000000000000000000000000000000000000000000 6108BC56C4CF3BFAEA642E8CCEDD31D2:3040BA7E08D60C8E771B97E250DA4413:\ 000000000000000000000000000000000000000000000000 F1D159B48C2F6C238CB3D003AB0A5415:4A347C9EEBBBB7E28E41005AD5BD24FC:\ 000000000000000000000000000000000000000000000000 DD99B08C18904D3811F2744AA644D76D:D7EBD7E0AA443E92279BA4E1192DD91D:\ 000000000000000000000000000000000000000000000000 F0BF4544145EFB3231E6E6F6CA175912:97F37A9A6FF5101A7FE95F2678DAB6BE:\ 000000000000000000000000000000000000000000000000 9F7B7744EEA8DF923366EE86AE497E69:50191B99DD8B691B2C17C26D98885E5B:\ 000000000000000000000000000000000000000000000000 6177CA790CC736AAF8251290C2E9E43A:1717E23B04BFC70516E37A850454418F:\ 000000000000000000000000000000000000000000000000 E2A7016FF930F70A8C8FDF25F762FD3D:D416724A7A3F4F81288D068797744CC7:\ 000000000000000000000000000000000000000000000000 DCA2BC2308B05927DC6AAED1026B3CEE:318C4B212A74330C9D61F4D852D5C593:\ 000000000000000000000000000000000000000000000000 B6379A7CE597E1295E4354D972B803E0:AF63C3F2FB2065A8C31A755038F2311B:\ 000000000000000000000000000000000000000000000000 20BB84964CEA329371C8D6C19B7BBB79:B63FA7A265E7C7E5140B486B424257B2:\ 000000000000000000000000000000000000000000000000 757D5E6A90375777C0592A1F16582FE0:87A64BABED1F66786FD3E56154FC6DDF:\ 000000000000000000000000000000000000000000000000 B6857322EEB6DCFDA73DE5D43084B7A7:00C805A381A39058F9D427B9DC8960D0:\ 000000000000000000000000000000000000000000000000 588AA36DDF8829787F5F0945D5A02C3D:1ABE11DC97F23734109997AF3849F545:\ 000000000000000000000000000000000000000000000000 CA831237C45F4E8B8A98BE757DC21106:BE727CDD9C8B5027079C75C6DD5D2011:\ 000000000000000000000000000000000000000000000000 C497A25D8F03792631E27277393126F9:A29DBEF99AB979FED40C265BF868EBA8:\ 000000000000000000000000000000000000000000000000 A2B91FE5763FF97A4E9499F53F451D78:19B56E4B04C7B06B96CB5ABD6627E469:\ 000000000000000000000000000000000000000000000000 ECA39A1D3B9D8EBC98EB34CDE71D03D7:D34A3718F58614D409633113C7739F18:\ 000000000000000000000000000000000000000000000000 440045B4B13351971BC409404163D96B:8DD3A711A1D3335A40F499461FFD1ECB:\ 000000000000000000000000000000000000000000000000 D631221F472CEF76BBA73CB2364EDD57:4AE664EE759660FD647AD11E2B5FF593:\ 000000000000000000000000000000000000000000000000 635066186DB6086FBF2A4D1C7CF85DB7:3E71A02D9C753FFD8C58928A4560ECE0:\ 000000000000000000000000000000000000000000000000 22924658C1BAC38B196F4852A1C35B1E:8FABCD731E720D0F464BFAF7313CC1D3:\ 000000000000000000000000000000000000000000000000 AECD1159645242EB40231C45299B02EE:779288EF5750161A8E9948110C27D783:\ 000000000000000000000000000000000000000000000000 AC622AAC79017DFDA35CF4602C049C7B:28A10079A7B447A0DE8894F37B1BDB51:\ 000000000000000000000000000000000000000000000000 AE75A80D6CE8CFFB41D50E09EE65C822:0FABA3FD30BE980728B74B2BE0FF3543:\ 000000000000000000000000000000000000000000000000 B507365EE27C856FF499D825F3DD57D1:494C5A82A6599FF269D028051D8E4677:\ 000000000000000000000000000000000000000000000000 268E8157AEFB28F3F5A402922A5B08B0:B2913443BF4AB448CE42C297ED78018F:\ 000000000000000000000000000000000000000000000000 B03EF1E97D2A85DEFE6E90EBDD13F37A:E3878C6C42A16C388E55C4732B038416:\ 000000000000000000000000000000000000000000000000 5279D8401CD4C4AB27EAA22BABDA41DA:721EDA4C877B3C3611A9DA63AF911187:\ 000000000000000000000000000000000000000000000000 F2DEAE70705494F49E30168A4EF5638A:461B74D6D552DF6DF118ACF76393FAE5:\ 000000000000000000000000000000000000000000000000 61A08772900C83DE53749BA15ADFF518:6C491853745F4DB0C60D22DDDA608C1D:\ 000000000000000000000000000000000000000000000000 9D3929D6A80F57E8117E5B48FEDCC826:BAF62E1A26F7C78A7CB9DAC0E13A30FE:\ 000000000000000000000000000000000000000000000000 F85E31DDB8119F09A45EC30DB408DF05:59F7FE1CF6A3D7970E86574A619C516B:\ 000000000000000000000000000000000000000000000000 20966FEB0CE93ABD78B24A971821FC88:87447915C9F4D8418B2A2CD727B2F8CD:\ 000000000000000000000000000000000000000000000000 811450001E41F56394B9396743E3AF5F:9A460C28AA950C3D051A1F4EC1395CFE:\ 000000000000000000000000000000000000000000000000 56E3EC3B5A911A0793244F86CA729575:BDBECBA37F3ED6B2D80CD257A498344F:\ 000000000000000000000000000000000000000000000000 E81CAD94E521E9587A2D34669DD6C1AE:2D3FDF1C7C9F289D9ABAF6ECAE097CD4:\ 000000000000000000000000000000000000000000000000 CF979E26135DF59109720CA19BF3B9E0:1A5A43E548E0AF0391BADDFB01B47491:\ 000000000000000000000000000000000000000000000000 988BB4391697D4E693CC56185111ECF2:4973A5292E8BD63B1ECEA06851E439E4:\ 000000000000000000000000000000000000000000000000 3DB27FFFA1DBF9E3E653B788D193EA35:A6FC7C9F947EA17AAE4AD69543134E18:\ 000000000000000000000000000000000000000000000000 8BEBAF0A458CFBA90DE4FD329CE63109:63371B4D2428C76F8AF15BFD9826926D:\ 000000000000000000000000000000000000000000000000 4FB2853762D073FE806557B78C43A7D1:F2D1D1382F2AD7E282E35EDB448E37C7:\ 000000000000000000000000000000000000000000000000 F20AFEFE0129D6F3BFDBD788607ED22C:E63EA278E9B563297E28FC4B7B9E9433:\ 000000000000000000000000000000000000000000000000 0039D613D42DD869852E44126EBF9E37:6BFC746FC94BDA3001563D9DFAFC8DF5:\ 000000000000000000000000000000000000000000000000 D56E96E8B632A136C0755ABBE4EB8BD5:FDBCAAF131A5B6BDCB44E5C0EBFAA95E:\ 000000000000000000000000000000000000000000000000 387B2F9C8170A96FBC39C799FBD10AD1:DB5A7AF7DFD5325816F179F3D4C3BB5E:\ 000000000000000000000000000000000000000000000000 A7D65BC6962E99557AE83A96D567CFE9:3697BCB9CA432CF0FBDF8D29828D4776:\ 000000000000000000000000000000000000000000000000 3DBA3171F0DA3FE61B8F8D8D816D5BC8:00FA60B941E72EE4ABD7EDA5383BAFED:\ 000000000000000000000000000000000000000000000000 7016B5A26F566A0CB68113E7A54BBBEB:FB2534D13C44CF6473951E2396BD58D6:\ 000000000000000000000000000000000000000000000000 7F7D76163F7950DB54F16AF542DECEDB:74D872081B6416D5B9ADF355BBC4E906:\ 000000000000000000000000000000000000000000000000 E01F64B3E818C3571FC763F021595967:C3936315C0A5FFF0AE1F1743CFB9E798:\ 000000000000000000000000000000000000000000000000 9F8A86DDE688776ED80FC3D6E027263B:06E080332D9615AC4B38436898467388:\ 000000000000000000000000000000000000000000000000 4E4E722951A5D8398E2B24F5AF54BD9E:2FA6664CA53746DA02BA0A19AC6C7D7F:\ 000000000000000000000000000000000000000000000000 54082FD1EFC1377E65C3584BFBAEBA17:C51BB0BD10E1D5525C8A301F7986CA40:\ 000000000000000000000000000000000000000000000000 D685123436C51E2F904585E72A558536:003BBBD56A684F05FAC588BEE6103107:\ 000000000000000000000000000000000000000000000000 CDBB0B021BD09745B6E3765DA81D7BB7:DF25CE6873E63365EC17B1E4F71713AB:\ 000000000000000000000000000000000000000000000000 D8BB6CB4C5EC462A7040D05761A821CF:1EF3FAF8757B5864A66392F43ED39C07:\ 000000000000000000000000000000000000000000000000 F2637A24ED6B1F3C6EF73083E4930011:39B487DE02F1603CE782716764699656:\ 000000000000000000000000000000000000000000000000 8EC4C1D2904C081A3B862C1515D0A283:2DB7FC96FA3D8A2B699FF9743E98B14B:\ 000000000000000000000000000000000000000000000000 CC976840C38ED63DEA1FB489261AB22D:28822ED55A22A29250F4A907A7773241:\ 000000000000000000000000000000000000000000000000 D10AA53F75B4D56E23E43543ACB2D3D9:73DB1D32049070D84F3292441541384C:\ 000000000000000000000000000000000000000000000000 42FAA774A6DB89F1422568D285750740:DE2D4B4F521C16F51D35B8E6C439890D:\ 000000000000000000000000000000000000000000000000 E8AE2A5BD6F41780D4B78F5A7415BA59:6B83483EFC57408D6208286C8AED37B1:\ 000000000000000000000000000000000000000000000000 0C6F220776A021AAFEDD1A5C1DB181CA:AD8FA2C34414A132F8073EBA3AE01C60:\ 000000000000000000000000000000000000000000000000 674367222CF0E6BFD42D6E904F713DC5:D3C5B5122DDA26BAC7060BF154FD60BE:\ 000000000000000000000000000000000000000000000000 F19CCE49F2AEA18319BAC29EAFC488CE:D73936AEF70D532E6C3270DB25058A4A:\ 000000000000000000000000000000000000000000000000 A02A4E2E535E32179BD3F4D688608736:A98D0271136AF568324BB8D0E92340C5:\ 000000000000000000000000000000000000000000000000 D4415FF1F2CD21C9CDCE175A238DA910:8124ACE84AB38E910FDED0F6752B5FAB:\ 000000000000000000000000000000000000000000000000 23FDE6972BD5D652976B1979D5E0D2D5:E43483B9CD70F3DCA6C839FEB194A087:\ 000000000000000000000000000000000000000000000000 6FC7112407890BEE9B1E58BBF5B19975:BACB0D14AF9E54B2A7C629AEFA64DD1C:\ 000000000000000000000000000000000000000000000000 B63A8BF5D34915873DD16A95AECAF26C:302FCA7B0EDB37847638E24CA5808A3D:\ 000000000000000000000000000000000000000000000000 D3FE2ACCDFFCDFF50165F67CC09A1D9A:2780C756862629A8C4E2629FD8E466D9:\ 000000000000000000000000000000000000000000000000 254E34BE13C63EE93A24883136AFC0C1:B960C333FB15DB2C6580553B13C23AD1:\ 000000000000000000000000000000000000000000000000 035302572B10D5C1B241C87F2D913DCA:9C0933C24C086E48DFD3F419590BBE92:\ 000000000000000000000000000000000000000000000000 3EC84DA124E166438536E49B5C267091:6150B4873F1CBC7A6E9056F9D95076A6:\ 000000000000000000000000000000000000000000000000 8D472DAA240C21E278E342DC3268E561:AC5C5E7CF34D7865C3851E663FCE23DC:\ 000000000000000000000000000000000000000000000000 1EAB4C77EC179FBF9886F9A6858BD9F1:BD0526FB9929EBFF0B573EB93A940D32:\ 000000000000000000000000000000000000000000000000 8F25610DE1E324C8C0B9A91124340FBF:94C5E9A383766B03C22D577741BADAE0:\ 000000000000000000000000000000000000000000000000 B881A04004053C745AEE2A972265F896:CD3AC08893681BC57374BF3B2F14886F:\ 000000000000000000000000000000000000000000000000 9B6E88AF654C8F52EB441B32813E0F67:6CA75A746D588111CDF5AA42860FD7A1:\ 000000000000000000000000000000000000000000000000 08F16B4A01B2B6E4D3FB678AF52944CA:ADFCF161051EDC05C3850A42DC4B8C0F:\ 000000000000000000000000000000000000000000000000 4B06EDC67571EA79C1186766AEA4539E:FD98A23A6A872F2C2FE88071536E4F41:\ 000000000000000000000000000000000000000000000000 12F8F459A9A93DCE3EB6216820CCA233:D87C6BDCC6489B73BC826A54D3ACD17F:\ 000000000000000000000000000000000000000000000000 848A797493A75023D7EE5D9C96E1D956:8A22AA964363CB8F63E42EC7B7A549D3:\ 000000000000000000000000000000000000000000000000 35315C163A9127E505462C6E1C1D7890:6D86A01BB28C174BB8A9E14BCCD1B0FE:\ 000000000000000000000000000000000000000000000000 695D6C7903BAE992AD6949AB85F5A65F:F93A2EF60CF4AC550C723E72644BDFAD:\ 000000000000000000000000000000000000000000000000 6032DC62A65400CB70CAC882A17B5E95:97EA0E405C1FCE63DF66BB3C23560A0E:\ 000000000000000000000000000000000000000000000000 5C94B77B9EF22A4F3DFB5407E8C381AD:2DEA5CBE120630FA88DA6D46D288635E:\ 000000000000000000000000000000000000000000000000 F95F347A4D7A5C292620B07318BFF803:B387D8D91C6478BCA022A658FF4DB0EB:\ 000000000000000000000000000000000000000000000000 9577B41BE7D1A8587E3E27A1389DC9FB:ED74B4EB542C5B3A0D760299E69E5EC3:\ 000000000000000000000000000000000000000000000000 3DF28E3798BD98984F6DB950D6A1F948:8052BA88E81C87D8CF2CA22550A63B02:\ 000000000000000000000000000000000000000000000000 AB2773E217A7A6A6859698D5D393B2DB:474A37DE739FFCCF31897B4B66B8C892:\ 000000000000000000000000000000000000000000000000 060203EFD452FE6E4B9D29861F9B4562:472C3FA987FBB35DF3AF43C75E721E51:\ 000000000000000000000000000000000000000000000000 31995CCFFE329932F121EF8BA410A4FD:436B187F3A7D51E2036DC53E517F1777:\ 000000000000000000000000000000000000000000000000 A53625472349DE047005DAF198953590:960F173B6EEA02CAC4EC3651B2FC47DB:\ 000000000000000000000000000000000000000000000000 8EACBB7BE93D3070B0FA7CABB3045DA8:EC276626BF1B0C436AB5276471372D14:\ 000000000000000000000000000000000000000000000000 A965390450D42F7B74316A1EB1FCC329:C1488FFBBAA5C85DE16E98BC343660DE:\ 000000000000000000000000000000000000000000000000 36E2AF37370B07EE5DB106B49D5C966B:86CC23C3B66ECDB59580BEE1853D61B8:\ 000000000000000000000000000000000000000000000000 BE36B7425D6D812A9D655320D09EC22E:74B4C41C28D26D9D1C0CF16403EDEFE2:\ 000000000000000000000000000000000000000000000000 67E19E7A5E0E26A0023DE95AF1B8B4BF:1BAA2706D5EE6C5BD1DF8291978C6EE7:\ 000000000000000000000000000000000000000000000000 0148F25E6860D5FD6DB4FF4A10C41920:EEC71F999D856B480FDC9524D4C298DB:\ 000000000000000000000000000000000000000000000000 8CC2AE04A5292E56074FB6AE2109DF46:6FF3AFEB3C79A2B2B19B7936A6B81600:\ 000000000000000000000000000000000000000000000000 20D8712AE3DA248760736A180B30BEC6:74E4C190E3BDCE13483FB05A6B8FF5C5:\ 000000000000000000000000000000000000000000000000 28291211012AF1AEA64D60E24A575673:849CC6B59E21442804A0E5ED1A01037D:\ 000000000000000000000000000000000000000000000000 C34EC4029E4F5E93439331CA923C2864:D1746E215BF29A66A432C5223C060D83:\ 000000000000000000000000000000000000000000000000 D7B54854F36F44DB71546494C405DEB8:C4D45430420585B661C4F43DFF5F0551:\ 000000000000000000000000000000000000000000000000 1225585CD18C7ED26A1CE1576A4283B4:7502910B1835ADC0A724DAF5516308D3:\ 000000000000000000000000000000000000000000000000 E3D02564C06455E162626EBCDBEC43EE:11DA0573D7D34A586DA61A7A5C10849F:\ 000000000000000000000000000000000000000000000000 A9ED28B26B20D83CF33A97ADB8D181E6:B47F3027D742CA4C9BCF77AA141BA2C3:\ 000000000000000000000000000000000000000000000000 D142B008C4764EAA88741D0DB54FEF8E:DDF748FD2373918FA25C4FE5D6E12656:\ 000000000000000000000000000000000000000000000000 E568167CDC7D3BEBB3807039E34E10E2:BDB5EAC47BE80B077ED50625611EBD18:\ 000000000000000000000000000000000000000000000000 7323AC95F39146CFDF6AA6BB8E9ACF90:F1E53F5E1B0AD9848DB4E3C3D3741263:\ 000000000000000000000000000000000000000000000000 BA541AA170450D7C45F8D23FD587E34F:19331E5217357CB4DEBAA80AA5B44D92:\ 000000000000000000000000000000000000000000000000 E603E348D083C0F0D0188E0E820BF797:2D691AEBFD51C5D26B13E33EAEE3B39A:\ 000000000000000000000000000000000000000000000000 5AD31409A42464B3F085A2DD5A6FC292:63E8E939E52066EC0E4E074FE60D90CC:\ 000000000000000000000000000000000000000000000000 D9C52B6DCC49BB59B9C3BD13FC88D018:A7563FD915814534A1963662BC900EC0:\ 000000000000000000000000000000000000000000000000 3014518A77A1D8F9D103327F2BCDBE6B:59D93945A6467D215044EC49945B78AF:\ 000000000000000000000000000000000000000000000000 5D4F53FCD6D41EA616F140C12B9E41CF:E8D7F3AA8DFC265001CEFB78733DF426:\ 000000000000000000000000000000000000000000000000 E30ACA76182B1334FE2A4F5AF0C30BA5:C868972B54F73779BF62CDFC25722AD2:\ 000000000000000000000000000000000000000000000000 A04A0A22C20E262C1B6485E406E65994:32A175FD6789524837157A176F40EFFB:\ 000000000000000000000000000000000000000000000000 B6110B7A92475C3B366C403450488061:88DAE0307CCE2C38EE584F7149BFEF73:\ 000000000000000000000000000000000000000000000000 8C5DF59EDDB12710BA47507F6768F113:D44C9FA99132D411EDE37ECC252588D8:\ 000000000000000000000000000000000000000000000000 17C385D013346587A677DD56DA0CDFED:C10C3EABB30C69F9CD9554936FDE40D2:\ 000000000000000000000000000000000000000000000000 6E43A132D96EC1F7DFEEBA445FE716D7:911BF5A6631536B39D1FA011F9FE1E73:\ 000000000000000000000000000000000000000000000000 EA2733E8A42B18E0E57A85ABFFECA103:1747BF3F04B97A431D63AB6130B7E344:\ 000000000000000000000000000000000000000000000000 57CD8F9A4ECCD9884243F834D9967BCF:8F33B6E4C39738C7D4FAC92D93D52228:\ 000000000000000000000000000000000000000000000000 6623207CF0803C1BFA605D269A003C64:8534BE7C6BCA0155FCF418CCCB5AC81E:\ 000000000000000000000000000000000000000000000000 76568B603BAC1CD646C34E61A638D7B7:53F6786EE1504317243EEA24CB5DA9E9:\ 000000000000000000000000000000000000000000000000 841E33C6C4F92AF4443A43EC49243068:FD32E3EC516B77437B4517778BE90D90:\ 000000000000000000000000000000000000000000000000 1097C11A9ECF04D2DE9F8F8994E0BAED:143401E20D3E6D97DFDDCA7A8DA456B0:\ 000000000000000000000000000000000000000000000000 8D520BE244CA4260ECF38B81C428E1ED:701B82F492B01FC3F56A102072A66FB6:\ 000000000000000000000000000000000000000000000000 A09BE54496E26257925A3F8B737A77C4:D2276D31749C2F4A79C1ADA50D242D2E:\ 000000000000000000000000000000000000000000000000 AE1463F6200666D99837D4C3458E29F7:4BEC3FE34560EE2F3FB88C1B19928D71:\ 000000000000000000000000000000000000000000000000 870AFEA6425FA0477F3758F9AC81B5BF:3B9A6B224CCD2A34B3CFFA8F20A32B33:\ 000000000000000000000000000000000000000000000000 452857F43E0EF30BBA8DF975B92C67CA:650B79ED8814D9D5B9F40DB20B6E54FF:\ 000000000000000000000000000000000000000000000000 3EA662143061F27044295712919D8CFF:3FF60CF2D0F12F3069959A17FD2FA52C:\ 000000000000000000000000000000000000000000000000 3710720E6BCC9D67B51A990020E50E9A:AB064628EAFEFD04B7D483507A3D5F27:\ 000000000000000000000000000000000000000000000000 CECD711FA3B66CEA1639E7DB0A36CB5B:219C9187FFD71770C717E3CC872A410F:\ 000000000000000000000000000000000000000000000000 1A06CF5B4E4D9C055D017DBBFFB17493:DB2B632CED6EF0CA69B0DBF90CFDEC3F:\ 000000000000000000000000000000000000000000000000 C9403D0FC547D44DB2A12BC26E549B12:34746770542734BD56CC54C3BA77DE05:\ 000000000000000000000000000000000000000000000000 69E6239629F6BAB3ACAA41D3CF63AE2F:68ABC2D6D0155ACF7398751A4263FFE1:\ 000000000000000000000000000000000000000000000000 CDF3A23AED45A5CC0977FC492D78D769:0155284B425712C5662BA85DD1AA9C00:\ 000000000000000000000000000000000000000000000000 38947A6BCB9EEB2349CC7982CC988A3B:487705205D9C054B278A1A77154DC444:\ 000000000000000000000000000000000000000000000000 D21A1763007D050CDDB3D3000CDA18DD:E4BDBAA0BD0799643147BE9A72C2C28E:\ 000000000000000000000000000000000000000000000000 D86E349D4F8BACC0CD204D86485AF372:690C9CD71586F0E707A6747CDCE14BD9:\ 000000000000000000000000000000000000000000000000 2F3A9E1E90111694A5D874B72A725627:485BB4E6C8EADCC1DC8F33CC83C56DF7:\ 000000000000000000000000000000000000000000000000 BF6397D9E8C5D0F7D537D17CDD094C56:5DC5509BE381271A892F73AD2B17459E:\ 000000000000000000000000000000000000000000000000 0C8EEF7E5C26A11E13F3B332C78240E9:FE7F7B03809161699B20C91AC71388F0:\ 000000000000000000000000000000000000000000000000 3708A3370D457D498BE3B36C6628C450:5ECD46E61E9EE1504928AF23DE58B417:\ 000000000000000000000000000000000000000000000000 7A984BD4A80E2495C7A64107DBD1E5D8:529EC6E2DF4B601050BDAB98466FCD47:\ 000000000000000000000000000000000000000000000000 E00C27A4F32C3C1FD220FD3B7B2E7251:DE00F2AA4BC9B34A187780D1D6998873:\ 000000000000000000000000000000000000000000000000 C9EED5E1F515E97E393E00476F291ECE:81369529646A657A4C6BF7BDAB9D2780:\ 000000000000000000000000000000000000000000000000 D91189059CAA6B0C4E95E7485D7A73AA:F6D1EC1368832C038AF24FF17C523D8E:\ 000000000000000000000000000000000000000000000000 B0824A7A86F5EFCEBFC3EFBAD4445FE2:E4122EA5B2375D306C7A86C5486F6AD5:\ 000000000000000000000000000000000000000000000000 7FEF47A756D245B1B5E1CC43EB9D961F:537822C6708654C63740F2EF1DFA1B57:\ 000000000000000000000000000000000000000000000000 714B564D133054E286CCF3F7B4DDA373:D611B6FA3C70454B618CE723D70DB96A:\ 000000000000000000000000000000000000000000000000 67EEC672093ECB5C0067565FF315B57D:BCDDB2993D6694EA14CBD3DBA5D72054:\ 000000000000000000000000000000000000000000000000 EB34AD41058C53C01C4F1357F7CA0540:C25E1CEF2DDDCD4C6E8CBD363BC7A49C:\ 000000000000000000000000000000000000000000000000 087BC6FC60B82B16F51BFC19F52DB265:406B498631B18D08880E75470D9D9356:\ 000000000000000000000000000000000000000000000000 7D505F278F68130DBDD769F310960455:0E4A4B6FB1DB995A4F38A8F91824CD14:\ 000000000000000000000000000000000000000000000000 53C5BBF9DDB235003D075E57FF1A1001:FE704DB9E2020E715AD69FF9E92F8786:\ 000000000000000000000000000000000000000000000000 43E15279B9CEEEAA90EAD7CD9D491D5E:7B4DC664B034F4FFFB324C1514702B35:\ 000000000000000000000000000000000000000000000000 0BC5E3D2B2D18CCBA1B122FAB906F4EA:54E1A5104006ECB27ACC0FC355A5C0E8:\ 000000000000000000000000000000000000000000000000 2A41F1E81307DE4FD56408A9C7865FE1:7D0B9B0FBA0CCFFE60DAE48078CE4DFF:\ 000000000000000000000000000000000000000000000000 7BF72B9F29F6738A149EEE9CC66042CA:B8C05E2EAEC1B4A3ABF9505BB4ACAA46:\ 000000000000000000000000000000000000000000000000 9907CA6C2944F659DD209F90797EB7C6:606D2B529277284D69232AE77B475024:\ 000000000000000000000000000000000000000000000000 478E732A754522C881C15883B0BBCDE9:B232CF742761574EA99453D7C9B54862:\ 000000000000000000000000000000000000000000000000 4A9EB2F326F83A0F93F41B21AE4F49A6:354E0630938D10ED31D9AA7F57440CA2:\ 000000000000000000000000000000000000000000000000 8C7B36A4E87368511D3D3C578CF95240:53F1C55253D2A5B7024C28E666A57FEA:\ 000000000000000000000000000000000000000000000000 EE2A1F5575784C3553DBB21540B7553B:8E8C8768B7E2D430CC2DAE11A2247D8A:\ 000000000000000000000000000000000000000000000000 BBE9A1EBB77CBCA4B5BA650CC8E1882A:A13BFC5603FA258281D8AC945F4314FB:\ 000000000000000000000000000000000000000000000000 0304ED5D3AE4E9AB51A67C14291B0E4C:17C0BB89D285E07C97640A8FE6027341:\ 000000000000000000000000000000000000000000000000 E8EE60340D4881CEE9870133578B723D:DAF1AB5368D5BD5F6B52EA89940605C4:\ 000000000000000000000000000000000000000000000000 15F20EB4BB374CF9FFD0ECF1379A6309:D3D5F60355EB5FFFA9216B6073C66FDF:\ 000000000000000000000000000000000000000000000000 03B59445DC995E511D14CB27B611D8F4:D34A2B72F1864FDEFF58425442A0A3D8:\ 000000000000000000000000000000000000000000000000 E5DE46FCC7ACA6EAFE41E83B8AEFB33B:52040C8FC70CE166EAF34CDCF654ED43:\ 000000000000000000000000000000000000000000000000 C6DEA79ECF12FD33EA7CA9C0AA3C2E59:9C5702F759F6C92836FA2C0490080A6B:\ 000000000000000000000000000000000000000000000000 CFDD2F3012EA2BF447FCCDD24FFA8869:C33F590E882873038349ED33E8F22B7D:\ 000000000000000000000000000000000000000000000000 8BFE4AF3B7D8DB7660514B9669F8D464:A8320F0F729C8A8DDCFDB5C208A6630D:\ 000000000000000000000000000000000000000000000000 301958CC9E63DEDDD5E7E1C3C8AC792E:9F5D597E1EA73AAE8F53E58CE4301030:\ 000000000000000000000000000000000000000000000000 EDD8C0F63717866059C1CE22F8D01F26:4CEEF2B0933EEABA49A102EEB6E4402B:\ 000000000000000000000000000000000000000000000000 5E8BC57A7204DD62C2BF28C9B4C37417:58C5773E59A396896ED815A6127F841A:\ 000000000000000000000000000000000000000000000000 256F18961916ED383CE6FA8BC6F2B7CB:7A803EBFE417C354BBFC308AEEB8FC95:\ 000000000000000000000000000000000000000000000000 754166EF6D6231A5CC838C394FFA6FF1:4B51C7505E98DE6C9DAE5843E589EDE6:\ 000000000000000000000000000000000000000000000000 569C792FCBB2ED89420A51A9289D7323:D450508E9143A3E14ED4D72CC12160F0:\ 000000000000000000000000000000000000000000000000 F74D7BCE63019F55E33D92C7FA132BA0:A8F126B576C79AE85A26303EC70ACDFA:\ 000000000000000000000000000000000000000000000000 1DEB7CF9F5FA1E3BC818BB54D9721D9D:9113F881F7474428BF23A8984219A4BD:\ 000000000000000000000000000000000000000000000000 2EF52D3CBEA2E2CB03D0B848E7C07D80:DA15834C6EF22C8958294E66E6196119:\ 000000000000000000000000000000000000000000000000 3B27817D9E57B4E70ADB97A43B005317:CE976989A33D1A02A0EEA2246997AFCE:\ 000000000000000000000000000000000000000000000000 5E28CE24DA41AA55156AAF4D0D4BDA42:32AE2CB879873928327488298B64F536:\ 000000000000000000000000000000000000000000000000 8D331AC09D25385F4490A7F3719863ED:9976380787393589CEAD1800FABFE078:\ 000000000000000000000000000000000000000000000000 D5B056B768B04D47359793DA9F0ACF1F:EAD5B4F1EFA30013B303ECD50493E54B:\ 000000000000000000000000000000000000000000000000 322B8A0EC75069EFF4EBA07CEEEB342F:1A94F65D67A6A435C5EA28F1D46BC0D9:\ 000000000000000000000000000000000000000000000000 4B4A22563C0A57DC4736D574190E1AFE:D84C3B70EF9D3B471C689BDE6D8EFE82:\ 000000000000000000000000000000000000000000000000 F1D917CB22016EE46F4219603DA737ED:4AD2B98E504299732EE814E93D69475A:\ 000000000000000000000000000000000000000000000000 74DA216E6125B35F68D710AAD1DD6775:7BBD944B232616BD9DE40A985BDAEA2E:\ 000000000000000000000000000000000000000000000000 292C602001EB4D371203B1E93227F836:8C4013B2AF75B3C155D7120DB0934428:\ 000000000000000000000000000000000000000000000000 734683C7FBC228A7EB1F1B67F29D5CF0:951DC7BB2239C3B830843FE3CDA7CA34:\ 000000000000000000000000000000000000000000000000 7847476D0ED3DDB46203EBDC73BB0FF7:60B5491007F5253FAD1BDCDFAAAC98BD:\ 000000000000000000000000000000000000000000000000 81CD86C3C82714205F4C06384878D4FB:585EBD953D2F584B82788287E99D263E:\ 000000000000000000000000000000000000000000000000 E65472A6D482655AD2A5B1D3B8B247F5:40D1910F18DA68DCCB577C0651573748:\ 000000000000000000000000000000000000000000000000 27706EE3BF8C5B11892AFE89FB77530F:80112C6A37C0DD301AACFC660B411099:\ 000000000000000000000000000000000000000000000000 99582047A954472C79F081EBD92AD60F:294B94E01056C6E1DECF70D3EC0A0B02:\ 000000000000000000000000000000000000000000000000 7ED1ED318F1942243580EA94C5E40C15:480986DE5D85BD9FEBA09F9D074C9BB1:\ 000000000000000000000000000000000000000000000000 C4399BB80B44FF8B9791B952262ABBF0:0BB435634EC3C4E63EA1D4AF3819D635:\ 000000000000000000000000000000000000000000000000 AA9774F621357C574956D06FA4FB0DFC:089670B247DAA022AF8E63CDCC252F3B:\ 000000000000000000000000000000000000000000000000 A2D7F2C0B96C888383470D746D8C3D72:71C6023943714AB97C4F66D6ADE4B5C5:\ 000000000000000000000000000000000000000000000000 60BBE793A6CBBF092ECF3F2DFF9C58E7:914B0150537160F4A49FCDE81AA32A5A:\ 000000000000000000000000000000000000000000000000 CDCA44CFB68D9397FB45692CFA7FE92A:01CD4B3A51B8542166478BC6535DA067:\ 000000000000000000000000000000000000000000000000 201D8598327C81D3C91B1894FA97DC2A:E4F60F8E55978A6792589FB4C58FD61E:\ 000000000000000000000000000000000000000000000000 3073CB477A05DC7305625B2D8B89F37C:750DCF9CC3B820A99226E27A67F0B9D4:\ 000000000000000000000000000000000000000000000000 8B0D43826ACA0F5ECD9AC42B24B23595:2BEA1CF96CA436FC33EA573260C56A29:\ 000000000000000000000000000000000000000000000000 CE1EF0456D99D285B8DB31EABDF12754:9A26AFECE78B58FD937B0CABF518350E:\ 000000000000000000000000000000000000000000000000 6A5F54938B1A3FD41C10C854C8E04A44:405DE78B8BA1013E025F0C66CD8DB322:\ 000000000000000000000000000000000000000000000000 925CCB833E2BB24C56DCD6971E50DA44:A7B1C50C8A1DE13694BE770DEFA447E0:\ 000000000000000000000000000000000000000000000000 72CE5E0A8D2EFEF16855E3F1844FD13C:53177B6A61F2C5B98F2ED3E6EC195629:\ 000000000000000000000000000000000000000000000000 A7A3974CE115F4D92CEDBDCB6C0850BC:3DC31176F7BFF544F98B50D1FF0EB338:\ 000000000000000000000000000000000000000000000000 6EB0181E23642427F498B5BBC87A0FF3:F7887B1A95F202918295D6DBA328DBE0:\ 000000000000000000000000000000000000000000000000 112DB5BFD7108A6E2D51B883F0C6700A:35EC6F1B98376F6CFD98B0DB3DB63295:\ 000000000000000000000000000000000000000000000000 EE9CB8FF31C6106F54468D56264B5A67:FA2A11C86EC2BD433BDC062294D5D479:\ 000000000000000000000000000000000000000000000000 9269DB3D3EB516D02452109D537511A0:70C709A5F6DA5E546AA42781D389BA4C:\ 000000000000000000000000000000000000000000000000 04797C87F169EED791FA03BC6529CCBC:DFBA39236536C7B33F5C186742897F44:\ 000000000000000000000000000000000000000000000000 30DCEEE9F96719F94CDA6D4447DDA5ED:6BE2E27BB85093A71E3208B22D9B4EB9:\ 000000000000000000000000000000000000000000000000 DEEC871FEDE7BEF4E5924A35F7C1473E:2D189653936AEB37F0222E96B205FD36:\ 000000000000000000000000000000000000000000000000 14D91B1E40E6EF6C0D47B18CF1820459:E428FBD6A451527D8E254B032A85ABD2:\ 000000000000000000000000000000000000000000000000 F50744F84E3C68FC80883F5F7CD4F473:12D9ADAC936643E44C75765EE860E156:\ 000000000000000000000000000000000000000000000000 BD37910AB3475FC22A6C5AC0277D6684:22EBADE6B7550CFAF53B369490420120:\ 000000000000000000000000000000000000000000000000 4A9EB13B7BBB14632B1FA37006139022:1B0568ECB78BF78E17891E99D3FF6685:\ 000000000000000000000000000000000000000000000000 A1F6367ECC2AD8DEC620DA653D6D4AC3:B72DC0A98DC7545798B9A09774127A7C:\ 000000000000000000000000000000000000000000000000 1FFCA2F556D07C7F0125B1E63811FBF6:620B4E671AC5ECA7780C114F8A3B5834:\ 000000000000000000000000000000000000000000000000 28EF3A37D33B9BBFB94DA9C27CD74C8F:8DFB3F06170CCF3FB628A1131B7C55D7:\ 000000000000000000000000000000000000000000000000 3504348BF82F0E8D12784206732B7EAB:9395207A7F3D76727E08650635A50E8D:\ 000000000000000000000000000000000000000000000000 649B9B03B4FA72E015C6318C78DBFE6C:1C7F7A1E78612D4B57AEE7A97E026D99:\ 000000000000000000000000000000000000000000000000 5E5D242061750A2E3AD7CF68A18F53E0:92BCA6EE74F863BD58AAE46966FF0195:\ 000000000000000000000000000000000000000000000000 0BEAC3380DE66C16C118E94A7E98632C:D707ECAF8DA45A032FD2B92EC02BF809:\ 000000000000000000000000000000000000000000000000 100C0B29ACBDC1DCE5BF94F647132C8E:D7D4BB2EE07EC7ABD29408BB29C3E52A:\ 000000000000000000000000000000000000000000000000 E4C40EABADEA4081D339B98217B89F4E:068477FE3113C4E706161C7BE173109F:\ 000000000000000000000000000000000000000000000000 79201EFA18BA2872F67DB637435DA21B:E73ED140C42FE2121BE039F36F24B353:\ 000000000000000000000000000000000000000000000000 F0AE4C2DC0FD756D97E9D4FE2F9F4CF2:2472A6AA7ED6F70D2179043A4E37C671:\ 000000000000000000000000000000000000000000000000 6C18AA9A75DCFCD80EE4490529461EA0:95818C326367FD55674DB6C721DCC315:\ 000000000000000000000000000000000000000000000000 73C0E36EDF00088CF693EAE05DE118B6:44BAE149894A3B8D680988B2441FDD1E:\ 000000000000000000000000000000000000000000000000 C20558F78C1E2D2AB5898C50B7C5B5CF:6631895DA9C9B985C8268CE75B8DBD35:\ 000000000000000000000000000000000000000000000000 7A2DBE3457C46A63ABBFE7E3C6AA00FD:A95F5D0F337851A3349D159E70EE958E:\ 000000000000000000000000000000000000000000000000 9FB3015058C61098BBC919A7DC369728:0B3EDDE3D3C9F33C98F2561C38A24AFE:\ 000000000000000000000000000000000000000000000000 8446AA6E305837711CB5B77589BE700E:9CF33FCA164676B2503F4EAA6DB82427:\ 000000000000000000000000000000000000000000000000 63ACC114B985F5E162E74C6A0D5489A4:4502AF98B2F3C453EB84DB4816CF86BA:\ 000000000000000000000000000000000000000000000000 1FB274A798A9DE040500989BD0DAA450:5122BAB4ADF7B99D018247C17EDE37B7:\ 000000000000000000000000000000000000000000000000 0B75B6E38F803AFA2E185825452E7CB9:8053D0C508ED36FDD78BE6A2E156C68B:\ 000000000000000000000000000000000000000000000000 502998BD920539E6C9457CEB7ABCC2B0:630A85FE40269FDE57BE0A91230F14F9:\ 000000000000000000000000000000000000000000000000 D15498EEC5A204E75ABD92296759B2E7:1DFBDF5987C38B34D70EC1F9F09DC244:\ 000000000000000000000000000000000000000000000000 74CE162AA4400EEFBE2F9452F190C925:89A0188B43870472AE7BD89F1DC9DE4D:\ 000000000000000000000000000000000000000000000000 9BF6D9402DAAA02EB0D70ED5686A2897:F080B9C597F6AE853556F9088765307F:\ 000000000000000000000000000000000000000000000000 66104EF16B83A3C24630AA15999CF795:465BED1DF34D70D6666BA9CAEF77E5F8:\ 000000000000000000000000000000000000000000000000 2C7518563817B2302055448AC1E236A4:29228B582D6C9BF2F5FD64AF68801645:\ 000000000000000000000000000000000000000000000000 B840A56E78F0CD9C491FBFC2A008C0B1:741E572D70820BF764DFC3EB64F58DB5:\ 000000000000000000000000000000000000000000000000 366C45C25B098271DE2BA33B761CA2DA:93730B17CF28E0B7FA833BE560433D26:\ 000000000000000000000000000000000000000000000000 DFC28B998E7D650ACE708662715DE551:070744AD0E21FBF5344EA22396FE3BFA:\ 000000000000000000000000000000000000000000000000 AB8D9F6AF9FC1B293D1EF3D4459C17F0:873A852D49296F2493CD56AC374FBD59:\ 000000000000000000000000000000000000000000000000 CF8A7D1F67264C8F0CBB81B7F22F5284:A0688DD48E462A1B75F34425536C270A:\ 000000000000000000000000000000000000000000000000 3911525195F0A35484618596EA0B23CD:9B1B36125ED888A57FAE5BDEB53ACFE5:\ 000000000000000000000000000000000000000000000000 5DB02CC6EEF7E128DAA849EEB1BE9A7F:95404D7CCA9EB1C2F720BF6CC74826A8:\ 000000000000000000000000000000000000000000000000 CBB260B85AB0E75F4396FC3F6C7B8DC9:2B702A4E613758D8EADD8E17DA9C0E68:\ 000000000000000000000000000000000000000000000000 73C7C371EE0D7EEBBDA62B2D8B47ED02:C6B9E0F5E943685FD1FD739E9EEF6747:\ 000000000000000000000000000000000000000000000000 928C48F1AB2E39BC0ED7395841AA55D5:6EE0B71022F864D82F177058C2AFD1F0:\ 000000000000000000000000000000000000000000000000 9B73A4CB141AE76D1A4AF02EE02F5623:11D9E2FA35491C034FC28D278F81C741:\ 000000000000000000000000000000000000000000000000 F98FF8E931078D572588D3A23BA9A65D:69408F1E703ECEF45C60B576DA8A8E93:\ 000000000000000000000000000000000000000000000000 D697E66D3E394658B477F5D94E9AC272:C3E21C1C90F1BFF4BA3BA1FC806C50C5:\ 000000000000000000000000000000000000000000000000 7B5D2AD95D1278790DE3E61EA79683C0:BAAD9EF7F34F2D09E4F24F8FFBDAD242:\ 000000000000000000000000000000000000000000000000 2FABE699379719F903C55B243E270154:88768EB6AEBB3221DEB456CB581672C8:\ 000000000000000000000000000000000000000000000000 A1D567D19DB1F8CDE682025AEAA99DE4:EA16B62DE42D02CD64AA5286D7058E2A:\ 000000000000000000000000000000000000000000000000 31B9406E90742402C18E4EFC6D49C43A:C33EAB3109805CC528E06CA92DF1CE82:\ 000000000000000000000000000000000000000000000000 DC5CC861CDB8565EA74C5B81D04E3FFF:95581016D9D878454F3B29BB72282CAA:\ 000000000000000000000000000000000000000000000000 92D735CAAA20120B2545530FBD841976:AF352F902D964BC93C52DDE45F36813B:\ 000000000000000000000000000000000000000000000000 81AC34A2E341F62C479FCDFBC85570D3:D35E2834DAEF034C122439AA75EDE6FD:\ 000000000000000000000000000000000000000000000000 DB6CA5A00935E081B0DE14F9489E56F5:C0B207F61BCC815E44671E76556BE222:\ 000000000000000000000000000000000000000000000000 6795C4731AB1B7A9BD1367C5FA6D24E0:F2F48C694E4D4C561237F2E446E48CD6:\ 000000000000000000000000000000000000000000000000 503D1E8C00F32DD24666B40AADF21635:6CAB8D56A573C231E4083E062509331F:\ 000000000000000000000000000000000000000000000000 9B34D2D7E4F84FDADCD221C818398D9D:3F6211A4F97C7D07DE3069A3AF0B2F7C:\ 000000000000000000000000000000000000000000000000 9A6AAA25CD55632A8D1364765F054228:FCEE710DB225421305683F6DA8A14498:\ 000000000000000000000000000000000000000000000000 51BB73F367B4789C50EE27A7FECDCAC4:89DC658FB152C89E533873028E82F386:\ 000000000000000000000000000000000000000000000000 38E2FB18AEF954A977CE17B61420AFE8:F2F090E1D924600B3F2852160F8FBFFA:\ 000000000000000000000000000000000000000000000000 40E1F27DC23EB87A38D33A9D7DEA6B57:0BA7974ADFABBC749AAB019F1FF0FA22:\ 000000000000000000000000000000000000000000000000 69237F4FA6B874C950F44E2ED8EDE5E2:E8BE1E5DF9FCF083C5C80F5C0C927350:\ 000000000000000000000000000000000000000000000000 E529151F5FEDB46E9F150E39FF9095F6:9516D575A3FA911065F308AA45957E61:\ 000000000000000000000000000000000000000000000000 3921C4781E145F4867D1E8F134DF7355:DEDAB21C05B199DA1E0C0E1D7CC17F61:\ 000000000000000000000000000000000000000000000000 AFFC9793843506A048E65104A559CFA4:43C466A47766F7AE27D9E8250B04D617:\ 000000000000000000000000000000000000000000000000 D7CC61BAB163D793C1C9A6C4266BF004:B0E2AB3CF69FD19EFA5BFA9587AEF29D:\ 000000000000000000000000000000000000000000000000 A0D64ECF3F000B7478C9FB6C20CD576C:2C0A893A4F331ED2D738446AF038ECCA:\ 000000000000000000000000000000000000000000000000 141964E6278C1ECB067DFF46B8D80C15:D89E32E065DA6FC65BDF38A15626CEC4:\ 000000000000000000000000000000000000000000000000 72568E2FAF72EFE69E5EEDDBD415F1CD:3A9DE9497BD9C0E8A7933581709C2F86:\ 000000000000000000000000000000000000000000000000 2309A9E1B063BEA563AE44FB1D11763E:2C68D638E01CC717CB3095F8769F6330:\ 000000000000000000000000000000000000000000000000 5B8786E22A5109D189F5155471148639:F54BDA0C2F70CA852BC5A9DC48E74DE3:\ 000000000000000000000000000000000000000000000000 14B31DFD7489D68488A8A2EC6A9B28C2:2E4110267CC09B86849976EC36FD9545:\ 000000000000000000000000000000000000000000000000 72D8F97A40E78FDBFB9DDE7D94694F3E:2C010E0A06A15338F76A37A5EDA6E7AE:\ 000000000000000000000000000000000000000000000000 7CFB6BEA9ABFE0B5C486504AB7AB7C7E:1495DDAA1CF53478613C5A7FBCC4D21A:\ 000000000000000000000000000000000000000000000000 8E22872352AFBE50799766FBD74672FE:DA8894CF60FB487AD2FA856049B4A339:\ 000000000000000000000000000000000000000000000000 9ADEC67160B3E7A54CBB3118CDB24016:ACD872C37F74E4D8C9DCB67560A2C626:\ 000000000000000000000000000000000000000000000000 AF35888791EA802A0DF92286893B6653:2E2D305D853B870400402D50B36AF1AA:\ 000000000000000000000000000000000000000000000000 30401704726D8B873D4D2435CB008F42:1744071A7A0B587AAFC7FB447D249B9C:\ 000000000000000000000000000000000000000000000000 2E60C63BF001FEA2FECC57D93E9FE7A6:83B5901B7B71025C8D0FE54EB35828C3:\ 000000000000000000000000000000000000000000000000 3950402C43051C4904DEEC57F504FC4D:9A9C91030126FB9F9F9AF1BEE01506C8:\ 000000000000000000000000000000000000000000000000 F5454A8EBE04708570F9B2317DBBA71C:170B64FD20891245085B8E1B21E73A83:\ 000000000000000000000000000000000000000000000000 3E03AF195C3829650043A0F643CAEC4F:A593253D4144356A93B77777BB062ED0:\ 000000000000000000000000000000000000000000000000 2FECCD73C296BB4E5D6D7FACF2F07663:A59DCF75D21391DAB42977618A30807D:\ 000000000000000000000000000000000000000000000000 E3A600FC8F0C9BB15DDFE8E4D36D0B6B:F2E3DA77CFDC4F914913D370AFC46475:\ 000000000000000000000000000000000000000000000000 65FAE4018301DF82E78273D60FA8BC1C:B48220811F1497381AC7ACF1FAE6A1C3:\ 000000000000000000000000000000000000000000000000 513F515D31466F0A01332F6D8D733E9F:056E78208EFDC0272956971EE29EAB50:\ 000000000000000000000000000000000000000000000000 281AD7F41EB19451BC978B6C125026B1:DF6D20D993094000464BDA7DA2AFEDB5:\ 000000000000000000000000000000000000000000000000 97A75E3919FBF5107E55E37B81FC45A0:CC052A8B64E199030F6D620427C379E4:\ 000000000000000000000000000000000000000000000000 B501F0B968BFF14070DFE2DF6298FF0C:0A53785F9A58D9FFB7A01C6E6DDA7BB1:\ 000000000000000000000000000000000000000000000000 672B7E9933053E6ABA4712214D1278D0:4CE10611AC92C9998E6044099E2BFBC0:\ 000000000000000000000000000000000000000000000000 C8EE21B9E260A72153A6938F31A127F8:7FEDF8389CC1F013F350B2BCCC6046EC:\ 000000000000000000000000000000000000000000000000 61F6FE223D11D88FBADA99ACACB7FA25:A834288BFD1FEB7432F94E97E7B69D89:\ 000000000000000000000000000000000000000000000000 F79DD7A31FB11644A38E8D006BAF4B62:9E949C299CDF820845FB3B06E85EFFD9:\ 000000000000000000000000000000000000000000000000 7328E5C1ABE226EB229AD784F26E299E:57E21FE31459A01DB1A05230C3DC75EA:\ 000000000000000000000000000000000000000000000000 9AD91A8354BCE0E632CF9C62C95AFF7E:F304CB96B9347492E5D70527C2B11ACB:\ 000000000000000000000000000000000000000000000000 606BF2DE00C40ABA8ED77992EFA05C1E:DE27FBAD11FCB0992CACDD7B6BCA810E:\ 000000000000000000000000000000000000000000000000 F81DFE4D27CFD077F105905D47D5BADF:E8F978AD0451B0A02DF946CBAB82EF5B:\ 000000000000000000000000000000000000000000000000 D7201D9F6407C9383CA4535D688C61EA:DC49220DB183147B3918ABA9CE72B834:\ 000000000000000000000000000000000000000000000000 AE34D39246875745FC00139CB4A564C6:83A946D5D727FFD83A6485D8E61E5CFB:\ 000000000000000000000000000000000000000000000000 6D3F60DB30BC83F0FDE7DD3E21E0CAC8:9EFC2DB219DC063E887A54F9B7B81DD9:\ 000000000000000000000000000000000000000000000000 5FA122F7957554393E97F89E98C7847C:E93AE44D82029938684ABE78DDBFB2D9:\ 000000000000000000000000000000000000000000000000 07F249A729186C8A0558A62188772C74:E0A8A1619EE653EAE22E41DEDB1E4553:\ 000000000000000000000000000000000000000000000000 244DF5F8502E3C12A37F28BB9F2CD24D:B189B0FFD6BC957D95A9A91B4E2E4BCB:\ 000000000000000000000000000000000000000000000000 2A0C5C6B721B1010C9FDBC02B053BED9:3D9E27A119B6693128AFAC171E46B926:\ 000000000000000000000000000000000000000000000000 AF6449E79628453F1DD77EB0857CADED:C150CF167A16F8F367D5D90E89C09DB1:\ 000000000000000000000000000000000000000000000000 36BF3D3D0A63CD8AE037FFE06889C29F:C708DAB79E5B99B97676A39EB1BC8C89:\ 000000000000000000000000000000000000000000000000 9DDDC7CB9B49B7075FE8D987F16AC153:DF01A9D14E08BF79F8C8B776F07F11AA:\ 000000000000000000000000000000000000000000000000 48CAB5B512E2AEBA252845F24DA62FFB:066BD47805684B25217AAE164E1B59B3:\ 000000000000000000000000000000000000000000000000 905FB46046C869B609C0C92943C1D22C:951A9225FA7A02680866539F73953A49:\ 000000000000000000000000000000000000000000000000 6C027C762F6C9B9C0C3EBDE341238154:D4CDDD6C60DB9CF0815D48EB8C4D1BB3:\ 000000000000000000000000000000000000000000000000 55488B44AF25E48F8002618985748EEB:C47006D8E3ABEF6DA6844C25C3DA8E5F:\ 000000000000000000000000000000000000000000000000 B6E76A99FB42AB0DEC2F64CA4119434C:1AC91773E3C74B1AD2CEE5C1B73FF762:\ 000000000000000000000000000000000000000000000000 FEE6CE4F8F3473E5D53ADC2514573DF1:C05EBE4CA1556875E88963737052A6A1:\ 000000000000000000000000000000000000000000000000 BB4404D0A1E08F698567D378D635ACFC:310D5B8AA72771FAEE774429A2E30D34:\ 000000000000000000000000000000000000000000000000 CBECDA615EE251D55D88AED51A7396C2:005F978045B1C78F2C9CA70BD740AFD3:\ 000000000000000000000000000000000000000000000000 216DDCBA6D7CFBDD704C88573AF3F539:CD5540951B363A8FBDF9E93C07C8B071:\ 000000000000000000000000000000000000000000000000 32DF83737E24CF91823B1F444111F6DC:0A79A5601F7FCAEC1DFEDD8C5D6517BD:\ 000000000000000000000000000000000000000000000000 75060574E3BD1829C1F7CF663CCA1519:404CD7A5AAE2AC614FBE46931040C028:\ 000000000000000000000000000000000000000000000000 793C8015C6E8E72E56C13561FD6E724A:6F8FC5142A5E63B38B3CCC1934284FE5:\ 000000000000000000000000000000000000000000000000 56417631D25FB77C8D31D1575FF069AC:11F8FE61E550FEB615970C2AB8ECCAC0:\ 000000000000000000000000000000000000000000000000 E99EFADE32414801A624E62C62C28FCC:C3C7D21CB5A94B8614DE00CE1B7A9DC2:\ 000000000000000000000000000000000000000000000000 EC4566488387F51E0B509476670E83D6:191E27160A8A8475ACFD683F80DF89C5:\ 000000000000000000000000000000000000000000000000 B2AB44DE9321FE39A4DCBDE624578893:54D0B5AAAE4629FE22EDAC6BE38B9B9E:\ 000000000000000000000000000000000000000000000000 063D84A689AABA4F20C38265401497E1:181EAFA411D7D022A5AFF1C1C212146F:\ 000000000000000000000000000000000000000000000000 745D52CC6B6724A03B1402D936BE3B7A:52624A4310A885F6F32BCE889812634A:\ 000000000000000000000000000000000000000000000000 DE9C438C39CFAF705449EBE35BCC589F:FAC2134E1485CB8C7ADD700772A7E5F0:\ 000000000000000000000000000000000000000000000000 67CAE47F0EAB98431E79565F6AD72FF9:1D77938B41CB3EBDCB2E972C23814361:\ 000000000000000000000000000000000000000000000000 190E8E93E5EAD47C94FB6D4410710A40:5E0495D4DBB66892CE35E4AD8080DDFE:\ 000000000000000000000000000000000000000000000000 1F4C0C3D81E34FC56D45D33A491C2AA8:B3356A3EC0C1D308CEA5B5973E78B7CD:\ 000000000000000000000000000000000000000000000000 16F1E59BBCF8322F6B0880C77E0B3AD6:42275296C51FCA8E244BB17C1EB2ACBC:\ 000000000000000000000000000000000000000000000000 95BF7A5EC2029FDB6C51C40407395862:E92D9E263F650E222E90F0E59B2AEFA8:\ 000000000000000000000000000000000000000000000000 F4B0AB203C3C741A527E6B25C0F89B8F:0B09F057772F30EB5F7C0C777CD14CE7:\ 000000000000000000000000000000000000000000000000 9422B9FFCA4204AD7DDC56DF5C80ED5E:B2835EECC60F78F7B14588A8FD6069F2:\ 000000000000000000000000000000000000000000000000 0756858E5C3829E8F3C328C6B4E3E1CC:7F56E94897ACC5D0F60CF899FC4A98F5:\ 000000000000000000000000000000000000000000000000 5C8E0338CE66CFB584307A626FA4527B:D3819C5E8A9B85C86281FB7D835B7503:\ 000000000000000000000000000000000000000000000000 524CAB3F0BCAE900B7DC16839B241B61:CD71C2A15B1A5B37DA95763CF68E05D8:\ 000000000000000000000000000000000000000000000000 74B3CC8FEEC75C97A94EEBDA55B8B16A:A2703E0DEC3649AFAB35157E7484A43C:\ 000000000000000000000000000000000000000000000000 33C6D143B8E9D1F06D1339B86CF61591:BA98BC1E73D8E0B7AFA5F2BDF5755B95:\ 000000000000000000000000000000000000000000000000 EC3DF67F0136BA492F33AE0DB8FCB598:F23C047EA741E9FE948A56D8CD3D050D:\ 000000000000000000000000000000000000000000000000 EAA6AA8AE56FD97D6BD6A22CA1250287:D0B414653510A3EC079E38806F87F643:\ 000000000000000000000000000000000000000000000000 52C3399AE7244A4A7C2F2CDB8F371753:819E2216C7E18C2557CBFD688C17305E:\ 000000000000000000000000000000000000000000000000 AB61C1BEC7E3B2790B43D64E53E48B18:A3E8D62480544EA1643BD7FF5404E40F:\ 000000000000000000000000000000000000000000000000 B08CB946F4201AC88F721B850A5B3CB5:ABAF89346ECE6F72C054C82D1D440C38:\ 000000000000000000000000000000000000000000000000 B5786F5DBA379E835224508F11E87B69:93BC3706B91E27EF0CFCBDE69C2559F1:\ 000000000000000000000000000000000000000000000000 40B89D11E03992DC28F90E0CA7949B75:6153A846AEF149D02F8D1EBD0D492F75:\ 000000000000000000000000000000000000000000000000 3371D59814185FB77AB6C990CAAB3BE6:9B4039BE6A0953CBCC1D7FF0C7E73BCC:\ 000000000000000000000000000000000000000000000000 8BE18C0E0C9C5A94948BE1F1C7353C46:283A4944BFA598A114B3BF601B68B823:\ 000000000000000000000000000000000000000000000000 3A55F569D34407976540A728FE4D7840:F3DC2926970112F59FE3A40A3F8FD470:\ 000000000000000000000000000000000000000000000000 92E46A94F8180683A850126F5857F4C6:E246163EBC3F740A288F6105F4F22B97:\ 000000000000000000000000000000000000000000000000 CBBE214BB2504BEA8BF54D4123465715:D5A46FACE3B1D97AC16DB73B3BE3EC3A:\ 000000000000000000000000000000000000000000000000 4B95E574D0BE514238BA4DFCC06535B2:055C146C457B2ECFAF18D244D5400D31:\ 000000000000000000000000000000000000000000000000 B89E3644479A3540073EF40E0F090019:F2C9DC621653315ABE6A627ABF40F24D:\ 000000000000000000000000000000000000000000000000 4A5D02C4799C8C26F1FA7F715EFBB800:B2F714BC4B21FEDBD79054A507775EF5:\ 000000000000000000000000000000000000000000000000 A9D5720391D7ED3B2A23094662FFDD5B:951C0FFF6981E9B1B4C792B4A81AAB7C:\ 000000000000000000000000000000000000000000000000 CF5B1C437A54DD6F29D6F589D26D13D6:6C9FB40B31372C1DA4468C0EE559257F:\ 000000000000000000000000000000000000000000000000 8F548C2248B76EB8CC4DD0272B93D532:56DEA9C72D8E2325A9AA42E29A3270DD:\ 000000000000000000000000000000000000000000000000 E09C2E4DF75ACFFC3B8E880AC1F01FCC:D1CD44336BCD0928C4A9616D16379B56:\ 000000000000000000000000000000000000000000000000 FB1C12B77C30E6DE6DE97CE8D8D913FC:6947499CC1C807290167A693560002AF:\ 000000000000000000000000000000000000000000000000 127D02E20E973573296A5C82CDC83404:410374320F1B4AC6FE745C5973FEC5A1:\ 000000000000000000000000000000000000000000000000 91D02F2862F596944FFB92C74EB07BF3:1A7B5A06628C5871E684A2080ED903DD:\ 000000000000000000000000000000000000000000000000 6A46FA0A795B4A9E7AA998526376127E:2186A2F79A90DB5601A4BDAC7F055A92:\ 000000000000000000000000000000000000000000000000 35C4EF822C59ECA05DE6CFF2780BD44A:3D6BC6771061B7D45C60335A9DB19E55:\ 000000000000000000000000000000000000000000000000 EA374673B5E6A56004A029F45137ADA7:C19D85F934D8AEFA589489736A76DFC5:\ 000000000000000000000000000000000000000000000000 4E3A751A0EB53250C90A572D39B30FCB:6AC263B51493303AD36284D872F3941B:\ 000000000000000000000000000000000000000000000000 E581C99FDE13BAC81780AD1BF416A2ED:6967E6479E599B1BC18645C961557BF1:\ 000000000000000000000000000000000000000000000000 288BD3489BFE7596F58218A0AB1A73E7:6AFC72E6A27C640F2E52528E9CD2591D:\ 000000000000000000000000000000000000000000000000 64B69B2977852C6BBAC03750900356C9:0AC56FF8773D5AF3420974B16AE2AF14:\ 000000000000000000000000000000000000000000000000 2F1B45AF1428E9742ABB21D019ECB5AC:ADEA58D721F2398FD4C06BF0F0727505:\ 000000000000000000000000000000000000000000000000 49320C39A1BC3BE5AD09E3E9E120513A:8CC627E3557D252B45D08DE6B6896E48:\ 000000000000000000000000000000000000000000000000 55D76389493096F7D6197B7F8B6DF193:9857385C7D044284A3219004666E0EA7:\ 000000000000000000000000000000000000000000000000 2A27D235903911F331DB639B75C0D712:9B98F50C0ECF24CC1D86C9673D8A083F:\ 000000000000000000000000000000000000000000000000 419D7555072CC127A4471A05CFB19CC0:67FF3F3267642FD12B4C2889078613D1:\ 000000000000000000000000000000000000000000000000 9FD6F61B1665F5AC5AAC2FFF89BF92FE:37866C10AF2D0594C42B936AD5266A4A:\ 000000000000000000000000000000000000000000000000 BB090A45B89E261664A6122AFF274007:82DE14AB89CDD323CADA9E38567E3089:\ 000000000000000000000000000000000000000000000000 157BB4035D9D9014CF88B9E934A7B8BD:19C07DD91509033BD3DD978781873EBA:\ 000000000000000000000000000000000000000000000000 A8870F1B8C1D5D85484117F4C6AC4530:2347879BF12456873B80EE906110B8B8:\ 000000000000000000000000000000000000000000000000 908C16F16AAAD352AE911C197192719C:2C2745EBE83EABB93D0A920D07BE0DB2:\ 000000000000000000000000000000000000000000000000 1653D7F835D83859EC694970707CC095:BCF6DF6D1EEAD65E05BBE987CFFD3702:\ 000000000000000000000000000000000000000000000000 0DE06413C85A15D5D8947AD534B2B696:7287E1CD26D1EE3CA342009AF49756EE:\ 000000000000000000000000000000000000000000000000 3B543E3D80D1EAF921CC68CA776239F6:BE313F5923BC9889B3860BCFAB775453:\ 000000000000000000000000000000000000000000000000 672218755E587021EF7B02B7BCC30A61:E1ED846BEA255A1AF1B92EAC79B9CC10:\ 000000000000000000000000000000000000000000000000 811D93DE4A4BBD9414820BC1AC1B1D15:18CE61828267E31A11F44B359F5137AE:\ 000000000000000000000000000000000000000000000000 66B96FBE50A59E0D613B86DE5017D5B1:BC46D6CC0344D2F8509C24B6BD961C7B:\ 000000000000000000000000000000000000000000000000 EEE81506AA7CC547B01464EC138A2243:717D1A1B155A403FFDF7CEF95A0F3704:\ 000000000000000000000000000000000000000000000000 A08B5A609A311639984749D2C3F17B66:0D9C67C97883478626649FD699984E37:\ 000000000000000000000000000000000000000000000000 64D1AAD4D2F48E1253CCB198DA194FBE:B4C733307E59EB660B0A6F8154ED99C0:\ 000000000000000000000000000000000000000000000000 4589C65EF87C151B68906023145F257A:80E66CD1BE95CB7352142568839F97B1:\ 000000000000000000000000000000000000000000000000 C8AC7D6611C15A08D8850A6409175296:C93BAB0F83F23EADE7A01C0C1C4B924A:\ 000000000000000000000000000000000000000000000000 68AA5E6050AF889A0489CAB2B21485E5:7AA6C6697016001A666928C97EEEE3F5:\ 000000000000000000000000000000000000000000000000 A1158411888B7ACF4BC31E9DD67D787A:2498B680478226FA74B2880E485DA409:\ 000000000000000000000000000000000000000000000000 214C17577623146613245C15C2B49493:4BA8DE835393DD25A42ED04F69B4C2C7:\ 000000000000000000000000000000000000000000000000 C9D85D545FB2F7D9AC22D8161178F590:163A9559BEAE1A2F3DD42672099F725F:\ 000000000000000000000000000000000000000000000000 ECD0DFF95F9AFAC0FE2C5A95543E6567:AEC277D9AA85F6221D9ECC3C55514020:\ 000000000000000000000000000000000000000000000000 81F92762F3C9A78E25202DEBD990B79D:EAB0B505DF3FD415181D2389B7E9CB7C:\ 000000000000000000000000000000000000000000000000 36B9CA495A26B676C5A73115E4FF2D1E:ED36B0A23E7A11F171A1FD6041901C0A:\ 000000000000000000000000000000000000000000000000 933836CD34DAE3CE8667A2C314ECBFD2:F52CC9AE0294245C5785FA75F7CD565F:\ 000000000000000000000000000000000000000000000000 547BE19FEAE346CD3C232B03CA1A5FE3:BB506E47BBD9BEEBE794A888D3CCA4B4:\ 000000000000000000000000000000000000000000000000 3224DA0BF7369941B581C1991B0434F4:83F1AEFE1874155EBEB71D3BF28196DA:\ 000000000000000000000000000000000000000000000000 BBF274F554349AC9464BD0701CBE3C01:08747CBB4CE827BB8D7125B51F7D6B51:\ 000000000000000000000000000000000000000000000000 0335215F4E7DE6C6844D5F4ABB08FF8E:753D67B79C27B62F66CAE343120FF8C8:\ 000000000000000000000000000000000000000000000000 0E798B0937AADC31E5F4B1059BE7317D:D28E3F2EE5CEA4AC47B479435CB879DB:\ 000000000000000000000000000000000000000000000000 B7C8F5010674F177A867996E62143129:803B810C554A684442737B08747A7B09:\ 000000000000000000000000000000000000000000000000 3C82EE0C8AA57B1A2809A653DFC34EE3:DDF2B574C748E259D0B60E2E7296F5B3:\ 000000000000000000000000000000000000000000000000 245EAFB34BF4A2DE65D2AE9E02282DA8:367A33838C4E1D75EF86882F13F456C3:\ 000000000000000000000000000000000000000000000000 82BBE96F7A512752B34873CE91BE3A12:D80CA3A1104B1BF33C78A4126CA44D5E:\ 000000000000000000000000000000000000000000000000 017359FCC78CDB959AF03170515DB2A0:30B7EE3A4EB1B90FB4F773004894A1C9:\ 000000000000000000000000000000000000000000000000 FBE1BA1C4C9E9266219E290CA482204A:23C853980380C75EE387D499EBDC704E:\ 000000000000000000000000000000000000000000000000 7A5D60B558F7BD79506EA361867D82DD:CEC694480EA0FE02FBCA486A38D2A28F:\ 000000000000000000000000000000000000000000000000 F6E1A13C90CB990C8F98044A14153C63:5DBA1D0AD1846EA0DF7572D9796EF6DE:\ 000000000000000000000000000000000000000000000000 BE618966B8BB4C5161F16E614BB0685E:50511C6F323AA75B27D26AF37C96AA44:\ 000000000000000000000000000000000000000000000000 3430CBCDD6B31EC832674C365313412A:2EC7B023DAB88616A4069732083ACB96:\ 000000000000000000000000000000000000000000000000 B736C160AAB874D2FEAA7CEFE95067FD:B7B0662681E21B41B0211A4C347410A1:\ 000000000000000000000000000000000000000000000000 E76003121CD25AF053388E29F5CA6F36:936E6955F7EF756AB1C6DC0510158338:\ 000000000000000000000000000000000000000000000000 895F077285060573E7E66A0C610E1A6D:A3B7E3A9424D60A1CB63B445A4EF0C4F:\ 000000000000000000000000000000000000000000000000 E6EE0CBF63758F0C58F7FE5B148BB755:68EC11D4896B18797DCD1BFBD91851B4:\ 000000000000000000000000000000000000000000000000 54077665477046E8886AD6E46DFEC14A:EC98D4903AD222137CD3C9449508940B:\ 000000000000000000000000000000000000000000000000 33DEC99C9A886FE526909F940883E559:9364AB8B76D6AF8E7EABE315EA9063ED:\ 000000000000000000000000000000000000000000000000 A1E7C5A9D7C2FFBE20CB4DC98727945B:113D49B50A78202134B0C13EEF987C86:\ 000000000000000000000000000000000000000000000000 9C1DE13B101A9B72BB5625717A02E6E5:6C93D650BD87DFEF03563CF268EFC950:\ 000000000000000000000000000000000000000000000000 41CA06F619236D40739E3200E2AB1387:11470B6E8E0BA5340322BC3F17273EB6:\ 000000000000000000000000000000000000000000000000 FD432B900CF8CC44492A491722D20F89:DE117E6E44548F9CB5D419C8100343F6:\ 000000000000000000000000000000000000000000000000 7EEC086D6EF264233130020BD4678FBD:6EB1B6AB75C0DFCE7AE826D8EFEC745F:\ 000000000000000000000000000000000000000000000000 243F6735A4F71D6B0161589E98367741:5B40A381C52F55424C1903E2A6C0A612:\ 000000000000000000000000000000000000000000000000 39B2D6E42C80C5A188540586F0065DCD:EDBF0C2671F1DADC8737F93FDB17FBE9:\ 000000000000000000000000000000000000000000000000 BC9838D89EE5D90B5FA7E5811B588D53:26967E5C460F2571B5DD1381EFE9B451:\ 000000000000000000000000000000000000000000000000 9CABC3BF9C9FA7E16C4632FF8A07209B:9069D1FB3BD87893CA2C66FA10174B8F:\ 000000000000000000000000000000000000000000000000 F6B613AC53E11B62FF73D1F15D946399:EECA346E8823823C821E6E8010418BE1:\ 000000000000000000000000000000000000000000000000 6212297702FA172A0B7C0F60D0536029:154A8C133987DAC7C829C62FEFADBC28:\ 000000000000000000000000000000000000000000000000 B06732B03AA1E215930EE18FE970CC8B:167D74C63CEB050B4F14B1CEDC25C642:\ 000000000000000000000000000000000000000000000000 E4D63CD417596F627FB4EE54E27FD338:167D74C63CEB050BB0EB4E3123DA39BD:\ 000000000000000000000000000000000000000000000000 473DBEF5C2FDE2774B2858166DDDF9FE:167D74C6C314FAF4B0EB4E3123DA39BD:\ 000000000000000000000000000000000000000000000000 62E1D3103459521F0F479B9115A6D66C:E9828B393CEB050B4F14B1CEDC25C642:\ 000000000000000000000000000000000000000000000000 E1341D2FBC279ABCD4EFF8898DADC3D7:E9828B39C314FAF4B0EB4E3123DA39BD:\ 000000000000000000000000000000000000000000000000 8B45F9AA3FC0589FA05364CE5F5D2F1B:E9828B393CEB050B4F14B1CE23DA39BD:\ 000000000000000000000000000000000000000000000000 BAC8FADDB63387F8927E816010E0C506:E9828B39C314FAF44F14B1CEDC25C642:\ 000000000000000000000000000000000000000000000000 02D554DE3674CCED1D337A873B77F5AE:167D74C6C314FAF44F14B1CE23DA39BD:\ 000000000000000000000000000000000000000000000000 A647F5EC14A07189E9F75F937669C276:167D74C6C314FAF4B0EB4E31DC25C642:\ 000000000000000000000000000000000000000000000000 4A6C0DBF87CDBDE1392E198E5F9C54F9:E9828B393CEB050BB0EB4E31DC25C642:\ 000000000000000000000000000000000000000000000000 FD812C0AFD3E15E40CFF9A6CBD0A0BAE:E9828B393CEB050BB0EB4E3123DA39BD:\ 000000000000000000000000000000000000000000000000 0E41AE2781D439F0671744D4A4BB6A9F:E9828B39C314FAF44F14B1CE23DA39BD:\ 000000000000000000000000000000000000000000000000 AC335553D40961A3387BD2D2BFA6EDB3:167D74C63CEB050B4F14B1CE23DA39BD:\ 000000000000000000000000000000000000000000000000 E39AC2845BBBE8EDD743205ED7DF1DB6:167D74C6C314FAF44F14B1CEDC25C642:\ 000000000000000000000000000000000000000000000000 AA7F44B5D845906C835C65AE12A044D9:167D74C63CEB050BB0EB4E31DC25C642:\ 000000000000000000000000000000000000000000000000 E3E1B65693171906DB775EC7E4CAE204:E9828B39C314FAF4B0EB4E31DC25C642:\ 000000000000000000000000000000000000000000000000 D095576FCEA3E3A7ED98D9F29073D78E:B90EE5862DE69168F2BDD5125B45472B:\ 0000000000000000000000000000000000000000000000000000000000000000 2F6AA890CEA3E3A7ED98D9F29073D78E:A3E17E2DF4EA6F41B2017E37023F202A:\ 0000000000000000000000000000000000000000000000000000000000000000 D095576F315C1C58ED98D9F29073D78E:FD2951E466110BC6F4816EBF968CDD01:\ 0000000000000000000000000000000000000000000000000000000000000000 2F6AA890315C1C58ED98D9F29073D78E:C36EE750C51192B0C85D5BB2584AE062:\ 0000000000000000000000000000000000000000000000000000000000000000 D095576FCEA3E3A71267260D9073D78E:86069E27F65F454C6E3F7E9097DCEFAA:\ 0000000000000000000000000000000000000000000000000000000000000000 2F6AA890CEA3E3A71267260D9073D78E:00FA885A8854844C970338841CA2E24D:\ 0000000000000000000000000000000000000000000000000000000000000000 D095576F315C1C581267260D9073D78E:A18A399A0AA2FD20EAA740A0CB6145B5:\ 0000000000000000000000000000000000000000000000000000000000000000 2F6AA890315C1C581267260D9073D78E:3D79E39A79CC14D97147F3D172F66BB1:\ 0000000000000000000000000000000000000000000000000000000000000000 D095576FCEA3E3A7ED98D9F26F8C2871:1D34FC93E24880F5AA52896494590502:\ 0000000000000000000000000000000000000000000000000000000000000000 2F6AA890CEA3E3A7ED98D9F26F8C2871:9B9FE52195C3DF04ABF49E88AE46AA80:\ 0000000000000000000000000000000000000000000000000000000000000000 D095576F315C1C58ED98D9F26F8C2871:439C0750227D7CA832DDB24102C7AFE6:\ 0000000000000000000000000000000000000000000000000000000000000000 2F6AA890315C1C58ED98D9F26F8C2871:498BDBB479E9AD3E0C9EFA977827A7E3:\ 0000000000000000000000000000000000000000000000000000000000000000 D095576FCEA3E3A71267260D6F8C2871:A276C04597DAFB6459A1483051B6A74C:\ 0000000000000000000000000000000000000000000000000000000000000000 2F6AA890CEA3E3A71267260D6F8C2871:4D4D78002EDB3AA6DEF37E114AAC4C9E:\ 0000000000000000000000000000000000000000000000000000000000000000 D095576F315C1C581267260D6F8C2871:3AB14921E0F755A63DB9F7DF82030E6F:\ 0000000000000000000000000000000000000000000000000000000000000000 2F6AA890315C1C581267260D6F8C2871:5984934E048E623F6F1F6E846F655CF2:\ 0000000000000000000000000000000000000000000000000000000000000000 BCA391A780641EAADE755440D55B7C79:8A23D955A8EA12C9C49CB6C87772D56D:\ 0000000000000000000000000000000000000000000000000000000000000000 66B9589D9B8BDA10A7B61F08F1BE4ABC:07D9508924FC120A8C9FA3298FEB102E:\ 0000000000000000000000000000000000000000000000000000000000000000 F95A83752C766787DCB61FE8029EDAFC:BF79657FE10E1D40DAB5107AEC3902A1:\ 0000000000000000000000000000000000000000000000000000000000000000 E4BFB5F01F5AE8D5DA7554A0E6841386:B0B5503E111AEBC1222FD6CE80FC95C0:\ 0000000000000000000000000000000000000000000000000000000000000000 3644C76F916C379DAA45F4C5455B5E3C:1B33D206D927E2E504E1E09A2913EBAA:\ 0000000000000000000000000000000000000000000000000000000000000000 524C7C18D2890A182C794072D8AC1AB4:18F0F5819A31A3634925AFC4204A292B:\ 0000000000000000000000000000000000000000000000000000000000000000 9D422AA2BE5665A757794092849EF859:7ECB8B26799C72C688138B0303F5AE3D:\ 0000000000000000000000000000000000000000000000000000000000000000 49B56E8A5D8FECD5AE45F425AE96438E:465911E4D18055AC9CBCB179AF8CF563:\ 0000000000000000000000000000000000000000000000000000000000000000 FB7281A7A7B11AAAD386BF8D0F51AC43:17AA2A72EFAE82D9E6DBA3F7ABDC5E1A:\ 0000000000000000000000000000000000000000000000000000000000000000 E1B971981BABD8D055BA0B3AEC65A383:1B97AEA16862EC3A8BFA2B6CDFF42C0A:\ 0000000000000000000000000000000000000000000000000000000000000000 B68B93750474B78F51BA0BDA506BF539:9A81D6B18847AABAB201BC773C9578E2:\ 0000000000000000000000000000000000000000000000000000000000000000 63BF9C151852C102A886BF6D7BA005A6:F1F1EC24882931369E45DA6FBDC72944:\ 0000000000000000000000000000000000000000000000000000000000000000 19420367B3B9339D5849E0F70F79A5F1:D5E43C42C34FE1280CCDB69F1E73B1D2:\ 0000000000000000000000000000000000000000000000000000000000000000 42647EEA57A908D8218AABBFAAA02783:4BB5A2BB9A00F6132F9301E068076067:\ 0000000000000000000000000000000000000000000000000000000000000000 BD44EEAA9454B5AF258AAB5F4143FC6B:3A379C7CAD8635724825D2D35DE4D95E:\ 0000000000000000000000000000000000000000000000000000000000000000 5E9D6C985887C5022349E0175B6581A6:D6CD8A324A74397331E7C7913BDDC40D:\ 0000000000000000000000000000000000000000000000000000000000000000 FEA66253C13150CCA139B2A3914AF942:617F156CB641731508E0C2C24F30AF8B:\ 0000000000000000000000000000000000000000000000000000000000000000 FC0B8D5D7C9744BA7954677CB0A27072:600DE4F0FA8EA6DE1BA1CAD12D91AD70:\ 0000000000000000000000000000000000000000000000000000000000000000 554233FE589683EB6DE4AF5360954967:14D887DDAC1D124186DF25110C618B63:\ 0000000000000000000000000000000000000000000000000000000000000000 445FD65B8A616351C18D5D9E94F86F96:B2A26A5E4540434277654B4FCC76CDB8:\ 0000000000000000000000000000000000000000000000000000000000000000 47AA8DCFCF3FBA0684C89CAB9A2A92D4:2BD5D90CB296016CE9FECB90E454FDE1:\ 0000000000000000000000000000000000000000000000000000000000000000 EDA94AEADC314960B491FA7245CEA146:0395D2ACE5006BE2DF6EDC521CFE6372:\ 0000000000000000000000000000000000000000000000000000000000000000 113106465C379FCE76477527E045D692:7972F08BD18D0B16D67BB3BF99DDD096:\ 0000000000000000000000000000000000000000000000000000000000000000 3282ED3A1D687E195315A034F83C248C:BC778D51D757DD9DA5F5051824FD7159:\ 0000000000000000000000000000000000000000000000000000000000000000 E30A22BC4986B7851ED0F915AAE95325:D913538943E1553B7A9F9D6C87B7FB26:\ 0000000000000000000000000000000000000000000000000000000000000000 07EED76219973E3CA5C48B1FAFDAF3FB:757F50123AE84DB0D11DFE21A61C606B:\ 0000000000000000000000000000000000000000000000000000000000000000 2D9D06E07874A97BDE16CF54856BA690:CFD9B00579D84963621B5169E70863A9:\ 0000000000000000000000000000000000000000000000000000000000000000 843381809D9CB637FEC0A99486A13157:31E0FAB5DE7BE867A4272D12FC4F05EB:\ 0000000000000000000000000000000000000000000000000000000000000000 2F5F9C1F4B2C6E62BC6FE72AD03B0C93:F4349842DD05F5F81EA9302869793D73:\ 0000000000000000000000000000000000000000000000000000000000000000 294946180CF7EAB708840814BB2117D6:ABB6C4F719C839B0A35B24E2171BA15A:\ 0000000000000000000000000000000000000000000000000000000000000000 BD61CF3CA72F7B0547D7C86606DAA046:2613987BA99FEF9315563EC460A2BDA4:\ 0000000000000000000000000000000000000000000000000000000000000000 858989634E54409DD72739F6A270AC5E:A0190A0D109F01A0BE0D9C2AA2BA79EE:\ 0000000000000000000000000000000000000000000000000000000000000000 41D4C7B9FA3BF27861B67D28CE795543:0A08FAD749BE5EAB5C3AB317951790DD:\ 0000000000000000000000000000000000000000000000000000000000000000 A753BFF7F4E43CAD48D7CCCEEFA69929:100AEF381EAF8A677EB25B59FE299357:\ 0000000000000000000000000000000000000000000000000000000000000000 23606A3D54D13B00F9C5C73B8986116C:CFD0988E16F3E2C00B95AA284EC61790:\ 0000000000000000000000000000000000000000000000000000000000000000 EC92B059C312D8552048541FA0C08D41:3D463933505FCA55D7D1DFCC70514247:\ 0000000000000000000000000000000000000000000000000000000000000000 911F32CDC4AB95BE21DBB26D02C85A39:6C6822C89035170C6550399D7611FA01:\ 0000000000000000000000000000000000000000000000000000000000000000 8314AA08DF9729B0CADF46FF74804827:268F3DB80AA9D7216EB66738C4EF6F7A:\ 0000000000000000000000000000000000000000000000000000000000000000 E21A90DABBE27C02FB1B60A948401A2B:BF82462448C407E7180DD8150ECFD379:\ 0000000000000000000000000000000000000000000000000000000000000000 087CDE5529FAFB124E8595EEC504873B:7C80B7A4CFA1FFADCC6099AD6EABE246:\ 0000000000000000000000000000000000000000000000000000000000000000 625687201937916FCDA1BCD9F2A848C5:891E63EFA3554394459FCEFA252D182A:\ 0000000000000000000000000000000000000000000000000000000000000000 7EBA3AA477A029664D9E2E9B99F6140A:2483E89D964CF99B3FB0D1A3A45782FB:\ 0000000000000000000000000000000000000000000000000000000000000000 DCCEE8E27ED8D75763F7524A63D215F0:028BC9E5F853A160F39A83803AF2A7B7:\ 0000000000000000000000000000000000000000000000000000000000000000 19CFB7ABF48179C4851C2F25C92BA826:26221D701683AE54ED151ACA84DEB442:\ 0000000000000000000000000000000000000000000000000000000000000000 5CBCC9B2BD2F1D3EC82642035A092467:8A5355C93A66CDFE21EF6842CF80E31E:\ 0000000000000000000000000000000000000000000000000000000000000000 082504676AB8766CA4F738C7BBE124BB:2B9E10C57473AE627D43266970AE61E6:\ 0000000000000000000000000000000000000000000000000000000000000000 6C0344E7FA166C41B4199447B8320317:8271EFE5D0E0D6274B8A1C920086FE65:\ 0000000000000000000000000000000000000000000000000000000000000000 083C6A6AD16559D929D128016819210A:7DAE9CBFA76042FC9096F4A6A143AF9D:\ 0000000000000000000000000000000000000000000000000000000000000000 E234B590C30CE6F2A068598498FE14A8:3BFE3D4FE7B417DC0DF94EBD0AF57154:\ 0000000000000000000000000000000000000000000000000000000000000000 8EBC8A9B40C2710981158294FC1524C0:3C6B2E08A25BB1C9D8E891CC19681A2E:\ 0000000000000000000000000000000000000000000000000000000000000000 A4A883B169B2C1EC1ADFBAB989779DF9:8D1D2E8B3E4B8869F1FEAA1AB2975170:\ 0000000000000000000000000000000000000000000000000000000000000000 BE11424787E04DDE5B6D87C327AE5D9F:CEFD8D50D4E917DC70849A1CB8CE3C2C:\ 0000000000000000000000000000000000000000000000000000000000000000 32B6435915AF7E05F759494479E6B294:C4563E114E1EE39F46FB68ED092D7C27:\ 0000000000000000000000000000000000000000000000000000000000000000 07A09B044F080EE504D92A3DAC01D303:258AE473968C1DA8EFD1FA5E340A83D7:\ 0000000000000000000000000000000000000000000000000000000000000000 1E4325EBF0CD71DDEA3C8B3B5FF23E29:073A7BD1ECEF25E0206C9042C00F6731:\ 0000000000000000000000000000000000000000000000000000000000000000 E45CD56C95DE72CA3697FA647A0EEC54:57C8671286D9996FEAC834D3692CDABC:\ 0000000000000000000000000000000000000000000000000000000000000000 58CC453047697A9D4855613C742F9688:4A56D387BD10C8F7A46C96C0E2F678C9:\ 0000000000000000000000000000000000000000000000000000000000000000 8F4B0DCF7323F12D2C6C3301E1A86CFF:59A2EE2B3F5D52A1354460582394F0DA:\ 0000000000000000000000000000000000000000000000000000000000000000 60D7A7390C51292D63F8E13D94DB66D8:D347A65241A7BCF70F04A68A6BE2ECEE:\ 0000000000000000000000000000000000000000000000000000000000000000 FFAD53B9D3B77B103BF9ED6F7A53DE31:3B16D9CF3680A56D4A23722949AA2FFB:\ 0000000000000000000000000000000000000000000000000000000000000000 E3913FC5766362632C0AEF411A2329BF:6C5D76419C71E3A34DC9457B990708CC:\ 0000000000000000000000000000000000000000000000000000000000000000 A6473B8402F5F57FC4BCADD69DA23F78:190CA4D0F4BC089B3F26F03E60290FC1:\ 0000000000000000000000000000000000000000000000000000000000000000 B714071EB4260C9A0BD650C7E19832B7:B730D4DFE3ED225B06B2A3BEF52DC790:\ 0000000000000000000000000000000000000000000000000000000000000000 388C8FC9F048D4CF103C43CB275179F7:E2FAADBDD818C6F4532758EC96C56A73:\ 0000000000000000000000000000000000000000000000000000000000000000 90934F3C5F5136B11EFE5FF9DF9DA0F1:9D593FF89F7EC95ABDC3B4F8D2B5B3E6:\ 0000000000000000000000000000000000000000000000000000000000000000 DF2B2ACE7CBFC27887E5483DABDF837C:ED1D6AC5EE3935E6DB4CB7E34990AAA1:\ 0000000000000000000000000000000000000000000000000000000000000000 BACCF7E913B35F887489C30258B7C2E2:0A9D724CFC816E5CB13A2147BC64D694:\ 0000000000000000000000000000000000000000000000000000000000000000 D23A16EE588C5188610DEC181C6C7DCF:9084606C1FFA7A3B8C27977953C686C9:\ 0000000000000000000000000000000000000000000000000000000000000000 75D6E08BE0C85693706F42390387F792:EEEA1012319432080499711FBBDAF413:\ 0000000000000000000000000000000000000000000000000000000000000000 EB7A15C21595522B52FFF012D5B98D5D:70EF833B23D8985C01B7F68BB732035B:\ 0000000000000000000000000000000000000000000000000000000000000000 50BD484FE42B4A1C49F9F24D2A0BD279:50F7C8A8D280FED79EA137B19B6CBF63:\ 0000000000000000000000000000000000000000000000000000000000000000 65210A79205B1E90040B30205D60EC0F:CDCCED47818563F849FB6E2E03A536BE:\ 0000000000000000000000000000000000000000000000000000000000000000 6A6016462364EEF36CD86AFC407DF814:C003B86F7C550805EA2C4CBB0D18C3C7:\ 0000000000000000000000000000000000000000000000000000000000000000 1354509926BD2A9D24C3E1C343E57685:084EFA18B92E39D6D5929B8A85EDEFA3:\ 0000000000000000000000000000000000000000000000000000000000000000 69D5AB6AB54A51F89510DCF5CB929443:E267FCCBF14660B3283B79DAE067CDD5:\ 0000000000000000000000000000000000000000000000000000000000000000 936F01C43C2AE4F6237A1198DC1B9A12:E181F5288869A4BBB5BD7B982DCE044D:\ 0000000000000000000000000000000000000000000000000000000000000000 09EA3582964BF1C95FC528262D40419A:ACAD023D370F43350F141B95A7EB2B82:\ 0000000000000000000000000000000000000000000000000000000000000000 4B4E58B375BDC9FCE5029C3015EAF890:95B8EABE9BC6783C4FF9A39A8188B6F1:\ 0000000000000000000000000000000000000000000000000000000000000000 8AF33FCAAD22AC2F30C1864E8CDC44C9:F7BE2FA21170A24902994FCE2753DF75:\ 0000000000000000000000000000000000000000000000000000000000000000 8F2947144FDB524D6A7E4B8653079109:D7F8A1A155707CFFF493091126ACAF81:\ 0000000000000000000000000000000000000000000000000000000000000000 4692BD551D478DB55B88577C51401C74:19CFCD975F915B1B91B52B0A3F0AA9DD:\ 0000000000000000000000000000000000000000000000000000000000000000 C9006CD66124A21A730EFCFE380EADDA:1C30408126876EB5352A751E29C7CE24:\ 0000000000000000000000000000000000000000000000000000000000000000 6B77C29FB0D9236EE31FE1F8DE56B87E:0AFDAA45047280613BAD45D03DE88740:\ 0000000000000000000000000000000000000000000000000000000000000000 54AE286A42141274F79B54DFAC4CA6BC:C68A8E4FA3C13CF7479BF429FEDFE303:\ 0000000000000000000000000000000000000000000000000000000000000000 F6FB23BCC18F091F9B8A0284BB112316:C3D26D89600BDA652A0666306BA5591C:\ 0000000000000000000000000000000000000000000000000000000000000000 08F5A81FF672643FEB06241372C1A7EF:85FAF4EF8BBF9AC0680FB8C23475A52B:\ 0000000000000000000000000000000000000000000000000000000000000000 50B8A6F3BA479442E47FF3DE5EEABD0E:6267A16EB828E472607915291BDB007C:\ 0000000000000000000000000000000000000000000000000000000000000000 8379BE367A37C3710331628CAED61D6F:28509647E60895C9E249CC82576465AB:\ 0000000000000000000000000000000000000000000000000000000000000000 48D56A98749F23C5221B2BBED38D6B41:F98CE8293DD9DC8AB4661A44ED500908:\ 0000000000000000000000000000000000000000000000000000000000000000 81952B3F6E16345C8EB291532F8AA55D:2C8CF6EAE96494549847454E451F574F:\ 0000000000000000000000000000000000000000000000000000000000000000 5F98C90888EACDE82696B9F02CC845DB:BE3A8C77C84E12E8F8427DF0CC591681:\ 0000000000000000000000000000000000000000000000000000000000000000 F079009892C0E82DF27E805CDD767EF8:810E8C7A31A49DE7A02F2744F490C0CB:\ 0000000000000000000000000000000000000000000000000000000000000000 3E1BE2C90DFFB9C7D858E23BDE70C3B3:A336A43F20501DE36D9C42DCC69B5C3B:\ 0000000000000000000000000000000000000000000000000000000000000000 1D8C428C8F0D7262D2109B9D1E16EB51:B11FD9AE0D67CBDB7F990DE4FAAE2A61:\ 0000000000000000000000000000000000000000000000000000000000000000 801EF23541E6FB654C3884771578AE2E:8F1042F616351D5FDF929C50F3109169:\ 0000000000000000000000000000000000000000000000000000000000000000 40B14F285E32BDD61B29160C0C6BB610:4D5E33A7533E71FD3C4BFD7157FDDEC3:\ 0000000000000000000000000000000000000000000000000000000000000000 4226A372CEAAC4F1AA0BFA2588817D8F:D1E9CF5BCCC71CB62C0D57255CDBC2B0:\ 0000000000000000000000000000000000000000000000000000000000000000 F0353993A789A852FCEE7795E3DB8235:D0CB3CFEA6162C4DD7F8BC29E4702344:\ 0000000000000000000000000000000000000000000000000000000000000000 CEA8A3CE895CB4252905D6E8FC7FB8AF:BE8CC9E62A360AAF0F0C3B59F09D6509:\ 0000000000000000000000000000000000000000000000000000000000000000 FE7CC498A82A8DBEC2798FEE7F4B6BA5:31489535231BFFA6B300949589969866:\ 0000000000000000000000000000000000000000000000000000000000000000 80703279F021C9624D952AFAA3E1FCCD:EEF27A88328000A4CA3BAE8FE26D03F3:\ 0000000000000000000000000000000000000000000000000000000000000000 2926397A6E38A4EE7D1EF20F31BE8702:626B25E780F216EFCB33ACEAFF53D346:\ 0000000000000000000000000000000000000000000000000000000000000000 F24B278B89128056E95D04412819031C:52A77408ACF9483F3360CAC1EEE7CB66:\ 0000000000000000000000000000000000000000000000000000000000000000 757846E9F24ACA7BBC53057D86F40DF7:D9909AAB2D47E73F5B2AC8B4D21C5152:\ 0000000000000000000000000000000000000000000000000000000000000000 69F036E5559B53AC0BE4D71933C9FA6D:B123F297E11321E138ED8B797E3935E3:\ 0000000000000000000000000000000000000000000000000000000000000000 AE25363E7527BA574B336B3658043EC5:531265FFA27309E010682226D40FF301:\ 0000000000000000000000000000000000000000000000000000000000000000 261DFB2B0FC8058DE4F2BA0E9D07267F:73191403C7F106220730944CF664DBDD:\ 0000000000000000000000000000000000000000000000000000000000000000 F4F44EF26EEE2F214E55FFCFB67F747C:B27B0272C70703C163EFD2AE9B696D68:\ 0000000000000000000000000000000000000000000000000000000000000000 6E7D61A090B1DDFA455A9334F71B1049:3F301BB140FE500EE6211F5EA8C475D9:\ 0000000000000000000000000000000000000000000000000000000000000000 9BA82C854F0602CF32A7A1FD454A244D:0D07EC51FD0EEA788F4F4118CED4F76C:\ 0000000000000000000000000000000000000000000000000000000000000000 4943602AA81A1B09F25924A115038BA6:5DB3CF4BA15D10B20FA1C16CD38AA48A:\ 0000000000000000000000000000000000000000000000000000000000000000 BD655DC9F095901130F61D7461169429:3F1DA00A0B1113E731F09A18012FCAFF:\ 0000000000000000000000000000000000000000000000000000000000000000 881C7EAB3D5485EF3001CF123AD232CD:7739D6C688AECA837B665E163D7807A5:\ 0000000000000000000000000000000000000000000000000000000000000000 DB78BB44ED268A41D7BCC768F1C1DDD5:EC9954AD43C78B7F3E54437EADD41E45:\ 0000000000000000000000000000000000000000000000000000000000000000 EDA01E4405F7A5879C1D9DDC99E494E2:5714395272B96FBB8A4DDF3371D99285:\ 0000000000000000000000000000000000000000000000000000000000000000 F43DDDEEEF8000C262E2CC8025E7F7D1:3A78EA14F436C82606F3EC036DEADB82:\ 0000000000000000000000000000000000000000000000000000000000000000 F67BCA996B8F68C6178CF12B69942EF4:51982744D0D4441EDC22E9DB28148AE4:\ 0000000000000000000000000000000000000000000000000000000000000000 1B2F9DC1D0081629E2D783BEDCFE556F:0142F890C1EC3B1324242A6266DD6E35:\ 0000000000000000000000000000000000000000000000000000000000000000 7F697D4DCBE48A0E0C1B76905EC5387F:B5ABE383FE29DEBEAEEE1B1BA216617C:\ 0000000000000000000000000000000000000000000000000000000000000000 0087BA91A953F0AA37D906B4F83F539A:2DF146BCF57886EA715DEAB67FC919DA:\ 0000000000000000000000000000000000000000000000000000000000000000 8BA37531E5AC90DF7C274BA0F09F710F:683F0B9893990052F5002D12060F8737:\ 0000000000000000000000000000000000000000000000000000000000000000 31D0A790D8B5F52BE0B6AECC098FFEB6:709631DDFB876005986AACF3CDCE4309:\ 0000000000000000000000000000000000000000000000000000000000000000 C582C293E55D228095BD51C634ABCC1F:EE5CB6D8B964B9D6D45DF97FE26C46E2:\ 0000000000000000000000000000000000000000000000000000000000000000 82509552588B0707D8E972E34D34FB6B:A8BB6BC6E9044A7D4C0ABD1A63EEEAD5:\ 0000000000000000000000000000000000000000000000000000000000000000 92DD30BE9D6FBD8CC3CD6AD5A02B9644:E743F0292626C7198388BB07B172E203:\ 0000000000000000000000000000000000000000000000000000000000000000 F533132CEE021C1BE4E27610C7FE658B:EBB22F93A2709B4FCAB29DACC2B7CEBD:\ 0000000000000000000000000000000000000000000000000000000000000000 821E2D8D0E1D8DF54F92B0872C26F647:B8AF4BE5223225DF4AA9629C6F3E5DB1:\ 0000000000000000000000000000000000000000000000000000000000000000 CAC520ADB6D2116EFCAE1BA9CFC07A8C:CBEF84E5B8BDDEAA94FD63FB9C196B95:\ 0000000000000000000000000000000000000000000000000000000000000000 61370431D23B19C9919F90FA630650C5:C9B61AA02DB1164F68A5439133AD0CDA:\ 0000000000000000000000000000000000000000000000000000000000000000 399E8C6EFA778B3B0D7414905FAB7FCB:144085908ABF7F86FF737DFF301F3408:\ 0000000000000000000000000000000000000000000000000000000000000000 14189BC9EE6D85C59A56EAF1897C8456:2BE6F430D40E3E43C9C0DBFBE68B2550:\ 0000000000000000000000000000000000000000000000000000000000000000 F1E5C20447D785B4AEE92AAB76AADA7F:67E726A625DFDC0AA862F8BBA7097B7B:\ 0000000000000000000000000000000000000000000000000000000000000000 8FAAF9826481DE26DCA70C204A9060BC:488470EE1514C99C1CBBBF21D2205EF2:\ 0000000000000000000000000000000000000000000000000000000000000000 B6BD97EB4246524E123EAC300B208AF7:5BE2B23A54FB35FA83814A2BB9C402AB:\ 0000000000000000000000000000000000000000000000000000000000000000 0A78A42122FE13F849142522BEFAB9F9:04501EA5A82BCC7157832EEDE91381FF:\ 0000000000000000000000000000000000000000000000000000000000000000 46E4EC66D3EA604F4F166259F8B31F04:6D2DE018B6024B5860C5F8A85D8BB034:\ 0000000000000000000000000000000000000000000000000000000000000000 20AB8FE133F07559C320D5B2C41FAD15:C13CADEF2B413DD1CBF3AB479BD2B9B6:\ 0000000000000000000000000000000000000000000000000000000000000000 7938DC46E7E3DF01F3A24D825BD86672:EB2B02D0A6908C51580D552330189C94:\ 0000000000000000000000000000000000000000000000000000000000000000 7F7938F0A5BD91783AAB003AE1BB79AE:B54CA133FE06CDF7C37B421559F72849:\ 0000000000000000000000000000000000000000000000000000000000000000 91A8F9C577E2852E312DC4A5C1255EE1:0EAF829E6680344B639E5F45B0246598:\ 0000000000000000000000000000000000000000000000000000000000000000 ACE62912A71A4F34B672D9C80B73E12A:C91C23C725254124B118BD2DF16FA907:\ 0000000000000000000000000000000000000000000000000000000000000000 5B3F25EAA264348B446EAC39C42AC7A4:6FBD63968E0B5E19C62D320FC59DFD42:\ 0000000000000000000000000000000000000000000000000000000000000000 63E2A7973C2A818F6D1F9F9640F703CD:94C9FC1FB22610AE0BA34B8E8AA4A980:\ 0000000000000000000000000000000000000000000000000000000000000000 D8E72560E63A9C9F1115C3287ADDCE7E:CA01FB995BB46F6B0870F40D672FD0B6:\ 0000000000000000000000000000000000000000000000000000000000000000 126FC05EB726CB731D90916A80BCF638:CBB52C3ED1DB3A4D60B4C205E167C6E1:\ 0000000000000000000000000000000000000000000000000000000000000000 BF96CA36FD923F966113671E8C9D84F2:EB8710E2F753B46647915E9B6D1F4FDC:\ 0000000000000000000000000000000000000000000000000000000000000000 F0EF517FA3B3F8FA6DA04C401955BC47:90432E85F8FFFC8AC6198F14ED96E6B5:\ 0000000000000000000000000000000000000000000000000000000000000000 E5A4F0D39FDC96DBA5BD04FDB69A9439:52FC091A6D85216ED45716A06BF28F7E:\ 0000000000000000000000000000000000000000000000000000000000000000 5D484FF8D3B7071714D0CFAF400DADC1:8DE390FE597FF61A3CCF4443B0454940:\ 0000000000000000000000000000000000000000000000000000000000000000 3146A7EB1564016886631C7AF1500C42:551CA9841792EF7991ACF162C8F257AF:\ 0000000000000000000000000000000000000000000000000000000000000000 2241AA352F3AD9FA379F7AE0C756239C:F121B24FDD91E6BB830D131880BFDA6D:\ 0000000000000000000000000000000000000000000000000000000000000000 D70CDF5BBA9D65227656CDC98C1FE3E9:7FE52C4C3315DEA7B5D9984D5EA4CEAC:\ 0000000000000000000000000000000000000000000000000000000000000000 FA84B748F0B60B0BBAFCF5B49EFAEA49:F852BDDB729CBD20A2C439D1A659E1DC:\ 0000000000000000000000000000000000000000000000000000000000000000 FF377F97E2A6125D6E1ED3C0F761A215:7AC46B10E7488936BA1EDA1745AB310B:\ 0000000000000000000000000000000000000000000000000000000000000000 DEBF9FB92055ED91A1BD841D68F87EBE:85F83747E314AB1A65E42D6BD9F130D9:\ 0000000000000000000000000000000000000000000000000000000000000000 CF6E048F8EAFD765DF1E1CF230138993:C4B603A7BCB0A5FB8FCE31B42A8CCE89:\ 0000000000000000000000000000000000000000000000000000000000000000 4E377F3D81C2DF4850D3EEF175B39155:6C6D4021723B65644CE895CDF0EF2E76:\ 0000000000000000000000000000000000000000000000000000000000000000 08D1D0F7E188F57362457B0EE4596CB6:CF1EDB093B63D04AC6A043D69F1E6BD0:\ 0000000000000000000000000000000000000000000000000000000000000000 67E55401208F491D5BB672E2F25B8F9C:47B1E80E65C74BD56312EFC18E16F01B:\ 0000000000000000000000000000000000000000000000000000000000000000 6CAE6670BB9E867784EFEC6E405BC90D:344F3BE8D68569097F9A4A5991D43551:\ 0000000000000000000000000000000000000000000000000000000000000000 E4B8492F2D5F9B241855068746F09AFC:81277643B99DC768B898D381EBF55CE1:\ 0000000000000000000000000000000000000000000000000000000000000000 3888ABBDB9245E535F52C2A1C4E9AE82:B962C5F25FDF7684E52EC354208939CB:\ 0000000000000000000000000000000000000000000000000000000000000000 D0B06EA2EBA073B21628DBAC4FAC7656:75A33ED3B6B30B41421C3B251B76F82B:\ 0000000000000000000000000000000000000000000000000000000000000000 7387F80E53D5F5B68D262DA9B948C143:51717F47145BE37498A1F1A180B88D4D:\ 0000000000000000000000000000000000000000000000000000000000000000 07078EF7871B2DF91526B731CD7EE98C:E8D32221991BB2861AB4F271C17AFEDB:\ 0000000000000000000000000000000000000000000000000000000000000000 48CBB0CD929BAD37E3E09C07941A6A79:292268D201E5CEB4C27B9D860B3F0227:\ 0000000000000000000000000000000000000000000000000000000000000000 F9FBCCBFE5B4B51DDB3F67B253A54618:4DABC3E8F80E9C72656AB2FFF26BE438:\ 0000000000000000000000000000000000000000000000000000000000000000 49CA02290571BB70BEEE06F07AA31502:B59EAD47674A0A4B59C318DF6378320A:\ 0000000000000000000000000000000000000000000000000000000000000000 3F407FF4785D3E2E47B66A3675302268:50AADE7CD8EF67BD643B86D4B3023D85:\ 0000000000000000000000000000000000000000000000000000000000000000 3E4CE1EAED91968D4D67F804B4576A87:654D279050B241B87B9A511FAACF01D3:\ 0000000000000000000000000000000000000000000000000000000000000000 847E63FB5437129DCF4FEE704809EE09:DD41EF5762AE57F0653D786BCBA70DF8:\ 0000000000000000000000000000000000000000000000000000000000000000 720576733C67099529A17B6F4010FEDF:FEF594E990F7423A37F71963136A671D:\ 0000000000000000000000000000000000000000000000000000000000000000 AEFEB7A92EAD088FCC30CD88129E22DA:C54F79A13C6F2835D694AFB48791836C:\ 0000000000000000000000000000000000000000000000000000000000000000 F3A4234B3A72361AE98322191BDDC35B:689FDFB1AF5CA1B55300A965702F3AB5:\ 0000000000000000000000000000000000000000000000000000000000000000 C899AEDF52BF6FB16B5F3DB7C47F0088:CAC32974F089ECE899D9AC85C612AFFD:\ 0000000000000000000000000000000000000000000000000000000000000000 8DD1993D1F9FA3850B2CCFFA7A42BB88:FC6F6AD5E8D1AC86EFB14240D1BC1EDA:\ 0000000000000000000000000000000000000000000000000000000000000000 6B7442B6328BF059D87828FDBFE35225:775ACCE20C7BFB08F20F8CB7CCA80C32:\ 0000000000000000000000000000000000000000000000000000000000000000 28C94A8AF7348B622A4C8F20434B54D8:CB8066BD149F368A04533E6893669674:\ 0000000000000000000000000000000000000000000000000000000000000000 42E049CBF52DD8A65906BC0ECDAF7D21:63C0F604FB661A4876AA5A806CDC618E:\ 0000000000000000000000000000000000000000000000000000000000000000 D1FB1FB7F21CBC0C88D05F13DFC35185:6FC61FC03C4D7E7DADCCD93A4DAB5219:\ 0000000000000000000000000000000000000000000000000000000000000000 D382977D7754A6BFDAB545E9747B19B7:E97A4729AA40ACBBB409D5CC02A0A075:\ 0000000000000000000000000000000000000000000000000000000000000000 85090B82AFC0B9AC5273855778BBC3A6:F6A41B9AF291ED32F3ED14A2A7395253:\ 0000000000000000000000000000000000000000000000000000000000000000 08B463BABBB37A233F5F106C4D5F4129:F3952274AA0E8FBF2803A244A2ED3176:\ 0000000000000000000000000000000000000000000000000000000000000000 C2197F028D57D6EA121C8914FE626BB2:BE43FD4AF749F24BEAE40F2DE31B8CB6:\ 0000000000000000000000000000000000000000000000000000000000000000 4642E392D2326401EF9FAE2B872B809E:950F995FF73976974E602D7C37B7D67A:\ 0000000000000000000000000000000000000000000000000000000000000000 765D5C526AFDB0399E1B1DB8A89FAC98:98A8A7CB6C63BC034374D37AD21FAD96:\ 0000000000000000000000000000000000000000000000000000000000000000 39589154E13C7E7DD44AA5A416B19381:9D78017FCDE71C8FA53D6BE31F20F354:\ 0000000000000000000000000000000000000000000000000000000000000000 9305802BD1628C12B81CA03A05C18644:80FEA18D5BA12EDB6D4B801C0A8B356D:\ 0000000000000000000000000000000000000000000000000000000000000000 3FF59332CF19765A310B432D8EC2E24C:90C697E4D23DFFDA31762C96A0314520:\ 0000000000000000000000000000000000000000000000000000000000000000 F900F6092357CFC0D24F268F8BCE1849:06DB3FC23372A53D5ABD29D3AABA9784:\ 0000000000000000000000000000000000000000000000000000000000000000 2AF78325BC7FF73893B672281C7A8A2C:FF9511236216D6AAB165512C862D1033:\ 0000000000000000000000000000000000000000000000000000000000000000 EF0813F05B70CEE98ECDCA10378E25C4:A55D68BC71C81D9803184D5890968A78:\ 0000000000000000000000000000000000000000000000000000000000000000 65D15161C93536E3B3D17D72DBF2C36D:64771CC3E89296E5B51D86DBE5C61697:\ 0000000000000000000000000000000000000000000000000000000000000000 D4BF40C1DB6F6E30108AF6C99B379C74:39D03BB7059D1D4D56FFC0F51B46D1EE:\ 0000000000000000000000000000000000000000000000000000000000000000 ABC44A5DF6BE71F0BFFFB7EDD43FF39F:114EBE72C55A45A353854EA02C3F5953:\ 0000000000000000000000000000000000000000000000000000000000000000 DFF5CF0EF3A729E2BDF5AAC15C47B482:F5CD1830D1E1C80676095F975AE9C4E2:\ 0000000000000000000000000000000000000000000000000000000000000000 762A7EFCA64FC897E2AB73D7B1E4C55D:5FA9ABFF7A5A4F38C51ACDD1ABF7B1CC:\ 0000000000000000000000000000000000000000000000000000000000000000 A19C0EF84F3F1EE7671BD3BEAD9F5C4F:97CE27FB349A3E47501026CFB8A482F2:\ 0000000000000000000000000000000000000000000000000000000000000000 6D9BA177DC7ED78B677A2B777896D122:8CC60CBE26354E70920EE8A8DEFD8C45:\ 0000000000000000000000000000000000000000000000000000000000000000 84D38A4D2BD1603299B4D1268D5C04ED:1A5308CFEDE62DA3D4D250B5CCFC251D:\ 0000000000000000000000000000000000000000000000000000000000000000 CCCABD652DF9E408311E359EB18F416D:71377B721483470253AFE3181F523921:\ 0000000000000000000000000000000000000000000000000000000000000000 0222F3AAF0D213143635B63CFAC02032:72B50A920DABD365AB2C48E888B76377:\ 0000000000000000000000000000000000000000000000000000000000000000 9BE224E2313DF5E93FEA7A9051ED8456:D8C83B81A2B73FD56538015C67C61EB5:\ 0000000000000000000000000000000000000000000000000000000000000000 0F92300EEC97547E6BC58E066A28FBBA:FB0D8CA9BB551B808B335879B98AFA90:\ 0000000000000000000000000000000000000000000000000000000000000000 C9382AEC049FAF4CB75128D8A0FBBF10:56E669C32A3481FC05F5AF22473614B1:\ 0000000000000000000000000000000000000000000000000000000000000000 9F5BFB399A615408DF0BCBA6E43E2130:C5AB52A86EFD123BC5522A64035FECD3:\ 0000000000000000000000000000000000000000000000000000000000000000 9FBE5F1202FFD449F7833CDE44DCA62A:7320AEACFD518D39FF69068F64A6CBB4:\ 0000000000000000000000000000000000000000000000000000000000000000 830408D6A8F161C0C2D058A2CBA5AAB0:FE7C48092F269CC1B9F10DD8DFD866B3:\ 0000000000000000000000000000000000000000000000000000000000000000 46D86E657103B18078645E6AB0C24722:D7D1B7E2A137B75C89290162F16C6BA1:\ 0000000000000000000000000000000000000000000000000000000000000000 E7DC58F11BCE3C7D6B8AD2A5415EF3E5:2114D2BD30AF001BFC2655F832D81C81:\ 0000000000000000000000000000000000000000000000000000000000000000 07BB44ADA25B638C091D92B67015B703:087AA29983682867A4690287BCE3F0A0:\ 0000000000000000000000000000000000000000000000000000000000000000 4586E5A6EE3B908F08B7392B74B478A6:B92726E53E1596B88C53A82943895CD1:\ 0000000000000000000000000000000000000000000000000000000000000000 ECBA6E02BF9C11D70A2C760EFCEE2A76:45C50D0211E804E1A75EA5F4CDD9D672:\ 0000000000000000000000000000000000000000000000000000000000000000 1F57C57183C32E7AA748E4E8D2E36966:E4DE4377C9ECB95A7ED81C63C34304AA:\ 0000000000000000000000000000000000000000000000000000000000000000 1C655E258605EE91AE413C246894B354:3283FC8FFE25005AE6936FF3BD738CBC:\ 0000000000000000000000000000000000000000000000000000000000000000 84743F37B54B7B8CF1D94053B0970599:3BE8FC8C5AC5F98592AE3F9B1A77E71D:\ 0000000000000000000000000000000000000000000000000000000000000000 E4350F6E48912239D635A92EDC5D8BE9:BD62C9A7863097A8E34C5E93461C6B5E:\ 0000000000000000000000000000000000000000000000000000000000000000 7C4ABA6DCC886B3046F32AF18F3ED0E4:1DD38A4D9730F51F83EC35B6CD0AAE93:\ 0000000000000000000000000000000000000000000000000000000000000000 168D7910C13DB8A372EA719D1D2D4499:445FE01A29E7A8D34CA8B4B2B2B79066:\ 0000000000000000000000000000000000000000000000000000000000000000 6D35D9D0C309681F3B2E7663F940D67B:8F10F905C780709E2917AACFF5A6F4E0:\ 0000000000000000000000000000000000000000000000000000000000000000 F734EF63150021DAB7EA0B421F9DB7E7:833D03B9E53C1FA9E5C4E59C778527C3:\ 0000000000000000000000000000000000000000000000000000000000000000 2420531C90FA129E86D116BFBD4FBE1B:9660D979C78743F9E85683E58072C1AC:\ 0000000000000000000000000000000000000000000000000000000000000000 CB6354286F89B58A88B711CC9C7E1316:2788DC343D4CB5CA7E9E702FD06244E2:\ 0000000000000000000000000000000000000000000000000000000000000000 7550AF569DE4F4659EB3589CF5812751:103F876C50095392E8CD90E153AC7932:\ 0000000000000000000000000000000000000000000000000000000000000000 8D59F016346D94F4A051970F433E129B:5D6DBE294744555924D9A21ED0F97497:\ 0000000000000000000000000000000000000000000000000000000000000000 3595D0C290ADC80AB52F260E54062D09:1189DDBB3FC2481F092A162DF999AD84:\ 0000000000000000000000000000000000000000000000000000000000000000 9E34D36709DA00EDFD1828D3B049EC85:7E0F45E113BEBB4BC2E0768612E99B84:\ 0000000000000000000000000000000000000000000000000000000000000000 BD53751ACA579D2FBEF6AF264C1471B3:9F42747C49F414090AE7D3A370DDD89A:\ 0000000000000000000000000000000000000000000000000000000000000000 C5CFE4490F9EA125EA08E52B130DC452:0262E84E186D27A2AA3F11ED73560911:\ 0000000000000000000000000000000000000000000000000000000000000000 7296903DFC97CE8911E6F69BA9D77C57:CD8717F55E29DA5E2AF4DEBEA34E6871:\ 0000000000000000000000000000000000000000000000000000000000000000 67D1D868081846C76CD5E7C805072AC8:5D36D35E48AFC010FC6AD5751A745FE7:\ 0000000000000000000000000000000000000000000000000000000000000000 C01ECC52B57ECA82268DC043421A9826:48D7F60A1E126F0F9185B8AD37CA77AF:\ 0000000000000000000000000000000000000000000000000000000000000000 03160618AEB467F5D855CF636A96D188:7F5C9F5E608F3BCA661B9568EE89337F:\ 0000000000000000000000000000000000000000000000000000000000000000 41075EE5796F93B79506F5E707E878B4:300C3B4DBE4FAF383C7F1CEECACE3BC6:\ 0000000000000000000000000000000000000000000000000000000000000000 A88BE4033A227A2B1C40EF6A1F65C7EF:112B723BA5AF2B8907B8A9AD4C3F5650:\ 0000000000000000000000000000000000000000000000000000000000000000 E0D8C49C27057C8B74D6BC20D4C67D89:2116595D34B5D4F1EA1B0A6816930E14:\ 0000000000000000000000000000000000000000000000000000000000000000 E6209F87D0DF56D163DE4167A120D541:88FA904B5A4B678567591BBB834A83F3:\ 0000000000000000000000000000000000000000000000000000000000000000 98DBCA6051954B0F57F8FD14C0448F01:DA33BC0F7510CCF9A2CA4FA1C1538A76:\ 0000000000000000000000000000000000000000000000000000000000000000 7B6C866DEB20E9EF998193BA14ABDF4D:717481414648473321CABC8093446C55:\ 0000000000000000000000000000000000000000000000000000000000000000 D7351619C93520F9EDE823B1BE6B1525:D5ADEA8259D2E8B625EA2F02BEF19CB5:\ 0000000000000000000000000000000000000000000000000000000000000000 6BA35A4E937AAA186FEEE58CD252C383:FA2DE39C8A6944C280370D07CEBA6140:\ 0000000000000000000000000000000000000000000000000000000000000000 4CA9DF4245FE3D5BC9BBCF0A77E5A6BD:42EC0E38C6BAC576A6C1BC7944F612F7:\ 0000000000000000000000000000000000000000000000000000000000000000 AAB1E15C2BACD32DB1CAE51B78110D1A:CEDE8C8A7DF59EB235BA38BBA24BB911:\ 0000000000000000000000000000000000000000000000000000000000000000 CB457358E20488B258E360D678BED84A:D28FC92A52E631F0D8E8B343A4A3B203:\ 0000000000000000000000000000000000000000000000000000000000000000 41573D084090591302F86009ED66714A:8C42C71176414120A4BFAC5E712595BA:\ 0000000000000000000000000000000000000000000000000000000000000000 2376FCB2F9354E84204BF1FECFE37467:7BA7AFC5BE5D69600E68CCEDF780E1D4:\ 0000000000000000000000000000000000000000000000000000000000000000 0A35CDE7A69929A31C7205821EB5AC74:0B3776F3CAC22BCF870DDF10C1869A4A:\ 0000000000000000000000000000000000000000000000000000000000000000 30AC1DF30D0933A1BE9A7885BD4D3C5D:94F0B2C509A8531C9A0AD81637C2DCE0:\ 0000000000000000000000000000000000000000000000000000000000000000 139A78E630E49492D3A938D837049346:34579E1E82813F9747A5B132FE4E6964:\ 0000000000000000000000000000000000000000000000000000000000000000 AB6010C72E0A156057F8E14EFEDF98FB:0C7A02F13911D33BEAD1471C708987F3:\ 0000000000000000000000000000000000000000000000000000000000000000 3F0EA3AB608E5CF9814AFC56D7AE1B9D:3631C40610EEA661633CD7B8BEC865E2:\ 0000000000000000000000000000000000000000000000000000000000000000 C62A08EA0795752B072A06F4AEAB3ADB:CCB2F6767F50B6896B9244C09287C9FD:\ 0000000000000000000000000000000000000000000000000000000000000000 B73A62B4C9F994FC383EBD65DD4EA0B1:ADB0391D3F717FECEF62C07B22E31062:\ 0000000000000000000000000000000000000000000000000000000000000000 493270140AEEEA6D72F484B61C9C1825:6ADAF168DEA73E278F0CAC41907F5304:\ 0000000000000000000000000000000000000000000000000000000000000000 5F25EC322C5AD4120F115248EB11FAF0:2B6539726858D7A043EFBAA0E33CD073:\ 0000000000000000000000000000000000000000000000000000000000000000 C05012D7D2B5270433248793AF438843:AD8ADE6BE4C591A243B4CAE06A709DD4:\ 0000000000000000000000000000000000000000000000000000000000000000 B9B9D77A5E156DBCDA162DB3848AD95A:C14B99C00345CB680C482D31F8A0C4D9:\ 0000000000000000000000000000000000000000000000000000000000000000 8FC09B76BE675A5161338F4F73A21D6C:6B547FFB2B57F236A734BACD51BB7F80:\ 0000000000000000000000000000000000000000000000000000000000000000 2859C8B12F4439DCC496C5F2BAD2C99E:84C397A83A9A76CF06818FF1534C45B9:\ 0000000000000000000000000000000000000000000000000000000000000000 29CD3317ECE7A36106AFF008F7044D4C:07939F9C4DB6097191D90A84D9422F98:\ 0000000000000000000000000000000000000000000000000000000000000000 9440D9285BC074FD402117EE963D7A8C:295A81D1FFB0D950B0DF0A61DD96BA84:\ 0000000000000000000000000000000000000000000000000000000000000000 C405DE00BAE96D8C354839CFE1E4DA42:13BA97F2392A05E6A2B33C7C713DA088:\ 0000000000000000000000000000000000000000000000000000000000000000 F5914DCABF0ACC9D1D58D0011A7AA462:6DB4ACAAD7FABC9CD78E87AC9B0091CB:\ 0000000000000000000000000000000000000000000000000000000000000000 80BE9CC8DE81F11996F2EC48A55CA726:FBAA38B36394A2ED5EB7CD24BE8E0E55:\ 0000000000000000000000000000000000000000000000000000000000000000 58C8B08BBE5647F74F80FF7C1405DBA8:FB4C62485E9E63D73AA3032CA4387579:\ 0000000000000000000000000000000000000000000000000000000000000000 7DA7507D0CA379E2D060D4E8486FC8F0:5135EFE72EEDA1CD3FD8BCD504208BE8:\ 0000000000000000000000000000000000000000000000000000000000000000 760489E9ECBCD1B99D5F93659E723355:FF7B0E84D5AA95BF74975347B005E3C6:\ 0000000000000000000000000000000000000000000000000000000000000000 D8F26A78DC801CF94F42781677C28DA1:7D9C197C3F6A57D489D7D860F5E735D9:\ 0000000000000000000000000000000000000000000000000000000000000000 631BBA38307F0F3D46EC6008549DB395:EFF9418718C2B458C7D2F9394080B2AB:\ 0000000000000000000000000000000000000000000000000000000000000000 EB4455AC6D05F6D41907B363FCF19067:26611DB477E3C04BAD35582E9DD1D550:\ 0000000000000000000000000000000000000000000000000000000000000000 B124E0C47CB5AD6BC70E6517C3BCADA3:99BFF5353A3CDBD7CC524D1397CDE280:\ 0000000000000000000000000000000000000000000000000000000000000000 D96D6BE65B50965E1534F10C37B071C4:4520EC9BCB88E0DD255F62B8F58F8CB7:\ 0000000000000000000000000000000000000000000000000000000000000000 E20DA0529B468FD1F6CEA9E1DDA20D98:7D8EADF99C6DC653A896D3D9AC5AD532:\ 0000000000000000000000000000000000000000000000000000000000000000 8FED053284ED49478577BB31C8719DDD:FB895CBFC4FE1B7F30E86B05CDAFE62A:\ 0000000000000000000000000000000000000000000000000000000000000000 5F30CAC7106D2FC0AEC7D0E6CF1C1B0B:555032BB249EC898CA18C5D212254D98:\ 0000000000000000000000000000000000000000000000000000000000000000 95E61BD1C1F5D208B84E2EEA39776A01:3B80F00821708B2473638EB7C234BDA9:\ 0000000000000000000000000000000000000000000000000000000000000000 2E13F661363EB00DF0F05D3A8B67A931:96B667807256288CBC343BBFFC951A6E:\ 0000000000000000000000000000000000000000000000000000000000000000 BE50E7837771DC3782A7B2680AB6EEC8:48A091ED2C8796E030C78F73DEB7B9C3:\ 0000000000000000000000000000000000000000000000000000000000000000 494E7D3074674BDB8959BD8C243AAAC7:CBD446EDF4C4E69A8BF57AD748BBAC18:\ 0000000000000000000000000000000000000000000000000000000000000000 98EFD397394D507346A9E3CCCD94B83D:1941D2C4E959190CB8B5BE59812FBCF5:\ 0000000000000000000000000000000000000000000000000000000000000000 A0E491A1C8B2C0441E896AA2006981FF:0D93B922EF541227948915A40F0EBFC9:\ 0000000000000000000000000000000000000000000000000000000000000000 9906A45DF7FA72CE1D93154FBEF8436F:200042EC80FED60378D724D023DF4490:\ 0000000000000000000000000000000000000000000000000000000000000000 934793FC4BDAE33A5BC62253C4BF21DC:E0BCCFAF07ED0FEC18746AE09A8915DB:\ 0000000000000000000000000000000000000000000000000000000000000000 B2C82F2FC55D78082818996C8B438D64:2CD7B209F7BD58D71753564D647D3716:\ 0000000000000000000000000000000000000000000000000000000000000000 B73CB12EC2527CB24079BC91E7CFCA64:C744C2E0A2FB9B4C07143877CBC8C52A:\ 0000000000000000000000000000000000000000000000000000000000000000 03BD985787971F4CA118007DEFC23B32:30569622169CC58B0D258E8466B5D579:\ 0000000000000000000000000000000000000000000000000000000000000000 0F1B8AB985B4B63BC911AB0B989CC3F6:37326B366FE3CB33DBAC8C8884977144:\ 0000000000000000000000000000000000000000000000000000000000000000 9F641156DAE8774283421494FEC92D6F:8043D5FEA980B3AED3330802B1B7A370:\ 0000000000000000000000000000000000000000000000000000000000000000 2B14272CB87B86674EC6E848090BAD52:6A014D1249FDB4F83C784F2F957B1B9C:\ 0000000000000000000000000000000000000000000000000000000000000000 5174558BDE4E1E82A97A908688C1D932:ABBFCE8176303FDFAEAA8DE9988C6C64:\ 0000000000000000000000000000000000000000000000000000000000000000 0C4576A319A31D84FCA00F13B173FD07:AF6E672701B09598056135C40ACFF4A4:\ 0000000000000000000000000000000000000000000000000000000000000000 2F58921AEDF792D28AC5EF3D89E6E5C3:166F24B5F7ACED72CEB47789FB3420A7:\ 0000000000000000000000000000000000000000000000000000000000000000 18D4EC77C7545EB9BD18B4D6EE706154:8E4B8A41E09E9FAEB483F4AEED16D62F:\ 0000000000000000000000000000000000000000000000000000000000000000 41CCEF6E389ED4819F2A3F0695E05FFD:1FA1311EB223F23085B0548ED3CB8E1F:\ 0000000000000000000000000000000000000000000000000000000000000000 6FCD11D8582065E40E45FFC8C236844F:7DD9DAF766CF5D5FED9E0CD379283311:\ 0000000000000000000000000000000000000000000000000000000000000000 84E954B3E51B616843CC9FCF87F56BAC:FC0504AE07BCB1E1D476EA24129FCAC0:\ 0000000000000000000000000000000000000000000000000000000000000000 C15FE4ABC0C4C3651D73A44BE8363E3F:23A1BE9DF35CBD354FA74DDEDB761EBB:\ 0000000000000000000000000000000000000000000000000000000000000000 3E590CE739E909499AE2BF2F081A8791:A1E3EF13407D27B6DB3FBA999430D93F:\ 0000000000000000000000000000000000000000000000000000000000000000 843817CF22CB788A2E1AFD63B0E800A6:766369A95B5756584277117C7D80D6F0:\ 0000000000000000000000000000000000000000000000000000000000000000 47890D85FC7E1F2F50BBADAE3CDDEA8E:38DF031DFD78DBD121875DBD27A65DE6:\ 0000000000000000000000000000000000000000000000000000000000000000 1E49ECD466A95FFE545985D1CBF83570:D41EE3E2DD807C2664CC551BB4C60716:\ 0000000000000000000000000000000000000000000000000000000000000000 0C24E139962730F8884348FC344BF257:333AFA1CC42D2B65B69E8F84DACED288:\ 0000000000000000000000000000000000000000000000000000000000000000 FBB395C0500A3C19A737A7C055722B22:F22AC1742C3F881CD2E807380C6EE933:\ 0000000000000000000000000000000000000000000000000000000000000000 47DFAAA0F3C33B25D10C2D1681778470:4E4437B28D253FAB30DEF9F81881107F:\ 0000000000000000000000000000000000000000000000000000000000000000 0A308E89BA785C02C4A9A356429175D4:954BC0204437536E81EB2981656018C4:\ 0000000000000000000000000000000000000000000000000000000000000000 9BCD04EE4515CEBE9417C4BA53F70628:350CCB77E4F7582397C8798977551BED:\ 0000000000000000000000000000000000000000000000000000000000000000 116CCAA1796894C546AD402AF21992E2:9B2B8AE3DE719F3B9EED784EE085D6AF:\ 0000000000000000000000000000000000000000000000000000000000000000 D0FA9A490CFF9AA8D310C9EE1214D22E:DE1DFB5E9A4FFFF1E159CA3D2415AB2A:\ 0000000000000000000000000000000000000000000000000000000000000000 04F76480D664744295713B1B9B9A8E6D:21B1E562F5F0742871E15B3CAB25A770:\ 0000000000000000000000000000000000000000000000000000000000000000 DB3C71A92F5C8F9FC303DB11D12264AC:5EBE82662D295D950B489F790A611A76:\ 0000000000000000000000000000000000000000000000000000000000000000 0800C09A9FB780F3E7C28A3FC9EEEC76:CCD61A1A7F4E08AF0033FBB874FAA57E:\ 0000000000000000000000000000000000000000000000000000000000000000 D0AD8BD5019D6C9A8DD4886E0A142C5D:C0348D858C4A12CC7B8BB9854781A463:\ 0000000000000000000000000000000000000000000000000000000000000000 2888E9264256D1002A2EC2BBBA5E9617:9EC2135DC0461CE34B48B8BEB64AE3A4:\ 0000000000000000000000000000000000000000000000000000000000000000 394CBB0EE6765EEB5F63108143D4891A:0C4B799D0E3B5388C9256B7CD822D2DD:\ 0000000000000000000000000000000000000000000000000000000000000000 6BCFAF34034E97142888923020205C88:534518BB353367DBEE27A4ACBFEAC109:\ 0000000000000000000000000000000000000000000000000000000000000000 C30940B1DD0A3753F13279FDAE1D74BC:469E5717F92180BA73682767218EEFF0:\ 0000000000000000000000000000000000000000000000000000000000000000 C5E22C002C00FBA49991B806AA12D7A7:517571B9EC2F2BA2F4E65D399A2A9648:\ 0000000000000000000000000000000000000000000000000000000000000000 C0FB5C0623B6FF6E6B98025FCAEF93AA:277D012742F53FF9E72090ACE0D858A6:\ 0000000000000000000000000000000000000000000000000000000000000000 00FD0D8AEB919F7ACAD97FCEB53B5239:AD23F1C09DAA2E22375E9E46D9C63916:\ 0000000000000000000000000000000000000000000000000000000000000000 A281BBD26A06D1437EBF2D0D2D0E4908:DABA99F79DB7E0CECC494BBA3607D20B:\ 0000000000000000000000000000000000000000000000000000000000000000 8D356DF37371554CE5CA0507A6B7B2FC:12C0D42C2578FEEF42528360919BD833:\ 0000000000000000000000000000000000000000000000000000000000000000 719A3D3C27D8B4B58793E380CDF0EBA3:BBE7E042D9B823A0ABA4A373B1EA149B:\ 0000000000000000000000000000000000000000000000000000000000000000 9050232A0352DA77C36A4EBF8941E0DE:EEAABE37D6C42DB0A54AA4FABC12F872:\ 0000000000000000000000000000000000000000000000000000000000000000 D894906DAB6F24402E0A769F9D6F5AC5:7E650D9CC9220F96BDED18A2ABAC99E8:\ 0000000000000000000000000000000000000000000000000000000000000000 8354BF3240A66515DCB3F5852FDA3352:F867C36D1BAD141D1C6BD6884E9BD5EE:\ 0000000000000000000000000000000000000000000000000000000000000000 AB2EE66300CF3886FF32F94962C5F5AE:55F050D0F8160FBA6211AC804F7F9904:\ 0000000000000000000000000000000000000000000000000000000000000000 36C298362E647713C08B4D6B6EDE4E17:9D3AA6AAA9CB2834CD7BAA389EE6707C:\ 0000000000000000000000000000000000000000000000000000000000000000 75B95E9CA0FEC03FC14717B4239FE737:9BF44624A4EE5AFCDDAE766F8A0CCBE5:\ 0000000000000000000000000000000000000000000000000000000000000000 559EA4F0237D9EEF69264CF1DB7379BE:BFDC04B79E56A3A17096B7D667E29DD9:\ 0000000000000000000000000000000000000000000000000000000000000000 D5A45AA6B981792704726E4D8744CE28:18B9A46D1F9AC610D7FC93DED07B6F43:\ 0000000000000000000000000000000000000000000000000000000000000000 14B025CB6399B38439DFA3E1A0AB2A8C:AE7161320FD6B793C53AE82C486123FE:\ 0000000000000000000000000000000000000000000000000000000000000000 E61F5E00147A9072DD5C7C9C73BCA55E:D6614BC4918BFC57CA977B751CB63981:\ 0000000000000000000000000000000000000000000000000000000000000000 C130A74BCF9E00080C81DAFBD4CB9C27:678779C91FBB09CCE59BFF0A52E664CD:\ 0000000000000000000000000000000000000000000000000000000000000000 7B33791FB384824FA4EACCC77DCA836D:DDB78361ED1E569E7D82DDB3446C6CBA:\ 0000000000000000000000000000000000000000000000000000000000000000 F312A6CE802BAECD8D320F48C230478A:BF376E8A67E0D4A6EACC93D7506CF12E:\ 0000000000000000000000000000000000000000000000000000000000000000 A312F31CDFC678B772F41D85F8960D81:C3278B947706D148D8495DCF7F940459:\ 0000000000000000000000000000000000000000000000000000000000000000 B1E2215B44D517F8F3F4EC804AC7CE4C:3C5CF6F19631D11F1AE26CB8EFE06149:\ 0000000000000000000000000000000000000000000000000000000000000000 2D18844BD670192026E39530CE16BE27:33E79315CD18B83CBEA1E45D823F9AA4:\ 0000000000000000000000000000000000000000000000000000000000000000 8B4DBD837AAFAF3BE297471737B4845D:2A30C8A395394CBDD2A970C4763F01C3:\ 0000000000000000000000000000000000000000000000000000000000000000 AD20F1CFF0C4695F0808B4256C3E933E:2C062B870AAB8223454D85354AE69C6A:\ 0000000000000000000000000000000000000000000000000000000000000000 64B3C2DC52B3FEAC5562AF4F8DA845EE:C3E4C1B7BCE83E68F75758FE33362CF9:\ 0000000000000000000000000000000000000000000000000000000000000000 99807008533A8C8E851015F5719979C6:89265DA4FEA5FEAE14B3C71DBB7625D6:\ 0000000000000000000000000000000000000000000000000000000000000000 94641E459342D3D007E15692F316D9E0:51481C83745ED2A0405172AF9B180E1B:\ 0000000000000000000000000000000000000000000000000000000000000000 89644AE31F62B3B77C6ED9BEE5CDA55E:9D491E8E17E357D992800CD396668E9C:\ 0000000000000000000000000000000000000000000000000000000000000000 74C22A64E12BF46EF00DBB12D2388675:852882DBF18419FABD698794A454F23E:\ 0000000000000000000000000000000000000000000000000000000000000000 2D8AB2CC4F59844D705917C3D1D1B220:30E77D5CCB70CA0ECB2D774890B72119:\ 0000000000000000000000000000000000000000000000000000000000000000 3E3660703809BEE497D36875DFDC4D4A:7EDC11E9418DBB124183BFAFAE82F42F:\ 0000000000000000000000000000000000000000000000000000000000000000 D8E7BCE9B8551C59DC15AF0FEBD75C77:DC497415A0F3BC5538A36EC0EA35D878:\ 0000000000000000000000000000000000000000000000000000000000000000 615AFCBA98D0A5AFA089F4C506E95425:D7CE890C864704A2D90DC7B6E32283E4:\ 0000000000000000000000000000000000000000000000000000000000000000 082A395DEA30823A8AB8CCA4851DB836:DB153480844804582364CE5381E15C37:\ 0000000000000000000000000000000000000000000000000000000000000000 B10B5E124C741A67437730F8B1CA3F82:C7152116908D13A6D22337D7A7D3D795:\ 0000000000000000000000000000000000000000000000000000000000000000 112AD1550207C4583005C72188BF3511:41E79330C57AADFD089D8EC6B3569B4A:\ 0000000000000000000000000000000000000000000000000000000000000000 C1B9A37E9747E23BEF9B5C628E13A739:E9AA948C7329B74389E039168F7B8DCF:\ 0000000000000000000000000000000000000000000000000000000000000000 B2250C2A5CCE8D50C3F193358EF09A48:935D2A954C7EA28B265673279F6B4F61:\ 0000000000000000000000000000000000000000000000000000000000000000 D125977E709F9324027A1CB656B8C1C2:7807796076E0BF2795094C36CF79900F:\ 0000000000000000000000000000000000000000000000000000000000000000 649600BA81A113BC7722E878D5869004:C69C842CB5D42C4026244806E3270A00:\ 0000000000000000000000000000000000000000000000000000000000000000 5718F3B4ED59D02DE5C40E9A826FFF30:9263BE9CA3CB9661695C1CCD1041F2E8:\ 0000000000000000000000000000000000000000000000000000000000000000 AC56479B43617B1C7C804629E36E93F5:C35E27B56BAA1AF03542B3DA703BFEF7:\ 0000000000000000000000000000000000000000000000000000000000000000 20027AB27AB4CCF48F9973CC052E0A35:22AAA7F89676ADAA2923903B2A3DB526:\ 0000000000000000000000000000000000000000000000000000000000000000 C8DD678E5D5E8F67FAA0CB599C7886BD:734448F52EDB9316CAFA7F095C24B0E7:\ 0000000000000000000000000000000000000000000000000000000000000000 93DFF0CC56BDBD950A9BAAD3DFF75B2F:EBD6A3487FEE478BB0EF8EC783E49C43:\ 0000000000000000000000000000000000000000000000000000000000000000 7FEF68F9A691BDDD070DB91DF52798EF:4560A566844F1B2F92B35D762F7A2A82:\ 0000000000000000000000000000000000000000000000000000000000000000 86A06EBDB131546D77A4B81C3BED598E:37B9296307EA211F5D6E249E9753392D:\ 0000000000000000000000000000000000000000000000000000000000000000 5C467E141ECCF1B65B6DD86418F35CFD:409732CE286383F332C492E110F136DE:\ 0000000000000000000000000000000000000000000000000000000000000000 35E9FAAFD45C1470EF2BE841B7CE9187:1BDB66804D80D832ABD97BDF145B316E:\ 0000000000000000000000000000000000000000000000000000000000000000 72E77AA37ED81CB273582D24FAC4F797:19EFE53BFE7FAA6BFEFEBD4F79885F0E:\ 0000000000000000000000000000000000000000000000000000000000000000 73A8FAD5559EE727CF006CEB0EC60D3D:81E197EF8F5B2AD7F0312B705AFB5F27:\ 0000000000000000000000000000000000000000000000000000000000000000 81B566F5EA6961C9241486A6E526E8A1:213F181798188378DD97935F019AE7C0:\ 0000000000000000000000000000000000000000000000000000000000000000 0DA282CB8796A24A161FC55ACFCAEC1F:72BF6ABC3AD01D3B7F5589BAC18499E1:\ 0000000000000000000000000000000000000000000000000000000000000000 172482CA04A7549BAA12E55B0A2619FA:B40732603C7E9C2D373E12F9516E0426:\ 0000000000000000000000000000000000000000000000000000000000000000 0E89B76BB98DF1ABA754504C08106755:1F38D616E20D3F0C4158517B162ED983:\ 0000000000000000000000000000000000000000000000000000000000000000 44FBD8823D9D06573CC304CCE5AEE6FD:A4576BC2CA8B8764B30D2DEDF461E455:\ 0000000000000000000000000000000000000000000000000000000000000000 E6C9D81608C6B4B736913749E0E06FB0:83756C36B9664E2415D54835CFAA2540:\ 0000000000000000000000000000000000000000000000000000000000000000 B03DEF269B39D69E0EB67B873CF2B80C:B226452F5E395B90E46E5CA8F72916DB:\ 0000000000000000000000000000000000000000000000000000000000000000 144976F7A2170E86A68359F49C9BF7EF:2183068E0B42CF774DFF0280857F23E2:\ 0000000000000000000000000000000000000000000000000000000000000000 F86F15E91A74FCD149AC3B27229949D0:A88E509487D41897D882F8A1160F3465:\ 0000000000000000000000000000000000000000000000000000000000000000 65B8EBE1995C281D80E471F6B447C050:84EED5FC045BB4817057902699B81109:\ 0000000000000000000000000000000000000000000000000000000000000000 116AE65A8B432F02F95BF339DE5F1427:4FB98E68E52EDE677698126BFA06BA6F:\ 0000000000000000000000000000000000000000000000000000000000000000 7EDA6705CD1ED178F051188479BFEC21:66840CCF17A78DB4748D811B436D0041:\ 0000000000000000000000000000000000000000000000000000000000000000 B3B2780D00D441B0641BF54660BC7624:6C24B364096089E615A8A657FEACF53E:\ 0000000000000000000000000000000000000000000000000000000000000000 AEFCBE20965D096F631D7844F69D7D8B:0BB3B124E75FE222CBEFB2EB1BA84C57:\ 0000000000000000000000000000000000000000000000000000000000000000 94C8C0B27E7FA6B0C66EF69529280A10:7B0C86F6968BE22B3CF6740FA4E7683C:\ 0000000000000000000000000000000000000000000000000000000000000000 866CD3970543E3224E756F301705081F:A0400EDBE1D6D08CA45419D39DF4E4BB:\ 0000000000000000000000000000000000000000000000000000000000000000 AADB86BD88CD0B572DE6225896E694DA:AD4B42F7356A196EB29EAF62AAAC2DE4:\ 0000000000000000000000000000000000000000000000000000000000000000 AD22711443BCBDF0DFB1AB96F3217F98:6B39765526E0D0F8E55606559193D760:\ 0000000000000000000000000000000000000000000000000000000000000000 2C63EF91C5BA79AE9ACB9CCC9D0CBDD5:368BFC2EE7870480A53B887E0E0273D3:\ 0000000000000000000000000000000000000000000000000000000000000000 7952E98E82ADAE82305291AF31D82B78:481F3714C9112E522CAB717B00795542:\ 0000000000000000000000000000000000000000000000000000000000000000 E0B61686A1648FC82AC0767A30E969BF:CA681F90975354B326F88DA6EE6CBC4A:\ 0000000000000000000000000000000000000000000000000000000000000000 2AF247328D18F510A4FCB1784979209D:C185B82815B15FD96A75FD0309567D09:\ 0000000000000000000000000000000000000000000000000000000000000000 5D2064436576514B4C27365268C6B9BF:267AAC3880B12273AF2B5976AC51C157:\ 0000000000000000000000000000000000000000000000000000000000000000 3D04280E15EB800B1ABD005ECC9A8B3F:EBE2628954016D7428DB4477A0641B49:\ 0000000000000000000000000000000000000000000000000000000000000000 A55B35CF84CBDB510C38F24C6BF93B90:9641A161F9D60D76EF05888FD1E2A280:\ 0000000000000000000000000000000000000000000000000000000000000000 F14320EEA11F6FC7336ADEEAB8E85B9B:7F42B86B1C943E7EB89FD91B439EEC9C:\ 0000000000000000000000000000000000000000000000000000000000000000 81D4388A3B919D54311B3327A4643265:70DFE1A70E74F1A2974C81F073542863:\ 0000000000000000000000000000000000000000000000000000000000000000 D1469D78D3F38BEC7EE57CEAC7F5393D:5DECB5541E8FB7C65CA8DBCB9A25D6CD:\ 0000000000000000000000000000000000000000000000000000000000000000 0028367D36C6989C053BD51781644393:28967FC1396040FB4A989A6A19A67930:\ 0000000000000000000000000000000000000000000000000000000000000000 0DF379E3ED7A514D09CA440CD91A7A4B:B2405BFE9F872B5DBD87D520CAEF49EC:\ 0000000000000000000000000000000000000000000000000000000000000000 2E47CF7B14D03C6D89D950DE7EAD69A4:A6A1AE40FB2DBD1ACB43E9C027E877AC:\ 0000000000000000000000000000000000000000000000000000000000000000 BD6F5ABA7C56CD8F7F94D9FD482FAF4B:1ED91FFAF9975638253641D2826A91B1:\ 0000000000000000000000000000000000000000000000000000000000000000 BA634341B5A5D226000C04A5189AB13E:F5644F442E6D6B52BAFB7FCF020C5E11:\ 0000000000000000000000000000000000000000000000000000000000000000 6E2AC15AFCA7504C209BFC8F9CCA2A2F:73B228B2BFE0B01A24AFE361309E84DA:\ 0000000000000000000000000000000000000000000000000000000000000000 CE347B81F4984EEBC8C3EC7CBC5DCC18:5ECCDE0E778C02545B16916E67CC5E15:\ 0000000000000000000000000000000000000000000000000000000000000000 DCFFF804405504B5EFE75BF9D23480DE:66C04EC78FAFA8462E94A4A4F69D4D7A:\ 0000000000000000000000000000000000000000000000000000000000000000 221352648EBA537DB994F93EA3527CC8:74E0DB0F5A47224A1437B7C519441C08:\ 0000000000000000000000000000000000000000000000000000000000000000 C8458FEC89AF924CF81396E641D7DDBD:5C3BD04D99635363DAF7D281230FD600:\ 0000000000000000000000000000000000000000000000000000000000000000 F47E1F7EF00B42F8F5A1219C42E0CC0A:6DDE19D02A217B2A5DD41A1454DC677D:\ 0000000000000000000000000000000000000000000000000000000000000000 24CDF34C5EA6B37CED3B33178FD54C88:95DDDD7E4CD12EF44FA5CCAF6E093130:\ 0000000000000000000000000000000000000000000000000000000000000000 AC8023453190010FADA88C6E71174FCB:F123615073CFC4C5DA553F7758CE0937:\ 0000000000000000000000000000000000000000000000000000000000000000 023AE5AF03FD68B6432D84C218DFE0A7:4B8D617C5728EB7AA6B2D23960F235F0:\ 0000000000000000000000000000000000000000000000000000000000000000 CAA35C45DF45601E5935C92B4F5F164F:7155D0E792B5279AD6057C48BC2CAA0D:\ 0000000000000000000000000000000000000000000000000000000000000000 ED72D82596C24FCE85E066377C6F23C8:2343F7BD3ADC05B7F575DBFF8B490EAD:\ 0000000000000000000000000000000000000000000000000000000000000000 818834EA9DD46525CED342FD8CDF03D6:F0AA5253E8871BFF04BCAAA9FD2DA3FC:\ 0000000000000000000000000000000000000000000000000000000000000000 AE528D030A08F5697611F769864C7863:C40D67EB5D395B65F578B01F7FDD4D36:\ 0000000000000000000000000000000000000000000000000000000000000000 979BE56166651E23CD3156624B51C118:4D3FADFAEF95C81DB449741D830669FB:\ 0000000000000000000000000000000000000000000000000000000000000000 23F2C6298D46CB7B66305B3272F14775:B21F5D9F8CFC630C0C9184B34335C19D:\ 0000000000000000000000000000000000000000000000000000000000000000 4C5E6E7EF12BFF242402CC42962DE420:0764165513CE56DE4BC8FB238CEFCF15:\ 0000000000000000000000000000000000000000000000000000000000000000 93FB53BF2128A23468870BB679B6CD46:6FEA32419061B0C70A1A098B34F6B008:\ 0000000000000000000000000000000000000000000000000000000000000000 A5EB2A49B07960CCEA5C632640A4B8D3:148ACECDF96815DE338312D7E505FBA7:\ 0000000000000000000000000000000000000000000000000000000000000000 7CE5CA2B71BAD18D4722127C9B28CA20:65EAE71CF60B516EF15EB3C22958272C:\ 0000000000000000000000000000000000000000000000000000000000000000 6B3BD3BE30DEE6B7987FDA806C5C3805:9C9402BE33FE1EB856AB211CB6F92C3D:\ 0000000000000000000000000000000000000000000000000000000000000000 FA36C8904B20DA558430AC1743B31515:90E562EFC0D04545190DD0142AC39A05:\ 0000000000000000000000000000000000000000000000000000000000000000 6D159ABD062B35E8CE7F08F44F289040:3753E162B8361AACD59B20228221D6CA:\ 0000000000000000000000000000000000000000000000000000000000000000 F5099C6661352E4093618DCBE1CA977A:FDBE9F07CE5C2E99768DCBAD0B02E321:\ 0000000000000000000000000000000000000000000000000000000000000000 688A780BF7A5290BCAAC1B6132878C53:0629155B1D44909B4CD2A8B30E0E0907:\ 0000000000000000000000000000000000000000000000000000000000000000 6021C98BB2665524A443D89A40DE9D06:58039733F59046C469323C29B77C3750:\ 0000000000000000000000000000000000000000000000000000000000000000 FBF76BDF9E6245840CA6BBA70055F563:94551B253A232BEAFDDEBFA5871CFFAD:\ 0000000000000000000000000000000000000000000000000000000000000000 A72FDD6F664169F03CC0CC554AF2B68A:0E01B11F9313E0745A5A6C93F65536F9:\ 0000000000000000000000000000000000000000000000000000000000000000 65550E0E11ECE8C52F56D79B8779B631:060F7B1952C3A20740FC3AB3523A26B5:\ 0000000000000000000000000000000000000000000000000000000000000000 F6C89D40E53B72F349433B135193A2D2:549DD728A520D70C5BAE2F13728D1334:\ 0000000000000000000000000000000000000000000000000000000000000000 04F2E6F467102D0C7514ECFF1B74E61A:B9DE638D64DEEB61AEF4C787E9DD35F1:\ 0000000000000000000000000000000000000000000000000000000000000000 F4030612C03BB7E12CF52DE9368C2BF9:5F9276C06B5B4845634E53D97ED262AE:\ 0000000000000000000000000000000000000000000000000000000000000000 A28AD08C3334E4FB4D4968ACCB7F3F5F:82B8B3E572875119B1D125A2E0B6242C:\ 0000000000000000000000000000000000000000000000000000000000000000 B2DA025E287DF1D344E2C76AAD0C2C03:A25398F55C33DE587851C88C96DE321D:\ 0000000000000000000000000000000000000000000000000000000000000000 496548B236963ED35F68F21ECF7DFAEA:209F82198BE7609F3C0E1B3291C306FC:\ 0000000000000000000000000000000000000000000000000000000000000000 D8017AD727DBB03A67BC9B6CEC08F82D:75940C2A866B99049E89E6D2FF00902E:\ 0000000000000000000000000000000000000000000000000000000000000000 6F961163C00C533DBF195BEE8714DE60:6A04C14D65DF615BC9D3817EE4FAB278:\ 0000000000000000000000000000000000000000000000000000000000000000 1393EEFECAC81F9F0684A141B37ACD79:03755C3939CCB1A295328C0116FBC40E:\ 0000000000000000000000000000000000000000000000000000000000000000 2D6F0FC6BF2DBB83EA5180D2B5F2D8ED:F965911478AD9B623B760844CC03327A:\ 0000000000000000000000000000000000000000000000000000000000000000 9033C3DE5FA49AFCC52A79E67F4D0736:5831046301BDA86CB50346CA1B66C4FB:\ 0000000000000000000000000000000000000000000000000000000000000000 D8B7C49D31802C02FD1CAE4401FD2D2B:08F7884E9885E1038B0C61F473EF70F8:\ 0000000000000000000000000000000000000000000000000000000000000000 BA9678585636444430D8270E4D503540:421D1E481CAA8A08BBA48665CDCEC377:\ 0000000000000000000000000000000000000000000000000000000000000000 9B61323D57ED9FFFE1918BD9CE8EA33C:79169AE974BAC0F7D922165BDC2CF445:\ 0000000000000000000000000000000000000000000000000000000000000000 4CCBB469A1750A879B8A74FFB3FF8C61:4E839686B96659ABB8C5AB567941F7DC:\ 0000000000000000000000000000000000000000000000000000000000000000 D8F243A37C08D3BFBBEFE8F91E84323F:9A0367F4E414FB939A86047DC4A8EF1B:\ 0000000000000000000000000000000000000000000000000000000000000000 D3821E4D2C499F3426B9FCEFFA09356F:9B15BCD64E0A5B52A1B9C63A01A4650D:\ 0000000000000000000000000000000000000000000000000000000000000000 E67235D373FA498DE6F8AFE84B53D286:5FDA78B9580BE5587B564AF685F12A7D:\ 0000000000000000000000000000000000000000000000000000000000000000 F1FD811B4F6641BC14A703F8CA365DEB:660CF835E5D77B420EEF4EDD7FE3245C:\ 0000000000000000000000000000000000000000000000000000000000000000 2B16C60FCAD353CE3CD64AC3FF889DAE:F78B14B08F30907961FF6B80F4C4F871:\ 0000000000000000000000000000000000000000000000000000000000000000 EB7FFD1623A99B9583875FE819004E0E:B454B72CB6B929CBDF3925451B6C37FE:\ 0000000000000000000000000000000000000000000000000000000000000000 09E42C31C09D7AE29EE67127085A6806:46305BA66724716ADBFBA60604CFDECB:\ 0000000000000000000000000000000000000000000000000000000000000000 8A142724C41589A979AFFF93F7EFE596:AB8A4242F1E08F1254A106B65FF3AE81:\ 0000000000000000000000000000000000000000000000000000000000000000 87EBEEF10ABAC49D72376311C2A81533:033DD315A1E522BDADE84670B02F1BC5:\ 0000000000000000000000000000000000000000000000000000000000000000 B3BC2E9BB2511849EF7BDDA3C2CA6B89:0EDB4BC9961DD9D41AA7A25321ED0202:\ 0000000000000000000000000000000000000000000000000000000000000000 A5E7D15571A0B04F499476A994B87C70:D8353E8A311FCAB4E34682DB5F2B7B00:\ 0000000000000000000000000000000000000000000000000000000000000000 5DD35FEBA1E40E6DADE71DD3ED785464:58C5EBF33628DD343C822D91D21A4885:\ 0000000000000000000000000000000000000000000000000000000000000000 469EA4FAC76E88BCCBC2922E4076019C:A6910C818181CF1F4E69896E7FE0F4AB:\ 0000000000000000000000000000000000000000000000000000000000000000 5E4B9F5DC0FE8BAD9799C29F50AD5DF0:9555BA538C915517B8B8648B21E1295B:\ 0000000000000000000000000000000000000000000000000000000000000000 A8521AA3053C780A138D5D4552EEF9B9:58D09302FC7AEB722D0A16BD13406759:\ 0000000000000000000000000000000000000000000000000000000000000000 E195D5EE9732CA9E20DE5DCD3DEBC856:60D314160FC2081AC73F48B62AA7C22D:\ 0000000000000000000000000000000000000000000000000000000000000000 FACEDE9FF4706209912726B7EEB2D0A9:3D2284BCDDD3A0EB80812AF638843F43:\ 0000000000000000000000000000000000000000000000000000000000000000 B444E404978F7F30AA486040F7843250:9ABAC5E96FB6F7D306AF9CF2E37E28CB:\ 0000000000000000000000000000000000000000000000000000000000000000 9B54CB9AC90D968812FD1355B2779236:B444FBE174380450EE93D9BD6C2151C3:\ 0000000000000000000000000000000000000000000000000000000000000000 C29668C0A3FF22B1388281FE5A841DB8:4A3F6E376DDEA1791F84D4617CDE9B7C:\ 0000000000000000000000000000000000000000000000000000000000000000 75AAFCB786C5A0702C133649B9B73F7C:CBD89BE37B0BA65E3867D8CA0F77C30C:\ 0000000000000000000000000000000000000000000000000000000000000000 39C63789EF88E20ACF403262C42A89A7:FAAD0835AEA037ACC207FFCD2A10CD5F:\ 0000000000000000000000000000000000000000000000000000000000000000 71583BA1CFABFFBFA412BE228322B297:DAF18FE82A072EC5B9239AEB8E6E52CB:\ 0000000000000000000000000000000000000000000000000000000000000000 D00297579A4B01649C237A176B86697F:212E6D57C1A46A790E082594D29A2F31:\ 0000000000000000000000000000000000000000000000000000000000000000 49D694199247A4290B8A1649D5C82F40:955995D2521F4D100E95E76ABE8BF7CB:\ 0000000000000000000000000000000000000000000000000000000000000000 3C88595603173ED5762ABB970D019B13:DAA5CACD2E1BF1AA1DE9C1BDD1132C2E:\ 0000000000000000000000000000000000000000000000000000000000000000 83AB295E4F15A8D5F65A723E0CE2D01F:69FA28D662336E4446F4E315C59B1262:\ 0000000000000000000000000000000000000000000000000000000000000000 D8A9F3A761B1E45E384FCD205D5A8C61:35529731D5CC912C41153E7E626C8A11:\ 0000000000000000000000000000000000000000000000000000000000000000 1D54C56927178C14DA355CFB9ACCFB67:49826A29C640F65371619E940DA451F4:\ 0000000000000000000000000000000000000000000000000000000000000000 7D9574BDF07BC0A251B88A2B24F0DB68:9651120F3D1AD09EF61607002A040D92:\ 0000000000000000000000000000000000000000000000000000000000000000 75A94C5692A877903A4D43AA1071463F:2676F7CE1D8B91AB29A83970D5EF3698:\ 0000000000000000000000000000000000000000000000000000000000000000 A04C41ADFA612D80843B0569833A9AF8:1282CE00BDE016E61ED8000EBD42F414:\ 0000000000000000000000000000000000000000000000000000000000000000 4D159F9CC6B4AA58F7FC2F905F5CB875:A5FD714739BB899FF577C6B3E19689EE:\ 0000000000000000000000000000000000000000000000000000000000000000 0B1840E8B119B7C94A045459B61B28F6:5E5213FF0E467653C61A21EBD5EBF6B5:\ 0000000000000000000000000000000000000000000000000000000000000000 8E4CCFE43811ABED23A41C33FD5F095B:E92DACB852960B91B9EE58153A102948:\ 0000000000000000000000000000000000000000000000000000000000000000 C9956C304D2BF87CA8564C3762CD762A:860D752AC16CEC79F1DF5C6A3A44E9A5:\ 0000000000000000000000000000000000000000000000000000000000000000 F4760FA1F8A17216BB95396057F8FB95:6D8EF0B071CE8966AAEAF8C3C5AFD26F:\ 0000000000000000000000000000000000000000000000000000000000000000 7CB6538603BDA43BF71C12AB1241A862:7E3B14847526572F0D55A284D626B560:\ 0000000000000000000000000000000000000000000000000000000000000000 E945D4AA05A23561AF42466E1668A734:7E3B14847526572FF2AA5D7B29D94A9F:\ 0000000000000000000000000000000000000000000000000000000000000000 5FA0B49C4A1C2452B33C433383354B3E:7E3B14848AD9A8D0F2AA5D7B29D94A9F:\ 0000000000000000000000000000000000000000000000000000000000000000 5CDC56C16559E0AB736D6A9AC72629C1:81C4EB7B7526572F0D55A284D626B560:\ 0000000000000000000000000000000000000000000000000000000000000000 4EC8D3AE8C51C84F4B65B82340364E4B:81C4EB7B8AD9A8D0F2AA5D7B29D94A9F:\ 0000000000000000000000000000000000000000000000000000000000000000 F97F70581ECEB3E6F3F3D37BE9EE6A37:81C4EB7B7526572F0D55A28429D94A9F:\ 0000000000000000000000000000000000000000000000000000000000000000 EECD2D9DCB49A297C458C948CAE0A513:81C4EB7B8AD9A8D00D55A284D626B560:\ 0000000000000000000000000000000000000000000000000000000000000000 1887BB24F5B28366010E7E0F132F936F:7E3B14848AD9A8D00D55A28429D94A9F:\ 0000000000000000000000000000000000000000000000000000000000000000 EAD576FA649DE315401ECA6471B2C34A:7E3B14848AD9A8D0F2AA5D7BD626B560:\ 0000000000000000000000000000000000000000000000000000000000000000 540D1BA22F928A84C67EF5214F8BB88F:81C4EB7B7526572FF2AA5D7BD626B560:\ 0000000000000000000000000000000000000000000000000000000000000000 74D9CF212295D3670A92269E8D40939F:81C4EB7B7526572FF2AA5D7B29D94A9F:\ 0000000000000000000000000000000000000000000000000000000000000000 6BEBBCF4AD01F7E3105D0888A0AD9E3E:81C4EB7B8AD9A8D00D55A28429D94A9F:\ 0000000000000000000000000000000000000000000000000000000000000000 B4FF03EDC70BB97FAE21F21C3A459B28:7E3B14847526572F0D55A28429D94A9F:\ 0000000000000000000000000000000000000000000000000000000000000000 93F87FBE4DD4206528BF83352452D58D:7E3B14848AD9A8D00D55A284D626B560:\ 0000000000000000000000000000000000000000000000000000000000000000 D261D6041824D259290EABD3E9132DB8:7E3B14847526572FF2AA5D7BD626B560:\ 0000000000000000000000000000000000000000000000000000000000000000 92074732D84E1841A013A0034C52BF50:81C4EB7B8AD9A8D0F2AA5D7BD626B560:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:DDD26B98A5FFD82C05345A9DADBFAF49:\ 00000000000000000000000000000080 00000000000000000000000000000000:FA735E9BE7961050C202BD794E2E1E0C:\ 00000000000000000000000000000040 00000000000000000000000000000000:7B2D8D2348DC4CE112AEF4311BE769D7:\ 00000000000000000000000000000020 00000000000000000000000000000000:5F35BF3061423D0BC02C07BED67602BD:\ 00000000000000000000000000000010 00000000000000000000000000000000:8C9A19CEBB5709C38EA1AE1D12E291C1:\ 00000000000000000000000000000008 00000000000000000000000000000000:D69C8CCF5DEC9EFA90684C7B70FCDFAF:\ 00000000000000000000000000000004 00000000000000000000000000000000:39B65E77A4D26218E5ED7092AB64D07E:\ 00000000000000000000000000000002 00000000000000000000000000000000:F668C7091F81B2827DA77DD419B708E1:\ 00000000000000000000000000000001 00000000000000000000000000000000:7106BED662E6B6AE72FDC726C98AD746:\ 00000000000000000000000000008000 00000000000000000000000000000000:043AA312B19B6737C3CEBAF830DB6DB8:\ 00000000000000000000000000004000 00000000000000000000000000000000:F95E6F00854F17DBB68CC679570D5FD5:\ 00000000000000000000000000002000 00000000000000000000000000000000:D23FAE81FF497000583F2CFCE54FCE9C:\ 00000000000000000000000000001000 00000000000000000000000000000000:EF5C7DC4DBCE5A51F98011969693DBE8:\ 00000000000000000000000000000800 00000000000000000000000000000000:34D2F0546C260EA4002B4BCC2C12CCAB:\ 00000000000000000000000000000400 00000000000000000000000000000000:B3787BE95735A9581817C64D81F07E13:\ 00000000000000000000000000000200 00000000000000000000000000000000:EB31DC31E4016F7FD8901C5872DCED1A:\ 00000000000000000000000000000100 00000000000000000000000000000000:43D607D9D0009C01DBFB117126BC4395:\ 00000000000000000000000000800000 00000000000000000000000000000000:463B27CF0DA63219ED2CEBDBF5C16922:\ 00000000000000000000000000400000 00000000000000000000000000000000:90DF345556AB04CB12D0799B9C5049BB:\ 00000000000000000000000000200000 00000000000000000000000000000000:05C861F7F71591C8AECF8A26EB020F4D:\ 00000000000000000000000000100000 00000000000000000000000000000000:11DD97B8ADAF7F6B34EB3BBB9A438892:\ 00000000000000000000000000080000 00000000000000000000000000000000:7171E845509F8F4F134BE53EFD8A34DC:\ 00000000000000000000000000040000 00000000000000000000000000000000:864E7B400A96420A98765AF993AAD852:\ 00000000000000000000000000020000 00000000000000000000000000000000:B8F75A0553AA33DC30B3F2D0027F97EA:\ 00000000000000000000000000010000 00000000000000000000000000000000:573FB9B1E047670331D54E87F3BDD48D:\ 00000000000000000000000080000000 00000000000000000000000000000000:03CF30E2ED5C9311F6BF9964C8A7DBB8:\ 00000000000000000000000040000000 00000000000000000000000000000000:ED735C651F003ABCAFE1926472E0CC32:\ 00000000000000000000000020000000 00000000000000000000000000000000:970CDDD5BCCAE7F7BD0F7B67B6707580:\ 00000000000000000000000010000000 00000000000000000000000000000000:6D1C5788F69DC2E1EF928D9C831F3826:\ 00000000000000000000000008000000 00000000000000000000000000000000:8367C4564B707B6C0A4A92ECA38C6EDA:\ 00000000000000000000000004000000 00000000000000000000000000000000:F25D50BBA7FD6496CD70ACE570706ECC:\ 00000000000000000000000002000000 00000000000000000000000000000000:0C43854DF7DD96DC3323DCC311CD418C:\ 00000000000000000000000001000000 00000000000000000000000000000000:8F8827ED63EAFC702A4C7F855E6806A0:\ 00000000000000000000008000000000 00000000000000000000000000000000:DD4FF8498D45936888B48EEFD24CE9F6:\ 00000000000000000000004000000000 00000000000000000000000000000000:DE8BF1BCB7C106D93AA60C744240651F:\ 00000000000000000000002000000000 00000000000000000000000000000000:FC45CB6A1B9267A8B330FC1399BC0F34:\ 00000000000000000000001000000000 00000000000000000000000000000000:9EEC294CEBAEFC664DFA9D1C8B48B0B2:\ 00000000000000000000000800000000 00000000000000000000000000000000:CAFB5B1D66E147006DB2E4CFC8405DA3:\ 00000000000000000000000400000000 00000000000000000000000000000000:B9F43C559CCB8C1933FD323ED51AF997:\ 00000000000000000000000200000000 00000000000000000000000000000000:D11D4485EB7AAA6CB1A8F16E24ECDE7A:\ 00000000000000000000000100000000 00000000000000000000000000000000:A4F7B40448470061B7873A62072CE112:\ 00000000000000000000800000000000 00000000000000000000000000000000:80DF5AD31BF557F9C75701B1395C4AD2:\ 00000000000000000000400000000000 00000000000000000000000000000000:46CE4708ABA4835764EA9C4678335954:\ 00000000000000000000200000000000 00000000000000000000000000000000:72BABC19EE59F6F76F17DDFBE2FCC33A:\ 00000000000000000000100000000000 00000000000000000000000000000000:E76340173FDA4B6F1E2703A732C4C482:\ 00000000000000000000080000000000 00000000000000000000000000000000:79C577AC301DE5ED03AD6D0AACB1D958:\ 00000000000000000000040000000000 00000000000000000000000000000000:A2A8D78F3511B65EA03262314F0C8F8A:\ 00000000000000000000020000000000 00000000000000000000000000000000:6C87E4E87CB3773520F7B3EDB51DAEAF:\ 00000000000000000000010000000000 00000000000000000000000000000000:8D646E78DC20F616A859074DE82D1107:\ 00000000000000000080000000000000 00000000000000000000000000000000:E98DE4AAAC62C1E4251054B42D92F4C3:\ 00000000000000000040000000000000 00000000000000000000000000000000:B0FC458F4759641C6FA64FED926C8347:\ 00000000000000000020000000000000 00000000000000000000000000000000:61F381FA99E58E9B3CEBCBADDE6559D2:\ 00000000000000000010000000000000 00000000000000000000000000000000:2C7EAF752E2B02734A3C3506CDA4867D:\ 00000000000000000008000000000000 00000000000000000000000000000000:600F284E1AB1C8194D6FE065DBDF1BBF:\ 00000000000000000004000000000000 00000000000000000000000000000000:DB84C4BA65B89D0CD51BE73605084568:\ 00000000000000000002000000000000 00000000000000000000000000000000:4C75C41A4ABC17E0ADC00228394F0037:\ 00000000000000000001000000000000 00000000000000000000000000000000:230375EE7B65A2C948809B6DE69D1F50:\ 00000000000000008000000000000000 00000000000000000000000000000000:94EF7F345D1FF0DB4494D9DB56ADFFED:\ 00000000000000004000000000000000 00000000000000000000000000000000:CE277A5063C40BA1418A30721A0DE8AF:\ 00000000000000002000000000000000 00000000000000000000000000000000:BF4FE13163EA85E003EF8E9D4BAF48C8:\ 00000000000000001000000000000000 00000000000000000000000000000000:C8F9F9F1DB54EB0635C227CAE447055C:\ 00000000000000000800000000000000 00000000000000000000000000000000:6F31A90BCEEA0BC85843086C7258EA9E:\ 00000000000000000400000000000000 00000000000000000000000000000000:334EFC7C6930BC0B839C845E1B22F8C3:\ 00000000000000000200000000000000 00000000000000000000000000000000:1E92F9F2E576C864A24F36402F84107D:\ 00000000000000000100000000000000 00000000000000000000000000000000:A5B8DF0ABDBA5DA09B8D8383F06957E2:\ 00000000000000800000000000000000 00000000000000000000000000000000:344B6F348ADA08FF4E97C722463DCB08:\ 00000000000000400000000000000000 00000000000000000000000000000000:AAB52A0482E0A1B84EF07213F8BCF63F:\ 00000000000000200000000000000000 00000000000000000000000000000000:E477DDE4A88A17339157E4198DC39801:\ 00000000000000100000000000000000 00000000000000000000000000000000:33401CDFBECCF499B3226B4C6AD8FDDF:\ 00000000000000080000000000000000 00000000000000000000000000000000:2C06278683B5759C12B147DE2B0E0BB1:\ 00000000000000040000000000000000 00000000000000000000000000000000:B2B67CDC8371B5739F5E213FDD8B60EC:\ 00000000000000020000000000000000 00000000000000000000000000000000:83ACED5FB21035A41B858136D4797BEE:\ 00000000000000010000000000000000 00000000000000000000000000000000:1F6213DC933AEF4C582AAD041E140619:\ 00000000000080000000000000000000 00000000000000000000000000000000:32B7E10E04100FCDA94DC223BBC19075:\ 00000000000040000000000000000000 00000000000000000000000000000000:72FA9C8731E45CF575CFFEBD6F3981C5:\ 00000000000020000000000000000000 00000000000000000000000000000000:AEE9355B2FBD96A06F8F74DC8882E893:\ 00000000000010000000000000000000 00000000000000000000000000000000:B56126C52D0DD2B8FDC5C4A05091F2B1:\ 00000000000008000000000000000000 00000000000000000000000000000000:6FF5B6F133BEB75DDDD0385F9B3AEEE5:\ 00000000000004000000000000000000 00000000000000000000000000000000:6541C5BCE4B3F93F4EC1E7DFED0F98DB:\ 00000000000002000000000000000000 00000000000000000000000000000000:BF9ED60D8A243F1E010345537A5C081D:\ 00000000000001000000000000000000 00000000000000000000000000000000:77679D9E63DB7DF79C0484423FA18A57:\ 00000000008000000000000000000000 00000000000000000000000000000000:548091B07326BF829BA56C786053727F:\ 00000000004000000000000000000000 00000000000000000000000000000000:A8FA704EE06EEED6F7F71A598EF921FB:\ 00000000002000000000000000000000 00000000000000000000000000000000:627F14CA091AC156FB56302D6C3373DC:\ 00000000001000000000000000000000 00000000000000000000000000000000:BC2CAB97EB09919CBC0E6AFEC6581CF5:\ 00000000000800000000000000000000 00000000000000000000000000000000:CC7F5DF0CF522B2242163112E4421D08:\ 00000000000400000000000000000000 00000000000000000000000000000000:084AC3BF07F1E64F0093A014C2690CE5:\ 00000000000200000000000000000000 00000000000000000000000000000000:D3C6597474B740BA1053090A247AB5C5:\ 00000000000100000000000000000000 00000000000000000000000000000000:7435911B23F1DBACA5BF86C91B0D11B1:\ 00000000800000000000000000000000 00000000000000000000000000000000:79E59CE5B78A6D8259B2AD1B5F50F523:\ 00000000400000000000000000000000 00000000000000000000000000000000:72F3659183D9749128AE6CAFBEAADDE5:\ 00000000200000000000000000000000 00000000000000000000000000000000:77DD6EA2D669A36E4C409564A8604EC4:\ 00000000100000000000000000000000 00000000000000000000000000000000:27D4EC7E2AE30CBE54B7CE9F764E3D27:\ 00000000080000000000000000000000 00000000000000000000000000000000:0D68C4922498D08BFEFA450B85659D23:\ 00000000040000000000000000000000 00000000000000000000000000000000:6C4FCEEFF2768549EA590FC20310B95D:\ 00000000020000000000000000000000 00000000000000000000000000000000:FC46909BE47E944F4776956A98E9C43B:\ 00000000010000000000000000000000 00000000000000000000000000000000:50AA945A945A8BE43E4C137F0D7CA62A:\ 00000080000000000000000000000000 00000000000000000000000000000000:7511818C4C8408EB0AF22019DDF7F6F6:\ 00000040000000000000000000000000 00000000000000000000000000000000:D46BA09B00007974C24FC8C0CB13330D:\ 00000020000000000000000000000000 00000000000000000000000000000000:17E352C6C963F7DA5A1CB163ACCB8573:\ 00000010000000000000000000000000 00000000000000000000000000000000:6CED1C994D0F7B2862715D514840A780:\ 00000008000000000000000000000000 00000000000000000000000000000000:AD351E157AFC89A9C0D8CF15DDBF3A7D:\ 00000004000000000000000000000000 00000000000000000000000000000000:79AFB080BADC325DA8C5E88200743603:\ 00000002000000000000000000000000 00000000000000000000000000000000:D326FEA25FE2CA220CEC62DB9574AAFD:\ 00000001000000000000000000000000 00000000000000000000000000000000:A3C980B5DA0B8E3B32818AF08F5310DA:\ 00008000000000000000000000000000 00000000000000000000000000000000:12651FD76182C532CD03B36DD121A43A:\ 00004000000000000000000000000000 00000000000000000000000000000000:6D91A4600722340B8ECAE1055B8DF790:\ 00002000000000000000000000000000 00000000000000000000000000000000:2B1F49C97807430719A958271B5DA303:\ 00001000000000000000000000000000 00000000000000000000000000000000:9E29DADC12AA1ED228CDC78D70C829B7:\ 00000800000000000000000000000000 00000000000000000000000000000000:5B8FF678F88EB96FE73BCBF14AD9304B:\ 00000400000000000000000000000000 00000000000000000000000000000000:158B5F6CBB33E547735E45559CEF3E5B:\ 00000200000000000000000000000000 00000000000000000000000000000000:8EFA3AC040AC5235F2F4AC3A82B7018E:\ 00000100000000000000000000000000 00000000000000000000000000000000:97BACE474E820FDEEB1E66D06139D2F9:\ 00800000000000000000000000000000 00000000000000000000000000000000:114CB849EC2735AEECDB2E51A1C45A38:\ 00400000000000000000000000000000 00000000000000000000000000000000:1426ABD1FE61695A62B7A55AB5DA6145:\ 00200000000000000000000000000000 00000000000000000000000000000000:80C615975140248186BE3CD6FD8D7740:\ 00100000000000000000000000000000 00000000000000000000000000000000:CFBD333352A34ED7F73D3E569D78C693:\ 00080000000000000000000000000000 00000000000000000000000000000000:5F04350AB2EFB6075F381EE1DBB8477F:\ 00040000000000000000000000000000 00000000000000000000000000000000:CF5CE38D2033AD6E6891ED24DB39EA66:\ 00020000000000000000000000000000 00000000000000000000000000000000:3E63AF44877F258840B165CC3D47424C:\ 00010000000000000000000000000000 00000000000000000000000000000000:264E5481EFF42A4606ABDA06C0BFDA3D:\ 80000000000000000000000000000000 00000000000000000000000000000000:4A231B3BC727993407AC6EC8350E8524:\ 40000000000000000000000000000000 00000000000000000000000000000000:E03269F9E9FD853C7D8156DF14B98D56:\ 20000000000000000000000000000000 00000000000000000000000000000000:A798181C3081AC59D5BA89754DACC48F:\ 10000000000000000000000000000000 00000000000000000000000000000000:34B355520DF861F3F5C66A2379FBDA15:\ 08000000000000000000000000000000 00000000000000000000000000000000:5E86BB8F6B1175510C6B244281A0B04A:\ 04000000000000000000000000000000 00000000000000000000000000000000:B9213190C7A9C5F13764D29B6DE843A1:\ 02000000000000000000000000000000 00000000000000000000000000000000:4ECA55033294D1FF6F0204B2456046C8:\ 01000000000000000000000000000000 00000000000000000000000000000000:660CF6A3F77836AC685519C702548EE7:\ 000000000000000000000000000000000000000000000080 00000000000000000000000000000000:9EA538A95E21B6738B0F4BDD0D5A6423:\ 000000000000000000000000000000000000000000000040 00000000000000000000000000000000:19D13A0AC90F83E5B3CA943C6462D295:\ 000000000000000000000000000000000000000000000020 00000000000000000000000000000000:1B9DD629B9E11BCD27C4148887AE662A:\ 000000000000000000000000000000000000000000000010 00000000000000000000000000000000:14EF2BA201698B1185B4F45D3C4BF7C1:\ 000000000000000000000000000000000000000000000008 00000000000000000000000000000000:8AF1A83901D7DD153FF8D271B210E3AB:\ 000000000000000000000000000000000000000000000004 00000000000000000000000000000000:4209B9F47FE46DA7095E093698227280:\ 000000000000000000000000000000000000000000000002 00000000000000000000000000000000:5D058517AC7CC5AFD5C33253D4703B46:\ 000000000000000000000000000000000000000000000001 00000000000000000000000000000000:40520018C4AC2BBA285AEEB9BCB58755:\ 000000000000000000000000000000000000000000008000 00000000000000000000000000000000:FB12E82326B5B32A88C73962E6B15A73:\ 000000000000000000000000000000000000000000004000 00000000000000000000000000000000:10514AB50FB935D4DF8D36697E9A892C:\ 000000000000000000000000000000000000000000002000 00000000000000000000000000000000:23BA3FE846E2AE8CD99FC3FE58228A05:\ 000000000000000000000000000000000000000000001000 00000000000000000000000000000000:68E7992B17261F9F50693B291B40DE29:\ 000000000000000000000000000000000000000000000800 00000000000000000000000000000000:16F61AE21DEF7E6FF252F7A7C0A1FD33:\ 000000000000000000000000000000000000000000000400 00000000000000000000000000000000:79386D808CC081C0888E83C047411490:\ 000000000000000000000000000000000000000000000200 00000000000000000000000000000000:81421CDE68390C877C025D60D7578959:\ 000000000000000000000000000000000000000000000100 00000000000000000000000000000000:8BE4D123F250436A35AC1506BF462E25:\ 000000000000000000000000000000000000000000800000 00000000000000000000000000000000:FD007EFCBF67C125F8532A7FD54724CC:\ 000000000000000000000000000000000000000000400000 00000000000000000000000000000000:D6661DE82FD241500194134F40C30071:\ 000000000000000000000000000000000000000000200000 00000000000000000000000000000000:B03A391CCAAE863B0ED315B0CC4FF99D:\ 000000000000000000000000000000000000000000100000 00000000000000000000000000000000:B5142CABF118C8BA5DA8A201E7E04448:\ 000000000000000000000000000000000000000000080000 00000000000000000000000000000000:2B078B616E4802ECC0104510E3E7E44C:\ 000000000000000000000000000000000000000000040000 00000000000000000000000000000000:CE8A95407154E3B8DA3979FDA451F288:\ 000000000000000000000000000000000000000000020000 00000000000000000000000000000000:EF5D9D75A6A31712BAD7D332FCEF52D7:\ 000000000000000000000000000000000000000000010000 00000000000000000000000000000000:CE6430157E4EAEA967B972C35C78036C:\ 000000000000000000000000000000000000000080000000 00000000000000000000000000000000:7117137E956133BF65BCDA326A8156F3:\ 000000000000000000000000000000000000000040000000 00000000000000000000000000000000:7D0D165BDB56D794FAC1B1C5020270B1:\ 000000000000000000000000000000000000000020000000 00000000000000000000000000000000:2AE14DC8A1CD98E1BD20D4E01E32DDD2:\ 000000000000000000000000000000000000000010000000 00000000000000000000000000000000:AE266BE3BF863707C6AECE963D16530E:\ 000000000000000000000000000000000000000008000000 00000000000000000000000000000000:3A2612AF977665D4E8D05E3EA9947E60:\ 000000000000000000000000000000000000000004000000 00000000000000000000000000000000:95491F2AD7B48986522E3B1EA14DE24F:\ 000000000000000000000000000000000000000002000000 00000000000000000000000000000000:8A1E5D419E900C9FD046BA1F74C49DC8:\ 000000000000000000000000000000000000000001000000 00000000000000000000000000000000:E407985AF526A75AB42DB52D64987992:\ 000000000000000000000000000000000000008000000000 00000000000000000000000000000000:6C6EAD1E4101F16AD0FC4DE34DA19D8A:\ 000000000000000000000000000000000000004000000000 00000000000000000000000000000000:84E74236D365A90B6417221C0E5ED058:\ 000000000000000000000000000000000000002000000000 00000000000000000000000000000000:7DC0D45689A260233E52B56EE49F326B:\ 000000000000000000000000000000000000001000000000 00000000000000000000000000000000:E69EE6C58AE686AC193F4A118E5C7680:\ 000000000000000000000000000000000000000800000000 00000000000000000000000000000000:7FCF4D217B2A37C8D3A822C43B1A119E:\ 000000000000000000000000000000000000000400000000 00000000000000000000000000000000:6D37043BF5B8D45F1E44A7C0E792A343:\ 000000000000000000000000000000000000000200000000 00000000000000000000000000000000:ED46DEA31CAC83EE9F812C9006891C32:\ 000000000000000000000000000000000000000100000000 00000000000000000000000000000000:DABC07C4DFDDA34A8B61D1E1F0461196:\ 000000000000000000000000000000000000800000000000 00000000000000000000000000000000:E733109E82EEDEFBB02512F1C030FF35:\ 000000000000000000000000000000000000400000000000 00000000000000000000000000000000:9F3BF5E17F297B3B3F3D6311B2874FC1:\ 000000000000000000000000000000000000200000000000 00000000000000000000000000000000:CF2793EDA6299C358F79D0F15853E075:\ 000000000000000000000000000000000000100000000000 00000000000000000000000000000000:4CFCD92E08E82B0B3FC7C0CB8A2193CE:\ 000000000000000000000000000000000000080000000000 00000000000000000000000000000000:409F6D08C56C0129A485A2CD503AA754:\ 000000000000000000000000000000000000040000000000 00000000000000000000000000000000:4D80946E2267E0E485CDF4CBEA0BDE73:\ 000000000000000000000000000000000000020000000000 00000000000000000000000000000000:EAE07676A063EB5F7F99FAED7B065188:\ 000000000000000000000000000000000000010000000000 00000000000000000000000000000000:A783EB0A14B5212A9BC439F225F33834:\ 000000000000000000000000000000000080000000000000 00000000000000000000000000000000:524282FABF8B62D291AAAADA12423AE9:\ 000000000000000000000000000000000040000000000000 00000000000000000000000000000000:306D0E55364394631EC18BE972EF0B66:\ 000000000000000000000000000000000020000000000000 00000000000000000000000000000000:87D8BA08354745FE85BBB710FCF5EB39:\ 000000000000000000000000000000000010000000000000 00000000000000000000000000000000:894D2F50F43BA36B539DE43637927AC9:\ 000000000000000000000000000000000008000000000000 00000000000000000000000000000000:479C1979DDB0052BA7DF875314CB2A35:\ 000000000000000000000000000000000004000000000000 00000000000000000000000000000000:E0E5399FEF15563392741BC333246873:\ 000000000000000000000000000000000002000000000000 00000000000000000000000000000000:86F93C8B9552D8971367EAE2A366312F:\ 000000000000000000000000000000000001000000000000 00000000000000000000000000000000:9F18DF64A519FEC0581C0C27F805F484:\ 000000000000000000000000000000008000000000000000 00000000000000000000000000000000:53BD3E8475DB67F72910B945BF8C768E:\ 000000000000000000000000000000004000000000000000 00000000000000000000000000000000:456C1BE9ACEFA86AFB9742AB867692B1:\ 000000000000000000000000000000002000000000000000 00000000000000000000000000000000:89EE6EBDDCB44B7F17157C154BB99221:\ 000000000000000000000000000000001000000000000000 00000000000000000000000000000000:51ECA17E2C529F17592F9A117F6F592B:\ 000000000000000000000000000000000800000000000000 00000000000000000000000000000000:A51036D7D90699DDA88ED9A16EE6C556:\ 000000000000000000000000000000000400000000000000 00000000000000000000000000000000:07C856A3CE6F131D785BDE2E3DB3D36A:\ 000000000000000000000000000000000200000000000000 00000000000000000000000000000000:A06931BD2C6D9C3701E0286016AB8555:\ 000000000000000000000000000000000100000000000000 00000000000000000000000000000000:3A07686652A8F7E35FC9B3333EA97D16:\ 000000000000000000000000000000800000000000000000 00000000000000000000000000000000:FD008310340BA35239165FCA8F52B3DF:\ 000000000000000000000000000000400000000000000000 00000000000000000000000000000000:FC7E859D16DBF0F92FB8B3286C110315:\ 000000000000000000000000000000200000000000000000 00000000000000000000000000000000:86C0CBEB5633EF88ABD436BA54AC4D7B:\ 000000000000000000000000000000100000000000000000 00000000000000000000000000000000:CA66CEA4EAE07B83E1EEB737FE72EADC:\ 000000000000000000000000000000080000000000000000 00000000000000000000000000000000:019754956B6DC021D25731EF988BDAC9:\ 000000000000000000000000000000040000000000000000 00000000000000000000000000000000:786EC65CC6C717A171822F1DD1AB3CE8:\ 000000000000000000000000000000020000000000000000 00000000000000000000000000000000:DEAB7388A6F1C61D41E25A0D88F062C4:\ 000000000000000000000000000000010000000000000000 00000000000000000000000000000000:F08DF5D467F41CB7D157C6E6C78900FE:\ 000000000000000000000000000080000000000000000000 00000000000000000000000000000000:0225B99C3E40C8A5FD0156BD6A2B9349:\ 000000000000000000000000000040000000000000000000 00000000000000000000000000000000:6B8D89725A7AEB5AA433011ACF5B72EC:\ 000000000000000000000000000020000000000000000000 00000000000000000000000000000000:6A8B55F69923153ED6A95BF4B78CCE6E:\ 000000000000000000000000000010000000000000000000 00000000000000000000000000000000:199B86F903787EE3EDD60F8393F4A89A:\ 000000000000000000000000000008000000000000000000 00000000000000000000000000000000:BFE08316360801D0B929BBE1786A8570:\ 000000000000000000000000000004000000000000000000 00000000000000000000000000000000:887B6ECDBF12DEB314C50F07B870EC3B:\ 000000000000000000000000000002000000000000000000 00000000000000000000000000000000:C82FDE13839BD8BD8FC408131F559648:\ 000000000000000000000000000001000000000000000000 00000000000000000000000000000000:0482615608212073881C83A90A0B2721:\ 000000000000000000000000008000000000000000000000 00000000000000000000000000000000:CDFD5AF33A61EA9BA8C6E4DD3E84949D:\ 000000000000000000000000004000000000000000000000 00000000000000000000000000000000:A9EFF0A790FEB09727558C1FFB4247A4:\ 000000000000000000000000002000000000000000000000 00000000000000000000000000000000:EAF6266AC9F0A0E96ECF6E602DE61B73:\ 000000000000000000000000001000000000000000000000 00000000000000000000000000000000:59F44B4178A92AF2CA778BDA351247F1:\ 000000000000000000000000000800000000000000000000 00000000000000000000000000000000:87C3730E07C280D110EE11BBDB2C7BF6:\ 000000000000000000000000000400000000000000000000 00000000000000000000000000000000:5F6BF404C25C812FF2E814E4FEBAF636:\ 000000000000000000000000000200000000000000000000 00000000000000000000000000000000:92B8C78C75EE5BB1C27DAC75EF76D2E0:\ 000000000000000000000000000100000000000000000000 00000000000000000000000000000000:1E9F7474C984CC73B7F90F8EC01F547D:\ 000000000000000000000000800000000000000000000000 00000000000000000000000000000000:9CAAD32B4195E293A792CF2403839879:\ 000000000000000000000000400000000000000000000000 00000000000000000000000000000000:B384BE1E8CEAD9DE1E209FC92BA6A3D3:\ 000000000000000000000000200000000000000000000000 00000000000000000000000000000000:4E512E32F6B60CFE5660D7CFA21E13FC:\ 000000000000000000000000100000000000000000000000 00000000000000000000000000000000:832615D6654549BB930EC8DBACC5AE92:\ 000000000000000000000000080000000000000000000000 00000000000000000000000000000000:27549DC43C2DEEAFFB1C52AC37AD9728:\ 000000000000000000000000040000000000000000000000 00000000000000000000000000000000:804E4F4C6FD215D4300704142407020A:\ 000000000000000000000000020000000000000000000000 00000000000000000000000000000000:C52FECB8EDDA2D9BF3E5856231B87F6F:\ 000000000000000000000000010000000000000000000000 00000000000000000000000000000000:26474A9B6A125DA80A989286F1AADB77:\ 000000000000000000000080000000000000000000000000 00000000000000000000000000000000:15955CDA082E2278B2EAB498BAE90A5D:\ 000000000000000000000040000000000000000000000000 00000000000000000000000000000000:04191E4D8945BA1E9D02098EEFCD65DF:\ 000000000000000000000020000000000000000000000000 00000000000000000000000000000000:C1841B80C1E0E4608F0C261F8FF91199:\ 000000000000000000000010000000000000000000000000 00000000000000000000000000000000:7FF3E31C19BB193B4A2CCD488CB44F97:\ 000000000000000000000008000000000000000000000000 00000000000000000000000000000000:2FB402BFAAACCC4F55C9EBA37D2AA543:\ 000000000000000000000004000000000000000000000000 00000000000000000000000000000000:97289170C25CE1EC2011B27487DC8903:\ 000000000000000000000002000000000000000000000000 00000000000000000000000000000000:3BC60DC98B29BA75D7DBA12D78BED74D:\ 000000000000000000000001000000000000000000000000 00000000000000000000000000000000:21C3E9BDB411A2CF58ACFCDDA07CA06E:\ 000000000000000000008000000000000000000000000000 00000000000000000000000000000000:174FC71F855D61484B8C05DEB12988BA:\ 000000000000000000004000000000000000000000000000 00000000000000000000000000000000:337671C8D092C431778655358AE1A622:\ 000000000000000000002000000000000000000000000000 00000000000000000000000000000000:D671E381AE4CBFBC4D360ACE36538EB6:\ 000000000000000000001000000000000000000000000000 00000000000000000000000000000000:9915EB2B534C901AB3E208F0B8274438:\ 000000000000000000000800000000000000000000000000 00000000000000000000000000000000:CBB867073A139F7A39A5ABFB1F9B7084:\ 000000000000000000000400000000000000000000000000 00000000000000000000000000000000:487B9F02DF40531F6B1BD096A8E32377:\ 000000000000000000000200000000000000000000000000 00000000000000000000000000000000:871D4D57145444F7858A3A1727FEE068:\ 000000000000000000000100000000000000000000000000 00000000000000000000000000000000:56463A7AEB3D1B104868B5F0CB88479B:\ 000000000000000000800000000000000000000000000000 00000000000000000000000000000000:1A00009A7CAE8EF56B167F94F9932585:\ 000000000000000000400000000000000000000000000000 00000000000000000000000000000000:BA0BDE829631F63E14FE1995C57CBE29:\ 000000000000000000200000000000000000000000000000 00000000000000000000000000000000:A0625DDE21DF874E27751F460DB24939:\ 000000000000000000100000000000000000000000000000 00000000000000000000000000000000:3A850B3917B926B7C1861AA8557548DB:\ 000000000000000000080000000000000000000000000000 00000000000000000000000000000000:33FB35F2ED3A0F9A9C0D62868890B706:\ 000000000000000000040000000000000000000000000000 00000000000000000000000000000000:8EB519BF9B7F9841FC429C21930730AA:\ 000000000000000000020000000000000000000000000000 00000000000000000000000000000000:973672A4178DA471DB7C2CC9F3349DA4:\ 000000000000000000010000000000000000000000000000 00000000000000000000000000000000:EBC56A2AB4DC394C8409EBC529103C09:\ 000000000000000080000000000000000000000000000000 00000000000000000000000000000000:00300AD85514851A32376A583B99416A:\ 000000000000000040000000000000000000000000000000 00000000000000000000000000000000:47CB1114753A29FA68E83BF3754F5713:\ 000000000000000020000000000000000000000000000000 00000000000000000000000000000000:556424407058A1BF639387032BB4972B:\ 000000000000000010000000000000000000000000000000 00000000000000000000000000000000:C573C69439543B71A1EAF6A38D1DB977:\ 000000000000000008000000000000000000000000000000 00000000000000000000000000000000:570D68BC03C1AD3173316BB3484166DB:\ 000000000000000004000000000000000000000000000000 00000000000000000000000000000000:2ABE779A9A42BF593A2D20495C6F5A37:\ 000000000000000002000000000000000000000000000000 00000000000000000000000000000000:7D648B890DCE86ADAE607B24B17F7ADC:\ 000000000000000001000000000000000000000000000000 00000000000000000000000000000000:8AF02339AC04EEDDC5D29B1D8AB85E34:\ 000000000000008000000000000000000000000000000000 00000000000000000000000000000000:D11C7DCD0E9B857DDC1A8D73169BBA2D:\ 000000000000004000000000000000000000000000000000 00000000000000000000000000000000:7A960A521E193922ED2275B1FCEB484F:\ 000000000000002000000000000000000000000000000000 00000000000000000000000000000000:357E6FBCA32874FDCE99AD14BD10C4B8:\ 000000000000001000000000000000000000000000000000 00000000000000000000000000000000:1AC04248825E32B8E71C34875371F307:\ 000000000000000800000000000000000000000000000000 00000000000000000000000000000000:038A5BB1246BB8F0460ADC7826211268:\ 000000000000000400000000000000000000000000000000 00000000000000000000000000000000:EF923294B89B78F017C874FC4472762E:\ 000000000000000200000000000000000000000000000000 00000000000000000000000000000000:19A8882B0FDB10E143FF9DF9D32DA301:\ 000000000000000100000000000000000000000000000000 00000000000000000000000000000000:399800963634CD1B96D9FCEFE1D0815E:\ 000000000000800000000000000000000000000000000000 00000000000000000000000000000000:9B5B6DFFFCB2201390728372E1259012:\ 000000000000400000000000000000000000000000000000 00000000000000000000000000000000:0DB33144E4EB0FCAC271AB4D26F7B3B3:\ 000000000000200000000000000000000000000000000000 00000000000000000000000000000000:D7987CAA9C1CAB111984C2BA993F95B9:\ 000000000000100000000000000000000000000000000000 00000000000000000000000000000000:7F57B51D6B2E5E8C3DBEDF6B68A3ACDB:\ 000000000000080000000000000000000000000000000000 00000000000000000000000000000000:5DE80D7BF3FC0B05ACEB1311BE12E31B:\ 000000000000040000000000000000000000000000000000 00000000000000000000000000000000:BE2C16F62E116A472C43D526D582A2F2:\ 000000000000020000000000000000000000000000000000 00000000000000000000000000000000:0D9AED1721E71B09C7CF34650315ADD4:\ 000000000000010000000000000000000000000000000000 00000000000000000000000000000000:2B06E5A2CB8E141B6F194E7987D32E14:\ 000000000080000000000000000000000000000000000000 00000000000000000000000000000000:FE2893A03D01523DF7BCF0EC76A71E76:\ 000000000040000000000000000000000000000000000000 00000000000000000000000000000000:018056BEED112C1B11C6D58F383E51F3:\ 000000000020000000000000000000000000000000000000 00000000000000000000000000000000:20D29D2A08CAED608CEE792B82E9F900:\ 000000000010000000000000000000000000000000000000 00000000000000000000000000000000:FB4786827E61312B24889E8A75BFE0E8:\ 000000000008000000000000000000000000000000000000 00000000000000000000000000000000:81FC9F0C865FC970721180942F0DADDE:\ 000000000004000000000000000000000000000000000000 00000000000000000000000000000000:179BA8EFBE611F1358B2D7C8A14F6056:\ 000000000002000000000000000000000000000000000000 00000000000000000000000000000000:5509A6F21705DA67E685C1D2515FC40F:\ 000000000001000000000000000000000000000000000000 00000000000000000000000000000000:9EF148F4819E1AD53458FF7B97512719:\ 000000008000000000000000000000000000000000000000 00000000000000000000000000000000:8B992E1FD9026C14545D3B45BA12DD26:\ 000000004000000000000000000000000000000000000000 00000000000000000000000000000000:2A1A31C9F9EC3F0041E4981C14075C9B:\ 000000002000000000000000000000000000000000000000 00000000000000000000000000000000:668D25EAB49A68A353170FB9804C49E9:\ 000000001000000000000000000000000000000000000000 00000000000000000000000000000000:B0851073E77BEBADB5E4620A5ECAB48F:\ 000000000800000000000000000000000000000000000000 00000000000000000000000000000000:0D7DD474F2ADD4E616C2BDCB31AE295E:\ 000000000400000000000000000000000000000000000000 00000000000000000000000000000000:19E972ACB8159AF2BE06C2CEB13F17CB:\ 000000000200000000000000000000000000000000000000 00000000000000000000000000000000:D3181CAF92EB933472AB5D7D9A79359F:\ 000000000100000000000000000000000000000000000000 00000000000000000000000000000000:AA8B04CFD3F03D913981888D65F595F4:\ 000000800000000000000000000000000000000000000000 00000000000000000000000000000000:C972EAE644F542F2D61581105DAA2DE9:\ 000000400000000000000000000000000000000000000000 00000000000000000000000000000000:40288DA36DC4A581CFC6BF52768AEAC0:\ 000000200000000000000000000000000000000000000000 00000000000000000000000000000000:1460BD4CE7589DFC8CA2A341CEDE21A2:\ 000000100000000000000000000000000000000000000000 00000000000000000000000000000000:415E3D395E8AF9F0B367B18279EC9D36:\ 000000080000000000000000000000000000000000000000 00000000000000000000000000000000:52841B754B398E76A046A808D0254DB1:\ 000000040000000000000000000000000000000000000000 00000000000000000000000000000000:E28C2E20BF18DAD62ADA7B46D46C51AC:\ 000000020000000000000000000000000000000000000000 00000000000000000000000000000000:EACF9AD4EAC19266F886CB3AE50B2CA8:\ 000000010000000000000000000000000000000000000000 00000000000000000000000000000000:39057A7055ADC3DF052632BA75845405:\ 000080000000000000000000000000000000000000000000 00000000000000000000000000000000:0637B291488FCBC39EA131C5D0393617:\ 000040000000000000000000000000000000000000000000 00000000000000000000000000000000:53A6EAA591C754B9AFB8E14B39BFFE79:\ 000020000000000000000000000000000000000000000000 00000000000000000000000000000000:AF9DD24F6FD3C9BAD97466F4E19D008E:\ 000010000000000000000000000000000000000000000000 00000000000000000000000000000000:6F6C9FDBB84546B3BD98703730A71292:\ 000008000000000000000000000000000000000000000000 00000000000000000000000000000000:00DCD917419399ED52E2A528ECAB86C5:\ 000004000000000000000000000000000000000000000000 00000000000000000000000000000000:DC077DA2CBF96509A74980CE12786C41:\ 000002000000000000000000000000000000000000000000 00000000000000000000000000000000:AADD759F77507F990D3856F6EFC91978:\ 000001000000000000000000000000000000000000000000 00000000000000000000000000000000:3948D1EF7CE021CEF9C6C1405BB5A6F9:\ 008000000000000000000000000000000000000000000000 00000000000000000000000000000000:5B8AC83847FDCD6006F7D59A04BE703C:\ 004000000000000000000000000000000000000000000000 00000000000000000000000000000000:7F6347B6A370FDBCD26C91E5F1BE4E77:\ 002000000000000000000000000000000000000000000000 00000000000000000000000000000000:3D8DC8CEF60F4F0F021BEA3B8A268740:\ 001000000000000000000000000000000000000000000000 00000000000000000000000000000000:C9BA9FC07BD7FAD3CBD56DBF9A7C5B00:\ 000800000000000000000000000000000000000000000000 00000000000000000000000000000000:8B660D768B8E32F0C4E15386C5F3450D:\ 000400000000000000000000000000000000000000000000 00000000000000000000000000000000:9A15675F3631BD2AF387A7B69DCEB89E:\ 000200000000000000000000000000000000000000000000 00000000000000000000000000000000:893978E492FED5662D13AA2F759DC89A:\ 000100000000000000000000000000000000000000000000 00000000000000000000000000000000:9E274EAD9B737BB21EFCFCA548602689:\ 800000000000000000000000000000000000000000000000 00000000000000000000000000000000:92FC8E510399E46A041BF365E7B3AE82:\ 400000000000000000000000000000000000000000000000 00000000000000000000000000000000:5E0DA386C46AD493DEA203FDC6F57D70:\ 200000000000000000000000000000000000000000000000 00000000000000000000000000000000:BEC1E37824CF721E5D87F6CB4EBFB9BE:\ 100000000000000000000000000000000000000000000000 00000000000000000000000000000000:257A79F891BB8D0C13FEEF1ACC264214:\ 080000000000000000000000000000000000000000000000 00000000000000000000000000000000:8B3EDD5BA04CB6FF80A3874411C1B8B7:\ 040000000000000000000000000000000000000000000000 00000000000000000000000000000000:73C83EA96AE151230B2DEE7110B15E2C:\ 020000000000000000000000000000000000000000000000 00000000000000000000000000000000:0ABD62FC8802C9BC86E2544909AC610F:\ 010000000000000000000000000000000000000000000000 00000000000000000000000000000000:1908EF821AD2EBC0CB28BF66E796EDAB:\ 0000000000000000000000000000000000000000000000000000000000000080 00000000000000000000000000000000:8D88B1E7BB45E0DD5603D8FCCD589695:\ 0000000000000000000000000000000000000000000000000000000000000040 00000000000000000000000000000000:284CDF6476175B6BB414E7FAC09CD404:\ 0000000000000000000000000000000000000000000000000000000000000020 00000000000000000000000000000000:66487D053A660BD840D7DE39A3B1F139:\ 0000000000000000000000000000000000000000000000000000000000000010 00000000000000000000000000000000:869A570998988F68819CCF301EB015DF:\ 0000000000000000000000000000000000000000000000000000000000000008 00000000000000000000000000000000:F6899D57F734AFD6473278DBDE8FB99D:\ 0000000000000000000000000000000000000000000000000000000000000004 00000000000000000000000000000000:A6726CE53BD62BC873F6C0463A5841FC:\ 0000000000000000000000000000000000000000000000000000000000000002 00000000000000000000000000000000:9858FD31C9C6B54AC0C99CC52324ED34:\ 0000000000000000000000000000000000000000000000000000000000000001 00000000000000000000000000000000:82EDDDC59E207131F1AE2A2A06A83284:\ 0000000000000000000000000000000000000000000000000000000000008000 00000000000000000000000000000000:1C17A9F76290FB6C0F0267BB1CE832C6:\ 0000000000000000000000000000000000000000000000000000000000004000 00000000000000000000000000000000:6DD6415CC9EFB2323FA78ED28EEE06C7:\ 0000000000000000000000000000000000000000000000000000000000002000 00000000000000000000000000000000:48FD01A424E995B0E0840353439B1A4B:\ 0000000000000000000000000000000000000000000000000000000000001000 00000000000000000000000000000000:2B139C4C4200A8DA4DAF8169F84A4089:\ 0000000000000000000000000000000000000000000000000000000000000800 00000000000000000000000000000000:0D7E0A00E181F592C1D75250AC940517:\ 0000000000000000000000000000000000000000000000000000000000000400 00000000000000000000000000000000:9250D327F678E8EDBC25CB40EA70391E:\ 0000000000000000000000000000000000000000000000000000000000000200 00000000000000000000000000000000:4D715D9421FCB51C7B4C94DEF2B5C210:\ 0000000000000000000000000000000000000000000000000000000000000100 00000000000000000000000000000000:19DD5DEC75CEE00003995BF2EA643E2F:\ 0000000000000000000000000000000000000000000000000000000000800000 00000000000000000000000000000000:BB75015A768AB1E9BC4AF49D2D156C4F:\ 0000000000000000000000000000000000000000000000000000000000400000 00000000000000000000000000000000:46EFE1B09EFB606CB11717415511862E:\ 0000000000000000000000000000000000000000000000000000000000200000 00000000000000000000000000000000:360D02F49944ECAE2EE2050E634904CE:\ 0000000000000000000000000000000000000000000000000000000000100000 00000000000000000000000000000000:93E207973539B6E2EF7D49C772E32D86:\ 0000000000000000000000000000000000000000000000000000000000080000 00000000000000000000000000000000:2E71481D28ED6BD01157F4D054F01961:\ 0000000000000000000000000000000000000000000000000000000000040000 00000000000000000000000000000000:AC06EB8186A501262CE9B06FC88F9774:\ 0000000000000000000000000000000000000000000000000000000000020000 00000000000000000000000000000000:A94CC5DCC946C9B4F38D1D46BF1C0335:\ 0000000000000000000000000000000000000000000000000000000000010000 00000000000000000000000000000000:17A457DA5304D77BD0BC4B5B8BB02FDD:\ 0000000000000000000000000000000000000000000000000000000080000000 00000000000000000000000000000000:B6DF6B6C45A38ECE7E940C45FE1E847E:\ 0000000000000000000000000000000000000000000000000000000040000000 00000000000000000000000000000000:83DB5E464D300A76EDA858E108902EBF:\ 0000000000000000000000000000000000000000000000000000000020000000 00000000000000000000000000000000:C7FB67AAA9F7417DC5977B57B723D278:\ 0000000000000000000000000000000000000000000000000000000010000000 00000000000000000000000000000000:1DD21FD2291C7419B5593EE8D6712198:\ 0000000000000000000000000000000000000000000000000000000008000000 00000000000000000000000000000000:A2E337EFDF4B888C2B94B86AE20FF8E8:\ 0000000000000000000000000000000000000000000000000000000004000000 00000000000000000000000000000000:61F70FEAB04DB61D959A69E9C1BAAA9D:\ 0000000000000000000000000000000000000000000000000000000002000000 00000000000000000000000000000000:6FC6C5718FD0B81194A198F873EDE7EA:\ 0000000000000000000000000000000000000000000000000000000001000000 00000000000000000000000000000000:DFDB243581A8D3DA8A3F268AA8E6207E:\ 0000000000000000000000000000000000000000000000000000008000000000 00000000000000000000000000000000:965A8653210830C831353A28CBBFD16C:\ 0000000000000000000000000000000000000000000000000000004000000000 00000000000000000000000000000000:E3442D2FC126CC50AB364E09A0872B18:\ 0000000000000000000000000000000000000000000000000000002000000000 00000000000000000000000000000000:B261BC4E7FAE6629FC5F5D588E417CAF:\ 0000000000000000000000000000000000000000000000000000001000000000 00000000000000000000000000000000:940218AC849FD119D89B0E15376213DD:\ 0000000000000000000000000000000000000000000000000000000800000000 00000000000000000000000000000000:C07DE68CB0ED8C8D398B87D6547BD15B:\ 0000000000000000000000000000000000000000000000000000000400000000 00000000000000000000000000000000:F14145E5DCB1EFA30A5A6CA08EC8F8FE:\ 0000000000000000000000000000000000000000000000000000000200000000 00000000000000000000000000000000:4D08CD60B971B10854A0912DAF5CC3A8:\ 0000000000000000000000000000000000000000000000000000000100000000 00000000000000000000000000000000:73C96C4F08BC5F9725CD2F719402DF4B:\ 0000000000000000000000000000000000000000000000000000800000000000 00000000000000000000000000000000:488AF3D7E9223041C2C26AB496BBF0E5:\ 0000000000000000000000000000000000000000000000000000400000000000 00000000000000000000000000000000:CD5038A80ECEC3424E1E9614CD3267DD:\ 0000000000000000000000000000000000000000000000000000200000000000 00000000000000000000000000000000:C38D3776A560BBC5453E96C1587B0E59:\ 0000000000000000000000000000000000000000000000000000100000000000 00000000000000000000000000000000:845416D12195B8FC18F299AD41D8F569:\ 0000000000000000000000000000000000000000000000000000080000000000 00000000000000000000000000000000:07B3D3BB79520764234D247A7A0036C2:\ 0000000000000000000000000000000000000000000000000000040000000000 00000000000000000000000000000000:BD6816944B3A1353229B02907CD0E87C:\ 0000000000000000000000000000000000000000000000000000020000000000 00000000000000000000000000000000:CC547CD2016122227D7CE3B4BFBE3EAF:\ 0000000000000000000000000000000000000000000000000000010000000000 00000000000000000000000000000000:3CF2E1206969ED3A85E28EFA16162E53:\ 0000000000000000000000000000000000000000000000000080000000000000 00000000000000000000000000000000:801DB46F97025BB099F7755595C532E3:\ 0000000000000000000000000000000000000000000000000040000000000000 00000000000000000000000000000000:4322F95A6D70B9D4F53B733505A11D79:\ 0000000000000000000000000000000000000000000000000020000000000000 00000000000000000000000000000000:D1A200ED8E473284B70EB16E93B55ECD:\ 0000000000000000000000000000000000000000000000000010000000000000 00000000000000000000000000000000:AAB1879D98592963B8F90C8F06804207:\ 0000000000000000000000000000000000000000000000000008000000000000 00000000000000000000000000000000:E221625345B6E73DD09235C7A3957CA3:\ 0000000000000000000000000000000000000000000000000004000000000000 00000000000000000000000000000000:02B055320E02DA991986BB53A1CC69B9:\ 0000000000000000000000000000000000000000000000000002000000000000 00000000000000000000000000000000:FCA1B117007B2C06165E3D773CCEB0C9:\ 0000000000000000000000000000000000000000000000000001000000000000 00000000000000000000000000000000:853E0E5DD1CA7C9C55388DDBA2F138FD:\ 0000000000000000000000000000000000000000000000008000000000000000 00000000000000000000000000000000:6991C5D5E1BD766597115C5A213F6CFB:\ 0000000000000000000000000000000000000000000000004000000000000000 00000000000000000000000000000000:4E0D7A3C6816CC844ABA4BB6AA0F3592:\ 0000000000000000000000000000000000000000000000002000000000000000 00000000000000000000000000000000:1A93F22F2E11AFC3CECA1FC17065ECEC:\ 0000000000000000000000000000000000000000000000001000000000000000 00000000000000000000000000000000:1519F9986E85E5B942A66DFE1D6ECBE7:\ 0000000000000000000000000000000000000000000000000800000000000000 00000000000000000000000000000000:2B583F2363F6C1D981BD2D0C3F965F3A:\ 0000000000000000000000000000000000000000000000000400000000000000 00000000000000000000000000000000:E92FEBFA44950BE01CE755EB4607563B:\ 0000000000000000000000000000000000000000000000000200000000000000 00000000000000000000000000000000:A583EF976A292B406BBD5DC8256B0442:\ 0000000000000000000000000000000000000000000000000100000000000000 00000000000000000000000000000000:08D8A40BCA6BC1C31BADCC9DDA387D9C:\ 0000000000000000000000000000000000000000000000800000000000000000 00000000000000000000000000000000:F502C9674BEBFAE010527C808CA03F5C:\ 0000000000000000000000000000000000000000000000400000000000000000 00000000000000000000000000000000:E85D57184DA2B982C18C8B13B1348838:\ 0000000000000000000000000000000000000000000000200000000000000000 00000000000000000000000000000000:6E71FFAC10EDBF08A6DC42BDA14AE1CE:\ 0000000000000000000000000000000000000000000000100000000000000000 00000000000000000000000000000000:0F2D7BEE48845D8A17ECF93F52F9036A:\ 0000000000000000000000000000000000000000000000080000000000000000 00000000000000000000000000000000:CBC811575660AF9F7E869631ED779F66:\ 0000000000000000000000000000000000000000000000040000000000000000 00000000000000000000000000000000:F7E405B065FB1A03EBD539CFCAD08E17:\ 0000000000000000000000000000000000000000000000020000000000000000 00000000000000000000000000000000:0872458B2E2C4725CE7DEC3FFFC47F4A:\ 0000000000000000000000000000000000000000000000010000000000000000 00000000000000000000000000000000:18DF0F25A865A0B6EC844D810D25FD87:\ 0000000000000000000000000000000000000000000080000000000000000000 00000000000000000000000000000000:35D6DB5996115E7E8C1BE200823E7C63:\ 0000000000000000000000000000000000000000000040000000000000000000 00000000000000000000000000000000:CDEA1849DE224D92034BEC826682AD47:\ 0000000000000000000000000000000000000000000020000000000000000000 00000000000000000000000000000000:7343B1923DB7C28C195660252857ABA3:\ 0000000000000000000000000000000000000000000010000000000000000000 00000000000000000000000000000000:F02FA74352855E5FC194F18476DC2916:\ 0000000000000000000000000000000000000000000008000000000000000000 00000000000000000000000000000000:ADCAFB490DD340784F084779CE182FFE:\ 0000000000000000000000000000000000000000000004000000000000000000 00000000000000000000000000000000:0CE37E34B01BAF724841EC58A6B90990:\ 0000000000000000000000000000000000000000000002000000000000000000 00000000000000000000000000000000:A577782DBA6EDE990B2A28FBF52899B0:\ 0000000000000000000000000000000000000000000001000000000000000000 00000000000000000000000000000000:E5BD5E55A80FE196A2AEBCDB6798614E:\ 0000000000000000000000000000000000000000008000000000000000000000 00000000000000000000000000000000:DAD3F4D3B96EF51C2D4D2869FAEA4C1D:\ 0000000000000000000000000000000000000000004000000000000000000000 00000000000000000000000000000000:28E64B7DC148055040950974E718B27A:\ 0000000000000000000000000000000000000000002000000000000000000000 00000000000000000000000000000000:08C9B5E67B8954FDFE74F391B7AFB754:\ 0000000000000000000000000000000000000000001000000000000000000000 00000000000000000000000000000000:9CA79528107403A7430CD50578029990:\ 0000000000000000000000000000000000000000000800000000000000000000 00000000000000000000000000000000:45A104CAE36E600B6EF91B91FC1C657C:\ 0000000000000000000000000000000000000000000400000000000000000000 00000000000000000000000000000000:D9CF9457265E7ACC57EFE25736A11FBE:\ 0000000000000000000000000000000000000000000200000000000000000000 00000000000000000000000000000000:D1DD8AE84D38D129A5FA0E9D9520ECF8:\ 0000000000000000000000000000000000000000000100000000000000000000 00000000000000000000000000000000:43FB732672D6243DDC9C547E46711FBE:\ 0000000000000000000000000000000000000000800000000000000000000000 00000000000000000000000000000000:A2622ED785815C12C949EBED89094FC3:\ 0000000000000000000000000000000000000000400000000000000000000000 00000000000000000000000000000000:FBB93B64CA5D94692B4E6EED934112D8:\ 0000000000000000000000000000000000000000200000000000000000000000 00000000000000000000000000000000:CD3681FF583D4BC4886D864CFA94EF97:\ 0000000000000000000000000000000000000000100000000000000000000000 00000000000000000000000000000000:37ED3CE092A1AE925264751DFFF6B50E:\ 0000000000000000000000000000000000000000080000000000000000000000 00000000000000000000000000000000:3CA305833473AC6990A41E37A7BE551A:\ 0000000000000000000000000000000000000000040000000000000000000000 00000000000000000000000000000000:CEF8EC0353A04B3DB1309F88265FDABF:\ 0000000000000000000000000000000000000000020000000000000000000000 00000000000000000000000000000000:51C23A4293BB9B963AD17E349B8A71C5:\ 0000000000000000000000000000000000000000010000000000000000000000 00000000000000000000000000000000:B324D96D901DB388CC1DF28092714335:\ 0000000000000000000000000000000000000080000000000000000000000000 00000000000000000000000000000000:E572F8132305A28A1E09BF5ED8ABAA8D:\ 0000000000000000000000000000000000000040000000000000000000000000 00000000000000000000000000000000:E4CBB63909992197E9654069BF4EE3EE:\ 0000000000000000000000000000000000000020000000000000000000000000 00000000000000000000000000000000:14B1DF955B3A20EADFF35C3869B0B624:\ 0000000000000000000000000000000000000010000000000000000000000000 00000000000000000000000000000000:4D9019A6223F39E2075C95C7724959FC:\ 0000000000000000000000000000000000000008000000000000000000000000 00000000000000000000000000000000:5352A5E6F316C51F0256B3A0BC283D47:\ 0000000000000000000000000000000000000004000000000000000000000000 00000000000000000000000000000000:9F570DD55188193525D0C0244CBA2CFD:\ 0000000000000000000000000000000000000002000000000000000000000000 00000000000000000000000000000000:1B206FEA626AD786255A3186AC5F5132:\ 0000000000000000000000000000000000000001000000000000000000000000 00000000000000000000000000000000:D7078E2A1CB16142851F7C5F86FF4E64:\ 0000000000000000000000000000000000008000000000000000000000000000 00000000000000000000000000000000:FED174EAC6701DAD5DF03DD8A438D99C:\ 0000000000000000000000000000000000004000000000000000000000000000 00000000000000000000000000000000:9112A5FEB40E3134C26303F379F29AF6:\ 0000000000000000000000000000000000002000000000000000000000000000 00000000000000000000000000000000:B190C3C5AC183F95F71495A93C679BDB:\ 0000000000000000000000000000000000001000000000000000000000000000 00000000000000000000000000000000:5777C456EEDBB7756AE316517C1072A8:\ 0000000000000000000000000000000000000800000000000000000000000000 00000000000000000000000000000000:5550900FAF11F9D2DDC6CF2F1D7AAEDB:\ 0000000000000000000000000000000000000400000000000000000000000000 00000000000000000000000000000000:BDE3013E16AFDF64A0F24991D7EE5752:\ 0000000000000000000000000000000000000200000000000000000000000000 00000000000000000000000000000000:71500F21B4145961271727E896C62F24:\ 0000000000000000000000000000000000000100000000000000000000000000 00000000000000000000000000000000:801CA8E44FB6BAB5DF7FB96AA5F39F8D:\ 0000000000000000000000000000000000800000000000000000000000000000 00000000000000000000000000000000:9EB5169E8F72673301D0ABF9E85422BF:\ 0000000000000000000000000000000000400000000000000000000000000000 00000000000000000000000000000000:CB377E74144F9E9405355F089CA3918B:\ 0000000000000000000000000000000000200000000000000000000000000000 00000000000000000000000000000000:1EE82E9E6E525DAEB21DF068DFF7AB09:\ 0000000000000000000000000000000000100000000000000000000000000000 00000000000000000000000000000000:6316DDDD174659C16CF3324A770225EB:\ 0000000000000000000000000000000000080000000000000000000000000000 00000000000000000000000000000000:E17C717EC7A1CF3492710D9FE53A26AD:\ 0000000000000000000000000000000000040000000000000000000000000000 00000000000000000000000000000000:675F1E9F7C895DD0B4E1F8D4EED1D2C9:\ 0000000000000000000000000000000000020000000000000000000000000000 00000000000000000000000000000000:446B5ADE1FE91D73511403B34F20FF16:\ 0000000000000000000000000000000000010000000000000000000000000000 00000000000000000000000000000000:C19171490B5595E8555C61B352935DEB:\ 0000000000000000000000000000000080000000000000000000000000000000 00000000000000000000000000000000:57159E7BE66463408FAE89C376318FA8:\ 0000000000000000000000000000000040000000000000000000000000000000 00000000000000000000000000000000:C2441BB36C7B7977B0E6EED5AED1BE09:\ 0000000000000000000000000000000020000000000000000000000000000000 00000000000000000000000000000000:63A33251E59FF5A6CE0482EB4B80E70B:\ 0000000000000000000000000000000010000000000000000000000000000000 00000000000000000000000000000000:4459D2EA77E8E8041DA46EB36705B054:\ 0000000000000000000000000000000008000000000000000000000000000000 00000000000000000000000000000000:E76A69F531CCC2C1A4C56AEE55B63C29:\ 0000000000000000000000000000000004000000000000000000000000000000 00000000000000000000000000000000:97E97C261C31046F115FEC15820E3822:\ 0000000000000000000000000000000002000000000000000000000000000000 00000000000000000000000000000000:3620B17AE6A993D09618B8768266BAE9:\ 0000000000000000000000000000000001000000000000000000000000000000 00000000000000000000000000000000:4172B0BEBBEF90672EB0623A709FC734:\ 0000000000000000000000000000008000000000000000000000000000000000 00000000000000000000000000000000:265829FC78FD18069B3631AE596DC9BF:\ 0000000000000000000000000000004000000000000000000000000000000000 00000000000000000000000000000000:E89B25E3E40E28D37BA6E78C55A611F8:\ 0000000000000000000000000000002000000000000000000000000000000000 00000000000000000000000000000000:8EBF95D561DD65F9BC66B82A6905828C:\ 0000000000000000000000000000001000000000000000000000000000000000 00000000000000000000000000000000:8C8F6AF8078C29D23B2958CAE6858A09:\ 0000000000000000000000000000000800000000000000000000000000000000 00000000000000000000000000000000:39FA2682ABFABA6A705780E72BDA0128:\ 0000000000000000000000000000000400000000000000000000000000000000 00000000000000000000000000000000:A812C9D68212B21A14E9CEBCA8960750:\ 0000000000000000000000000000000200000000000000000000000000000000 00000000000000000000000000000000:47BFD757C13ADA4001DF9B0989E7CB80:\ 0000000000000000000000000000000100000000000000000000000000000000 00000000000000000000000000000000:A95ADAA6A53D1BF0FA4E46EA5D1EE88C:\ 0000000000000000000000000000800000000000000000000000000000000000 00000000000000000000000000000000:D1031805010BBACD8BB316EFA437EC4A:\ 0000000000000000000000000000400000000000000000000000000000000000 00000000000000000000000000000000:7B6A4380AF9337C902AA691243F6A2E6:\ 0000000000000000000000000000200000000000000000000000000000000000 00000000000000000000000000000000:BDEF751D35F3B8BC6A9AB61F6B04A94A:\ 0000000000000000000000000000100000000000000000000000000000000000 00000000000000000000000000000000:51CFB9ED07D3628D0854C2E85FC4B866:\ 0000000000000000000000000000080000000000000000000000000000000000 00000000000000000000000000000000:0CDA37833BE087D8B997A54D5CFBDCFD:\ 0000000000000000000000000000040000000000000000000000000000000000 00000000000000000000000000000000:938D2E6F2149D1E0B6F8878D472F0469:\ 0000000000000000000000000000020000000000000000000000000000000000 00000000000000000000000000000000:3857B0C25F235A22F347E0ACCD008FAD:\ 0000000000000000000000000000010000000000000000000000000000000000 00000000000000000000000000000000:3BAADE8819E09549CDA6AA160F4C626A:\ 0000000000000000000000000080000000000000000000000000000000000000 00000000000000000000000000000000:0F5E7BF2A2590F7A65D17DAA4E828F7D:\ 0000000000000000000000000040000000000000000000000000000000000000 00000000000000000000000000000000:510B105E4809B4115C999AB346D21570:\ 0000000000000000000000000020000000000000000000000000000000000000 00000000000000000000000000000000:0FF47C9330A69D2B5C52434394A2D1CA:\ 0000000000000000000000000010000000000000000000000000000000000000 00000000000000000000000000000000:AB8301BFFFF3B24A3CE63F553443F2C7:\ 0000000000000000000000000008000000000000000000000000000000000000 00000000000000000000000000000000:49A3F4514E983616F55580EA4EA12DBF:\ 0000000000000000000000000004000000000000000000000000000000000000 00000000000000000000000000000000:C007AEA2279ED965AD5F037359DE24C4:\ 0000000000000000000000000002000000000000000000000000000000000000 00000000000000000000000000000000:BE5FCBE21961382305B6EDBC74B6D73E:\ 0000000000000000000000000001000000000000000000000000000000000000 00000000000000000000000000000000:5F3DB2DEE7074DAE2340174109D6BEF0:\ 0000000000000000000000008000000000000000000000000000000000000000 00000000000000000000000000000000:E530BC0CE5A24E03AD0D215A7E9D9A15:\ 0000000000000000000000004000000000000000000000000000000000000000 00000000000000000000000000000000:FFF5A17155933F6084EA4C1BE1245769:\ 0000000000000000000000002000000000000000000000000000000000000000 00000000000000000000000000000000:64CA3D5422833F7A4AD1FA5331C08A78:\ 0000000000000000000000001000000000000000000000000000000000000000 00000000000000000000000000000000:E42C18F2B56A0E536E4908F84DE06419:\ 0000000000000000000000000800000000000000000000000000000000000000 00000000000000000000000000000000:97823D74887FBE3E6B412407A256A018:\ 0000000000000000000000000400000000000000000000000000000000000000 00000000000000000000000000000000:8A1D4467260F12AB493334133D5928DD:\ 0000000000000000000000000200000000000000000000000000000000000000 00000000000000000000000000000000:735E7FB4B1B2D54C6D33E3D0C714BFA0:\ 0000000000000000000000000100000000000000000000000000000000000000 00000000000000000000000000000000:AD4B018D50E3A28124A0A1259DC667D4:\ 0000000000000000000000800000000000000000000000000000000000000000 00000000000000000000000000000000:C899A00A2585C1F654694700F1EC1531:\ 0000000000000000000000400000000000000000000000000000000000000000 00000000000000000000000000000000:BAE53DCFCF6D6E360A27755F9CE81B6D:\ 0000000000000000000000200000000000000000000000000000000000000000 00000000000000000000000000000000:6E181C731459C3360778BEA1BA86164D:\ 0000000000000000000000100000000000000000000000000000000000000000 00000000000000000000000000000000:97FD2DDD6045805A7B34879A6AB55D3C:\ 0000000000000000000000080000000000000000000000000000000000000000 00000000000000000000000000000000:547D61C02DEF0D9869DF43907D3B8124:\ 0000000000000000000000040000000000000000000000000000000000000000 00000000000000000000000000000000:9E457544FC14C723884DD15DEBC25157:\ 0000000000000000000000020000000000000000000000000000000000000000 00000000000000000000000000000000:E0767EC3934ECF169116B485ED0C755B:\ 0000000000000000000000010000000000000000000000000000000000000000 00000000000000000000000000000000:B4B30728F0DDBB28402E252DC6DDBA4E:\ 0000000000000000000080000000000000000000000000000000000000000000 00000000000000000000000000000000:DDB074D9E22B61FCDCB2323A52046221:\ 0000000000000000000040000000000000000000000000000000000000000000 00000000000000000000000000000000:91ABBBFECEC752159297B832055E99FE:\ 0000000000000000000020000000000000000000000000000000000000000000 00000000000000000000000000000000:25415EF8615CC222B1EC77046B094C35:\ 0000000000000000000010000000000000000000000000000000000000000000 00000000000000000000000000000000:C11856EE23FA27F2F426844EE9C7B081:\ 0000000000000000000008000000000000000000000000000000000000000000 00000000000000000000000000000000:5E6F28690F31CDC0DAD21D8E3E1BC985:\ 0000000000000000000004000000000000000000000000000000000000000000 00000000000000000000000000000000:712D271BAB597FF6728C0A55CE6C3CDB:\ 0000000000000000000002000000000000000000000000000000000000000000 00000000000000000000000000000000:4A567C948597B47A1ABF5F8CCD77AE4F:\ 0000000000000000000001000000000000000000000000000000000000000000 00000000000000000000000000000000:6ED568AD50C256B77945E19C04086D98:\ 0000000000000000008000000000000000000000000000000000000000000000 00000000000000000000000000000000:F2398F417C685FE664735E29DB29BBA9:\ 0000000000000000004000000000000000000000000000000000000000000000 00000000000000000000000000000000:37D20B991D910044C6BEF068028125D4:\ 0000000000000000002000000000000000000000000000000000000000000000 00000000000000000000000000000000:35721318ED63062B43D37C4F14101962:\ 0000000000000000001000000000000000000000000000000000000000000000 00000000000000000000000000000000:74A004A5D483CCA7219EA12AD4AF5CA4:\ 0000000000000000000800000000000000000000000000000000000000000000 00000000000000000000000000000000:BBCEA8A80619D2AC53037313E71AB56C:\ 0000000000000000000400000000000000000000000000000000000000000000 00000000000000000000000000000000:646E434C0FEF5CD6CD9C7A26BA972BB1:\ 0000000000000000000200000000000000000000000000000000000000000000 00000000000000000000000000000000:8F2AD3F65E9716E611501D5B7AD81127:\ 0000000000000000000100000000000000000000000000000000000000000000 00000000000000000000000000000000:BCC02339FCFFCAE0536FB5410AF91129:\ 0000000000000000800000000000000000000000000000000000000000000000 00000000000000000000000000000000:DD6A02B2DC091212A746C8FC9967B8BE:\ 0000000000000000400000000000000000000000000000000000000000000000 00000000000000000000000000000000:4BB9FD26E225C913F9BE1B697D31B5B9:\ 0000000000000000200000000000000000000000000000000000000000000000 00000000000000000000000000000000:2A3BAC4370DAA0D68CA90939F43E33CC:\ 0000000000000000100000000000000000000000000000000000000000000000 00000000000000000000000000000000:8576F1070E25B5FD944C366E08CC9102:\ 0000000000000000080000000000000000000000000000000000000000000000 00000000000000000000000000000000:E620C37AD1650DCEAEBEAE1F57BD8AD9:\ 0000000000000000040000000000000000000000000000000000000000000000 00000000000000000000000000000000:7761ECD209CB564EEACAB4E62DB26BDD:\ 0000000000000000020000000000000000000000000000000000000000000000 00000000000000000000000000000000:67D23F0CF1A57BA0E43FE82A3F4FBBB6:\ 0000000000000000010000000000000000000000000000000000000000000000 00000000000000000000000000000000:D9732CE2055E7F935468A63A170B598C:\ 0000000000000080000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E9F396623AF12ADF24C0378F42F7B4BD:\ 0000000000000040000000000000000000000000000000000000000000000000 00000000000000000000000000000000:98D5AE45E15A836C141CF7F64DC7D551:\ 0000000000000020000000000000000000000000000000000000000000000000 00000000000000000000000000000000:EEFBED56D7BD47D088B3AD657A6CB8B8:\ 0000000000000010000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A99342C96F331950D97AFBFC8C0D4E08:\ 0000000000000008000000000000000000000000000000000000000000000000 00000000000000000000000000000000:25C35298C0A1224F2BEE7EE8AAA86E51:\ 0000000000000004000000000000000000000000000000000000000000000000 00000000000000000000000000000000:66602FD71F84B2637B2283CD81DE3080:\ 0000000000000002000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D48E45670FD978FA4DB161C0E5D59FC0:\ 0000000000000001000000000000000000000000000000000000000000000000 00000000000000000000000000000000:ECE089620BF6866A66FB6070C491C74C:\ 0000000000008000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:36CD300072D4EC94A0FF3595F7A2C1FE:\ 0000000000004000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F939CB3D8316B59600F164234E78D228:\ 0000000000002000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:17C6258E6009E282661869D525F7D204:\ 0000000000001000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:45A32C5EA3E2E548A9E6313BEF957308:\ 0000000000000800000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C2105CC6264024EBEC6BA0F825FD5163:\ 0000000000000400000000000000000000000000000000000000000000000000 00000000000000000000000000000000:85F3D2169883A7CD54A67DA7C4AC613C:\ 0000000000000200000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B5FFC7D92EA2815C0F4DC9182DA160C6:\ 0000000000000100000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C9642C4E3F420CA73E8F1C15C6EB011F:\ 0000000000800000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1BD0EEF566BEFB4D57CE7120B731125E:\ 0000000000400000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CB0705AE3DB537AD1C202DD6635202DA:\ 0000000000200000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D88F55DAC599BEA8440B4BA9E3C50016:\ 0000000000100000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:FF227EC8AF4640198173A79B124CEFDF:\ 0000000000080000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CC55A4F4086043F1E1ABA9CC91E4395A:\ 0000000000040000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8D2BAD986865A229601855B024D9A557:\ 0000000000020000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:343E1B000FEDAC000376EE138FD8F0F7:\ 0000000000010000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:765DF290B8D90C9169E6884A0D4D4B92:\ 0000000080000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F9EEBAB9F5CEBF94196FEF3872C46881:\ 0000000040000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:318B1983222E49F5B57E26E70890A5B6:\ 0000000020000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D8DF0A98604C987283ACF7F211D906C7:\ 0000000010000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:92697CF743A72D2D4D7864132A9ADE0B:\ 0000000008000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:2C450C8BCDAA9CB59F930DDAE88CBDB3:\ 0000000004000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4284A05C4A0AF59DFF15604ACBB82743:\ 0000000002000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:986A05E8447024C8468A1EBF7743F689:\ 0000000001000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4A7E5D441526F7D4D2987AEDF48F0231:\ 0000008000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F5D9875A70158C9C64136703D231E3F5:\ 0000004000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3BC82EC5FBE24B5AAF230895BBA9DCD1:\ 0000002000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:EFF062AF33726C788D261FBFDDA15109:\ 0000001000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E2A342E2683D3F970983D941656823AA:\ 0000000800000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E16066A35F943A426FE47AD1A1FC69AD:\ 0000000400000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D89F891B578FF6B441E97849DD2F2798:\ 0000000200000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4A800443B44112493226E08BD9521912:\ 0000000100000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:2B504288F018B2A867597EB53EEA6DB1:\ 0000800000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B3FA8074A573A00B4897DF6CD0D99B5D:\ 0000400000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:38B56FD4C1FEDF5282208EF5F796A2C9:\ 0000200000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:BFE421423C53A9942C78D04CB4B231D8:\ 0000100000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:EF102196C479E513AE8B776D524631B9:\ 0000080000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:AC38F8F6DF320D4409BA6A1CD93A482E:\ 0000040000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:FB5D6CD1B6EE155D6744E5BE62A650F6:\ 0000020000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:23A626E559D0B8E4E4AB3F7C38750D4A:\ 0000010000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:2CCA19AE45B976236D88E4E1AD3BACEA:\ 0080000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:052D166AA678A987C07256C582283986:\ 0040000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D30979DDC6C09B1158FA41EEB6F2A21B:\ 0020000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C36705BB2A9BAFCFCB64C4468964D568:\ 0010000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:97905460E140685960B561204ABC09A9:\ 0008000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B893B8766A12AAAD7691565C46651623:\ 0004000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7978DBD4794AF35DFB0403423B4E81A9:\ 0002000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4F990737145AAA9100BFEDCA53B69F6D:\ 0001000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A223AA1288463C0E2BE38EBD825616C0:\ 8000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:EAE1D405570174DF7DF2F9966D509159:\ 4000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:65F37684471E921DC8A30F45B43C4499:\ 2000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0EE036D0BC32B89C1CEF987F5229E4A9:\ 1000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:EC9D6557EED58E6CF89A746BBDB6C9B7:\ 0800000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:AD2314BF713CD796E8C7EC6E9C59CB8D:\ 0400000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:33D8944A2D2FACBBA555EC18543AFCF0:\ 0200000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E0885D4460373469D1FA6C36A6E1C52F:\ 0100000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000080:4AE9A20B2B14A10290CBB820B7FFB510:\ 00000000000000000000000000000000 00000000000000000000000000000040:2C6EE9F8F64B5B1B5587CDF17E84A791:\ 00000000000000000000000000000000 00000000000000000000000000000020:29141D06A6B42CE22EFB8383CEAE325D:\ 00000000000000000000000000000000 00000000000000000000000000000010:2AE6E19905D89A8E53A1DF26AD5C89B4:\ 00000000000000000000000000000000 00000000000000000000000000000008:1587FF28ABDF9DF5A3F4DAF7405D273B:\ 00000000000000000000000000000000 00000000000000000000000000000004:B598247AA82F5C79F9FF0E7EC61B83C4:\ 00000000000000000000000000000000 00000000000000000000000000000002:0C5DABB01245E3A3544E291F3B0F250F:\ 00000000000000000000000000000000 00000000000000000000000000000001:9BEDCEA16BDE863526A937208CBF0ABC:\ 00000000000000000000000000000000 00000000000000000000000000008000:A174B66C47C53B2C34AA9F06FECBB7B2:\ 00000000000000000000000000000000 00000000000000000000000000004000:333827335F88EBB93A0A7436E51398F0:\ 00000000000000000000000000000000 00000000000000000000000000002000:03A7D7D70F4F50AE96835F12B73F79D3:\ 00000000000000000000000000000000 00000000000000000000000000001000:B8B9F2029769952D9664A6FDE9706BBF:\ 00000000000000000000000000000000 00000000000000000000000000000800:A7DCE248EC5A060388CA14598B986454:\ 00000000000000000000000000000000 00000000000000000000000000000400:1A21EED739C6C39A56E0B4C6A17D3375:\ 00000000000000000000000000000000 00000000000000000000000000000200:9073DBCF760A0B9E0E84A2FD6DF164F9:\ 00000000000000000000000000000000 00000000000000000000000000000100:CEE83B85568AD8133D8842DC883052CE:\ 00000000000000000000000000000000 00000000000000000000000000800000:151940BA15A175FCD39CE2D3A0259EFF:\ 00000000000000000000000000000000 00000000000000000000000000400000:9F997F2AC950E52666207183DB935899:\ 00000000000000000000000000000000 00000000000000000000000000200000:015B7DF6BFB9367BF8F690FC0B77DEB0:\ 00000000000000000000000000000000 00000000000000000000000000100000:4A7D36598525699F49667AF4B46BB99B:\ 00000000000000000000000000000000 00000000000000000000000000080000:306248FD603DFC18E41CF0864D2C352C:\ 00000000000000000000000000000000 00000000000000000000000000040000:1367EC90627601E9C1BD1371454B772F:\ 00000000000000000000000000000000 00000000000000000000000000020000:85FE597694444D1A8D7F1CE219913F4F:\ 00000000000000000000000000000000 00000000000000000000000000010000:75BAF3E8194EA04577133509B50FF4C3:\ 00000000000000000000000000000000 00000000000000000000000080000000:3EB8325BCA6C583DC04019F01D4BC90D:\ 00000000000000000000000000000000 00000000000000000000000040000000:240A1E99A51C7EED2E9127DB7D86903E:\ 00000000000000000000000000000000 00000000000000000000000020000000:81B2AF04CC40E2E3DDFFBE3F6AEF8A33:\ 00000000000000000000000000000000 00000000000000000000000010000000:6970437809D0A34E5A76B22F88F5282B:\ 00000000000000000000000000000000 00000000000000000000000008000000:C12E44B3F253295CF742441FFA2712DB:\ 00000000000000000000000000000000 00000000000000000000000004000000:98E2FBF128A1E2F80CABF2DB3F9E62AF:\ 00000000000000000000000000000000 00000000000000000000000002000000:3F2B1D74B9D0D84C0B0DDAD31352E67A:\ 00000000000000000000000000000000 00000000000000000000000001000000:E51D907B84D877250D0BCEC17D292DFD:\ 00000000000000000000000000000000 00000000000000000000008000000000:19E6063C7529E5268E4A45703AFC8AC4:\ 00000000000000000000000000000000 00000000000000000000004000000000:6DDCBD01AC098B04AAA084D4C579DAC9:\ 00000000000000000000000000000000 00000000000000000000002000000000:AFC268DB7CD2A453EA87BA6A0E923DEC:\ 00000000000000000000000000000000 00000000000000000000001000000000:24B199E30672EF17362468CC8C0F4E46:\ 00000000000000000000000000000000 00000000000000000000000800000000:B30C571F161EF0DAC78816A4DC1339FF:\ 00000000000000000000000000000000 00000000000000000000000400000000:214CB9151303EDA5CD14E35E701DE887:\ 00000000000000000000000000000000 00000000000000000000000200000000:57A991425DC55325EB159A0274140EFA:\ 00000000000000000000000000000000 00000000000000000000000100000000:856CD3630F436DACD3FE27AB73F4A956:\ 00000000000000000000000000000000 00000000000000000000800000000000:E5D5DC0D6834E44697BDD5D8427A054F:\ 00000000000000000000000000000000 00000000000000000000400000000000:CAB879F5684241583F4900B2653D76C9:\ 00000000000000000000000000000000 00000000000000000000200000000000:43FE63C8C08E0CE5D1DAB79348F1B64E:\ 00000000000000000000000000000000 00000000000000000000100000000000:1D7850062F3F8B2415F22BC4D95A1367:\ 00000000000000000000000000000000 00000000000000000000080000000000:45D486C0AC551C76AA17E356404726F2:\ 00000000000000000000000000000000 00000000000000000000040000000000:900FEDE23DBB68E48BA9D9806E606F19:\ 00000000000000000000000000000000 00000000000000000000020000000000:F573C581080C5654A6C426DD8971E68B:\ 00000000000000000000000000000000 00000000000000000000010000000000:07AF806C0B6ECF9DD508C0D108572C37:\ 00000000000000000000000000000000 00000000000000000080000000000000:8C30672FF7F1DB4681BA36E48B3374A3:\ 00000000000000000000000000000000 00000000000000000040000000000000:0D56FA9193C8A6FBF653D75D3F61407E:\ 00000000000000000000000000000000 00000000000000000020000000000000:08C0C170A7B0F0C07E1CDEF95AEE8113:\ 00000000000000000000000000000000 00000000000000000010000000000000:F05F7E94EC7FECF973EF5732B565E016:\ 00000000000000000000000000000000 00000000000000000008000000000000:EB667F97B9D94B0C41C873C4B56B334C:\ 00000000000000000000000000000000 00000000000000000004000000000000:A065550C6371DEC580E16276E03F13D4:\ 00000000000000000000000000000000 00000000000000000002000000000000:CDAC7C0A0E363FE8BA16BC11D1F6DC57:\ 00000000000000000000000000000000 00000000000000000001000000000000:FF792A72BF23CABD13EA587C57D05D3F:\ 00000000000000000000000000000000 00000000000000008000000000000000:986EFA59113F5C8A66BBAA7EF978A125:\ 00000000000000000000000000000000 00000000000000004000000000000000:B8CB15A238CA60157C3CB3317021B92C:\ 00000000000000000000000000000000 00000000000000002000000000000000:F262212AC5485BA7D92CBF5A9C58D8AD:\ 00000000000000000000000000000000 00000000000000001000000000000000:DF54C6D917675E73A3659560D5813E56:\ 00000000000000000000000000000000 00000000000000000800000000000000:925D0E759AF1EB36CEEB0FB6D51FAB7A:\ 00000000000000000000000000000000 00000000000000000400000000000000:99BC9E5870190269C4FE5B6FC23C8D8C:\ 00000000000000000000000000000000 00000000000000000200000000000000:C0380B9660722514C1EA4322FE45955C:\ 00000000000000000000000000000000 00000000000000000100000000000000:66521E5F953F2D2E237A259BDEE9C400:\ 00000000000000000000000000000000 00000000000000800000000000000000:1EB43E99040A614F77361601A1806651:\ 00000000000000000000000000000000 00000000000000400000000000000000:A11495F4358A5FA63024A2DC02E20480:\ 00000000000000000000000000000000 00000000000000200000000000000000:CF4D5EAD4E69313709EA9399F5ABF8D9:\ 00000000000000000000000000000000 00000000000000100000000000000000:6CAC3A5E20E13162FB3A31804CB6C7AE:\ 00000000000000000000000000000000 00000000000000080000000000000000:BFEE053ED49F33F5A388359721FE20FA:\ 00000000000000000000000000000000 00000000000000040000000000000000:B2FFBF55E5E2E0CB0935504430E173F8:\ 00000000000000000000000000000000 00000000000000020000000000000000:E521E33E82289A176467E24CBAD5D92C:\ 00000000000000000000000000000000 00000000000000010000000000000000:9609C701F895754A623D3BF3EAC48334:\ 00000000000000000000000000000000 00000000000080000000000000000000:C80F1E35ED81AC45835129665CA5C0B5:\ 00000000000000000000000000000000 00000000000040000000000000000000:27FE1A77E6BF18887DBF7D48FC1EAB65:\ 00000000000000000000000000000000 00000000000020000000000000000000:8E2444DDF34F5320A150471E01AC2F85:\ 00000000000000000000000000000000 00000000000010000000000000000000:9CB3B00CA62767D7A1D45AF44D74957F:\ 00000000000000000000000000000000 00000000000008000000000000000000:A07252FB0F05EA2264F558BDDF162BBB:\ 00000000000000000000000000000000 00000000000004000000000000000000:4CCD47A10722175D4018709698E52881:\ 00000000000000000000000000000000 00000000000002000000000000000000:F9DED80456581D2E6F09BDB09B77C04A:\ 00000000000000000000000000000000 00000000000001000000000000000000:DCA8A545689A58F663B0B7A540F41E24:\ 00000000000000000000000000000000 00000000008000000000000000000000:6801BAF0FBAF3352F3950F0940173352:\ 00000000000000000000000000000000 00000000004000000000000000000000:B969F1B6F56E885025F12E58F87B4099:\ 00000000000000000000000000000000 00000000002000000000000000000000:AA9F1568B6D0F5AFAC34847E0D7152B2:\ 00000000000000000000000000000000 00000000001000000000000000000000:A96B20E51FCB48A0C58306086094154B:\ 00000000000000000000000000000000 00000000000800000000000000000000:C9F389C56576B8C74A687BC5AAB8D503:\ 00000000000000000000000000000000 00000000000400000000000000000000:3FB63882764779902321A2E594275C6B:\ 00000000000000000000000000000000 00000000000200000000000000000000:160C3C22EF0B0D3E4F2FDC914138C229:\ 00000000000000000000000000000000 00000000000100000000000000000000:265AC0BE8E47750E7CA22BAF01153B4D:\ 00000000000000000000000000000000 00000000800000000000000000000000:C1842F4CA2DDC78E55CD91E07AD23A12:\ 00000000000000000000000000000000 00000000400000000000000000000000:E47D5889218FF4CE45EA249EDC9B71C7:\ 00000000000000000000000000000000 00000000200000000000000000000000:FB7566732AB52FE99454CFB07A0F1F0A:\ 00000000000000000000000000000000 00000000100000000000000000000000:5FBF0927A8B293A04024B187AB1BF6C1:\ 00000000000000000000000000000000 00000000080000000000000000000000:CFFBC514515878E10E07556988D8E721:\ 00000000000000000000000000000000 00000000040000000000000000000000:CD3EEEBA162879FF20ABD158C236E3F3:\ 00000000000000000000000000000000 00000000020000000000000000000000:F96D1082131DAE899EBD32CC562F0BB9:\ 00000000000000000000000000000000 00000000010000000000000000000000:BDB475694748128D9959141682174CAF:\ 00000000000000000000000000000000 00000080000000000000000000000000:A5E0C2E39B9821F2CD42875B0EC0A65E:\ 00000000000000000000000000000000 00000040000000000000000000000000:A1397FFDA7C2A4E9A60E0AB48947B933:\ 00000000000000000000000000000000 00000020000000000000000000000000:F20B001C13A0F857FB89C64FFF4CDA83:\ 00000000000000000000000000000000 00000010000000000000000000000000:F38EE20A32B15A5B9129B67BA1FF3125:\ 00000000000000000000000000000000 00000008000000000000000000000000:41ED367E96E013C651AF3FAEA764FE40:\ 00000000000000000000000000000000 00000004000000000000000000000000:55C30FBD291D89E50A9DADCB48E52296:\ 00000000000000000000000000000000 00000002000000000000000000000000:3FE7F1A404C0E4395FCC985F369735D4:\ 00000000000000000000000000000000 00000001000000000000000000000000:6E131502B6A4F30B56AA52EB67989809:\ 00000000000000000000000000000000 00008000000000000000000000000000:3EA36D91871DFF568FBE623DC31EBCE5:\ 00000000000000000000000000000000 00004000000000000000000000000000:7C6DF10118A3AB6545A504790543C89E:\ 00000000000000000000000000000000 00002000000000000000000000000000:1DFF6937399E060342348C34E88B5985:\ 00000000000000000000000000000000 00001000000000000000000000000000:87DCE0F133442B7D4FAF7082F5489407:\ 00000000000000000000000000000000 00000800000000000000000000000000:CBEF868AE34C80C542766358534A148B:\ 00000000000000000000000000000000 00000400000000000000000000000000:DF23BC0E0C0B7F502E0210AF8B353165:\ 00000000000000000000000000000000 00000200000000000000000000000000:E9732D7A112DE03068EC10D10AF8D972:\ 00000000000000000000000000000000 00000100000000000000000000000000:1D17312BE6675B0797C5175DDCC1DE7E:\ 00000000000000000000000000000000 00800000000000000000000000000000:0DB0D17349C89E090C845CBEF963F225:\ 00000000000000000000000000000000 00400000000000000000000000000000:C7128FD1A5EF5202550873EA885551C5:\ 00000000000000000000000000000000 00200000000000000000000000000000:761D7F9855C95AB6148833503958F96E:\ 00000000000000000000000000000000 00100000000000000000000000000000:1D406059F0E1030FA66C52A46751D092:\ 00000000000000000000000000000000 00080000000000000000000000000000:DE2FCC081DF9B136EC62922351E18D94:\ 00000000000000000000000000000000 00040000000000000000000000000000:5F93FBFB11A527DFDFB5E4713E431E34:\ 00000000000000000000000000000000 00020000000000000000000000000000:6C2C4F22E738C56B5246971540E5E3A1:\ 00000000000000000000000000000000 00010000000000000000000000000000:BFF82E042A92224FBD3D41C22D07B610:\ 00000000000000000000000000000000 80000000000000000000000000000000:A3B35DE7C358DDD82644678C64B8BCBB:\ 00000000000000000000000000000000 40000000000000000000000000000000:04ABCFE4E0AF27FF92A2BB10949D7DD2:\ 00000000000000000000000000000000 20000000000000000000000000000000:8F773194B78EF2B2740237EF12D08608:\ 00000000000000000000000000000000 10000000000000000000000000000000:8B1EA69EE8D7C8D95B1DE4A670EC6997:\ 00000000000000000000000000000000 08000000000000000000000000000000:CEE3C6CE66A7AC0C1767923B263B2EBD:\ 00000000000000000000000000000000 04000000000000000000000000000000:88DE61FFC3AD277687626D5F7705DEF3:\ 00000000000000000000000000000000 02000000000000000000000000000000:69DD947EFADCD15A06A0D79E078B35AE:\ 00000000000000000000000000000000 01000000000000000000000000000000:32F1FA100E43561146DCA08D15B90636:\ 00000000000000000000000000000000 00000000000000000000000000000080:D9D076F0512B4F29E15752A21B270BB1:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000040:9668F388DD4F122A4D9DD8D6B8A322D5:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000020:D3F12A67FABEC165545D25F5E5FEAE6F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000010:97580203AACE7E6F0DEB71BC631D9E40:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000008:E11B01524EA1F465A2A20043EB9F7E8A:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000004:9BAC7EE501F03D6DEBE0F9EE68FBB3C1:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000002:444E6201556F1C9D73299183B7ABCA9D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000001:497EA15A5AAB3CB115C3E0091C2E4047:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000008000:A306CFDAFE5C8C2A955956BB61FFE5CD:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000004000:4815634545F268ED3BF50021AC0265B2:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000002000:3B075AFF8F75956DC4BE7D5121BF07B6:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000001000:8EAA16AEA0535498D21245BAE97ED0D4:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000800:AFFA71EA9A2F6C4A018CF2F5F22B9B13:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000400:93B8DD3F9A59DD9231B0885601A2354C:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000200:EE23DB4E914D12A53BE8428161F3DE24:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000100:E76E230F4BA91426325C16FA168CA44B:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000800000:14148C222620E009AC51EE2321641D25:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000400000:319D430B55E2A2C942B089755D4C6035:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000200000:774D83990DCBAF6B9186DF250DC721A9:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000100000:81CA67898765727FFDEDBC7DC25EC8FF:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000080000:BEFC19FD8A41103B6892AD4A3CB08122:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000040000:CC2DE08FA80BE8A13C8860174AF9F55D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000020000:4935E35A180FEC382D3DCFD5ED572AFB:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000010000:D78FE49AB8E11EBA118687045D04A70F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000080000000:5DA9109BC3193E5D2ABA0CA577CBBCD4:\ 000000000000000000000000000000000000000000000000 00000000000000000000000040000000:BC46C6FE8F7E549CCC402FC4633C670C:\ 000000000000000000000000000000000000000000000000 00000000000000000000000020000000:60A11AFFABBEE4D5D5564A74C7F94C91:\ 000000000000000000000000000000000000000000000000 00000000000000000000000010000000:84DD300A8FDE4AC126F41EA0692F3E07:\ 000000000000000000000000000000000000000000000000 00000000000000000000000008000000:3734062F8FCF37FBD1C48B5AAEF00C5F:\ 000000000000000000000000000000000000000000000000 00000000000000000000000004000000:EA4491C7F5A9D671DA358C535965E1C3:\ 000000000000000000000000000000000000000000000000 00000000000000000000000002000000:D46899CC964A2A082C80AB7E0A4B153A:\ 000000000000000000000000000000000000000000000000 00000000000000000000000001000000:45A5744C068AC6C7BC028C4D40885F20:\ 000000000000000000000000000000000000000000000000 00000000000000000000008000000000:4FF5F65E2089279F1FFF7BF06EC6D527:\ 000000000000000000000000000000000000000000000000 00000000000000000000004000000000:B0C818F70672EF5E6F20515214DDDF7A:\ 000000000000000000000000000000000000000000000000 00000000000000000000002000000000:2A4D0F00CA19EDCEEF86D7F283221A97:\ 000000000000000000000000000000000000000000000000 00000000000000000000001000000000:F9E6A04D60D5C06994E196EEF788ED59:\ 000000000000000000000000000000000000000000000000 00000000000000000000000800000000:602BE82E95A1BEF5C2742099A6CB70D9:\ 000000000000000000000000000000000000000000000000 00000000000000000000000400000000:B53F1354FE1291679B6D418AC4A3E26D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000200000000:0F68F7C1FFB5FA997D8CC007CF4F5BA8:\ 000000000000000000000000000000000000000000000000 00000000000000000000000100000000:3B90014CDF2D614A339B48A6F374D1C4:\ 000000000000000000000000000000000000000000000000 00000000000000000000800000000000:3D8075B415AC9DEB6008B51597CE28F4:\ 000000000000000000000000000000000000000000000000 00000000000000000000400000000000:675A3322BCCCF4D78F3376ECC2C8A415:\ 000000000000000000000000000000000000000000000000 00000000000000000000200000000000:B8CD6C76DAD863B3A2342265A42C7878:\ 000000000000000000000000000000000000000000000000 00000000000000000000100000000000:E0F6B38346E3E0AE2C5763C25C01ACB9:\ 000000000000000000000000000000000000000000000000 00000000000000000000080000000000:96E295724B3F296016A3F6853B679079:\ 000000000000000000000000000000000000000000000000 00000000000000000000040000000000:305E7A77DC3B62F110688AB334002132:\ 000000000000000000000000000000000000000000000000 00000000000000000000020000000000:324E96A82CE897DAB3850047C38E9B18:\ 000000000000000000000000000000000000000000000000 00000000000000000000010000000000:23EB8F12867D39E24E5A71606E3B5C1E:\ 000000000000000000000000000000000000000000000000 00000000000000000080000000000000:EC74DC99FDB377E35EBA6E5C920C9E20:\ 000000000000000000000000000000000000000000000000 00000000000000000040000000000000:12F92E9FF675FFE132FEC127A61ED1D6:\ 000000000000000000000000000000000000000000000000 00000000000000000020000000000000:F8BFC6819A8F1683DD314AFEDAA80F33:\ 000000000000000000000000000000000000000000000000 00000000000000000010000000000000:28552459A3EB05AE69463C26F6413B73:\ 000000000000000000000000000000000000000000000000 00000000000000000008000000000000:E018CED8C1FC6FE1849E945550602D46:\ 000000000000000000000000000000000000000000000000 00000000000000000004000000000000:8A46B1349AE83730266EBFB1D62BA1EB:\ 000000000000000000000000000000000000000000000000 00000000000000000002000000000000:AEA0972033ACDA2FE228A3619511B0CF:\ 000000000000000000000000000000000000000000000000 00000000000000000001000000000000:6BCD123081CB4DA2197A9204947C4765:\ 000000000000000000000000000000000000000000000000 00000000000000008000000000000000:1CA839C433F49B9CAC257C7CBE38C571:\ 000000000000000000000000000000000000000000000000 00000000000000004000000000000000:E6D1727A0BC893BBE5A048B73296FF43:\ 000000000000000000000000000000000000000000000000 00000000000000002000000000000000:6B38158548081550B6931773C3348995:\ 000000000000000000000000000000000000000000000000 00000000000000001000000000000000:4159191656BAE5F059625051F329E674:\ 000000000000000000000000000000000000000000000000 00000000000000000800000000000000:5684B43817E24580EE373B54B57126C1:\ 000000000000000000000000000000000000000000000000 00000000000000000400000000000000:D31DC022A55A6CB7116D5AA79713EBEF:\ 000000000000000000000000000000000000000000000000 00000000000000000200000000000000:B9B7F96A83494D61C0D476E15CF9FC40:\ 000000000000000000000000000000000000000000000000 00000000000000000100000000000000:9F61E523005A37B71A589C35E2320580:\ 000000000000000000000000000000000000000000000000 00000000000000800000000000000000:2F19CFB18D4B538C688FF0FF73EEF402:\ 000000000000000000000000000000000000000000000000 00000000000000400000000000000000:2B2D1598BD1A57A6277D0F1182423E70:\ 000000000000000000000000000000000000000000000000 00000000000000200000000000000000:FB589E7803F8DEC257644DD8968B3BF9:\ 000000000000000000000000000000000000000000000000 00000000000000100000000000000000:4E8F6CD48030ABFB6BFAA8C79DF29132:\ 000000000000000000000000000000000000000000000000 00000000000000080000000000000000:594C7334C5C77F1F311743DBF880A848:\ 000000000000000000000000000000000000000000000000 00000000000000040000000000000000:8B9060A226A976B4D8701B61A0E16E05:\ 000000000000000000000000000000000000000000000000 00000000000000020000000000000000:9D5D7F82A45E543A28769767F0B4220B:\ 000000000000000000000000000000000000000000000000 00000000000000010000000000000000:7F60DD3212B5FD34A33E95B7CD3C98B4:\ 000000000000000000000000000000000000000000000000 00000000000080000000000000000000:67A133B6981D6CFFFB0894B5CD60C384:\ 000000000000000000000000000000000000000000000000 00000000000040000000000000000000:B9724EFA90EE77242862C6D107053799:\ 000000000000000000000000000000000000000000000000 00000000000020000000000000000000:6CC4B4806D82C681027375553BEEF871:\ 000000000000000000000000000000000000000000000000 00000000000010000000000000000000:D05EA01E7AE0768FFE5B499D4A0EA833:\ 000000000000000000000000000000000000000000000000 00000000000008000000000000000000:EB5259D268854E583B02C445F0DBB33D:\ 000000000000000000000000000000000000000000000000 00000000000004000000000000000000:273792A497CBE6058FB8CE518C05A9A7:\ 000000000000000000000000000000000000000000000000 00000000000002000000000000000000:629EE820F46138558FE7AA6D547F971E:\ 000000000000000000000000000000000000000000000000 00000000000001000000000000000000:F04FF6EC27F7412350CA62E6A3BE479F:\ 000000000000000000000000000000000000000000000000 00000000008000000000000000000000:CAF26B388D8A81C408FC3506CA523C72:\ 000000000000000000000000000000000000000000000000 00000000004000000000000000000000:79A075A5778E5BED4F0663FC86D92A56:\ 000000000000000000000000000000000000000000000000 00000000002000000000000000000000:90E59EE9F97DE1590D4C454169890932:\ 000000000000000000000000000000000000000000000000 00000000001000000000000000000000:30DF4AFE05F0D0EC4495C4A7A3D3A1AF:\ 000000000000000000000000000000000000000000000000 00000000000800000000000000000000:BF6D54D156EDE791A177F8A5BA5DC1D0:\ 000000000000000000000000000000000000000000000000 00000000000400000000000000000000:2C2286B2537AFDF52A7EF59D620E7E46:\ 000000000000000000000000000000000000000000000000 00000000000200000000000000000000:545F83ECF5366475A1867BF81DE59780:\ 000000000000000000000000000000000000000000000000 00000000000100000000000000000000:5E7648E3575B7A02BEA8C69A19ED06BC:\ 000000000000000000000000000000000000000000000000 00000000800000000000000000000000:99B0CC109580893A14B960F78C867DF7:\ 000000000000000000000000000000000000000000000000 00000000400000000000000000000000:4FBCBA60C491EFA9C5B8B8CC9471C26A:\ 000000000000000000000000000000000000000000000000 00000000200000000000000000000000:7A3B3E4FA8DF6DD964161EF9ADB7EC90:\ 000000000000000000000000000000000000000000000000 00000000100000000000000000000000:DBA5DD3EE2B0F03D402D5BADAE4E34C9:\ 000000000000000000000000000000000000000000000000 00000000080000000000000000000000:2334F78508F6259862FAA5842E6B1E7B:\ 000000000000000000000000000000000000000000000000 00000000040000000000000000000000:F15ED8B81B74BD35586E1594AB3B0F73:\ 000000000000000000000000000000000000000000000000 00000000020000000000000000000000:A654EE4634624A3593DCC272C0AB8566:\ 000000000000000000000000000000000000000000000000 00000000010000000000000000000000:E71506E96ADACE02580EA035601850C3:\ 000000000000000000000000000000000000000000000000 00000080000000000000000000000000:00D43BE69B9387B28A4234D2E5BEF038:\ 000000000000000000000000000000000000000000000000 00000040000000000000000000000000:BB828D0A587EA543A78A60B6F63CC159:\ 000000000000000000000000000000000000000000000000 00000020000000000000000000000000:427338CBFA6B652CDCE9C30F29F6E660:\ 000000000000000000000000000000000000000000000000 00000010000000000000000000000000:D26286844B1BE4D73B44B77A2C4449DD:\ 000000000000000000000000000000000000000000000000 00000008000000000000000000000000:28D9BEB7444B7801C510D74C90F3183A:\ 000000000000000000000000000000000000000000000000 00000004000000000000000000000000:9D8949E7F531F30FFD1C6891154FFB8A:\ 000000000000000000000000000000000000000000000000 00000002000000000000000000000000:B329A557C9BFED767B44CA25F43C0924:\ 000000000000000000000000000000000000000000000000 00000001000000000000000000000000:1909B5B407CB28E7050F8889104B73F5:\ 000000000000000000000000000000000000000000000000 00008000000000000000000000000000:DA51B1E831305D9E6AC7F0CDF49F3AE5:\ 000000000000000000000000000000000000000000000000 00004000000000000000000000000000:4A091855C4AA2436F3C61A11FA4B9DA5:\ 000000000000000000000000000000000000000000000000 00002000000000000000000000000000:DB8350915843684F18B4B358579A9446:\ 000000000000000000000000000000000000000000000000 00001000000000000000000000000000:13A1376760534FF5F7D5ED1B62D93D4B:\ 000000000000000000000000000000000000000000000000 00000800000000000000000000000000:C2613B1D8937C2B1C9D7B0249D938E95:\ 000000000000000000000000000000000000000000000000 00000400000000000000000000000000:3FB48878619B70DB717F410550B03069:\ 000000000000000000000000000000000000000000000000 00000200000000000000000000000000:0589BD5D8ECDAAE7ECABC8816EF3C7EB:\ 000000000000000000000000000000000000000000000000 00000100000000000000000000000000:5AC9C030789D810698AAB706BA6BCCA8:\ 000000000000000000000000000000000000000000000000 00800000000000000000000000000000:4BD66B7E897E76BF51F1F00671092169:\ 000000000000000000000000000000000000000000000000 00400000000000000000000000000000:4A72C588A0FA490D521640D1F245E4BC:\ 000000000000000000000000000000000000000000000000 00200000000000000000000000000000:32205DCCC1D7A129B934C6FABAADEB1C:\ 000000000000000000000000000000000000000000000000 00100000000000000000000000000000:74F79A4CF6F99359D7EC47DA87104658:\ 000000000000000000000000000000000000000000000000 00080000000000000000000000000000:2810428BA5177BB0D91C11683008E68D:\ 000000000000000000000000000000000000000000000000 00040000000000000000000000000000:3863C205AED373BB3EF9E6D85D0AD08F:\ 000000000000000000000000000000000000000000000000 00020000000000000000000000000000:DD207AA0894DFBEDD7D9802823C04D7B:\ 000000000000000000000000000000000000000000000000 00010000000000000000000000000000:A6EAC9ECAAE9CC8621198BA547E9B74F:\ 000000000000000000000000000000000000000000000000 80000000000000000000000000000000:23F5F432AD687E0D4574C16459618ABB:\ 000000000000000000000000000000000000000000000000 40000000000000000000000000000000:56CD894936F6E9A4A4304CAE06F97CE3:\ 000000000000000000000000000000000000000000000000 20000000000000000000000000000000:B604D94F461AF9F4771BC53F8E3C227B:\ 000000000000000000000000000000000000000000000000 10000000000000000000000000000000:BB852AC4756880630D6D63951D3D2602:\ 000000000000000000000000000000000000000000000000 08000000000000000000000000000000:319C206CD98D2C98993FC2CDAAB3259C:\ 000000000000000000000000000000000000000000000000 04000000000000000000000000000000:D271595956451E3B7D957A3485ADE9F7:\ 000000000000000000000000000000000000000000000000 02000000000000000000000000000000:D4257D927C7F2A6390DF198B573DD1BA:\ 000000000000000000000000000000000000000000000000 01000000000000000000000000000000:7610F6DBE8F3F19682DCC01AF57DCD79:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000080:2055DEA7C84B008C6FAEB4B192795ADA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000040:CB98F1C490F33B4F7A3D3E821B3551F3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000020:BB654CB6528C21D78E5CB79D5DA677A4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000010:E0B2836175A6808D61FEA4CB529401F8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000008:824C5F6FECE3E0FC4293821B987B3BD4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000004:9D9286D5E97CCDEC47E03CB12C34B339:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000002:BC2C09F0B3FC63CE17F1BE7F267E3E0A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000001:AD86DE83231C3203A86AE33B721EAA9F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000008000:AE042A69C879D524DC4BCC70B84B1B37:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000004000:6D03E3381991EDC800513D30BE07DE5A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000002000:576807DCB0F1A8D73904DBAA84BE818E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000001000:96DD8A88157832B7E45C639C25170333:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000800:9C1A7B580B29888F397743E76C4E7A39:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000400:B77FE10336DA7531E1BF2DC41C7E6E95:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000200:8658E3A6DBAC89EBA6E045881B172E9C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000100:D2FE26FC85AA40C3C6827B0DFF96AB0C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000800000:56C2530D97A43944BE7874E6FA9121FD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000400000:AAECA9394EF359D851CC9F244D4D1E54:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000200000:71BC0D1DEA15FE3BC4AA6DD829C8E957:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000100000:267FCBA295A670CB9EC18AFBB819CE91:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000080000:D18CC92248E209FF8C9AF4AC93588727:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000040000:63E94B466C955B7204285E418A156B29:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000020000:368A8D2610A773A477B924028DAD455F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000010000:B210E51F2C154205DA4A1D1B892DCC63:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000080000000:FFE1B843D7DC5F52852705221ED5EECA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000040000000:0E8B9ACE62AA90B258D8090EF2188BC4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000020000000:96961DBEC1C476AE00972E54DE621F19:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000010000000:A31A56562516BDAE02215CD5F0DF0569:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000008000000:A2316B6B9E6AD55D7013A24BDB1EAEB9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000004000000:709F715313E17EFB3ECAE3A5D9ED94AF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000002000000:BCA04C7CAB888EE6950B7696F5899502:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000001000000:6655B0542BE057664DE9B2733CA0E555:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000008000000000:7407623C54E38D13B48B84306DD8F244:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000004000000000:B3D6DC13CF612951F9ACB05EAEEDE7E3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000002000000000:301378F0D3D30AE6613A9E7CF113821F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000001000000000:9F227635FDAB7D31A7E1F08BBCC34371:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000800000000:F08620D46001C366FD6DCBEBC806C182:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000400000000:CF51A2A45F9CBFDE788D108B1B4D33A5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000200000000:3E70F946FB77C6841D9F001104347659:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000100000000:A3EB98B3BE360FAE3B8EC43D5B77FF7C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000800000000000:4F6E01D8A2437547B50E070498BCD4F9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000400000000000:4F80F4048084E1150AA6A36A6BB3D7EA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000200000000000:311471549CCBB1EC27BAA384EC32F30F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000100000000000:3C4DA8FF90590FB9FC529580DD40E7EF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000080000000000:60AE8E3F60A099EEF38EFF4ED27DE3EC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000040000000000:B33C4D6DF1259C4E5799D19B375420EA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000020000000000:4D1BA08EB1E30F2A3B3E5D1DAE9792A9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000010000000000:3CF54D30E493CDD7439E1F34FBB098F3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000080000000000000:F8958250D6D6772B20051E36666906BD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000040000000000000:B4ED85D72C04A357958D7045BE13C4FF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000020000000000000:294A16831BF660536203030B59DA20F3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000010000000000000:D189C5A12722ABFEBA16F155975068E6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000008000000000000:9A9248C1FEDF207CE64F68E73B22A77C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000004000000000000:CC668772F50D2ED7DF83FF85A0D76576:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000002000000000000:685CA45E48D087563E1886DBDD63342F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000001000000000000:FCE8BFBA1BB12F4990C6DF32C6D71EBD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000008000000000000000:645D7562E523058E7708FF03F1712BE8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000004000000000000000:FA9CAF3BBC2D52806EF9B3D01F5B8398:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000002000000000000000:0D2638505AAE1A5532D74C4F45C136D3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000001000000000000000:9721099476B1F963EF87DD29E82227F8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000800000000000000:237AE2CDD5D2819EDAE0947AFB9D040F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000400000000000000:8FA78734E057E8A9486862E00A9886D8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000200000000000000:983F654090C661264BE8F921063B7DE5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000100000000000000:645F0F938A2898A3869190A1D99A3078:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000800000000000000000:4DDBA0F24964591307AB909009BB41EF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000400000000000000000:5D9333754035534CEF4EEFA73EA3F8C9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000200000000000000000:F51234B609D397B1D6DA8BB625C0993C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000100000000000000000:0AF5205E41F184D0989A78BF149DB675:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000080000000000000000:0EBC3926D924F37BFD716F404CA8450D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000040000000000000000:53CADA57C7855AEB96B48F8C85915DE9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000020000000000000000:FD8E2C7604621D13E64B58315DCC65CD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000010000000000000000:A7126988773129D5F6CC330C1A0EF30B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000080000000000000000000:72C791409F94CE23F4CD61D714670B39:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000040000000000000000000:6AD3CCBC31E2ECF88C6B54F84E638AA2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000020000000000000000000:9FE143250D00E25696B01E0A2ED05DB3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000010000000000000000000:3ABBF724E6C7B2D05D93A2C6D058E5AC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000008000000000000000000:59300BA5323CF6D84A9FF12B042A5AFF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000004000000000000000000:4AE9F03EF61BAA670CE46F3A6C205BD5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000002000000000000000000:E33261C4E54AB7B117C3ABA1C9E11C1E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000001000000000000000000:B84E741AC92A42F37A77F05D6F464E10:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000008000000000000000000000:0F6D2E73CF929A92BADF0A372FFB31A5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000004000000000000000000000:2002487C2CFE5A223E3A3C19A6B23670:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000002000000000000000000000:A9E22B14D403C7F0FA9D95C064CBA9D3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000001000000000000000000000:CFD3A8EE62F68692A8917C814290E979:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000800000000000000000000:AECA2C8C0CA8B6F0EF594A13C85E83CF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000400000000000000000000:E74D77BB281F542A0A78C3D8436783F4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000200000000000000000000:B81755986C8B60A935F5D9169A2A7655:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000100000000000000000000:DE964C9FF34F5A79FF43C6AB148DC395:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000800000000000000000000000:0F7CE54A338AB05E2C38F1725DA8B127:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000400000000000000000000000:CAD8158D26EED67D4355BB66D0812ADE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000200000000000000000000000:5332616A057A657FD2FD6562AF33EFC9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000100000000000000000000000:308CD48EC851D7C1251174228B943B11:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000080000000000000000000000:29A5D9977C881DB067136B755BB68E54:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000040000000000000000000000:C0F6B4881776765507CF91DB0A32C70F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000020000000000000000000000:47E518209CB5533F9A7EE02C4F07391B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000010000000000000000000000:58D7E0D60E315EEBA97F0DFA2D7307B0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000080000000000000000000000000:C02ED6499331AF8C6CF30A63BB5E89CA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000040000000000000000000000000:B5F166B94EC31A17662E24757FBB3FC5:\ 0000000000000000000000000000000000000000000000000000000000000000 00000020000000000000000000000000:17D20FBDA96D4AD0D99DAE64DE5F317B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000010000000000000000000000000:320FA060BBB901F66A9E4CFF221E6A4A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000008000000000000000000000000:3A259B7AEE3155C0C4DF7A32EF40FB19:\ 0000000000000000000000000000000000000000000000000000000000000000 00000004000000000000000000000000:028EFD3B6E686C87B402151F414B13AD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000002000000000000000000000000:D4F61CC61FA1DBD68B8C48541AE77289:\ 0000000000000000000000000000000000000000000000000000000000000000 00000001000000000000000000000000:DFCCE96C8C244586A3BCF098306C6374:\ 0000000000000000000000000000000000000000000000000000000000000000 00008000000000000000000000000000:BD5426FFD3CC9FC735EBAB7C72FD2D9B:\ 0000000000000000000000000000000000000000000000000000000000000000 00004000000000000000000000000000:EA3C7C9B02AE7297B4BE551C8C551440:\ 0000000000000000000000000000000000000000000000000000000000000000 00002000000000000000000000000000:11BB660CF8431F2625AB9EF603975BB7:\ 0000000000000000000000000000000000000000000000000000000000000000 00001000000000000000000000000000:B666AA7C5BA5209CBCEDE07EB66064D3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000800000000000000000000000000:CAD843E927DDE8F92DBBB33C1B4E87F9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000400000000000000000000000000:ED29F7805804E2E95F664B2E36C20A67:\ 0000000000000000000000000000000000000000000000000000000000000000 00000200000000000000000000000000:980F61BF6EBDE1A30607A1D51FFFB8D6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000100000000000000000000000000:E47A19E8579807B5C44AC62619372673:\ 0000000000000000000000000000000000000000000000000000000000000000 00800000000000000000000000000000:2B451B22A3EBAB1C7A7619551DDF149F:\ 0000000000000000000000000000000000000000000000000000000000000000 00400000000000000000000000000000:3ABE3CAEDA54E5583269803BE04CBB2C:\ 0000000000000000000000000000000000000000000000000000000000000000 00200000000000000000000000000000:DF581405DFBDEFACB35AD3BC510FE895:\ 0000000000000000000000000000000000000000000000000000000000000000 00100000000000000000000000000000:45B3C3DAC439F884447567B282DE329C:\ 0000000000000000000000000000000000000000000000000000000000000000 00080000000000000000000000000000:4192DE2B562CDD43EC4358EA730250C3:\ 0000000000000000000000000000000000000000000000000000000000000000 00040000000000000000000000000000:27E310D8032E16CF970F635C517E7D2E:\ 0000000000000000000000000000000000000000000000000000000000000000 00020000000000000000000000000000:573CAE2A23968DE1D40036C24F9FEFA4:\ 0000000000000000000000000000000000000000000000000000000000000000 00010000000000000000000000000000:B4AD06B55E31DE8F1F77C2B7AE8B73FD:\ 0000000000000000000000000000000000000000000000000000000000000000 80000000000000000000000000000000:8314675E8AD5C3ECD83D852BCF7F566E:\ 0000000000000000000000000000000000000000000000000000000000000000 40000000000000000000000000000000:893BF67B1A845579C8FADC05BFDC0894:\ 0000000000000000000000000000000000000000000000000000000000000000 20000000000000000000000000000000:302F8325DEB1E1A0955D6273368A0DC4:\ 0000000000000000000000000000000000000000000000000000000000000000 10000000000000000000000000000000:917B2F6A11DDDCEB53FEA01E194A6CC9:\ 0000000000000000000000000000000000000000000000000000000000000000 08000000000000000000000000000000:8229E6539268BB39F3218E2903110C4F:\ 0000000000000000000000000000000000000000000000000000000000000000 04000000000000000000000000000000:935A7835E2FAF9F7F20CE85662EE281F:\ 0000000000000000000000000000000000000000000000000000000000000000 02000000000000000000000000000000:DF5E38BE0362C35E8AF472C6327987DA:\ 0000000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000:07E5E5AD7097B849BADC2D5D803B7F6A:\ 0000000000000000000000000000000000000000000000000000000000000000 1032547698BADCFEEFCDAB8967452301:D5BAA00A4BB9D8A7C981C8DC90D89D92:\ FFEEDDCCBBAA99887766554433221100 145F0B8B663176B95DCAB7E9DCD5CC24:1032547698BADCFEEFCDAB8967452301:\ FFEEDDCCBBAA99887766554433221100 1032547698BADCFEEFCDAB8967452301:DA860842B720802BF404A4C71034879A:\ 8899AABBCCDDEEFFFFEEDDCCBBAA99887766554433221100 B2696BD0D98C17953E4239225D27202C:1032547698BADCFEEFCDAB8967452301:\ 8899AABBCCDDEEFFFFEEDDCCBBAA99887766554433221100 1032547698BADCFEEFCDAB8967452301:93DF9A3CAFE387BD999EEBE393A17FCA:\ 00112233445566778899AABBCCDDEEFFFFEEDDCCBBAA99887766554433221100 # Corrected test vectors, based on NIST's clarification of May 9, 2002 [Skipjack] AABBCCDD00112233:00D3127AE2CA8725:11223344556677889900 CE365D5D21C1A4CB:C00891C551C5E168:9C5F3F996E59C9543249 CB758E2851482982:6C09A2825D32B67E:21A07C1CED3C2C0C1576 7B402EA5E4B7A7C3:C6E32EA485F38324:F62D87056348C5D64071 3AE159B52AE3FD1B:8AD85F68B89DFAD6:0E2B3B9AEEF001392C3C 3828786C48F705D2:9352B87091483003:51BAA0E8AADF4B8B6A60 E060FCC7F7F16FD9:8C70B2C901339B1F:CE70B79AE70F7AA44778 8F5FA719DE4B1D24:958816FE7FC5862B:91A8919EC9360CABB973 0B55FD902BFECC99:CA7F517B383DA760:FB9F7F8B62E4996E49E7 CA7F517B383DA760:278B665DB00CC924:FB9F7F8B62E4996E49E7 6527AF09D0B01CB7:628A8AE67A87F464:90DDF1550EC7DCF4CAE5 628A8AE67A87F464:CD01A638A878E7FE:90DDF1550EC7DCF4CAE5 E7951155B748D347:EAEB4A1470307BF1:3516DABCD760F2BEE4CD AD14EBC6D0261D94:8DAE0E5E2CD055A0:C9C5DAF7DFD17D902270 9B0C81EDA6853253:DC354CB74F2FC2B4:EEEE6892DCD1ED868F56 C76443A5B0652306:160DF886878D6908:03604B2D0D06A9AA9D68 37F1C930714AA1CF:39DDEC7C8B84DBD6:6E8494476C89110F166C 1E71CDF5AB39DF1D:AE316B4C32222DC9:DF3A10F722776402DAF8 9EE6838FCE6C6CDD:FF7F52D9C17728E3:E4EE21889437C10A7682 111AA47F17CFAABE:1A86B8753F784547:C3C55FCACDD387163C84 0AC61B6C219FC0C4:727AA5B83616105C:E5F795A933FFD70C87AE 56582400B014F8D3:918F72548E0FFCB4:9163BD738BEA13D9CB5C 9C323238D9C76E35:F801578F6050B793:C70CA4689C59CD745EF6 6CD57A531CCF9E20:619E091055D423D8:DC934E7C08D7466E10AA 667DE1649DEA2E89:5FD975B231E25909:EA4FC33C0CA289973FA9 1BC90F76FD901399:AE676788090270E7:9988881616D6CB63B188 9E9CCADD47C9EBDA:22A3D66BA549CCE7:10DF61754870FFD16CFB 2E8FCDE2EFDD1964:FD42E226CF058AE4:2C005FEFE7C4C01ADC5E 128106BDEC982932:C1F24DB137E5C062:6A49942FA39AC190308E CC93DA20EE2AAE3A:714D626B8AE5D154:92903F26A46FD43F6EB9 [Square] 00000000000000000000000000000000:3C00428F8ABBC0B84F057CC19C26F8CF:\ 00000000000000000000000000000000 000102030405060708090A0B0C0D0E0F:7C3491D94994E70F0EC2E7A5CCB5A14F:\ 000102030405060708090A0B0C0D0E0F C76C696289898137077A4A59FAEEEA4D:88C6FF4B92604C6E66656B02DDAF9F40:\ 000102030405060708090A0B0C0D0E0F 21A5DBEE154B8F6D6FF33B98F448E95A:3388801F66E7FCC0BCE522A23A4F0C7F:\ 915F4619BE41B2516355A50110A9CE91 F7C013AC5B2B8952E5E554ABE9CED2D2:A1C0E9215141343DEC2B556942C92BDE:\ 783348E75AEB0F2FD7B169BB8DC16787 2F42B3B70369FC929AE068313F343A7A:3FBE6811B998CDF3E50ABDE2F3C075E3:\ DC49DB1375A5584F6485B413B5F12BAF 65C178B284D197CCD3F111A282F17F29:D7B7209E0879744C782809B6D2E0B1B0:\ 5269F149D41BA0152497574D7F153125 00000000000000000000000000000000:05F8AAFDEFB4F5F9C751E5B36C8A37D8:\ 80000000000000000000000000000000 0F1E2D3C4B5A69788796A5B4C3D2E1F0:1660060085C0E241F88462BFFBE67602:\ 00000000000000000000040000000000 0F1E2D3C4B5A69788796A5B4C3D2E1F0:92BFBBFCD2BBF54FFF06AF097893E9A3:\ 00000000000000000000000000000080 00000000000000000000000000000000:98CFB10F3ED70BB82CC90597B463A1F6:\ 00000000000000000000000000020000 00000000000000000000000000000000:A643A0CA5154A7D10B251D562D58EA53:\ 00000000000000000000000000800000 [TEA] 0000000000000000:41EA3A0A94BAA940:00000000000000000000000000000000 7C944D08DEF34C0C:195C0E8F49761539:271AD15192C4D1204A4A2561E3DB6FF7 B9682750BB15CAAD:2B5F318FB66806B9:F04EBF798C193F199C1F532AF383555B 9706769A18A2D03D:8E17EEB5008DC0CB:200C0CE59717D5D9AF6813CD207FEE73 EDB76C54847DA59E:DFA6C29BEB40F9AF:2828D51F98AE0B33F4DE2B7FBD18A529 178A49BAFBA53F23:C3BBCE6715D90CE6:61AABA6BE48B0D0D14FE5D27FAB852A4 DF4CDB61A5F38536:B4E6359C9D9458AA:2080E2409BA01C8532FC84403EE8C06A 7C944D08DEF34C0C:195C0E8F49761539:271AD15192C4D1204A4A2561E3DB6FF7 F4C76C1D47FE568F:551CA67C7756FF56:C1E297C0C761777D8A76FFF02D22B859 CAB16583E15D0074:DE472175D55372C9:23C807A2EF0A551F858FD52D125A47D8 97B05C60774164AD:BC4BD30CB50DA39B:9FA5D4D8CBDFCECD559E3CE88BF78EE1 7017A263985B735C:E47FDF06A51D8C24:24F4E91083139099D663647A7FFAC321 15475A90DF04CD29:4DF54282EAAFA235:7CF8626DE76D8462218ED5C9DC8ACC26 87CA0AACCF146CC8:F7360F57CFCC09AC:3C6AD7DF17332A3E1E3DE06007387357 9268AF048ECBAE67:E98E428A9D1FEE9C:24237A762D8A89383A2949F5A0F5EC08 AF0062CD77A84EBD:44CD624B87CBEE77:209A2833A39472D9720380FFB2F74761 F922CA875B991A31:1E92C0C51185F7C7:22EBE7A30E8855B3B453A6E926D4F187 B4ECC305C3DBD8E5:063D8F75A7A77501:1B5E23EBD915C1FEE59F57DD91AF7347 A4C2F6DC597D13EA:BF8FFEC7550A496B:6C21D105515290DA29339F142685C135 3AF7F1AE0F58AB1D:BBA581D07E51D8D6:01F728A7433A47B13DE34FCC08958449 791D8DA8CBB0BC94:7D9A4F0363B6085F:9A2D4C50337D3EC337673782FD385601 ABCDEF0198765432:58C7BA625ED42820:112233445566778899AABBCCDDEEFF01 AAAAAAAAAAAAAAAA:423251D460AEBE8E:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 6385ECC14C50C91F:D3A465910B0ECF46:88AD993684E3FE4C4D5DD8F1C0964D32 99532D57CC7FC724:A846FE0F9A698E32:69F9181A726912C2DFD815081209F9F6 A874F573DD7A8761:5055A546D119BFA7:79846B4ED899433C452EDED9D6925C7A CD58533F9F18C3F3:F5E649326A32F7BD:B0BB57B0E243DC91143DA8F235DCF9DB 65B4628A8A4ACC33:E2FAC5AB9B301983:6CDF16B8E08604C93A4BC86E269BA2EF 21244B2AA3071823:14F62A42C4BDA3E6:2203D8EFC29D3421981E0C2FAF90EA8C C6BBAD2319111D81:F4068832803914F7:86B435D9BF689FD450352308EDDA200A 38CD92C3E6882185:A3C3CE70D4A097E8:279243E8F5759FD3D29EF824D65B163B 56D1B5CB68ADBD3F:4E57696CAC39676C:95ADBC7D2F67A15C395605250AC1275F 1936713432D87C16:3D3E59CA7EDED044:4E760AF9B46E2C9EF75B7F5721EAFD60 A9AF22BFEA5639F1:D478E142344FCFAC:2C98241CD08DF0B269C8669E55F61227 8DEC08977A7F6D02:23F4A36A9D475299:B28F6B02B950BC924B03C39C672A8216 8535D9E669C2A7B8:30284672AF8877F1:F7A7B83FC8DF8868AB753F435B6E46DE 03682AB977DDDCD9:9F678A05F82E9326:1BC9B0A578D89DAE5A47F5704640CA4A 3A1A041F2F1B0FC7:A40CBAE926F0F13B:15C140E81E98AE10443AA43C89E5D52C [Twofish] 00000000000000000000000000000000:9F589F5CF6122C32B6BFEC2F2AE8C35A:\ 00000000000000000000000000000000 9F589F5CF6122C32B6BFEC2F2AE8C35A:D491DB16E7B1C39E86CB086B789F5419:\ 00000000000000000000000000000000 D491DB16E7B1C39E86CB086B789F5419:019F9809DE1711858FAAC3A3BA20FBC3:\ 9F589F5CF6122C32B6BFEC2F2AE8C35A 019F9809DE1711858FAAC3A3BA20FBC3:6363977DE839486297E661C6C9D668EB:\ D491DB16E7B1C39E86CB086B789F5419 6363977DE839486297E661C6C9D668EB:816D5BD0FAE35342BF2A7412C246F752:\ 019F9809DE1711858FAAC3A3BA20FBC3 816D5BD0FAE35342BF2A7412C246F752:5449ECA008FF5921155F598AF4CED4D0:\ 6363977DE839486297E661C6C9D668EB 5449ECA008FF5921155F598AF4CED4D0:6600522E97AEB3094ED5F92AFCBCDD10:\ 816D5BD0FAE35342BF2A7412C246F752 6600522E97AEB3094ED5F92AFCBCDD10:34C8A5FB2D3D08A170D120AC6D26DBFA:\ 5449ECA008FF5921155F598AF4CED4D0 34C8A5FB2D3D08A170D120AC6D26DBFA:28530B358C1B42EF277DE6D4407FC591:\ 6600522E97AEB3094ED5F92AFCBCDD10 28530B358C1B42EF277DE6D4407FC591:8A8AB983310ED78C8C0ECDE030B8DCA4:\ 34C8A5FB2D3D08A170D120AC6D26DBFA 8A8AB983310ED78C8C0ECDE030B8DCA4:48C758A6DFC1DD8B259FA165E1CE2B3C:\ 28530B358C1B42EF277DE6D4407FC591 48C758A6DFC1DD8B259FA165E1CE2B3C:CE73C65C101680BBC251C5C16ABCF214:\ 8A8AB983310ED78C8C0ECDE030B8DCA4 CE73C65C101680BBC251C5C16ABCF214:C7ABD74AA060F78B244E24C71342BA89:\ 48C758A6DFC1DD8B259FA165E1CE2B3C C7ABD74AA060F78B244E24C71342BA89:D0F8B3B6409EBCB666D29C916565ABFC:\ CE73C65C101680BBC251C5C16ABCF214 D0F8B3B6409EBCB666D29C916565ABFC:DD42662908070054544FE09DA4263130:\ C7ABD74AA060F78B244E24C71342BA89 DD42662908070054544FE09DA4263130:7007BACB42F7BF989CF30F78BC50EDCA:\ D0F8B3B6409EBCB666D29C916565ABFC 7007BACB42F7BF989CF30F78BC50EDCA:57B9A18EE97D90F435A16F69F0AC6F16:\ DD42662908070054544FE09DA4263130 57B9A18EE97D90F435A16F69F0AC6F16:06181F0D53267ABD8F3BB28455B198AD:\ 7007BACB42F7BF989CF30F78BC50EDCA 06181F0D53267ABD8F3BB28455B198AD:81A12D8449E9040BAAE7196338D8C8F2:\ 57B9A18EE97D90F435A16F69F0AC6F16 81A12D8449E9040BAAE7196338D8C8F2:BE422651C56F2622DA0201815A95A820:\ 06181F0D53267ABD8F3BB28455B198AD BE422651C56F2622DA0201815A95A820:113B19F2D778473990480CEE4DA238D1:\ 81A12D8449E9040BAAE7196338D8C8F2 113B19F2D778473990480CEE4DA238D1:E6942E9A86E544CF3E3364F20BE011DF:\ BE422651C56F2622DA0201815A95A820 E6942E9A86E544CF3E3364F20BE011DF:87CDC6AA487BFD0EA70188257D9B3859:\ 113B19F2D778473990480CEE4DA238D1 87CDC6AA487BFD0EA70188257D9B3859:D5E2701253DD75A11A4CFB243714BD14:\ E6942E9A86E544CF3E3364F20BE011DF D5E2701253DD75A11A4CFB243714BD14:FD24812EEA107A9E6FAB8EABE0F0F48C:\ 87CDC6AA487BFD0EA70188257D9B3859 FD24812EEA107A9E6FAB8EABE0F0F48C:DAFA84E31A297F372C3A807100CD783D:\ D5E2701253DD75A11A4CFB243714BD14 DAFA84E31A297F372C3A807100CD783D:A55ED2D955EC8950FC0CC93B76ACBF91:\ FD24812EEA107A9E6FAB8EABE0F0F48C A55ED2D955EC8950FC0CC93B76ACBF91:2ABEA2A4BF27ABDC6B6F278993264744:\ DAFA84E31A297F372C3A807100CD783D 2ABEA2A4BF27ABDC6B6F278993264744:045383E219321D5A4435C0E491E7DE10:\ A55ED2D955EC8950FC0CC93B76ACBF91 045383E219321D5A4435C0E491E7DE10:7460A4CD4F312F32B1C7A94FA004E934:\ 2ABEA2A4BF27ABDC6B6F278993264744 7460A4CD4F312F32B1C7A94FA004E934:6BBF9186D32C2C5895649D746566050A:\ 045383E219321D5A4435C0E491E7DE10 6BBF9186D32C2C5895649D746566050A:CDBDD19ACF40B8AC0328C80054266068:\ 7460A4CD4F312F32B1C7A94FA004E934 CDBDD19ACF40B8AC0328C80054266068:1D2836CAE4223EAB5066867A71B1A1C3:\ 6BBF9186D32C2C5895649D746566050A 1D2836CAE4223EAB5066867A71B1A1C3:2D7F37121D0D2416D5E2767FF202061B:\ CDBDD19ACF40B8AC0328C80054266068 2D7F37121D0D2416D5E2767FF202061B:D70736D1ABC7427A121CC816CD66D7FF:\ 1D2836CAE4223EAB5066867A71B1A1C3 D70736D1ABC7427A121CC816CD66D7FF:AC6CA71CBCBEDCC0EA849FB2E9377865:\ 2D7F37121D0D2416D5E2767FF202061B AC6CA71CBCBEDCC0EA849FB2E9377865:307265FF145CBBC7104B3E51C6C1D6B4:\ D70736D1ABC7427A121CC816CD66D7FF 307265FF145CBBC7104B3E51C6C1D6B4:934B7DB4B3544854DBCA81C4C5DE4EB1:\ AC6CA71CBCBEDCC0EA849FB2E9377865 934B7DB4B3544854DBCA81C4C5DE4EB1:18759824AD9823D5961F84377D7EAEBF:\ 307265FF145CBBC7104B3E51C6C1D6B4 18759824AD9823D5961F84377D7EAEBF:DEDDAC6029B01574D9BABB099DC6CA6C:\ 934B7DB4B3544854DBCA81C4C5DE4EB1 DEDDAC6029B01574D9BABB099DC6CA6C:5EA82EEA2244DED42CCA2F835D5615DF:\ 18759824AD9823D5961F84377D7EAEBF 5EA82EEA2244DED42CCA2F835D5615DF:1E3853F7FFA57091771DD8CDEE9414DE:\ DEDDAC6029B01574D9BABB099DC6CA6C 1E3853F7FFA57091771DD8CDEE9414DE:5C2EBBF75D31F30B5EA26EAC8782D8D1:\ 5EA82EEA2244DED42CCA2F835D5615DF 5C2EBBF75D31F30B5EA26EAC8782D8D1:3A3CFA1F13A136C94D76E5FA4A1109FF:\ 1E3853F7FFA57091771DD8CDEE9414DE 3A3CFA1F13A136C94D76E5FA4A1109FF:91630CF96003B8032E695797E313A553:\ 5C2EBBF75D31F30B5EA26EAC8782D8D1 91630CF96003B8032E695797E313A553:137A24CA47CD12BE818DF4D2F4355960:\ 3A3CFA1F13A136C94D76E5FA4A1109FF 137A24CA47CD12BE818DF4D2F4355960:BCA724A54533C6987E14AA827952F921:\ 91630CF96003B8032E695797E313A553 BCA724A54533C6987E14AA827952F921:6B459286F3FFD28D49F15B1581B08E42:\ 137A24CA47CD12BE818DF4D2F4355960 6B459286F3FFD28D49F15B1581B08E42:5D9D4EEFFA9151575524F115815A12E0:\ BCA724A54533C6987E14AA827952F921 00000000000000000000000000000000:EFA71F788965BD4453F860178FC19101:\ 000000000000000000000000000000000000000000000000 EFA71F788965BD4453F860178FC19101:88B2B2706B105E36B446BB6D731A1E88:\ 000000000000000000000000000000000000000000000000 88B2B2706B105E36B446BB6D731A1E88:39DA69D6BA4997D585B6DC073CA341B2:\ EFA71F788965BD4453F860178FC191010000000000000000 39DA69D6BA4997D585B6DC073CA341B2:182B02D81497EA45F9DAACDC29193A65:\ 88B2B2706B105E36B446BB6D731A1E88EFA71F788965BD44 182B02D81497EA45F9DAACDC29193A65:7AFF7A70CA2FF28AC31DD8AE5DAAAB63:\ 39DA69D6BA4997D585B6DC073CA341B288B2B2706B105E36 7AFF7A70CA2FF28AC31DD8AE5DAAAB63:D1079B789F666649B6BD7D1629F1F77E:\ 182B02D81497EA45F9DAACDC29193A6539DA69D6BA4997D5 D1079B789F666649B6BD7D1629F1F77E:3AF6F7CE5BD35EF18BEC6FA787AB506B:\ 7AFF7A70CA2FF28AC31DD8AE5DAAAB63182B02D81497EA45 3AF6F7CE5BD35EF18BEC6FA787AB506B:AE8109BFDA85C1F2C5038B34ED691BFF:\ D1079B789F666649B6BD7D1629F1F77E7AFF7A70CA2FF28A AE8109BFDA85C1F2C5038B34ED691BFF:893FD67B98C550073571BD631263FC78:\ 3AF6F7CE5BD35EF18BEC6FA787AB506BD1079B789F666649 893FD67B98C550073571BD631263FC78:16434FC9C8841A63D58700B5578E8F67:\ AE8109BFDA85C1F2C5038B34ED691BFF3AF6F7CE5BD35EF1 16434FC9C8841A63D58700B5578E8F67:9594CF62D48ACD347A68A3161F0F3EE7:\ 893FD67B98C550073571BD631263FC78AE8109BFDA85C1F2 9594CF62D48ACD347A68A3161F0F3EE7:B23E8C2C731C514017D1F2B88D77D208:\ 16434FC9C8841A63D58700B5578E8F67893FD67B98C55007 B23E8C2C731C514017D1F2B88D77D208:93CC592BC96D95FA8AC32DA894F6AB89:\ 9594CF62D48ACD347A68A3161F0F3EE716434FC9C8841A63 93CC592BC96D95FA8AC32DA894F6AB89:26516E6BD4AEF86AF4F4AD58FA41A14C:\ B23E8C2C731C514017D1F2B88D77D2089594CF62D48ACD34 26516E6BD4AEF86AF4F4AD58FA41A14C:00A8FFFAB8616BE710A6592438FC40BE:\ 93CC592BC96D95FA8AC32DA894F6AB89B23E8C2C731C5140 00A8FFFAB8616BE710A6592438FC40BE:A19B811C77482D97C842EC62DB2EDCCE:\ 26516E6BD4AEF86AF4F4AD58FA41A14C93CC592BC96D95FA A19B811C77482D97C842EC62DB2EDCCE:D7FF438678D818CAA26A676342F98E8B:\ 00A8FFFAB8616BE710A6592438FC40BE26516E6BD4AEF86A D7FF438678D818CAA26A676342F98E8B:84EAFFC0C091582ABB717086E0807A5F:\ A19B811C77482D97C842EC62DB2EDCCE00A8FFFAB8616BE7 84EAFFC0C091582ABB717086E0807A5F:5500AF1C79503FEF1BACF35A81DC2865:\ D7FF438678D818CAA26A676342F98E8BA19B811C77482D97 5500AF1C79503FEF1BACF35A81DC2865:7282B2F3E766C83664930A19D201D7E7:\ 84EAFFC0C091582ABB717086E0807A5FD7FF438678D818CA 7282B2F3E766C83664930A19D201D7E7:6796085C32FBDD2AB43E81EAC1262743:\ 5500AF1C79503FEF1BACF35A81DC286584EAFFC0C091582A 6796085C32FBDD2AB43E81EAC1262743:5839F9E148B9FD2B5A52751D4F178FDC:\ 7282B2F3E766C83664930A19D201D7E75500AF1C79503FEF 5839F9E148B9FD2B5A52751D4F178FDC:A88F34056742E55408A7A9E7B6D4C8C0:\ 6796085C32FBDD2AB43E81EAC12627437282B2F3E766C836 A88F34056742E55408A7A9E7B6D4C8C0:9C8C304CB1F937C6E42528459FA8872F:\ 5839F9E148B9FD2B5A52751D4F178FDC6796085C32FBDD2A 9C8C304CB1F937C6E42528459FA8872F:EA3668C0D96529A7F3BF0F7C2B5C5BE2:\ A88F34056742E55408A7A9E7B6D4C8C05839F9E148B9FD2B EA3668C0D96529A7F3BF0F7C2B5C5BE2:A8FB6EEFCAAF9C4041072D570984CED2:\ 9C8C304CB1F937C6E42528459FA8872FA88F34056742E554 A8FB6EEFCAAF9C4041072D570984CED2:ABF4662E5D50F71B15FE3B428AFE3500:\ EA3668C0D96529A7F3BF0F7C2B5C5BE29C8C304CB1F937C6 ABF4662E5D50F71B15FE3B428AFE3500:3B3AED23958DA6E2FA4493BCBE59A806:\ A8FB6EEFCAAF9C4041072D570984CED2EA3668C0D96529A7 3B3AED23958DA6E2FA4493BCBE59A806:CFBF446E33C3DCD4DD5161CA00D4BA8F:\ ABF4662E5D50F71B15FE3B428AFE3500A8FB6EEFCAAF9C40 CFBF446E33C3DCD4DD5161CA00D4BA8F:072ADBFA7EB962BA199AFC720339FF29:\ 3B3AED23958DA6E2FA4493BCBE59A806ABF4662E5D50F71B 072ADBFA7EB962BA199AFC720339FF29:AAB346D9123A8140AC563EF17E7054C8:\ CFBF446E33C3DCD4DD5161CA00D4BA8F3B3AED23958DA6E2 AAB346D9123A8140AC563EF17E7054C8:3C7DDC5FE6E5888FE61DEDA0C69CD320:\ 072ADBFA7EB962BA199AFC720339FF29CFBF446E33C3DCD4 3C7DDC5FE6E5888FE61DEDA0C69CD320:34AA645C7E3532098ADA91BB128ED821:\ AAB346D9123A8140AC563EF17E7054C8072ADBFA7EB962BA 34AA645C7E3532098ADA91BB128ED821:7A5D12E315038522DA01EC0834B1322C:\ 3C7DDC5FE6E5888FE61DEDA0C69CD320AAB346D9123A8140 7A5D12E315038522DA01EC0834B1322C:86E235A1CB091FF7FE6FBBCA0D73BE58:\ 34AA645C7E3532098ADA91BB128ED8213C7DDC5FE6E5888F 86E235A1CB091FF7FE6FBBCA0D73BE58:F3CE81CACE5D6BA9C558111DCDB22F5D:\ 7A5D12E315038522DA01EC0834B1322C34AA645C7E353209 F3CE81CACE5D6BA9C558111DCDB22F5D:FB30A5D67D5F5BE4048C77E2AD3BC9D1:\ 86E235A1CB091FF7FE6FBBCA0D73BE587A5D12E315038522 FB30A5D67D5F5BE4048C77E2AD3BC9D1:31E69DD3D2D90E81C9EBFAC257E9823D:\ F3CE81CACE5D6BA9C558111DCDB22F5D86E235A1CB091FF7 31E69DD3D2D90E81C9EBFAC257E9823D:87579B3F19A9CDE12BB882FFEAF665AE:\ FB30A5D67D5F5BE4048C77E2AD3BC9D1F3CE81CACE5D6BA9 87579B3F19A9CDE12BB882FFEAF665AE:24A8572AA844FEF25F7670FAE30F1CD2:\ 31E69DD3D2D90E81C9EBFAC257E9823DFB30A5D67D5F5BE4 24A8572AA844FEF25F7670FAE30F1CD2:0CFA32E5E33F3B2DAC9F34D25979319A:\ 87579B3F19A9CDE12BB882FFEAF665AE31E69DD3D2D90E81 0CFA32E5E33F3B2DAC9F34D25979319A:3C64D7FC881B9B82ABA21FF122B98F54:\ 24A8572AA844FEF25F7670FAE30F1CD287579B3F19A9CDE1 3C64D7FC881B9B82ABA21FF122B98F54:A794CAEE6756281B7A64894E4E4F70A8:\ 0CFA32E5E33F3B2DAC9F34D25979319A24A8572AA844FEF2 A794CAEE6756281B7A64894E4E4F70A8:89A9BF6B893BC5E6FEF4C77F3D0F29A6:\ 3C64D7FC881B9B82ABA21FF122B98F540CFA32E5E33F3B2D 89A9BF6B893BC5E6FEF4C77F3D0F29A6:5DBE44032769DF543EAD7AD13A5F3310:\ A794CAEE6756281B7A64894E4E4F70A83C64D7FC881B9B82 5DBE44032769DF543EAD7AD13A5F3310:DEA4F3DA75EC7A8EAC3861A9912402CD:\ 89A9BF6B893BC5E6FEF4C77F3D0F29A6A794CAEE6756281B DEA4F3DA75EC7A8EAC3861A9912402CD:FB66522C332FCC4C042ABE32FA9E902F:\ 5DBE44032769DF543EAD7AD13A5F331089A9BF6B893BC5E6 FB66522C332FCC4C042ABE32FA9E902F:F0AB73301125FA21EF70BE5385FB76B6:\ DEA4F3DA75EC7A8EAC3861A9912402CD5DBE44032769DF54 F0AB73301125FA21EF70BE5385FB76B6:E75449212BEEF9F4A390BD860A640941:\ FB66522C332FCC4C042ABE32FA9E902FDEA4F3DA75EC7A8E 00000000000000000000000000000000:57FF739D4DC92C1BD7FC01700CC8216F:\ 0000000000000000000000000000000000000000000000000000000000000000 57FF739D4DC92C1BD7FC01700CC8216F:D43BB7556EA32E46F2A282B7D45B4E0D:\ 0000000000000000000000000000000000000000000000000000000000000000 D43BB7556EA32E46F2A282B7D45B4E0D:90AFE91BB288544F2C32DC239B2635E6:\ 57FF739D4DC92C1BD7FC01700CC8216F00000000000000000000000000000000 90AFE91BB288544F2C32DC239B2635E6:6CB4561C40BF0A9705931CB6D408E7FA:\ D43BB7556EA32E46F2A282B7D45B4E0D57FF739D4DC92C1BD7FC01700CC8216F 6CB4561C40BF0A9705931CB6D408E7FA:3059D6D61753B958D92F4781C8640E58:\ 90AFE91BB288544F2C32DC239B2635E6D43BB7556EA32E46F2A282B7D45B4E0D 3059D6D61753B958D92F4781C8640E58:E69465770505D7F80EF68CA38AB3A3D6:\ 6CB4561C40BF0A9705931CB6D408E7FA90AFE91BB288544F2C32DC239B2635E6 E69465770505D7F80EF68CA38AB3A3D6:5AB67A5F8539A4A5FD9F0373BA463466:\ 3059D6D61753B958D92F4781C8640E586CB4561C40BF0A9705931CB6D408E7FA 5AB67A5F8539A4A5FD9F0373BA463466:DC096BCD99FC72F79936D4C748E75AF7:\ E69465770505D7F80EF68CA38AB3A3D63059D6D61753B958D92F4781C8640E58 DC096BCD99FC72F79936D4C748E75AF7:C5A3E7CEE0F1B7260528A68FB4EA05F2:\ 5AB67A5F8539A4A5FD9F0373BA463466E69465770505D7F80EF68CA38AB3A3D6 C5A3E7CEE0F1B7260528A68FB4EA05F2:43D5CEC327B24AB90AD34A79D0469151:\ DC096BCD99FC72F79936D4C748E75AF75AB67A5F8539A4A5FD9F0373BA463466 43D5CEC327B24AB90AD34A79D0469151:05BA7BE9BE5274FBEB4AC5FD5FAAFA10:\ C5A3E7CEE0F1B7260528A68FB4EA05F2DC096BCD99FC72F79936D4C748E75AF7 05BA7BE9BE5274FBEB4AC5FD5FAAFA10:89D513B989E3CECE4D2E3E4C15D4E01C:\ 43D5CEC327B24AB90AD34A79D0469151C5A3E7CEE0F1B7260528A68FB4EA05F2 89D513B989E3CECE4D2E3E4C15D4E01C:E56E462AE2E66F800CE2224C4CAFACBE:\ 05BA7BE9BE5274FBEB4AC5FD5FAAFA1043D5CEC327B24AB90AD34A79D0469151 E56E462AE2E66F800CE2224C4CAFACBE:F5DBEE5414D79CA46BE17346FDC72BF5:\ 89D513B989E3CECE4D2E3E4C15D4E01C05BA7BE9BE5274FBEB4AC5FD5FAAFA10 F5DBEE5414D79CA46BE17346FDC72BF5:C780FC28815E667B3D224ECF1F4A7D65:\ E56E462AE2E66F800CE2224C4CAFACBE89D513B989E3CECE4D2E3E4C15D4E01C C780FC28815E667B3D224ECF1F4A7D65:2EF17A0D75440ECEC9AF18D29ABA3CDA:\ F5DBEE5414D79CA46BE17346FDC72BF5E56E462AE2E66F800CE2224C4CAFACBE 2EF17A0D75440ECEC9AF18D29ABA3CDA:D653FDFF96BCF89A929F6377AB41967A:\ C780FC28815E667B3D224ECF1F4A7D65F5DBEE5414D79CA46BE17346FDC72BF5 D653FDFF96BCF89A929F6377AB41967A:36BBAD8838380C8793A7AEA0A11D04D2:\ 2EF17A0D75440ECEC9AF18D29ABA3CDAC780FC28815E667B3D224ECF1F4A7D65 36BBAD8838380C8793A7AEA0A11D04D2:034EFECFC0EFC00D82C3345A8708AE78:\ D653FDFF96BCF89A929F6377AB41967A2EF17A0D75440ECEC9AF18D29ABA3CDA 034EFECFC0EFC00D82C3345A8708AE78:EA38887307337A2934A9EB802F6CFDDD:\ 36BBAD8838380C8793A7AEA0A11D04D2D653FDFF96BCF89A929F6377AB41967A EA38887307337A2934A9EB802F6CFDDD:7C279D47775AB4C26442E8A117943DD8:\ 034EFECFC0EFC00D82C3345A8708AE7836BBAD8838380C8793A7AEA0A11D04D2 7C279D47775AB4C26442E8A117943DD8:E3CF581056EBC1169CF451E930308726:\ EA38887307337A2934A9EB802F6CFDDD034EFECFC0EFC00D82C3345A8708AE78 E3CF581056EBC1169CF451E930308726:65527B29D489C8CDDC62E5E7FFC4E924:\ 7C279D47775AB4C26442E8A117943DD8EA38887307337A2934A9EB802F6CFDDD 65527B29D489C8CDDC62E5E7FFC4E924:3B491F930230A0170819CACB48F9030C:\ E3CF581056EBC1169CF451E9303087267C279D47775AB4C26442E8A117943DD8 3B491F930230A0170819CACB48F9030C:A7C8193F35AF63B51D7F9DEDCEC85866:\ 65527B29D489C8CDDC62E5E7FFC4E924E3CF581056EBC1169CF451E930308726 A7C8193F35AF63B51D7F9DEDCEC85866:009A48F9A1C27F9AA5F9BD909C848B60:\ 3B491F930230A0170819CACB48F9030C65527B29D489C8CDDC62E5E7FFC4E924 009A48F9A1C27F9AA5F9BD909C848B60:3B507E987B3F827A093B26C85CDFF6C6:\ A7C8193F35AF63B51D7F9DEDCEC858663B491F930230A0170819CACB48F9030C 3B507E987B3F827A093B26C85CDFF6C6:EAFB3BA6C78E37214FE908669BC24F6F:\ 009A48F9A1C27F9AA5F9BD909C848B60A7C8193F35AF63B51D7F9DEDCEC85866 EAFB3BA6C78E37214FE908669BC24F6F:2B09F10D7F2B62A4D0DAFFB9F882B980:\ 3B507E987B3F827A093B26C85CDFF6C6009A48F9A1C27F9AA5F9BD909C848B60 2B09F10D7F2B62A4D0DAFFB9F882B980:E6B9FE907009B2DC649412DD630AE576:\ EAFB3BA6C78E37214FE908669BC24F6F3B507E987B3F827A093B26C85CDFF6C6 E6B9FE907009B2DC649412DD630AE576:F2E4DC89724CD58F85847BD09ED4500F:\ 2B09F10D7F2B62A4D0DAFFB9F882B980EAFB3BA6C78E37214FE908669BC24F6F F2E4DC89724CD58F85847BD09ED4500F:DC650444FCEBC2BD6E450EF4605FCABE:\ E6B9FE907009B2DC649412DD630AE5762B09F10D7F2B62A4D0DAFFB9F882B980 DC650444FCEBC2BD6E450EF4605FCABE:B7CFB31755FDA2AB0A67FBA09901A73E:\ F2E4DC89724CD58F85847BD09ED4500FE6B9FE907009B2DC649412DD630AE576 B7CFB31755FDA2AB0A67FBA09901A73E:9C7E7578F3D2923DCDABFED0A5EF86EE:\ DC650444FCEBC2BD6E450EF4605FCABEF2E4DC89724CD58F85847BD09ED4500F 9C7E7578F3D2923DCDABFED0A5EF86EE:9465E9AE176483BD398C8033AA136F68:\ B7CFB31755FDA2AB0A67FBA09901A73EDC650444FCEBC2BD6E450EF4605FCABE 9465E9AE176483BD398C8033AA136F68:8551279DE9991805FCFC1937C52AE9D4:\ 9C7E7578F3D2923DCDABFED0A5EF86EEB7CFB31755FDA2AB0A67FBA09901A73E 8551279DE9991805FCFC1937C52AE9D4:A830EB8DA52ECFF7F93B7627322CF9D7:\ 9465E9AE176483BD398C8033AA136F689C7E7578F3D2923DCDABFED0A5EF86EE A830EB8DA52ECFF7F93B7627322CF9D7:EC89F0E5155425D4B92BD4B200C1A6E0:\ 8551279DE9991805FCFC1937C52AE9D49465E9AE176483BD398C8033AA136F68 EC89F0E5155425D4B92BD4B200C1A6E0:8AF76A782061D38360C6C3CDDCBE1516:\ A830EB8DA52ECFF7F93B7627322CF9D78551279DE9991805FCFC1937C52AE9D4 8AF76A782061D38360C6C3CDDCBE1516:D4EEAA6A069659D5D88590DE75515631:\ EC89F0E5155425D4B92BD4B200C1A6E0A830EB8DA52ECFF7F93B7627322CF9D7 D4EEAA6A069659D5D88590DE75515631:259C021D37B077197B80FCDB07EA1AF2:\ 8AF76A782061D38360C6C3CDDCBE1516EC89F0E5155425D4B92BD4B200C1A6E0 259C021D37B077197B80FCDB07EA1AF2:300CC8B4171F0E9BD75710FAD033C570:\ D4EEAA6A069659D5D88590DE755156318AF76A782061D38360C6C3CDDCBE1516 300CC8B4171F0E9BD75710FAD033C570:5CFA5BD213A74F02E65390A4C14A1DF6:\ 259C021D37B077197B80FCDB07EA1AF2D4EEAA6A069659D5D88590DE75515631 5CFA5BD213A74F02E65390A4C14A1DF6:A443EA1B2C5747CE7EC5F21D4FE0C147:\ 300CC8B4171F0E9BD75710FAD033C570259C021D37B077197B80FCDB07EA1AF2 A443EA1B2C5747CE7EC5F21D4FE0C147:D2DED73E59319A8138E0331F0EA149EA:\ 5CFA5BD213A74F02E65390A4C14A1DF6300CC8B4171F0E9BD75710FAD033C570 D2DED73E59319A8138E0331F0EA149EA:2E2158BC3E5FC714C1EEECA0EA696D48:\ A443EA1B2C5747CE7EC5F21D4FE0C1475CFA5BD213A74F02E65390A4C14A1DF6 2E2158BC3E5FC714C1EEECA0EA696D48:248A7F3528B168ACFDD1386E3F51E30C:\ D2DED73E59319A8138E0331F0EA149EAA443EA1B2C5747CE7EC5F21D4FE0C147 248A7F3528B168ACFDD1386E3F51E30C:431058F4DBC7F734DA4F02F04CC4F459:\ 2E2158BC3E5FC714C1EEECA0EA696D48D2DED73E59319A8138E0331F0EA149EA 431058F4DBC7F734DA4F02F04CC4F459:37FE26FF1CF66175F5DDF4C33B97A205:\ 248A7F3528B168ACFDD1386E3F51E30C2E2158BC3E5FC714C1EEECA0EA696D48 00000000000000000000000000000000:6BFD32804A1C3206C4BF85EB11241F89:\ 80000000000000000000000000000000 00000000000000000000000000000000:F097147AE851845984DC97D5FAE40CF9:\ 40000000000000000000000000000000 00000000000000000000000000000000:6117F1977C5ABD9647C56544D9458444:\ 20000000000000000000000000000000 00000000000000000000000000000000:75A6240AAE357DEDDF99936705618284:\ 10000000000000000000000000000000 00000000000000000000000000000000:F026BFDF6BFBC7E50C46C533BD271C24:\ 08000000000000000000000000000000 00000000000000000000000000000000:F3023228D77045D37D1B9CD77437395A:\ 04000000000000000000000000000000 00000000000000000000000000000000:F67467BF6B490209809714D50679B2D7:\ 02000000000000000000000000000000 00000000000000000000000000000000:2C8431B922C5F560095E9867B1A41256:\ 01000000000000000000000000000000 00000000000000000000000000000000:1FB76E90D207BA4C770F67284D6B1359:\ 00800000000000000000000000000000 00000000000000000000000000000000:A70AECE1D41DCA9F24BCE8393F6D54BF:\ 00400000000000000000000000000000 00000000000000000000000000000000:D4580FC395979689221C57A23598358B:\ 00200000000000000000000000000000 00000000000000000000000000000000:35CA62BA8126F015FABFEF8F9119AE6B:\ 00100000000000000000000000000000 00000000000000000000000000000000:C81FACB16E087EEFA823CF34E02FE482:\ 00080000000000000000000000000000 00000000000000000000000000000000:07400F04E4CC6625AE3FB41ECC863F2A:\ 00040000000000000000000000000000 00000000000000000000000000000000:A0941008068D401DEAB6400C86CA53AD:\ 00020000000000000000000000000000 00000000000000000000000000000000:2B63BEF50BA87A58BFFCA4CF44C22927:\ 00010000000000000000000000000000 00000000000000000000000000000000:FD49069AE9F1874A264A7BFD894ED886:\ 00008000000000000000000000000000 00000000000000000000000000000000:232755C754075BB5CC5B85ABFEA38779:\ 00004000000000000000000000000000 00000000000000000000000000000000:41358B9C76E959037E13F7E5050E0B42:\ 00002000000000000000000000000000 00000000000000000000000000000000:8978CD09C054BB1ABDFFBED09D1CF7EC:\ 00001000000000000000000000000000 00000000000000000000000000000000:9F2A7CE5FD51FD5D7E2D42407EEF8F6A:\ 00000800000000000000000000000000 00000000000000000000000000000000:6AA2F0627F312A77C68D1F15DF0E1379:\ 00000400000000000000000000000000 00000000000000000000000000000000:BCD56984E45DBF087BAC8757FC4EFF5A:\ 00000200000000000000000000000000 00000000000000000000000000000000:9D3C6C8ED48C9DE7A64CD05D8BF41D54:\ 00000100000000000000000000000000 00000000000000000000000000000000:FCD577A23F455ACDE3732C262EBD2D86:\ 00000080000000000000000000000000 00000000000000000000000000000000:022E2430D81858888C9E575411D4064F:\ 00000040000000000000000000000000 00000000000000000000000000000000:5742CA8CF1193491C1FBC148627D856E:\ 00000020000000000000000000000000 00000000000000000000000000000000:88BD93610040DFE248C2FE05EF9F4FE0:\ 00000010000000000000000000000000 00000000000000000000000000000000:29A9D577BB3824209FEA64128247CE6C:\ 00000008000000000000000000000000 00000000000000000000000000000000:AC4CDB534844EA86000B845FCDAD605F:\ 00000004000000000000000000000000 00000000000000000000000000000000:AAC6098597D46B8145A60F40D4EC5308:\ 00000002000000000000000000000000 00000000000000000000000000000000:3A7DFD0855A5BE0B16CACBD685FACEF5:\ 00000001000000000000000000000000 00000000000000000000000000000000:ACEBA627EBA87AD051C3E0CA0DEF6CD7:\ 00000000800000000000000000000000 00000000000000000000000000000000:F0A55DCDBC513EFDD603EA455EB9228C:\ 00000000400000000000000000000000 00000000000000000000000000000000:2176DEBC78D6B4A6D0FB37AFA6B51081:\ 00000000200000000000000000000000 00000000000000000000000000000000:FDB1B57379B85A85392613E8B4597B63:\ 00000000100000000000000000000000 00000000000000000000000000000000:58AB1112E0598586E07FC8359DDFC7EC:\ 00000000080000000000000000000000 00000000000000000000000000000000:DD6D1D2629F333528CB66869453BC273:\ 00000000040000000000000000000000 00000000000000000000000000000000:932218D99553BB2D4BFC69F1EA67CAAE:\ 00000000020000000000000000000000 00000000000000000000000000000000:399D066426F7FEF66F8983086DC044D8:\ 00000000010000000000000000000000 00000000000000000000000000000000:3E1BC58269B6B8C8C8D00806975F8337:\ 00000000008000000000000000000000 00000000000000000000000000000000:D50A1F966058C6D702D1AFCD700DA0E8:\ 00000000004000000000000000000000 00000000000000000000000000000000:6E7A6BB3554F12AD1F88C289D621CD0F:\ 00000000002000000000000000000000 00000000000000000000000000000000:9ED4EA506A0CBA89B246C14D1B5B96A9:\ 00000000001000000000000000000000 00000000000000000000000000000000:C395A92C1A6884857B263F01F43542DB:\ 00000000000800000000000000000000 00000000000000000000000000000000:06562AC497C60F802B68B47DB5B86B6A:\ 00000000000400000000000000000000 00000000000000000000000000000000:255A726F2106177FEFA7006BDE05D059:\ 00000000000200000000000000000000 00000000000000000000000000000000:B8FD6A8227D0565A4C174AD270EC1205:\ 00000000000100000000000000000000 00000000000000000000000000000000:C2652FDB48B9DDBFC43B3F7CDD831D6F:\ 00000000000080000000000000000000 00000000000000000000000000000000:913EB9205DB2E17A96A23A724EDF4C84:\ 00000000000040000000000000000000 00000000000000000000000000000000:9A6694FEB5EA44FF0572124FDB265658:\ 00000000000020000000000000000000 00000000000000000000000000000000:E347498DECA6B211C30E21FD0B47A333:\ 00000000000010000000000000000000 00000000000000000000000000000000:E70F0D4ED829A81E05D42E511EDE9376:\ 00000000000008000000000000000000 00000000000000000000000000000000:140BB7CAD8D6A3553BEF7A3D52347BD8:\ 00000000000004000000000000000000 00000000000000000000000000000000:5FA55360F440DCCA20925A3E15B42764:\ 00000000000002000000000000000000 00000000000000000000000000000000:6D5B969DFC3EA0A6682CC66488D221DA:\ 00000000000001000000000000000000 00000000000000000000000000000000:E2799D5C380B49D2F6997009079D03D3:\ 00000000000000800000000000000000 00000000000000000000000000000000:06AFBD8077909E847AF467BB2D47E893:\ 00000000000000400000000000000000 00000000000000000000000000000000:46B1EB96EC9EB10897F1562E59287253:\ 00000000000000200000000000000000 00000000000000000000000000000000:1793F1D4E1A1606F99C7019C19E85129:\ 00000000000000100000000000000000 00000000000000000000000000000000:ED785D0BA19553CE73B69F4D570C3A9D:\ 00000000000000080000000000000000 00000000000000000000000000000000:298DF7334670B7391BE203DF7E8890C7:\ 00000000000000040000000000000000 00000000000000000000000000000000:150C12DEF6EDC844B0B45361C2B3AECE:\ 00000000000000020000000000000000 00000000000000000000000000000000:06FFB5E13438BA8DBD8A3EDADFAC73A1:\ 00000000000000010000000000000000 00000000000000000000000000000000:6C5E5719D5F31E929FF9C44F086EFADB:\ 00000000000000008000000000000000 00000000000000000000000000000000:4C8D0E13996F4D32CB7984B7BB1B34FB:\ 00000000000000004000000000000000 00000000000000000000000000000000:C9BDCFFD4B9F3BBBB33A2D2C51BA83F6:\ 00000000000000002000000000000000 00000000000000000000000000000000:929B29DD0D952161FFDA8CB417B166EC:\ 00000000000000001000000000000000 00000000000000000000000000000000:87F9DFCB07275916E7A446D3DCE74232:\ 00000000000000000800000000000000 00000000000000000000000000000000:6FDFD0BC8F49BE420CD68A894C7CA4E9:\ 00000000000000000400000000000000 00000000000000000000000000000000:CDDC09DE42DC2CBCD9287A2072A30D23:\ 00000000000000000200000000000000 00000000000000000000000000000000:9B2FF668BA9D77AD1E9F30BA0173EBD4:\ 00000000000000000100000000000000 00000000000000000000000000000000:DEF29890D59A511B32A30322D7471E38:\ 00000000000000000080000000000000 00000000000000000000000000000000:5094EAEC9F23D0DBFAB8240A42ED5BF1:\ 00000000000000000040000000000000 00000000000000000000000000000000:79CB87BC375F58DE8DA780B9BAD3DEA3:\ 00000000000000000020000000000000 00000000000000000000000000000000:7139B3D980B85D3B77A3BBDB6CB79756:\ 00000000000000000010000000000000 00000000000000000000000000000000:148ED6E8FEC02168377C96956AE18D93:\ 00000000000000000008000000000000 00000000000000000000000000000000:0AFED5A710F2BF11C77F152951AE32CB:\ 00000000000000000004000000000000 00000000000000000000000000000000:C265AC354817550FAE12A51C2DCD749C:\ 00000000000000000002000000000000 00000000000000000000000000000000:A3B089F79D0A07EA0893BB48D508B35B:\ 00000000000000000001000000000000 00000000000000000000000000000000:C0A7B6BCE0675A48E95D39A7659CB20A:\ 00000000000000000000800000000000 00000000000000000000000000000000:6CE0A0BA02041CB5E6C0A46DE1B71A43:\ 00000000000000000000400000000000 00000000000000000000000000000000:E54045C33A386555C5754ADB0A181244:\ 00000000000000000000200000000000 00000000000000000000000000000000:BB652196955BB7BE7E8CB8E2E992A750:\ 00000000000000000000100000000000 00000000000000000000000000000000:594B2917DE6119B62BE3DDF10A1A47E0:\ 00000000000000000000080000000000 00000000000000000000000000000000:E8B4F95053617F6A10120DB196AAC4D1:\ 00000000000000000000040000000000 00000000000000000000000000000000:79646B1CC19708973215B9891A2C1019:\ 00000000000000000000020000000000 00000000000000000000000000000000:5E7E6175F6B548E5389C1B1C391CBEE2:\ 00000000000000000000010000000000 00000000000000000000000000000000:C0860A7B47544872B9DB5C220088DE5C:\ 00000000000000000000008000000000 00000000000000000000000000000000:325163F073E5A27EBAF339B1FA53682D:\ 00000000000000000000004000000000 00000000000000000000000000000000:1A0C4583CEFF5810F3AB42A471415A1D:\ 00000000000000000000002000000000 00000000000000000000000000000000:F8DDF239D19363957C7C8C9B537893FA:\ 00000000000000000000001000000000 00000000000000000000000000000000:D3B9999669509564741F236EEF2401F3:\ 00000000000000000000000800000000 00000000000000000000000000000000:3376DA406D82B76591B610C6C9FC3F9E:\ 00000000000000000000000400000000 00000000000000000000000000000000:B6AD728D2970637642723FF06204EEAD:\ 00000000000000000000000200000000 00000000000000000000000000000000:0ADF4A82FFE602BC13002AA8AB24EA71:\ 00000000000000000000000100000000 00000000000000000000000000000000:D80D1378E30036D92B4A359F68D0CBFE:\ 00000000000000000000000080000000 00000000000000000000000000000000:EDA13B315897290E4ACEB4B513E9749B:\ 00000000000000000000000040000000 00000000000000000000000000000000:34589936B79E4F43260DC6CCD1820D6D:\ 00000000000000000000000020000000 00000000000000000000000000000000:C7A8FF65CD38D008EC6745897E010122:\ 00000000000000000000000010000000 00000000000000000000000000000000:3AFE23D89E79E9F8A54F103ED51EB14D:\ 00000000000000000000000008000000 00000000000000000000000000000000:27994D1AA909806C7CC8E4AC4CD5479B:\ 00000000000000000000000004000000 00000000000000000000000000000000:610D5528725B34FD70ADC66E83BAE266:\ 00000000000000000000000002000000 00000000000000000000000000000000:3A3064DFF6E0B54D864E81FA76270065:\ 00000000000000000000000001000000 00000000000000000000000000000000:5E9B5966ED3A2358005C9773F8690AD9:\ 00000000000000000000000000800000 00000000000000000000000000000000:713738F580CED6E358D2CDCEDA64F99F:\ 00000000000000000000000000400000 00000000000000000000000000000000:EC7FE3578906291B2DCF0AD7FF8B5358:\ 00000000000000000000000000200000 00000000000000000000000000000000:0F714C096C244BED865A9E064576FE5D:\ 00000000000000000000000000100000 00000000000000000000000000000000:B7C226C60B6F3031A1E2160823A62679:\ 00000000000000000000000000080000 00000000000000000000000000000000:5C78C4BC8F15DC964FE9EC75203AD7D8:\ 00000000000000000000000000040000 00000000000000000000000000000000:178FB7443FBD17DCF1AF122D4D117239:\ 00000000000000000000000000020000 00000000000000000000000000000000:C55C99851BD135155A080A9C4E54B919:\ 00000000000000000000000000010000 00000000000000000000000000000000:AD75C80D72EA278B3EDE380DAAB1F708:\ 00000000000000000000000000008000 00000000000000000000000000000000:95054D1ECA74F75515AE8C17941D3A54:\ 00000000000000000000000000004000 00000000000000000000000000000000:8E0B0D4F95C9C9D65420B4B1869A1D3E:\ 00000000000000000000000000002000 00000000000000000000000000000000:7712EA2F0598CC8CFB9A934DEC848B5F:\ 00000000000000000000000000001000 00000000000000000000000000000000:9D730E0F7450183C0804D6817CBE058E:\ 00000000000000000000000000000800 00000000000000000000000000000000:3FA52E9B242F9AF61322FBB6BA583A01:\ 00000000000000000000000000000400 00000000000000000000000000000000:3D47D74F667D60458188922EE8D8A7A0:\ 00000000000000000000000000000200 00000000000000000000000000000000:036B4E4E02D84C56AC61007DAC33EC33:\ 00000000000000000000000000000100 00000000000000000000000000000000:4E171141E51234DE6E4B236643A6DC85:\ 00000000000000000000000000000080 00000000000000000000000000000000:DB720E7B04462829DFA258ED9E7C7F2F:\ 00000000000000000000000000000040 00000000000000000000000000000000:8B10E11115FF4336DE57F2EA13AABBFA:\ 00000000000000000000000000000020 00000000000000000000000000000000:F0E35BFF226C064E08368AF440298DB9:\ 00000000000000000000000000000010 00000000000000000000000000000000:6C4C8811B4DF74F2A7D7F79A6253CEA7:\ 00000000000000000000000000000008 00000000000000000000000000000000:7DD12AD3BC7A419F92753D8CC39637F0:\ 00000000000000000000000000000004 00000000000000000000000000000000:A465B01EA32B2F4F87C85FD06F9B0A02:\ 00000000000000000000000000000002 00000000000000000000000000000000:8DC902DDAE09F52B1A3A77EE89C1441E:\ 00000000000000000000000000000001 00000000000000000000000000000000:B5AED133641004F4121B66E7DB8F2FF0:\ 800000000000000000000000000000000000000000000000 00000000000000000000000000000000:998110F200555A32C6C123E66CF87DE9:\ 400000000000000000000000000000000000000000000000 00000000000000000000000000000000:2DBAEEEC682DCC957C2D51B0990E123A:\ 200000000000000000000000000000000000000000000000 00000000000000000000000000000000:BAEC0A31F6557D6D13B888A94F63058C:\ 100000000000000000000000000000000000000000000000 00000000000000000000000000000000:E51ADC9773E785730586E6812A0F0FA5:\ 080000000000000000000000000000000000000000000000 00000000000000000000000000000000:97067E60FE010AEEA48C0D3224AD0941:\ 040000000000000000000000000000000000000000000000 00000000000000000000000000000000:BB73A7C859E6377A5E42EFCD55CD2C5B:\ 020000000000000000000000000000000000000000000000 00000000000000000000000000000000:914BFE25D7FDEE49B46FB5C2B60DACA5:\ 010000000000000000000000000000000000000000000000 00000000000000000000000000000000:EFEF0047892A043A1D594118477CA513:\ 008000000000000000000000000000000000000000000000 00000000000000000000000000000000:BE59CF7C4E4B482843E67B4EB65B3038:\ 004000000000000000000000000000000000000000000000 00000000000000000000000000000000:35FFC8038CB124B8078EC5C7C7928F14:\ 002000000000000000000000000000000000000000000000 00000000000000000000000000000000:086025FC1CC6056367304C51DE871DEA:\ 001000000000000000000000000000000000000000000000 00000000000000000000000000000000:950F0B7BDFFC78AE3AFF022F78E1670E:\ 000800000000000000000000000000000000000000000000 00000000000000000000000000000000:CADF4568B43C950FB688C6608AAF5FAE:\ 000400000000000000000000000000000000000000000000 00000000000000000000000000000000:E2313E3CFCB5E745EBAB983BF2867579:\ 000200000000000000000000000000000000000000000000 00000000000000000000000000000000:B4394412F7B4A1A4A22B73C93BAFD85D:\ 000100000000000000000000000000000000000000000000 00000000000000000000000000000000:C014C9A992E6366B3BD2EABDF1508187:\ 000080000000000000000000000000000000000000000000 00000000000000000000000000000000:4344D702AC78A5808F4AB566D5509B75:\ 000040000000000000000000000000000000000000000000 00000000000000000000000000000000:937893DA40E9D7F2ECE9028FAA4DE6A4:\ 000020000000000000000000000000000000000000000000 00000000000000000000000000000000:E77874759C6AACB611B715A52A37234A:\ 000010000000000000000000000000000000000000000000 00000000000000000000000000000000:841FC7FC0EF6CE08CFC6056B3C557F23:\ 000008000000000000000000000000000000000000000000 00000000000000000000000000000000:6AC04A6988F1CE601E4C48241D42C1CF:\ 000004000000000000000000000000000000000000000000 00000000000000000000000000000000:5254F42B5DD207461693C278B6ABC855:\ 000002000000000000000000000000000000000000000000 00000000000000000000000000000000:F58B1AE230B417541649CB035FB5231C:\ 000001000000000000000000000000000000000000000000 00000000000000000000000000000000:5F015060D28C6CCB2E5FDCB5AFDCF309:\ 000000800000000000000000000000000000000000000000 00000000000000000000000000000000:B0DBAA257FEFFE48A688FE247D0460B7:\ 000000400000000000000000000000000000000000000000 00000000000000000000000000000000:1235DF200338F96E39E881484B6B11EE:\ 000000200000000000000000000000000000000000000000 00000000000000000000000000000000:671D87102E35609B32F40A91A7E29E04:\ 000000100000000000000000000000000000000000000000 00000000000000000000000000000000:F01FB3FA3E84DEA6057F3D88CD651876:\ 000000080000000000000000000000000000000000000000 00000000000000000000000000000000:B96C1E40D0D407ED90D11892503A296F:\ 000000040000000000000000000000000000000000000000 00000000000000000000000000000000:2E27350191DE6C2E9DCC51022A3C96CB:\ 000000020000000000000000000000000000000000000000 00000000000000000000000000000000:BDD6CFE5D00E7F8D698143E653A0163B:\ 000000010000000000000000000000000000000000000000 00000000000000000000000000000000:FEDABEF20F51910E57CF5ECEF878A8E1:\ 000000008000000000000000000000000000000000000000 00000000000000000000000000000000:EEBF9FE247A78C6FF2A91428C54D70DA:\ 000000004000000000000000000000000000000000000000 00000000000000000000000000000000:41714E55E90E0E154802FBBFC0BF58C5:\ 000000002000000000000000000000000000000000000000 00000000000000000000000000000000:69480F26BC5DFF8F6D8A0F10E0959BF1:\ 000000001000000000000000000000000000000000000000 00000000000000000000000000000000:A39E4BE5A7E13BA3C48CFD98A52CFA70:\ 000000000800000000000000000000000000000000000000 00000000000000000000000000000000:95809A16888FB49F5053375A6533CD58:\ 000000000400000000000000000000000000000000000000 00000000000000000000000000000000:5F0DEF37FB14F956BB31703F1FC968EB:\ 000000000200000000000000000000000000000000000000 00000000000000000000000000000000:CF0A28C9598D7BBCA6992238B03EF4EB:\ 000000000100000000000000000000000000000000000000 00000000000000000000000000000000:7FF241BA32E6878542978957F137856F:\ 000000000080000000000000000000000000000000000000 00000000000000000000000000000000:8D489E0496B54F91A0254E4103804145:\ 000000000040000000000000000000000000000000000000 00000000000000000000000000000000:9925949BE93F4A0BF4114CCA2E05B566:\ 000000000020000000000000000000000000000000000000 00000000000000000000000000000000:6ED9A5F014FAFAE3D05C4AE027066873:\ 000000000010000000000000000000000000000000000000 00000000000000000000000000000000:958453307A371EE2D3DA8DD327D9B51B:\ 000000000008000000000000000000000000000000000000 00000000000000000000000000000000:1EE0680BF9A798A1C63636EA917B17B5:\ 000000000004000000000000000000000000000000000000 00000000000000000000000000000000:C0CEFB2475B21AA8937E3048604D9928:\ 000000000002000000000000000000000000000000000000 00000000000000000000000000000000:9034DDEFF43C9CC82FADE8DE0A2476BB:\ 000000000001000000000000000000000000000000000000 00000000000000000000000000000000:09D32779D0C8D02E0670F377187756FC:\ 000000000000800000000000000000000000000000000000 00000000000000000000000000000000:6557BDB19F03E62D823C0613BEA0FAFB:\ 000000000000400000000000000000000000000000000000 00000000000000000000000000000000:83505664DED694967F2D9E7853BC4B43:\ 000000000000200000000000000000000000000000000000 00000000000000000000000000000000:0BBABE3B7F381C3B3D8A9D846D8CCEAC:\ 000000000000100000000000000000000000000000000000 00000000000000000000000000000000:E3AA0A67CDF79DBAB013103E39E8C822:\ 000000000000080000000000000000000000000000000000 00000000000000000000000000000000:AF3D0C9B673C322355480E8681237D13:\ 000000000000040000000000000000000000000000000000 00000000000000000000000000000000:60D325226EC8DFB9E08DFADB479649A0:\ 000000000000020000000000000000000000000000000000 00000000000000000000000000000000:845B92A3C56880E8007B452B57B73B75:\ 000000000000010000000000000000000000000000000000 00000000000000000000000000000000:76C59CD9185C518D65EC641EB73C6387:\ 000000000000008000000000000000000000000000000000 00000000000000000000000000000000:735567D0B8A52203492220804F3D62E6:\ 000000000000004000000000000000000000000000000000 00000000000000000000000000000000:E74FB07622191A053368131DA36FC299:\ 000000000000002000000000000000000000000000000000 00000000000000000000000000000000:3CFF40E0E9A86F67D938D2483BDD08F0:\ 000000000000001000000000000000000000000000000000 00000000000000000000000000000000:7C502AE730F5A9ABEACB15240EA1E8F6:\ 000000000000000800000000000000000000000000000000 00000000000000000000000000000000:0B3CA10C02E24BA82261E65BE4413512:\ 000000000000000400000000000000000000000000000000 00000000000000000000000000000000:F7D50E95931755A98B143AE254090F9D:\ 000000000000000200000000000000000000000000000000 00000000000000000000000000000000:A4E84B8A7B8CC3766307D66A9C6AECB9:\ 000000000000000100000000000000000000000000000000 00000000000000000000000000000000:5298367E93E9B9CB5CF402A8BA9EFC62:\ 000000000000000080000000000000000000000000000000 00000000000000000000000000000000:03D44830C40510CE7866FB86FAC6E1DC:\ 000000000000000040000000000000000000000000000000 00000000000000000000000000000000:978E4BA4EEA6739B1769FF4389F0367E:\ 000000000000000020000000000000000000000000000000 00000000000000000000000000000000:707EF1166D2F11FD1519B37FB00D23EB:\ 000000000000000010000000000000000000000000000000 00000000000000000000000000000000:435088DBDD8646A7FCA8851CA2FA1FB5:\ 000000000000000008000000000000000000000000000000 00000000000000000000000000000000:F3DC32DD6931A302391F9B992A5B6122:\ 000000000000000004000000000000000000000000000000 00000000000000000000000000000000:D93286DD8A05432614FD03169F36ED15:\ 000000000000000002000000000000000000000000000000 00000000000000000000000000000000:59F83FEA4BC9B24BF69A98CA3959CEFC:\ 000000000000000001000000000000000000000000000000 00000000000000000000000000000000:A689BC3A8DB36A22763E911370C9DE2B:\ 000000000000000000800000000000000000000000000000 00000000000000000000000000000000:04EB5BA604BA64DD112BCAE830C27966:\ 000000000000000000400000000000000000000000000000 00000000000000000000000000000000:7EF653E2D804E80BD678C3A6CB222625:\ 000000000000000000200000000000000000000000000000 00000000000000000000000000000000:A94EC287E7F70C6503DC0B891920C622:\ 000000000000000000100000000000000000000000000000 00000000000000000000000000000000:8A78497E9D18A365599444C972359F0D:\ 000000000000000000080000000000000000000000000000 00000000000000000000000000000000:2F1832E285C8D24F226B50CCD71FE46A:\ 000000000000000000040000000000000000000000000000 00000000000000000000000000000000:0B6675F4BD4BD6951BB96AF62D3C9B96:\ 000000000000000000020000000000000000000000000000 00000000000000000000000000000000:D6DEDAAAECE52984A261155ED7AF5290:\ 000000000000000000010000000000000000000000000000 00000000000000000000000000000000:7600A0FCF96F24A21419103466B937B5:\ 000000000000000000008000000000000000000000000000 00000000000000000000000000000000:C3E359420C4C4AF445C470AB347B3667:\ 000000000000000000004000000000000000000000000000 00000000000000000000000000000000:D915133DAA11BECB43E020266B709BEC:\ 000000000000000000002000000000000000000000000000 00000000000000000000000000000000:A0001FC4E31664ED8C375644D02717AE:\ 000000000000000000001000000000000000000000000000 00000000000000000000000000000000:D8E96A3F240666FC02F31E84CD1CEEF1:\ 000000000000000000000800000000000000000000000000 00000000000000000000000000000000:DE0B6B80C40ED4447E36A84A62EB235D:\ 000000000000000000000400000000000000000000000000 00000000000000000000000000000000:8B15F04C34FC0F35F96C86837665CB38:\ 000000000000000000000200000000000000000000000000 00000000000000000000000000000000:02DAE104DA462934D87FDC73EB4011A9:\ 000000000000000000000100000000000000000000000000 00000000000000000000000000000000:B1ECC134EB7221CE00EBB977E08020E2:\ 000000000000000000000080000000000000000000000000 00000000000000000000000000000000:9F13CC1BF91C1B49AB6DDD7AF7A05ABA:\ 000000000000000000000040000000000000000000000000 00000000000000000000000000000000:414D1178475679525B5EE7ED373E2A0A:\ 000000000000000000000020000000000000000000000000 00000000000000000000000000000000:E69F2CC70EF18DBD360DFDD5C6573EBD:\ 000000000000000000000010000000000000000000000000 00000000000000000000000000000000:FA45D9E00E4C221A14C359742AC25C35:\ 000000000000000000000008000000000000000000000000 00000000000000000000000000000000:BC2AC98007820862150CC1B1E3E11ED1:\ 000000000000000000000004000000000000000000000000 00000000000000000000000000000000:C7CABAB4D7DFFD44C5943EB8E9441C3D:\ 000000000000000000000002000000000000000000000000 00000000000000000000000000000000:6DA6716020FDE292E8ADFB2A31BC6B24:\ 000000000000000000000001000000000000000000000000 00000000000000000000000000000000:9516AE03F102950795E1869E07BE0AFB:\ 000000000000000000000000800000000000000000000000 00000000000000000000000000000000:4748E60F70C6172E5D5B0C21E67F366C:\ 000000000000000000000000400000000000000000000000 00000000000000000000000000000000:40C7CC6385BB634FB68F73CCB5C446C2:\ 000000000000000000000000200000000000000000000000 00000000000000000000000000000000:7F0CE574F643711ECFC5011C0BCCD49A:\ 000000000000000000000000100000000000000000000000 00000000000000000000000000000000:2628849CC2C62FEB305A1287F24B9693:\ 000000000000000000000000080000000000000000000000 00000000000000000000000000000000:6E8C11B5EA12D40CE9F83693314BD836:\ 000000000000000000000000040000000000000000000000 00000000000000000000000000000000:503FCDFCCB2AEBEEE6FB59326D06745E:\ 000000000000000000000000020000000000000000000000 00000000000000000000000000000000:69698FE789F29872F0A4116CD8714255:\ 000000000000000000000000010000000000000000000000 00000000000000000000000000000000:3072C09636828285E7135E92B04C3601:\ 000000000000000000000000008000000000000000000000 00000000000000000000000000000000:00C19303036D6D3227B9C7AF806BEBDD:\ 000000000000000000000000004000000000000000000000 00000000000000000000000000000000:E6B06BC172CA8892C8A04D6717AB08CE:\ 000000000000000000000000002000000000000000000000 00000000000000000000000000000000:F7F08E268646EF8B9D728D422195A88B:\ 000000000000000000000000001000000000000000000000 00000000000000000000000000000000:E6C0BEE988E017E708FF1A1DCFE38FC8:\ 000000000000000000000000000800000000000000000000 00000000000000000000000000000000:33D0841FC04A6394056AC82D68DBFA02:\ 000000000000000000000000000400000000000000000000 00000000000000000000000000000000:066AF29F6138FE67D676925DBC375ED1:\ 000000000000000000000000000200000000000000000000 00000000000000000000000000000000:60E1109A80F56DBCBCAC75AF9EE3A982:\ 000000000000000000000000000100000000000000000000 00000000000000000000000000000000:84E692562A2DBE9452CDC7F5F7DCD4E6:\ 000000000000000000000000000080000000000000000000 00000000000000000000000000000000:DA5C0CB7DE7C2A9DEFC76348955FB51B:\ 000000000000000000000000000040000000000000000000 00000000000000000000000000000000:26AC1CB6870A598585E211852F9C980A:\ 000000000000000000000000000020000000000000000000 00000000000000000000000000000000:49776D30C4A10352FF0FBA170F09F275:\ 000000000000000000000000000010000000000000000000 00000000000000000000000000000000:D02E72C408A05C89F80C9EC450419FBF:\ 000000000000000000000000000008000000000000000000 00000000000000000000000000000000:993D122B38640477385BBFC79177C212:\ 000000000000000000000000000004000000000000000000 00000000000000000000000000000000:1482C5D53BE2F16634C22B9294D6E10B:\ 000000000000000000000000000002000000000000000000 00000000000000000000000000000000:4B9518E3188D68E20266DCAA5B26337F:\ 000000000000000000000000000001000000000000000000 00000000000000000000000000000000:7D6C9C9F375EDDE4A23D83B8B62E198F:\ 000000000000000000000000000000800000000000000000 00000000000000000000000000000000:FCCE30A6961099AD269080FF07A24E1E:\ 000000000000000000000000000000400000000000000000 00000000000000000000000000000000:C822629D39268498E02E6E4D642E7921:\ 000000000000000000000000000000200000000000000000 00000000000000000000000000000000:B96890D4CC0BD3C41A14D0547F98E077:\ 000000000000000000000000000000100000000000000000 00000000000000000000000000000000:78665BAC269A5DB3FFE165526A42F688:\ 000000000000000000000000000000080000000000000000 00000000000000000000000000000000:5EB1E7293616CD444011950212E53E78:\ 000000000000000000000000000000040000000000000000 00000000000000000000000000000000:FD682F200B2D5D17D177E785EBCE6C08:\ 000000000000000000000000000000020000000000000000 00000000000000000000000000000000:EAAEEA26A8AE037C288DDA6791580418:\ 000000000000000000000000000000010000000000000000 00000000000000000000000000000000:AA525000B28A88169212096B6D5FF58D:\ 000000000000000000000000000000008000000000000000 00000000000000000000000000000000:09C8F1F28B94167498D9377CB9909458:\ 000000000000000000000000000000004000000000000000 00000000000000000000000000000000:847E4FFAD40194940A0F7FA0E34739B4:\ 000000000000000000000000000000002000000000000000 00000000000000000000000000000000:50DCE06E775C1A6DDA24B2A926C9EF8E:\ 000000000000000000000000000000001000000000000000 00000000000000000000000000000000:3896FB03AF06F69CFDDDFBFCDF8E10A7:\ 000000000000000000000000000000000800000000000000 00000000000000000000000000000000:FED04C2F49DB4BE1D7BC5E187FB1612B:\ 000000000000000000000000000000000400000000000000 00000000000000000000000000000000:69E749DFCA9AC8A990444E9FFB6CBA09:\ 000000000000000000000000000000000200000000000000 00000000000000000000000000000000:9B2262EBF59AB552E04D57A72FE6F013:\ 000000000000000000000000000000000100000000000000 00000000000000000000000000000000:8FF0BF7F0088916764CF9FF21E1BDA67:\ 000000000000000000000000000000000080000000000000 00000000000000000000000000000000:5DE1FF41440B4CA0EEF22C8C3F96F23F:\ 000000000000000000000000000000000040000000000000 00000000000000000000000000000000:FEBE3209C8D61E85024DEF2122AF0268:\ 000000000000000000000000000000000020000000000000 00000000000000000000000000000000:DB63B702C6E39A283B64B90F36FBD426:\ 000000000000000000000000000000000010000000000000 00000000000000000000000000000000:BB364F05F769FFBFE18288BD782D20EB:\ 000000000000000000000000000000000008000000000000 00000000000000000000000000000000:8A929CBDE0CD9A9545A08DA2D16BA838:\ 000000000000000000000000000000000004000000000000 00000000000000000000000000000000:C5AE232EB4F293497E79E20E436B5A4C:\ 000000000000000000000000000000000002000000000000 00000000000000000000000000000000:3979A57AB9EB520E1475D745F897A9A9:\ 000000000000000000000000000000000001000000000000 00000000000000000000000000000000:469B440BBD0711C31B9AAA2564ECB68A:\ 000000000000000000000000000000000000800000000000 00000000000000000000000000000000:260AC31933A32B75C13364E868FD84DB:\ 000000000000000000000000000000000000400000000000 00000000000000000000000000000000:D5A76D2E0D00BE53B401ACB0EE70F8FB:\ 000000000000000000000000000000000000200000000000 00000000000000000000000000000000:C3475809C89275DE82F9F22D59A3DA37:\ 000000000000000000000000000000000000100000000000 00000000000000000000000000000000:C9B8FBFBF1A120BF47D0F2F48DD23661:\ 000000000000000000000000000000000000080000000000 00000000000000000000000000000000:C662358CCCD46730D243DEE03B871DC3:\ 000000000000000000000000000000000000040000000000 00000000000000000000000000000000:F5BA874DAE43AD835B3F1344653411B6:\ 000000000000000000000000000000000000020000000000 00000000000000000000000000000000:F0185396A6A69D48BBEADFE5B644EED4:\ 000000000000000000000000000000000000010000000000 00000000000000000000000000000000:DA0DEC6F13B5AEFC056F5D040C5DA310:\ 000000000000000000000000000000000000008000000000 00000000000000000000000000000000:7E1DBDE7B45F9C3E01A285EA575AD5ED:\ 000000000000000000000000000000000000004000000000 00000000000000000000000000000000:7A814893FBF78A6F5345F4E250DA454C:\ 000000000000000000000000000000000000002000000000 00000000000000000000000000000000:8C8B9E24399A6DF8293B0117307D6084:\ 000000000000000000000000000000000000001000000000 00000000000000000000000000000000:11BB87A542E9135ECEB6143A07E0B65E:\ 000000000000000000000000000000000000000800000000 00000000000000000000000000000000:495A92DB6E242E0A878EB4AC4C886802:\ 000000000000000000000000000000000000000400000000 00000000000000000000000000000000:97A5A7E3DAB800B3D4E7D468B4CCB951:\ 000000000000000000000000000000000000000200000000 00000000000000000000000000000000:C74D778D3F0440EB91981C23CC4F5669:\ 000000000000000000000000000000000000000100000000 00000000000000000000000000000000:1B485B0E4A063B844BC2AE8B722D0757:\ 000000000000000000000000000000000000000080000000 00000000000000000000000000000000:BF9D54F977A978797A4268CFC84132C4:\ 000000000000000000000000000000000000000040000000 00000000000000000000000000000000:90C50CB6D84B6A74F3D64A419B0419EA:\ 000000000000000000000000000000000000000020000000 00000000000000000000000000000000:776EED1A9849173A7AC46E94C9B2681B:\ 000000000000000000000000000000000000000010000000 00000000000000000000000000000000:A42F612CBF53529173E148ABA2B55D63:\ 000000000000000000000000000000000000000008000000 00000000000000000000000000000000:6F8B5F268B3DBEA72BF0D1F92B13684E:\ 000000000000000000000000000000000000000004000000 00000000000000000000000000000000:9379DA858CEC7AC58856E7DBF79C4757:\ 000000000000000000000000000000000000000002000000 00000000000000000000000000000000:17FE109D4638A9E1FAF130D621C160CB:\ 000000000000000000000000000000000000000001000000 00000000000000000000000000000000:2BCFAD82613FFD8D9BCBC539C1158BC9:\ 000000000000000000000000000000000000000000800000 00000000000000000000000000000000:8EA212BFBBF476CE35939066A7F1757D:\ 000000000000000000000000000000000000000000400000 00000000000000000000000000000000:1BFAC7B1B8EB14C26ADA2055E0C9CD36:\ 000000000000000000000000000000000000000000200000 00000000000000000000000000000000:9FCA8C1340C47C586D6A2FAD9FAA6833:\ 000000000000000000000000000000000000000000100000 00000000000000000000000000000000:D22D10708CBA6566DC096B8ABE3F9679:\ 000000000000000000000000000000000000000000080000 00000000000000000000000000000000:1FFC5754FC94465A073B714267DEC18C:\ 000000000000000000000000000000000000000000040000 00000000000000000000000000000000:FDED0173236B23DF4DFC1953355AA78E:\ 000000000000000000000000000000000000000000020000 00000000000000000000000000000000:FBE9178C4B27E51E24BF17053724AA2F:\ 000000000000000000000000000000000000000000010000 00000000000000000000000000000000:F02818D3D58D1F3345594670D3009DF4:\ 000000000000000000000000000000000000000000008000 00000000000000000000000000000000:6E148020BAB1DD04492299F6A9D9BA22:\ 000000000000000000000000000000000000000000004000 00000000000000000000000000000000:8E045AE3022AF7562106681B2B8CB70E:\ 000000000000000000000000000000000000000000002000 00000000000000000000000000000000:2C73832593114BF299424E30C5848625:\ 000000000000000000000000000000000000000000001000 00000000000000000000000000000000:127FC7BCF85F44F5041158A5EB3D040C:\ 000000000000000000000000000000000000000000000800 00000000000000000000000000000000:B25FABDA9D6E6704F23F33B0D907B762:\ 000000000000000000000000000000000000000000000400 00000000000000000000000000000000:21B968BF3EFFC638F54BC1524D8D378F:\ 000000000000000000000000000000000000000000000200 00000000000000000000000000000000:18F3BEB5D5A6B6AC512752AAA65EA3BD:\ 000000000000000000000000000000000000000000000100 00000000000000000000000000000000:5588729059256CE49AF2DA14EE4C9D00:\ 000000000000000000000000000000000000000000000080 00000000000000000000000000000000:A6EBD68D0A6F46DA22CD17D4B55BC4FE:\ 000000000000000000000000000000000000000000000040 00000000000000000000000000000000:50434829C09BFB7C174E1BE33642FEFB:\ 000000000000000000000000000000000000000000000020 00000000000000000000000000000000:682C20B72DDFE4F678B2379FA25715CA:\ 000000000000000000000000000000000000000000000010 00000000000000000000000000000000:925721E954372C9EA115BFF97BBE9A12:\ 000000000000000000000000000000000000000000000008 00000000000000000000000000000000:32929E53C8E8D85657B9B55A4911028C:\ 000000000000000000000000000000000000000000000004 00000000000000000000000000000000:8EE624F18BF5AA25ACE8667643D0D80D:\ 000000000000000000000000000000000000000000000002 00000000000000000000000000000000:30A61DCEB9A951B829DE01414A801807:\ 000000000000000000000000000000000000000000000001 00000000000000000000000000000000:785229B51B515F30A1FCC88B969A4E47:\ 8000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B095E0619E70CDF5F4BC6E88079CF22F:\ 4000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:44F32AEAE82516AC8857C1985B7109EC:\ 2000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B2BBE93B433C8F0415B90282E788C071:\ 1000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:9E953EBAA3B13F43F90908B53DAA0C09:\ 0800000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:4579140290095FB25B3144444505D203:\ 0400000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:5FD5F687596A9AA9EA105A2F7CF59A94:\ 0200000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:005EA3AF8AFF3DDA323148690537853C:\ 0100000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CD8E33C4F06FC0586E821522B2FEB08D:\ 0080000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CABEC07E46D11086778C3E1937CD0797:\ 0040000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:56BA650835E125201400380C4D2D5D99:\ 0020000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:EB48A1B279E95EBF8FAAC13D70F8F452:\ 0010000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E52435C29F7C9687B268C539BF6598B1:\ 0008000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:27785BDF6F6258EAC396BFD0F56BEE82:\ 0004000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CA16B1969FA373F43EF09D19B3379F3F:\ 0002000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:6D1B6F14090368034E10CF0C1E4F5744:\ 0001000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:5AE3ABA331C5D765E3D112B1DA09E7BC:\ 0000800000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:767F9CBDA1BA9914EBA40D7A172A4077:\ 0000400000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8FAE713F677A82075D773DB73D58763E:\ 0000200000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:616CA9A15D710CA38FCA9A8E0B16A21C:\ 0000100000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D36754729DB34ECA1ECAC2CE2B381713:\ 0000080000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E68E3A421462A49AF8D7E544F7789301:\ 0000040000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:69B24511DF9BE48CFDB416F08908315F:\ 0000020000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:1329EA7551CE6C335DB924D563694058:\ 0000010000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:74DA788FB7A6172B65FBB62C7ED4FECC:\ 0000008000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:862703854F75F433135601000CD9363B:\ 0000004000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:824D4C002C401677D5785D6C6DA96C68:\ 0000002000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:7F9F21E8C45D1E8A843060B963CC628B:\ 0000001000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3F6F7B1157906913B09BD2AE2627C6B0:\ 0000000800000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A1B7E0CC8B69B3C0C6F635F962D0A22F:\ 0000000400000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:6FC34DDFF0C74674CE124D85E8A3447F:\ 0000000200000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:436A5D315AF443DEA9BEF8D1E817E7E0:\ 0000000100000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8B0434C9C98CDA4B313DAD6F1E64A943:\ 0000000080000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:AF9BD15EF1535259C63D688BF67119C4:\ 0000000040000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F61EF2509D173E348E01839A26D033FF:\ 0000000020000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:9D37D036C8568D2173654423CC7AAB39:\ 0000000010000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:A93D98C055DDAA592390CADB0F0C468D:\ 0000000008000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F19CB2A5067E9FBADBD4F0D103007A54:\ 0000000004000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:83C5D584511836263D8B0DE7CEF0AD16:\ 0000000002000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E09206EB6A5E8AC933BAAB46547E4CD9:\ 0000000001000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:0A0EBA6ACED7899AA633CE67E8923936:\ 0000000000800000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:C93968EC0EE02DACD3F3EE9AC2320B88:\ 0000000000400000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:64D62934D409F36505EEC3B925BE914D:\ 0000000000200000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:BBADB03D5F0FCF375E671F8B009F3AF1:\ 0000000000100000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:DAC60B05A1C3A203C6B4FE882E780079:\ 0000000000080000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8B650EC280BE261CCED5B5FC7F8A9BA7:\ 0000000000040000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:35EB82F0BB6735E2DE661AE4E9E9EE57:\ 0000000000020000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:40B1042CBE87D64DDBEA4BAC8CF1F08C:\ 0000000000010000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:13D46AE35D868401D23C891ED92621EE:\ 0000000000008000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:D2C6E9C239B4FA5A1E76D038EA4660F3:\ 0000000000004000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:DE3BC7CDFAF9AB7143E255DC87645F3E:\ 0000000000002000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:8FB6CA966B5ACFB180A296EA5D93711F:\ 0000000000001000000000000000000000000000000000000000000000000000 00000000000000000000000000000000:59F622ACBBA15E522717A9EAF7047949:\ 0000000000000800000000000000000000000000000000000000000000000000 00000000000000000000000000000000:BB2939FFBD77B308DA93220AD68A21AC:\ 0000000000000400000000000000000000000000000000000000000000000000 00000000000000000000000000000000:CEBE5EDD9BACF0A0FB75B259DE7097CD:\ 0000000000000200000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3448844E63AC2BD809E254AC3BAA6B3B:\ 0000000000000100000000000000000000000000000000000000000000000000 00000000000000000000000000000000:49C27499EEC1989626B1E50435BA0273:\ 0000000000000080000000000000000000000000000000000000000000000000 00000000000000000000000000000000:39E97018F547A8A802578B80952F2457:\ 0000000000000040000000000000000000000000000000000000000000000000 00000000000000000000000000000000:9934453FBAAE1CB362A0012204967AE8:\ 0000000000000020000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E9C98A03713835EB4497346866791190:\ 0000000000000010000000000000000000000000000000000000000000000000 00000000000000000000000000000000:E026C858938B47D28A8758CCFAEF0FA8:\ 0000000000000008000000000000000000000000000000000000000000000000 00000000000000000000000000000000:3A84B0A26CEA6A8D8A94D5B791A0D3E8:\ 0000000000000004000000000000000000000000000000000000000000000000 00000000000000000000000000000000:B054259980B45B9D2D7CD6C13200BAFC:\ 0000000000000002000000000000000000000000000000000000000000000000 00000000000000000000000000000000:13645DBEDE21FF7C79C06141AD9E4CD1:\ 0000000000000001000000000000000000000000000000000000000000000000 00000000000000000000000000000000:F29B1370BA8D8CC19AC8DF5DF77F7319:\ 0000000000000000800000000000000000000000000000000000000000000000 00000000000000000000000000000000:6A2C94C488D5BD32742F143B2E8D0659:\ 0000000000000000400000000000000000000000000000000000000000000000 00000000000000000000000000000000:27A0BF748F513F18D4F7831527A3608F:\ 0000000000000000200000000000000000000000000000000000000000000000 00000000000000000000000000000000:0B0D61E162A88E04C38C19CA668C2DDC:\ 0000000000000000100000000000000000000000000000000000000000000000 00000000000000000000000000000000:4055BA24216EF49FE36E6145A5CD31D4:\ 0000000000000000080000000000000000000000000000000000000000000000 00000000000000000000000000000000:99699B31EBBE6ABE1F7B2AFEC86DC7E2:\ 0000000000000000040000000000000000000000000000000000000000000000 00000000000000000000000000000000:C8D70448CBA770CD94088F60CBF8C5AC:\ 0000000000000000020000000000000000000000000000000000000000000000 00000000000000000000000000000000:56C89F1BA6D3AB20465F01F81D00A894:\ 0000000000000000010000000000000000000000000000000000000000000000 00000000000000000000000000000000:919FC5BBFAB8C31F8B2A346FBC2AB282:\ 0000000000000000008000000000000000000000000000000000000000000000 00000000000000000000000000000000:FF57E3AB8751DAA252DD0DD917BEAD8B:\ 0000000000000000004000000000000000000000000000000000000000000000 00000000000000000000000000000000:90B94853B317FFA8D41F2A32A3A061AB:\ 0000000000000000002000000000000000000000000000000000000000000000 00000000000000000000000000000000:F4A0257D0CF6C8C87D154746C2C94B52:\ 0000000000000000001000000000000000000000000000000000000000000000 00000000000000000000000000000000:03666F848F252B501754773CB68CF3B2:\ 0000000000000000000800000000000000000000000000000000000000000000 00000000000000000000000000000000:F3D0941DDC7412A981C5F6CCAB082DC2:\ 0000000000000000000400000000000000000000000000000000000000000000 00000000000000000000000000000000:21EDD2A11C57EE97AEADFACEC20A8691:\ 0000000000000000000200000000000000000000000000000000000000000000 00000000000000000000000000000000:577CF09B5606F1443E8B57952004C68D:\ 0000000000000000000100000000000000000000000000000000000000000000 00000000000000000000000000000000:0CF408A2FBDA07068BDB13A371867FCC:\ 0000000000000000000080000000000000000000000000000000000000000000 00000000000000000000000000000000:88542C9E680C27FE8FBE090AD73410B9:\ 0000000000000000000040000000000000000000000000000000000000000000 00000000000000000000000000000000:7A8BA6DC89A1AD4385D0696AFDD89496:\ 0000000000000000000020000000000000000000000000000000000000000000 00000000000000000000000000000000:B84FA0FA046D5D77EA94CF3E8FDED147:\ 0000000000000000000010000000000000000000000000000000000000000000 00000000000000000000000000000000:D73CB079FB7101C933176352A93BB028:\ 0000000000000000000008000000000000000000000000000000000000000000 00000000000000000000000000000000:A7C8C1A59E141D608BC91BB69E7B2859:\ 0000000000000000000004000000000000000000000000000000000000000000 00000000000000000000000000000000:B2DA67AFE49B33E5EDFAF148A17BF06B:\ 0000000000000000000002000000000000000000000000000000000000000000 00000000000000000000000000000000:AC2DB35ED86D358616648D22B52DF012:\ 0000000000000000000001000000000000000000000000000000000000000000 00000000000000000000000000000000:662EA9D88A9A2C89581502EAAAD074D5:\ 0000000000000000000000800000000000000000000000000000000000000000 00000000000000000000000000000000:773A30DFDA8EBCE50EDFB925343C9ECC:\ 0000000000000000000000400000000000000000000000000000000000000000 00000000000000000000000000000000:10B7242D9C7CA610C20F1183BB949514:\ 0000000000000000000000200000000000000000000000000000000000000000 00000000000000000000000000000000:B7DF971F9C3444EFCC13210292126942:\ 0000000000000000000000100000000000000000000000000000000000000000 00000000000000000000000000000000:13F7406746C6E0CD5666EC04C0E540E2:\ 0000000000000000000000080000000000000000000000000000000000000000 00000000000000000000000000000000:9382384DCAF80CF537E24FC5F2F71A8A:\ 0000000000000000000000040000000000000000000000000000000000000000 00000000000000000000000000000000:3D5819934619E09F10E90C4EA7F30F40:\ 0000000000000000000000020000000000000000000000000000000000000000 00000000000000000000000000000000:710446D0A254F68975CD6AAAE92212FD:\ 0000000000000000000000010000000000000000000000000000000000000000 00000000000000000000000000000000:0A44FDEAA17E5F3E536A08D7A5B3267B:\ 0000000000000000000000008000000000000000000000000000000000000000 00000000000000000000000000000000:BAC72F53EE39296D3A23B126F8D8B20B:\ 0000000000000000000000004000000000000000000000000000000000000000 00000000000000000000000000000000:88C342961D0EE83902CB78C29539923D:\ 0000000000000000000000002000000000000000000000000000000000000000 00000000000000000000000000000000:CF3B48A6351C4561752D6A209F93A30F:\ 0000000000000000000000001000000000000000000000000000000000000000 00000000000000000000000000000000:957B107D23F3694F3FFD9957BBE13168:\ 0000000000000000000000000800000000000000000000000000000000000000 00000000000000000000000000000000:23675E18C1C66B483D55E14AC7F9CC80:\ 0000000000000000000000000400000000000000000000000000000000000000 00000000000000000000000000000000:955B8619F99F7609201CEEB338F32795:\ 0000000000000000000000000200000000000000000000000000000000000000 00000000000000000000000000000000:9F2BCB0C28768DA3B76206979B14EBC2:\ 0000000000000000000000000100000000000000000000000000000000000000 00000000000000000000000000000000:258F95A0E86EE0EE8FC020B4A01900F2:\ 0000000000000000000000000080000000000000000000000000000000000000 00000000000000000000000000000000:FD7B1DD7C7FE279E6A5E2926DD890B5E:\ 0000000000000000000000000040000000000000000000000000000000000000 00000000000000000000000000000000:59CF38A7C863C623991B5392944CB43C:\ 0000000000000000000000000020000000000000000000000000000000000000 00000000000000000000000000000000:27BCC9206AEC78DA48C1E9AB8D1A7A07:\ 0000000000000000000000000010000000000000000000000000000000000000 00000000000000000000000000000000:62D8460820B18811DEBB617DE7B8EC8C:\ 0000000000000000000000000008000000000000000000000000000000000000 00000000000000000000000000000000:782D8A4D30EE841EDB2E7E88C63B851A:\ 0000000000000000000000000004000000000000000000000000000000000000 00000000000000000000000000000000:4D10D177334397F49211BCB10F207905:\ 0000000000000000000000000002000000000000000000000000000000000000 00000000000000000000000000000000:C8E608BAFE61254A0DDF866BB4D063DD:\ 0000000000000000000000000001000000000000000000000000000000000000 00000000000000000000000000000000:05DDAB3DAEA0C64C1077BE22DA7ACDD4:\ 0000000000000000000000000000800000000000000000000000000000000000 00000000000000000000000000000000:951388F2BE1DD7013A00327FC6DB7905:\ 0000000000000000000000000000400000000000000000000000000000000000 00000000000000000000000000000000:62F8283651EFDF475DE8511EA7256AD6:\ 0000000000000000000000000000200000000000000000000000000000000000 00000000000000000000000000000000:5B259EEE6B19EE12D4CE20D2F38D4BCF:\ 0000000000000000000000000000100000000000000000000000000000000000 00000000000000000000000000000000:704414E13DCAD9DF7F593F630E68E13C:\ 0000000000000000000000000000080000000000000000000000000000000000 00000000000000000000000000000000:41AD9DAAC24ECCBB454DBAF75D5B9989:\ 0000000000000000000000000000040000000000000000000000000000000000 00000000000000000000000000000000:919C54C126B54D7A570D8ABA9FCE5D08:\ 0000000000000000000000000000020000000000000000000000000000000000 00000000000000000000000000000000:BC665541FF0F2E86DBDF4444C01AC0EA:\ 0000000000000000000000000000010000000000000000000000000000000000 00000000000000000000000000000000:FD30E2D851211506C112D5701B859BC6:\ 0000000000000000000000000000008000000000000000000000000000000000 00000000000000000000000000000000:7DB7B15E4ACBDBB0BFF4C4EAEDC2231E:\ 0000000000000000000000000000004000000000000000000000000000000000 00000000000000000000000000000000:F0AFDED56AD72D4C1E57A66EEDF4816E:\ 0000000000000000000000000000002000000000000000000000000000000000 00000000000000000000000000000000:E53B053D9B2E06656138D4A1EFA58888:\ 0000000000000000000000000000001000000000000000000000000000000000 00000000000000000000000000000000:4DABE13A3E656E95150440F81DD92666:\ 0000000000000000000000000000000800000000000000000000000000000000 00000000000000000000000000000000:175D44DFDE1EAD6E0E6862B511AA7007:\ 0000000000000000000000000000000400000000000000000000000000000000 00000000000000000000000000000000:09B690F493F5C779E8B6ACD09667A997:\ 0000000000000000000000000000000200000000000000000000000000000000 00000000000000000000000000000000:68D0E4CCA0119EED57ABF3C7574BDA8B:\ 0000000000000000000000000000000100000000000000000000000000000000 00000000000000000000000000000000:12C00618DA7EBA5EFA5E58D2696D891F:\ 0000000000000000000000000000000080000000000000000000000000000000 00000000000000000000000000000000:5DCE21AF0D23BC5AEFD4EA331B16219A:\ 0000000000000000000000000000000040000000000000000000000000000000 00000000000000000000000000000000:A5D7135A053B904D44B40E4E21693751:\ 0000000000000000000000000000000020000000000000000000000000000000 00000000000000000000000000000000:3257CEC675BF755FEE67A44D7EDF2731:\ 0000000000000000000000000000000010000000000000000000000000000000 00000000000000000000000000000000:324D30DDC6979F17A3BEAEA3A76AD44C:\ 0000000000000000000000000000000008000000000000000000000000000000 00000000000000000000000000000000:A1AA0E04E2B61861796FD2AA30FBEB05:\ 0000000000000000000000000000000004000000000000000000000000000000 00000000000000000000000000000000:90CA81DF4000404B567F5CFA9D193CB3:\ 0000000000000000000000000000000002000000000000000000000000000000 00000000000000000000000000000000:A2E6864259483D059B57BB921B7FBD99:\ 0000000000000000000000000000000001000000000000000000000000000000 00000000000000000000000000000000:545690C09C8C396F1273510DA9065C12:\ 0000000000000000000000000000000000800000000000000000000000000000 00000000000000000000000000000000:16D86FCC5910E2DD0CEA4DD5219B2D03:\ 0000000000000000000000000000000000400000000000000000000000000000 00000000000000000000000000000000:EC4114C19DD5711CD927B0DBE34AAB4B:\ 0000000000000000000000000000000000200000000000000000000000000000 00000000000000000000000000000000:A78C62D8FD439E5B10A7EF436714AC22:\ 0000000000000000000000000000000000100000000000000000000000000000 00000000000000000000000000000000:BA5D708CBA34F782DA00C7643C971DB9:\ 0000000000000000000000000000000000080000000000000000000000000000 00000000000000000000000000000000:7DB9ADCFA26C1E784E7F485BD0A0A52C:\ 0000000000000000000000000000000000040000000000000000000000000000 00000000000000000000000000000000:8A025CED99AF1047C5345358A291CDBB:\ 0000000000000000000000000000000000020000000000000000000000000000 00000000000000000000000000000000:187A1824D390AD2798E4F2264E5F1F21:\ 0000000000000000000000000000000000010000000000000000000000000000 00000000000000000000000000000000:BA28DE5C32353C65B97A59889E7A7A40:\ 0000000000000000000000000000000000008000000000000000000000000000 00000000000000000000000000000000:5D486AB86A883029EC74916851FFFA11:\ 0000000000000000000000000000000000004000000000000000000000000000 00000000000000000000000000000000:F9C79D54CEEE6170B195F4D30FA63FE0:\ 0000000000000000000000000000000000002000000000000000000000000000 00000000000000000000000000000000:96B8429F476485F8CC2E204534A8B64E:\ 0000000000000000000000000000000000001000000000000000000000000000 00000000000000000000000000000000:13061D65FEF26F5ACAAF3B55FDB98C36:\ 0000000000000000000000000000000000000800000000000000000000000000 00000000000000000000000000000000:C72DC86F70B40169B3456783A611DAE9:\ 0000000000000000000000000000000000000400000000000000000000000000 00000000000000000000000000000000:82AA2DB6FEE9212968D8282A1BF3242B:\ 0000000000000000000000000000000000000200000000000000000000000000 00000000000000000000000000000000:220C8B197F54F8E86DAE575B07A570EF:\ 0000000000000000000000000000000000000100000000000000000000000000 00000000000000000000000000000000:873C47F6F75BE9F710F91F2C54A69A7A:\ 0000000000000000000000000000000000000080000000000000000000000000 00000000000000000000000000000000:0392FA7BB908FEF23774772F74AC968D:\ 0000000000000000000000000000000000000040000000000000000000000000 00000000000000000000000000000000:A94203746A266C5744C16BF4E8DFA6D7:\ 0000000000000000000000000000000000000020000000000000000000000000 00000000000000000000000000000000:D3BA78AD6B01CC7221FA7778699C8316:\ 0000000000000000000000000000000000000010000000000000000000000000 00000000000000000000000000000000:994FDCC09C25400D14C05117B936EECD:\ 0000000000000000000000000000000000000008000000000000000000000000 00000000000000000000000000000000:4012F67B2A0BEF2623CA6AC5B054BE62:\ 0000000000000000000000000000000000000004000000000000000000000000 00000000000000000000000000000000:1134AF65E6D3D5E3D3C23A499EE2F677:\ 0000000000000000000000000000000000000002000000000000000000000000 00000000000000000000000000000000:6B35A344BD8DFD4002F5F22EA288F8E6:\ 0000000000000000000000000000000000000001000000000000000000000000 00000000000000000000000000000000:D293D438C563B8EB3FF26E23A7323B74:\ 0000000000000000000000000000000000000000800000000000000000000000 00000000000000000000000000000000:8085B7A7B939FA37BC4E1D746E9F9B37:\ 0000000000000000000000000000000000000000400000000000000000000000 00000000000000000000000000000000:D628AD150E15F413010BE15E391D3F48:\ 0000000000000000000000000000000000000000200000000000000000000000 00000000000000000000000000000000:A5C2AC88B6FD4C57CB4F2C2920A584EF:\ 0000000000000000000000000000000000000000100000000000000000000000 00000000000000000000000000000000:D7F5183F6BAB04B87A1ABAA3914DA848:\ 0000000000000000000000000000000000000000080000000000000000000000 00000000000000000000000000000000:3B2116BD2E362FC8985A0F0C618DF58A:\ 0000000000000000000000000000000000000000040000000000000000000000 00000000000000000000000000000000:BF31E8DE8342A32BBD80A8F91507BADA:\ 0000000000000000000000000000000000000000020000000000000000000000 00000000000000000000000000000000:AA04A56C13507AE5137657546766AE2D:\ 0000000000000000000000000000000000000000010000000000000000000000 00000000000000000000000000000000:72B9D7628AB21DF89666E50517C50574:\ 0000000000000000000000000000000000000000008000000000000000000000 00000000000000000000000000000000:2B8DE8D2D3332E6A30215ACC10A69847:\ 0000000000000000000000000000000000000000004000000000000000000000 00000000000000000000000000000000:AC421C73A789D79B452623DAFD3D6D0B:\ 0000000000000000000000000000000000000000002000000000000000000000 00000000000000000000000000000000:995207D8CF8C10904C0F47652C9C4287:\ 0000000000000000000000000000000000000000001000000000000000000000 00000000000000000000000000000000:F83BD19A357BD7901C0E8FBEFCF857ED:\ 0000000000000000000000000000000000000000000800000000000000000000 00000000000000000000000000000000:F42BB427C894A072C861C1425CBD71BC:\ 0000000000000000000000000000000000000000000400000000000000000000 00000000000000000000000000000000:3D1EC73B166DC0120DDF24267907C0F9:\ 0000000000000000000000000000000000000000000200000000000000000000 00000000000000000000000000000000:8EF136AF5D7D1B513FB59FA21F7837A1:\ 0000000000000000000000000000000000000000000100000000000000000000 00000000000000000000000000000000:EB4BBA7F94CE9429255A583D2F9810CD:\ 0000000000000000000000000000000000000000000080000000000000000000 00000000000000000000000000000000:5FE1C3BCD24818948514CB5A32FFD0A1:\ 0000000000000000000000000000000000000000000040000000000000000000 00000000000000000000000000000000:A990117E78D1C5BD7833B96A4A180744:\ 0000000000000000000000000000000000000000000020000000000000000000 00000000000000000000000000000000:E63684CDC37E6768C45012EA00D008E4:\ 0000000000000000000000000000000000000000000010000000000000000000 00000000000000000000000000000000:78B711F290DA924CAF1E4F1E11A08F4F:\ 0000000000000000000000000000000000000000000008000000000000000000 00000000000000000000000000000000:85B7F0D391AF9268643D9C0B72433A99:\ 0000000000000000000000000000000000000000000004000000000000000000 00000000000000000000000000000000:F51410475B33FBD3DB2117B5C17C82D4:\ 0000000000000000000000000000000000000000000002000000000000000000 00000000000000000000000000000000:A3C5BF72F39940DC7DAFB474A77A6114:\ 0000000000000000000000000000000000000000000001000000000000000000 00000000000000000000000000000000:4EFB0E18FB2F96FB6F81514BCE0A7BBD:\ 0000000000000000000000000000000000000000000000800000000000000000 00000000000000000000000000000000:10112F5ABBF246996860B843FC7159F5:\ 0000000000000000000000000000000000000000000000400000000000000000 00000000000000000000000000000000:94A91373701569B8C21487A7BDB164B6:\ 0000000000000000000000000000000000000000000000200000000000000000 00000000000000000000000000000000:A466821BD64F552C0610ADB737C562CD:\ 0000000000000000000000000000000000000000000000100000000000000000 00000000000000000000000000000000:511BE2BA9F2A272CA2F5C1D0F3E249C1:\ 0000000000000000000000000000000000000000000000080000000000000000 00000000000000000000000000000000:5578CCF8B92D48363EED4601661EB56E:\ 0000000000000000000000000000000000000000000000040000000000000000 00000000000000000000000000000000:BF90E87173A45115C811B6319C24FC4A:\ 0000000000000000000000000000000000000000000000020000000000000000 00000000000000000000000000000000:8029EE840D130319330B432D95DB9AA7:\ 0000000000000000000000000000000000000000000000010000000000000000 00000000000000000000000000000000:19D6D9F45582481A573D77917E778F3C:\ 0000000000000000000000000000000000000000000000008000000000000000 00000000000000000000000000000000:556D552FDE7C64227E2B72776488D6C1:\ 0000000000000000000000000000000000000000000000004000000000000000 00000000000000000000000000000000:3E81B51A214CC1F1CF6F35F9106A84BC:\ 0000000000000000000000000000000000000000000000002000000000000000 00000000000000000000000000000000:4E48243857ECB700F8F16872E0BB4FA9:\ 0000000000000000000000000000000000000000000000001000000000000000 00000000000000000000000000000000:681654DF6668CDDF1D3D604483AB483B:\ 0000000000000000000000000000000000000000000000000800000000000000 00000000000000000000000000000000:BD6CEEFD85A336E4F12D42076573ECA2:\ 0000000000000000000000000000000000000000000000000400000000000000 00000000000000000000000000000000:7488F9790FEC8AAE2AADDF6A600629B3:\ 0000000000000000000000000000000000000000000000000200000000000000 00000000000000000000000000000000:669C36695C33B63F16077CAE9AA940AA:\ 0000000000000000000000000000000000000000000000000100000000000000 00000000000000000000000000000000:7CE998A357384159C9B34A9A8AC7DF78:\ 0000000000000000000000000000000000000000000000000080000000000000 00000000000000000000000000000000:51BE07BA8106A19CCC2005B8B3932FBF:\ 0000000000000000000000000000000000000000000000000040000000000000 00000000000000000000000000000000:2634245A6EC3F17A35B7FE1D3E17F769:\ 0000000000000000000000000000000000000000000000000020000000000000 00000000000000000000000000000000:24D4114760BCE04C0109C06CCE199F6C:\ 0000000000000000000000000000000000000000000000000010000000000000 00000000000000000000000000000000:3F055452FCD596C6D588BD48BB5D5080:\ 0000000000000000000000000000000000000000000000000008000000000000 00000000000000000000000000000000:A1D97F66DEF90DE14CC2BFAFF09286BB:\ 0000000000000000000000000000000000000000000000000004000000000000 00000000000000000000000000000000:80442DC4EBFB53B86E232D886CA166B9:\ 0000000000000000000000000000000000000000000000000002000000000000 00000000000000000000000000000000:76A593802C6A691152E8A04E5DE2D05A:\ 0000000000000000000000000000000000000000000000000001000000000000 00000000000000000000000000000000:F923A147E00807D58FB9C686E01F7E07:\ 0000000000000000000000000000000000000000000000000000800000000000 00000000000000000000000000000000:8EA3B396D561A3CFCE729A0B59647760:\ 0000000000000000000000000000000000000000000000000000400000000000 00000000000000000000000000000000:4AA735D710704790C060BAD696DACABE:\ 0000000000000000000000000000000000000000000000000000200000000000 00000000000000000000000000000000:7F7C322D82557737F5407A797069B711:\ 0000000000000000000000000000000000000000000000000000100000000000 00000000000000000000000000000000:5094418C55B7D591EFDB7097CB95B16D:\ 0000000000000000000000000000000000000000000000000000080000000000 00000000000000000000000000000000:CC014984ABDFB760A835846668340929:\ 0000000000000000000000000000000000000000000000000000040000000000 00000000000000000000000000000000:18F86EA6C633228579C5728FF070AC21:\ 0000000000000000000000000000000000000000000000000000020000000000 00000000000000000000000000000000:AFCF921E4FA24FDEF85EDAC12CD479F1:\ 0000000000000000000000000000000000000000000000000000010000000000 00000000000000000000000000000000:684085D0BE8AE0D617B2EFEF62CAAC93:\ 0000000000000000000000000000000000000000000000000000008000000000 00000000000000000000000000000000:04C7B0268EAEFED098C815935D868CF9:\ 0000000000000000000000000000000000000000000000000000004000000000 00000000000000000000000000000000:39AE859D255487A68093A376D358BBC2:\ 0000000000000000000000000000000000000000000000000000002000000000 00000000000000000000000000000000:F1218B59E947816041B21AC28685EF36:\ 0000000000000000000000000000000000000000000000000000001000000000 00000000000000000000000000000000:B9BE024D06447F8965E480B33975E36F:\ 0000000000000000000000000000000000000000000000000000000800000000 00000000000000000000000000000000:24ECD5B3178150233BD38A4B9F8EBC86:\ 0000000000000000000000000000000000000000000000000000000400000000 00000000000000000000000000000000:7AD12485E896037A8D1A4ABE8A80B9BB:\ 0000000000000000000000000000000000000000000000000000000200000000 00000000000000000000000000000000:CEC561C6F4C45CC944371E5D1C18EDF1:\ 0000000000000000000000000000000000000000000000000000000100000000 00000000000000000000000000000000:F4B1088B0858A3737DF2C90FD919D1D4:\ 0000000000000000000000000000000000000000000000000000000080000000 00000000000000000000000000000000:5EA6D1B9881CE230B8EABAC59B7F5393:\ 0000000000000000000000000000000000000000000000000000000040000000 00000000000000000000000000000000:8023134FAC8BF5FDA86368BDA618AEF7:\ 0000000000000000000000000000000000000000000000000000000020000000 00000000000000000000000000000000:D37285234A927061BEC9F8AAE0E796C8:\ 0000000000000000000000000000000000000000000000000000000010000000 00000000000000000000000000000000:68AC18DB2FBF0A4A095A4B3344BF035D:\ 0000000000000000000000000000000000000000000000000000000008000000 00000000000000000000000000000000:563868079C5DF91E3B47B370B0BBB820:\ 0000000000000000000000000000000000000000000000000000000004000000 00000000000000000000000000000000:86C3BB221834F7507505434E4F98DC92:\ 0000000000000000000000000000000000000000000000000000000002000000 00000000000000000000000000000000:FD8220818731607D8B69AC5963D0FAC9:\ 0000000000000000000000000000000000000000000000000000000001000000 00000000000000000000000000000000:550726375ABB0F9A7C010DC4E47833F9:\ 0000000000000000000000000000000000000000000000000000000000800000 00000000000000000000000000000000:8AB5E8973A5D6648517D151295091C0E:\ 0000000000000000000000000000000000000000000000000000000000400000 00000000000000000000000000000000:338BB4B5569AA06411B9911381F350B2:\ 0000000000000000000000000000000000000000000000000000000000200000 00000000000000000000000000000000:332D696EC49DF4B58C5FA9CC84773F47:\ 0000000000000000000000000000000000000000000000000000000000100000 00000000000000000000000000000000:DEB5AC8F895AFF45BA5815D4912D8371:\ 0000000000000000000000000000000000000000000000000000000000080000 00000000000000000000000000000000:89A49D3AB772D0FDAE05FC692EAF6C7B:\ 0000000000000000000000000000000000000000000000000000000000040000 00000000000000000000000000000000:02116E6AEFC21A4D4D64CA27AB7AF31E:\ 0000000000000000000000000000000000000000000000000000000000020000 00000000000000000000000000000000:58F79FF1810CA4B0E0178F7D9C24A581:\ 0000000000000000000000000000000000000000000000000000000000010000 00000000000000000000000000000000:686FB1ED659D9BF17DA2BB79AC636C93:\ 0000000000000000000000000000000000000000000000000000000000008000 00000000000000000000000000000000:1C5C176C4F5796B2C34D2A12858EB511:\ 0000000000000000000000000000000000000000000000000000000000004000 00000000000000000000000000000000:2A94B92CC9C4776817C0A77D49E24F22:\ 0000000000000000000000000000000000000000000000000000000000002000 00000000000000000000000000000000:890583A6C9549A3DCAFBD54BF391BC8F:\ 0000000000000000000000000000000000000000000000000000000000001000 00000000000000000000000000000000:EA88A883197E483B4AA16316EA97CCBB:\ 0000000000000000000000000000000000000000000000000000000000000800 00000000000000000000000000000000:CC5732CEB99A0A0353BABA6432BCBE9F:\ 0000000000000000000000000000000000000000000000000000000000000400 00000000000000000000000000000000:88811B506D565779F09DE9BDF8702BD8:\ 0000000000000000000000000000000000000000000000000000000000000200 00000000000000000000000000000000:E11FEE3AD4A9A03956704B58720C92DD:\ 0000000000000000000000000000000000000000000000000000000000000100 00000000000000000000000000000000:644555DFB9CE8EDAF888EE142B5577F1:\ 0000000000000000000000000000000000000000000000000000000000000080 00000000000000000000000000000000:716E2BBCBD8FF7E7335784B767F27CA9:\ 0000000000000000000000000000000000000000000000000000000000000040 00000000000000000000000000000000:83588863F183ECE04E95629A322F9A09:\ 0000000000000000000000000000000000000000000000000000000000000020 00000000000000000000000000000000:5E2833EC95ACE6B93AF28C6FCDBCE5D5:\ 0000000000000000000000000000000000000000000000000000000000000010 00000000000000000000000000000000:B3EFCF17F0E1B275D413DD4D3A5CAE68:\ 0000000000000000000000000000000000000000000000000000000000000008 00000000000000000000000000000000:3C943E1A2E7E56E4B185302D2D5C5DBD:\ 0000000000000000000000000000000000000000000000000000000000000004 00000000000000000000000000000000:8CB4E2498382B523DCE6F7C17C91400B:\ 0000000000000000000000000000000000000000000000000000000000000002 00000000000000000000000000000000:85F345366155D13F8F257734D2CBD6D9:\ 0000000000000000000000000000000000000000000000000000000000000001 80000000000000000000000000000000:73B9FF14CF2589901FF52A0D6F4B7EDE:\ 00000000000000000000000000000000 40000000000000000000000000000000:F5A9150BAB6D6AEBD6B4F97D9E93B28B:\ 00000000000000000000000000000000 20000000000000000000000000000000:C30F8B221FD6D3996F973CDCDC6E305C:\ 00000000000000000000000000000000 10000000000000000000000000000000:D6A531FE826CB0454F2D567A20018CB7:\ 00000000000000000000000000000000 08000000000000000000000000000000:B62324BE427332A6089C7BE40D40292E:\ 00000000000000000000000000000000 04000000000000000000000000000000:929B4789E9D6940C9A158880CA21C0E2:\ 00000000000000000000000000000000 02000000000000000000000000000000:C14830DB50BA7221B27DC033B0D8D331:\ 00000000000000000000000000000000 01000000000000000000000000000000:743342B02EBE647AE47092D435FA60F6:\ 00000000000000000000000000000000 00800000000000000000000000000000:4F02AF45C09373D879CD01506A4E7D14:\ 00000000000000000000000000000000 00400000000000000000000000000000:92BC9085AB0BA8FFEC2EA6D360864817:\ 00000000000000000000000000000000 00200000000000000000000000000000:670A4ED16EA1BDE23E16CB52DBD31CB0:\ 00000000000000000000000000000000 00100000000000000000000000000000:A52335AA9F42886084E21400DE48B62F:\ 00000000000000000000000000000000 00080000000000000000000000000000:A5A240EBFED79F38F31497EA4C9CFCDA:\ 00000000000000000000000000000000 00040000000000000000000000000000:46A64A07123E1212FE9E2F30EDFD80FF:\ 00000000000000000000000000000000 00020000000000000000000000000000:20C9F20A8045AEDEE9D6E1CDA948339A:\ 00000000000000000000000000000000 00010000000000000000000000000000:DF1606EEF4FEE3F4FC9EC26E2AB388AB:\ 00000000000000000000000000000000 00008000000000000000000000000000:6758972B3171F0EA46304542776337FC:\ 00000000000000000000000000000000 00004000000000000000000000000000:EC9B591DB8476C26C3CFDA618C1DBBD8:\ 00000000000000000000000000000000 00002000000000000000000000000000:651551E741359E0A10BB4EE6A1C07C02:\ 00000000000000000000000000000000 00001000000000000000000000000000:88BC2BF1F8A55562B95F8547C9A19E56:\ 00000000000000000000000000000000 00000800000000000000000000000000:1A6CCCBD8D40AA14810ED615A6A6E24D:\ 00000000000000000000000000000000 00000400000000000000000000000000:7B68DA568ABA5AE69D93C915E37DEE91:\ 00000000000000000000000000000000 00000200000000000000000000000000:EC3922A728DA9E4C212D910E5C4AE632:\ 00000000000000000000000000000000 00000100000000000000000000000000:5BAC94C97A4069400875A5ABC07BCB17:\ 00000000000000000000000000000000 00000080000000000000000000000000:F3B4662918864BA94C1CF79C73B1F259:\ 00000000000000000000000000000000 00000040000000000000000000000000:6FBF5A9A93EFA6640AFB80D9A2D22CF7:\ 00000000000000000000000000000000 00000020000000000000000000000000:74139BD645DED7690F606490CCA44DD2:\ 00000000000000000000000000000000 00000010000000000000000000000000:B20F456519D353AF91C012793576F9B8:\ 00000000000000000000000000000000 00000008000000000000000000000000:C0AD52D4B4F67A9333A5E4B1B1176EEC:\ 00000000000000000000000000000000 00000004000000000000000000000000:797224710FD09F9830B0F160AE9051E8:\ 00000000000000000000000000000000 00000002000000000000000000000000:73669B64C292F4461FAA3A3D091D08DA:\ 00000000000000000000000000000000 00000001000000000000000000000000:EFE0E893CE04008935CB7D43A7DC9ADD:\ 00000000000000000000000000000000 00000000800000000000000000000000:3B0A2D3B236324221F81BFCAE45217D8:\ 00000000000000000000000000000000 00000000400000000000000000000000:CE6F569FC89127B1AE19466FA36DD6E4:\ 00000000000000000000000000000000 00000000200000000000000000000000:6037FE38896C05745C58C28CDF7FF386:\ 00000000000000000000000000000000 00000000100000000000000000000000:92F5817D0BE37241F9292F6FF918A8E5:\ 00000000000000000000000000000000 00000000080000000000000000000000:20C9A2A684563495C255A5751C1AC01E:\ 00000000000000000000000000000000 00000000040000000000000000000000:AC6B6DB6D069B6895F2283435D33BD43:\ 00000000000000000000000000000000 00000000020000000000000000000000:F9354B12C2366F1CE10F9A0550281267:\ 00000000000000000000000000000000 00000000010000000000000000000000:684FDA9FCF3B3B5648A452CDA07CF002:\ 00000000000000000000000000000000 00000000008000000000000000000000:9BE294C97C2A963006A2BD4541DC7DB5:\ 00000000000000000000000000000000 00000000004000000000000000000000:A984F6F70E93FE65C8798C01D4E5D30C:\ 00000000000000000000000000000000 00000000002000000000000000000000:E06A6CE2D74DB3D78E8F5D991C322B87:\ 00000000000000000000000000000000 00000000001000000000000000000000:646771D16BAEDAC3F8E9D00C212518A2:\ 00000000000000000000000000000000 00000000000800000000000000000000:9D2D410DC6F3BEC913D64BDBDEF3285E:\ 00000000000000000000000000000000 00000000000400000000000000000000:6850AFECD8064E77F4F6944BDF5B324D:\ 00000000000000000000000000000000 00000000000200000000000000000000:2E341142550F73F4C8E9DCCC5931A158:\ 00000000000000000000000000000000 00000000000100000000000000000000:0CA58E149C2120A8EBF9A7885A89ACBC:\ 00000000000000000000000000000000 00000000000080000000000000000000:41EACB7F6B5F9E3E3D299CA416EA2C59:\ 00000000000000000000000000000000 00000000000040000000000000000000:C4D45503484DBC83CB52D3DB4AD0A7CC:\ 00000000000000000000000000000000 00000000000020000000000000000000:CC52B159C2BCF87EE5F4926C6E7B7744:\ 00000000000000000000000000000000 00000000000010000000000000000000:7E8A4023B8890A2DBF0D54E330FDF2A2:\ 00000000000000000000000000000000 00000000000008000000000000000000:B05E771660493DCE3A275B0252D343A7:\ 00000000000000000000000000000000 00000000000004000000000000000000:83D0034D231E179207F6A97FB1457FEB:\ 00000000000000000000000000000000 00000000000002000000000000000000:7132BF130E8732C41F68107F49153FF2:\ 00000000000000000000000000000000 00000000000001000000000000000000:B93021593B9EA2588F16E87D3C5DE0EC:\ 00000000000000000000000000000000 00000000000000800000000000000000:26031449FBD6C84201B0BFB53B2C23CA:\ 00000000000000000000000000000000 00000000000000400000000000000000:AFC8E9D2B9BFED9CE0B898F28607DF4C:\ 00000000000000000000000000000000 00000000000000200000000000000000:C5094DE7E36CAEBE1B76EC3AC2C875F5:\ 00000000000000000000000000000000 00000000000000100000000000000000:7DF8910A2D256FFB5D56FD1358F131FE:\ 00000000000000000000000000000000 00000000000000080000000000000000:D93F84C1519D6627465E984675AA800B:\ 00000000000000000000000000000000 00000000000000040000000000000000:5F1861F1523CDA0C95644B0C4F2EE6D1:\ 00000000000000000000000000000000 00000000000000020000000000000000:FC5C4893AD148E4134EAEB3B1B190E29:\ 00000000000000000000000000000000 00000000000000010000000000000000:80D1463F9E9416A143B2FF69DE629510:\ 00000000000000000000000000000000 00000000000000008000000000000000:F16305404AE6266C619DC8ACA2D492E1:\ 00000000000000000000000000000000 00000000000000004000000000000000:3B2554E422F9CEBB8271D7A48C94E03F:\ 00000000000000000000000000000000 00000000000000002000000000000000:18B039EECB68A05CBF8C65EE85BDC4BC:\ 00000000000000000000000000000000 00000000000000001000000000000000:BB26ABB17AD5482B1DCC4018E7DB0950:\ 00000000000000000000000000000000 00000000000000000800000000000000:7E7AC0FD5B98157CEAD4BBAB643BE4CA:\ 00000000000000000000000000000000 00000000000000000400000000000000:BD8A3B64849E54CC2D8379DCA9E42FDD:\ 00000000000000000000000000000000 00000000000000000200000000000000:58C388DFB41FF3E14394C73FD8AAC56A:\ 00000000000000000000000000000000 00000000000000000100000000000000:944B295E23C5B2542DED57A155D33EF8:\ 00000000000000000000000000000000 00000000000000000080000000000000:067B4DD07DCA1292CFF0D80D75BDACA5:\ 00000000000000000000000000000000 00000000000000000040000000000000:7D7344373196C5B30676F270BFC90B07:\ 00000000000000000000000000000000 00000000000000000020000000000000:988C5164A82254B29326C98812A716CE:\ 00000000000000000000000000000000 00000000000000000010000000000000:8FFD48787C28542E0450FAD4CBAD34D0:\ 00000000000000000000000000000000 00000000000000000008000000000000:C50E7CD771628964E708425160FFB02C:\ 00000000000000000000000000000000 00000000000000000004000000000000:B293B07F92D68C18FEC1466996B78020:\ 00000000000000000000000000000000 00000000000000000002000000000000:DE21B2A6C8D7B90A7714DB3EF5209A6B:\ 00000000000000000000000000000000 00000000000000000001000000000000:4700E22C08FE953CABAC7E78A3F747A7:\ 00000000000000000000000000000000 00000000000000000000800000000000:504C1D7FAE3AB9A62323F21BF9A80A67:\ 00000000000000000000000000000000 00000000000000000000400000000000:064BA0E8ADDD8E9DF4496E6931AD25F4:\ 00000000000000000000000000000000 00000000000000000000200000000000:51D0B15C08FF32F1DCE7B28320875566:\ 00000000000000000000000000000000 00000000000000000000100000000000:1A20EA3DB071121460244EDE27DA7A39:\ 00000000000000000000000000000000 00000000000000000000080000000000:0035A5F7557B1B009327109D0C62F25C:\ 00000000000000000000000000000000 00000000000000000000040000000000:803939C10EE11BB254A7768FAD053DA4:\ 00000000000000000000000000000000 00000000000000000000020000000000:35D493255A870959C12F26170E6A1B64:\ 00000000000000000000000000000000 00000000000000000000010000000000:DE8381198215D45B1BE787E4E8438500:\ 00000000000000000000000000000000 00000000000000000000008000000000:B22E9707E738F723CD9B99386CE0162E:\ 00000000000000000000000000000000 00000000000000000000004000000000:24C65ADDE5C3CD24B75C343782E87F6E:\ 00000000000000000000000000000000 00000000000000000000002000000000:0050FF2C1A3C2AA68207D333F9956A72:\ 00000000000000000000000000000000 00000000000000000000001000000000:162F7B8D35C1A98305BA0FE2A91FF27A:\ 00000000000000000000000000000000 00000000000000000000000800000000:223D6117FE4864C2B3C513EAC2A5266A:\ 00000000000000000000000000000000 00000000000000000000000400000000:3DBF645715ED7AD1964E2DCDE2F8806A:\ 00000000000000000000000000000000 00000000000000000000000200000000:3DBB85509557BB00FE0F2013A90A5753:\ 00000000000000000000000000000000 00000000000000000000000100000000:F2D75E45A62D1758C7A542BC805AC482:\ 00000000000000000000000000000000 00000000000000000000000080000000:77628153A62DFD455B1C0E5B6CE9688C:\ 00000000000000000000000000000000 00000000000000000000000040000000:8AE9DF2D94F6E85C86459132130E1BF5:\ 00000000000000000000000000000000 00000000000000000000000020000000:BB610990F42303F4ECCD795E16780A13:\ 00000000000000000000000000000000 00000000000000000000000010000000:A38330C5C0B464FFD6983972CF9541CC:\ 00000000000000000000000000000000 00000000000000000000000008000000:EFD11CA98FEBB6F1ECBEBBCB8BD5E35B:\ 00000000000000000000000000000000 00000000000000000000000004000000:3BC6740BF141DD33D65FDEAA10BF1655:\ 00000000000000000000000000000000 00000000000000000000000002000000:FCF7BE4B89B54547C0BEF84EB85734F6:\ 00000000000000000000000000000000 00000000000000000000000001000000:CBF5EF38DDEBCA39F2F6BEB2F3042D96:\ 00000000000000000000000000000000 00000000000000000000000000800000:1119C20F08D4EA77A13C331678D4D71F:\ 00000000000000000000000000000000 00000000000000000000000000400000:5C8241DA3FB0DC7328271B9FF72C91BA:\ 00000000000000000000000000000000 00000000000000000000000000200000:337FCEE0AD0BDCA24AF5411B69D39B37:\ 00000000000000000000000000000000 00000000000000000000000000100000:F6C56A841A31D58A90F5693F87380A3F:\ 00000000000000000000000000000000 00000000000000000000000000080000:DD8C11B46F768B7CB2EAEE7E3448DD37:\ 00000000000000000000000000000000 00000000000000000000000000040000:B8EE7182E563888E4F99335CF0372598:\ 00000000000000000000000000000000 00000000000000000000000000020000:FCA9BAD58DD9C77B0BC0E616E7DE7F2D:\ 00000000000000000000000000000000 00000000000000000000000000010000:798DA99BEFFBF99B23A3C15A31F60CB1:\ 00000000000000000000000000000000 00000000000000000000000000008000:015CD86F000C87948BF3591C3DE4391F:\ 00000000000000000000000000000000 00000000000000000000000000004000:B40B9945EEF7BC52E0B244ED71FAD3D3:\ 00000000000000000000000000000000 00000000000000000000000000002000:D9BBB27B7D8AB20241E60F04108F1E12:\ 00000000000000000000000000000000 00000000000000000000000000001000:6EC3F259B3FA960505CDE9D20F9EB905:\ 00000000000000000000000000000000 00000000000000000000000000000800:01C1772AD104A988B2978447B91199F0:\ 00000000000000000000000000000000 00000000000000000000000000000400:F8D5E997A8DD1B5BBE79C9F36B94C73C:\ 00000000000000000000000000000000 00000000000000000000000000000200:4040058B08B27B6A585F18BFDBAE3E29:\ 00000000000000000000000000000000 00000000000000000000000000000100:55547D09ACAF0C915B24E15ABAB0C827:\ 00000000000000000000000000000000 00000000000000000000000000000080:FD7A0B33D397DA035D146DD56C869960:\ 00000000000000000000000000000000 00000000000000000000000000000040:80C38900313E9350219EAE9AA7DA5E1B:\ 00000000000000000000000000000000 00000000000000000000000000000020:F50D8495C3DCBFF4DFED0736F92475BB:\ 00000000000000000000000000000000 00000000000000000000000000000010:58A06DC5AD2D7C0550771D6E9D59D58B:\ 00000000000000000000000000000000 00000000000000000000000000000008:EEE324733E6409500FC9F9D6DCA185E0:\ 00000000000000000000000000000000 00000000000000000000000000000004:F97C415886D05C12598F2C95F6B3EB16:\ 00000000000000000000000000000000 00000000000000000000000000000002:F0FC7D86D814589A09D8EC136F95A124:\ 00000000000000000000000000000000 00000000000000000000000000000001:CA737FF1FD0FE5B8E41E90358A5F2CB1:\ 00000000000000000000000000000000 80000000000000000000000000000000:62EF193EDB7D399ACA50EC1CBE5398D8:\ 000000000000000000000000000000000000000000000000 40000000000000000000000000000000:E7A58D547688BA8B69DA949E38AA6FAD:\ 000000000000000000000000000000000000000000000000 20000000000000000000000000000000:71579F70A8EDB2BA5C00C513E2D7DEEB:\ 000000000000000000000000000000000000000000000000 10000000000000000000000000000000:C6171EF892F8224DC5FAE230AF629F52:\ 000000000000000000000000000000000000000000000000 08000000000000000000000000000000:C6A61053C48D7ECD7DDD12DB0F316AD7:\ 000000000000000000000000000000000000000000000000 04000000000000000000000000000000:EA5833714F1324DAB7F53CACC63F784F:\ 000000000000000000000000000000000000000000000000 02000000000000000000000000000000:450BCB0C7351CB1CDAC5D02E80D13C64:\ 000000000000000000000000000000000000000000000000 01000000000000000000000000000000:C267D3634F84215FB7B4635AFA385E52:\ 000000000000000000000000000000000000000000000000 00800000000000000000000000000000:6DB5B1B156DA1C36B9AB5AB59B063C29:\ 000000000000000000000000000000000000000000000000 00400000000000000000000000000000:EDF2D9B19FF75561E8FA6F411C4A0431:\ 000000000000000000000000000000000000000000000000 00200000000000000000000000000000:A11AE84E6D2C56DED2B9497FEC7504A7:\ 000000000000000000000000000000000000000000000000 00100000000000000000000000000000:B3A1A1E271BF94DA3A5ECFF1D4293A56:\ 000000000000000000000000000000000000000000000000 00080000000000000000000000000000:5577374ADCF2F58EEEFFC432C42AEB76:\ 000000000000000000000000000000000000000000000000 00040000000000000000000000000000:CD9D355C3574343BC7FBE645CE7EA721:\ 000000000000000000000000000000000000000000000000 00020000000000000000000000000000:76EB4C046F052AE4ED41060BF60067FB:\ 000000000000000000000000000000000000000000000000 00010000000000000000000000000000:1273A4BC420BCC9E29619567B1E61762:\ 000000000000000000000000000000000000000000000000 00008000000000000000000000000000:1F80E1CE3F12C96F2E647BACB6DA78D8:\ 000000000000000000000000000000000000000000000000 00004000000000000000000000000000:12D34A7875E716B37A7E250D37AFFDEA:\ 000000000000000000000000000000000000000000000000 00002000000000000000000000000000:5A54D764EEFFC4B64143A58B071514B4:\ 000000000000000000000000000000000000000000000000 00001000000000000000000000000000:F4F1567BDC5B1F938D5A214419090FE0:\ 000000000000000000000000000000000000000000000000 00000800000000000000000000000000:6CB91B935A0FBF49636CDF64A12955B7:\ 000000000000000000000000000000000000000000000000 00000400000000000000000000000000:C082154A07AF64FF6ECA811B0E3302E6:\ 000000000000000000000000000000000000000000000000 00000200000000000000000000000000:49A746CC225C1B6009A93649CDD9EDCD:\ 000000000000000000000000000000000000000000000000 00000100000000000000000000000000:1CAD0512E3CC51210B411EE452DF62E4:\ 000000000000000000000000000000000000000000000000 00000080000000000000000000000000:4FE9A0CF34BBCFFF906D8450197CC9D1:\ 000000000000000000000000000000000000000000000000 00000040000000000000000000000000:38DB8EF6C8993F17BB4D1614B9DE15D4:\ 000000000000000000000000000000000000000000000000 00000020000000000000000000000000:08DB3F476F551D19D9643A9E139E0553:\ 000000000000000000000000000000000000000000000000 00000010000000000000000000000000:F0F518F73795AB51BFB6E0AA99A0DAC7:\ 000000000000000000000000000000000000000000000000 00000008000000000000000000000000:91544D597F679E7DFE6D16D475809851:\ 000000000000000000000000000000000000000000000000 00000004000000000000000000000000:B1F92601B6D8C6B81176A46EE7341D28:\ 000000000000000000000000000000000000000000000000 00000002000000000000000000000000:796C3A8CBC6450E51FA6F8765ACD0F10:\ 000000000000000000000000000000000000000000000000 00000001000000000000000000000000:5F7BFE71BD2E81599DDA3411BC1CA579:\ 000000000000000000000000000000000000000000000000 00000000800000000000000000000000:2DF7D576EC6296101CAB16012092C12C:\ 000000000000000000000000000000000000000000000000 00000000400000000000000000000000:20769DE071FBE22AE49E7B3F5D646418:\ 000000000000000000000000000000000000000000000000 00000000200000000000000000000000:B6F5C012E4BA15DC86536F328B137FC0:\ 000000000000000000000000000000000000000000000000 00000000100000000000000000000000:1C3031DD05EAA4C278B55EF0E7E4C1F9:\ 000000000000000000000000000000000000000000000000 00000000080000000000000000000000:3D72A53BD537D04AC59E0AF36D105ED9:\ 000000000000000000000000000000000000000000000000 00000000040000000000000000000000:A6FFE499A2050C38F4E89DBF12B27430:\ 000000000000000000000000000000000000000000000000 00000000020000000000000000000000:BFBB2A537B2C1339D6230F35A256F289:\ 000000000000000000000000000000000000000000000000 00000000010000000000000000000000:70E79718C97DDB187411436AC072B148:\ 000000000000000000000000000000000000000000000000 00000000008000000000000000000000:13BB56699085842B81DBE8FAA8B26269:\ 000000000000000000000000000000000000000000000000 00000000004000000000000000000000:3E4DB71B9C737C7F8AEF632A5ADEF61D:\ 000000000000000000000000000000000000000000000000 00000000002000000000000000000000:D7A254B7341C7677C72F9DE729A3BB78:\ 000000000000000000000000000000000000000000000000 00000000001000000000000000000000:527D14E58B74224622DF7F3FD65932F5:\ 000000000000000000000000000000000000000000000000 00000000000800000000000000000000:708703993AD1DDE5C7F8714686F3AF32:\ 000000000000000000000000000000000000000000000000 00000000000400000000000000000000:C57D3ECB71A7DA4708DE6F338BC13E09:\ 000000000000000000000000000000000000000000000000 00000000000200000000000000000000:B31FF60BE0FDC17001CAF87FC7FC0B2D:\ 000000000000000000000000000000000000000000000000 00000000000100000000000000000000:01877AC646A283472DA74182FDC1E2B5:\ 000000000000000000000000000000000000000000000000 00000000000080000000000000000000:3C678BADA3FB1B872C018DC035AE16E8:\ 000000000000000000000000000000000000000000000000 00000000000040000000000000000000:A2CB209DA6AA40E043E6FB9DD2476100:\ 000000000000000000000000000000000000000000000000 00000000000020000000000000000000:4F9402FF56D04C8FB37DBE1A3109D2DE:\ 000000000000000000000000000000000000000000000000 00000000000010000000000000000000:342DAAD90F0F1699048D5CD16FDA2EC7:\ 000000000000000000000000000000000000000000000000 00000000000008000000000000000000:E68CC86CA4D952BC3890AEC0A7AAA4B5:\ 000000000000000000000000000000000000000000000000 00000000000004000000000000000000:02A88364BF94A677124F670A566E3F0D:\ 000000000000000000000000000000000000000000000000 00000000000002000000000000000000:C961EF325E2A32A4359CC63BE1EE2C77:\ 000000000000000000000000000000000000000000000000 00000000000001000000000000000000:03BF43C9083E4D9919D12FE5C0315E67:\ 000000000000000000000000000000000000000000000000 00000000000000800000000000000000:B27063442470BE07DCC2256EC71A4F1A:\ 000000000000000000000000000000000000000000000000 00000000000000400000000000000000:222CC5A29084A4BDB05D4C2FD95648DF:\ 000000000000000000000000000000000000000000000000 00000000000000200000000000000000:E08686BFAA936E1890AEEC834E3B474A:\ 000000000000000000000000000000000000000000000000 00000000000000100000000000000000:10DC4FFCAC5F5A1FB668277E8E75BEAB:\ 000000000000000000000000000000000000000000000000 00000000000000080000000000000000:03A9199978F9D652A4C528FF86C39CE9:\ 000000000000000000000000000000000000000000000000 00000000000000040000000000000000:DDF718A1BEB37CC1B0905520DB7C1611:\ 000000000000000000000000000000000000000000000000 00000000000000020000000000000000:2072191C277EE40FD557FF5F67A2A546:\ 000000000000000000000000000000000000000000000000 00000000000000010000000000000000:96B3608C06112F619B156105EB082BBE:\ 000000000000000000000000000000000000000000000000 00000000000000008000000000000000:B5D919DFD9828C4FF4427E72ABFC77B2:\ 000000000000000000000000000000000000000000000000 00000000000000004000000000000000:9570E7A96D4674C800AF8DCD01DEFF64:\ 000000000000000000000000000000000000000000000000 00000000000000002000000000000000:59723DB66EDB29A9C81175668903777F:\ 000000000000000000000000000000000000000000000000 00000000000000001000000000000000:1779BDFAC6DB722BCAF4D3A8D9D2E725:\ 000000000000000000000000000000000000000000000000 00000000000000000800000000000000:5107B50A150998C6EA01C14697FC0E53:\ 000000000000000000000000000000000000000000000000 00000000000000000400000000000000:36A6CAA08BD5D2B332E9323F7C2E76CA:\ 000000000000000000000000000000000000000000000000 00000000000000000200000000000000:D1CF37451667EDB8D2E9934D39A27A92:\ 000000000000000000000000000000000000000000000000 00000000000000000100000000000000:4E96227B0A018755FBE8AD5BF0E421B0:\ 000000000000000000000000000000000000000000000000 00000000000000000080000000000000:3221B3D3A24745B483BBF99509B330A0:\ 000000000000000000000000000000000000000000000000 00000000000000000040000000000000:98A4AB39B84D21D36A5DDC2660BD68C5:\ 000000000000000000000000000000000000000000000000 00000000000000000020000000000000:E5C351E1783465EDBA5CE0592BC77E8E:\ 000000000000000000000000000000000000000000000000 00000000000000000010000000000000:35489488EE33D0344C1BDB6263D28286:\ 000000000000000000000000000000000000000000000000 00000000000000000008000000000000:97EA899F53C60536DAFEB18123FD6C5B:\ 000000000000000000000000000000000000000000000000 00000000000000000004000000000000:8511B11C7D2D8FBF63702A7E3AACA08A:\ 000000000000000000000000000000000000000000000000 00000000000000000002000000000000:FE0C90596E4F47FD8A9927D83F4DCA52:\ 000000000000000000000000000000000000000000000000 00000000000000000001000000000000:186FE000683CC19F621BC6C2DA300B71:\ 000000000000000000000000000000000000000000000000 00000000000000000000800000000000:8291F94EDF578E8A70CD0CF8F3FB3558:\ 000000000000000000000000000000000000000000000000 00000000000000000000400000000000:2891C81846949C917E757EBAE20D34EE:\ 000000000000000000000000000000000000000000000000 00000000000000000000200000000000:762D85A32DAF0C9F3CFB3388E808FEC2:\ 000000000000000000000000000000000000000000000000 00000000000000000000100000000000:CC6807D209B728C559C32336FD8FB71D:\ 000000000000000000000000000000000000000000000000 00000000000000000000080000000000:FCD07057EF4820154075A0DDCBFC0BBD:\ 000000000000000000000000000000000000000000000000 00000000000000000000040000000000:FDBFE2C3FFC82792D338388A1FC6D22E:\ 000000000000000000000000000000000000000000000000 00000000000000000000020000000000:04D5F7CD68FC2352BDDBC82CFE35DA80:\ 000000000000000000000000000000000000000000000000 00000000000000000000010000000000:B1784A7BF395FB525471EE3DC8972FED:\ 000000000000000000000000000000000000000000000000 00000000000000000000008000000000:CB5D8A62D16220123EF0005876E35B19:\ 000000000000000000000000000000000000000000000000 00000000000000000000004000000000:311292EDE1F30E9F22F1EEF8FD19BD80:\ 000000000000000000000000000000000000000000000000 00000000000000000000002000000000:382BC583EC9B6E16E3DF2188CF0BF1E8:\ 000000000000000000000000000000000000000000000000 00000000000000000000001000000000:632C9AD674BD1B8A15827A789BD133A7:\ 000000000000000000000000000000000000000000000000 00000000000000000000000800000000:0EE175DF45B889CED6974E9C2B8F8A78:\ 000000000000000000000000000000000000000000000000 00000000000000000000000400000000:6131A1A18F00CFDA5B4AF4FBE5487445:\ 000000000000000000000000000000000000000000000000 00000000000000000000000200000000:0C8746747460A540E2304B55C12EA672:\ 000000000000000000000000000000000000000000000000 00000000000000000000000100000000:DD6D4D2AA3EB702C597E4E2DE59BF4C9:\ 000000000000000000000000000000000000000000000000 00000000000000000000000080000000:774EDF219459A4744AA1CCDE7D969A60:\ 000000000000000000000000000000000000000000000000 00000000000000000000000040000000:1D7B340C4CE68AC97369FFF0FF9980C8:\ 000000000000000000000000000000000000000000000000 00000000000000000000000020000000:D18104617258AB02AAE02ECCF552A891:\ 000000000000000000000000000000000000000000000000 00000000000000000000000010000000:8DC66F1D7648EB62F1DCBEB3CD237985:\ 000000000000000000000000000000000000000000000000 00000000000000000000000008000000:ABF090054ABE052ECE0B07BE6B6CC6DB:\ 000000000000000000000000000000000000000000000000 00000000000000000000000004000000:89239AAFE9BA86E5EC794397E0180111:\ 000000000000000000000000000000000000000000000000 00000000000000000000000002000000:6E1CDC049333211B4D7533E21504D200:\ 000000000000000000000000000000000000000000000000 00000000000000000000000001000000:EFE662AF24D9997FAE45CAD4F92F3091:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000800000:16F53F3A6CC3B4F86DDA1B8792244901:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000400000:047CBACDC5EA84771A61FE1204813D46:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000200000:B442FF3318822EA7F60E2A8A082A043A:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000100000:971D07AEEDBCA5B7BDCD033F708C97DB:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000080000:D307263273E250C0B9E08FF23003B0D1:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000040000:75F7005CA9C6EE5A1F9A4897FA67C661:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000020000:9B421C68873D49F07E3B9025AD609787:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000010000:5B182593B47DC674D8B1942CB97224B2:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000008000:A896871A3157CCD1F5A788E253A6B0FD:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000004000:789A3D2B2A70181EFCCE5529F200DC44:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000002000:7F9462D23DB6E99AD0A54EA84DBD94E2:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000001000:23EAFE1F7CCE96B6BFE2484E1DFC4AB9:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000800:A76C323805F9C252C8B86C83294B9987:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000400:D8CA1075B7A3F2CF2DAC0980B1B66CC1:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000200:8206D89F2A07BA6403647FB85A2F4D7D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000100:3DE7573CD46D85488364472B038869F9:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000080:31C62401D6E9E4995C0913747BFE7C7E:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000040:C464728025916B4E8D56E4A9F98C1A25:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000020:0D4643EE09ABD6D6062187789AE9A77D:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000010:0C06EAC3043ABE6554C2DA42F21E7B05:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000008:E26C6B2CBE2130729A5BF96E7CD29912:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000004:4DE2B8FFF3588A5D4E62CADB720E5BCC:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000002:B96DD46C6A286BFF721693A98491F529:\ 000000000000000000000000000000000000000000000000 00000000000000000000000000000001:64F1DBD3C79EE69AC9E0ED5F554F4AB6:\ 000000000000000000000000000000000000000000000000 80000000000000000000000000000000:23A385F617F313DAC05BCB7EABD61807:\ 0000000000000000000000000000000000000000000000000000000000000000 40000000000000000000000000000000:35BE2B4738602A1DA3DE5C9E7E871923:\ 0000000000000000000000000000000000000000000000000000000000000000 20000000000000000000000000000000:03E8BB7A568E95BA792DCE77D5523C2B:\ 0000000000000000000000000000000000000000000000000000000000000000 10000000000000000000000000000000:D3ACBE92C482D2E806FD837E41DBB288:\ 0000000000000000000000000000000000000000000000000000000000000000 08000000000000000000000000000000:DC3B1C37C69B4059EAADF03FCD016EB4:\ 0000000000000000000000000000000000000000000000000000000000000000 04000000000000000000000000000000:3C9D9BD904E0E6916089A4BAC35E5368:\ 0000000000000000000000000000000000000000000000000000000000000000 02000000000000000000000000000000:C47DA045701B93A388E76FCBCD349F22:\ 0000000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000:52F264B196925A345CA5ADC57C234B96:\ 0000000000000000000000000000000000000000000000000000000000000000 00800000000000000000000000000000:C923754C5AD2E3F842D01705A716BE8A:\ 0000000000000000000000000000000000000000000000000000000000000000 00400000000000000000000000000000:630075C7563CDBACDFEADB781CC9467C:\ 0000000000000000000000000000000000000000000000000000000000000000 00200000000000000000000000000000:CB4F69BCC76A2499C6FCFBBE4CEB8CFB:\ 0000000000000000000000000000000000000000000000000000000000000000 00100000000000000000000000000000:0442F15EA2BD6D9EB773F9B99804DF56:\ 0000000000000000000000000000000000000000000000000000000000000000 00080000000000000000000000000000:9CE6896C15C3CC00E2AA1944D7117B98:\ 0000000000000000000000000000000000000000000000000000000000000000 00040000000000000000000000000000:E934066740023616B349F45582442647:\ 0000000000000000000000000000000000000000000000000000000000000000 00020000000000000000000000000000:D08EF37A59D94ED645B1D1B160E3E816:\ 0000000000000000000000000000000000000000000000000000000000000000 00010000000000000000000000000000:E91891CAC17FE493C7167C6CB59DCB69:\ 0000000000000000000000000000000000000000000000000000000000000000 00008000000000000000000000000000:B27A42D2C870DC96BC6C551218C44CC4:\ 0000000000000000000000000000000000000000000000000000000000000000 00004000000000000000000000000000:CE8D23E64E6BC18208CEEB282E387326:\ 0000000000000000000000000000000000000000000000000000000000000000 00002000000000000000000000000000:36F76678A27F2F5A436073D5ADA4AB3B:\ 0000000000000000000000000000000000000000000000000000000000000000 00001000000000000000000000000000:D0EAA36F9A648905B277F0BD24B1A339:\ 0000000000000000000000000000000000000000000000000000000000000000 00000800000000000000000000000000:82BE0E3673E7872BF79BBE2A45F4BD93:\ 0000000000000000000000000000000000000000000000000000000000000000 00000400000000000000000000000000:013CAE3986083F8D321273D68CA9784D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000200000000000000000000000000:0A7FCF71DAC023718153FFB761BAEBEF:\ 0000000000000000000000000000000000000000000000000000000000000000 00000100000000000000000000000000:C784C5EA8CE3897F153336047D2FE3E0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000080000000000000000000000000:FE776B4476A4F029E5EA9293E3C1BCA1:\ 0000000000000000000000000000000000000000000000000000000000000000 00000040000000000000000000000000:302A5F9A73B07D83699EB9DE1D86DB7B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000020000000000000000000000000:E6C43F6F62F1EEE0BDB3484F325053B6:\ 0000000000000000000000000000000000000000000000000000000000000000 00000010000000000000000000000000:C5579556F710EACFAD9319AA85B89F6F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000008000000000000000000000000:96C88E46C1C2BA0B583F30FE0248A794:\ 0000000000000000000000000000000000000000000000000000000000000000 00000004000000000000000000000000:287D27FB1CA40821294B1AFC868F3A6F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000002000000000000000000000000:F4602DF76A24010DE5A1353043CF178E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000001000000000000000000000000:47F98AA9DF5E7314D3D5571EF6B95284:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000800000000000000000000000:77CBF7DCA60F913FD9C82AC65212EBB2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000400000000000000000000000:BEB1C2BC4B5C363FCF5A0466883079A9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000200000000000000000000000:2AB8B9254ADBDCE17F0A719815DEFF7E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000100000000000000000000000:75A30CEAA03AF66E44A85DC66DEB20C9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000080000000000000000000000:C37E64CE86B615573C4C42BBE71DACD8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000040000000000000000000000:284CB50259A96CCED1C1C64D8B603024:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000020000000000000000000000:BE346B07869425CBCA54F93D7A1F4035:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000010000000000000000000000:60EE2023B03033A972E28E4A21C7005F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000008000000000000000000000:4E1FD4BC99AEA3BCC6B9066EC6329D43:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000004000000000000000000000:079BDF2DAD2CE6FB7D21BBD76A7ABF48:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000002000000000000000000000:6B933D9914169C2A704E52EC6D7E4E1D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000001000000000000000000000:FD854A50372E5D301367D8E98CC88028:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000800000000000000000000:8CE94A2C43B01825CE5F271135481BB2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000400000000000000000000:73A43C713898BA7D7D2B6BC8673A7AAA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000200000000000000000000:13873CFBDED482C0B7B435025A9F1CF4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000100000000000000000000:3F168CD782896F22C56A92A09EA7E162:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000080000000000000000000:BCDF1C8686E68810FE90B16ECAB46147:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000040000000000000000000:95C18EBA59E3CB6359DE7CCE9E8751F9:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000020000000000000000000:03CFEA7D36D56552CDEF806215EA7596:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000010000000000000000000:CC189A2E8F529EB139DCA2033109F40B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000008000000000000000000:453912532144CED54B7D4049BC8B8CF2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000004000000000000000000:C6DBBF405A056A80CA788267538FE8F0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000002000000000000000000:2EB5E272874CE244A328BA6410480B4C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000001000000000000000000:263BFB611CBD9D9C7FF6B1A9E3276696:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000800000000000000000:9CC3EB61A9907F5F22251239A9EB38ED:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000400000000000000000:726A3EE922EDFE52206C2191E1F045F4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000200000000000000000:1344C1E04A9D97668A240D82396AC021:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000100000000000000000:9067BAA44C264E9A2AEC292390A6F492:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000080000000000000000:1176621BD24D35670B08D6A065806B02:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000040000000000000000:DF0D31D14D81FD086E8E32479919FDBC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000020000000000000000:44BAD80B0BA01E971ADC4139D6DE0C36:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000010000000000000000:76C59131EFFAE14058D99E22698B602D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000008000000000000000:7604D9F3110F8440917ABCEA49710ADA:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000004000000000000000:4584FCBB487171176C4318082EFEFDF7:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000002000000000000000:019D3B42FA31A9F9175759E6C3193A07:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000001000000000000000:C324FF5F71A974F13F5D83226441E3BD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000800000000000000:D9DF41408DFF80DE7C9571706B39038F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000400000000000000:FBB99A524AC23D74047D814EC0AEDBE2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000200000000000000:877C855E25345F6C7DB4237ECF64C874:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000100000000000000:206500F822C1305F9D61F49FC57AFBF2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000080000000000000:C7538D97A78844C3C00740865E26755B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000040000000000000:FADBC4A6E4564041ADA094C603CABAA4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000020000000000000:04C482E0707DE6DC1917727D00C4FA6B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000010000000000000:EE36B8996AFF98BEA6E2115B9D173321:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000008000000000000:DBA4A5F38B104985D796ECDDD812B605:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000004000000000000:1DC0F910CD5AF1E5734169459E170192:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000002000000000000:C3B7D6914052503D377B01DB4E3A630D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000001000000000000:54D807506602ECF7D6B8C4D923317738:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000800000000000:ACE4949143D4D1441AA854331E7F511B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000400000000000:F7BA140AED4756B26789498A17EBF62D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000200000000000:F23E08B81ACB75FE2326A94ECC5968AC:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000100000000000:4CF26F088604368B17DDC09FF9D0146D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000080000000000:E93AEB7AD76A6AD0AF4092F363421F1B:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000040000000000:3D234C0F78ECBEFCCDCE1EA6EC98C145:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000020000000000:BA300B0234F0C96125D33123CDD7D6A4:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000010000000000:1CF1A160FAD7E744F08BA1454A999211:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000008000000000:59A9E8C14ACBCEC235529425CF86998E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000004000000000:22D29CFEF3A6DC0EC67A9EA8523D6158:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000002000000000:513971F979FC906FADD982D7F08E4F05:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000001000000000:6A95C07D7FACF2CD36DF362116A2DD5F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000800000000:CD62AD57393A38607436FAF0985C2D50:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000400000000:5209ADE137B93BA0963528E3E1A40F2A:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000200000000:545BDE9D1C11239ED70D93060F24E397:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000100000000:720622F5194578B3C24B5DDDC7E30327:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000080000000:9E12338BF484106249754EAA6C441192:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000040000000:F13303DC759CA65097EC87F8D854163C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000020000000:4A2A6EB6845723C1C790D693B596CDE3:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000010000000:EF3D7C67417CA1FEEF03EF71441BDDFE:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000008000000:214FB38A7511A87CF160F59CCA2B8E33:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000004000000:DCFFDB5E44574D0D593A70ADA4C79474:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000002000000:AC9D55D4A4FBB80C9B79C9077BA381B1:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000001000000:05C6D61B75312924E0BCEDCB4B8D55DD:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000800000:E650CB445AF48A77E8DB6E2EFBCE6FA7:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000400000:4C9902E89253D7A172BABFA87DB94816:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000200000:5AF4F5E8491EE7F87EB809D82AEC12DB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000100000:1C11730D62BCA6F847B1457B5287BD12:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000080000:BEF65A32FF7383CFDB5A90C2F3B93837:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000040000:2F3AA68FFE3B99DC92621782F3F9ED67:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000020000:18BD598BFA2C77E21DBD594EE0E5CDCB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000010000:248CF533016A6AB1F84F85B2C5CD41A7:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000008000:A3B12F578353514CCC500ADD6C495A6C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000004000:EE2DC099B37D200B4D3930A6DE07208E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000002000:412C9F198D58A0F01F66DF07CF211636:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000001000:5B3532BA46716B02E761339DBAFBAAB0:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000800:0148187CA72EC46B522E4FE7E1261522:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000400:84C529CC4E23683AB90A24A6690662ED:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000200:0D1EF0481593A3D95F0361C776D9A4D2:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000100:D622171C73726DB6620FFDA6540D510E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000080:F218D92AED363C6829F7FA3BA346E0FB:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000040:40CD83A5F0BFD0E1D7FE14299CECFB7C:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000020:512F022157AEF0015E93F3737911A35E:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000010:C7A5A88356152E95F36739AB5EF9F63F:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000008:8FD0F15E2504A8F4FD751CA7799FFB1D:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000004:0137C87257A8CBD18C218A867B3AB5F8:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000002:3DB0F1674F187DF1CB036DB33A05A0D7:\ 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000001:23D1247EFF4CA8CBB378DF118369821E:\ 0000000000000000000000000000000000000000000000000000000000000000 [XTEA] FEFEFEFEFEFEFEFE:36552E889D6A41CF:00112233445566778899AABBCCDDEEFF 0123456789ABCDEF:B8BF2821622B5B30:00112233445566778899AABBCCDDEEFF D51399607F7AA9D7:782E4E131C5BA746:D94576CD1A5F99E4155DC7BEC5D33DF2 10B233473624CCD3:57733A1DEECE283E:07EF12BC9D06D7DA20131116B665E335 3B905E951E4FAFE7:776F4965DEB65775:C6462B48AFD604B75FCC455506FFD411 15B623D1FA2DF9DF:3BD5AD5C9ED6101E:BE195F703D6FEC2232CD0890C981B27D 7C1035940696D91D:5F93FA1D06991415:5B8410F7A9EB92DA120810C56FCAF8C9 90B245144895F3AD:6105BFB0947828B7:B85C9E26661889D0FF1054C6BE27FDEB 4EF2CFD120B8D4DC:51FAE58A10F7C3DD:A8A1E956D54D238F6CEAB186E7EC99ED F6CB5353F4A1C432:550AD71BA8A34568:8BC4879201A96368927ECCEEE67024EE 215C080CF158A09B:13D1E24BA9FF7B63:F1372D85D8C3D1A60DF57EEDF317AB81 568583061DA98D0D:6439B1DFE2ECB541:017F01683F5E009D196FEEAAD385C5A9 0558B306316B0823:C8F82FE4491A8917:281C932DDD3C364B09F1896007FFAB03 FDCB2764303222C7:244DBFA1D2C914E4:C1E95465C7EF8EB04254D1A5463C6A43 EADDBA89070EC46C:5A4909646763454F:0F86DD6C96DD31164B656B0F25E4B411 C6507BCF99B9C2A1:6F08EC714E8A7C18:FBACFB479AE21194C35B8184E58DD66E C380B0F1C21D4D37:72D4D4BDF5C00585:2EB36C4A9598D471700A1330070FFFC9 E5B7C1517F24F298:64374B40BB732354:0A7F48127091780617A1F534B3271BC9 D14DDF77FDDA17BF:014F1E707D02C8D8:303FB24822A1B8A84D0ECE77B86380FF B9682750BB15CAAD:9001D21B57AB5360:F04EBF798C193F199C1F532AF383555B 9706769A18A2D03D:835FD788C089FD45:200C0CE59717D5D9AF6813CD207FEE73 EDB76C54847DA59E:B0C0125494D39CE9:2828D51F98AE0B33F4DE2B7FBD18A529 178A49BAFBA53F23:ADE26742F25EFBE1:61AABA6BE48B0D0D14FE5D27FAB852A4 DF4CDB61A5F38536:9C895E72168B409E:2080E2409BA01C8532FC84403EE8C06A 7C944D08DEF34C0C:B784E23E00B3B498:271AD15192C4D1204A4A2561E3DB6FF7 F4C76C1D47FE568F:62F9E58B0364B0B6:C1E297C0C761777D8A76FFF02D22B859 CAB16583E15D0074:4563BE765E74653A:23C807A2EF0A551F858FD52D125A47D8 97B05C60774164AD:714807767366854B:9FA5D4D8CBDFCECD559E3CE88BF78EE1 7017A263985B735C:CC68E1ED7F7C7832:24F4E91083139099D663647A7FFAC321 15475A90DF04CD29:416EAB1EBC155782:7CF8626DE76D8462218ED5C9DC8ACC26 87CA0AACCF146CC8:DED575554058EF42:3C6AD7DF17332A3E1E3DE06007387357 9268AF048ECBAE67:899B9B877106C764:24237A762D8A89383A2949F5A0F5EC08 AF0062CD77A84EBD:26DB40C151B74530:209A2833A39472D9720380FFB2F74761 F922CA875B991A31:2763F255636A34C1:22EBE7A30E8855B3B453A6E926D4F187 B4ECC305C3DBD8E5:FBBEC8F5DBF4CEFD:1B5E23EBD915C1FEE59F57DD91AF7347 3DAADD7A9633E19B:4DE5C07EA1564A64:A6BFB85FA91B8CA4197C8B502A62F972 # Cascade tests generated by Crypto++ 5.6.0 [Cascade(Serpent,Twofish)] 0000000000000000000000000000000000000000000000000000000000000000:\ E78516D21D23DA501939C24C48BCC79DE78516D21D23DA501939C24C48BCC79D:\ B50638F695AFA16F9378D43374CA8568600135ECD1E513838722366346BC4B21\ 01422291558FAA30A3196CBEB42E67F4C075882482897F72A8A30AE9B3AD426D 47CB8147C5290D6F94FBF3351777087FA731610A3F66E3CCFA6D9B18F980E687:\ F234E056923B3DB26AABC8F604F0CE2C1A7F4C35B0B74958014D791668FF6BF4:\ 9E8F6BC09768AED8F533FA4FC35FF6FEB8020FFBC8350DDFD20ACA7ECF1889CF\ BFCD78E261B9A3CD825401AFA7ADCDFA88DBA8230FB92D4B942C25EE92F27A02 B9A28D32734EF678BACD5539FF9FF951AF81F44AFE223256E5D8898FB862A767\ B90BD2D95E17E4411D02D49481CCE4191EE2C7AE8EBDF6312BDC66317AD42140:\ 065E390C4FD10E9929F30D89A67E0D4CFA3AF90BEF46B2B435B53CBE0B7DD1B6\ 12D4C5E2D03028B488000C06517434FC70F7B62C273CA5DEBD9CA7034D853087:\ 1EF34E47005028F2D95120052855C6001225200A333CA4D7D5A356B5554EE2AE\ 7EBC9BA57BADA0DAFC84C2187C51CB3CCB5EEE40F27C00537FFFCA2851DD8BD8 [Cascade(Serpent,AES-256)] 06CEB2B4FD2F0A27B3C90D77D2E9BBD3665A8DCAC9187B1EE9F6A60D39042A9D\ 3719883B3E87845B9D4A8BE258379959775969CBF5768A359797B2FA19FC2FCC:\ 05FFBF6E8097FC746FFAD8C3306E6DB668148796180F26CA5DE06AE76DE16D07\ 8A0E72B259982423ED96FF95719DEB160CEFE7697752B0CFA984A18DDCEF2EC0:\ EE426051D1ADCE09AC02E2023331F273BB1B2C4C5905DEDA3E1032CCD0DB5611\ 5B011F05688F781E3F790364968E06DC6E7BD5FA38DB068CBD34A85B6B3A9458 FBAF0DE6C09D10EB31F21A7C784BF453F82F51EFFA8B363EE6B33DF15204F434\ 45170DED1E39AB922548ED82AAADED6BF470A5226B69D025FE3D532AADDA069C\ 464D2C8A65E1A18698BD521AFB3053229C1539626392031F8C36229FF3178A7F\ 5C716E30DBEFDDD4AC2113071977B795A8B29DA7F467471A996FB63136387C28:\ 7ED1F730EED52DFB63E073A40EAE404E443ACEB9A3B55132E740ACE1EEDF99D0\ F22B3F2326E2E124594E75ED1915C8D155F24269254B22B6E8C53E9F64E70552\ D5E3004782C6C47341EBF8716B59DAB49B512B6DF7F9D7FB914FFA56F7F89B56\ 1B6A5DFE9334B7561144B25FE0F57BEBB4058EC7D9EEA57AB62825A86312BBC3:\ CDCD23F5518DB5DAE8C69B56EB352D4F3C4A64A5FFC8E5BC2511B8310993C48E\ FA30A0F9E2B98A0FB1FE64173E6A8038047AEBAE22E17392FE32CF1D0DE3BB76 [Cascade(Serpent,CAST-128)] 27EDE4B2A3784A33898FA330167317BF7354072672D49DD03D13D3F0856CF3D9\ C17C1237565E7320BDD23C03BDE195A4FE58623A983DB9C308D5A976D92CD6A2:\ 2D7096A03BAB4DBDABEDB9F069FE68C3E12ED65ACCE43ECF7F6D810B5EEC36A5\ 22B605715BE12003E324436652BEA06BD289DBE886A5DE9E51CFF6C065A21F2B:\ EFA9CC5F3E245AB463CC60A5015CB0F663676760832CEE6C633A518112E518D4\ 5DD4B627E9507CDB03A1ADD870E28362 # MARKER: Cipher Modes # Cipher mode format is plaintext:ciphertext:key:iv # The block cipher tests above are distinct from these ECB mode tests # for testing reasons. They could otherwise easily be CIPHER/ECB/NoPadding [AES-128/ECB/NoPadding] D8F532538289EF7D06B506A4FD5BE9C9FD7A929E0FD917686D9520ED236A276D\ 69E63C821F9DE0BF23CF1D19C7374FD1C3139DE2E1BA4693C3E9D29D774C2FF4\ 69E63C821F9DE0BF23CF1D19C7374FD1C3139DE2E1BA4693C3E9D29D774C2FF4\ D8F532538289EF7D06B506A4FD5BE9C9FD7A929E0FD917686D9520ED236A276D\ D8F532538289EF7D06B506A4FD5BE9C9C3139DE2E1BA4693C3E9D29D774C2FF4:\ FD7A929E0FD917686D9520ED236A276D69E63C821F9DE0BF23CF1D19C7374FD1\ C3139DE2E1BA4693C3E9D29D774C2FF46BA2DCF84C0E7E4D75CB53AD11BA76D6\ C3139DE2E1BA4693C3E9D29D774C2FF46BA2DCF84C0E7E4D75CB53AD11BA76D6\ FD7A929E0FD917686D9520ED236A276D69E63C821F9DE0BF23CF1D19C7374FD1\ FD7A929E0FD917686D9520ED236A276D6BA2DCF84C0E7E4D75CB53AD11BA76D6:\ 00010203050607080A0B0C0D0F101112 [Serpent/ECB/NoPadding] D29D576FCEA3A3A7ED9099F29273D78E2D62A890CEA3A3A7ED9099F29273D78E\ D29D576F315C5C58ED9099F29273D78E2D62A890315C5C58ED9099F29273D78E\ D29D576FCEA3A3A7126F660D9273D78E2D62A890CEA3A3A7126F660D9273D78E\ D29D576F315C5C58126F660D9273D78E2D62A890315C5C58126F660D9273D78E\ D29D576FCEA3A3A7ED9099F26D8C28712D62A890CEA3A3A7ED9099F26D8C2871\ D29D576F315C5C58ED9099F26D8C28712D62A890315C5C58ED9099F26D8C2871\ D29D576FCEA3A3A7126F660D6D8C28712D62A890CEA3A3A7126F660D6D8C2871\ D29D576F315C5C58126F660D6D8C28712D62A890315C5C58126F660D6D8C2871\ AA26D561F567520E8AE47528C24C18D731A2193D9A97FED6922B17AAA6372B74\ BE5DEBD559E303C9C92B174A5107BBFEB626D8F65EDCCDF3AEE475C8A1837722\ 41DDE7C1F1631F5FDED4F42746471BD651D238BA86176EFE39E4695AAEB73B52\ EA5926CADAD8018962E469BA920CB8BF1EA9062E4D9CEDD5FAD4F4C7990367A4\ B966E5C5D2277288C61B96A559CC84AFB6A6583C5AACFCD6212B0BD8AEF3C6A9\ A11DDBD175639341052B0B384678D8D9352299B71DD880E29D1B96452DB86540\ B2288B968AE8B08648D1CE9606FD992D717EB02EB81A2E939D54ACA91087112D\ 0D809C5EE82F477EBA7B956DBB23463B0F0190D616F5294112FFB7884E8B37F9\ 41BA1B505386B7428B88338188F7E718A3348230BF5CFA552F88D22463D9703A\ 115351622E016BCA26918D17E13225F67EE4E3F2C46FE52ECBDA044C585717DC\ 563A8403FF5309D62370B1DCF5A11EDD2F7D73602B70CD2553E44C1D3F170126\ 155BBD9BE3A965B345E834718F651CEF6CC65E8C5C566E894817350F497816F1\ EEFA51FC91FEBB6E9F8CB141CC0EB6AF3C6F8380CBD3C996167F2F0E90E71B75\ 6C87EB62A4975356B28DCBF6A64A0BD107206D48FE6DBE19D50314B90AC87B83\ 35706F9B26007071AD8105CFAA1C1E2FF7FEAE5CEC4D11477F24E6B200906870\ 3C0E29E2950F2AC2DACD63DEEB5C7EFA9FDB9F3B740563D5518287DC981FC9CB\ 46D4B5A5A86FEC08FE70D18297DCF51072DDBE038DA040EBB12C509F5940A212\ DDEB59F02132BE4581FC23EABAA960D6341D9352E36DFD6E4EAF0F6F439BC8CE\ 73A9AB3164FF30350F2DC08E939A104D6DF0C2C28F8E2D44468A61278BB6B429\ 4DAE45AE0CAA032FC97CD4D8C57FB83BBA8AFCAE22070BC882D3A42B38A09E65:\ B2288B968AE8B08648D1CE9606FD992D717EB02EB81A2E939D54ACA91087112D\ 0D809C5EE82F477EBA7B956DBB23463B0F0190D616F5294112FFB7884E8B37F9\ 41BA1B505386B7428B88338188F7E718A3348230BF5CFA552F88D22463D9703A\ 115351622E016BCA26918D17E13225F67EE4E3F2C46FE52ECBDA044C585717DC\ 563A8403FF5309D62370B1DCF5A11EDD2F7D73602B70CD2553E44C1D3F170126\ 155BBD9BE3A965B345E834718F651CEF6CC65E8C5C566E894817350F497816F1\ EEFA51FC91FEBB6E9F8CB141CC0EB6AF3C6F8380CBD3C996167F2F0E90E71B75\ 6C87EB62A4975356B28DCBF6A64A0BD107206D48FE6DBE19D50314B90AC87B83\ 35706F9B26007071AD8105CFAA1C1E2FF7FEAE5CEC4D11477F24E6B200906870\ 3C0E29E2950F2AC2DACD63DEEB5C7EFA9FDB9F3B740563D5518287DC981FC9CB\ 46D4B5A5A86FEC08FE70D18297DCF51072DDBE038DA040EBB12C509F5940A212\ DDEB59F02132BE4581FC23EABAA960D6341D9352E36DFD6E4EAF0F6F439BC8CE\ 73A9AB3164FF30350F2DC08E939A104D6DF0C2C28F8E2D44468A61278BB6B429\ 4DAE45AE0CAA032FC97CD4D8C57FB83BBA8AFCAE22070BC882D3A42B38A09E65\ 58A51ED82169DE7027CBE72452626CA3FF6BBF2FB2C574EC9D5656505B516880\ 47AEA89DBBB5C4EBE819C5BDFDAB16033D2FE7D01071373624D99845D90E32C1\ 708C609C4E75BE40D8DE77F8EA78C2CC98852792C22E971F29C2E125247FB43C\ AD1FD857DE9B8016C5971FFF86AD399ED669FEF7481FD73B9A45B1CFFE9C556D\ AE9A816916FB1F5822B2CEC8986F6E5B156775D0F6F432D57D351C62A24AFE63\ AE812270F7416D05E153E5AB703DCD3FF320F6AD3D00647C23F08699E0EE9F5E\ DDB3C717C2A6D3E58D38269DBA0243926D64CCD92B1101086DD3F0DDB73312A3\ 1D5F5EA0FD18AB84E242C96FFCC222F9FE12D5B15F5A3C365E9FF3248FB43B38\ 5A0F73507F49A08E68952BEE09DC7D35E7B29A44C8970624CB3A93DA4AE7E498\ 35AE41A5BE2EE591750FF9A7D431B1EE8A69099E689A06324AA0AE431ACAE762\ FD3B90A8B269090A4CEEA076CF1EB7A580DEDE896BED63917384B1C5E18B7B57\ A7EB6B127A7A32898989E32CFF9A46BF6A62268500E53AD8A5FBC95226266BD9\ AAE1BA501274C49A7A7EC67D7577114B7707DAB9D066AF086C09E7DD4116CEA6\ EE25DA9A65EF05A31ED0BDF56D525EC8968D1D01AF7165C5AEAC76BD367A575A:\ 00000000000000000000000000000000 [IDEA/ECB/NoPadding] 000000010002000301020304050607080019324B647D96AFF5202D5B9C671B08\ FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328\ 000000010002000301020304050607080019324B647D96AFF5202D5B9C671B08\ FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328:\ 11FBED2B01986DE5540E5FEA18C2F8B19F0A0AB6E10CED78CF18FD7355E2C5C5\ 85DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C09\ 11FBED2B01986DE5540E5FEA18C2F8B19F0A0AB6E10CED78CF18FD7355E2C5C5\ 85DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C09:\ 00010002000300040005000600070008 [DES/ECB/NoPadding] 059B5E0851CF143A:86A560F10EC6D85B:0113B970FD34F2CE 4E6F772069732074:3FA40E8A984D4815:0123456789ABCDEF [DES/ECB/PKCS7] :705FDF4DC7ABFBFC:02D863A4885D417A FA:2281AC7CFA703BA9:05ADD235B01BBDA7 B895:8C3BF9AB9D16C8CF:93F04843AFC3A191 8E97DE:BE38BD2AFE108D2A:1F4E2C013314B55A C1DAE88E:998341E8B0CCE82E:0F59C05186431E13 A6E0360E88:F5E88FCC387B8883:E68BF7B98D61FED0 55E67A79F043:A868B107BD96F35C:AE3AB00A0BA38BE0 D77C93B63D6D5B:19DA07A34FA683C4:9B661C7A536AFC6D 328D09508E747AE1:9C75845C6BFF94438EB7E7E4C77342F0:8E1C689280575F05 421D4BDC3869E59F07:8DF60DC27A2E2EE23360BE31343FCBDB:EB4A6B437572E1E7 160E525583C3E4FBC4FE:9B649660DFE5B875CD81180AD627943F:FFE58726B90C9F97 E873B3C2B31130719E6469:6E33AE2AF48CC39697800A3AA357CC5E:560EE1ED2CC2BFFB 405915ADC0111EB8AF225612:569BE1F2AE91785B0634F8DD4EC1DFF2:012A7DE9CBFBD230 E923C535186730F309CDEA6DEA:846D7314F76E00902054BD2B2AE1F580:3D5D56CA2E8E359C 116053A5820F9D36650EEF49A05B:\ 9BD56C43036485B648EFE6D31E69F0C6:2AD63A5312BF4259 B6DCD40077FE89138B5A2ED35E1B3D:\ 2FBE419BADA6D4BF3F6C7BB2A1AAC329:7FF12D4D8A9EF138 08F0AA208F8A06C6292838A8CEE9104E:\ 44BFCA2722D274504AF482E9261CDB7B16918BE77A461B3B:F71A3B1AABD660BD 878412F6255FF4360A22772711289FD351:\ 9C92FDDE178D3B6C895AAD1B8DC886176910B021D5B3AA77:1ED8B08898872631 1399A0CD9F2778BCFBA9C0F7E7C89CA069E3:\ 5972F89D8C161DD30A409BCDBF43B20BB104E8A293C48FDD:0DCB3527035253A5 EA1CC272D3725E4C5DC56079FA3C9F26A1373A:\ D1B2FCC83CBF11E022C058FCB988CBBBC3843517F5E9D900:BF4B260909243B2F 098DD47EA5784D307C115824CFC3443983FDF58B:\ 77DFAE7F46AF6DB0D0E5775859943E2875854A680B54B59B:5D869F3486DFE1A1 [DES/ECB/OneAndZeros] :09B0A56E79B07C38:E7BADA575103632A 96:C602F30C18C2B878:06779EACFBA84CFC 6EE7:5E9FCE6A89418AEA:09EEAA55C12DBFED 665672:85589647B376B1D1:79C5B2870123FA92 7F862990:ABCEF68C99607B22:37EC3B88DF82E1F3 39E551A9F1:04F6D20B0A25B97C:0BD2E04EC57814A1 52BD5DAD29B0:0828E5AF2A1E1157:8900F77C54E909C3 49EF95ABD932F8:A3325FBF67FE8F22:D5E02CC281CD647B B0F0218A6C30542F:E8045C90741ECCE8F90B5469B2E3B359:C4E91F2F3EEC7639 80EE077361737B995C:F2E9AD2163C0665263CD11C7D976260F:AF593C04EDE5F7E2 3BE81FFC61B21BFC81D6:59EBA86DB5734577B9E665C3D8BF65AF:77B77F440177BF65 3EC3AF047C2817138C818A:B8C17B79CB5160EE4612CB5639D72AC8:B1E69181A32E7CB1 0133FFE3ECDE48F98D3BDBD4:8CBFF36A7B691F168AA2D93A9360DFA5:D6492B1E5A936965 638A220840B1ACBC24CE4F8B5A:F7A3E8DF04252727E4056A5AF9392DEB:404B2DC43EBF706D 70197E5EE1D774B11005E8700740:\ 8A8A81862C313C7F904D86B953A6E5FB:8188847D3F21BB71 9EB11AB4E97D026703BFD0645108E9:\ D7D02FEC752ACD59B235441A4D6682E7:EE97A705E4E375C8 87F1A7ED6D8C4AD56AB716BC8E02D8DB:\ A6BEBCDEB9285A54EBCEF6F94142A60C0E5D90CCA6D256E3:A1B692CE93547EC4 5448723839EA0910C29931F5AE6BA9423B:\ AA328F5083DBED23B18CD35C4B4B185714DDDB02E81214AE:824BE4D31F8FF51A F454E24EFF899FA825534965855D2B1D03E5:\ 27D077F2B382CD8C6520346DB77D83D91BD5B08882203858:91B2A69AE61A53A7 8C4BCB186170411186D2A0496051E0988FC83B:\ E1C1D7EF18964E2EAFF84169252F94EE315209D5BC151241:E43579BA4E10BD39 90CBEFA6E4F3D57BE288197E3E1C2055CE07979B:\ 37860F65AED6EE5312E3FEC4F2CF948A3CFCB27092A7B3C8:346ADDF6AE9E62D5 9A5476706A45500C9AD6AFBA73E68E0355C11DFABD:\ ADC2FACDD08D2AF9CB00E22209C109D0D39BDF9EBC1200E3:3C6A1A7DEE4FF813 9EFBCC5E45E15F83D4A62995F4F8CAB036A63F1B18CD:\ 2D9C371F7CD55E7A95B2042A91C9B10025078FF0070EBC62:D584B755C7F2E8F3 3758CF70B2A1A36BEB273545809B35C92202124A30A113:\ C728B4B0F49233489B0453CD81FE8C07C68BD17661F75523:35732A4D581F153B 00E0D8C19605363653DFA5F778DAF9E959CBF9BB7E4D3245:\ BB44D4E603A6CD1EBB27E47FF7AD9F163420E58B97F1C7FF975B521917E7879B:\ 58780533BD9EEDBD [DES/CBC/NoPadding] 4E6F77206973207468652074696D6520666F7220616C6C20:\ E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F6:\ 0123456789ABCDEF:1234567890ABCDEF [DES/CBC/PKCS7] 4E6F77206973207468652074696D6520666F7220616C6C20:\ E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF277:\ 0123456789ABCDEF:1234567890ABCDEF :FF4903E653AF83C4:46B534FBFFDAE457:297873B948A44B5F 69:60FA7B46523AA51F:D581A1D0C70F94A1:C1DDD7447249EF80 02B7:63C1C1EF79555ED8:A415B62E7E94CAF2:57FA9B2F95F57401 568960:D0321483090F524D:5DCBE42DB374090E:B6215A095582763F B6EAF23C:88E289E1DE3E6451:8FE92291C654EC9B:0C054BBD31A9F623 60A658CBBD:89BFFA9E36FF1780:DBCEE35E86088501:11A8928BC6D0D117 7E10CBD9E95C:AFC5CDF559ABC6D3:72338F946012CED5:EAAA48B0C2EE2F3F D907CE88F077FA:3476402272856EA8:837FBB3167F0CCAA:CD399DD3E402F8F2 9476E85B198C9AEE:1AF298A150514CA70D252F88271B3CA7:\ 308D1C02E7A4E09D:6BAA74F7F1A72E1F 5C11285270E9606CDF:78665ABFE3DEF34F8BD55796825EE915:\ 126AFF39882542EA:51BADB479DE66A73 D1D3D8675E42A4242FBA:E77BB4A24B4EE8C9EBDA4971C2E60D10:\ 0AE8510BB0FB3994:6C7293A8427BCB3B 65026A8A41EDC1D880F6C9:45A6EF4ACD49F9F1D892A808FA7B6F28:\ 0BE9277B3504D524:E47EC7A77DB94755 D72E81F4130107E396D5FB27:A88EFF91876A1B6958D52F99FE9B18FB:\ 2F03C36DE4F78E13:99FD2E8848F33FE7 C8A3971EFDA18AF1B18BFAD98F:54FF90BD90F6213D761F4B3FF89A8DED:\ 69329672E546C969:294922CBE7E12341 BB9A90F11551531DE512DD48270E:9BA7908E56EDB1BEF992FAEE40F5B1CA:\ 3007D71E86D8EAF2:D7E300E168F60063 77D6C182E4DDD444D614BCFF98FB13:CB50DEC4728FC2F1A1A5DFB84FA1BD25:\ F73C8C3355092EB6:2E0DB2552BB83AD3 40AED22F93DCFCB1D734B7E4657DD31A:\ 66D17A6E9D5BE3281E857B4C7E497988CA684524FD994882:\ DD006F15E727CB62:B256DC4FDB58451B BB25564C7EA1E5BD22016915805C27B51B:\ B7CEB5F5ED2945F131064BBB9213694B19A04FBD1F138866:\ DF70FF987582CCFE:88BB3B9BB2EA56D7 49DAB8D85EA753CF4AE2ECE7A80F0784E42B:\ D7FCE9E5BED161AD7D950E453677E5BEE422B7542AFC0BD3:\ 747E09FA9BA257DC:F1BBD406191DE0D1 DC13A6ABAA35CEB3E6650F825A67942114AF2E:\ BAFDB50E16C9FF4449BF336D410441D56E1E5335B54C9F11:\ CDAD411D0FA80E9D:C83D55B1196958C4 A8896D88907AD77AE790828C0A3384C1614E07D9:\ 70A9EB1C11BFD1B1D68C20A6B72C869DAC5372A8ED46AA07:\ 642D12C591F6A4F4:C17D0C69067AF296 B3FEC4CC29DC1ABBCF7D86F01D2C02C2A723E7C2F8:\ 48ED5583A04D333FFAC9D6462FD96BF79222EEEC70A6AE70:\ 62C62F54C426C59F:CB6252CA271FF303 AC0B4D5752D2009BDCD42314D9723716294146424542:\ 8A284713F8C9873AD5F558B995C5A67A66557A52601975D1:\ 386DCAD5EAE86830:48153B966C8D686D EA331F6E518A8AEAB2EF0A4E92E0D198DF5DD0CC74369E:\ 6D3D7DE9938935F9FB9AF839E416EF6F842F2ED827334BFB:\ 782545EA65D89B01:C2CE203020AABB0A B292D3A3FDC5D709709C87EF91122761847871F9B4E33426:\ 21DAE17D157192146B52C49D90F898B25D0D1DFE677E8CD5B568814E9C6BB6A8:\ ECC650E1ED1CE8A0:AEBC43AB811AB5F1 65026A8A41EDC1D880F6C90BE9277B3504D524E47EC7A77DB9:\ A3B6404C4D87F72D5E0995D7CC20ECE742D9705D48524CFA2820317087FAF578:\ 4755B8639FD7C8A1:4152E22F14BAAF0A D1D3D8675E42A4242FBA0AE8510BB0FB39946C7293A8427BCB3B:\ DB621F2FAC9A924C83ED0B9E8ACEC9F1E23BF3FF2AD6EFA814903F2CE293107B:\ 92A18B78A25C4B7A:C3AABC68CEEB22D9 C8A3971EFDA18AF1B18BFAD98F69329672E546C969294922CBE7E1:\ 940C610A41F04E7D9BE0A74D5D00FE97A2647D3D16E9B76FF0DB5BBDC197C82A:\ 2341239C09C73427:C4D5B2B6863DB060 D72E81F4130107E396D5FB272F03C36DE4F78E1399FD2E8848F33FE7:\ 7D495CBA50C4127347E3AD29E3B8C098A3312782E3D45ABFA1621F64BF8B8A06:\ 166EA8ED9D29E1B0:2BE993C1BE8FE9ED 77D6C182E4DDD444D614BCFF98FB13F73C8C3355092EB62E0DB2552BB8:\ 9D926142271E814BA4603509187C9020DAA0D50F15AF6E698E384644E9468C11:\ 3AD3301094B2F471:8638489AF44732F0 BB9A90F11551531DE512DD48270E3007D71E86D8EAF2D7E300E168F60063:\ 44858416F946C7FBDFFD720282881630803803AB91CEAB1AF4F68F50E9C16DCE:\ 04BBFD95AC12E6FF:30CB120D13391C44 8EB8FAF49126AD5B8A0AA6DF8B52DBE50DD5AED271641EF983BD650DA69816:\ 5B4622F1C4FAA817EE3AC181B969A7AFED7117E23F68BC6017519A7D1399CFE9:\ 35501029E137D63D:C1E0E3A06B357B51 [RC5(8)/CBC/PKCS7] FFFFFFFFFFFFFFFF:7875DBF6738C64788F34C3C681C99695:0102030405:0000000000000000 FFFFFFFFFFFFFFFF7875DBF6738C647811223344556677:\ 7875DBF6738C64787CB3F1DF34F948117FD1A023A5BBA217:0102030405:0000000000000000 [Noekeon/CBC/PKCS7] 13:34B809F9AE45A52C3C8509DB14932E88:\ 56C5E79C74EF63A2B64D831EC0FE0F5A:\ D79A4D3B34BDE6BFB4DC0BF752987080 0D67:162A78296327F770DE69D67E4457A8C2:\ F4983295EF1FA592DAB2310E2E880FFC:\ 51F3733F3165D6EB65D5B43EDF35D740 63AF95:D174647B1A88041C95C7F008C7BA4A28:\ A91A7BF471F67C1A0965E581A2222406:\ 1B5F5B8141905F070FC52D9CD50968C1 F7EE3026:9C1498690EDD348D517ACCCE942235F0:\ 138AA1677CA227FEFAC8BFECE91CC2A3:\ AB60820C1B2969460532B9C3AACF2863 0F330C110D:A3DB1F6987910561A9D34CC4B614CE73:\ FB9DA8B850ACDE73B5995D5E913E9B7C:\ A062C36CF4F5CDBF6424D6D37F33FCC2 74322DD18E42:D18CCAF4D22AD3D84BABD35A63DE9BDC:\ 387403BAE6E59D5E028D9AEAEEB3EA82:\ 62200EBB9FF187D0502B4DCFFCDE6314 C70A03E92ED032:8544D24B952DE66076CAFAF6908B61F1:\ DEEE15B8CE0C0C413B0AF67C25BA154A:\ B357D26FBA489278236388C9E6A21495 AF8CD43A3261B258:D504F374BE690B207353884B04C5C0E2:\ CF66029926B58A127BE0EC73B2077100:\ 522D3061784EAD56F460947A6205300C 839FB81A72FBF5C48B:53300ADAA73B7D064C1B988D188D7F69:\ 5818851FB541EA23F545CFB969436D98:\ EB8BC39214CAA0EEFD886154433D3E3B 58AFB2B30F6716934B01:0907B00FE2F8DEFD08FE54AABB5A4B10:\ C5E00BAFA4F9E1705589441B9EA9505F:\ 24F146DF583FF0B84557446575EC3284 83F62FD42E895E13B7E34C:F64F02BED29282D976A61F6C02851B27:\ 2864CE9F3A5511F63903CF0CD0472240:\ 96C419A75FCEFA60E11312CEA3241EA4 99D8D0271E5D6C510B38CFEB:15CAFCF3AA4BB5A1F018267C81482B4E:\ 6D5E4E6B297C7A69AF683FCB18C4DEF4:\ 202DD513E6D521842CB116CECB1F17A4 58E5DD103A644F47351FE13A4C:AF390EE66A8987C6777B0070ED0D759C:\ DFF926FD70664DBB19833EBC9068AE5F:\ 7E62EDC1E23489D5CE838CA3C5E327BA A35798EE1FBF7F92187633E57FAA:1C4D55E9F8B8D8458B751D8016E0CED2:\ 92D13CAC6300EE6F17197E299ECE8671:\ 3F31171C66235B9D9EF6DCBAD5A33AB6 D8A412EAB58D217D70C7B9C604B783:AE9DD1426DD34F2BF7B3B478E59D51B9:\ 99F1B3BF5F635B125C6E430BAF0FDE0B:\ 2D64CD72703C8841F8F451E586CE52BB 2CC0A7196FFF6B14410437639D4E52A0:\ 21698232D55EB045290B49C25927502FCD4314242F2B9DF225514FEF90E313D2:\ ACAE925B9F91D3BF59E6344D1996B7E6:\ 66BE0EC9F49DCF852451439BEF133EC1 0A6B5968D3AB48F00C501AF499BDED6FDB:\ 432003A72A1ABCD2A463465B9794357E209C315C087E35C5F48336295F67F685:\ 2AB3F9635F8ECE37C016FFA9DD5A5279:\ 596AB3D7A114DD167A147FCB4E8FA522 7E96CEAF7F052A4D85C487FAF30A712E5D6F:\ 790C13E773B628CF27A92925CB3E605351293D031696EE1EDF738727CC523DAE:\ C2DE2993F036A42278976FA347EBBBC9:\ D6AA4E2906CE2A41DA17CEE09FEFF11F D3AFD0D1F52D332005205944E465EA567D3DEB:\ 3707DDB6A30F4D69A5B37CA8ED053A7F1C638D9C9B940AA09AC57A4ED51878DD:\ B20DE0EFD63F108EEA8BDB70D0392F6B:\ 329D0EFC4231C92E04D9A0F2BFD2AB0E 5A82E2FC993C66A31C005313B34193DE78B4E04B:\ AA1892D23ABBC7B9654155C9386C87D3D33BBB6086E567E1D713135E2CC2140B:\ 8A8A3F7D5FE8F459A1461153B4F76211:\ 947C1AEE44B94B91FC1C62C0E9028284 3077002017E6E8E72AEF13DE3FA8B6634F9ACD2F33:\ 897D3F4494E271915383322EE393A6C8C24E456446A04CEF0F183B79A322D9C6:\ 0B45B853970F62B6F24BC5498F1695E9:\ 860A1A59C1F3236B58069AE9B3F58BB1 8A6D053CEE814DCD67D809E325236B08658736119D36:\ BE86C4BEB29B375D461B48A1838B689B6A22379442997C2ACC8D3BAFED8D4836:\ A51BC2500F49C9CA2B684EAFC3929F63:\ 8E982F2645F6CA43C0E5FE6AA349297F BF4704F12FC4573DF7CA7A53FF1AC9FC9EC2D0A0155803:\ 392929D03CC9C781D66F57FEA40984985006AF5C5692359E40C3089A0C08DFDD:\ 6D0FF160740C3F2007F1A2D9FF0764F2:\ 2024652B0E280F4F8A93E1C4D586BAD4 DFECDB8353EBC87CD93D9032C85B6FC7E325DE835F69EA2D:\ E706FDBCBC6678583BADA7959B49ED4FA21F4E601A7A68D2FDB60B676AFF33C0:\ 678B962676645FCCF06DA0DFCBD33AFF:\ F120FC32EAAFFB07E35C0F15A8D9EDF0 ABC5F54DC200DD2DAA7EAB951F02181DD9720A80049E01BDC9:\ 0D37E7254C1ACBF30A7AC5C69490E90B65A0E359D2146BBF50B5BA4787EF9ACF:\ 5C592FDC4B2B3DAED6B5A7F6A2CE9CE4:\ BA1583958621CA564AFDB695A0A050DA 9EB4D3B7B4C56EB33A8030807FBAA27D22246071D983844703BC:\ 2304C35624BB448BDECA623D39445182AC592C71C20878F5E39C8E9A39762A1F:\ ED4B91F32EEA0976A33F64FC43AF2CFE:\ 6EB6F57BDF2B1591FE46CA47D0DFC0DA AF7676154A55F1F3D15B76D19CADA03A5D8436FD2B6AEAEB222A5F:\ FADDF8B2B3B5B1685923E5618022A832180493F47153AE61F8404A538B4DB737:\ EBD731F49D23576D1E8CAF4BEF574A05:\ CB9E26D5905B16EA48D219456C48EBC2 13122D32A60EB988D34AD32B788B8CF5CCB567FADA3528B0DE384050:\ 4B951CEDBFAA5A5178D22CDA8664AEBABE478DAB09FC0BF2DBE973C404FE07F6:\ 9A912A664FF96EE3F469C779155501CC:\ 024D04B050718AB5682DD19AC6A23592 E19A1FA72689052C2B9C76A33000D8A0EEC8922A1BE781A6896E38659F:\ 71A71BCC755B92120C31F1B99C085E236EC462FBC6C6296FAAC5AB0EF6CA811F:\ 2E7E22C4EC84A63DFB9F98306C0D45E4:\ EF523F0DA968AEA82E2F2D23E8AD0F07 D0C9073DD44DB4A4970ED69029EB9FEC5BC336E9D6E92A680A75EF0C3151:\ AFC5FAE5E52AC9CE466881AC5B667385234F6792DB7645F42D2CF36760FAE219:\ 1311EB599EAE368A9C1E74F9D1D47BAF:\ 4C7502264C3C81E0586EE0D9945B8649 20C167D950AC5A84B6FD9CBA41945F66C24F79969EF9B19DD116D76CF64A5A:\ 148752675C1DA7236701AFBBEE8245158CB80829CBE1079B5F4DFCF59DA4FA04:\ F16CD73539227EC5BA4B516C7CFA75B3:\ D17E2642CDE1B30AC5BD01CAC83CA84C C068288373DB250F6714E0F9DE4A63778C91E1EE81963BCF98F2CFF2BACF3553:\ 31E053FC7124B23E6FDC33878FFEB9A8421207456460673800798E422A7E94B1\ 195EF848BF1E063CAA7576AC094C1E4F:\ EC35A92D97B902220D88C3386EABC55C:\ 5431D970289E7E024CC0BABADD674C67 03940BC21C33D89773064B8A35CD9FD282F090BDC208A0EED18AAB45AFA023A1\ 88:\ D3B49ED8640D32CF6A088F8316929C703039D9D3B6C43C32DBE99F8CFE54CAE4\ 0C6B9B587F11F1E1B421D987AFDC7D71:\ EFC07A770AB4FBAB2259B3A3DFBC6782:\ 5E3A9763D6DB8699B903D230387FD45D B6B8DE15FA0A356241354E771BEF08A82955F7F35DF8E286EF17DED946C770B0\ 5356:\ D3E2469F505D7DC2683AFF037A1197362F40F5A623F7D8350BD5BD090B63793A\ 13A6958BF9E0AAC0A8A792B92584A295:\ 0B747E8737C8555F5FCC1418A8E31B5B:\ 0C403788F70790C0503152208A8E9CCE 923EAE6FBB20806FD86F7EBE2ABDECC838EF66D8F9AC1C2C185EE3C1BAE0D9FA\ 32444E:\ 327E33EDEAD51CD874420D8FF3C0641CF4A1187B2C56259A71F60C23EA6D8CB7\ DAE38198A8321B6ACC834D27EB509CCB:\ F43A11C50188A97B132732245D88E2A6:\ 377F526D07DB430BE1C478225612841F 9057941CE977D02B1F6894251363F425DC515C68150BA5CE6F3CB1AD2EAF1B56\ 66E67C16:\ DE4DBF13CFF69DBAD566A98916B1AD670F6037DBA9E06B5F9A3CB59E08D24157\ C6E6F2250211B5F32631D6775F06A579:\ 6158B9B7AACC9DD9643F0627A616ED3D:\ E21158CCA6D0656B58C64195B3618B58 8DDB465D9C82EB9C14BF2C2E26D90D8F1B5E444B12ECF19791F16DBB2DEC2D5B\ 612F666D64:\ FD774E848C09A079ACDD9D44A419300F2847F93478032C6066FA9E89359C1280\ E7AAE4C1D1933A47FFE0E02E9582569D:\ C8424ACD2EFD7C436FB1585AAE45CCF7:\ C15FC97E431ED75E523814EF991E3D82 124B752BA886C4ABD367AA6DA00115EF08C02D9308F739A63197D132E7E1B21A\ AED339229E3B:\ 2994CA132E3A30DC1B04D9368DC9F37401442E78AAA935A63CD6C7C9DFB1ABF8\ 18B48863CA8F20E8B4F5B582C3AF6284:\ 11F33F15B8C0682B634486C48BCCBBFD:\ 0D96D9FFDE5C617201E0997747EA02E7 37FCB3C6DBE79BA1FEA19FF5C4F14DED4F403E970DFA9501D57751E38A174514\ 862575CAFD31A4:\ 08D6FC20CA4B2487929F9548D7D43E6E6E0676B2030FB539FBCA79BDBED41315\ AD1E1C6677B2B83274BFD5B6D62CDFC9:\ B522777FCAC3652A1FED51D8FE3383E7:\ C9170B715D6CA0EC9CC569074A21CA7E C7AF9A384643D90CA1FC461209048836AABED909BE8971B4D2B7613628A3A909\ 64A0891C4B658333:\ B3D53C6E550347335D677019EB675DFEE6EF263946C43CA4C07D68340E745F51\ B5019BE2841B834154F0D219598E0884:\ E258D2823B59737DDEE65B6139C8FBCD:\ 32C7481FD836BC3A9945CAAD3477E16F A9F2347EE607A05E505CE488B779BB6908ADD5F7DCF20F47F895B64B029EDFC2\ A3A84946BE935533BD:\ AF1C8D0F1CAB3C4627E31B69A9207EBAE680D8D092A411994507DB4764399172\ 3B6AC3ED37CCE02B2B599F7A4C265011:\ 0F52FD5FBEFCC7E25CCEE870CF00DC25:\ 4EFB84578A93800AB7DA40997A79BD89 5FE50D3ED686D329D7DF5CC4952AEE83E0FD0265CCB032474152A19100C85154\ CE0D68947450EC32D66F:\ F08F5BD75CF2372E6B5D82FD25AD4C8CA2250280C1B611EEDEEE4715B9974773\ E9D9E2183CE3DCE2138F9632472BF184:\ 1DFE339178BC2FCCDF847A885B026C3B:\ 8D1A7B3B4E1F32BD9D34A6FCA9C4689C 1663DBE5C893D4FCA8DE266978D7C48D70197254796D394EBA09ACC27D528B63\ DF4026B8AD27DB07988858:\ F60B2CA4AC382B2127CF452CC9466B7388A7C78E1B8D9F27F3B95B70DA3D74E2\ F9F092C5168FB96EFB220F90CE1AFE03:\ 98120F0F48839DC5E9B7472ABC73B61E:\ F5D19A16FD2FEC948458C8ECD96A20EE AB6B6488895E81DCC4298427FDAD9EAD39561C5C99D933BA15F5DC705B5E094B\ 5387D2E88D91294FF6F3B8A7:\ 5401EFD707525F1E4915EA8E80BBE80C9FB5E6C45600426297FBE05ACAAC7DF0\ 9912C000F643E6E9462491B30D67658D:\ 213FF5A5FE08326FE2E5C5DC05604A01:\ 465280C995DE276B0B6B6378C8408CB9 392477CA63A896B14131842857FF6A2C30C1DAAC96818F89D313BE2EC14C39B8\ 8A855E30ED9504131CEF85640E:\ 2E196AEC24F2D6B59B57722F58BB8CD6585813B7050A83482C8E5C38825C1A62\ 65B7BBDA707F5E6CBB02C86643BA67D7:\ 2F3FC6D862409732B91F426A12EAA155:\ D16992DF8C17F4CB936810C81CD963AA E14EA57790067110020E72DA6AA2A972352692F86264C3CEEF69CBA1AA5E58DD\ 23A991F988BE7DB99821333B7895:\ D01D65E636A981F5F3D4AC9A829225E82AB76DEFD23E0691712CDA65FA6E6538\ BC512D6E44EDBA17BC2D1CDB064DCC9E:\ 63D77FC7B6ABD00AAEBE33C9B2EC1E5D:\ 6F12888D71AEFB2420B163811AF9BFFF 038534D14E2FC942B0C504B92C3DC1977B4C962235DD3BBCB5DE9D0E8A1B466A\ BA575BFB125BAF3FF480FCEB6E4BED:\ E344F758173083CD3813410BA07FF8F9E781E04890B27A598890DDA728D08B2C\ 19401462F2A649A76234F6D428160E32:\ 5A82107DD3B3FC7D9D1E4CC5117EFA7B:\ 0803AD8DE267CDC8BBA99069E8D892C4 564677770E8B7A02485987661EE2B6EF8EABBF80CBAE9404E75A2FF7C4E6834E\ 438FBF09E7FC2EC63521A12A6D4BB30D:\ ADA7CBFB49234A49CF6098350B84A8A440504671889126C1D0F93B2CB616F988\ D4FE79C9C15929843B60C35348FC91BC6244A225951C0A07F185DFEB127260E8:\ D337AA8F200C073F4DE5E042F352CA42:\ E5FD769526BBED0E5096997B57FF8D3A CE0C994114AA7919D9454BD386008A4B87CF2A54BBBCB122F2992F7B3FC01C5B\ F0E4DF661265382C57F57A5D96F226BCE2:\ CFEC3737847E8C27A58F7A616B76D875107C6E6DA75F2DBE21F6C2090AA45F08\ 2FF3ADE9ABCE4692D85D3EDB17C6EC108D4FEEAA67D5ABAE6BB8E5420F0F6BDD:\ 3F65622E95331BCCDF8A6514163AD1A1:\ 55D4064906F2C6F67F2ADB2D1A9CABE9 37B6E210FF6F2810B29653D3C3B2B80D939AC030C29C1E2D61D9C4B5432B3FD3\ 883D34C99DA9D701EBDD96273D3F292F3753:\ 7BA7D4D5A586552FC008A7A82E8D0475F3DB4C0795C9DE735700C0751634B329\ F8F71D21701F74E1F179F87778000B765CDB3865CF9569713DB023092CA8B4C0:\ 64D7B821DC6916A464D41B2D3A352728:\ CF8AE7BAF39569FDAB4BCDE9283E4EC4 ACB7AB275B18F55C0A45CE3B2CED3BE4DEB113CC4ADA87EE851A1196BADF0B9F\ 91D579104772040B3A33DD277F2A33843EE909:\ 11D15D948182EE585F2690F236A4ABFB74029D525CA579AADE4FCECF4C47A288\ 1BC6F04535C514D13A03B23D06B4BCA6EAD0C2756D6B5D5C616B229DAEB58848:\ 0CC7AA03EAE54E833C10616F0DF07FBB:\ B77D7E2620DD96499F46F311696DDCEE 27C36747E9672CABAFAA5BAA95E95FCDA760FAA3FC1C6C7F248C374E4C6C9A1E\ 4A44873BE795DDA3ECA213B2146DD8E722277619:\ 07299B862884F6FFE4657709404917F411BC24FDC2B6E504331E6D18E94A71F4\ F5CDA54DF8FC3A0E77EFF63EC9D0B82F8CBDE1DF86B917CDAA45EC4E603E364E:\ ED590A7F005156105AFC45D9CB50F525:\ C5F2970624FDB6B7DBA0A6C2214EBA3A 9581E9A8251C7DB9C4B15D2B208FF66874959D134FF812FF3639D1F1D05E02C7\ 806EF336D67782E8D05D1EE900785F7267BDBBE76E:\ EF5E6E49F0A3A01BD37C078516E6A85D6B5B04B1E4CCE934FD3D2872FCD08BB9\ 49DD606B4771C02FCAEB09A666DE721BA86A68CB975BB394D1905E3A1A233B3D:\ F567648AF7EF8A506E5F22542A3C2867:\ DDD7C1DABB2436BD0FD28D6752359863 0683980F2EA98F5BF000D2E9AF1DC15A6311A13F398DE23D0579BAAFDF59B0A0\ 3F051AC214D80316416222305A676B17826565065FCA:\ D96932925025F6D2CE24CDC3A4AD07A90456F011681A669C1C45B685CCFC7350\ 6514BF22E0DB166F37628F4B8DC3FFFDF60552C96B6840D0BDF510059467D7DD:\ 79FF68FEC504D32A717CDEAB94A7B5BA:\ B30BB4EC282B3D4B6135A7E17C2D34CE 4DCAAAFDF72971AED4B15B46436E19E7C8F79220C8EF7855FFFE378C35F578B7\ 5D0872A37B67DAC675083F9ADEBA89DC5C6A057F762F25:\ BE12616523F94449F8120B6BE35C84511A59E4D40B0430EDA4C4DAC995BF0F08\ 856EAC2DD4E709BC9D813A40D8FBD588EFAB275E1A11966666CBEFC08050104E:\ 573A08B1064652C81BB99C46C7C1944C:\ 26FF1AF8F21A79BA6F59A7BA710A51E6 D41B814F718B82CD1B1F64071F9429BD180E1DE6F121692D17AFB7AFE64CDFF9\ ADFC20E10B02A864901F90B863BA85D70E7CE4F53162FEE8:\ 70A7862DA2217F3374CE05AE4772231A489F2912BC1B9A3483A6CF9F11AA05C3\ 30BDB25BE9EA678F73868B29F908C1B4B715DF760DCB23B3172D7EBA94477541:\ B493509AE30EC0AB626D2920D9E929DF:\ 43491F9196D8251FD46759222E3CBDBB 4AAD61A9D21D7F76BFA86A6B054EF02BEF75EBA59DB3D7A8F6AF2472923E283D\ 0BD50DF43FB832B74EC6AC1A5B6C55EB8A929FC143E6A2CA5A:\ 59CC595EDFC1FF1EC7E3D179273EDDA43BDC9B7E91362C89E19910FC4BB131A0\ 0B7684E147D0912F3B71C8F2F9B00482AECEBB107923C38F89B7C6CB232BEC5D:\ 0BD6C4A47107E38C3C234BBA38F4794D:\ 0888924CB3C8DF8FBC8E3CEEECE1ECED 1A0AC832E284616BE2EC6705DEBC789465339B961D029B00B9ECE780B32940D8\ 4EC00EB29991BD92572E51614C37312A44AF192C189F5D0B034D:\ 12CE713413361CAA87DD2E584677B44AF5449D09CB083BB459EE47F65C834A59\ ABE9E557F4D961A6EA7C058B479243799B291FFAAA5B1771BCE62C0F83902A3C:\ 1022A5A56788270CBF3303D958D8E365:\ BA4179A2F159004821934A0ABA0971BD 77D91E9A2ED17549724830B17B5394B44C6F5D54862EC45D2124129471A3075D\ 75108F34662056550A4ECD24133FBECB413EE5BF58A5EB089EE8D3:\ CC5DEB0FED41FF63865638826E70FB572CD040CCF9273183BAE3EDA2124AF444\ 44597AA311A182C59C6F2612A0A55B7CD048A1F735FDAB8E4BDA44EEE347DF2D:\ A6E9CBB2936DCE26BBE3BB14A22C0B43:\ 0D061B14FCC07756F78590BEEBDFE3A1 508C2A9A589C470FE01A24303A63E7F54C4AEA5053805D1DB6B1F6481511FBEC\ 1D32BE1284B0CA1E24AA234EE9F6A77A448CE623C1EE0FBB343610E0:\ 424E77DCB1BACBCB1954F7FF54C5ACDC398F98B522E556C0362D9992E8A00953\ D94514AD35311016DD51AE95BF7DDBE29E89F1827C65C278BDB0FB9D243E7B75:\ 930F2051D3BC4BA985241990B92C6C29:\ 6E12ABF415BE763B09326743C4D03EDF 3DFCFB4B32C9FBA848403256BF0D3AECE761EC23D492DB5B9A6845123F017358\ 48487CB1CE198028B4FE605D40F7039BA46371436E2653EC84A132A7CC:\ 49355D300361AECAED24CBDBDAFD6A31EA8358646F84FF75B7900F6AAD59DD25\ 15F8FC834EBDDEA297D2AA36D1103FAE5DB9C60D213C4CDBFAABC24E62F631F4:\ C5E25A158442E6248D257114484E4FF5:\ 6371100FB16BFBE598590476C43F143B C50339C7DC951DA35A36F4F613899000069F50A41BF957A75118C596C7CE758A\ 2BDF378E4B83F31EB4CD596D301B1617DC1C9E08C70B2C3EA410B546756D:\ 8ABAA6655CD7D6ADB51E22ACA8AE019743F47BDC8190C05B0FEFD88B5669434D\ 3202F1C121D51C5E46AE46B28DFF3195F2F8DF2A94F5CD0F7D11685AF6D10F0E:\ 478C7266D82E73C4C3882CA4A05C0A1A:\ 9C8336BEBB6F820268F2E6D0807EA389 1E570542A73BC1A212A8503E190AA8E24C7E5D87469ABC1208275E17DD5D7882\ EF33F839A2CFC503F07641184C77A0B1B017EF916F638EBCE5B253C18B8212:\ 13638206A95985F22D055C9350F00926154ECE397C1FBBEF16B66A3E4B0D4046\ 9966E45C44222B903027F20D7AB620DCFC0AB5FE2D7E563B631E191F762ADCD2:\ 527317EC7A1D9762E6891BA823FE3500:\ 6B3E5D8466A4D655DEC67CD62807AFBA 2E83482C2ACA9B7C9010809C25597D74D19F8AB95FAB3A469D1B31D9968BD375\ 5D26F12B4D0D2D54E83ADEF3DA53F879F095EBFC4AE8D1E8562E90C55B22FBBC:\ 857882CF9E0B8C298D1A4BA1AD25ECD9FA50B3512A9BE93632A1BD8F27E768DD\ 23C8955AF6B4EE745F6CC162D9EA7D9B99948B3F256078705A192FA527AF8D59\ 4FACE3E88F0D3844B1E24A7857477233:\ 6D632D11E9FD60638E3F7D11ECB29D2E:\ 66FC28B235FAA4C012262C716F9F7204 7BD83E3AC317811A304AF3428DCAB0379EF114DFB9971F6BF67677A2E513382F\ AF0E352A32D7F3296475A39F3A7E851CD3E5225D0B0F675B94014DC9165A1D9A\ 1B:\ 0D15F0823F83D7652B4655D8ECCD0633FDF217CF477635269D6009DF41738236\ 1E413DF7495006E9967E82090A2D99D5A690A2349C9E6A350290CEBD1EFA4959\ 691BC52BD8BB24913C440B9623641A1D:\ 5566DD5873F4C7D4302AEA5217B1D5B9:\ 2C17CF9E41895A1871D5F3EACD478E20 1D464A69C8E8DDDFF2205F2E7336EB89C7EC1002660649CDB1ED826B5E8283BB\ 02FA96F18B4570458BFF5086B46EB4EF0F87CC9F39C7FF9B3E881978F7FEF9CD\ 48FD:\ F4D03CC920684F92865C2E5B7DCD21A39F0223990AFD50C38A90325FD038817F\ BAA975F2C3AC7EE4192B71104921B9F852868276192EB9545CC14B8F9BE36964\ 14745BB9ACC575C0DA3A1BC72DFE420D:\ 9AD3C01359760D2B9D7114ED4C54E35C:\ 1A0E62541D7AFD5ACBC18DF5EA79CDA1 44A5F5D7B96035F5A554499EA17B9B0193484376812C2C2DAB9F459F536D97A7\ 1FD4F723123156054FE53DF577BC448C124AF49AA9D003157272750BA3CE5712\ 776EE9:\ E697871A69D625FC8F8894E6056097E354A88118E5189C215254E0AC2C85A6A1\ 092A34314CE547C56D60E14E494590C9965BDA9D75F47B20E8761D14AC2DABF3\ 51767830040808ED9673E88A89050BBB:\ 623FFF24CFCD55E89911987DA599012D:\ 5CE090821525286F0F60E46909107087 6FFC0D5515AC7AA12CC56503CE163F52789BA0FEFC324ACE7DB228187FF7E1EF\ BC2EFBE3AA010B8F6D298952B0497FF677FC464B1FE51FD93E5C2895EA1CF4FB\ 4A773919:\ 1DBCA0F4EC05DAABDA02689166F93B7FB4A3229D7DEB3C97B3846E53F7671383\ DE567BB10D8457E92B1947F36C5BD4B9AC68B5633AAC16453050D65CF8B85C88\ E5F7B9EAC641038A6D225BC5B60BF39F:\ 3195B7E2AFE39355D556F29F21800597:\ FC64A4493B82CB958966E1F93DBFFD8B FC9D3C47542680D7ED0FB2388D42361F9583D2ED2285AEE599FF6E5DF9471B80\ E477F347B6C88A83ECD1167EBBEAFF93745BB0B06735EAF25579C679DBEBCFBC\ 335AD348B1:\ A4652823CE03E688DAF56F93B2DF8C9F55E399B1B13ACF7E6AC344A7AAEFC327\ 185BA29AC9FD0A29C42367D8DD4740A4C464A5979827C793EB29068F08A4A3E5\ FC118CAD6C58CDD04A6F925617010727:\ FAA44A1072FE894478C7557B6FFF6394:\ 6E5B9C688C4A5C8EE4B4CA1A263D6E00 EAA0F53C3414A0B7B6BE05327F5F2D76ED2E5169E4ED5CF7A5F066B1196F4DEF\ 208D544116F2774B3A02608DF263415CAD366963F791C7808E2E248882880E26\ 65436C7E8B44:\ D3AE352CB790D12797DEC61BF8C17AE0557A764B4E3F2ED2371BC624AFCB8A6B\ 340BC68A4E97447FAD51A52865B5A6A492BAF5AB525653F34392B299CBB74FAD\ 14A16F3D7EAF4C00DD73FCF4FC885EC2:\ E7D0BD991DB9DA63027561A13D620F72:\ DEFC409F9D66328C93426D55BCC5F3C8 0C3A5198A1F0D228611124BB18A94A59637B8EE8C3BC128003D90645067C1D7E\ 3F12440B08DFBB24493A50D963EFEA835497F85DE87A3857B1C5FAEB0354281D\ 76BD618D1214FF:\ 9A13204622AEA6CD7F70C34518555A2DA17A3CE11E7A832F6AB69F8EC8880BF7\ 2921470897BE8B0B90BA88020847BAD4AE5E9A37E22E6FAC568E6EDD1FC8BDC0\ E4D7663CD573F35F43BF4BAF85BAB7EC:\ 6B422723B4A706C9A184FF4FC38824CC:\ CD0ACA21752C4EEF842DED5A53BE27B6 DC05E863402163187548943B43533CDE7642FD31BE2A177EA79CDBE52053B538\ A394EC65F09A1091593892D6251F325A38AE360D6D7AAF234F9DA6E841523A2F\ 7AC724447C9631EB:\ 3A927FB3306824B549B18FD5699643A08B64EC3B9E1322FECC32036875545F56\ DB2FC7B34B7A097FB4C7E211BB5FD8E1B69813BFEED2DE4771AA6A4D4557C232\ BB4A488ED9DDC5CE2CC8BB67A7B66932:\ BA37159B1AC79AF43E716741699FE664:\ CF45A98BED7B6ADEA83EA03B6054D857 6768571A03A74594A20909B61211C99F91D3EFAD8A72FA0460B5B3A404D7F0F1\ 94677A90AFB6857B05B923185C6AA6043A7E8373178647F528645E68E0FEF4CB\ 36187E0083613FF998:\ 88CD0288FBE70E08403BDE580AE08E23CD0DF5C7E1BCB076E6F0C274C48C3892\ 05A58F7E17871D1F3DABF5DD3DB597ECA98606DAD8A5F6F66AD5E5AB16E6DDDE\ E91C55EB62CE86ACFE87C4C703710ECF:\ D89F12C903BD9E3D82E05CC72F88DD2C:\ 2A46464A0975A3D77884BBBA01508D2C A6428DC3C3398CE37098E1F059873CB92D937C437A7D75D2129BFC5528544E4B\ C50D29F6D882BFB8E500B2625BDEF5A6EB1DF2F3A5FFB9260C540EC67C033769\ E6A84D6A137B257473E9:\ B6218336CE13C1589B1892BE8507B218DFFA2018AFE90CC17EA792955069831A\ DAC30AC868339EAE50B10E513E7F29EE2914FA41EA76B6CDC99C4D300DCA5E9C\ 2A96023F8D834B7404956F51667239A8:\ 197EA77B0320C3E2F913EBABEF18EB1B:\ DE295D509AC3165B53922EA9C199CA85 FB413ADF6745E383C87EC50BB8DEB4CAAAA4C5D24AA3A449018DEC8A6B85B10B\ 774891EA61757BB17292B38ABEB12DB3B71C71DFA92D475963B0F1B1FEB93AB9\ A753D11B753EBFD2A3D74A:\ 740830C6AAF2BCEA878799315F5C842C54D760771EEE19F172C9289C0876BDC0\ 3A608B81597EFA11BC8A7A7EBDBEED5761822EA62E22B9A6EA530C9410225BD1\ A6398CC8E257EE054B2C3D87A05DB73E:\ 9741F404AAA4838905C2386DBEE885DE:\ 7D57C18C4C0BCA04FCDE6F8E38D413B7 B647566525347CFCE42CC44F4EEB9CCD8325B0350A4F123065621B7D03C04DFB\ 2A1F5C9F41D3B1ECD3814A2A7BDE4DE46EB0AEA673EA2FD582D00038F256D888\ A94AA60488A7ACE9F4C29667:\ 70913C486EDDEB34D7E1D7A8B9CC75234E0B3D9000717949A59132AF2D2B056D\ D0243E11748F6D2820D29C0BD15747A61AB1B2D87FA6E4438EA053DAA4D39A2F\ BDD62DE2AD36725E9688E1A31DA8DEE4:\ C18B48925AAEF9C1B8CE83C3C0541C5E:\ F4358C6E2F0F1ACB31433337BF9630C8 C8D276B9194CEB3C01B3DD0E0B0F84FCE5D548F7FF60C634C0ECECF4C74B8154\ 514CF766960E34DDE8F9F7C60215C932589647B1548B0B408210727D4D4ECB6A\ C654A6A4E786F5C124034586BD:\ 68EDED1A1230A88040241932A87C894C0F3EAC2363ED85EE077BCC869AC9D982\ 61DDF9186DE665CD5D70AB210CB4D266A2A9D990B37AD6489B55275019BC8D9B\ 06F19765E390156EFDA6DAFC6205321F:\ 8D12D956B50250AECAA4380C2FB5FB99:\ C8F19FE75D91DDC9FEB38B71A47250FA 95095496B695C5CFDF83F196F400CA78266F2CBDB9F58DDA77CCAC98FEE5BD13\ 8ADEF80CC73400B0BBAA66A3D57B0158AE49E393F3D78EF8196827775DE2F005\ 0C531C5EDF2528331BAB2C703AC8:\ C3B78AF1743A14F1268D87EDFA707968191FFBC9820C410DFE39814681484965\ 8D5ED951E7EACEEDD27F2BCB821DA56B31FB9E2181E836A54C8E54763BF9EDE0\ 449ACE3E0F5757AE3BB07002DE63C25E:\ 3CF3AEAA654897E706E2AC1239667209:\ 4110B8B8CE35B9BC3523B05DAE24C69B A1B2C52B1B10F73DCAA6ED822B92B61C27245D344DBA2177F509D28ACC108642\ F2013A0777C4B69B76C707CDAB448B451295F636163B4528EECD717DE79F3A12\ 8F32EC8D614412FD3F5FD2BD0FE633:\ 797323F717303F224CC9FC15C29BB15C9296D7C4885882BE3D55991607DF0058\ 67179BEFBB30C9034F0C6F94438A537D33CF4F644372E09F07BD023902AD54D2\ CA2F14EB04D43FE04B4105514889EB02:\ 40A2DBE5EA11E2AB589DD95F71D4BF34:\ 6397EFD9F05A5A87C43730CD42C29033 1D156125591DD8E4C30B09961E5560DA5D201B6EBFF5CAC64A1DB78F33D3C2C5\ CFFCD3F1E55B246DE700CBE18E045783B94195CE141E483AD9D70EDF28C61055\ 33BADD7DA4FFB971D1778756D11C8D3F:\ 905975D4AB9A1B4AA6C9A39A999FCF7581BAC9C9C96F0B6DA63020DB3877136C\ 1E9F8E89106942D9405C73486737AD57B4098A2AF29EC587D6B7DC07F469DF28\ C075435735DAE3F6C2F7CECB9623174CC62EAE8DBAA72679E117FB5EC92F2267:\ 23822FCDF96E4DC4088077C0CFD93336:\ 6E4E85D4B38E442544B6B04FFC81352E F252679F2DDA76DD110584CD0D9E5FA64296BB880606A150122A7EDDB6A682EF\ BE655BB59DF6885240AB11E4B74FD0A159C8DA83A8E3731DB39C8937E2927BAB\ FD018F17B155BB818B3C0B358B6680992C:\ B48FC12FEBE86486299CB3FE14C1134D2F61BA984334F8C3AEE08C8A0E2DEF12\ C476096E9958576B81C6E05968382FC7EA17B85B8FF8805EC695BCBAE5608054\ D5C830DF39CB646DD4798D3AC0C15B572953E5645EB37F431DAACC60B874A180:\ B107244D1A4445A3C7ECE0B64FA7100C:\ 58CBBB9601C142CDA4CFB02A45861808 90F67AB45A02E5894862F15F0A919DD6D7833A2C1C46DFC9127D29A53B5A44C9\ 3B21141173F53CD4A854B7AF496CBAAFF654FE2B28A7B48048CC9D01113E0017\ 6DF95D7DD3CAECC5DA53367DAEFA377F84B2:\ 2BE5CC556D2E2E67C37FCBEFA7B0FED5C350C0B2541F85671556207BB847C3C7\ E8B1910A7854B8590F0BDAC7CD1E52ACD6F1584D25B86407EA92222E951339D1\ 1F8D847108B0545580B5BFA551B9C1D7DEAAE8C100469F9A6E9A578FA2871104:\ AADE936E95C2EADDC9FBB708A6753851:\ 04F4C5D43118F5568DA176A140913851 70A355394A84A1C6E0281A6E4D744248553F9F6C6A6E6E01DE13AEC21E7D36C2\ B6BD7C608917A4D9F723229C020A677DDEDC2F3EBE9AE2D4AE490DB9E456212C\ 9AEDC04C2D34B2384BC75C8A9196FCC1CC642B:\ 9EBDBD9117F03F340AC4EE7BE24E45CF6A18C76CF4C79A8B19EB83D03B8F6202\ E9F9E0D3BFBC351C407E699F4B592C93D0E6E037419C48167ECBA7531EB0162F\ 6D236682831409D1831CC309F227DEBE4FE0B395FA201E1E2633354381D30CE8:\ 2B3AE9E5A047CD4A5C40FBB546AD4CA3:\ CE4C47854269A5C40CA58E56254B2264 DC75958667FE6AC96BC6B291DE43E04BCBA6500FBE005D5ECA3AE57AAC2E7754\ 8AC38A6DB461986F4523AC48FBCADF5B78259938DD037ABB4947D1F85538AE2B\ 89F0323FC1F7539465563A816B3FF633C1BBC6A2:\ 1DD9013DABCD617011B0E2C45549A3EFD665BD0E6ACF515A3AA4B3FEEF92DA1F\ 3391685E8824BB8767AB1FA38F8C21E02518319A42C15307FD645541B543E98F\ 74BD9383A5047C89D40B7B685999C086391E1FD2CEAD877361DA89BC89EDEECA:\ 0AD480367F7085E45E72A001A4B8A43B:\ 6A6841A5E07DC00A0015006F5F60D895 C160B510C45E17D2A5B38716E4A682884AFCD7BF1DA22E2C482FD291A713E623\ 18F20AE2A6369CD5F958EF3A03EF2A23ACF0DCB68D27112B2FEE8E5E623E4F91\ 849A061EF3D1707F698D682C62073D7D45A8406D16:\ 7129EE5D900251E38EADB39DA6F0301E85266848C1D014D2764757AD5EEC1960\ FD8A46BA55A79EE64080D7808F2B967F9F6F8BA51F296D3EBAC8B653E920F8B0\ D2632EEF1C96A5E36B51C1D0F60D1DB0FF5D55C567F4393EE790C0BE87610845:\ 10E06819D7EE77E7D55765948D2C21E3:\ CFF4424C5812922ADBDFCE029CE63235 871D3A83E921FDF2902B25660181FF81260E671390472416F9E6270BAC539203\ A93D4AC5F00DB1B63FB4E8B840CE4D118EE967AD74E6308CAE8850BE61B0CDE8\ 87FEFC61B341CECAE98A7815F5E699766F06B3AEBACC:\ 09AE43E962C2F9DDCFCD5AB82471CFCDAB1154C64DACD154C088D4BDA0937708\ 4167CB7D41A7F87D5DD0E702CBB78F0CE1BFD05C53485A91E7CF333E276A0FE8\ 4915FDDC7708F696F49C95894A4D6CB848DF06D52B0C5F720CE23A493E7F4DC1:\ 9A937835746821DDA24AF556C13D7DBC:\ 2866E153FE0BE9DAA8506D59707FA3CC 2D1799655E6DD69CF3C2E40F700F8C2F1EEA99B3C6926647BE7A07882232E1A7\ 901F3B06829ADB9BE11391C190BCFBFE908C08CA5BA7EC5A5DED518B0F469A37\ 8D9ACB7F1E0B8D7F5E829799D1877604FA0F801D4A48EB:\ A1687F960FC0DD54B32B86B4A6FA988740456FC8E2CEB701E841CE897265A7BB\ FDAE0940D288355E894467CD703442D86C40D3DA31601FDAF990BD1576951426\ F8FE6AD5ACDFF881D103C5FD6F40440D95DAEAB2A3593DDDC152FE9B09F1991C:\ FAA109A3632C82622ABBAE17AABC60F0:\ E057120AA0B73247D6608D148BA05399 311FE0F676F81A110EB931AC3CD2590AB2F3730A4077961D830E8B57C224EC4A\ 738D27CA58C205FA0872F2BF6EA1732761AD4DE851AB06220AFD82C1DB0C0B2F\ 1064C6F23AE0C092F0F5598B73F4CBC80F4FF249FB90D1D7:\ 2816A89C908CBC999D1D8E8497B15F5697D66265D05B7900ADFFB41139A57FC9\ 6D9249EC2DDD805B83DE85CBB97A4C44A5DC85BEB18D7064855CA38870CD1E4C\ 62EB78FDC7B95B32B93D146429830E76D48D56D1E9F6297ACB5EB959B30834E3:\ A5DCC797CB0383C344617502A5908A43:\ 60284E3971826821263594FC36FB6E50 9154A2ECA919ECEC8C9B3B9BC0C68949A7291B9A645B5F2D2935C77AB506FF7F\ 27B5FE0962A9A912B1A05DBF5141D03E4401E3649025947EFEF8C0AE5A1FDFBC\ FAE5487347174FB40A92550F54B7C8261413A50B8D4E6884BE:\ CC1EDD80A0FD2D06320F90174E4DA2DEE7CCC33AC342C03FF0FD9ABCDAA269D3\ EF75D24477B888F32221EA51A41866656A8CC3B95C601A95CFF53783179DB18A\ F5BA92C5631342182F283E083AE3E7461A809D1BA74F591235BD66F338ABCCA0:\ FC62D9B01185D06CEC0261D6FD496086:\ 4D689251DE48BBC21776AC578B59F6D8 A15E33298652A3E42473AB035BB94443A4CFCF9BF8F4E072898B9375E0CDA222\ B07F8B902BA73F73806F08F85C13114A68EA480642CB3D459F0E1B04E4F88133\ 2CB5E05E9E358C91000C09A9F129A197339BC2A8B456455F0EAE:\ BB98AAA7FC7FAB8FB8252E69E54C2DF97F7D0D2C0BC3A679F5BFE2E51191F8DA\ 0218681A3FA59B9D6584C4F2B1FD3A990764799084CAF60A45735B3B8A480CE2\ 8BA1EAC185601D4D6D76F25D39891DCA762E21D7D7911E4F4ADDFE7DB52DDE7D:\ 1BC51FA499556AF60332AD5D287C01DA:\ 8A23C560B6F0DEF3540A72423DF2C33D D253DF61440DCE5FDE0C166E99670CE05E415CF2AF02D55A03F9419DC53B94C1\ 83660DF91681809E64B5ECB77C9180487B95B4AC06F484EDA769194AA3E72FFD\ 6F95E475A925A2420040B004610B212102423D879F821E196A5A88:\ 775D59961E58EA72CE8F2173AE47E6BAAFEB68FD85BDE05346AB017D38954763\ B90B63989A1487326510BDBC75637B06045369DE798BB97FD4885B44E1B42653\ 8F5C904E44D85AFF8828DC56329B55BEC8F64BF7957E837B70AC729D03A249AB:\ F7B9E5CB7DF60D8F760D691B8E79C834:\ B976C6CD3730B031060BEBD10E832747 B97529984693CE0621DCCF68F1690B49396E381E885AEECEAB3E1A7F61A8B7B2\ C5E58BEF82FDDECD29C9D9CB5F417005BAD6B7EB0C57907F2E3AB3E557F11BDF\ 383EE5AB2902D46DB97827B26ED8C4C47368F677291E50ED9C1BEB3D:\ D02E1E17E9274C18017105C929CB1FC9C84071AD0773E4880C84AFE08D243EC7\ 2B3570768506285CE5708E0D280673FF9F0004636B77266A9CCCC21FC590D845\ D685B0F5292B9043FEC8F413E58D20844FBD626AC27F4A43A1CB0677098392DE:\ 6A42A8F7A638089C2E55A166F87444C0:\ 3EB4E4AC62EC1B18C96DDF1465C74286 5DA55FA078498CCC7D509213E96F8915D466AC5504BB9F0FB922ADD1DB7A040C\ 438470962BE659508C37F8C276E3C312D0ACCD1AD77755CA575336F2CDDA3B8E\ 39BF99CEE435FB23312576E3FAC190472223FEC1D693E2A717D12E7496:\ 4652C8A3FE43D4E4C8CA7C952AB5505F42959BFE42945B466F6BE08B512F21B7\ C0AF4A818A699D8A61C2162D8FA4DEB2B94D28EEBE99A0CA5819F386F1BEE4DF\ BF11F984D6594C6D2E4A5E75C0CA6EE74993AFE6817445290E0CA0A109AAD624:\ 483A477C5D7EFE8D7EE764194FE8E902:\ F496A4D3745931C47A814F0D9F0144D8 92C61E6AB26DC701A371CB5B5BAFE00B2C44BD2736E856B1E893B7AAAA62C088\ 35784F02E3C1767D8FDB5DE91118CCA28585C5F03CB46591F8D3A3F09A0C602B\ 01EDE470CD42EBCDF4C72456639DF2BBF7897246D7F82FF7D083805EDEB5:\ 180659EDD79D6DDDDA8A64607957A449FB11EDBD4387863136650CBABD58411D\ 7CEBF5C7CCC8F9A8044626C644E1A1E303AC8B6E638B0817419BEF4FDF5DFD6D\ 6999CE8BD64FC09735DCD0CDD654824B6CD61A52B698310D116C1040526E7260:\ 2A2B340ED14BC9746488F04E2EBA7683:\ 578AF21489F2C8A42CF412A32906B1E6 9C28215AD7EB481E46752C39061377A489523A8DC9B62FC8E7CEB12B4E26CFD7\ 6F863B317999DD6F5A76686F9A4DD8E7558F64F9A0BAC89949A12D3F1599D7C6\ 4B6EA82A36F334B6055D0402048CA15127420FAC555E5E647814C4F4C6ECFA:\ F3031EA9E88EB705899C304DB9B46F0817F3BD87FBB8178E3CD99AEE040D818B\ 2BDB27AD8034B3D31BF96783AB56EE91BC0F8DAC44C43F2BB0790429B8936991\ E6652D69BB1F0C2B0577D7155BE3E5B34E1DE64655769740B2C35EF8DEFEF596:\ 3E433ACA43F4CFE3ADB678991613F6C6:\ 1073F4ADF297DF3FE37A0AE2B25C4A1E 45663D4795BF75D79EB3BA5BF5A9675C257E526B190B598562BC4DB4D441025E\ B9E61E95243165B21FD6965E2973DD04A141097EE5A85E535A80862B5D14ADA5\ 214A98DD161620D1B98B0AA3FD66A1D31005AC822F290D71D88B3B02F1B9EFE5:\ 85B49563722FFBB04C224DFAE52B97D7B69DE241C854B2CA795527957BDEC3EB\ E3A47BD259484F0BC10EF487B00B30638418F1F069888FD347F4714589D12B64\ 7DCCA4F275B5DAF428C4EC28122FE7ED0E980B68FBD5B89925DC0E3BE1CADBA2\ C9797F7FD5B07BB55CA139700AC5CC82:\ 94EAEB3A2E109BA196DAD6179CC6E4E0:\ D0D97DF76AF11FA9120CDB1F4A0C5519 25994469BA58D88BD0A68A82D216FF3C15C8A1175CC712138529433FBE2E4058\ A94968C115C29AA80094E99F34CA98E0DBB6FC2DF165472262B2E4215FA63613\ 3B9674B2098CBE807C6565FB2FB4600CDF9D81861EDD9C7B01ECFACF711CB7BD\ 31:\ 39C4F62666E8B240DB0968C11645DAB7F39EA201CAC1DE82CF08754192FB70F5\ 6DFF8E106E22711F7C11B1E08C973076075812B0BEA56BDD983C0891C1075295\ 08510E47BAB4080319ACA3AB3F5C647BC1962D3B91C4EDE3DE437D2C496D7653\ 16A153AE368FFD97F9D897A7A4B41B4D:\ 931096F41AD63122418B0694F08A5D1F:\ BFBCDEC1E1336D3B0AF876771A8394E2 1F6C82684870A592B8FC13963078BA8A18BE42F6569396D9749C4E729742F3F5\ 94613FE0D47C681A9ADF5CB1AFB4CBF48B6783E679B5782486EFF08834908345\ 5DD97106FAD8D34C0219C32A2948810973C04406A5055629B3FEB44F086ED1B0\ 782B:\ A7860FCD31608F84276797E5E62105D91D485D83EB591675B2D180EFFE41B795\ A0BB525D8C963257156C16BE7D2F23F2303878193ECAD2B790681AE7D9D4002E\ 3644EC064D633DE7AEB9FE7F2F7A323F369AA48F28FAC66238BBA99E0263F51A\ 3181B804043C835F61F3664B1B1085EE:\ 54DE58CD3277EA8CDAB1E14AF30B96E9:\ DA5A911787618709C0DDF10D4D370C9B CFA3BA888B4985577682E7BC34390EF53ED46677D6ABD2FF005D9B47CE9FE9DF\ 64DD6C89F61912FEC07B212CE6D4A8DC88AFF9F7E96F2CF1803FD3FEB9E538CD\ 0EE34288A3C84FFAEEEF7789AB99CA574D6F71A4A82E28396532830A1737E5AC\ F1B768:\ B4A9126CE1706351DF0AABE9EDD2F1E1BA10928DD2A15448A07DDEC6EA78C854\ B98E82B6AFDA1BFBA57EDFA627A351C2F3819906FC9950844230AD32FB1EE0F3\ 4ABE20D488B36C693E35A1A177EF69307C675F4AD3A182AB20C395582DACD33F\ 30B5C7470D9BC2CCB5AC4CB39D5E665D:\ DF2C9BDE5AE112FC52CB4CD935650ABF:\ 324E72A3E627412FB271C62D87106AD7 11053DEEFEBC7662CCE5373FF8624FFF4832229980A212A8CA936FB6459A53FB\ 4731936071BDC21D916C85C6E5F0560E6294E67979A8FD00AF9191DF4807B3D4\ 54D4F57FFBEEF3CC2728F9306DFD77AAB3259D4A72771939EAB7B78581CCD272\ 6DA93339:\ 22EBAB368D5548D61691A4F77B6468A4D9AA2C2600009C808EC8656F58E49D8D\ 674702E090E5910A4C67FD91335D149126478FF6FE2F342F42B8F50618EE6DD7\ 5A07E4A90D3CBFB0C2AD6CC1B9226E2522871C017C77A0345ABA7E44688AB5DF\ E4691ADF90FD48843AEE7D3C289FB6D5:\ F76BED433BAE0EED648D1B28878D4134:\ 2F8F480D2EBE3F01D63C7D1E1AC6AB64 574A77F969620F53546B46BD2CC524DE9DED870EC2F6B9F61063FE9E9A2C4C55\ 483B6B4172C034F04EDED86ACA242425241C984ACEAF7EF04001FAA887E66BF1\ C33594022A968BBBFDA3A7D9D9C735F461DE459DECBF12093009E84618504E97\ 037EE7A648:\ AAA424FAFC30A2BEDF0644E693FF02B2BF1CA14285092E980E522611BFB3A372\ 7F68BAB53F5B9098C1112716D4B848882D4ABD847DE3A6F5AFA0BD8D7834E853\ D90CC96F1C35F7F3E1DCAF6B227031C70A29EA6B902A5A1266E16364999D5BC7\ E9374A7467F4673A995D9D23144FBC6C:\ 9C0A96F10D955F3115174158E77BF4D8:\ A0F912F87D0D937E388F9EFB14900921 1C5AF4082A03011D343A22628667787D1ED78ADCDCF4609C133DFDED8BF179C2\ 96A7B7E023503F42ED1ADC8676909A42DFB8CD7A5B57F77B4F13907B25A1D28B\ 787B33631B46240FC36B5D13B059312991F0A54DBC269787EAC7D4C02E8BA8BF\ 511375F0D18F:\ 2F86A992559C65306CCBC9138DA2C1987C168FF4278BBEBB4B48B416DFF7987F\ 9BE993AB153B8C3B03D7FF1E4ACABC2E645A108382F995C290FCE8D881BAFF65\ 3F1DBFCC8B957CD7C424EB5D91D758960233A48153197374F1649830CC924437\ 7BBDA7EE7C363096A1E0B94F83A75F2E:\ 0E10DBDCF81E7F360D3CDB71AA1A6200:\ A44C029268CEFA5C2665E9C883C9179A C40A8815E2982C32C417F4B9369765F53D1546EA3A39CD5E07DB465DF161F878\ D8A361069AD0BA13F158D6F955A20C0F0225B83CA4C6F1D92519F26A8C711ABB\ 68140270218B13CF2F85F008CFC5C62490FEDBE6DB2E0DC5978A365711E072C9\ 13F81B782C1A8B:\ D57A23818F90CF982C32648BB61769DB8654CC81E795668A7AA6CBC1597A8086\ E92EA40A8CF4950A87D3FED3260E5B30C90333CE3E90AF2452A6BD0D00221449\ 7A850DC2E3E1361FB689CD4AC25BF304F40D0ACD6A77DC96B5A52354AAF09EB9\ E45E34CEE834EE78583ED0763C2D9583:\ E8CC72398A38C02705E33FD308EC023D:\ 0982EF5D081AF4A2130AA9DC5895F4B1 8C38B56BDF41611178CB12970D12CDD3BA2A09BC9C90684C853455E70D995F94\ D0C7CD30B572AB9E24356FD3FF66CA1AA913C5E4B596A30C504CF22592AB5BB2\ 66956C8706EBCEA543ECB8C07A9557B65F72A66328B92037A9D1EE4DB32EE7FA\ DDB037BD75C5A711:\ AB5B987C10DC96162447A9DA1B70DA9C7D6944CE39EB0D507715671E7AC4FFC4\ 663ACEB5FCF4AA8ABCA5CC155EC57FF43AE23E8854022F176D620B89B01C283F\ 4866696FDD03B4CC262F3C6BEE590E26A25914F569592B70D017D872CC3D3A2F\ 47B0194D7EB425442F3335FF0EE3AB05:\ A9AF40EEB9D7057C167C020C922789E8:\ DD54B94CBB23C203486F41CDA7742B75 05EA52CC288620CA6E4A8232F1F3CC99097438471E6709C146B9DA1B1AC166EB\ E968FA273A8EBAA577CF673959B10D9008CA182F5075E86DFBD5BFAEAAE69013\ 5CEEB445088EAA7F870B71D9BFEA7DCDD2AF5C37D4DAAB468D67C70C1D556A10\ A33DEE93C2B1FFB758:\ 1410F5CDDDDCC1FEC3E6793CCABCBDD2A1A14FC0D40325A9D6E69C4FE4D87191\ DB1BD4ACF6E4727D7370EA59B77FD5E8F02F38CCB35448201363966106388A3E\ 007C4F76566F589C5326A847424FD0AB647974C3CAA452D95AA4CF8D86BB0939\ B430E6746D35D45576EA810DDEF7DE73:\ 42E4792765C8D601F647096128C22E6C:\ C0115D81CE8541848E778E2B90652AC2 7104B9314233A3DDFF2074862A21B3AD6CA9693785516E2C7A4EE69A823D82EF\ 0A4C57C3F5113C62D9B1E755F9EB7943D432C87EA9C6004F14281355DED99982\ 1B1ADA56C68736FCCDAB111ED640E9ACFD4D164310925F8E3AAAE63C8AAFA382\ 7B0E45FDCE03EDE162F6:\ F53F4386FE121FE5B734048DA923054DD12F244CC12763FFB8DB1E9E842DA312\ 1827DC297AB6F11B8278E6E96ACABE3CE23E3C251078734F337E9BC92FBDF38A\ FD0FB2CC86BFDF16595E01F361A2F042974E6DDBDE8B2AA10CA755BE051A0CD5\ 8179AA4571664A3980B0E1DCC8369F15:\ 7B4844C6EFBB9F47BA2AE3CD350B00A6:\ 2AE654A8577CAFB65B43407C0C6F23F7 328C825FAD8E873D66178434F534E832EFC8B273BD74E133701184D59EC5E3B6\ 1B58653B6646CD1E91AEFF9B4A569976FD055C3039CE76AB5DB5AADB8D479064\ 2D99346D9FBDC193B782F4F5C16F2F1C60084BF57B40736DF186EF9DBEB12B83\ 45FACDA9A957D20666A1C2:\ 6865D8CE0ADADF051BC5751DDC7DC02BD3E8425900F493A9866F9B0FF11704B2\ 6F949F38547859DFC1F7E4EC9066BD6825CE5596C32D97C11CE6ECBE63A58E32\ C3B423114C1E4330789817AE298381050607A1F8FBD37246763CD98128565AB8\ 9FB05942B02BA92337E30E5F9F87A1D8:\ 0C76977CEDFF0BED19FD14FB31914BAE:\ 867FF78C9084E6B866BB74FF1549F0E1 1018329626BEEAEB50A5B078726E9BE6074CAB2FD2007790102626241CB54114\ 52B28C696FB5DA1BEA90BAAD90DF0F15A559FA821423EB500F0D76B785FFB7BC\ 2470509006CF192C3A5AB61CB6D5F7C6506C740C8BA763527FAED51748E33477\ 5D759F904B3CEB9520EEC9FA:\ E3C6C758EE636F36B674E5D06B3FED93F848D5C781772E31A88EEE0F84D4DDAA\ BD6BD6D439D36AA5EAEF61302BE6968EE3B786B5CAA20040A15EC740680A4E0D\ 788E445AD1D00CA2FA8A4D32D0C80821AECC9668CCF8D60D74B1BF960AA42861\ D9339A064A7B50555ECAA71A475A87AE:\ ACB06A6D35664BA240105546AFB89D88:\ C4C566F5BE990271C34EB38B66F4A6B8 D30D40FF5BBB7E7D4BFD03B39DD4F7CDEEA3EE36CF59735140A2CD884C341885\ A2ABB16B42883C17D0F8A8EA49932906C51B4E0B195438236C929E46C3DF0400\ D6BFBF7E7CD09F78ED819E51CAFACF184CED6D9854F0C7FC3D4E2E92BC07B979\ 3F15240C221F9CD951BC1D8F7A:\ D99D6BE44B4B07DEC16063AE56D734955FBFA4BF24156531336CBDFF718D1CE8\ DD9414A5137F0F193B22351BDC56E4D62E827ADE0A414DBBCC99DB1FFB700153\ 0AD06D22C1685B7C608B97C9F282EA506C87F8F1E861E2F56AEDF96D02BB615E\ 222B9F83219D7C79E30E0A830DFDD089:\ 3A57AA735A2A5BEB67002A4B4E0F0FB7:\ 0FB689E2D76B4CB6886813714F78A471 D3C88CA0AD414F6A88903D4B2BB756CA44717CE6C542537066A898A343A3DD6A\ E2609E717DA65C9E82777A29E5C134942455B04E5926DF69CC1B86EA95805AB5\ 267E9C456B29C89FB7D5EF184016178C8F5170F6456CB2D3A288264C501208C2\ F71578A794526A40C02267CDB749:\ 12143011522BADD13CA2D5838548F63585804175B21B47AD9907FB3875049A17\ A27EE2C7E3C9FB61C4F1BC8795D9FA8B267B698A216BC3E3370A04E27CDAADEA\ D0C18E6F8564F3E82A779B2EE149F8DAC7CF9C7DB7E83BAAC17D366E3497135C\ 4D59C1C4D0DD8BE6520A1415D7A12729:\ 25C1B9E50A35623397E026342290F381:\ 99CF0F3E276941A23B8BA3AE4BC36FB5 1FA6BF67DE5B0B29BA7B510166D06CD100BA68E03EE4CC8D8340E1BDAAFD00DE\ 840147243E746C85F68409F62E474505BB8FE6251FC550A2D8C9CA071CED983A\ 57EAB7D7A0E636E809163E29677388B2E96F81165B4B7DBAC996D9DA923BF3F8\ 9BFD7E659AC6BAEEDC2C1F223C85E7:\ FE2F1AE7085001374F5FE74E6C243763BA979839C7275B817FE5B1D93A8D31A2\ C265B646ED0E9BAD5EDE61BC9A6BD7FCBAE22D818DEAFF76C39CE6F8F4302F0D\ 672628B36A1FE1DF90697408AA636F0F2EB12D00A87C1660C03257EC7F98FB0A\ 2750958FC5769FCE8681001134A4EBB2:\ 3FE0B766CCDA7B8AEC8FC3433DDDF5E4:\ E5E7B817F2B2C47395F3DC983877C6C3 CB81F985B3551A1F653816EBC8472DEDB58C5BC66049A33543F92A64D9B06806\ 78C5AB54FBF03B7CF1CB964E903E92FA1D7D0C3A5B4E2A8393687F0CD73693CE\ EFA32DBBB854CDA1BABF629CE10CFEDA1F16C8A60B9419069468A5D8E3070403\ 5EC4F7CE7D67A5547129FD136908C33D:\ BFE9B413104A26F4B3B86AC448F793F138BE0DD31CAAFEFA7AE2AE69BD09402F\ 70F921081E66D0F3A092D3BC28CF2C8837991A200930F260443F9755F8AD46DE\ F08FE5020792BEB7D2241F5D9B290A4F5F849E378B8184AA616B081196A38439\ 3FFD2A15622029829F0BEC293AADB6FEB5893AD9DD2A4B46A32A033FC06BFDD3:\ 7E9BD6AEA141BD2399CF9C34D8FD0EE0:\ 4265EE0DF32B9E35411F3890D981224B AEEC500F45E292E59DE2A9C4BF4B0BAB26E920386B8AF44934C5DBCE4BA66ED3\ B294F0C4F4A88E70CEE9F9690E506A1C6E1F2B6E9085397BD3C8E197E8295728\ 815C47D859E0FAF1C5FA2ED9237FBFCA5843A9F99EB40E53554043AFEBE394FC\ 02F47E6734D3F01FBF0E4CD7D21FA3E631:\ DD6A11239F7AD4FBAC8948E6E2D2F27D6EC5C818FA6501B910151B8CB3B5142D\ AFA7141C0310F3668C7C79DC1ED8144F01D6B0BF1E9574896997545BB441A5C2\ 5CA4152492A1CE498B42B0D8681E47FDDF2F240C9D0E52B516F459C5AC029938\ 1FC7964D9A4EA8A28588F62D8BCF98C10C23999B81C20E971E4427CF32B72EC9:\ DD22660F816ED9248F192406874D15C8:\ 5C25277D16E491388E300E43463ED773 255BAF2421268D3A748F891E76B7507BED31C86FAD52BF775DA0C6DDB4849F13\ 8E4246BF66449217FB62AC389B70D0A772D3B786526D358A83EEFA4E963CF5DC\ 473EBD53DDDE847F32D4B62D9616D1B0B37DFC552EB853A66FE62B58370756E1\ 7EF4D4ADBAF23091E5FC9D67CA0DA3FCBFEC:\ E73F4EFA1943CE9EF9704BB173B14371056DB816BF9CD52D5D509D84417393D1\ C3ABFCCF929F66F01E7CA8FF4E78BF73E3CF63F4557075875BF049A8F92CD8B8\ B69F40CD384D94A2D6A217292834033CD94BA0A06D0B41B26E4F8B2C5F7B6079\ 630CD17CDDB518811A107D957645C7FF570E7F16EA4204EE79C625A5E9A873B4:\ 85F6C7EFEBDF11A904C8741F0C67411E:\ 60F0D61421D0D6F46D6BB01213C2AB33 F3CC75785335B638C1299C6D28856E4D66C060488BF17DB58E989EE2EFCE3D86\ 71A8949051543F360D9ED2C6990D41DDB9DE2EB9DE00D93B058E560786F6D065\ C8F31B980275AB44F8553610ED91868B0F2200010B870C5F523F4B7059CBE889\ F87103241B4BBD2303445144E0F183781801A9:\ EC768FB206FFCBF14D21E57C2231CFEC6FFCA8F1679C97F1CD7F295E4E1A531E\ F9846B2AB7B4D897D7814A124B3BB4BB6B3165A6B37C2DCD5A8BAA3F74735213\ E52299B793D058D3D6AFEFFC08AAB7B746D4446BC264DF72AAFD9DE23091287A\ A93C5267364A292A56EB20B011B4896021422527FFA26F3B8B833EC117BA4020:\ B52E2A13114DF2F34844234C4A170705:\ 7818531571C5F69B1B4CF26F75DE0F21 0FE31EF68E81FD5CCD82FEC5F2CC6014AD31E41202A0E4C9FF8830C79DD77EE0\ FA45870BFB3F8F8D0572564793A348BE277CFEB269EC1163F898E60CDAB5E729\ 87F1997B09732CEA505E59E6EF1230F638123CC2305DA0DF6BCA214D7775A8B5\ 6A712E73E426FE35C3D0B3F2AA2664EA0D323F35:\ FF1155A412C0B8009C06A8518EEC87CE4614A7946E6F06760FB86B8BBA29485D\ B78A2A15D168A0CC53FA494463A803FD8D702835754F0A1310B8AB33978D05E4\ 4C7E2155997706F65CEB71388B822230DF2EFE65B02FF949DFDDA0B6C6863334\ C9F58B0AE50E3867514D53095483A19B0A44DB1ACA793BE988398FD3E523D3E9:\ 0E9881250175DC9F6564D3553B3DFDB2:\ 116C34C3DDB5321A21F100401EEF6390 A6EE4E43B382CC75FEC27BB90D2A3F204CC995033AB707FCF8EE2E7E76A3D189\ BEB002EAF964004264A7D712AC5560AA19652C0BC593DD2231B15194D9221631\ E09E4CCEBD1EF599AEF836772514B6D256F6BC22F05CBE6A452BE56328524EE8\ B7A1C1683108BEA36BDF538A8CDB871038420CE29E:\ 52F203A1ACB1465A9D2EB0FCB9CE83957F4207C7649D74FFBF8EAE6C608EA87A\ EF9CC76B90E28A73004B5D9B074BAE04888FB02194BE477B18DCDCE5E738DB76\ 10029DF664EB8C9C5887914760D69257E35A5B40885E2ACCF160AE0B0E0E59AA\ CBBEFEED01108AFFD9A8F6A22EAC8B504D084BF6949823D5F59DD924AC52318B:\ C6B2BB588ED1B6A954710036DB0166F0:\ 5D54E4FF322F6E012080E8FAA242FDE6 D69325940CF2E33246F5C0C931BECB9E0372173963F58FAAC297AF7AEB4784B6\ 0B16E98E2E4174FC1CB73EA690A4ADFCD38E4A955C7F1D915480C028D30E5849\ 2C0BF7DAB257D5DDF2230B3FE0B62B73B17B82F01D661E1AACFED564B9615995\ EF7E0C81C373601BED078FB4668E55704119300BB31C:\ 6D0A03A606901BAC108C80DD968AC128964588F8E5B3BEF30FA0AAFE5092C5B1\ B118B2FAB9AF379D701FBF9354B99048DB408B7CE3A954361A2110CA97386DE9\ E0A8B52B86704D69BFAC08B77F3B961D39105FB3646E2075040C169A9388E68B\ C36ACA6DD627036B15B2AC7424D11AFFA0BEB4414F5360B4349B656D8332D638:\ 86BF4DF958BE53CC007923FE8D6556AC:\ 20B3C91A3B5A66A6AB8599D01674AF45 E05554670BE695A32D397A2A6951DA076F4B760D0C6B7413656B8D38143056A6\ A6074E4280D4EB70889B39ED6A27AE0F67D7FFD31A4933F8CD300BAC7C810162\ D2F91CAFC8BF4238A44C09D06AD503E638AE1299E1575B2B3B3229A9F6A240C2\ 3F1534CEAB344FCA12724D8D185C1A96DCB3E040000B95:\ 05B2E6706BCA5507BCF4399F466212CE875C9C94436F7AA133630A3CA67A9C84\ 3230FC445177867E73A9AC89F7BB32C6653F1A30E4859EE98CF7BE8C5E1479A8\ 0285AE091AE932060F8093A63AF1417FADE414F33190359587A30280B330C657\ E3DC35C8A003ED7ED92E61ACD08049C716AC2F12F362C4FFA1EBE7B7590C6876:\ 915AA4BE886620705DEF24FBBBA40598:\ 46A4D05C91E7931956C459CA51E4869F 8E97900728874829423FF9E65CB2F3B4E3E720BBBEC1A3485F34A94B7580001E\ 5CC450E6D76516DD9A8E450320248441074FBBBCF9A0BB3702B100126F5260F3\ 81DEFC536D2905E78A3783CA969730AD188D34381D353908BE269B10ACAFE287\ BFB37E93349A7F6FA96912975B817BDEBA0500B87CF95680:\ 2B1C832A0210ACCC143745BF8B4A32EE68C86584868B2AD2C64BB802D831303F\ 6028C0646107311F22ED520E063DEE06A2AED4F22D6ED762A299149B3723D30D\ 264847CCB233E8C522B1EEC6458DBD238CF15A33B55627470359A09483C66B66\ 2EF012EE8C26A92BD6E12634B413A1A27813C0C6DD39165B5FAE54069ED2486A:\ 6FA0FBBB491F305F512982ECEBEFCE3A:\ 20CFB9FCC146145657841CB97395B14F 7D15F0ED3E7D504B3051AE6C00E01DDCD7FA4C6F3A3F3E0E9FC945847BAC9207\ 6D92C9BE830AF40D473DA1741DFF53EF78502796B21B66E7E37707A400EA7BD5\ 44FC234B655115394DAFE31C5CBE48846AD62E8F15B6D346A50CDAB34FDD2859\ 3D5B369BCD7D8F47783BE8CE2F5735C50AA266667E421E1E1F:\ 91F4FA1D9381C08E9C635ED7BB5D12421F44F80E13CF665AA2EBD06052B3DF7F\ 7DD1952D1BFC6B61E37953D7EFB4CD152111F74A80CD937FD88B83139E7860B6\ 78512C8A2D891B1AAB080C77B25C226F9C319B6B21D804471887A8EE9DECA336\ B29988AB80D6FAD00A7E1DA5CBDFB757E146C592323CB381EF40166D644570BD:\ 5896FCEDBF16D103B6CC4909222B1493:\ F29D9A05434E704CAC05D280A8FFEE5E 9FACDD624D109102570E789B4BF006C1F0C24E95ACB8082D522615082DD933DD\ 550921F38907BA5AC30846F9CC63AE18BB46852E8E802CB9BED8C09F049D6B35\ 292767D4615648656FA05BC1CDC54A78B00E70A5098A884D0133171D5D884621\ 7775500B2F33EDFAE01109DB72BE4782C3EA1F839A1134C01A55:\ F2D12969396FC6DFE22BA80E9F6A176C9F3D91536CED8CC2A83E1D2A7DB83C1E\ AF6B069522CC1CABF7B30E6B1C082991D662F847B87F3DFF40C7A3CEC5D3D966\ 15640A3B48B95E755CA22B3B0B635C2A56A61F2A8435E1106F62C79D37372B82\ BF71F6043C44813EB2E12729AB30565FC718392D5FEC1AEF0DFAB649EBA8EABA:\ BF380C44E37BCA81F3C6036EA3586935:\ 32F440D2ECDD949684D4CDA9586A28F4 6A22387417FC3ECEC9443041CEE5E8440652146BBF214663631A4ABA37A5920E\ 1BC9611FD936729CDC28084B451C3E08F313F31612C2189E27BB73B48F581C71\ 17DB75CC22D821911CD70968B960AB771C83EC6BE2DEF41A22E36734EF56F250\ 0D3EAE610A860661DDE7F9EF7BB75FE765C427B79C545463747BC1:\ 6A9A030F41BE6BA42A1E7BD051794848D8A6EC6B57F4A0CF44A937A42164A767\ D8799B9923F501621800E05BD2B3F65A890AD5603641ACB2E980A06CA3FBDE32\ 43CC2BD2AB50119576FABAEAEE19D75AEDD91616279A94F8B8B7F6A89E423055\ 718DD356250A3D466BDBD35322ADE654DE176AB4F2740716D4D6B61CD80C065F:\ B81F13EAD324F6F9F9E45659D72D0EB3:\ 122A6645EFE2F81E6FFC8E4418ADCA30 344C97F9A847B33B5A950F5EF4EAB59971EF86D2D11C77B4196DCA55305B5F71\ 3303DA12E3D5C736B129706477BB8F71F3C81819766DE583BD915BFC4C9F528F\ 32D2A4DD4DAA5C5286415090DE7CEAE61BA1B18937CD41E69055BD5A99C73DD3\ 92606FEDC0D386696F2BE9002980CB5F1EE5135974CF859E802806A7:\ 16984B5B5369FD385CE7EFE789D8B2E80F3A7F3ACF0AFD8D00E7C31D7DBD24EB\ 0C6DD509A4AE6A1C04A7A322BD897D307C421EC9A1FE1EE935CAFC27C6FAD7ED\ 0617D184B75726FDC26174ABA388836A99CAF23818A4707EB60A233302E09CAD\ 7B2F7FADD02A9466F8C861D481023016ABF6E57BEDD4B288C8A81B7EFB8A4485:\ 20FE5765A855346A157FFAAEFB7CCE31:\ F9147EBE79608EFFEB722B28AD6138E5 FB5EECD4A3BF6C6B1B0B4B4FF7F702FCF538AE425B5F7419687ACBF263F95872\ 90F32BC9D146A651F4036346934198DD14C0187BBB50834A627ED9136D8E51E5\ EE2D4DD3D71A3546A3DD91F205905F4A4ECB83F1882E8D20A84371CF8886651E\ DA9601D6A3E7A6B60D7B90552C19F786D4AEA805A7C5F9ECFBFA69776D:\ BB60147DB21B8968AA6C60DF45053D8FDBA5FF5C95D468DC01A4030970685AD9\ 1FCCFCC5D35E19E50530EE6C3BE336EBD39BAC07E8C3B966692F2BE6149EB26F\ E160913CF23BB49B30ABBC97468F65CF347EFE06DDDE60E899E28B801AE21F45\ 1470041F98F8A778F75E03649EA7CF6013FF285F8EB1CFBD8760B3DF147AA796:\ 01DC3A0701B7CE3EAFEAFA1A5FFD1B88:\ 213F409C520A489A000F30016C01CC21 7B1A9F40AC8BBB0E7E000CDFA8A715D9AAEA5C8488DEF0C31C4F5C4A2F2257D4\ 80F9C669B3023699C14F59D8240D86382E8DAB49F1F4FA10C69CE63137A21D17\ DA7001BBA5434C577B7F17A22D5ABA62CF0169FC686AFA28EC780A955DC00332\ 81F569AADD0A7130FE25E8D517C78D90EF6FCE96863A0356FE9664DAE677:\ 1C3C3D5AB36DA982C99679AA52D3B6D91E64688958E72BCD7DA933DD509B5E24\ 6277CB1603125002964FF838EAE8769CBC63792BB5F087D31F12841D9776B523\ 3FDC4247679A99C050DCF0C14E8963D39551885F905FBA72C4689A92CCFE4837\ 82723783D560E6E8ADADB6F6BEA0762BA6F21F539E14BAB48AA69675CAA69069:\ 9B9B9E1B898CBC46D32CB73E38F4C3BB:\ 41C1C33D445AAE243A762D2A5EC6B719 AE5940BD642AE3A0487BDDDBCA420107E8A42982812995C5B6F97CFB7B1D1898\ 4D07151984685989294BE42DEF6CC4D0BFB41F2F100115ABD1F36407522C728E\ 84C3EB0E5C156B89C41BEF436FC0EFB1BCFEFB876936654F0738893D601F57B4\ E791D0854AE1C6482D68355FCA5BE8BAEC3CBDAC383D187BDF85845843D400:\ 86F1B8E57A56C1936D226EB3133F8FC7368E172ECE39C70C39736CD17711C20D\ AD4BFC8C445D1E94C6E313FEF1BFEBD4865805560E295F20E6860F26A8B35ABD\ B3B64C230585E1E12D1C83BF8ACE9BC76141B2E9C7A7D7E3BE69C504AC3A4DC2\ 370918C0930B660106B90EC6799463EFCFC7FD057113A82134343AD3E51CB32E:\ 763992E428859B04AFBFCC8EA1670853:\ 38E2D175E535CC3CDAF3AE49A5D80385 18A0F0ADD69013BE387385E4B600D765FC39204E4284DAFB6A80062855C3C044\ FBBBD10C41D13FF4247ADA22B6533647D2B5BD3C1BE520282BD087C04850017D\ EBB7A2DD47527B2B9E3F148795994BE379790556C530AE12BDA2563FA0221168\ 1CCF34514DEAA6ED6AEF8568CF577A58606AE7E6384D572FDB7E17143E000B2C:\ 3924800EC62AFC28F39542F994316B1FD00CE52EC073030EA54493CBF259C2EF\ 96AC4FF8815A35408ED9A619A82094E3CD94426FE09469F6D940BA73E7F9472C\ 6AD14E8302CD46481E1971270B3EEEF22E0FEC16B530F9DB34385695EE904FA0\ 34DE7C6C1FA6D971DE0EDE7129DC0F6FC7404D7686ADB22383B0506CBDAA7888\ DA1DEAEA3CE196301B311A59C8C28499:\ 79D8EE7B194C1DAC8D6AD992922B5E13:\ A709D2673AF50F72F03013ADC79F8D61 [DES/CBC/OneAndZeros] :79FCDEE6F5A94E74:0741219814F4369E:DEFD8C15FEB10458 61:AFE5BE1DF47E6958:3FAD1BFA365F515F:587FBFB91B510842 6162:FB193EF114B131AD:C6DDD3B4CFB3BE35:3397BADCFFA5CD9E 616263:DED4DF8449FA9AF1:39CD739C5FD324F9:7BA9456759F9D9F4 61626364:90D644584B46BD60:0CE7C79E562BB380:FBFE8D32A056DF18 6162636465:2A70B1E3D641EDA8:1FC96BC8537C2BF5:7D14C2BBF4FEBFFA 616263646566:D46AEE73FFF0871A:3EA0FEB6F73FA584:F7EB4F725333CFE0 61626364656667:98FF67221E6870D6:938DE716B9569292:78C186E4F57CFCBD :4543FC96F4B8B122:819B1D2932657450:BDB02A5EE4B87D94 47:CC6E8C070695E305:0D41339A489D8364:BFB7F817CDEE3C12 4749:6FB34EA238CD511A:855595B620EA4AB0:39E6CDE9483737E0 94A320:C2D8EFE2B7E89888:8DF23DFB014D257B:4C3D7238A857AD45 621F374B:709D24FE90B62702:E6700FB699FDA882:3BBB4962D510E0B4 A8A6EBFA30:9BA4AAEBF47F2934:33154E7A3744B1F8:9A7CFF1E07BE5EE0 3F15A3A21DE5:32857A77CD5F0837:D5B9736A8BF39C52:9F9C1DDF2E81D3B9 13B01FB8554A61:42F700714759E23A:AB8AD1DC2B5E59B5:AAC43EEA7CB833C6 875F37E530711B59:8A46DA643B1D2782D0DFB5210AD2745E:\ AB36FE234780AECB:E573C3E555078997 3C6D4C4C7D419EBC5C:A51F4FCD2EC5EA235610B21F77035E0C:\ 9BA56B459BB4EC9A:0F779E7C90490B73 D6EAC1E0BB495865632A:E7295D7EBF14D4401639A62B1A59B963:\ 5E5CEF1045C62E7B:1B4CCFB80E497471 AC0B3DBE737AB8DB9ECC26:26C9D2560D7E1B8247EF2B13217E1A8F:\ 4AA17F4FE7CA759D:7BE44B5716CC3883 97032F592A72724D4B6BDA35:66F27FB8B1A5E3AC7EAFCE2266D6C694:\ C6913279B07861CB:ED65E32206546915 F8B7D69BAB9A491010D7B41C7C:9F86FD8E20FA43F370B4BFE50735B62F:\ 267267DD1B7F94F5:F6B7788B39D47060 D87C1E74D45EC6906392F3DA14E6:75F8450FE5EB0294533ABE2464248209:\ 6F5F0F3DB8D7218B:2BFF759EBBB0F0BD BB6A3D9A99965DF79B4CE7697A281E:16B73C7FBA6F359B582921165E988021:\ 6C6FAEC81E8976BB:9519212C97D4283D 324A67F9D21E72BFA9B47B6D44F0A5A2:\ 08E30F789193EBCBE48D85AA29C9CBBA77DE5065FFD7E1CA:\ EDC12C2E333DA4D6:4D2B65F5A40434D6 BF0640B94C6208A3DA03C7EFF219086590:\ 2DB26514369B9A739631BE6B63E928D437EB39C3641E7C8D:\ AFC1F8670347B23E:CF7643DE09109D0F 6796890753E748AF37ECE642392E6F4DF6D7:\ 1157FCDC653E1644319CF7933D05D60E81FB2F85A6503BC5:\ FB90A71C36341FC0:E2854536F1ACCC7A 3E13EE1BCDB631B81D58505B471278FF1127D3:\ E8A9BCFF29B6C0C5CB60A73C91E480AB98EECD3BB8E9A503:\ 352C22EE6D1ACB80:2FA6DDA5E4F094FF CB286DE6105AD73D734A7E03F256556C9BEAA513:\ 423EAFEEC86ACD6807D575386F65B9B6488B51306D762E7A:\ D2C4D489B222155D:FAB0A2C5D80FABE9 5D047DF0F33352B1CBE1C0C6F48EE8DE30A4AC4E5A:\ 4A73158C12322376A5CB9F6A88BA8A4BB36C5D516D3112A9:\ 041B7EE6A1C92B4C:FF04A9048299F7B5 CF0791C7717083D47546AF26317647F3E9FCA95E7228:\ 53CCEF2E488E717B0BCFF30C99E257C36B57DE139778CD3E:\ D7D6ABBC6B3F0D51:6CDD58FDA4C96D27 F51232D422749E5835E694EFE010190AAB2B8DDAF5E7A0:\ 5D35E1E183A8D3C3305DCB01C1751CCCF6FF6D7BE9A53C8F:\ EABE42DC124A4526:3F57581479CDB2D1 E0184489D98899102B9053D27B87C6F6C5D836BBFF93029F:\ C10EB94F783DED8DF7AD46C605042CB610948CBED32E5E28924A998A1490AEE2:\ 4E6B9FC17A58A95A:70EDE349767C59A1 435255534820414C4C2048554D414E5A:\ 69E0288D17900DA45557053EE79CA771E90CCB8D28198E0D:\ E3BB33E82BDB2B84:593A08135216F478 7777772E6D656761746F6B796F2E636F6D:\ 14D752E45A8D28EAB2A5C8E0A12E8A88E804451282F62CA5:\ 458FD140271920A6:605C41F0790BE4EA [DES/CBC/CTS] 9F8789F30E3ED72800:48C597491E0C3C1706:9076D5A743FC9721:A9A6C2AD38E682C1 CD8254CBE545A5E9C714:2D6FEEC8BA6070172D37:0CDE4B75FE1C60B2:23034593F143AC0C AFF70EB1F349CCC1584D88:F22A14BB906DEA068689E3:\ 911DBDA323F5B30E:51D47FBBEC9C4204 A0CDAF182FFB93314FE439F7:762C34D15E861502E7D5C77B:\ 27399EAD16C76FEE:DEFE481F6C7333C4 3AA32EFC2AD3E7A81879C38905:95D71FD889E597A3F52EC664AE:\ B221AC0CEB5AA606:1C01DA1D9AECA0AD 58FB7BF8F6A8C26398053B5AD1EF:4B3BDD1C187FDE4EAF0EE05B2A60:\ 710931E0736D16F3:378013D6D8779222 1E73E7D1B82FC519E7D6778CBD9E6B:A532BC6B9C5686C563B59E6EF47F8B:\ BAFDA9C3208592C5:1FBA498F337A06CF 63B0ECA8495901988D536A8764EF4DE0:C9E597C818E5D2E8D525744D1E58BAE0:\ 7C92F7577E9E5821:85AD46CB62C42A4B 3B0692000B6FFF4622977B62358615D8B5:8110C505835BFE6AEEA9D8877469F677C5:\ EAD7E457662B61A6:9BE7F359CFD116D0 04AC84288F0BE9BBF06A04E2DD6DE213734C:17679CD3AD54BAF73FCD7F72C518F0B4313B:\ 31924C5C146EC54F:DBAF3718A8B17FB2 5D8B2B8476827B801B08098CE6F5E690FCE32C:9461193572872EDF01E2266E56CB72A78A19C7:\ 09CA9A9F64DD9CDB:6B31656961B96C3C F21DBD30623DDD0C3137578B1ACA3D048C075FB8:\ 24657394EC233B6C7076CF6A33FA53B86C98CE74:3B1E7CEB3483A31E:B3247C1AAE6F97DA A60CB3ABB1A52085A334641E9C26FEF09156E7CFC5:\ FA9F81191286962E5B710C20C99983916AF173C8E2:\ 0C133B1D431666B2:9D01A2A546DCDD89 800301AAD00F8F895B84218BBA09246DB23230AF3CC3:\ 11ECD036643726BE0924C4C401058D15B63E539F773D:\ 9C6C9BC335380837:EEC9907B66BF8F8F 5467CC7DFFCC6E60807E09AC80CC0F323AFBCF3F49B65C:\ 24788ECBB92BC763FE238037EFFEB0AACAFBF106DB081A:\ AFBD3EC2FFFB2855:021A20C31816F20D B1F5B889B9D1E78BA612BD7941D5812444D3510AA83D0B72:\ 3266DA8CAB200E3C171CADE8AC651D44CDE2902EEBCF0F5B:\ 22612A76D074686F:6435B2BB76583F97 9C8D3469E24F2855E477222E3342136CF67673484603EDC5FD:\ 8B4405DC91225416A4A3F6838C72CD0F9743E5F1158AFF7DCD:\ 8DB74F62C79A83B7:C4422D5E3E95C4BA 41B52662B96E82080D704718332453E8A3FFE3160C48A954244A:\ 1AC7CF83548D910658FF048174904A465D5F401FC585F69E96A0:\ DF38AD749B054C2A:62DF2A547372237B BBEF9A510A56A5595612AAE5102CA399C2954E5C0A6507B7E30137:\ 525AB2A4FDC61E88D17263F7726807D66719D0E33C8D97968FB00C:\ D7332D48E4A08E73:BF57A1ADA757E6D1 52407DC79E76D93EAA0AF19D9910EA4B101475972530E5DE6AADE1B8:\ 22FD7F774A84EC5B194B9B3159342F6DFC0EE7F3A82BD2DBC4551BD6:\ BB99706196E706BE:2CB49529735604FB E69039A548D7C922BE551BE70A404D8BC347B5840EE4472E319C7F9430:\ 1D69B5C8EB2BA0CC8E418A24E7F397C54CE69419048E0EE7ADD6142B2F:\ 4F9BF676A7F95396:64DE012EA4EF1853 20081F83FD34060842DF4073EA8F5B3CAF0B289EB25FBD807050EAE314CE:\ FFDD0C2735740CB998DF8ACFDFB2C80AF3FEDB07E01A8795FAFF51098730:\ 817F84ADC89EC13F:E166F32F3549057F 6045C8B00A0D1349C6576AFCBD95435F90068C3949CF32FBD2190C3F906919:\ C99CEF2CC47F6A3CF8588501D20B91F99CAC725EB2D35DC8EC9B1BFF3FC193:\ F67E4196CC6DF276:EAA8CAD5C86EC7C6 A1FA682C81629A841AC8D1B371053997F4BABEF1D83D236AE4C77086DA24DBF9:\ 2074FB01FD3D750EFE0548BD2C51B127188257F76431B71AE3A3A6AFE7103822:\ 42CE0D2CE01F9ECA:71CF9AEB127BF362 541DA0919992A383F739B2B601B92DABD3F4AE1583D607EF692C010E7E00C21967:\ 92B790B103A7664D2508D08E21994EF3705E6F8109D83E087878085A2B5DF354A7:\ 4466C9BF5B474B21:0DF3DB1AD76656D6 C909604CE459AEE764AADA4203EC6AD3B34D2720890CEB8DBE38CDD955D1BED744F4:\ 602D9A17F224434CA5257433E395A8EBF714DA7A41654063F7791051786C21C6B2C5:\ EEB3132A403F49D5:18BB520F687B1841 2D15B7F8554FCFA780172E27C7658A2035CDDC09DB71D10B9480C5345B250DAD722C65:\ 2ABA254E087A44939B17C0B013FD0D2515A81F552CB833F83E497B0894DDC9B66DDAE7:\ 6208B08A597F770A:4A71971DFED24F2B 559C03E98875616C541C1FC689D006ADE4FA75C79DE33DBFA5CE7829106A6EF2199D9496:\ 8D1C902E4DDAB97D67508E13538675BD45E59E21D40432A2D2A5E9243AD30158AFD5AA69:\ A25EEE00A0B616AF:DF78562B7DAF5D2B 575CB34C5B252FC26D750583111B2F0440B93317119BE9ED482A0FBFBF0B6965C8BD672B6D:\ BAD166C1EB916C9C12DD3134E4F2A85F59109032E85A6989E581AB8834C6CCDBDC5A47E7FD:\ 9BE282204F105A61:F7F2247110CE2237 82EFEFFC150758BF33700D7E54FDD0660D80B023B66DD10597A08BE9A5F26C9F71A00FE72CD7:\ 95EF6D44507187386142436237DFCD9F5BAA7376B71CE10D6D47DA1D7645F790D1C30FA84131:\ 86543EB8BE5D6E63:988C92F9C6E7F0A9 E3411B122E35669226D9A9676C5A735A645C258\ 8911B5DF3F00AE88C48FCF91CBED0EAD776511D:\ D9DA0C4ED498214DE38DFC8B6663DC231AB17E8\ 39819761952446E7BD4F3A4D5996D843B1A080C:\ 61091390D89E195E:55F954DA491D0487 82905227D786AA54224A9A98EA663F11765606E3\ 7449774301E9229AACA08D8AAF88CFA055EACF46:\ F46290E04EF671B0F1B40B6A3C957E416EC02401\ 49D8E2DA20A936E9B65DF371BE6E3507C1075823:\ 46656F1BAC4034F3:B0AE27B323665888 0132501B732D145D7B44D0CF92493B3FD7A56DD5E\ 8762DB54BCECFBDD68E9843A1D0BD0F20849A3756:\ F6253C8998EB2E8A898661336F398E555241736B9\ C0B5B83500121F96A3C85EE5BB6FC3489BBBAF3B1:\ 1C70A4D7A305675B:05131A93D393B7BC 374A3C384D246E0703BC69704DCC2EC8E8B4B6249B\ B9690A13F50D1723CE2638330B61D8F7328A8FA0E6:\ 6BC4D82EF7CD9780FDAA3FEF10E2C786AAA81FD28B\ 62F9EB47A2F25752A0E262554976A3BA619A02462E:\ 27B33E69D3BCC393:7166FB734C6E9095 BF720B89414128080AE8A26CA4429BE5BC0C2C3FF51\ E29A13A8DF38B836817EDF289189948D9D8699DB418:\ 4717A106215F960253C5CE8B091703C4235078F444E\ 52B85E64CBDB4B1F76C7AB07346112FE05AF4356BBC:\ 593C3910E6A31016:B4F04B72B87551FF 3B7AE22299A6A9C4CE1E553821272605ADC48B7D8BEB\ B81E1C81F3C45CCFDCB6452989C314E1563F79D29824:\ A48524FBFF6C0102E72A7756C488C8B317B33F7C3A5B\ 7DBAC9B5B2F3D0245837CB6E4622407ABE3E6F9E6947:\ 201DE422F64787D2:1ABB95D29DC719B7 D52C0A8CB50DA55BCD2DF81FD7FDE278862A60417FA2E\ 3805B99844CBE4B0DBCD062B233397CD3FDB7B05075D4:\ 92377CBF81BB2682ADCD32DF7054517FA3E3589A51042\ 0F6BE4A20E64FAB3D3F5053F8A2FDA8DCFE81BCDDB9D0:\ 656F047010D196EC:57008D1C6490B4DE 282651F1695450455B6524AF1E2FD0C37BFEC3C37394E0\ 996CE31E46C198B24949E7DA0D33D2388B865A946EA2BF:\ B76BE4E8CFE9B2056E2295CC3883CDA8F17DF535A51EDB\ 480931AA5BE0DC2AB2101BDE55BC8E904EF6DA53AE525C:\ 113094CFD2CC5B7E:659806A7F5D7EA7D 9ADC8F91CEABEA3DF51FE620533E848233BAEC6DEE4DC0F\ C6F83843491AC8F614DD036616EC8A07CE5C87A13422E88:\ 2AC49B69F5F2798FAA2726A26C4444EA6ECFE9C632FDCE9\ D15C7A9149FC1FCE7E9D52AD5844A04F504414B5D650771:\ 58077FC3CC4757F3:6E459E39F0AB37E1 B6D6A97A8F856E1F1652A0C0C5B4F0CF65A98BE4B8CE2775\ 4514A2104A97775326312680F5F0D209ADB2239BF8C6CD08:\ 30DD92C5768A88EB8A8FF3FF3A4E0A2DB9BE7C9C3E358591\ DF5807A1D4C2EEB46408CF1329A20A2A0D9D810F89CA87C3:\ 84270A179A8FCBFB:230750471B258152 F630D0A6CD851E68D6779C8D493BA6A3C86618A97317E3CB6\ 9CFDFD8E792E1C7E8CD786F0FBDAF0169C430001A6C8504CE:\ F9C32B13EA6A1C1D2BE47A89CA46827840A8D5676B658D74C\ 00F36F19E7285CC5BED7A81450C70DDC9D30642EDC266AE4D:\ 2360554BF329A8D7:B58908438B0169B6 023A29F413E2008EFA90CFEEA4C5E95D05FC24AA151B897662\ 476C23C88928A50D28BC3A5A77A2DA6EC8AE91B579993AB509:\ 84D24A62307BAE86B50E5C3584F3648D64CCF3B60C0C74F947\ 116A2B54DE75646CADC8289F78161A1EAE8880AFB83248A57F:\ 7DA9A637BF1880B7:E1B8D1DD907D13D5 # Aka DES/CFB(64) [DES/CFB] 5EEF8199471C2A7EF97509623CAE32C35A90245B70A21CE36E:\ 658B25E25DF23948847AFA4C9FFDD5B3DDF35D801CBE945168:\ ADD9CE7BCF48C44B:0F90E78835BA3183 4E6F77206973207468652074696D6520666F7220616C6C20:\ F3096249C7F46E51A69E839B1A92F78403467133898EA622:\ 0123456789ABCDEF:1234567890ABCDEF D14FD67A9B4D7B0F65B7CA3DA91741603DA446:\ 0CB8929A854E61AB3BEB72CE0F13BA328BA73A:\ 7132D895529A7AFF:FA1FE8F921706C75 # Random tests, 1...17 byte inputs 16:E1:F51CF13FD55F33B8:10E61C7F8276132E B8F7:9F09:6A2306397E6399AF:6791874E16642DD8 914AA4:1CDDAD:08D3B08CB02E2547:B35072A53FA36190 252F0616:E22A706A:454A9ACA108AD24C:64DADB33CCF1DEBD F06F376C6E:C2F054E435:087FC9F0B8BE08F3:5E511251C063B3C7 9A181AFEC04C:C49218C8A25B:FE1EA0F0AC5F2C02:A247E69CED4A2BF1 AC465CBD745341:768B6F5BFA9C24:1E7C7274307EDB90:AFB634941C366C1D 52BDFD51E3434E94:C5D84483756AC360:53E241E43AAD03E7:BE0A4AE59056D8FE A62C02059AFE67CD7F:032A99BE4DF6B63F97:487C9FBD140EF278:43F88DE155E98523 32D3C8A283257F6276C3:BCFA26EFE2D93A4B1364:8B068595D5B79177:7129287761D94D9F 17CB11A60F880C16D6CC3A:3DC099D927B8AA66B2A5C8:750C87995AFD65EE:A61398FFF559FAAD EAA91CEDE4EFC60F02B1E0EE:75614EA2FD5474FDFE3A5612:\ 08A5F56200AC9300:9F9ED0928B8CD2DD 68DB8992E91D759256AB373748:9D0E14F0B2BE2D3B47103DA75F:\ B11DFA915AD86FF9:3885ECF48A611DC5 D75ACDD3E4040DFDA924CE09E627:A878CE766412A9C387AD61642FB7:\ FBF9E6D9344B0F2C:6917F8FE1AC12101 38B667A6E4458C8732AAE6F4D0AC36:5BCFD93D6B4B45D9D0D03162FA8FB9:\ 8616D2EA6E6106B3:CFE4DFA7044F56AB 0B439A72A4430B3D15E234034BA2C066:1ADAE0A4A0D582B70B60ED1C859A07B3:\ E255E4A4C3606081:3F160DFF918C3F78 82E27182FC22CD8918DDDBDB850034A4F2:9767881B1909DB5E146CAAF5FC6A118814:\ B9CDD5442E1C7FD7:5D1B1ECEB7335274 [DES/CFB(32)] BF28A5B2F3FC788F:13799E52F0BF6B0E:44FD92D1AF17DA22:5EF2AB4DE2C32258 083F1997FF19246C41ACC1EE3A18B489:31C4C90B034B75B21280B60751E60821:\ 75E1E4E29E6C9205:40D4F3DEF6222186 5B38FD10CAFF5611114CAC8033DE01DE:6434BCA36287C8FB3FD0BAF32874C740:\ 875D1C19A20E6740:E2912582ACE9830A 44D4480CE326D9583E6BC13A78D7DE03:7D52C87B2A0D33B3A48631EF3184397A:\ 79FE005333D6437E:BDBED60C0E069960 81BE542AD00FCAEB34945D89B4F29EAD:DB0DBCD722960D54B531D8AEFE1B26FB:\ FFF6D6B146354428:2EDB634B4C7CF4EB E0A787DA56534F407586ABA1736C9DDF:34FFCFE532186F84EF57E0CB5AFE654D:\ 330AAD15FFEB8E78:826F429D0F342F43 302C49BF921E0516261F00B2FA2E96A6:19D49D5A54C8FD15EF317AFD5A87EBDE:\ F15BD42AEA7F38FD:5E10F9CAF0730C4E [DES/CFB(16)] 6BFE8F2BF363D3DA0A2CDAAF2D7E1D44:8D407E5A8B5217C56B8A88E3CE478B85:\ 302A7B0BDB8669FF:47C89DD706739D23 A1A3ABFEB7BD450F:D67A4F0C8DD67769:4243AF4851BF8400:BE0C9A3B77C26C9F D316B78F0C25C56E:E8BEBBADFFE18E2A:4F05484FAB8D47E7:CA6129BC11056056 09BD5550EDD99666:69C4AA4C8B88370D:04ADC5D1401848D3:5DE8A3519C477771 7C1BCEF78CA58DAD:D14FF21AFF121E8B:B045BACEC002FAAA:1716B53D7A87854E 2671E5DC0341CCF4:D618365EA3287474:8053149DC51A7F4E:E18A7936211291CC [DES/CFB(8)] CDD4BAAD59214E97:DFD8C7EE7485E30C:3400AA949E053449:2ABF031C3DD08BA5 0BE8FF9BE975CE5A:FF834A9315DE58C0:CA2CC8DCAE150ADD:2AE7960241E5ECD0 772AEBCE3E9DB532:E31732388E069526:9D2A486812B8BBD3:AAF8C0A145A00319 B6DD299F4D45C378:1A5DE72F6BCEDD33:CA9CEA52658150EF:4DF0F3A7B49AF71E A5107583CA3CAC3B:D5541A94B73C2DDB:139D5249F1CEE0F9:1B3212F80A91A42E 24E224330C88791C:177AA6BD3D885167:D8D3F1611C2AD43C:7B4CDFC2344DDABF 92C51FE490D57CE8:A6ADC1AA622BAB1D:DC24F740905DDA96:5C307E5CF2C73D46 E85D092290F3A53F:A1A2A831C55F1454:3739A5D446E8CEA5:BECAFE19A645F489 CDE5CDDDFABED42E:4AD6E96CFBF9443E:98ABE3C8857BE8A8:B4A9E4A90C4D08D0 6614A9AB1E3EC578:32B6733A61D38CD0:51668D4A64FB31DE:31E42E3EFE3ECD65 [DES/OFB] 4E6F77206973207468652074696D6520666F7220616C6C20:\ F3096249C7F46E5135F24A242EEB3D3F3D6D5BE3255AF8C3:\ 0123456789ABCDEF:1234567890ABCDEF B25330D1CAB11FDDFF278192AA2C935A9C7745733E6DA8:\ 39B9BF284D6DA6E639B8040B8DA01E469DBA4C6E50B1AB:\ F871822C7FD1D6A3:B311792C8BC02EE8 73AD356623A1D6E0717E838B9344B4FFF21BDA:\ 0C06E63E9E81D9976E16D2009255F917797D51:\ 5860F4A413DE6C68:527A1E050A9D71F0 08A6091FA2987FDC682A8199A6D6BD1F:640B5033DCF26873FA8A34DB644F2BF2:\ 3307042DC775035E:99DE32FF0351509B [DES/CTR-BE] 4E6F77206973207468652074696D6520666F7220616C6C20:\ F3096249C7F46E51163A8CA0FFC94C27FA2F80F480B86F75:\ 0123456789ABCDEF:1234567890ABCDEF 11919B328564DA68D9F4216AE1B4FA7C46AFC7AD5BB867DF1834D77A3023ECAB940725AB:\ F40235A0B8B2EC0B53F3C0D8799497463638AD0CC3E07F0E8B8B0DC7605AE6AEAFBA2A88:\ A67ABE525A0E5AB2:727BECDE9FCEA20A 168A502D21D71F3BEB702BBF02D3F6D04B72EFF2F19EF01D217CC7AA739A67466AF3B14E:\ 3A73770D157C23EF8913D874CD92DD36C465679B2BC691DAA0DC6CD4591C4CA44D5D69D8:\ CDB366CCD621D62B:1ACAAC3F760C674B 24889A268E11AEF80852C4FC4893DBEBDF4CB06115FD533650CA39A639C659F47C3D5556:\ 782B24067A2C5D61BF6ED2E980F6BB16A0A6E0B5639B4208AE273C0BDC0311D65464F217:\ EF510AA740BE98CB:74E74E01E5C72084 3078866926F75D18239A3DA92EC9EB88D18393440B47D46A49D003F2C3B5D51C1CFE3FF4:\ DE4D9632BE88235D717B36DE4C67B81CF3331E8925726CAD1BCC05126B87A6CD5D5DE3B6:\ E8CBB756DE4FDEB0:AEE751205CABA9BE 4602C97A25AFB1746DE8BC1A65AE0B635ADDAB9547A99421AD86AFB087997ABC1458F0CC:\ 754BD27902EE4248BEEE65D2BB035C9139F98735C85603BA9565EDAADE37A7FE29833DD9:\ B050B286E47C6E6A:701F72AE37D31F2B E344E0C2E45990C451C75BF74406821B99D4EA5F56F67BB2F9B0EA52FF5D1BB25D82A181:\ 1A23AD101A776F902B8DB40E273A1F5EAE8AA1E43CBA52546F2EC50EF32960BDD05101D3:\ 445A14B76AFEFBC0:EE2DD8860B75788A 2C3A117378B8DB1287CE8FE084EAA08EFCEB253DD4A92509EAD154E6AE483E25D2B790B5:\ 75235CB3E2BF7DD3ED893DA93AE25D7A34D43521DB620E2BC9072159357010E6D81E5884:\ 4B1B62B9D6B8F54F:036CC5145BCE2A01 FBC7E48930ADF4A36DE18CABDE25ACDAC8F9AB727E3AA69FE8EC6F965C6E14EBE9AE437D:\ B271913A8A58ADDF3C89132A15DF1263B63018CC8EE6763E6FCFB4DD5D4AA8EC4B3E2D78:\ 2E0F06AE7B1C30D7:05E144D6DB9E7939 940C3FE78C56A0F922FBEDE7ADE31914C993BB84F5BC1557E5F8004CB75D7D339801FBBF:\ 9615A71536135E50946A8517E72A980CBB2378A3286F08E76E85E5FB62140C9B3720C7C4:\ E6E85EABE538195C:B86615CDA5C9E9A2 256ABA748AE0005A5F99F1C96F8A197E3867B8455A4D6BFD6795BBDB89062B222E6B0DD7:\ 2A6B043F07ACD99141C7AC616B7F89AB7E52174A41AFC1FD0C56BC77B9C2EC9CEC87A0A6:\ 9985CE7E0D79CFEF:25D1D57C3A6936F9 44AC3E1333DE5CD00475317CBAD26AB4A812180DAA7405556C41335572F5A236C37CD36F:\ 155E5B86FC06AD433DAEFA05C329BC1407966220BA91EAC2FD32B35C5AD973D94A0B8792:\ 47550AB0F346ECB0:1C42F4559385E11B 9DEDC376CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD:\ EDE3E69EE5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D:\ 098EFEE0D594C332:88D9C46E992B27AE # From NIST Special Publication 800-XX (prerelease): "Recommendation for Block # Cipher Modes of Operation" [AES-128/CBC/NoPadding] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ 7649ABAC8119B246CEE98E9B12E9197D5086CB9B507219EE95DB113A917678B2\ 73BED6B8E3C1743B7116E69E222295163FF1CAA1681FAC09120ECA307586E1A7:\ 2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F [AES-192/CBC/NoPadding] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ 4F021DB243BC633D7178183A9FA071E8B4D9ADA9AD7DEDF4E5E738763F69145A\ 571B242012FB7AE07FA9BAAC3DF102E008B0E27988598881D920A9E64F5615CD:\ 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ 000102030405060708090A0B0C0D0E0F [AES-256/CBC/NoPadding] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ F58C4C04D6E5F1BA779EABFB5F7BFBD69CFC4E967EDB808D679F777BC6702C7D\ 39F23369A9D9BACFA530E26304231461B2EB05E2C39BE9FCDA6C19078C6A9D1B:\ 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ 000102030405060708090A0B0C0D0E0F [AES-128/CFB(8)] 6BC1BEE22E409F96E93D7E117393172AAE2D:3B79424C9C0DD436BACE9E0ED4586A4F32B9:\ 2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F [AES-192/CFB(8)] 6BC1BEE22E409F96E93D7E117393172AAE2D:CDA2521EF0A905CA44CD057CBF0D47A0678A:\ 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ 000102030405060708090A0B0C0D0E0F [AES-256/CFB(8)] 6BC1BEE22E409F96E93D7E117393172AAE2D:DC1F1A8520A64DB55FCC8AC554844E889700:\ 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ 000102030405060708090A0B0C0D0E0F [AES-128/CFB] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ 3B3FD92EB72DAD20333449F8E83CFB4AC8A64537A0B3A93FCDE3CDAD9F1CE58B\ 26751F67A3CBB140B1808CF187A4F4DFC04B05357C5D1C0EEAC4C66F9FF7F2E6:\ 2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F [AES-192/CFB] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ CDC80D6FDDF18CAB34C25909C99A417467CE7F7F81173621961A2B70171D3D7A\ 2E1E8A1DD59B88B1C8E60FED1EFAC4C9C05F9F9CA9834FA042AE8FBA584B09FF:\ 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ 000102030405060708090A0B0C0D0E0F [AES-256/CFB] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ DC7E84BFDA79164B7ECD8486985D386039FFED143B28B1C832113C6331E5407B\ DF10132415E54B92A13ED0A8267AE2F975A385741AB9CEF82031623D55B1E471:\ 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ 000102030405060708090A0B0C0D0E0F [AES-128/OFB] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ 3B3FD92EB72DAD20333449F8E83CFB4A7789508D16918F03F53C52DAC54ED825\ 9740051E9C5FECF64344F7A82260EDCC304C6528F659C77866A510D9C1D6AE5E:\ 2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F [AES-192/OFB] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ CDC80D6FDDF18CAB34C25909C99A4174FCC28B8D4C63837C09E81700C1100401\ 8D9A9AEAC0F6596F559C6D4DAF59A5F26D9F200857CA6C3E9CAC524BD9ACC92A:\ 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ 000102030405060708090A0B0C0D0E0F [AES-256/OFB] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ DC7E84BFDA79164B7ECD8486985D38604FEBDC6740D20B3AC88F6AD82A4FB08D\ 71AB47A086E86EEDF39D1C5BBA97C4080126141D67F37BE8538F5A8BE740E484:\ 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ 000102030405060708090A0B0C0D0E0F # From NIST Special Publication 800-XX (prerelease): "Recommendation for Block # Cipher Modes of Operation" [AES-128/CTR-BE] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ 874D6191B620E3261BEF6864990DB6CE9806F66B7970FDFF8617187BB9FFFDFF\ 5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE:\ 2B7E151628AED2A6ABF7158809CF4F3C:F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF # Test with 15 byte IV (last byte implicit zero) AE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ 9806F66B7970FDFF8617187BB9FFFDFF\ 5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE:\ 2B7E151628AED2A6ABF7158809CF4F3C:F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF # From Crypto++ 006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E\ 5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C37\ 10006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF\ 8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C\ 3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45\ AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE6\ 6C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC\ 45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417B\ E66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76F\ AC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B41\ 7BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB7\ 6FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B\ 417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9E\ B76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD\ 2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C\ 9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17\ AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC\ 9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B\ 17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03\ AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F\ 9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E\ 03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF\ 4F9B17AD2B417BE66C3710:\ ECE71ECD7A4E3C2F643B2B0BFBED32F31C8551B6306D52CF843EC0B85015DC20\ 3B1C0B643E2A6BABAF5133DA0EA06616076AA6BBB52ED75DC3A71A9A6E8AC7C9\ A00D2C39AA68BF4E6FFED9AAEE5AD6914FB3EA77C7B61FF6BF564F2F1225ACB4\ B5889CB1559888A5817849C382E168482F75381F63868C468E4D1583B1FE71DD\ 808CB94D8150AAB9D530A0FC17CDE748E95545D8A033B2F61F1954D0C0226168\ 022E1CD7E031C57D048AC560F152960F47705E174D956D4BB53AE80BFFCD1BD5\ 69ED8EFFA223C00558B702405F33E6E0EDB2D9B0C148A1441CC80D6ABBCE785A\ A1B9DAB7CB8832F1B12D2EE60EE2DFCA37942CA1724E5602B7B70525AC966202\ 8A22DB234676615DB474538CBC8D197F38C88BCC4F9E8D207538CA18DE5F0954\ 20A2E4D5868CEBB8B34A9377DC52D119790B65210F1B346F5E00D9BD00A88470\ 48913D80726B9B745D565E6284B986DBAEA997FFC5A0DE5051527D44B2C1266D\ BC9130A6EB15F37A0F00B6286D6678CA651C07743BD37F2E8F6A94F5ED8C6342\ 8AE4883A9695183807E104BC335C64FEAAC40A605913DF98FF44E0801B31A968\ CCE5DCAFADE1E017FA711E05FF5A54BFA1999C2C463F97A3A66B30211BD306C8\ 911C98F8EE5EF47A54746A4D16B7C7424A6954B4FC3BCF1A41BDE8A19CE1027A\ E86A320D0E5E7D3C7E50CFD0C4665B811D86C313F09ADE5B4DBE017231859881\ E5873E9EDB2011CF5920D2F7277C4DE1AC430A1849F0B870A69ABE701B6D0B51\ 23E5FF53395409177CF84BF41EC33C5E4BCC2CF29258DC7C260471AABDA49FDE\ 62915758EE4E578D0F7698E6456BC144573739D5D508CC76B389359D2A0ECB5B\ 7EE5FCB4C3151D5AF7C71819EA3DD5F36C7B27E551FD2373D07FFDC76A13FC4B\ 10A6F29A83D6F465ACB6960671EACF21A3E1CB4411C4DAA0C2A87DAED28AEE60\ B7EC0258A9AF125F2DDC80B9877EFE0F372D9B832C786770A84EA1A07CB6E1A9\ 907D651BBD0EFDEF2AFFC3:\ 2B7E151628AED2A6ABF7158809CF4F3C:\ F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF:\ 900BF2352D973046F4128A1489F84DB204C552D2E59FFD58844B2BEA8DC04B46\ B1212433EA1D3704673C45222C77D3D7CF7D21199BCC1464393853EA9FE5976D\ D8612F828173D82EAB52C10A863FA549911F9B4CD0644766BDE8412F0458C620\ EB63CD699CFFAEB948BBE360FDC541F0912B683B72A13306E0203F444E378458\ 164F461290E3F934DA40540945D8FB455EB86271F4D55DEBF1CEDEEA08B7917C\ 2247B1261C3710D949B678CDD4D5DE857A2BCD4751F2D4C49C75D52B33A0B761\ 943CF6258DB7C13C321F2E3C43C680CADA039E3F177B88C993464EBE82732229\ 784D929235FB7E4984F1DBC72A2E0431E7BD976A2CE09931DF2C80B7B7405E8D\ AEF482E4AC7A0E33C52EBAD9C4F854A061B047F37CF70571FACB6D2CFE6EC0CC\ 64933965D74B871150214A009E998BB078E8799E1B43232F9709F1E5602D2DA4\ D9725D2EA8557374809285A1B48D489FF3A8A50CDA1E0920035E6924272FA194\ 2022D71C9984278B4112253349D916B17FCB93A59FBC2641EEF4DFAD6FB83AEC\ D25A6F55F06A95CEBA94557EE07220C51D0DE32969D70DF310B8DB0E7C8B65F9\ 5BB7B14098575CAA8EE472726FF5C87E31E94664FF009793D3230A528E9FE289\ 3210E01870D0B60B1C55A6C49079BC3D97EBA815ECB8DE148A000C310DC372C6\ F0627EBB1F0CBDB36A79A9DDADACD157B561EFD24FD523067AD3E1DF7370DD78\ 19347C5FCDD7296BD9DD9D940C7956CB8A4ABA3359538474E81613E4BEB346B7\ 4F05C66BC19594C12920CBFC145ADEBBC0511E710A490708B6DF67D8F5C5A3A8\ 09C9C256CD3A4056019E04C27D773A08BFFF86C6F5E9663DE4369AA4612EA265\ 53F5DF2314A8FDFCA42B897B5EEE64FFBB16F67BB1BFB1E5408C850848978645\ 087CDF026C9D8CB24494E42867D5010B66DE211C5E10F92D6E88784E9F423958\ D0E50E6F153FC9D7B07894D5888B3CD0AEAEA0ADDC058083E84EBE2CA55E4916\ 79BB9476674E8B2D01E17AB60DB86CFFE48AD3C171F427EB57247A5E34970EEE\ 3A4FD9D9FBE9C5F39D326D6FFA45398F822532B8620337EC1846184BB684478E\ A59D803BFF5F55B4B15F3DEAA58FFB550AC480876DBB16C0FB72E0C224D2FA47\ BE2A33736208E9DC38EE0E5D050596D692718D9CD90DE7CF9203A6D1FFCD5F09\ AF6BAD40F006313C7916AFAB0D09220B9F6C7E020EC12D4982A809193EE65DB7\ EC04B94F580DDF15D6349279FEB9679FC9083ECD1FB1D9B58E2F81D07E586573\ AF0C61BAFC811BA0D15186F408760314724742143B1A01AA0038EE1BF4DBAF4E\ 85CCD3412B4F17629F069E6F4F24CFB28B4DAC1B7ADF3F2AB621B62D4239C842\ 5B93CB597D2C91FD9F4E3FFC6DD70CCFDF5CD8F42E29344B6D1ECFA073C853D7\ EB1FCB34EFF9111D90557E15B438D8AEED879991167D04BDFFD42014BD12631A\ D879A98BA029DF7441C7242F0FFC0EF25E36391EF4D151BE45C6D6DD10B5C591\ AA039507BF3513BFB36BAC155564B9CA65DB8B2EB74E10C7371090C1DCB54B65\ F9427E830CF1EC7B43FDD5E7AF72C8FDF19B709A41F9458A1A69D8FE8332442F\ 5D1326597B429D065F17005C90DCBA83833369AA2F8CFE860C7B25269049425B\ 1AAAEEBF873D32246A4EDDE5C42D88DDB5EA5DA95BF7DB2B97B3C37F4593D4F8\ BDDD2EDA804337307E6C68952FD7FC0A55E2673C08F028522CBF7000CDA1E335\ 23AB0C607CB8361E95CBEB06025636D94E945CA9E911FEA1CB37728F76D2BF77\ 6875181EABEFD2841EA068EEAD02A945AA68FB64ECAC7EBFFA9EF739D534B7BC\ 06F9B57ECE9CB9CB8D7977128567293C51E79A8126669925214AB99577019512\ A72A537429CF5B10FE5B39AA2566AFA490C6FA42916D414173BFAEE8BAA851A7\ 3D6E55D0A48A9F47BFE67EC5D27BCE42D7DE7BF52DCE4ACBED91C5E52414D09C\ 8119A3270709EFDF1AC93598EE5D3FD58436465C65C10FBC7E5E830B9E0131D0\ A406777FC79362F660F8D9D173499326D8D87B1A64952688D72C83ABBC5528A7\ 8F57E38E54FF82CF826878D73F7F374284181D467CBC0C1CB980BC3CD3179542\ 663B35EBDCFC45F2810A2CD83F3E8EEE11C7550C3F105153886FD0228C4368DF\ 22B3483905C4EB8CB841626CBDB46010FF6FAD1783D518E9030E0D01C1A28470\ 9E56CBB29B18E269BF32CB310AF67FDE673AAAB9D5D05FF067650E9C2320BD29\ 4AF308F97547FA907561C6759957E19727BCB6AA81B0668AA891B524A44A9747\ 188806005F497B0F06C8F29277F0532CE48306CB2AB1F4AC69189E48E958CDB2\ 52BEAC88343FD10F61D1BF2DCD2347407C4F449738D29FDB3C40BCE2381154DB\ 9B3CB1241BC1E682EF2C7845ADEDBACE1DE98218F967C058CD6861CD66FAF98A\ D2BFE088DB945EFA1A5EC31C63F4AF18A7E26DAB81333B2D1D1B64ADB0F0B628\ 941712AC56D651AAE05C5D4C5ACB7FA3AC16A1A3D22395B76371ACC9D4CC0472\ 59B1BD1659AB6987E4CBB363B2E2378D5CCB15C41ABE14B65B920F58356653E0\ 240181B2192107884699352634712003815BEB662F3D31F1EE213E43637738F9\ DBDDA96524CBB76FF388C93CF540968D41CD79D6F575B47E8A4C8576A34D864F\ CF15DE44929682C7024F5B96250449649697EE056F1FDA1A0D35953F03E88DC3\ B35913024218DF877B75BECE027A2A7EF7C76BD650E0586D404934E344B8C737\ 6A601998294C196D0D221CCBB59AE05F7DED4E355B3FAF1D0C51DAA055F92544\ 0C272D41911D83AABEB3638316F1AFBF7BFFDAD1E800F296323AA33A7853644C\ EBF3733BA2748DE7D37B9AF8A5A4C05B74211B359B0E6B518B10A012B4F71888\ 65AFDBAC2CE1D53B9F3E8F7F80BA15D11CF2967C42662FC4177D2E3C00D3DDCF\ 581B8FF5E6544F312AC52D93B7A0789C2DFB187E10EDEAB3BA6E74B9B685F1FC\ 924974A4D0302C89C6709CFDAFDD6B235AE0326D8E22D164390620DB012B85A8\ 1560896F2C085307D07F3470887541EB5ED2065261C87ACA522E83C2CA77D9A9\ 751DF6DE35EDF82E04F55CC9A50F5646254EFF10612AE8B5010B4F1886262666\ B997005F452CDDAD9E7FA8185F64B601171879FDDE907F8C35F8F100B942FADC\ 0D9F4FD734B462866E42CFDDE56DE0539EF8F71F0AA72DCD8DAC6BB031B89C8F\ 0A88C051C5E4E28EA5E95A925A88611EFD7EBEBE524F60A9EA32A41FE3477709\ 1D401429EE7F185EE61DA6486CE491F09A97062BE1A357DF998775143C7D1FF3\ 3A1EA9041241495473661FDF3E908AC9F5811FF83EFD6E331FF17097109FC662\ 20B989428D078263FF696CA376663888819F3AC66F0BEBDC5EE5BD48C347C124\ FF427A47C80B92761A90664BABFAAC275A3069B13890B79E9513A935823FB608\ 23D6C76A9F88DCE6A7C1F11E3DA5068F454AA317FCF92C4BDFF500A2BEA63BB7\ D4939F4440AE335C1E165769C5D041B31873BECA28648D44DB6628FCC0705B5E\ 4CC838C1DC8022D9B890FCD54CBA42B372610E9CE351E5FDFBE46621768A30CF\ 70969FCB37C484B2595B5291FE7E8B597DE9986271AFCD2DEE3029DADD330FD5\ EB38D7BB5276423DEBF31DFE3BB97E36D09FC62823060A0D2636CAB111C7C9D2\ 7DE3D2436996F6CBCDADA9BF7AD9B4EFF7EED2459DAAEE42AF414BDB2C799500\ 3B2DF8474EA76BF08870317EB29AC6B46D19DFB471A8FD58EEFD58BD4436C30E\ 4A695A30B83E53854AB12D4F0CB6290385570484CD78128782C55783E73DEDD0\ EF8330690D2CCC67A6C3A5C0E5824A4C68ED1E9DE7C047C3A27D838677EC1CA6\ 4EA21D7F51BA404CDB61F09CE2F3CAE82E68BEF8EB0BFB6F51F1D711E68BC700\ 0C57170BCE6E6CB583CDD384B031552B471DA6E4AEDFC6E696EEA1D4E48CEAC0\ 8202D8C0626D957C1BA8D367C647C95BEC5C97448F0B0DED70E3DE200ECDBC2E\ 2BF76600E838C2D52DC2799C55ACD450C5C33089485F65219B57A09756792353\ A80184B1FEBF9F40E7C31150C35BC9ACC208693A30594CEB60FE53D4EF4852AE\ CEF9CD128A0DAC72A323396AE9DF8406223E554CDC0D3DD2EC641FB19094239D\ 186BBCBCDB685A5ECA4945C0FA7B2F0CF0D42ABA7F5983D5B765168197B0556A\ 235AC452CC42D59BB9F27D186E1640E447AA00E3005CF5FA24BC7CD4873CFB2A\ A4B47528F9813E1881FECB1C072288D8CFA45E2D0C52F17C49E7D73040ED49F0\ E71B427189A9A038D6F7039B7872A41E2C55E6A95834E9BECE5C70C18F89E270\ A2D24286EF6C027DEAC450A852804BCFBA92DFD52E7900F7F3E4A957AA4D5943\ 90CD47ED3072961B5D024AA9EFE854E692D64F3CC3123EA52F49A6F61D2316A5\ A17374EC9FF6F043076C07D597942D25BB0BA1BD71E971C42AA5CE9BB1751134\ 2A3EB35C6DCAF8DC36F762F8B1856E5E7BF492B8A6FA8F1D8AE461515462871B\ 255966F0F5BAA52E73CAAC894C2CB56320155D4E5DBCFA84A0FEE3082D92EBEA\ 98808406E736BE2EC8F41BBE90F07919682183DBB287D7004D2C2622C4FAFCAF\ A19A766DA033DA12E4BDF7855A08759C9FC6CA0F61B6CF96C492CA8CC168B3CB\ F7F587B53A7EF630B5374690000D9E7B84C3AE7832F4BBDC1943378F83007660\ DC83CB4F05E7A93BC6EA39EAF13CAB2E61C852A60A343247CDCBFD757B247539\ 9051924A93731400EB91791C5E2DA5D03F43A39CCA44F3124DEC80D433AFBACE\ 19660D0D32BEC383C1567549C112CA8055D3A1A7811A7F4F036AAE719762F98A\ 3BD8CF5FB2D9673BC163ECCCC72328F13B03CC3C249C7AFA4041C0DC76E9A809\ 4462CB41E9711A6F5E50E5D5473143F1E9AEE421D6FD88FAC95BCD75E46E25D2\ 588F7E3D7489DEE5E7AFE73AB038D4C845A92B1C0C399B698F8E532AAC023CD1\ 489B986BE46B7DA2A4B76AA76DF5F7FE1F66C282AB30ACEF5A7FD59B71AE64DF\ 858D0E0425089290913B3C4CC82DF6219DE24ABC8703ED475D8373402EF46526\ 416F2ED77AFC236C4F3EA0DAA5AD9AB949B024F340C6F1505B399FA703B6464C\ 0098FAB1A3DEDAB5BE68C2FD030DEF738CD027FAE6CD4B03A2354D20ACE3F69B\ EDBB90A5FFC390BFD90D53695CDC136B85FA6B9649CB4841C43D5C9F649E32C4\ 10419B5EADF4D26AC0D36006D3CF4677FDD2FBFAAE156F2DA1587FFE4CEA0392\ AE804420E2FFED43935135F441CE90B7077D8E0B0F77706AAC6A9E23DCFE15F5\ 635A0A1E1A315D8AE0489BA6DD88A1C8EB29BEC076F2E95627CD12FF4D6784FE\ F2DBA9F5BAC6F1895E5F15AE2E51A1D65B7835CCCA3B2AC7D4AFB05E00D21051\ 9F932D184340625647DE20BFB32329C238AC096CA68E159F90CEA319683F1C0D\ 9DE2380438BB4E6DCFD358AA655D0F78C9E93B23C0F1BF13C128587E65B23C7B\ 87350F1A5B8C37B5BB5971F4A160C9A7FC3E920F050353739B4C2523F1F628E8\ B4988047EC59E13F120CC557E14EF259CB15BEBE470008D1C0BAB2B6B50AA6FA\ 379488B3553979BE4841441F971299C46BCEB73BCFF4ABE0B2B003C7E5C110FD\ A68D63D264F95D5E9C194B4B869F420EB9B93531396512AFBB6FED334FDBFC97\ 2E9BA42F3E3D774A7C6F1685DC8805DA4E10A150D90E79828A600F242BC2B7FC\ 2EE22BE0EA362D687E6B2E4191C268EAB6189F58968CACA413F2E6D1A413E37A\ C4E93E8A7C3E13D992D09E7025D48E21F658F54B2354A1182F1203C21F05831B\ 7B83308DC2A8F6F2E3C97592B252E66CDF43529068D9DC78465F66CA6B29AAD0\ C3922947EA98CCE6630EB581FB75F421D59E36DE1F4BE9D7BEEA0C75218C574F\ B70E5927162DF36AA1DDAE51428092B8A733C8D65E884FA48B6A4A6F2D386883\ D3BE615EEC10B3488DE1D54908AFDBDA76CC54BC71A7131DA141ECFBBFAECA0C\ 193B83E8DE2ABCDA150629D8BD1706D16E4B2BBA4FB95A4DBD1B2E73071682B7\ B38142699C998631B31F53DE66B0C3AF8C799FE21E617F49EACCBAD64B76EAA4\ A21E7ECDCA1114B1C64C2B2A71B5BC764EC880E866AF3EC6E3801213341C998D\ 0F00B9AD7B7DEEF21C0033247DCE567FECF294B16DDDC3346725677442A6F6FE\ C62627521EFACD02E16123623ECDF970493B9C8B9E10156A9B2439F03096B170\ 93E5DAC3C9048EAF05CE92B8C2FB2B671AB886E5988288914B5A8DAB05909181\ A5F9142EC46D5FA71816CD944642D0568520EB87A4307FB4B608D4EAC1EBE88D\ D52F6549895F732CB75D495F5F2325D2B0FFFE0FB702045188BA98D603E546F0\ 9F44BB40804F4670BA22F9D188F986F00FC2BE3BC29E0D387985F564599DB2B0\ F9149BBA7225F00D6316455E2713E43E173A9418C5C4EAF5D3CF2CA4FDA77DE4\ 66ADAB5BF8A2FE395E9DCCDF040ACD903F13F1807817251B4844B12F7723627E\ 3B66211258BAC1F45B26AF3303D1BB55241BB4EE3EB9F00050AA44DE7A81AE55\ 01EC7ABF1A1692F3CE17267A1A83E6B870777C6249780B655008FF69C6EF3A32\ AACC1E4A8CD2CD50115EABE08E4A085AD93351DA04E5AC71C5FB74FAD7864324\ C070765C32ADF07071632767C5D0612B4B9407EBFC3141D6D8B202DFE164CB8F\ 7112E3AE5176AA55779441B1352CF4838395A65ED5261FCD8C596CBA3684A56D\ C2FD5E440CACB2033C945E65EB9EC0E475A7CB3E67C8D5F627F506F6CB1D5A1F\ 26F75A395056A1D8D70420B13F63834201AAEA6C11CC6E55BDE40A0ACC75255D\ 06C5921A85D621B1C32434AE8CDA7925BED56718BA59CEE88896139381809548\ A0AF81502DB88439A48999A3B40C6FA62EBFBBB1DCB03409C73CECC4509BC4F2\ D45E7382D4AB7F69386FBE6377876D0D30D5F4DCC6BA7330987B48C977241094\ 2B114D6F0D46AE5F3FDDA09618BCD78F0D9972DDD71DAC9801CDEB80676BBB32\ 315888E008DA9471855C2B299927FFA73EB7A4754A2F9A80500629959830BC31\ 41A6A3FCF3F529DAF588B0C415A6D237145BC3475724072D543D78F69E1F1530\ 86ADC5E28B420A3B1B81E139CE9B81F532FF557DC23BDE406373B10F5C03E230\ 8C9F51D5E0150D6128A1BF82FFE1069849CDF84FDE7E3DF994608C5E0B242088\ 9408D8DEF8DFACF31B539D3429470785FEA4E5480AA0C93B5C8225901F3177DB\ 948DE7352882A9915B8D2332A85F16A4D1CB55EEF211E3190FB718D1D302A171\ EB57C234A5B1E5A6A297E7AE4BC65752ECAA27412D2A6835BC69229E7593A23E\ B1224E97419BA6A17BD77F9FDBE30BE2BCCF0BEACE22576C0570DBE4FC885192\ C11998620066D8CD92DAFD200B3D483FB825523F490CA75971D066647A885543\ 6084B047C78D6581C1FBA6276B0A7729668B3B0D7D358FFB92332C57436F2F59\ 873A1CDD128AD11341B5F256251B61C90C365D5F0768F441562B3FCD9E27A713\ 06B7C940983560461889455560D32532DCF45E9DEE3E2B3C5514E249344B4DDF\ 105774935D5AAD836B04B5E979E61E3ED7909A8384CB0C866352E7A1C7068B73\ 68BEC60EAFB4A081E553F51B09C4CE8664964F64A4031CF8934382C0EBA040C0\ F0B2D3C1F5F3ABC3D30785E53F5F081248CC7A6A3664BAD836C1E6CCC91BA1B0\ 37B4F0F2C43AEAF9F749268D47E11F7188BC7264960AE26DB142C9801D084E0B\ 691648AE83E85AD51A0A17081F978A434C82F6572AE0AF94B4A04A5686FF61AD\ FDDF73E6FD22F6434F3FDA4F0B2A838DF375D3FF92C9192462E8CF44F43AF70F\ 154EFB12D84EBFE48264E55769E997D6F3D200E223DC104987B9786417F3296D\ 732FD45EC48033F00688F92C7B5CDCE46E4BC8064F499F9B06EFF82B70D6ECD8\ C5A1EB5FFE1D6C605A54DC621D6544322911E827CE798CB0A8CE73C82F863F97\ 934CABBE2CBBB2D2A2A6EBD553E8A09D8B49D87F79F29E3161DFB3EF37D5D0D9\ A93F7C13C2A75CEDB3E61121E85273545E85942EE1C6BCC698515CB8E88E76AD\ 57BBF0FC85B10F10883AC4682A86D29CDD56E5A63751D47F06673F7891CAC946\ 0B4AA9547DFAD60374AF982423D332BE9D7EF16759FB095A698B0DA5D7B51278\ 61A8B39911F717A212C17A9368D2C1E57CDA3032C61C56B84529677905B3E351\ D71D06D46B8D69CFF8E10D175E084ABD4B36A0A3BA424F6641E917CA1B64A2FF\ 62C6AD6DDE35A51556FDCCCF5428892E8FA6DD45626AAA1551EC7D7E8A89CC86\ 3E5AFD53A0D01ECAFB2A6268B7E0370C376F7A724B1023FFD184D900AA2C909C\ E156458C7F2504E32FE615A90DDF360C7F0B7708399AEA3BF3549A401BEE0CA1\ FC0D22F1871967DFEB0B740FB93151B7EDD2D807DEFDE734BD1C22A19E1D0A01\ 01071A8DE3FF8007068E2E5CC43EB334055E292F88EA02D52B9771ABD3577B22\ E7236AA3B511C5E914AEFAE9C5B015F8AD013C109849CB5150298FD56E9CCB1D\ B84CE6A34219303322FBF38F9735414DFFE395ABFB19F1798894EDBD1FF77530\ 741933847484965C3E25509BD31E6E6DC247E9B17AF7EE350B00816DC1DD0EA4\ 4792C6EE83541153208E0104BE27F055335718B2BA1AAFAD3EC4D62B952ABEEA\ D95B857EFA8F26AEA3E9FCB087A80D7DDF3BF29D63BEBF3A248A8D86A4C208BB\ 7A3EE0836869074438C418254BDFC5A2A04C5FB21606B21AF22BC2631A46BD55\ 5BE9803EF4330B9F6C8C7C93478819EE8D2A0C5651C0C5AFCE5F20EDF72DBE83\ 15E0BC8BDE40F09C80E760A804DB197977217F10BDABB3A14A23B30DBF3CDB2B\ BE9DDB141A9B115D16CE0CEED99E120514BCBD0DDD934379B9C48016A0101512\ 84377FB6B8E08A703CA401CE018F61D6D516C83F95499943EA2C818E315769C2\ A45172DD344ED15DA05D8AB1C32E4F2E7DE3ED5BD46E956878F266E27CBD65FD\ 775B13FBE330B01C31AC5C27C8DD30F0240F5B9C024A6984FB7131C8CA04A608\ 7091292D53AF14ADE0F2190E0F427029D0F27765BBD746DE5E2A9B8933DD0CC3\ B1CD1126551378372AB4C16AC49ECCBB107F71D7DD4175ABB0DC477E1B4FCCC4\ 2F868D7D8D737BEC4B5CE078017352D36A45CBE6E9CB676ECB84F5703445D429\ 70D99F5744A008E21A6EB7A7A699C2435FC669DA5A8DE38BA98E6611DD8DE454\ 82273C7DF9702BB10D345B826518F38789E66C62E0465D3874209350890EBBC5\ A3F8F132341CD58E7CC9E43B22C579BD938792C8B158ADA14D94F8179DC180CB\ B0280A6101D7BF2D17C0557F920307155E8DF1D95AE124FF9B91F9F2B9D4CE3D\ 131D6DA313EDE0F09ACC122CAD8A296B5F806BFC2CBE5D8E526F020BC5BF5D5E\ D4728F818210F5E2A570B534DC39890CCD1FC48AB7AF86888E9453F3607401CE\ B4C22E3F960E7A8A5C80EBA5DD3717FC1224D190D4351E4944B4C23A949614D8\ 84D2AE59D989FD53302C83D66B26088C37EDC61207234F9B8EABEF6BF457BD61\ EF4B77D198B7A56B00FA723B4CFBB6E2CB116DAB87DE542FACC26A8A9F2B841B\ 2F26B1C0B6D22172CD5C1AC70E5C5C1288BE1BB0EFC9F2EF68E0F88B8A6DD467\ F8C21FD4AA5C467C5D2ADBE9A72BB6F44262BBF4D23525D0D2527A06D740BC2B\ D45A3B8CB96CD66307242351D6B6A7C1B6E67C7A84E2FBF61AAB52E5701F51C4\ 480093AEB29168AF847B48254CF04D1418C77AE1680BC564C5DF597308AFFB21\ 1B3CAB194D8AD0427AF89E0B55F65C2827CA704BE1B854A819FF87E4A6DF735D\ 107422890DA141915D1687B56D2F1C5F007684331C7C17890E887390822AED10\ 377F271A36855DD8687D9F476F3B1642F1388F121814C474778291202B97333C\ 1AC5D6E1818FAD8AA2B9446840CC0D29EEDF118D53A15763ECCD692A0A92611B\ CC49F3A50C03A4E7C39BF3C545D9B2C2A08D3CFECBFEEC8D846D325396CE3027\ 5629AA3914B7CDDB05959A5EDB2DC952B28ADEB6B16197DC22D0F6BEB17126A1\ E2E0C66BE205E37E4AD7FEA34DCD7B406A87A155216009AC43AE89CB0C036433\ D736F5D9F2FE2FA091C28781602A59EDF96127C31265144B20360BD64DBDE811\ 6E84A9E41F8259D9A6CB4E3368A646413FC23D76F55B4083F4420C1157A1D9B5\ EFC27BDF72B1FCB6617BF40CD8FFD2FCD645284321390BBB6707CE8442ED8116\ 3CA30A924CC9B5BD8BADB02CD15847F1893A7E94F82C06C19BBEC9E46B769DC8\ 53A2B9EDB14BCE4BDE8C6EA26A9510B6A8ACC62DCD55DCCC73DD962BAB314CDC\ 65F9AE4BAA7FB4563CD38CFC6A6AA7A60E6D9C9FAAFADC55A8A207E9C2ECF21C\ 343ED29113DA4E6E2EBAD2ACB1DBDA9652EBF1D20E8FA79533670DE60CFE73BC\ F469A8D89B5D6B2DCA831CEAB441F5540B4C4EDCEFD246478BD068FFDEB22F69\ 2DE4D814CEB4C105CA55AB82398D21CF7C2F992161B7D961F2FF91DE1C0ECA85\ 4036660BBB67071690C8E2DE999C809190D8DB16CCBDD971F4A0068F98129EDD\ 0453ED31BC5724BEC70FC5CC79373CF6FA5D87562456538735D50674863F219C\ E5B3E61B1ED02564644DAE69BC0CEFD6302464042ED1CB8B741863FE00911729\ A0FBDEEDDD00FCAD9A80C88077750ADFFDBD921E2DB19070A41444FFEC61DC8B\ 3D0221D336A5ED40A9C7BC7461AB8121CD4E9BEFB4755EEE92B8B3EDB2751D05\ 028E5279233A44E0D4A205BA1F864FD5A0115272B4B2C7AA8E8D3D202390DCE8\ 5A47DF27909DB1CB7BDC29DF6FEEDECCC6814068F0C87513AB975977C7563E41\ F7E0FA1864F9CC9B5778F23A11B7D67D15E7D1711F2A6CFA4AA7DB1996B73259\ F791BB8FA73C99CA04BD837C8E7235624E6AF48EA30391B32B55EC08DF2F25B5\ 4BF663871D439C57A9400E6973B723CEAC8D55E01BE30841061CDE175DDEF36A\ E57DFD000B38155349703E2C9D10549890B7846C61ED62A6193AD3DE03A3F242\ 75DE3FEDFAF9C384B601F0C1213F46A90BE8E3B97EA11C31880C9F905221064E\ 6A7C297E300FFFBDFC0FC6A1C05ABB0D56F9918501E3EBBE84F986CFF4E94FBC\ 1E71B98B315026E4EAB1C22634EE50BEFE7426FF41ECD53152344EA558FA9E9E\ CF80FF1C01335021C06BC46ADB15707A025CAC95D564016EEB1D192D93B94900\ CB346169BB1A18F91D88266D312A4BF5F050801C60FC681E3ACF1B1364422E07\ 08120AF483A664D067273293687B3E321508D59BC60B78D0C9B46D3E4E5751ED\ 038C228899BB3CC32239E5AA653012C656423222F2D04C213A5DC78005B739FA\ F522B17AED99542BD9B6543E4E9EC1A536667B484B412802F17704B99DC3246E\ F9180A0FFA1C269F0BAFAF79B1BE323F3F2D045A979A46A6B45EC9609C8BF2DA\ 5BD40A2454D80DA1CFF9FA75965FFACEA20CB0F8ADC881EC8360F82BB297A657\ 0BE1F8FAF0F10AE84645591974F7C246338A45443AC2B9DD7B8151A6351A001F\ 520E4C6EEC800283609F16DA88396852BBD27C4FEA4EA0C2FAC4FB6B3A8E993F\ 6E91DD06D461828F687FBB061A57E118D5B6D8EE5CFC6D453D48DBAA7CDE2C4B\ 9CC226416A0B1D3B1BC6C1F429C481C187E0F6D022ED4110A7916D891E98600E\ A01263FBFDE28265F924F1E95F7B68C95DB4DA20EE37171BBB05637A883637D5\ 36ECDD9D7B6D36C15E255C1C024CB26BF5092A631A29B78454FDA73029266284\ 9E7B83F71D419B099E31A2420699F4F37378AC5C1985194C44A6F38A2F0D2CDF:\ FDCD25C05C5D2EEC19F325924BF2F7AB:\ D3BFFE7D9A480362532B542007577EC6 [AES-192/CTR-BE] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ 1ABC932417521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E94\ 1E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050:\ 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:\ F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF [AES-256/CTR-BE] 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ 601EC313775789A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C5\ 2B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6:\ 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:\ F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF [AES-128/EAX] :32E55CE0C3FAEA48164B122C1BE22D85:\ C61A0851AB4E515D11525B92E2B9D850:C825FC7C4D539DC74887CECC70884F37 60:710DABD24D400F3B6B284EA47F81EBBD26:\ F956B879EC7F807F1FCB482B53623671:E64F90B4619D93137E6237929EABF297 A62B:C91C09BDD89CFC81AA4427FE8CD841B5BCAC:\ 8A554F339FC29E76EAC079676463722F:86B95FEDD6827A6EF8B17E6C4B2498D5 E67238:B0DC7388ADF2785A4B898443655C356695BACE:\ A3EADDED8E4A7476DC783312CC70F878:8559F44BACCAE49D39DB6A77C1DCB065 29D564D8:A11BF86AB2881AFBAAD85D2B8313203262BB0ADB:\ C1F38AD3298EA3DE3204BEC244866534:43D1D9EF0769CE901A7F0943556D1B16 37863FC2F1:89296DEB6C1C3CEFD643926F474568D71C4D52305C:\ E9C35F70B9D294E9D78D904AEC528E99:EE28B45B0F136E06B7CD3D3D0D002EF6 9678A48724FF:2013CC564BF1077B300341089DCC23F4B20CA9B1B24F:\ 84298DDF4FAB1B8C2608453F0FEB0BAD:3035DB091BE6C0C3E3563B87DD5F8761 C6D04D01D2F78F:67BF2D417058C7A26F446E13BA65171CA34AFEC3F842B1:\ C3D1651AB7A5DDB1E815FA3B91A2EF14:C49440F324F5F31DBBC46ABC96624B5A 26C63A9C769DB4E7:7A1BC9EEC765B7525AF601B682DF05B681818F6637A64EAA:\ A342F5559FB3E861BBB3DAD8CBC14964:489EB99930FF1057C54AF33CE7A7238A A6C0CD7D8555AC3C49:1A75242A16FE656C43CE8F737F60FA78F95AD18BDCDD2B0E9C:\ D88CD2104394ECBE9AAA9F101B578DC6:0CB244FA0D43A0CD101D5266C98EAFA1 4215211D6CEC517F8925:FB8E6E2DFB3C7FD71DA2CE7041FA36E4357D81471DFB8754FBED:\ 773704610639CFEFA6E1B30F589D7F14:92BCF960D83B76F958E2E5AA616ECFD9 EC23DAB61590F6E1FB49F4:80F5426BE96A6F7076BFB5A24F080D1FCD687FB4CE1E911A532DAE:\ 33C0B5F4D5355A351E0C3D835E468705:D481CAAE6DED8823021919E31463D848 168A348A554CC29EC53D4AB0:\ 65397D2E8EA7E82E954EB36E0E3495781189FF5D2567EC7D3CA57225:\ D7DF4487FAA7AA9FD485E16F25AA27EE:266C313CF766C74CB289EA78C735289E CF635CE20D305584C11537C1E7:\ 023D683A14128FD01704F6A97ABE231B77C30D1209EA139EC60F0FAC6E:\ 5DE8E05E68E4C3E8DDAFB5A2E0A6A92F:400DFEA369E0B09935355A4B6C1B32CA 82287737559AC1EF31FDD382D4F2:\ D0B1B5C3C2339BAB6C4FE1E899613C70460E825515A4C12259D9ACAFAD0C:\ 19B889E617FADA6EBB6E264FFD6AF0D1:1B72FA92A94F2C6B3F5D6812DF3D04F9 09C05A1D6AB2961AFB06BD429012AB:\ 14FC9EA106FC2B59595D02C746B59819D3A914D532402389CC4FD9D0573926:\ 2B488ECF950B2A8716FED085EA768A22:7F4A7C9CB42F32CE2A388B6DC99D18F4 2168CAC31CCF37DD4BFEDD800FE4C532:\ 4F5777260F776D716DDF5BD445BF330E55B840842EEE4838D7057EC3E95F59E4:\ B5A870393560724B10918A377F7C28A0:E5F26301C19BDE0C99BC8DA8A052DA56 A1A540CED8942569B2F5FA365942442CCF:\ DB409FE74B6CB54A7FCB00ECC6926D3CF8599767451E634D425C9C7C253CBD8DEA:\ 485BAFDED6CFE581B4BDEC8ECE072F74:48FE4CDC23B58E19B0C472F2099EC251 81E320373A0E35360990AB4070678E6CE72F:\ 97659AC60D8B8EE21B98F954E9C56B72C088AE5F4CA39721797D1C053E8D69E21C4F:\ 38704FDF0CF20334F749860D1F07F13F:3E2B4E746157040C97757425E15B5419 97D8CF240D88F651EEAFBF162BF082CF9B96AD:\ 0EAC8A7289E6B9E5C345BCBFC5A3084D0AE6CF14C9D6B0760A1DFFF31F71AB6C3CC88C:\ 93C41CA3886983F5C6F8FDF18FD5C0B3:E248A9343658F34C84E3CF537F650012 AC817C3EC75DBDBCDF03D6FB4ACF9A40340D8F9E:\ E26112BE7A99FECC557C3D53674E6E670F824FE7784EFCCFA40BC88D4F88B5A29902171D:\ 3779FE6CCC7B03D2F7FDE0A37E5DE146:BA9F029AA2D995ECA82F2DDC3CBC7A73 8F7DB0EE7F6D12F29637694950206B5CE9424EED07:\ 70EA3A6F5DFA46723E4ED47BA1EE5E784DA0971146F0B532D28630453AC7CA713F1BE92923:\ 05E2FE7CE92A97444451D3C101C1406E:D333040B9C4D5BBCB8B7A6FA0593020A 4EDEF8A9C660D2BECBA2B49CE509EBB6E567A47FA367:\ FB18B846F801571026BD501FFFE67E8D51D6AE9B8379A8676F65E2C7EE0D02E9FF9BBB23482C:\ 30B6CF4FA2DDAE8CD2FC6ACAA5302B77:EEF619A392FEAC7DB491E4591088C041 814C87C4E33C797A93A77DB1F045996667A1C10D78123A:\ F5526447A82E275E9CAC44EDB940171F9123C3FDA7F55D\ 8586CB574A00AFC12381F40964D096CD:\ 6EF35F1EDB02E4C384314A481487C28E:1A690BCB595164BFB80580C57D93FFEC 7FD5E1A1547E1628F736DC7CFEFA9A00E586E02AA98FA394:\ 2EF4299CF27B80976CE57AE89DD2FE554EB7F00D38345C60\ DB67CB9C88E078D581FB5A9F66D30688:\ D89BD6AD540771D3DD537431D18A59C8:C13544BF30DEC01564A03F0E2FE2A208 B234C341F0D5552F75A1C0C917B642B0F8E08C297B92BD31EA:\ 26B7CA59E71E9B7F866C2F04A0A3829E879E59E9232073E320\ 1C3BFAE519F23654B17F07EDC8A20344:\ 960065D92C1A8B61DDCC51B2218127C2:41F0DAF7338AEF1317188EA9D6BF946C F67477FC490F530BC502AF52FD9D1BA4C49176EBE194B37249CB:\ 36B043B8C7B08E5B16A73F60C09EF517C14373919C028FE3B430\ FB61CCCDE8CC4B3266FA1AAA00B25D19:\ F982385DE22ED1592B1B697E262E81D5:807E739C22372D98220E2CD58175A07A 488E90C2F8642F621A615B362F67EB21BCD4963151D4B255F2325B:\ 39157652A4D31EF499708E065889FD3FAF9BB5C1D8CE98CAA4F629\ 05D7070962979F403E1514CCE6BA8FB2:\ FFE4B7162C45A6EE3E0B1DA0257FFB5C:AE6247CF1E1B65506D3A02C22C341E2B 638B8AF02A05F6E3A8535AD5B7AF2C5FB83EDFAC7F8DF0820C895131:\ ACBA840ABC4086D65C676AD70F19532035DD4A724454518391BAF2CD\ 1330BF920BCD19D470C5578D5004F9D1:\ 739B15D6279FC651A4BC344C108E21C7:3D4E26F58C06A10C93928E9F1BE0D08E 9ED609612B72B5E2F04E6D377F436DCFE45B5163486EEB94A31487E1CC:\ A0C71029D7DC4FDA90B823AB12085ECE8592CD27B61743D5C6AF02663D\ CB3CB27958E4819DE2BEF9893EC06B7F:\ D3396BA942CCD4B481B6A5CF23DC4E67:491D4BA46EAEECDC998080AE07617ADA 20EC7BE8711CB24261B375FD713002517B6ADF41D8EF3BA8EA3ED7B84C0B:\ 8F969FA4F9FBF293A6FDD11906DC4296EFB87EAD619CE701CBF60487F2\ C66BA6C281D2A8598E3AB405D1C5D0D725:\ 586DF8D45569F007AB52BB204F2C5051:7DCBBB5D0C934C483C378613EFD31F47 BDE3424FB4BF46067A5B09F76BE6F91203ABA18B3BB8C595C9071FE36AF048:\ D9F1D76E17891B94CACADD217C9D37F58EDC782CC5FB539F59F965A5C4\ 43F3965DB7E399467CEB05FB59AB1AD01804:\ 28D38A778749BE8DC41996BB847DB497:805F380C9AF0D12FB9D94F9C433FE56B 836569924C3AC998F64F43C5292C899A8A498CDDA350A1AA9F329E0EA5CB4A28:\ 869B404A038ECF556D4251C871EDA3F157983BA4D40974921D44D58AF9\ 51F007A5119534C399DA8593FBEABE60BD074F:\ 30B4BA7DEE8315E5D258AAFC8533960F:7C23EC1F738DC912BF682164336B8D63 6C89219F127DC76D45896C6A3B527890B5BD95473ED55D8026ADC6546A26B2D6B0:\ 392E84D3857017287A0A62701D45C2FB9A9949A1292A9C159443297A562CB89A36\ 4F85F422EAA7BF0C046D60B5F02B675A:\ D375C2513D2F96C69B0101ED7991A336:26EA74FC47F422F5BA765FE1283591FC 3997AA01FBF84919CD76B0DF279077ACC79D495042B89F4E3FAD42AAC9F6C9028D73:\ 6621F16BA0DAA99B85C34080B73A09B81A64DBC6EB9E237FDC3C773D41BBD2514CAD\ E62633D626881F8685331B5A0A656711:\ 04886B4DA138C35117EAE18F96A82CDF:F96E9898BCD745FE810EF44A1181BD15 50B5DA3F355434BE51D36199C8834F4193CAAAED89103664ED20A9A4F481F244\ 36CC836B20B829728B8A0B530E5A94A1243E8EAD4FC4123CE4BBE0D83CD21C72\ 9EA0DDBE580630E3913B379F95CB40BA0ACE67599279957735754F71476CE4E5\ 0CC1A364C8D447590F7EF8A54A385F:\ B08CEE141F8B1822F2C1EE4E0651F8CDBCFC095768EAF76A5EF2F7F012DAA30E\ F7176B74264A92FBDD0E4E9CB475DBA651E1B51992716F059005C3F75022DC92\ 093ADE8A275A796D387C13C11328F1F0031A36757CF5986002F27E537367A290\ 365C026D58CA21413390E58B312F264D25E87B6CD94D13E048B694A19F8416:\ 5406C6AD9840420F75B75FE6FECBCAE3:D78C863B545A82AD6A01A50F4BDD6E9F AF47A39628206AA2A9A4CC539AEF077B31DC9AE5437D4021F279441333ECE8E2\ 338B785BABE2FE5587CAA821B9AF9DEA8C37CFCFB40FF0A6:\ 5E967714597273C7A8AA4F69314D2A1F75054F1110847DD421674F07FEA712BB\ B67BB45DFF9EE7264354D750D73E3C6A773DC7AFC2B88737CE4C215EC87FD4AB\ 064707DD9B624436:\ 8935B9BC21A19E542C16B0D8F8AE2D7F:78D5A132853E1C1175ECE02AFBD1D084 2ED861F5F11D7D517C138AA01F61D0A007D000DB97CF5B2FD6AFE5E18558F4B3\ 3155A922722673EE3AFE8E595F5FFA672FFA42C6CA9DF6A04C:\ 147FDA2A8847B0265EF27976DF944F11BD0272021BB0269B787B6C8BE6782B21\ 4DF59BD16F569142460EE80B9B6F38C980F81098D5A4C018EF6A5CD84E4DBF93\ 1E623D74D3DDD8737B:\ DB82D133768464CB2D873E54FA2C8EF8:BBE7581AE1BF49DC010FA69E0546EAE0 AFE2204DAC92FEF378DDB89A917B5A2AC94C22AD19E1EFD71EB97E4A87791037\ 5C308408C283FC3B60B4D5F12F2F1BF87B3DA6941F956B3D4FE9:\ 7AB5CAEC2D40209B3E4302BEA036D8536DC8D7E9D8FD23607421D122914B4E13\ E1658B9924916C3D0C6B39F4B0822A98A7A7789A4E59CDDD350BFE3E3193EBAC\ 56303350B1D061910A9B:\ 87D663970DBFC792C78915C3C4757899:66A7C881A043BE46D7DDDB421A2A2CA1 638BC9B9EB565BFD0BFFC256464CD23F0035CC25E5FF8DA305A60C8E3C4D9F9F\ D86959C3BFB4C0CAB48320FACFF239CF:\ 22EC2594915889C9910FF444008035D42E90F31624F6D6790B1399FCED092BCB\ A4C68CB9F648D816A9391D8A292E4AFE20096D856F36A23D9F18D732E1645BDC:\ 2805F50D0582B00A28BD99650A3804E2:A15DA66012662AC6E94BC0B93DFA8865 E6CB34ACA3A0D94429AFEA82BAB4FD9541A2ADCF5D053029FD70C7BE4D088233\ D4B6DF7757B9BB8068A502225AFFB89BA2:\ 824E5010A54C9DD6E08E0DB38A1B1DE2DD2197A00D094A0AD1F49A8D9ED6A01F\ D1DEDC021D595FC87B54CC74665FE75A2D873241D81F1163E6EBB948DE7A18438E:\ 656AFF6B9A28680BEF2658F7A88BCB5F:6A43B623FE368BA438AEFE376699D9CB 273DD7B96BB7A1CC9552E0EFAC43E5E58707BDF5D3CA309F7B313132F838E91F\ 75C0D8E17779AD0CCC8DFB78D1E15D58E81A4EBBE47E5B60AF8C92A8C47BC739\ 3BA01AB219C7BEE555BA5E269BBB7E83D6CC3FBA4B9A1AFA26ACA2EA276A2362\ 0A3E142305D3095A8D67802822FFABF8CBEAB31684CD11AA7AB394A11DB80427\ F6184BFBEB545678BBD6A0DDD54CD6A13689B7BB56C865D07CFA7299B276C1A8\ 8E0CA37A60F9F21BD093F8A5DFCE461557FED0AEC6367E4230F0DCE2669D8AF5\ A92D6F09276124F7F41C9CD3EBE3E942E1B9F0A7EF6FEA1F5FC601C6638BBB0C\ B92A15E08B39D78055735340563C8337F673DFE5:\ 4A0F85EDD82B4E39F9185ED4E585187B51D3326DBA5FCB83CB3ACD36327109F8\ CCE17CF5CD152DB941E3480AA22AFDC51562246CD99DE0423F6E9505349D547B\ C39343B06025EF76F4C6C301FE1917F391433BC8A7F67A007BB7E8A238D59F5A\ 29C6B5519165B2E05E3D04493F5342E9E917C65088EF56E7C0A0A0703E3AB949\ F86D3ACDFF9EE70815CBBFB1ADBED7F2A2C565DECA76D99FA3941719236D7B57\ 2248D8A4B2FE8DEA33C7E909C132E3D107A625FCB2E088201F3AD33A37FB4411\ 4316FD7FF1B161777FEA4391E51D102D1884671B0AB994B8BDFA91AEE09105FB\ 6BFE881FC4A67B8CEFE2E7E4DBAF844E896DFD1C4164243CB888765C58C19611\ 17A6F062:\ E2C905428F0608F292C3FE4BED132B78:4C02F8A1754CE2CC8865037ED8E264BB 956B7E15A1BF4DC6A9CE6DE460513D43F45191E0D1997ECA88327B01487291DD\ DE10F27FCF3F45780EB35C6E0499B1F9EA43D9BBDC5785648A0066D273F7B051\ 07A2D0D6E2154EF0C8AA5ECD430FC62E529FE92EF76F93816FF953E2F00333F8\ A603CE88191D78E1C7D6AE0BE57439381422660B91F98C01F2DFE3E3E317DB89\ 1AA91133C689158E5FC3994438D27C4CF4E35786DCE387CFC26AB2A5818D2E9C\ 363FCFFDC8E48B27A8246CE0F6E82CEACB8370A866F777286229CEE3B6FC7FEC\ 3C4FE90433742CDB9898BB8E80E7794C6AE9F4D0E16BF94394C7264AC3A636FF\ F52004289430042DC8BFBB48A73494111E88E2FFF3DB42:\ 308B1A08871C3FF57397A79639FD87A99EC36711A83FD2B3250247FD3125C7FC\ 1681F6AD15B0230ADB4ACB9B3C735C287A2C530532BA1BF62DCC369D110B31C2\ DB627A75B5419B5177956E64FFCAD6C83A391B0C2023F11FB13066E6D49BFFE2\ FF12EE0FC05706C001401204FE70C739F0836F0175DD77AA37BC308737F7FD33\ 96FF25C6D5E6BBC9487D79D4C3F69817940A9EFC4FDB3FF3BA85BD36B4F57888\ 18B29530D3F0BE533FBFB9F175DAFBC920D5B5EEB62BA02F339A7501404E52BC\ 9DE4BBF27702189731CBBB49BE2FBAFA43F3A79BF2DE147AF3C12CCBF2FC15CF\ A135F5EB4603A9C8158B78E600658C102EE637F77471E0F621F2EF8BDE7BB113\ 1164DBFACB1C23:\ 87A268D1650E08650328692CBC9930E9:61EFA5A996D93EA8F7C68AF6BA653841 169C8E816CAB0C159AEBF19C954B87089D29C5386B761D27A028DBBC2518F33B\ B481BC202DC836C7B327634872EB500F1415477F8B64A72B8D82E8B29BDBED4F\ 5CAA708972A65026CDB46E3F9FBF4FB3D4963360FBDA8B885C733AF74E2747AB\ D1B734445D856A2A39D869D897B88B6C4FBECC4A9857D2F5CB0CEC193333C405\ EAF949477EB371B78BDB8F23931A8FE2D95B2C71B2FE667D0A53973E865B4371\ 548CB8D23F2A89CA0518ED98337C7B0CD7A77D8AA6E407B0379EEEBDFA312E4E\ BDE721FC11AAC716C3B4AEF631290208D17F9277639A279A3816583247868105\ 6DA2017E4CC8940F7D4305AE6C07B63D8749B4EAE3:\ 93550CACF92B81F03129D4DA45D0B6A217202517FF34CACFF291D9FA51793F06\ D020E63F9E54042D0E1180E131C805D3C392603316D8B990006379C54F51506F\ 8238D4EBF4F78AE95753D852AB7F0D974A16F374E20424B4E79EF83D3BF78A83\ DE23F50078CCEEB7C8CFD887AA6EF3ED004C4F1048A608C0EDFB8FE56862E533\ FB0BC90BB19175BA99CD747050F6DCBB229C3B11F89054B9A78A80FAECFF6821\ 1F1BDE2EEFFB2D690602478184E5C51B902C246DE285E15FEBD6AC0B7ECADFA9\ 153F982434397AD0FB4DBE4DD5A1803234F00B0894C8019741F89665D3D51587\ 792F5BD7142C739221A1C2D4A2C86BB8782F1CF7912C32C8D3A10BECB4C7AAF0\ 1DF64C2F90:\ DC851BF2DD4E3963CF3ED171404FBD08:E4CD8527D23393DAEAD16133854B1661 E4BF7D594228D3CB4D7E9EC6397DB3325B61D7C1437D0634C62FC33D9B932B7F\ 52A8D894D0AB601E29FEE4637B9795D7F96D983CEA9E70B0CD33EE68C619E718\ C1C0AD916B0DAF950B93F8872B8D5E24FAF660E494D095610483CACA9CB1E35D\ 7190EEDD9D9E72A8316A2F5CF78D80F283E0D617B16B79B5EE437F8AF462E766\ F2D6438F74B538A51F670216F582087863DF90144A09C9394C48C340ABABA69D\ 81E92DF59E659ABDCC9CD4C11FDC3A82BBCA9606D35F3F1FA7025F52AD06F02E\ EF1D238E82BE4B4E5A1F1079FC4AFBB71491BDE7F0FC0698FF65EAAC6BDADB5B\ F7FEE979BC34C81754D89050228C07361DC51D0EC123A6C088906DF46B484F62\ 4638DC036CA41AC07CAA109E3618D454DDF1629E14085F9C98CC900314DF665A\ 17425D84E6774462225500586DD4AC4AC50EE8D9164775AF1306B227E51882FD\ 5ADF814057C5A2791AA2D187767ED13B8CBA14A3018A521590043C751DBE7277\ 9EF3B8F5B95A6ED3FD3F5B73BD2CAF4AE6C3EDE84D3FFDDD43395360F8C5D896\ B9908B72EAF945E738A05BF6CD0A40B3CD2D9B1B6C98F8AFD24B10CA11E860CA\ 78EB3C62E4814A1C22A512EFAF52A27C7F3E97EBD6909BA8DBAB72EC93D2B60B\ BDF26DA174B7BE965CD0850B232788A2651F8E3CAF29E48BD4577767292E72E7\ 20DF889497462AF317AFFF3AD787DC3CA66A7856935DE167B458CEDD8640C4A7\ 204D3BB79366AAAA15A9E4EC30C129D72BA12DBFFE0E26B266F590ED35549455\ A1CF0C3535B7DF4B60C43791856068B002956F00A396B3098B43F6C0978A1639\ 5A226E8FD94DDA3A1112CB9672334774C8B6756B4C2874D76B6B9802F5AE3B4F\ D0A9DFAAF7B9E408CBAF9F3EE2E6B2AA9C2715E94F89C0BAF458BDEA06F839D7\ A2188199D265A19D1440DBF6268EA0C3B5B5AC053E6CBF33C57C1DCB7556A217\ 6F23B0418851DE9C92BA92B848327BFDE727022694C259593E7624B3CCC7CA3B\ EA7A7C73CC5B0F5E15A2165DD4925ABCB95DE24D1F3BA65DB1CB117D92DBB97C\ 5635EF2290FF80A5A1960275285D31E2BA132FD94ED636FFA1477D332336AF79\ 6B9F9BFC9E1BA13FB1A4B4DA01E6BCBBF9EB9448C1CA476212C49535FA45AE66\ E44962826403C115A775EFA85BAB635597F79D58C2E4BBD4A95009A395B70979\ 006BFB646FBC79163269BF8D1422E2AB1A7F04DC64BFB00D0FB9B0A570BA1E70:\ C437723C80E3B32AEEBD6DDE08D614312CD3176E8BFA8650EAF3A34DAE3B7276\ 9F823BC48F88F42AFCBBBDDA0534E8D2C9BAB65A83939668C982A1CBC1B826B2\ 59D83FD6505381BA99B1C850D5EFB5D0DBB077F4AB021246366292971BE121C2\ 65BCAB722A6AB5B7CB7D55C91F9FD5B3BD59A8436250F17D110B5B2588F2DACC\ 98EE60884436810570A61AF2D7A424D4D597004D175B650F9EDE8D2544974909\ 05E5AFFD31DBC4FAE7EEF180B07B7D9D2579C1A140F63F31B0A2847043FE6F98\ 556A3F90DE4C28F858581F699ED3B6E3E554DD0FE91954FC067BABC6AC62E314\ 57B299B9CF5E061A9B6ED628DFBDC164AFB6560847389EE0257A7CDE811292BC\ 761E4D66D2CDEDD2C6DE0333CF8ED6682185AD5B6B1B05526338C6EF72D02A03\ 46C4527CCB3B1E3484B83FC7AFC7BFA69B111980FDC53C70BE72F3BA7F8B51A3\ 63CD590A988AEECA67265C9BB813142F34D0B2FD20B06F39C4DE7A00D763E2B2\ 01D90A8FFCD199EDE60EFFFC0CABB648C1D7F15323F0E9BC13EABD1EBE99BCBF\ 970D0AF2501826E37D222EF4D9AFAB22EE99972F2A97C84175AAA49ED2CEAF34\ 0213E29C7A88AF38F2CAD42C2AF49937262F3281B806E343AF3ED0C7535725A5\ AD0CACBEDF519F69CF820980169FD6DB67A165F3883216E227B07E3FACB1E279\ 54FD1D08A2EC6472B0B1F7B0D6AFA2C616F6207E7A2C4444C6F952268BF73EDB\ EB4657AF472D08BAEAFB237F118EED6CACD80E24ABEAED97D1634367000778C0\ E095994798006D874999E542F5F479E08AD481D211A7A4D51D58CFDC374414F6\ 810A5AE08573A34D914BE3176CE7C3699D83A06FB9D8585A03854CC38B8CFDF5\ CDD7C888790A04D2E7F2D22099A9120CE0C37390B9AD918AD0B41C4239D2BBBA\ B82B98E59920B173BCCDE0D48FF860F91216C4A7E68E05DAF7F53EB7641171D1\ 83C976C6B9CF1F57B2E48F88BD5E8F5558934245CBFBEE365A2D457B2EA5E6CD\ 0F39AAA154692EB604B2A366B53C5893C04568BA98B4A0AFA8B6DB80C6D66E9C\ 93DFFB1BE584ED1CC111D315823F25D6BFF9367EA584A3A0FC62788D7D385D08\ 14E984E6EE556F83D01584C8DE0656DC2A89A08BBD268F0644C63B80A5BE57DE\ F71566B677596557D4C218DEC8A7D2611FE6FA07633C558FF372308F5D680C0F\ 9858362C2B2B8C2989F19FD8411C10B6E37A647A07D0B1D5E681E25902C36231\ E9E5E812B623D9E72C23518F082EA48C:\ 251AD494D64DAB08B66A96CB8C7876A6:F87A825C39326949EB19EE5BD30CCBF9 [AES-128/EAX(64)] :32E55CE0C3FAEA48:\ C61A0851AB4E515D11525B92E2B9D850:C825FC7C4D539DC74887CECC70884F37 60:710DABD24D400F3B6B:\ F956B879EC7F807F1FCB482B53623671:E64F90B4619D93137E6237929EABF297 [AES-128/XTS] # Vectors are from IEEE P1619 D11 0000000000000000000000000000000000000000000000000000000000000000:\ 917CF69EBD68B2EC9B9FE9A3EADDA692CD43D2F59598ED858C02C2652FBF922E:\ 0000000000000000000000000000000000000000000000000000000000000000:\ 00000000000000000000000000000000 4444444444444444444444444444444444444444444444444444444444444444:\ C454185E6A16936E39334038ACEF838BFB186FFF7480ADC4289382ECD6D394F0:\ 1111111111111111111111111111111122222222222222222222222222222222:\ 33333333330000000000000000000000 4444444444444444444444444444444444444444444444444444444444444444:\ B01F86F8EDC1863706FA8A4253E34F28AF319DE38334870F4DD1F94CBE9832F1:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF:\ 27A7479BEFA1D476489F308CD4CFA6E2A96E4BBE3208FF25287DD3819616E89C\ C78CF7F5E543445F8333D8FA7F56000005279FA5D8B5E4AD40E736DDB4D35412\ 328063FD2AAB53E5EA1E0A9F332500A5DF9487D07A5C92CC512C8866C7E860CE\ 93FDF166A24912B422976146AE20CE846BB7DC9BA94A767AAEF20C0D61AD0265\ 5EA92DC4C4E41A8952C651D33174BE51A10C421110E6D81588EDE82103A252D8\ A750E8768DEFFFED9122810AAEB99F9172AF82B604DC4B8E51BCB08235A6F434\ 1332E4CA60482A4BA1A03B3E65008FC5DA76B70BF1690DB4EAE29C5F1BADD03C\ 5CCF2A55D705DDCD86D449511CEB7EC30BF12B1FA35B913F9F747A8AFD1B130E\ 94BFF94EFFD01A91735CA1726ACD0B197C4E5B03393697E126826FB6BBDE8ECC\ 1E08298516E2C9ED03FF3C1B7860F6DE76D4CECD94C8119855EF5297CA67E9F3\ E7FF72B1E99785CA0A7E7720C5B36DC6D72CAC9574C8CBBC2F801E23E56FD344\ B07F22154BEBA0F08CE8891E643ED995C94D9A69C9F1B5F499027A78572AEEBD\ 74D20CC39881C213EE770B1010E4BEA718846977AE119F7A023AB58CCA0AD752\ AFE656BB3C17256A9F6E9BF19FDD5A38FC82BBE872C5539EDB609EF4F79C203E\ BB140F2E583CB2AD15B4AA5B655016A8449277DBD477EF2C8D6C017DB738B18D\ EB4A427D1923CE3FF262735779A418F20A282DF920147BEABE421EE5319D0568:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 00000000000000000000000000000000 27A7479BEFA1D476489F308CD4CFA6E2A96E4BBE3208FF25287DD3819616E89C\ C78CF7F5E543445F8333D8FA7F56000005279FA5D8B5E4AD40E736DDB4D35412\ 328063FD2AAB53E5EA1E0A9F332500A5DF9487D07A5C92CC512C8866C7E860CE\ 93FDF166A24912B422976146AE20CE846BB7DC9BA94A767AAEF20C0D61AD0265\ 5EA92DC4C4E41A8952C651D33174BE51A10C421110E6D81588EDE82103A252D8\ A750E8768DEFFFED9122810AAEB99F9172AF82B604DC4B8E51BCB08235A6F434\ 1332E4CA60482A4BA1A03B3E65008FC5DA76B70BF1690DB4EAE29C5F1BADD03C\ 5CCF2A55D705DDCD86D449511CEB7EC30BF12B1FA35B913F9F747A8AFD1B130E\ 94BFF94EFFD01A91735CA1726ACD0B197C4E5B03393697E126826FB6BBDE8ECC\ 1E08298516E2C9ED03FF3C1B7860F6DE76D4CECD94C8119855EF5297CA67E9F3\ E7FF72B1E99785CA0A7E7720C5B36DC6D72CAC9574C8CBBC2F801E23E56FD344\ B07F22154BEBA0F08CE8891E643ED995C94D9A69C9F1B5F499027A78572AEEBD\ 74D20CC39881C213EE770B1010E4BEA718846977AE119F7A023AB58CCA0AD752\ AFE656BB3C17256A9F6E9BF19FDD5A38FC82BBE872C5539EDB609EF4F79C203E\ BB140F2E583CB2AD15B4AA5B655016A8449277DBD477EF2C8D6C017DB738B18D\ EB4A427D1923CE3FF262735779A418F20A282DF920147BEABE421EE5319D0568:\ 264D3CA8512194FEC312C8C9891F279FEFDD608D0C027B60483A3FA811D65EE5\ 9D52D9E40EC5672D81532B38B6B089CE951F0F9C35590B8B978D175213F329BB\ 1C2FD30F2F7F30492A61A532A79F51D36F5E31A7C9A12C286082FF7D2394D18F\ 783E1A8E72C722CAAAA52D8F065657D2631FD25BFD8E5BAAD6E527D763517501\ C68C5EDC3CDD55435C532D7125C8614DEED9ADAA3ACADE5888B87BEF641C4C99\ 4C8091B5BCD387F3963FB5BC37AA922FBFE3DF4E5B915E6EB514717BDD2A7407\ 9A5073F5C4BFD46ADF7D282E7A393A52579D11A028DA4D9CD9C77124F9648EE3\ 83B1AC763930E7162A8D37F350B2F74B8472CF09902063C6B32E8C2D9290CEFB\ D7346D1C779A0DF50EDCDE4531DA07B099C638E83A755944DF2AEF1AA31752FD\ 323DCB710FB4BFBB9D22B925BC3577E1B8949E729A90BBAFEACF7F7879E7B114\ 7E28BA0BAE940DB795A61B15ECF4DF8DB07B824BB062802CC98A9545BB2AAEED\ 77CB3FC6DB15DCD7D80D7D5BC406C4970A3478ADA8899B329198EB61C193FB62\ 75AA8CA340344A75A862AEBE92EEE1CE032FD950B47D7704A3876923B4AD6284\ 4BF4A09C4DBE8B4397184B7471360C9564880AEDDDB9BAA4AF2E75394B08CD32\ FF479C57A07D3EAB5D54DE5F9738B8D27F27A9F0AB11799D7B7FFEFB2704C95C\ 6AD12C39F1E867A4B7B1D7818A4B753DFD2A89CCB45E001A03A867B187F225DD:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 01000000000000000000000000000000 264D3CA8512194FEC312C8C9891F279FEFDD608D0C027B60483A3FA811D65EE5\ 9D52D9E40EC5672D81532B38B6B089CE951F0F9C35590B8B978D175213F329BB\ 1C2FD30F2F7F30492A61A532A79F51D36F5E31A7C9A12C286082FF7D2394D18F\ 783E1A8E72C722CAAAA52D8F065657D2631FD25BFD8E5BAAD6E527D763517501\ C68C5EDC3CDD55435C532D7125C8614DEED9ADAA3ACADE5888B87BEF641C4C99\ 4C8091B5BCD387F3963FB5BC37AA922FBFE3DF4E5B915E6EB514717BDD2A7407\ 9A5073F5C4BFD46ADF7D282E7A393A52579D11A028DA4D9CD9C77124F9648EE3\ 83B1AC763930E7162A8D37F350B2F74B8472CF09902063C6B32E8C2D9290CEFB\ D7346D1C779A0DF50EDCDE4531DA07B099C638E83A755944DF2AEF1AA31752FD\ 323DCB710FB4BFBB9D22B925BC3577E1B8949E729A90BBAFEACF7F7879E7B114\ 7E28BA0BAE940DB795A61B15ECF4DF8DB07B824BB062802CC98A9545BB2AAEED\ 77CB3FC6DB15DCD7D80D7D5BC406C4970A3478ADA8899B329198EB61C193FB62\ 75AA8CA340344A75A862AEBE92EEE1CE032FD950B47D7704A3876923B4AD6284\ 4BF4A09C4DBE8B4397184B7471360C9564880AEDDDB9BAA4AF2E75394B08CD32\ FF479C57A07D3EAB5D54DE5F9738B8D27F27A9F0AB11799D7B7FFEFB2704C95C\ 6AD12C39F1E867A4B7B1D7818A4B753DFD2A89CCB45E001A03A867B187F225DD:\ FA762A3680B76007928ED4A4F49A9456031B704782E65E16CECB54ED7D017B5E\ 18ABD67B338E81078F21EDB7868D901EBE9C731A7C18B5E6DEC1D6A72E078AC9\ A4262F860BEEFA14F4E821018272E411A951502B6E79066E84252C3346F3AA62\ 344351A291D4BEDC7A07618BDEA2AF63145CC7A4B8D4070691AE890CD65733E7\ 946E9021A1DFFC4C59F159425EE6D50CA9B135FA6162CEA18A939838DC000FB3\ 86FAD086ACCE5AC07CB2ECE7FD580B00CFA5E98589631DC25E8E2A3DAF2FFDEC\ 26531659912C9D8F7A15E5865EA8FB5816D6207052BD7128CD743C12C8118791\ A4736811935EB982A532349E31DD401E0B660A568CB1A4711F552F55DED59F1F\ 15BF7196B3CA12A91E488EF59D64F3A02BF45239499AC6176AE321C4A211EC54\ 5365971C5D3F4F09D4EB139BFDF2073D33180B21002B65CC9865E76CB24CD92C\ 874C24C18350399A936AB3637079295D76C417776B94EFCE3A0EF7206B151105\ 19655C956CBD8B2489405EE2B09A6B6EEBE0C53790A12A8998378B33A5B71159\ 625F4BA49D2A2FDBA59FBF0897BC7AABD8D707DC140A80F0F309F835D3DA54AB\ 584E501DFA0EE977FEC543F74186A802B9A37ADB3E8291ECA04D66520D229E60\ 401E7282BEF486AE059AA70696E0E305D777140A7A883ECDCB69B9FF938E8A42\ 31864C69CA2C2043BED007FF3E605E014BCF518138DC3A25C5E236171A2D01D6:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 02000000000000000000000000000000 8E41B78C390B5AF9D758BB214A67E9F6BF7727B09AC6124084C37611398FA45D\ AAD94868600ED391FB1ACD4857A95B466E62EF9F4B377244D1C152E7B30D731A\ AD30C716D214B707AED99EB5B5E580B3E887CF7497465651D4B60E6042051DA3\ 693C3B78C14489543BE8B6AD0BA629565BBA202313BA7B0D0C94A3252B676F46\ CC02CE0F8A7D34C0ED229129673C1F61AED579D08A9203A25AAC3A77E9DB6026\ 7996DB38DF637356D9DCD1632E369939F2A29D89345C66E05066F1A3677AEF18\ DEA4113FAEB629E46721A66D0A7E785D3E29AF2594EB67DFA982AFFE0AAC058F\ 6E15864269B135418261FC3AFB089472CF68C45DD7F231C6249BA0255E1E0338\ 33FC4D00A3FE02132D7BC3873614B8AEE34273581EA0325C81F0270AFFA13641\ D052D36F0757D484014354D02D6883CA15C24D8C3956B1BD027BCF41F151FD80\ 23C5340E5606F37E90FDB87C86FB4FA634B3718A30BACE06A66EAF8F63C4AA3B\ 637826A87FE8CFA44282E92CB1615AF3A28E53BC74C7CBA1A0977BE9065D0C1A\ 5DEC6C54AE38D37F37AA35283E048E5530A85C4E7A29D7B92EC0C3169CDF2A80\ 5C7604BCE60049B9FB7B8EAAC10F51AE23794CEBA68BB58112E293B9B692CA72\ 1B37C662F8574ED4DBA6F88E170881C82CDDC1034A0CA7E284BF0962B6B26292\ D836FA9F73C1AC770EEF0F2D3A1EAF61D3E03555FD424EEDD67E18A18094F888:\ D55F684F81F4426E9FDE92A5FF02DF2AC896AF63962888A97910C1379E20B0A3\ B1DB613FB7FE2E07004329EA5C22BFD33E3DBE4CF58CC608C2C26C19A2E2FE22\ F98732C2B5CB844CC6C0702D91E1D50FC4382A7EBA5635CD602432A2306AC4CE\ 82F8D70C8D9BC15F918FE71E74C622D5CF71178BF6E0B9CC9F2B41DD8DBE441C\ 41CD0C73A6DC47A348F6702F9D0E9B1B1431E948E299B9EC2272AB2C5F0C7BE8\ 6AFFA5DEC87A0BEE81D3D50007EDAA2BCFCCB35605155FF36ED8EDD4A40DCD4B\ 243ACD11B2B987BDBFAF91A7CAC27E9C5AEA525EE53DE7B2D3332C8644402B82\ 3E94A7DB26276D2D23AA07180F76B4FD29B9C0823099C9D62C519880AEE7E969\ 7617C1497D47BF3E571950311421B6B734D38B0DB91EB85331B91EA9F61530F5\ 4512A5A52A4BAD589EB69781D537F23297BB459BDAD2948A29E1550BF4787E0B\ E95BB173CF5FAB17DAB7A13A052A63453D97CCEC1A321954886B7A1299FAAEEC\ AE35C6EAACA753B041B5E5F093BF83397FD21DD6B3012066FCC058CC32C3B09D\ 7562DEE29509B5839392C9FF05F51F3166AAAC4AC5F238038A3045E6F72E48EF\ 0FE8BC675E82C318A268E43970271BF119B81BF6A982746554F84E72B9F00280\ A320A08142923C23C883423FF949827F29BBACDC1CCDB04938CE6098C95BA6B3\ 2528F4EF78EED778B2E122DDFD1CBDD11D1C0A6783E011FC536D63D053260637:\ 2718281828459045235360287471352631415926535897932384626433832795:\ FD000000000000000000000000000000 D55F684F81F4426E9FDE92A5FF02DF2AC896AF63962888A97910C1379E20B0A3\ B1DB613FB7FE2E07004329EA5C22BFD33E3DBE4CF58CC608C2C26C19A2E2FE22\ F98732C2B5CB844CC6C0702D91E1D50FC4382A7EBA5635CD602432A2306AC4CE\ 82F8D70C8D9BC15F918FE71E74C622D5CF71178BF6E0B9CC9F2B41DD8DBE441C\ 41CD0C73A6DC47A348F6702F9D0E9B1B1431E948E299B9EC2272AB2C5F0C7BE8\ 6AFFA5DEC87A0BEE81D3D50007EDAA2BCFCCB35605155FF36ED8EDD4A40DCD4B\ 243ACD11B2B987BDBFAF91A7CAC27E9C5AEA525EE53DE7B2D3332C8644402B82\ 3E94A7DB26276D2D23AA07180F76B4FD29B9C0823099C9D62C519880AEE7E969\ 7617C1497D47BF3E571950311421B6B734D38B0DB91EB85331B91EA9F61530F5\ 4512A5A52A4BAD589EB69781D537F23297BB459BDAD2948A29E1550BF4787E0B\ E95BB173CF5FAB17DAB7A13A052A63453D97CCEC1A321954886B7A1299FAAEEC\ AE35C6EAACA753B041B5E5F093BF83397FD21DD6B3012066FCC058CC32C3B09D\ 7562DEE29509B5839392C9FF05F51F3166AAAC4AC5F238038A3045E6F72E48EF\ 0FE8BC675E82C318A268E43970271BF119B81BF6A982746554F84E72B9F00280\ A320A08142923C23C883423FF949827F29BBACDC1CCDB04938CE6098C95BA6B3\ 2528F4EF78EED778B2E122DDFD1CBDD11D1C0A6783E011FC536D63D053260637:\ 72EFC1EBFE1EE25975A6EB3AA8589DDA2B261F1C85BDAB442A9E5B2DD1D7C395\ 7A16FC08E526D4B1223F1B1232A11AF274C3D70DAC57F83E0983C498F1A6F1AE\ CB021C3E70085A1E527F1CE41EE5911A82020161529CD82773762DAF5459DE94\ A0A82ADAE7E1703C808543C29ED6FB32D9E004327C1355180C995A07741493A0\ 9C21BA01A387882DA4F62534B87BB15D60D197201C0FD3BF30C1500A3ECFECDD\ 66D8721F90BCC4C17EE925C61B0A03727A9C0D5F5CA462FBFA0AF1C2513A9D9D\ 4B5345BD27A5F6E653F751693E6B6A2B8EAD57D511E00E58C45B7B8D005AF792\ 88F5C7C22FD4F1BF7A898B03A5634C6A1AE3F9FAE5DE4F296A2896B23E7ED43E\ D14FA5A2803F4D28F0D3FFCF24757677AEBDB47BB388378708948A8D4126ED18\ 39E0DA29A537A8C198B3C66AB00712DD261674BF45A73D67F76914F830CA014B\ 65596F27E4CF62DE66125A5566DF9975155628B400FBFB3A29040ED50FAFFDBB\ 18AECE7C5C44693260AAB386C0A37B11B114F1C415AEBB653BE468179428D43A\ 4D8BC3EC38813ECA30A13CF1BB18D524F1992D44D8B1A42EA30B22E6C95B199D\ 8D182F8840B09D059585C31AD691FA0619FF038ACA2C39A943421157361717C4\ 9D322028A74648113BD8C9D7EC77CF3C89C1EC8718CEFF8516D96B34C3C614F1\ 0699C9ABC4ED0411506223BEA16AF35C883ACCDBE1104EEF0CFDB54E12FB230A:\ 2718281828459045235360287471352631415926535897932384626433832795:\ FE000000000000000000000000000000 72EFC1EBFE1EE25975A6EB3AA8589DDA2B261F1C85BDAB442A9E5B2DD1D7C395\ 7A16FC08E526D4B1223F1B1232A11AF274C3D70DAC57F83E0983C498F1A6F1AE\ CB021C3E70085A1E527F1CE41EE5911A82020161529CD82773762DAF5459DE94\ A0A82ADAE7E1703C808543C29ED6FB32D9E004327C1355180C995A07741493A0\ 9C21BA01A387882DA4F62534B87BB15D60D197201C0FD3BF30C1500A3ECFECDD\ 66D8721F90BCC4C17EE925C61B0A03727A9C0D5F5CA462FBFA0AF1C2513A9D9D\ 4B5345BD27A5F6E653F751693E6B6A2B8EAD57D511E00E58C45B7B8D005AF792\ 88F5C7C22FD4F1BF7A898B03A5634C6A1AE3F9FAE5DE4F296A2896B23E7ED43E\ D14FA5A2803F4D28F0D3FFCF24757677AEBDB47BB388378708948A8D4126ED18\ 39E0DA29A537A8C198B3C66AB00712DD261674BF45A73D67F76914F830CA014B\ 65596F27E4CF62DE66125A5566DF9975155628B400FBFB3A29040ED50FAFFDBB\ 18AECE7C5C44693260AAB386C0A37B11B114F1C415AEBB653BE468179428D43A\ 4D8BC3EC38813ECA30A13CF1BB18D524F1992D44D8B1A42EA30B22E6C95B199D\ 8D182F8840B09D059585C31AD691FA0619FF038ACA2C39A943421157361717C4\ 9D322028A74648113BD8C9D7EC77CF3C89C1EC8718CEFF8516D96B34C3C614F1\ 0699C9ABC4ED0411506223BEA16AF35C883ACCDBE1104EEF0CFDB54E12FB230A:\ 3260AE8DAD1F4A32C5CAFE3AB0EB95549D461A67CEB9E5AA2D3AFB62DECE0553\ 193BA50C75BE251E08D1D08F1088576C7EFDFAAF3F459559571E12511753B07A\ F073F35DA06AF0CE0BBF6B8F5CCC5CEA500EC1B211BD51F63B606BF6528796CA\ 12173BA39B8935EE44CCCE646F90A45BF9CCC567F0ACE13DC2D53EBEEDC81F58\ B2E41179DDDF0D5A5C42F5D8506C1A5D2F8F59F3EA873CBCD0EEC19ACBF32542\ 3BD3DCB8C2B1BF1D1EAED0EBA7F0698E4314FBEB2F1566D1B9253008CBCCF45A\ 2B0D9C5C9C21474F4076E02BE26050B99DEE4FD68A4CF890E496E4FCAE7B70F9\ 4EA5A9062DA0DAEBA1993D2CCD1DD3C244B8428801495A58B216547E7E847C46\ D1D756377B6242D2E5FB83BF752B54E0DF71E889F3A2BB0F4C10805BF3C59037\ 6E3C24E22FF57F7FA965577375325CEA5D920DB94B9C336B455F6E894C01866F\ E9FBB8C8D3F70A2957285F6DFB5DCD8CBF54782F8FE7766D4723819913AC7734\ 21E3A31095866BAD22C86A6036B2518B2059B4229D18C8C2CCBDF906C6CC6E82\ 464EE57BDDB0BEBCB1DC645325BFB3E665EF7251082C88EBB1CF203BD779FDD3\ 8675713C8DAADD17E1CABEE432B09787B6DDF3304E38B731B45DF5DF51B78FCF\ B3D32466028D0BA36555E7E11AB0EE0666061D1645D962444BC47A38188930A8\ 4B4D561395C73C087021927CA638B7AFC8A8679CCB84C26555440EC7F10445CD:\ 2718281828459045235360287471352631415926535897932384626433832795:\ FF000000000000000000000000000000 # From Brian Gladman's XTS implementation 000102030405060708090A0B0C0D0E0F10:\ 6C1625DB4671522D3D7599601DE7CA09ED:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F1011:\ D069444B7A7E0CAB09E24447D24DEB1FEDBF:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112:\ E5DF1351C0544BA1350B3363CD8EF4BEEDBF9D:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F10111213:\ 9D84C813F719AA2C7BE3F66171C7C5C2EDBF9DAC:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF:\ 38B45812EF43A05BD957E545907E223B954AB4AAF088303AD910EADF14B42BE6\ 8B2461149D8C8BA85F992BE970BC621F1B06573F63E867BF5875ACAFA04E42CC\ BD7BD3C2A0FB1FFF791EC5EC36C66AE4AC1E806D81FBF709DBE29E471FAD3854\ 9C8E66F5345D7C1EB94F405D1EC785CC6F6A68F6254DD8339F9D84057E01A177\ 41990482999516B5611A38F41BB6478E6F173F320805DD71B1932FC333CB9EE3\ 9936BEEA9AD96FA10FB4112B901734DDAD40BC1878995F8E11AEE7D141A2F5D4\ 8B7A4E1E7F0B2C04830E69A4FD1378411C2F287EDF48C6C4E5C247A19680F7FE\ 41CEFBD49B582106E3616CBBE4DFB2344B2AE9519391F3E0FB4922254B1D6D2D\ 19C6D4D537B3A26F3BCC51588B32F3ECA0829B6A5AC72578FB814FB43CF80D64\ A233E3F997A3F02683342F2B33D25B492536B93BECB2F5E1A8B82F5B88334272\ 9E8AE09D16938841A21A97FB543EEA3BBFF59F13C1A18449E398701C1AD51648\ 346CBC04C27BB2DA3B93A1372CCAE548FB53BEE476F9E9C91773B1BB19828394\ D55D3E1A20ED69113A860B6829FFA847224604435070221B257E8DFF783615D2\ CAE4803A93AA4334AB482A0AFAC9C0AEDA70B45A481DF5DEC5DF8CC0F423C77A\ 5FD46CD312021D4B438862419A791BE03BB4D97C0E59578542531BA466A83BAF\ 92CEFC151B5CC1611A167893819B63FB8A6B18E86DE60290FA72B797B0CE59F3:\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF:\ 21436587A90000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E:\ D05BC090A8E04F1B3D3ECDD5BAEC0FD4EDBF9DACE45D6F6A7306E64BE5DD82:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F10:\ 6C1625DB4671522D3D7599601DE7CA09ED:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F1011:\ D069444B7A7E0CAB09E24447D24DEB1FEDBF:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112:\ E5DF1351C0544BA1350B3363CD8EF4BEEDBF9D:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F10111213:\ 9D84C813F719AA2C7BE3F66171C7C5C2EDBF9DAC:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F1011121314:\ 2CD47E780DE4B008D8FDE727C1C325F4EDBF9DACE4:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415:\ 9148CA1ADE56C1914833BCA9F7742F4EEDBF9DACE45D:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F10111213141516:\ 95B3BDFF7122C424BA9501BA0B9E09F0EDBF9DACE45D6F:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F1011121314151617:\ A2316435248154E2026E672372A6A789EDBF9DACE45D6F6A:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718:\ 8F4DCBAD55558D7B4E01D9379CD4EA22EDBF9DACE45D6F6A73:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F10111213141516171819:\ 4D184C4B48F4BE3B2491A04093713EC3EDBF9DACE45D6F6A7306:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A:\ 1FB75FF08D88C63CADBA2CCF5CDDE52FEDBF9DACE45D6F6A7306E6:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B:\ 5E20653F0988F211299DD6D76CCE0E72EDBF9DACE45D6F6A7306E64B:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C:\ 60D814B83896C40CC56EC143D38A7C7FEDBF9DACE45D6F6A7306E64BE5:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D:\ 24F3B2374C2EE6DD6E0B9ED63E354307EDBF9DACE45D6F6A7306E64BE5DD:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E:\ D05BC090A8E04F1B3D3ECDD5BAEC0FD4EDBF9DACE45D6F6A7306E64BE5DD82:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 0001020304050607:\ 38B45812EF43A05BD957E545907E223B954AB4AAF088303AD910EADF14B42BE6\ 8B2461149D8C8BA85F992BE970BC621F1B06573F63E867BF5875ACAFA04E42CC\ BD7BD3C2A0FB1FFF791EC5EC36C66AE4AC1E806D81FBF709DBE29E471FAD3854\ 9C8E66F5345D7C1EB94F405D1EC785CC6F6A68F6254DD8339F9D84057E01A177\ 41990482999516B5611A38F41BB6478E6F173F320805DD71B1932FC333CB9EE3\ 9936BEEA9AD96FA10FB4112B901734DDAD40BC1878995F8E11AEE7D141A2F5D4\ 8B7A4E1E7F0B2C04830E69A4FD1378411C2F287EDF48C6C4E5C247A19680F7FE\ 41CEFBD49B582106E3616CBBE4DFB2344B2AE9519391F3E0FB4922254B1D6D2D\ 19C6D4D537B3A26F3BCC51588B32F3ECA0829B6A5AC72578FB814FB43CF80D64\ A233E3F997A3F02683342F2B33D25B492536B93BECB2F5E1A8B82F5B88334272\ 9E8AE09D16938841A21A97FB543EEA3BBFF59F13C1A18449E398701C1AD51648\ 346CBC04C27BB2DA3B93A1372CCAE548FB53BEE476F9E9C91773B1BB19828394\ D55D3E1A20ED69113A860B6829FFA847224604435070221B257E8DFF783615D2\ CAE4803A93AA4334AB482A0AFAC9C0AEDA70B45A481DF5DEC5DF8CC0F423C77A\ 5FD46CD312021D4B438862419A791BE03BB4D97C0E59578542531BA466A83BAF\ 92CEFC151B5CC1611A167893819B63FB37EC662BC0FC907DB74A94468A55A7BC\ 8A6B18E86DE60290:\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF:\ 21436587A90000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 2021222324:\ 27A7479BEFA1D476489F308CD4CFA6E294E4CD40E4BA22AEF6C26F9F32DDC925\ A96E4BBE32:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 00000000000000000000000000000000 27A7479BEFA1D476489F308CD4CFA6E294E4CD40E4BA22AEF6C26F9F32DDC925\ A96E4BBE32:\ 88DFFC5A67617A54952ADDCD9CCBDA5BA127EAAD95B20441788EFBC0462F6B54\ F65FD7579B:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 11000000000000000000000000000000 88DFFC5A67617A54952ADDCD9CCBDA5BA127EAAD95B20441788EFBC0462F6B54\ F65FD7579B:\ 5000ECA5A1F6A49378030D9EE805ACEF460F314EE04BB514034EB27FB8DF2BC8\ 12AE5BDF8C:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 22110000000000000000000000000000 5000ECA5A1F6A49378030D9EE805ACEF460F314EE04BB514034EB27FB8DF2BC8\ 12AE5BDF8C:\ E59E6F233BE0E0830483C6BD4E82F4C39543558A25E3DB60A553A5948145A6FF\ B5E6BE1DB5:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 33221100000000000000000000000000 E59E6F233BE0E0830483C6BD4E82F4C39543558A25E3DB60A553A5948145A6FF\ B5E6BE1DB5:\ 01C7772FEB67516E13E1BE201F0CDE25F84D71AACDA86A3957E285B2059D7C93\ 84F4432795:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 44332211000000000000000000000000 01C7772FEB67516E13E1BE201F0CDE25F84D71AACDA86A3957E285B2059D7C93\ 84F4432795:\ 457BD3FE9531EBF13FF98F965AFC1A075B5C80108D3EBCC8041CD29DE4416A71\ F1ED58F383:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 55443322110000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 20212223:\ 27A7479BEFA1D476489F308CD4CFA6E288F548E5C4239F91712A587E2B05AC3D\ A96E4BBE:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 00000000000000000000000000000000 27A7479BEFA1D476489F308CD4CFA6E288F548E5C4239F91712A587E2B05AC3D\ A96E4BBE:\ 88DFFC5A67617A54952ADDCD9CCBDA5B1A87DE598E8E9FC8E3CB6EB80141CDEC\ AE9E78B3:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 11000000000000000000000000000000 88DFFC5A67617A54952ADDCD9CCBDA5B1A87DE598E8E9FC8E3CB6EB80141CDEC\ AE9E78B3:\ 5000ECA5A1F6A49378030D9EE805ACEF0CE949B3861EB92CC4C541507AFF4AAD\ 368E7FE5:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 22110000000000000000000000000000 5000ECA5A1F6A49378030D9EE805ACEF0CE949B3861EB92CC4C541507AFF4AAD\ 368E7FE5:\ E59E6F233BE0E0830483C6BD4E82F4C3C0C31FEB59D739BFE8CD96A7F3950E4C\ 4C21D832:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 33221100000000000000000000000000 E59E6F233BE0E0830483C6BD4E82F4C3C0C31FEB59D739BFE8CD96A7F3950E4C\ 4C21D832:\ 01C7772FEB67516E13E1BE201F0CDE257A22160502BF1B7310153E0A5215D70D\ 1FA5E0FB:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 44332211000000000000000000000000 01C7772FEB67516E13E1BE201F0CDE257A22160502BF1B7310153E0A5215D70D\ 1FA5E0FB:\ 457BD3FE9531EBF13FF98F965AFC1A07DB2431240FDD34D66A0F7457129A0A64\ C838EE03:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 55443322110000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122:\ 27A7479BEFA1D476489F308CD4CFA6E2DDF8A1A57E330896A2F95DC70D59CB51\ A96E4B:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 00000000000000000000000000000000 27A7479BEFA1D476489F308CD4CFA6E2DDF8A1A57E330896A2F95DC70D59CB51\ A96E4B:\ 88DFFC5A67617A54952ADDCD9CCBDA5B688EBB032ED9C4B2223944AE7626956A\ 07577F:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 11000000000000000000000000000000 88DFFC5A67617A54952ADDCD9CCBDA5B688EBB032ED9C4B2223944AE7626956A\ 07577F:\ 5000ECA5A1F6A49378030D9EE805ACEF5B0B898816A7CFA9D40DFBE35A731419\ 6D0F7F:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 22110000000000000000000000000000 5000ECA5A1F6A49378030D9EE805ACEF5B0B898816A7CFA9D40DFBE35A731419\ 6D0F7F:\ E59E6F233BE0E0830483C6BD4E82F4C341785B48E59353C2F55C05EFC6D6191A\ 733D0C:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 33221100000000000000000000000000 E59E6F233BE0E0830483C6BD4E82F4C341785B48E59353C2F55C05EFC6D6191A\ 733D0C:\ 01C7772FEB67516E13E1BE201F0CDE25667EBBE69DB9728C534B88083A8FFFBA\ 758210:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 44332211000000000000000000000000 01C7772FEB67516E13E1BE201F0CDE25667EBBE69DB9728C534B88083A8FFFBA\ 758210:\ 457BD3FE9531EBF13FF98F965AFC1A071762ABD95A529D51FDEE8137740857DE\ 1CB7F8:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 55443322110000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 2021:\ 27A7479BEFA1D476489F308CD4CFA6E203C64AD2FF46C204CB36123C1BDB4B7A\ A96E:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 00000000000000000000000000000000 27A7479BEFA1D476489F308CD4CFA6E203C64AD2FF46C204CB36123C1BDB4B7A\ A96E:\ 88DFFC5A67617A54952ADDCD9CCBDA5B45D25600AE3AB369378816F303C5EAFF\ FA3F:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 11000000000000000000000000000000 88DFFC5A67617A54952ADDCD9CCBDA5B45D25600AE3AB369378816F303C5EAFF\ FA3F:\ 5000ECA5A1F6A49378030D9EE805ACEFEC47348F3EF418D34398192B465806DA\ A025:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 22110000000000000000000000000000 5000ECA5A1F6A49378030D9EE805ACEFEC47348F3EF418D34398192B465806DA\ A025:\ E59E6F233BE0E0830483C6BD4E82F4C38EA0534B5DBFA3FF0467797E0179C1EC\ CC42:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 33221100000000000000000000000000 E59E6F233BE0E0830483C6BD4E82F4C38EA0534B5DBFA3FF0467797E0179C1EC\ CC42:\ 01C7772FEB67516E13E1BE201F0CDE25DE3C95403C6C12F005CBE1216ACCA26A\ 7CBD:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 44332211000000000000000000000000 01C7772FEB67516E13E1BE201F0CDE25DE3C95403C6C12F005CBE1216ACCA26A\ 7CBD:\ 457BD3FE9531EBF13FF98F965AFC1A0707A896D7C002150B23BC4C24C04593F7\ 30A7:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 55443322110000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 20:\ 27A7479BEFA1D476489F308CD4CFA6E2A3FCD5EA382FD25A6469DEA467377E2E\ A9:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 00000000000000000000000000000000 27A7479BEFA1D476489F308CD4CFA6E2A3FCD5EA382FD25A6469DEA467377E2E\ A9:\ 88DFFC5A67617A54952ADDCD9CCBDA5BF0D6EDC2AC04C62D728FA4AA7F83F136\ FD:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 11000000000000000000000000000000 88DFFC5A67617A54952ADDCD9CCBDA5BF0D6EDC2AC04C62D728FA4AA7F83F136\ FD:\ 5000ECA5A1F6A49378030D9EE805ACEFD0F354CA0758FE61E62B6BF79404154D\ 20:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 22110000000000000000000000000000 5000ECA5A1F6A49378030D9EE805ACEFD0F354CA0758FE61E62B6BF79404154D\ 20:\ E59E6F233BE0E0830483C6BD4E82F4C3E5288DD1FC040837735A40B3BE8AF83C\ 1D:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 33221100000000000000000000000000 E59E6F233BE0E0830483C6BD4E82F4C3E5288DD1FC040837735A40B3BE8AF83C\ 1D:\ 01C7772FEB67516E13E1BE201F0CDE25C3ED2B1AB747C3BEDF68F3A293D27372\ 22:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 44332211000000000000000000000000 01C7772FEB67516E13E1BE201F0CDE25C3ED2B1AB747C3BEDF68F3A293D27372\ 22:\ 457BD3FE9531EBF13FF98F965AFC1A07D308CACA9E8E9F86E104E47F5C60B703\ C8:\ 2718281828459045235360287471352631415926535897932384626433832795:\ 55443322110000000000000000000000 [AES-256/XTS] 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF:\ 1C3B3A102F770386E4836C99E370CF9BEA00803F5E482357A4AE12D414A3E63B\ 5D31E276F8FE4A8D66B317F9AC683F44680A86AC35ADFC3345BEFECB4BB188FD\ 5776926C49A3095EB108FD1098BAEC70AAA66999A72A82F27D848B21D4A741B0\ C5CD4D5FFF9DAC89AEBA122961D03A757123E9870F8ACF1000020887891429CA\ 2A3E7A7D7DF7B10355165C8B9A6D0A7DE8B062C4500DC4CD120C0F7418DAE3D0\ B5781C34803FA75421C790DFE1DE1834F280D7667B327F6C8CD7557E12AC3A0F\ 93EC05C52E0493EF31A12D3D9260F79A289D6A379BC70C50841473D1A8CC81EC\ 583E9645E07B8D9670655BA5BBCFECC6DC3966380AD8FECB17B6BA02469A020A\ 84E18E8F84252070C13E9F1F289BE54FBC481457778F616015E1327A02B140F1\ 505EB309326D68378F8374595C849D84F4C333EC4423885143CB47BD71C5EDAE\ 9BE69A2FFECEB1BEC9DE244FBE15992B11B77C040F12BD8F6A975A44A0F90C29\ A9ABC3D4D893927284C58754CCE294529F8614DCD2ABA991925FEDC4AE74FFAC\ 6E333B93EB4AFF0479DA9A410E4450E0DD7AE4C6E2910900575DA401FC07059F\ 645E8B7E9BFDEF33943054FF84011493C27B3429EAEDB4ED5376441A77ED4385\ 1AD77F16F541DFD269D50D6A5F14FB0AAB1CBB4C1550BE97F7AB4066193C4CAA\ 773DAD38014BD2092FA755C824BB5E54C4F36FFDA9FCEA70B9C6E693E148C151:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ FF000000000000000000000000000000 # From Brian Gladman's XTS implementation 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 2021222324:\ 3A060A8CAD115A6F44572E3759E43C8F8832FEDC28A8E35B357B5CF3EDBEF788\ CAD8BFCB23:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 00000000000000000000000000000000 3A060A8CAD115A6F44572E3759E43C8F8832FEDC28A8E35B357B5CF3EDBEF788\ CAD8BFCB23:\ 6D1C78A8BAD91DB2924C507CCEDE835F5BADD157DA0AF55C98BBC28CF676F9FA\ 61618FA696:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 11000000000000000000000000000000 6D1C78A8BAD91DB2924C507CCEDE835F5BADD157DA0AF55C98BBC28CF676F9FA\ 61618FA696:\ 818E287A6B1168B124FDBBD730488FE1E25330B96BA54A950A51AB35A8461E5B\ 9EDD4E72AA:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 22110000000000000000000000000000 818E287A6B1168B124FDBBD730488FE1E25330B96BA54A950A51AB35A8461E5B\ 9EDD4E72AA:\ 37AF0A0E7436B8C07A5AC8FC3C1007CF84366DB3978319DB9ACD3ADB8DDA164B\ 209ABC2CB9:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 33221100000000000000000000000000 37AF0A0E7436B8C07A5AC8FC3C1007CF84366DB3978319DB9ACD3ADB8DDA164B\ 209ABC2CB9:\ 6CF52A5E258BF080D9EF18301448061EC1A340F0B153C9028422D1F2DB83EE46\ A77C4C3BB1:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 44332211000000000000000000000000 6CF52A5E258BF080D9EF18301448061EC1A340F0B153C9028422D1F2DB83EE46\ A77C4C3BB1:\ 8245242C6A1CED243020B11D5DDE84199EBC07E90165554C6185F00D93500425\ 25F0F259E3:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 55443322110000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 20212223:\ 3A060A8CAD115A6F44572E3759E43C8F8F552508845701063BCE2A39F96FFDFC\ CAD8BFCB:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 00000000000000000000000000000000 3A060A8CAD115A6F44572E3759E43C8F8F552508845701063BCE2A39F96FFDFC\ CAD8BFCB:\ 6D1C78A8BAD91DB2924C507CCEDE835FAAF397703650CFD664F0446344D35FF5\ 93CACFAE:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 11000000000000000000000000000000 6D1C78A8BAD91DB2924C507CCEDE835FAAF397703650CFD664F0446344D35FF5\ 93CACFAE:\ 818E287A6B1168B124FDBBD730488FE117337F34591096E2BEF63932AC5F82A8\ 1462CC39:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 22110000000000000000000000000000 818E287A6B1168B124FDBBD730488FE117337F34591096E2BEF63932AC5F82A8\ 1462CC39:\ 37AF0A0E7436B8C07A5AC8FC3C1007CFCE294D5B61E003CBE1C1190B2436C9F2\ 67575578:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 33221100000000000000000000000000 37AF0A0E7436B8C07A5AC8FC3C1007CFCE294D5B61E003CBE1C1190B2436C9F2\ 67575578:\ 6CF52A5E258BF080D9EF18301448061E7504A2127E3EF31C3CF68C23E5C13676\ 3E32F96F:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 44332211000000000000000000000000 6CF52A5E258BF080D9EF18301448061E7504A2127E3EF31C3CF68C23E5C13676\ 3E32F96F:\ 8245242C6A1CED243020B11D5DDE8419BEA9DF5569B16CE9D98E412BF2990EAB\ 6614A200:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 55443322110000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122:\ 3A060A8CAD115A6F44572E3759E43C8F3A9C7A992A69177CAA7FEB093D4CB3C1\ CAD8BF:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 00000000000000000000000000000000 3A060A8CAD115A6F44572E3759E43C8F3A9C7A992A69177CAA7FEB093D4CB3C1\ CAD8BF:\ 6D1C78A8BAD91DB2924C507CCEDE835FBE8377FB3155793E49B47ADEF4ADAEC5\ 8FB3CB:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 11000000000000000000000000000000 6D1C78A8BAD91DB2924C507CCEDE835FBE8377FB3155793E49B47ADEF4ADAEC5\ 8FB3CB:\ 818E287A6B1168B124FDBBD730488FE199D1918615E54BD5F21AFD5F350A6AC4\ B135CD:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 22110000000000000000000000000000 818E287A6B1168B124FDBBD730488FE199D1918615E54BD5F21AFD5F350A6AC4\ B135CD:\ 37AF0A0E7436B8C07A5AC8FC3C1007CFFD7223FDEE014F60C8C273F9221D7A89\ 22570E:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 33221100000000000000000000000000 37AF0A0E7436B8C07A5AC8FC3C1007CFFD7223FDEE014F60C8C273F9221D7A89\ 22570E:\ 6CF52A5E258BF080D9EF18301448061EEC07582D787D2EC64E8C8BF8EE69BF70\ 16EF0C:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 44332211000000000000000000000000 6CF52A5E258BF080D9EF18301448061EEC07582D787D2EC64E8C8BF8EE69BF70\ 16EF0C:\ 8245242C6A1CED243020B11D5DDE841903C49424D4D444F23B893CBCD26B6D4E\ F6885E:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 55443322110000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 2021:\ 3A060A8CAD115A6F44572E3759E43C8FCB1783BBA9A61375BCE3F6F8C0914DAE\ CAD8:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 00000000000000000000000000000000 3A060A8CAD115A6F44572E3759E43C8FCB1783BBA9A61375BCE3F6F8C0914DAE\ CAD8:\ 6D1C78A8BAD91DB2924C507CCEDE835F76233E917848CB1AAEE224FF8AE6F3F6\ 887A:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 11000000000000000000000000000000 6D1C78A8BAD91DB2924C507CCEDE835F76233E917848CB1AAEE224FF8AE6F3F6\ 887A:\ 818E287A6B1168B124FDBBD730488FE15DDDFE24D6C4F97C9F930F9C527E7B15\ CE4E:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 22110000000000000000000000000000 818E287A6B1168B124FDBBD730488FE15DDDFE24D6C4F97C9F930F9C527E7B15\ CE4E:\ 37AF0A0E7436B8C07A5AC8FC3C1007CFF904E371A7A59BD34C9A3DC636D6ADE1\ 23E9:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 33221100000000000000000000000000 37AF0A0E7436B8C07A5AC8FC3C1007CFF904E371A7A59BD34C9A3DC636D6ADE1\ 23E9:\ 6CF52A5E258BF080D9EF18301448061EAFEA108BC2CD25569599580348AD83AA\ 56C6:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 44332211000000000000000000000000 6CF52A5E258BF080D9EF18301448061EAFEA108BC2CD25569599580348AD83AA\ 56C6:\ 8245242C6A1CED243020B11D5DDE8419B844D25C4BD732A30C82E4F0237857F7\ CAC1:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 55443322110000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 20:\ 3A060A8CAD115A6F44572E3759E43C8FBF97C76A8CD21BE09A0D530FE188CC1E\ CA:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 00000000000000000000000000000000 3A060A8CAD115A6F44572E3759E43C8FBF97C76A8CD21BE09A0D530FE188CC1E\ CA:\ 6D1C78A8BAD91DB2924C507CCEDE835FB4963EA5500367B0996D5725FB0279CE\ 7B:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 11000000000000000000000000000000 6D1C78A8BAD91DB2924C507CCEDE835FB4963EA5500367B0996D5725FB0279CE\ 7B:\ 818E287A6B1168B124FDBBD730488FE1B259DDE3A512332C6F23A80AFF648EF7\ 99:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 22110000000000000000000000000000 818E287A6B1168B124FDBBD730488FE1B259DDE3A512332C6F23A80AFF648EF7\ 99:\ 37AF0A0E7436B8C07A5AC8FC3C1007CFC03E12D003BB29D9814128E963D7163D\ 5A:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 33221100000000000000000000000000 37AF0A0E7436B8C07A5AC8FC3C1007CFC03E12D003BB29D9814128E963D7163D\ 5A:\ 6CF52A5E258BF080D9EF18301448061EBA65BBC63613F8E283AD5DE78AF98877\ 60:\ 2718281828459045235360287471352662497757247093699959574966967627\ 3141592653589793238462643383279502884197169399375105820974944592:\ 44332211000000000000000000000000 000102030405060708090A0B0C0D0E0F10:\ 7F117752CC598A8B0D81D88AF9F9BEC8C3:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F1011:\ D1F4418F240D4535734188CC83A52026C30C:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112:\ 0DE2CDD2C2A5114AC78AACDEEF14638FC30CA8:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F10111213:\ A06CCD40F54385404CB839A1D668E151C30CA8F2:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F1011121314:\ CDE828C3996137292AE21DAD65526B3FC30CA8F2ED:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415:\ 75E8188BCCE59ADA939F57DE2CB9A489C30CA8F2ED57:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F10111213141516:\ 56403FD6ED03F69A2A95CA17B3B3D6C5C30CA8F2ED5730:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F1011121314151617:\ 5708432F21D05AC571449A7A8F4E1089C30CA8F2ED57307E:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718:\ 9ABC9FFB364D5AAEAA7849AE0A7349DEC30CA8F2ED57307EDC:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F10111213141516171819:\ 1A7297CBA8C2992302DBA6F501F602ACC30CA8F2ED57307EDC87:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A:\ F21758C331F8E66678332E82F012A07DC30CA8F2ED57307EDC87E5:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B:\ 34F8F1C5597F1BE62565DA0CBDA946F7C30CA8F2ED57307EDC87E544:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C:\ CF32C3DB8C72E063CC3AE59ED7C4A20FC30CA8F2ED57307EDC87E54486:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D:\ F418C0D5ABE38D7D4FC79A9D51E9EFA0C30CA8F2ED57307EDC87E544867A:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E:\ 581EA1FEE5516AD432DDEBE75FD27C6FC30CA8F2ED57307EDC87E544867AC8:\ FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0\ BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0:\ 9A785634120000000000000000000000 [Twofish/XTS] 87527DDED4D4E85F8DB6D6D41EEAB39C1F:\ CACE1598319D84999709808780DFB741AB:\ 879AB1F37890ACE3AA1FF21EB403C2029E225E4B82CC00CD6377EBFDF6A313ED\ 6152830450ABA4E5EED0055968E66C81BB6DF06BFA92910550819F0BCD3D484B:\ A5F270CDCB5D92FE5F19805AA93B7D13 69C6D85BB44D5B8758AC5E88DEFBEA0CB844:\ FB492A194BB05CE9D28EC2AA195722C09506:\ 5A4FCBB13F344844058CF9687437C096E9C20239A7949F1D6D70CB32C5D70312\ D18C6B27235876876964DB679EF5CED2D70F106C05AE97D41BD464721765C371:\ CBB7CE96ABD669FA96152049132EC6AE 23CC70A3559643E9C9401E8DFA6F008EEEDA8F:\ 73F9AF37A518D8AEFB2235169377AA701C4EB8:\ AEEDFFB4675F482BAB1350D3B9493636A0F6B4170DC850C85A87ABE5846A0634\ 7CCD26285095BE412BC7DE4E8E119CD422FDCE2C46C24777A0A4DE95181279EB:\ 2D251F7A24EECA0F700123AAAAA5EFA7 3293E3ACDA035B437F88F80F47A00C140148A52A:\ 0296B4C958FD6580F99A035BAAF87EA8B84C05CF:\ B54A852A6CC321CC2BBF99504C540556E2E3C282D4D40F097E64623415B4218B\ F945B103E2C146FC27AF91548FF5820F290B31547D2B53A0268B1886C3D98E8B:\ D1B43C29AA040279E0E9BCADD74483FF 239AA6B6496A1B17CAF7EBE841AD4D305F181D0E6D:\ CDFA4BBE476B7359BCC50CF17B70B32AEF87CD93D5:\ EDC17F6E1CF8F2BC275BBB35E53A178CCBBE2C8F9738A41A35D208660D5A7E8C\ 1BC328EF7C77653A067F4F2A1FECEBDE4C2F8255F6506A8616AA528755D24F83:\ 0FA23364740B89F399AA68F14B8529FA 730EBFD04725B43CB168EF773D588DACF67E5BED6D95:\ C32B428F3F2B3414306A0834B58BC41D17BFAFAB27C0:\ 53F45699D43A9CCFAB5394935CE6B12A0A55B03E1E25EDD563DCC7C49CB364A0\ 264400AA9D590E323AC79A1C6089A8BEFB3A174D0C648DF994E204FFFC7414C0:\ 5EAEBABB5548E2C7EFEA4D0CD5797583 8FD9A731CC0E7B316FEE1C6577FF931B392CF414518DAB:\ 0DA66DE3470E52CCC1D808EE0A1619C07163B4FA4FECBE:\ 8001E9D2179684224BFB8E427F90926CF2AD8AB9E52E6E9EDE9FE3728EF40DC6\ 55C805CDF8CA632D3E432255AD41B05013E33CA450251B96B157321E5EA8C1AC:\ 6D562A8DE34420965FAC9FAF45EF8E02 1204A2BA158F123A3EEFA21042F6AFD2045E87D92C31C2FF:\ 8E4CFF694676E7425FB42DFE77EEA7329A220517F94B1600:\ 0F151257A51F8CC61D52DF7C5A760E48974A74E7C8DCA5D7143DE3C1B676E642\ 19B797C53930E2AAE570FF237AEDD9575E85DEA692B5CFE33AD7B31484EFCC5E:\ 65F157992CCA26529661CACE1273C0E7 4089DD27BC860B16652704D7F4A9F76A02E0E1B672A7AC1CC7:\ 060F3C7AEB4BD9EBA297C677DD55CF2235BE25AFC0C9E3B2F0:\ 602AE17A8224EBBE7A6BC7FCD96EB32AE889DDC6BE690EE2BAB6A61CCCD84934\ 097787103551C04ACCA31718F0999E578B0097D9D1B8C87A6F9DF6F9824DD9A4:\ EE18423DBA1011F590090CD015651D95 BF8AE22A658F3ECC49C8CC43E35A5C36E0E60BB6C430435EDA6D:\ 2226BB0328F5AE872ABBEE02FF27BB60D976D8CB0F6E41833E2C:\ CDCCF36103F76D5251267F0747FCD883CEB1E04D6A6279A9785FCD1F5017EA44\ E0C736484D36543F2A992C12767CAE20F5FC73EAFE0EB06F2BCEFDF8B2E9FF3F:\ FC9BF0B209F90435C99658E1FC6C94C5 AD78007337C9ECA5F9789F0669B7FB280178F42D4EC87C07129D15:\ 36E70177507DC786A179575CCE35D8EC85BA8BD331C69718EA13BA:\ BF053E1B82F633A2CBB8D73AC717F114D56F10612A4BB96B102E4BD4A5A969F0\ D79AF23D3F42DD80592D372A9D63A58B825B098BA4B1E496710D4A7FEE9E15EC:\ F655CCF9AE1252B0244394BCD0D1A93D 4F585C2503E05A292529529B7B1B9900553A27D0B54EB7E311E69B4D:\ 7A13D1E088FD9D2D6BA28F2627A629A2D9899DFD74652A2EA85F3F84:\ 37AE23E7C14765CDA22D97C932EA602FF45D5EBD9C0B6892AA8CB8F41FE769A6\ C401974FE8B8DEC62F3DB31C8CFCED2701C6153BA0C850D581634F89B6B3979C:\ A202C063F41692F239E817140522EAD2 D4B346483D1423EBF0C37CC02E012B71F942A93FF81600E7CBDF889C5A:\ 64D5A716381E079CA0D942DEC2CEC99E393B41B1FD7929B373F43F4348:\ 26B1E4E72DF299E7ABEE82B7D7B0E726DADD522C38589DD8679328489EAB8B6C\ B89043B615331559EA181A2E2B5F7A854C20A6703C7E07B2D002D6143812EDBE:\ CCC952D38B9B7028EE1958102734CB56 6E46752B60A968DA60CFB3D3676CEF16E3D5F79EEA8D16CD27CB5A38CD9B:\ 585DCAC0CAE15C1FAE99A282740259A7A55A45F4435A146CA5ACC433124D:\ ED3749DDCC889F4C8ABBCA8052112B2CB8B92E4E407C1D54281A77499B6D806B\ 3F908358AEE4B09A2809D31A2E27D5A3F419C4B2B282BD4EB084C7F926F739A5:\ 34DD22F9ACB18CCE540C370B332E7FF3 47130CDB3F935DF1481644E3C658302E633D9D37A7F4710DED757E069F0596:\ F303516195129D801F1DFC1DEECCEE47637149AC40233E40F43FA5CA6DA5EC:\ 97E98A5FE136E1F8B339A8C1F1F826779D7DAF3FA346A0B2C5F84AF58CB9E4A7\ 5AC32645A021A4F3E2B35BACFB01C5D5CCC5AE530DB839AA53B426E2C33F6F04:\ 423A6F53B3B3C42E1A4ECEBBF51084DE 600C9906025E0AD59334C97947099E0BB2A8459177D0DC40DDD7AE343FC68BC2:\ 1D0128E8306E6300506221FCCF90895E537B9B520603920B06CD7699A9557DC9:\ A9B5B5F8C41DBF50FC1F3D38B1D707CCC69A6F34D5549867C7C0A4C6A3DBBBE1\ C8D404CCC0B080F6E7897442460141D28C6622D67DB30010F59B49ABF1E9629D:\ D76612D0ED6EAFF8DAA44F020F31AF95 9CB7E4FF0A54B62ADAC4420C0DEAF248EA432A657445D35543329843723797C0\ 74:\ E1B6FC1A2D707E6F174736104A6256385DBADE3117B9F3F53EDA77D5B93FAB12\ 96:\ 93E92AC5C312CE90ECF68001F76839BA2ACC65C00FEA0EECE17614E2A6FE7EF4\ 9D4FC9FE7518AAA7BD8B634D0C8FC0D8EB4C7F0FE7A3D0F5FE1B3BAA0316D3AF:\ 28260B5DDAEF8184182DCC91B3E5DE82 94D5CF74985CF4504592242E956102237A467CB55B0095D58B95CF1FA9950106\ 052D:\ D163461424F606B44ABB401D579F7F229FB5E33F7C816E39A1C32109DBAC2DD5\ 0074:\ 938CBEA21DEBFF288C30F528F1AFDE4AC5432D391B68C33F4C9035D0372CEC8A\ DE5019DA1EF46B3C5DA8C526A39665C2BC42075E992CFC50E855AD1A37CD3B2D:\ 4978AB021CFFB63DD7BE72FA36524B26 A4E829AE491058EA52F7AB7F21C77B72008DA696CBC474D1361BED9A000817EE\ 89DFCB:\ B6832399C95AC21450224E04A1B7809EAD1AF6F70DE3FF64CB508200EBAAAF76\ 047167:\ C6315E81D91E73BCD60B0C6F1F579472A9EC6196243046DCD06BE28152EE4765\ 106516B43984CD0C0EB28A82E9AEA038EB0F0570D438CF95471725D667ADBAD9:\ 0B15215597147F6DE6276713B264EE13 E3F4F426006738DA72F7D9ADB5FB1CDB298056874C4653198F817F3C1214CAED\ 6CEFE9FC:\ F41E10BCD2B6B8D663036FBFA9456DD4C4FEBC9F8E23CBCB128E08A492E68357\ 4A1C3806:\ B678F7F0A0EC4248D0FBDB133F38535E4DB45DD6C9A041B66E6968E16C2C55F2\ 6DE5CF535B952ABAAA920DA2FD792FCF9F7A66CBC4A1308E47E76568179FC929:\ 96BD2E9E8DCC0172772762252F33183F A12AC58A2DA1E8E46F2802EB33EFA0A9DC49270453E580319229795A0788AEFE\ 063E6D4372:\ 3C5A2787B8A4052815164BF3D479E4ED4D1CD69D98AADC18596ADA13C67713A4\ 8FFFFE9F90:\ 12D98553D28D31725ED5B9E8543418EEF9F73F0143A2EBD877BD881BDF029C3A\ 16D8A61B297166D04B82505D1111C600E79AF616770E5B66A68FDB09E95C169E:\ DC6B3F8FDF82A574D0E5462CC67453CF D6589A4DB377CCAC9835C08F5080F3558ACD9694464CC398D9C7D64C27473D86\ A8498586A22B:\ C617C6954F649C12E23339000AA3EC4383CBC790A74FB33186ABD1E84B2051CE\ 80BA2107402A:\ CF73972F2996A9B0C436425930F25E3EE12DA4287F42939493ECA8A63761F950\ A4E604F0128A739A0D3758FB5AE9338EFF5C76817C880C8011ADB7AB6EB6F24D:\ E72CB48562C4E43D4D2192E3F03F75DB F7992231422C1146A7B033F21487BFAE7AA87394EEBB89AB94040AB854A7449A\ 52E8EBD10EF5D5:\ AE28F8BDDBBC049D70CC0C963A946473B979E924EA333849365230952BE227FD\ 04246FEC526C5F:\ 70DBB4B28ED1F6A0C9B1E4179B77A40F12EE987ECC0B68525AFC21344E57B081\ 414D3F4E48B23AC57BE687026A064DB122413178E11BE6D0AC831BEB78BF6DC1:\ BB86043B9AA9A75A24BEADD4E6792DE8 2F5B06525F44BB2B66BB254C5B0BB32E3E4A0326D002799752AF95FEA3F26B00\ E23A098BAA48932D:\ 3CFC16EF31ED7BB13DF8DDDB6259223A1B4A3E5125564B9D53BDA6E3ABEE20C9\ 8E11AC62CBA200EB:\ DB8AEB4BD5DB4E720C6FE726B16A040EE94BA1D03707EEE67D23771BBCE0C3C3\ B9904692F44D6F9E0358E1AC7B77C7278D1DE30131BE74C8F9B5A3446BC637D2:\ 39A651FF0499DFA59C6901A56FBC6A97 B978223179B1129ADEABF71892901AE53D3F9938145C20FA1E203285F75A9F91\ 05489E48BA79B7F45D:\ DB31E6F89ECD882B3DEA586CEFB19CA423C7AC3F17FCDCCA797D777EEEBC7D0B\ ABD66EC813867F59CF:\ 5DFFC1F875185ABBFA453384F30BFA9B16966D5FCDFB55138BF21A9D06F6F8C0\ 636DF1E9700A785AD6327D553828D3BCD63653EAA4D1BBBFA8107A43227DECF2:\ DBA11286EF4C39350DBEC5D2A933E26F A9B3BF6928AA42B50A6682BAF9A8BB6D3B37910968C84A41E5B74B26B29542B9\ 927A27DC9EE16A826018:\ 062DD7B2794B999AF7D50FD542A94B7001531D679DA332AD48F27AEC8DECFE1B\ 743DAD035D5DFC248DF0:\ 80E54D88EBAEC574E103E4F25563FFDAF5E4D81220D9B85D3573806E03417F70\ 86CBF1B166D0EE862A0A4EC490E6C6C5FC2F83CFB4181F41D0A453DC2F255F43:\ 02FB920EC7B12B308979408F416BAB73 0D8AE237538061D90E8F152615A97FE1D6F70313B1EE8DAEC98491529D64F4F3\ FA8C533693E8259396ABAD:\ 433B99CBA9752A78714124BA2A64F5A0D258F6686AFA54F2A60E80061EAF325F\ B5194F119EDDE9D35D347B:\ CF4B05B0B683646C40D1CF14F0250948C1DAB60E38772C223DE9D8D82B2BAF05\ 7FB970C6E3A46079AE2525DEA66A121431865B3FCDFEAFDD1D7B73B3E70FCE71:\ E2A45BCA6618C4D926422BD2F564EAEB 2534EB81B8E5570D4A046B44B3B98FBA57B076E05C868086E1B8FCF70285D102\ 488684BF1081123C0D31B9E0:\ 409BC2D364AAFEE1A081EC84A86C6B1561F65E041CFE851A6176448ED7D2177C\ AD56556DF372C5EC6A5F4C8F:\ 7CCC358E0072A30AD111576C52B5995B952B3B5A9C51664A7260E180E5EE7556\ D3816E376E92EC67CEE44B2BDB16AE1377553F0BD7448C9E8F863D769182041A:\ BE2B67B1154A7B6963E3E0591421135C 4AC5B53CCB2D1EB7C06FC055F9F98D3BA2849733356F1DF0F8469136B76D0B28\ 4695DBC137EEDC3498A0EF11B9:\ B532E2C54D766A7D1E52D9987423E3A91F73D15BAF7A9F48D7CECF2AB0BEA3F7\ 318F1710125F994333C5B95E90:\ A8C5FC35D228348F7D3B4E829991D1D84101403791AD06C394492BEC0A370B02\ 479E9C3F1B05D48B42C6A0E8F53FC042EA53308E003E0F1B5888AC8F561C3181:\ DA9761496B6C239000EBD8ECC8B4FECF D520EBEC3DB3DD896EC62ABB73A83FA1C1737489027B899B6DF710E059C83C95\ 8308DE975C842135CA5CA47D8A31:\ 0C1D35A0E30671AFD032C1077EA17AA3C27AE0E995FB2EA86C784E2C9F9F9814\ BE6A0082B0937734A8E920663893:\ 03A7C00B80FAB58206F8E259ACB9465DB03A4C9ABE7A441C6B773CBF0520C597\ 98D4B869EB9E14960190968E1B2140ABBC6A33F96133371A963C48F92A05BC95:\ A995B2989E68BD0F03630FE07F6995ED 44A109A07472C7B6FFC8E5722476F8FBE1FF51E054290EBA3CDAA59748E2E045\ D0254AD475EBC722E773A7B3D8E6E8:\ 4ACE9B6C8433304C631B20D965EED18CEEFC51C20687C7EDDFDC2F40D301BD16\ 2177459D0491C6EB5D6069A1F787FF:\ 90A1BD357146D7D0F4E5D667C5A0D714AB2B0B34F97B9C58664E695347A9A845\ 8AF655F3C6CCF70B5145AFC4F7B783BB92EEA10ED0E187DBE595CA1803799A4C:\ 3A724BB5719BD11F993CA26AF712ADEB 3937B23B14007CE4ABB0327FCCFBC35A7ABB3D9B7F7E7DC8E4A0A170D3F3CFCB\ C6C02A7D3C39F664CAA88C7618F99C23:\ 24FD61C5A38DC471B0A4F8C262AC142F2F927DCA9060534AB1D55AE0F4D1BB70\ EA3F96D6974128B8F687D4D13F414421:\ FE6E413A1EBB13243B96E3FB6044B6E19101DB311FC854C946B5DC8A244D7B03\ 68C8FCE9AA66AA3A569F391EF4037C9BF4C19A7BF403095FB1174710EEF9E076:\ 8C8C7624D029E0BB9F8331496B8D7136 FF1573C198D24FB7A0691B8173820C23D2F84A471B1B925B67A74FE91A17C531\ 750DA50749CD1920BC10E32833BBF0ACFA:\ F76D6A07E1960422CA8478517509BD11E68128DD59A4092DC1D10B09742F35E0\ 9142463439259C5A136DE33DBDCC3C509F:\ AF358329646F289900BE6EBBDB412534186C0C3997E614C75476D0FB119C80AE\ 42D53B0F295A2C15141D25F3063934E4EAAEBB50083CA2E905F5DC4209619DF5:\ D5133470ECADC405613DEE0055E6B77A A2F02C43D4B9159A23135DA83941AD6793C58E41D1061C5E16B87F0678F6A2AC\ BC45FD6BD7B2E807F6E187B80D43A5EEF0CA:\ 54679F2C4A14C003D9B36DBB442FDBCC549A89F728AE045BF56A7F206C83BEF4\ 7386FB383571C588E18F1C4C363B954C4159:\ 2892CFF943237F9E73CE5941C7DE9E5214AEE06B5E578EF25B0D3345A7F0F0EC\ 458A658F7F5AF65031D37A20D9B391AA8FB94B7713F347AC5AB5855A6542F0CB:\ BD1B84BB5053F74D228E2782598DD29A 243507D287EA4EAB58BD77518A0CE1B55E007C74CC7EE5056329B2B860CC0558\ 41AA7D331F16E262A96C2F8E994A28C0181ED9:\ 4EC40146A26B8FCF4A3AADD1B3F6526C8B648913C77E96192BF447C070DFD929\ 7A054B77FB461E821FFB092ADDE1189B69B6DB:\ 4FA106BC235B28235DB9AB979E7F71664A7C62F417A7330067299E705A76D61C\ 0BF79EE9319B8C1FB71C2F2F37A0C7E024FC6FA17F56A38ACDF7C0FBACE5B292:\ D18F1AD318C22E6C05912D9AEABBB2EA CFBC2873013B2B02FBD7CE364C76DD5F2D4654441EE3DCD9F94293BE51A8F8FB\ 953EAD403476FE61E95B5741D3AD81DC7405AB52:\ B6C66B387A0105C4265D156FBC893FDB474304D3EE08AF0FF97ABAF63088D6A2\ D7B9E3705E656EFF0F895C272121DEB9E2FFC36F:\ 6D681CB65CA41C05CFEC4960F3F5F3F0298872A95D4F975C4B6851A44F8485BD\ 89E0EA5C0ACFEF92DF354629D1853F965A8CE67E6C0B8A76909116895A80E852:\ 815862ECF3B4887043C666145C0818C5 82DF1F023CCC985D6206C054B7615BFEDF24B2D1467A801A7871203BC685C0A3\ EC1C5632FC5FAE7124CE06CC3EB62FF6751730A611:\ BF743E9F687258C81CFE899BFFA0B444F87E04C9C69448FD5344456CB895CF61\ 09847A416F3DBEB36532D7A2C80D817287CF4E5ED5:\ A6E4E6A72DA0E0FF1565D455602541F82E48FBD2A0C6890C33F260FB0AD7DE92\ A77813F5616126B361181AF76E5A6245AB51DC7B6EC07559872AECC439F0EA1C:\ 9AD3179B5C322FB487CFACEF57DBF199 5C1AC7B74D982C05CEBC5F59344F0B93B9ECD91E5E37EAD7B12B85F1D2DAB7D2\ 2CC0DCB4B8D8D98EFE072992C511CADE440F908642C0:\ 7B1DEEBA9C9FD78A1C89C2447B1F97ECDD6B79F0E2DA3476A9CDBAB386F17582\ B1AD23A7270754F3599A52EC24180B2CCAE1CC2C50EC:\ 0BF38567AF2104AC31773DA0F604B7D158739B09A0BF254A3B10A5CF5760B261\ 945D8E97D4F69B76D518E811D5CA8E9B0254F6A25D622337CB8825CE13ABFF76:\ 1BE92DAEB9F5905F079A53A2964A5508 BBE9F28370C9A996551C5C19212305774B87222CE6E1F6F99725F4FE8D4E8403\ 35C38C5590E11DBD94AC47FB7F62107D031ED419EFDE6B:\ 7F8F9B5C3C7F69B2A484ED8C064255113A923052BE94258E1BD84096310A354A\ 27AF788DED9356966EFA62B0D4DD93F900D9DBA8FB400F:\ 241EA8D3BC2D33DF661568F4C44A34C4B0330DD870C70D6F685B90145BF31655\ F0AB4286DB11015BF85BA9DC9317B50AF5B277A1C1A39694CF6AE39CF61F68D0:\ 853CE9548BC247D41B6F38646F973A6F DC7C88B45E65244DD6F8F3147B01E56D28B616368F0CBA229710A516D6C82390\ D1A7B43857C7F02AC24770A47EDC17A200199D1E9A275501:\ 3321E398240903DBBB79A4AF2F5793DAFA07901E363FE4258F26D9642EC3F9CA\ C840C0795DC7B2E70FA5EDEBD2800ECEC8ADCA623E8AB35A:\ 515CF69DDE4E9F2B8C7265370EA11F1B676797F387A6A8A2294FD1B5BC7712E3\ 3D86BFBAA422AC1A9C5B547A863ADA9855F5FD46CEF9E5A7BD223D9AF88B7208:\ 52CB2BA31794B8156F37B26C7B202090 6848311D2BF4EB014DC70D6CA324E920531651E057E497FF16F92FEC1B34AACC\ 547BA516C77BE2880EA2C47A6160784DF51E752B8198141C24:\ 73C7312F7DC845D40D4ED52DCF54CC0DDCDFF58384421BDA6CA0FE40DA2BE106\ EEFC6B0C290003ECD311FCEE924C4B58F61A342E3E80C36A0A:\ C45611B1632B0F5B5640607909B12F29F2C750B389FD497B53E2FA52DCE1F47A\ E3396301EB37A9939FC243F5C30DF986C713F4B9E008740FF647D7956E9040FB:\ 85CBFBD82D058BC24D6D4AE129D59199 1AA23FE9ED1451366F7262376813FEFE5C0F9E6F1380D4FE1311E78E5820A43A\ F932181A7C7B1FA4DFDED6A45447FADC2D853DCEFDBA64CBEB56:\ DA1680F7E9504E44239A8C2CE1F7D2DFB1F0A2DDFFEE822A9FEA7E66FA14A6E7\ 93A0ADAAD0529272BF5209D579542B5CED8D1EE2C38B762FE50D:\ 597457763DBC8FEB019C7C950FF2BBB4F912EA2878F7FB3CCDE8B5DDE3B52B9A\ E8CE8166257B905DD395E5BB095D2779802A0BE02935B5D702438699135416AB:\ 5D782A2E109AFEE2965393A90578289F A3915C3F91218D64FF9B56194D8CF0733C97BB297C08761A671E631F20F377F7\ 0088E5C9908F28F79573934050ED744576DDB1A20DC7C0B6D9E825:\ 3AB87C3CD8EC19EC119E8900BCE7C12565A0BF5FC436B8A708687029E188D152\ FDA2FD5408DBBDD7C7FFCA86CB08ABFFA50261FCBD40BCC984874B:\ F3CCC9182D83F5F87A49D704069266B2F72558C677AE71C45C16106E177AA820\ 5DD6DF212B14462500171832E694C3F7D46FF6A552FFB3D824083FB6C9E79C4A:\ 5F6E60F9C0DFD3020FCF185ED4189461 4E81F4349A7C9185352FF1FE57719049CE0254621C4C1AE4E5379C318F95AEBB\ 9F3808BCD2366D5FF0FFDE14372B99D8C0E4E5C923CCF744F859162E:\ F6EFBECCEA54D5ACA2231864D991218312C56BCB326367F18D0F881F42D11E50\ D58D2EA2C005C716CE4E4B7BC9FFE6E2C929F56E16C5721EBA40F2AA:\ 3CDDFBB2D5225D35EC2581BE66082AFFBC8E9FF582F7D1FA3D1ADFD053CF4220\ E0D21F803B1A5CD0197E134D117AD04C1BEAABE446F3C62A9E1DC975BFFB3C86:\ 679365EA67280B9E3A4C09806525972F B85A036B83B7C4FF91CB7594570A26AFCFEBAC804B03D594F6B4AB5848B12D65\ 1E27945F7C618A94A4009D5D952F06CC900350F149C906275ACC6ED0F8:\ C467DCA8030C15EB8FB854C7A7E94AAD6014E431AED39DE299A19A2029A5AB07\ 089B030ED15C837618958C0C2DE842BB4F71AD46901F6C3D0DC543BE83:\ 3FA51F16A65294B2AE00B5C54A4F50B93B33C74B8A3E49BA1ABDD247B003F831\ 8528C53203968C2031D447432EA0265053CA6CF68E3A8F24A2790E3FC5461AE6:\ A2AA2FB62C3236218015F9C276744187 6612182A789ADD553AF5490542E4F86172E1E52230D68F2AA40411104CCBE58B\ 4F5DEE2EAF0663DA6964E4BF96BEDD13D38477B1963E54F5F704ED46FB0E:\ 28F5EEB48A13E47C117C85F3FD66DF79FA6835F6633AEE6F02745CA6AD639532\ 2F9702F174487825F577934D54EADB6EBDBEADDD708F831ECAA6C2AB5862:\ FE57C8D7369A1FFF7187AE124FA873C732A4439623F53D5B3D14383BCD48A29C\ 2B80F6A617F02407537A1809656CDB008989C44590C2B2299B608F5085BF1FE2:\ 9D8D82534C5EA4FD304980B1382D54A9 4FAEAE77D04AD3E836759258F437F8978958E210E69DD8FA6919C0663D654FD4\ C58C4C59B1384469576ACA2420FC912696F0611AEA03297601E433125DF809:\ 318BF89443B7348EB32F1DBABB5E1ADCCB436E3E353088740CE729E14BC6848C\ B08A602F53EE1F21FC03D868891A537B805E52B8B4979E03AB97746616ACAC:\ AD3703990E0B3643EE0DC3AD77C1085E927E0F9A190CBDF3060681BE7E0B25E7\ 6AC7D43495CF5501C9513F8FCD22248A134A9DBD0295AD9674EEADCB149405C7:\ E07166F0400A8ECEAFDD70E2ADFACE4D B94FF2E1D9BF4D42767047EC3FA55A84CC17C153E5B437B9668C8AA663B87B97\ 78332DF1C7686850BB846205211DB4D6EFAF5F4A4648268E098D9C0B8B87016D:\ BD88EF97AC43746D688638FBBD64AB6AE61E40836B7847037507F67AA7DC00C1\ D1E2C09BB701933B94449DC952B146699157AC02D64F506DFEFB2A0A93DF8C3F:\ 99D6EEC22AD27ED24CC9FA9CEA3F5629F62CDC324984C068F6654266752870A9\ FAF5836B6AFD88ED3AF16D39295FF9629F23D0CCC7BC591058F51D52A70E4363:\ E50E8FF77980A319D57FE313E8BF4A66 8A7681D3D79C9AEE5501FBCF56F4FE95B97DEE4895C3353E5ECBEFACBEF0DB93\ D2B910671B60763CC7A7D3A4B8ECBC740E25BD06A8AC2D9243D0CA789E7680B4\ 23:\ 90501B65D55AC072BF345C449F999BBB0869064B8370675AC97E23DB3F393E4D\ A98815A23AFAC4F94AD8F947090B6086441F6D394EFBB24845DCD941B98C17B1\ 70:\ 251E92FDD914EAD37144154697D3CDC0E2165FAEEE4ACEA216154E83BACBAD25\ 191A83BB8207F7B6C69618AF5C07DDD6A7F699F8EA6D3868DB38E2CD6E64392D:\ 664A67099997F33E28617EC42B758767 1EFB114DC234795EA397ECEC44DCCA39B40D6AD3A109D86033CCC719A447A7C2\ 66D5D32E9A7EFD5A1DD29243B2C82A90DED0E847A42A03A31F58A9D6AF12B1E2\ B0A9:\ 2517175AEA1CB6A6E8458CDF2F9C03BA342D3D2E393D1F4B0B38BA716EF89E4A\ 9816E6D5B0CE76C9B578228BFEE1DC258CABF7B598A3AF03661AAE55DEE8D0B7\ 91EC:\ E405257B7EDBC4A3C23386FEC7C28FEFFEBB62A295F0150216A53D55B4AE3A44\ 06BCE5AA211427C0E93E3FF196BB57B985CF5A5E96C925CC97B659B36C5978FA:\ B8A48894E3651832B555924C677351AF 4230874B7E9F676A87F3717BE8A10810262BC43CD63977978D433FCC74AC883E\ 06E7FD2BD6DB3F7B967DEC732878E580E55BF49CFD2535794779DA4BAC5A49E1\ DE301F:\ E74F4C437EB7AC14D15D8622F471E85785BBBAB29E91EDD564E235ADE5558959\ D93497A2A7C77DC12B3179B48E2F972189B9A45E251B089A1FD390A8AB12D5B7\ 3530D0:\ 8FB60ABB22FF4DC7CAC8564C615B91E02C9F2325DCD6AA9FD73842F1531B908F\ C26D98F5BE709509AE9BD49B405B92E735B1121FCF9AAE3D35EA3B53514F7797:\ AB83433633A0BB1D893A3E4DD60EECA4 234A9F7E4FCFB807030F2EBC22E8BF5B13F1ED9F18A9BE48D5FCACAAF5BF360A\ 8FAF99FE464A7533F1D5F0CE9F769913E1A6D6F716C35FADEE60E2F0EC8DBBC2\ CD7B1D23:\ BA562E05F090F443867B73995EC3944DB57AF5321B5970B0AC88416D3B385E0C\ CB8D2FC1E65B9561B05D2CEC32A42CA4C793F725FB974DF417DA440D0FDF77AA\ C109FCB5:\ 4399B7D0A38243427C7289B3670464F8F98A073AD43625126FED9F58E0C8CCE9\ CE04BD0BE7227F7C49862126A4AD12B730BE3ADBD950568FCB1E35017062646E:\ 00FEDB8FD80D13375600B5A4BFDDD16E 78EBA6537E61B5FB5E0AA23E846AD8A82D5A025EE33E2B41A10A33B3D959585C\ 518AA13D44C22196A2EF155800C6A59F9835DEB84F4729D711DD67E9F904FA89\ EFFB4C4FD1:\ EE67F816C0AD3D8463B2717F6BE5380E095635B1B7B012F7341FAEF8E0DD9378\ CBDAF39280717A6BC7BE899EE392ADC6AD8B51C22524E42B3201DAC4190DFE8A\ E930543DDA:\ 68A7CEF97894ECE9C5209DDA624DB66B94AA787F754ABE48D8313F63B44CFDB1\ 6894E32322D3220C5AB95E4C41E1D92A2AC1BA241F9B37430D6C7157F618BFA8:\ F7B37973DEFE48BB5D97AF65493FB2D2 5214D5ABD972A93398C1B42F6F01D3E6EB2DA81F05B93E3C2205DC63633632AF\ C9C0E4D1FBDD06742194F0E0B4943F33DD3A00B8DD86EB9AD51B88E236567C2C\ 8DEA51535DD9:\ 5333EEAB97D891F648853CD99883A88E808427F9D55D3F9E13BD8406C61B34E9\ 492B02C19886B87A5FBA82F09FD86452CF9168122D7D01A8FA8A6CB39F7BEDCB\ 3DFE26007A3C:\ 54868B0E7A3981DC9445B3E12CCD98E212E91BD49324C5E7D05EA30C3784F33B\ 676AD02DA26B733047689B0F53120F10320AC713DC5A1CD8C1F3DDD981DB00A6:\ 5C90CB0E56FA07471F9E5CC8011ACE2D 06C8226B0B8371FB2273BA54100CA17D21C0731D136F75D1AD265C578137F474\ 62805C80BE97601DA8CAEC4424959FBD36E22EB4111E414D92B4E87D450BD26A\ 6F99ADE217E4BC:\ 239C95E80E86CE6D2E4418470D0E6A8B0FB31DBC62C525055A73E4F1CBD3649B\ 652CAA386798A60BC8FCE0F8DA943EAA8049DC99C70D95C5864DCBFF171C0D92\ 2E95B6F6B6978C:\ BBDA2A40751D51E4BFCEA4B3C182AC2EB0CF036DA11DA804B7BFBD6CD1A2EE70\ FCA18FF3E7D6284B9E129664095D095DF425263E2249BD0CBFC7F9923D80FCBE:\ 0C049895133FFA08C805833D527A1C17 2CFF692A648482BA14A363BE84AFDE0F16C144DC2963804F78FF968EFCD6D88B\ 4395A1EE7920608D09A245FEC4ED81CE208046F84D230E1679FF0ABE17C54D6F\ 32D0E72AD9672DFC:\ 7EE68A642B84F28DBA809F5C28E250D3942DA8FA013C7C6D0A917720764BBE25\ AC943041E47BC27E54E3BCBD97414679F75C3CFD6C9D5FE700E1D6721ABDEA30\ 472920AED086D76E:\ ADC43AC858C693FDE13E931DF4EF45455A337805456DDFA82C5FA473652182BD\ 013B906D6DF6453D5534C303CEDD067AABFBF76EB4240AA5B117122777DE8883:\ C3614FD41E162C520FBCB77AB47DF3F4 8A80B592D33E545DB579B8DCB75B1BD90ED588A3E924F91544E34837D36AF75F\ 6BA032D5C4933947AD375E76C6341738EF027320AEE95DDB6A13C187BE064A93\ 5D58756D100CCCE6BD:\ 357BAA66BA0464C001C1125D4F641DC9438E8EE56AAFD04C6F37F1EE70B5FD8E\ AF364A1740A32E8D0D2ED3025C2C6A17928C9408456F3B5A784B1F0D0897B310\ 5F21FC5D57C929A730:\ 59278088106408777F2CD7793C7D50105027126DED275EFD465DB3DD9D68DA47\ C22EFDAD216E508481B1467E08B934571E1C59E2EA60358423091972D62CD128:\ D83A06D830FD4DF061F8D266158CB912 059ED050E8D00B3D602B6AACE7D46745CD4A38FD6A870FC77A81FE909A86FA3D\ 955BD763C644DD5B9D70B0D41EE1BD09ED91794758FDA6E9B547A3E7C68B7456\ B4A680D673A5D82D2D45:\ 11DB33755520F3C54733FD6F413899807A4D6755B140E50D8C73AA067CB94ACE\ 55DFDEA22C576B3373290C50D2FA8C946DC27377D69E6CF65D6FB02EAA00A79B\ 3B40DF79BF43723EE613:\ DA93A3852F02F7366D9643C1B576678DFE78161B6DAE9D8F20B6CD75D51E9709\ 493E76F87D0C6A11C8BCE3378F058C44A9A440A5FBC60DBBBF5217A53671E5CF:\ 1C4A77AE23392121FFC99E9851A197A3 B5F5508E02190B1467FCB3B07FD1D475DDD3EA124169D31AD0DFCC0E245734B3\ 4839AD37C0B204363E62F922F31CEA7C588E576B7CF5482C7F95DA81F2C26D17\ E7169D52462B3BAF4E9690:\ D63A3673F958971842DB40A48D5BCF20B1C02065750A30990915B2F95F131BC3\ 04FC3D9BB330F6B10606FF1B308E46050EC2252414E439A97E13F50348C6B789\ 044D579765CE58F8B7DF4A:\ 82D21F701895EEAC47E72866E78AEF8A3D0199F250027225F33F5A4A5CE62AEC\ E808B34F8C9948B0E9740FC9649E7AD11D66DE12025B05FD60990E0976FDF0BB:\ 517117640B8C35E5172D3F968467FDAF D271157E98D0C9F8CCD732C971DA382ACB196240C3BC619DF0F50A5C0962C834\ E5F8A3DD1A9B1B7CE5606B0D70BAC6B706F720D850E8CDFE701EB760FECF73A0\ 03A89FD176DE7839A8E35511:\ EAEFBF1F37F585CBC6BA595CA7CBE2549A80A42CD24C0DBEF325ACBD3FEC55F7\ 72F42DF254F75AF75E8288F38CA6A0ED420947C8526B0FCA42FCAB2F1C72400F\ D57958C6E459B8A2040713F7:\ 7C969F67ACFFFA400E8FB8ACFE15FFB497C7568111745AA3B253478593093890\ 04DF1E681FC2D20293C52CF26694B00BFAB0AA144980942A8B40A96943180E12:\ 45F487446077B94F9A60FBB4BFD193ED BDA47D56B2ED81452387B0720C5C8F03894DA74C549E74974897E50C717C4195\ A328B9B1E765D227F207BF556FECC2B8B291FB83E925901CD7DFC71C70CAB13C\ C285D880E823C0E7A638B71BE5:\ ECDB5001C85CE86347836423724D92666FF5D9853D75CC2CB185A5D3F7F7AAE9\ 4BEFA01F0757E62C66AE8E37F53E9902931FF053A799C7866B5CEE5C37D468BF\ 6CFE040D9E2546107C50425901:\ A16A48F88A94FF148D8CE7DFCC6165850FBDC2D218C4D7B5F3158B6D1E82DFA0\ 968C72F6D92635C9951939ED0C001700EA386D5F603270FA8F71EF1ADC700E76:\ 6F229479AE496EC175A4B6E2B0D15269 5CCACDF79AE2401653C5F849D4CF93E906F0087E0B22789F3984D244E1EBE94A\ 9BA7200364AFBAC2577513ECF320CB80767A5776CCAF2614B73689910CDBD481\ E272293121F4874702BDF186FE83:\ F649D325261C63B0A0FDE9423F5946B42607691159B363C8617E96CD9604F3B2\ 16C0524DFDEA001392CEE80EE08171EF0743E3F1D1A43601D3A74D06E1625074\ 06DFFC75436E7579D2A821B2A0EC:\ 5A4930305D8D82633AD8DA1766AEA6637B75620AD0BA8AFDD56A9C5E16EA1706\ AF396F41A95FC6028AF36876D9BF447BBDAFC53B172358FFAB3F56CEDF1B9F8E:\ F726778E94B38938C9812EBEEDFB0B03 74369DE551FA1B9E11CDBAE0B6BA6001186651EF911FBB16057C407BB41B0CB8\ A41561A6F27DB865669D388CD3ED5D973EFD9C419B1C57F7783E96032313160D\ 4CDA67FB780A8E3D3D050AA5F9A367:\ E6FC9552C33EC021204A1130420D235A486200073044D81432D11425C2349973\ 4CF3C50E1A984CE551F8CDAD58A78CC912D1AC1AD7995E2D90B7DB1F6573CF3D\ BD69F0CE83802AB3AE158B5E840FC6:\ DC5B30C8D64DC4660AC3C12FEAB3DAADFDB32D6933704DC99EAD9D7674376557\ 50A92F0946366591427B44A9D0B85C775C5AC84AA8F046E90997722D16B8C5D7:\ 6519A204A9F70C512C7BAA559D33A144 084222CF351556DA67ECA0573C732D6644276417B4E354DCC2D95558793D39A6\ CD88E30D1B6498E259645B6BC96402124A1431CE496F3886DCE89C254B5F7772\ 8DBB5B00EE2F72C43BCAD6DF403BE005:\ 8C2CB2FFAA5EE3698F3F6A6F643E353F15BC289A6ABD49F80CB182E486DC5459\ B9FB200EB999C183DB0FB73F7F56612635368DF4B0ED15CD3F66AB25F8D1F50D\ 667062231D117A6E47333A51EDF0899F:\ 682BF9DD19D9AB5EA5AA153FEDAC8A39E7D00068A45E2284B7A8D79F10A773B9\ 57768A3EA33ECFE9125B8A895A8822E94345909F88E32A244A2BAD6A5A5164DB:\ D894D0F08227AEEBF9C3E0B57A8D4820 69C47340932A673CE1C038C2BBF7552800E0913B3A259633D6F1AB794B87A8E8\ 3ED88AA3B2A3C97E431316CACE38436B662F83AE7A1A3E967F4F88ADAC5B5573\ 680CC16700CE54DFDEDD0566590E743C0A:\ BAC98D139459EDE20320F344A88DF6630F7CA91379AC5E5412A62350A7842B63\ 7A4E7CF2CAB9D57C072E2427E3DEA7115BA201C57931181EE3E6FEC90216B221\ 3B309A477DF138D65B10FDA75B3E87052A:\ 26CB295FDFE6C6F5BDFEDCF54364F0462BB05F4350DF3405EFDDFF3C4D151310\ 3FC9785FD4EC4635EAD09BCF481AFCAA0B3CDF3399876B8E95BC000D7CEBC853:\ 6AAF5CC4BEEAD2DD0FBE36B28ED921DF 831B7700CDA1CABED51C0F73429620EC1B4E4FD0A06F15A1836C9248B7009E2F\ 2F3BFF094B8DDE74C18AA00EA7E9439406B93F8394CDCC2226788A50D46050CC\ 060AE597B8D35A5039999477F260D06A25D8:\ C74592FBB612709C89DB77770295EAA61366D18FFF8066321EFDA8C662111132\ 7FEBBB648516F0A29C918AF6F071D22BAC307ED5B718EA614A2E6B7CF4CD7544\ E6D674B4F5B6C46A60DE5EA2CFA6C7DEE23E:\ 6F7EB9C437872599AC225B81AF4D3E0A756879FC1E28F1C73682CC1029006B1E\ BD44A387B61D902FE074D6A3DE3638C00F5FA5BC208691AEDE541CA0D391DBDB:\ 1A44D89FDC6ACE155B4BFE243F10DE8E 33789651D5555B1E0471B658F4F27FDD7AECDC0689C6E7264A16686A36298AD5\ 75796787C2583E1C2A0014CC7E919D7B8353CF17A757E7CA6453ACCF4D7C308B\ 8028BBADB91A77025E70C649FC2C04F83CD40D:\ 2F2F1BB3237E681B358610182AA49093FC5949D1F56184B73C449E9C4A7B49DE\ F117EF4EB4470742B641A5015C394E0DCFCDC615CDFB611D793E33594E8702B8\ F10390EA8EB88C8A6BD800C599F4E51754E287:\ 706B6A96E33936778E1BD03F76670296DACA70F85C5927562A871DF2BD72FAE2\ 01F4649E170EF53B3D1CBFDD8A5837DCAB2B696888DE28915A05A42B06A205B9:\ 9AE3D26ADCF9942E551B8C4507502DA3 EC92A03B6BEB1ED3778FE286D67218F04B08A5D959650F4E71903395E03EA0E0\ E8D4CD71239B11B76175124E12B02FA9BCB4FE8FE1059FF52A8ADF55EFF45DB5\ 122C4ECC491112CB322577357572755BBAB6641E:\ 17A3482630F3F60ABDA71B0E5393927AC76DAD8A4E682040CFD11BBA17F886BF\ E7017783962B9ADDC48C19B4BBB4DEE2587C88AE14AB8D177494E7FEF799B576\ 44A141AEC0EF5F94D0DAFED9F3FB52F3AE0ECE14:\ 04A04947CF609691B147C8E066919D66213DD476F7AB32CF7A0E8AB1BAAD3456\ 54567CCECF2F047EC9D231BD6F10FDE57E9BFAE2B49C83275346237C84597DE6:\ AE5685B285A841416C31F15143C0C59D CEF0348281F329EF6DF71DFE854E53586FD4B45285C4CB43A53C3DC9D50E60FB\ 61E1672BFFEB8583D347094456BC36D7BBF7DF768B3D5BD3BA6E776DDB1A3DCE\ C5FB7D141412310D0E351FD48EABC2AA3BE8C8B0C2:\ 3F69A54E80D8B2AF5D85AF0347A64ABFC4482F41BEF98130757E48181EA41F7A\ 51D4BEF271B689AA66BC05AF745F9E85812C5093190DFF5B68C2C5623898AD60\ 4094DC589A1875C29605B92524EEFBC86E2016982E:\ 750E96CC7ACC6D0C1DA571E789A06C6DE785C8EECF85D8A0E603368FA5CD85AD\ 1ABA7F2E637324E5049D4C4AB34755AB1107232223CA6EC5DD79EA8B97910CA6:\ 6C5ABD43FC283BBC97F077A652EF5E81 82EAB935704E1FB44EB9218DF21EFEEDFD13B43B4014F03C9CD455E325851158\ 04A0ADFD1CD1D8E77439B355645807EA1C3D16187F6F64EBAF06EB653CFDCA86\ 950F26E92B284EF33AB0F8AC41324D0908DFEF079E6C:\ 34B61080088B2E6DCEAD63C9862F7544CA06B8D79F5A7F646663D040EF680D89\ 30521D1B0A798601365294B22C46F61EF120BBF9579FB9078E0194488CAB18B2\ DDB299C062541EE99F0DAC83E33264B5333DB8542178:\ D9998134F50ACBD6A3420AB7A4FCDCDF88C23F16DB056E96100864FDAECB8137\ 748145886DA377A655A24C4164DFA69DE49A656396B3FF2288B912BCC755E0AD:\ 0979C201CC8303344E382C4C569D031E 67FED42EF9AE9A0046C28BC51197B0E2E545C60506D2109CB2F6D7F6BFB638F7\ 7FD2AB8D53927EF279C71D7BC04AEA3D39EB5698CEF1CE0E57F91D8496D001B8\ A2F077EE7F7CE7B687D7091242435B6576D4CBEAC7B03A:\ 52BFACAAA8D0DC7725BF5435AB9260B2F7F073CD82A9491497154BA49F86C821\ AEE98D6D8D8EB83C26349C0E9DC96CA898BFA28EEE52E5531267E7CE660FBD88\ BA22F8A493435ED4C2F4486F064EC202BF76926C674723:\ 9D9BBEAC0A2C8E4795E73B510DD55CD2E720F0D1E9D0118E6FF630C7C601922D\ D977CF0E2730FCD5E2D8A4BEAB437EE498B957E1CC828B59F66BE4BB60D3B264:\ A5F56DB37AEDE6718159969D08165A76 D72987295C9A5D94E9886D46B87C7143D092492C63EC64C3E21965E8CCDAD257\ DCF359330F96AB8B833FB25913B887636B9577F8B2101BC53409B8F6BB504FE6\ 2920242ED521B9A718AFEF485C1E62862FA83F8E28E91BF1:\ DF342A4DD0BAA08CC0E18947B87EBDEEBCA73020CAA453EA3E84E797101D9057\ 865949B7DEC30CE8BE48A5B5B5E833732F1A8949EAE503EB4D2C443E1C5856E4\ C952ECCBA6AAB538D30E53733CA522B8486D545DCCD7FCCD:\ 294BE26313DB83B29C4B8D9C73CAB785B355720988387D5B228797B4DFD9605B\ 115F97EF2D995CEC01600B7CFAB6A52091413D59575A2C2B9F51A287C77CD824:\ 091E39C65CFBE2F0AD505FF4ED63D143 D341BCA45D3074B2B3FAED471D5317ADA625531F74A8A873DFD7BB369827466D\ 623E5B43387AB0119634727C4602B35E0DF357186979827FF5A683AD3F21974B\ 104F59416EA0317F911416373328DC9899ACE1B9E83D62E66D:\ 012F2A625D71B3134F02C097BB85CC5C51A58CCD1B99D95EC008E5A055B6E096\ 2AF2A560FED8948C72AE2E63CFC76D8AFAE95AE849B2C3BD43B1689150257868\ 70DD16DA61B8E0EFF025DD0E68AF89F26067F1DF6B0A81310D:\ 851867621DD8F9DF3FA677494C2CB7DAC785F0ED8CF176BF08522D765408E42C\ F01504CA8A93D38131F26A3AFFB3090312D60EB378D56AF2A06C271B7210A492:\ 09E2389F3E337DCBB665CA5C34D4B46B 8A243340AD7968077509BD363266DB666623A4E1BBD2DAAB6DAC8521971D0E93\ 247ADE3D67AF23831EAAFC9403FC4AFE839A6CC9216B51568D3D264956372401\ F7170B5FBFC0A8CB77706C9E35E6F80A6CB72063019379A4C235:\ 18706F504AD99D5B571FB0F6F31F5500A1EB7D46D766601E32E6FC45C094EE5A\ 6A1B8F7D10945E841428141A011FE3705AF7D4DAFDDE51414196547E07233140\ 95D2D221A57BAEE5AD50E4DBB5AA09100B0DA8D2278474050D66:\ AE3DB29FD329B622362FF2A2C42E9728E2375896A4C157E45779E6E0A0DB280D\ B9DDD0052B64190F7A7A9C00F5ABBC58402FDA12137833352CD9CACC6CDA09A8:\ 21AB5C631123C94F3BDE4A60B9F7E4B4 EB1624A74A857410F3538673C4D2DAC096F5CB949189984EE11848E784CFCE39\ E96F60B8B899B647147D41C042E15F8250DE0E1F452F85E646B83D690A5B89A5\ 27ED998CFD4C3781CDFC812811ACFAE0F1425E87488634F8C474E6:\ 351D90C548894DCF668AA88041F06921F4B46907C250DFC69188C10A349CFAB6\ F2659DE30D446CC95119B73FD8971BCB19C25870BBB8EA51D6FD956EF9F48EB8\ 428AAF3EEEE5C81BE2660EFF821578B99FF23C84A7611812B40282:\ 67748D70D9D72E6AFB14C2819302D08EA6F1F23EC8ED0B75E03D03BBFF0C6534\ B6F0F5E50B8707E88B188D60529360026CF4BBB803E725B602F3E8C29EDDEFD9:\ C8AEE1890BC2ABFA6EBFF88BD0AB56ED 629181624FF121CDEF99AC7DFB9F702FB449DE66D55EE3502CE7FAF173FAD167\ 7F5FACDC888D91848F2786405FADB0CA680D1F94491690DE4CDF83EAD2173557\ 532B004C7D9922AD49183CFB0267D5AEBB57CFA0BC2955B38CD03C98:\ BF0F45F87DADDF20472BC84B0D7D3E9EDB92E26B5DE9CC43450ACBA61B3F9375\ B04F507C6DA921CC84C77FFB221BCBCAD69D57E340ACE5638F734B95C0DC4390\ 58B294A62E7FA80A5EE46427642925DA4572B8B9E6A776651CC35F61:\ 7F807212FB82AA3373035BCF85E1CF33992C660A3AC0973A42D8A772F5B773E7\ 9E9FF4AE2AEAD3B09F69415237DB31F4A33EB45DA361C95281BAF1964A791740:\ 3DC98DD398E67B7F91F55697332D8BBD 9C09CB230F1BA4DCD7272B14661E7CD5A6C0C5B7FF3BD0BE7BC76BC6149871AF\ 4B5F2A0C4206B9D1EF68EB0F7E162105B7D50AE986990458C0721C9C9B8B3344\ D232B393C0000C37CA01D6B9B854F49FE3CDBFD98BDAEA96018EAA0F96:\ DDDEEF2D8A91835CAF279FB19AE5B0F73DCB79F20FAD9129E50DE85EC29398DD\ F5F9DC74DD5B14A96C98F35CCADBDE84FF574A974969E6904648F0D07AFDD36D\ AE2B2F205E25CA3B083456F5B332D45C69E9CCD96F88B90806BB3DA79E:\ FBDB72BF24E41373E79167E690C63CA97B8E6E192BF257104548D0CD1FE75AB9\ 7B0F3C5AC6ED97B29D50D1DD50EA0D6999DF74A5F172FDDFC1AEF170BFBF19B2:\ DCE436B817B5ED491A1A20E507D73F98 1B243FD52E890B65E47EF25CA9569A37F64869FB300A11EFBA3D04410DF1BB17\ 5B60A70F3255F45F8601EC2F9AF009D40C4D72E1BD295F9DA1C83B6D51306033\ 89E009064901300ADC5665B3BA2F62AC28E7C81E2319361FB4F2120C2C42:\ 19464437BE6486CDF6F24A75A229E59B08A640B66C41687B1246A84EA6F98FE1\ ABA9AD430BE7D068D9BC59CB5DEB99EF69103A960D3C4E3CAF9DC3FCBB6FB61F\ 7F618901E6885842BB8784DA1F4F27C6E951B5304EF257470E6375D92527:\ F7F61A9D1BAC2441D899552BCFBACC6420A8BABD2D9F2380BB74872E7243EF64\ FB72185FD13B6B8D452AF2F59E7511662D2AC085B870B092138CD8625D3C54EA:\ C2E32CD00AAFD581B8FD1E5B0768144F DFAC82EC8594B2E18CB607ACE5557D42E458EDDC939014A0A6060DDCC862EAB6\ 686E00093965DA2B9E5BE49E2ADA0D5568C0485F778F079B1CD732575ADC5A29\ 97BBA8DBB4BA84554B82434EEC14AE917C893F18BE69B02BE06F7822B90C0B:\ B7B20B0D001B18707A5E2D9C99DC0A0A7AB212B80E39F04F00B9BF8CA3FFEB05\ EEB3B227FEEC1C8F5B1CAA66F4A34CDC3E63758C32CECCBCC94B075719F7327C\ FC119DB7F19F598A9E607AE1A05F6EE6E19325B61BD5EA4D2B7F492106B4F5:\ 5C8934050FE41218671234025E0A587E127ACDCAA0838D44BBFC877F719FFB9C\ 27F82D0DC83DF3FBEA9E18071D5FA9997A10B008C77C316327DF58BE6A5F868A:\ 5BE1AAFCE2071159446CEA40C0A49F72 30975F60F936909D5E92EB5246D966ADC490D89F3E332C4157C7C69A3ED6C826\ EF3920B7183352CBE3B43CB88BF14BE089A09EF80BA23C609F2BB74B0DB69567\ 3B7EB758DD32DAC570F25EAB735996A8AD74006AF2FF13D8193F16280D41F71D:\ BBB0A917F466E47943E5AD9F13D0A964A511FBE04C51487F8DB4AC86B80E4793\ 1787EB009974C270E9CC1752D116E8F89F6F8F181C636D106FB32C9AC07DBB66\ D8ED8A482C998158924AD52814F14B8DE53EE8F262C7B1DFBFF8A02D6877D760:\ 56D33F5BDDAF8A57724F7E6447D1475D16D413F38D3F363837A148F987550695\ EDBE2E27E40D37822E2333854DD887A533F643135E3FE431A05DAE1633829EEE:\ EBFEF8C3C762AAEC0639862FF14FBFD2 75CBC9C2193E6D6C05D1442542B93D4DA1060F73069429D4B163B37CDA9C68DA\ EE7EB478E0D13E1BB875D736ED6D827A9260FFCA15CDC7751B30DC9CCEA58EAF\ 39C4A2E663C2F7868E0AE87320604DEDF77D077D980948E29CD9297ACEFDBC34\ 7A:\ A01AD8C32A56A58751CED48857DF006CE408266EC348D97489D86BD41F218F92\ 2E2934C82110EE355D9AA46D9E72C914A6596311CE3D6BA1A156141237D86B45\ 2FC89D47103E2AB79CA7B808799FFF771431E667418810B4385F07BD73055E64\ FC:\ C3C463811FD88AE0A7E63B73383ED92FC6D1D86D8B37BF9F24F54E6FE73096DA\ 2175B4DB6A37A3CA7DDDD25E0C56C4D2E98A1DD4CEB26649BFB50EC4FD40AF99:\ AA54208D82C19213B61C3E6C9EFAE74A A5B814CBF93E5DD0D4EFD2C2697ACA8031350C6C0CBD4A7FEF33C51B95CB4A0E\ 28AC2C84A918BED457BE10BFD63381D316A25E13BDE0E79DAC0CC1943A11E6EE\ 11978E5F9AC7B108AF3548CC3803F26B2CBF3A80D02E4B5FD5B54742CDAD153E\ B3E5:\ 64A63A3CD77B0AD9599078847A582F39571BE1AAD402A3EDFAB7BA1133B1A9AF\ B2F49C0ED992210CC563CD6940DB34D46EEB1F38989937A9C92B89E9E5848493\ 3201A3208E526CECB6E89941AE5EFAA0173A3DBAFF77B4437449F1C9E14D1726\ 1048:\ D9DA279E61E7D511786DDCA2BDFD285C9DD7739FD35D4EB4D89A686757005B3F\ F28C7F5F3CA3DB02F104A8FB59B14F3008D6040AF9C8C7AC5CDE9626BEBE8402:\ 2049B5853574A6EABFFEF270C437550D 26C813AB4457B48360A7A29D4B0FE64C67CD5D119096D2D44FD0A2515FA34862\ 6817CB4A039A9D707C717061545B4BBD630E9F5338E3B970E10E063C8BD93342\ 9A0F9F8D9CD31C55B090D68C99D0384282AAC273E197ADCB42587EBDF600D321\ C29293:\ E9D3E28823341923F6F1909D70E4F0D032AAF6A2C93D8AE9FE28AA26700B41BF\ 1B1BE7820F177D21F59FDC1702D149C6237B9F101A1B268AD617DAFA91356DB4\ 526FF9992F015B219C6019AE4F2F739FFA3EA558C78AE66612BEA6F8448A3E73\ 19C597:\ E015CB4B3E1B95D4EF72910B9562CBE27915F3C5E46C76BB24BD54D9B72A87A8\ B9051830D658DA4B21522AC9AAAF2B7E0C2FCA4EF907EC5F6F91CC6D78752118:\ 1695DCF0E5AC925C8013914969DD68AC F0E6108D8F632FE6824A56993FB7FFD02E02B57BD0CC18AA9F62B06C2F5F8AE1\ 46A5095A9793D49187BCA5B15B44B9EE97EB232D372E03E5EB3668D1A832723B\ BBB1EE7798BDFA223B5B637758FC337A7A536C33365039748DA998AB12212C4D\ C4D2F784:\ F5960BA1E179155964114C194B78402E3E8198C6B4B82DAB7F99811541BFC101\ F9FE56BE611E9D6AB98CF3CBBBE0AD9E5D139C1A0EAB0B6BC5B050528C9B888D\ 0E78B1622192189105D44350895959DDF4CB71F8CCCB75762201C1BFDD553435\ 98F5D483:\ 5E48FFFEBD528D21913555E3B68BCED994B23347A9FB7BAD69CAA3F920C08D0C\ 126EB5137A7AF1C50538F83DB3F1AB8EB600032514A5C1D301C3D4971FB59B26:\ 8423EEBCB184EC59ACFFB5A2A112B373 5DEFAEDB9EFD565E940C8FFC884B57EBCFEB9970DF117FED5D06ECDAF771AC7D\ 9D18E5527759F3953A365EB030B5A059F28D07F551B405932F62B1EF44341888\ 2E893FF9B7C798F9F5942B383CD67538E421FFEB75E5743F23CBCCF2719BCD99\ E72393CA6A:\ 8967A3CA68A3F87FAD0A43752F3CF19127F5D67C5AA3F69DF5F60E1C9232AFC0\ F2C7670C815DEB04147311C90AA57D5E1AAF521F174076891C82C5EB5028C3F9\ A11390008B6C8D15E26C6B877AD50E88228C2059A3F915EF0AC7CB9A46F3D84E\ 03D91D04F9:\ A218FA2FA0B5EF6714C067DDE8A65EB1A93FE5F814736407A93054622EB305B0\ C8377FFECE049B7B37587083376FFDC5A2CAC4B2FC3E057AC83DC06C66196943:\ 7501AF345711B4C4A22B5C98D3F4F40D 26E571A17404F047BCDDAFF7C4B2D2FD401D48CB817B0D91D5C7B47EB297B8EC\ 01F0716D53B743BD098280858862DC9D3D912C6EC730B5F2DD4DF55603D082FF\ 88257DD4CAC3317B41A8E664B2CDBD5D010835341A0CDB6B5C9DCE433A2D4608\ E2E93A257C83:\ 3842B0186C89E3B823E1C0593DEDABA71C8CD81A3E338525233EBC1DFB2A1FA0\ ADC1EC1836621852979F1220E28D90390B742F3659A34469600852DFD6ED2E43\ 85D5096A936CEA2A5B1458794E2E517A649FF99FC1DE7F0BF37E4B872BDBB217\ 484094A3E4B3:\ B32E9B7D7C1B73EFE7F06EEF09678BCCB2079A79A5514A59C2C6C72C874AEAEA\ D7A8D8F1554E216AA3B78C2F6CDEC896DB75FE1A6793CA6D395C39E44572D546:\ 30EBB2CFF6430058EDF5C8CF536257AF 42E149C0E5314F7EB1A6CBFF095BE9AA6CB2117F96B8BA8993909FA01CF43D18\ CAD5A559EF4BFD36A51D1A067165F4CE0DF560513704FA796F281F41D29366A9\ A60ACE6D38F31E635BF61670EE89577E8B6B1E0A9D530E038E42647D0A0CAC80\ 706224E9A9A1E4:\ 738D56C272FA8B3D8C726645F7984EECF4318AC2FCE8AA7EC09D2ED7E25553AF\ AE054DFBAE97305C73AA33C642B00E6548AA60FF834C0EF9D6EC3624A958E21A\ A146A8AA636C55E2E4A0E84DD9B3B0D92F182B3D41F1784B50998B0C82A13370\ CB013440124EC9:\ 373CFBA5AB9CEE59C7A2373C04ADD01D24505791927112285C7D0461DBFA6FCE\ 0ADF12DF44E9D8C46685D7861882CE1B01C903665A10011B51DB89D338F759D9:\ A9B65C943F17BFC72C2581DA3288B6F9 C288E33D72941F41DD1D5310CFD541C6C07C8C8D70A7FBBE33C9E4EC940CF0CF\ 42588415CB0DA37453D31A46EFF7B4983E0BCF14D42410EA6C060C86C9717F9D\ 094A4649FD0A3D4F4F9F255C6B37E3F31925F12D48E86D102DA00B8F5B9E2407\ 746276BCF1864EB5:\ D330F79E61AF0EF80088FBFE806D7685A7330A2B2468213DA4C2FD6B86759AE7\ 448FCFD647BDEA3C0247F4F9176418B62CADF5B9EE6F61682DCFAB82741B77C9\ 8CFC42FEC1B187ACE09CB8D06D14261138E5234974306203ED38FBB125F85BA9\ 55E7B9BECA0BDB75:\ 771338851F87F2099B0B5488FE8E600B2B3F92A528126CEE8B58FEC037D5C456\ E848D755482DF9C10DE579356354BD7042D2CCA54D611553444F9887D9966955:\ 9DE9EBF3A3B502DD467A60AFD59E6559 B91BD41453D15E3FFB736E9FA98CC4073BDB7467CAEEF461B011033F284D42EC\ 588216DAA3113C2A3A8CB3139E02EEB0B36D0F82B7D24504F9C43BE93AD9F8CE\ 4EB8C25872312162D01DBD87C65811D0FC4F38C6B395C307E6573AFD9F75C264\ 4C1FF5D9F76FCEF13C:\ D9A17555C2840A4263DE6566E9D59465211D43FA0A6B168E443A363FCE5FCBC7\ B0E2BD646962B5DE01B9A91B680F3E18C1C0ACA0E8DB9ED24A5E2EA426CC016B\ 9819C2971B8CB697F3F4F28CBD605DE3A10623C45862F0EBC690F4295B83BFFF\ 61A114E7641920BFD6:\ 7AA8DD5F93B27BB4EED70810D33040B16041D180877E6C03E273E1B87F1A1F40\ 8F811D9B984C3914D0B81791E765ABFDE416BB681E8A1F93B7E544F65A83245F:\ B3A8F6070CDED95ADCB8D420E35973B8 05BA4D0D1822FD84B2A9705E02490589446DE57762112C4E99D941B69BD29A74\ 6E2E4AA28487B300B1F7390A70DD1FB1BF48568F08FC229AC28415F0CBA5A299\ F6C2D07D5D614A529F959FED3093BC3415780D64BF2F556FBC2FA0B4DF7D10A7\ 214A28269B2ABFCCCC86:\ 743B3DF0B4F8B7AF05ED0CE4AF77817BAFEA3E33980CFD1ACE91FED8F3AAE68B\ 026C0086C672EB22B712B78F61494584509962EF44085B3DCBBA81469782A94B\ B53A03B03728E970CEB74FD2002EB496293089563A668A0A526376E5A33E4416\ 5F165DADB28C32A769F2:\ 90B71E846C7D462F8F1736B2CBB09CBED42B73C9B2C0CE843FFA0F8A28E6F41C\ FADFD364746D7DA44CC8402A6EA769BDBF60A1189F8AB0A62E2EF2D10C84C8DB:\ F86B79E7E9207F99C6F39860CD053C2F 482ACC7C520FF73186986593741ADD91BBA635B381665A4C6284916B1F09BD40\ 4EF58A2E8C91C669E242C19A32CD9E8DB9BE9EFC39C8B1F04B850B9841400934\ 18C6ED9C45E132576D554701C62700B7BD94AFE1359856D9BFED69CAFA0059F0\ 6E9E130715A83D70F5B692:\ E11C9D477350856F801A22102212533A5DA5D091318F832668EE7348607AC8B3\ 5C50F78A5A36228B0050927ADC5B1226D42ABE82D5E61869A1943DB7B33793AA\ 0055BAB40626C46754C113F8F6B1A07E956C032766DEFA78E0BF0E239C33E316\ 2B2869041CD151EA109654:\ 6E394318E1A810830FB68CC0D7D0A88F94E6AF97E548F8216BA57E08D56C7EE4\ 9B99385F3770A3A4BC8B8CEFF9A9BF8F4D42E28AC4D4A01365D9FE7DB01A256D:\ 949DB9612EA1BD78C7442FFB8182EF58 CD79855BB76EA55A63FF654ABF570703B28E7A0C810D6BB7118FE0766E4C1125\ DBC7991EB52616373DDD82849847F5331DE6EB89CAD0F8BDF81C4875D1822B72\ 07127857B602A821971EDBBB1B4D0D17ACD1D26F7FC6331058C3F103BF23C4E9\ 3ED5D78B87F854241C3C9DAD:\ 831510AC8F3E9546D0D7E3CED8A636D26F9215C9EAB7584C72E36A113A078159\ 9E884AE39F594589F2C947259B0AE2AC7057BC96890BC8DE801D3B38E921DC2D\ F4C7AECEB8ACA67034FAB417C5BFD5C5753EDF70605E87B669DBCF62F3C9C24F\ 495084DB5DE57F57884BAA8D:\ D4F12CB27DCB67C904CB9D6C21B1FB3F16C69EBFB6B2F67BBAF5ADB99584FE6D\ 7D965F9CC4A304C677524C6EF60496676E20B854DE21561A22B62E161E1A5016:\ 5159D73396C90428993114810CF9E8FD D4F7CC4CBDE3AE3E974D66509F0E11C62AEF7DD4EB35A2A0BC42A92C07C82562\ 2F1C1133C4F519409A81697F3A6E4CF504ADD05A464669F4F9E3A13482C8228A\ 432D5D35BD0741298A6DF79F69F641A68A9D80E043EF99A3153984FD24E5BBC1\ 6B349334760F551076B5D38D30:\ 8AA942882A76DC77ADF1ACF7307077D9B106E09AEF456C7209F0145E989D2361\ 48B690520B9FFC5629E9A57E270068FBB61722988CDA618669E292E03A6FCC25\ D514C524564A0EA66374E6A5706F552BDBA4D521F861DD3812A8303A81B81ED1\ 0C8BAFEACDF577A8410338C377:\ 7FA74A8FC8924760FCB20EA43A1F8F912780EDF3D0F4AEDE7484D2CC8A2A221D\ 47331B39FA278611CCC9FDE68D1F2AD91B831409D30BD585529A8404E11CC5E0:\ 25A4B3CCA27E618E5874793196B2A93D 43B5BDBA30FA2F5EEEE6849963B1AEE9D97D03468F21351BD1F47062C7A95C77\ 5DD28849115A8FDE8D07810386CA63D21FF76F46777A7A72E996F0B4888ACDC9\ 5233343E026E962005B5F6DECF9A6FECA8B0E7EC58D1C3356D281EDDCB933C25\ 6843D35131897D83C1E8D0E94000:\ CBD60463CAC1B512FFE256EA3B1D9E948C50A52EB3940770D2A51E2B84476FE7\ BE00E96584B44254D5B709DB59A82C4D9459A896219C990463981C5D08CA65F3\ 56E23A5875C03A6C407FE2F52B92D0FA4F6C3B9D79EC20D51D8ECC1CF432C795\ 56F4DB64AEA9CA2702E511C5F138:\ ECF41ADDDE48510E0AD24894C1D20672476DFE4C447C114AC7741CAF24F46C31\ 9747DBB3A14156976A1E553942FCD3C5C3723C6B9A077BED3431467961BD6A55:\ 340F276BF5D87280FA5959351D2C8F8A B5F26CAEF7C7A37581D87CD01F9F6D3B5B8DA6E587C73C593677FC95D34B065E\ 64C70615065176E500F01446B026B709D494E2FC3209FBB10BFC25038400BA3F\ E0A8804B11706D0BDF8C7C5FF1FCF9426367103ECA49C9FFE8141281B8692717\ 792B4D3A091D17D8824556271BABAD:\ DAA79FAF40F3F198F1D43C7011D9E0CCA0A15E855FDB336D0F346394ED85E00E\ DFA8CCDBA9CF0A11F65D4EF8141D4501A399B92186D08B7B821841F8FE76FE2E\ 2FF386B70332D670F14265B9843DD503E00A1EB7232B8F775883ED8103037848\ E94F229A000028AF93247C26CD3ADD:\ 8D9CC3AF3D5810799B8BAE673035E24EB553CEECFDA5C613DB418C253EECF7E3\ 2E792EFF4B225B9CC6E2157E4662463652BD00E0D52D9272ABC63A65A4F32CAD:\ 82B45A731D2F2393C500CDE3FDB1D059 780DCDECC88D3170FA13A1138D090C9C1FB2AD38B08A0D278DCB3B98365368F8\ 39D4A7FCB0874CB533C886A7D255923B599C486D5BBAE4CFE92755FBF73478A4\ C282CDCE37E8B608F8018D08FC26059288EBCF8449C7F3BA78F83617B538741E\ CE1FB1CC3F9E40952E67EE40391E387D:\ 721B4B9A6559E797C49AD734BAFFDD0EC92D1640B86659BC90B3AABBC5F87579\ EC91F6BF209963F54B854F0AFF71A32D72D992A675BA38A2E7F61AFD39F1D115\ 5E445ADF475504AAC3A0CFCDF349412D8E2AA9BB6FE3E8283E123846ECA76D62\ F0E34E6C3446C8CD46FD45D89B236DA8:\ 4DAA37EE05905CC235834281D4DAA2848E49605AA92AD7C7973C4EE3156C90BC\ BBC120CBF72B0511CEA50BEFF6EDAFCAC1A066A47AA2FB1D145F22A431A4EE0E:\ 118C870333DEFB518E6BF6C28DE77C25 D6CF912FB9281A4B5086BC851F5F7C40B267D73E78ABAB8D1E417C2AAB413A89\ BFBBB8BAC4BAFF248C1BF0EA5077E0241826C29038EE80748ACB14B5F88B76BB\ F1270B9C3E97841B87AC63ACDE7239E570A5D5CDD52A350C3A7928745CE9599B\ 7AE683B5FCE6D5C49B45BDD35C06F4D271:\ 7711973849383EC7E80A9FE41D211705AE1DEF6138AFB7A1C4C9513774A2CC9C\ 79A4F95E6C2EB48CC6DA6F8C975EFD5821A054E027FA6F9976F5CCE8621E3A89\ BB0776AE3DEBB20777F18475AC94EEB187BC4467C7366D20F977C1E3FF71258D\ 5F455F8676F3A3BEDF531D9720D79DEDEE:\ C6CDD9D731B42C2E755100AEE2B36D7D4C0264329477170F72D2A576FEEA2AB5\ 9ED6BA0179BC1A55C21543E8D6CD47A626EC16B32698A19E92A2897B315C0B79:\ 4CDFF9A61F98BA414108867EB8AFDA61 13C1024C17B9B78C18F549185639B2DED3AF1C8EE70FAD794E784F4D305095CB\ FDD2953ED736B75F8B2823C673149325E3DFFF8077731C20D3B12F5A2222B169\ D3BEDA142E5DCA3F37F122C885BD4221E8776357B858261032B0183F4C38F3CF\ FF19B96206094CC34F74FD5C6D29A593AA50:\ 29CB815364BD80AFBE4C1FAF09AAB793EEC973AD65A3CCE9C6B23901C84B90A3\ 622899CF5E6F8EBECBE993432741CA492DD49BB81309CE448EB4E4C8DE46EF4E\ A097F908472A8EBD687523005C91FCF4FCC590CC6F45E4F61CA4F7AFC3295434\ 41BF7E6EE12A6A4C7EE58594289279E463C8:\ CB53AC5FB4AC48240A75A5616FDB3935532F6357E57FC51BBAA6C5D227922811\ 6BCCA413F0F7ECBD85D939411BCC61FEAF5C73D0067874A045F016F49C1817B7:\ F70C0F5B88C9695B94B7934CF8637401 F2F8A5CCD1DDAB9D5842FEBF253970FBB1F13FC158B545FE5E99907EEA4A25E6\ 051E88DDEA4FF9BD44453E9D31EB54772246A18EB73E1A35E9C0A8267D07BA97\ D26AAD6E706BDD908AC0CD3F9D9C8E0FE24F1C5C7A0960D14C86A18D97BD3D55\ FA2073D10676AC40601279321A5F00021AEA7C:\ CC1E3D8138DC7993050D059C68F89172865A0D36C0CFB4AD58CC999149F3FF0C\ 1D623A0E068F080629CF04DDBCEF918AB8E4C9DCE0B4179AE7D9E0EB7CF8B420\ 44D930368455690E22E5FFB92169CDFBA5B48420C9B89AA7086708A8BF0CD677\ 0E1AC7277542A84EAE84043B9855ED876F41D4:\ 9CA8E3BA9C9610F1B15438CA0395C9538AB9AC408B05A68728E379893FD3F4ED\ D3AD946EC26886526C5640D1D0FAD5929BDAF5107FA6A0DFE46303F20C7EB682:\ A1369ECB4438A4EBBC918E19416560B0 1E73F5A84C10A6CF0680C8DC43687D5C76D29D34B09E327B8708B92BC020B28B\ 3DFD5FAA3FCF9AD00E4F726F4B3EF95ABBF14CE84481132A2D31A695993A60B8\ 5C2B68F3CEC092272F22A4732C67769AA1C21784696D0A06373FEFE72CE39F37\ 7C3048BB40886DC6F2FD7C43A23BF5FEFF7CEF0F:\ 24DB74B7D6EE6CDB3CC03416829F30C823488D98354E72476D4001249DC15ACE\ 9502580A2453398D08D45E2D5CD2A0359EA3576400D3A08214F70128009832BE\ B2E7DBCE4F3FA6E223BD92FE23B0866CC656740DBEAD98AAC046D745969EBEEA\ 4F2C1DE55D467F932A0FB972B76C7515229F4D59:\ 0338A0F1A7DAFD77612275177E38F1EF8640B0E18D8C02E1B175DB6240C7E446\ 6EE7269DCEAA6A2BED27BCBD8E97CF11D85B70D1CFE3F958D076F064AE08B69C:\ B21A3FD84F96556D0E68933409A7EEE7 66396189590430B5BE5AF1E5CFE5C831862ABFE66D22F63C5F0B8F04481594CE\ FF1A39F7DA5A850E626630F346DFCED4EF67987ACA3D1FA9C4DD8BC18171BE38\ 79E91F6FAD52F1BBD90DF94DB52CE98239A850114A242ABD6611DD9C142F6CB3\ 0405199E0A65531C66777C8054EF03BB95248B4F57:\ B73922288BACD4660A85AB0707FFB1D125A81531679B9E2974E2C7958840EA24\ 01B8C7C6B05913D7BAD2D9362EE829264D7271E7E47EE8BD45D085EDB48CFD69\ A3D08B7C977D47D8867B22DC4ADD8988ACFB071C6867FC980A3AE179E3D3B5B3\ C0127EC7ACE61AE48D1AFB16B9553DEB5583E5FB1D:\ E403166D7FEF1000E0B6669238B6BA73C618BDD811A4368C4DC6B700B38E2210\ E7AEDE34174CB0930400EE1325EA6BE3321C49B1D3DC185586100F580A875046:\ F15BDD887F65D25D585770A222220219 3032CEC02AFF86B5F2E339CCE38864853768F1960BF20A3B53D2C4187735F428\ DD082EC208FAB71F9AD3E1967CEAA3BF0777B87E98A696841DFC084E1347B822\ 67588B372F9642D66F9E08C161BE3EADC084AA9CD6FF3A8FBF3177808C4EF56C\ 187D0CC9121A84948D7446749EB685CE5F064DFCC939:\ 1CECF7BE8466B2FBE7612181CE78128D546B75AFEB5D567F63095ECA5A5DB776\ EFE26618036DC48A580944BD34E08C54125594C3C1451CBBB37EDFF65F881376\ 537288E3E4BA4534A4199B00C36EE02A889FAA4FC33FABA02C633AD6628BB272\ 5C3E3E147E5196C1788B292CC7365FA3C9A15909BD87:\ D277E8CA361DFBE5AFC2FF04A9EFBC47591B8AE68FC7CA91490BF3A7935DF35B\ E29FA41561B424B7F9053046D1EADE655B60B82467963F087129DA002DF3224B:\ B898F0C1F1382C9F9327B01F67368200 CFF35BB159EE8A3BEE6676C06A931588F1669CEF27FC33BFF8BDB94838F0E96F\ 21CDD44EE497BEB4FDF0499D63483D7C60CB2321B15CE6BE6DF6FD8AFC31B4A5\ CD473AC49CB72E7C86AF56D5E7FBC38DA3FF5CB7D2A22B5FA2F4DAF7DD8DA105\ E8DC6B08C78159D15629F7009EAD564F984DFDF2C38A7A:\ 8C2A04DF5D2F4B98E37D42DDEEC7411694CBF941F0D954E6312768BB4B9906CF\ FA33D6877651240560A65F7A022B88A8B62BA58623B3C3EB892E1D1E43EC3E83\ 9C7111EF12A91FDAB754DF9169F324B36ECABC9F0037FB307A588356F50DBFE8\ 20C02E1AD377D6FBB17E8406092E52C7539EB87005026D:\ 7F5587B64A953FF3D12741C7F256716A99B7A88C21DE45FB45F3273D372F646F\ AC13249140051C4684D6B386CB8A50B93B2187CFD971D25517B01CE188EB9B88:\ 33FDF38F0C938BAB399772D2F9E405D8 81B5D6B0524E67997F04A0E708A5B031C4B4EBBC2C8344F6012C1CF71DD44799\ E54B7074288B68C464F89E6DA67AA2F1E3531A81869DD4C856861BB2618BF35C\ E6AF27D0820B57982BD3332068085D55121D0A04E0448B9CAB9F951D3A63E108\ 84B5426F49CF6254033B63C59253DFF3163F7D0FA3E890EB:\ FFB18F8B1287F8A98D59550F8714953975A4C0E3148EE40343DBC2E7CACC1013\ 67335F21CB190BE4D4687DFCE32DFB0E3B2DC9CE54D8123D8AD98CCDE7A9A80C\ 00CF1D1456D1499C837241B4AC5575D9916668ED10AE5AC398E18CF343054944\ 65C0E7DB20EE7EA6E9A0FB872A7C7574FD1283BB41714EF1:\ 8B395534016BCD55ADBA77CA7284A1565A66CAE0BDB22BD9316346CDD9419B5D\ 009D0BEFDFA4F40D1B6FBCE5ACE5FA044B3AB0AD3919BDC2498296C44183B267:\ 82E6A3DDAE62A789B7116DCE8DBA32DC 2C4E8C31E0EC855E6FD937EA6B03D467A4B280B6988108AABBB5DACF6C9E84EE\ 565225A0832F92A665D98DA93EA0B6CA966C907B3C6029DBB1C595480DC90D57\ 1822FC1F0889FA3FB434A8FF4E13F20BF617A42910EA3B6DFA8077908948EA5D\ 447A662BCD478FD2681E98C9DC3D8A87B2A482B28D467E7263:\ FBC9BD2212532AE048540DFACDCFE5A518A3C645D3B17B5CDBAEAF7C8EF359E0\ BACACD90A4F4A667C2C9C07DFF132415A4494F62EAFE16FDF431F8BB105DE141\ 1DDF1E158D917F2DD114D3F67A71D65AD14542F0968BE10A1B284B6EA1427257\ 909A03547BAA212DA2928105C6A2847B7248C50DAC744642BE:\ 6DA973BB970599CCDE6BAA92BA993D962A6D9BE1B23A8831ADD3AD0388F68CA4\ BD026CDA4F65C62CB41E83603BBF5375829B8F9D17ADC2CB8207FC59EEF25994:\ 0A0861098EBE2DD3BFF1F594E561F7FD 95D6D6BCD231BE3D7C1316B142D57FCB47D2AE9EB58EE6C582F3D3CCDC78D228\ AB555B5F79F15756231821F6A6657693FD6759D84BA734C86540B354C7EBFA56\ 44AD54BA1BB9A691B0C266C28863B04476F361DE70E665545A179A1746B8252B\ 76074D8ADA0CE0A5BECE2E6DCA1CC7F92B1EAB5B97B4B2831EA4:\ 5BDA57FB858168C911A9D815073FEBD91BC9FCF17E00B373095D81289CBB4B52\ A8BD60744384AF161B7F03AE95EC030A02F9B2485763B7B573AFB5FBBCE316FB\ 2FAD0A2567C03D36535E8FDF253A01A9E56D0B06A4500876DC8C13E1B4C914F2\ 102CD4FF050801BFCDBE5FE2C4A95D7A4F88342C19DF6A70A446:\ 62B013DDC5BF950763A5E33385FB75BB43BCF75DC66CA54D9104B0236BC38C81\ FCBC87997C0D6ADD4DC45BC8FBC22FE36AC00E105A46B5492B4005A50DD65116:\ A2E9DE101E506438FD10DED90EABCB3C 3BD568E69EACBFAF5D13322677BC92D0CE2BC7E4E7092CA041559AF23E42775D\ E3A8D2167553DE22F31C2061A7A870B6AF5D5FDC8A6F4834E7FB44BDC31FF147\ 35C26B0893010A49261D68664120D2858002D887739E249CE730092460FCF7F4\ 6DA08F6B55622FD5750C73E5C5F0FD04D9096F9DE314873350C478:\ 368390C4520ADF7EB9602D6AFD8D5087C26FBC854907F9A5475FD0C0B2E07E15\ 3B5621E4EE651438F30BC67CD9668B188FB745EB69835C8C0B2FC8F7BEAD94C5\ 26C5A50B328AA0681311BC3091C6647A0FB6928D27DB289BB48D8D2E0C037E3F\ D791C2FFC428D1B8A7042A961039919786718C9A25B7DD24F01AE5:\ A483EAD017318E8BB4C0C8801462AE07257024E4BF17099B6B32ECDEFDA197FD\ 87F138CBA0D0B96DDB56105E81086A7A5886EFFF967C24FD94B8689D84F22C5B:\ 605D48F582078B0604F3C5DC3111F7C5 6758ED64AA790A0A39490F2C1D57D42738F4946065560F0B1A5285C2F466E7BD\ D8F48DC2C71339BF73BD5E831B215EF0E20C9834DC3C77E874A3983EE0B404AF\ CFD0D203B5251867B0D529207891DB47601E82C7275D9986160B0152BCB63373\ B37D688827212E4C1BF62EC4CBDA2B365BCA7178D89ECE38A8718E86:\ 734D38002B9366E74F8E359B40997A63DEC0E1283EE0F2C20ABA3691F679995A\ 48D424CB7BEA0C39590021BF093CD50B614F2194335F22595F86B0A468A63AD2\ 81259DF6F54F1300AC7D9D2C221CB6E9EAA9EA36D94156822C938C54EAFD4A1C\ 196835EDD18F94C19694EEB6D0BE2AD24FE4F9A4A6F4BB467485DAF8:\ 63E4511330E7D1D2321FEC25201FFCC03F52EDF46C5880AFBC8C9ADBA5E768A6\ 13D257E272AADAE1A0AFB091F0850FFED65C9D670435E452BF0B0CFBCC17F6A8:\ CDC6565013263CC5B1468EA8B270A9BC C0A73132E489967611D04F7C84B74CC3E2EB6B2C725EEB8D331542532F1AC452\ 809A64EE1FA4927EB32E7E55441C4789056FC6721C1186DE8F49CF413A68E928\ 49D9A59509D7B3155BD06FA91022D273496F0B26EDF671DBE3E69B3542F17286\ 1C1F40D1DFD9FDAEEE421F8223D5CB61A7BE99BC89888856E87F06B71E:\ 1FAE54A2D6A87893F58C3F478652DFE814338752823A20D722F583D94B24BA29\ FCBD551B722765F6E472AFE2240B485A54235D83C865BD5E11E5F1165A5647A2\ 8F6BDC749F8B9A7FF1554CA86364E584415A9977BF0A108DA508A5DFE44AC4BB\ 3F93AB351E4CB749BFE9CE869DA3FBAC74C1EC669AF7910B4D0E5D1A49:\ E1FDA54A463E177014F85F63B863E9996C6DD86AA476955FAA5FE2554CC20360\ 104C0C90FB6D3CFE69666941DB660E7785ABC880BB00DECF81AB9D17AEB01E4F:\ 97F77B1B0B71D103B62BDB3C58E1F1E1 21F2A4864B20BEB630EA2E92B980A4099078BA7C6359872D06B0E853EC7BB415\ 6E15F471820A0C98F57020B29AF21D65E6A78A230AC8BFCF8B1321A4A1DC0728\ FCB9DFD7CD7F03048DE0A7AFF8AB291E566964F46E7A2376DB0E0119A635D697\ B58C6CF1659F9707029560E65387E5B989354771414BBB59983ED6980AFC:\ 880424CF394E9813B8E9388D9E9832572C23EB1CD866BEFDC5201E309246F419\ 20EAB7FA86FE3D9E7EF39EFB68790D5EB5075398300A82A77722CE13CA7FF1EA\ 55B17F09F487A16D79E00F93CB6BB8D7845BA5A6E7055C3A145FAB4E81BAEDE7\ C77F5835EFE213502DD461CFA69E6BC1176FC2B744871FD72AD90FAD562C:\ 26017D89A713F185A829C02EA39BABCED003EF442589E402B260F5DB9334E0DC\ F9EF15D02BF3066F73BD73E180B4426CA5C57CDA926368733D2314AD1F51C2C3:\ B186D4BCAB5F782F0FD654CECD90F39B 66A37B60353183B31FC05232BD71F4CFCE7B8E080F28804A2D5940A2C61E1EB3\ CDDF1EBB90055C1FD2AB7B39E5D081597C94F3D718A1C5E1D2C36EC844D4CA1A\ FBA4BDC14B3F19BB9998EF4B3FFAF894C9887E204B6CC4E860DA8309D5E4981A\ E9222820268A4FEA1EF02249E533360F68BB0DD1730E28F436FCD9372677A7:\ 80ACCA9006AA4097230D5948AB5629BF72AC6E43A08B74676E74B5D14B7C238E\ 48CDE24E319564912061B2DEE67955640EC5D9A5852F41237DE45440A2D8BDA9\ B73C083120347EFD3B2C86851DA0EF02C24916AB58CD24B21235E54620FA934C\ 0EFB200EA7E29FBEE098EE537023A6D03956E17CEB15534D99938E8FD56390:\ 3B51B7A749B08DFC6F904FA000A4D9245F24124614A933335D75F5667E2B7C96\ 97FE44DF6AD825C43843E9C368F1BD4F173223D0A0DD9AED7C9C80BDF69C8334:\ DFC1983F5119A9C4B55DEF420B59D2EB E46C7DE449CC38BC249ACF4953CF1BA66B94A5616A6203A3247BFE1E7D3309F8\ 86A96A2B5533ABE67369A1F1EA324A0D6D15A04E36787D23A16E33890BC8F2FC\ A0540189A388E0B439703DF43CEE744EB0A1040DCDBBAB16BF37592C942D1E84\ 325047AAF28926A1E2D1D92A935FAD0C7C406A7FB8A0CB58FC685C834E81FE48:\ 69954B7111B4486FB4686B5F49D3D52CFFAE02222EF8A211D8618D9F2998BA73\ 239974DE5E51516225969E33F705688A6EFB5C7EF2B13ABB3E0E2DC2E3E039B8\ 5FBCE29A7001C4EEFD8D0143378A08F4C1289680248174EB2EC81AEA9C267202\ 3756ED685FEBF0DD7F748E469425C1C0027B64CC0E575656154B743C08DD6993:\ E0104975E0561DC232B1DC0810A2FE19BEDD07EDC66E8208A3326111D51E2594\ 5A9D6D804147711D684E09471AA8E64FE328EF1D64C056F39291F9FDCE0E1845:\ 0E2B9BF4754A37E86C53786FCDAB4782 93C5A236ABE90F992ED6D5A7B82091BD8907DCB680EF326968281261393C8E7F\ 1EF8F37F631A7C2CD9E9EEA75F124D5D42E8A5C4FEC30AF989416CBE755D392D\ 493EE604E7A9384E3D423E5A5F4C5C966244C1503000AA509230DF31906164D3\ 0D2FEABA8C582C0557821917E6725ADFA0D6A2A61E89D933E92D9035D8E249C5\ EB:\ B425B00661CE5B18D263F21BFA59C8E487875D0FECDBE76B4E76465F77DE11A9\ ECE56AD80ED1B07377E7B47EE4D653FFF8D7BD36A1AA254EAE0CCFED1CE6C212\ 5D64A743424F3BC01783046065453894A34616F7CD5AC648B7E6D282F17A8923\ 6393D04B6DC433512F050E05C62917C9AAA68328D92482DEE3B989C116C32B22\ 7B:\ 76AB2C69E81F734BA067B0B9D01C55A9FE7BFCCC1FE9C0A59DED509B7FAE0CB5\ FD342300C5E276D59E239FB5ED5BD857C4EE178DFA14EB5C64C8381E4224541B:\ 9A711C7B8AA57E098ACE1F58EEC4CFFC A48758291351F2BFA2AF6FA0C5E211DE29B8C79BFC89104D08EE0CA595BE9544\ A0E6999CD5E36F77AB19A071F8F6D04DD0E81A25E0341B5AB51FC6A7DC189A3D\ 6768B58ACDE108F1BE1218C78C88A7869FC84B1F35E299B0B79C4A09A1C0EE31\ 8DF926C6E5F699D39C76550CB727184B5DFF4A5DE3C89B147CBA34397AB042C1\ 0AB4:\ F566F3EE9AE9A6E8DC0F27BFA6DD8065AA04F6EC22DBEFD6CC402B71424F0F49\ 32C3D30838CED4A8874D1455D8F79606EFF0AE5E67E3237282B62FD54D930EF9\ 1A3E1317CF51EF4EAD96E7C3938B9D62E34C2E9669C36E01D2307E3125B94EEC\ B9572FE48912A45AF32835B79CAF90CBA384DC51459A767115D918C6D06F8F03\ 532E:\ 2BEF82CC3EB6BD4A000AC829CB9A679976C1461C822D919B5A34A24219B3E438\ F1B05D19AE0471FD0A129F769C0E818EFC5666D33AD7E0FBEBCAC21DA9BFD56B:\ 35816266512D9C87E26CCEC6F8898107 54E25645EF4F0685286EB6D885282B89F658A84692E1D4729731BC0B8DAD1D01\ 92518982B0FE8D6C6904D9096E05F5E3A31667D402DCA644F05DBD8439A8F59D\ D4BAEEFCB93BF5ADDACECF0EE6947B4FBB7F70BE8FBF898D02A36590D333EB3F\ 4AB4281B9E4AEFF3D1B8FB6512DFFC00F408C149A3309ADA4EA5C380E6DCD555\ C77ED5:\ 81C281A5EFB2A4FB6F239A27291F29772C4FC08F9F296FAC4C740A984A6B9481\ 3EC7C203CCF56E014BBE46F173587C059D03A5889C8E02DF235D310CBFFD82E5\ A3A3480094A9717DDFDE5C5ECABDF6931F0D2C205EFCF04157F3B40837944510\ E46AC4BC2B1997B1B4DD090CA440683126818F50FC23BE698ADF209AD49A8A82\ BB2F46:\ 7C31E78E2C7394EB9B5E6B3657443EFB99C08463A3300047A11E29C31280F4E8\ A2BF9F45F06D33F48359F45550013FA6C9AE9147A1F8F257EE52E9FC4F50EDB7:\ 081BF9111E8FC26FF5F521B1FA0D8C5F 06F3495E2ECE2F37DDF46363D03A474BC5635002F5452ADC8DC85678947B6934\ DE6F50A599E8AECB412E3064C2B51A2AF386135B30202C7A21D735DD22BF97C3\ AC23AFE003F1C04183BA73D5569FB919865EDEB13CE96616AD3C77317C5EE1A9\ AB53DEA2E6BB429EF9FB37D660B31FAA2237360FAE61BA29F122A98254467AA9\ BA1DEF4C:\ 9B6F2CD351822189251ED072CB97272464649308A16523562124F15AD966DECC\ 3B22A93AA6F75700DD6F8D06CE373C6F29BD5755F4E3E963632BC4DCE254B55C\ 4B77916193982085EE06AB800D5CAA1CEE1491DE1006F554BAA21B02D3023E01\ 96267863DE02C58D18A7B17517DD86702A4A9E1E3FAC7613528744D428DEDC66\ 7D16E6B0:\ 3BA6E21E1E7BDEAB22A5DA09C018B1ACA551E4D65EE2CF085870ECA5F1ECC93C\ 9492E6EA44446560612FF834CC30A9491A8C9008A2076D8630A65CBF39A34279:\ 5795EEB25804CDDA0EAC3BD3626F6ECF C8567C7DB4F901A083E4A3463FDF72F1B70A1EC7A6F18B9208A6DB88E36C84CE\ 2EAAA83444AE8C930B8ECDDFED95369095D6492981FD038DCD6F4D53F107B75E\ DEFAD677FBFFA1AE7C218E9E4CEF32AD4875446C533D651AC2A407EA0DCD9E8B\ 17F72D2407E23141339FDA65ECE95EB70BAA2D3C3A854238C2008B0B212C0C39\ E0953E7A11:\ 86DBDE68D137CAFA42181AFEC899D1002C34A848B57F706BEB5C35F80A2864C1\ DE836051FC7B6C8457D368E49953823657927A7526CA3A78215BFCE1249D53D3\ 4F08E15BC9A4116E48907FD594740A1142A316FFA3AB8D4C6BC8C05942289EC1\ 1BC1A80E4A861374F053E08D401A174465CB407D616F5C59F42645C87F195989\ 29C8C11318:\ 4084365D0393AECE34B53482FDFFF0D23837051C04E680393A77CBC36ACF352C\ 67CB002A336D75C964ACCD2D6FE4A85140F23F8CEC5181DA8D7417CB168FB929:\ 730D1EE67161B93E102E9414AE051DB8 8469D3302EA60CC72FDE028DBCFDD7C633E2030E312E4BF127E2D3425395ED43\ EAD12835D537E348A44E33634733758271BBA2C65CB4780C76D3A6BEBA69F32A\ 17DA522A4E22E7E7EE561F5C05A2788AD45A3ED4918A05DF4C3BFA4EB93FB07E\ F1D1104B987853FE40EA56737C84EF8F00CDCB6363A5D568AD984CEC416404E7\ 88902556C9F9:\ D0ED3237CF11A6FF2A05D2376726218A9D98AF8BB5270D9546D32FA2C394FCD6\ 59F008849E95910D638CD1A2A09A6946A9CEB08F7BA24E0D2E8518199FA88DD4\ CFD4CAB123080C52251F01E29E673BEC855F9FEE6BBBA6594884D35BB68384AB\ 66E285F6E71362F4C78A1BAD4F976715F7F60A7EF2D3C7E601A3319FD2062714\ 704CF2846B1F:\ 6D2CCE44439F12CBFFFF9BD738A99D60123251E0D1F6F30848EF7C71E7C53D05\ 8F1A1483A6297EC383396C5301BA3E471E9AFEDD07C14668746C314A3146B2A3:\ 6556375FA789D768E9DAD4409E76FDF4 0F8D74722E2814BE690F915BBEC407C9BAD6AF6F53AD5315F70C8CB8D9504DD8\ 647D51553079E3A21C7A8070D23C3345D202B9C5DB41C8A27C29E65E96F16BB2\ EBC324D452A4C7FB76AD80A421B9574F8E35E4D35C94406D9EDFDFFE9E31AB34\ 5FE69A63E3EA8537A92701188F58644FB29CE8CD990E25E8AF9A246A93DF2311\ 4463063A57DDBF:\ 52CC2A88639888CF9314FE15363700ECA64FE91088612D3D347991F98F91299D\ 330F6D92EF7EBA046315B3DF2B017BAD4B5834FC37FED528BAE0FC4A161056BE\ 7A805C4EDFFE887C58C1F311CCCBE8F01781F63C28C88A939264AB138AE8E688\ B72FFFAF965D756238ACD876DA846153E3B9D685A45B7B0C91F5D2AD9A8A4F5B\ 66AFDCAF4509E1:\ 20E9D126623672BA3DA57683E89E0852E1C3753EFC76EAA125C2935ED0A85DE7\ 7A6645A4D225203BCDAE99645E9675EAE4D545529733F4CE49D570DD5FC1E5A5:\ 11673D9E38B88FBD5147EC125BB21B33 D3231A3DAAF07FDBD3A05024319FA12A70A31DC8D9A7D8356F06D8F5D7394AA3\ 6DEEFDDC29D4BD9CE5DA729CDE1251F86E4E79CDCF573570F58CBEAB342B1AC5\ ADA6FFE3C62D292AD3F9CEE9DCB858C9A1FB0E4B11A3B21D6351FCF27CD9B5D6\ A4B6D1A43AF1DA10C8AA7EBA15EC2C71620B343B71C028802304583059FF0646\ 5FE17ACCE35A9C30:\ 7D579CF1B29D202372FAB3C43618BCD1499BB26A2E5E71BBE7EFFFAFB295D9CA\ 5928FFC95E0AA58C59A9D0E5E42108AA63E79936167CEA865D808904567FD42E\ 45E061195B6234C12BF70122AAD6BC5C75097EBB16099B4F4F691F4550F180BC\ 61D837C9688653FA2082A52051D6F7001473C00C58B4ACFB35040F6B9FABCB8F\ DC137905E0C8B722:\ EF46366CA50D577E5F9DEE22282475B5231AA2F1A687C2A47BD66F46F06C8BA6\ 44F9294A117CCDE299608AB651EB665D4E95E7399BF895403CFF60C0691921D6:\ 75236DDC71FBF614FB079645DF5A8FA5 00246DB5F84B1F5BE9235BBC9B2AE432E0F5441A169CDC9DA78ACBFF727470C6\ A768B2B14B1FB1BC88EADD9CBAC796D17F71629A829680FFB1797117A30B5FF4\ F9D7A935840C04333D7BA95DFEAC25BD289BBC6AB07B8850241AFCED877EB8F3\ 9FA7B7F97D44641767BD33290242E42E856C7E282A6D7598419A4B547AA80D3A\ 9004B18FB54EDB839C:\ E94817986CEAE0E54D4EDA3B7AE0F8A4200F6D6DC0A483EE2496E8F371E0A264\ 80F94ED3CDE72B6A7FABABB8E4619F6CF01A3A39880D9FFAA4BF3EB2425E5B3C\ E46FDEA93FF05E91585F26E25DF3923D69EC42BA3AC7C2B82D615A66B4E95797\ 451F9C94D1161652409AFC670C3B64C87205D13A1BF049F54A591E916523E6A7\ 433A28AF85B2495B6E:\ ECB1FAC66B4B74281A0DACE9F95911FDF79C2DC0E3B005124B7481E944A619D5\ C905FB915C4337749F4BDEEC3153BD2BF075371EE709DE8F1962D35B67DEA5B6:\ D255A2B05BE2AA1E606895A99BE85AAA B1167A2CF1CD06E919826114978664424C36B257D9B3B9188E1467B73DFA051F\ 6175984E35C6FA8E7AF54A85B663E2DC7EA3137F444BB76FD501AA01B37698CF\ 6237F45750547D6655BE389DC88A532C387AEC2E701178B7770C51BC5D2B2BB5\ 2046657D67EA49DE773C240DFF93ADAABB69B14785C071084047DCD24938AB01\ 23E8A4C84C5B79ACDF58:\ 845889650CCA54A1CD7FBFDB6BE1B3A54D295FAFCA3467A173AEF392BEA78D80\ 2558F0C8903A0DD60D53F11E3C34B26E5318632393794AD35F9D6C534EABDE5A\ 107DAC9312E4386C5ED9FA84D6ECD1A32206BF12EA3BCFCBE5C4D1BE2BCEC76C\ 8F2ABA19F1F27A89A2299E7D52F4BCD5C4186078BEFBFF85EE3266AF41CA8E5F\ 3A929858E66A31B99D25:\ 5D2C1141A0038B998B5C7FC7E24BA1CD2B6DBC3F6218D6F598C9A0A3A3145BE6\ DFC88FFA319D96864620551A985518EFC9FC4D3F4A6C2B21BDAA00ABE64CE0A5:\ 0A68613719ECAFF4A9E3F17ACF914933 D11779689ADB5D3940CD4C1120D4D944BB0E7CC28F1F1C87E3E7E76E128F2CBB\ 542601F258CFFE937D4475A4309EE926B1D88A2D77AA8306E18D087DDEFA9E4F\ 9D06C3AE700DBA7368955A0F0C495E1149F85EC6DC0DD4BD430A5C037F85E06C\ A615232442525840EBB12AFC6B287DFDAEFD9822BF5197486BBD51B826C7C11A\ C7DB4DB3F300C223C3DFF6:\ 111EC8EA4E6F5094A8E3107F6A5A09052FD5BB317580EA80C65036537DBEF7F2\ 44BA22BE4514CEDB217FD914B4686A579BC8B023C8E16BC5466078BE193DC1BE\ 70EBD3C323CC5544924D0580C452D9B17C61B66202B44883C139280DC2028846\ 60C2CE6C26D95F70C64ED351D6B0E61BDB4E874F1B82EBA19386824F8CF7C63F\ 88C6AF4C949A00554D8957:\ 2BF4BC444006EBC96801952390E05B7C9CB6FA1267F9B50F09E29953579BEE18\ 22D5CDD0B3BC341DC187064E4A2AAE1A6B9EC545BB82BB355CAAA7CE1CC4D10E:\ 86E3421B6FE8939F1092D7A647EBED42 04766E2DB785725BA503819DC2BD4F340F9E788783981B8D0A48A91F7F3753BD\ 9612B2F66298AFD0DAF20B1C9B23BA45879A02A25515A5FA4FBB6AA4F9E29F5F\ 640385DBD9D0DC44EB8932EA3DB73D72FD55694852502E306241C25A603A3D1D\ FC7CC6653F60CF5AC2DA758582C1002866BBD396E874563F06949D7B01A3B5AB\ F6E992C5C218C3F9D3F54D84:\ 2FEFA5B6A8E4967520486C596E91FAA32C4D0CA2F87C5AD29D051ED24F08E961\ 121C750B7A8563E44A9B78F99A30E816BAAFFAA440BD29137A3ABEEC2304C586\ 57E667BD92508F5389E9E501B3E15380A94C754D628A51B4855E7DDF434D2922\ 2139C8D47B8A9077FB93A047F06870A39E1C932C9106C5F8549933167F01F34F\ 7545705627E631C4B3D5488E:\ CC4774A4B2B0713E38662FDE415A674C77C8D860521BD7A837FBB6595035E505\ D93754F035579809233D92A10F4EB9094F8816ECC7AFF9CAEDC48A8603E7F009:\ D62291FA5B2B0CC678E86CFA70072394 C465F5C10941D4975F303E63731D7D65EBC7647DFDC4732635E4700969AC9A3C\ 5E7C1850F42AC01B0B8F07CB2D0E985A726F3C802946F4B36C624BC0DD50F322\ 890F33711F4434B64CC274C7CED8F15EFE7E088A6499739FA985D2E888376F53\ 5F3A6DD16A5AC6ECC836A734F4BB09C82DB1A0BB8494BD8C242D3D555C15E6D4\ 72651B814A02EA22E413320B4E:\ FD6D89ED47D9EE30DDC776CA8592C0A8111F847DA753DC69834D9A6D092DFD5F\ 936F50A3FB3256B6A1BC76B6B51D361DA7A72773C7B4A92DB79FEF0536FFDAAC\ 18A479389BDF79974B363CA577E0C961C31A680C37E2529DA109BD57D3A1484E\ ED7959061AF28581042367D0AAD824CBA8F96547A61EB7517B5B2473184B526F\ 1BF9F72B64A54524C2E251F173:\ A194B48E1D5FD59441DF7B14DC819751A8F1AF7CDF6F1FE81C8AC4BD7CBCB657\ 7E178460B24EDB081A9423C0D9F6967A8C4BF7CD94EEBFBC7EA115ECD97C3ED6:\ FDC8DB35960B6C0C58D4CFF2E76A3515 E65BA732DCB42FFD966AD5EF6AD3953C45FA4CEBF47142BE2FEE9D98DE020A88\ B7536A633C151E77B16E37D6F30D1FB7BCE7E49EC3F3B5C7164590392ACE2C4D\ A5206361A381D07CC182E0FAACAFD6842971E7FCF005D2992A7A2F9B6FDF40A4\ 78E36C631B8625CE0C196CEE270DF777A48BF2487BCC29A0394881A54B69B03C\ F42E406D2FD69DD521E504393917:\ B8C352F394058A4A2D87030557409AD0840E87F20B3F5481F88B9FDAE065BCF3\ 8433C0EC142332676B96482370EBCAC05B7FCAA68676F25F5CF06636F888A644\ 15DB39E3892D63605F530835383A8A6FC573A48F858CD1CDC7D7175D47324842\ 3F4B821D049D8604DA46EF2F8807AAF1F63D22D8922851279F645509C1A72808\ 6317A7A64C77377C792637795D6D:\ 69FD3BAF8258261004D9F1EA076BF5E358D1BDAFF0C779A70B0051961E516181\ AAE416C6AED93A7FF465C2CC780EA7FFDA147C25BDAE869A2C0049A676FA0F03:\ 1F813975655755DB41D157C68AF69956 E2C37AE5B3ED0038B2994F316B7C1104812871AFBD4F1686BDCCA64D638FE6B6\ 70C6C24860A7E49AC34770691B1A45D97DF79940FD5E7FE2068751C5549815F5\ 62FAD16B3E11110C3BC4928A95823488EAA4CF91B4135830B6C979ED25638AF8\ ACA6DDB52D169DE7C55AF958CB9A90C065121979A7C9E7F5C0D5C8B9688957E9\ D0F447AE04A05085517AFD11CEDD08:\ 91A679E3D1FF2044C0708AA1940E9FA94768F1ED4CB60D67F0D393F6745ED762\ 791C9E3CD2AEA2B971C74B3248B1FBB012FDBBA109CAFC448C3DB0BA4194ED13\ C611A15DA00D663994846C504CA22DD580ABB2E30F406A7440B238AD15175851\ 5B047C226153A3931B7C4E3F74889E9FE2C7CCD7BFA5DFE8D70F1D38155289E1\ D2D55E3159C07E4692D1D937C0011D:\ 0125AF88A9951A38ACD20CE05E8CF99C6522F3E163E80BCBB4F428BDEA563420\ 427AA289D2F7676DDE807461749C2887852C82110A6A1CE8979837B5EB82431E:\ 9D4F8337DC1202FD53813F2A2DF16EF5 D69D8AEB53EBDCDBAA012D5FB0F3F2081DA76982B0A3FDF9B2B30A6080EAB923\ F9E1AC5846AE2B85F63780EF92673780EF724BB6328D2A76F77923DB1A829822\ 22BBA8E996678C3B20BAB4396B3F234C349285B38391A2E6DED26BC0CD92132B\ C5AA83D3E6DE09C847476776C59D167EF081A3ADAB47E0551BC304FEF5BB7D3B\ A7FAE7187E971CFC6BC2DD6A5DDE7092:\ DF12C4796004ABD43A0C77F0957B6DABB890BEC6819FE27DFC8D63BE5661BB46\ C6FB3E39E0C2BDF89DFD781FAED9939092FD7FCAAAB6B82C469DEAA9EF520691\ 00436601BD409D444DCE19BD87EDC6CE973EE2B2877E6C31613D18DDEA67F51F\ DF6C1394FB7463BA08A8431280A3228E53CA6F6158596A3C3E779619B816A1A9\ BECF84D9B948842C3C32104BB7D4C71B:\ 8EDE3C0F2485BA4D271AF1A14FCB7B9D104EB76E09BC74A854F73ED8D6CE64AB\ 26162E0CB1BF890331686EF493F4D9355C242F9F5921ABC4DB31D18EA638D895:\ 4F6060E046D31FC96021507D1B1F7E4C A0238A55E1AF5AF4EC55B1660A51EE7C3B45868487D7CE808A521E39766D389E\ F6C9B9768D7F97305A9C57E0589425E51F4FA6137C30E76A5F298D0EEBE07AB5\ 3E93AB49C63A7EAB441F7B1CAA6A61A4E81341E1CA784F5DE330CC93E8831E6A\ 11725191D4B9C601B3C0C1411587CB9189FA4FAB48173BF342BF411AD86210CF\ 89B015AD104E47CBD4FE6D51531E846485:\ E5E404C161E65FD1BA86DD5FE29BDFD03DA4293A0E0BB211AADF6F71D7ECB704\ 2094A19948A27A653C213CC317C86A61A13AA7C83DEE76FC3FE9ACE61FBDF5C6\ EC2244E238C8C30234275AFA9486536CF81FD60844CF3F981B743AF0B8756300\ 6B9693ADBCF2541462654EC438FDE2CE65BF7F81206AB1C692589B7D293EB025\ 37429B0062F39CD9741D577133F2CBF51C:\ FB6C4EE5B44336B3513FBB1A6568546B9255D5417A453CD7BD056205F777C5F0\ 5C80B109D76D32AB6E81497B1798E009909A7249D92E7FF80585ECCABE09515E:\ 77C060C9615D7CBA606F943299740EEC 833F44D9CA5D1E449AF04E987842C3B41FBE6C4B68FA49FE5299FFA5D44EEE1E\ C20610C83005FAA10AE792201D2AB21D38FA16DA871A5A1CD3E4F33B4B97D705\ 6D8F4A8F8C5E2D3BED2DA938AB80F8A313C75C8644A47322AA2DA9AD0F114867\ 0C15EBB25388C4E8AF6021797084E0B6FE4811146ED33A0E516BC969703569A1\ 34756C00ADBB6E468D21F46F6A706FC87085:\ 39AA1DA3E9BE202090936EA41491A9AB803E587CB900E1080F77BBF2EA1482E7\ 5E01AD7B9F62DC87C9A50FC10BF927A6D06607C4C5E137DB32E7A89DD5675BEF\ ADC05CE6E4E447C592541DD7B137D8FD5C9E16072C6B2B99EC8A7937B213C00E\ B78F2C76EDCD5D64C8081F4CCE69948D75800E7C18493971B32258879530FD20\ 66529CC6B6134CD9A34053558B947338DBEA:\ D3A7712282A755A22CB17176560345E8775C3D19499BC51272C2EB12D7359FB5\ BDE1F74AB0930D919AEA9ECAF4CB9E77F188432C39BC37C47FA6FBAB6B0600DA:\ 59A6EBCD762486D7F9B1EB5DC2E59DE7 CAA2D0C1473747DBB283A4FEA119B70A020ADCDED0C16FA43BCABB211EB7D984\ 1CC6DC7C8912307DC06EF8A30F5DF7301C221C1E9C0F4FA439A70CE9B7F292F9\ 387BC279EE15B559F5506983B48A6EC164DF2D0CA2C114458D1E39CBBF7AE599\ C4C2AE85DC02CD58D9EEE82CFA5CDA3F7A1EE4CCEA8E3247A69448551FE39F59\ B8F3EC7B4C2C6939A9CEECC8B8C868FFDCC3D2:\ FD97837BF9D3F50B1363CBA08028F29580E1BEC32C31B99AF140E1BBF8675D14\ 6720C727E038D626E949EA68E11A50974DB42E0798CDE9C3C1F5FC25205F6F10\ B541933FCEEB4190D38E9FCD0C3A8AC4A5C041DF1CD9487B5478E24DDB2C5115\ 7924528592D9ADF093F8689F03D5EA3F04BB340CDA50EDD20E219BDE3F61F6A7\ D96ECDB169DA7300B0D0F16FCCAFB064E4A6FB:\ FF50D6009692A4656CEB5AD776E69FA55B07870564723F3C4E5EE65BEB053D4F\ 08E4DBA15081424EA9689FA6F893B9161C3FBAA7EBD910FE81657685EE009858:\ EBCA601EDD1F962B139D2DC595737C43 18CB59AB4115FD49269438F2135E1DF69C5F599A0E6D74D7B25EE0DBC768947B\ 9BDE8BF1DBC72C72163C4610EBFA251C84D14AC27C5C8C0AA819C8D070252336\ 29C9BBB7F26443C1252DAE5E29A2E26676709E0DC0BA3322437CB2269937D461\ E0DC366035C17868FF7EC65625A864E4F9DA97B57B04426F02BBD357F2C03220\ AC4E6B1D55225FCC6FC82975CD7D80B0CBD53A5F:\ 711D01E11145CE9B88F7A6C0DBCEB7A5208ADCF4C6A20A258CF307B9E17A3352\ C49930479F23BCD9B3FE145FE821537AF6E57E8FA79E916F5133A8F8303EDF57\ DF919BEC301127B521337AA129F52707B0FE2127F7D49CCD2509F50F4EF63931\ DE626E23844AD4925FAB2EB39FCF57365D2E7B06FBE32D8FFB9C2CFC63ED1772\ 36C79B9EB8FF69EB3BED7B7E5F39558991691669:\ 0148EB1C26916C7D4399D14B11177CBBE12E40FB4793B2D9D545D86B4489882A\ A40C71A1678A1CEEBE68CCBDF20AA3DE2DD4562F4505EB9974341B4CCF0937CE:\ F070781A32003D20773C27840AF449D8 C101DE3BC4ED6917EE34D2967ED3F11FA9ADB53D27A657BF6736E7DABB33686F\ 022565033B9F349C53048257919F90539AA17600D5027C475C05CA56AF72C256\ DB7627E7199399513C6CD92598B150562D945572EA9D73FD2CAACC638B912241\ 5AE8AE028AAE6F8FF3F7247D4CBFD533813B6A4410FAD2B94463DAE3FF557889\ 5C47350AD95F26F37731B56B2AD1EADE9F9663D752:\ E5E12CD8D80BA44BDB7753FE86CEB0AE4AEAC30A1C1D531445F4B4FFD070FB04\ 1F0CC48DE1C0739F862C8A3FA3477620100A46A643A5A40DCC8773A31AFCF5AE\ 9E29FA6AF612D39D7C99059E55C46A4A45149D3FE7F640841046D5438C76BBF4\ 37E6EF01369A37ACE3127159B657312175F800E25FD390BAB0E44BAAE0CB2960\ E6BB270CFAA0D3173630C885CED0370F0E97311AC6:\ 635F6FB4B93E5D997E8229AD36357850BABEB96EDEB6D3E0C0077772784F3326\ 673C04CD4052A914E4A083F6C1D369242D145205EAFEBB8B10FD8D21510624D1:\ 78E5D339434BE5D744906DFB6C36355F D4AA658933CED4AD151674F5F1B17B767D978E0895C138E6F1CB1AE89C59A931\ 4570C31B447036CFB4859D24343A59E147C009B07ABB8ADECA7537E368AA18C7\ 08341432E48AE06BAA2175FEB0AB4D32C544F0B225DA52830196EBE12C61F048\ 1423EA8773F5113FE28BB4D888DDF54F3994BD631B59FF98982D4C56181C892A\ EC9ADA5C9FD487797ECACA38EB8445D4EA1CA367DEEF:\ B742DF92E3FA1A7846F7AEB6AAE3607A47A7BC20B52D7A4209786DE110D3D0FD\ 154C5620F7F5BC396EC21E3C3E9FE46B7F527413657D589C16B991A96BCA7524\ 819729329CA94C9719123EF2BD9A371730E6E0A658BD6113C301B3EC8007CC47\ 56F7138AA06137D333A986833839AECAB325611B869D02F771EAE7385BA3A019\ 3BFBA89081D2FD96507CAF0EA504C717D9807C1F2272:\ 17A8A4A8BBA9EE594818C91B97407C3BB8066960B83FF216E8FD855DE3BFB1F4\ 7119D9BAAD2962037254FF5C60A8609978F2C2CCD6C75D773CBF92FDF6A3A13D:\ 97C290F3C7EFED5EC7F31E4C2AC2EB3A E1E6BD03BAEB87DF26924E9A6E2F739D8AC726805C3D154A19A2DDE6F84BCBB0\ 804BB4D5B126763A124D51DC569E91A88720446A60764F0C253C3B946434CB4A\ 3B82E5ECEBE87F3172DAEEAF7FB4868EAD2E2AF903774CC66E67041BC9DC4A58\ 58083A1DE4B694D7121AD9A9098598E4300C67C8AD0E860826A0FBAECE317135\ 90B3295E5A264798120A3223474DFF5B3DD28A286AB8E3:\ 20882F1BD13FD6CAC712CDDADF035CB41D16A5D78B2F7F0CB7FACC0DB80A7675\ 2400EE878D05AE00874CA4B0AF7208A9E8A142F690767BE5078711197850207C\ 039DBDA3DF165CD94C0B7CFA2CB481E891401A44F696DABA86DABB6304436933\ 1EF12BBA9F1981B3256AED90251600BA91AC3641C917E2457B60F78939E62B8A\ C89D1720CAF9543AC689B0D5CDE0BCA9D9EB0AD86188D4:\ 05FDB8E1957E1BB719C1FD3A4392D95847B861D556A39F3A97E27206B63E8642\ 5D262AA31BC580180479509D18BC3BE0A4F62C50E451D0015F05E98EDFBE97D4:\ C8779A846670B7EDEBF457C76926E84D 48BA18139223316087102714AA4D2DB6945A1E9BE9930B2856CA187E57B02CFC\ EB82B5CE50275EF772F4A1DF4FABC008361721C62DDF1B01CE50DE2A628B2B2A\ 61B0D1FF3E2960143D021ED80166B26EC293F9088B46518B9EF163884A3A09CB\ BB46CF6E298E0A859B240CAB3F105ED768FA90DCA66AE7239D2EFD3B7E7BA7E7\ 7D815DC9F16F824D0F25BA2971367517A159EDCE93660BB8:\ 2F5BCBEC75FB0AFB8F39C2F48F593F6863AC5B055B815DE9D56E848070398BBE\ 8341709E21855FE009CE7430127AD445642327E7641B83CDA94DB3F6098700B8\ B524AC2D029B31BE6A75F29FE0B92D0DF86C098BC0C7169BC1AEDE9800DBBF18\ D4C5AAA8D082B357EEAF2930BDCD658644B0AF7F116B63FC79ADF5A6D5CACCDE\ CCDD0D05CD6D1ED79D77490C0A092628072128D408EA4DB2:\ 1FD85C1CCC7F8AC116367B040C3F53378BA7D9EF793E3F8C595BFA66C017F53B\ 7E82B43A30BEAC9ECDCB66BD1E825887D9AA5AF65E74A092FD489512CFBC5D9D:\ C5228BB3100D3BA341297226B5B2BB19 BEE3329E50CEB79B31E9145D8BFF1641A6CD1EF4241E9CEB1250F8CF86046BDE\ 097DBE79B48305C3E41B0A7A8CF1067544477BF309567C2087D9DF818F0737E6\ 12F426AC6587E3693F3673453E6C05B0E5831382EA23E322698EF85176DF77E2\ 18ADE52491412AE0C119711E75183024F89B4031612517F39DC3E656C8A648B8\ 52DBEFE0F28A25CBB6D3C706A09506B3307713D418268A3CE0:\ 2E5B93BC1B4034410445C296C713E8EBE4EE088BF8305BFF5213EF4C10B1D859\ 9AE54F20F5C21B1E98D974C8712D0C224E75CD88127F999EB0CEB7C232777B65\ D45C32D2690FFA784AA0DD97E679A962434921F57E59A7B0DA7A07D5F7EE026C\ 969CA5BF389F9F777D2B4158AC000CF8BDE62E4CF92ED98DA63BC33E5D6C20CD\ F15423FEAC6F6FA541875FCBC84300795F270287F610C5C117:\ D418E11CAB049E5B4876B581F353904F8E54B5BED4062A6DB854460DD7BC8053\ 23CF1EA9DCFF0659FCE3AC5D58E8ABBBEB0EA73E119B0AFB872EE3B3294F91F8:\ 3B2DCE189596B5A09D7768766C76346B 9D75AF0B17241AE6B15AD8DE9E59C030FDF300456210A11773EACFA00046BE3D\ 03F06FC5AF5247FBBC63EEBB98048E0BB173BD52734C643D394B7535F981481A\ 940AF69B7FF5AE956B5BBF6306559E43B10E1F578E49BA6F8D3C029AEB96338A\ E2FEC116B72C9C520BCC211D11CD0C4AA953CEA83AFA45497B15C5152452691A\ 70A261E29636D90B203C88DE29ED31A1F2C03EC3E8CD142A9637:\ A24F09563DE9C2E63CF5202F2F8898836E46914C020F726ACE3D2D9B5C9D2443\ 2B02972DF083DA78975F76E1CF2928647BA5559D1AC9D26FFC1324E6E75F0327\ E800950D10014FFE349E0C22B3370F8AE8C8FEE323E4AEB2846EAAC6A8FFE791\ FE75B76730947A1054FFD391CE88C06C835A48F8D0E302E9009F8E7D2F7E343E\ 057FCB9C1D6E25D40B818536602CD4F5F28F8A591ECADF6D1DA7:\ FC858C754F5A0F6DBC4CA9B4EE8794B7AB138D8217EA31D9E0471DD4E4B29E7A\ 341EE5E9D4AA9F5744DFF2F5BD4591E6D383B68ADE59CA5BACE4897E154F5A60:\ DDD32533E7CCE75D145F9E75C9750FBC 03147E9D41521AFEA74653C51F86AEBE54795997840CBCDF01C83F5C5CC51840\ 693ECF171F848909E6958B6293C6E2A6F998A5202461A99447B5701DC2DA093D\ CF94E88F7704BB25CB2FB16B9EC84D0E5B20895A5BB413359EC2166EBB1C7FC5\ 2B9A8302A05C638BB2AEB43CACEC2167598E5B92DC202DC0E1843C827770A502\ C65BC54D956C0B8B6817F1D9D85B37B50F5FB9BFFA9B3FD4E987C4:\ DEF9E127A66407CD5B20C71CD91703044DF8EDE655529EF193399AC127D9B763\ 70606D7F187CC343E855967814B3BF265C3EC1FEA8017395B81BC9AF54F23A05\ 3B71EFD3E03A847E0B0B74A367E4F4400F0513A171066E2175E9404B3E06373F\ 3F568F4F2BB15031884406E67FA4A101D428446BB0093B8ADD0BECC1F5EC81F3\ DAD6C20101D53046AA5478B6DE03199D4A9FD9CA0B7FF7E0378E02:\ A96E4AFE8841E78095ACE8DC9DFA0B9C1D239E9B9EC21B4D621F537E116FF538\ B3D980C69FD454144ADEAC7E8F48CB1E78DE10535D4B769C4635D467005739BD:\ 67CC9400071631DA0E28D38D62A9263C A5713A182C829934B7589CAC856F5708C8E0450466AA0E2BFE735A7F0B287914\ F35D7E549B27AA7679F5C4644DDA3FEF0A5735017F9AFDBBC9651C05B5658CA8\ 6CD4632ABA3F521A73BC0CE784CF1CC744EB9C54081EA55EDA3842E2745052DD\ 23E7DCF4933E2AD0723F652DE05CD6BF70D0E24CA0AD224DA11AC44C85E78540\ FAE16F4856CC5A372E1F4BD2D8205E2113636FE3582FD8EBF963C952:\ 77ACB02AB169E65C492B408FFAD8317B07475DB66E41D6EBCBDD7E70FA8BCB6C\ FE7C44ADD7275D5EC85591F211720548DF116E162F92653E06BDE5DC3E870228\ 1D7CF91DBEB76BE4F1D0200DD3DAE721FC0C9689E57D84BE555CBA33BAF9B85C\ 59F420BE49707EE2E74A35787A95EECE418ACC88EFF8204535F9E8A994D9A434\ FBAFAA1AC8E715609CA00813A40BB8F2122556F8429D6FD88D61ABA1:\ 3FAAEB0FE51CCF58ED4421CB967C3CB22EE234F137C9D68FDA639A466BDD053A\ F1FE32D00A5E74F0E180330CFE861D55CDE113EFB9AD4287C0E0F33060B8A067:\ 12C67C590BFA135904A8B77A80F68C44 42C92C6513FBEEEA129DA7673A4B246AE288ECA8D04D34C6E3AB623115520ABE\ 6E45936F7384770108888CF3A10D09CC20C31DB156D15925098751E32AD9946E\ 2351A0CC3E50DB76BD9FDD8358252FB8A09AF008C72D08DB74042C0481633F2D\ 7E200CD391C46683A8279101521E8358DB666061B03E2647AF84E9C647950647\ A641ABF8F23A23647908B92F4775CB46706C08CACFCA1BC510A7D83E6D:\ 2304811988309197D798FCD10C2AC5A6ADC402446A3E63B23845D09685BA5089\ 9291854C68207C5EA3CDD1701858D7EEEFF7AE5644048E3D9FF9386FA0EC6873\ F4E2A4860270E59EE4379D803C520F54B1850BF27B492C39BA8680E780AC3A48\ 24D390F889B1E7BC150C5BF4BE22258AF437E6FDBB15AFB559771695E4C2EFE4\ 192860637F59F7DE1CC86426E8AFAAF8B723B24A338C12325AB5F9D472:\ 0A5989484C2CC25ED6B739204B3CEFC7A0F6326FD225BF223F4BE2A5E0487D62\ 7C76ECB1198EEDC7336B8AA14DD2F8035F5D0D3044BBC856103415D7D78F3D2D:\ ADF628CAF9C5F249CCAF2CC89E34F9B3 3470A4AD21C00C966B17BC8DD5F8569ED0B854FCB9BE74EEE1FA807E54E9C1A7\ 0571CD0F553739C27754F6CCE705BBBD76FE1E8EDF3B4A7A84F5DABEC5B651F4\ 76762D369D1BF6B9A21EA657FBA7BC44639299736E24F1AAE37C9CA21F053444\ F916530A01A7B8CEE66083D7E0FAA85FC4094AEAC43F196FD5FD529382F932E8\ B90C17F60CE51E08BDDC990B0FDD976F9F30FC787F0C6374A98E40E220C5:\ 833FF82B7FE76670DBDF9933776CADC86CF3BCED569A04C6004A47F88C13102C\ 0D6093D01674DE7F6EEA71553D34B4827003FB12A5F5A8FD20545BAE090E7DF2\ 2FBC615DC47200267626F9044220CE27DCB0AC24B5B581E98A29E8B10AA3334C\ B12C414A9B373E9273E23D5D8AEFF865DB27C2EB0A59FE44342ED12743F26DBB\ EC77B832C5871F3E0F5427DB47BA22DD2A1C6CE269EF8FE1308EB2CCF1E3:\ 8DF9E4EB57FF2ED6DE948B6B53939D80515E38B1F955F07CBB3E0414ACF716EE\ 82272E447DF64ECB6A6A230A1A6ADB94CD218828833E6A7BAA9BC1D43A8A30E8:\ 0D7A40C5C46B0C04CDE693840874C7D5 36A07EC7777182BD6833687D237C92C4FF12A24D910F7C4CEB0ED4DC399AEA57\ AEF55D8E545BC50C081E6A4A77E6485EC6FFBCB81CC41169B136D772E541D73B\ 1669316FB67EF6C70986FF1F2AF1068EE7EDEA2AEAF19483C31A56468FDDE03A\ 09F3EB4658A11192AD64791ED8A06252E30AD2CDD693A8C4D5E76D083FA632F8\ 0F85FE7A834DF7113928C5E1553D5EB05333E807C4D74B2D7ACB6432D9718A:\ 6D00149CB8CC148F4227EC5861D9389BDCA9292E6A1667F14F6CE272CAD86DDF\ E9A3F54246793B2526B28F0EA618B4AD632E7EB49CE05F13E310F39CE4C21811\ 473BD0B3A8FD0679387849ECA70F9BDCABB40D18A25152CE4A74AB4D73756424\ 2FB7202D61A5D565DC46DE56768257C9574AD55E383C805C1CEEE9EA319C55A4\ 119A98839D9C606CAFC075BD588219392C95CFCA2F8B6E7DF01E81DFE17A19:\ FFA0B110904FBD276074A7585BDC073542F0034E762C00884A0569A6E0058B05\ F19812F21EB21E481C08F570F263310B9682514B48AD0AAD863E1988B428F8E1:\ C3FEB8E49005914DCEA75C320A69AF24 D5503CA5AC2C07FEBA34D137985EE68693FF2361277A64004DA80FB35099AF45\ 08815D78EBD6A28B27CF8162735C59C70EB6FC670BB1B75A0E22D18EB156AA82\ 3644C15E197BC32C140AC1FA0D8EED8B66A5AABDD8070BA1340064F50918FA82\ 08A880E8197CFFCA0D7A781554480E4980D740712DF402A864649E610608CCA5\ 03B66E1A09F353500753658E17D44A98761D84D34282489CFDB2EE5039AC3777:\ B21860D696ECA1216FF45105567831F5FD1315CED5F35F21428F9CDD2BECDBE3\ 97E6A69BD6E5B801F83542D8A67C52DCBB2766B7338DDE2299B6168348713834\ 9AB68B13970169672740286ED4F4E0A66050A72BEE429BCBE298FB07E16561B2\ 0E36F5C1FCC4AFFAE0A5DF457821F313F6581998BEEB7C0495296961DAA703FC\ A6CAA584C049960D0136617174F24549BBFCD5164939CAF8CD7DE9049CA4164B:\ BA3B88F214DB327F4C47A42B238762FABF73318D0DDC9B5D3DC33C9746E57DBC\ 39B91B4B1E1D755A1555E68CC291EE37788DB23A4ABE2FB465B112EEE06BBEF1:\ 431630AE857DB77B8B64A7737A10FD50 7933C19B0664A9A404E294A17F621506BCF48B8D9348BF1F6EBDE1246082E8D8\ 5ABE46D9CD7F6F05C8EB495C6A06EDBCBB1232BE78A450A9DDF6EFEDDA19E123\ 5D367E519C7FD30A4B085154B019B8D31E50F86EA0F8CA9C925D79DAACE28B35\ 7CD8A58B7B478676BABFF33D3EA0238C8EBBEE6A9DC2B9FF1D869FB9B8E51586\ 994320CAA7DDBBD1692EC82FBD96C35EF128946DAF1F1735D247161E6EE649C5\ 9D:\ B6153EF1CA49763F3C73AAE1E00B3291322E66C5A6014DFC9FB8E9DAB772F89B\ F1B9ACFC7541D6F505A690AD554175AD596A479AA79A717818200B36C8333379\ A9E0EDA8356426D9C6CF88BA8D6A2E4924A6E74D31717520AF104B3D4172D521\ 6430B4ED1350AA9E89C8FA71BBA84238EDBB543BB97A719467237AA4472E5815\ 33D213BEB73F12500861B79A6CA05AC7D8FE8082175E2206185A12CE78B10219\ 1C:\ 9071A109B17914BECE4D1A15CCC15DBD3B93D7673DC4688316E20F209A242B4C\ D234F600F1424294AD432B9738194C033AC38729E47296777311F2FCF46EA18E:\ 616BB9EDC46DECB42DD47FDE2D98F30E 76503039E69DCCBC4387A31C0D693F362C4A66FF6FB90A2587D9D21A6BFC1FE7\ 38F7F561A3145E7619FED0A474BA9280743EC3A71F8E74F52D7FA77CE0CA4E47\ 8B7274ED1945A53A60317E7A954298EB6CF64921E31051E1BB0AC0ED1B91D12D\ 38B5F80E3D5118D02B6D168B5E7EF256673502709674CFA0918CF9384994283E\ ED8C31FF1B0B2098787F578206AFAAB591572EEE220AEDAE302A0C4392C5ED9B\ CC5A:\ D008E55E9E942051A6CF11E35B4A70B11103819D8C3C09592455DF6C53878B09\ 84DD9128D44787881D8B8A8048E43CE56D009FA26E3C238B6D2D1FC001D69725\ 2CE3DAAC10AB31E2D4E4ED25476E2523F99B19D44897802D8CD4E28E8B552BAD\ 3975CDCB7EE3847B279787A1BAB79EA062AF2934A83CD7A6543E2F2CA9B55542\ B0E11E93C41652DE73EB476D29E119413D8BA37C25AA31C559D51AD8689DF2D3\ A70C:\ 9556F6DD01DD1CB5BFF6F98A783DDD7307DF95CAE25E3A037B351ECEA74D1208\ A091C68699D0109FD41B04C7D36C38D4944BB04D3051246316D7606F8A7C3FD6:\ C52EAC897B1C92C2ACBF5D77E9CDCF3E 0E830E756DAC3A93AC9ABD80D932502CEF5EECB6CB6B9C903440D9026A529F17\ 3388AF70A2DAB1D38DE42EB02EE5BCF6C80B00FE9E0A06E5164B8FD04123DAD8\ FBC5D78B3C5028FEF7576D7BEB80D346958A351B54308D32700C063F0843C821\ 4823A10323A5AE8DBCAC8734AC9B05795F807D265E74F4BA942ED9761398F199\ 14E9EBE95DBE972E51F6E7174702E04C7C42878B81C81335F0BF648BC00183A8\ EBF69A:\ B7BBE2A819733E59278E0ADEA206FB156335C366DADB423076690A939E345F7A\ F2944F9C502B409ECC94BDDA44F8CD295F2333BCE4A6C930255F72A1E43A4E67\ 98912D1E9C6738BFD68E93A8EB83D74C0CA0CC64014E696CF64568D8A31F3242\ 489FE61941F6AD0F9B38BD5B90C781678301E41C6B82F324578F88EF6F157EA6\ 328842BBAD08841AB90BDDB8FF08CA9F2443FE9AAF299076F792FE03380A4DB2\ F11F69:\ 498BC2D54FDBE02095B0A00BA331ADE4EBD6D14A26F40CF6E96F1C56DA08A282\ D76EDA26B76D41399D66F91D8555AF54561ED162D5EAD46D96714BBC93AA192C:\ 01CC772A3EBA55EC4E5B5F03C0ABA17C 44A0FD4C39905A704FACABEF27F0CDD8A2ED0E141AB6F112EEE466650F3A1D28\ 74351198294910C484ABC870E028A24EBEE81403148C4DC2B912A3C36D218A33\ 4FD846E3D0DF3C8110EFCB04FDCE27EFBE2F776691BD4218D3C3370AD5F57D76\ C09B6A078964EBF9756D50C7910D10DBFF369F40420DCB202E601333C6455846\ AC4ED3AB70444379FBADFD0549439FDAFBC61C532E7EF8FEC3B39378CB84A792\ 56F714EB:\ D95488EC9DF7882AB907604B632EA32C98BE5500F9FDC6D79C2630A8CC874297\ 44044B4BCADDE1C86B24E222AA4FAEF13F909D57A495D1715994ED49D04B7ED7\ 2829C8CCC2303A4426F7A17135B33E54683B457C08016A7BAF4B0B1AA825DDA3\ 6968E6180EA33FEF561C191CFCE5EDE2372E05230B7DD98676DF6E282F14467E\ 040A489DFAFA6DF71F713CFBFCB188E861C60CED4B181FF435D7A1F04CD331EA\ 544F789A:\ 65E574BDC8C3C861F0F81E8FBEEF4244E66BEF56FEDAED4A8E76BB2D04B71D44\ 4A1E547BE8E7EC806A716C893D30AE91B0F7DAE1AC0DCC7B079133457B9CBD9B:\ 4B067CE2104FC2BA17A59292432380DD 15CAA9DFE923DB957602D0D9EC9277AE8FC7603DF72B1707C05E96A9E5AB6E9B\ 17C1C7E4AB57A3495DC3D353A5E7FB29D1764DE841C600B0621FF0AD0AD3FE5E\ 58B674329462EE4DFB3EBF4BAE3B5E23145ED32FD199F206BF8AE1591E9B8459\ 6942745A0BD313AE2B45B77428066C6D0FD3166C6C98FB8B87865F65F382F74F\ 831BD2D2CBC83E63243B025FE0F695961A2E0B5DDF2569C3A81F6EA61A7013A6\ C7E7109E63:\ 61B18CE005D9ABE43785073DB58262109AF3A1626551E1E436DB6B11DE937691\ EFC9394A230A9D7AB375072F69C102AFC2B0967E24C6B38CF6E62AF31182F723\ C425581394535E4FB5FE7C1C95677C5EFE70884E3A137D5DBB76BFAF33043982\ 83F4572C19FBB0070C33C902554D0E689D908800DFE277AF9C0F07AAAB1CE449\ F3AA8AE0B3FAE7922E35690A969C7C11B45D806CA65F40B614B90ED2ACBE2C8E\ 701AC1B8B5:\ 6694D4039045434C986BFFC8CF2E65A74929FCD8C50CA9CC66089AF5D78D69F3\ D1CDEADEE07951AAC601D30DFE6C0F919DBD2818B77E8FF68F6F22AA51ED658A:\ 569097E3EF1545EEDFF918679624C54C 61EA089EB8475C4738FB91F5741D5BFFDEC475D53C2DC443F353659BB1219582\ F67F18F3C580A8C7DAC724911D482034AA5742C56DFD3650E513461EE5E71DE7\ 17A2C76C0D284925BF627ED228AED4A47E9AE12CCF8BF1B31D3FAB701AC1338D\ 728E340B3321686DE327D74E81B87A1FDF144EFF120106A0A0572DCB55FDCB8D\ 917BBA5CB49B0D602A3400F991EACD3CCE8771C1E1A495F7AACACBBF4106AF41\ 8F9BBA5771E4:\ 321D87BA6DEC0981D1499FFEAB9141FF884CE06AF69477923F67DE22EB3E38BB\ 250C67FE84CBFD89F43CD9381B980604046602B9AA9F4B021B433ACD69B400DF\ 32EB486835AC655BC2677E6128A3E5E038022C627B332EEF2F9587B7754B4D86\ 7D0D321AFE23AC60928D3A625CFF873525EF77CF941DBAACD7B56859D0EBC693\ 18DAE44FED8B48ABC1C8F65DB354E9C2ABB26EDE74290001E7024CF7FE812A80\ 1B448B5B44CB:\ 56E4DE4690A9C46E1A2BD088605E4AAC59BA6628B8AFE9767A4A86B97DF7F254\ 3F4FAA1F63A6CCB9237491D909D11A38E029633B4C98F7A9D6291EC8AAA70035:\ F87BA2EE1032135EE28BA4194C35AA92 F4DE4E8FE4D647944E70CABC8F6787CF0156E743D6F3B4E3F27D0E657E1E6D1C\ D52F150F98FE1011DABD857C393C1486F4DF8CB2C137F114D97C5F920B1515F8\ 3BC052B9A2BE132F0A26116CCB2DFFCE3E8F59F9E7851EB7ACEB35D92DCD3BDC\ 0433416BD95D10FF72F3D8787F0C165CE6F46DAE2321B3826543683BB1A22E39\ 9CF3D18F2B44A805096EF15AF31FE70B86E24AAE7C0BB8EE124C5F8CC894348F\ D1421675CE9102:\ 711011467AA91B37B7E949CB306AFD30D35C3162F57D2064EDCECA43FE94F91B\ 90A70506FC0BC9D24D0AAE3D3845F46440E2EBCF6E9B1DC2A0D9CB633A872CD1\ 91F9CDC7F09167A2E8BEB18EA6C4FDD214A261A64F81A847AB87A3FB8D51098F\ D429402DA76DBAA038E615924042EAE29219AEDD14859A66222A2F7286507F92\ C295583787756972F2F5BEECE05BE8D76CE08522AFB1F582B10947BF3B1AE594\ 3D3A89E6486F26:\ BFA826E4AC4DFE776D0DF8DDDA39793DA889F672D5FB898B25B285B3F42BC784\ 325E1E409EB4D0B5DAD7F7E42164DBC6BB892FA87ECEAE137EC3A0ECD2484F42:\ FED7CA3DA1BCA3994D0D3AE147E3F1FE 9BDF21BACDEEC9C34656B418A5B9D470FC9A3AB86C68990A86B1D4B02AC6C54B\ F88E3CBE9863AE6B8BDDD3EE59DFF09D81FAAC5AA76ACB601E677B1009A995FA\ 394DCE8FEFF5C3F0374009243BF87F1FC941B933C92D0359766612672D6A1B3B\ 3C29763B4D7F976457C2A643FEF87CBCFB5257FC60869983F901E7E237AAC0D3\ CAF0F1780E0E2F72A9D60224FAC80633FA7A54688EB7E045D61D6684B4467797\ E1C4ADDA2A27D031:\ E9D79BCF79A2A078664921A91E2E0173BDD20B32E0F232FB9F0518C3E495767B\ 625C554C33D7E3A81865B6624B5A1899EAE6E5114BCC28D687FBF5D1D4699948\ 04D571FAE3F08F067CAF4D398C74893FC7CC11C732EA5A4D0021BB3C364E82B3\ BB551C71AB76E913C6AAECD9BCD4FF31D0110DE721A5E7CA5064705EE2030853\ 97B9DFF75765ED9A421455C18F3C1FFAAAB0C3E22760CF14362FDC103DFB3BD9\ 7F7DE86FB8302DF1:\ A6D9FB1C7D20E7E3F9AB81BE975B7674F7BC5A4DC6FBFC0F485FFB634FE3728E\ 90AA7C2A76010209579B4CF9636C9D556A0D8FFC97158580966786E0FA3339F6:\ E72B8B864E1AC1D51B6E0396D5778F2E C615DB8A7FBE10BD792680B7F7A7E48A70085D124BDB7C124044EDF76E496D44\ 09BFBD10D139D1D22E0DFB52D02F3CEC8BD070A9C0638B03224ED25A2C893452\ F4B472F7C7533068A579734299877E6DC52564AA0F66B1E71A58F4788E83AB8C\ A7F35315B2FA08EC34843BDAC9B92D845F9597674FC6FC8C8541384A3C1A1B3B\ B7E0387381F9A5B2BD498DD59AA1A08E6A6A388440C5086B9800B2DFD0C35F40\ 29D13384CF63C3469C:\ 66D12F0BDF0BAE2D12CF375A16552CAFA371FB4B79B474DC46EE1975561AD92B\ F0A5B8F3F72CF1D714C38A345A651A34BFFF24B9ED6945D6C08FBCB6B8508888\ 08AD3EF5EFDDFB4B4B43A33B250AD57D6313E9DC5E02603E0DBF72643432AFE4\ 4397CB5FF4B04D318DA22C85298024B359C61C09459B09C95A679C81657E5819\ A6A4B2FCEB6C18B81B4268D2642BEF0673537AD4CE74450A05C3E830E9472E11\ A97FA954AA443A6A1E:\ 0876B75D86B0A36967F5661E5A0C95366ACF00EBDB818C98C0B37F67DC1D026A\ 84BF9B5D6C1E33695CA4CAA9645F02C8ADDB0177C7716569FED8190DE3D30FC7:\ 3670D6E827B6FF18102339B4CA24E91E 4DAABEE4430E71DF544C7153760D76529E89A09C83354D8D3525366DFA2924C4\ A9423D196DA121B7E0586F6E8A05937C99984A15C242CAC0EB9E461E1F38222A\ 27FD3A580E56B119B654A5E28124EA01401EBDDC252926E2FCA5E89189608218\ 1C9E611CA9688E0BDB6978936518C1F2413DB9E27E54B1F01266A56DA1F75147\ 19AED12F6FC127D651643886C21AEBD1EBEB6CE0E2F1B7203ABA4266D5B44F38\ 02B43A08A60F9734CE3A:\ 77A9EA4431E790EE78704CC10EE82F2B5C4A43EE8D7398CE0D625EDC68C3C378\ 143F8A3DDE0E0E72D5ADBCA3C0C517A2F97B69B0306212D448773F8B62BE84A9\ D2674B83DA8820ED7D50B430148EE4C73305244E2D399A0EAF27A97EAC959C20\ 9841CC030EFEE1773F057A87711CFF16D749BFF94A1078E0BFD0B619F19A9112\ 15218E114E02832AEC05239345A785006AA1C1E2EF1124EA1FD7CE51D16D4338\ 19F4E2C4C5E8850E7267:\ AADE70F812A185B4D67FC5C427481DEBCB79980A027C5ABD52C89650406065CD\ 2CF08437640DF24229C21630B3266031B788B2AE460BEB1C7F34FFCCD1C266BD:\ 05B5EB69C7A36A842F6A45DBF6613778 E5D58C8D66D6C1DF53B695E13B0F6E93E7057683B59D0DAA79014121FA3DF062\ F56927A97D17B28AD6E0A8A8E83B9BB0E790A666B2D7AE8FDC5256F7C0AFB492\ 7D8555842C9E19C97D131BE5FEC8175C2EEC3CCFCC1C8B5CEADF2EECF03E3F71\ FC8977B439693B6E2DB84E679EFFE5C0AD2B44560FD7CCB771DDECF7424B9189\ 916310B3E0FF79814E486C62D418ED244A31B7618C74039BCC04F021728E28B4\ 2D607A3E3C0F31FCEA10E4:\ D487D3F8D0DC54E4EB2A3777A55E57C87D433B3854F8495F26A1FFCFAE49C756\ B792544CD401D1DBCF36663DB13002FDE299307BD725CB37D6C8280E3B20F5E9\ 4A361F10656B0EEA72AC11856CBC5A73869365B5F8FCFCF1F3F8ED11AB155638\ 32409CC58A4426BB3F7CF045114CF7F9DA17CE656BC6A2E5FB5A26E2EDFF2986\ AC4C6A44FCD78DA5809DBA5101416A5AE721965A975C9018788DB1B353922552\ 8538E94B684005BAE66120:\ 0C7FBA046B2175D2B3BF6525C5105A6BA8E22A2BB2E690A7A76557345DC5CE80\ 7C4F77C663794B302789C3EBFC45C150253DF057C4807BEF45BB3AEB57D27866:\ A75C7C67A7226C4A4E172D168F7DB0EC 725923CAFE2455B46A3813C76B715AD76E8D6CA4CCAB579F0211CC0B772C157B\ 7010056014A6FAF65CC52991A1B3D39E4CEDA5E53B82F9A8335E774667671D13\ B427D136C76F253BAAC9F960F4C0367C30C1957F4A22270F25092DD747704C30\ 9F19FFC8D47BD85776F37DF72DC15C1BFADF76D22856CC28B1D84684F2E6EFDE\ 8C4E4F1964330560CFAC1F7B2051F2F1AAEFE6C46A5531D92A6ED61D3ED651AA\ 457E829E06C71BC366820111:\ DD9A6B60EFF42B4E2B13824037D3F9BC1B056A74C57568E346777F48C69BCE8B\ F14D538AE10935417F12A2C6458B918974B43A9E31FEB55B417C1FF9280A70EC\ B86CA2DB8A3D7192E0AAE59F05B3975215F5B5D03D84704D52EA9ED6DD4FBD1F\ 1BFA8BDBEFC81BC66ECA8F2C29DC363782069E2A48CBAE2DB493EFD985E290A7\ 64F68F2923D1471057DC7140F6ACEF2C1496646FD10B3951E0A98C866840938B\ 2477FD8C8FB894916CDCAA88:\ 1C9DCF071F81ECBB4386E500216795CC0979594AC95241A0F2F202BDCBF8B771\ 76C548C4F1571F1691082BFF1E26B0E7CC015915DDF2760A38E16D55B8C212F4:\ 585958A7ED4EFB97BA1AB7A92522D8E4 A42241E600E862D1C77E1436444EE3B8A0511731401E818D10F7F1B9C88AB1EF\ 34069B3871977FAA5F3514B56126F628CC74755A945E31E2C06AB83EBCC999DE\ 1185CDAB0612DE962CC5FD8E9A833C79015E835BE196541E8EB6B67E9B14F9F6\ 5B667996B2B303DB5CD970C959BE43EEE4BC87F6F8515969131F93BAD5CA40A9\ 84C5BF7CC7BE8667476A3BCE769ABDBD38247B3C1A63B85137864FAF437C2C32\ A4314A0A178B224F3C3FB91AE6:\ AEB660ED08E1E60446F7E33BC58383A8657DA89D98F8D6502E95ED5E7545676A\ 8872DF494C4727A2D2A1A3BB98E03244D025BF8D6E236EC2B7269B88ECBDE6CC\ 439021B6899F0D95317D46043A61F37F13B95A6FB341C9D9752639241C29171B\ 71453D0EDE1FD8A550463F1A800591D707393039A24381E9D374336B488739E7\ 30F31D8FDDA00B3080B7321D3982EE7C249CD44DF0791FBE1F6AF49DB67089C4\ BAC7E11BC91EF0471BAE50E6DD:\ 292D541B90F12BC9D268B003B8AEF93C70359B399071DD816019478C5F7AE956\ E26F04EF8BBB550C8696D648BB34B20AFC4B6297738A20CF9605C6DA9918B00D:\ 6AF134B839C4586554F6B98F18B3C39B 6516603026A028BF08B715FA5093F2B413629C9D69BCE927B0B36F1EA333376F\ C3D1A34CDCB69D85B387E5446E04C6118184D9792B8C95EE7A571359B49C56E5\ EF20A4F841045AE2EB6EF03EE7C7CE9AABC2B7AAEA125EEDA2C9671FE9C96654\ 599FED61D0D757DACAF13E20D64BCACDB2F0ECAF43A641BF009BD3329DD96295\ 28694B8BDBCC500795ADC1F079C4C4F8533DDE9518BE5557D882FB0CF9564254\ 0F4C74E65493475C9D090DC630A9:\ 5704C3A40BCB401405997DA8ECF098B74B279E95E7F3F0146C8BDAF118B858E4\ 6A4FBCAA54295F374B922E35A8C8E0F5C5B85CE0324F8DF48D3C5F14694887DE\ EEC108B317FAFEC0D16B46BAF7BD5AB433913DBF19F4B57587AC1A95BE356878\ DB5F3A3B67EC35F777A0892652FD9D7335E737FB7F6A8558DB61D50E1B621D34\ 73066BACE07091DC1916AE80495606F483B055D9D557B22AE00012893894BD27\ 4741501220A903A51A8157A76F0D:\ 814C64722D7CA27312FBD5032C9C452D049506B169B1702C0167D2E6263226DA\ 3F3807C80537D28DCE20DF7272FEF6C9B68531FEA7A5636DD03352BA34A82C84:\ 5A0AABED7BC74F505383C8A83799C279 D47D85E7D6B191D37DBA9080DED2BC59E19D7F038A8349BFB9DAC98D648F6AC7\ D95C3B78D5672DC70192005C785BF9656DBE02ED74CAB53B7582A82EE67F00FB\ B1EAAE04C77555807A6B7A8BC7BDAA66EFBDCCB104B33ACF797E08A85E2942B6\ A4E759BBC941597B0FB189F57D85A300E3A0ECF56F782BBC487E714A47B8C5BD\ 50A506696C9F1C1FC0383E2235E6BDACB3E89D89739263BE47906CB893C332CC\ F16C52B0D11AB7839576FBBD7054D3:\ 91E239A8F026CEBFD5CE2E25F44F2658C7F204AC5563FA454C966BCA94A0467D\ AE4AF239DCAEB3D46EDC25F474D2E6A8251660748C69C2CDABF7F6CC3E342147\ 6F533631055E9E519CB6C5DC76CE2814B6638C91C8AD7F3D1567B37EF2B58BBD\ CEE30C3B2207A00AA25C02A670E2D3305040E7B492816C9E83C29090BD2C71B2\ 4BE4DCE9123710A56FF1910FFBD7229FF82BFCEE5A66043CDB1AC06416070F9A\ C7A6A7D7014DEF1E64FA309D4E2A31:\ 58F525BA87C99CACA875FE49FA6CA0E406C6D6A4437F7A5F118350503933DAED\ 77B7C64F01750302AEA446BA04AEFF44B58953F32DFEBD1A95F537A1404169E8:\ 32352F6E9C939DFBD0CDB248266B0327 27E638B2D906D09F193FE1588D325CE0DDA1A1A028EDC800BACB847FF74E6A7D\ F41E525FA991203309FC49375B1B39EC57F7BE082C80BB972B3D8E88794F95A0\ 882B3868406CB4E02C4D3DB6B45FAB106FDC56F32E7E39E4E7BB6B2F24F22245\ 23E95D47D24D95A1F300DB37BA4E8141F4B885100B9783783B4AA38539028FFB\ 735EF697EB9043DA064DDDD8E8D08BB0442DE254CB604E89F7C7D82FBF366F62\ 801FBFA4A2B01C3ECF26C9C4C5E0272E:\ 22995D449720E1E0F27F3CEE80C2D8B821E31527A48E72818FB5DC7C5F7476D2\ 629D8CC26F64DB533CB1342A965C19D32359ED7C59ADFE2C219ABD547A9C907B\ CDEE220DAD3156ED92B5A4B92FE6023CC632233142AE32639EB74A7EA47A59C3\ 837594C2BABB21A51DC47B1F19D6C0369D4DF14C00B9AD9267779774753D5059\ 13528AEFD93DF0C004F10DA9163AA0C871DA275531D74F9EE3099BE82EFB3216\ D80A2DB5AE0CAC7F3007C73E493DDC9B:\ B4915E26309027540ABCDD44373B0962902D039EC5F2C8D65EF6038F9853521F\ 8B8CBECF748B309BAB17AF2DB24515C39153233D6B85B61EB9FA4122A943277F:\ FB9A3D0FCF6E73F05FBEE5CB85F1962B 66148853A971DBCBC5541C6EC2AA9F439F5CE613F1FDC1F764093E5B4DA40C6B\ B7DE5605E24468CE0C890B56E9286DB8646BB1B68EC671ACEC0D62137DD2D714\ C9E6D21AC97A1044CD1B87803C8CA697657122B8795EB73D6BB9A83BD5EB7E01\ BEE2614A528D20067F7CEA20A2CF6BC8371511E9A68C922C72898EEC6D636B8F\ 3AAC321EC1DF477CF04D3AA07D6581C846633AFA18E5C3A1D6FC3F1A0D0D4913\ 0F52E497BF34DCEE95E9A4907A525486B4:\ 1914CF1496620C8879F505103D41BD647450DD9AB88886DE7AFB7A607FC71FD6\ 13BA2D8FF0A5340CDBF4CD65F1DDE94CCE6CD8206B6039E5EF17C90FB4CBD2E7\ 186894109FA8B7FDA6DC90B0248344AB2C61EC746330A2D71B794935D8BD295C\ 2DE123041E9A54E12A042611DF5A7CEDAB6E43D7ECB4AEE98435772795612FBC\ E8DCFCB415DB01ECAFB9E93ACFDE2B0FD7B4F2BC6B30BFCD3292EA1D96BE61C1\ 542CB2CA2392F0A10A13A362D5E50F6F9F:\ F1BD3EF165421B150DB578BB945B77D81DE4801B62577F1B9392F33BABBB3733\ 0C044EC6CF464C3E9B87FFAC2EB150660F486BFD9554DFDCEB772676C45A9E8B:\ 69BC3A2DFD5BFCBDCD523D3C774D3A1E 9EED8E0BB550F5CA3D84E1D73A8AF5C2AADCC2D0DA607DC25C801F5C4F1910A5\ E9A119C5E979E0C87E1E70EAA6BA18EFF168C0B38E6EAFF8D6549CB2C2D9BD35\ B5C3CE74D6B836A5E1A4CBBE60BAB759C0DC3161D2A0877A3E1E93DDD0593AFC\ 955229B6AFD95497EDDE5D518675B11C645105C989DDF00D39B32DF0B9D23395\ 7AF786D1AE6351FBDF768EA4A0B36E7E4731C3A8FEE0C4DE6F22706FD968B9E7\ 853261F77B115195D580BB116EC94D1CF60E:\ 9DCAEB90ED5B080CC167C05F7172A1CCCA7A48EA953AAD28EC40357FFE7AB3A8\ 2E00A0704DD7E2FD2CA8AE715E66EF2DFCEA1561E8F454487F79D9FC342B405D\ BD38F0F0824B72341996F33FE002837C710988D24759B9EB57F55B488D7C01FC\ 8ED053726766318DD88DD954D586754FB1737E820D984859731C4DE9AAB23E4B\ BD79A2F4F6F71E5F52591028DE8F1819D2B9B141C5F52B47DB979187273FECF6\ A5E1572EDA6A7E4702228344548BD17FC19E:\ E5D8BC2238FAD3A3C3C565D1CBEF967BAFBE088DFB95B676C383B4699EC71B4C\ F74B89828261F76EAFCB0A465D111C0FF74417A517646A1F7C96904991DD5B16:\ 0F1F5163DB41F49F89BCE003EB792854 CB36C255CDF2768A8F29740B45507A28E0E3EE1865A78B6C35666C6311B4FC5E\ C134AA4EF3629A497AC3BDC913BF8523C439436886D1C9AF3DA480D0CF6C3A61\ 6547EAF9486CBC4F99B0AA15D84EFB8919431AE33DB44B99855486DB4C0B5CB2\ 0C85F73A2142D18D89B771F394D78DD30CA9903830DFE140230F6F2A43B19F83\ CA3FBB62358CA6A33F264DD31963E73ECA7B2DB42D7F62C04228596FD670E60A\ 20355A4B4DEC2FED6C653F89C4E21D2C19F104:\ 28D0A0033B0578BFC8E60566F79D393E96B76AF08B8F55771DFB81D7734EC27E\ 8241FFB17EA4A7B3A7932B96D52107EE052C94FE8B8DFCF25A7D8CE97FE88CEA\ A9C10B3CDDAC754DF37FC30892B3DF44962B1CBCF25A0F0F1F0C1312B4791E51\ 882773D9999F7599B8C967C94D76DCC57A470DA60A49E47C5E46D5F8A47594C7\ C7D2DEBF234307F55CF027D2E550055B70F16787E29A9D917A48FF0D15121C0F\ 55248720975950959B59C0D24053033F641E8F:\ A187D9D49AC60D22EF8B3D47E295C028EC4DF05BF802EB6993A0BC52A16239C5\ B949869D0B4148C93584C5B77D9B72529DC9031583EF5BFA790888B84D504C60:\ 55E37CD32E66714191798C6280AD75FF C38C7287D2765DD0D483FC4F41FDB5CE6DF637B0E792343E95F14CF4A7CEB177\ 5B01A3AD4E63C0B77ABF6640C6D0C37B88D3B4EE9AC568F7840DCB00BD30DC6A\ 3B1A9C67552FEB0938B5B881F2EAC65A56E524BCEDF332272D88F241BCBDC417\ 68C64A5E834F7599526D27E5F63F0C94587B512713E816689E7B69A3FCEEA707\ 59A0BD736D56A735C1AC3929CF36CF38C3C1160FEF59698B5544486CFAF53680\ FFBA6797CB4D7570EFEC48E0E7C097C4F009BA6E:\ 201E4B369B955710982E88F22E2214D51AD805D99C3D9F2C43E04F08A8144165\ 0775AC589BCC4760F592921222D772E672F1247A502CBE2405DD4432EA73E2F7\ 5FFE441A11D0C6F25C6290A99C98FE6BA02907671DBC94F65E4AFDF6D0E63A6B\ D2F7923A8D3BF2ABCBF3487D37ECFC74F5D0E2B6646AD9E6A04B273F6936A2EA\ 43B49512AD9D81A793286A7BA42C27A04B2258583B6A32BED901F161D3AA5F50\ DA26D33539C093301456EE68254894F4B1DCEC66:\ AB1A21714751B51353C601C85F2D5DC6729E59601B14D2E2020393A6CD0EC9D4\ 9F886ED07EFDA183EB93BA58BA704DD9DE5511116D806071C83FF1D955D20014:\ 9F9F9D6FB6C4B8A62E97C7B5D67974E4 7625E6E5003EC257F2B9255A341663E01BD6398D2C5458DC4C0DE6B9A77D3A45\ 5D75193B1F33E5CD1D8B16C3386BF4CBB356C299F8B24FAA389B297EDE289F7A\ 8FCF4DAEBD45918D9E98E3EA7EDA78115E3826BABB48E786444A691969C6C185\ 7D6B511388700285DBBCD44336B89B9E033EBFCA3A35093A6B41F5FF54495C11\ D2C87FBB43168A89C10E755BA40156D25926D1148C97A0A0412B952821D2C0D3\ 25E6649CB409201045AF041820248D78C1D00C95A1:\ 1BE68233BC6557601760BC9121BA5CE47D6B911C046D4D2DF5EB111C66563E19\ 74F88C509F97703A4427A2936AE8180AD0513288530BBE5365EBA31BAEAAC622\ 6DE2D1F093956B5A97BD0FDFAE55ABF54B8A91197805899DF5BF6F84652113EB\ 27991887A560CE3A093BC74B7B0A25719E5DD2F3B07D5A7831EA0A99C6A16A6B\ E527E4AF6CE7BAF5C7744F27B98D9E2F9981246765913E537AC69B3E04D31B5A\ D5F9EBD55664A7DD7ADD8984984F08E64F8598A766:\ AA6935EDB7F287F5BF42A259EA65459847631BF11DF4082A0C2702278ACD6ED9\ DA5C54DA6B10032CDAD18EEFDEAFD8749B422B04747B3D4DBFE22C1200A1727F:\ E9514BA0F3B74767B55EFC4595A2F122 7DE539616CDC8A30DD4E001B3386D7E4A1F61BCE4FAFD5C16FCF2E23F724C39E\ 31B2DA02A91CB4CFFDE8A3D0F95710D07C6CC95727C62F2C72B243740324D0AE\ EC52FE624C9F3348C996756D251EE46E4764D933EF36356E4B409FF116F08E5E\ C4D765DD048D1BC49B9A02456A01261E877D713DAF44500B27B0C2EBDBBE0020\ AF0AADA465EF984A89ABCB6E74D514188689F0DA488EB0A0BE9B7F9A46F132FD\ 11EB69277BC0ABF65216F7745250FF64A9F4B5D5EF62:\ 49A858D82A3D9C7B7A38D4F7C9C2961D83345DA52C75DBAE7BEDF317DD540784\ 09E7B914CF2B08A080ACE50654A87454247978AE5F1AA86C065A5EE8666FD4E0\ 6A15AE11EE6388811BF94DFA3FFC3F8ECD2ECDA464A57373A79C06CA4109C593\ 70C9DAC196BBE7063FDC4DA048E5DD50D216EEDB03DC1D52DAE59A32F38C50EF\ 19935111EF3DDF28E46236DA0EE77C2833FCC38E465C8EC67DCC3DC2C28873DA\ 05EC0B9B6D651B4CC2B3245B4479A04A7EBDCBF21D87:\ 4AAD546B1D34CD5179D90DD836B6E761475F23CA09ACA77D2970344C8D6C216B\ 56B8C9FD859739234C763546EED4E7ADCC225829C8E9152A4BA31F7D16010E04:\ 6452C6862482AFBFF4C91F74F679CB10 8F986144100B7EAF52726D8E75E605D1F65DBEDE7B19D041E9C79F009A6EBC13\ 0A059DF15C1FA42E501A87F112C335D2C8FC4E9B95267B06F7327A9BCE3AD29B\ 9E44F119C53BA3238E77278EE6CA3B01AF2B0264E855FAA245FEB8B602D4F803\ 31CCB7225971347061CCAA19B58C25B234B84C99330946360476825E1B71A22C\ D01EA8911932A2EF373E4EF0B6DFACA348CCE90E6EB8D51C2816DAA66FEC8A24\ D2EFAB20D0CEFE91E4566A613695F6016A29099B209D4F:\ 2099C28E7762689917BC6AE46C861C3C633B3D74C7DED7C005FD6AD6E9381107\ 10B29F8D39D1DD74A114A4B4EC66890769D6F596B00D8A48AC4266419A379E07\ 43F5CA3AE2EAC7BF7BED592FD62DC0758475808C0BF3CBC60184B9BC0F5D62D2\ DDFF525384916C03E5DB56490711FA1363B208DA8C1FB70E17849804E1F3534F\ B14B1DA63B6DC02C4870A89A9E332351AAA91256E917F96FACF4F55E91968B0C\ 55FC2ED242104330F91D30810F503B1DE9CBED1BCD6D48:\ E66CEAA1B5D4E2BC78F7E03C6F86A292FE0392806D8F9C282C47746926A54904\ 4D47254C861A9427CFA3A33CB685635BDE03E61B644544E65055A25B873BBD83:\ 02863060B296D8EFD8F4A7D266F968FE BEA4C330CAE5A15DBC4E0158F6D37B5566F75395BB7596C13552DEF57219E86E\ E1F2FE2CF7E6AD6ED4013389469F027C2B6F6AD77EA0E914927460789F8E06BF\ F978CA7968B3651498BA72BE1C0F355EE0F44EE1B8C9082D8A97BD11FD9E8253\ 4F953270B0B011CE2BC49DDD8A2E7F8DB7CA6A157A40430869ADCF23C0EBC174\ 2716F5DA731EC2B7EAFA0C631A78F3FE7291B93BAEFE1891FFB194E748A64165\ 87302D8829EC154C0A5D2CA11603DED4A0CED38935696882:\ B30A92B97E9D0BFE0710CDA1E1A3D7587C9D826E98B0E154FFCCE257D7957F52\ DDCF98C0B0189C64FB0A39A5826AA79B4C3B33677EC3A4E3D5E83C00BD80EF50\ 48E30D046C5FF5CA46078E162F2B00B0CCCA53E33F1E6D7299E3C5ECCC8E501F\ 7DC5CCBB2EE3C9E71F631D262BB75E040C62AF05FD9053105BFDF8AB364E8E57\ 9C730C063D4CDC736DB879342278DDADB53FE897D9F08C58C77749E889509FE5\ 47692ACD2053BD90A0F4DAB93D61FE75EFB8A59F5EEC8DFE:\ 23963ACF25AF2227DD843B7409FDC3DA5E9E9316F81EE8B5A2CCCEB1C69F58A3\ 22F707272DA8B4C76E0CFF5F965594D17C1DEC5D44B1A3950837D73A6C95F725:\ ECAC60D619A3E3E751D0FFAD0663AB1B 62664913FBB5B6456D74DBC567A448DF9376AE6FCCB0F38727BB5CA072924B38\ 7C8A3537DEA6B5513DB0B013E400A6BFAF7E00AEE97EBD6D2A214546593C6F14\ 8F0969317A559923E27FCBB196267B35268468F4FDA36D34B4572013642F32B6\ 9DD0A340E55D57477149F119483C552D6E5145C5AE95ADC85277DC7ABEC1FD96\ 37E80CBC7385B81AAC1DD0B3B900D3C9DF9BC074420373B8DE3236BE220B0BEB\ 2CF1E8F764B9994A3A77EE53856C9894E0A2580749E133F4C2:\ C7D2A1E0FC1E4CD8BAA5EDD7DA174699990711CA471FCB435232AEE487CA370B\ 84AFCF6515A13ED8311BDE1DCE8BB7044D96F6C9874CF2763811099F5FA3554B\ 8EA0D43016BC9AF6D4D77129E4E81402D3A5DC59E81CCEB5C69F96CAF9AF52B9\ 9E9BA2BC7CD39FC98A01B70A0E0FCE3D5967DDB47C1809AAF3FABC75D83EACFA\ 249CCC1B245FF3E19DFA351E2E87F39C30DB4E5735A128F717A637801216D7BF\ 8AA3F4F299CB7267DB3DB2D5023A575B6084EF609E3410DCD4:\ ACA7EE3DD9555536B650F4F53F0BA1152D8F60A870D55D425E041D9F9AB94FA2\ CBD6971F6464B9F489C03F0CD5DCD9A019BEB956C17B6DBAF5C2E04D16995A91:\ 543D3D2F92BC46A81426EAC0CB795D69 C3C494F351BF2D314A4FA0A5A8E0119F8E0506AE2F030C75ACE586F3A0A9AAD9\ 56467F81607F3787AD327B11E9073F2C750AA1069C838A5FBF57352BFFE0049C\ A63718DF8B9272F20E7BEEE83DBE61AB8436642F1D05D2C8C1DBF607488CBE45\ 7D57CF85C249F1D5EC6779A008F698CE8DAA4640B4A18C99CB6E21DB641464BA\ 3178064B8A49FF4F997D64B2C1CD3E6FCC590501AF2DBD55E4BADE852AB17E8B\ 80759BCFB24E9B8C0288EA1BDBB14B03D2FF32A5FA63CEF6E32B:\ 0E322AB41B4454267E0E0B7024AE969089C272429B389F74ED19065AD285081D\ 070CE8240E6FD0BF0C4AA4F1DB361C22634E81E3973AD9354B8DAEB208E9F6D2\ 9EB44439CF2E513019E4B3C7FF09CE129559462842C478608BBA469A8F08D608\ 7D8D2DAC87241B1046A3F208DA0B5F0D3AD7A6A20072B10B3D36BF45C67E3CDE\ 5D99EA175AA9B84BDCB0424D821E403093732DFA97A7F65C8D68F6EF21A7BE7F\ AC92D7E7A192AD7DC7460FBB2ED1E0DD0225B576F1481130AA02:\ D19F3D8BBD36A2ECA71AD0FD1E03CB29B66CA129D1517552FC28A88FD866C239\ 3A9140F010115225190B71D8E48C502F249717D002D0AAF0879AA7CB39862FD3:\ 2C3C41E91B8680B9A65C23255CD0F3A9 B9C3725BBD665B4E0A5AA9663FCA7078CC2036B7B7E9F2955E0C1E82257A5484\ D3B4A20D9EF0437412DCA170507ACD8B48D576F18113AC9D191435EC91C6C03C\ 2E81BC3945477320FB4114D4AC917014341CFA083E25A7AC0C28FBA6309E7F99\ 6EADF2B641B156A7C82E68878251D2AEAA5A6828AC2E157B62A2B16409C25D09\ EE882148C0D184EEDC8F533BE34585E6A20559379E6AF753D9899F65E87BA1CE\ F8E0BF6E3CA80A984814E9E87D004F81BF2F8575D159A27090AD7A:\ 8AD45617139ED7C6DCA516B45F0B216F5AEB276043224330CE8D418C82AEF428\ 090055E1BCB54860BF0DAE0A344862EAEC249B92DBADCF931EB157A98F857189\ F6C558696A797B23C224B36E5D94E36CFBCD2A9228A71F732EB77EAC86BE4343\ F165012AC4AF8046214C3CEED46CF29C5C05CED26EF65E3E301582506394E92E\ 5885960B13A2E1A7F543B6757B36D17A71BEB2D8F81FC7B7EF7D3D6E9ABCCF1C\ 6983B49B4D3083F4F7425CB7FD842AD4FE76757BF3C5D45EC1E3F6:\ 637A99C167656B03D87D8C25DBE63ACE3F771D9650E7B3E51EB800B1BDE1D1AC\ 400DF68864CAC55B5116C59C7493B5131E5B9AF1A76D209F55B1357795D38544:\ B0DC648EAFA497C868805B7FA3E20FB1 47816E0BBBF336A85EA59E248A3BB0FE6A7642C9E85F177D045738D642D5FB2E\ 78531AEB81427B829C439A7A305C020356DB936B9FEC36AF4E863004F329799B\ 3EE3916C01C6157F637296864516117E838815696A9787423ED8E3F0AE8AE66D\ F8C3044772435FCBC630084D31945A4AADF087ED22B178B5DC8CCA72BBB4C3A0\ BFEFA407A3F9C45816966CE4910054D9D06F28EEAB8CC9F91004A5C89B19FEA7\ 70B0942B87F6E795556A8E4D42CE252018E908273C442606244A3C72:\ 4549FA2E7E9E84F05256156EE62A8E16193261954AEFFD85C0EA3AB1A81EA1C5\ 5EDE1DD0525EDAA1A30F5A47666697E54602A8343AD642848E5AF59D89340D89\ EA685478B738804C7BF108A964B6AFAE9C60DBD8AE863107722A877DAEB28924\ B1DD946CA03FA3F2CEA414A4BA157C187A53666ADE8AB3B9FC163453CB492938\ 884ACF0DE9002511F41246A3D871F15B90A813189541EF6C6CEC1D91F9933C80\ C41EDA3775A681CDFD4B180402538B925901390CCFD7FD827B3586F6:\ 19CA3AD5BE5FE687923D51770953F1A8E94EDAEC453F43ACE7FFA2AF41BB18CF\ E619F1D53B86223A444DFD9C3033C51AF5B20E9840EED823180FA574407B4E42:\ A84B2B2DCCB8DAC4B99040F05A69F77A F9B097CF2AAAB035BEA4DD3153A397FD44179D7A7EA9F6ABF7000B10E1AAF022\ 4F40B5767D9A2DB43BBCFD14D35154AD975061C9423AEE456546BF80ECB9FE51\ B0E3E894D39AF72B8A589352E4094FD71A5EDF6B3290529012D20C4B946B4C9C\ DC30FDBACFAB60B9F8B48555C1FA40866F2E6A7B61147035A6B97A0669A0668C\ 67329E4D1AAE9C599E107C9E15895C2869C2DB70F20B8541A8238A7918829160\ FD31854D2C9F16CDF0EB730E60DA72E16FF58BBCAA37DA0A6FA8970AC5:\ AF1941EADF7EE25C41E40C9CB5206B312C1E3B568825AC2CF2FC0D97ED98978C\ BCC713BAAE8ADCCAA654A029690921F766306B886FC970115DE7E38753B14B0C\ 9954587826AD95F6CBC27C34BAB95EED0DB93F082F8AFC4BF1A9FD9F3B906227\ 08FC2B14E81460320A4C4D8545F30D04EB5393A82E1134BCD183E6A77A56C4B5\ C6E9B83DCFEF8262B08D32A9E8DF9C033984416912C93AD09BE869B043E86269\ 8D660ADA549635D9C9A8D45D40F26B5BEC11396B480243332531B5F121:\ EA4E575BA26D7118D5652C6206A0D552DE2D60E39569D87634E3F130BB85FF39\ E5E72877B8475AA59609633C378CBCA9D463B523BFD221833626F35C9768CAAC:\ 0A232936E17DA9455384EBA191207CA5 93F7C2B2EB2E8C0684F0F60300ED17418275F09A7E826A61DA4D28B2B0D72A20\ 9330DA4694147DA1957D761E3D50F1CFF760AE7BB222E1C1B0A8DB34E156AD45\ 12EC4FEB15236B580CF45CF13DB8379C6E3EA61D506CD6748312B321AF52BF58\ 3AE86A14CA2F22FE8571B8B7DCACD4266035A5E3829647B8696A413BAC0B7039\ 84AF99AAA229814DD94CC045DB8CF0A9B2E6B743B7A1180B512CBF0E80D853CE\ 6E4E0C304D970D92F38D0D4E9B954CD14172F1745A69C4A82BE358FD8386:\ B9020967A74C6EE0B02D9A42263045CF5F88934FF5C5F90E9355EDA925DDEE94\ 9DB4C1600CD0F720C65332180D99ECAF376626067E31D665361E21D5B72FF933\ 0ED7EE4E7D1FCFDAD0159AF07F60E4E2F35BA4AA4373B1DE845F56B572547656\ 4D240CCA4CFA4063C374DC6BFA5FFB5C454B35409F5C69C49FE1C50E02A85357\ E3ADA166496A82C864A44065D8D38F9722DE5CAD066ECB4D327E8952CB4A80B3\ 8C5E76A1EB48EB6E249A5D04942146B1342C948369D250E6BFB32EB01A0A:\ FDA8EEF72F4FB65FB0147AD49CD00036B0B4C2E604CF9E4BC9FA99964CD97304\ 221DA1AA2DAE411D7D7D88CCE21A69F735826EDF0322166565352A15D2D25A5D:\ 4CA75D128185C53C071D9C57D2820202 DFE82B84B22984A80EDA7A031493A56262693C41E0F08A27A80667D168DD6704\ B8D82F92DEA1EDB2D4174E4017C4CE1D7E66506BDE130E2256385920D3D1E272\ 226C94330812CACFECC96BA9232905B74915DA30F7A233D8C961C6977DBFB646\ 26158E37A9878D26B85328E8A79097190A3F5F339E4AE201F8858C98AF5C5994\ E858CFC8D34268689818CB2867705708BBD9CFFE88B2CF16C018DC47D730A6A5\ B4B951AC57E99DCA5FA4E172A4A2292E1827F2ECEF94FF483962651404F64D:\ 9E9F025C8199E0AE3BBF78AF8131DD0E8CE35E330A50431BFC619BB8071480C9\ 49B896BEE8BEF08E383EEEDA92BF950EE45F8F335EB006DACC17A9C5FB3294CF\ BAA2FCCF7819BB1DD7F645C5F21B08204AA9D89083648FDCDCC451B39BED9CF8\ D61D79308DC80FFD04A901F1796CA15A9436D9E8F56C03858B8C31EEC9633D0F\ 29FACAECCCCD1E26E27A9B4B75F0CFFA89F93FF7B4C370B1224F3A99624770BF\ 956E69E60444BD81521DB8CA8694942824B0719846C75001F466A2D72CED4D:\ 65ECAB031D16120E74B745A1BAAE66B69994D210622A996E618E1B3ADE758196\ 9522A973336CD20E0ABEB9395D1ECBF2254F4FE7C3C98FB5BB7C7BB9E00986B6:\ B8119F4F1169A094C93698B0CF33385F 6AD77D39118158C637757331C96E96EA0083B575AC901DBA359D5986FCB7FC95\ D0EBC94C1BDB41096DB2283D46FF939D42CDE66E2D186C2D93D74CAB23C38574\ 8083F63AEA5E7CE8DAACF3FDE49F599405B96DA231124F4A1810A5B0EB948692\ 5C86C1E5AB95D26A6C6E28127A2AE877B70C9E6EE94FCD47B642224262FDCD05\ 5A7219C76F74E8541289263A38039AEC327D50B4FDBC3F33E5E9DC1D74CF65A0\ F0DF10B5AB7189FB19EA765BF8D7080AA563E62265FB59DA8C92D21EFDF19C14:\ 76C872A42D922821FE22FEC8BCD179F4C775FB3010C57A2F3E10F6DE19DC60F3\ 38E81D4D36E3C07E9736FD837BBDA7574CAB760E3EFB5E55BA954C0FAD01B472\ CB3B159FC364EC6451D71CCC334FDEF95F38CC12757FA63005ACD6A8305BAF8B\ 421F299B4FE02D524727D51E7E9CDBF7E3C46001EC49C5F599410D5F06E23E13\ 30B49428CA36EA4DD7B28428AF2522C01EA9C214FB3C77BD43AF9BBAD49B8CDD\ BC12BC28FE1415311077F475C835728CD31E189F1E582D08254EFA4D560A44A6:\ 60CF7CEE39E10377D97679D791DA74E1767A6E47BA720AA78EE6A16F84A7B69A\ 9C7DD398CB04A08DF6A70C4BBB48F84495A69F185C37B1DE2213F8F206C29F1F:\ E3ADD082F8D83F9040BEB9352888EDAC 33B72ED559810D293CDAA5F90538C1288EED84BD27863A1088489F38A5DD9C15\ D9B63235A471B66A1D553FB94A7826852C32E64FC0C55D48D397AC368541EDDB\ 33686C15426EE7E3F939001A1DC81F374B8804851D7870148A29FD3A76BDB8AD\ 86CC8B5BD483F0EA0D1C40D6D22AD52A86162CC63703E0E48BAA5E7A85BDD407\ 7B6EE61C0D27F87EAD8859181F86FBD92FF30C096F765DF0ABD9D23DFF984FE8\ 9BCB9556E03927C49A66744CC56B7B0D8DDC3A2B6DF03AE91A6545C778B287D9\ 47:\ 569835F173A3A33F6035797D16BBD308D1B501137496BE22EF04C8C77B26A25E\ 0AB82E81EEBC4368264B470A6057FC1F13D612DC1A73127619684F0F1A44472E\ B035CFE000E5ED3DEFD2938ADD11B0718DD76F8148234DC7F25470247FF46712\ 509F886B3E21E27055662926A3375C84CF9EA31F3F2D4F877E1D9FF9F89F7388\ 53F94953AA594E51462EE0C3144E5A6592D596BEEA53271B8CD3417FBE150FFC\ 948B652C8EC1C8715601FB02B62D0562F6526CE3E52A73B097F952A05F50F6BA\ C1:\ 621F5484DFA2D820C57EE2A0A111D6F6202F1C34197F26F03ECA92279BDC3EB0\ D0E974D90D8F04672A0B2D13C447B5120FFF859F57479C98C95A70FCFE9F27AC:\ 52C427FC02EDB8E6990F5CFA32E2409E 558814DADEBF901790A50ED6EB7877905A7A1D08FE5BA318C7AA1D3ED42006DB\ 7B90156D940DE3B82463B46617BED8EB3E036B689582F38BA74021BE58107529\ 9C94DB0DFADDFE12C99990DA22A72978ED81FFD9536412D82BC74A00E6BCF467\ BB3B777DE7D724A1EA8F3417E213E4A864A99A33F3277B5C4A4D5E6A39973733\ 721D5E2A6973B7062A43EE925254A53C94EA7332E3F891973367FFAD4264E892\ 678BDEF566AEDB60D4851520A22B580324EB6B0C4F04939DD8FD65843D90480A\ 7E4D:\ E96F869FC3398DD68E2DD627DCCEE24B03EFED44B408D9D28A45B8D990619787\ D47A02D4AA6E2CA5D1C53A7F860A55C4E52809031B8AE6961214397A76EE6F9F\ 5133302AB9D1EAB144638D4FF1225A1B3D3971D88770F6E1456E982A8E9CADB6\ 794A73CAC4CDAC67A9F24E0BA09F7DCF3D18A31B9B63B5A1EF961995B11288B4\ 3E6DAF8A019F24D91CF65305411A48647870C9CA2C438707890844ABFE0EB68C\ 2FA125B7973FA68223469EC72BB7010041C3005A2B43EB59DA1444D9C8FF4270\ 065C:\ C9FAA4A9C46B4F3A16286EB2F00F9F4B530487385AF169EBD8B6A91639E90A94\ 0B22F7E83EEB1A2D45863E042F3509326F0F51C8DD9DC35E8E7B234FAFB6DA7C:\ 726DD701F3623EEC8074ACB0EEE33C08 7232544907730E42A16C9AC818D1EB8905DF1043DD3F779AB8563A6A456BB932\ 0787B13C9FC200613607A26177DB259496F2CA94BA7BAECA2D578ABF325EBBF3\ D76F88102E51F254A9B3EE3277F0819C61064C81C398D0F80769CACA418E10F4\ ED16BF4B3039623721FCF46E30FAA7F91DC2F80B06A5438CEEF3609A902E9654\ AA69838D6E6E080B4F3BC1F937BC0A4855FDA9737F3AF29AFC4B05BD4850B208\ 0F4E3877211F9E6294CE9C0209082FAB17AEF21A344B1EF8AB14F131A63088DA\ 97C2A0:\ 947F1F61843BE3F4027CE622E6A9F881CEF608A9961E59DD7B036284A753FFC4\ C3FE97354F66BE342A4DFAB4309F519D4F7DBECBBE284599DD00D1769FBB1257\ 78EA434545CD68958D5A775D3BE6DD60C056530A823B393818273602322CA9C5\ A5386224F33D8530E0AFD9E159B116CAC0C07B6826666539E746C72676076C17\ 303964E3F9CD5759F30B079631D3DE70CAFDB36F751CE8E7B5E070ABE970E06E\ 1D6685599CB4005F09924988ABD5427A45D9EF4235C269742C3EC5351272FB3B\ FCF8A9:\ 6550B6EED999066C926A7CA8044157CC89681E8F12AAF07E5836592A86EC2761\ 942BD821E0B33D93DE71F8A7C295B53F8A1DFA0D77B53DF684DE81CAEFB63E89:\ F80966FA407929A27FADF059CC486A93 8E7F1F8DC7C94A6E2161691DD0916250C3E52655DE45216820884C5703A89E61\ 64AA94957A0BCD4DF4F7EC40DB6E8BBEAD2541A9C360B888D8D2F9A52161BF95\ D69848A8F30EAC6AAFBC0EBD3EE6BC5E1D1F8A1B75226A555CCB3AE468304ECE\ D198586D9FF10DB28E7987B6D61D95A0A0010B6512987A848D9B6E5639A07A9B\ 6C0AAD572A4462D6E33DCF27506B22B73C6427006F7CD23871414B33A2921FED\ B2D495098AE7B38FF402105758915D63CFA37862B295779D43E95CA509EC171F\ AA7948DE:\ 88AD68CCE9BD6F09B560FC429B85E661EFE66DB2DC1FB719756858EC957E6665\ 7A4E39FCD1E4D0BDA9BFE4258DABCCD20A85025DCFAD96FA09FF4F123647F027\ 553C16E2B44A659D833CBA9D57308EB8333DF1E9B330F2DB8BA8C7241E207F5B\ 64637BC3A2627E0067FE86ADF812585837FC32F32C1BE8B5D55E39C3B8D9148E\ F835EFD92E3213CF60EA2B14051B6674AF51B6E79992C0A8A7C2C6DA82D677AD\ E52C5884814C696EF17F46CE7E0164F38D6729EF65767FDAF68E20352B3C0515\ D362DFCF:\ 11AC6CECF5F0EE65F7E80D6A67AF512EB7B78CC1AAECE515F7E18B0A134C849F\ FF7E0F0A0CDA0A6EDE88672CECE501D01A37FBC1512635A9A88877BB91339774:\ F5D202E8898E2AF85FD6BAE92F719628 823D9C292F162B6AE0791727C56C457D72123AC3DC6764ADF57526F53191440B\ E38A483A3E0FFE8405F1EEFC20F01B23B874F09856532A108F9B94ED5D8351D7\ 9371C3AEC1CF86D60E0DC453B267092F664D5EA27428D926AC4F93CBEDEE3078\ E354691FBF529716DFF11556A971F364DE4335C05AF97DF6382BE3D6D1C4EC08\ 0B99D08447DB0C680AB54C1C8AA26A41D259C7E5365EB301C1DC46651AEC6FBF\ 4322E725DD7D51437AB3F6329BCD18543A149DE9D7F78045E5ADDE4CE87E3371\ 855705BD8E:\ C092FC16A03F7753BAF6DBA3AC0D57EDD955C92DA7CA1DB98576944054C069BC\ 870DE3EC175DB0952CDB6218D36230A02A29B4D81DD0E2C36BF3D9F71DD3C274\ E1074A8CA39112B5FB133DC30CF8072FB6CDB5371E3F52239338E98DAEEA0B47\ 18443E5C981B18030CFEEF02DB93E673A6D810780B9AF4579D78FE55369CFC01\ 7929E390D5AE8A825ABAB2066F3FE652D12F2CA724E4576643977015F0691659\ B1633E0769C09285B7C0F28AB28E1AA6EC0ED70FA6AE0DEA900EB516FFAC9DCD\ B40CA3A9E2:\ 25A201441FA5563112EB8A0C4B6DC434319A8DEB69847A3A5329684ACA259799\ 995760EA8CB3529A6DA6728C3929B831E7724325CF7B8C11641447C3187C3759:\ D07A20AE8E1B0F43C6D60A4EB6E5AC50 64D338A2C50E45AAE4C4C07CAE9534364DD33FDCB7E8FA003234FDF883E9DDA7\ 689E6DDCFB4FF0CBE330CF0AB5E8CEADCA1B09247101C0170469D33C52C50002\ 08118C2D8B9D081D0C7D742A8F103567486A30526FC0898584AEB2199D8A8DBD\ 0F48016B2F616A61F1CA3296030B1E21440BFAF92ACAF9CD5B92ECC5463BBB2F\ 7279E75CE3C9F6BBDB42629EF59AACA1F99C07DC90280F99F0606447D0463167\ BCFCD1B1B5831ECA19FBBC06D35C58CAFC92FE5AACE9B5B835C882485DE0F7EB\ 91A4B818F8EE:\ 6523C551B41765D26F70C84DC0CA497B48686E45B5A5075AACF8186DA80C6B95\ AD989FB89B47DECD6648219A6FE3FC0C192E758ED9DF8B4FB5D3DC039FEFDE69\ 68C301A0A5B45DB6042BEB70BEFC1865B7F5CFA46DCC1DB4CAC3CA3435BE0BC6\ 2A42BB5B390AD43CBDEFE615ECD29DC0669A8E27B18C83281F1CCC2BD7B6C9FA\ 5F384738D4A239E785BF2DE1F4C36C06C4FAE897872B0A90E24EC21630B39938\ E96EFDDEEC4C71A369888A468537F9DA9110901523CE0A4BAAE1B3AB43649C80\ 25FD7F969F2B:\ FE372A2BE18F88FFBEA1900463782A5210D8A533C2216E26EEDB4B3EB45D51EF\ CDA0E4383D3B1B09F4512F773AC3BE774B8497233F3617A2430B8D8B99DEED76:\ 99B51F9AFFDC8CB26E44E0C0594C0A71 5FBCB5362CE55E799FF359DDFE348F4FFDA38D5F018DB27EC692AC334DDE413E\ DE583F178FADBB4C3832A5DD6D588179EE4256FE449DA5617734616B2F2AD6F0\ 2AB989AC6A5423485FFE669652BED397F0E2093B4EBB38661E9D78AEF46987E7\ C3DEE3C6CE08BA06C4E66D722E01AA4BB662BA0BD4E0B74FEB89E895CB5077AA\ D0D792B344E5EF7B4B542BCE47FEAA88B7E626054BABA611577E9D20ACCCF9DB\ 6B06C88D36E6208F6BEB2AF0DE5B7BA1EFFA8FFD01EE752C1B138D9FD8818637\ 440805C907C59D:\ BAC7E5588759B0A24569355323DDAE5AC088266839AF916D214591A20739233E\ 6967FCFC20044B158F1028917EE518D20F87AF47C48D976DD2B2A18C271960E0\ 8ACB0425D07B65EB16734252D9F401B19A1C5CB4F3E082AA0E511E8FC9B3D493\ A6ADA1A555B1262DB19902982621BAB93BBCDA75B6E1A9896F60D2A15376919F\ 78F135F5E5B91C59023C5D7BC50C809A1EF7006B83CB6BA60AB0DF66909B5351\ 30C0193BF1F572632000D80ED77814696AD265D7CD5F45AB0DB9D73D8637C3D1\ B9DDE5B36EF8A1:\ 7FB87D898FA0D7159C3F304D34A6F313DF4335CFBF0337AAEDF5343D10AC0CA2\ 3FE7241D9BB9A21DB4BBF9D7C93EB3172A5D9E1E54A1B363A6E4EF9B1BBB55F2:\ 9E264B3792B6626994A8BEC332D8D7F3 97F461B6865030E1AEFDBBCFBB7651242D690FBD8DB45FAAD049782616A62DAD\ D00CFB2E7AB20A761682ECF01A8DBC3183A5C6121C3AF77E253D18AB7F0B0D80\ 8835547DB8BC41D8CD44C395CE370E6F618599576CA88A2C4DF990468D49A0D7\ 7481E1EC6ABF175F548EF0B39251F8D093A29D9667A9530E9D0BDE167C7FF118\ E589DA7D37D21777B7E40C56E1F216CA3660A3E1E7DF721D131424FAB29C326C\ E26AE08943040E0C498FE9DFE276705A7B0F526CAB8C31A970B6CAB30F7F9AC7\ 2A5196B52F8B1A43:\ 77EA54BC4AEDE40478C90B8A50779837B8FA233595D6B7DC96EDA6220B02DAFC\ A083D10F73B80C4DB9AAC281AF962F72DA676F698D05E64DAFF713823EC6A4C0\ D1B99FA64BDF2D59C25465BABBD3E439914F5FB144430D53AFF7604B21EB619A\ DF33EC238691F43E930C0090BFD9DD13DFD2A62EB9C8D2BAD4E4BF750F976A49\ 8D6F9DD760F3DEC4125521F4204E662682D77E39A3B777DEAA801FF599BAA5FC\ 8C443DE5BA453F3593768DE7CFFB3B56C1A84D4443FCC7C428A0BF7FB494CA74\ 7389F05A97FBECE3:\ 2A11E33A15A29B8692A12C423B53A2E4073814D43F7014A2EF7FBB64199E0CDF\ A51F67A1681AEE396825666F944E545E23F245A11C0907B590D9F73533D0421D:\ 5DF45A5EB5583410E0E762B8E283E4AD 4E4D866DB7F432F970280097EA52E0EA81D35ED1C52C76E12061AE29EF662A58\ 82B72913B651E810F9EE588F89444559F42DD401CE1B0B9F6D7D49148DC6D835\ C9A6A81193A4016057EE9DD64E902ED08474FFD916102FD27D95A60C9AD69FD9\ 3866082A0D4679F45FB8C966AC0D6508EC38D7F493924C40F3C2CDA856996933\ C2D4FDBB78BC2FE8D9DA5DDC49860671EE058EE6BA28B65B136F54D5999652A8\ 49DB26D27FE5641A4ADF4C104FDEB4A26F5487DBA86C9D2A62A4BC5B4511F073\ 822D5EDBC5E3A81659:\ 1742264209D643662553CA2E0A05B1751AF2547622ED6172F72B15B65CCF300E\ 1E65DF050ED20F26AA5DAC492F90E58BBF278C916D9AEAA691C13497BD8DE7DB\ 18F0A5846FECBCB2181B3C488BE7B4AE62CC13BCF9634C93BAC8C911C56497AC\ F776025CE29CE9A52A047A38E287D93E56DF20BEA7E6F0E897CB27E0B69F5412\ 6F1843D283C0F290800EC8B52B2EA9BAA4FA987D1E67870BC2903140ECC93682\ 7C86B610DAC2DE71D8128AA8692BF6F3790E9F518803358AEEB8588465F3956E\ B530467CA36DB23075:\ 54169450B58DC995384B56B8589582503EC0438CE981E85DB2233296E03A5C74\ 29459207FA36859CB975E7EBBB512382FE8C9D4D86CF57976BF377B9CDE1C38B:\ A4947A745153886122C8FE1349D67837 F10A011C7BF73FF432007FB7E791FAB8D9651D02CD9CEF8E3A464A063AF896D8\ 1D4CE9E7081B140E2F007365B1842287D373CD228B1EDF804D68C068C0A56642\ C42D1C35950FEE0CA014E5EC26FA0F2D8EEF69E64102AFC9C450859914CDA8D8\ 0838191942A3B9DB71241E1092F8CA2CC4E578FFCCCE63CFE97B4DCB10485CF0\ E5639796521ECBA451626DE37F23416EF8FC26AE2323FB0C2AB78E067C6DC4B8\ C29A02663FBB25CFC99BD0AB1BCF2D282203C58E9ACDE093479D2F1644970DE8\ CCCFB6ECD154368A5FC8:\ 4A563D84299330F82F07BB9C93419848446EBA03DE5B17A3444B8662626C82C5\ F68F9862BD203D127A40E8C7BD735BBD7C918186A12E8E94C10DF5336EB1EB1C\ FE04B73352B0A9C1EA4B1864F0B51CF879683909E34589B1A3FB742CFECB3A56\ 6AA0A342F741C19E9EC74E4CF1AF89015A8750AF9361D62E1FB42A75644E83B4\ DFF4C3FCE0FFF85AD782AD1F66BAC393BB70D767AF6E1D5B517962180CF70150\ E2BA56CBF632ED8545E34527B7460A359CBCCF598444B73D387B4E06E7EF061D\ A53A280AAF89AFB529C6:\ 0E4189A200200CA465F873C0C73477CE503BFB689D2989E0F84247AF64D91E60\ 3153BA244AB9938B28DDEA17F062198D260D44C5518AC63C0302201B1344C08F:\ 8F01D0310D36ABFBB8AA420EBBCC0B00 DF55686B6C5C4B07AC9D773C9B84FBF544F046522DBCFA47B31DEFC615E82438\ 03C67B1C2E3273C239860E8DD536D19BAD4C42D9881072E04BE6BBC781D6E5E8\ 26ABCBFE9533114DDBB15DC708F6C0CFF2598713FEE9676CEAF5678C8ED38C6B\ B4796ADC926CCEFAC87C33EDC062D2DDF6CFBCC35F0660D8C93013170EAA7798\ 76F297B8695D87A5CAEDAF470368D50AF33ECD099B175D8DD19E82FC57621AAE\ 9F910820E2A66C546BAB72D687EF7DCFEDFAC117E6E344D67349B794C39A3A3D\ AA73DF58EAB3A1268452A4:\ 879EEDAF24203A141CA1207ECBC67264DDFB29A9ED1D8B2E06207112D8264B87\ 463DCBCF9B010703FAB6ED619E204924F74BBE9E5F5CA84232996F21A10D0F44\ 1C4AE19D955D91B821A1C2F1D8438DA7EDA2AF012471C6201B511A665F24BC4B\ 6EFDD03B0D87F70FF9BBEF05346F4CD537CF4A03F97675A59E89AAAACA4AE8BE\ C18DD5DD4A850536AE95C1B8ACAA7E3FAFB0BA27E883D90E57327B1368D181A2\ F1DF129FD658A077A3624489C20DB3A762CE66A2EE350438387C1D3CD86008CF\ 70678151EA7750E55B37AD:\ 855C0899401237F2B9E2707FB02755C38E9EB2FD53E0623BAA0D3EF98DD1B0F7\ F26258B151415F6BF3D625EEC5A16883C52FF504E37EBEFBBE888179D56585A3:\ F000E3FA7F45B7910B73D50A2E8B0FEB 8CE6E2EE9454B5F7EA8BD12CB2A5AA220A249271CE44B2E51C6283A9BF220C7C\ B09885D999ED0C111CE542D058E0CDE2564B37C46391FF64BB6994818A10462D\ 560567FCF7FEBA75B54DA5F0C9F3B0489643FE0FB8215D5269BD53FD446BF8B6\ 5B7A16756176C84A23054FD16C8DF85A8CC71952500A387EF379CF766DF40490\ 6E34A47D6164F092DF287F2E19E464185FE11AC014EF97749225128A95AB6520\ 4891321D69B0CB0038E5107FC70DC450E4E3D1E11B642A581159EC0E5E34CAB2\ 628A2B4DAE5FF94F24F3B21D:\ 3779E2D71D4A7B4F95024C217F29355EF163018F3466F924DEFC6AC2B249855F\ 7943BEC5E7D7F37DD0E463CE6C277ADAB8738EF42CA056F2AA613D2F2C02B227\ 7F914700695DA4AC794CC745EAA732B4C3E546452353332504384150A151C778\ 9D8F196703A777E94FB4D634EF10E23AF8BBC45E920AEA05CAFABE53FA57DFEA\ D5339BDE2DEEB66373BCE7CEDF95A53BE10965035FB6964A9F716BB30E725853\ 6CDF610E31CED2507843728E3CBBA81408FD248416D62F87237212A1FBBA9C93\ 4A760CEE6A32CD842D503C48:\ 331DB15636D11BBA27FA7DDC5531C62FE1791FCECA8FF5167D0435AE89EFFE2E\ 557B6626428669095E99B9BB08B669BCE6FFF1C43092076F41299FFC74DB33DE:\ CF136D9D7357C7D67E97BA403E63EE40 714E80E6B7262BC345047BBF74BAF4C240C28128A402D3A9758590F0E564498A\ 58E527CC323B9B45D4F89E4A6738F46695012A06C466EDCA22D0A007138D97C0\ 63032A137CB6963B850FF7FB4859664CF7B94619F870A2B3BA857AAC713CAEAC\ 0113BB733B0361DE3F6D7526A9D30027F00EBB8FF17E301292DCB077A0044F6A\ 307C00A3BDC798FC46EE20A87498C3B95FE7EA83EC6F204EF62385C193A9AC64\ 7F76151DC238A50780FB0A56D29B2D8CE597C0492EA4560079135504130AA4CD\ 7419350D98ABC037016F53FE80:\ 13721A9AD2F7F60EA7ABD6588535A7ABB74D2E68DDBB017C89E0A017D8A51B40\ BE749ECAE6D77FAA7355F001CB042ECF296539A9C03CC778B8693F0D0ED880A6\ 534848A1EF61C627743E799C8DE5BC43DFCAAAAF58847C8892538281B43C2741\ 14BB193364ACE22CD93A2C4D764D691EAE8C5ED391CC2A8BE37FDEEB32741449\ 9B7166F71402EA0A017E895748AE990BFE4AA0D18C23D941BA7BE78716821459\ D02544437BD2F34A38AE965E269A81F4D57414E53685D8A01B1F0705C873AB4B\ A5B0245670BCA692173E36B45F:\ C27D7529EA44721260768732C3AD8B24E3FC523213A0905D0238EB443B09E276\ 45593372883DC1AF298EEE66C6DDD74DC45A007E0C22A5CA16CB3D2997637090:\ D806638B5EBC073775377182AA6506B9 4273D25B20A2AEFA2CA5432051C6B95DE336874C1063E5405E584CDF6C24E749\ C9A6450D350DBE46489457E58C4BCDCB5A4C4DE5407CC572285D4097B1E55712\ 53F4937BA7848E44B8135196AEF8C867284CE2ECAE37F4D7CE69A15BE328C856\ 8414BE88560BF25F8E00FBC2E369C6732BCD87551F7B9C1B39DB5A237AF5D3E8\ 591E3BD9B0A431521436F286E5648A0DA116AC3982DD18FA272186293769B6BF\ 1359CB311DF8FB408BA3C1AD95110BEC065341708AF064C8FD795E8DB95F69A9\ 62C62E9FF27EC52648FB9A274FF5:\ 8F1120F0CB76E067DB6E7B1687C00741B32251D7FA6AC7DF2E5453989A92345A\ 3FC5E0CC598B56327C96FA32BE2865062862703F812AC835890D40B6EDF8F8BB\ 93834F9CB012D0ACB45FD63FBA06017584D055A7606726336AD64CF9CF339BCF\ 2D92352E42FAA832048C9F9C0FD3CF3F8D66F7018EB7FB71773795F7B9D1AE56\ E146771F704911C1FE73A5B471F6224E85E287E2C6179AAF796385554F68FE91\ 9FF2F263D51189C32B7BB878BCFB694000FB2AF809E52961B90726811258F12B\ E83498CEA9EF253B24CBBBC7A922:\ 9F2990AAA561A95239ADBC1535924CD4E588E7F8A70439E5E88D04BC94C795CD\ 7E7AE34A586411458E1D84EAA427733AE33DC339C22E2920A987B188E5D1F293:\ 84FAE789CC6DD71D5BED9323C2E72FB8 06C19C37793F6850ECDB9623BA722A9CAB05CE250EB821AE57C91375C4BD3CCE\ CF0BD950A4E1FD7E85508471922F7FD94B150352428D710F9323B2434B9E7E01\ E4D77F90D0E91753ABC6FAFC1AC6570E4D0A6C517508FBD73E9D58A4A0FBBED0\ 063AB966024B8D6BA7DBC38AAA0B06F84CB0FABBF97A7939C529EB4E0A034505\ 3CBB9ECAA8725E13005734131DF46EB90199687202A6816214A0E7AAD81981E9\ AF8ABDDE1609B1646A2693A8EFE5BD29DE2CF66F56C9F768C6A27372B9D64940\ 7A2426969E6276F08CE90C64B2DCD6:\ 75DB49B13820E32B148FC7CF5C7E21C083D7BCB61AC50293FF61CEE1F9901EF0\ 40B00ED3EE647215016895629D748445F1566543F2510116FEE4961CAF8B8B71\ F161CA538C99F6F3E2F54980218B77BE9415E25974013BF0575DB7E3B4993D96\ FCF99A2A7287FA625EA0DC60D44E89E20DAB845AE1299E33EC936BC439DADCE7\ 954538F8894BBCBB637BEB32D7C9622D0ECEB49D551B1ED0770A26145EC39BF4\ 7E14E7DFE18452F31003FAF21539163694298C7EB7FAF306F3270DAC2169D172\ CB60D9A58C07A7E65AF534C41EC67B:\ A9132FC52C49EA0BAFB5A6548B9917C5399FE1319A563EA44B4D39C0487154C0\ 49D21EB305A67FEAE4416F9BCB52E103DEC893E59BC33A54D7E8874AE208CE36:\ 309AD070B6B593B53750224008400761 C05B8538AA9113759E7D0D158FF727C4BE290D2357DCCCFB424BA08BC3E5235A\ 67452950EE27E8C24716BFE6BF071C0D85859A320C8C872BFAB7DFA1E3E5C117\ 4207BE841610155BE32E373509A64183FE4A05F00A99B51D214023DD41812C78\ 32215F5B4F87AFB3231E93B7DF8F3274397A9AD5DA4197E3C7263192BF2CC310\ 8BE40822327D2A57EBC6268D8B59A600FD0C55AB57765B0231FDEC506D9DFDD9\ 4F215859BBD3E930959DF7D6B85652C1EF482BDE7DD6C05F160ED7BD88090788\ 8DD4F877782ADD48875DD944121AD4D6:\ 133161332BCE7B74D3BC79553ADDEE0387E035EA5A484B5F2C59898C45197989\ BCC3848135752FD908604CF15377C38B093CF78126B5F08EF37095164B75CB13\ C70BAF78A97887B7BC5F2236750A4B6F48320D851FC62A4764FAA646A388A04D\ 997C8A8BB0822E047EB7FC4C69A6635A303A2DB2A91E715FB74AF8A96D9678C1\ 0A57F605ACD2A64E94C714B46EDC4DAD531F3A9F23055AE5EA68F9076E98F902\ 1DD24D82DEA949C6D5F195A945178C9097D1E1738F0B8A206D7E5D458527A450\ A782BB4EDEC4CCD90F312FF036D76FBE:\ 755EA8EE63346E8E7BE6DEF46F5C579031D587D876AF5289A8E5392E7113292F\ 1DF27DDD4D328F4E9E6F52913954EDDF20F5A576A378BFFB65B7E25891435DC8:\ 977F8DD381F808E45C651A4BEB336799 C843E946900F039553F3F862D50AF3E993A7E4AA4EA58EDDA4511F9F51250FA4\ F89688D6D8915B573E2FE257F8A75ABBE16B2E96028173BB12A6A4212FEE8067\ 7051F0D188077D3BF73DCB8865C77D2DB817C2C1035A0989A2DF7F562AB05A61\ 53618AE7F1DD0EDA3351778B48DE902CCADCF1E33A66CDBEB03991D409FC1FF7\ 4A2DA5544D10A78D4A5B26F0084B1A863D911CAF23A5032AD29134CF98E20343\ 84C0EFFFF2EEFD53D1750BB15E36D52CC6D346D146CA8285B49C751E147D9AFD\ 352D90A95C44D20FF969A4538C2495F1F5:\ 5D11A231D5F3522FA1AA113461105D9544018396F1833081E46A836ED4D8CFD4\ A889A53DC666B8D05C9D3E01C6740E737A4874CF6963884D6E7F287ABAC36B99\ B9E78B76B0C621CD275EF86F5DD2E905404E47D316510719E059580988849330\ 68A63A22E32CD0474422FC55F404445227A8115F87663295D1F6D0EA05E187F4\ C1676752531C4B2AB3E2B6B0F404F09A98DE2822360691FCCD380DE1188FA998\ EF94069777A7AE8BB5B849DF89916CA95119D5AB3B5EC8EE0D653AC79902494F\ 7461D04E405AE9074885F651DF539199BC:\ F0847AE871AE9B90893831C1E558ACEE64381846292C35102F699765B7B06AD2\ 79EB54F556594E2162D931F284FB48E2F26B530ADAD04D6D9C3163C29DDCDC6B:\ 21E6CC4D35D80D58C10223B2561F2E4A 9A555E3351A07E9DF81AF4BB95C645CBE877FC2F7AD003D8CC2277BEEBBF54EC\ 47921AB1CDDB0720895A28D12E0DA7E00B5C549B4DE00282A4384C8D3CEC20E6\ D9A3A4A6D69BF09C9F3C08B6B2DE1074C31148B75210D5CCB36CC35ACE5A20AD\ BD524EB7F522E08837097DC692111BF6589B04B1E9CBB9C1E9DE9D523590261C\ D3C8000EF8ABF9CD9C6CDA4F8613CD4641C6F9AF7B6813E1097130CCDD43B33B\ 3F9B273C43A245A5204349B63282935CAB6BF286870AF3535321D3BA94DD62AC\ 97F50B5476636AF14309ACF169AB3190FC91:\ 833A8801C3FF37A5A4F206ACF4EBFE2133D1D334109C856FB93DD721671B2071\ F22DA5872FBE43B29FD7656128D09B66E9BB630F92CDC2A132620D703165E1AB\ 4F3949CBF6E8F4A254736AF521C1D3DBF97B5CBF9DE143969251A1B05AB96AD7\ 34FB01EAD1C9463BCE2C947E7EA10C8AE998C600A85280C09254AE651AC6F3EC\ DC6A52F36F31F6BC88E46F649D4687F3772A74B642495C818229A43CB6AFE8E5\ E100CEE924BB362B13CCB9BAEEA889E3738A0E782C68A247D95FA5D4FAA7CD1D\ E7C9CE671640B8415C9974991ECB5E90B339:\ DFA7906EF224FBDF694195E87689536C5B4C8462A806665455EF9F65476DACDA\ 9CFD9C5C424532F5DDAD54D7D8FA553055C8DD5A20193A3B37500BAF17370950:\ 7C55B66CDD8CD368839A2545AD549F12 34088A28DFA3292D584A845DF63886D74F6EBF84B7B3829458E732D224820AAB\ 238E9E1E502A5368AC95A68CBCC0E4C5824009AAA3CBECA04FBF50A1C51BB247\ F1607E1A60CE0C97158DD44F786C3FDA89900DC393CCD3081C06E28957FEBFCF\ 6F0EE2BC66212017984A32329269151E2D40ACBB76B5E4E11E6D93C14C0A794D\ 33F485448770DD6AF0C0CF8A072FF1A16814053EEB10011B53DC4FE3B3417761\ B54FBA6DD08F800AFE7EB0BE0000412F814EF2D4B8399BE655F544F6A0FDEF19\ 6A2C06B6E7368B2B9ECC85C896BEB23A2E2F67:\ 5048E5FD9A25F20EB0E2FAEF122A99EC11858639689F5987A6C4FE1FB80075D5\ 48C741C5CC929639C6009F9A7410DAA5C9253E5E520954BE4A903FE10C33A717\ 24C8B0C46F7711CE9574A23EB5DBD05D437700FA7DEBBF1ABDC364F3B5AADDB0\ 4B34245F184C29512B2351145F30B1E52B778040F39EDC570976CAD206FC402A\ 0689318325D9F32889D3D0DD863985BFB3237DADD2EDBC6B7FFCFC12569737DA\ 572E7B81B3704585CB2DA61CDA18FDEC10C26F44085E0F5A852EDF4E3292613E\ 2DF7F384A13EC3D310400233796BCB3D11FB45:\ 84A24DA96DA3FA33BF463E82614F5FF6BF8E1413106BE79C4C7A6E3A33A187EF\ 6F5544F7E48CA73B4D2D347996219264D3D6654825839D36CC6E94F293A10166:\ 1799A67D65836E239161014192BE8E2B D4938BCA1201D96883D5A36A05985A6DA771CD3024F288A9C3F5AAA93C5AE53F\ 14CF8612E48EC428665B0BAA3D85EFDC1835C82236E38E9CA86265DFA6316570\ 776D47031558790A5778E873BD636621CD1EB6276FCBEE47504AD2AFA523CC78\ 6E33C37E6DA30118C3B2859723D33957FCACEDED68AAEA410DCC9DCF1F35BFF2\ 7BA2033064C184B04BD28B1DFDDE1CC08C808054EE5308E6447C7D77D23BC2AD\ 05DEA5C73455C747DF65EA375DD24A79A17185BF1AE4262C2934CBA5557293A5\ 6041BB272132D4B42520E9CD5847917725640EE7:\ 1A73411481FB309E1D3897499C980DC2A4890CF6D375674DF789D39535B4ED0C\ 08076E33D009E87B07588A7562A40AF40943525BEF121A6C71DD8AE64769138C\ ACCEA2B13B36DB494602DC9B71EE9BCC574F9C729400D70C85F8E502BA46AE97\ BB414E021B6BECC1B31353E4399CDAE0923A1B3CF7B2F23EF3EC7F7F1F540F3D\ 3607C84E333D0EB246E6BF28F072364825F935D30911B3CCDEADA7E3C50E056B\ D418EEAC935F6C937ACEB88D7EC809816057A6484A9E1553A5D8498375302FA9\ 330781B601A7E039EF2AF7E510AD017726564B23:\ 541440D3BAF4CD676C26977ACF4617D6AF2B5FAA9E22321698B1E988087ACCE0\ F5E19B3BA323FD790CD30A2BE6F59FEAB0AACA0F6059EF869D49C72C5DAF73F1:\ 1E9434A26DCFF2BB417B84DB44CEACE2 8D8498D9D060DD792298C2DC1B209A363FD80B9FFF3FA3FF10931AC134AA6371\ 7BBDA6DB6F8F96A3C8FD11EFACBCF8C9F82F0377C536867CBDDE91A1A04EA493\ A45B43554FD5C373C5B9E16C8901AF1FE32854CBFA2089C494F9C00B015DBF2A\ A29FE0E052D5F5B1507BA9999E15BDA37589C3D8E731D233B8A8037FB174CD31\ D4F98FB4DE61C4E174D73BB53FD8DC22317338D3F6F256DEEBC500FEC9557FE7\ 117D31E9AA251CFA06A8E7C4FDEDB4EE76269D53708D97BF2154739B41C05CE8\ 9662138C989BF4DD5B17C9D1517223FA29B0792209:\ 32474467AACA09704DE3E77691C76D840A16C600676C6ED091EF86B4E31E0047\ CA9D0C74616495FEBEC14780E2CAAB2B1FFAAFABF638D0B09F29D1F1EDBF3938\ 1B1D2617C6099F5AEB0D679B12FD22FB81F43188E96DF5E315002FAA163AC440\ 664C55B24A6B6A39BFAD865168ED2155045D6B6BE594EDD6EDE1C6DFD4D6F690\ CFABC46368AE683AFD75CE1493499D3D7646D52192C1445593E4D8DE7E43DDBF\ 00E8633444B059730FBCCE51B564DB7234D34CA67AFDDF38A03E82FB15DCEF5F\ A0489B3505242C9C7481C4677FBF243E027C65E257:\ DC51876B956FED42CA6CEBEBAD31D92A3379C896937D2DB10A59B6D266291992\ 3D9D3C4E578B2015E3383B3F93600941EF0029C8774DCAF52446597BCA6F64AC:\ C452174505E5832F558FB9A514C17A58 F84C5474F05C4BB30F72B73964BD4EB005C0CA1C2375DE43ECBA366B8FA6FFC7\ 4E6506DE42BB78B4C16DFBA0D14FC90468EE6BDCC9D33177EC5B28E94CBDF8AC\ D42D76D79D7075A68F6489ED4F2739ECC146998108CD88E6A88D591707B46FE2\ AD2F74021006FD8B59FF70F18E5474379AB700304298C4EE9F889C5449B603F2\ 57186E82E7467D767DCEE43F1F33BA02388D5018F0B0F36B60D962CAD80D1DD0\ 01098EC8F0A05ADA6982ACB4B8AFDE5E5952559D7A690E28FA6B3B52F879FDFC\ 4C5B33F829D864EC85894D9C60FFE69D978EFEA54AE4:\ 518C99CCC99C66A8E47FC3F4E41B8DAE33D27B2843E51F02FF0015BF6D36684A\ EE10344BC69F34158803F19EFAA08183FDC6B2B2AED95DD398B4AABC8C567ED8\ DC6F581199597C008A39A763CFB859345874BDC8E8A6BB405E1362098E24C172\ 9DCA334B4AF3077F4B5F672FF6B6FF209602A3B6A3F0AECF69F47EAE0880E4C4\ 2F0EECFAE50F9F5EF7B1AF119037BC8EF288797ADBA69422DF524A4490221399\ E47B8ABE06E5BD0AD61DF427415C4DC4DAB8B126F88F4CCFACEA237CD8761715\ 539D68FB7D24FEFC294B9CBA4924F6A260C747FB9BFC:\ 1775EAD6878EA57034A7C4171E24514E2F360A449E9B6D2606427D878CAE1808\ A2260544464E363930B86F165442E32680890B134F6C169841603F8DF2B18FB8:\ 5ECE34595B263A5A4EA474C2F9496F8E 4B38B233C1EFF3329BE5122E346C59F7E15787683CAFF90069129AFCA9EA92EA\ ED7D2A32355A49D275BAF2841D0CD6E6FE7C2E7D5C70F9AF5EF5FF1E3CC0C178\ A71818515DD6F36F25733A26AB17A21CDE8008C272477A495F44914466546628\ 200154A50CAC657995E7DF2CA8633446D18059CD726F5A6FFD7289C8538E8D2D\ A389FFBE49484EAE75AC5B1DBFD9DE5D43DA81C7F41B08799288D62A761C8511\ B60E1926CC80CE6539A1721D3A2C18A7F57B2737620C34E37CB6D3016C8900D1\ FFE5EC64AADD4C65BF4D6A86BF12BEA4B6E8FAB3B3391A:\ 5984C4C70A614C93CF23F9BCF6D5FF8BEFF2E2CD24048E232633E56C10399E95\ 854C30FE70BD4A151B174621B8CB7DF009699215B4BA47441A3A267C939F98EF\ 950B23CD20879A53C678E9FA0CE4EBC218431B31586CDCD13086DDCFF661343B\ 74CAD55B0DFF0AB49B5504EE076874E62C01D57CEBAEF070D3E761F1A5A08F40\ ECCDB4A58FEAEACB10C537ADF6F59AB02905B2D3AF6799E5AB8FE7C939F0794A\ AF9228676BB3C3C8DE45B55F37C486E683F6A7BCAF1E144CE89DE4A745F6D1E6\ 6A82EA47317C9910476682C74DBA3D04FADB6911D70010:\ F8082513FCC96F9BE2926B447D77E8B8805D1626B35756F3C0BFA8E92C0213D6\ 26F8C767F82F3AD6219082C8249454BB5640C7B438245F6F537CB3D379AF0E1C:\ 7FAFD73DA2B8990650FABA66CD918127 EB332D2F4C4531E2DBB33EA97D72B8805BE064FA0DA9D4525E34FBF235A90706\ 8A8FDDB91A2AF0E53B98C713790690F41617720BCCAADFF813C7044CD9AF94DB\ 17FC072531C8101686729F25DDACDF76A8A7CEA506D2CA91FC4EBBD2807E6D10\ C87AE8EB51EAC125A172FA79ADA873BF2E519287D94C909797827842B600DF15\ EB2B4ADC0EEC77C8F46B16482F6DE8313C0B9DEF2BF17F8872713E65FB1F5C7B\ 78543B0FB5300815231D8B39FA713D268238DB78720EF030CB183F12712B2C1E\ 4DE82222C5EACEAAC536AB6A283C99E3AC87E638AF5ADBCC:\ 57316026D2D86FCA3C7F98E18B97988931E9CFB58243549712A960943E5B7EF6\ 21EE3676E57D6362E9312584B50A723CFE356AC9DAB2B9804B72AD9C782CA112\ D75B31255B9E701DB200653A160A5AF2DDEF3CD662482ACFE5A5124ACA4A4282\ F7A9F95870F3058C6410D0A41F69B1C172DCA7DE2CDFB3C4CA1CCECC8B737828\ C83DB457E74CA36113E06FC8B717D14E4E560A8318B38A14CA27C63B2F6971B7\ 08E4B94AD9FD8539DDCA8973CA3DDFAC510FBF4F21A22D69900CBFD248FF0BBB\ 56C6FDB30A561FF993DBFA0D6DC67EE82AF2BC5EF21923A5:\ E4FE26B71D0F221D917F7138AEFE73A527C473CB5465B9E240F693C892A69C05\ 0E6DE0ACA357D653B61A418DC072C6D49588E31CCAEB42ED546663373A8A870D:\ C5CAE055BF18D2A1E9175A8282425F8C 64DCE8B7AAD08D95F47B43B72C75EB6E25C68A393FDF26C80EFA7E7D2AF1C7F0\ 52796E8EC81E5220E30D3750E9ABE6140C41FC287632EF085FBC89DD4C522C9C\ 8BDE74E5C66399069F30F9D4AE74D161717AD26CEA44D479108B193D4D32F9EB\ 529A399C9ADD4D42B560E8AE568B76B48ABF67BDF198964426396B7A0ADBB906\ 99553CF2A24E1C69DD724C58B525D1356166179CD741E6E5A0BF496D45DB5914\ A4DD892068FA067C8514A3F7D877121444B9C9A460EF31C761A70BCDF2B9F137\ 77BFDBFC2B479318B0940F7B078315F113DD435BBC860CB73E:\ 141D1263397455C3695F163E207E560F9EDEFCADFE52ED430FD3E6CE0443910A\ F18D6809E0458C0112E6D6A94ABEAA3289F61ABE39E8ED284188A48A8C9BBFAA\ A3C3E21C8B4CFA038016A9465EA7618892D7DCE0C534A5DCD71036C4DA849162\ 6D28427E8FAEF7400C27A0FEB8A3107F3DF779CBF184A8DF7EF9701C9EBD6C1A\ 6BD9A4A72540C194ED866C8ED873D143ACA554E7C1AEEC3C2BD3C05F38C9C48B\ 55E4B212D18EE993B9B89659E1442ED3A4616899D91DAF285E5A304D41E01FF9\ 2AEFD797086800BF68FD02E3A86D4F20C66431CFDC8B40E9F6:\ 1CF3CCCDB640B9D7778416ACEE72878CE1F28BB324A74568667EE229D45CC52A\ 0DD1971336C2DD461488A2BD4FBD59B3A8DC9509D71C361469BEDD2EAC6FC3F3:\ 1316EF3DC8DAC3E4BE1CB7D84B55AA3D EE70D94C62B7E577166DEC9686B9CFAFE93B15C9AC839219B5ECE0288F71EF2F\ FA3EE174A8744E7B9B353522D80C8EE725018A9213B1288E47158B0DA12D1521\ BD45B366C7C61BF326F438FE120914679220A806F4C15778F4850C1040D6576A\ 353BAF07963AFBB6327BDF813B9D010A52CFA7DD0F7B63EE22797047AFB3A5CF\ BFF09953706F0AC741C7852E135502A2823DD634602FC331F55C3F6283F093B8\ 0CE640625A789073A2F2BB010D8711BD1AA6CA6048674A0C2CDCF00A46DF04FD\ 5FDFC6406274F8FD1E0FC895C538A26B0FD57AAE15967DEA99C9:\ 5FF211189A9CAD18260097EA1CB0BE056A44A7914157B23C956F628A0B4EFB02\ 2592392AC8B9F6CD51B515FCAB0EE9A7076B441B56D0643787ED99165937171C\ 71D2A7E7FF5F51F622573C6D47647BCE4D6B698BB8F574DEAF72B04749DB7EF8\ 77B05883679AA2ECBB97A0A3A279405CBF3891C98CF0B57BD4962A6CA3BD281B\ DF117F8ED5A8E34C73D69735D215878C614DB4BB1C56E6A0C920FA20ABFBB91B\ F9CB431D619AD96F53C0A1B2A9AF703EA7A47F30F4745684B8F31A1B2A60DC40\ D5224C4287A3A61DB3CB4C901ED101956842F50BAD8A19A134A0:\ B15E06B5DBBB639C60D133A290DCE9EA79BC4DD482A75B5AB813C69A14D9824E\ F6B529DA1973487A80941B8EB35A80CA608D5BF4C62568F1A64E93B1DAC49660:\ 8516F50528C900D3F91BD83376A30E51 F98269236AAEAF81C39C20D0F95873D9A3E3B370E260137B332951017AB8A342\ DD2DC0E2D13EFB5178B3BCC773043C46C5032A4D9A700FB065A02EE674BE2EB7\ A8EF2BC0156A02B698625FDEA2347F4BDA6F03BCEDF6BAF16BE6BDC5B43A4C4C\ 9CF85B47B4D7AA1F6AAEBCB8563A6C81CBA07B781E744FBF390C44C43A9690F2\ EFA8DE98605773B2CB8A9D89D364DB90AEAE88D52E885384F086A426AE61A259\ C8F34E0710CAAA977ABFA888C09477C6DA328DDE3C201EC52E6BA2507C969D58\ 7202BB74D2E0A97815DED40AF44F728997B5E71888CB6925056F5F:\ 42A8BA0460E011CB23DA387882DBF6E335DF7E40997DFF70352BD01A46FC535B\ 6E0C00625782CE194FCC77E6A0B0A85D96B607A6AB1F943B4D1EF1454E29C0EC\ 715450B4E474DED199E439FA515B52EC7F4B988EEBB00C3BC07C9845D7C5447C\ 78356B13924B420868F67FC6B5514BCC31B59BFA7A66FA40FE2FF4646DB8F99B\ 68C249B61742F9843B5879B7860A0E6EF4D4E27D82C4F8CDE0FD41F8A963F0B2\ 6E7C5E4024B7FDC2D0DD8B29F83BE3439E0425E7E44108BBCD0890B62FF3EF6B\ A97138FD2196A9FE9B3E4B04F82D6E78B5D1DAB4533D783620142E:\ 9FC3D8F669CAD87D0D1C2F6D199D46EF5DA2A50464DF3AFED038DECD870DB299\ E8C44A0075EDC9135D0580E9992BD1D542D046C2FCE3A1F3948A9E0DDD63D7E4:\ A03612F1966CAB25024B7FAD475E3AE3 AD4408423B35829DFE511412DA37621CBEFB697029BBE3F8F3D0B66D468D70E5\ DE2097106344895AE73429D865A832D7E5DE4F557278232B47119998509B25FB\ D2EA8AC3246800B5E5F910E91DEA76E487CF76073C83072CE1F7E02101F9FC64\ 3C7A9CE782040AC7BA472BBE5319EA4ADEBE45467FF9A79517EC25CDD55C68D7\ E8748EBA3A83271B288B80DAD432C7F48C7E88DDCB25569E2BE7795D62005489\ BA48414E13165F8F19B2CCCC5BD142D91BC9F9A06F030D3A29304DE55A3D0252\ A0CB592B65B4E8D41933BA024667B60B3E2AB1AF99655D144F329EAC:\ 28B8FED302DE29E2A073D5C85187C43902B1C20566349A0FCC0C766B4CDB7DE1\ B27DF7CD3661937467986879E52F61A44ACD6A227C1C63DB51A72D9D9F2D9298\ AE8AA6FF828B84A6163EF85F8D7639D751426628D133DA30F4E14D59C53A71FF\ CCAD3D49A1107CAF75AAD3C4BEDBDFC2C177855A252D88C61506F8DB362B5598\ 0EE5475D63EA42C6838190D764F18F0B3AFD5914A9A3185BFE8590AF4FE551E7\ 2D915607FCB8727CFD919A5BAB216536E772AF04B850EC5FA030A5F3B6D5A7FD\ 4B6BCB3F15212D76000C9D6F7B772B0544948DBEE733D2235C7FDD50:\ 396A6EC3E247CD80247168D76046834FCE253ECA09994B9E928FF78B9547EEBF\ 9066F0DD515A9ADF0A8C2FB24F19916AD5C490971479F56CF145EBD91E73ABE3:\ 3F263CEE6014BA57E5DF4D1869B6AF4A 3D2F27E83552156CA4419ED21A0785D13E54DE818026A2BC6451A20D3E153FFD\ 21C54F691849CB0DA44AC46468C7C4F10CA7500B862F5F59CD7489E7CE1A1F3F\ F2C4D29EF5EF10F2EBFDC22C900963AF3846D8AAA54132F48CD35634E63B0C3B\ C3907A80A08B4D9D4F2595371D3C12ACC225A28B163B94B910E22AE70F8A1207\ 2283C6DE071EA73CA2681F7258CDC6496930287512E9AD8F9691747F58DC4449\ 219BF609BBD507233E7594802F07534314A3825F086F5243883ADA234967E2E8\ C30545CDBD16B2E32E5DCF827E1D6BD1A9BB7C9008D614D6F17736C1F6:\ 0D909DCA72772E4629D54909B46CCA9024FDA40A13016C3794F889809C41F6C4\ 9DA4ABF72832AE44F59328DDCCD33AC9A6FBA495478C3799EEFD2848186516B2\ 75A1764A2D3B25EB01E9D9AFF1D179FE49BF898409452F0DBBC95738931FF04F\ CD18BBFCF679037724FADE72E10BC6847AC50051B93EE9F30B771C421C189427\ 7331D955A36FA7D5EACCD03435105B07D61598B1C8A0FE4BA977620C728362E3\ BC3CAE0492F5A2794EC7E7DA25743AF4EF21432791096BB00D598DF433C784BB\ A21F64F16CFDCACB26FB3D48ABE91E0F4642725C0703C205FAD257A470:\ 51827074453DEE619C6E3061A7E85510C89CC4279EE49A49F04560AD6A9B92D7\ EDDD0254E1C7E147BA1284D1AF164742E74CDFF55FFF29EFCCA29F1EB03A0105:\ CDB8755CB0501EEAC26E84585300AA65 287827BB55B859CAD808378AAA6E5213F59BD55D21663927B0B8A6E3705320A6\ FD19563C2F73A9D2F7C10CF980C560435C21A4428E43D0F416347B780D1B6D08\ 04B3C68AA589B7AF441E74C8D50C5E0C6A01E4ED1CBF073FB6D7625C227B9EA1\ B8A17C625EB5A465AA23620B3F1277D4F314C3A06499F657A1431B5A28D38DD9\ 98C577176353593B8154BA4260ADAF3B3B01DE1C8FC1364BE9C2C4F46D679FF8\ 820C02954914BD62B46C90B36A50D0D4C93088FDF42012D60F63D2E6F29532FD\ D437A15600CBD9CEA33DF466CE16DDEF6F1E02912296C5866DE0F9818A9F:\ 5FF9AA509118BACEE02350AF42541C5423BF3983B3DB39EE3D23A97C4479FBFC\ A341376388AB7E8AED241BC1E1CE1CE3CEA0777E02C40C2CF37F3915F60B8B74\ 3FBCEC5D4464C6B9FC168163A5565AAC32B3CCA434A8EFAB58D23876CA41E99D\ 4D753385C83D1330687453202638C00F63A2113013FAC0DB639EF8C491E4E4B1\ 507600E5DC2EC6BFD71A77208016520951898AC45660D8A530473AFD89244DA8\ 6D0CA0F0B10A9390D2909F11DFF75F36196EAEF39AAA2A9A31CDB8F1736A087C\ 3D8CE28A53CCFC5797E52D217F49FAB9B6C15FF179DDD55E239B33B24ED0:\ 752761C128E74655EAC40CA673BE297BBAD9427BADCB31FD41D2497732576473\ 4123DBB3F9C0551B4F9AF034B342411A6A37B0BE1EEBA45C36D013379541798B:\ 6C09C94F287D9EC0B341915A40339387 8AB2E59A24D5F2607842FC848DECF946F3DA1F5E00F54400F5A7B470B6EB87B9\ 40C4CED5D8A6A076AA35F81DD599CF7F7A5BED3E0846824F7F1E777C27907120\ 1B10AE0F3316B4699543E894976004FFF8E8C33A47BA25FD2D6F76E3B841C1B9\ 013C6FFC35697A8EAA1F5F5C622704BBB90816AEDF123C05EC8FCE8595D4A9F7\ BC49677D745FA24F50B075AB35D1732620EFC3E039BCC92B0FA6E5103C2EA241\ 6E3CCDD8635B9A5BE842476983341DECB3864A4197D39561048B08DEF48BCC53\ 0767AFD98D06C3702F41B08A1149D5049A9AD08423ADA0CAD9E7C33F9AA88C:\ 30A3D1BAFBA4081D12DE7D9DA0526F51E1772F6093195ABAC1C69BDEED77EB4C\ 53B02BDC403FAA399DB6AA8B1827CF8D073A9D8CA78EB16679EEB4D50957E28C\ F2BB6CA00D05C286219FDFBF0DE35D271081AFC3DE064712816FBE1C25EFC262\ 3E1E8E41CB82B6FE205979FDE7F96DBE18B101E0C204E481BC54D5B52CAD3B38\ 9A3BE224C1564D0BDE18EEB795B9D49E8B6BC0CF7C8DBBB48AC2F68A50B6612B\ 6A4800B7C171D4026111332C0DB320802F26A72FB444029063FAEAC94E9EBD5A\ 7AB820C38C22C594A787F6EA772FD74C1FA703635044F9F3F9A52910F60B2F:\ F9DF053F6F86540A1FB48B7602389B7B07287920EEC03D256C9735A33F1BFC75\ 99B60539ABFDF9049B565582DE65CD4BC12E3AFB4C32F49039D5B875DD75AEE9:\ 387FC84933E350F71033BCC55ACA9366 CA8906F79303365439AC120FC7609F3FD454DEA9CF9DE7CABBEE34129896F5AA\ 83C100105789A2FE286688BCDD09F0D335D2A4647B90DE13DB0F9045E063492C\ 970334E131FB9E59E1F5ACE75D5C8891197A594FBA0A8E85249AB0CC033350FC\ C794EDAD0B3A1DAD08C2A2110C40419C3E10EF47EB3ED1477CA5608E28844067\ 5A6858A7D6FB58F8D8A8824E4400DC5EEFE1F7BE986599AE2023E8ED078AEB2A\ 8734D0C2F3BDF52B689F8C511CE41D0FC780F02188E569E428045A34C752D506\ C67109B0C49FF285A1AB8965A975DD199F8B582020AA9465A87494F36F536BD1:\ 545BD5C0D0230D6247F61D17C87845EEF542A5623D0AB439DA7B111DA728A972\ A1E714A1537CC3BC52382D0EC1D894785C3BDEEC7A8320F39A1BD11FCB6A0FCC\ 462BCE2A63B4A0D8FCDE40BF1FEDDCA4D07C2EF859FAA8BCD774362982CB2E09\ 01FBAC5BDA0B6FAAF3F57E212794641ECECC3F63BE75DC76B937550753B2E1C8\ 741F42E4C8DBB4CE6DA0964563D35FF52D0AC3E1CFCAB37B2ABA342A2C949DE2\ B3F37938B4702EF99900FDB578578FF7CF982D42412F42C767575D3D5BC7E617\ F0DBE0EBD666A5E335377D3F8710FE431403B9600022F0FFF2585A722BB8177E:\ 25CD677272019AD4E231E6192FAFA22CDE641D3B46571C883D490388F5874559\ 0EF886A9735992E460F1668235FEC02A7317400FCEC60ECC829D42A08E73E3E7:\ E9AA61C6E96EAB6B6BB2CEDA79010513 4EF7C5614320BA98111047AF34C8971A9B7DFA6DFEF4F037AF63C29B8BE853B8\ 42CE9E766CB33AEAF9B088BFE4731F34EBA07D2FFD845666249F86868BAF47EC\ 827E296C3782C0643A814F41532BD46BA4BA1AB5B2247BB4AF5166EEC812E117\ 48D5F082F3DD076BF00B2FFEDCE4FA5D39A3A893D593114D400AE680942676FD\ B377E9445E541CCC418834CF92DA2EE396AEE87A2A24D99CB91F1CF75D721F29\ 49899BB6A2C6772B9790090DA747072B520CCF87262E3E537D404EFA1D916658\ B11E9CD854B15BE677FEB47699E9B9874D464E80BD38D1FD2F30FA578C9088D7\ DC:\ AD67815E31CA6A69297F0F33FAE51721702DC6BDEF156CCE9D70EEB29534889C\ 4327D405AEC4E10D2CE344A7DB26899078EF715FA68BFE63591C8D27DE6AC3D9\ 341A41975325864F84725DA38F8B5087D4D4FDC8BE404F348E760C96FE222082\ 52DC8877B86A680EBDAC40FF976329502BB089D4F368431469748DFE5D9835BF\ AF020DDC609146A70F1272D002CE08FDABC3171CE82C43356A13133D4EF87E0A\ A3364CBA0C2DACA940A0A8A26A2EE470F183F736CDE46219E611E94BECBC7D8F\ E69441EBE8C4F6AD3D9BCF810BA1A42741F7CB855CEC01E86F191789773A4732\ 65:\ 335310F6B3A04DB69AC5C39CF37D5A06B27E9CE5B4F20BE42E41F1FEFD23BF0A\ D256F520A5EEB1A3130E70AC1A65BB92AAA1EDC73B3747B510C6A2F35D8F8936:\ 6C77E673E124E8C291F695BD10867EB8 912FA9586149CF6EC5ED842F70F6EB5A27580A88DD43828D824C0E476BF94054\ 2FE78ACDF16105E249452618D90F776D51DA2CB7E5C641077877398481FDF512\ 0F8E928C83C3EF9042A2050F1B59A0E6302B55A63E2C8234F01297D420E11588\ A48703ED31513480B442885CB9333B9204CC0ED72E645220C90E9C77B76F8817\ 96D113B6B80F5C86389349F41C26E53C8ADD8FD60E299AFCBEFD37C2552EA269\ EE8C9FFAAB31B99FD772A33FA134BB087461A54671A90D9C4A873027F9C1BE84\ B6D289549E8B79BA5CCE6F39E72FFD446A8A3F70521DFEB7B19E077747159253\ 2635:\ B17B2969B5614FB51F7F6981E3D09ACE20329121024F2E719DB3D581D48EB7F0\ 498F7C53DD31F4D3AFF1476EEE83090CB8DB1BC610435819313E5B6404082225\ 060C241C8C5EA35B9B2B61B04D5EAEEE4B1E606DDE8D7044A37114689665530F\ AF2C5DB9619923F428CC7593840D277D8A54B5F9FB1AED5742519A83A3B33B3F\ 0ACB7A72BC1A7C9EC8CBF9B270657153A5E9F062511F7B7FB6F53EAC40B6BE69\ 07C83150489A7B20F27EDF739D52632309625723207121F8B4927A3473F4CC92\ F6CB4A0C288BA93AEF412EB0E5AFEA66C9E92EADE2CC4A05C27A296A0DA75F50\ 398F:\ 57AF0AC08B589616E3276884E48C39B995257567F1308F089406F0738B648D6D\ 973C3D0B624EF86F3D114D25A68D38CC357200167A7609D74412FE5CD4E33568:\ B42A39E6134016F07DD0210BFA8F753B EA17DB749595AEBB4A85112FA69DBA1F581C83C3C482C36C7D33A2229930A2BB\ 438989688E9008B29EE75068E4B04BAEBDD1D33685D9F2D6CFE90FB1B9EACD8A\ E94452EC5BC0C953CD7F8BF24D938E53720E784F537DDEB3AAB4F410E1EE2736\ C2C02C1DF998C066191207C89C5A5DFD52406FDEAA699BC8CC4ABF9637212230\ 1B3423006692CB14E8566B38D88365D06D9137908666EA8493085DF520ED9E05\ E2A79072D5E899558E5CD0053251A787C27F41C621801AA24868D7664A32115E\ 3D055B5DB9556704AAB5F61604305777A7F8B52800CE0A151C86AEBBB4BF7A1C\ 899FB8:\ 71C48E3DAA44D1812B6F617DE3317840D31701365FFE58D87B1642F57B4D0627\ 4F36D1F7D50A34D9A62A056D25984A1D8B9175B7C85289C3C1989A990861E824\ F642F06082E3ED9A30C39F2DF3362B96E03D468F4E5AFF7DE31B3FCF4E48D904\ 6CB4DE0EB6E00B7ED62ECDE10E9834A63C87864D333B252A55EB5F06A432F69A\ 2B43A57E2D69B53D9CCC6A998A4AECD77AF46811E7B0556AEC9FFC1280144813\ E0CBB5DAABC3FA8B2EE19F99525AC326DEC76F4B59509A88E8D58AE7C1BE50FE\ 934D951AF7F330D92426C975B317A8B2A5CDE3472ACFB4EF0BC3B70B0F9ABC1B\ 1E1545:\ 6D06A63AA19C523105160215D50634024BB208CD465894AD8DC88AE5B0FB1F6D\ EC4B93A44D64BBD44E460EAA9DA70DA4E23AF5ED8F8F8A44056FCD3ABD3F8DE8:\ 83AFF932BA2437132DD0EC7977FA2999 FCF93E6DF50872E63501B70B99F8ADB937B95B2A2AD38547FA767355B23F42F0\ 89D73DD9C4B8F13F3FE7803774173A006378FBADAF6B1F975819B372BFB36193\ 87A17AF82ECA6F1730684DC1237F15B894A4C6014EA93B77496928F6BE06B546\ 0ABAF78F5B06B35BD311B925185F3C37D2FF62F995FAEEB1340AEE71227BD26A\ DCB5783900ACBF3C9BB3C414449E99BC8EFA5DDC5BCD7E55B12D4E21A7A4E12E\ 07CF888E8F05D5A5774C0EE2FD38AC45F0939B6810ED128BD42F33FC236242C2\ 4B365662668B497BA21B98E3CC403044361FB88C4C491DA34644104FED5ED501\ 88263B34:\ DDE76466249800B6E76E59E28FF5A13C09F485E4CFE91D738C992E551918E244\ A19E409D462B947218E053C7154431A891353EE5FCFCCB5C06180B29C2E3BF28\ 2E855B123F0166035BDCFB4CC9950DF7A72704150A2768DDE7A168CA3DEAD251\ 1C9FAAE3BA1B13E8AC01A16AF1E2414BED28B1B494FA3F2E4BA0908972951C17\ 11C594B1A31BA1C3AA31E2C7C1D9204B25F0A71165BAEE774E77886E24E1EB5D\ 72F9A99BB805007859999658E9F1E9DBA6C698DDFD2F1D92D741E75423A1B4A2\ 646889C461E4C22F8542362E6640B1B7A318A96F568D8FC6175ABA4FA45F0365\ 298BB41F:\ 7E4DCBDB3A16569F7BA83E628019F664420292E3B93F6258C3C8686022D4F03E\ 5CBB4BF3577CF85BBF00BA8BE772D99EA5DF436A65F7AAF93DEA8D6C5422C898:\ DC8E94364CF778E8EBCDD101A19D4601 21FC19F9F97727B7DCB59C30B1D71632CBEE8636A8D5B204B0A243BDE418874D\ 1940CC068D5F47989806A883F6DA94B50178B9933B9375DC0DBBBB10163878FC\ 4398F459D28948E6D72C6585C20396AE45308FB3069F872CB9F3A4F83453D131\ CBBA86F0CEB20EAAD36A39C4BE17018E030308323E5EEE3CF6DEDC9EDEAA6798\ B413CCA0B44D4744FC81A1167CA0DAB5988AEFB7B2A02F240371CE29E9DFD164\ 64B6564825C3BEFCF4FB3CD489665F5F4BEAA7337EAF2FFFF4228F2FC0106A2B\ 666423C56065E931BABC44F26651229777170E7509F55323BAFDB316EBCD4D27\ 73A94C0A12:\ F1E994870CF051780023DD718C14FFBD529BFB1C95BA5CAB5C559DCCFA3E1CBA\ 108784A609471E451D85D41474D2200A2FFAB6F2B9D6DC79BA8541537D21F9B8\ 95D57E9900156A1570972A477C14EAB75E65E19DFDF19F84A9C4EFD253B2AFFD\ DDC7DF8F3C4F012AC3418A9F4E194DC859E43F2BDAA14A2C6BDC66CBA8B23C79\ 6C1E1FD440FEE6613459FFB177591002180D66995239DEE4703403267519BC36\ 9919C947CA6758BB5CDAAE2CB9F015FCB75792344B153CEFE6D2D70FF1047CA9\ F618E3CE4A04EABC577493343A5205D84AAB7BD61B82BEF057C91BB8413C8716\ 458E870E41:\ 2D1281DF61A249E8CBB88A1E06DACAC054980A95674F05F7088D4E00DEB73973\ 2754CA620864BA716AEAE0225CDCC7AD95271C172FB0FC3DD32108258E7DF89B:\ 41382AA24332F1F64DA504B5792CF9A3 4BAB9EC9AF710A563D2403C1D8C7BC1C2960D42AD2BC9607C4C54602C6440065\ 953820ABDDBFF011DE6C352534181A993445F10D0E4674327343CCAE30B8638C\ EFAE2DE298FDAAB3C80108313C0200FC135FEB694A9D9F5AA94EC9D57C55F4F2\ D3132594EBE89BDE032206655EC6E012C053205DB271A985323A47C10A47D0B8\ 1D4A8A788D999B7473843776B28213108AF985D87892DABBFE8FDB03BFE07408\ 590AA982C34143906F246E05BA4CEA0EDA6024C915A95509922ACA4A2945F76A\ 11F70E230642E35F9BB49C226097D57002847A3F88A6B463F953E425548BB892\ CA61CF9AD6AF:\ 0F8694CC1A6DB1B892333A5333A91E7A40F2B87D06BAC91078CAF1BEA410BDEC\ A010E8A118D11E53173FDA34E9C5F1E0855165269E464C463CC892467351A08F\ 06E8217453B53D51842B9F0C4667CEB2333BC336D9F0BAEE6A84FD1155212B76\ C2EA6CD05827344835006F4AA9D8DC87456D540E940FEFF82CEF51209002BDE8\ 882CD3B2F0484A752E168007D02590A4E6C164FB8B05FEF0678274C55D366F1B\ DE2FD0CA580E54E94BF04583D34D6B89AC5DE76F154F8EE6E6B34834FCBD5DB3\ CAB225B0C0B605A5B1AB4BAB1D0613BC4A97817E23A3904D6CAED8A989BBD428\ AEB38A7F959F:\ 7301292EDF094D0184E0092C0DF8199CC56D2BC9A5D37B4CE0306A65E45CFBFD\ 50459A8733904BAAB33C5EF7E4F98B25E622EBC910C8C5BB1BF07EFF34CAB953:\ F22D0385190A5C34E8782D80608C5B16 8A037025C10481ED49DF4F3E54384264DC5B5976B82FB43445C7617D803B9650\ C492E555C7F5076E800A770874056C8BAF1B7B0ED780519A9A967AFFB71620EB\ 8636CF3CBD30E78E0FF356D98F6863CBD32F2910DD330E9CE70C6627E8C40269\ E06F4BFB076570F2CF4B86F610F3CBBEEE6969237312B642F63723CAF57A8494\ 206E69D694A0D7D769C01BB9C5E1FD059AC750CFA4FF6EAF19051F60D7468000\ 855D7D69A8C4856D08DDB8A8AB4114956B0B241342726CFBFC0EB3A6D5A5C5B4\ B26F5CC3D13932F8DD1A02DB330D1332FEAB6E745C1534193074E6C4A7995166\ B2F303D3885B4F:\ F770E5B5F3EE03CDD037E8611D89E5D291B1CB6EF23825A8299080116B2D0917\ 17BCF14820C9675C2300F9AD771A73A3748F69513456AC5AC15EE5B93EB23760\ EFB1F734C61E886803E1A660D76BB2BAEA61D584E95D5595F3A0883BB5A73116\ A072755616B82DFEB10B59FED3407776E8C12808521BC0AB98C795E50362AA1D\ 855E8CD7219613D31B9F9265C85A710ABC637EAD6D66B1B52C12058E10D4E9CE\ 887DA905C29E32EB6741863831AA6AEB2427AF7C8F7874F6416399A2447830EC\ A01EA17C3B366C2E248241CF1628C1CCFFAE6C4169422703DDD5722EEF9AE3DB\ FF3877BC2090CC:\ 570D4755AE5F33B093E98B02A1ED2CB5C01C14CD46AF4DF9257B0CE0C54EADC9\ 42C4E322B599B1449367AB197BD93FCB3DBE34BEA9D035A3145F5D0A45A57727:\ 36FE992E078CCA07611F66B9DCA23797 469132F5B6B71F13C221FE947170F189A350B49375E6EB98C2170AB7E2D819A4\ 515EFF75C392587D65B8C4CB0107800D2523DDB2C71D25F19AF1F0E1E65E9167\ 127F2BA673710A58FF61C1E24A3A1791FABDEEBDF4739728DF7A22E99FA269C2\ BC33BF9D4909D6A4915CFE7A78EB9305C224533497FDE3629F8E6981BC83F716\ 69EC7A428C3EAEF98C304A55942132FF8704C325709F11A697DCD13F6328C117\ 039137BC427CA55B683E0512D8FA68F6F2D67E9388BD21FE0D4D2F6FFE648729\ BF53C691696939CEB5BAAF14CFD9B34AE4921A4B713E6B796E3931C5C012FF6A\ 4462A261B2EB8F07:\ F9E4CFE38CF201D9C260D1D85DE8EE3FB5E3B0CADB4D3EC290179B6D439D4EE4\ 898554DCC587A47F71F64C5E5306510CEABAA4F961A2B99FB3E63326FBB32F8C\ E994953CF987A5736FA4EE0678A37EED814BC52B0ADA7A3C46F6BF2CCEB9DFC3\ 21296231DFBFB40C13193DC6C8E5163F7D97DA82FBA11C797F55740BD8DDBA90\ BB097F36419B1B7E4B14809516FEB4844EB0E480573B06FB2FE62BD42ED7FD47\ 6C213287FB9BC9B336DB0B12D311E5F5222CD679D28186D8699D90007AF10A6C\ 518B0A23B4789AE2ED749E497D2EE4D7DAFFC8B904E92BAE48D9C0B54F2B1D63\ 847A8B2ACF014943:\ C8E0B88E2FC9A9532DE10BA31455D76B7B25C46DED6A40CF45873DB3BCE50C39\ F49096D4D418D513F7EA39E92000C76F95390C3C3B9AD04BA586BDB94C8D2A09:\ 502A91AC103E0D8C10DE5BFF3384B1D3 42895EFFA6DEB661509A8DB802CFBD51C13D7BA2E221A0087898B5E15AE55CEF\ B592DC1B7E93EE8261FB20838B441C32F742AAD275FCF505DBBECE400B8E08B9\ 66A3D00BB110FEB9A4461514DCD020D2FD756AAFD5148531EA3451720CC91C1D\ 7E7938BA86127DD98F0A851B382311901466C83C6D278153A514EE3C6C6D9C9F\ 2E7AA0DAEBDEFBBEB247DBBE33D81DA0F845354B220C5D9059355BC5816B2715\ 02B884C10EAC8A8A275AFF3DD63FC90CC1E44590D686ED15DA610E1A93D8DE02\ 685574CC0F8CF42E0EB64485A366560D54DF4FC15AE5C5954EEC5B62B5C2B5AA\ 349F314C90A30D76CD:\ 741DC67C088D533B1FE360D3D501BA00BADFD2B6C256BB89E929F53226B7A559\ 7212FFFA5727F4FE77A273CC06CD4544E3AE994782186D8CF2977CBCB63F61CB\ B5AFA9AE3E05907FE50E6C4BE1B4AB9213173A8DBA6FC6F4DC179E2123D85925\ D9EFB4D4C23FA78D3D4A585FAF55C595F6DD37E83C5D5503A476FC3579AA1F66\ 49650A80D2AA2A5D35AC62C991DC06636F70677F8C566EF7126E793BEC976270\ B68E510A2BC68F22AE6DF35FF56FDB6A15171F70E717C9F0F05F7CB953D01677\ E0E1130518907AA573E531E25830D4E3E012BE7171B3098F3BC685AA89FBFCE0\ ADBA90BDD7E7EB3AC6:\ 797361743DA7E544A17ED94CB6034496CAC8DB82690B3E3C6AD767FD5C21BA9F\ 067EA13C551A728C7B56A9F4E2D194EB7FF441C3BF1F536DCBED2B643A158BD8:\ EECBD553AA8020CE0471796A24FF10FF DDFC4B8C96DA21137E0B405335428A17DD4B22634EC67F0DBD110895B06460CF\ FC9BD8700A90C2E08873DBB3329A289CD9A0F05E904E310DD3DACA9D88C9F3AA\ 20931BEE38A57C9851F44F2D863617F6CCBBB246E97BD17BD6C80547F5B48D81\ EF33D7BB142706A525C8A346AE48057EB8D4E44B6490D8F6F0ACA5C3C3B2254C\ 8272EC4773BF32F15DD69D00F51DDB4FBC399A292442EBBA4CADEAFB1EE3924E\ FCF23066FFD8A43426FE1F38D892087FEAEF19A6EF0F2269DAD3C5DFACB37058\ 45501DF86B9B282595A50EC02CECE2E3359C7ADA5DA0058E11DFB01770E75505\ FD8544E6AC809CF314A4:\ B743430805C875DD05E8F1359759856C74653C8E026C08E772710CCE2B9D4F8E\ 560176F3340C3925D6CAF716BB96E4E90A1E25359B6B949968CC195828ACB268\ FE01F584831DE33F355B6799D93800794380A9F0CB2803E77D89231756D1C1CF\ 7104B555F657DD2EE6E75A49D1D1E9B2009D3175D16B350215F1DB9ACAA658A9\ C30629AF5DB460778CE1AF0B71E53FE1B1E34927CB96F22E4D8896D8663BAC98\ 993701CD6D441C4F810E90359D987EECB0ACB139E493BFE127CF9554CFBA9ADD\ 76A286F1AE431F2873ED59D5229C23CDA1676B08A30B0F3CAE14D5092476EC5D\ 729E4C1C04BE9C80BECA:\ 64FFBF63CE4528DD431EF5FE89431A1BA9EE3AF072F3860D392BA06800D8D1C2\ EC523EE97A4805BF4CA1ECA8256226010C1D45B07115E2EC83C08D20F45FF7A7:\ 23B5FE790A89FF2C94135AEF589507C4 B9D13732E5789081E76FBDC151B9B5687E14084E85967EF1F466A96D180E99A0\ EBFAD0BD62D3C0A9D95A7C091A6566E6EE16F431A745A280A57AAF96E825AEFE\ 43C910F03426D11B158FC0A564DF953F43C22A41B57FAE2441FF0081FBA6332B\ 46907029C05CC4B0B3808E62A928896B529CA834C95C82F961E5D5FC9EC2963E\ 8F05DB56ED106A83D69BE024BE2C3BBBE7277EF1DB65AE723111808A26EFCFA7\ A2163AA7F3BEA56432CFCB128E33F52D0D9E74418D4125A207ADDA7095B432EE\ AC6800FAE65CCE8F15BC1855B6AB339B936966228B9902463E2E4AE662EE0F2E\ D461FD378C74D44FBA12ED:\ 276339F12D23B2F085F0CE29A03D40428E7D73616D987A535DF9F4CCAD37002C\ 801DA88FED3EF6F83BA6C831C81B5F1992D5373CDBC1272B0031499E02AEEE1E\ FFD30D49BD13113FDEF45C8D25BCC488E3CEF5AD16B31C941D5CF8254BDEDD65\ FA1FA999D361B1A70E828AA1457D1CD729613D2550260062AA0AC7DC8FD34F69\ AAB065C58CC4A49973CBED22198C4F71AB3C912CEAB4F8675E6C52C55C520410\ 117B224F2C42A14A538816FE28EF1ADD9147698537FC61E8CF64540F88EC70B5\ 36477748E45D80B18E46155D2B6316444BF8719FEE78B6E00571BC3934204D07\ 09FF3F78421D5764983046:\ DAF3B35002E91851700EE5AE30651FEE9D503A68E25DA1B0F995C85682BC0601\ D7B214EAADFFB9019D85B5583D6F6D70B0B67DB9E667C950918459D91083621D:\ FB5951B7CA80C7173B5848E840EB3597 47F0B01DD8D9F113B1111F687777FE1B8475BAB8D5D9F97986043467D4A1251C\ 674AA433A2FCECD248D2BFABD29649C49A596DE37934F3A22B621AB326E24772\ B71FFFCF0B55BB2F11A95E398DB872DA7E7F97E3A78FDB03C9C295DD445038A0\ 3158ECB9A31DF7A5BCD44BDD1E412EA66AD320D7F8F80620A2215560237347A6\ 398493DDF42E71D97142571C5DF579B4925B982CEA4F71D0E36CD2449F4F52D5\ 278810549371D6253BDDF9FFA02BF89D1FB1F506CC2FB5F827876EFD4F1F8A78\ 17BD27BE8ED9C8FAA11FC9C647364CCA55847EF4BC8EEC950CEFD79070098AAA\ ECD38993648621CF310AB2B6:\ AB274153C3B88DB46CE7316E630897AB41FD99DD7B50BCE37A33C12398981796\ 44AC08A45865466E18D327F422F60BD0EC41B22422A06067611C349553120D74\ 63DB99AAFDB557DAF453477BB076FD0E0B9ECC54531734CA0BA750787DF9F37E\ 65A0657F531D86A2CABB597CF4AE6D0E3E8404D1DEC2FCAC1949DC572F1D51B7\ B163C15C144D3E8A9A6241A7472C8D38FC9885D8F65DFBE5CB5D9D8411D48D93\ 261F94FCA257B6487E4F213537D7B227D9AF905FE7ED8090F26C77EAF5308FCC\ EB5692FE383B5B3FC88A836165FA7D83E64A4B8D7983C267E1C21F8B845915AB\ 65C72A9ED5266C3462F870A0:\ 03F74F149E521E4C126B57261077D5802C574EAB94E75BDF4C0AF7D463D60A96\ 1EC8D5047E36AC203B4793E42D7231E38AF206128C483F849ADC9EF65A6DBED9:\ 9B65716CAE6C38FF4144C8729632C844 7442A74EE7A4E47CBFA5586C9755D50F344E7C03EB8414D121CA04DA644E44F9\ 276434A0034EDFBF2EA2AD5B227BA9D7CFDFF906517862BE6092FE320C59DAD5\ EBA21692526563613DB4E70BF67A6E60B748EA1274D23C51E38D87CEBBE8628C\ 57600FA8D40FF7257F48A9D986E1E85F0D22E4035369AF1372A289204228C872\ 272FDDC1488B46AA440169FEA9B2532D1BC73732FC9B316589019265777AC9F8\ 7A773429861A0DD26042ED4C35645F7E2DB0D5D21D4F11FC485F330FA3545C47\ 1816F00B701BB055142EC630F35C9CE6E4FA45A34E7A782096ED31EDC1AC4150\ 7B5D16603146EB013324CB3ED4:\ 58E5AB04DC73919838D2E393ADB3BF0B854D2DFD1014B92F6E1F2457A7D3555D\ 919B9969ADB8A0F5BB4186633496C98C8672F79141F7364DF81DBD306EE0C457\ BD8663318AD8020A8B77AC78F04AE830F255B44AF18A2BF81C393EB6E4742C6E\ 082586DD597EA811816D91259388718CE445F772BED05461338463521AC0C04E\ 2C2659B3C2E5B119318497EFA7A5B0F08350544C219ABF10EB7950633F48906A\ 7BDB5249CC19C13445DED003964DD425EB2C804DA0D5E4033BF94618FE97EBE9\ DF437DE869F15E10B539E3A78EF8B05DECED51108D30147ED6D3CB592D7D2129\ 75B3F2EC7A75F110EE24B43219:\ 8C0409111B900DA2EA59092A1DA364F06AD0B5700353A5374E9AE381559077D4\ 1C8F5B1AECDEE1C07F4E11BFD4B20B84EF2C6FA3D64ABBF7B93BA039BC5EE7A2:\ 86CB12ECB42257430C2D79EB86C9D6CB 18C68DF21BAB33BAE508515B99925FB785049F8F988EFB2DDC9BC44AFD79820E\ 654182B99571C19639FDCE6723F0151A1B35477CE64CDF2E88F73F361D111E0D\ 3428B04DE2D789F3154E357AA8F8ABC0D4EF7690A3F2F646F8E1CE7F8D9E5057\ 4241A8E41A75BFABBAA2D2037B893E51EFD9477B53D022ADAA64D382F8ED5959\ ABAE95B912E04F035D795FB607DD9BBA4A9873C538E25C5DAC4BDCEFE0D63167\ 4AB2C6BD2F6AC8A2E4FDB892920490288E35B10894B33E75896FD84531E67BD8\ 2866B19051F59D964C001CAC6764D39460C8216394765A580A6410CC66A4A3E8\ C4CB318AEF0F5FB4C6BD52D24D34:\ BB211A3B1BAD325FC33B561EBE986D5E03A8F319B0114D3487A2F4B29735F4B5\ 2B9D1E83339B7169214F69E8BAED01FF0FE09AC0F04F222FAC7A99448F11B09F\ 42DB02E77D130C2EC0B1B146C8C3B9A27E8A03604267DF5FE8DF5F4F8EAB15B9\ D2B4E7A02C157AC6FC18C4E2F82A630A9064418B9ADCDF4B0F98CA43435474A8\ ABB0DF2E43AECEF571E4C382427BC2AC0BAC6567473CBC7220E7BF682050F17D\ D67A0DF33DCC9079A6664ABC029B1308D6F969F88326748BEC0300AECF5EDBCE\ 8D2B9BC79791777F45BD2BBB5525CEEB3884914125ADA4CC0866E02C47E34089\ 6946EAED0D8917729A20B0BC5277:\ E9085EE53951FAF5F0DEB5489066FD4C29D342764626075A25D1A6DCAE8FE201\ BE2EDBCAE08B8D7D853827BBBBFA03B642D857324A5835151620B78FDD4A1D44:\ 14BE182E38A344D85D49FF2D8CE3E7AA 15918520F3A5A8E78F554362E65BDED51966E000029685D8F5A61D184AC17B2E\ BBF5BE9566CF5C46E2CC23623E7F1DC20744113761D01BDFDFFDB74C1DCCDE9F\ 2052A5516C848700DDE677667E52B03D89E8F147C698739664D52E9DFF2769F1\ EEB37F9D9DD3418DB21E402806CF7F6EDAF35581284C42AC5501DA4FC2EB5F32\ 66693A26A383D5DFA66B291B8AE384AC922BEC973CD345EDAF41045A51FC4E36\ A37DFF55D32A19978C239F43DAD3D8FEF4F98523C2E2FF28FEFE794C64D19991\ 30951EC74D1A0CDA56DF82FF158115B62B7BB062DCA0DB913C78BD33B44EF70B\ 758FE3EFA4E02F6AD1708C4F0B493D:\ 2D49D411F9237303B89D304B03E4CAA535C9299842363C82549EDDBA752B27BA\ 08CE73B7F30FFA78275255F6AD35973A0FCE8FE8D060586E90EF6AE64B19D871\ 77F911E43079B8232DDAEDBC7A77E294E2CD59E48BBF02DE77C76E8BD2D3F9F5\ 1E7F59044745A69243ADA6DE557F35F42E8D46C44ABDBB9AE3EF013BE854503E\ C71BB6853EC11337D4E95764F5A83BAB2DEBCB16CBABE628525F195CC2EB4DBF\ 349CE9FDA73D001502FA872B6ED26A56738BBE0B1B23C9A847DA28905DEB2D82\ 02C3903DBD2E7DA694D1B999BBF7444AFF2575BFE84B671D576DF097D53E634F\ D5DA9C1363641699FA678A5E2B9198:\ 50DA9EA5BC2A67B5F1F0DB776A3084A32F5F1F3318A330F1BC06577D9E50CAD5\ 3CC82002869D98056E38DF10F0BF30C33FC601AF527D6E5683C029D4F30A726E:\ 67131CB3F2D744E0C68BF4B872C2C5FE BC06C51D1422F4917B4E1AEDAB1682A4DE41A0AE0E29E916FF9966E05A3FDBA6\ 7AECD7E1E870633EED5E06CC223D3E8DE1DBD2ED672B2650F759A4D56552B1DD\ C876309E35A74087B4ED8846EC811554F73BD30050ECC65DFAB8DC83F4FBC03B\ 2E08BC0F94E675E5BD79F5EEF270BABFD0E01F27BF24B29CE83FC211236EF9AA\ 541EBE0A2BC8565B6A70FD68B07E42F5151695A7E5C70E595F007E5EBD112045\ D7879B8CA50FDA5C4EC9069E4B08967B7046204C62686D311F913A9CEBF3936C\ A5AF98D7DF0FBE58237331A0F0D06204E9548A26F14603A23F9E8AE8B21D07E4\ EC3FF0A6B31360954E10F115E1B9536B:\ 80E53B32929FA660B171E187CF208337620D14550A0EDCC3C4DC96F93C3A4E76\ A27F3924E334B841610B486CA5FBADAD2BD6A663910C26017232805707748736\ 3647E5E977DD32E953C4B1A34B0B43A5E9CFCB974FC06DF890937FEF591D3506\ 68D6BE6477694C00C7B3D9C15FC6FFA058485EE3FEC5716FC8230665D8F71DC4\ 84E1D83D848BF6F0F020A1EA00E060254C6A7CA1DB49F101BB88786DA40878B5\ AA758D63692FB65363DB11ED7DC63BDA3DBE18A509E567ED9D200386B5B878FE\ C9571F39082A8DD7BBD48A936989ED4A95873A77EA4D24778FE0A5B5787F5B0B\ 2BB12629CE5AB14825E137DA01164BA3:\ 0C6CE2F496B1158EC119B0A0E9AB74B3F489B4CCBC9C895CD7E19850884F73DD\ 5B05727C9C0AF2078D8C578CE24E2F48DF4D3ABE6D238A473122F3831C4F0787:\ FAE09A5BCB263B8ECC375BA60645D86E 685E288E1C3800E1AD2B7438F78467430EDF29B1186D07655A44CF36D2D73E8E\ CE227967117F581374AE4DA744557CB39CD85021E5C59173C0D89750E71B8FD5\ FBD7617BFC427F854877AF7FE3CB7B0A3F637FA95C703956E8102C1FC3B054E8\ BB58F4E8F483DD8CC178B1FDF398784C8716421799FAE814AD68588E5A68E2AA\ 907F4B27638AC73E76BFE65683DCD7FB84C41828D5F18E4CCC224AB00E72DD20\ 65DCFA293C79B4870350D91C2975698D88B33FEA46DFE08557F244C58B715900\ E75B4B0CBB1976621596BCCD0FA241CC0C3B6E452690772A950DF5785F8D6478\ 3F3610B67ABAF7E6675A5A0505C982571D:\ BF5B135026F3E73E6EEBBD22A1210E2A863C78E11C0BB11EE8A242E6C55F01F2\ 9B9DF915437DFCD72EC253A1D96AE713CF822D2C08F84BE16BF491E09353C3BA\ 8C41A4ABACB70A24F08EF17BB0BAE9BE6320E73F6CF2DFD758E7CC40109C3609\ 2AB5E93D3DEB6C03DF1C028ED44345E4852F8CF738FE41C98491C38605E40F89\ 15C14772A524042B02EA3C3A57C46BD91F8B7D2D6DCDF48E2DC23EF061043766\ 6CE3981D6D59126840369A11EF6E3304FADB64BDDD3BF5F8C183D6258DE174CD\ 2825BC84F7F469EAE12B622798585CCC639956B49594B3A6EAE92E1416AFBBD7\ 0BA2CF9C49AFBA035E28AD657613B053CE:\ A9099ECA8DED735C5973D029F3EB1B7880AFB01E361DC27270F191FD24714C42\ D5D2D5F03DCB344A43537077B1BB4D346699B61C381D177A76C9D316E3E93770:\ AAD82154B7370B6A67D899B24CE21E3B 1B7246ADBCF13C1D27708145F1269E684056DE1CF6D698C06E83DF2BFF3A1859\ BE293228075844FDE9A1233EA6A9CB8AB2CC7893789B12A434E604E8EDED6A99\ 114BA6257CA34AB9CD2CA7D42147742DB2EDCE2845EF20AF596E6A6F115C486B\ B9E1BD780693578162D210DF7569E10E280CE840FD47692CD1855EF58BEBAC8B\ 5EEEDE0AC581FF8ED8877640F60F73D79CD6D445106D76FEEF0FFC8144290981\ 8E2088440D1A5BC3457BCAC137EDC41DC03C73D2B0418E978C3268844FD1C8CF\ 6CF36F0DBA80319E2D452E1A0CEF619F11C08F2BDD5B79D52E30221AC2950737\ 882A2CD51581BF34D5FFE24E73D5BAE41985:\ FA99A6CE219F8CE34E24B1E6949ECF6147984969CF0E6D1FEDDA7ED74775E055\ 85FA5711F97655FF7D3038381C7BE52C2F177CEE0C50D0F841DAC31C0A88FD65\ A424D01167CEBD9F5ED533764080F922BEF0B90571AB5A79FE6E3549C26BE626\ AED82E5CC2EEF781A2F2B8099413333454B490667D894C488FD9E27480F08259\ 0D3888F38E841F80BCE4900A2996B5382D1990331DD45B3632DEF6159F19CE46\ 904E1558B460FC17D8FC8C9E159AC634C8BB9300CD703879DDF2D6FD9622F1B6\ 6B1CB6D51A73B54B198CA34C73C5498685E629DE82DC3FC7A4C033C3566C044B\ FD0CA8915C6C5C21726A38B60F28FE9AB511:\ 27ED87FF83D60062DA7B17EBEEA283896EDBE4C1C7A0955D36F49F361D696924\ EA08584069AEBD0B2B90635D681D28E98027E1E742A96E2FCF8DDD84C0452757:\ EBC60C3A26939CFC266533839EEC054F 1EDFE0BDA25C2D9CB00ED63AF3C30E3BF7A7AFF9169B749802C97CCAEAC6B87C\ C74646316A0F7F52BFC1B7AD674CC1CF2080A3EB780B0AF03C1AA27E5504F8B6\ FB80D1ABBF46A40DFF5624BCD9D4267D53E3AAE275B961050F3D9F11DACA2708\ 2D258A52C8AB0DA603FCFE849D6625C4B75FC7AD37B513ADDB455DB40855AF37\ D2C74A91CFB829935635CC1C41584984D394CAECB1260BF3CD44AF2113247EC7\ F02D0DD9B6C7E70F4A70FDCB01559BF2CB71AAEE299327FF2753B72F354F6789\ EEE630832022F8F69E0609C4C9C11874291F3ED2CEFF3EC6157B26C87E074ECA\ 17DEC907FCC47CB52CA51E7D886C720BECA9C2:\ BA20D7C5B159868A2FA2559882EA88C82B1E3048E7F65A5EFE89B8FE11AC800F\ 3B046017826A5C6319FCE57B4E26D3642DF11270D0FD1D4455C441223D0008E3\ BD8E3B78DBFD0E25B40BC62AADE9C9D83847E3865E650AB32C9933538199376A\ CFBF9418874E71BFAB5A366F32567A77C9B6492DB3AAA1D0917556A2D4FF3E89\ 7552FA06522C539C6BD229CDFE109EC6A5BCC0D33C282464C3F3B4707C2847E8\ 501FC54DF0F99B8DAE8198798443228C51A97BB12C7BBDB5BEBC813EBBB28FA3\ C1737B005E68ADE766F39EE72A8463AD9648DBDAF8341066F72C5BA7BA09AEAC\ 6B3CA46A5D80EC88D13D8FF63AB506331F4EDA:\ EE566E33DA207FA5086607A1ECC2815A1AF4B05C4C96882727570A23A214517E\ 2E93C9FDC1FE860C67D823D29377F1BB45666323725D7A0D219F65EDA6B2DB16:\ A7A1C1833033E0A92BCC961B291BC155 ED183973DAFCDBCDC28769895A208FCDF1D336FCD0AD6B2B038014AE2474957A\ FBB14C7D96F95471C26A1D74E4A5471B811306DD9A11BA482CD9B62AE5798E62\ 1D5DF916F7EEDAC0B85604C59B3CB2E0683E0AEC5560CB9D66EB28B7404F9BDD\ 45735EEAAFB404AE56EAF78A824436384508DC4D8C075A73B5EC71B93A6684DC\ 906649557311303CB53F82E5AB97A5003587A375D75FCE337FF1ECABADF76C5A\ B3B49E8F9CCD5F4BBB1E3136E5950DA150AD0D273025A163BE79AAFC2B706FF3\ 44E7AC07EAD93A18D1C1C6D732930E89D2EB50C55474F24AB2598EB6C54A8DC9\ 66ED61956BD8DC48F26F0317F9C2E0CBBF1E9EBF:\ 12A5E2CF12E3BD0E5EC9A319DD0592BE0CFC95A8EB313B800211A9F7529926ED\ 1EC026A8042B73245D02C3D3A527EF8F8672E62D30CCED471D5A20D02DB17658\ A5A69A2EEC8E57AF1C2FD24F0830E634CB099F9F84E7821DFF344EA63A0C27D6\ 6D0E3ABA633D9C6698323B3A79D7F292A703F55D7F35DBEEE65A683FE28F9892\ 56112F889B80B2D8865060F7765A77A421C942D12F26E43C1FCDB67D26A4614C\ A418129B3A571425944BB5320E0E8959A12AD661D63C00D7E7040DD077592A25\ 7FB4E799119567651E98EFEAE102B5440034C8F118F9D8A90315233EDE3ABE4D\ 50A76588DA3DCC84685269074635D5EC8463F63E:\ D034A16BEF7526B8E15C0F74E5A5C615249F6462D609813DC10B964BEAC2D86F\ AE8051446AEAB7332408967D4C0E11386EE1F3E580769C5D2E71D347FA5E1679:\ CE090BBF1BADEDB45D510FE89AB34F1B 511BBFEAA78DC9D2A7DF2470C103ED2E8D6CC2EB85C3C3529BF9F57D911280B8\ 62E29B083C7F737A05DC064B2A267D787F726F972E97431E23B568AF59A55562\ 5A8C592482EA12D0C07CEE98C96300978C035059444F9DD5200C2E43E3A3BA3B\ B33AB03C1F36DDA5F254D8565BE0553F634CB0667DBBC3C7C1B3300321674B2C\ CA87A1FA8945DAC6522F2E69FA30EAEA17F662A6F7CF421860ECC27506500E71\ 70F02C608BF55447E190D723CCE5DEC0166AA9DCAF48FB1AE4160AFC59603F54\ DDDC9162B3FEF8EB6396F5321F0A27DE21CB0A65280EC883A9AD6C67C69C1E79\ 03C93F5258EEA047E277D67C9A139553140D20C748:\ ED2702B34AF0FD94FAE86A0B1875EF1ED95F8199D4CAC8EB33010A7A7A36FEAC\ 1FC3F8BE873BCBE994196155061C40C9C6D649C2E0FDC68CE3285AD3FA058FD2\ 0E3753F98C1EE8F614D5031899AC813C982D6D2D26B72A829EF167A95433982F\ 692B4AE0605679E8212E06A638C24DFCC195F59F183A92A8DE46B730797E76F4\ 49937BEEFF19B323B72D352BF35D1123A2A74E5E7FC96FB8CB4C24D075203DC8\ D416D7DB2B6B03D50AD35B6B2934D8161B1ADF0D16727BBB28D0B4C155ACCC7F\ 1EB855F2EAD86D6BC36A7588C4B05974B64F1F966E24AAC4AA64FCA82AE3ABB0\ 302F6FDEE7C2BD61F5998681454DAF3840173D31F6:\ F8285A16BE35B63170F08921D8D28871C0ADE8C8CA3E780B6D2B9AA1AD6BE150\ DD6E1C2D53A332E95D8FD2220D48684A677DC6CDC67284920D70423F4111705E:\ 3053654EC34DF7C87CAA98343F7CD89E 2EDC8DA326BC92528CC18EE0F47CA74B33E7FEB8C5B5C4F715E1A792333E3953\ F7A391DE6B8F720E6F96BC4FE883CCDC06AD791BF7A9B6702109CF9742628324\ 2FE0F32483E4DE8921537DD4C9C9470BC2FFAEBF71BB22E82CAF4930A2C43CEF\ DFAB86A61096288345E603DEAEC5B8C2C2333BD07A95AA178BEACBEA4C9555A9\ B47C3D2EE262EB2CDCD3EA5B36EC05755BFF04FFD12A5D79F062804B3055AC01\ 64656C9EFAF365027A9F0DDD0C10DFEED5987CCEA29986C89841FAB33D21DA67\ E90E4991DF49B4A0187566D00922CEEF32CA2CD74CFDB8853DDEA3A0BCA30E26\ 86790E7AA6FC394CD9ED35BA10AAA6E3F37F6227AE92:\ A4671B37B1D49987D5E6E1B0CC5781998B98BD9B0AFED9F71325A5F1DCE0EB48\ B3AE2553842F7242DDDA6CE31E1050B97674755B245BBBBD4EA7467F36210147\ B03EEF7E56CA7A64F9E61A5A24A468E90DB7F9B8A9711C51ACAAEF426D65A629\ 572226E634A2B683816FBD4365A7F1F34FC60020C60C8159CEF2B809814D3AF2\ 5F9A5448A478874E2433AE083B3FDAD289F15CDDD9D5844D646E399453DB9F9F\ 26EC787C42FF40D6191507E898D653D9225F15DC57EF30E589EE1B7B659EDAE6\ 7901FE0E23409B6491BEF6561A95474BD8D1B4F35C7D41DAD0A179A4798FC88E\ 2FFFAF221AD14779B0C23A99649AF19A35E9CF8648FA:\ F53EA988F600C6CFCBB1D1A539FD2C4911B23E81B29D373CA23E63225FB7C33B\ 4947BABD0364EB7BFD460AB650317138082061AC82D7DC885F73FF1C1E6F51D9:\ 9731779293718D0E6635ACCD01B2E121 E348AFD877272E75AB4533E46A74D713423352E338E85F62FAFACB61CC353CA5\ 13702C0D42E5ABF5CF2B46C49E8128A153B47EC49BE7E5E349670ED0B760F774\ 6B5933A1E878D301F566FDA4E9F9F00151A71B3580D204EE40B2533831ED188E\ 4880E10EAC7420A74E2431EF778229B836CEB34642FCB05D2BA3345617CD7F90\ 8F35E4AC0073ABA016C49BA3C28AB470C846531E63FA83B034D73BC0EF73FCE3\ 2210F28012D92AFF26218D7FB79B59462EEDE2B1296D27C6EC6E40B2CB3F655F\ B79D3284DA532D806395BA6940EEAE0503BE49856E9DBA2C8214046ADC604588\ 4AC8B0819C1999B30D6473520FE2B31B8682E6C17AE1F7:\ 5710629E5F9BD71516DE966C84983BFE939D39CE82DF4F80E7A9D48C77BECA8A\ DBCBB1283FBD7BC863A2B174C67CC6D0192AA84636946898AC68119F39C3BF5E\ EDA15A7AA935A4D592537A8518C36435D9E2149FBEE571ED80AD5E101BE4F9A3\ 7912D770F29F5D3DD83A1534D29108C0E142D7F3DC96B4AC8FF5E68219E0DA23\ 3C657C14F9FCC20445D152583286B11227118E82F3CE55AADEBFD5CC94628047\ 8921B981F37114BDA9FB1A9C3896C99F62FB59BA975D267BC7676038FCE21C32\ 4BEB6E31327AB5756AB57DFAD3FF1F696E5A9DB0325A6A6F30EB37BB260F67F0\ A3C534B3D0170776F9A6DD3DC027038CCCB0D4A784E469:\ C37C751FC481BDCF74BD09A3108755D55845BA1BE7ACCCF79DAEA329560939C5\ C875C4B71CFBD9576689D4C28FA786421EF49832492348575C4617E5B532F0A2:\ 94659BFA2E1E6248ABDC13F6FD6B5251 B53FF69F8A08A98C6DE54BD5CCBBA661E17B63FEC51E675B4DB9AAC74BFC9C47\ 45164325345D2904B6AC9616EF350BB60D82D7CC8A202EB2BA0946425A13575D\ E012026880C565F0B6DE087297E81783FCAA325EBB3E6354F80A89991A77F057\ AFB9B90BDB1943BCC4D577A76554E11C59A88B6BED70414AB3241E0B11E2C0F1\ 31F9DBF7B0AE4A56D4338441DE51421D3611CFA51A838E8FC6370B597782AC46\ 914974135F1468C55978DBC1B2B1C4A5D65A67FF5D08270437A9512ACE3C7D42\ BBFE205D1F48CC9CC631CE15BB6CD9F5459A1F57F4AC251F437C65D9368905D0\ 96CC634488CC8C2F33E677FB6A8D9AAB4C924475036435B0:\ EAAD8BB070AE8E2C8336E635990A8C35FD7A9E1D54C0668FF7773AA62E80E286\ 5E90F8A6E414BE73CCB868F3A843C1F3C092941666535EC6CA5C08B274BA361C\ 1A36E4B38218D0FF16CA58DAE1EEB1DB51FB4AD48CD38E1EF39B8C84F3E00A43\ B2F3333828D24F9306F13BDDF141EC83153C248AB63304E4FAE70037207D3E26\ 530ED4671DCA7DF505A1D4CDB7503CEC69BAE9FEA1CE5F7CC7505CF525C3CDEA\ 52071FE4A5110C84759C85BC1BABF52B8746A14A05C52813E5F02E21161A3AFC\ A76C294B32A136F7C2D6CAAF233E8714F0C2D5B57683278789B2B0B545D6B599\ AD0008E41D278FE9D3583165571D23A20C2849E87264D08D:\ 474361241C2D89DC2C1DA13160C53D7D9F33343D2A71F2636EF9B77D71B74641\ 36454573B66449B87047E15DDFCE2EB64E71BA381F65FECC4AFA40FD9FB596ED:\ 2A9A82BEBCA83CC800D76D78F9F21789 FBCB195863262F25E0DDB7AA269DA197C63BA5C03E3585AE31472314C9853181\ B71F1B1365AC5369C8FE70A4B59DB1AE9C8E915055EB520B9BD87A54D51BFDCC\ D1B6C7622C99B281ED8C63F6F829E87FC4F1A73C08A0BFB861A56EA3E4DE282B\ 0C57E5F8ED41BBE5E445E924485D4F8363857B917F7A93026ABE3D0EB647FCC0\ 3A938F67A4B1C6B8B0FC97EA6B8031725DB7288F3775247CFB25B4547694428F\ 580F51ED4C87DC0F1BE5DE2EE12A0260525AFF942E1159483D4A533448FF802E\ 827BE1DB7A90E65CD8D5195C920F7A2454920A203C94DF411BA6E3155FCF8456\ D5566891F4E9416886ABB0C06A97F8C0E95A464630392D3A20:\ 878D6FF85F14EF6A5051CB2BEE2BC06AC8CCCF3925AC9A7E705E14BF51D6A97F\ ACBEF5A830B9D0FC1F8FE14FE28143EDD63D5B6714BB12DEEF02798570A9E5A8\ FCFD136FCBAC9471F71A69C59D1D389EC154214C9CD15C675C6DE9A890375221\ 9167BD864F6A79E69563A7154B6C88CE9E0DC360181214375F3CFC2A0F69B426\ 2C7F58F6B292328153473C826EC358B4EE4E9D6E7D4AF77FAFEC9F431E8A7C17\ D3D0649865EFA3D55D19521851115993294A65EC89AEEA9DE8935EF65DA111B7\ 9D24F1260CCC1E2689D9BF285C05359941634AE5BEE9EB59759F4F4160F113E8\ 41F28DCEDC4151B6EEC54DD8A612226154D3B099D09FE2AED1:\ EE6AA06605EAE130FCF2D9D32790440DB49792407D524CA1B4903C2FDFFC7396\ 8070C6114B6230F28277A02871F5B0459E2018122316FDAA6E1DB4684E126EE9:\ 725B2C0B298372EA36E977709B492E24 8413D77FEB86C319EE67E59B7175F8B9F534E50AE9FBA248249D45182157C998\ AD2947E659D28877C7356ABE3F7D25025DBCE55640BF9A8594037937D659BDE7\ F9B0A36828DC528092F77BAFF3C13B9E8E46726CE907859E0080874D7F557DCE\ 19FC7B59BC7294CE86A3651515DE9DFE32F19B09CE7A8C4BC968FE6CE9207804\ 92E46FD393C7C7F6AADD1E78A956419D5DA3B12410612D381AEC74DE440FB8E3\ 76FDC7BC0215FCD25E6BC33219F12E7484618C21502AE155233BC51105627912\ 67FA6EEA9FBE426FA6F08A5961925EBEC03067B5C362E1F8C4B73C50E6092BC7\ 266093AF7E54C3A8D352063284AE60CB93F5186F55575CFC52AB:\ 64E8DD987F52BD79D93A61FCE6B96B7E656D28DEF71A4924924C69CF89F6FC13\ E51E8BAA372327483EB401436D8981CB3F9545870C12579FEDA86798E14EAC2C\ 2C2F948531444F8F30589202EF9491E883A3AA87F2BCFB68C475AC2E288CD8F2\ 0A807F35A6260A8E903ECA55368E9190091C30599CB87C2EC56E46AAFD26EF01\ C071492AC2A3FF569F8F310236C9D8BAA6FCAE0AA9AD5C0DD13821BCD973E108\ B1AA5CFB58DFC6D12016456E488B91F918BCD749F2E3A1C7BF564B5AFB2E572A\ F56EB869977F5DD83D94A6E0EED58901B89FC8AF65C131FAE33CA28E0C71B8D3\ A7F5DB23D27BB517977B7FD7BB3D4AED7FD65A9B17DD9884E561:\ 14FBDEF05D3DBA5A3D1D3B063BCABB96B86E2681FD070016C9DEC8CC4E1AA4DC\ 87B597F8F6BB3294F7E5C9F68342E29D578BD71D15423CBBA34A030AA5BF1AAC:\ 76BE7DC9A0DA36494FBBFF86344D27F3 C58CBAB2DB2DB412692422DF35E46D3D9F69EC55F0B9F94EC71AEAF6B52F15CA\ 7792F4A187DC0269EF0EB7540589B5815568344F6C06904AB625116913379202\ 672452476D5619ABB9AB059BCFF96F5575ACE2BE06F73C4A2E991C82D8862105\ 0DAC65FDA764E9B4D59CA0A3508841FF409D13EFC144E62D551DF65B5DFE84F6\ 28436999127EBADB0DE41DAC10F701B8E3D5FA9BE5551EF4A84B1D17BA4AE7FA\ D33F73C940850896B756D93672DD0D7885FDA05330E1A9855DF6A077E59CF812\ 8D7F78C6073DF8488621C55E876F6B191CD573202330356C479C3DCCC63092BE\ 5719A970EA631B7AB3FA602145CBB60A216A848A8D194B61D7B1C1:\ 81F9F66C030B757029AEBB951DEC627EC72E2BB45AB309AA8693EEEF6B4433AF\ 9E96F28374E877288C1B776A91DD50699B7FD2D8C6D7118BED79FB7A8BEAA111\ 70D1276890906B9031B6F531318D10018C7C684B4B970210FBC348B16C2F8D21\ D827FC1D587FFAC1346CAEEA8D4A63C8B1B49F0D96483ED300C5D8981DED4D40\ 55863E398B1379EB039CAAFEA87B6EC47ADB7B2D7CB07EE9D29A85B627B5685F\ 1154519EAD0295E8E17D02B15E03A5B058D679CB547B9CA5DEF8DFF3B81182C9\ CB2C9D7ACE9B9055AB63FA8B443E97D93BBF9BCE84F0C5EE197E156C6EF15132\ 27A13DCCD33BAE432503B6FBCF0F0CE74590AFEA0D2786C33E3C3D:\ 1E6968CA450400AECE693F3EB5F0F50B2D3768CF547661113369C77F9F9B84F9\ B57B659D06ECC463583F5EC1F19579C688BE206B6981508790100C15EAD608D2:\ 2C3EE199780755B8D469F2F9E6EC4564 948C211406A4634B01915C604736FB74B7FC60F1DE43B49106840A60DCEAA93D\ 8DD4468D13382C1CB2120924212045EF1FA7DBA0520EDD75A958ED16BB4AD0C4\ 4813365465DDF51139234214BD7E0BB414DEED1571B7EBDD3ED3BBC2F5CD04AA\ 92279D36235DBD1E25D9C3ACF5EA6603749FED072AFF287813F2650FA208DDFF\ FC28A240C9E138CC0E83D478ED083C7CCC6A8BEF7ED7E8E89A11AC6EBFB8CA25\ 582EE1C76F880EE2FDD2E4E231DA4967CA8D6EBA943F602565E228D98A47ACCD\ 96CF2912351DCA293AB91B53878E99716B25458BF3CADB247C28F2C4852FB655\ 578BD8A5F6D30DAE3B0445AE3FDA30C77864D6D065122EF269B306AF:\ 61D1A1F7B08FE988864ED0C2075C17067454C98456583F6E7B34755D066C8ABB\ CDE4F18219AC1CB1C4211CC8BEB7EAD789F2E8C8B0D18BF8AE19A38C82087498\ 18236C4B883D36D35D0791D13F41D67E51D19BBAB3B5B6F6886909C7743DD5FC\ 965BEA9F9F75FD8078E791897406C6F135BAABC1103C99088F700A6AAF66A665\ DB22C4D38177348108029FE78D98CC48FF90D8B274C8451619D967909910E0E7\ 88CE75D9D7EA77B1AA35A84FC6525CA4D79BB10E8E375C232785A3F7620E84CE\ 26D88547571CC936F7E8B37C85CE4D15A38DB35CB98E75BCD748A6AA64BA3879\ DA4797BC6FA239C3DE4B5C0F2FC2E2555936DD67564BE8C02C2B8697:\ DE02ECE25089A30B519D54F375BCACA7D3111FEDA897046BE15EF308146CE733\ A1D3F8A1EA1E176D0D348201C014CB3948E3735811DC6A3FD294A34DB9DA5DE7:\ B6D88A316F8968B78D46E2581C49D8CB DFA4FAD43CB5B460770F02886FE505E930B479892D32466542ED5638DAD9BD66\ 13E5555FCE95BF1DA166881ED0E024AF9EC9EA083685D5ED0AE33CA22BF40A86\ 67F4351E62DD5D47A9973E5CAE0A3B1BA967F5475F7ACCF42C8E42E2C8466A38\ C4E066E0C614FE9FD856CB9F4C23C6C8E5FBEB7AD45537F42657F1A7B703322C\ 3F087EE1D43C9ED6E9055A7B72D007C731D64A63969A3C2E256ECBAD3EE61949\ E37006A8A7872D78BEEF3D470AB6C7D643DB6A63B0F7BE3D18758C1B246F9D77\ 0637C5F111AB21DE24F0CCA2C3316749E46D98B909D0187BC167FC1C755C3834\ 7B78C578F7475CE0A61EA0C0553E24253D87A10A768340F1E3474ADE2E:\ A474D5A4F18E39C264827D3B2B44BCA5243D0C2B117DDCFACE4078D4AA136BBA\ 27244D6AD637FA1AAEABA4573BAD396DF3435649DA2BC081C9B7078C670CC47F\ E9EFEE55D1CE351A9379A1A697ADB104954BBB786674EF3D942DA1870D49267D\ FA93DBA094F72AD0B0085975BF38F401CDC0D99A44A3446EF55469EDD775CE60\ 8A07A3F2ABBF5CB963CBD3670B1EF93DCFBD54F19E7CCE3F837E65DC392D0127\ 4963828402DE7AB025B608C88153FFD193EC82D6DD82F9E738776A9B924591AE\ 9F563DA04E1CD64AB5E1ECEFED6DACCC68FF5CAFECB3876E026177E9FCD17CBA\ 3E692FBC2398E3D0859F72B7DD82322850C210DEFAE04D8E5A9CA25C88:\ 4CC31C503C936554D6B74A9511C4D5F1032F188597485A4BE78050D61BA49C4A\ C2D9EC921487EA6D58EE66DEC9630623C0D781DB7990321A57DC455D31212653:\ 4565AE21BF25216372E57BE96B5428EB 67D65B8A546886856699B229E6A955165A8546246DFB73B33634CC0D2152E85D\ 4453F00700A5534B3D1CBDD023DAF6572500300C8C7F1FB74521E2AEB12FEA74\ DD9B5B559E7C731F0E46D4B13EA67350D01866F4F18DF37A5894925F5478E6A0\ BE6C9F9F0277B365F309A45FE1B8B6250F43795152593DA988F3B3C00A49C676\ CDEB84BD888B9DBE97A869D43BF1184DD6C7A1C7BD648752B8D623B043351A89\ BF3F57D9784D9C78AD21E163EA8FE1D80FD3C8E7BDA24CE74F0AA1D162179874\ 268BEC2ED4B68711124E551733112929F1F2F416477CE2D3C3C2BFA071F9260B\ 6055273705196DE4063644D6987CA8408B222F60C0531033311598669BFD:\ 38508F9831BBC8F15D073F06F236686BE9076E236348662A38E7F5217976CA70\ F2C16ACE77324490C00AA10C509E1C76E6C4B7A8FBFC2A9B67740F02B2D3DAD3\ 8B0556B12A15C5754F1B8243251A0177FE876DCE216D1250300C60F55410B302\ 2518440CBCF2DB81D947CB6D437094976A488CB659DEBC9BD40E508218250E9C\ FDCF0015AD0EC3F5AA4E5828F87DB89E5A885214392ECE970035BBD263873DB1\ CFD8B605C08EBCD1B7919B575B97657CF7914449EABB0DFD7F4018187C7A4BE1\ 30B638AE3DEF36384EA7E5AED4C02A72D038F8C92A9CD33E48587F6AA91ED84A\ F2E234FAED0348FC27322D61E50791744226D536B7B4D4428AE188EDEAF4:\ B36663375BFC993091B4E74A2BF2152695D8100AC0F9BB087F9575F04C34F1E6\ E81E2F51A33F0C327403E81605391295FFB4AAE9E10D85B96D71F0EB3E888CD4:\ ED53B4437B72771F35DBD4B0A6DCB510 76CBA3C36788D56286637AF36F40B8CD62DD6AE1E98035C6890C793CC9BD7B16\ 29BCE020FB1D7B9DA888C66740153AF23CAE3A1C67C12BAEFE5EB2E50658C11B\ 481B7570AD2E6171721465B8044BAFF4917A727E5270EDDE52F9EFD73BE6545F\ 3D1150F408C07185761D52B3B39AC97CE30CF6270612FDBE71F3F0119C1D97C5\ 08F196458D27A9F72BB70EC17AB19A2BF91ADB60279AF129A40621DC2D480035\ E23DD602371D94CCA27797D6991F6F3BBAAC3AADA8B5D45ADAE004AE8C8CE0AA\ 471309C94BF54CEBEB5122B3FE553F3F01A96D85ABD604FB56DC2601E9D4FBE2\ 9088BEF2BD44F22EEADF68E26CCA389E3E683D013F8A396E0F7F35B6E72295:\ E0C9B77CB1E62B69F73D14C0DDE478D35042CFC7E7BDE2375F54296278E27512\ EDD25292970B0BE93BB08F77FE96E7DBD6B1BFAC0D69C040C3B08346DF6CED11\ 9B15B823FDB835F4BC0DAC5805BA9724FE89F4A1ACF1677A0DD8AC0F2A1A48CE\ 4452A778C209E54F12F46A663B8BACB11230D923F4F6DBC8AA6242B628554F11\ BCC6A9F8BD4F589A397F8377D50113F56E42FED0233B8DA9BD285DFC058D989F\ C3BED904FDC4447ADE85A52F8480BD647AA0287D2265CDF2311938298B484C6B\ B59BB978A92E809FF5F93D324F65087AF075292C700C242F0030037C833A36BF\ D8B4C13EF601E84FB07D31CBA3F898A97C56D4F2203B2B517E16E7A49DF4BC:\ 876713D5072CD46D22282404A9FF2B4F561644F6A97042E9EBF4B67E4C92AF47\ 7A2FE9E9B0AF0A7E83FFF22C3545C07862AE0A825C0426D17F6182DE87D114F1:\ A9B40EA933EEC54BBCFC493688F03FE8 CEEF22020D5FE1E664D7B6A621599124B06396B2698AA835A1E7D18006DD7A1F\ 22A6DCB877C2D179BE4AABB0930533B13BC6B81393D01B959A480A1B53063792\ D3BC0070DBC433B7BC296BECE86874FE1EF3B98E6E9953B5566BAAA8E74B380E\ 8AC347128EABCB92D30ECE67D9B4294FB24B697F8D3F9CE8A8AB20171A627D11\ 258D00F0E13E990A1B6EF0BD9019BBB7CDB3A0E6C2B8F45F599BD76D75D5CBE8\ D1BA5802D9C08AE51972DAD1CE1FECC12F4FAB8D57725FC2D32CA6EED6099F07\ D19F00AC51E9EC0E7F40027AE87B3B2A02577C1ACEEB0672AF205DADE8336403\ 6C767A0F4A264E03CB3497A66122A4D713F84F3D6813327A1193A9DE61D084AA:\ 8CEF8DFFE12D2E10B2587FD60464AEE0B76D07D5B1F7B9165669C7643EAC7777\ 6C0C6E4A1B7ADC275D816D24B67C84A12397E4260DB19651903DBDBBF15613D9\ 0E7CE72A1BF4EFF3A67F05CCB9995D6429C1A3105BA79DB70903C340BB969564\ 9EAC32737229B4EF57EFE6DBC638626D15765559782935FBE2F726B84BCC6F45\ FA5580F9242D675443C7BD0834BC409420B546914711564B4E1649772D483A42\ C93139D4BB95EF5AD6C4191EA5D50A5AFBF3A5A574967A29772A091C2B841098\ 075596BBE5B5196B7F88AA39A43CFD4FD51E6011778958683954FDC644AD8085\ 3D47B1EED46863E18C1A9D2317BA6C82AC5333CF159F239324475077FA623CD2:\ 03AB68E651BDF7A802B9CDCE5979E8C5BA50011CC598DEBF9C96D5AB24A6D687\ C2A13F7CB02DA75CC169B630B70A03F899B8953E1E7A394A0DADC0317651A0BF:\ FC6A578B92C0DE201C0D2397EA10FAEE [Serpent/XTS] A64912329C9D3A304B838FB087750A63C9:\ C5C91A425602B4CE6B81AEF70C57CBD6FA:\ 2D2E5386BC3B936D07D9CE11E43CA175906837678B102FB8EEF6D8A02B214ECD\ 8E4B76A03B93CD69075081D9BAF99E83F88583E620E351B3C4172333969A7135:\ 38EC40B118BF54A851F55D7659FC6FE2 33792FCFCA4502858F43260657F986EE5A13:\ 7F040FC5EFD0EEEE7183D3AA8AC496FABBE0:\ 3303EECE235D3AA3111E48A580D0F7B9A008F102B1608A57B730E4671569CD61\ 50E22631F2C6227B7E27ADFABCEB9AC1A37B43946E21AF0B9FAE85B2C0E0A631:\ C0E92A058A0921AB961FFBCACE0E39C8 114FDDFD42873966893DB4A97F54EF8062D57C:\ C7D739AC4748BB6C0E6F578AB6482F436A56E6:\ BC87297C1DABFF03DAD7080F4FD3F97378B8FEFD77489DB5DFF6EFBB05683661\ ECC5785207495CE376F923E47076D218C2EA999F7D66A92E674EF7B49BA5C3CE:\ A3090A3A117A4EF924069331945FE33F E0CD635C50BAF984FF26CE92EFD2068DD9B297A5:\ 52C4CA78FAA1D5C2012AA75835E095B0E3CA6BD2:\ CA0A9E45CFC1E6AE704028690B46ABE1710F18AC3737347F71C5FEB8125FEB23\ 0CF6CA2A2364F300D9DD3428E301C5CECF5C33FD27167FA95D144BF1F3DD683E:\ 4D867869EB5EC15F99710603B457A23C F7FEBCE430AFA8FE5CEB11284B9DD6122EA5A40367:\ 763EA0F3EAC3935E25642AE16F88BC87B93F707092:\ 0D52EDAB29C08B1B06964AD97294D8E494955C9B46DACC57E67DECAAFD5A3399\ 8875DA8E4CBBD2E1E7AECBBC236F6EC068A5D8B123824CA08A14279F06599CA9:\ 572937FB80372E8C98E469509CC4BEDD B0F76A78D897A211DD8A18AA52AA8D72E859D3378BE0:\ FA2B87DB768F28D3BAA970DC88521483670AE12222DC:\ 1026843F224740ECFE9B9346A1EAB9C47BF1B0A576C9376BF8DAA697F36D2366\ BE8DD9DD884D55D87094FC5CB843B4F32200646E8CFC982A2CE13FF90BA82632:\ 8DEE91215E68187CE1B16B30D2CA4519 A2CFC2925ADEF9462638C2F3BA621874FF520CB515374A:\ A3D2D5069608C7F1715E4B7420658DC186BA0BFAC8B89B:\ CAD3CF326112C3257F265F12485758F5C726E0417088B9A378017893A74DED1B\ 47147D13935072A97F4E20DC75099A50B625673E7BDDF8674631CEAAC7B9FB5D:\ EC1720B2B572F8B32FFFCC8DADB9BF42 937C6543FC91B6856C10FA0F7792850DA87251BF42CF3FD9:\ 759C6ABF8C39AAECE8C1DE05EC4FFBD669E60949A26CF6B2:\ 1401416942F0377C7BC3C6684D5B013A642CD5F46D3F30746B506DC115AA0D31\ C78B21DC7D9DCAD632013FCED931F7A140BC9221EE96B1DE62CE5AB6075AE86D:\ CA9891C64F86CA9D382CB22F5C9846AD B0438EA9AB012BB8E564FCAC88E69DBFA9E8FA7592D2CDB83F:\ 358C7D0888188D9B8326E5AB4FF7EDD1922DFA9012C8CE107D:\ EF1484D894B1F28E9E0ECA1F118FC998A4EDA2F247B5D6513AF075CFE65765A9\ 93624F2EF4A5EFFA84B2726DE4896EE076DC67D16F8217F9D2880C442D6513FF:\ 25E39A07E7F0C1EA5027517BA44FCFCB 1732C3978CDE150AA6B6E1ADF9478B420B2BBA68089109CBD3D8:\ 5E1167CA5C684874E94BA64B34FF31B35FA488030A0F2785166F:\ EF330CCDABCA8C3A8E08303CDA4BFB3248F6AF50BAD447A89AC0DD939E4EE0B8\ 0EB4D03B515C2F5D6CDC5CDB882A4A0902A161EA7D5B3A55D162C8A9D72BE58B:\ E368A7AC0867F1F037FA5BC712D16699 B5B8AF83F628EC63BE8179A967D52AED11A1D66821F641A10D9407:\ 319AECB42B0B41F460BC09AE543014CC773292130615D663D5377C:\ 268F88383FDBEF3D78654B8607A405AF8268E17606EFE3C21CE2A79E22431FD5\ F03855E5345E3EFF0766F0AE6775D7DC14C8345D5830CFAAD7CC4DD1DDCDBB08:\ 1CAF4EA6F270285448E4FF67D8088019 071F2A61C5B56E2F547731CC1D5F436339FE4FCE9843F0F3BB6F3756:\ 5DBE768DCA4C4DBC23BA9F5F91D2A2C3CDFDF058F74A99512DE4F445:\ 8E27A37490956A547BC2B909968C2AB009AEC191479402AA8E2243197A26CB2E\ 4207AA7C71DBF268D5EB543B2D5923CC32173EB9F309A7EE7B48D4C96B446597:\ 22E85BEE91A412BB408D433CD69341C4 4002B4A6E526199D8970471121492C7268E26F43B4B9DEBE1C388A1F3B:\ C3960534858D335D7A6AF3E6A4415EDA053BD5F53D28CE7F067B526998:\ BCD2F39FC436A46F3DE97D7F3D14DF4D85C82156C2E877D1BF878320A653CDE8\ CA714A3EE99E5DC6DCBDB4B3E20E774DDC5763422E8E66CBD4A934AB86153D0E:\ 5FE21A17925581D360C6BA3D5DCCFB57 A6BA11AE269BC64444693E1E1510578023FCA38D36B58080DA763747E443:\ A7BDF3B1BC625B538E7A5F91647EB68B86E85F21F12D256AEF7FD6A467D1:\ 8BD07C2737B27FFEDB503F817AE4A8AF32713D462CC5EE428A6A2041508C9251\ FCB30080EF8D08D8C59D3D8668CF71A2899006D673ED15E7ACDA41635646EE8E:\ 0467E8B154A1460A4915A1854723E168 B5CAAC897C50CBA32D2ED3A910F7632204FD9F21729F2AC0D4AF12FB42D7CF:\ ED5B0D0B19AE8B63C0A4D6965133CE078A40E5931A739C476AA1364A8DFB93:\ 6E2FC001D8054AEDD2600DF63FCF87B6794170C99B5D2523F9F8F5B4285522F8\ 7A7F241200A0AB49D64C819C08F6AA9D3B0956637A05772FE80763FA369F051E:\ 30F231662ABBDED943FABDDE3221B631 62BB3594176F79E3C4D3E1A79E74544E7FBAB57CAD1D06175E660386522452F5:\ 1B87F8C19A41BCD059BDA7605EF5D39B361383017B48CED06FEB829BD096FD26:\ F05A9EEC5DE3364407272E15822008E57E1E808634CFADCA76DF0942D94BBB63\ 536D8AEDB16C77B5FAA086DD41FD8C7B62968FE2A0C6844DB7FEAE51F22AA0C4:\ 85F2D8CA7FE78836B6A98FAFB03A911D 15382AD48DDB5D5BE9B41FB73DE27CBF7FCD7A7C7FE5380648BDD92B0B228744\ D2:\ 8C8E754185C53C63C1CDECBDBD49E6CD92695796703ED5B1E6782F33FA9FA714\ 72:\ 37E7D27C585832360629E34343F4015937EEB4987F28077D227DFABAA9398EB2\ 3BC3BAACE380AEC2A6B51F68F0646F2B33E6BD0FF714112FE3E28111DF8FE423:\ E57ED1D0B5BCA67EFE6E19614B05BF1B 67DFCBA843ACA0AD9BF86217AE1CD70BA0B5B72E5BAE11A70D2D458F28DA1B1A\ 7CD3:\ 754C70CF740610D4ECED7EF0188D08194DE86DB6EE68E0F957A41A0405B9BF47\ 9948:\ F91CC4CC7C0621E4F9FF4B20C7460098A7FA3C66A6A6B4655291EF8BE03B4E92\ 9601FB324A5928F37D2BB5F5A13A21C4A13B828839297B7BD7DCF246B4B52E70:\ 395DC769949C27253E8F56398D14BAEA 43CF81247F3B2263CABB1495818D21E62E1E5CFEFD9269EC65E558030C690775\ 3C8715:\ 9FAEAC3D4D9A0D809AFE1A7637C8D112C13B4D10482093F06A3F81E85826E0F3\ 3BB13D:\ F30596A80E7B20DE5DD02DEF72C96A76827C3F704C2829DDA5DC402DE218485B\ A02072CE6A8D9455EAA9A1FD7FB0320B7E61B91F1E20879AE971CE8E0ADCF423:\ CA5375412A13D1CC69ACEA47238D915F D5DA49D4651F0A095F6C3BB6F26D6F3C74F82B66630D6E2BF88F599225B04E20\ 192A70C1:\ 512468CE96E079766A780057B99E017039BACE411E6F3DEEE1F3FECA585F7A71\ 4D9BAE40:\ 44230E0836B1316841C6A1D2ED0A0D2DB803252C5AC031C4B0D6D04BCA2C7B12\ 791F0D70BEE29D5B5925F3BE8273258270B99997021A63E03857B64403A3C74E:\ 21D5D494A0EF531662DE801F17FA9995 E98D055114E453F56891D614A4D4B1304F445729EE355A6FDE15510A3EBC3124\ 263B5362A4:\ 21725040DA3AB19E2F7BF49AAC0B3803A1810DA1169590C1A1E869BA82A45C50\ 6DDF6BDF36:\ EDC32E7905157CAAB42581A0026CE8B72CB98F5850D43A0525089DA6EBE196F2\ 0A28BA6601CE626EDDD6A338F4A196E9804CF1DF39E0EA83AF591D6EF52BC091:\ B0A5355902E88A45D903996F5CF2DAD2 04F9A067F81CB3B0C17B503BD2B3EED598E0FF016D78D52ADC2B20E0C9C819E4\ 311C050562B5:\ 1F779BCC7C2F3BF137A3C40A833F4642C9BCCE6B8017298DB2F4EA2BD970FA26\ 9F963A938138:\ 91D683EAA7FEB066EB00F1E8B499302DC5E94D476096E4C4E8A5499B6242A2AE\ 09A1708DA9311934E9CD3A194BF9332F8EA2772E18DD38F8D742FAC64B52A9AF:\ D19CF496837C119C600BD2D9AB4A3A6E 030DB028A774DAB81420BC35A6F108C14406F9190486207FF66A83ED3FB3B513\ 223704EB5B25A3:\ 453CB99DC809ACE604C6C74175675301C3214F046C54601E0FBF7416E7854691\ F3CF0193E88C1B:\ 9BE4006397B5D065AD344491A6A6A4338F221710F72C3ED04A4B963A48FDB702\ B465AD7D9ED9D16E8F7EB51F41A17E0A8865B06FA89D21DBF09CA6FECD3B7853:\ 1C3EC19EA57FF994C6E57877FBAC9F22 6E03086AD5B3950B55BB214D67573A9F996EA6B0A05F930685B5FCE95F13E324\ 1E0BC766E5328849:\ DCBD06446C6DCD28A06BD287EC91D2873A08EEAAD444AA05B3E041590528B1BA\ 466A59CAA4CA8DC7:\ 436535A2B92E39E44A24CA2E5B478B419604C6DB68DCFC96A0C4742C4FBAC129\ 4B5322569F5F955CB4D2552F6703933F0F7A8BA5BE7FBCCA3A5ED4A5AEDE1EE9:\ 6EF7D677773CBFD4478550A8C50F1B93 71167FAEDC3DEBA25E2175634F8662502563EDACD7B1F04850E013BD559F8EBF\ 6A1B69758515CDE11C:\ 4A800A9187795890B13156AF8F321489B1CA3D80FCC1413FC0FDA34E979D1091\ F5DB2DA14C715B8CC6:\ 9D52F124B7FA05A83BC93548254E1813F0F07EAC404E97417CCCFEE296360666\ 5D43E1A7FE9E561567F29A3F2581A1F22F3560DB7DE146632D7A4166A4397880:\ 803FD28367C59E8F989E2B3C82099BC5 331BAC0C68BA4C57CAB13CBAD0E1BF9185CB5334FB2AC62EBE1BDC8280AED203\ 2B0408C03070666E8A02:\ 9A597C07E449E4DB93B12AAA4ADEF1EBD2658900608B76A8F9E82F84B7E88B26\ 20A9DF213A4EFFF9BD09:\ C6FEA95C04A8C60FB5D0F5E2584FDF47EB2052F1907DEBEA745466061A271C6C\ 68F964F3E632E33EE161A4362EF7138F342311F1F894EC64A917AA2BC9FE39CD:\ D15B7109DDA41C6BF165BBD77E694153 E7A97BF5B4D93DF505C2F3100C02BD3517E503A1BAE1DB9A03F2C6C628E39113\ C35B5DE32E3A1F0A845BEF:\ CDBBAE44818CE74521CBE4640031136EE54D7CE063430DB4AC0265DB4781E501\ D1F38613D7064329E34F66:\ 08583FDC6287F4111B846E9E441D86A684B283033D40FA4E05249BACA632648B\ 8C536E6F166731CC82E3B9E413E55013BC0C6F21E16986A83487059C7E760243:\ 20A1451F4A0C54B2850F8768C23EF2D2 F09943022DE835DC91022C8E3469DD30672936F47598AE45D2E9DA0AD202872F\ 2EECB9A0D7DF5C43141137E2:\ B6B6A65915862C183AEB24BFB067D820B5C9A2A2D733DC8B6A447B92CFDCA885\ 65B329C13E0760A056AC1FF2:\ D15FD7E98A90913F6955B818D3B0BB5FD6B5F69698A260047F5EB1695D1DBC2D\ 30B47FCACA64E008746402DFDDFF109F1CAB2097CE350E3815997E82B824E34D:\ F1BA49B34B5241D103D5708759AA1043 787BCB7FA345E332F3155014BCE227ACAA34BF1B5F251C841D192DF9AACB9870\ 1A8B703659815326E347968892:\ D7B568B6713868E3A370C42D9736270D2D2B530990F844E7B0662CC5AF5A0017\ 224B391C2BCD41DD967FAFF0A9:\ 6D9ED6B853D403CC8912AB580471996269B47DD71226A740A160FF324ECDBB17\ 984DF46B407C0E1538C09E88DFF7D3875377CFC2C181A47ED61D3A0211B3829C:\ E70DAE7DE687411F326B3708606B1731 125B0831E1B9D2CF7D2217721C23C779BB6BC45AC62883785EC5E6C6F4493C4E\ 17BCB79832C1CFAE7535B0F52255:\ E5EBE57CB7990D92E27B11A9A033FAEEC0DBEB058486125CB4546896E109036B\ F6A42482D6AFB6BD6B9E19760863:\ AF24F1326E477305A7F3C0E92F6AFB4C78E1354BF33FFF3A69F85CB46F3FFEE6\ A376567FF4C48A89EF5D0F8BBE89A1067A72507F3B6E7796FBFDC2D6D66971A2:\ 520D7AC675F475EE27B403885B3FCAFD 776D3FEBC22DF177452FA292B5600D1F8D2D9547DDF425E335A7781F4D7F9927\ 9881FBEB7C250BE7EECE6277F36B48:\ BA5C3B967F3F5AA1FC6BFCA27B0DEB3690E97D656877A3A5818770E3F67EBB0C\ 45E85F3559EA97929E813DC62DD981:\ AC1A14214B02A17B4D3D300A8EE70245AF1204959FFAEBD5AA8508A4F1D84102\ CA67FA28E059A269E55DDB432AE6DDEF4BDDA000FC6DEB2FF11CE5B931996D2A:\ 34F0F96DC5CAF8E0A34E1263B3241B15 80F2B8E786863B481EB4EB37CACA034869AF225915173B4DD48502CED11AA9BA\ 7D97708A19165640B526A655A9C90187:\ 8F1FF889C3E7FC33D414365A191A41517B8BB420174C9E16F268B74BCA39E29F\ 609262506B1656A0ECF08FA8FFC7FC47:\ AEF2902BD2C42F5A0844B7B4128D0D0D832B0EB2B70E0B308303CA118340D384\ 0A75D04B10EF6A5110F6C88448B7E6EDF6D5439B0E1CBC1FBF93EE4880EA3C7A:\ D820B643CC274D882C94DBD8FFF6A253 618321D1920AF6AB3B8D047A707C0A26CEF5776D5F76D21AFA82CB56C26A5D05\ 15782DCE07EC23D7985E7A9F76665CFEF8:\ CC31FD0BE47DDECAE38A95B67114C2F479FD43AB428569BF68125E040419F9C8\ 12A80274C765232816F9E97EC49BD62621:\ 021963C34CA80643037F5D395009153EF8F44907B46C9B72A32B93AEB2B6454E\ D2F8EA52C34954FBFF83F3BA18950E5365FDB4F6FEF563F8C61018E8D09F9688:\ 7AD04E3741DD2BF2AC097D5650A2DED1 D6A914E0F066A2CD93B2B0B0DE71FD306F8B8CE6F2D7B0BEEAB39B96E8D688D1\ B02BBD983B42E7670B9C6AE107DBB5FD0C4F:\ C24784169E7A54A4B14940DF0E730D5A9EDB2D8BDEF6DBF13C0B23C312E7EA0D\ 8DE7C2B04CB384D0BFD0035743CD159AFBB3:\ 7D855D24BF28EC378ABEA95DEF6BC3AAC6F13573D716A2125CAC654175C99288\ 2D4756D6B46255A37C1741EEBA23681F26B70ED132AE3CD4E71BDF15AA41BB8A:\ 26A8B30348C34F534F9D116FD536AEEE 548931C48B31AABC6B78A73CBC76AB51D92A5A53626B97A922B7EC7892FE4EA4\ F506A58BB990EFA1CC771AA762F339FF536FE2:\ 730589AF27679A9726111FC1F133799DBA6FE7C7D0B944DA6CD8213589350354\ F3DAA15B1539F09E3C1FF3133EE0519FD473F3:\ 678F63B7644823FC9CA76864852658798488037AA055BE143D56622250265E02\ 099427B369E9D789AEF43ECE7CDED6172FFE61A9FB77793792C8ABD1615F8D81:\ 5E7B9D9DA944D2FC5EFF825CB225986E 07107C702CDC6E88600F8F329C907C47EA604DBEE2EE3048AFFC777DD766920D\ DA86ED1DB84D0A74D05A1CA2E5FE31C784DC6F92:\ 8085E9F1F6A9C103B35D20C52F8F3628CFDE1F116C9B58AA7DEADF65F29C4FAF\ C3F0A209BAD176EC86F0B05C4A7208EA5EA1240A:\ 67F070A8C89E7BB8C24EE530CEDF15CF68C2D2DDFE0572BB8A57F741A16B2F65\ 5979614C3D18837249E76164FC02654F896D7035B01ADF81D0A7F1EBA2209B23:\ DF515A3BBE568EF7B1E308DB5D6B319C 982BB3850E4DC983D4BDF06CF896A4E9D627143E63AB741C7A15F71589E3F281\ 53F8C6969CC1A72E4D657154108C4DDA860AF56FDC:\ 42D328E475E23632CEADEA4AF06A3A9AC7E04F190C953EF0734218D47C032B64\ 89A5F5FAE6BEECB7DB07A4CE2663C23A75F89E7E63:\ D92BA285C5311C9721E06BDF23DC0AB4E9AA95224548E6FF05937B21753AA26B\ DA9121696545B0F466E7265C8F6CFAEF3E3DAFC2E8F600978AE2B5FD592D79D4:\ 38ED78A11599AE454E17AD22652F428B 79DF47BC899B7E1D793A7602F8A9932CC3EA231AE881F8DAEEC7C20CB6EA709E\ 451C0BB10E2C0634D8E7D47E28A57906778D8447E7BD:\ 30AC888D1011A4669FB77BCC413247F69C889EAD7C70009A4F805BC696DDB0AE\ 11A5E1FB2E9E6814C23C616E5AB640C15F3E080C91FC:\ 0641CD20CE2C2F599CEA485F594A700D71F686DAE8143DAE2BDC6A05A4EB7D43\ 07F55E27FD5AC064D65F1B1CF5A1E20AB17BD8FE00EB2184CFCE23E2CE9CB8EC:\ AB73493267AAB67BFE11A45D0D133A61 4BA2A1BF88D9B51011509E40D1ADEB5EA352CB0948D77C4D35B99B5B608147B0\ 3A1C0F9FFDECCE78C90F46C5B542AF31C62F4CCFF4501B:\ 674D7CF26878208CF61EB61807CA6E816B96327C2DC69D5576A149B8A18AF171\ 707A74E4F6FFF2968FAD1791DF066160BD259E8586DFAC:\ AC335B56AF79563F9CFE27B893C1B906B00F3008C3A7BAF007BE2BA4DF4A4DBA\ ABEC4889CCC7BD87A568D2917ED7F9507D5AAA5183D9B4646B5B1389F927F85C:\ 505FA490887931BC21326BB51AECBF4A 2D66D72E3D8A1A88B9663676EF1C5AF7B37A175D3BAF0F9BAA3AFBD34A01AD26\ D7E0FCC2B49A79D9B96384490BEE585423214F75F142A184:\ A84B6BD1009B8CE205E56F276F52F23C079A3E74F2B9223A3B5B62D51E11CB70\ 6E2480B726392500A47C7C1E67EE9C154C41E7476AB8D685:\ 89F8100C456800D0E6E7FC23E707B1D6016F9CA5C7AC04DF276BA763C969157D\ 6F1286DAD3A303F79E77F5347D861B36B80DE239361623C1E3873D6E1BC60897:\ 2B6407677B7BCD9AF8A200275F97DC0E 9044BFFA517A1EAA7CDD8039C70B04835412A90AC3F55C3162ECBE83425A0633\ 3205BE4C3EAAAFAE8F7C7475E01F670229F3A63360E43BB603:\ 9DAB127B2981927BCE9A2F0147B81B67DC568DCE8843C1665846521D76CAD62B\ DC9C6E4644782A62EDE283942F94446EE4459D1D0FF20A49BC:\ 70B64496637404919D1258209B9EEAF4299AFF4FA3B8D1FC27560FA1AF2D37FF\ 1FADF43E4845CFC24E535C140292353AAC2D0C74E659A72F7ED7FA87342FF14A:\ 05AD42D5E2E7633DA65906889DB23511 D960E3C53C4FC18E33D5438F3716DF0B249DB29303B3C978011A818C29CF7D14\ 296ABF23F437E6D60A5E33CD8D54CFC8B893C4AF5DD3F2ABB265:\ 073F377C34EDD3D3D80084E76DDA312A41175D6C7319EE87535CADA1FD06796A\ A7DBE225B5682AC229C8E71947DF3F7C1E7759D14DA843D3F4F7:\ 4B3B4EC015C2965C677660ACF7290535AFDB961117EC174A6064C435ADE9DE72\ ECD497531EF8A85E9C9ECA6DF819E0207857CBF05309045E3395F0CDED42BB7F:\ 6978A2805F56C9181A1E8A69A620C3B1 FAE7F5DEB49358554C36BF34C45E1CECCA4D78664E281549D970F9895D76D6C0\ 366715F690CD90D06461FD1EF6A12A4CEA6C98706C2DC28B7D61A5:\ D733D742DF6A7327BC356933958D919D8595B91837A85D421B751515719492B2\ D2CA83A582982C72085885DBA621724B1A17E1B94935651B3B0F37:\ 650246ADC746D8B040F5F66FA88B19E3B1D2170D4BBB420CE65C48367F46AE3F\ 362A7819AD347FDA0A897F9AB3B6BCCD30A6F6C01618E1C0E83E559FE49C66FB:\ 408111F50D7EF68EF9E5E0A674F56802 A7CED614F48880BD1F401AC2F1332F175D46417A19C17A90A941E0DED59C5C25\ C152299D253108FC2EEBC972D0A954CB83203DC8EB72E393EAF90BCA:\ E4D0CB9339F28918AC538B6E8947C1E6E54BA87BAEB88974D9D8E4F4C04F5B9B\ C60C7181BE039F7B50D6B46768FB8951120FAF63F7B81CE50EE1092C:\ 0CF9B672743456723CEA953937E663FF4E2E583C3E9C819997CD1BB8F362E184\ DE69AF4A4D040E1B5E710ADFAE3C1ECAE9734397BB634BC76E7DCFFDA9747C1C:\ D54C647BA087A7712D538AB19F8A4F5B 3007EDA2A3BEDB4443D23FCECC42936FAD5E33AA9733FBCC8B172692F034301A\ 288E9811E406384A79D84C859D0288ADADAC9239AD70E7E3F9A332729D:\ 8C3D6F96175D345DC5F25F19F3A30CC1ABF1051B0509520E91EF4FE9180C441B\ AA40E84D5955566F402935FFBBA10C8774869CF50AC7FB17B5E3A95397:\ 4DA3D4D9A992155015C806D9E84EF5E149FD20A3D9E258DD7A69D2952C0C6E3C\ C7867DED5926F7CA9FA6C0BC6AF1A3134E4AE9C4E97BC25BF339B4F907516E0D:\ 9A81E5FA3934D192EE249EA8E7562870 F8A4A921EF927C69B533DA38C7C691A6E348E0DEBAEC55642EEC34F42645D306\ 309A5BB3574836AB2C76EF3258639425D128CF65C7B19387C2D0813E63A3:\ 57440E748A38DE81CBBD80B1F3D1196C7EE9735D5CCC26201C05C28728FEF9E4\ 159691BA02E6A51F9D38CE9A89A8B80756B9A0FA4CA9B709303408CF2073:\ C492F6251A50928E0DD8FABA215CE6C9763B8F3FC2C6EBCDC0EF24D5F09F0A68\ B20CDFB7F40DCC8EDE656556713AB51421C6669C9B59FF11011DFC7DC590253F:\ 7B77974EAC00673107A64B08F29E3237 81D95F6987B2C0C104E2032911BB510F39A56368B1CE8B4B3FB0F5E53AFBBCC1\ 7CB15327D00B4FA44EB30D59C1622E23AB0E273811F7DAA70082DE1A44AA1C:\ ADD06ABECFFE545062871E42E3F2D773B227026261AE545FE1E76E6DC6B0A626\ 2B95035A2A5C97DE5AC27565151ADF3FC17A61B9C1D77A25FBE48F6EC6DC26:\ 2E922CDB47B6E777700E1E78481C2D4C70C6F92F331098266EB143C1C381C2C0\ 9CA5C3DED5E7A0BAE46E30165DC88940B7A0452E240A6BF06DE41FC7074954FA:\ 3F5E84C1B5E54EBB29436C367310D491 15DC26624C9CA609300BC89CF5E65538C9813D3D6169B8567723CC1D20401A2A\ AD3E24DE64FC2ABD9EF80EE99C5DFC4463AD7F17B24B9C34822F4DA2AA085139:\ A7CEB2F08743695E4F292BCFCC7C73F166A241A411716665EF32E8A0A0974918\ D70C08282FDFA91355CAB04DD4D5E2F4B65D56D153709B8791999F82C3D757C2:\ 4B4AE0BC8AED1CE4A52F1CBFAFCB2EEDC287E715D3506F3A8D80AD82BD7631F2\ EAA9DAD03AB68F49C6DA9130E8E8BEA95E36AB423898D27E2D5E09B44EC0D280:\ 1056E8BDCEF6EA625148CD5F2F0F72CC CE6029DF95D6E1F322C30361328E59F8FDD28F9CC38C3E04671AABA20D5EA355\ F6695AAE23A0224F34155A17D9DB8D56BF999AD680B937538F5D8C6732A6CB67\ 00:\ 6893C033D1E7C74C0B8185B0ED20DA8A60EE89B256857C3DA4E5C9912573AF55\ 66B54734E1A364F34D82940018E210F3A9CADD29C816951B7369C7D33271B801\ CC:\ BC5AD4FE0A1A75C1DFFF19FFD9E607EEDD9897E592079829CC99C27281C1ACE8\ ABF7E78BD818905246D4D1ECDFACB9B3C7E33CEAE3E4A1213E372EA02B2B8446:\ 7E351957E1DB7F7F8947625469F59AB9 DA438EA0ACA5BB7CC14D9A426D32D946C912F8DB3A457E04345678A7CF4EDBD6\ A1958EFB55E7E6DF23565F85F8EE0F0CA1DA721F7D1123FEA5444A53DF5E1E3A\ 3D28:\ 89B9CE7002F24085E6C432D45422EEFBA53E25F3375AC4C1F9F83C81470FB8C7\ 1CBEA5E95DC6817D6E89B80D1DFCE9D4C4A75F2A7540B6F097577AFA28DB5198\ 3B76:\ CDB89E813EC48551AFA46C5EF5C63A863B704F57CD4E845006BC24095B5F4C83\ 896A88872AFF5A7FD2F54E8F8C8432A48DC4377287CE552E087C80F60D038266:\ 9828B8860EB06DA7807DCB2AA091292D 38F219FD2B5E5ED6CB92A152E3E71469CD7A4E2CA7687E6A8B888229B54E50DC\ 0CD4126C2D5C43D147307431F1CD9FFB80AA173B556A35E7305116018DF1ACEB\ 109568:\ 7B6668FA3C4990108EF066D176851924237E7B9CA0EC5C217702D0E1C9BB6C54\ 27A47CBE4CF299EA6C47C54588578E7F6348FBF0CEE26AB13FD3A1C33A154D34\ 35A505:\ EB09BC7197242B0BDED28D4CE461A52ED3B9BF7067ACF2047392103276618963\ A6B95DDB960960B600AB904E14924D3F154DBC7B0F24EC01EFFC085F7DD24502:\ E932CB26EF86BB92D8D0DBF874C123BA 696C4AF722D3C897A497F58EAE0B96954E4CB00B3AE22E2634753ADB4FF6A10C\ FD9D38EB4A9B297188B22034B4716620D72DA40E3D073AD47F98BAEE1F54165B\ F43BA540:\ 5FE6D0DBBA54E0255A2994024E895AE773A517CA023E28F6B07777CDDE04A9F2\ 0A3283ECBEA25C47A67DFCEFE433E006E212FC266290B1ECD10CB4BFBF6FE040\ 42AF7C75:\ 82A117DF507C79C78460DFFA54CBE38FC42588D000075CA58A01375B4AF47954\ F86A5B3649E6A81DDC73910AF02C47A5BCAEB5C09E1E5E7C03A8BCAC9D23F977:\ 61D4BAA8C572EF87F5AC5B265DFE870A 83A845F6B6F794DB55AFF0720A238101C4AD89D3B159D32C6F8946CFC65BDD08\ 99042FDCFC2E0BCC23A5A375BC7743A4C516517923CACC0FA33CEFC8CF2F2086\ D05E9A61C4:\ 1316872884AFDBA1FE0A4E16D38071786157B3544F6F19C798129115AE2BE44F\ 940FB3F7190F104C900E49FFFD3A5C21DA1B5B8ED2CB21839A18E79BE9542F98\ DBFC766394:\ 800F53FE3329BBC1AD83B5CAAF0C4CE157550E5B595E6AC9E5D6F2AF9FF0EE6D\ C88C87B2D3E2CF558B25DF5C274A68A1EFF2A5D163D7F056A79E2F279C9DFBFF:\ 7F2360CAF666793282F2A00E9A37F8FA F03E6746B6AA4BD48F7724B8DA122384A4B3E68E0C94E49D7D22DF006C32BDDB\ 8D874395546285259009BB930261BED3D89777581EE1435036189CD3BD1ABC3A\ 5AF7EBD4946E:\ 7019329131FDE731EDC64FD24FB5637E84C94AA687C3C754CC9B172E5AA7A5FE\ BE7F17766ADCBADB7F5D91BFB0A88885A420BD485CDC10BC114CE134B51DF05F\ 288973FF4B47:\ 6D34AC195EAC4EC8597138156280061BC032A5A9028475CF8A22906E991DF3E6\ F82BB9AF05778BD0D09D840EBF050E88950E56E8973AA3C329BDA9C7404C0E6B:\ 24066FFA473235D8241F55E16C525B76 0A20F39DB1567EC6CC1B61AEE4D40E59BA78343ECF9459B3B0F518105433E862\ 903C37E240EF6676AC3133E484D4105A192CCA7D80D75CAB3D1D27B0F78F9EFB\ E1B9C0D694B8C5:\ 808BF3A738579EB79CBC2C5EEE9B6B14FB938E3798A162F39ECD3B59448B1303\ AD44B0EE812941C77B49768B730277F8FCB7E338C14ED9987F66E25793D0F88B\ 0956ADCDBB7E4F:\ 4AD17BE331A3A592EBFB7B0E920F0BF6AB326C0B7059BBCB300710FE97699862\ C92D72472C48EA6EFCE462D601A6B4EEDCC169BE473C776F10BCE9C8B17F7C44:\ A181B65C04851CC450DC51EAF76ABDA2 DF9F849EF94245A1CDF7DD4555EAFBD4D1755B2A4E2821B3497890C8320A2169\ 3BD51F0AECE2DF3F4445B8DBC759BA2D4FC860F68AF5D4A7576695C63E39B606\ D18B3802D370DDF8:\ 938CBC602BA5B8E0A2A6A894D6DB3E004909132602EDECF893679E1FEA0032C8\ 5FB087ECC430051BDA600C4ABBCCEA8BC22F5ECD4B87E9B4A43EF01A2264238D\ 2C1AEF886A90371F:\ 78217BACE102042F9C0BC63A4EFB81EE68CCC2A13083BF483E06635D1F585F92\ E04E0AFBC4C52E1401E1AB5895644C6CCD74217E0EE60683700655B829B96781:\ A0ECF2769438C1F6288BE9192D776A69 673CB7F14B4E1F148D4EB16C7EAAB862571C625E0285BDC2304EC299D520AE44\ 8168424588736A52B858F3EC23D98F48DC2DD81E459A04A4F4410C78498C686E\ C0F4DD97B7011E6D65:\ D60D4E5F585B9FA126E140AF76B1AC0CAFDEABD840C9C9DBDFB06F30BA6F449F\ 6A1008D7F8A3E8D029F6FCAA79CDCF23EE3FC07A3E0586EAB4AB6D9E3FF77FCF\ F2F4FACD6B0552C66F:\ CDB943D0C98907323D25E6E6F20D6C37AFA439EBB15A7C19613E4033347FD715\ 0E4A67D76C26B2B7C28787499531ABDA74203480A2D6C57F8C79FE7EA7E08178:\ 59E21CB577AE8B72C61695A53B90B1D0 C10B09A05BB1EDE31326114D6935A86493C2147B770F8B100F52106E0F22353C\ 3EBF3439A4D309E3A9E04707E0FD442092744B91A558365FF9DCC0DA6BE49114\ A05EC24726ED7D135D44:\ F1FE6F3B8DF82B819384799606746A2AC053E6D7A7C430EB21DEC88BF92AC725\ 0F6FEBD00AA9E2619EEDE13392E4173C8CEAAB033E7C59DC0DA5EECB533ADF4D\ EFC5483AC0110F9DF980:\ FF3A7CAAA2477056F09A539D31E5252CF016AB00FAF86A823D409406CF2D9BA0\ 91F842CD97938D3F875FAD92DC5847A02292679342F48E79D26BB688D5956D80:\ C898B915B9AEFCAD0D3B9669DAA86CD3 0A4AD44748EBFF8F1DC606B18D1CAAECE82FFDB0997F4C4110FADFEAAB9E935E\ 85BA0F2CE5567A867903AFF1ACF3FABC52D942A1253D7C7E2AEBA223EC5B7444\ 27A7A18FA54C2BDF03A6F6:\ DFC97C5F9BCBC36D79FFBEB1ED106461C71D1DE8712CF23BEE2883C0C4C4F2F2\ D6BEAA3D1771BCDE52FC1849DED35E3F2334E1C42B4F78BCD08CB3E9F3C17D5A\ C827757D4310483FFA98E2:\ 70783DBADE64C24169E2EAA718401922DE21E350A36919552C8EBE572F042C9E\ C65A1131B090AF15B4C20F59B87D13FE48E7C8EC9D863B5B33985B79EA5D1436:\ 9CB193F8B79CE0788A5D48E5952D4817 DF2F1E70B33C587B640669B4B68EF926EC9C6B51BD14C937CB4C0BDBF7D5F014\ 8BC4DA12AC0CC6B888EF4EB94325969AA4D1FF38E5E787CA8B581F8C30E109CB\ AD5DE520869A6965CE43623B:\ 81D88EBE06A2594DA4BFB6720883CB05C674D47F35019C965ABBF00547CEE5F9\ 848FFEE5F169B6D0E3944F0BDA6799E434C90FCF9595D33CBCDCD8AF5E11F3BB\ 677A87DCAB7ED2CABED2B0E8:\ B931A97D7D1B9A0D8BF1CF7F7A9079F459E854FF083B999B8B56C39C0E612069\ 41CBC018EA4D3126682807A1F7C97D2BFBAC9B63B5D2A478ED00177D4E91B675:\ 4091BBB3614F9FEA3887EC5561F00433 436E6987152A372706942EEFBB7536E8B6D4CA6B363122E7F67EDC3004E1292B\ 79BF823E27DCDE0482DD1D31F4D0D022A5868F57EA5329618EE9EE6A43B16C4E\ 6F20435EE390F395AC1BB32A14:\ 26471DBD891F897FE3627511B21B2D9735580BDC714D02218C2090CA8E7AD7FA\ FAD2264DDE925D0C77ABFA55CB3442BC8F08DF065AD2410F142DE823B02F6EC1\ B9A85687A0F9D1687DE53CF616:\ F2C5A19572BC5CB14AC927483160391BA6366CC53F7F93F83BD1CBEAA2008B34\ 83D097846180FB65B23D75BE5A0525612524A6300856A16D8D333783B4F23E93:\ 3DF4824B50A5247FBE3A97507C5AF538 56BE3FF29860DD6705172269FB85AB6D9330C6A8F650F951D3470F64AB3C5615\ A1205D8067E8D39E5F366E9719B8BB01A44EED2964C70C9CDC7D42D4B5D67226\ 665C8B6ADEE8CCEF263F75F7E58B:\ 948C4CDE3D816931E4EBE4673227170C4814890E8A6628D984E3F4ED875CAAEE\ 816CE0E0669E5A213D166EEBC96872CE48FA69149D064146559DCD512E985616\ 51FE18EE0F5964E87F40CCCCB9A5:\ 2661E22FE507FC2A25319926A82D3EAA27018DB8DF21D08493F8BE33926E5C9F\ ABB2C787BCE03F5DA0218675BB7D14A8A2731AAB55AC159A1B3B644196BE540E:\ 7C7A1AB29A923F568F9934A8F24EBD58 357E18FD9A2E891D20FE1ED5A4F1AAD547F419DAC97A26398E91CFBA2918FDA2\ E7C4627F04BB6101ADBB7960BA07A86350722AB0FF01955664A36F7E53ECD1A1\ 06A73EF5AC50E16CC7D97AC7A24D15:\ 0338A1642C3265BA015164937148270F8C4E32BBB8DE648C13AA9729B384FB76\ A1BA7FAA2BD255E07515229D0E6EFAA2EF3AF219281C2D375EABF36B35C7C31D\ 9656AFB7033C02039B5BAD81CB925F:\ A381231E27F1320C0352CA0B74C6B47E8110F9690A343C1D5FD05926CDA42C2E\ 103E9429412ABB7A27806BE91D7EC5A32CEB19A2A3D7C0C07BD90BF143C4462F:\ 497D9185B73F6007DABE550F21C76424 BAE412A3709341D4E5BF5E2EA0069F6D229E2ED6004BED7E320B30FD31A0B6AC\ 5AE9D859EBC807C860363FF9157ABA3A6711AF5370256A02FC353ED73A145E3E\ E9ECC5F131613524A9C268CC920C9E69:\ 3128F89DB3844EEDF812031BD5858240EC63F9BD1D390C27BE826F8680F34F36\ 544AF1B634599304807230F508E62F0A762E12A59258579031207060426ABDDF\ 82C2F8FAC7237D89BAA1513496833804:\ E7F526508EEE6C79C4BF495E3844AE3240C804CC715089C14253E348758647F7\ 436E1B04439DC1E47867D5DDC06E30E435868696019E5715182234927CA62ADE:\ D1B46349354DF67115BD1613806BA0E8 16A3761D5D19E38301085F93C8CF7BB7B57C07CEEFDFB35891DFE9D6DEDCCA77\ 1853779D24D9E68E834A32C6FAF7AB178B837B177E80ECA50F2108B6BF5B4D64\ CE4C0AE4C26DA69D9D6C2DC597A20A9321:\ 2143139EE4F5056A392D0E360F5518092BA12B6C006238A410CE2FE9110ECD7A\ 9EA4944AC70F8A45E291088D40AE615E61EBA19C7CD807F627DB9207D03BD5F2\ 771D8BC55EAD7BBCDF23E638111AF3D0FD:\ 56E3F830924ADF6EB2ABA44FFBDE36FF50CEE692D224852D84759732F453DD1D\ 8F7CE8CD8BC89EC7D533FC07C5D60C6FDFEA83BC7A98422AA7C94F1176E81DF1:\ 59EC1B933DB7CB8C5DBBF2E255DDD83C 24D7EEDEE5F9DC4C9C00D0A4F7CC008CAAB2ECC30A97353B9BE25587C3C55549\ 8257F8B1BA6225D64FE8456A86C10A945D5E2043B4F56A8097BDFE0BACBCDF2F\ 2B707894AA5B6236E4F1C1BD81DC20BCA411:\ 1DE794AD93BCFD57B300AD14B2D0F13CCCEE43C559DFC25BE16169F80AC0ACD0\ 514B012ED474C7EDAFDDA6F4CB0DEC2723E1D9F9D56881814E373FCD681C23F2\ 0D0471B351305C7DF8DD913DA452E4E1A7E0:\ 8E627F18B297CA10E2FD5F782035246D30E1790E306B19AE29DADDA2FD12BC9D\ 95F1F0CC2563827FFDD6C1CFCF01CE264265A601A1C64F71B58081F624E7098B:\ E81534D4AC86F3A8548F392E12C396DF 93EE17749850BA6962C5858815F83035A8D3BCD113A8343E3A9EFA3CF34FEF5D\ CAD8A5BDC9CCAD6DE4AEDC4636F57BFD590C00B4505B20E05DF65808546B719E\ 3C90EF45ED1894CBC82B2A0CA9BB1C154419D6:\ CCE37BFC28B2D0870E842DDEA150C30D6DA19F0C4190C8E8E53089E546A5E672\ B19677751DE4B949B89BA5D6419F143BBC21673D104129F7EFBAEA2D0A512A9B\ BE2C0531CDBE716575CC7C88EA34AC5A450A3A:\ 0A545B755C853852597731D5A1FBABB6D501CD59571D55C92AF8526FA97A6B7E\ 856510E9464047AFCE701CB7A178D5ADBF33BBC4D028A00DDA7B4772408D1CF2:\ DD6D60AD262774C962C0C6F16AFCE04D E7E5CA48AED703C746578F607251D1B738534DEA0B0172D2172849671DEB88EF\ BB9EA648B52981C4EF0056C487644F39DEBC4D1B5F5AF38D0E9A7EA1913C2999\ 55A07753B7E4CADCA08760C282A05EB98ECB91ED:\ 6125AD56EFF933C47AE48CD0A641F35F64BD178380F81C879495E25C5A82628F\ 79394BBA7E2BF5858A310B2E98A056FEB9484BC423169C15F97EFB727E5FDC3A\ 2B9802C93993EED836842E59709A38DA3634630D:\ A6367980AFFA4B81776F23017DCEA51DC5C3AA7897BEA721FB3E77D2F165BF32\ DF8B33DD12C126EB10CCD13A8A90066F694EBD2096E3756F6D2AACE7510C7370:\ 8FCD228AAAF79070C234543CEF7CEBD7 6308BD31A5D74B1CA56803174B911E7F82D2D7C7BAA18179B697507079346430\ 3676E94724E6C15A60131F09B6D0564D92931185726B730A7D33441042615062\ E68997292D61AB1B998DD7F76997FE8A12C60E4A34:\ A57EB6C6DA1DC33C882240E485CFAE952543C4432DF7304F3705267E1D7FBAA9\ EBA5DAD60EE8CA4C02D20956750E266560497C2509F4CFFBB13EA0B2A59EF3C6\ 8D5E5A86715BE0F133AB49D6B21F094DE29CA56C19:\ C1A7BA8BDF41E1071AE1B496FD67E99C10F95BD45E4DF7524A2AC04EA98711C1\ 40AC1837EAD2F3DEAE97465B257B256949CF89A15DD9C681917026735EFC7385:\ 06B34A3BCB427C6BC3E564F54147AD9E A562277E9787D912D4DA2E7BA2AC757CE779D3F3A0734E490041EE2B205E45B9\ 401E8A6D665759F3B6B3E25B02B793B5ABA13679605947BBE481FBCBA8B9D62B\ D1F970CD5AA01AB847BAACED038C7CF3D11B13A0A559:\ 3C508BEEEC49B30F7CF5DC53373D45DB5878352890950251AEA39C74332A884E\ C0664997248C3020CD4C8EBB125875A9DDB25459BED2A68931A7C6ACF32310AA\ 8A1CD49241A0C958ED855FCA46D4B993066144E2F4D2:\ 7C74B506CFDF194BEE89AA3E1CEA248D3CDE19339F25A054A6F0E0978A18018A\ 98E2771C2DF50ECAD7A828AFE1402BD9A04A504750C8BC1C7243C6E59B00F701:\ 8BB76FC3A74757C51373FD05BE707033 32AB1F3D501464AEF7D6B8CF0778E039F6FFE727334C07E855804E71C816B019\ 1B566EFB2C4E98611EECA7859DF3E0573A01B801888A0A72B74079E00F3ABC08\ 46D5A93A832086031CC8FAE91546793A834AC4815A503B:\ 65530F2B08B7C1F3A09872C967F9990024FB75480C9108EC48BDB93FDDCDE7A7\ A2F7AE8AABD4854C491FA8DEC692B006E1C9556AD122EAD6849330F52971FFB5\ 2093CBC609DEA3D0A61E1B6546794C4646291EB7DD6E05:\ 5FEB3B25D878182C9A805C42E18F06B970E6A8DD77E3A773A86129FF6D6B6DA5\ 570FE972916FB3A08D9DFE64E93A190366062F3F102AB559A6CFB9585BE7AA08:\ 787A951115673D6EC7806383669E3D77 69AD99511C51DB7489F41C52BEE4554E35FDA8F015E2C15022275BA060133D44\ C1ACF7BC7067E9DEE1A6F39A5F1CC16E2A8EE62C3C67412A65C5653F81C5233C\ CD8FF29CAA3202B04071134AE53775D535B6C558D2242758:\ 9F57CD91402EC58903E500CB5B5C2144B4B4323A8C0E826E9E7B24181B9304AB\ 09FCD957A283E4A6DF1A354163905B191898666A08208A451714E8282141C3E3\ 3AF5BC2B4C4F03E66D7FC9E5AE2CA48683AA2AE64DEA758D:\ 893E15150A3507E4FD4817B72DDAD367B758E8CE96306EC9099B0FEDD2F52AAF\ 35B075D866449412A3E5F398DC10E84C446A464C4C51C0C45AE40DEC410B345F:\ 5256127987D73F87AA443FA66ECADE7D D6737D71FB176BCCE7C431B7664A221E7D4F516E6FC4D73B6FE2407290896531\ 38F8F35E1D65F3BA762EC3635D3CB0B56F59B10C928CDE06950E6A2653E5F0BE\ DD5F046A89546A712B5C9CF7D88C55D0135583D424BD80EE6B:\ 636F9D4BA28929E2260B842D4F61A203A892A4B2875540E90AFFF65D2D36D6DF\ B42E8066385A1AB671097572CB37E53FE8BBD49A0155487427428E098E536756\ 13F560F3883A8CA61F1AA8CAC7C2F76B271FE50471322A5446:\ 719DD3905FFF61879A4B092B6BC882DD65AA3384DF30003CF30FCC677535B359\ 26A621E4A95F3C98B29A4408B3E325EB411C84AD635E71169FD9DEC59FE4F6E0:\ 6D3BC653B3E4F85D9F5C75233916F575 1FC45ACA01C817498EC54C0BC908D9B7DF97A1999DAC65DCB7390690D97A7424\ 7F402AF1E19FAEE90C584F51DF1B4FAC34B988A279A864D15DC65FF59C74A291\ F8AA97C8DB4379D11A9250AC3D06022069C29C75CA72ADA114C3:\ 6BE638D8C6C9AFC951B853FE2C7697A5E912920C70580420FF51D1BE0137ADB9\ CAD25A63EAA1DFFA1E3790367617453BE4122F5A4CB2FD670585283B6F5156AC\ D262BB9286AFA3799C7B313445FF8F2B74BD4DB33042D6EB8A21:\ 82A603ECAA527A78202DD1CCCD0FAD0D9CEC5CB1C87B7268CA6B37B8A93CD224\ D0BA72B3A4EB9D88D4212CC84E3480173C9A4D6F25290F9243CD8A7FA3BBFD0B:\ 167A48FB0CBC423A21E8FDCAEEE1D2BB 4676B5965D8497D940FF4F24EDE66F50A5562E3A988AD86D3265551B2D6DF8B8\ D694820513F921E5D5B05DA82D03A4F2C3F1BB2877AD9A321151BA2BD2A406BE\ F3951F5221DAAE46CF081544A4F4B6BC2049B8A51C6840FA5301E3:\ 7B5969E22AE7734260B2D2EDFCAAC3DD693731968A5BFC5B46000D3358F3F514\ 5F02E09596A53EA9F83100405BA6C25087CCCDF86522B3103C439A9D9598B4F1\ CEE3F1836EA84DFFD6D0B90AA53512408B053E3D802C48C1A6B024:\ AC59FC93884CB05F91D73E67A979288FDD3846DF208F8B20ABAE9BBE8D05B312\ 56358D089D64667DD77C4414D61567E58DE4B558B80D720161B68BF50CA43C82:\ 67128707B418CF21DBF934303B0C3FF7 820DBA2DBCB0F5F6940045CEBC40394F60C1AB9967052CD09B4F4F14C047D8EB\ 84EB422014F32BB2A51C0411B10163A785A6DBC90FEEA34A0D6452318C973F3D\ 5FE3EABA37E4A3459C057A41BBB93105D88A47FCB6E36356DC5E6DE7:\ 227535D0AD2FB287FE0581383B75AC2444E32E242994F898D002C369B7FEA3F8\ C96AD42CFA31EEBEA29BC04AA0A189BB9141F173C066DB821DBEEB708694DA3C\ CE18266CEA5411E02802062E83645CD6BBE8A380DF478D787FBC72D3:\ EC9203195C8FC9DB886534C95075B1452F3DEAA5574EE0D94DA287A4229BBEEE\ C550AD2C8D09D8D29DE5D83444175F0050BC89E2D5F8794A495499310670D055:\ E010BF035E23F39637AE444BF0F50C47 E8664B228D28533B57A493FAF4C3F61126E85E8596BB9B73780D9202902A05DD\ 7BB8C68BB2DCC064E058252A6D0E3F7D482C123D14538EA74517F8CCD618CD51\ 82683811C35348FB1BDCB6B6B538F407C4AFED94EE98CAAE6EE122A629:\ A8E7F8774614C1B1C6BEE486CB4FFD249AD07F22A93DFEF218BE32253D9895F9\ 74EE1D6DF2944AE977E3A7BAA13464C9F4C82CF501DBF96A81041DE5D3F4C839\ 7DDF974F9C7DB0C4016434AC17788480FBB5730C9E5DA783201E797B78:\ 1EDF654D9192AAC22A2E5C000911D1190BFF5146D8B624874938055753BC59AF\ 3C79ED1A2B63F7590E0D2E2B1BFC4FD9FD7E10F23F903C1F3748C4C8DEC20991:\ CCF19F78C795044953CB405418702899 C20901D342B4BA042D9C30D99E25DEC320AF982935D47D82FB01172FA67999DB\ 923861E26794F5715E497457A126417F49503F16ED1D09F885E143C502C73733\ 02106180AAE95D500396CC3FAEF26DB5593AC8363A3F99D5DC345D7A103C:\ 585BD877F4930C0D56DC76B94B2A457DFFF37BE6C53DC3A6FA1106EC834B6CE7\ 72DA4F9D865B879A15A7C5F0F06542DABEF5912B745511F44FE085C45AE03028\ 1790949C9B851550E62931DEAE3A0778AED187AAD3FBD1D3AFB5EB4D2D9C:\ A247A25C6E9EBDC50964866CCE6EED1DB33C8C6736183A0D05448702EB606CF5\ E910B45ACC9024E1133B14003564C7A7C65538E39007A7BE77789B4CA817E659:\ 0BFBD60B9E526C33A8F7E58A698CE2E1 131A8A1D098EE03489D6470B6A84B0118BBED2AD70424AFD567FC6A6A6463441\ 2B4D2E796A22E88145082C4AB6A123C1F68C53ECFC9A46EAFD0CDE55523EBE9A\ 2A9622D3957C70155F8AC4CA96A1D4DF537D2F1BDDB3A99F5B8672C79951C4:\ E1E158FDB46D7BB723384FB7752E1F198E3DCD829EF02B18F5399D95B462C607\ 14F46C1208E2DFB6CF312A35B18EE9B1D3763ECD2376F803948FDA78150143EE\ 128D094757D7B3F3D56C6CA50F80F398179577E65687C72B8EB189CEEDC0DE:\ B2670B162B792BC69DB0E284F565BA6F34F79D4BDA1A983099EABDDC2FAD4E73\ CAEFE5EE22C9DA8A4075D8528C83472240BCADD0BB083FCD5DE1A585543ED956:\ 7679CD4E42B5D2A831DDA76FCB988ACF 5E4A0DE980F9F84D120851120D70B56B2A4F2E3256A7FA2266A729F9509600F7\ 621F33A3C56588A8CE22C685BE1EBA80BC66D3395B9746404E33E5A5F8FA4CE6\ 19B19126C04DBEC45DABD7BB99F87D407684EDDCA659461FB3835E8D6F0C3F11:\ BE08C497B0296BAE9483DC975617E42C77EC5E74100A33516796B277B5D2C406\ 9C59A164CEEE2D70097374450284A06983291AD62314EA05B78142B34400D901\ 0454E33270E7C56BC272CCADC123D2681B6432CE9B70E096194DFDF4109D0CA6:\ 95E30268A8B51B1628F36878A8D399DBA9AE32C65EC2A586BB8C630A8C508C34\ EBF6DB6CB084445BE218A80401E23413FED6B427B00775A24C5CE0B719C86E24:\ 4D6CBBADE1A824092490C63A00435572 AC3D621FB9D3F578CD668C778AE5684F788122453B96FE9F2BA25E520D655451\ 6C4EC590BCD1CE3AEF6D25FB057840266A921CF77170BE425ED1A3466EF03979\ 218325C201DB739E55A04AAC298E2D52EEDBEB9083B7DBE9B097BAEC77EAB946\ 53:\ 38D72DC8393E8A030FAF21405EE126AA7B220B0920819B5A31C3223E2225E5E4\ D4A99FE5091DDEA2CACA86B8E5080F6DAC261C4DADFBE93A791BC6F42736F8E7\ DCBBB7A6C9CDF7EC0143A5BF85A388C63C2E09FE2DE8F5623DAC6ABF84AB0546\ F9:\ CDDE1E3EC8CF36A175E859843A5E90BCC8E7D2F696AB254E4A6695481C09CDEE\ F579A943C78554382EB27D6AB1A0EF46D585AAEA65267172C3357210E809769B:\ B10879FB2570F4E30C9B75BF82F1D011 864A03A962A6CAF675E253FF4522060C282AA1CA16F334EB9C018258A4D16EC7\ A6B8CF4C44C1C7C3DE0F4F33539C96FE128F31BB332F857CDDD479BBB67BE7E0\ 90BCA34E60B6EC60109619EF894198EA931DFCD46A132D4DCB456C18BA364BD7\ 4060:\ 6180EB27CADC6C94489EA99EF57CFA04EDE1EDD1C33B667A60803DA6D0357C02\ CFF0C9EB91155D600B4410DA4C2E962B78CEACA1963B9F44BB6100FC7C03E2DD\ A28892B1D332D34B07878C9AE6BA2CDA81EB61187CFE2608A2DC2C9C5429B31D\ 8F80:\ 1CC977EC5EA8B094303C623484908E6F7F4D5F8FEFF3CCBF17B46F0AE82A13D8\ 6D7649BFE202A210612D357C9831EF0A56AC4FD95BBA1D8378B940C302A3AD37:\ E49ADE658CF74069BF4A0CF826D712CE 098488C02872B0D0ED3E900E8C79A6E7E36D1F0A149CC29E2F39E983434345F3\ F407468245DDDFA144CA817F9144F5CC0F7BD89814458FEEC309662EF186F60F\ CE42FBC80CA4500E724E5F33B9E07E8B7DD31AB76BD8D57366FAD8E74FD53417\ 6FC4CE:\ 9B09E17E3A51B53374F67EC5842813F5FCF3CFECB1E3A4E06F03B46597A5195E\ 298F0F3227822CA8DCD9095BE716561A484723B808B20B958C53592CA11B1F55\ 89D7CE47BA9BDD706E352AE2B4F8B3F397B9B079DE192F05CC7AAEA8CC1805A3\ E9E5E8:\ 64C912CE24102BBBF04B064809F5A2650119E9610B32CF62CB77F46812D9CF2A\ 7DFC897CDD4C61D1FDED8AA2CB1E0F4A09FF78BD7E6891E7F6F4A65ED82A5FAD:\ 0309584D284ECD6B46833ECBC65C00C0 E06AACA7D51EC448F96556BF1DFA5859CFF3FF283447749A329C8C21F4F0A7B7\ B5A4CDFEC297B88A19CC4208F4D237B34F590A8EB72C98FF05F25725600D7844\ 7800F7831D6CBB0B4BEE113B54AAA96D732C59FEC9AFAB086781FEA7E785506E\ 8F2298A2:\ 8F3610B44FA700BFFA2A6E9D0FDBF9053D1189C1F4DC8148E6AD3C9093290902\ C422377D443EBB44FCDB74848F7E274A22A38996ACFAB15C5328FD135AE07F58\ 880FE11039E3FA9C0BB8871192CE2126CCB1A5F2EE589672A7BFC10CEB906185\ DB877382:\ F41046323EBC41F937AF2108BA7CCFF29A60093A4F55A495BD8AA112C11E3279\ 39FACFCB848E4DB2989570D3AA76CA34639439D24627C18DD5A96E60EE38409C:\ 93745FC5648C8BEB999243A4DEAA8616 436AE1619D3BDC8C534F74681FF2573249FEBA565DB34C271BD2B34AFD3AF353\ 1645C4BCA31ACBDDCCB02A14E586E7EA95ACC297F725C7F6D35DA2D5ACADC569\ 270149FBD31EA52577BBE41AB92DF6AFFD46BBE3FA41444EABF1D41DA0600343\ 31A27EFC52:\ 80EA0E879126401735683D65102E398AACFA9CC89313D4720919E0B2855058FD\ 232C2DD84E8EF00922714111DC381B73C8D24A2BAECB3AD1B0E5E0289A80853D\ 39EF79CCC35282A4B3FF090A6DBD5D41AB90C254B3888A998E5D264031D3BBD5\ C859C2DEB6:\ FD9AE9F5110CD122692E59E32BCFBCE883ABC69987D247C019B6DD9C107F7112\ CE462B8DA4D587CE0247D8372971A4D379EDE810E647725CDB5AF2E430CA3F2D:\ 2AF05DFDF65DAAC4BAEF3862C00A62C8 F69B6C84759D9504CA20083191FDFEE4F5E7FC0B5E3771FED2BC519DDE2074A7\ 80FD83B2378508687A5F9082FEAB301843F191768FC70DB1D245FDB42B3B62CB\ 5060FE8B8AD010C461DA73DC139E0FE15D0B924E6C396DF759A3AA68B327CB8A\ 5642B56E81B5:\ F617F599E3035E7C0F0AA5EC17396835EBDCE26CF975618F01AEE9D5951A0578\ 23019CA37AB1F98FE68554DDD441EE60019C742B64C5A911C919C264A1372D54\ 95E7C1E3BC1043F8AE6F92EE1A2D5632FF8709AB513712DC16391E9C334C1B58\ 06D27415D9D5:\ 0D3A86358CFB0E854001E69ACC23A37DF9B0BE0D4F84CB357A6F45D5D94ED305\ 3C0CEF9629A83C3A93AD6BF60F3FEF165F4582A6CAF079E1EEEB3D00E4CD3E67:\ FDCA2980196711165DDFF38BBF9AA69B 41F2CE69907B4FFBAF77918CF2A95402F5BFF25DD1C3C34DFCF8C15AE0EDE2D9\ 5217AB3BA2D72CDA950180CE213B5CD6DB09602BF97E2C01014E9B366AD1F084\ B9827CE35E2E834A35932FD13DB8EB93DA0B75C21DB91FCB15DFA629AF0C4529\ 0536566DBABF9B:\ EC0C194AAC8CA99BDEFCD6C62C283B13282EB226CB3897DDEB1C440E15269C78\ 2BB559BA646D40A9980D3C8AC96D972AB8B93CCE8FEED92C79B80BB05628BFA8\ 3F49ED691E75B933C4D9B0DEBA89B2D2E9F4645BA34F0964D33779271C404069\ 5C6731856B1EC8:\ E44A9B4784E90B955B5A9E05F478882F843C53D12F854315284BE36402E11150\ 3CDF2616E80CD6FDD182407377761D0FCAFDFFD8D6E5E105D0BEB94657323E73:\ D6945949050855C4894202F6ACCD95F2 47C896A11889EF1BA5C4ECFF32A523C86D821315EBD7E37BDA73DC3AF9C449B0\ 642069C7D05B69ACEE58BCB497A5C96F5E2FAA5B9372CC6B9EB10296C20A39F8\ 81122D6CBE8F19ECF8B1A780E4D7704B5E5D583A52AC8948DEE8C4FDBAE8BFB6\ B8E1F12598A6A20D:\ 680D5A4E363607CEE46E42213DF6DE86E26158D859783ACED21287804301F12D\ B0BAA81D676E191152505BFF53D59CD2090D90C2BD9B2738A3390418473D4CF2\ A488D581A8D9266D4B41A156CC66DE07E068A11E830488F57B851CDBC1CACECD\ 3A710FBDF6525DA7:\ C15048C76201023234EDD517AC8DC1515940E81F54AEA2E6DF9420AEA5562AAC\ BE234AF2DEDF5A7A1101C549E4FC2B70D4C801366527B7B0F48A0BD57DF684D4:\ BCBCBFB73EFDCDCBF6E80D87C016A1B2 C8D2F64D6B9023E92BE952ABDBCC0C79EDBF1D126F5FF82DD2AAD907DDD9FBDE\ 65B074E0B1EA8ECE18A03ED154CC96CAF9DB7933ED4A1650331EA6EECC626123\ 85F2160F4CF857AA2D5B4471AF7C8E5EDEA758274BE1FE9777A33052FFAA5776\ 9093EC81D4766B9477:\ 50E9BAC4C87E3FB5759414ADFFDD25C63933ADCF340F4D6CD5A3B0D6742F5CA0\ BC2FB7EA920AC08AA97F30CA61AF90F953ADC3414CC6EEBD98133BA3A6D94418\ 8E9D05EA0B697CC3404666B84B8B33FE504E29B85DF7FA135ABC9B3851714FD0\ DCD86288F92A860FBB:\ 0BB0A123AD0774528795D29898837D54A8B945AA48B1DAA4EA3DD786DB62396C\ 2E6E2D7359E405FF09E917CADC15403F4928221BAC56CD4C94D3E2F25D7B1C52:\ 67D9D8BF8169D9B3B745A9C46A51CCE7 45D2DC013F863D5B2D57D7166C17E0C1771348078ED3AA5A15F4E814E90AB991\ 68480B8FC97C249A0AC3A842EEE370F45E54C8C08978EA5E7D230B5B02C3B4EB\ 0985C870FC230DFD01C83D354D89C65AD570D21D7BCCAEFE43DDF6BED05AD7C7\ 1E1C869FB7713A8FBE84:\ F21C902C29308BC5DDD124A42710F70215B6E03C6634E07CF4F95278841449C2\ E73BF59327AAD0243BB755D779BCF6D4BF1C5BEB593E5E3B56BBAA84B88392E9\ 00376059778924E48E1BF39FEDF5DCB39CB8D53DE75CE5074759E4EE316799C5\ 2C51D18A7BA86B5FF5F8:\ DF5E8AA90F636AB694DEAFD9B2949DBF7E7F5B854D25AAB5848DB5AC79998DBB\ 99928D9D298FF690488E068C3A8DA51FB7B97282642694AC82C986D1FFA26013:\ 081F7DBBBE9EE22219F63B7E743783BD 6BD7FAE104EE4AE74CE307BF57AE731C5AC99B399108F7F1FF1796DE8BA7FAC5\ 8BE8B29EB437B5E37FC64CB1689EC59737BCAE61A321876A8B14A58DFD5F0BFA\ 6C57D48A32FA0D4066408C8214ED7270D75E663D24AE1FD2284AB97645E0F5E7\ BFD2B15CBA29E7567F95C3:\ B6518039478C333FE12E5938C3154995E21036FE602FB19B542327542D90A334\ E4AE5AAF242143B3E386F6CD16A865CD8E3B3D11C4F788268FCF8302D17D3C37\ 8D8EFA3E3A10E587478407CF3CB12C9C31B1CB8EAE169EF5EC0681624E755FEC\ 060ECC6D9BDD6FE577D1D5:\ 78B8E0290AA9957732C79F0699E027D9747132D1D3AADAF5915685CBA3183E3B\ 4B365BCFB8920058C1ED22FB475AC2D36720365D76DECFD0E5F2129B68E8B9DF:\ 9604CF4D052CCAD5C9F39CD2FDF4449E 9F79D9E56BFE8C9B6A36D57370D1127A301C196AEA339F44075CF732AB496A41\ 2396041000811E02ACF8F8A4E3BFCDEB071BFF30F1018FB1BEABBF0C22B4D6B5\ A4C1ABEF21E0E901696564DD42AD12FA611F7681C98BB59915BE65ACEF7E0DB4\ 0A4C768EB6352D2D8DCBCD5A:\ 9109612F993779D809F5BA0D110AB6763547D657657E9AD49BA60CA3E22769CB\ DA5ABE73A541714D5FAE4576C310887679C981CE88AA7328862614B8D756B4C4\ 08D365BFABBC0302C18587BD5D4131B989D77C775281B4C3345049DBA721A614\ 76A814C6A56D6629308AA372:\ 60A2431CC82FBE4749CC173936028A44D4DAA914A5345715846FB4E102CB9AAB\ C9F606C56F0C61F22FC5755586BC28B559B65C04D73033379BC0ECCE2971466F:\ E2D8127E708B53A1E43FAC64C173D08A E3FB6DC979AB196164563724EF05C7B68A3196DA78B1405973027ADB273422C2\ 178297D8CFF3C961E12E2F1A74839A02CF734C888FDF56027EDF15F4C5F09EF7\ 35B5B4E4C82719917F53FEC5586C346609FA203445C160384DBA40434656CA22\ B504499CCEC3D02E081053044F:\ 3CFA718F9DF27CB9E4F58758D66608FC9802834718076468C531024B19F9105B\ 6E515E2ECB98FCB2BDF104D911B758AA92DA3AD5CA815BF595F59B5EF07DD07C\ 164246398F70F24CC6116BBBAFD646407144AA216851B9950C509F9CD0CC39C8\ 53EADC592223C647F5CC4971B3:\ 406238ADDDF5C0B4047320A0AE2159B2726C7172F5449E2712D5BA4D8B12490D\ 5CC05C078E4FD20E16F3560304170D1B416B9574D5D1A149CACA906B4A98DF17:\ D459AFF85AF06AFAFA1C637B3319C064 7C1768890833F7C25975F60B508EAF5E0E0C5A21854BF506AB71DDAAB963FEAB\ 16B8712C2DFF74E2262D8119494448CA15B153809C0A7049EE62CA2E940708C0\ 6BFCBC08D16AD286A024CB7B448C4C9EA3411293C34BC022DF1155F164A59652\ 3BAE1D36408184D329DEDDADDB20:\ 0F3126953B149457F23703B650AF15EB80B7BA6EF77E051E9D4478FC9E3B41F8\ 0564B8671919406C2969D5F56B03BE32C4BEB660E2BCA24A04B160D8B6283CEC\ 3AFEC54D9075671C4D5BCC58CF33BBB980DFC94A2947AE64146422121460A8A0\ EF1B83D1CA8819751BD5C8F1D0D4:\ 79C7EE3C15D46F95B3E6ABC29D9040EF853DE87B4AEB31EA47BF9F2D571F127E\ 34811F7DC7C016DF34F45884771D1E16E034F2572ABFE5033133249EAD23399B:\ 5AF457B616D400B197E1333745939EAE 1DB0E3C80F58750B51ABFCEA443A352298697B1F1B6E658EC0FBE03AB1365375\ 302266C7F25AFC177D59502408C1B48759B0DF21CBDAB3EA20A1B59F7AF9A186\ 432752639EA9B89D3B35A1AF0C10ECD70781583B86B3999F766A8D15C68063C3\ 6620E5AC2FFB9378360EBA25906410:\ 3335C951E4AB1A9A4A432BC7766E57AF65A4E6483EE3AC00650B0B77E96DA2C8\ A3BC6D8656265053820A71AA789D5F72E28AC6D53F534A3CE3A36C5D812CDDFE\ 7663FE72E58515A1D4390F24F68E549E5F0D83ED1DE16BFA36D819DD8C43D459\ 1DEB849B97AAB7B84F7529EF6D16F8:\ 9DB3F4D3C0FDD3711023C0381604C174DF54D5B258FF10D34C9E27A27571BFA9\ 2261C81013D39906A56D437EE32E1541C8FA54204CFC7777D79FFE7A910898E4:\ F34F5743C27986558CE1AEAE8300C654 317A8FB8293F59FA0A4BA82B30B6DF3BEED9A69E430E17F6773655ACCFD1033D\ 3ADAE04E159D22E1C8D946D188CBA6EB55C3D6AAA848A7F4DF2CA2C4E5BB4949\ A66D71AFD72F4729715B64A39E39B376E7D18C20D3CD05D5702D1811C1E9A2AE\ 9A1CD8E59A3A36EBCA17B5815B873A83:\ 8D591DD637680338D536B31F949FA9190DCBE8E07CA8EEC40AD1C16B54192CA3\ 5FAB45F40F473C4A9E12DE29AF827A71C62E6F1525EE55FC8968C3B6C16CD789\ B7EA938D7FFC214781983AACC68F634A927BC0BC9D95D5AC23261480826A0A5B\ 50ABB2F3482E947ECAE908404CA56589:\ 323AB39A5048DCCE476CD7035938C334D8F74AC40C091435E96C90694B310E06\ AC15D048E08A1E847961748DB07C24583A71C9029DBB92684C61CFEED792F95D:\ 86DA4590E89B99CE6A369EC0BD6CB8F4 FF30DFAA708EC407B616571B090FDFFEB04ACB99080F30FA98D6929D05F87D18\ A323A0DC749FDEA68C1F7927D399F89DAD0634684C6E8411CDA0A5F3B2302563\ 884C61AB605E7B3EC7B1FC0E18A018B9BF78E826E715DECC77B065F413C38823\ B7EE7F5EBA47CB8A33DE68807380A0F2F0:\ 5179B345B442BF36758CA8B750F54509844644DE3D7955EF2E2D03BB105B1F82\ 2B44F9068E1A846DCFB82A0D598C5B2C38EC9B7442DD80D762215FEB68772031\ 39CF65051D59F20164582152638CEF22FD567FAE7A5ECD7B5105F72C87F2359D\ 7648FC45A4D7176D48E53C24E2031BBB22:\ FBCE17D3C543B60D7C1E3D2212D067DD4FC6B45B5E8E401040549603D295781E\ EA8489FCF1C1F02EC9685A759A45AA65292627677B92A56FCF516C65AEB9E1CE:\ B7F5698EAC7866298C4BA0F2C8BDCE57 15A9032CB7FBA4C1B48C84FA108110DE0EDC32DC9A1752A86E0B15A38D700F8D\ 93E830D2B99C15DF1DF2BDBB59919C707D6A6AF9FD8B21A26D37A7AC802A6E0D\ 64BC2FC31DDCF72DC0E35CBF938EA1CBDCC12D3BFAD466DAD85B8405DABF0338\ 8992132CA3041FF2B384D7DD4CE8BC81621D:\ 0EFF57A8DC3FF960F183DC5569EFBF1693FEF4070EA59931051B4DA72D927F03\ 7CD6FC06D92AF8EB4648A408F84FEB00D531DC1C6C954A22868B8AA031E892C8\ 4619F4175C123A710E398B3E7B79A11BAF081BA91A640964F5DF985EA6BC313C\ BD78F693D0F5B1F0C6F9AC9E5379FF2B53E5:\ 8760C0BEC871D986D5264761A6B28C9CE63C7CABDF795766CDFB6B75200228E1\ 08FC0BD09CB17663CC526F82237916E1D3794AD80F722D504F7472AC4F3D0E72:\ A3DD31032D9179F26895FC472F82F7E8 2FA5D0A789720901C0F476243A1C07319DF83F6F06A5CAB05301A16D88716517\ D8C9D11D806206F3A7E8827D1080DD327756B729D8EDBD42F6AAB210C05ABF63\ CF8DEB54AC55DB63B2C0A21C9EF992FE86A92832AA5452AC1E4033A54E3BBBAF\ D0CBC4362765B4527E459DEC09EE91A4FDB520:\ 9CF0FAC9D487BD7827D39A2C56D2691E9394E0F025DAD286EE701E5E83AA19DE\ 60090B03E01F0C445C3E0BA07D7898360E38C36D604178740C1205A837BCA0CE\ DD86174B9DB0D451A6FBCF1B13A553F26F266D4957716DFFE2E28B9ADE18B42E\ B3BD916B53208A43785BA9693561E6B68FEB80:\ 729638847E01B827CF51D79D1EB4A8DD5EC63641D24F38797BF0E9E91A42917E\ FFD9CC62C3A8A3FE63A8D81A78DFAC280228AE204F670A13BE16A1B6E0334057:\ 14F8241C1A247FA7BC2865447AD9C18B 09DEF4771CABD879DF77FE475D63B475EA4949BC6B5E0055F6FC48454A81235F\ DE3A6E089D8CD84453A3BEDA6172D383DE7B1B47C8C20EFE50FB123CE9A55DB3\ 762393FE9CA10E0B81FD7D1FBCC3C5BB02F32A7B337A9A36AE70DEF8FEEA3ED6\ 64DC4C5DED0C47EC04C618229E90BEED92E51B30:\ C459AA9069A7AD5126FDE41DBF86426FC5B06162ACE4D5BBCC0F88D183E55721\ 4D1C49CEAB56165F7CF6ADB0101C046304D0FCD41E70372383FC4B644D1F1E8D\ 0FE11C3792B22A70A2A12B6268A8F8D6FC611A4D84E9398E721AA15B5E398355\ 8ADC0F8DAB489424F7D93FE3F9CA2FD2CBAFEB71:\ E96807377B3A102610CE11861E807773EE32679CC517B18D50DC19DE2775C855\ 9C2B42E43CB3CE6DBD3D3930DF148546E96483C5278234648841E19C31C7BE2E:\ EB0834AC818F6CDF583C883221A2680D 1CFF92B0C9F1ECCEC02F951447594DBC2D0649C4D927DF1ED39E125C03442679\ 3FB06B68B3C9EBFD266B0675A69A349179C636E70367A9D019E5A4FF64490F00\ 2485299C9426A07A18AD8AF1A25C7A60F9D0DBE6EA5962749299EF8876A0ADE1\ EE700FBDA4268A8F0839134F8F5D9EE4FB93CFBCE6:\ 5131D396288281111C97991E2C9C1BC4DE3A4705AABC0623122B7AE250030C9D\ A7C7F5441F2CD7CB5525BB21CA8439F1B919525A70B3CF659ED2760E8617CF47\ 7B71D40D8889C427752F3BB0214B1E916072D6AAC5769C08B32173D619D96210\ 752A624FE0F4A6C072A0E492CB4F3C4059F58ED534:\ BEAA26F0B3AC4C0F4DFEEA5C3DF56A781AD2D37368C922BD5BB46D6FE532D824\ 83B721CEBE2602EEE6C0BFA6E8E91E5D6D48AE9A7A751B007D6DE9D927E9A4E1:\ 89F5F4272A6D04DB82F05F5BCA5E0448 C710F38527A635C3D0415F9A7106E43EE16BAA883B75009CA682B4A75185EA2A\ 65A9C64E43297CF406407AAF64D5FFDCBF115E9DCB8A941CD0D06F2A2ADF2013\ 043704F208595E9E5A1AC0C7A03404C9541B1B2C5EF7E6808E51DB8B8F4AE156\ E268DCC47BAEF9F1BE83B32A62104ED0239FF29C98FF:\ 7A160D8D41CC3E14BC0F3961D18D0E6B3665ECF28378596259BF8C9A92C0A150\ C2016C1FB28A87ED460778B9110117B1BF6DEDE35219307602463E9D7968E2F6\ 590F521006BBD6634FB0717176DCDBF3E7A77BD81671E8FEC705208A3F284464\ 41F13C8D438C5194CBA3E1931B81BE2F1DD3A9DAA097:\ 3BB9B9AAAE7B0F7A9C1FE00ADA5595BEFE4E7EE612FA97D4BE21859A64DF9BDB\ 75311701828FF1A6EDEFBF876CDCEE87297AB3F27A58BA3FC4807FAF1F7A0AEF:\ FEF2159226251D571991E2ED70B4966A 84A5E384DD70B8012D51F4A2CC8E5BCBFAB6A8C18E0FC4FFAA07298EFB07656D\ E4224B3416ED9FA9E6D443B8693573D8FBA648DEC0D789171384010A0558877A\ 8CA3C576F940FFC2B911642ACB8AC866EE4228969FAE97ACF99FDBD9A762E7E2\ C25BF4F5892563A1B584DB71DE49A5974EE5DC52FD88D6:\ 6256C709BDC87DB68F9353854CF2C95BB7152CC911A78BE75C172D2E87666F70\ 357E16D8B2AD0E0D428CE3F16DFC42AD958DFE8AFE21A4B7A282F9385523BC3B\ AEEACA2D64C6249377744473AB16A098E161CB1E4E3930AEBC5EBE31C2A306FE\ 527D3A0DEC4AD307D7947C24B4D7CBB423673D04D1D6C7:\ A1B17A739ECA52E0F1373D92CD876186C3C9A0A65DC7574E195845E342591F0A\ EBE73E987A7EADED8B3FF5E8C5226BB3C4BA0677770AE4CA5B56511E4819A62A:\ 0FC28C8195B2923FE28432CF934C32EE 720016F52B0036448C8026444D1425D81F7FEE2D97456E852AFC1E768362C18D\ B228FA9D40E6D15D358A77C7AD519D07E706F51DBFE46A6BE5F57E55FF7AB295\ 833B4A0F44F2DFD2495CEEB9B43DBB75CD15EA4F094B9434F8F5810C2FE42C74\ 7E2E04CC4474A8AF6B2EAF9BB23A2C7181B4298AFC2FC0F9:\ F2C052DB50B1B8745E1718F227EE875A1A5966C5A0CAA14F601C7388F2B6DB94\ 75254ACB3887AC2AC8ADF00A7A2076119E6CB8E118E4D237E183A658F08175B3\ 3E8BB63F85996750E1BE6619EDCA78BF14A5D12FBB278F46240ED743D4C1B0E2\ DD6CC83C31436D208440D670AD073596229455EF95BB7012:\ 5A18D56D9168739F8A1B5727EC39775C99BE86E5A654680AE5A857CBFAE5E3C0\ 8B5095C01DBEF36FD628726829E08B301E3E2D0C942A9A6DCDC03C499D311432:\ 33CB2931CCFD7DF8DFA2814C9D0726C7 2E10C2BC220F1B4DBB95B9475F9353BDD8A8335540CC087CFE0C46860DCF6004\ 082A0C739D97A6F7781270A9194FC3F175B9B2857D06E3CB344D0C87E019BB2A\ D70A366E868C251C165CE92F81BA7278E8584D4A4B34F9FF1EAA81D9827606C1\ 6F69CDA3867EE312EFBBEF386563A9C4C9CA11433D5EBE33DA:\ 5F73434D90D624484D09E2996BB7904A542917EBEEC334B69964C1F6E9ED6B7B\ 19455442D24180F6BCD54C023C479A8877CD8CA8937933D4EFD08A4A4B5B1189\ 426E2D00DE0DE249DB84191B70AF7043E1CC80E029BFB1FFCC53C1EF95CDCF0F\ 9A1F52A7C03E7283BA90FFD8D2E218E84C6B25ADE197CA48A8:\ 94689BBC5F14EA5C80672BB6AFB1661A5881AB0C9BC32306A292D289565CC22C\ 1B9BAC2B701113B003353803919ED19776B6407AF96147147EDF4307FF5E849B:\ DE8A8E19A7E125F7B7EE60179D40703B EECD851851F5574F0C611C0E4AE716297E60D708785D2AA1272FA92949780D98\ 4317DFA38DB5C3F828F87BB93C02BE70C954738B6A2E76E1D7B37A7BBF1D0C20\ 728697946BF89BB0FFDA9AF5002EFEC8097E6138EDD278F94416D53D50E4EF33\ 856D732F0AF03F0B138174A5709E16BE736CB1ECA94A1137D7B9:\ 7A20D1FE8DEEBBE1E2B964AC46641D41BD19D15D29BB170900EDD35B0FA22BA5\ 309F7CB560F9AAF9DC98C230F68CD611A988E4B1F1E2F1B96AB6680C357011A4\ 38AADA89098E66F933C0E856CDB84EB4C06A07579575665C8C9C2C1C727B50D4\ B894898A2657C8BBFBA1FDFD2D26D2D4A82EBE7340E5B110581B:\ CAB4BF39AD1DD889CE0844FDDA2FF214E0E8B0B8F673680C664ED888593612FB\ BE6B51A864B73273BC3EE2FBA5157286E2F9C517162D9F339D7E5316E364E00A:\ 1320B913AF0150B0CACF7BB5C65C512E D22FD6F61C04CAE2598AEEF105AD5A14C21CC91DA1040AC37094BEC60E3EB206\ FEFD87E633044B119504B7BBA8AD24914D8176F412B6BC57F23021E24801977D\ 422DDFBE4DBA1786769059AFE712D9EDD99EEDB9B0237E78322058B27AD87758\ 914F880E42D8BA8A20AD984194741D8B380A4F2962ABA705EC6AF2:\ 2B1EF2D69B20A1063134D50CC73CBEA83F088A673D3B226746DAABF3F3E91BA9\ AEF39BEACE531D1EC8F1688BACBBEC8C4D834BCC6D74EC15414F0C132D5F2BD0\ 5956A5319BEEDC3914F2459F50B07E6800278F7C335B3A19969FC47BF6ED2156\ 3D3A661F94EF4BED66EE582B196FE89E53B61076EF22C3E1EDE28C:\ 1DDF54C1F674BC63FC6CD4FD1212D4C510EA5643535B4866A63B9C3E4A3EEF61\ 10F2D94D27BC4A2BFBC960FEF6AB70FD131EB7DA2188473C38D9A6EB2BC96144:\ 0572477DD9BE3815B9E8F971A5C490CC 86D500F74EA0A80FB65568F13FECA00EDA0F7C8052E4034C16E3D00798390FEA\ 9C04C5D9FED291FA1CABF37403B56EC770FA22F8742C79A63FA5C4F95E60970F\ 853050AC8567F3DFEDE8F7F9972FA258E74F0E72D626EDE641FC1EDBE7F8F09E\ 9D5E860732515EE69DE6F143777EE4F8A720A8531BBBBDF63DE98F6D:\ 54A50333EFF671BF4EA8EEEA0AF5E2F2E31266D04EB8DC93E6C82C287BEE00B5\ 65CD4A225142023A330314C90F952F8383C063138F9B503495435B74F574048B\ 9CF70F5AFB0F59EED85E6240A6989E5BAF9E35799699ACE70B29DC17BFC00E49\ C29DD2D279EACAC0EB0B2F5A28C72010CDA6CD0202C7A8C816FC4900:\ BD67D7C131B84E855A78DAB2065D4E9D929C2B6D6F95CA24C024B1345EC9FEF0\ BBDC0421EB20BE6CB572B49F30E2AEF9DD3DED71D45D7272F02909782DD0D5FE:\ 2226118F51D8D3C6D4188CB5498C0A93 B4C0A353E4271B7EA7C6AE5160D703AB5C7AD5B0B51EBB293BD8A91E4F18768A\ 8380F6F361CC20ED27347CF549EF588284DDC96F0CD049142D0EF5C4E4E19F7D\ 9A8593DCE28D63990C6DBC664E3B805241B6BA5E9ED21B5CEAC1D5F7CD083A18\ 56AF03825E4420EEF8CF2DB0E3DE0BCE24CAE2656035312922D37AF0D1:\ 10E505734CFBCE50EB1C237A8D245E5206F69F514F4D6EB004BB09AE26534037\ FEF36FE56168870A3182C98068A60DDC7D6BE7E2B51134868983CE1573CC582B\ B354B68335818B336A5ABDA451ED7098B0C37030DE1839B6E0B0A8BAAD2B34E9\ E87F472C6280C96D2EB1026B87DC34D46FCB08C2FC8F00B723F98C7AEB:\ 55AF3DD97B4176087A4093D9303ECF1763B4CF996543DE956C6BB41E6CC49BB3\ BF434ABDE0175194E0EA8500FD601E2F6613C69546C1CCFBE0FB0531E81A7665:\ 6B223E75C4E21A9921E4CE04250C2EC1 27E952A8346D71E68AB76C66B8F0914ACE2E47FA6BE0D33D9FDCEDBB3AB21D6F\ D68B9C3A6819226EF8714143AD9372FD1CED15DDD4B00E469921BBC1CAA84CD4\ 72B392BCFE6A72145F4767259A31A1C26012A0F185BA27567FE9534939BCADB8\ 518B5D46AD99BEBCEF0A8D6D3C05C38C72CC19F69910EBD35F3014891B34:\ D15B7A804E64A8E1A9A095CAF6F599B8E41EF38C1A8290A2E00CBBF77157F445\ 77BE30B5AEE3EB26AABFB3A4D5DC3918742CB1DF19730FEAE589FC0D1755A2B0\ 636AEBE89EA454A7C7F91B631A84B49285F8AF0230BB186E1D812BE507EDF298\ D26C8AA0C91C9857C9B8B44DFBDBEFC0E0D46624C8752DF2E3916A197E41:\ 80775DF24AA36DBC46F1220F0275217855B661A0C2574DA0EC1084AFF70C6F60\ 0508962700B50E79384C9C57C802CC8E69F0EE8F79B85982F99869255DDC81F2:\ 300DE070DC5DF16220D455AB95733CB4 C6CF174AADF9C16C7246928C7EDF00716297490F6A8F774E113B2EB9E0E1231D\ 2AC1A8C2000670DE9A27774AFEE98263E8CB31AD36270250ACA8E469E7A4E29A\ 2B33E22584B86AD3142B363B7D3AF1A40037FB14FC732ADAABB714D5CB27B4A9\ EFA76DCA9ECBE4E06D644C03D075DA780E1EAF490C7EA36119E7134A118CB5:\ BFE9123F44F649C212AFE38E0FA2884642EF2485B201ED153566645AE5330865\ 84CEAFC25241ECF6314DC0CB5F01D90A1DB9B2925B2FAF760D7D97E706C9714C\ 1347E8846DA2AB1BC4C4DCE9FF82DE3F11B908B1BBA8DE85B465663666D7C6CF\ 1583C8C39EA1CEE09B2680AB34DB00E093DBBF0066BAC8FBAA681F154AC722:\ 0BEB99D723ED26167BACFE5518C9D6276EEDD0A1F3438222B85A2916A4990551\ 63424C33980656B538847A9EC96B878D81DEC0733390C05447910869EE352C62:\ 15B89AB5313B4107E1BEA5AD2C09D23C D6BC799005A3D13522949BD71C098C87EC666D6B9D66585D5C6BFAECBE780252\ CA47EBAFCCC2B19DA4E57FAEC294164C02347547DD1A45C9F1810BAFF44215BF\ 0774F1A1719C2113DDC2D41271C2FAA33AF962310989B2AB2596C8B8A367B862\ FE6A43C67039F801467D20D1C69747574772C047DE78D2B23491856DCBF05CA9:\ 075BCA387DB963F8CC2113A4CCE7D5E4F1452BED6E1093E8C361C0C23D5B8587\ BAE4DE1D6492782EE04F54BCD8A801AE87BBD5E0BA24CC28A9F2D8EC34D2BB5F\ 923F6A6E49508D4A6B582225949E298F3195283657AE5A6D2CFCCCCB660ABD54\ C41AA07C11F36FF2CCBAFF6003324B57B1535547967EFE8BA1497B03DDACDDE8:\ F9B94B4310C487F2EEB936F17717F625557932378E20B920A652A6CE905EEB48\ 58602726778968215E027BF0EBD36903379880379F000A555B621F1B0275AF5C:\ C49CBF53E23776269C32C673C8392452 182C51D23A0D8AA74CA0D8F16464F428CD13DB264D854E2B8ED0EBDFEBBC7813\ 3CA32DE826645B3176EBA1B64019FD6F925316223BFB840AF2F9A63C829D6439\ 1E4EC11A8B78A1031B98ACB8E71CAFF35A394A728585C7A7459E6926BA237EA3\ E64D295B4ECCE9FB99A9422212BB25B16E7E97FC18C015DBFDC3D26FAD5BA363\ D6:\ 779A228D0653CA8405C2899C8371320353148114E2A0AE63BF262898AE21543D\ 15AE056A261992EDE7B3DA66DC2C8173D8FF06E1E2CC1CB2595C9FEF7574B97F\ F8AE285D14C3C12CAE52034FBB8BEF5EE8089B280CDF420C5FC495C381142E1F\ CBBDC9A81B082BCC17BC1C1102F2CA4FC20332447D636A11861BA550008F937E\ E0:\ AD2157D6E48794036F6B5AB706B220A96E11EA90BBA3C4D7ACF22B3BD2724D1F\ 733281F116AF23F476C73934B40A3B88F04D84BD881B663B4A9771418C6C0E4A:\ 1736850EBD663E8B15AC58BECBB27E03 40D8A3A75170592E5F529D29DA9006236D25CAF47291E0E6443D08CC819B9A5C\ 9151AD94413AE1CBF17B0A2C8EFEA76D5419054359A918BE23ED147DBA75E5A1\ 727AF567547E158296DD1817C4CB43CC02D87B6B62DA6A5A6192CD785D9A6A61\ 0C0D6869BF3506D63239A847371503D47F8DDC0C67B5482AE5D216B5FA30B352\ D84D:\ 2B58636BBEBA1F3A83417E58A47D23B673B6CB12D0175905145BD7D2C725C5DE\ DE5ADBC824755A19E2C177379CBC4DD4BF36F82057B5D5E6B3498B25C53E9DD7\ BA154D74C7DE64A5D32B2DC774A9A003CD39193E7CD9E102316ECAC0FC5E45E7\ D6751EC02EC409D1C062D8E32F6BE88DF4F1000BEAED42156D4458BBC03E4827\ D96C:\ 2909E3C1DF3EBC1B4E2FE43346F62C3DBC401B4E95162244F9DBBF240C57A68F\ 8F6ACFACBD5F820A6FB7F88513E0F1FFF834D7EDF8B0A26CD360DBF805AC534B:\ 8E98DEA30C4597212A3377147F191C5C CDDD69036E9320BF1FF4E752E745E763FB470042A4F93AAE641B57D0CE100068\ D2466302BC9D570DCD0FC88749EAF5AA0F35035FA0F5D04C69ED92B5447DD8DE\ 1C7B28D17D7BC9D1EFCCF05B02ECFF320FDF4836BDABF5DC572D34E65E4F0620\ D26F540FC1123FA05F9EF432A87ACE2B2BE0A6A5EF6BB01401E8DDA43CB12B11\ 03D896:\ BEFB4A3CEF539E0F5F15A2AC5594532E989F23AD63FB57DCBADC5697844064FA\ 94468A536AE43F487A2748F4A9281ED8C9CA72044CE809F799FD2EE3800D985B\ 111731A3F2E0DC15F3233187D1180FF502B131CA68ADA0347429325BF544F831\ ED55D71D97A04B2ED3FDDF0214E570438EDA57558D7E22FFAAC630765A06D8D7\ 1F7760:\ 39F6E1C959EDDE1EC583CA985D981BADE2D796022ED1028FED4B7C6DC5CF5B73\ F8B70B763702D55FDBF688389103155F18FF8F85EF0E86AE63F0C3CB4EAA464C:\ 077CF8F2FF97C558EE3C318A9781278C 02AD0C442AC4B1CE3B4783981E9572A083B63C5A9625EDF48EB6D4C2048050EC\ B02B3698F412888F4293CFB0B0F55BAA04D419C6CF8A5F35FE976FEE9D6A9080\ 34A77905F6B53335378FB518650B6B36612B323A197F7377D83FEC7A4A95D0C6\ 7BDB434822C1663D5998B16D85F4C9E075677720B01861D8009221E2CFDA7B24\ 6DE410F3:\ A669D100570041BB5BA11723FED861B69451DAB7500C988E0E504624067DE27D\ 51872A19FC51E9EC3A022A735E5C7996FBD29F9B39B3364747CBD650FC812D7B\ 4AA581BA0E9D15E9B21238C1EDFBCECEE5FD7928BDF3864D78174DAD89CE113D\ 562F0EA33D0CDE8980B199E256A475900538AB46FB15B93D209EF1784E3030D9\ B4DAB2C4:\ B16B1D3CCCD67AB6F037052074874D04ACA71A70577DD9472DF03E78E6BE8039\ 9CBE59253E641A1AB0FAD3A61368358C27814AC32EC5939C921740ED451CC0ED:\ 079D85811EA541E3F7369E6642C88AFE 8B03C8D1EB03D2EEC494B65E3529ECDB72325F444BC41721EC67B01AF957E3A9\ 7EFE3C39428281B87703E8C30CA13C7B1BFC1E0D72EA585BAA5FA68FA232C8AF\ E3960A19C0898751AB390CFDF50F1C326204728C007EB185034B5272176C2DE0\ 978FE10C42F4F876BD089C9DC9C25E7BDA88316F817C0DE46AB2F5FDDA0AF1BD\ 2B8595D14E:\ F498A04B9EF5E1C39F23AFD77F46856789EC50140464EC61D17538B52B412887\ 7C7B4BBFAC4A266B9EA396217A101C0A5781231385BAFF5C2B1E5C7500F0D825\ 732E94076A3EDB87DFCF6EE7E80AD89B6EFA1D2C142275AD7221E854E0B2BFE1\ D661D357771DAE907EAB1BBB12F8CB3D9EC89E272F1774AFC75C6C6DE644B96A\ 8D5595A73C:\ 95A709AAA5982FD83517E032283ECF090BA772A2185D5C5A189689510E4D70F3\ A4404E5A306259D68B4B6681B87E11F66F957DB31338EA8F61F4ED011DD80D28:\ 226A19FCD9AD661782BDFDAF94FB5CC5 904B084BFE1FCB161DD58ABCE8F857CEE874367121254A67EFAA72AC623F36E4\ CCAD0977C2EE32B7BD41A1DAB344F704C353D6B7C3351B346A36A58715B79AED\ B0554AC0B7FF5307B8E34393FD8034B9A3E386378F7F063323F052A839000807\ 7D38715CD26961165D02DFFEF6D7B23172FCE4E23CC4F39A2027409627947AEE\ 5016AF5C16AA:\ DCFD7373BD77266A8C41040933BA345780946A5537DA0639D5B677E40AFBF456\ EFD2785AD674B72AF8768A543F7BCB3960B010664617292D1A511FBF755DBD1D\ C478486597901C075562503C5B328A29EB23D660B322A05DC5F76F8883F0700D\ 4C076DE1AD6836B7C03D8779102C5CB27BCB0416B25E94D689D1E04C7F66DB90\ CC20711493E8:\ A5FD0026C475221DB0B8175CB815B8EDC392B6A5A03BEF4F8A393EAB80905615\ 899DF15F554BED14576AFFE5A0850AE74AD5397687D6F0A36C68B6ED99208CC9:\ D1938E9D13383D62411606CE3F7816A8 84E9BF42B31E381616233DE5165D54D813494600BC222162652DA83E0559A779\ 230F796B47B64AE6501063A95F0D3579FA170C8D59821EE746E3134E1262EBA9\ 23BAA0CFB806FA8AE933637ED9255853484DD007C4F2685020CF3C8AEEC2F461\ 9ED535F889F41F5B7104A6BFDB027EB58FB55CAA6828FE01D4F24D20A4B36D96\ F96C50D5C4D5CA:\ F1E7F0B33CEB81B200BFC509B849209D21127B10BD1390D87D45C28B949DE7E3\ 66027E4C14FF2E751B83078721A715D778FC298C817BB1EC3A96318F777867F8\ 304040A847990954C4397042C339557E9E9A484997A509A14F8E997459B3C7F2\ 7C8DCB8E017A69170704F564BC439CC08B18335280A2977DE8AAECEFFDE1DC59\ 19C86E11FFE565:\ 92CAAD32FEA3E17CA96F329B229B9412367B80AB903486FD61B593B52C5AD603\ D257406165824BCB1DE7E45CCA2D3444EB4E6474AFFF6A1BC0D4885C2FA80E8C:\ C0568E6A3DD0FE7E63FCB742A68257A2 3D9B6016E7DF175BC319CA6D06772E7D7A1BB39FBA8E6ADACE88D624E8C103A1\ 2A6DE705CCBADF7F92D86355764B72F1EC67215719A4B81166B83F183D8BEC1C\ 982D6468ED8A106070847B16763F210796459FC0BDF413E4619F41ABE20BB019\ C2337C14F5DCCF56DA8D9A46FCADEFD5727A636F6C632810420AF0224ACF482F\ D84CE859A9C4FA0B:\ 05B529C9354BF3855210936EF156484D35681FA23BE1D71A383C01D83300A263\ DD1B269A92434985C1B8A65DB6FC79FD4772204818BA69408D7426E51B7F74D5\ 9FA5F425FEF5A2162C1C6D7D522CED9927C8D7163DA1F8155C1256F62BCE367E\ C2584B9F367EF0ABE392FB8A70CB4251639E64E919B9A6578C211C1E2F58839A\ 0E1F46B64F35B77F:\ 23AD41F1D24AF8A060F8D921772B5F4F5A9E3283F90454D1368B9CF9973A9D34\ CBA431072FBA74BB034601B5459EDFF1501E1BD1683ADCCCAD84C0F893991371:\ E369152C812F3E4BEC0EB846D1C97CEC E8ACB643B23EB6C7EE66DCF988DCB94CAE68CA5DABB5EE5C03D0D747EB59EFE2\ A3543C3DD25663274A135574F4EB374AA78E65361CB6E80CEB0DBC247B2073C6\ BD5E9BE3670900F637F14B0E38B1162BDECE9C44059CC057274B2A8E39E42D71\ C8249186015C142B4D3C1DE2334DF2EC2385AEF8B88F19D98D4A0FC34899DB3B\ 144F420ED6E831AD73:\ E0F85816367A2719C991A40B0DC318250B73DBC585CCC7CFB9332CA84F453AF7\ 9DB65A4D026BF686061F304BE2350AD8EA0F1567D5695C35934293861C593E2B\ 78271C6EBA51FA849F6A8C2F3023751A2DD87E76B7FFFE5E9C01E1477CA17B95\ FA04CD5477EF726020979AF84C6A75DEE16B2364140AEF0A76405B3B550CF7CC\ 576D22D0F81575514F:\ 1F3605C8060DB8AD0A2BD01F086F5D487774D5B27D14D3DC2FDDA54A008A19D2\ F52F5F57F7BF58D0212677EAC5D08471054F5C6DA320DD8660145F6C385E9007:\ 6248FFC00CE886E8F822D5D2770C3FBB FFB0184DEF25C574183824DDA2A8CEA0134B7B5053FD57EE11D8BFA11E88628E\ D765067187302B236B2D291CD2289E48B4FD6F16231C8A7DA0DD2E5E81FA9661\ 4B1327B991464DFF07C2FDDD97AA991CBE54EE17FBDD848F54F3FACE67EC72DD\ 880F5083B36CDBA177C157B46B681B4562CC6DEBB5EC5B35696F73CD1408EFE1\ C02D677A797BA647C9D5:\ E27D79EE294E42D8D7DEB91C43ED5C09D09BF7EB809CC0EECFEF8CB7396009F5\ F6776A4E1379DDC094274AAFDE774774CC39499A0CA3F9FA597F205D3C361393\ C564B7B24AD222BA91B8B907BB799859F3CFC0AEB7359346636AFA8081C502E9\ 911750CA924E7013691750D9FA6AEF4E273C03CE6EF3881630416A19537938D0\ E0A2A0BBF5BBB1FFB8E3:\ ED622D1037B91823A2312B1C9E815D30F3655FF083328C87C03987F34C91F572\ C7FCD7F980FF22D5B6C6DD28F0AD1AC78CD65C4F18F01CDA6FF29A50244ED205:\ 15D2A6884E9C6F89EAF99C11DE5AEE9B 24780C445108DE3264EAD2EBB2FF3CD875A69BF7D09C4DDE186E92DB5C607039\ 2646E997029BA4634EB9931B324423FB99B5EB177C7D012687D55791F8911F79\ 38EBAD323A039D9380C6D80FACDC28929D3DF83D48E068E633F74E084EA7F412\ 6477A7D9E17B1DB7D4877F3EC87E649BC471171D077DFC329B4FC25F349000B0\ B76543907FAA19DD5776E8:\ AD6985267114929F81143F1A9A97D893651C42C93A074E487E6B9476C9A1B950\ D547243A152BD8CCF67154A4F5B080064B8FBD4D12AFE4B2649FEF167872BEA3\ 2E2AC2DEACA86122581245D7AEA354A03ADCC177546191E9AAE76A98698E5DC4\ 318D62F38362C7756A957E52F090D1E5526DA1FE771CE7D40C1AC9F7B0CE5443\ 96CBFD946DBCC3EEAABD5B:\ FBF092E79DF6B472B940518F18C817C492AA5416B7498050F7E6590C337EB7ED\ A3BD14A69260DE6E07033C8298B49DBC02C3867CF62D7BB9D470DB5EFBD4C2C5:\ F1D54E3C09F2C0B350DDD3A99D953F99 631F8402A8A2F2A3037DCCC23A19B986A9A0FE342827942BFFDCD16887307D1A\ 236C76F62CF40B46B7C140123DEF9413BD0CB1439A7ED758FCAB8CCBB333D1B8\ 52EF9EC7C980F6D77DB9DFA91652E6BF6F22C2322157DF6B5A4ECE266998244A\ 7F69C9DE9CE4581A9FEA6033C8F73BC212966A7F0943A49BE2427B95C19CDFF1\ FB6BA398AF708D0AE89AD8EA:\ 5CDFFFCD4B81042BE4FD2A861D74C8F2D1BC65D73733EF73DB9F0297DBF8D6E3\ 4383584094D283A4AADA1A28E4078B43E540DDEBA3299CDF2C6A51EFC01D9DB6\ C4130644250AA7E4288E01AC4CC2784B83F8FFFF38434805A88B40140A310EB7\ 8AEFDE3FA66C62A2B026F69AA049202C9190EE247753D94BFF64F9D1280755AC\ 0406A37884B27DE673CB4637:\ 89AE5DBEE5261FBF22B3A7C50479B063441FAB45B652634D52D2C265926A7870\ 240D492A72A95E5972EFC22F019D0A9197975890C72C8170B09613C79F3AD31A:\ 4B4F456327C8A819E8F2A0B7EFD68E26 B6986DF10C1EF8C71B4C568EFECD0706A1605FA9F2A456808160C28A61F32846\ B4CCCC01A50F725D05C076F933A848BDCBBAA82426DE3AA81708087878894E78\ 7537BD1901047E3196E22513B9914D6A95DDAF00E5DA6C21DBF5629809F27C17\ 40E423B9DF6619B5CD71766274AF3FD3023BD912A5EF6454C9D5A8AA05A89111\ B4E8394F370F16AEFC085492C1:\ F6DC7A7AACBA454E0B2DF92D648553D645D3E0C880EB9497EE98A355A0F6807B\ 9221F4B3C6317F915E15A979C922C14FB90FD71DE3AE69F7CAFBA2968BCD9F1B\ 14787B0B0DB258F0B8C3E01C9E06E6EC26F0584848151D9EDA97391344290F5A\ F2051DCAC329CFCBF3E37A312BC4A7BE737308D0DB7AB9C83F243E1B37106A44\ 5F21982C586B72974C7A60E790:\ B184011092C983E517FEAD6F05456D2032752A09E344EC1C86A897053A2B1C99\ 6337F5CCD1A15651BACF199C2EE3DC2CA2BAD5F957B59EB56728D1FA30A4B433:\ 6289A58D101ED6C868BD1688C05E3EE9 EFC485127099D25D967C8E755D4F91B5B2554275BF8144A365FE6CD0F9CF159D\ 5FFC07BD75A5E37F6C7584DB6077754D6D2FC49F2BD26C6D1F665D2B3BB24DA8\ 49263384CB5D239EFB4AD4C643EA11DF1F0C65047651FCD967A4474BECF9FFED\ B1DD6ACBE55106AA20B5A0469BFB7027469FF0B790A7DFB57FD0EE9D05AE24E8\ 2B5F71E6033E8E66E700AD88254E:\ 8B1DD9F350FAEDBAB5BB77285D76EDAF6B38EC9F4D3FAAA9B7D13AE441F8EE37\ DE9D0938FE5CDCC69C7F459C9FED76004708929DF4176A6B2264CD61EC9F127B\ 0DFA7F553EC0BFAAF9C84290E83424E95B8FB047C982D65F3D5848CE5B5A94CC\ 5C7F25C28AA7B19755A4897B98877CCB34197494706680EEC4A1D5A324825A24\ 4C04AAA757C7FBE10C60B26E9C10:\ 43D7124E5CDEE7E1025F8D16C816222CD64E2631AE6540EBD4CA39BE8A4CF9ED\ 6BF822EEF3A49D9D46347420A43D70B2F4F65D8E6BDE53C229810475254F9BFE:\ 4D1253F5D8A3436AF1B74B6EAE1EE153 F777D4626BC8E1EC3F1B3D634111626E15344EEB5EC756B133C41D9723E76CC2\ 438E5BD74DF9150608B222F7CFA6F1F88D9D4A01F63D3129A22559C3C8787664\ A46D0785214BCB184D46735065CF36AC60CCD81B959846E25F89351493F65B4D\ C924E7D550A891EF67848534530B8C051A1D125C534D0722EBEB092D129A802C\ EE99782DD1E5B0E967CF103B116EF4:\ EB95671E50E7CE4E1F1D37619A36D4CA589454D636691AA79BACFA56A3B6783D\ 42847889B58F1114C0BD0300BF31377CE37E444B6EE36DD8C3DEE5DEE5C3F1C0\ 5E156D1AC335B6BD0B51139E38E2D920F875DC2C35DE113C84112787D4A6B6A6\ 484183DD03AF97877BF439A6B7020F8A00D370295B88A80B291779BD3B48D5A1\ 685C814B1E95898562A11BEF62396F:\ 117300A3FB6AE24E901354B0DE987354ADC49A0196F4A6C4F840623BC34841F9\ C34A5033B18CCBA4F74867DCF9F2E6B5BD1308A1F14EB9FC63F10649BE1140A7:\ 87A40D8CCED2C153978A307646B3430A 60F27163F6B6BB28A798B17B2359C2304349A54A3B87B50ABFD5D9B77E106D0F\ 483E483ECF6C28302900F2F4ECCB675174610117443F2FF392903F2BEEF8C0A6\ EE462454909913BD3614E8798D6EB0EAE943A73C214A95DC292F276551E9C4BE\ D6A3BE4B15090D48303BDE9B3AEC70915825F88800D400F216F6C941B557B5E8\ 73D03A551917F90B795AF234816CB91A:\ B869DE2DAE9D5B1D767D98ECBD9EAE4581984F1835733B49D1670E5724594F2B\ 67EB675B44493C0C7AA236F08667F2BF5CEAC40FC63BD4C3D51C4E7E26F45E0B\ D45062631823C821D7B20A1D3706F8D2AFFAB6BAD8F9423E93A1B9AAE04D0462\ 033F95295D124AF4854AEE9D71E5F7EAAA0465BDD9E1278F590B38AADB725D6D\ 0F00B3D9553FE4645EE6D377DCF65CB0:\ 5A47E45D3E72A2F0CC66EB574C9F01E081668625D8D1F2415053A3B9778B141E\ D3109DF96A5310F261C857709A7906BA78B2BE949071F440EFF88A9FD1F943D2:\ 801A180B177D6534970913222C592140 A78B5AE80E81F65CEA967D460E49681433539F2852262B89E92444293FCB01BF\ AA4D14371C17C3B16FFC55D60CAB17ED13105EBC584BA065F85377E6E6262405\ A890D62069DB359326BF71E739305EFFA2C2F42C39F2610105A3696F6C431178\ 679BEF02AC96F8A5D4B0E0C77D247DC5009C7E00036DCB4E8A555665F4D37304\ 2C645A87A0FD24CA273A4D1D20C82D4854:\ 7E6174D9FEE9347287DFA5AAF14A8AF5F3A78FE118CDFDB42CB8F4BC34B2F943\ 8F1513A874C661B8C88D59E667B0309E19A233225475D0BBBA6F710474EDCCFD\ 50BEE8A92651FBFA5D0CE4673D3C8AE6FC3FBE04F2CD60E913F6E9E432E5EAB2\ 60AF956C7A0CF607E8B0425DA8473671FF39A9FF191E59072E5C86C76368573F\ 81254D5C0716DCA77855E173F035551F03:\ AA773417AFA9B1204CF5E216459C603CDC9201572B2733D0C60BBB56454D2C66\ 13E64E5F235DA766017F9F0CED7819642CBCAB7C4AB70C62F4177929751BF507:\ 976FE9850221B235F43DA870B9B0F6CD D2F8DB2B0686FDBD4BE64BC561FCBF9B738F78E2F2EFBF61D56BFE06CE9ECA4F\ 23CC442BF6D1D51B55A2921A73C2D5FEF0770FA85D705E0EB2D93CD0ECD66727\ D6263D1FBA02C812890458385B6C138D6FFC83547646BB3931E2834DB5F28C84\ DCE7692356C2670A7A05BBC61CB8D0902EEAF0D18AE8CF71C8703AADD202DA95\ E9C7967A9700A43FDDF049924DA1D1A11379:\ DA0885CAD1C8C75078AE7633F61B97B45B878CF2915B8B4F77C7BA456F0AC771\ 88BAA8D2DD0E929083F9928D4B123B8C90A40F61399A89B45140422BDCE57869\ C313CEE655D497228CA7F084EA414820CE15C877D2C2610FDE831FD9953C5C9A\ 9BB3705F01CD4652C6B1CB153FFEFC2318A2AC74604BE1ACD0CBD8139C8E4603\ 6BAD1247CF5AE785A957493E04787B095B56:\ 4A202C1983B71E41DB112F14751587A50E9A6FBFC0CE44414862EE1B09417049\ EA861062B2BA0956A0278A34E86B883B07F42750906BE819C1DD0C3BCD12FE8D:\ C9BAFBE986B39D7DDCB8CE8B0D23E004 8D8A5722BBB70130FBA449CD5BEBD86330F035182D93FFDFD11DEE731BEB1700\ AA69719256D4897240E2F39C54E390FF51D7B8895D2D04BB7F9A67EA8417E122\ 6A67E5A4A75F429161C999B5817C5135251C54855CFA0B10C9B11A1C252FD4AE\ B368302CF470E0E1BC4E6EEDA8FEC2CCE1A9BE9E0B277503A427F4BDB0C3748D\ 718037CF28591A65EDEA5C7A5F2FE05BF93702:\ 2DEA2CE092FA848A885FC2022CD8A177715EEF94D252B6B36B27905DB6503DA8\ 2233C131519E164AB347339DFBDF8458F2517010A63186B1356C0FD154345E5A\ 22CA4B8952A31591E73CBF2905425CC1C4EA1A41F84D94D87262055CAAB28DAA\ EBBC2EBBEE638811F187FBD472ED31F3BE5D58436EBF38F276E39FC24EE7C8B7\ 2543BF6AA1537CA25CCB0AD5998D6E70482AE6:\ 0D7E37CC074CC744DCFCBF5C0A407F8ED629C66942086E427972E07CA5B532AC\ F13FE59C953F42AD1497137ED3985955581D6FF1AC52AC12EF3E88BB20628867:\ 6FCE49F4F9E8C5BC8A865A7A5C128760 24702D2AA753FB6B6A201E78FBD604850E2EEDB5E611BEF4969FB3687DEDEBC6\ DE5942B854115CF03AC8C6DC08207A08BA9C066C1A1D76856D0C850AABF63428\ 81ECF252F29504BA62FD3517E858E79E87A9AA14155A75A9F9B7236C93E3D61D\ 1D80A655621C2636142B8CF4769E69E9FB9A6E4D007E919D7ACB2C776079586C\ 671AFCE2F7D823AA5461D4AA3A172A64AB04C6D7:\ 353A10040F30D579A09BF918B7DAD930D7C4326844A4B91382F311559A706289\ 25820AFCA85D2039A7FE4C9409BE2049EE8D1FA85734626DC93CB6AA49B5FBC8\ E99AB0EC9930E23324C83AD2696612D297F0612D188C83C7EFD073E434B9C3C4\ 0BDC51A751288BD21F07E3A2E08A15F96FC86A395D7FB253ABE474B592ACCEFA\ 4E46FAB70A7BB7807FE486B26641CACBDF7AB67A:\ DF3F3E2FA0418382E7D49CF65468846BF7B207BA149BD894DC47BA65A09F0C9D\ DFBE81EC4DA0D3A42996884690E87328FE83D2AEC491768B1C682B20A52A6CA1:\ 78A98853B5C4C088892F617835B5BF43 E9A4C906FB3D7C3E102E99EB537BE282CE4C6B3D858CDC05B0C0A8C158C0F0F0\ 7CC4DD0F5ECFEF80DE8242AB82E16C2868BE283DB0BB0EC296F5493E4D292765\ D2A9DB599DD6D811DA126F858DE07F323DF8CC339F6A0A6E3EFEC9A35C006304\ 447D0E0E1E9DE8FA678E8DF45AEDAE039FDE01350F38905181E900FB0C45C063\ D426090D3D2FB719ECBB79F98216E3ED3D4C269F82:\ 6EB26655DC6F5F56B45D719A5D5379A5BD56D46BFD8C88D763A701D0C16DB997\ 1D1BB96891158281D020372AA580A2CAF8F809D500ED4C03149B540B12D0026A\ A9D03CB3688C14A13D25EA35C8801EEB15B6B8CB9986FD940E820DEFA3B5F553\ 5401C97705168D53E3DAC0CFF8D4229F76C74FDE2C590B6629462F7825BFAC97\ ECDFD9D8F86476432A3339541692A4C498A3773D67:\ B42E8B5A90A4BBFE0E04B28C2A27EAC0A014EEBD1CFB3E8F601AD84C26188F43\ 3FFD9A4DC1B0A619078F16972B3CDE3F2278C6211E886631783EB64C4C84EB32:\ BFE7AD86B83A5FB4368AE7770C2C8CB0 144EEAD91DFAD8259F884BB83198122346BC6877C0C2B5986F44EB9520878806\ CFCB2B1D4145D92B53BF9F894BF58523A2F7770DFE8646B7144C63EDE7FC090C\ 3B64EA161A2D7AB48D7052AB727FEB1C0050004F44DB8F1F1FF562FFD7AB9815\ 83CCD3880E82953CDBAE0475F0612CF7E05533FC86B37985071274AB4B376EF7\ BAA76743027C324C69BA0300B4ED4EF2F85B3B3D0573:\ C7DFFDA2591B600EB79876A120427FFD5AB32DA0A9BBF872660D5D7C9A0632CA\ B6FCF41CA1F1F482711C418725AB4C075E1D38BB22AA17B876EC5AB55385FBAA\ 7CD7C31C6C61EEC28AD03E1E9C5652F3BFF72B8A13D90DEFFDCF3316C7F984CE\ C307D3C320DDB10F3467941B2DEDC26AEE46EB287FE1AD9A372C8BC129EB89A7\ 860B66D156ED6BF604F911D97F233946F80408E788BC:\ 81F401C4720AE2E11080F7F52322026DBD8507B09B0799DF2C8100B6132D93F7\ 54C0F0A59C6E2B81C389E4EBF55179A4B3A4BB970326B42107ED495D909F9801:\ CF7A79F18165AFC5F3723FCFC87EA81E CAD0E14D6B97CD68F0B7F7E43166698B8DB87C00271B7D361674538595773FF6\ 5A9AE74275B9D8F174AA935240E3B6E7F321030111900ED7304B3CD3624DB444\ 6A7B66CC98D4F8E5053F6D4CA35D2583B6FD1732F776C7399C649C0BD2B03B00\ 9F283F41B2849BD1D1B735B365A0B728DE40EF0B08A9914C1889674293D0A9E4\ 9BC9FD70DB514200CA5BF2D396E6E512D04DAB6402900E:\ 099D2C6AE9FA3935BD67C1F13E1293137B3F262D9C936DEE9E41F6278311B985\ 22E6FBE196286CEDBFEB737E3B221ABBFB64FDDDD54C3D56F06A40AD8C36AC07\ 861A8F3EF7B4CEAB92C03BBF8161E0E951CE381E5AA4D5958B99E86C4CF48FA7\ 4D8F380ADE2EF9D58CD62B03854CEBD8099F6AAED5C0D13CF92C6BB89C0BE78A\ A444291A5AF88E55159EA68252913B3B621EF5D1D3EED2:\ E68779E736B5C1EEFB4E4C563AC2CBF5524C09CFCF99CD6A877557E53B3B9A35\ 55DC626A18FD32AEDC787E168B86CD2F893C6EF8A2AA522247B007CF01EBD3A7:\ 5C070C33AFB126201D6D9C41CB85FF92 855813289E39837785AEF095ED8051F8A87659E5B200E78B6F13C96185148CE5\ F6F941942CF7C9C64D1250E8116E1F93AABBCAB2B147A241FD64883D18628444\ 50EE60412A2A38AF272B2254C31B09C07BFA14BAE2DC46F202028A6793C2F3E7\ 6AE50BB7CBC1C9A45CE2026FB1A1E9FF60617536251DFACD5CEBCDEE5C70B207\ 945540485E9DB825AB88915104BC257E349A3CEC028617E9:\ 07DAD2DF0247E86263755552CA7F12D30AA96AE29FE59B414E31D8921CA630E3\ A57344E2CB7ECD42CF6E9DC896F13BF308D4B78553C2BFDCB8A654B49B3AF779\ 9C0318BA7CC25AC57EF98D9EA9D4AF4A54CB34EE84A6622D0D9320E72B8C0707\ 02C45EDE5F7DE2D8A0E073CE283BDD22FE831240B59BB4DC72EF915F051DD52B\ 48DA8C56FCC0666B14F7CD6337A2185040D136892EA6310E:\ 80DF01B1339A9576F412F52320C4EFF8243C95F163BCCBCEE828536B81E57F64\ C3308A30110AB3FDE755551B12F7ECE074F3C7578CDBCD64EA4FB083FF568C20:\ 9AB550BEBD5F65E689799EEF77350BED 4B980EC7F6C1C06403E001B970C57EBE64620AC8AFB1119263CF50AFDE86A75B\ F24ADCF9B78FB4AA3E813CC14E366006FED0EFB26EB8A27079E32DD86D78B6AF\ BD11CB50BCCF930CF69ACE2ABCF2D1AF3C9787E818F0942368712A91B5741CC3\ 6A848F9F6E59814E50E0C86339234E97ECC0DE1F303BC661260559E69765DE1D\ 17ECE34A936868D334AEF1813D4E7A4F5F29286194A8D8CB39:\ C566BC1659179928650911541497964A465D84012569ABDFD54D0DA5A815AC0E\ 7E67AD83A9037AAB62424AED6FBBEEF92C9E1CF914242C8880D65EEE18F344F4\ 5961312CE18D11E4750853AF3A674AB607C2137FFB223A4D730434ABE6878E83\ B2F2523AFD3C2C7091C6FFAF1458AB26585905C8067F3279F2270227D378E95C\ 925FE5EA37C55FA364B9764E3B72E0653AEF62F78E245CD01B:\ F2BEF6770E2A6BC2F9F5263090FAE3270BEE133223CD5682FDE56254E37F62D2\ B429D6E951DFFA004CEACE7207333589C3202F7178189BAEB6B87CF54D8E2EF5:\ DC665BB1EFDDD25B933560B3D6488178 91631D65B5D1FD953709C0E5F13555437E0AC39B165A05191CA3E7CC2B83316D\ C189EB21FEA46769E093C108DFD02A19210A3DDA4E744A7D6780F4FE1906BD5D\ E022942A2BC453F5ED5B379613BDB703427F14B758D6F203EADCF8EEEACB3F18\ FB665FCA19A8797E6EC034FB53816BB16715E732124C6A93004E2B83D3955647\ 3E321A836175DE6883032752BF5044F1036871935AA615278CEE:\ 2113EFED9A437854123F5CF3345ED55C99F29575CF292B415A31566AD81E29F8\ 3B4F9C4A3B3CCF8ED111D754583EE3E21007282DFD92E69D825556153BC8C4DB\ 8DB9B194A225AF36C1C16FDCBDC83299E755B77280EC92E9937D509DBE4708C0\ E610AC378F53D810AB09799D5AC93CF3C8BE3DBF8A01EBF5AD264C04CAFAA454\ 9DF854F9EE416554CEBC188331B6DB08555C39897EC5CF735B97:\ 19AB0F1AA637F73D03FA490489A46C78E427343574AB38DC731181D190EB7782\ 9FC9D677ACDD74340A607249439CDC4D45BC4E6D14AD237D7AD6874116DDDBB8:\ 4F373F68CA1A9DE174745AD4BAB06E50 9C44DA0A64EB1839130DC756DD4E6C39348BADDFCF23978D8E664F69ACEDBB31\ A89D0B6188D2DBECC770B82471D59023611249F1DA3CC80892D5ED3D4F38E945\ 84E6B8FD24C7F4CAD40582934470BD6F9204AE7ED69BD0BA7403DBB8075039A6\ EAFEC38961777718FCB7F3032E9DFA3F5CB2827E6D1901318CEDA18A85AC6FF2\ CDDBD6EDE7084B62370C3E36EAE051878A344FBC771A327DDA56D8:\ 02854B8C7D561BE4E831014A0F1D8B8D6AC07EB3BCCD836E4E79BDB2288353AE\ DF9A45BFBBCB430E4122CE73230CB21817D29C9ABA68B41E74D6217FF877116C\ 95ADDEEEB8BC58C25E2A960E4FD0DFD8B9854EE2674BB20E68872D9C19051841\ 5FC6C4109E78E455415055698907DEED964A6DF167ABDA3FF1C03C0EC20C4406\ E8EBCA083F3A26F421771668D93E7FAC5A44DBE2B00334A8FA48B3:\ 36F86422A1A8AD2786FDCF0D9B52E7230C79F65B0A14BDE95552C3EF460E6062\ 043741AF24550F653B65A74219FD5B82BBF65768102B83979B282A3355A70059:\ 7538D26B77BFF31D6E13E31850A4AA14 28E90084C2FC9B7A78FEBBA2207BB16508DCB86FB7FC49AAA00730C400C2FC9A\ 28BDBF8226B9ACEA3FB218978242E6FCAB72A711264A2B696CDCC3875ECE06C8\ 63CEBA9239A49CC05832FBC3EA3359B9D0818C1BCB73D81A5B547AAF4DCB9B21\ 0C322D966D6403740807E48A1DA21600BEC16469F2092499C457B2C3864D1647\ 1D75A229A514F4D30CB779C5AC31C1F5A3369753DFB42F469CC41BE7:\ 60A52B9DB1D33E16804F497DEFC3017170DE155FFABBDC5C004A558340219839\ 82DF04C01B1C9AF49D3188112105FFD9C4D82292A0C551B03B07EAFEB9B9ABB1\ 5DE5E134D0F1E1625EB4148A434D682225DB55371C97487ACB561D33ABDC1CE4\ 6869C876E29A5E824C69CEEB45D04AE3F615BECEC94ECB6F5A1DE3F6A66391D3\ 2D50A061B15BB4B1A97C11F994B0475F69DCE51121E00B0F5BB740E6:\ B1D259B15223AEBFF9CC784908A27558E0D68B9F92A03B40FB4A2A851A720EFB\ C96E3C66E8FC665912BA0BFD55E79172FB665C88837C05F487006B5356B9747A:\ 8589B4920D6AEB54F5E7A222B0C4B627 9E0575D75D3FD597613F1D544E0CC4FB11E2AAF3619E4255626C58E6A768AA43\ A29591712724887B311EF40C7639F38C90D3D591417ED6E8919DF3FF2F0D9935\ 1F920F5450EF08832E50BE626BAD7D2F5376B858A19F1AE77852EA807A7CE9F4\ 5C763302AE8B174C655C5654275C3296D78A20DED07A0A6B3FE4A2811B161903\ F4724978435B55AD25CFA3A82DD5C5198D8D6D344C63D66ECB08A8435C:\ 87EA74BA569F363D8223F4B8C0744C39BEF2E2FF4FD9C60886096E5B431E293E\ 40A6B5A5A948410B39F3EA2C561A0A1249AC0FF02F30B5AF58D014761B6D1E5B\ 9A4CB05B885B7F0E918D26D0D26F47C3CB56B078BB31C1060BAC33177089E83C\ 837875420F8F2E5F7ABD9664095422675BA652AAA5B0D02412643EA15C9BD592\ 407325F26ACEDC44B54A92FD0DAA63A498F04E8F22B24F4824CD45FA72:\ 63BA840AA75EBA1601E729596106D5A9784B1C96FB62105E72EA5DBE447A13E7\ D8CB40ED861F2B02103B6263F01960ED3E0E801BCEFF6B592E2020B6B6E5280E:\ 9A629576FC30BD795BC5120841F1E0F8 F07862F285C06EE744B43BB659F9CC691B2216D92AA0A09E08E2DE81A68E1462\ F0582BE06588DFB1CC7DF0D64ECA246DA8D666B025E7946327F83C04E4F78204\ 47C8CE1A50A4270BFA1D4EEB608B4020457CA06B1E53D38992B340580594CAEE\ E1643BAC970A5DA5F79207500138A707A3D22CC9F2522E14287BC360192CE506\ C70FE9FCF47E80B9B62D3E36B8473D65A54CE7BFA0D4AAB12E4D0CA6D95B:\ 828AAABDF802A6D3C367AA9639C5C3BBBB8665AE1032BD82E8253E94E9865943\ E7400BEAF5A81EAD1140B70031E8E1E630D1C318E8119286E372EE23AB0D77DA\ 8215F0AD0ABBF0DF5088BB714507A83FDB10E0C5DDC83EBC27BB8E501BCC207B\ D3113D31DC5D6580D2E11E5336C2AFE69BA1DDD0ED1D089705E0FC510889DD76\ 92753AEC9C06CFE5B274DD3FDF246B440943E52AAB04D0C4F92BE668FC34:\ FB664243EA40C2E0DCF6AF9E7A1D38FA91310B373510CEBF9717654C9C45888D\ 467BF18D905521879C1B7C9E050C250D32BE37582873938A98B3D89E09FAAE52:\ 55FF333801629F078CA01FF9E481C288 ED64636F3E575D1ADD024A1CA62725E5BCD189CF03C12F54565D80ED1E2743C4\ 237A3FA1753B6F5913010AC39F7C8BC2EA5DDF5A697CD3E22B22359F0F7F2BCB\ B696272A3532CA699A104FAD74D27C60F04B79E3946716AC8ABE22E712CAE051\ 615FAD7B14D949E2D0DE393709DC827DE1EEE146DB5ACE5A1DAD14C59F8678E0\ A6BF913651DE3567FE1F9A5237924D9CEDFA823187A31846D6D721A1D5B087:\ CA66251A56DF109C2A3F21D524FD20F0ED1F25CE8329E01D1CDB8A64B093F677\ 810CB176051ADC9A4CA8705E8C52F8B55512D847D3AE64E1D5A3544BFD145805\ 043CD9F8C40E629F15A0243C705753D22877BBB903E31345353D389B469D4A1A\ B4A72322857D674C9C3EEDCE02DBC06286A865C21B8040E4CDFF02C91334EEAE\ 0C5A44626E5DB9D28581DEB82A24A5FD62FB84BE83A8105E89485C85E1C1F9:\ 6F46A21346AFC8D57630EAB85D3AEC58313E30F3436CFB5D75F1729D2CB8962C\ 8F014BE859E3CE31620A06A980D11161F0D40BC0103CB6984099D8FA37B3020F:\ 2BE2EB6FBB113FEF2C0169E1367A4D83 C58F2837B44C3166B99ED90BF974CDF99276D97D47BA88677749DF554ED8F19D\ EE1D38030A98946A58B6C565336D4ABF64D01E6EFECB7962CF948A4473C82FAD\ A17AF3448D2FECB51584BBD631C7AAD6C59BA6F94AB4F503E35B3D79ED78BCEA\ E94C21F2AE92E5D67644C6101A74725E78E50230AA8C303983148EC7F2377C2E\ 32FCAB79E1E59E046AAB7B4E3DD382129F65DD0E02C597ED91A1EF3A4371D316:\ 2F89168484AEFD6F5BA42DC836006A4B5D63A9CAE45EA22A53855B00220CBD90\ 5F6131C8D7CB0BF5DECF9E26D8E305828067A63FDA8671D386E13D58397B61E9\ 426EA451E6956CF35858BE5745FA749D3C16D71C860C2C6B394F54CEEF818C02\ 306551232752BAB5732C63EE579837878ABA4D050BAA23CC414D47E42B6D3268\ B7C14511016E6D1B077E5AEF75DE92864CECD399DDE104FA1AFEAF08DF4F0BC0:\ DC519F4CC315A1A4CD3C2404FF61298C6F408E1D18C71724C8B338F108102E0F\ BF2058D7BFE78418E4BDDCC8BB38BA7D04E4899E42C5605601BA5DD2BE0F8C6C:\ CFB3AE17F5E805643192D1E3B3143E2D 8015CB61C5F23AC0C425789F0671CB8A000B8C9207EFCC39D01B149F86EE42AA\ DDBBE6EA8DFC0F0BAB556A6C1945E66C03697422FACD5DDDC7AF6F43733E611D\ AC0EA877035FC63F7B7DB2F5E7FBA3EFA8FFE796EF8D3525BDEF4DA9BA8E65C7\ 22E3E191A47A29658FC8F993BE89B1AB16A221F4275A2879ADF5129E1CAA3C50\ 731A80A17A34EEC1485C80A753047FB0B844CF6870F68708C26941D87B3AAC6A\ 11:\ BC79F30A2BBE68A1AFFDDCA05DD815A7624FC09BCA25A4F55BDAF47D9715C597\ 54A74E2DDAF1F8395AD054C444DBC68E63A56FF3677652B8505CD1EC285258F3\ E6C3F5701D906648FE6A9DE9EAED5F82F2AF8B6D05DD08365226C278171810C3\ 57FCAB8647348226222E59607DEA2EECFE62F4A11037043254B06446251692B1\ 809E2F94F7CDE7B02AA543701D897B578491C57C771FCE60400EE7060F336BFB\ B4:\ 63D001BB3BA9EF2152A84954436462B993507831BC16061F20FF35C15FDD2D24\ 1B7C1F8D7E9B742C0D5248CBFA10B41CD9B53150683090260733C4E0E6F999CC:\ B6170D37CA1032D2C67B5CD14E26D641 175EA892388C6704E28E0059A99FC01FB61D5AC0DF1ECD94136C1AF18380E9B9\ F4DE638CA8E5284026D10499EFCB6459569C4B47C56F3BE7F55D03A489612C37\ 047243A740664885C3D9FB303D28C6E1905154723F0AFDF9FE72BAE4C08705FA\ 27BF4F90C8025E4D29C3D25D134E82F725A0C9F3FE5B37B87B381C60FBF744AC\ C2184A6FB1DE83EDDC8E8DB49E89FAB62575C1FDF543D77B5515BEEF9E9A81E0\ D6BD:\ A16A0AF17AE7F4067873699F837741904FEF70F705D65DA2C2561D34F965FACD\ A065A7F0E969EC56FBE8AAF469BD251C0444F46DCD73F036034844E2F7D4D184\ E9CBED269E2772CDFF9323CEA678A2070586CAED7589C7DC57FFD32C49870AED\ 155E3088FB41A2FD173C4A5F23D79553F524477BE40D90E08C81695359AA6B14\ D9CEE4D25DAF286C917A011E5696F8A9737A5144CD959352660E5FA984D89836\ 30AA:\ 40342E898F45D16D7F8B217EA13479A6CE624E415B514B27D0DA3F2CB51A9EC5\ D2D3E254DE7DC952F77262C6392A466846F4AFF35D5442F5B0189F58431018AB:\ 02E45B98DDD87A5508D0F9FB01BD4803 25BFCF57846C3E69DAED446B45DCD4CABBB8476EF543ECB297DBC5F62B6BF6B0\ 3D44E227F020C8BA5DBC9E986980A42A7172FBB0DDF66D82A85CEA529617292C\ 118FBDB112AA2B13BE6F924C5AED18CB0122990DCF9A358AF23DEEB00F8F3686\ 65AA1C293AC106A78AF14E887A29663CF30B7D7367675EE8C7B931F678B0AEA8\ A024056B660223DEA8E7BC540C3AB5CAC2E287361C6F64B4CFE0B419E4D1E2BA\ 53D213:\ 95E762D269AD03E7547E9411B7D7042CF8C1A3268956B9FDB9914747D398E1A8\ E03DE764725C649F085DF46E7273B8DBE4FE50762DABA4115873B7DA65D35528\ 92E4E2D8FDBEEBF43F6E5AA1D6BB8985A783BACFE32268EC1792E01476DA742C\ 8259631B724B46ED5370DE32D359B75FCD6F8DC0F73A7E5B225EC61EC354108B\ 8F6C5DA2483C87A5A5DE4F7FC7CD295980FF3603AF1AA397D093B7C417C4B7D8\ 55F476:\ 05B2C73EC44F52D1B6CCBF6DC5205FD0D99EA7E919AFA289DB75A16646F41132\ A98E693119F3EFBB6EAA32D167F1C56A2DA68E4D60F1AEAD2277210E6386D62F:\ EE237737F78FA7484451FF6CEAB84A45 5D53348746D8D90E5C128BA57EF254A2228DCE02E015ED46AEA8AB7894E14948\ 9D846AB9E51E635EAFD7B104250ACDCDA5C32D5642CA3EF5E75770B0B42BBDE5\ 72D8038559FE2D6F6DA2ADD3D70DBE0F810719ED036F39C14FA65ADDA926AA50\ 86416B1D8D4FC5F761186F8351928E2313D8C51312FF344D8D1A1EA98422031F\ 65F7228BE47993FDC3EE93C898B97C8675098F8A4133B03A5F80FC05AA1CF230\ AFCE5187:\ 453B7BB1036114B66DD0845CA657F997BE111A445338866D8EDDC2D4086C555A\ 81F120E8E2F6021B7C3EF9340182818F6864617DBA787D9E94763BF63CCCEB54\ 9D49597EAD5D2EEA390E9EDE0B5AAF14AF95518B86816B8B094A8DBB6E9616A7\ 96282700988104EC43E2FCFD4616231F71FF917719EF7CD266F29E5E0D9ADFE7\ 805B1915D6B3E6030EAEC4E2D51A8EC2375E8D64A20011ED599927AFCE084A62\ 68084C7A:\ 2A2F0E7030F4937B0DE2DD365EB7F8E62943E3F44445949C9908ED1D9E78ADD2\ 4282D752283C8DA0467E0298C7477477ED577C1F07F786FA08A3C15FF01FA7CB:\ 1DFBEFE2C5E73C0F35AC39022F2F5250 46BD56FBB3471158ACD7309FF08839DFE84E8386479C5CFB608AF838C8E322A6\ 8B7404454802FD2B9378A3B2CCBE947C1C30D141543F497E64FF1A84A14542F7\ FD8D485A6BE1C49C3F25BFC9160A8D3592C262B92A6A036D29107E0BCC3C34EA\ 496F666D21B2A9B6FE4E0CF0B1A9FB1D384C0240317CA825423B532C3D69A4B5\ 5BC1642F1A2947140EF51632E4365C72E816EDE42D46F43C4049041BB7E69B65\ 25C8868E74:\ 3D2630B3E1100113592D45E788D3012306964C12C52C61814A83C5BE7C087D9D\ 106ACA726E7D3B95415BE9E07EFFEBE6948E168A6D7D313C491EF3B5C6165F99\ 84AB50775F65D6CFEEAE54E92370EAAAE9A540F214A8945C9539ED2E15779D2B\ F753BEC0517DCC81E43B0625068A2BA489E20D7EF38556648E24A701115B9C11\ A7AE831E2B7F358B1D72437B8648E679300F992C601BD7FE95400BB06BE53D07\ C3AB51824C:\ 3F39B0D2ABD3E6EE17A458F794F5CBAA553E21C78E649509D686DD64650ACE15\ 44C98E6F11797E158873D73E96465FCBFA09B96048810CB7CFB7947B0D7CC75F:\ 33B29834B357AD1A82D8D505F61C4216 74CE7A8FC17AB2513D69FE4F947B40B806A37BB615F6667BABFE9C160CFB0154\ B729B64A9944129766832B8DF8A6BBE5A67AA7B47554BFDF521EB0A460CB249D\ DAB0812664E51D6F995C9B158380AAE9D14E3851E1A96BF893A789CDDE35D164\ 9F3188DBBB214D220F67EEC6F4FB71361EA89E7F83773028D5D44D21EF543A74\ 53CA31C9E4EEE68CE8A26C702CDDC1F8D4D5567ADC00B3DBD814F2E7E98BDD9D\ B7F74EEC6E28:\ BC3A241DD09F3DD74328200E16FC3F0E84F26129EEC2C43C7CB2E541DA356E3B\ 6801F0F7510A02F2B6F9F8706C3C439D27130F75B956FE76D894C3FA42586DA3\ 7A906A50232DA7222E41E5F2818A52C24CDC2AC5F7C10F95423B8DC361381D27\ 6C96A6491ED1EA10629779C670C37CF7AFB8B6D5DAB445FAD022A4B2DB6DCA78\ 7BB69FC91AC7E1C3631C1A5F8BA1AB6543E443B8A7A61987F98154CB8525963E\ FE174229C0B7:\ EC692882EDB011616639B023AEB8CB3EBBB16C2AC13F70523869E2E213BE895C\ 513FE5EAD9A79D0B1FCB7BB6D5F2102E01D5378D8C29F20A604D5765120BE800:\ BE49D1C557728CDA79D2D0BE20D49172 0470E50512A34C1DF99283CF4D9184E89948DB203520E275F5A522D2391B95C8\ A5B85F9F2C0EA567DA078BDA69AF104E7E8493CC7AA620DF29B95415D52EA9E5\ D94A3DDE13AAC17CC96639F0C5233D316DF656504EC796DB0E61AE8F694C6BBA\ 9E2A07A42F6A1B345E427BA441058BD004DD41C34C6387082442E6A52DC50C3B\ A8172CFA293BD49F64EE4371DFB1EDDCF1ADA26111060EC107F83FBF80E8463F\ B10B4450510B32:\ C8DAD6A72DA01261E456D96FD701EA8BF9087E8759A529A2B8882EE275CA6997\ CCC0ED7BF7F767960C003216AF788813E68CBD2F730BC223DF5B497016D19220\ D4986C2FC8A1D24EDCE97332D3B7484143273615B47E8FDFE6B35D35905B9507\ B59DCD18132895DCCC17694B2FDF23B770D342A49B3FCAE929450726A1E138BD\ 723CCCB53FD527F834F09C48AFE8B8BBAB5C35A74FFEC17DF55C5E2BDF3BE3B7\ 9C0339FA6E62DE:\ 287A4E69F4D9A76282BAE339E22B2638A46D94631D6432AC5A89F656405654BD\ 24662222BC177F58308FAFB5E764ADDC672AE1158602E814BD2B08F1FC3E36E7:\ B9B12832D12D717517F258C1BE5690A2 7D03B4D4167C04FF8F41DD5976522F39A2338BF367BCBBC5682DFD0437070799\ 93F67571DCD86B4487FE88FFA978ECCFEAED8E7A549A5969F51D9B67926AE351\ EA9DCB942F0D5295C577D0462496EE8E1F1205054AF3107ACEA7039B7396BF02\ 5307230F71B78C3BD5240A1A7AC5C6C92979A4BE78E709BCE228A4B59D72F134\ 8E8919896BFEAF6F8359F410D0FD1B5218E112A68884E1697C413166E70DF66A\ 3A40BD15894C877D:\ F1434086EF7D7CB877B4C499A6081AFEE00274B2BF745EDB5567684A1E52420E\ DDF7708999D62C34E6EA693CF5288978A87D5957A3759A26D527E8DF0DAC70F1\ AC497F14ABAD4FD0E7ACC1BBB52560402DF9B314C99C938CAB4AEB85BF8BF399\ 62B0185673DED1F8AFF394C0A813A00FC8DD8092E27D1F71AF641F65DFFA069E\ BD9D07FDFDCC96858182BC3EA94659FE63C8170839612BD836CBACB74635357A\ 5C75B30F8F68FED1:\ 605AB0EA23DA5AC1C0686368934E5A07D7B39D6621D6BB0062070FF61EFE1814\ C64565999EAFFA72EDEF733D1CB2DDD36FA08B27F56EEADD164261B2B3EE559E:\ 50B23C029B17A5EF9E6E366A2051F1AD EDB1F511F0D4487A3E84915CBD97A0B40C0597A4F80CE26ECB19D0F75927AD01\ C481901BFAF88B12C0830F34A546DB1EE5ABA985BCFA079CF70FEF61E826596C\ 65D4CF2E8ECBC2E9CBCFDB503C17DA79484EBD00AEB306F5F42B3CA0FEB8E6B7\ 79EA7DB842AC7E904C4DA16E199E09379F770CFB69B216AE8203B1733EC0EEE0\ 410C9D0B72B2C1206042A7F08DB2FABA2675C65D150B0E7A3884AD2C75AD8578\ 00F6E5B5348AD45D86:\ 048BDEA47D82862F3D18F81FFBAB7C67AB7E2DFCA8E0F7B46661D51050DB848C\ 0CC464092B496A9A448BEEDB4C07612D89E5274317064ACEF9E9F1DA36189E0A\ 08EB088629312850F6473208220142E126DEAB100E882FA7E989DD9039E73778\ 4C9E368B132D96EAF9D53DAF9D76E9ED44784FD47652FF640E1EA9141D723485\ 4239CAEC35BADA36CC900BB6CFC829ECAF563EE211BA534C47FD99C0A40CA405\ 8206063A961954156B:\ 9F67FD638AAC6B5B0E9A64F71447959C3ABA12A4B5008B82906E5659E15DC4EE\ 0903D42010BF1B3ED1B37D0DEE33C1A30234D70C63F62CBBD00048135160C920:\ 8E92FF08F492B43B205925F59340CE8C 7FC1F05C2DC5317B325ED9B03F5B335BEE640D04B8AF3EF3F8016D97E4A20B43\ 171B1FB4F16EB06F58548B7D2B41F57B7EC1A0C681D431E436226B34ED0C6112\ 331C85080FFB631E949CC724E7B80E8DBEC711355520316A91D549F251384DCF\ E367C568C70675C32D858E4199377487F20FD8C3EABF47A5978C5D25D317D6E6\ DA721E732522F7FC98B8BD923E8B5262B52F4617EF5382741A3AEECED3D8CB80\ 6B81D578C932EB00D905:\ B72A32BC2036AD390C2B72634479D9005B7CA3B91B5CAE0E7EAD8A7B8BAE28FB\ 837948F5170FF5BF10FA60B10F95EDD9FB4CB298DC4390534DC98DAB29FFCDD8\ 576A71E53BCD14D9E4D27E5E658A9D2AB193E26C9A0C2640FEF334DCEB24DF28\ 86EB253279FD196427AEB4859507A273AE728BC6FD095819DEBB7E4B26AB5EE0\ 7397EA1203BC36CCF46ED3C753E07548F6E0CE04E4082B21079EDA5D47AE1A9E\ A0686866DB72A5D49901:\ C9964226EF7B07ABAD30CA20D28D02D126A465DC8F99CB433CDAE7AFA7C97400\ 8556A34CA4AEFE35E5B23B047CE13EC038F0F381B8CFA1609B76682DF39B0C48:\ 8096E3A29B150D4D1086E72B6C68E677 074DEDF1EBF0CDF27B52AEAEB9192DE48A00B9F54046E49E253ED5670F9030B0\ B6FC048DE0481079FD90FDD11C363DCD0FACD833A273520D81CFA1F11B5C07CB\ 3BF10F533AF2BF843CE0C6F98C7475CCA6BA790823E590D26E1934B5720A7F00\ D9870FC73E05D4B1B80AEEB27F3CD2DC2AA7A2DCBEF69F40E348510C303BF0FD\ 99D2C06182642402203C327C86F18A432D0B1DD9D6A7778E8C9DC7DD5A178DA0\ 226EDF0A455F71124B3921:\ AB1C8CFCB9459DBD044BCADBFC6ACDDFE6DBDB4F2E832A005B7E49576C1EB20C\ 37E340ECFC8D1131C6B2B5B80B398DC102EF780F9F75022B24F3E88E4B152FAF\ 49AF856535AD9C398EBC9C7DC3ECFA4C4A97A68069ACA3A6D7AC83B763F6B2F9\ D3656EA4CCAF8F0BB3A37C19641741A4DF9F8898D1BB695234C53CF14BA554AF\ E2857BE516DD22DBD106BBDF694A5F6C223AB1731BC12816F22FF985CB4914FC\ 0DCC3D59430220F1086022:\ 78C7366AB150CB962A22D34669DA30C58669A260642838BE5DA0732C49286623\ 24747426544369FC00FAE335C0A3110EE1E0B98B9F760897E7DC27341B69C6B1:\ C4E3F365345CE9E167ECED4451F53D21 72E4138B27F098EA58B50569136A084DD9B1E10B4D2F5CC14823FBF5A9A64F0A\ 1E4D67E330811D7B3FDB0562B71CC70E31246434A9D4492C23860D2D3BD53FB0\ C8B63ACCCDB999FCE782BD5C5862E81258870E823335F83AFB016F83365F14C0\ D14E84EE89E69BD3D21923020B2D7BE8E0700F9F625DF4E5038781CCA5D1B16E\ 377017A06F7E1EB2E90C8AF51C6B0EA35600C49E57755363A60799624212AD15\ 70A799D2CEFDB6606E00BE7F:\ 446CCD9503D8DA3FC85A9A11AD73F70E29EC72612A518D30F62A3BEF3889CDB2\ A468FC3629066D7AFE744C7FF2FB397DD150688C6EEFD828E5957517F9F1915C\ 672FE269E29A327C913B06240E2DAB6E73387E8DCC807F16B60BEEEA4DADF03F\ 837D5F40CC0BFAB2532F4D1980F0C2CEF54B4E417E36C79EE3AC2B7991151CA8\ 63989FDF8A1155DAF71A25C813F7068A66D4BA76CF0BF3BC4F1DDBCD8C2183D7\ 471905DAEB1A6B1D03CC50C2:\ 9C739944C94CD19E9AFB1B57257DA371857A1732CF22E4C043C8122F64A1DC17\ BBD92B4E35E9CD9C666DCF634CE8F99217B8CA2A8EAEF50808923A642600F63F:\ 1B5FA8118184A055DB35491464856482 6450D405125780750A620B21E5F321C3135F0854035210D41D6097EC8D6400B5\ 43F588EB330AF977033DB532663B3EE83C3CE2249574494BBB6CC429EBD4B5B2\ E498D94FEA58B860A0680BFE7034DC73DC74B595A6D5730666E8EF8140CF5CE4\ EDB11A496EE6E84C3850FE132C36734A38DF8437A689AB87191C487D4C75002E\ 0D83301249A07DFB3A098364054C74FBBA7D875823B2A4BF7370466C1A6E0CAF\ 01918F3D6DB5E0FC923EE14310:\ C608A2A5C9EE3324CF0F1508FDA3BC092D358CE21A3564E25AA3E455A9523BFE\ 7CCE8472CEED2CC94CC735544486551C665DAB777E5829D25266D339808386E5\ 7BA78EF5AB04EED9135ABFEF4AAA70661B48F6F0074405333DC19F936DF26E93\ 38A817FD55E2EF34071E01C0B96307962469EDA07974958D1570693D6254BC46\ 5511FEABB7D6223D45654BE5A3CE479E3BFF8E5EC9DE3931E894B039FA220B8D\ E2DE3974479A7F621977CE7999:\ 6702A191E32F70E4912EDD6A68E411F88ED6967EF800E84915102899A3D096D3\ A0CBC37A99A106B1B3C1C8AC946CF578AA638164264573085972517AB9F5AAC5:\ C4A9288CE919D007E1823C446A04B33E EA3127AB21E2A44AF08AFCFAF6624A78080103314A48D59A309860D072B41511\ FE993C67878E7566D2AE66D326D8F53B45DD7019744087D2E1853DBFE006281D\ 5B780D9747F0BBD9EE7A4FA2FA72C4F03B01CFDAFA3EC9A4777AF4127BB01A41\ C12F851D1077135353EE80BDAEE96FE3C183271BD38A2FD0C6EBB210AF1C99E0\ 3E45B1417D18A3F8AD4BDF8BA03A707B0566121EEEC5C10B319B732B9B2421EB\ 6839F9ECF897478D28F4F6A79C79:\ F7DDD97DAD526A8A8F75E9DD438791F088A6961FAF8E85FE9CB4B29E95E0F095\ 06E38258121B260874849C51E8939E2E630662B28EBBC379C56103882EAEC5FC\ FA957B883CE9FE51A4AD930A5530A423CF8130989678D74E6CD0AC0F8E3CE67C\ F639D56ACB0CA7A865C434A754EE663E3024E0565A3211DCDB5771A046670730\ D2523D9B1FC39171515EAD97FC886B4C6D46C7E3DDB689E3BE470A21A80D0DF6\ EF9D79555E1A877F6247EDB6F295:\ 2E21BD2FCD60D211F89A4FBDCBFB162C3B95F364B7F7FD7590F32C457EBAF1CE\ CCE5B1AB9EB7A1BDFE705DBE8B5EF26AA3DEF4935D05B7CA35AFA55BC28F3C24:\ 82ADA377171705CBAD75FCB8F0E65D35 E8B2535D6A37682648469906AC881413CBA7D49BE0FC6F74EAE685ACE9677119\ 9941ED52DE67F69FBA34DB74D61D75063C4863C16310457164CB881ACC1CC566\ 71EEA602191513416F7B7C3072816EF31FEF7EAF2F7E82C61DE9A5940B94AFBA\ 33838D138F367F5C7B136370BCCE4C760D6E24BDB25B43AB4F3C3EA9683C9A9E\ 978891139924200437551A0F10F15240816DA6B222E309B80C6A4F5E3F61ECD5\ 0B36D4FB99221DB0302C153427AA51:\ 61265D8C6FCECD326A4F76A6768656523FB32068C5BE1FDA44F14C225EA50C7B\ 2180C470832CF8E0B05F698A700B7DBE93C79450DF3F69E2575AA6BE5A379258\ 50951D30AC621BBCCD898CB05E9860F5A05F23C3685C84470B7442BE7E6DF0C1\ 13E9D2A81C7E205491407AFF681FC57E3E03F6B865266938F943BBD4598554CB\ 5447BB577090B5551893FE99B5CBAAC814624A993041ECF5A451BD6A9C33C95B\ FBF101C08190FA7D8106AA03B8ACE1:\ C66D330C5436E86F4B16270736CB78241C201241EDC7EB5913716496A42BA4EB\ E270AED737CFFA5F2C8CBBF9875DCEA4169284A412CF62896CF388013E36C79B:\ 800BFB1F8F673ABAE7178E94185F209C 440AF99105B73ACA853DE9D61FBC738D5A9C7906B2E78C2381853E84F6BEBB26\ C0DB3507C9FDC0465177A57C0161E90BA98F274EAB79116D1391822E367D59ED\ 447FF0D55A6A5FAC2DA9FD31F1C5E14029E0600600BE2D0BC0B1B02CE6D21624\ 09B44606CCDE909C2215BF46C9FC5BDD089B3238FFD522AC86B51389FC327870\ 471512F08D4911B80B521A6EE735F7EEDEECEBDFAA6E68C12598A36CE0EA2C36\ 853164DAF6545786B05E471E9E1E44C7:\ F4E9C2DDCD58BFA0D71898E731DB623F9D4947B11D02563D8943803A4774D77F\ A08F021AE17806CCB1923857A4D323C8CFBE5DEB36F66164EB66D07C5D3ECA9D\ 0860C3E89B7E1BEF59D976E4C0D90CD535EAFB00EDDEE7C393F3DFE5A79FF2BC\ 7B12879F4015A456FE416AE1CA62816856E50E79A760457254E3729D65784CAE\ 9623E97D5DC609B95E43497A59EAEBEA2F6AC83647935101CB791517A2171766\ D4FEDA925505744A96BAF0527FD3D774:\ C7C3824E1B8364D2DB2DC019957BB5E5CB65099A2C91730029DB0F33FAD5A989\ CCF80612685563C9F4C8F5D1075B2D54DB58679A7B0DAE823F2E2170846374E4:\ A46A9D0618A4666318C58CCBD42F6EC6 BEA38F61B4F285DBC6559D06B81E1F9401386F1BD0C96943B5C251012B648705\ 0ED43BE77FC95613449DAC4530E33A6DCC1D4AF1DFDEE7066533EDDF5B0F5181\ AF0394FC640D3CEF6A6F2298EB8F48FF237105453693DCD960E3283602E1ABAA\ 64EB9523B53CBC8AEA28C09A4B55B9EEC4575D3F9F0998799F10FDE67C4B2921\ 2137627C988DA9D0878E9C0265F85E60E9946D3EAB9A973132506ACA6F57CD1A\ AD563711D169CEE234B4995EB0BCCF065F:\ 242212A8F250C8770CA394EAF117FBF3F3581C86D23C00D8399638D9714D1428\ 5389D22230A2242902E8F9C654751857B1B1541C78DD9B3B2B2631FFD97DC179\ A4DE3CFD8F2279C94ED1F8856016FC735606CFF8321494302DE8AAE0F0D7557D\ 011BB10CB781F8B101732E3BEC2822A20007C4856FD83017C562731782503BCB\ 9CAB5A393D892529192BDD409CC937FFAE058613080F7323413B911DCE832871\ 71B2401A9B34E6A1244E48B810623FA3A0:\ 2D021A692A6F036D2C373D80ECE5D2A3B73B2D66FAFB5B0A6B587C098FA321F0\ 7BD02F3F30584832093F0DC7A4073B55597F5C8F450360A1CC9CC6EE39788B6D:\ EFB93BA156AEBFBD1D73ED80B110B52C 91BFA5CBFD3696A51BEB86EA4AF4751E5D9F240CA3F45B247EE805BB380D264C\ B350C7B72075930F0C3163F329D3EC42D046BB8713ED9522BD71D11F51117E61\ 670B6FE73C7D960C21DC63D144E7B790B67DD5690082CAE7750D59CF630A9C90\ 85BEC93DF7F7A14BD5A46E4F09E9BF73045D1BCA8BA676C8DE8C3E5148CE20DE\ 39FE4831A7C1FFA69CF6D7B2EE1413B5B8902316358435458BF7561CD7508CEF\ 9DEF25EA833491590419EAE766A90271C313:\ F5D4B54EEA1F2524082BCB8284B588633CFC26D565B68AC2B5394E17DEC065D6\ 7EAC580F8E88720D470331B09D176559C032CB06A6A3C1D408B2ABFBB3C5C50C\ E4FB2C142A62A63EE12C9F83B184E273520C91C77F9A4963F692DF477E920837\ 0C77E0C7B805271D08595C6A7CC080FE7767776D0614E2DCA49763783384F2D4\ E70BB29C32140F04B9EFE8E7323E7441BBEC9262A9E3726BF0D76F6B3163B7E5\ 2C593E4560195465F4B39063F64C50FE782A:\ 4450F0026B43D66B3A815B3FD0A0A2DF6D1D980C08F0D8CA20B05C57A8291ED7\ 19898A7AE598B030FC166A4987F9E3600E45A6433CACB584DE54A15CED22DAAB:\ EE277CD358D228D0F1A17638A3B5CB15 C7FAFD52C448D1B4268F834BC1CDECC5DA0DEAE4C30D470DFF9C7927A1A9E672\ D3A7B97F2478C41DED153ACA0F477F6567C6A645AAD73EE50A01532F2D372124\ B128FB75AFACC8E9A750728440220ED567B25E53466A6544C94B843FBB7C65F1\ D8CAA66DDC8C6F26D61EC241D852381D2CAD9E0BA2D819A465B99C67BA275EB7\ 3A23C273E9FAD16C28629D89C4D8DE889A79BD4313DAE3BA6821C12188C2179F\ 087231E5281761E83115F55F6B60D96E2690CA:\ 94157A810F5B2EBA661046DD944EA27D9323F92818D8DC50DC94FD4F49C5C756\ 68FE433675A949128543CE5C3F40984C2A3A2171B0149751A9A577440A49D014\ E2D6EA21210C19117A6C82997859C9B0EF56FD213B29ABC4B19D4A7E3D5228C8\ AC14BD2110C6C435E0EFCE7551EF8CFD12D1B3660179B3F06D29908F2960E2E1\ EAB8E9206B302D13CDD6ED99F6DA45365A74E478231ADD6AD026DBFCD9BCCC20\ C8C95F92602D2AAF6DC42762C9A4CA834064CD:\ 5E5A8C394CE4BAFC5105AF3C3261C627ACC1FE43C0B237FD9806EACD0AB5079E\ 5EA69CB0D7D9DCA748E857D08AAC6BB08E64E39A9C0B89360FC9A006561BFF07:\ 3F8315ED1166CFC4C949D80C4C877B45 AE1AC26A91DFF93B4C079BD4E5E67AD33006172B9E01F1CD255B1300B09FAF6D\ B44E3840986DB22E153B53CC3413B4BB01B945984B45059CF438AE11A6A54788\ AF9B5FE3CB8F4C8A3C57E0E819F99225C2D8F4AD6263AD5A72F67A7B3551935F\ F4BBA49841E92DF509BB2F34E67DA9C0B80DE3B0C3840DAF5C285758D0431875\ AE25F6BFA24C957AE40B10972B966FCAAE32ABE91F9EBBF738F5D677A4CCA8A9\ B1C420986098C9D0B48129BE01EA445EC2533943:\ 2876F104219955D951AC2320D2010877DC9C4202A38D6A9087C711A77CE84EBD\ EA9719854D3B784343BE2A77D3D154879027F122FB41B8501AB4069BD1E13B59\ 03A9AFE82878FA8CC61048CEFC5103FE3BCD0C76A0E854646110BA35239E5C6C\ 34A45BC03F651131B831E119EBF846460D1F2E5754AF08AC9571A3D6FBB2C82B\ 5BDEA8A9A3C2FB9DEB4F8387595B5D6A4BD1A7122CD5CF058A80AA912B191FA1\ 0CC0CE6B69B6A7A2A8E7630F984E313F82D3F8E0:\ 233AF5A53B84497860C3A625F98B832F80347C03D53AB377CEDE75F9CBD8AEE5\ 7377A5E62E7C03F5D454B0337518AA1C8661CD9C96973A6F535232FE57AF0CE0:\ 1477D308F9F6F17E3840B5E23541D1DD 407154D63304014D9F5CB425F13C5FAFEBBCE80918AD24D749E696330E3DB8D0\ 7B0D04ADFD67913BECC7B8843B0AD8ECA1EE7246A4811DD27E15B42776883675\ 53083DEDCBE550132A3CC16A1D088DCD5A8479EEDF25EB3C551569E73107F7CF\ 85E4F151877F22A85EB430FC0BC31EF2F06302CBD8B77B7DD724C9E449A907FE\ 5703551B6D4CE0042D53FF94CA7C7E747817BE50380E1785F075A5A6A702E6B6\ B1682CC34FA475452358BFFD614DD8DA37EE7031AD:\ 03BD1AC569325096F5EEF5D3114FBFA770E9EB84B5A2CE314F81595152474E59\ F1C235C0BD3309CB720D6707B90E2170719A525BD69A2E9D0409BA49019B435F\ D46F42667F6D97A32A094C5AF984FAE19BE6909718099F98D8B01F937AF0FDD4\ 11FE19048B7F703EFEB4B5A51B0B023150B0CDD8B6B0B91DEF1FDF526FC8BF3F\ B3BBE41DE16803935E45FCE9AC3E77F9980AB2031F40111DF44D8B4D8E8A9B09\ 18F84D8DB8F370B739A55E45F48C41666C6EB71F37:\ B4003CDB89D9B78953A5F9CE584698B7F60D48F35A528AB607E7B3374EC8F358\ 9DEB32877E6AB60B7214E11A448B82E1C88ABE8137E4085DAC2F1C80B58458F5:\ E37419CD5E7296D0A960BC833592B15D EBA6C6B0E9A3754972CFBDEF03046F87722C8CEF5712B10AEF2EEAD6AB01C92A\ 0074F2B37555E30D5FFD206BD1D85A810D26370D66494CA4DB339019A70F330B\ 228E06C310BE5B0A108ED70C71C7471ABB61A042E0014B41059FF86C2A2D7AB0\ A5E978F9E1B1A0431B30BB27D1043BCB69810806D9558635B52B26DD915D9C99\ 0540DF2C5C6DD2FDF79652F509EB7CB22E9FE6BEFF80710EC013B7914DCBCA78\ 256DEA744BC6BF23351B8831E3E65D24F365C8276A68:\ 6D909A2AF702E986561209B48D684FEB8E8F182B196CC021EAF6C876874813F1\ 4C9755C4BF7E7D30A8CCDB76707B8D6AE236D974493EF2C0131E70E73AFD8112\ 55F319CDFD6B3E0C054F8340E18504EC94B42C6BA48927C80E8182A9E5D9E3F4\ 0822C71EEC43D209DDA15BBF4F7C2E880AC5044A41CCA11F52DF8E24671774A2\ 2A285E7915F063AF189CB90EF0845EE1B0C6C04E636CF0F6E85F0875E858BC4D\ 6810DCAA9236AE75EF83296063E7D4350F5C54EE694C:\ 19E6976CDA3657FD7B341388DE6EB2FE4CAD36489B55C26FEE2E854FA5803199\ 42C3D6EC2D7B8E998716FAA60539B5B08FB9B35105FF9D304641131844420711:\ 896A1A4A3F825C802B88D5A5DB5BFEF9 CA50890D0642170FB9EBE4C91598F52E43F62F4D9F3D65A26500D77B0DE07A19\ D5856E746158C68702DC10C252C746A37A995DECA63B2C84F946117B45F49698\ F355A110DAAD751EC2460C67DCE33A38E759D106B88374A6980FD3E06B4C5AAD\ 694900B11D43D2EA9CDB19561048471D480C3B62E8CC6365D1EDC65561A68EEB\ 01FD4394ED61F3E6C9283072B95629B9529DF7E6F2D98D35B49A7F5AA8564E37\ 66B25DC64383FC631404E05B94B0D39365CE1D44DD8F26:\ A521CCD850FCA9E3A079127F4D4772170F517711574E9EE0283D5A6B329AC5DC\ 1D61971888B5A246BF223006CD8BF1826F6C9209EA7322F0F6EE33053EBD1AF6\ 97E4C5A30E05B4BF521086A91DD12846D2713CC8BE767B28E24D2D72C1F6E2A7\ 7A153285684D94EDAFB68B3855719FF00E3D393BC72CDDF8931AB96DB1E2BE2C\ 0AD0316D15F5EDA96DB35E1F4C0B1165047DF84E0B53A567CBEA98612F1747D1\ 6A6E170CCAC0906A5BF669A58B08CD3E62229A3C0064AB:\ 1C1911B5B6D11BA6D1B1D2B49DBA15CEB7102C2F2DED6A8FB6BE6E9F78AE31F9\ 70F080072B1E17ADECFAB5DA1433D72B9E0D12555929272AFFEBCD9D42857342:\ 5B6CF655605C126743C49F70A7686CE5 C06142F18A1AB96411B2CDE62F6D1815F0590F4E0DB928CE610DA0C2120B6151\ 8EEB6BDAD0C0CDCEADA0DBC8CBF280E8DB1C7CA40FD32436CCF700DC2A60E4E9\ 9F17E645E5B83AC795C7F2630EE22F2391640C67CC55183150CBE6E1515CDD4D\ FD963C77BD4B076448A70BAA952927AA4A3160BE5AE41168D81941BFE19101BD\ BEE24218B024D9A4E70FC204A1248F71B79E7D3B6935E2015A69FC09B291303E\ 4DA7E29C719644CF096DFAE7E86A1363F287503193D6596C:\ 8038EA8B31C83AE5344790734CBC6BC39F924C440E6B8BE4A44DD58D0EAA7BFA\ DC283A6E802A05268CD3E52963AFB170B487BCD6C894F27655985CFD830E403B\ 818B6A7834D5C58997A0431F6F83C95981EDF1801F6CDAADC06E1DFF45CEE491\ 7BB58D1771FACA8B67EEAB2CD720E17B2C3D604A14850B18808B326833937B9C\ A167C9FC35E5445C733E50FB2922F74C7132E54F9FF0ACEE973DCC3FC7AAEF66\ 2D2AFDA197112B9537A88D8A91298B552F4974837FDFB66D:\ 8EEAF603495BE33935430A0DB5E17D4BEA3E203DC90C54A6EBFAC5280EF4378A\ FA0B42545FEB5FA38C40CAC5FFD6CAFF2AF7BC59F314AEA5B036D35E34F8123A:\ 60CA599121E8D4581F53B105A4C84B84 A2A6833D67884163B1BC4ACE349A201B0A6FBA76E30A6739DF79B399A54921B5\ 29BAB2654F29416E0FC55C8AE1B5B4A5083A87CA787F64B66DA424E879A5AADB\ 3882696FB9A03205AD2CFA80EEE2267C5023773E6E7A53E00ACBEFEADC9998CD\ 8D969D468D625C93FF57E5CBF00EA4AADAE1B8043F09F89AF2A9A478AECF162F\ 978139BB65AA73EE98D6DAD0C9D408760996E06BCD35147D89D87349BFF281E3\ 57684991BFCAD240D52111D9938E7BAA6D7B715ABE3F0EC47E:\ FBA3835619C4E134A726891D95D664968AD65D4CA0C29CBFFB9B215D34D231A6\ 3BBAB20360BDE92FD88BABA8F0C97965DFA8E22A82685648CB77076C8111ECF5\ BE98A75D060227305680F4DC7EBCD1708A1656A71B84014C7EC4EFA4F15A920D\ 3DD98A28898B7A9C7502AD78D45C2456EDDA2E8DFB1CAC3D4F0AF4A9912A6AC0\ BF2619D82F9486FC8EDED6ADFA98BCA157E2D2C7ED9A4A342EBBA6536F079883\ 59AC27C29ED114C2BBDD695A8B64B3371C15A38DA9269869C3:\ D800DF0DE1C35D66FF664BD96A411073B91CB9DDB69066CA1526A7AC75C1B115\ E113B676FC647D18C393498D5ECCAF0DE6C2E47E40850921B8573CA6E8EC729E:\ E745D3E0BC6FA789934944B88DC1F119 48982F039051E4BDE96D9D1344606A5ADD0CE02909632CABE2086FE832067CF9\ A399BC333FE6CC7EC4F202D88D74C8E0AE52796FE1D32F546BD8B491607FBF0E\ F6522DA1F261DADD337C9A15D29C6DB12B90035629FF4CE69C3AD8E8248142DD\ F7BB1413132419C67B4835DCF6A0628A4AC6ABBD888C2C74A1F6EA4B57151387\ 33850CC7D5BF7F801AA8DC3D8ED1CBCFCC0ECDA1846533BAE13B6D20092F04B2\ B2CB136CF968EAE4C4D8CBA1D53C8A6542E25E386B89BDA3ED42:\ 0B7DE8410E19DC8E15E7062A3D3D5C00AFF28173C073A72E989DF723505CF53D\ E68D4B6A19D1F1B76B729D65DA274DAC8F7308E8EE7174DB85581D5BAB09A5BB\ 67809F99D07677F63FDEE0892193AD4C966DF08386B75FF819CC8AFFE0A02B22\ 26C04E5282D3998D2F7ED89B65F8D18667D3E4E17FA3F81E101836F8E696B987\ FE91B81085454A27DB7524F792F1C07C7D2F1AD7BA06E8F60D99ED869723B69C\ 1A681B8EE00AAAA4B65E2A8AB724FEA98F30C8C88979FDDC0FF5:\ 0F5DFCBC3C722B1A770EF88883D997B9F1BF3D146E68345A0E28F8BE98199696\ BD4A6FAE972E2DA9A60897F5DBA6721B276E3255777892D3D8DF8BA1914170E5:\ FAB5694142CA9BB313090798147371FD 7CF9CCE24D50A388C3B5B171F6508FA61E025A8504D55B8624C7CCCE3E2CA912\ 5247CF690B2BF388C36B5386979BD10E142B889AFD9A531EB16D88BF767FD083\ 7F7D71993498968F64820FBCFB28FCA13D6E5C1ED4AC4DA0ED1F6AB74E1308B4\ 7038DCD39A8DA33F15377E857D53429328D222F2D0325F20DC1CEFC3DF4E3F7E\ 456BF5C05897C70E33AAA4A918B44F2B02FF0065C845A3742354A25F492C651E\ 65BD2ADA8298FB85927E334C15DA3B51AEBA97F5CD332E32A26B79:\ E55D0392687D295CF444AC734E7035DF1F99A679203810E0097CECC64E3A400D\ 0FBDEC877F8E8FE8E4160BAE15CB209B7EFC66406541424FA595C5E500F49EBC\ C98941AC4B9D8CC41547252134177B8884A8D885210E886B2C942BFC9E54A3F3\ FCBA4BCFF943AA27C565A0C9C3764281B847DEE305981608FC59FB6C596BCCC4\ A99D4F872DEBA4DB4AB196635E7DFF57132691816D8CC936F13125444DDDCEF1\ 17679461BE1D3E3FD4923125CD2485BAE422EBA40C163C375B4C43:\ 01AB5EB282CABD0531560F5F5EE246FA9F90E26CB83029580BA49A24C9EE66BA\ BA0305B536B2553E2F18B72CF0D2C94FB27216D1B570B14EE1B2317C2EEFBB35:\ 60CB3EFBFF62048EA13C465C0AA733DA 2F99F7174171E5CF558758FE4A13C250F26036F4195A487DDE9518BB0774D500\ 9FE35359D1C15350A167C18B0888BB1BB776951C149C0848D973993375031D64\ 601DD0896E50097EE68C4D648B75C587E57B7B8BE8D8C02F44AFCECD91101C97\ 2A2C151D62FD715A53A732873F6969051AA80DB097EAC069F2CBF8454C01E0E0\ 4D996757DEBCEA1C4960F73DA472DC07B6B72F602B368C17DE8D83705DE1C948\ B5281AC2FBF147BB12F3F0699BDDD873C046152F4450864F99B82F4F:\ 77A1EE11A9AE1BA68F5826591BC9C8D3690FBD7B2D997236368DCC7CF0C4500E\ B1EEB71F1AD354EEA126F3DEE002268878F4738F6F4468D237911F5840E6DD4C\ 00DA1F2724E9BD4138ADCB9BF588BA8CE53617C8C08609D24716C543CF519AB1\ 446D05F3568CAE99685A833526C4B78ED55F4EE556F5844A17E020AF7F4B5351\ AB65668BE7D1E46CA492A0C2CE46CA6EF302417DEA2D342CF12B390CB2753B8B\ E4DC233483DD57570EDD36F2C3CC42425F3CE84D8A26CBF351A867AE:\ E0E260BF128B586F8E49F7511E6ED886655BE3DACB5F6047110CD77EAA2BE2B7\ 82D53734407AB5250E276AD6721F13C3BF21B3EA2BF56F6A6ED13ED4AFF473DF:\ 18D62303ED5F3DD7825145EC928BBD5D BE6683241F0A0D16EE28870D7B9B53EAE2CE81428282DB940FA25F5A97156408\ AAF0B9CC17F4008BFCDD15ED3605040BDD9183D41C660937E7B37AF283C6AD68\ 4EC3F3476E1772EAEADEAA68599323CEE4E8CB9238ECA5F1AEF151064CD0904F\ 5CDA1A9B55DC99553EF0227F916F957A1DB95BBAB9C8963327810F4B15D600A9\ D8B49A0F12769D294FBB233A4CF7EF85F08631E144A247786271BBA0A07A5004\ 732DF666C8554960FF11E3AFFA060016224D3EBCEDF1E653C6B98F6594:\ 7E928D0727144C562E14A0629E7B7C9BF59B81951E30612962EA2EFF48CC1778\ F4FE9F494703EE48545BEAB021E22037D0DACD9C95E51384DAF38EF63E4F741F\ D8BB9650648100ED0467464281569A90FA7DAAB4930F0A59201CCD80947F73BB\ EC3D0CB42226BF3D4A0B2741B4CB6E6662B44F8183EA8B058604499D4EE86C0C\ E7E92736F11E5F57B03DE4D73D7E4D635E5702946790B5F9290B77F14892204E\ A8709DF528958353BBE8C7C8B048C61D6910E5838CA39E3CF854EFA67C:\ 0854EAFD42578C7200803C7BB75BF68887BE1DA526D8E9A936B5A4602EB94B3A\ 353DAC9F4891DEB8A36CA2AD870A909CDF71D9A29FBF23BB73F556A7D0787421:\ C38A6EA283B7B63C5E3D5E0554134C62 72201853E4271966921887B74A3FAA2A7D69900E334BB552C56045A608788954\ CB434B597D7A3A90B0E4F380631FC39B6B97F3B716305107EAA08D7C9B9FFFFD\ 9966E873E62AFD3333F7B3AB66BDA1B7088E38C0C0E595F03193434D6A503B08\ 3F6B5939BA1FFBED2CFE98D86C2499C2FB0A412BB623E7BC0C962D57940E84A5\ CE5135245DD6D23C0EA7C32D2BFCE1B2368597AA73CFF806C477D14391D12247\ AE6FA1D2517DDDDFE110A0C33234089482434E5D4480789108A565233A34:\ C5E2845B7306C15C425127AD6FDD198BF09A9706BE52EB9F06EAEFAE2426E3A6\ 0DB79DF0B4A859BCC741D3A21596EE325E0AC904B7BCA67C2855A8022EC0C977\ 46A18CDA481033E80B462FF238F2A3BF1ACDA1A8AD89B1C7E3DBE100E9BE3044\ AB7E2E4264C0C5244F597506B9EBF74E93E1A051C9166E4E833E7D1E8677224F\ 535A62121DE0235C3D5DDD2DCEA45C7FF0C640E33A5033A619B416CF085DBDF8\ 661B3E3AA14EF0C81C62DC9B7E7FB0B475874490274CC958051F49045053:\ BA7F55327FA917BDD6F5A9678F69E90E4AC4B52B14D75263653DA305DE0D2FBD\ 968696418F95F5BD8000BDC39D86B8F7C13E982AE4D5B0C2A698B1882FB8479D:\ 1844F3A80ABC2D2DE330292CF921379A 10AAD0F7DE6F8D658AFF5CC5162A71A0AD67250B7E2E6332826B7BA8928B1910\ B6A6E238E8AA85925FA7D50F9E725AD9192D895DC4F6960CAD0E9D79A90C6744\ A70DAD60D96B8C933925209698550E4B93A17247C601444F4BAAFDDD63414A04\ 3146C21BA6F09ECE597DE730922657BC0E01148911E7591547A33A111C4B7BB4\ AC2A803B4B2CABAF98E60440E635FDFA8386A94D77AB9989DC2270DB9335C26B\ D7692FF3674A8F973747AF449A9BC3CBF41D999CA4F7B0D3FAE10B2EF4977A:\ CE081752A44548135672520C5B3C49812F359C4EB5CFD2D9C85377AB7CABF248\ F514AD88F6C86B3312CFABDBF9B94B5E07D5E711B0B355B0F1565C639E8DE246\ 505AC67C4EFF42C0F3C52FECAD6D9556C074B9321C8677099AC5B9B97BD03A2D\ F231B45EEBAE2443343E62675D3FF7FB66520C07DAB62C498F35DC229E0F8A9E\ DFBCFDFEC844D7D45FE23ACFB70D7B592E8DA050BC5390A669FB7B0D31B8C968\ 89A50D9365771DA0B7C738E321596CD706062FDFCBDC1C8EBE1543DE8C1339:\ 00425181802B691CE6D1AADE6B9195CBADDF8443D60C9515920ECA0763790430\ 2C85382CCA53F6803F5B02DF03AEAA36E38848A2001B4FDAF706FFE4374C6D3F:\ F3732079EE37D05203170631E634D7CA 836FA61AF56B019F692DE12395BFFE9E1FE2D9469DD6969AE32ABBD024F8E959\ EFAF934FE1E80FCF17264C950E03CDF1B9F654373F8D454064D8CBE61E596D16\ 1743966F42B9FBC9A9948DB37CB770476A7FE5655739EF1A894C17D9B6526D7B\ E8EF1EC19EA175D8EB478650D71FA824BB31CE6E5B1F96778A4E2EE11FD555ED\ 843E7A95E284F231D566ECAB8AE21A0C30D9B89443F96960F2792B3611CD59B4\ 1F8F884A3B7A93B769300AE037D17FD1762A71A315A41AE2F5DFCDC9D3A99760:\ 685D83824AE8A5607A5AB864E215BD6355F29A81E683852BAF9994D2148E0D9E\ 8E8DD8CEE9439FB265C8F07C68C34304FE15EAF392805769ACBE78AFB1CE56CC\ 07403FE4C8166D7276B22311437CF06780688FE697E8C93360E8C848C21CB33B\ F655CE1B9D68EE9FCCD81CFE926981D969E35869C65DCD57A81DC543886A774A\ 3AD9B1845B95DA3A0F5975120C72CD7F67BC5F268546AED3D5AD471DF26ABB46\ 4BE4A614039B85CB926D947208F1754CF652A466F09305C6DBF20DC4A05907AE:\ 99B1AD739FB6E0B0541404A43C619A50224C98758CA12739E6781930020A58E4\ F2F6B0E6D1FF0829BC67273B92E61A03DF9973EAEEA178D2914F0E85CED2D0BA:\ BC2F2357CA8BD1AAA4E5B5E474A4AD8B FFB0CA3E6521204EBF83B9532306778EEA543B61A62EBA98658A37C3AAB970EA\ 888703A80C98584BF8C5DAEC130C216426BD46AC6D27664F5F3A39795D029B74\ 8BF4D3F9677E37362854235097827EC220D016E051BC41FFD90A8FCEEB13005B\ A2700F73703B1E45ECC50904660FDB9567C9BCFFC4EE9B2C17E6DDE2663D6CE9\ 97EE01CD7B0A0EEDD02E6E447A090106B0E3825914FFBC0186712EA4A1B6B40C\ A3116ADB0A3671B0574DDAC03EBE119D09A1A9068947251A6607EA410FF7768B\ BE:\ D8041389DA35C6C12AB5CAA407D588EDF56E27556F8A56BA0FC046EFCD590CDD\ 8122408AEF8C93EBCEA7D805B03A9459A34D536287DCB176472AC0B266BCC08A\ 28747E5A3E9E436BC3B10022144621C813DB89BCB08314368EA480A469EA19B0\ C7A633E7E09B4F265CFF66E4BB4C14642BC02CA540B83A11B76C593B1D089D11\ 8BE75C289D41BF98466D22BB7012E8164B88BE7A4C0F19F21734A4B73E7E1114\ 55AD6F05750D91486DDC8FDFFD4923AFF703A7769349A6F77A408428B7867291\ 0A:\ 0F9359119866CC79545EB83B4532B7F002AC00BFADD8ED35BB96A27430609D74\ 1BE214E10A6CE667E177732CCF5757E793CF0C6BD54C87FDD7EDBCCD74F3E47A:\ C77842E2421FC96B28CA883E7E0ECEB5 F4D74CF1120BB7D9ADC3F92D0B08610060E2ECF6CE7DCD85B2D4C0413735FF3B\ D8EFAD39575F6A7477D3A7DE3DF6216A3B9417240BB7FF7B7A32B7A1AC0E3F6D\ 97B91E9BF884FD685D5E4ABA081A7D3DA1AE7D20089DF77D72181A2C7E3500EF\ 226708AECEF8E1AC2B60CB2690F5B6FD2318AC4AF94432947D87C911FED3B5EF\ 62F5AE5170FA4507DA2F063FA76EFF0F4E158C5F3537E7192304EB1E40789110\ C10535BEE49397238A27410F6C10C592CB89EA7165C7D5D43081D07D53A74144\ 4950:\ C6F36FE628D05D8037744D1B567DE8FE7AD85C97E036B04D3B27573E31D8E1E6\ C6E126540895394655F8F01010B4847E28DF5C66AF7F4D50624776F4CE08B142\ 0FC95A6D7637E696AAAD1BE671F21E961055BB2CAA38EA3BCA2BF0515C0F7F6D\ 4EFADA92ACDA1414E370FE8BDD4D1C26520B11256152640189AE5B1374462E53\ 1B321EC624A3E254B6D01301B7C25408F424183330E59E238220283BD12B5354\ 4439C4EC1870FE892B1426B772B32C2F1022BB5ECE2AA37E9E97D7BF4BE1F15E\ 7740:\ 938F609B68DFD173878D66849BD764F736F4C34EAA0244B75C2C37AC2ABA8772\ 6C00303EC3843D8518CF7172C3CB4D186249522BED23C53090CBDBC997C28A2A:\ C8C31D8874F3EA57EF15236BF87E919E EB5535E6E264DF02DFF862853713A89021CE45358D74D95204D6D3D788C07539\ F28EEBAFEAB7023D81A40443D8C1437B6645DA895244266C4F6FBECDEA6EF08D\ 796AB42D70A6D076872C9541A81E3D518F2750B8B47C896688B981F1AA310F16\ B0E85FE1E9AD3D8437F7FD57866FF1A934BB7BBE828BBCED3DD18EA9B9AF10D5\ 2CE35150A846F6AFAA8B72050E3F2639E61A26C5D929259EB58B7D74212804E4\ FEF834EB29A4242386CF6859F63C0B5843F7EF39C75D88D262497679D5539699\ 651573:\ 71B800BE49F9E28C49BAB3118DF5A4215018ABB16A18C572CD170B97A9ACA4E2\ BA03DEFC27F97A9743207D16C3606FBBA15D913CD790EA5B3EC7B6E1B3B9EEF5\ 82FA3836F688A22101F49405037B510D802B2EB30E1659AFE3B90C603D78E87E\ 9F9E92934D76695D218AF314A275B06D61DA250140232284C0B9169F9C00BF0A\ 10AAB0B73AC53737BFBAD23FC2E0AB7F3E61956507D58119C2FF95DE273D2710\ B2E2AFABB473787AF4A6F58A4A5A762ECC633125B33AD564B7B83D60B8D7E6A8\ D5ADBF:\ 4A27EB0BA6D6EC801314612D49E6905B49FC924B76BADCA0710EF57797BB3EDB\ 3F9A8FBEDE894B6230AA154F7374130255B7F5AC37CFB8271392CA1B974B4300:\ BF6EA44D46B4878547CC370354DEBFE3 559E1A0F4AFC9269AF81A8D063FFDB4E633448C20C195C3BA8408C38EA6CE6D9\ E63B41881E817281A6301B3E41356B0D4948F1DA4B771AF140734F698773C974\ 21899F5DD7AD05D6A70239298A343B4717198E7C52276E942168752878AFE0D9\ FA764B3D30D65FE88B7DAF67A41DAE960F2997C803A77AC5DB5540521EF1F4C0\ 87C450CD19A7AE9B7858F599C0E194B81517A5A3DBEF27761A68C7D2DF424D7B\ 16AAAC1586CB0EC363ED6FD00F5E7B3F903C79319733AA6C6EE8E9F341DA4AE9\ C4621DEE:\ 7AF5A8748E6DA60C341DD9217B5631BE653F294EFB8EDC237FB0F27187FAE80B\ 09E647813A8DED7E4183647C339D650453EB69EC9A6192DFF2CE426672E236A4\ CAFD33541690678106937DF3B3F8D932DD6B215191FF0581ED893247837973A8\ B99CC495187F940EEA39BE90AD3DE0E7CB9CDB581A52E9BB7F1BE78D7C8D6BE3\ 808CC35258EF2DA54F32D5AB231F97FAFCD29CBF1A34838E4C96A055F2F51AF2\ 7692DC6ADD11C4E0863E40BFF5760CB2DEAAB037049491D696EF9C352DC8372D\ 4AD0BE2E:\ 0014D024C8128479C7EB2EDBCD188459B403C487A8912C1D010656B66A2992D5\ 49B04467EAFC90F2B013FE5C52C109908082D81F639DF9FF5FCDF390F27C40A6:\ 7F80E0692AD8C618C525C7CB21A89F82 EAB86C11D76FF55B2F035303C4925A8D0D0D049C91BE92B9CFB9DDD545EA5D14\ DAE32F1BE7B0EF21B3E0EDA1B2BFF9B2D387B310994635E4FC607936E1E365B8\ 0449EC00678E591771999C94F0DAFDC61BA2B191C356ED17928D2048AEA44A4E\ 19D9FF4107E44E2A46E6ABDBEF247B6FA796CB288631DF08621FCF5EB14716C9\ 5C35A77C9DD9AB9FEEF766E977292581199F747A3A7294B2898CE27FE86FBABD\ 1F05283E863BE8B95DE2FFCE529B473384F99CAB6B73B5E2247EBFEE42D92858\ C2A369680E:\ 61C702443AC36E6A9E04D892C24A456C1611836412D3837420ACBE81632DD6F1\ 5DB8A37E36FF0301B033AA4446E2CE5B42160ABC986E5BF08306812E893D2665\ 670EAF0B32963100744AC8FDFEF34F29829DE7EDBB331C1FA7BBEEA3149AE5C7\ FB77E8ACC8806ED07359EB140CE96D68F9FB798B36D91AE46CD1F4AF0C5B9E94\ F6366674063D9DBFF1AF01D6586AE0A15149BAD137B7161FA0BD46B3753A4497\ 2001A651CD1C1DF5B013BFC4F64B22B840726BE02D02E3DC7AB199B220BFBBEF\ AF1B24090A:\ 1EEC7FB21870D49015110AA970EF8D90AFA9A70D7C42D8565CA95FF4DB5C9BEC\ B81C87B413DE401567AEF4336366D1AF9BD900EAE670E404FB1D0176B970E613:\ 2794A4A65C67CE7D7F426596A92593B4 D3CEF9E2293B9FCF61FAC8D66176B9B227D38BF32376335665EB2AB89BD2338F\ 480A6EC7F74697D901062D9D99C0B2BD3242A22C5511EB250BECDE63A37B32B8\ B4545FA5CED7543427268456C75FFC201AA138EA5DB48BFCC80E939F9BC3F6E2\ B16E8D614811B6E75491F1C3752DCF55B314EBAF26BF2BED9614F14CB553F501\ 3FAF0979EB3D15D40FF94702D3328D15D1539D2B265985A9D2AF836B99BD1592\ 35C0B1C3C27AEA16408182B457E70E6DDE0EE6EBFE487CD481BCF2349664D391\ 34D3F0409CD6:\ 30EBDCC9883E73A68A1DBE5F62B29924D4478F9A97FD87F9307087D02D130DA4\ F1B4EEAC478B0A9492FFCF0BF3BB34799827B366824B7717E30AF71289CFDA2F\ 60C3F0F72568206190E88D3DD9251D1B8E9AED0BC9A8EA54436FE38593255750\ E7FAB4F6A1CDEB703C6AFED2281AD873ADA562F1E302E74FD534B2680B9BCE2D\ EC3D2988A2D028E3FEFD5337086C788CEE5FB3D76DA15E2C94CA69EC81BEC27D\ 374250C8B55F895BEB63F1FFE11F4BEDDF624F7296A4D135187D0EA0F1C352C9\ BB61A71542E5:\ 91288086AC1F659A1901692B52C3E4EDAA0F598CFFA4EB58BAE8E318FE2B81F8\ 1BBAC50DAA94534683DEB7F7AE314B7B12E64B5E2C72E07D05F4F3AA15EA51CD:\ 8943336E2907D7901F0544481686E287 CE3565BA0A89F5FD63C7F3E30AFF76B1683A2A40556EB33CA38B2F53058DB11F\ FDDB6EB83DCC51CC6B4EFF7A296481499E2B746674B6AC433088F52F09EDE54B\ 30BC6E2BD028E611A3ABAB6B86054DED15C7B43A56B3A22D15BB5C478D68F3BF\ 77CB0C60173856DCE5444E0B1043D26F1B6DD7E93D09A4F64894D63565289A01\ 532216C339B20ED8A5BE6700EF9BAD1E08F413F94A4291969DE1391611E1374F\ B6EDDEC206E4586FFCC9EEC97CDCCE7E40C4F460DC115CAEE830B1CCAF5C70B0\ 1CFF670FD1DE98:\ 83C3626169B4AEED4F276AF82B2934463595C68D816C1C095598F1691AAD98A2\ 43703DAB5F3D68E2D56A2D2EBFDADE769D4DCD6BD132D8C32A977EF55DE984F6\ A2A6E6C8CEE54209AC58E24CFBA30D04F2B50A9FD007FD0FF703AAC26D12DF79\ 9596543C425527236D5BD47EC59BD837406B4E6317518C5DBD5DB84271187545\ 5B9B88EA1FD5DE4CFBBF904CC10B2CC9D1EC949146B75B1AC84893E424962655\ 305B09B149273677794D5444C3BC1EA36FD92FB966EFC455FD5EC5AA769281EC\ 3A726223528C11:\ FC1C13484B2B69BD698876A85D4E14F4C4AE82A1023207E532F8D20ED69882AD\ 62F83089C1F5E5CA8918B108C78F1C84FAE8ED83F7C8F8556673130118AD1E40:\ 09F24D8D1E75377816525F7F201E66B8 54843FA8D6C7434DA1E7FA2D2FB2EAAE7E2C1106F1636F35F0C97CA1101E6068\ 8C87CA5281C2C4BB6FF530DA7521FF42CF93FA2A150AA751E474350BDE382DCE\ 7895BC52E31EE95D3B4C5894B19628F58C3EE519545B5A7E0E73931CC2238E26\ B921DB7A400EC6415B8B4DC490942AFD73C6BDCC6B351DCB390AC043F2370027\ EF51516E8A1E28F8CEACB27C6E3DFEE94F70E2E744263DEB2C03AEB80AC1A6A1\ D79F819FD114D1C67F3E397DE2A845BE2415FBE885B3B17EBA177F4CC4093BA3\ A1ED3304F5E8416D:\ 35E5E45974FBF64355571C5A1BF0AA69148A8314904E8188A0DE952B4F9BB436\ 53529765EA698FB32C73CBFB26E7589B3EBBBCFED7ABD700957328A5A08EBD97\ 23D95AE5688A5DC83F3B490429A62BE8A746D0EBFE1A8F596296ED40E16BAC72\ D3C9C8D7508A9743B9A950813E401A97DBBFAAC0605112B040537D562298A2BE\ ED7E01002E01165979B963E44817A1B778929B9D416B0EF4E0D8643D339534A0\ 46F5D87E107C588C1C3624ED5C2B7379552EF21F62D1577B4A3A4FA95FBC3764\ F5C43B589000A99E:\ 41A6D1880C7E6FB5BC5782AFC2015A2E9AEC92E1029EFB2138C7549FDB9780BB\ 32603E8C52447B5AEB024CE2D86030DDA01E696B4E8E2B2D594E5A45D383A9DF:\ C94916E92FE1B1D443E2B8D02588EB0A FBA6AAF6319D687E7B47CDB6AD81E6C6EF8CF3E95C583C2CDC402AF1ABD7B580\ 8AB73BB9331D23140299D35E1E10D30FE957E314A5BB4DBADC2366BAAD9A0A0E\ 641194373F51BE4522461ACF2B5EE471EE356C47436C1DE4FD97DCF7515BF14B\ 8B45F05AB5134297B38E7A6756DA9FF14AEDFD0A9E9013C8791F1E4E142618F5\ D59627421446589D6E61E7135963C5151358BC7282BA2B56D28DF9BAFA7E3605\ 99C4C948CED58B45119A2BD8E936EB362DC75AFBE06480AF2A985AA6168F2FC4\ FF2ABA987FDC2253DC:\ 3C4416D1AAD1782CF5B2A2F229C4511D7272F166BEFDE191BA2BAF9B14AEB44C\ A72E1E8C899A75C9D1282D55F6364EE2A13F0FF4AEC38A01172E4B7D30FC18AD\ DD8387ACD3FDC59F39ED45F31756FE5C7A1EA1E674C8029DD562293129BC89A7\ 00ADBC8E0EA665B96BF04DE20433DB054DC33ECEF7773C7D7B117B633ED13673\ 8D95E8B31E2AB0941ECC780F855BC41504753F16835D63F1A51708E1AEB260D6\ AB38E3AD7AAFB9A64CF1B11904D3D54BEE9AEC2F2AAA0FD1B68CB75DB0FFD344\ 1EF7056F7E292FC182:\ 01870569CC3ECB136C5413027144E51CCBD8A36E15F2853744DAE7B4E74D1066\ 00B801BBCA38B8C9EA64E87F42C4643351FA5C84D002295A1CE0FD75FE8DAA2A:\ 78CA0FC08EB3A11915A3CF5AEC8604A5 8B8F766092CE5D8DB2183EA44E5E8E18461845993E6EA588275D53FB45D2548C\ E9EE837C66C8DE93E4A141CFA9C2B22987A5994E819AAB19654436F49F4594FD\ F5D8E4772BF3D4460B94BE1665440BF1CE351EB74CDD87B21D7F843C6CF0D24B\ A1DA47798A1BF180E47268C097CB112DA816479DF1078E556F232D29460E849E\ C227106F6E25CB9D60BB956218416DACCCC102D28511ABBBE2F9A053F8A982A6\ FE463C9761AACB368CB8D3F91F11BE6D4C4C90BD6011D7499AC760C0A9C3F807\ 0F3539F5B0F64E6D8DAB:\ 539DAB85CF2AC519581A6E0D4460B65AC271FA0883E9527FA1FE1EDAE9936902\ D1C14DEEF8BF561DBB4AC4C7A59834DAE9909FE8FADC8AC4CCFA69E69EAC7DA9\ 84DF2413430C40DF35FCF6EEB0A3280BD96ACCBAEA2EF87537E27359E1CD59CC\ 7DD93E02A855586974B354B12764B31DEBC62774F43C193D7FFC0B836AA5DA66\ 0CB5AC08470B19B8709A90FA89E7FC77FE4BB31B53A4866D97AD138C154DA17C\ D6C1C59634A0D12AA96D8C77D276D71A07E5F3E474FC8D422346488380FEA71C\ D096889544B86F1F2030:\ CE1EE8443C2889AD1094C8F215151896D7A938ADA99514525DD446E9B5438F47\ 70A550217775DB49E0194ADDEA387EFBA0B3FA28A825E62D92CE4760761000D9:\ 6B1E5A4B9A949178007C4A33B68C64DA D22225652EBEBC11D761C4F30D21495978B1F0F1D1E060190A9EE063D7385927\ 4E0930D22B44E57D0C02D3603FE1C85371769EAC22D4FA18566160AB5B1644D9\ 7961B9883050C162A4ED618BF10A148D38C06220AECE472C9C509E762686A7DA\ 2817A26713274DF49F72E6C142ECD830844E25B08EBC1782C39B05684216EA51\ 871C91AA28396CBF4D2B8A1C65D9C163C28EEE8FEF2D3C04106A9F87D33BAA54\ 8BB6A5BCBCC8B502053E38A7FEDFDF17CC406C88604FD6C3852BCEF2F3E22216\ 04F7BF1B59A00976CB705B:\ 9078B3B946188F775C3353011B5C1DCBBB43ABA72F454E6911B5C863D905BF7A\ 93118076029E4470D8F3BB2FE7E12A942E739C8E4563D458586FAF3D048FEA9E\ 294ACD4E218CDE4771B29E456A91ADB71F3889F8BDC1C3EE743392F307E30B6A\ D2E2FACDDA13A3922D8D54E26F284EE6189912E50EA437E2EF0414C265545E29\ 0B1ECDE422941FEB4505EB350C0A338496A797E00B4014FD5983AC29729595ED\ 5227B0A401EB5462F78102D3B3372C042CDFA08C64ADE093B4A1150BEF1BDA2E\ F722D4CB983C09C8E60CF7:\ 3E7AF68C7BC5A02CC26A61A72E6EB122F86870395D3DD8FF54DC2F7DCADB63F2\ E1F64222D8C0721EC21389C58C2C3DED9F9D2162B6B9AD670C63B02793616F16:\ 41AF50E9009570145022F6D31E8D2409 535488E23D8EF1110EFE7F5D3D2CA7E14A3EBAEA9959E52D26B6557F26A327BD\ 06BFFB125B613721A2046A877363CAC3AD9D636DE77A2BFEE9B699145AC568AD\ DC859947E19455EE33B129C589A508C587917DFD7EF4B9017E5ED3E98586B970\ DA77526627B50CEF46E72D84B6372343DE29F9752F22D40E62CE30DF9ACC308F\ B0BD4BFF1193127120724D44BFE2CD31A340A16F129656653BCA1CBE023F51B4\ F7721F25E1FF6D8E6BBFFAFFDD95D57C2F5DCEB57B1D576AF664E3E7979EF370\ B24C55FB2301A9EC85496963:\ 1F2BD60C7A4CCEEDA6010DEA2FB0D29491122B8A4BCD0DFA69AF58EB77DAF134\ 2575985C3146C8E0ABDBF9B67F1B93F492643FF699B4FA81DA8018741720749F\ AF32B992F5FAFA93280D578A40632BD47D8750E2FE064D851DBCAE9C87A6AF00\ 1620CC179154BDF468332DC34259B6B2DC8E491A2E32EC85000D009AFD6708EF\ 73D0908B176C0057F9DA0C655D142097203D071C69C330D8667B678D9F748EE3\ D3C21F475C29982890E1C115750B5E92B4B843D891FE7F6D9EF16356916DB25D\ 80834D2964E2EE8E94D3144A:\ C3A5336F8A9E57BC35E34F741A8988FB86DD46E56DC9712E845C390E5246F300\ E8AFF73F61CE4619DCE7F3437C43D7F11BDF7A8A6D6515CACAC126C9E6564E5B:\ 59CB65F72F9C67580A5925395DB98545 27F55D03CE4568AA46EF67CB5ED66D2575E0CB5729E1A4F49AD4273A4A312042\ 02FE603D3480496FDFC4BDA751E39FF0B277C79883FA3AAE55FAA9661669C0D7\ 37B80DF9871D578D5DF292CF74318C7C3DD8FD623133D91B4032CC6DA726C8A5\ 5185E8A95D4F54143E778CEAD9D8046AECDB4513FDFABA2289F2DE9E7870DBEA\ 9AB92E0DA186999F16FA4D7FDAF44E11F784CF1D76A05AA27A2EEAF288B6DA2C\ 864A7ACE5B853B4999C901386E178BE0CFF2E127D2FD92F8E15FDB9E1F0D12E5\ 06DD8321C2C6EAF6AE77C90455:\ 667A8684FDC754279564007897B708F55D017DACFA94582507B430B5C9E974F8\ 6286C80783D5141B284CCAB7874C6B1F1CCB2F2DDB0B0E10A6B7E73408C19F26\ 9F1C996E20C3C3570EE03CBC9BAAD580A2780D6CE28C83ADE227755B293112CF\ 7E100072833964A4BE6A56699D0451AF1C7C5007E3EE65A93F81C5E743117B78\ CDAC949ACEA36DDC4576C4A14D078704FDA4B42B306EE82CEF538B1D4A4C9011\ DDAB3714E950B360A49EB5F5AF43E4906C2A002D183B48FA4863D1B200EA5C55\ C13949ABF0A32F662026283835:\ 166FCE6A689E4A5DB654490AB28EE5773B94FF4F85406C3CB06F1AB813020B5F\ 71CB5588475D950674EE39BFA247B1181987A2834709224873F96E557DC29C8D:\ 08CD9F4AAB271859780ABC85F02DA6BA 87F23DDD6C133E12808B4A4E7A786988FA9A515EA83BD716D1503F1DB448E8F3\ 139ECF424775FC9A47D3C5B1FADF693B632BA0E380C352F491BACCB96B696E6C\ E122DEB6494C94FABEB47CE633E333EEB83FA89143ABB7FC8683BFAA4F47D26E\ C52F53438330CC84424C92B387C69222E7B4901C82C64EE069BC068B86620471\ E434FC8E17B7A8AB635684402056C543B1743C3ECF8448E7B28FC2369AA5686A\ B0E5D7BC3206FA2E0BD79DBAAB82D81DD75271A67301368EAC751368C527DAB9\ 73E1940B704BEBD528D0173AD67F:\ 08CE80E4171B67867ED224C3516E4D74EE85F3C2F7F0866803FFBFAC944D94E3\ F34A703A21DD6D759A7170C416FB797EBEBCB326636A2303A0FEDC7A5558BA5E\ 546102E6931393F7BD4525DBA146153946910D7246EF570E481F470EE2D64AA7\ 452778897B6F4929F96BDC34317301EC8AFD0D19350A04B725678FEA80775970\ A98E8E4187DDCC2C223C3B08DA6197ECF96F3686F1B46DF77BCA305CA75A3F93\ E959B7C62EAA636818683BB002EE1592F6D84DEFCCC3CA8B5E755CD4F2B5CAA3\ D162114A717850890744AC43B1B0:\ 6BBDE2C7C857D63A3BD561511630F09EB1EA1D4AC4062ACE2775E7B186D3559B\ D9376E4584E3664ED7CD9750830AD66AF2A88A063DF721CE8AB0CDA309B5EEE6:\ CF3559AD8AB802F2D91AB264AFEAD5F5 D5CB8E131F5954708629E18D602A29E6F1551311C28D2C808D2AA0EFCCCA922B\ 11E5E12D3CF1A656DB41D76A926439ED803218FAD76AD5B90D4E8BF90F77BC4C\ 73D0444C6CB7B8A8C133B0ECF85B52E9463B0F08FB20A5460EF84812D4B77C38\ 1A98463F76B37F2DD2BF3CB5046CA9561B5292EFC46FF32EB1A5D4F714961E31\ E2A97B7CF7832730023DF0A6A1BD79A48D705337CB60F4B62B00137EFEC88018\ A67362342863A0FE7E3A508D056E16E35648D5F13CB8D5871DC91BB814077EE1\ B134483C76950BE28885B5E859A60B:\ 5AD28D8DD9727F8A2F4095F21A5B5374BCA27C483417A3729A9EB9A1A9D52C36\ C03375F8824E27862F70D3923F795A7930B99555070FE1BE23BB5D257DD523D2\ 7A06713C8B6160D287F70783E020D99527349B1CF863E3B68ECB791E702BBEE8\ FE4857939D9D361FE1526C70C512A6C55C1C2DACC969B7EC0F0DD0D3D277F2BC\ 9CA1910584DD8FC0A8A61189B9C2ABAD3C97368A1506F0938D71670D6DD84A74\ ED40FA8C8DC3F08EBBC3F8EED784FB83E335561F45A43D776608AFD83B9926EC\ D34EC4DCF051FF61F5F3D9282C7772:\ A1589972F5DEC95D976E7B5DE44CFEC5A09DE4A6FC70C27894FE49FB9AD76F6B\ 7318651596805C8ED88E1D27293CB16782CF9622C93832EF3F70719E6725EAF8:\ C1094E3715E3AAE75B71E27AA4A1AF12 8E843FD325442267456066C1B459DCA6B92D5CCDFCD18CCECE7F081F3578E9F8\ CED6526EE5BD94EE35C4BF7BCFAB6C6CDAE5814F5630A7AC432A1A4A9CEC24DA\ 57F18FAA1C4E5EDB78BC3E6968A3D01D7AE65E419E13F9313C749E3A98BA012C\ F8907BE47837E466BD391D22EB51141765029E991D34F60D6E8BDDF362289BED\ 54AB48BC1312B6B4F189021F4E0D8DBE75C2B34354614F15E4FBD482F9A535AF\ CF7287461361D3460D893F95E368B1A9CA602A78280E741D81F338BFC8E560FD\ 8C09216D18648C247B90EF04A60A11BA:\ 64A6E1D09FCEC7F4A126E002D30A2FE00EBFB577861734A92DAC871A52C4182C\ A140FCE10D9FC78F98D747BF36E368F01B5CB35D8A9F3CA824C03CCE0F34CF91\ 5872E0A913B5534CFCD135FA2DAF1346BF6EA236523FF3AC4F5E56F645BF7F95\ C16BB9C944E289BA4F8F616F1E137D529C0E9F4D08C83971DB7F099F0A391FB7\ EA6E5C5A5742794B984D4AE39D510A929AA17097BDA922024E1A2B1FCA0335F6\ 09DEEB2217474EEFDA9CC46990B4DA0CA0A70E37D6910DBF5EBD60F838D9BCD8\ 254C84CE4ACEB08DD3CC902D395EF7FB:\ 50C5796077D4D4B119F941EA5E83C143D0AF8B07C917C0F1BF60FC3FD80099EE\ BCD3A0EA8EA2C3E91E02AADCC09AB58BF4CD3C87E3F09626FD532DC481A6ADD0:\ B2F73EE5955E2EBCDFA7E942E5C819CA 099259B6C95BB50843F59960740BFA94A6F001E02AE7E822F3385A9137F5D440\ AAEF70AE9B34DB2F4827127C7594971ADD584DB84AE5E80B1002704BACAFD7C2\ C0E3CF97AE76057B86DD215A917B918BC3122C505018725A35487150E31F18C3\ AA5435D043AD825E4309E9E63F9EE6D655A6D6F9C08A62802B8FF2E9650D5D95\ 0F3B8B7E73C5F41DFFE3509FEB59FD71A609C47AB73DFC47EEC38D6A4284EBAB\ 6094D382FAF4FCDF5A5EF33ED44288FEDB524A8F7DAE6B05EF0621FF607ACBC0\ 89C4B69ED11A13A2162A275ECB673D4ADB:\ 9E12CF883A752DBBE6E184F1ABD72099001351238859B6C9B7CD04CEB78DF1C9\ 7EA8BAA0282B4F03CFF4E81F55153ECDD2BC20F3A25B029F302B30796B0C006B\ FEC79D8F182300D74F1D0D4655A54B3C311E96431AD95ADF9F530FC3CC088A3D\ 54219B4AEAB5C01003339396E097BA1F716B842505CA4C492B898B805259CFA0\ 7BC18B9178BDFF658825010A1B4A63EE5D09CEDBFA205D1875AE4D423EC06D48\ F319BB2D2688EFCC29E3D8914F63AD6EE979B5EB832FF1130FEC0610FAFEB57E\ 89DE31BF911624DA024AC1C76D023D7663:\ 2B316C30C2D2E3A7C4E2A7692A3DF1A403ABA403D50BD53813E68FDC254FC714\ 18E83C733F9F3B98DAEAD607B6CF76D7755106BD93F87592819646A8A4ABF96E:\ 64F6F7B88A048E7AC629F76B17C294D4 6A7890CF1CF056611B1FD8BA6F825832DADF96AFF3CFEA7C21F9D8EF7D6ED286\ 99E22E21B97F1CFA5BEB0CCC217915A38F2EACFAD1371865ED9AF1C89892DC11\ CBA083706FC32221DDDF41AFD69DC92D08C874BD87D72C29605A1C986BCC0671\ 44CBE8511AFC2FA166BCA05A300D8CCC72545412B5558E1D0E626EA4DF8EF15C\ F3532B477880AD18CDB913287574195E5D6A2FE03C1BFA588B14458518B2A3A7\ AF06C23F5E0121EAD5C68DD933A6A8599ACAF630B5DC8CD11EF7D94E795D837A\ F8D9DA3716170743231B60859BB89FB1297D:\ EBBCD480D7D3D6577B08FF325D73B11FFB0B80C7F16AFBB824EE8EE4CFBF3A5C\ 3002675C560C7535F43CD765885FEBFE9049CD991DD69F3743A73D4C0D8F688B\ 14DDEDE0B9DC7080588B7E66D3F4233162044B725E3C16C94C55BCBB82EBE67F\ BD8086BBE78FFE464B97FD7F6DAEA0BCB5FD153B7D76F4669D2A4A53F8A0B380\ 63289E8E76D0FAF64A7363BFDC12FBA45DB08CF6D07FEC9E67B768A98CCD5174\ 90DBC76DA9E52EE9240487AED24E13673232746715004F3F34CC66D30B95C7F3\ 6ADD7A2DF1AF7C64AA99705CC61B9EA6657C:\ EA1B3E82A30A9F62AC3021043A5DB172096012E0A169E5DD1B45B0ADF1908E46\ DF8083DBB2DE6065F9C6D131714DEE709685FB95CE8FAD19E489DEA4C1F9B97C:\ 946E436B399B25BC66782375D94B7600 8428CC4A7B48909337504B6C9C23018D8D468414B965CFF8FD787DE4B20AD4EF\ 8304E3E154BA6E623A027FDBE73DDE104E4B2D2BE6DF1987EC421694BFA5C402\ 146FEBCB3F7B7CE109C2D198F5DE789F63D76598765539C130BDA129246EC9E8\ 95D181D13760791AE362C85E70825717C050930F34B0BAC4B7637C793EEC3207\ 043E0098A737C7D333A75182BD904364ADF0939962AEE8E224370F797181AF10\ F57CBAD4147583E98A90687CB4494E18841889FADAB088639F0A645D43E5A384\ 49265C2FCE10AA676DF23D4F154F10799D6FE2:\ 785F133C9EBC74DAB0DB954D5EF0D14BC5E235A1D37546140E00F804A9B24DAA\ 7AAE674FC24450197EA103844946987606338507D0772D442AA3B92DAD776013\ 7D240E7A44B5F5DDDB3E380616097210CF489FE4B5079216F01AA164D8FDCB08\ 7238E0B1B5DE7704C71098A8C8A561E44C515A592EC501516B2C282561877CDB\ 761208A1C4E2538163BE6F88B57DBB8BD599CCFDF2A2C7C9EBC9A1BFD7AAE38B\ 538847C0A8B1AF2538ED0929BE28FA6C8056D4A986F9B5E935F1C580B549B848\ 79B303D94929B8A7FBA272CD2F42A13EBE76B0:\ EADE81F6DDE80B4E77B25B6D92B5BD621059A04A290717E42E36456A6A12FD75\ 65DC456036F450795DB624818A61434A6DDA30E3B767082B96BE3FF8717C9151:\ 47DE0EF7D67AE858B1C11D1FB3513FC2 CE14693992826312EC65686F4209E3358CDAD7AB398359AAA3B6766F24716D94\ 9363B70A4045D1212BE9EFDE8DCEE0019FA978A232029FA6733D71FA9E52E8CE\ A4FF4A2E25FAA127863512F56B67EE3254E2E228EB5FA75465441E4DE9467B49\ B51C72BDFA9A48DA81D0FD4DD5E398FC8C5A9864EBF98D0FE0D7A28DF7D0221C\ 623B89269BEE5C486D06E2511603C04907DDCE7BA7D3E7FE926089FF7C9934BD\ D634BAE190D8861F8C49354E074512E707E62C85E87B1736B0E3200857609118\ 80F01C446AD8C35B03B441F4652D3738BD83ACD9:\ 0AE1E2547728A2C29D0483DF01A2B9C0F70527BC82E8AE765B0C02C757D89D68\ 60B0B50244BE85ADBB8B81FA76F2196341DF5DE5B10FFEC052D7BEE3E907A413\ BC336C708658891060C6ACA2C98A54B1ABDD56247D98CC43D53B792C25A46544\ 60E2A339C6FE75FD65359A7F3B8BAE9E3404F038FCE000BE9F353A4924D88A43\ 292607142951F1CBD4A1CAB5B02AB7AADC8C97D3BCE9C7D649D8FD4C5A621E84\ 23069AC9C8F5CC3EE2A112A933A04F51E952CF1FFC1D6446329A47F09C831DC4\ 8CA9422524E3DBEF1F38F2E596D52952227EC8C2:\ D9C6A87BD9637A09E23B26B6750F874C6A50433C8D849B66182394376063E0DB\ 2DF6623AA630344E0ECC0BD76A7E9572919DED7AB3223196DC79B871682737B2:\ 18A7808B43783513F9F57E88B059114F B424ECD5D5582856DFCE1286A4934C8CBE04F9C1C38AAFA645140160F1C684B4\ AFDA695CDABCEC269A036D2BA57080197708776221ACBEE3E0BFE0CCA0E86F2F\ 788A128A96F21611BAF2C339FA213F7E1132D13E80360796A74C45DA817A7AE1\ 01BB067BC8596BAA691DBA798D60F7600E783FCF9D58DD3403B0589F2171160C\ F671A7079BAF96F4CFA6119433A8225D7168CA7E521C709670B4252C0655FAA5\ 2E6642DAB67FA5101B801E597649554751D15F6C3953F74A05580668C5CD8809\ 20C6933534015C9342DC222C80F09876A60EE0E154:\ 25037CEBF302ED18A3300BAE1BAB4EC8800DAE716E0F4D806114F7E49D6FF8E6\ 89735BD644E30FD52DBC815EC20F224F9F96CB05C1E95E6B560D894036087D10\ 9428B891247E41DEE3BA17CEAB654C844CB562C9E78FCA748C45CD71CB727AC7\ EE1136C6CE7E91D203DE43431E795AA5D1FDE7D975AB99415B04669EF6E290B4\ 533FED82EAC477E0BC4A07F6A8D7D5EF26D4FF13BE08F60EE970D20E3E4EE3B9\ 506230B12CB44395C421F154B5EC6637DCED2DC0A26851E617BC66774CB34776\ 0FDA897F7F6FFE0079BC090D71A581803B0A635BF7:\ CE651C28DB642F182B6C4E5600EF2259916AA65A49B85A87405EC61CE51D9354\ BCA3A88224F4B755500F898BD718F842A2EFF7B067D9D2BF2B87540F3A3D758F:\ 830AB7F7E062A6A7ECEA05ADD6C839A0 192717C9D60F3EF892CB7BCB5BDF933BAEEFA5320F3C9A15BCA141BFB4890A71\ D6D053E6E725767BD1164B4C1EEED5717F7D4CF7C53825F46D47FCC0969B7B05\ 30AA14E67335AED29EB76C255788B4CBEE64BF842CF6421BEB7939BCB295BBA0\ 54E4098EDD7EA418FD3DC43E44012FE3E9E75B50E9DDE48E861167BD4E9EE07F\ 3C0A82ADC722273D62517BCE169A38BCD629F55B15198C1F96438F1451A16BF0\ 9628475DB409CB4254BC405E55813C32514516925604258AF4BAB8C1A0F594CD\ D1E62C35E0614F20D4E5B5A9F481C5717F44F5DADC30:\ 980B4ECCC42EA4BB4CC6284EFD8BC17B570460D71551CB2B1CFE0D0D0EDF50A0\ 68DF0643216F22B03CEF2A588536D76904691F48E4F78652BFBD414361C5CA0A\ FA504A7AEB4F126C584F737303ACF98DEE0F2D6401E8C83A61A782D40337F171\ F718E9B48EEE2139C63FA1D6AB3A8755055FE2C5C076052ADACB728B1E8CAF22\ B5D6E3EEE3BD33D577623B147A24FF5A91FD028A8D99312E3BE2FCB21B0E0656\ 0E6348E080064DB5BE9AB79DC67FB33043BC8A3948A19A15B27AF69445AE8FB5\ 13B647E93AEC6BD354E4D7FBB30B46264A6F6211D3B9:\ BA332DC89AA47B6376A3EB64706BFA85E849168F1DBD8476A24191560785E929\ 3B71ACAF391261389DCCE973252839C71CC54A01FD40B2E8ECCE12E12DA4194C:\ 3CCCAF6C296F9E7BB5CA31DF74EF2B6B B74BFF82ED467D8484C6AE456F319158D9F5EE51157CF0F043F0706B9C1F4E35\ B0D9366702C731B3F944FF0A3342A965DAA36B1E6C275B91819C2789F4F0D1F4\ BC62312E9741EAF9D675958D71838ED51BCE0475EC2BFCD7A8B4D9BBFFD31F02\ FD0728C8590CF8D5FEED6F89657C4BDA9B8B448B4F16FE384BAC312409423B6A\ 53B152B93D1F6BBC33408B4E39388A0BAFDD11B04DA646C9B1986393C493117A\ F76EB16A5F35FB23081D4932A7AA24CF2C56CC6396981C48B516FB18C8D879DB\ FC9598369220260922F4EB58A8D8007DDE7FD7B055E169:\ E86971A770353B87F2120815B3BEC5223EA4D9AD9BDE8CFD0714218E6D341350\ 404F6A488711D274763266F8A493C039D08CB6CF5EE4203D7582C0D07E455524\ D6AA6046E964163C870F953FA9D26D211BB675B167F5CEABDB4A2988DACA8C59\ 476E3E4A590A41395CEB65DE0EEE1BF6762124CD7C6BAC34BED5D4F690F45375\ 81479A65A04D14B3EE86DC79633D77DAFD989876EBC3F582C929555D2272FA05\ 043540EA7EE35CA58FD05E48EBF071B72CA5E24D14340137A5374C04E6FBD99F\ DDFB6B14733B2FCC5ADA1680BE91F6D1CBF8D649354036:\ CAEE3F484BDFDBCD061183E19AFBE6C43749335F852154F51C21A8BFAF005362\ 6E76489C6AEA1D95237C5E2F3A1C28F75888E5D846DACF4ECBD231705326B83E:\ 1D7BDA46E7E23C9BFCD5AC55C94FB881 379819C60503E7FA119E8CD735990055B3D238A6B8CC53F0B41929D12A550985\ 3895869AA17E3806014398E0ACB595D43C6C77FBF6CDE3C34054F0CCCBF6B51B\ C8B8B8B7B782AD6A79AB319056B4927B3A5F4AB043E6F867246103BB4A3932B2\ 2932D44C9D0EA79AEA8D8E6B8A37FD377A080F8ED1C6A0F66CB9D10BFBA773B8\ 4C915D859737A68C12B90447296A6D66A234A8C7B6E2B62402F981A0A27DD1F4\ F5CF43CF8B10A6D7DE8508DB849FE9AA53CFE62D7C0AB503602910F3C973A191\ D88DB2314759268B5FA449FA518BEC9323618C3682A9F88B:\ E10A1DF9724BCAF9EC82F1EEEF4091D723083D9B67C8E89F0F2C51071E6A8247\ 57D1859747ADA011001CEF4B6E5B6A022FC0107FF0CF8688896D857B39AE9F09\ 797846C5C0A6984F584CBDEDA20D6F9CA07884ED134E44E0F7A4359D37655172\ B5A78253891275FE9CDF5FDB6180A67B71503CB355A0ED2C21EB57C769BCC831\ E9A4BDF76730A5C77BC952A1E483779FC1893C74E022E03103225A588132841D\ 1FD60AF85BFD086A1DFDC01215BB7E1F2873D3FF2D7E8222D5DC4ED01FBEE99D\ E93AA2BFAA92F491ECAC46CF3C104F0B138339F54184A45C:\ D004CF57824774DBB801BAA3B099F6256D0BCEF7320723676F38DEC90CE1FC45\ 639195278EE548CBEA6D56899CC633B6BABC72B09462EAB196773ABA46863146:\ 36DBA52A07E615CA79BE663AAB87F313 61F559C5F810A1C8DAE33CE354847049DCD89BDBD3E93AB7CC51E543997C3AAB\ 395A89137754CCF5CFAD4A05EFD30AE6E708D8A0A6FACCADF703F0DDB5147DC4\ 097B967A468280F4F3F3923B4078FC11204FA28EF5CF8D440F329B4498B7C89F\ A26C6B47FE722F829EF628888DDE04082F0135D52EAC0D688A52B124159AD015\ 6F0411BD76E3D297D49A5D793E3ABBD611EFE007B176EA3E21DDD5BC4114BB0A\ 218ADFD52EBE4CAA83970F7D28D5D2134C1534F56CAF9D0D9F730EF4EECB645A\ 48E606E70E536664F22084CB9CBE0307359FE88A3B90DF04B9:\ 3BA656F0AF42BB37CCDC8FA77698973C7F9386F450A1FBF5B5D8CB62CFCBBAF5\ A043D7ED3AEFC4718B39DE52103332C1F9C22FC55AAE332F1106DEF40D86B36B\ 05F1FDD2A8B8D6BA601CF6B5F81E367E7EAB6D12DD1E0B93C8D83F7E8D78A7DA\ 35E584CC97CF47B8EC4B281EB052B06F7BE54799E65E460D6ECF30EECF472D77\ 40DC4B361DC250997FFA4A4241C26200EFC4DEE7E65D67D97F71BBF7B088CD62\ 283AC013AE1AF447D660D3E708266D6C6E8AF60072A0262EEF2459E206FED19A\ F04D7E2A2D18FC298EBEA0F0FA39322AC8C4DF0B9DBE7687DD:\ A3B3A08CCF65BACA8810583644E6F1D205BE1DF2A665C4F40C6C7B062B286089\ D8759DF98134EAD1904CBBF515C90E84FB3299FBD7E985878D20338B73D920E8:\ 35E1CDED7A119251C8732A89F4DAE846 A680ED4AED1665E1126DBEB3A6836169E5D8E26E12C3B4314640577BAA0BD09E\ 892A089069F5F2E40897C9740B9316D79D550AE5EA9F82ADD1A4A9CB498671F7\ 71EBF6925175631E2A3A5930716E3153078998F457D38928B6C1ABCB75FF5D48\ 7E90435F8DFC567BC51BC86FC91B2F0F5743A547B1A7C98AC62AF3BBCD95EF05\ 4EBA38C03AF753F05FAA915C9A67BF1EAF64A67D8462E05A03793D2244892D0F\ 68074324490E5C497906742B76279426BCA93CB8D15627F99471BD157147DBBF\ 61093BBCB3916BF56DA36591E56DC16430AEEB7C1B1BE7ACD0D0:\ D76864251D5CC12CA7CFC7365208F8024DED293D0C8FE964E6604F0889F5105F\ 7962E254B733D8AFAAB8A52F7D7ADE7FF3CE3B403E0804A79C980062F1E7F88E\ 1BE12F1AE2E424A6939C738022CA6307120A5AF914FC29697D2218252C7E90C1\ 14B0B8E72F6081CD74721DD52139212F4F8FBDAFFA05CF609F00DBAB8C32E29C\ 4D25A16977301DFA985078A3BCE695D27470F5F228485FCC5C71D6F1DD6E6B35\ 5CC3795894C934D64A56AA540DA4CF21AD9E73989F627F8C3434BFC4BDE9A8C8\ 60760626A8C9ADB297BA9A71D6253D3126E58ABD8290F4F1F0E3:\ AE9040F33914977EC5E0F9C1A1B219C6430B31916B7E79C448E942AC079EAAB2\ D31DC6F801CC2E97F6514D6D287D89CED938C988F9C140068890F6A35636B72B:\ E2F10D2F09A6E83259372B86943D72D7 CAA8B0BB70CF71434B46AA9F5CB4FC8A10AD9AFA4DB9F97BEEC80F8F4927EBD1\ 69F7781598AE0F3FCF06D15A129D3537B2A2C287BFB45B92A62F15482F0D0798\ CA3EA908E1B9C4DC5644EEAD5D3B855EEE6B39CA6FFC50C6A0F29ADE83316D5A\ AA2EC52D8672F6A01007D436B1CEB47FA9CF4FDD3F2628FAD378C10B703B3C87\ 4B665FAAD28D32F8AE618DB40041404420765C0700D6C99F6E33C5A500A25D71\ 7F04514EAF8819C3CBF811720F43B4705C77BD0A621C5E41763942C980EC09D9\ 29BCFDB2E53DA1C8960FA01320F54024110C4F237977110B3751A1:\ E8732913AE17B4444441A0A15E22BBE04889F49CF09864B05DF367A26496E6FE\ 2583AF287729359F7520FBE83DF2A146D8A3C630E8E374ECCE099B162C41CB64\ 34A0B36187A6309CC9F1A10ABBFA90AFA82FFB934999D911FDC573E3FC65C6AD\ 3651E4EE7B2FBB46BCACA8C71C6793C45A570A15AA9149EF067DE0E9EF6195B9\ 5593CC92307FC487B905B8370AF25DC64815D1226916476509D90CCBD50104DC\ C905ACC2DDD9401A35999234C0E8711852668B5CB6535C4C357D4883168B23FB\ 6611AA80B075EDD633351A0623EFF59B477BD4E354BC79CE817616:\ 0B6D997F3908FE53060897B727679FDE48AC86B29F1BDA9CE993C197648940C0\ FFA81A3C669305B008A44E221458937E4428CD4A8F18D1AF50CAA9628BC410C5:\ 14DF452EDCE5ECE3A37251FC7256C7A1 16AC7772715E633D8BDB7FAC8EDA6EE9C9B05B1378B0E44A6B34A47DA8D1611F\ 97203FEC682CE354E265B23D721BA46CE012AA0BEA53981B46F08CEFA3715D47\ 2D82F28F73ACCA404A5B27BE788058DEEE90A74AA2F817170A9D89DE03BB89BC\ 71BAF6B051262B42DFCC76B464A28655F20ED070976C95D359BDA68BB84482C7\ 2BC1B102E20F3E33B6ADA1535FD7E9CC7CC5A66B8561A980129F6968A9EE7A8C\ 5705784E19E280938FF6E3E8270EC29111CCE3066687640722CB55B1F6CE22E5\ 0432EAD7400EC0422FB37851CFB42972A4AB635844AEE2F343495984:\ 7AEC70526B029B01A975026C991F4184A88E516909837467AEE2478DCA909761\ 25982AE3B1A31E4E756B13991BA08EFCA1CCB7B869E39667FEB9026F2DCEA8A1\ 81C0B41842899D61B89582734058D5FAEDB836150A6956EA4A0CED81F2B70F55\ A7F54505F384E060E302F537B18BC42CA8CC7227F8A309024E2008D372ADB2FA\ DA174E54CC83BA89DCBCEE139EB64ECE945F60FEDFF01388EC1CDF1052373F26\ 75B634352B036CDC8A347214618663BEA4382A7F5AE388E750D2B5350F386A8F\ CF953C52EF83E1FD227600F87ADE3C0C3AB3C0F4236CDD7BCEA9E530:\ 160F863CEFB8B8FBA180A59860B0C8BF1DEBC4C40F06A40D6864E8B0C42588CD\ 43B96AF941AB74256787959210F7A656A9C427C463CD3084414E13D6EB4D7D63:\ 7C5FA02FE028C04C64F4AB057CC52836 8140557DB2CB5053ECF29487BD5FEC3C1C6C4576B402CBC7AF1478AEFF83247D\ 9E38F8E59280123062C36DC1594E6AB207236595FA82E229E41FC758A0BFD798\ F2E17CB3A31290A55301D11954D217DDD1362AF04CA93116FAD7A0F21883ED62\ 2621826DDF7CDF21144C8EA736B6AFC2209412E5C8AE382E4A35E85612C41C10\ E767590074E990221F60D945779FE6220FE83C87B00AD1FB459974039D22D398\ 05E538CCA7A9E08309EBC6207BB18FFCB388042E3E0DFF69D2F767E0F11FE4E4\ 08147E61CF31C529A9CCF676E62153FCE538B648A9B6CD21E3892CD89A:\ 66ACD530764CFA33CCF68F294BBD6CD7104DA5D5F439E147B61D893404763F16\ 5EF6B059A9CB66A47CB7E754E3F1AF7EC3B956DEB4FDC46699B32BF6B3B3316E\ 82568C3EA798818035B737465EF2F059C5D2E25BEA585746BF9D4AFE0EF244FB\ 6366184CE666B0FE4398D5A1455BEE43008263B890A51959F9222E0D81847DFA\ 4CB51CB1C7A453D04A71813BA24714C8D5C5BE482BC860BD361A7AEE20FE274C\ 9C05FD20277E9FD4A828E3DA87094EB2DA18695D1E1082B88DCD8283A3EAA53C\ 7B35776003C3F6284E52F9D0849F83E3B66A86AD702C656C70EAEDC102:\ 181BFEC5A5EEB02ADD9EED07B2DE698322A41442D7329C1ECE634E1271A4C006\ 74B7B1FDB0F426EFCCF79ECB3A1D0F98F6C5E3FBAE81D2E16076931401F0BA89:\ E386052F007FDC354E8212BF84E4EB7C 1F36C3632270557285DB127EBBC1A2BAC63067C1865F16A7D0ECE4292016C0B1\ A141F8F5FCC451EE7FE4DD8C405302A4955442233070C6D1E6152753C2C5D87A\ 962646F02DF695DBE5547C13012879134F4F97D15CD495C2AB1C59892639D823\ F4C3CF9B82ECF81D6371F7E9BCB25555FF994BAFD9A041FC5C98051B9A29563B\ 3FAA848A8CAC0EFBCE8A0ADDDAAEBCD00D07C0F3864AE658E5063743E6B8675C\ EC907BF25DF9A55A571C56DA278F04B0DCFC56ED6A3083F7918E0CFA0FE29B31\ 70D5B45A881BD9CDF7BA08CFE67D600D432ADB4A00A47D3B35D5374413F1:\ 380CCA842C11F5732967379CA69362B2DCF4E27F7E5223AA6FDC6530BC195E6D\ 355C72BC75D40CA2495788137A2513FEDC520AE3373EF14BF0B7EB17DD911A56\ F8F7422FEB2233AD6CCBEAC941431FA23DB14FB487821DF2B8D94AE80E4C88DF\ BC95FDF31E0CBB6EF7E284188CEFE49FD8A035562CA775A5E00C7991D47B3BD9\ F3CD19B7FDEE6D1BD4F2BAAF2F81980DFA75C46A26E0EB9BDD8B35D8E01F5CC0\ 119153F5B223F2B69630D9CF20EB9F5D2854CC25A513F4CFAF40B9EB87690D6D\ E65D247615C33D42BDD242015E96940264582DA80388E4803DD706B7D271:\ 85155B51760E67721FDC7A6737BAD458D51848B33B2D9F4ACCBD561CA3C85A1D\ 4847F3C5C2722D2D384A00834E0194F0B6E53CB8ABE16B6DC1F7FB19C4316B7A:\ 950BB6D39A0BD2EA8245541D8AE76E90 FA94A224D5431A48BAD45B7E25A556D77F8DF405AA2D970C5C2914EE7BDCC994\ 2E0ED75FDE601E5ED0216FA1C3B2DAA8649CF3E5B9AD73E872D2072E6711AF46\ A00A868A87008EBD2F3A289F351DAC9CB6FF9418B7CE9D93784EC29A18353BB6\ F4C7DC8F26842A60FBC2C567B58B66A95F25EBEC4C440CEAB05D8F0959DF2A04\ F54E5CCB346E831EDCD392FE864FF877FCF2961167DDBEF56DE94CD422B85E6B\ 8B92E5AB4E777CD31A9F408634BC787558F17BA279C286F444344927C2E1ACDC\ 9B2AFC414AA1BC8FF1AD26C544C146E115F6C243EA76835A4B6BB422AB901B:\ E384915C1DE4C2B1D116107B23B31B2C137574EAB3D78C5E76080050549507D8\ CF22252E0872D94E421F592ED3B5CC13C1BBD76826A6EED30172605517A57EF4\ 03398757B6DF5795311C732B95C74CDE82FB9A0305B0941EC5077028929D82A2\ 9EB3AFB722A63C1EFE599D21E09C08CC20525A9A9A071063184DBD32288BE772\ 8FB924F49AEC43BBF230D34257C7FFCE1279F467A915B94DF4CD2C0B6FC27B37\ 1FEAE033F7AB5E0887809EBCBCE4A50F29008A22B2817E73381B4E125C2B9649\ 5FE3B880A9CE4B8C20279A8CF82FA6A315D76E8A1EBC2CB39ED060F7F2B136:\ 482E227371436B679E1FD990940D9E773AB17BE1AAF461CC0CF9EF49322B3191\ FE24C116F4617697F0ECA8B3072B01745515C6A724866EE505AAF1A90FE964F2:\ E02F01E558E161A08D163B9277476AF8 ECDBB7F858500B166D01586266EE6AE5C8207477E2C27FD2F502033ABC58E867\ 1D86766C01D297C6C061B5AC6AA14A0990C778E875C04B054FD59232845C5FD6\ 7F3B5261D03CC233B8562FF11220D5BF5DD3328C9957017B9927014766F0DCD1\ B359210EA77274CE80DF9046334F57E7DEFB02F90E75639C066E5390433A7A22\ 386095A7BBCE0D62AB31F8C6A186FEACC324C7F930E9EAC78B32FDC7B9D26513\ 976F5A78374621F5114296F930D8E6C90AC37FAE57FB9A0511C61A2F911EF63B\ 6A2E9176DDD4C28CB091B7DE62DF087CAAD205A39CC20C04629A552C9CB4BFD9:\ 796B4E7F0D1C7551BB924AB3298C2C5D6F1530B717292D0C71CB9E54A2814FAA\ 67B679DB8575759C3F55CCA617DE84D49126AB3B3E240B5B64CE621533FD6546\ C7F166E651166FAF2E8B6640AA804C37A5BC9E6146FBDFB46DCABADFB94DEECC\ D0600BFC710BAC5D66E91D1E748F58E32F2CE99EEE10125B49C6657C80FA6ECB\ 20DE78EB3948D3EDEAB3146BB7D6BF4B8728CDDF6D9719917261FB36361FE5F8\ 8448F94C64A793CAF45863009392C37F5F768FD4253F90F69D574F7C69F1BA59\ 088B03AB7EA5BBDA213771392426307D330BC11711C10A3CCD0D9297747A594C:\ 253EFE776BDF1E56DE7DD6D048E9771222EE4D4083F8F8A0DE293CC84EC7037B\ 89DB568F89C9B2AD5009CF7F1B709194D87B7FB618397209212123FCD318CA8F:\ 5B26213DDF1761F242D5AE3C8CDBE989 18108F38311BDD38A8D45ADECB6A6F262460E0222009596FB1B3D5C0E997E7A1\ 8F358279A3825394378AF3C30F560E5188E2D346E9F2DF80BD8D2EE226BE572A\ 3BDF9451CD43632B442B732DBBD96C330C0D3919CD0A89ED4B693B81114C962A\ E0E50D778E04270942CCB33DA65DAF0D82485442F655DD711DCC948DE92109EC\ DC09A4719A7BB0D25A61104804F4096DDC5ECB538CE47A0B6C636C5D95F30C90\ 49F0A8E8198781F41774383AF16668E13C481D003433138BA1AD8CF0BB999385\ 61D6EE0E5D0B012AE7A0A2C1A1D128025C49B2140943253D9A0BD4AED8AFC649\ AD:\ 5DAEA1C8171663763DA9B98D8A63251DAA97DAAB89A1BA12ECD6787D7D7BACBF\ D7CA47394C6D71F60B6FA0CE44B9EBA881748A6DA93F6028F38B35CFAF33E949\ 83A5138850137E8726624096D02CAACDBD18B58DF5499E7FCEF4C850037F369E\ DD4EFF4739A0D4049AFBCEF77CE2848162891ABF3AB41CCAEE87344B127A1FAC\ E935B5F830637968CC9A4A5F22156E5E460509D226EC8B2BEF94A7336D4E74D0\ D6412603B116C66B4AEBD1F4656EB6DFE9E86C959E41CAA9172BD97909A4CE70\ 002A750B5AFD67ADD71645F8B3C661841299D251000C602CDE4B17721F145FF7\ FC:\ 50CC4D5ED53034A1C722EE0D23410474C6C0F991901EC4A12E78FDE91832CFA3\ A4183FB0E2C62A54DAA3A1EF4574265F4E816392DD0F1A2F3C7F388FE3C9BC8E:\ AA628CC121EE8DFE2E6332002E69F0F8 4EF285246ECF7558058F30980D58869DECB535EDDAF68D41508B783B6CB126EC\ A86CA166DA47BF58CC4A91EE66C0233222B1DC056F9DF57A217815DDDF770871\ 9C22F967D76D0590075A730444550A822011608C230AA24792071C9829D62D8C\ FE0B5FE3904C9EA6E93C232E45BDD60D72A78563B77FC8DE9F106571E0014E34\ BE98A355F78A2849EED7EC6FC2BF9722544ECE20A7676D618F8AB71B9A73D929\ AB1A3BE14BA6DE347A4BB534DBE7F580C06583E2D660528EDE539B79F276BA21\ 0A60AAB26E1DB8C1B293C9C733F0855663DD6920940A2B12B5FC4A306E197380\ 01F1:\ F38ED44ED334177C347E6E47470F4E71E6B1C3552B3BE9EC9B1E27CF859B9416\ 768B91B7C5E98F2AAA16D3254835780AF653CC527B4035D91A4B28634AEEFDF8\ 000B959E5932AEBC5A8B74277F2AF492EA9BC33ECC7F1F2EAD89E0595CC25E77\ 1684F9DABDECD077189D409DD798625E22E371593B36368F31BD50F197A920B3\ 8EAFDA357155B881720E47203323BADE95F2B57BD703108BA228D50A80455768\ 361341C6612CCB1FF325EFF496033020BE489975B1C911620792B47EEF9B1E9B\ F51F566C42B291EAEAE4383373D78F1C4BF8BC2AAFF33116A92A820DE320B4DF\ 8FFC:\ 96BF32F1EE668ED7BEF2F5EED2F8C5E10805A2B34D3DC2146774FB332ACBECAD\ 9CF93AB6A7F0EF8F4291D2403ECC3BA540D22B5D4D1062A992DB75BC0B7B707A:\ DB8C10D2A7EB31779FA98666E65EF519 2BC7BCD80E91DA825583E394958609BE769537543CA8B44A9199D42EFD39DE59\ 2C8583BE50F78FFB49C726AE2ECF7664C776C8CF4EA70DB99198CC7F7DA043EE\ 9A8D618C8CB7F5EDB6567093BF00D01F146601968E9FA98390FFFAFB4FB2E17D\ 9E85742E9C77CE27E82B09210EA5E5EED3FE3A6DBAF2076110BB172F97604F05\ FB8F52520A2689E5BBF10760D3E9C217E739B9A3E6ECE7C195862885549C2BC3\ 192BB07098BBC46623D46578FE0362134AECDD372375531AF491CE3BCAF286F9\ D91A82606B7DD661BCF5C558C2C06FEEB4A48FC71A1DC8DCE92F77DC4F9477F4\ 17AE04:\ 26B0C5765CBD8D5BFE0BB2055CAC54D5261DB310F7F01BFF24C761E91287D6DD\ 6FE65BA5D2F46387AD338649920CA90EE40C139EB9B05BB77FA429CE90661C4E\ BFF753FFB0CF9C6B81F2D0FDA2077AEA5706A3698D7140714604EEEFA195EE42\ 53F47080A4549CC560CD4ABC46DC1B589CC6ABC1505122CCEDA993AB59F2642F\ D9D5EBEA41AF5E8AE395DE3F77239BCB9569C3E311330CF797717AEC89B272A7\ 1248E2865C927DCCD98D9FEDEDB8F872682DF41935BB1E5FA56797546D325BEE\ ACFC2D73BD39771404AD4654F2D91652B266C8C2168AB1C85ADBB2EBFBBB782C\ 300DF4:\ 1AF15A49557AEB8D9B5DB578813FEF2B90F20A0C44A42F3AC11B71ED9F047921\ 401D4176A3DA1DC0C5833FB45977610B23C2D37A32A5A9778108976D63EFAAB0:\ 13042090CEC102EE1BA82EF07D3CC690 A09419A9CF48D3871D948FD40083168F7E9F51CEF2DF928E9B2CEDD7DE29F4D9\ 22182833EA7531D3CA8A4ED277A0D8A0DE1E9ABEDE595DC69867EBB006E74A02\ 2356C76CA508B8BE54E3E2F4E765998B8495F715B03D6C6F304E5D8EC64982AB\ E34FCCF4E36FA43438803018A6BCC9EF880090F080D53C5011A4F6B0264D8335\ 124158EE84E861049B2A031BB4231CE1EA230C714FFE6BCB048013E02B8D84BC\ 5E35C5D6E59014E13FE6A03CC3543CF028417CAB8A629B237BD1FA8C5F4C474F\ B4B13FB72EFF570D01157D091DA1F4F24CA96CF36F54BB781FEAF070348400F5\ 52E73A98:\ DEB151765020FFB77E29EC9290AE63AE66C4A37FCF3825AC28388F5FEDC044E0\ F2CB176C39F57938A617A94181F4E10690C78196DC1E2918A6E093F5D65E70C4\ 8C10EFBCB3D2A452C7C7A7D1B36FFBBDAA93B82E8D4EAB3B996FD7BB65D0667D\ 4D4B3E64626A0B37C34138BF4F7A6E29F03FE59AFAD5C9953D47EC64E9D34C17\ E73506DD2424555B4C8120621A4A178B6C6EE6A414207FBEF6A6E24543E0D351\ B710D579006CE3067CF9E2C95974D78FED31512D8571BF6134BE53EF1B363CF6\ AE3C3695F34D17FB9161D36821D7E60B9E0BD2753C4BB237E97AE049C89A6E13\ B9F98666:\ 381BE60317EF66B0087CEA6B553D2E553439D2DEEBAFA29E9316643E7BC59829\ 09B2E9EEA08604C754F143152B3505818CEDB529C080573178BE803E1FAE19B6:\ 8402587F5878EE9FB251B8FBB111A3C5 4CD0FC4FD0BA641A58D4D96AAA3F3A46E9B2273DB3277476BC9BCB67FBE9CCDA\ 01171F84FC1911F225DF5E1C147CF988A12F33204E7BA6AAF8CE2FEA57B0730D\ DEB851A1A36C3CEFFFE7921041F9AFC6CCC7B9B08027CCB98621FAB24E059C55\ 8202118AA45B06C4D7440A4D075BE4E4440ED3E9B69A8351FCC89023B5679A02\ 6624F8F55376366C5111835E120FD7C099661E641D0311A1796711A3EA8AC9F8\ 102C2BD2F99273E4F847D626DB20666F7CC0B32B1A86023CA5A8B053C789346F\ 8C6A0615998B47EBD791FB944F9AB8CCD7C72B40F905C36E0EA55D5E5AA560CD\ 64978B8A75:\ 244079996958DAA3CAD92FE9683C17E7F22FE198C9B481F9229C4FF5756CBDB4\ 547049A9985F23A41BACD8DC84A93F29B8E34F8C4922C8E9640C52187BF817B8\ B0300A9B291C648B41C246575ACC7C06A00E50AF824C12F3D2DE06451F508676\ 8EA14B87876DB103461B3DD6AF9E3B0B770CA3832D877EC73F567E7A42CE191A\ DCF40FE08EB36F6A5DA0790AF6C0107BADF67711CA89FD0A2A45C8FBA6F7DDDF\ 260DEF3E180330C7BCD1FA5C1BF6210202A323B37883F08546D86E301B1A9CB2\ BB91DE40F82CA568FF0B6D6EC58D7F64B412D1B8A798DA3FDB2DB05BDABC4AEF\ B9F34A3A5E:\ 48CFC4A5ADF7E823291C54106FCB6F2DA50E24D2E184A5CBBD1C8B804C145C7A\ 9511EB31DCEA69AE3473C216D34975814357E1BC5D9D59DBA0E2F147AE008252:\ 61775FB9236455F8049283939B1C8E8B 55052169AE5F934D73482F5B59807A8DC15F49BEBC828A6FF72568AC4FAE7A23\ 85D82CE7A46C930FA7A74E6C2FA3B247EB6F59D15339A473E5F4094E1F65C884\ 15CD3AD1ED1D611F99AA23F9EBA8642B90963A8F5167CBF1055D16A7AE39B08B\ 45E1EC30399A35CAC888A9011848B6C8ED8CA5D87C2FCAD1B20872750FD8B186\ CBF80414971901AA919263367CAF80797B654F40AC309B4AA5668EAA4642F6FE\ 679AE887876BD0E1107DAFA42126C10DE61987627107534056E8F5A6C543C259\ BD0904694A64445FDF88D7837E3E91051CE92C2E2EF38275BAECE50BF214B301\ F2D9DED63913:\ 27E6D1787E4102D242BD2B5DCA9516EF931ED80B720D7A01E71AF88A276026C1\ 9538F51A3D3ADE757C814B85115072DE490C08516B2B5BEF6AC7EF47B7904183\ 6DF14EE11A11444F3303CD718E0CA65257F0AD0C45C7B35CBA0607C0F63DA6BD\ 98D252A0CC78C55EA980FF7A65E821FE00919C0B4F7D297C1E684DD968F0E7F8\ A183FC84D43AACDDE017CCCF4C49709951D6124D32CC3935B849A139028825B0\ 5BA1B553C63F4FF85FA62B563B753A698731D6F8880BDAC123C191191C3E193F\ 85A6B59F3DA6C56E7DF39CEA9C0BE78A4A1D0E68F5D58A0767509901707D104A\ 35456C90909D:\ 8060B5563128C045386FFE9BF1F8B18B7E5F71984F6F0FCF4C109DFC03892AC3\ 043AA49059537B827D9EE51109BBC908034A96325A0FD1FB3A8B32858A5829F2:\ AE91B76A65DD2FF40596DDCDAD8789D0 5D9F5ED753DF247B6E568117C89ACAAD756BF8999F3294D48B7380B4C650BF7D\ CD694040A10B59648BA11437173F22733F89B12C520CAE574633C031487D4CEB\ 5E6BC8E61ED9F0DA492F2CA8544228416E316CE339814FBAAFF881450DC9A93F\ E44A2E90B678EDA786145E7477FCBE9822FB2E74195ABC8A5A7F04DB47AE1EE4\ 697903F59B71B6E586B6DEB0F4794B1A2310CA07F631679FE6E67783FA3C93F1\ 2530D1EBAB62A84A52018D2AD55DB241024DAED00A43A004EB8672E48152B69A\ FFF9ADAFFA465403ABA06C3E8A791CDC6D7B139C1E9CDFAE22DAD694F8CB31D5\ 17D7F0C575A32A:\ 8FFA678847702BD5D009A51E099D85620F8C0B6D0312614E0D926EA9B3200E82\ 055E01624094316FD2CA3A8D6F98D44343E4615AF7561423FE4864C21F82D894\ 4402CBFC90C0862468A866934A8A983BA7A102E5A1A8D0FC76452A09643C76B3\ BD99A485953F10A69C9845B61467C583C5384EC885215215CB9A065D97EE4764\ A293F73E57965E876DCB9094C171F06509A54E4E801FA0ADAB0E071FF0B85400\ 88A2B4C684B9271F70FA1DBFD6B7D4B81EF0B9C8059461BF4943AE59CEEE993C\ E2653A032F977E1DCAC936843A2F59EFC32265269D43C38C6A4004219415E60C\ FDF67943919D00:\ 169F3871F147E7BC5BBB2E1C8810808CD973CFEA0F7C3A126D7AA0A8514C53C2\ B690C4FA06E0D4205F1F556C839897939022DB739CF925E16C39871DFF8D06FA:\ B737D737EBE47D113625DF138D1FE2F7 993EC67AE7851538B136277E21A1F8433633345E118CAE117B45E27BB7559FC0\ 448F80FD61DAA0290F1090AF0DBE6E58687370619A1BF5234D47A298DF0DA546\ 2D38DA33AF5C8C6ABB37E07498E23A0390CBF37415162116A792B8530C421AFA\ 9AD4251A0101671B9F07D3DCD262EF2EDB00D7EE28BF82E4201E1854447B2ABC\ C20B2EFBE26D3F7D35B73C64E33C6EC4B3E8C7FA6A815807673BB68F30D65EC1\ 4205759A40AAA6962AF4FCECA6583293A5FE70D9EA1F2743338DA5C5BE139140\ 5F30E025A1C3643BFB6ABAB4038F49015451BEC6E81FEFE7EBA8F0B4E370B750\ 2A769936F481F479:\ 33DA912E04453CFB58670E977FEB3488F386AB55BA973C8E47039322E5382F3F\ 9C3677F648394C556E1465F825ADAE200C1899B5EFF523D58B69899434E5B519\ F26F98F93045DDA82046C036867BC86D66B2D4CCBB04D6F752749B308C22D4B7\ 69E5226DBF697EF7F9ADA1E5D665E65801927A7DC2D0B2D1940E4AD2CE976B67\ 6C8604C12EACE3B76A321F3DBD2425D0CB08C99408897E20C6D6AC61A0CA1A0B\ 0948F4C5B8D3E24F0303D7CF48916EF9C43A53DF40C5F54604B6985F4E8375A3\ 2E0CDDDD7A2E7D78777FD6FEB97549A2413EC5AC36F2A917F1B04074FEE84A5A\ 949ACB47E54D4893:\ 4B9C1FB18B46A36BCC2DFF9D5CB81542074BB24EB490B5080432C2BA095DCA22\ 0E6C52C6C29A010BD4E40420206BDC69B046B28A625937D07A44E21AD15D4CEA:\ 262476E43FAF79B40E3D790E10BF3973 A98C8CA7ABBEDCF0BD82FF89DBB9DB52E9AF07BDA7252054A74C2965750002AA\ 888EDE7206B9A8DD9A108F2365A22A80559A44D76A16DC4A7B969DB37BE3C4EF\ 831390B804B6937EB17ECA53A6CA6CA719D43407787AAA8C71A0D349BE3D1EC3\ 8B1EFDF316F1B4512E0EC7A24DB1D8EDAD448AD992DC5FF7F4D31109F9A33F64\ C0EDF32D593C8248CEC38D79C8380684B96F569042343BB82B7098A235C16D5D\ F57617EC73BDE4C5560F1D04B9E692181CB93E3DA0F2872F0F840614FEB674A1\ 4442025C388BCAA44427AD53E15826BB1744608CF830E97558CCF37B250F338D\ C7BED023AE477BDB9F:\ 9BD1ECD532B5AEFB432B0F9BAC55FBBD2647FB137ACF078075AB31FBA1C46A9D\ 0D332EFEA8DC0D922A8AF2FE8049F8E5067AE8CCAC005540FBED877C17DA4998\ 39BA46CEE821DCAF37F653C7BDBB6F2671D90C26791C047912B7EEB60D7D6935\ 279C3F8B009F9642BD6F7015F29BAFB70219E95C4A2EDB98C31687ED7E5306AB\ 88666275BBBADBBC94B19ED669F2B5D5143C6EA4138994701FAF8D374B198047\ EB39F9246CC0E14289C7AC1CB9EB0C51C7FA8C07B059DF58DD000635F0D02169\ D5E31930E140A87859727279228A95A3E2D467E435FB58C1721B1AB7D0B3F195\ C809F12A62200748C1:\ B1F48DBE3C678DF01D16CAA8CC06C9F4213696380BD3469F4265AA9AB7FDC043\ FC892170194D950D9AB3AEAC508836A07CDB6FB29D9CC4A2FD23267C515A63CC:\ BE33C0927A2D2567EEA9F7D67076A422 8E370EA6ADF9A27086C9859A2E75DAD2586B4977C28B5AD3925F577C7EFEF51B\ 313C7B9BDCB9B35369A549C984B935CFE174351A326F3982DF4389A8902E6178\ D5229C532FC9FF3B1CC299B94A5BF984CDA03F091852FAD110BBE2E7FF8E0299\ B00F8C1336D41F8BE5086A49DF939E9C7B9E534D1475516613339807BBDD9DCE\ B3118CAB26A430FF17961D629D7E2C4666F325E27FAA8CFA8040CF26CF2E2BFD\ 20731D9EC2A688ACA526FFC4307157C24FE3A02C219BC0647462DF122EE8D8BC\ 475AAD7FEA7072F54F23B3FA8EABE745E5B097061E1C6299D8300DE1620CCE10\ 829A07533629FC92ACFF:\ F96E6FE4234FE39D56EE70D9BAB8C3B6F0A81774BD28A0A47505A00DA8037CE3\ 2E8B9DEE085416956F5BE415B2CE8BC6DA0E55A5E5C6F4A2D7CD2F2FC33DAAF2\ 06436760B525C85F166C802DC2B7CACA85706841E8F5EFB3D3DE198848B5C8F0\ 6D64812EB0EAFF4AD075F30DEA94F3EE967347688E921314D1B764457258B3D7\ 7D2F05F65DEB4415C49654C21C4562218D89009C4C0D9254FD92035406210EE8\ 7BA46418F16EA3971798A2FFB082774A20EA4301680D564DFF359301524B365F\ 3C5DCEB853826B6FE14C59AE00AE5CC1C3AB43A79225185F40297364A2CA23EB\ 129B8ED646B942C9466F:\ BF85279B54CDB86BE5DC5E562CFEFE23CDA399B5A5D26A880CF2308172EB4937\ B4661707EB476657C973431ACEB8DCE28B5E005FCCC660DEAE965F704E2805D7:\ 486DC46B6F20C779D9C02275B16FCCD6 B68CEA817ADD6ACB9CD5208C1941E3C9EEA46B65F7BAC167F8FC4B64DB363723\ D32D1DAAF4B343BD0B081ABE7136DA05ADC200F5F0FB8B9D9FA9A3AA7AC15058\ F876D5D7069C4583F9344BCDBE0FDCF3FDAE7D8A20DB53DB673F20C65EDD5384\ 16B9771B44FF03AC20C124DEB8B4D1796F2AB82C0E26CB7365668611BD3E2727\ 719480C6CBCC8E63165BFDAE741E638E90748F430510682510D9D870F9DF5325\ 7FA11EE28FE2DBED7EF11487D63ADDC2BA5745DE37588D9CF8F76CEB02F08B77\ F7E4E960C3668688BE14ECC02E01C43AA6B086B97B081FC4D60BD5CEE15CCFC8\ 28CC90D595A80B5F373EFD:\ 468BB4682456362038E3FAE16208E6AE39DA3488F9109B1ECE0F66AD7434B95C\ 3D6384FF8D5DA7FA7A1D1CA0B1E064A027FF8214B5832723AF8D18C74FADE531\ 0B1FF85D751372D660921E9766770384106F992A68AC8BF3C9EBF92B39069AEB\ 3F39C825FAE33B16A98491F8BF1C667F98FE874D64F38CDA952C43B6932C4129\ C5A862BBC5EB0CE594E4FBC24438CF9576FC101C92FC859E6CC002304DB21EF0\ FBBA8A5F411EE7B71E1754710A93A6B630DA5F4ECD176A7FE5911DDFFFDC14E9\ 547857F981B0F7CF806AE14E5AF70C672EB6488FDB9B23A469E6D5D8B75F2606\ 13E20B1EE4139336C61D8A:\ 5B9F108E5237283F7604755A66C7039707A4F9684E2338CB7D6A482AFE2C9731\ 76A677F96070F3EE33B8D8D998FDA5F069DB484100203A12CD391A22BD8F7B29:\ A5A790C40965B84AB067FA5922009E07 4FB59B1ED90C36CD0C28F2F0D279BB9D5E5D94A6DA04AF685486F390512E2019\ B52D7A9071189802E4FFA2CA4E296326522550946D732A257931E26E36BFD41A\ 004C7F97BB5EC4EFD784B99B867A2F844B46BAF818C1E037C69211B582B50BE2\ 3144649A634AB38990C661ACB406D64555F14BEB519FCC3DC6BF8AA73185FF05\ 5A492B352D132FE7C78C03E24AC8B79192EF4CD66CAC6B016D4BF93A7A6CD4C6\ 0874668923ECAA457777EA1E54A6E98468D38249311F0851DCC4E19C9DF27104\ 960A7EF0201C275C3C655253A7A2EC6EA6646A3B902B5DDD8777DFF198CF53B7\ DBC5C6C829D124E037B2EEB9:\ 91FEAF2306AE92DF99A5D413C986D7D06B45B2EA0E8E8553F4E7D04033B9686C\ C92E6973D9879D2CA91298ED62658A0065373E8CA3866E8247CE35211531FCE1\ 6DBAD3BEAE1F7ECBD12DB50CD7A0FFD71EAF4D78B49D195152CC3554D7B0FE8E\ D823EFCF8D50B04AC29A693545ECD0E28C9A86DD0792C28DB180AA49457255D9\ 6BF52366F9B7F8795C621115BB279A41C0BA8717F78E1D435CB95318E3D5135C\ 9547C282A1B6EFB3E45A7ED6FC4188AD287AF31A1A7E0A5575E6629DCD887FC1\ A4588FCD72A3F0B583F54F4E2D935BC2B9AD2416054788C66FF9C26722DC2AC3\ 57D1FD5FFE8E0F62232D5979:\ E67C49419F1D5222C82277968F4779384D5E14BCBA0D82E2CA08C89039698260\ 6877BBBED4910D4F528D8F88292A536ABB9A22C4DB0B1B83F39D378926E65C16:\ 39EB8A50A2F50973CD9CC50F40EC7BD1 9B0A6E6FA2F5E85790DD8FE601DF3FBC730594CB17F3C316121247D4FDA4BF3A\ 9BDDA606FC1C51677889C06BCC2DD0C62DF691DE07286C4F8ADC3F4A3C3484EB\ 781791A674DEF2AEAF1F16E0610976464F604FD39041F9F09BD8DA76C83372ED\ 74BA6FD68970BC4852AE4DCB36DE5B332247091292F5F30CE7082DD5BEF7832C\ 24A4383FB8393E621FD236E0FD4AC6A6EEFC4D8BE56119EC1B9A1A5957BC2B86\ 4472FCB49DF058D11214AB5D2D36E725D3723C98387F3843252F57E5C0B31005\ 2BE2F4717A36906BBC488F55CCB2579DFDF30196F9E8E76E71FD945EC72FCD95\ BFF63B1C849FDC9ABB19D35F98:\ 33173B3AED526C3591DFE6E7B745958C09CD37F7AD339CA4297EADA1C0D05182\ 5919AF11A19D5ACE70D2E11847EF986464FFC76A7D990B44043491D36AB79F2D\ 96592B737CBB6E616AF7CBF7ABAEBFC802E275F211F3DBF2BEDBA6F4032F358B\ F57471C0DADD4FDE43E79E43651CBB7AC1B569BB39A806C95DFD06917FA9D204\ BED020CB0552F7397C3C367C33CB48402E64960FF0BDB1D136D93F35C86019E7\ 5899F6B1225A6710307D746B4D1FB785140E54C41C762CD096ACF58ED4E06774\ 9F6023A5D7DBA91DDDD2838089BD65EE101A9CB598C265517E2DEFA2FE037D80\ 80C0CDC07E491EC4F2268C352D:\ 4C6A5C8B9AABBBBAAF5CFD10B6AC195305658BDAB4004C1A2CC18C885BC9F2AB\ D48760202A127337E407AEBAC65E034CA296514EE608EA316EFABA9FF200E7F4:\ F46B3C066EDA800E22901E58AFF9342B F118B740E9FEC223D34AE72DDD8716234352DBD6EB95CE9B85A00DCC2B4EB4A3\ B20462DC2BBBC7B04431F1AB72CE140F939AA3C11B32EA01E148497FA2F9D760\ A87212918C3995102505618FFBFD5262310E8CA6EEE4BD0FB86B1A2FE02DB352\ 79ED8A4739F6F396F57027464F71EAFEF1E1B0D63EE4B5B79DE6BFC008E77FE5\ EB588F803CE241B30BD48B06743E8D980858530B9922C59A5216EE13932C60EB\ 20CECFABB3185642F19F67265CCBDD85539FE4908EDDD654C45F7EB3ECAACBCA\ 9AC1F31BF0E31DC452DBC7EF40CA019CA2B21ECD26ED22185722A6E026485998\ BA653617E34A9DA2E7C1687222E6:\ 7396FD2E8123BAC09944100181773B6FBDC073F42D2CAD9B62E6C548645F06C0\ 9A501978DE9040AFB4D07077EB937F132B033F46EE9B6FEBB5521DEE7F068DFC\ 5AD3E07655E10041251021F73039CCDDF6BD803D439DBFCC28F9BE26FF3BB172\ 58FDD5A4BFA3838741DDC93F3C880973BDCEBBF0DB7213AD378303EFF4E0F453\ 338E1B316A03F0D5F3758B1028E3BCF7DA00264DC2BAC3C01DC9CD2B05B2298E\ 2DD4A701A0345C096ADA401C28C54095185CA95C7C8572E92AA2B1D9523396E9\ C0ABF49E2A99A64D27896708604C57698824C491ED3FDD5A3ECFF465AC9B33C1\ 5AF5171B12F5A69C2FC81F17541F:\ B1D9AADD09F509BC9BFF419E371C734CAFE36CEB562D52316E0C654BE2725393\ 842A35BDC455F5D21B39109078348713E3D085D9164D036FF61711549EB75DDA:\ C4E3E7806417443BEF2BAA322442D914 BAFF8BAD4027EE53B929B20A53DC09F593550E56BA260C95378819539279737C\ 1BB23613187BD077C4AB661AD688AB6D13FB6B6AA7D260B2B6B98D549A75BE38\ D67FA934AD3CCC92BD87D86901DC475B9FB88833A5083172DBFEDA681FFEFC28\ 638E31C7F168D2278B75460A8F777718DD22A992731417879FCC33A0D11EBF3E\ 4D3FB426C053D647D4290AE61A0FC219FBC5E4D5EE0BD417EF425B2FFC2F3749\ A7EEC397F4D1869F7207FDD33018684ED194C5FC540B3876710B2A611F73283C\ BAACFACAF955AA9D837241C3AF2696E787139CD12E66361F4A0361E1C1C917F0\ 758023B913AF679F7C119FA9E96873:\ BADEEB9DD59EA5BCE0705208F3576C6A4C8A4B5872FD259BDE0864BFF2FC414C\ C535B7262BD4E90A3F4C0285AE70AEA2E2AD45DB2D35888B7123972E4D3979BC\ F7ADC056360F8BA474EFADCB0F3D6BA52716B562F8364DACB6F2614A593EDA8B\ CFAF85A1DAF1FFB972970FFACE83A4D0E9FDE6477A1E075152A63A06C47DB6B3\ DF8D9196EFC0F94C457D4510963B799D422365DA5FD46BC14B444C05EDB95D0D\ 54FBA04CC3FA039390567D1D1F1277CA7268ADA9874CDD01AE390703DC76CF32\ B797C30FCB627136617B87E093F76BB534FAB041C688CEDD8E0C62F147022AC3\ 2C8BE77E4663AFB238CEAF9E5B24BB:\ 442E1B62331D606EF0AA5CBFAB72538FF3A780E0F1C937FF74DC55486704FFBF\ E16E93A4A8D9F4F0904270485398DC9FCAC96D165435DC5E06CC9CF7F4920CD9:\ 02F7BA33BB45EB68B442C12B791B7185 0D39B8516FAD8010419EC380123F1A9D416DD87CFAB9C4CE4B444C76B924AE46\ 1539BEEE41C9C7E0A226E33856253A9CCF4B4F4FF9C560D0D31DA2581FC0EEC3\ DE64BB7A6825C5C422A1E97AA97595824EC61D8FC4CE816708FD82446478EA48\ B3514D5A6788D1BFCB87558647F5151ADE70A0B900CCD32B39CC5915536FF888\ 943CBD1A5AB4E1F607AA6BCFECED73FF0E118BC6B9819597FE0088925D0BCAFA\ 96331C6B212460636EE6FE7D92237C560226C7187BBBE53E2F4752E5066B0E06\ EF8E0B4724405840AB3FD7FBD19E3786EE8C280DE59A4D34682B217F39B24B59\ 1875C836845569E519BBE00E81A29946:\ AD185526230E83DDDA6AD67353DB2E8508E1D6D54393268210A47D6086C41846\ 7BBFE8C3593CB544EDAAA750A68C6CD90B9AAD84D51149F4B506B74C9F3FD257\ 44E4FB7A7B84EB5D263AA828CF11A83053BF8B884301DA354A8019A86A04DDE1\ EB578CC28BB61758E6835D22ACC3DB84D3FD7F92C866A71DE9B2CD48C8668301\ 9F6DCDE67DBE0BCE8F524D59E1BB372AAD5DC457FA4DD0DC50A5DE99E0FA9EB6\ 844FCA13C8D4F3B9735DCC93CF43890FB2029BAD90464809ACD5B0F63F87FC5A\ 2FC2FCF47B5B9B6C6CA28572061255E82BEA353353B909301FB1A1DD8274A158\ 2913829ADE95599393180F846F8A6B6E:\ 27F48E7753EAB3F9EB99BF76C80532415C7C01F8C7BA151694F7783F569BF103\ A1CB71776AAA975BE0F2EFFEB825160FF0061EAB963341645F71DB9B60FC6110:\ CA36082A7A37E54A96EA1C5610A58846 358CB82F5FEC1544203BA1B24F47A333DA1968646812C062D66CF9B35368D843\ BEDCE6E8DD86F6417206E4343EAD88DBD47E80133441D738060A49194F69B492\ 9C5DF8C1E74F0F80328199ADE35B6D269833285D7D9373D1AE32DB5190F7F14B\ 6106D4251A7C4745C344F3F8397988428C14FCAB57D486E4F68FEA2AB7A39511\ F0659A739ED7722DAD110BD29776F10700C0A16B260CBECFE9642FB1AD5B9105\ FE2E9D175BA2D2122F5AE6514B6E4A20210EE5D036F9652CF582DD44F65C71E3\ 8488BEE6D4EF5B0FB6A40D68DF0CE00EC119C55C45CB0405A84BD4F366386846\ 43F6F97DE74BA8BCC4C03F41CA84F54B2B:\ 7FB17EC23C55F6151FE9D376BC3E5227068DB74E48F296A152303AEDB043BB55\ 8CA8415E0FB2F271E8F8F589E72643C7F3CB6982589225B158E5612E04B99CEB\ 909D2CDBAF9067BD5E2EAB1967EA1054FD3BA6D55D8B01E2358FDDD94E47CF74\ DF1BFC613F49D2642725186DC2C4E1C2CE51885F373CA2A81604CEC4FB8BFA6B\ 2A57BAA46CEB759D14C26BCAAAF87DD1AA01CBFD53DFA53D7EE986AC70CE660D\ 86B4460118789694F7DF1029AC3DEE4F8FF04E6C474ADCE9ACB8F4B7CFF48947\ D920826372B0877F293850D42540CF84E4A26D7453721AC406890CA4C3F96FD8\ 86FFF8D44D2DB0288FA154DA1B62E535BB:\ 25E2B8C88A0F8CAD2F66A7261A34869EBBF63A436A4A64E8EB2FDB39D2AD7697\ 1C981FC7DB4A7ADE918AB66D00AE3C06F7A38BAB2937D01756D4AF37887E9724:\ 9FBCEBF211BA9F0B6FB9A90AB2520A8F B3A1D5097071B378A9EDD5837F88BFE64CF820186B183B1F85A5B13FFB2334EF\ B1D8B3E29B1BBBB2CE0BEF1070F1873FA75F33B2425906968D1761ED9B186CD0\ 34A851F662B3A0719E0ECCE1F7AEA86F9EF9469C61220F6BBAC363BFEF05493A\ 839B1962ABE241937EA64E4B4E0A73F8C20BD9BAABBB58477209A5C168EA4DEA\ F3AE763E6138D845DDD6DA7E98F9C110798318E64905EB77F3673E71403AC2A8\ EC18E7D261ADB7D497689FAC8CFFFADB0BE4E53459044D6D42BF7E977F1FD744\ 8DF152C530F9932B7A366EF95062E6B26E398B12AA322DCA7B6859219906D99A\ F918553455140D9288F63BD7B988715A4539:\ B74BB164D4A015FDDBA0D7CDE1F7A941A80743CA9CC57F4B20A5C20E4467802E\ B47D652825F844D79B7F0061C53B3C169962FEF6C50739AF37E9D6C6D0EDAAEB\ 338BBE74B270EE58BB356F44E3EC9D44966DA8F7A6187C911271C22B275A4677\ D31479AADC3D1F9C406EDA017B161F09763270E25E8F3300608329D98757FA6B\ 8683E67AF2346E6CD39B17F422833E91F47BC5D0BBF63D4961DEF6E0330A3427\ 59E859084B05B6C0981B8DCA0417FAB91E101423473007144564B008C74ACEBF\ 5A1DC1AC99E33FDEA99DADF1444EB065CFC021B64852ABBE903E14CC61257818\ C6BC61348948EB05D3A283F5BEF38C6218D9:\ 9FAF194EC6AA5E6CA911A13252AB8719AD77F50ACCB426D6E567715C7BC5CB6A\ C0A75A6EC870F00338549BDF1E6E309A5FEA74575F55DE4191A9D7CD23017E33:\ 1D07182FC4954198732B4AC989D44012 5A1AA96ECBB3C5C3E135831325444191F023D55F57C10C2F1851555BD333A854\ 25BD2850B2BC0CD46DA792BF541B3FD8614D1E1B031E2BC3864E18475C2E8C83\ FB81AD05F59BB426BA17876E9050A02B63DBE2B7A8B6E5145DA9F5A1261DEAB8\ 793E89034E5F4201F9230C36FBDEC953BF3A5290BED68FEEE2C5EB68A46BAB12\ 1B5DBC840F5C6FE2F5E7B7CB97D880BA95304FBEE3A76D066BF874B6912479B1\ 5F45AF759A189D73120954F2B6EC8BE752551DFF00595E384765C00385DE5950\ 1D25F05243C3B721B6F5F8E80AA7338CB6A6C1F92A670600759C2AA3FCD1E350\ 762409D0C999ED1BDA7E00F5A85C857DB9D6BE:\ 25475474EA6E2043BEAB78EBEF2E4174B0AF2322D4C45EE9DBF6FBD04BB05059\ 5F894BFA57574071A0EA81491D816310CDA693C2020F14F3952DC14B20D270E4\ 636CABA1C6E3374EF91E048FE9CEE6776D767A579DFA42A5B7797523DADFEE65\ 25605A5281AD6A30BBFDDC32E7D2CC782A1C06264807E4E8966880DEF8F910AE\ 679F4CC0D52850C400192E70E60B496D9F3F94BEE515CFD74E28DC45CD054CA6\ 748350420DDB870FC139BA3D4F33253E5036D5A1BFAF91BB8433761AD43ABDD2\ D995B4AE3E0D246925907A38F69D07AA57E4DAB26A0AC1EB1A9BA33CEC87C1FA\ 36B2309820A59032B134864F85F5F10390C94A:\ 6894A39E8F6B6657712E7F71F3E0E0E44507ECBB138EC3A7EDD33FC04DDF9EA5\ 5DA6666267E670E37B7C6CCF87DC2D2B0129627F190A75CB0AD527BC4ECAB443:\ 74E9B32C230BF80728C3D748E53E9E67 4BA6DE3707E14FFD21F3AF4E2C4CB03AAE76D32C39F03C1B5436BDBA57FD276E\ 527F93440F3BDBC2FA47F02CFF7182F07391EF0A458151E1E1C8291FBB9D0C0F\ 909ADDD916AF7E6101F62395F13EB1D1F2E78CB3B847230E38631C56E7A130A6\ A506967AB287C8E3877ED25B4480574A04B371236546E21F90F9EE56E434C4CB\ CE8F289C243191BD7D21AADD47C599D0B560CEA26CF7ABA5230C0CB308D82179\ C405706D86552DD484B141623D6CFCDE54240130A87F755C81CB28D833683F12\ 5D6E55B97C2BE32BFE12793DBDDAEBC6E97BB357CD163C71730D3061BCC49A56\ 831035053B51F373D9FE6BD7C70755CE371F0985:\ 9A61431066681E479E1AAB08FFEA9B8210687A39ECB084C609FE34F61DFF7A1E\ 30324438931A5B4C5DF5D37F5ED94E90CF9D6C33D993B6B63129FD8E7F01125C\ 23E9CD03EFD5EBB65C887E527D9E64DE2B736E61F094CCF3756DA7378185CDAB\ 2EAB41B490F3A42FFC626B32672131325FE3724EDBF4A0EDE7A69F51DA235479\ CE4BD74355E066E88F2541C7FF7B4023E6C10E680B64A682CE0280CEA3765014\ 326AD244B4F2FCD136637C859881E2125E25AA0DB6685A3A76BC3259D375176F\ CB3D59295B2211C66ABCCB777729F8FBAC5BB8CBE7F30D412354D23BFCE03F16\ 0AB296CD20BA976F78B0BEC6A25A8E8ABC80E6AB:\ 0CB5720653ABD543CF56405DFBE9E16F4C1F3FA85F6056621FFFDC660D14F460\ 0C264A246CD7D3DFE72A7A6E2E92DE3E5C1BD269F85822C2A53B4F030B347D08:\ 09F2EF7BBF205D0D19C631099B4DF108 21E04706952DBE1139F0D5BB48607E166FFAB49106D572C3A157518189C9C75C\ B5EEEE4F48B66781900D757A6CF867575F2DC01B96D453E3C146B20EC1365416\ 01C1A1DBF73B8B0BD70510BC267767A69F6E76824D9BF872F8DC197C8992B9F7\ 3D39BA8A3EFBBA43765245E9F9694D16A65CF30955F3252B30EAD9E61D96759A\ 8711ED527EBDBE0DA3A868F4C86965325F3816ABFCE2861878DC18D29396E166\ 4EC717935708F8E17F0553A1C0AE8D51C2A6899412130021A1CA8E9157CAFEF5\ 78FBAF304016D4B9DA8CF076C8B9D21FCDD5F0789F85E6E5410ABE32A702F77E\ 004E7E38AB4EBB9D837DA601D9B2A0FAA9E1B17CC1:\ 6CDF3A7C9B35B6763DDFE061E3EF275DE2DE317FCDF8082CB1E9748FBF645D20\ 25B035DDAEDBA18B1140384B0311B1EC746C10A461D89D4802D05297C57313DB\ 1CA0005580A00FCF4127B2406AD66F4CED6C15C61B8543D65CE8C87244BD9F4A\ 12686015CF2F1051CDBF84141AE68B38A09133152BD2D6E6A8288DBA5FD33FE0\ 2AC7DB872D3C7D14B8D4C142A99354115E69F7702221E8178E8832EC478FC388\ C9B73CC383F6FAD68AD68C6D555CEB9B14860A9A38A501EAA2F34226B390344D\ 220097809356DDBD8AE01464A228D3C8BB9711133E7B4A6EC9A0CDA7AFE0D90F\ E2BD7C97003692249452C1D4EE723F9F9C93A6BBBE:\ 65CA2CC54575DE5EA0C216C07797381D5FB65A9D334B94F3CC0B19DE8197D724\ 1B9A666BC1F8A3146F64850F503C8FFA4177E22AD8A9A5CB55FF7451DA3D4ED0:\ ACC65AE9781DBBA0B21188A18AF04BF4 B1F770905E832BF875484FEE15A26F8A0014A614CA9D74FB1594DF831802C3EA\ 53FE84804766C6DC4BF4D02F5D01ADB41C40B2510EE26615DFD979D470736911\ AB6FD0273CE3F6D982646051985AA6D332FAF260D53C57DE0F6E84E685775AC6\ D300C36B871520548AB57D990CFDC2D6A1F1839540066B7F2103D4554490E76A\ A70CD15AD45605D14B1AB1D15294D7C1AEBFABDE479380EB1527F7306CC9A7A5\ 6EDDA752050AB8C72D793B36F02A3431D8F8B4C9F6998CB05CE803477F36367B\ 671DFBFCD50D4EFA21E937F86CADD0BFFB434A7E309727C1DB30A2924DEEAAE6\ 42E49447D5EACAEF29A5A4EC5D0C68269FDCDBAD0794:\ 02121075F6F40403F77EA8B9596CF8DF247BB25D3CC6F0F0362C000430CA63EA\ 3D26ED1C5946E86F7C8A04A3F26D96CBAA130A636FB629B22B2C6A394995BC4F\ 832527BC33EF415ACE90A92D9164D2079D21F439DB9CEB3BC63F6BCB6ABE08E2\ 282CCFEEF210AC25F3443646C3E92A31D9EF2D7B9BBD1F0BA812DCAA643CBD89\ 183AD44E8F08C0920BC07A05C2FA80626A85CBFC8063B662F8D09F8F6AC83CCD\ 807B5B98DE32012D1C91EBE313FE6811D4AA366B0E01A3B71B1981CE320A7D17\ BE524EEDB9D68123A2E36E6FD83DB65CB4E9271FEECD82959572314D38C31245\ 4F3EC73652B030C49E6B08759B87549444E1CF99F587:\ 3834A666AD82D3E981740807F4EDA8B85A43B33B24BEC0DAB23E534191CE396C\ BD7CDA5344D324FA735C391FC4909183289F11DB275431FB019DE9D984DE983C:\ F2F696A6B2DFFBCB20A62D2F37378E85 E041C65BCE08FB8F211263845C478B2B8E3BB602226C90D364DDA7DF90A7AF0D\ CCE5249FBD86B34FFB42CC7EA11ACC32FCC4C283DA90B5658DFC459D9162D1A6\ CFB9F039A7770576DB8FDDC8DED46D0028FBDE949FF9CBB4BFC0B669E31D48C3\ 5F216B4A19A38B54B56CD6D2537B074CC68E1E3F5380D92103C547A62BAB4CD8\ 2AA2DA1DB3FC7854A1946ED8C1BFB77FA155507088B396987612CE4A3791D866\ 878C2A06FDDB309FB3585573565221A6CCF9CE3645C68909E022A8D6FA4C1A30\ 5EF998E1B5A389CB1C82DBC8AAE6141ADE34609D565BF10577271833E4968897\ 19026D543637472A7DAB0FEC68F83BD903AAC38605A041:\ 66BDDD3C18E60D5FB2FEF68782AF56D3ADEF6C604A690EFB0FC523B64DA53C14\ CF05CD0561BB8FA24371ECB60E4B7D78F43AFB352B7946BC880D90307D175FAB\ 5A6A1E7BFED40C334BF884D2A77CB0866D02EEC3BD1E9355E85E5E6F3DB94A33\ 8C27A028530EFDB109207F57CA91F5920146E463CF178F77E7535E7BA1E6EE6B\ 8861BDCD6EC00145754B4A0DA0F97F58ECB223192007DD008CC0F8C59C44A3F7\ A19A4AF48E81F13AD5AA6E71B6B497B659EEB947009DD905F8ED34CD7F4EA69D\ 700040CB104C2E60F8654FD6E1CDF8A8550EEAC231B9CB3DBA9984902C61A531\ 8BD12839B39C27934EB4F0A4D0CCA9620DA569D7667D2A:\ A0403EFD4F0B35C28E10BB35B47763AACD8548B792C46FCAFFD680A1FCDE4468\ 6E3A17283579ED029082A33EF635FF943FA6D1719FFF17DEBC1D29837AA21EB4:\ C4D8B9557760CB777ACAAABC5309F74F 99A35B8CBB3468CAAC183AC1F7C4992B3B8A051FC7431535DAF3A50260199EA8\ 8D23813F3B02E8F93969AF1020BAD0C709E927BD4F5B2AC2904C5BFCD376D68D\ 8F99164BF14CD9520E9C09161020D124FA6BFD3D37328BDC4915A7738EA9007F\ 19C0968EA8667EF7E89515DEEC810B843090E08946ECA12C16F66B29092CB7B7\ DBF9E92430712CF507BA2F3FFE56359113D32400EB820912635AF043B1270EEB\ 33875F0A78CF01241FFF4404A778788B01DD58B6F9813EBA812378E8F1D69858\ 6F356D1C6A250A60F49F3F1ABB4468F35BF1D0197F186F4EA6B763396FC76003\ D73A54CD24031E5BF45F04FABFF68A8C41170AFD58DF3D27:\ AFE01B7B56E7CB1FD48F07E5F7C523AF7DBD20B5F7BDEE8BD3FC023C9C862DAA\ CD83373311124E8716BCBF1DAAAE8A7832DA9CBC50B8237109F5115296DFFC9A\ 6ACC8ABD041A54B70D1D2437F1DB20EEF1974BA42144F6B48F16A49D955F34F9\ 2CF13CE98ADD4DA91B8C96E63A3CCEB96441CE5D47726748697901BA4DF2DDF2\ 0F87787FA467F5F718B801B04E005B5F2A9B592B4D836EE6CC22C63A126E45FA\ 419CA63D19B77EFDC30009FF279356D4BEF70546D73105EE2F5D98CB9B8A8802\ 52D094AAF9E9F0638EAAA3A6141AF1BF3923953BEB97A42B84F977CFA55D50AF\ 0C720D0B55574FD16FB96409CFB8D69176E25C796905FF45:\ 912CE1C64EB95CC07A798D2498723F2691C299D97B71FC103BF31ABDA26547BF\ 002BC1286DF4CD0190AB3D9406D1EE6400C022FDC68984E618D8017B3AC80F75:\ D370B66E892B3B74D93B9AED10FAEC7D 1D317168EC455679C436EC126E5DA02AE5DBD8F984A3907CE180CDFBD17BAB63\ E42B15466E2A57A39B1544DC5508F3E34FB83EADE55DCC3315231760FDDB06CD\ 7A117DD153DEEB2C320871438685ABFF3F9F8DDE4E41F30C81D55448AD225468\ B5E4BFD22E0B8BDD3D174D5133C6FE0D60BF48658FD108682F735E0B04BD2B2D\ 86E37CF5F72901BBA8ED0E7A9AD87659D1DA6FCABDDDB148C8272761B80B6A2A\ 8ECF37BF89B36BF89500756C6F481DB7C2BA4FCA1FC19B0119154E99172AD561\ ED6C001FC1021F3F2F179FAE11FB380C49189CCCB01941B314B9775C131C2C7A\ 6EB531354C60F86C82AEA534E706093D3BB11D016A5838075C:\ A3F7CBB2E8A0326FF75B80C4594DCE6CE266EF13B99D1FBF7FB34A77D5F857C7\ 21BAFE6C6C9D48C4CD1C8796111214433368D324B21C84EF82828A73F9EC8682\ D9DFB9B4B428E14C9C16044EEDFB3F8C980636E6195BBBA9F0B92C94FDF6B274\ FBF6C25F33962E57B4F94FA7FDE4B8FFC91D63F0189D4D9A010FAA3ACF444B00\ B3A957D6219500C1885BF14EFD3E9879E0A5FA76FF3AD6F70BB4C0A87CDC1CFD\ B082FE33F5FB6349CBD197271D81ED96D6A7820A69F0A907DEEFFDCBD655A245\ 47BA43AE78EAD99365BD0E836EFF16C789843A7F1E321C18E4D81BC334DBA3B3\ 57B1BD1107CD3DDE2E9BE8FCB9423C556A8FDFD07937705B8C:\ 8666320110FA484315410D173EC7F46D9C8527B8D0F702061C1CC524C33923E1\ 5E9D807277B323CE12A01D7E88041E47242C9BA86595C8F2CF212955FEDDA109:\ 47609FC73A46E39B8534D1E0E133C415 0D8F39796F3E3A18B928B368341684C7A4E7105C6447243D6E3C9A10562DE3A5\ 3F878AB599276D94B20B85372CC132CB2BB64278BBB7DF478138032EE2D56595\ F0B01A915C73FA6B6EE6ED29FBA4AA74A73CD3B29DE16C6B177AA811897612C9\ 722EEB37D2C51FA0BDF2BB6B0D1AB7F0E636168EF6DFD9499B2EF05C475C231A\ 4CC63D2924942C817076E522FB6D8E5B7427EF49E4FA59C72C7C3FEB1458CF44\ EB44042601EF3C0E1A3E17A52C2CA9A6E29C8DB633691F8A4A0FFA04BCBE6EC7\ 0F8028AA975A47F94B8455DADFA6F6D4F195B8D36377619C5872AB30DFBE8937\ FDC740B96483F62DABA87B92AA7EB6E7600181F0C8C44A8977F3:\ D8ED7819D1262A5B1579C694CF46132E13B82A25AF23B3ECEF5999A290993654\ 102500A024CA653258EA4581B1ED33182FEE3B91FDF0350CF991E22A876738FE\ 3AFFFFCF90AA3CAD3A462F08E92FAC53066EA8E41EB56B57AD696B3A4251B10D\ A5A140CCB1AC09D2D969D9B8BFB0FECC72CA5EB8EA46D5EDE37480F269FA5CAD\ 08939B247124D49F1A929BAED9B021B1D0996E5F3EC22A7BEB37069A7495DC5A\ 4611D521FCBCDD4652C0412441A98146C56E6A9222EBE8C989869C77C6F0E37E\ 0BAA5FE9367635D937B3D274928A831362EFF700DAC6663D7F1600C2ECF299D7\ D7CBEC3EFC82E453F7EDA0AF7385C2087A07731B9C61DA475D52:\ 249DD0E25FF78EC529608091F46CD9CE99CEC6B7B62D697174029CCF46AE0C4E\ 25A4BABB6878B083F66398325BDE5560FDA16A0EF8B230B61A84E80DFD278893:\ BA52AADAFEDA198565D78AC8965A3633 F2408E4A597598BDEDAC5F66B877DA1A9C9B673EA3F95625035C5D74F3A82079\ B7F39713AC3272532775478DEFA05BEAC846997F48C94C3B10A77559946FE96C\ 4F8957F7512EEFC60B599FDDFC46ACEBF46EDF156BFCA19B5928A0C518159F97\ CCA85CE3F3738B2A6C9626F6EA87BD06B24F250E098768620E9E23FA87E828A3\ 2C03A36F90E228C4C71CAE3011B4B30ED16ED4C8DE6C534E2CC683FAC179F776\ D524A3C128AC158349830E222E75F36AC6C404C53083DECA6AB852D5CFAECFC4\ 1E7FEB2D02EB47624B3C4972862C7C53BA6EE20EBFA2AA127E1E1759D983F5AF\ 3BDD793D8B6C13A42072A5976231A7C5B8435E145BAD599E422DA9:\ E3877C96606320F9DC31CBEC621FFD5ADE7FF6770200998F04C1A94C816BFF0B\ 9D8E2033CD351982BE55D599BC2F3FBAD0159B57FED2CC82ACA9F20E7A96ABF4\ DE4A308F2E589B84D91357812519BE6E37AD366A81FA1E4B74AB2122F38E79C8\ B23120DECBF0D4BBAA7D1A9FB22216AD05AEA9165F2F8D427B3C77AB682B8CBD\ 4CDB960EEF145586E7F44E8EC4F7004AA028B3910075476B408C94216CBEE652\ CAE307A5C05EEB1E20C37B66EB81A3DDD02A64DA5B857503B0ED2673D7A9C2F6\ D36EE53B0F00B82FFC57A4591EC211D2EE8FF8419C3AD0E336A4E94EBA86FF3D\ 6D57C452E03A96E77CB24882F506C1B86623812043CF2C497051D2:\ 8950414F1BCB1E1544D93AB18F0E83153965C357FB26050948F33DECF9F9F5BB\ F66683508118893287359273A85BF78A8236B65DE562C3FCDFD4550A11C75E3E:\ CB53400A63F6B7D3186C49C6B5D065F1 DA3328D37C10F1086C15DA70960FFFAADFB7DF05D6E3571DE07FE15A260D5B99\ 0242820581E55FF826C0954548F4C0A4FE01A3A2998F3812EEFC4A69086575CE\ 8A0E42687BB45303734D77D84F9A890B830B5ACC74171CFB30C5BBA4ED207C08\ 7994EE29258B88CA29E278294C7A21E68348A3EA426E30E28B3A900712726050\ CE2F40E31F9AFFCE4E42C28C29990D53D0514863A133A972EC26AE3AD8D0279E\ 02C96C00FE3CE5C40FFECC392B681F5349C77DD68470103113270091E7B596B8\ 926A143535DBC11B947281D725EDB073A9D7062715472FA1DB987CE8D36ED423\ C2AADB5906C4D91784400E572AF75D471A64178715E4AE22B6EED796:\ E317060435ADFC840E830F0C853A5369D30DD666E5ED98417409E546A891829F\ DDF8A9E55284EAB364ED012B91DED2CDE5512220D6480FD64A78AD1C50170962\ 7AC3AB9416828973466FA127D0C6E168F42C8D0B60AD7ABAE72A8A8A19FCC6E1\ 3B65F5431869F61E4972E75E135025DEA54EA4933B6548320E398639BECB0F48\ B2C4DE093FBFEDFD7CDB62A98CBC58F1C9F9581E1DACB1B6EFEA494C36D3A22C\ 5464612867466D19BE3E17CEE1140FFB3CC51CF6C3E3D0CB98DB5458CDB9CF69\ E53BB57A2DCEDBBA2916E8E7C822254F0365B75D38CAE4C4DB97194E3EBEF5FB\ 0A1DA02D9D1ADA33CED23283F8DA97F1AD6050CF7BC4C824DD55A6C8:\ 50169CD100CCA22E4BF9E524770154CCFE9AD9EBFAE0C30C4641B73991ABA690\ 6592A2F3D0F2F48ABE13BEA89DC2B2EA93A5EDD8066BF1C31A4FB2006BD24EAE:\ 99D8AE326A10284D8FDDC06AA5F4BDF7 C22F2380493B5CC7EA4E59998252ACB600E61ECF8E6C2B121955C0F149DD9518\ 6EF33D66D573B6C6CF7EEE29F63CF1524CA027B67B30E92275D6F22CB81BE477\ B002EC5ED16979BD696AB7A874866AD0171FF9B2D5F592617636CDD3A55C7857\ 8AD48CA803D73114C340B003D1BEF92993C3BD34ADB18AFD85BAB43C3720626B\ A944243050868607C1795A453A13F132E035CD2B451E1B0AAD50FC27C5C1A3EF\ 7822AE6F530DB626B223E803584E23B6AF181E7AF4974ABAC12E42B44B56106D\ D2FE49E08AACCD0DEBC1FFACA6DC3D277740059DDDB727EA1D7FD8C63B6FF768\ FA2F0B8BD1C01D36CB5A190367EF7A78F1C790B50012C0FA24A3A6F995:\ C80CB1B8AA44DDD9A7EB1D83074BE67B2E098C26BB1CB39113E3E14EFED0D337\ 0F645D43BA316060929338C549B908325BBBEEB8DA5DFCB1CC3EAAEEF471E424\ 7A2304786E1CBCC27052D267216F6AA741E7C392ECA0B9E83CA4EC13962853A0\ E2A7F1C27D96D71C327777DF31A931525110D10EC33BDED7C7AD64FA05AFB97F\ D91E31B4CE51740273E481640562201F2C19E67622D875573CFC0F9C4D31E882\ B8CFE37541B0C4F072AD9E9F0261AE9D709A54C98572484DD42DAD163F33C1D6\ 254A80182934E8190AD1CB29F15D4913BAD2E7C93F7AA95C3782D50FAADC449D\ A4AE98435EFA80BE52F80BF6DB60B27FDA6457E7426B0BA6393364F2F7:\ FBDF921C80DA76FDF559BC8937823F8F7DB7096F164B9AFE49AC9268653A0736\ 1C62830DBD18A491DB9A7654E8C19613A284C35D7169D2E4DB3A3FE21B541C98:\ FA8CF9134AC279FA9BEEB5110D322B72 263A9E751DDC9D7C8ABBABE64FFFE976C9BC41EB468B8319C94357AC1ABEFF93\ 6318CE13EB15EBF7E8E03340B7521EF7E83F68E22C40711A3227A05722B0F291\ 13DEFC3AAB5A078F1348035FF896DBF1AFD965B5E3788781994394A9B4004186\ 4AC70C6FA5B874024828F170DC039F8EC2D5B75F4469E16DFDF418E77E64BB6D\ B444DBD58A06DA728632FDF1B4DBEC3B304DB33973768745B598739882003108\ 99FC8804AE157EAE270F4B8641A8A00A0B65A9D7B1C2C19301BA7B7DB39C9443\ 5FF3F0D1C59577ED3A71EA0AD377CE7FBEA781A876927C202249CF116B58740A\ F6D93B57240EE900064C7F6227719E4737E9FFE3FCF42CAAF6EF326EE3BE:\ 58806A677977E5979EA8717ED88D5B141A6584839BF7B00D9C51D21C93463B8D\ B59661EFD9E9925769DB1227B0AC23DBC3434E28DAD180B39A98C9876FB37DEF\ 3959A5B75E41AC5B339645F25A9D1E72A5CB01D5C4E5EB8129CF457D802F02CC\ E979B42C2E288639EF8560D82A6A7F5D08FDC01B6AE4C0A0D3DFD4C34E146375\ 51D4731C9F780D09E22AE5AE5EAB5BCBCC9ECC35B3C546383722B3A74585ED67\ 9E8A9E58878F075858158784CE31A1C57C3A396C8D01431C41E102B41C6A8BFD\ 1AAD0AF3392414155DD615650C1388F2C158728FEADFDE384933F87B64E33204\ 6647522A67D5BDEBE4ED90577956B325107B837079A7D994102E78ABDED7:\ BE5FA91C4BBB3884D6E5F8BC9EF746EAAC06BF3C093D68A2CEA6DB22A084E9E2\ C63EA8FBB38D376C0B981637B712E5F2A46999FC7929A998FEC0A842AE40DC22:\ 8C5CD690539E81D98C73EB06645624D5 5F9E8D18BD77176BBFB38BB8A3427D899B24EF227C7FF3FE0EB545C3CFFA119E\ 687C72C865452F5E0D530CC96B79AD199D26F8E95D163C35C65CF7AFF4B62AE7\ 51FF396F895C4C5D3D4F243B9ED9CB291BD75EEC5A19976B26E0650AFD84F08A\ 487CB66AF7560C1C0D59DDE2C36BB7F9927A5073113D5D5BA2AF3012975C2B40\ 17BC50929C94C6222FB33B6C171B1D34D24C68EA1088F43C27F2D83D9366E4DF\ 3F6C675CAB04E9FB4B3B8613752A1E8F7A0D1030DA1C3E56D81A2E599AFC9E6B\ 2E084776F722D30B301132EF671BA32FA9E9ACE5007273DD94B2C393507832C9\ 233211740D2A173D4925C383AF898515155B27E9E08BA8D6F50CD60E8ABD8E:\ 5FCD2A960BA94A7BDE02789ADA3E2D25FF7AAEDE6BBF3267AAA6D99E276357D7\ 2DA671FDE45FC4A8414E47F913A4FC09DA9CC52C8F3538A47DC0E6DBA786A6BF\ 88F951E9E1CEDF38580177FC3B01F6B458E9B66876A46EEB457FD0FDEA030C6F\ 4ECAB1446607E8E4D95E89FC78A8E6650A6D849816F7AA3B322EF23452421D67\ A33DE3867611EC24B7155EE33592D22364985D03A3D61DAF2CC8566EF9EDB63F\ 05270BD5C0D651306476DD62FAE9545DC1372E2E803D4617849BDEC2AB59B14D\ 4691E3C4B2D9F58BF083EB2D6A342AF825C67393B1C06E6952667F7D7D098DF7\ FF709A83F3B36B1C84B4582EC3BAD62E01DCE7C14DD3580BB5B6EAE8F9F42A:\ BFB8460C7B07214B606A4BA04ED62317A5770D110C84BC75B64D2AF31F76D00A\ A2BBDCAE156A3EFD4604336BD3B690A592A5457511A8E3E4B6FC0DF8286E39EF:\ 7510B7E888B269F890C3371F636C4577 88CF2CD030D671A3407CC780E1229722F72271E9BBCDC01DFE11C94989AAE8EA\ DF8BFDC610DB7EEA6F22D5599A81FAA2DC4895CDFFB30B65DB1A28DBF334FA5B\ C7657D59F2A99C3BF96A713A0F0C984E93D9B3E566629D9327ACB2AE7078A026\ ED4FE89BB0AD6DED7748FA222FDEEC3953A27892F6109BF67669AEB9D725542E\ 10C583AE3A00D9A2D0BB642BE1D553E7DEC70499B91F6C7906379B1CE62E4DB3\ 781BF9B40ECD87DC687E7EE5280EA0D338A62BDCE0315D69A801F45B6476008C\ 6B3FF9514B2ABD23B2A3177E41BFF3BC664C58FD09B8868D2C4DEC07B3B2769E\ AD72C76EEADD4682A34C27DE98EB7817E36EE71A5EF9CB052DAFD65B9311ED1C:\ E2047BCF89F120DD00E2AB2682E9798BBF01A16D3C55EBB5D12641BE5E43C69E\ 27CF8316A17BF17BA6F977B2E10CF8FDD9A1498EF440969590BC10139E909083\ B2131B1DB88EF790A9541108A1C3CF6782CA7CA63C74A2E6BCDD1FB7A805C9A9\ 00ADDFC7B232CA7FFF09DA514ADFC666B1ACC86357AD2C12E9D6C2A8BC5C3AB8\ C4DF5FD895C568BB824FC39DA96924054CB70B7CCB6DB1756143035D5D212522\ 5026303C3270E8FE0F83DD54DD12E133DEFC481157BB2BA5CD37A2B93C2B21F8\ 57ADDFF8CDDA74E1A713E8D4E44D30B8EDBD13B2AFB9CD1F2D97283F9F53888D\ 5B59F98C66DE5FA2950588DF3E3641C52517F6F0717C4F14F7F778E405F74AAC:\ 44765C5ED4BAA0FF3FCFC4B6E574E7C640A221F64B699C61D4A96BB405EFF36F\ 65A4957CA57D8EFA04EFCE61DE4F91F476F8951885AD50D842EAA74E9A75A577:\ DA1A035D2F281D6962301C515C21AAAD 53514C69746520666F726D6174203300040001010040202091E4F9BE00000000\ 0000000000000000000000020000000100000000000000000000000100000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 000000000D00000002033B00039F033B00000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000006202071717\ 170181237461626C657465737432746573743203435245415445205441424C45\ 20277465737432272028696420494E5445474552205052494D415259204B4559\ 2C206E616D6520544558542C206372656174696F6E74696D652054455854295F\ 01071715150181217461626C6574657374746573740243524541544520544142\ 4C45202774657374272028696420494E5445474552205052494D415259204B45\ 592C206E616D6520544558542C206372656174696F6E74696D65205445585429:\ EF1F13233DE8092DDE062280F8CA8F480EC61DD555396F41FB8ED9444844F837\ 89933DCF9AEEC1933D3DBB4D54A26C329D7461ECDD009CAF263EDE40007F2673\ 6782D95B629205E87D4747FADA1434EE74DB09505C43230A0E700EFD012A5F80\ 8FC713FB22624AF804FA318BDAC382773E2653B4D576D0BC1A42F9652F56280D\ A21CF82595137F9C472938F7519B6CC24708FD5409B75C5309E2C85294A2D182\ 2A218D9891D56696ABBF569906CA0452478628A719E3F11AB097D62D3FFB4549\ 576159282232655AB69CE1A4103DA8428F74D73E540A95ACBCF347D4EDD299FE\ 8ED90AB8F09D5D16B35BC5925E0B191DD753E2617B9085F108CE6B445F604CAF\ 2B266D5A10B460DE08A307D7CDE626D84412B8938B24EDBAFD98205978207014\ 4413A7C354F99D89CA475ECB626E7D93687A505B0F3E7D48823E4133E1C59465\ 56D55266A90F8C213ADFB020CA2D55462FA400B26B159306A5D3A4C91815C3E4\ ECB8545E394099B330659E9B9C188AB09A53838AA8D0119ED9E55837BBDA655C\ FD4096C4E2227287195602F32A8239D69DF555145F4EFF077F69366416F800DC\ 30C03C50DE4AFA12CFB4A8CD2E86B36D54CB44C3848FAD7917642551A85C76A3\ A3C616D32B471B5775A1662B997D392D0B091570710B1CCDE49DCEE634EE3BC3\ BC85ACEBB7F8551DAF5D15EF19A9DCD3CC9C82B46A4B9EFF8AAD0F8971A0F26D\ C37E2DDBBD7603298654AD6CE0829EB76F0892E81C569A71343BA8EF767B70B8\ A24ECF342B832483B7C9375D07BDDE2F1D6D4E6D28E997B1CEE1254F70D17F7C\ 24EFB08A3634802B37C8C0081F501EBE9346B9DFF3705A449B5517984DDBC2BC\ 91F626045EE89276C137233D8560B15C11592082D11935FF68A2ED6087527030\ E4FC31F37680132CC53DAC81DC3636DB5068FBFA3B6923A2DC7CA617707944FC\ D0CF81D092916AA54D5D26151C259FAA9AFCF9CD77A5E22FEBC019694205A1D3\ F999E59F00D42F26FB5B9BE68B45F37DD664A2E9BA3336CA8A37BBC7EB452585\ 8FCCD69B746C7B8EFD534AF44028F915743FC858B45DD12D7F637FFFCCB431B3\ DB609578811A67BB80D954A16B456792084E0E828CAB146A11A84DDBE4C79859\ C9302FC55EBF8BFE8CD2B6214098549EA67FA52C8E0DF383F3532D87816C7452\ A7AD571C213307961F786C45FA3AA89A0B66766EF0775904A66BC17DF3EB5646\ 0444EA22EB838A555D58EAE5DD0628581B9709738A1D9B2A3F66D4CA254FDE4D\ EF8DE858574672F34BAEC851C58E58209C9019A32E0C728A866D04C1A5524689\ C11C97302E3BE145486887E7E6F11581F6751DEBD01C28CBEE855CB58F69D794\ 5831AE82AF364ADD56CFA0C160CAB270D963CBF82E324409690597D80F152025\ 0B8254B29B09BA74E3700F9E614D37728C373C15C1E92D2674686D811507C34E:\ 9F7DC5DB8ECF4302325E0A993D761186BD59BD247615E560B704F8C9B6126A85:\ 2B1B7B6EAF72CA6F7F6CD1C0ED88DAD0 0D0000000503920003EA03D403BE03A803920000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000140504001B1F7769646765743235\ 74682074696D6532140404001B1F776964676574323474682074696D65321403\ 04001B1F776964676574323372642074696D6532140204001B1F776964676574\ 32326E642074696D6532140104001B1F776964676574323173742074696D6532:\ 3A88A5D687632C9EB390B37C721A2010006D31FC9D4E3D169D242E1E44A317C0\ 675566A5414EC5C5FB19FB10D329C9F8A0250AD8F07880459B98E079FBB1CA58\ 725EABB2CCD6427E14BA01580B402B9EE34C6B23CEE38F5AC5B50A8198C5441E\ C3955B3290E2F7211C8B2970E3082EBFA1DA9233E0D94923D5F658A6BA1E0E5C\ 7FC01889E3486551180032304FE118BBF7484A487B20B356C89C2DC5C1C8DE94\ 882676B19FF952B3316B9C8C0187B5BF781D894AB1DE6E8537B57CAF45CF23E6\ 9B62B143E1AD9C47483525EB0D89AEAD9CAA731E6FB2A3ADFAB8C05E1F967460\ B05ECD759B6485AEB2A87F8E9030AD6C01C1E3E7FB468C624C50B2A20A9564FF\ 5E1C164C0ADE0839099FF7AEA385AF3CD07D743B7C0812477AED4EE7EAF09AE2\ 45CB1A646F63A5B4A7741C1B223C73235A973FC08A7DA0B60D5B8BD8DA07C236\ 7DC32CDE9A468DE47570D8FE52BAA8088D75572671F227D8BF5031165581C7D0\ 24535729112182B38ABF9DBA5F15B3EC590A6BE6C4AEB987E851C9A850D8AA8D\ E7CF93A60E8159130E94BCA5FB252A0089EABEFAB3E2FF77C7CB3193D3123CD2\ 929E336C2E183272F83AE13574A0595591619BCE9FBBBB5D9EAC69B5D8C8BBD1\ 27EA886544BF770DCD8FF9C96F0EBF63F9D9C20FC8F1962CAB0E5FA7D61CF41F\ 4F38A43E402FD91119ACD6F7EBB1BEE6D56C7BA2C014BF64018464E8D3938FC5\ 4F7A8B58A1B86C16859A9CDAFD5604954AC1BA17CC1057481FA8704FD3DA9B3E\ EC91B850B9DB54B38F59438494A316A0D271D813C8B95FA21FE7776F112327F3\ 21D6DA9E1C2909CEE630856A53140D9905DA751F42BE351FCCEFBC44EB80F086\ 5A3EB6CB14A91471D9B0ACDFF0D65DA1CBB8E17E2234B20BA8D3555627A4356B\ 8C0D0851AB981DBFE79A293C242BF862D8487895D7B86DE8D77810D0AEDEC249\ 6063C9ECDC57B1D3B1B6BC54F9280984D532CF30CECFCF954B5D06DF949E405C\ A68C12C2BC8584BAE50EAC0F98BD2D1E8B53237F10F414D61E90BF3FE927D950\ 8670D614EB1CFECF00C92AA3F50E2737F7BD3FB91C46D3677FC3F1EE03FE81EA\ 6E7ADCE6FCCF06719BF1385C6608D2F833CB926ADC03339D03CB45996B199BD9\ C3B18AA60BD9841FBE5331CFF7544BCECFA79E44BAD1F8757DFCCE491267772F\ 0BFB4AE236E19DFE16BD166856851999614F38997EAB29EBA438D10FB7278FF3\ 1334B8AFA0D6CBDCA39DD2ABAF46560805BBD9F7B32A3C551A4BBEFEBABB8906\ 9640C7E310C0DD8BDA60641D2468E2C59933DF671C22B57190F973E8EF85F5C6\ E05D89E412243366DC2947F3418198FF5A0A38A383354ACDB3B2D79E99E7F734\ 57A9EA05506307CFE13E8BB571B032DE8DD22F3DC33AE338185FC099E9A5693C\ 10B78D140F6B3BCD8F2ACBBADED84941AC3CFC8F2795BD94499B89E92E45B9C1:\ 9F7DC5DB8ECF4302325E0A993D761186BD59BD247615E560B704F8C9B6126A85:\ 92E8641C3A25F1A79D188D7DA317F4F1 [TripleDES/XTS] # Generated by botan 596E8B3B889BF5BBF2:\ 1C908494BE7CB290D3:\ AF6E340E3361AD76756D9A72426A505D619997310DB84D5658A274258C1BF0A0\ 090F10E4A2B8B02277074A4D7CC9037F:\ 08E28CABCCC505C4 8C8AEE061C0AE36B302D:\ C0D0251F337EB231C842:\ 1608738E2FF0304610913244F0169AB59D6ECD9935AA8A77ADB8991E58B1272C\ 901BC83D3F0BD954CDEF7814748AA601:\ A30CFB4EEC4D2A34 F73A9E54AE1ADCD0FE2E54:\ F839F5EA2522AE88B392FC:\ C365656F981EB0CACAB0EBCC6EA6019ADC10C34F962509185B9776544F1A007B\ AD0C8328F761146F9AE9EE6C61FF62D7:\ 5068252132D6CB50 E29DE83CB476A22DE6D57E46:\ 40258CCA6843A3CF49148A35:\ BB8AC3BE60C519B23B90428F0E9FD2D73669A3A73BED60108C50D496340BA80A\ 71720AC17D4731B6FF0ED6EFE094D0F8:\ 001FACE467C3EB77 9FC6E51A2CBCA2698126D60460:\ 7363B23A26CF19145C234A02F8:\ EB0445C3EDB50EDE5983E6EBF65C3B09DC8440F021D73D0455E57B8FA676AE03\ 0006E7F5951F5C5D44A9077DF8FB0C6E:\ 9F66C0D8BDF9C2B8 A520559F992E750E2E15147C6B22:\ 4CDB658ECF92BAB32591547AE27F:\ 9773982582D9B42FDF323BB75884FE0C0F0E35DD8AC8C528211C49AFC3BD02CA\ 81F96106B585A45F177D407C8AF333E0:\ 7C823793374D30BE B74E78431E0FBE59FB2C51C452BFD9:\ 33ABB8C1D9D19F6EDD34E92C23A5D7:\ 2A034D1DD9F504C02D0998AD22CB171714C3B7C86A5A5CABD32ACD7F60FF3E7D\ D87A56C67FA8B492A65F638938E23DD7:\ 6FD09D721BDD359E 61AF7681ABAC4B4DFDDEB1CBADE74238:\ DD7116B54A456CA51A2C980F0961CD52:\ 21DBB4BD072BC8A9A8A3102158EE6FAD4113962BDFA1E67BE069519765C07991\ 4B90E2CE9AF64D71FF99C1205D935A24:\ 671EAEE385AF636A 0DEC0D07D0510061DAF8F6C80D77465C73:\ 6A98AF6621F2983106899B372D251D3186:\ 458DCD428BC0FD84152940EB98CC9992200CB63F5DC52F78F9BA2374B7FD7BB1\ EF468120A4CA96CDE9116811D608DFAA:\ D1ADC21B3819DFA0 81E22D517081F4E7DFD58E7299F58C266379:\ C0C0BEBDC9A24C787870ABF119F521AE078A:\ 8AE0650EA3C6C0532A4102F1443C64C47B8AF78FCA98364D732D00FA5AFF9466\ 3C0B8E64D21B0654403E94708D2D8013:\ 7F0F1016C809CCA8 63799C2645261603ADB10942168DA814EA6B01:\ F291293423FFF359AF694B7F52C5F78D76D516:\ DA3285F760EE345205CD3F9EDD9D4DD73A80C334B9F61993AF481C90B941F88B\ AEA2C5D81C0CC8C7A87F904D8E585FC0:\ C21CBA5C380AA0BC 02869B01FB21E4DF2AE861F797A5656F57862F79:\ FACD3C19A2B76E2E1662914327826B8B9E7B2BDC:\ D5AECEEFBC4E6DCCA4C1B2F9D1790C060C6248BD94C1D8A84225EC00D2FA1F69\ BD572F775E164D4B9272EF596D3807D3:\ 526DCB9D29074750 7D6DC02743A82F9D2A7D9A3022A632CE0FDE60B5B2:\ 0C776B17EACB4491D2402615C1ACFE46FB59F58F15:\ F8A1AFB23439C2FEF85E9BF6630F577134315689AEF881868489B0E1CB37664D\ 825613D7944F673759B4B243A4BA0D87:\ 1A07AD2392B75CD7 44E411A23B08D54ECDE8D99FCD089B3D6967F400A7D5:\ 472077106C01A21D1566DED9D7E7517259F40AA541AA:\ 07360896E279D84C8DAF2CA6C67B8D8DB30F31BA20734D9E4000D0AA4BC1F34F\ 8B433E598D0589B10CBF01F2FE23C4F9:\ 227F43BDAE4F3707 34A2E9FD808D0172666EE3FF26914747FD8C999FD9374B:\ 87B05D3D27567A568AAF740BC6FFD2BFB47081B6530F1C:\ 96C5700F7E8C16C9B199BE51191FDB317473CCAC75259E02A863557BE410DCD2\ E558F81D8DCCFCCE5C7DC70FA50BAD2D:\ 5FD5D57479014B05 B2EF1DF1B8265B7F8BE3A18D650F8CEE98C23DBFA25BD95A:\ D445FAB8CB5B88DD1E13D2DEECA82489B2732F1AFA9F59AF:\ 7FDD65967D0B8056686B59143AC98B86EA0C500EC4976A9B419935D6DB53B7A0\ 44DBE70C4B93D4FF9C85F8C7FB1003D8:\ DD2E43A40E72EAFD AA45161FE3AFF8C8B5771AB2DB7E2C681F04E5E8C67B001692:\ 3FC6BCA03D56554DC2F598F142181626CB5E8059B024F93F80:\ 8198AF071EDAE7AA4C316C0AC2280AEA82BC9ED7FCF24ECA60BB559C1E6FA9A9\ A3A02A2FE7DFBDA248CEC6727293AB6B:\ D2F06EE207D0F0F3 80DD67385FC8D461D56D86AC9A5B33A47F39D50B61D037BD8A3D:\ A1398181740E1379CFF3C1A4EF7DA9393774DE5C013A46FCFDB6:\ 7863321EE44162E3F5B8682F760CB1DABA793D9C893FCD0DA886B2D521F7742B\ 04243B0756748C46D87DB45F387C12FB:\ AB47B3578C27415E 2FDD45060594F923731CF7C6324AE59BBE6AF2896B8A9CDABC2D9C:\ 3374F534D071E05DD40CBAA7D45FFE22CB9003FC3E84CBDE3C8B07:\ 69AB8BC60B6227975A5E254F390F8AD8E3ED4DD1F20188E730B395450D9316CA\ CFCC34EEA68CC008764B873A4E8A706B:\ 82FF3F21B16D5775 3615C1398B7EBE5FD4395E84D551B95A7967386E27AC52DCA3D8D56F:\ 2F0DA401A37C4C734DD30EAF2B5C1BD5648D15BC9B2868210621169F:\ 0F05EAEEB51C5967E5E1A7A8101819C8207912E869AA013E6BE32FB1A1C625C4\ 30E00292F50DBB0B23BDD8750EA11784:\ D273A4E9CB94CBDC A252C9802B1F381238454AE68859A9C715B7AEDAF0278446B74807F97B:\ D12A4A1B01B1E24247D3E5508965727A1CF0133F1AE9D0E90CFF03134F:\ 2796428CF1A8DDEA1246EE9D4BAC6531F4EB8EA3E665AE2EB1162F7698D9DC51\ F9B3F15FB1DC836578B4956174150E91:\ 897E8D993BFF8360 AD8DBD8D62E6FB60508C216EC7B3F5BD9B4A9F6ECC6CC00E9420A1719889:\ 83CCCBF0FFCF4D4C833E79681497B32C60B1C18389AD5A954C48B5AB26EE:\ 89FCD9E0596A40B9017EBE37C3A75D3518285533173799A26E444B23F0E24DB0\ 70C3CC834D08851321DDA672F77FC7F5:\ 307156BC32557CAE D839E3ED9E55A7EC8B39C3F76C48D0094244CF5DE8FEC94D95EE079E73E8C7:\ 59A69254B79CE95A9F553E518DE078C2ED46386F19EA5D9ACCFD8F16B68724:\ DB8D3FA7E248FDFD96B5964E4E2F6F724DB00A84B1A19AF47F57FA500DC14647\ 7788F837EDDD7E1E7E864864AB32645E:\ ECE48F3741CE377C 8ACD2DD2232484DE924ECFCA148CC2750BCF19AB5F4C0B842BC85136E1B39E6B:\ 9A9B148B87511D46D1B15DBB9F31D141EDE588F13A50446F718EDB32C9ECEDE3:\ BA868E442E8ECF78CE897EF30B7298D0D88E14B7F6763F8779C39C6CEC9F7CC1\ 807A33562AD16F5F0A91381F3439492F:\ CCD513E94A91A33A EEA5D0D5AECFA03A0DDBE6690C07706F10EC6B48EEB8697C4ED415D9EF96E732\ D3:\ 090EBBE41E2E4510F33D584B4A66BD4DB8D24BDC379CBB07106B22AD87C7DF8D\ 77:\ EC4194666285368994FE4A5020DA2E2F688D68DA5B06E143019B73CD49EFBF39\ 4E62260BEE0B71DD7EF133D88764945E:\ 80EFBAEC64855C45 FDA674EF51FDB463346AE936811187FA02AE6BBBB73DE0AC8E325D7DC1BFF369\ 7395:\ A9CF988E41A71AB459DE50CBDEE960ACF6CF92F6AB5F82A8C34694E9B6067527\ 8E87:\ C187193AECAA580064B8D1BA695B8CD78718391FA3BB85F9A6F8AA272AF939C2\ 8EEF434F27964D72424A722FCFB219C8:\ 114FFD04DEA7AE4E 299778C0B4DD0CBC695BFD8EF0A7404ECFB340B2B6B6FDC469841E7F6AB487B4\ AD92A9:\ 6AB6BB5D5E8918E8FC1FA83E3C3704C0827769E62D99221153E4554160CD5EAA\ 993DA6:\ 53338E70693A229B7C2111BCCA25452E931509A9F5CA6849C8EEBA3EE03B3639\ FD040E24AB5CCBC422E072C2E9892382:\ 8A6BA30158DF0B51 B958D0F35BC231303EB05954159780EC464C006684122978ED6E6129F1E22C91\ E7B23C61:\ E1CFA7A037C067CED96497D993D677E4FC5DEB8FFC307267D4470B6C4D813105\ 61D9B310:\ CE0BD9F37CBDDFAAACED8DB559D40DA79A5361E640C239F12F8A16829A65379C\ BBCB07F973FC97967E00A3A50C3A58E4:\ AD433310B6F024C9 6BF6C007F979445600FBB6FC8D83AB7AE997D491C4E08AD62C0F682C34CC513A\ E04A9EDC7C:\ 26F53672104CA5BC1357580F7DAA433787BD1186232A3041AAF105176BCA0CA2\ 443A1EA78B:\ 5B4661B65F651D92536B55C24F9EED149127429F691FB69CFD0322204CC85705\ BDAFA66FBC93ED49D0F4F22BF1789D93:\ 2459803996080DD4 76B85B9497522E19E1896532A979DF3F54E1EBBB23C72372B0558E590379AF3E\ 9C688086D491:\ 1C20111EB5B9D609CC22B5D58B6C8A7CB129D464B5896CC135B9609BBB2BDDBF\ 9B05C722D784:\ 6367E933F46B1A0C9633558C80A0CE46CB62E4E9D915267D26E0C83EF11FC5D0\ 4F8E9B95B10DEC7A0BF9282FE837E09B:\ 7B1677EBD6E0F200 4A0336EE63DDCEE33EBF257B4B0D6F0F897A088809EAF4BF6EF71C34876339D2\ 8744F1FE315BA4:\ 3867EF6DBE2714E6B92FC34C4A628F9CF069CF8B301F05C2E48698B560A82E65\ F6665962ADB689:\ 5A68F18295A6F1132D97F51C3F74167394379974B725F143E583CF41CC554CBE\ 73CA5C3EFAF1AB5E05AD724B2A67982D:\ 97C444FCC79E3734 8AF292869468D24D2AEFC76EEED436DA13E134FCA8BC02560720485F756DD0CE\ 8369F365A67FA0CA:\ 33C50E860C301EE73E5B92DCAD1F0AC7B2884D4B8470B9B436EFC85D84AFE447\ 885772FA87105B0A:\ 9EA75A5CF2A1E94DA68B5551873D3CB24B7708339E33D9487324A6A17CB4DB2C\ B5D3ADF181614749420DEC2047E69D37:\ 52564631370A6DA1 C72EFF80BB0F2DEAA0FB855DDA8DF7D38F7B00EC1A7F6119FFBE8B2BAD113E6E\ 70875ED1E294A05B09:\ F6C2C21ED43C03365259572B2B4775025DCBDF0240C8B5BA21D44B4C1DAEACEE\ 2D59F2FD82334FB2A3:\ D2500D053E6F039C33D5849CD266970050445CF82D394AB5849AE9BE83F2FE3D\ CBB1DD5050D41680AE98C103E758DCDF:\ B345479C897450FB 7BF9F9A04A2445E66BBF2B6C79E988EEC58D5E6F556904147D0C8C09F9A1B8C3\ 349269C30FC4713942D6:\ E5D1982759140D0D8C4CF4D52C18D17FEAB91B15B454FF60DD5145C09BB92041\ F570A33BDEF53C45A239:\ 765720903C07FDCC34AF41D64D729F2CDC8B8FE4AFE83D5133E4D0A380769FF6\ FBB49CBACA8438AB9A34B856D83F1474:\ BB0AD4434EEB88CA EBFB3E083BD1B0B0620579C6349AAEF641C0231B28AFA0CBE8E759F32486A113\ EAB2EC27E749D46677889C:\ 0A5E9ABEEB628B6C0FA4F61AB3EC581C1DDD7F3BCB8B0F40D42D2EF42E86E341\ 327BBA97010A2DD2B4BA4C:\ DCAFCD9744FBF18B1351F1021612240B1B4333BFE0C8A638210A730FEFFAF0A5\ B2C9769322ED84CC084D1B11142F8167:\ 68A426CAE0CFF7D8 3814FE7BB60CAE10DE6B3DE6E5F6EC269B9FE5B61F775FF89350D13B8764F0F4\ 119C423FEBC3ED3A9A0A3044:\ FB620A3222605A767FE6C7A9505FCFB6FFDD7FDEE7C4C1784EFA1B38D27FBFB2\ 2FC16F8F75FC6BC666A7AEB9:\ B1926DFE6503F66BE119D426827FF29B734211C4B86C28614E567BAABE7F4CB5\ 4D3378C9DAF57422FC76CFD1125D0217:\ F2BD1D54869CBFC9 9B4337D32C2F17BC68D2FCF4021F841FABDC758EE66372C3AEDF000305DE591F\ 8590B0F4D07FE007E1C30D31F3:\ B4B0F4DF9160AC2A51E72FADDF9740099D0F81DA1B123B0877329877FD74C6B6\ 362DCD4152CA28496BCF5D5D1E:\ 7128048D53AB24CAFBF106CA749DC404D72765C14DEFF45B184E23A8908E9B66\ B44EE78A8870E6080CE9D199372E1BAF:\ 5394BD5C1B6259EA C41D6960D546C18B44078A295A6743132814ED943949F3CE620B17DC536EA7E7\ 7AD5818E38C5C8462313A1564DBA:\ A9AA8A908C8EAD3EF3A3A088A214C321F27F99E54604F5806E43506B0D0A2760\ 471A41EAB66A2B536DA999B3F19E:\ E4D43CFBCEF4A861633ADF96835953E3B504B01C5C7BC9810C0A26DD55863F62\ 110DD3A53F5824B16027D5C77CE062BD:\ C74532FB9F255125 BC5DD6D4AE7FEF35BB0686CC95AF9CAA46E6F2121D9BDF5415C9FF1E4CAF05CE\ 18D108914D7247C82E15C2BA3C9998:\ 9DD61DCD613FEE8DE8841E94A2C8A0412AD2B36B408F73BDFC12717A68C7671C\ F50F40BAA6E74F9BCD8AEC4C62206E:\ AC54274FE612D4D4A05673847593EB07CBFAFD2735B30AF6155A72075C195E3B\ A975808E61EE1EB16757D2D5076FB923:\ 61F8987DDC762217 CE18C25075B4C1558F0A40A572A98BF90F99C7A943F205AAE5A3C2CAAAAB8264\ 6F0BD2F24EDB944F44F6DB2B987BB50C:\ DA9212F2A27188A29AC9E696BAF55464399CB5FBDD0DE2343B9BC1CFAFFE0AEB\ 69B36B16A3FE9E145616B5FCE2CECCDE:\ 2E76801DDCB5C54A596F0FED1B2949AF267F57DE2208CFB819AF58D8A39DC63F\ 4D24D3796D3B6F6CCE1C429ACE1450BE:\ ED3BE87AA83663F3 9F0C08508318031CBC205F7CBB7C5B71F653A6A5ED414269B63AB51274899A36\ CD9347175A41D1E48067C6825EB2C08E05:\ EC310F36CF71EEBA986B38FD54A3C8DB8541D955DF150B36AA71BD2C318E23D7\ 7E9407C7C299509F08E96DD974DF0EBBB1:\ DDC4555F64F09723D423F89DF90FBFE51B1B7E25DDC4D33B8E91416F772621FE\ 2103B45C9F01BA7ED79B987E080DEF37:\ 6B597FC12C2E50E7 7124FAD711B1C3E3E5087E49BF9A1CA98673C7C5592AD8E9314AE71666AB653F\ 4816C97EAA9E50FB230EE984E41124F27028:\ 50524698ADA62763B48BAEB8C1B416CE7A904386A65BC6B58A5076E23C9C3246\ 481799F279F1A121E0876709DD8CC86D2556:\ B0F597ECE1F8F996C4F6FD3E9FA95C866E95C31083C11D80084B99FC74576825\ 51F52A011FC3B9AB96F43E64EFDBFC58:\ F64A6E9F42E164DB FE763D8179B6777D0ADA001F584956CD0ADAACFC6E07666218A5EDA14E41E3A5\ 44354C78498CB9D2729E559524D704205ACACC:\ BAAEECF33E93BC5123099C33D5AB194A944782E2C3CEE9BACC97DAA54632CC0D\ 6D2DE89F924FA4216D8DA11CF0D4F3B993E7F5:\ CE9BC717716E45E1B2EB93A5AD9EE1249909CE903BE15AC4A398B95F434DC495\ 4BAC7592877888D739E464492AC02E02:\ E0A6F81C00EA6A69 8087C8ED9118E03A20747317DD147488DB5C2E2D43543FCF49E0A26FF4789BF7\ C76334F6615A0670D0600F295876027A7C2693E9:\ C0615E9A540CB52C92C397B986454B688D85FF9EE193329426CCE3B0CD817263\ C038002B33D32BCED3B88C04972EE938B130E787:\ 7F47ADE7334964A04008B731061B452C77FF8E170FFA41BB54F51801BA1B933E\ 38788F8251F9B3A2BED52A204C312DA3:\ BA9CF264B4EB2A47 20EA772DC8F686BFC66E82A02B1CC505CDADA444D3D9B9F63E1AEB6E752765DD\ 394EC68264152B50B4356C1DD41C4B56966BB3C66A:\ 051929AC82505C3594A3A13E3D6CEEA2AFDF31A4FD0C2627C69321ABAC37784B\ 297AD55134B5D379021AAFCAB9BEA0E08C508CE324:\ 7BF4EB01A8ED3EF99E58173B61EDBE5247ADB52CC1CA2375E239747CA4E56675\ D5EE7910EEF6A283C576DF9A67DFE3A5:\ B12704B4C7A8E537 B305C979FFE7BFA16A18CD2050547B39EAC2446D9013AF6649A04296FE3F2660\ B4C973FC5D7F152CEB519F2B85E46409132DC51FBCA4:\ 438F74156B7FCF48132B50FC8217CEB943937727DF55C1178D447BB47DE2807B\ 4161B3C35B0E4E22ABFDC7C0E6C6AE3AD3979921DF8A:\ 604F13BDCA8FDFF10CF0D55EC09DD03C8E935595B47D30174F87B53D1E7B7ECF\ 1048BEF3D4CDC435C7AED84D8B1AFDC6:\ D31DF8D646F20BD6 4C8266370CA735C9E60C92B34A5CF59E1914AD741AF71A618BA24EDBF9B325AB\ E06D223B0D22B60534E69F165C0698BCE92B271340E4FC:\ 33FAB26D0F56F4E86922FFCAE59B3C5F4809BADB5422AFE2FADCA8F98E7B9DB3\ 147D2FD21C63C212F61E6DACF5EC58302F479A3832686C:\ C6C183AA28ABDAC87EBCBFA70ADDC058BF7511BFE526FA59126204300328B1D3\ 8A22B64D6F4102E6D7BE50DD955E54CE:\ 00F7AD947D2D8D23 B825E025DAC722B990F294A7C2346D407A1D335768575A26AE8C7A0183118229\ C17F5D1DD117BCBF36CF673E7042ECE70F033EF21488AB23:\ 2949703DCAC361526436DC494B9857FCBA4BB1704A7F26C34FFD5E3E7D4C45A3\ 10C361FBD5DF17A7B3AEC752FF612C8846445163BA75992A:\ 39558A42B17B0F10E3F8B3764A9AAC435AB995866771605924F54EF00EB2B88F\ BDD9990346499DE4642150BEEA76CA43:\ 94010C456BD7FE52 608DB3842BE258F19115A98EC085FB84CAFB02B20F85750D549627C4C85C447D\ 3481AA5A64C8422E88CF41A76F6E36071141A4C9F7BF0963DB:\ 6CFE5F780EAD2ABC377D179978FDD085EE4363DD40ACC0638DEFD1994C7D430A\ C6E0008E4BBA4D1D30D9580CCD7422C02DCD93D72E95083344:\ A422F5FB8730DC6268916618FC1C1AAEA5B4FF893BACE974835671684F757484\ 7F0EAFA0AB44BDA321751980C01A6DFD:\ 962794CF1D474EA7 77ADB2F576D4A7CD951389A057FA5CA855B7F06E3940502BC278FF6BA759500E\ 1B2AD113F7B8BE187455700C2E10F55FF7E49C8A5F5E9F0F985F:\ 5705801A8A555BCF56FF4AFF1523C05810797F1F1FBB5272BF7AA3E3284321CE\ DEF96F37F1888EFC5D2629ADC0D69079B59F8D98EF2044CFC172:\ D2C95AF5FBEECED20892DB9C0C57A5283F53454CEC8E5A5D7354287F27F2AF46\ 8057353D8BA389F13BD777F98A3AC2E7:\ DB4A8E90D80EA230 96B8FA71CE93C90BC6AAA009CEF365367A5D5C52CBCCDDFE185A848BFDED03E5\ 64FBD769E56992A0D339D8EAEF2FFEE326631D74F8E6B87AE77F39:\ 81D0D4025BD9D3ACB161B938EEB37BBDD3FDC5DF2DDEF36282D94A791FA59D5A\ EA1964499987968066865D66A9BE47696BE585310D52FA32AE7452:\ B33E02A74B493C1AADF8B3E76220840347F7A6806B7BC4B3C359393C0644B6C0\ BA75DE92B562C1B743B42D0FE45F80DE:\ 854DB904B4E1DA80 05F03AD7E91D1AF05D86DF61FD4349518255390E7BCB9267F12932E05013B9AB\ D32B3E9DFDAA58E1BE470D9F3F075DC29406B6617B67B4135C50E114:\ 76EBD2C33DA09E65BD24B1EE18C421621B3162BB35D23156359B02B6924C82B8\ 66CD87A1256A1318418A993F6D61101737AB5CC8DFA7A05AE3F22C64:\ F7716AD1D000B4DD875851519F0097709C09B6200D8BA9DB6F487684B0B4FA0E\ 4D1B1D2FDD247E224CF56EEF3FE05ECE:\ E5D4038BCD2DCACB 4127143844722CE1FCBD8BF9468CBEEB347BFA24E082D131C2C2C787457F46ED\ 2FE674B2F323D6588FF9B6326108291BA2DB11EBBDE3D7FCB313BAF0B8:\ 5E784B084FCC0B7D9C8A9277472C551F4A2A50D47B832BA021305C289A719CCC\ BDA0F724D6771EB7F9B00E9E4019724408BDA28F2D34896063AB4BBAE4:\ CCEB436B623C2BF464BABF01AC88F9D9BB09AF44AED4A0D210A1B5AD3C724BBD\ 3BCC43C077FCD7255112F811A96C7553:\ EBF874E8A1D35ED3 F87DCA3EDB085856542104A39C842F2491A78965751F41257F131FF937B1E425\ CB358B6DB36C7E2AF8D44A4EFDA64DD3B627557E4F862EC2038143927C99:\ CA18DCF6397F0946A4E8A557B86FE090F032BDD69D4323851025921A1599BC50\ A12C61BD54BDAA7D4D7D16AD539FA2403D7D0F0CAE162AE0D6773EE94BD0:\ D5B36B7A57B2A817148A905A781BF015B2F12EAFBDA9575D2B0EE777792DF576\ D3C3B596659FEF5A66521C1E9165C65A:\ 289BA40CE084C8D5 A51793C51C9FAA514DB11AAF93AC334A7F810DFCBBE0728498B396BE7BCB96BE\ 15F63AB2AAC71D343B73A34129EFAA11B52EBB2C77B93FF813EB1F35486787:\ 547B0C7917CB199809BD8F8ED7E783E4550A44FE042470B2C1D729C7455E19C7\ CAD27F64F5CC59492BA72A403C57ECBB42E34C48043A24B176D358883B2DD0:\ CA46EAFB21A4F619DD77A9E1562D8ED1B88418F9514D82CD5C4EFD2183EDFD16\ 3028A31125AE86A14E702D9990E058B7:\ 8A85176A33215451 6644341E891F31A165A430025E3CC1C8890028189DEAB8662539BEF058519A4D\ 350A46E26C04D14D5BB526B9EFE0718F5E8BF28788BBB90342004DF0E15ED2E8:\ 41C9A09B2640B5938132A50C2F400EBA6680115FA76278F82D2615E3C4BD22A9\ 10F20F00B4965FEB3AED28367B888041E7EF4730E9046BA21438CFD27B5CB71F:\ 3E039B20F4178C25C9F45CF8C4C9098CC8C2B61D25F9F4492280074C4E6DF7FD\ 770D0A78175A63E4FF19B9A72278A15C:\ EC0A8C77E6E1E39B 595CF308FEC3BA026D24ADB2C3358B3A69E9DB297A55B5A5995D0096D59E2068\ 94FF10CCB74B2C0DFC6936CBB515FD2B2B3A3BD0826CC002ED25E862E52FDC9F\ 2A:\ 9AE1B1A56C2E6ECED863F6AB6966A4048F54AD79FF9A8E4377F6B2E1D2EEF799\ 9C7F41076FA7DABECB6DCC4355534E5A42529F2E9008EEA7FD69D3EB2F6666D5\ C4:\ 25D2754D0E2F106DB93EC27F47168972C8DD54FB97E12312909AE6C236A104D0\ A339FB793B1CC9C8227EBF2BBA8C154A:\ 6D0F264395890B48 15335851AC3B41ECBB11C1853F1262F4D146F09BA95EE5E61BFBDA5912D6D76C\ 8B53246A8AD03A6BBC2EE3523170C2E13E9A6D7622F1AFCB1512F06DF78D65C4\ 0421:\ DC6F0BB8758D6422494D5A0BD8A7B97BD791CEE221288936DEDB596F537C3FF7\ BCE04985EDE96AF69546A969FFCD380484A2AF168A96A55CF3D466E001A7B9E6\ DC86:\ BD69A39DE39D63357BC0C5664173E37BE71D8EADD0B8881DE396B8A616ADEBBF\ D0B26EE6CA7A94F64B230A1AD2048698:\ 77CAFC7CE1C7AB65 DE55CDA2C48D19CD1634122BC99BE3F6FA9B4030C4A95233260098CD1365580F\ D23EEA222C694F99D4F28C7FB73184F6D90BF83C966EC73178DCC301A594C395\ CA18A9:\ 8E226F8DA16C0D37724A6AE6BA35F8310200C7A636569432ABF97B413F42D236\ 8B49AF96E44FA953A868D5840458FB578F4FFB888342DC51068136AFA321C2C9\ C8D673:\ BE5E0BB2CC8EDE601A0F1F39AF998005D3C930FDFBF072B3C857164F48006AC8\ F40AFB45CCAD8EA47AE439A44D2F6242:\ 571BA076E2AEE410 DFB35E713B97B554E8C2CB6E67D19D33F2E2180C00F1BB131DB9D5C525DD35B8\ C9E640E5B9650A0DFCE53254581B87B4AB8E8793B40DB50874D4EBD8319F5AB2\ 3518870D:\ BA1BC58692C5D2900743B7F398C283F6DF199E65E760404B16B4B8997011DA50\ 2CD119C97F1F8192D3A95259763B6685F52BFE80C69747E555650C62E501F40D\ 0A4DAA43:\ F78E4DBF4666041C85A4D1BD8E41E9B6C6A812E23D996155B924B221FB32A59A\ 6E4038A1200847A33006E7B6D6276786:\ 701C94F617ED4183 5F4CDA0DBB40C9E8272CD0480521726E8AF0814FED9535B03D980C389B4ACC86\ B15354FB0EE1E90C5BE845832E659B6707CAE99D4B0254F6C1EC1C1033F68A1B\ A51937A6E4:\ 17D4368D7EB5405E1200A80E45819DD43A0A450D257D5F37D585D8DC975AAFD5\ A8C3519AB17D30F3953A6D970BB13FBFC5055E6783BE529B0304E31C0293E331\ FF37A085BB:\ 9516FF82D3A3B84A087E99D15CB10EE198B89322DA03F42B22C8BE90D4CB652A\ 95333F4F6D3532F27D20D3E8AB3E7694:\ A71575080D5811D0 A45A94B08ABD5129115F796A12ED6908692FDE75950ABD23D3B950C908370D6F\ 079840CED1845400B7242ED363C203338A616EF24849AC04F79D4087FC1C0AF8\ 3067C91A85F3:\ 024FC771952DB3472630D3A0E5D40493AD29B514A1DF20D204CF22CF3F364C52\ A6EA46A80ABA899783F3FFA58241A6DEF5850DB5EBEECB5883A687116A41C5A7\ 5351DB460508:\ 2096C4B064315C356A4DFD0065F3155740E33ED2DBC687D0CFDB543E4B04C7BC\ 6FCDDB2C15768C90779D72A390B7A8CA:\ 11A0382CA4944FB6 9F0CC6280A56F1AA35D292153B3CCA4B493F823E28204F648F181EB4532F53D5\ 9CC314CEDC9DEF147F2D5126AE610A5C570DB7C2D5EEF17232D69A4ADFF77D1C\ 9C8AC26CDA5510:\ 399DC10E75CBD29700CEC9DAF9B6474E3EEF71CA051ACED22C7CF96E46EF7953\ 8D3312DAC7654F5F59D64C8969ED882E10829D3E271B9567CED2246C120DE327\ DCD50D5B661F9A:\ E4345C9D06A8BEA3B0320B2BF5E3F772368FE7C291C50856D76ABACCE8031DB3\ 545F4F9E2F9FD7831342A4038C4A666A:\ 3005F1F0400B9429 65C8F136DE4A255A2F7AF15855F3F3D058542768679CD4625FB42EC9BC23E0F7\ 52BB2D8A4737B86D7B250E74D2D787DAD0A1648534AB0E0EA35A6420AAA07F38\ 0B945E0FEF6010E2:\ 57699E2B659BE5D15D94E50103D1DDA5AB3B89799CE3CD1DD48D587279FBC6C3\ B27500D115C0F18C50959EF60E811918FD667597983D6CE6F5AE92D7D35B2A54\ F1DBC9040BD84838:\ 05EF770E99C4B9FBAFFC6680723E225332691D0274B7A9D1587C5B4165F7856C\ 05330C8AD36B542F3B9061ABE2E4D8D0:\ 603D1DA619FE5A6C 0CC3DCA7C22D142FBBBDC28365B983B0B602E3661F6DDB57A13A78E25130920E\ 63897B1E5D6D0A255410CA31589B4FF012AE8EF7D206276AEA17280281C89B5E\ 90FC92CDAE3E90FA2D:\ 544C0869810FE42026FE2282BAC76632A869A5EF15EB5BAECF7118F913A09FEF\ C32EEED3F9F057522E1914843484ADD60F5A5E0C8B4936CAF22A2B56C2FD1932\ E6D2F69E67F0501457:\ 4444C76C004E32F4D86FFED0FC6E7F125FB3B97ABACB6A963B4153ED6F664656\ 6F09556B0128508A2EA704F425166BA2:\ DE890A23A97AE34B 46F56453DBC786E69C7A8B8343B44FA10BE3B62180D1055396200A4DEF7CD16B\ 3AC4A11498AE026DEC225974C074CC05C2E38A0C3D9863564D06C4C51363BE3B\ 34C6710A1C50A8DC4A49:\ C7ED5707197AAC74CA3678C435915101B7F01ACF70E6EAE4CB620627812FE22A\ E6FA729C0AD641D1DD047916AB127AC4340CE5E2950F59C13BFC58716851EF65\ 4E3CC8A00E1F7F9934E8:\ 2CC18B3F45FED30C9BB3E0C6162103D7F6383580DBA72AB3EDFB6759DBED7F2C\ F75F494A8C8C2018155F523277CB1E33:\ 59B170E468FEEB18 4EC76D991B2A572B95CFBDC1B5EF14C40D623B60EB5B08F49387861F13A0C242\ A017D608210260FF457701A732D1FF43E890EAB0AA8D88FA414E3E313D166B02\ 4F8138732A9A69342A082C:\ 75ED6A26E516620792BE14D58C314AA9668F26900026CC814D9F33262896F8D6\ 13893C5A1249AFE93B978487D44CD09FECCC5AF14C7B1D228B4D4255A3BE2D11\ 4C2CE7CD2F19D6D925FC5F:\ C635A07B528B15D341FB3938FB1867A86637E41F7021AB0B2241A202220E83FD\ D05C24A1652F2624F9FB43ADC75D1DE7:\ 25622E1F1E088394 EBE4A217240463C52F3E367637E35EB9914D1DA02A8E6BD1928CD70855884D2B\ 5B1B20E1B32A22DA27269FA5FC42EE67D268D97D460BC5EF93015859CB4CD34B\ 7306916EDA42DBFA52D62EE3:\ AFD1396657E63F6B15C8E5172A5C98270E39BFAD0527A14CEB81DAC79894367A\ 45CEFB48033B39562DC1B23D7507E47DFBABE91656CD11A26B6D20EAC5C804AD\ E02BF11A7C93D9CFA82EAAD5:\ A789FAEBADF784EBC09697E4C7B7DA52F3EBFB682FEFBE6D6871BD1EA9E2072B\ A5161F8BE55D201771CAE3D55847167D:\ 48218CCAEF67EDE2 0C49C0FEDC9D77D74EF36E5721F8899153C48EAB527AB6F30C688F7868F79CEC\ CB80C03646D065724A7F5A94493B679F69B4C9B7631F5D6E51B38277D101BFD2\ DACF5AB254A35666FD88CE199E:\ C37215DEE1FE39F6AB4C33440324F9C19C8DA2161373D2881859E948AC2FEA19\ 1E0B219558C71358604CEA53B2A65D6E1AFFE203A737D50FD1D358495957B2C0\ F33C33BCFE7D342231580532AE:\ 2A70AFD8A26A592A112B1CC8A4DE1C03DA4A2E71C7375B256842327624F7D455\ B05135533C526D3B266B80402E97ACAF:\ 6C6BED5ED438A4A7 BD7CD146D054BACCE8B0EB21A59ABC1FD212BCC4794C0B6D600D153CE5AF65D9\ F9BAB5C2B5D0A5E25C1039366137A93ED2332067E89FCFD6C5F6B5565C419C6A\ 3938F2473B08260335AEEB6C08DC:\ F3702FE8AF684F0FDF7E85AD786F5ABBB5DA3F14E7F0F89023BE4E0B7409CDE1\ BBD151BB3F9DB1B64F731ED2092D48E534B451C562864DB827EFF56B5CCD3F6B\ 14DBC0477EA245618C1B2F5440C6:\ 297085093FDAF2A1DC4586E5E2001D0BE9C03C667350BDF1D08C95B8BAD0E4E9\ 1EEB9CC01612BDCC142C0C78001B69DB:\ 1DFD551688FD9A60 D457E7E7AD66A8D7CB07C9C1E454CF8DE6E9D97948145731A8585078A524182C\ 25D9D782837F09A52196AB5BF4BE30108E2AA7984636BE4EF79966D72C7D6C19\ D79B7A50A4C7D5F01EF9124A6660B8:\ 379FF84CC48112FAB0633FF279636366F0E9CFADB453AC48A74A9A26DD7DAB30\ 4DD6378AAD4AC5EF28AD0F4CFE809F02D2EDD3FEA11B13CB7480DD91A3F6001F\ C3EBA4C80C31F5A562CDAC532DD8FD:\ 5720AA8DDF38F0215B1BCE8F7B5CFCCBD4A7C8043CBC3AB370FA7CBA0474FC6D\ 25D5B2EC2D5A0C748F63800F530DCA9D:\ 2E76E771E3FB53AD 00C62822BFAEE16C7ACA5C16AC2F55AB52085716E89EBA9629394A44E86C2F85\ 8358ABB2421F07BB3F4FEE3D1294DB62B6FE9CACD797FACC8359679BA7F17B9E\ A7E10212C74180017C8D2FA5F6498B1C:\ 6ECCA8B79406B8229FE44845621200AC352DBF6C1ED5937C47AAED3ABF8B0390\ 4D7E701752FED27D91A5151CC00885AE4D8A7A58CB1F6D31B9F21F699B03E243\ FE1BE597B2114EC61BDE14A4796E4417:\ BA80F73C66DD7CA229B6A845EF43DFF5524DA5A193A6BB21FC3CC790E1F0ACA4\ B00606E4B39DB146F075ACFF7BE4E241:\ B960B5837B4034B2 FDE0BA5524C3FC2C69D0070E77DB96B4AC9A8BB2EBBF3DCAA2E1E577F562A794\ BE43FFD498DC0A03D79176C887363D746DE3EC65E279145EA4F0611677BBBBB4\ B3F203146123B2F7968133A888446E51F6:\ 53B34B147D2E0926AEC3F418D8AC5ACEAFE3BEC4B7EE675ED84EF2AA5B439E6F\ F66FD6948C376BAA071E2DF6E0AFE7C1F0843C1E20251295CA83BB30735909EC\ 0C899A12904DD060ABC3E100C87A3D72E5:\ 058768329BBF2E5DB735023DA3FF3D8EF1D0471C299DBAAA95AF4C1016572011\ 5245586CD5D0ABDCCFA3B52F83E36A21:\ A1235BD14E93BAC1 AAF3EA1783A29E2273361063A0D41610FDAACAD6E8946E86C8874508BAAB02BD\ 2D8EDBFAD03F3D381E523EC5D6ED7AFB58EC9B8609C6735157AA7DC4F3F1052B\ EABAC974E89ABB18BB260953D591F2F3D1ED:\ 2E6FE67EB83E2F436F8C0FB83DBE0F7536166757E7099D1E1EA6946AABECB6E0\ 2488DE9F08EDD53527A2D00C14A5EBB5FD72AC5577A30B0F95F7B2CFD86A163B\ 80069A1F1C9D532C715750D68857404EC03D:\ AE1C6312C48CD1629A606389D1877E3C521B5101FD4CB760A87E2D1C1ED1D996\ A1360C241FE36E2110D9556666C787A8:\ 7DFB18B303AC12FF 3FD52D0E0CC3BBDE18B17632E662F0EE11EA8E1C7B148B630DDD1A6F01025E3D\ BEE10DF37A9196ED4060A8B34FED461C81E70FEDBC521A83A4C2D47C710E4D20\ 77A1273FD43242D6BF235E748942C640B64F9D:\ 4B10774B3665EA10C53DDCFC1C9A2B96B233093901EB037AAFE9450EBEBBEBB5\ 6CFFA65D2B6E44337616648BC8E2341EA3ED0F5811402DF0C6142AEBF0C5A30B\ 2A05D85A6F94A39B6E284DD8666325D0B7D8A5:\ 7320E6495AFCAE1BDC67C72913254DB148B0A5C85DF023B308D3C411EC37031E\ EAE5CB51DB63FB19C67151FED9CC46E8:\ 9E7A68212564E863 2CB8E796E207320493DB417D356B44C1F6FBC0E68F23B9371AC75D40F37089C9\ C3FC9E0A4A33705E27E41152AAE27431FEA85BAE1607F111218961A18C3234DB\ C0D41D172D14EEA038DDD971A6E6AD9511E82650:\ 87679F1AC604328B6C9B55C56C16505969FF9D40D1C8EE0EF9C9A9D5AB0A9510\ CEEE677B752725B1D00916E26E293FEEED9F18F17F8BA9B77DA3BCBF591D0D67\ DBE57AAE4AF7843DD176471528094A3A3FF2AEAA:\ 258CD6F5D26611A0D8035DCD1C0F26E0BD86B40670772BA7C9DC4DB18AD38F95\ 73D8C54A3CFC30862106E2BCE6C7A5C6:\ ED8D0BA4895F10BE 3CB66CE7DF4672FDD6F8BBE90754BD5BE92766C2EDAE10752EAA0136E81EC858\ EDB967F7C071CD4156C4CE54B14C359B7B48F88F873B464994F12129EEAC74CB\ 02FCBB06F1A45A1EB75E265975521B2316E6DEE4DE:\ 2CC2ACC835F3E84FC6AFF725C290DAE36E67D7CB87162E52FCA1926EDA3C9ABE\ A5A5AE623B25CCB1C0F702E55B5430D30915851D4E331F5EC8A0C448E8529E25\ C3718201A536E6DFF6EF5C67038F8223EEDEC77C84:\ 641CB0E9630827685C75E93BF0324543337E877F65F82A86FA352C00476467BC\ 3B4D14997CBD00BCA9E37B24A6F8F1BA:\ 6E78260C205DDB9F 2A79B7999079CFB7F63105C7AB916B9192380148FAEEDEBE5567A791ECCABC85\ ABCA1F272D92484C6109C198E9BD4EBDC7F3505E93C3BA0F9E59E92DBB9A69CC\ B65C22BFDD9D2BC1F329BD80F3D327574EC86904B0B5:\ 0FBFE0AA25EADC66EED7FE1E8F3F982CEB9911B8A97BE1B82879C6721485EAA6\ F4B380D02A056C9E85F0417F39D31E42DF5E9BA117DF036F11082796706A3CD7\ F23FAA5BBFA59231168F37698C962FDCCFD9E968613C:\ 7AEA1836CFF6AE59E983007C0241A61D732A2E53333BCB7810217D06AFFD79C1\ A6E8FE9079F44FA35E88E00116A5FB3B:\ 805910FB562E63D5 792990AF12979761E29B4AB2B2ED3A895122F062F6CA099D73492175FFAEA0AF\ 87003C433FFC8AA353A24811C863D80E6212BBACCCDCB9FC0281EA334A186C92\ 9C73881136D01288E44D98B79503EDB12B9C10275ADC69:\ EBC43CD03940FDD38213DF9FCC3D75D112FE8A9B1F5FD4A06947A79BC65C6527\ DD1CCDC49D67432454351A7A289B2AD940DCE432B23AE99A4897C3C7A138470D\ 92FF497D5E88F631B93A9935C85F8B5FD404EBD41F2324:\ 8CCDE984AB70A7ACD1DAE69F5109576F8C808D0B16339B6B0A65B2E4712E6EDD\ 62159F1FB65FC9C0BE28433DB982DB3D:\ 1EBBB405BC55AD17 7BDCCD1ED5C7C58AA8C26EBC10FA60BBE484F26A9ACE21FAF753C95B013B6812\ 283AE19C54EF8BDA7308C9E52A4A0E19B5F774FCCB1803585ABEA0931852EF74\ ECD087AD748E1509F1A22E1278874DA8178FE725D941D417:\ C3F08696882A472D3759A605B577E4AEB9B1919416C194C550DE94FEA6B30546\ 0D6DF31B0907B5849C1ABEA0CF500D606E00BA4374ED606067C7A62816AF0943\ 2BE5EA6B7FDFFFF14C1E8A633A42E56EDE07D114582C40FD:\ 759B59DA28602EE92F28B80C104A6D243B33303FA93D82665B395BFA2225F121\ 3357D1373C8BDEF253C609F89D55DB0B:\ 3D7C31C77EC2433C 32B78D9F5953B9CC21DB7102544F810B68B469E02A9FA6AC0AB4F03B732737D0\ EDFD7836B0579E4D3A575E7137C67719A57BB5A157B9EBC8C783426B35AA338E\ DEBE5ACF9FF475D22988277D74856588D86D04FE11F18E73D4:\ 4A9A71FF4A63F8DDFE8FE65DC8710F75AE6D39C9BE50DF5E4D12B043670DDD29\ FC69A70F52ADFEBF75B5C56BFF9AED26B679F5D7A368CF8E210D4D7366CB1C43\ 6B1CE153B957616A321510F12D5DFC4FDBBC064C4558389478:\ 5777CBC6401567254EE47DA378097CEBE744AD04C03EAEBAF38C097A0E53B255\ 56CB1C2F9D184BA920B40A0595DAEEA4:\ B6286B46D5FB2626 10E4881483058ED082484505A21A951BC3C3BC0F6582474EAECD4FE427C266CC\ A872793E09B195C1BD03D821AD71442905621E5EA86C69466CE88AB676F804CD\ 6A7AC8AC633CDD1DEBD3E972D787FBD7AC100FF39CF6F0FC0CED:\ F8AA3DC6043D41A2D77A1600955881223F08AFDC3F2EDDA6C0DAAEA450A26DD4\ CDBBA6C8E6384F67F6B560CADE852525C903AAADBAC0DEFEDD3C2083B1EED434\ 01690236BE280BC6BC1BB736842CCEF568C1496358CAC7E613CF:\ DD87FC5995355B2DBE4536F2E71F5236D4B449C4DB2B5537C8B5F190DCE575B5\ ECF8E9F04999BC4488F639B9229B5046:\ BB0F33B6CDC80B04 A46C63CF901DB73CBFA0BA50B2EF6BDE63136C43DBECAD130DED170D5984CD39\ DED0B3224D31D051427239CA6A1C7AD610D40CCFA88C7266A60A391FE2C7AA9C\ 6654F6A8C5F40233422DE4273644194B7E61B65F36404820A92222:\ B9F8099AE4DF4C95954749952E5FD52E55DB935C7BBE105C58F7503F077EBA80\ 57A80DD55991FE2E7B92DDF3F39CEF6710956F86647887A7A0F114647515A440\ BD811F9EC635A39A0C0859EF8A6DC0F37D308E72834B98D61D6BE3:\ 9B02C6E552A553CB3D5D8368D69292278557D5C917B4F2219C91DBCE20B54087\ 233E0A09B88982841DC59C97CE270309:\ 528D9204AE720AAE D3CCFDC40C2986C6DEE37EA1B1C6D33D460AD4A26A75C5289779223C3E1474D0\ 5C27B8EE8521FCFEE5385BADB2ADE1CA31D18995BA5E12EFB0D7B3396E39A6C2\ 39C242AECD14DB7B786740317E96BBF8EDB8CDE1458FFB347885D565:\ A4788B32E8975B9AC394C7D83DA712572DD81ED009CE4460FB11CEB9075CE625\ E2639EC5AE48A1FC7E632B02C8C6CA63BE09D48B186BC65566EB370D3CE24F82\ 5553CE553C16F2FF5108330673E10F14E76B261CA5CD5F87E418693D:\ D2C6F8A0F321983779559B315F69DF5802B121C97DFAD4A4612B510D9AFA4F6D\ EB09E695EE72FEB2270F2CF8CE10924C:\ 88F6FDCB170B5823 1E14C76EFD5791F000A103BA786A43877283684B0485582BB5A4F96213D632B5\ 83116C1534A7D0E9025CBE76C557AEC9DA04235AB26BB96FC2D3115FDA6710B8\ 55E3C382458EC465F13182DF126BEBDCB94014D753A4B0A13991B1FD1D:\ B59A09B54A9B5A98616EECBF20597D39675EE522A9CF7AC2540B50CF5C2AAA61\ 9A96F05CC8D5C39161C1D5F6286C108B24196E9D82E501A9E89062B296808D36\ 7D8D8C1F79A07DD26F3E7E5B0906DB452D7DD987DAA0A0E360CC5EBC86:\ 83CA3EF06A15B4F8B527B67A652F1EB2CE068411E0F2EAED14AE693880D66C2E\ 21911535824B9DCF584DADEB97630ACB:\ 15119A3F0E54DA4F 89939F837D7EF2FA6055C4F3D2076C70CD392D40ADFF63D2A8B4BCC6FDBCF146\ 6F34F1E6892ADBF80AC6D9A2542CAD67918F0CEE22CC06667DA1FD603607B90B\ E9B4E5FF98201F339E40086726FBCD7EA2675F5DF23AE70D5269DD8A1E3B:\ 602A85E8F4AE898E1AFBCD53098C9C9DDFED6A3DD5F953ED9019B2B45A5CE539\ FC86E484C0BB062ECBC483067637F83983FAEFD00F5EB08A7F28B45361C05E17\ DEBB56D4AE72AAFD8769C3E18BF0170B00C3ACF115E5B03A3FDE9D9D9A38:\ 9DC683A403924735B95D4C747011C7019926AEAF260C1488064AF8F258CA290B\ C8FDB9A777B3CC1BE0785C54E4F0A0C2:\ 456851BE6B78CD1C 363572DF82F8FF530ABB987648DA64208635B3522CA9FDFDEF14CDCBA67D314F\ 65963393BF9A75FA802C2FCFEFB7B1ADBE46A29904E5E886D665353DD15DA1E9\ 1D23DF6E3B573F4A5B0EB33B20EA96A1019F26336C2570B2CABE74EF09A2A9:\ A7FE4D502D1317D9140ECDEDEE7B328EAA63CB81E4F04B98D26322583FC7C0AA\ 3EEF85E7E545A988DBAE860D91E6C9E8B5C1F1672629808C14189A46D81F543C\ 2A4B3B58D8245781444D5F8D13030B8B3BDA7198B0B80E357A32DE4B2663C8:\ FD3049AA473E1A4B4B71ECAEFF6354CE4E7B2DCB212EFE01A171AED3D4A3D85C\ 73EDE789907FF5759C7346B5BBEB2D87:\ 47C9EFCFA01BDABE 1E54C9A5C6B8491B04755DC3E271AA40B84DE522EA8AC0BB505A3863D6BB70C8\ 4DEAC0D3AE4B383E8D7470C73BB562B13F7D98A5ABD127CABA17E96E87A4FEF5\ 486EFB3FCE84E16B16F078C37AE75D51FB92D4DA02814839A6502485ABA10FD8:\ DAEF43A3B5F158A0216DB87FC8AFD512F8C5B0E0A02FEF93061EE26C084A7FB0\ 445B3FBEF5D0C4EF5FC9E9AEA1927AFC925E001F031D90543C3B8456DCDD4247\ 70BA3B5A5626E0BC37372CE40F0421C72485B7F3070511C88971A3D0353BEF0C:\ F8637008154408B2D169A29ABF0562F5E3F9138056642B36F6BC96ADC6D11B01\ 77781C5D5751A672F357FF2213915F73:\ 57EC7A53D72A6050 BE505B1B8D8574DAE9731479E64446C66205FE6732155E46B93497735DD005F4\ 67BA45B26F700EEE9702F14F2D66D3D7BB2C37384DF410C572024F0DA8303057\ AE78E6AADB665F4754FE8E4F9CBFA0D52D845CED97822B209D1628D7FEC440E9\ ED:\ C7718C6903386C1FE3E06352D5D028EF552AF684A67D370755AFC213F889909D\ 90627204911E832884F0995B19C9BDCCAA6CDCA34532A7C67E4A102B2D4CE15F\ 4D34C7D450696A3C4835BF7BC184E4E463BBC500E833B000C90C86690BFE4D78\ 7B:\ BB7596BF0FBEF3B5E8F445F941F7F8D81127465E0285E5778B28CFF2D7CC7DB6\ 51516DED09265039A2DC40E8FCBDDDC2:\ F0C5923ABCF86DF3 93706C09FA219B561D5E98377F36AA97E24344EAF78E6FD9DD09F164FC63FD9A\ 5803CAA71860846A295340B66D2490949E29614F7F520634C6A333B985864023\ 77732375C16AD101A77119C813F96253146C70A611248964A32320508A075B09\ 486B:\ 220662DC9C37FD9B2324F52C97F9A2B290E64EED828FC5143B354BA952A71AB0\ 690517C1EA9418402FDD1B9CDDE018630CCC9CAAF9BB15C643A24B14139B3577\ 12ECE51A85F99176E87DFB247217714CB35F94F69443143C8AC4B23556302B63\ 3940:\ 3409E8B48E54DBD570F2A08CC97231B641C01B1124EE9E1847015864557C41B7\ CAED50814BAFB12020952DE0919706ED:\ 0D87C3FD719A8A41 A07F4896900091174A2228A2C1451F2FEB7730FF252B064ACCDC5EE02E0F4195\ 0A2EA58E87BAF5FB0C3AF10D173B9109A7D35C93FEBB3A817808C35BFD735F06\ E068125502C3927BC4FF91B30C653D2CD6D1EB4FD431BD7D0344393DC25AF200\ F153BF:\ E41CDF1572B1DEA05F141B76E900CDD443C63AF3138D48A40BA86E55173B9DDD\ D58BE2DFD0283D80A19D6211FB746066AEEE687246334ED91DB94DBCFD5F3CD7\ AE7D4C726D8E52401101DBF61E5B23A20F28172E1EF06A9A74CEA6E558523DD6\ E27A24:\ AD2BEBB797ABD77F7E1F02E37089009575BEAFB02B7104CE55A17D08E2A7196C\ 75307C6F315A1CB7A03C5010A73CF976:\ D598B850E3F65256 23ED775F51A23B2DFFF0AFE780AC30DBD3F0E81F4C3815C73A8604C2E9539449\ CCC4B5DA1FEC9F3EE270A5B45CCE0AE26F1C47F0C7A492656E3E760119CE8B0B\ 5C47C042EAFB0F81E842566D7EBF410F6C05FCABF94577DF64C8A04FA3B17167\ 8F49FBD7:\ 18064691A1876101BC7E44B8586299345C30118C710B0971C455AC2C9CA03297\ FFD625E6AB591B14281616DE2F7EB60858BF204B0CE3D23ED3972AE45636CE69\ FDB916620B63075AABB692404278423D8E165908332DCD86141CEACC79C9EF3F\ 1ADE49F5:\ DBC40F78C4EC8EB9E008CEC9481E827F506157166B30960FC7D37725551E00FB\ DA94D3127E77FD80CC8293F23DA5F2EC:\ 29038162670DE41F 6DA8190E62172EBC0C4353881FC9D7CEDE4C34DEC14D771552E323B91D1641B3\ 802E02BB35DE22CF7B2FFC7A4CC0D923B745E6E1ECDD3B705C52488B82A2ADC1\ 6F8910151080CDCE760979DCD49F83CFBA7F404D6A564FBE2BE119321695FCB7\ 3A737FED53:\ AF678AF0ED467ED7252D0D886CCDDBEF707A6F1DC5D9C4C9CEC036B15CBB1847\ 505D408B09EA31D705A40AFA0B125476F30E43D4CB23C7321554F151671F3350\ 3FD9C9165BBCE2A0778AC167BB9EFA94ECEF43F69440837575B369BF4C9FB50A\ 25F74BE2E7:\ FB46F6F9BD972D0F6208EB0CB8B92FA2BC111E6045052F0AE4DCECF586FB06E6\ 970B587CDAEF0C4E821D3F667D3599B9:\ 700973A9E6C61EED 3A0D8D953D9F291420E8CD7099191830111C71BAC5294CA880785829EF9DBBF2\ 01DAD5FA124B0F31794762465AFC678C8681F1A46DDC64F4BC3D8ED47ADB35FF\ BB1120B09D6D720F74F270A516A217006649A759CA2076FFEC9990A4671B5D4E\ 251ABDC4E90A:\ 02CC827B1CA4806AA14035F587D56D4F75B22CB48F6511B8B9326B212771BE3C\ 3806C494BF6952D087A73EDD7759F6D0CEC7B2794B8ADD1D3154C43F3C2F7460\ E1EB0989FB3DE93E06A8B10E2DACDAF74B769AB4227477F0A6EA2FF579CA5E82\ 1AC3928FF9C4:\ 89502CCCAB5CF8827C0AB805D1B3A5F94BEF4969FEA7B5D0A19ED930F9A8F3AB\ 21CD7BDBE84B23DFAAC0C794A007AA4D:\ 0F684E80EA1311E0 8DEC08BC76633DA1C5422E55AD5736E57B0FC871F727BE6C9AF892D6F8DC50A1\ 7059D4BDC38EF55E8D334F54D253F9C4F3AB60852B896124A91331AA7EC88E90\ 40B84CBBC877EB9AEFD4CE21A614DEB44D5E7DBA600848F1FA202F8743B0C27C\ C816F303DFF835:\ 7392C4D3C71B92464AE1F221F49B42E01D867C03C63D97438F106583D68A9642\ B557D39EC5F69992872FC1022917AD8A930B12510C363F7BF1FDD4C30535B1C3\ 751B1C063197DA27AC88DA521E6410BCC045F6D6643067CC099AF59172F3FE66\ 8AC4BA59B3979D:\ BF89275DD43670F4746D7A6F3D9CB52887714CA795705E25EC58855A7809EF72\ A78EDC25D9B3F9929A0E69422C46012F:\ FFDCC94D1EA51492 8D043DB31E9EC2F90B1ECCF369AC28A912C01156246E4E8FB71EEC578744246F\ 0E415950D6BD1D1B87889A24F00B4657B8F2F11B6C067058817DAB2C7B2813CC\ B87DE958E4034F3209FA5A0AFD47FE8DA06CE4263BDD5B2B33CCE1825D5D403A\ F7B4BA1E0A40A662:\ FF30AC926CC80F99172E0794C460CE53CF46500EE931550497A80A56C25C0329\ 0F9DBA4B85AB6CABEC30BD91334A82F69F94A4B90AE4BE0E8506F52E9CEFD000\ D1E64642F439D6BDD39A4E7AE40CC81CEBB7DDBAA72639F1C068E6C83DAC5E6D\ 190848F1AC46AC74:\ 9D819A66A8C2943406FF51A5DCB7222904C70F138DA796B55726376E2DD9BFC1\ 7112BC6842012D352B31EAF42793DBB3:\ C82E3B74B693371D 98C51F1D9F4308741507412CF4A87E3385B108A665A1106F86FA8A17B30F192F\ 879496BAE8720E4E0AB3374E108D100F6951240B794D92294301666EBD93F13E\ 1838967DCA554CCDC355613197D2B42A42E9E30A283EFEB5D3124A3F1FC8FC72\ 649073786AC45FA99A:\ 50729CB7821BFF80A82CD63FB9E3EBD5CD930FDB3C7826CF4F257186CD5AEFB3\ BD566E35C920A99F7D1972C40A1EA3FEFB53E9AAC1CEC106211E568F066894CF\ 22636BBA5EF1256DEF951EBCFFB9A1E2C622B48BF735FA129DDE4B222AEF6333\ C263354454EBB8F294:\ 3F5711712D16295C653DD906E3D5DFDD7DA2707CE7CC3E1F0DF9BBA9F7D53E5F\ 743D79F4F54F363915DF3AD25E81EE63:\ EED0FE35B9268BD1 095225A597E7703987E5AFC522F74CA7CD10148FD1745ED1C15B79FC9AEA7A7D\ CF4A9CA18F34FB0C7C1DD562B99280BF771DD9E1A5853739AB094F75FC4DF146\ C23BFE60EE4EF71C48F31A58D8E3E5EFF006ADABCE33D936CACCF58E7CAA3A3E\ A9CDE825ACF174C483A9:\ 310FEA486B6A2B26E2058B73194CE153CE1812FC71E5E583CA1F7E4B28023669\ 8B2CC4557537975D76B87E2F224705334467BEEF35A65F6BA2D8F88E7F8CDBBD\ 06B9B23FB0E887AC97FF9A2528020B674E282CCB9C60384E1AC321F2B77503B4\ 946F0ACE9674113CFCF7:\ F39966BEC7E60CE51BD220DC5B2A2B817A73CE7767D6195B08DE70D5B7BB6BA9\ 7F8E4DE1327DC33E6E1BE15759FCD685:\ 68F49770C9E8EF60 1EA813DB9BEA1AB0692B720B9753049D8AF9F5BBC88BB969678A3D70DE64A865\ B1328AE3BB982267E87002F435DDDBC4F26698F15B997F920FEE7EB98C169A29\ 339AD006F0EC5BE1C68CC8F485CD9EE5792C3C2D200DD23026B377FBD7324314\ 53870C73C1679AFDD2C078:\ EF982CFF693B0B6F1E9BBC70BD9890D645F720DD3E5F17AA7818BC6F578B0CE4\ CF999E24EC9EC0805C147132218A168C71BCD5A4E70EDC736B7E82BD5CA5A562\ DC8A825FF494DE2371E494233757E8730A0A87EEC27D69E78CD4F95FB8BF6D20\ D76F84702A8D96E4AE5825:\ 937014D05FD4A6C7FC3DEBA0AC06B776730488157B714DDEDA80949C49941DF0\ 2A32AF225BB58F8EC633487E4E844B2E:\ A8AEE70C872BEA7D DC85F77376B9FE9FC211C531E1E09AB0BA65CE08196F2C31EDE43D7752EBF5CE\ 5F166788E2A7B3BDA50A1A1D84136CE0883BAE64303B836BFBE515A17C6A660B\ 30A32C53D8F7E275F87C78D8FF043BA735F2A58A0818D1D3B7EE4BBA7F6B6C8D\ BBA6A2B269275663785B4A68:\ 46B23BC98C9894BBE2E0727237C84C51FF5B61CA28457133173F74F9FD6C7B1B\ 6D0257DACE267AC674F8BDD132FA8B3441C216C5325535F13053453A28AD4C25\ F00E9FF5AA2CC2624DC3C96106D3E4B6AC6928BEDC29BF64517E6C15283E6ECF\ E9D5A78CFA04AAE1C6BC64D7:\ BB974000A47E092D7086699EDE730B3D47D817AB689468A35AD22BFBE1783F52\ E91C018C4FD873A3C3124F8FFCB6997B:\ F380287DB78EAB5F 5B9F4F0F7684A18101410FCCC4658C617B1BCD640D24A7136CD395006BBEADED\ 79D2ED278E69B4CE5C1E8B8A87FE32F5419CD57237892D6F0491F7C100FF4900\ 72D6D5C5BDEFA8F170789368C654AE2CECA1ACC1FD8A42BC352310937F76F421\ E73BDD2B6F94884394AAA31F66:\ 0C20E6F66CF472C633C31C153E76EF66BDD04D83BD6C4CF2204583D3DE53C66F\ 778FDE72D2A223C71AEC84918840804D7618E95B71BBDD70F2427A2CD8CCCCB7\ 129C3C51373F0BE15A17674CD9CBB0C9E2EB58227C8B83E8F2E8A120B4D7C18D\ D56F78A8164EE96E0322CE3FD2:\ A71E32626200B616B73840AAEC8F1DBB372BCBA6B499724599F0DB60B5CCBF6A\ 3BA7873A5A8FB76595870D69739540EE:\ 5219C9F682ED60B1 9F7BC0B23B6E7FD175D36574A12BB1873613774711D8A5EAF1310CAD04886DCD\ 626DA73B2A823EACB83AC68AB208D2ABE0EA1F4C7905CBEB9D02918843D446CB\ 1A141E2E0774E17FFBEB962B2E1D5C4FC97FC4B12CE1408837B643177860E3E9\ 76131393BC43EFE284D8ACF38865:\ D8DC8267F712888E0FDFADEC4D0617C7AF89CF46B4E300E18D1BEC07E1435608\ A90FF500FDD0ACD2AB036B56510BC63FF4361E1AE6FEE739E9AA338037E4A774\ CB6F6BE1803293DFA5865715CB58C3D6BD075588D0367B41343859ECA025AC54\ B4CBD4BE5BD2A79D3D669479F0C9:\ DC220CE4170F9D208B02B2913D416647F38FED24FF925AE59021AC4E3B67CC09\ 1924EEED317CEC8754F0986BA93AA26C:\ 629527F24208CE9B 86BAA5033E5EEDC0A9F153EECC7849A21BE305F673AFED4E97B16F4441C9DDA1\ 24579B3BC85320B521E685EF09A66E17A2FE37DC3BE3F8A6AB5D861B484E1465\ 8517FD2BC026832C9F6464425FAC2437B27D7CDDF069AAAA16106235C751EA24\ 43D9F9BEA74FDEF0D60735BD78C731:\ 1CBF67E89E6D13483C98BAE5A36E6EDD1AD12885DEEE765C401DEB3E7EA04980\ C499653F81D17DE8B6FD763F0D69FA2C977AC94DBF58FD17BB0ECC567F5CCF0C\ 9D85CF3FD7F7A2D3CC4B02892104A6B070FDA6510C3AA867CE1229660740850B\ 92CBBF26C4888901DDE695E09C3AC7:\ 012BFE1E9BD611171036AA701EEE7C7BBAE5943AE3515FB139A41BE23F82A212\ 1809B8042FACA96908E3D89704A7B71D:\ AD0710909DD4F20D B531FAE3152A66C391E3A63CAACC1CC495599703871E34C07E00C654B733B7FE\ 67123CC899DC5C3F13A7B85604F53ED2993F5BD9143E9B493D3E0610F4F6F919\ 3C595E7576BAE7191AD57850D7431DCBFDF6DE5DEE3F7CAEF6B99CC89E9FB6EA\ DADB41AE87408DEB85E05E8C9ABC5FC7:\ 4374EDD79E8C265C5D277941C3293075F5AE796533DE54E34C4065E167652370\ 238D673DE1FA618B80FA805A317C0B3B34D1230E8A63E8D91F701AC81E8DEE54\ E33959D80A468404CD351A6CB7B8C1CE808F7EC77F6D6F36AF54555957EB3B0F\ 429332D1DCBE98030346F1766CFF5C1F:\ 7A4382B3A9E640981582C9ECFCFC0290297CD0CD40D00B0BC2FF88EBB229F4A5\ 03A920C4562C68A64BFC29FAF0BF7F5D:\ AFC6C2F5D4C1DC54 381552281B5183553EA1605441A8811E5BCA184CF3135FAAD0B5913E632D1195\ 7D46FA45B0228B05D9C27F5782FBD48911E22EBBBF1BD923959D34D44D3BC947\ 4C1BF46A8B322A6B0177611CA9BE919356EFAD688D460D1FB3F2A1BE55B6314C\ 5E108CCAB29E71A879F3AA83A88747A757:\ 1998655B88BC035ED38A24E673AD49348E0EADB9F21420F1713BE09729FA844B\ ECB82CF1327C949F5E40D371A326BE90EC3F449842161515D1728F348575D0F9\ 63520A1444EB1C880C0B4F190463DEC21E7A6B381D033AAEEB4D538C703694AD\ 628DEC56FDF2B545560087C22E93207EAC:\ AA1F76305E46B7F90C6D80F92AE5E3921C8C693D383CB141B9A9B61529369AF1\ 5F042ABD45646E9771F2084AA0BE50F4:\ C0CD473232F5675F E3A3B1FD4B3F0F6309777C419BB9D3FE17FCC10DB62BF03FD48F8E4DE5FD8FBD\ 5D8EF4B2F8335F6D7CD1F8F4DC65B9BD43C145584C5FE5ABDEDBF946C0D6B4A1\ C7338B202437DAC59BBEF404B97E321D4A1658F358D4989412016408E1B32D25\ 4F860CE24D8475C9090647F68819AB5106F6:\ 66F4D4403CE5B68D31715468B537138EB40AE4290ADD05F4970DC0ABA75F1E03\ 52548E2597460CF93F1F952687318B28F1F35EEF6DE44BD966271A892F045F59\ 93BEEB90F3D5DFAB5EAF3FFFE2F1C396E9122555C03B40785D9BD5E48340462F\ 3D279C0C4815FA2635D9820EED98AA4E5312:\ 026BAF447B1F53B87A949C517D77874545A5534AFE810B380FF0D190424BB8A8\ 7FB570EA51739E190C69CCDE297CD610:\ 86BB1FC00DE415A1 961C1C4E0BA6355B95FF4D0682E7D3FC675BCEC97E6FE7B34715209FC366B8A5\ 51D1C2585304BF4AFCFEBC14D305C13D3851734A5FA21E037AB94E5AA0AE5DAC\ 31C595F75C8C86E3850F527D60649C8E02D896261F387253603450CFBA206BC5\ CE3C23E15853AA520C8B29D018EF1BCA7E24B3:\ DEDCB954C69B9E9E1018E356B5EBE808585CEAEA1FB3A1855FD45E27D002AFBF\ C38B2648698B5AB2B4C9A730121E0E2416A95AF1BA8FF52C18298E1EDF742424\ 1DDC6D633AE2B4453B211064289DEF7D158EA812D20E5856A8AD90C0B205BD21\ F9AFC0B3FBCC06097EF28210C8D1B813A82FFE:\ 1736488BF02FE3C6553160A5716A38880B53CB716EC071C5AA3CF1D655B769D8\ 11B0D727AB5AB2F1F055DB2A975ED089:\ A42699BF4EB58014 63028B1B17E373F50F256F9F4B028DBEE83CB070FD6D3BFD73F2E2314A5414D2\ DDBA20E499FD0F05AFC0A2414F9FBB6193F16D4F497EC48AB762092ECDC677C4\ 04959A91E167D0283719C2B42F2BE6DD09AC3D15A35227AFCBE10CBF931CC449\ 25163065BF2F2542DBE6489174153501017AADC3:\ DF7EB8853E2EE46ABBFC0258DF6314E7DD9C60210652130B922FFC15A450E818\ 8397B4884B53E1C071871580CA14C560D3BEEB24B36D35C144977B8D862BF10F\ 8128F845909BC1205989AD4471219B5612FFAE3FEEC04FA0AB002408820A00A4\ 02CEDFAF9FFC7B0CACAB3A2B067332E20740FAD2:\ AA84101A8B24FB8BFD62B6D7EC613FE221CDB265FC80E125404D6809D9A8017A\ 4F4113388D85222EC7450689627AA9B5:\ CA8403CF35C4871B 99B2AC13EAD705FC1553812E6ECC62D202F5C19A9D782B87D614412BC171EFAB\ 01E35086F3D2219FE992506768F93D80FC945E5CBFF059CE43636E09CD8099B1\ 2167B61ABCEE46CD65867FBA1DC17D0D1FCC3A0E24382E5D928E9ED2DA953929\ 4BE658E19586B8053EFBDB60D88775DC8DADB7A18E:\ 33CFE5B05C2A4006DEA05DEEE4E19D6C17A9224E85C4EA4BC9DF9384ED74DF6B\ 5FC75FD4984BD167F4F336CD112CBB8F3929322C9F69E06435FCE2345BBD0257\ F00222D312EFF4388C2AE2E300F8842E8F4D4D97F8DB45750FEA5CB8776E7A66\ DCC773EA607CF425DE41EFC1522713423BB49490E0:\ 54ACB5023D0AEDB2A7E631BE0E626392EEA5C036CB440125974EED5C1CD885AD\ 43BC0A4DBA63879E723E72F348A13ECB:\ E7C4F1643A1C83D5 90FB2D5FF21B18C4D6A35A49388CD2D61D4406604A4CD3A6A6FDDD0F694FB506\ B23F19354D36D54D13B92D391EE885925412121CA9F9437564B3419476AC46B9\ 09ED635A4907DEED2176A8FF9514A2233D80AEFD8DCDC0B397703E50997F13EB\ A8A11CAE4D156B881BB942F467277A9EE962200E16C8:\ 937410964822DB97139DB2DE356C0468EE5773EF15CF9876B90CC8974A905A7F\ 781E5C016558501B434E94E6CDCBDA16B86C0BC008BB73152EA7ED24C0BC90EC\ EAF0D81C600726D7F97199B3974FD57E8AC264FD64865217C8E93E97871646A3\ 8019F93AF873C8B02F79272E88C334132E3D86ECFB66:\ 512C09916DBDB5F8B75B8833F56845D5E155B5C4DF57F22DA737BF8530754FFD\ 68A64B1421B3420AFB5156806C4CAAB2:\ BDF4C9FAE71847C5 326630CC6BC9FFCF1CC4E275CAD90F994BF3DE828838B004813432B581B64AAD\ A2727BD63D9455B5D69973740BCF0E636B517ED556A71F13A23DF801582F71B8\ 18C243E0455C91E0E3E2857405A8760E56ADA3103E995CE05979856D23E0325A\ 060A9182052E94880FCF6786C8D89DF9B2EBE6D6D468B0:\ E33B18E484EBB8F777DB40C98BA351939E3D7517F84C88B35A231988166C6BDC\ A4DC349DACEE54EF438E4951B360C7DB39703F2E977FB9CB2D221280494DB648\ F97ABD8847A4D7E56E32EE8B5EC16739E2574A837F12D62D3D3E70B010D6A6B1\ 3D894D84AAA3CBECDE4F5A2FD407325CC7A868561B9728:\ 96EB4B44EE1A3F55DB2BEF1F2835AAF095BF74D918B28A6159F5333AF6ABCB56\ 53662DB912C6D88776DA9BCAFC421860:\ EC530DF9EF4DCEA1 7929A272F2A645A2C22F98CB3E51CA00A0027E32785600A13C537E1F1262EDFC\ 171CD2E2E5A3C2B7CF97720E9EC5E71AA7ABC2047868E1350DA36704488B4698\ BB290B1FAE13712BEE2BCAE519FD1C02E4DA80B59B148C92D9FCEF5A3867F06B\ 1DD983D740E6E0C03A52A862820C96C8472F78A490DE2ED9:\ 3DD2F3651E53DCC3737D2B50A5DA016359D376DD53469D87A2356D9CC5078973\ B6E9C9E9A263195090A35EA8D8C43C3B8716F738063E243164E8A185884BD638\ EAE39DB8D80CA45CBC5FB1BC19660085EF959A12C65D9BCE178769A31BB1F15F\ 2C336D9B45790CD62F6DDF78701BE4CCB80459B8DB0C729E:\ 7F623C50A1B327877EF08FBCB5CF8EC385B4E0E1D385DA5BF230D00DBC27C069\ 6AF2D730F79C407EEBBA37EDC3996E0E:\ 0CFC07373E27E329 A8C07161CB10C5B83F027D883277BFCC92BBA4131B3256B685FC72E773B5FE79\ 7FA612817663910C19D77C2C1E3E60E0A1B0BA69065F60B446B816EDC1E5115B\ 57790A254758A8A7F156655C70AC82F891B99414657CDC3B07E22CDAE39D4986\ 60670C652856F8CF8C3B2B3863080D28CDE50B3768B322C5CF:\ D6466C3BA9BC6F250286417929744CA7FA5A674511894C5A2B3D196A0864BA6A\ F9D4914B3B69DC12ED10D9ABE4655C9276E876B6E91A77F076019B8E3D346849\ 0590F160414B22BF2B2A9838B456460FC281C69D4BAD7D80764B69E5A7422FB9\ FC2DE6B0293152A132F795F7B67C4B1DD336675181EAE7F66A:\ 027088175B3BA6679A5A4B9F7969092F9D82341AD4CD0C26C3CCAB5EB842CA0A\ F8D722A85C04BE5AA4A633EB2004B933:\ A2FDA73196F77710 E397E0CB0CF5026433491726884F8FC9F26A240FB71AC556286FF70226C30E22\ BAEF81ACA4A5B9AE7BC76A6886AF26D68ECEB353900D9C2C6867F668C7A4F003\ 53E10BD57544A2F227B5AA8012ADFE1AD305B4758D19416BD64611C2F1198C08\ 8FB3BE0764BFC6960AB30828A16452808442CE13160E3F15507B:\ F3CB60A09256B5F00807646043E894123423D9BF394319E2881AE9DFDAB7EB0A\ B6D0089A3D9252B7DFBB85AC2EE7B36BAC6942E484B8BF8E457250E2A590865A\ F6B02E30C4F71D0A728129549DB3C2F7E2197E8472A9D2BFE61D42D125A3F8B6\ 0AE9D70C71653EF6F5E3CFAEA2AF197F84736A05D924EF6DF03E:\ 476CFBCBA17DD8C1DF71D12ACC2278FF358D44CE9C46969D78DDE006FF9C0B79\ 5AA4629E488B142A95B33B71A024B52D:\ BAD16417F152E362 30E894D45041EC1C6C143CF9C0942EDB0E39ABAFF069518E63045213A34B15B4\ 706706F3CB100A3651F965EC31F2A2D5E1CF0E130398D2BF4D5E8D60EA262963\ 90A20E20EC15C443083FE6A9143A3261747FFE06654F95DB727B9B907D0518C3\ 733E6A37F9205A7E0C4CC319A11FE519218A91506B817F2137E487:\ 27396BA018765B71CB2D8086CF551A0C0D7A9092F82CC6636095EEC9DB0E031E\ A443085825035602287D16A40CB4A30E2323F6F0A7D2284B744783015385DBEC\ E6FF11633226E8E597F3BB4DC3A1A6B782A13DC241D35C603521548EF6449651\ 283754613641B23FAC4B562D8E747EDA82BF3A024AFC6483F7E84E:\ 3228B497EB4C8E1CCAB63280BE3611FBF719C032509D764363295104B2711FDE\ F3C456C67D6D30F37DE5ADFEDC5DF7A0:\ B471C77B86C53238 1CD106901E31D8C0BFADA8CA77466A1A8D03182EB9B7FD0F25F9913CF8D80491\ 2E1665C12531C10041BCBE01727161E43DDB85D5BF57FB2DFE7D28799BF19D70\ 46DCBB0B01EC8F9D3789BDC62A301FB0672AD1FBA4B61F520E408089628E511E\ 6A9268F33D4A913C449356051B8D1127C90052FB9A533F0D1CC9EE3A:\ 510EB1ABA53228A007AABDAD204E7D845C5801D192899DDB2A0AF3AED0F40813\ AE28C62884027690A8A9934E07EF075CAFB161D3FF3D3ECB78DE8A4BB8FDE5EA\ 86A203594F314416E9CB6EBE714E9C16BD6971227014ECF7F4A0F5E926042CB6\ 430CBED27419D69CB1B25DDB4B3A5E5FDE85FD092A6BF8043ECF4F16:\ 2E2696E9A23F49DF3E75BE263A5B2AC3D359B2E66693768AEA3DBB84A8FCA201\ 9754B57ED1A4B5E88C8056963DE33AD9:\ 2E2C2A2708051A03 83828EFF523E59AE2910B8DD6FD1602F3653CF9F557555E1B129FF1C30B735D0\ 22A3A505E6E5E091F786ED1946F5751E9C1D6584893D5D6448E52839AB1AA9BF\ BE40E15A8E6055BD2CA529AEAB21B3636FE4DC1708821412FFE29963CB529B2E\ B39619C421E3D751BD6653B0259278D064B51C2247B284F5E90641BAF3:\ 424881C0608E74FA85D31F88693796005CEFD59EF52C393D02E30DB30E56A473\ B5911E9FDE98D8D9F4D70A35131CE58ED4F02C2E07667E8B2ECE5C1F8C10A0E7\ 30EFEE9C6BEEEC016280F642A6284D70B7280710528B0A1855FE40C5FDBCBEE0\ 4DE73B15890C1FBFD5C1D449F94CA6E681C689C45D34D450E7324F8203:\ 05FDEB4B2A121EA8814A9349EC0C957BE90F78B1873D2B12F1C7381027C23DAB\ D5AD13AB003E7308DA8673BC9C0DB19D:\ 1D9DAD8CEF8D5C8C 84618CB880FF09C23976808DF38DC7ED98FEAEC593470448B090F984BFA5AA21\ 59C6199BCC19153B6432086ADFF5D163AA8ED058C70F4C45194490D363936571\ DFE08E5EDF0C198E360A40BEA55331B5A1AEE82288FABB7E048C65B660F39FCD\ 9E05355E098057878C8C75CBA7B88C45B730489E6CCACC75FC943F5C2623:\ 260F58BC20B150792F35AD8987BE0392B11613F3B5CA1910351D046436FD439F\ 47007A7F1B30111C1DAFBAADC1594BA622CEC7856D968A7017F18C8EF885E36A\ F07B11572D0F23D85E4F1DE3F31705E706F8537B23743751870E2BEB56851B6B\ F86124937A1E9BB5109380E1ADB3680D78D2D915DB859EA6F3B00B3A3DD6:\ 5AA847862F9D37E61012209118228340DE7BD035951792893DB26EE6DFE11D43\ 4211CA6568E0656947A787DEF4AF63BC:\ 74F3DCEB52677BB1 241C0EDE24624310169483018309911076B72A6D79711B1CFD4F337CC4DD28A3\ 6F4DFBAEB1FA8A016D7A04973FDC30D1CB47ABE02E49D5136E1069E9269CA047\ A5C641D554CD1FC034B8E5FBAFA82F640689274CAA3C03D2A00EC128A36F2A5A\ 43EFC189ACB7671A29564E4682A0C4E84EAE11651EA62CE56BDE33AE22B6A0:\ 3F403E71D84C65972E338AB50B344A75C97673869A03107A914B496E6A663D78\ FB46417880AEA9F5C3DC1F507BEE6E43C84DB947C967DCD42031AB8B6A036ABD\ B79AE2B109BC01AB6CEBAD9475890316A718FE6FBAC08C260CDDCD1EF7A9A9B6\ E6818FAB45D66D567D6B90BA7630C5FE2B2875ECF11B540F6945F1D1ABD5DB:\ 4639E00979406AD3DF52BB846AF2CB20A90688DCC7BCDC94801F3F53FA6B30AC\ 2EF78FD4B774FBF75006F14169FF5005:\ 994E47543E886050 30B3F3EDCDD8961CF876F947DA372C6BBB4B98CE57653A7975335B0C571444C8\ F1BADA230EEB0F1942066ACE8AFDF8EDEF0C114C8884BDD0EFB40E41464823CE\ BC54DA9A59C73A4333C3A193BAF1D4BFEEA6A72FCDB5A42C034D843FFFD32F10\ 1D2BBA99FA96AA4374EA7181B4B8392557FCA8D3A0ACAE29A64EA1D67507CBC7:\ 0C523E6C12144C99B91366DB1845F20B66BBF7EEEF07D227B04DFEB0DEFE2D9F\ 2C930D7D819CEF968E89AA6812338AF942C15F6233E9AB551DC61454077F36B4\ 583035B4E383D8B3B07B8C6A43053FCF0E3315B371B55FD791DFCF3024417035\ F8E4C281428107699E8CABCFC475DDBE5124F423B5616740ACB73742E7CF2035:\ F994230CF918A2A9AE718C56190692242CE5EE9D9EC4224482F1DCB2CCD6F1DE\ 0C031E7DE9D328E22CC035073F29995F:\ 7791293C3BEAFEB5 96A550AA095EC65E187A257F9173864733C8BCCB52A252E664D00E693A02701D\ 4652295CA84F56D87D787CC5ACCC66470176AE1CEA5EF91B9ACD3C12EB011C99\ A36C8402ED288679A1BCE3C1AEFE1419640D8ACAD65DCBA884EAE38AAF21312B\ 4A15A9F203891275F7BA4739F2D77777081A8360BE8013762E10EDE24E8F72BF\ 44AC020468DE4E88A1E21DEED4B065DA8C94764913B8559251C7273FE7D31E5D\ A4AAF354FE9973D428C7419AC1979240A29835C91C1D589C385110EC5F4FBD07\ 07A63A9B4391E2598991C52D981E43872F5E53D501A868D1634C72C838B37A27\ 330839B86DDC4FDBD75F874C66AD0B7FBE399B44726DDF58C72514FED37D34AF\ CF3B60786A3B88DCF6D527BCB3C83867B8F02DDC5FE5DF00370BBD9CAA9638B5\ 2972EA756D44440A92B94AF9AE58DD0CF30A1F403B05414E0FCCDAE06E85279B\ 2D471D2B675A3AF72068A8C08B77D465A67899AEA9F1617696FF3A811ACBD7B5\ 29B86C080C121DA387091E6487733E682EF1B79358553BD912EF0C0E064BF209\ 6FC05910A051C12AFC7412390DCCBA0F443302F081884A78E7D1AC4003E3AFF1\ B878D4AE9CEC41FF28DB33C3A60DC042A0337C66421BE343B32A2D190149DA4D\ 29E8628D74585FA06D48C4660FC2433A7EB03F40B184BBD61C7CF34E7C54D7C2\ E7248170846473547255ACDCBDF0BA94CB94268DAE79F7BDFD7AA68792AF1B47:\ CABE649915F699A332C711AF76355D1D5D4D808A6BE79A1D2427CBCF78D3EA44\ C243F1E75A42E0A5F40ECC8ED98ABD1B439180BB396C9717053A7A109F5D9101\ 02832869913AB9D3E458BFEA21C9C4BE18D153C14A4292FAD129BA600BD7FEBD\ B3A1F4AB1B5A8B54E389817B700D29944BF00B6B7C8A3B43EFF7A7E9B0756CFD\ B0BBB17350BACAF2CD229D828CE7052BCF64D87E7B0E39F2506CFCF5F4269CA9\ 076702D437AE47658ADC14A3C6E2CDCE58970303CED58F48839351AB86A18F52\ 61E088899EAB82B90AE3A129817C3DD55390D1A73A54A1536ADBED0CFB550EDB\ D93E8DE77CB90F469213CC2F721B24B8368DFFEBEA7FC3CC02A892E4A2E7CEF1\ DA2172EFEABB0C3941502747029A10157B257EE9A0734EFBD125064B412BEE6D\ 0CEC4F48E5134059618A86FF58F132719DA91EE2258FE7E1DA9F3FA356643127\ 39A9843C9C056D4C3FA3064284933F0DD48B316FCE6FD09769F05FBA38FE2A03\ E658469A5045197307F60878A93F1FB725984FC737FE1049955CC0A1140230CF\ 8B4D7302A99D6F5F10B5A524B5018B93B81F2481D5B1F4139B37C246B5B5BF2E\ 3ECA966930CFD35A38B30D1BEE41965C4B5D936D98BBAE2CA49CD5359880D551\ 39E3A2A9B2AF9A3BF7292B1B370471D729B0767F1DA185DE2CC22A25C5DE3701\ CBFC6B686CA6DE58B73780AACABF90E38E6285C65470C4D64D79BAEC366A569E:\ 88A8AE1F03C7A67A5674BFA270393D06FCC69E0D902928B276F7E208AFD46A5D\ 14427955D0D296A79CC2E0B581D6C7EC:\ 421849BC8362455F 8795249E8A36B4DF61ABBE7DAE5D825E47BCF9BC3A2A20E313DA65EC2185B64D\ F50B97A56657E8FB09DF29F3C9A1F23ADE5FF6A8F046E24CC067F82D325456E9\ 65C8943FA62FD89F72E6A36C2E365F40A89545C2F58114ED59AB88715573C42D\ 1B56F997F399C037042EE34D8308FADB788522D10A07A713D96B4148AC84AA9C\ 3022826AF28F59F8AC50877AB878BC0DCC7D98EB4F9FFB053A5AD638F0CC9880\ B58DD2D3E191FE5CD57B348A35E7B77559C8B66C98DCEAD5592406DD340E5C8C\ BB75621411BF0C2AEC88B5D4D88C4E8948C73EB377E0CB7EE979D41125802129\ FC7609AF8E98181E43995CF7444CB2A6166FE755F49FC22E0F457C3DA821AAEC\ 0507EB7775A796542F79B07C5BA7B1FB70E7EFD0632A894F627BC0057CF3D46C\ 9F77A1E37CB039F8C4EE5DFE042053DAB9A240079F811CF9E56EFDCC049AFFC9\ 0EA3DDA6332F4AF24481BEBBE42677AB75A23C6BC4ED111C7E969E36E111D7B7\ 70306EC0B764F37C51E8E2FBBED2E985FB1E79A7A3EC790E32CA1BC5107FB99F\ 93FA95841819CA0DA82C0ABE4ED549ED02617369C83F3593FBE24741DE49C224\ C493FD03275BA5177A74CE0D6A1167D2EB775170761398B999BEA4FA38C490B3\ 4FAE052ED6E9784A3A5E5ADD4C78A5A00BF01B69C66E001D17CA64A812881B5A\ E53A7A02AEE073BD1606D7FE82B4A7C7EB10D8452A1B4D81E4296C1B963B5244\ 7D:\ 264FABACE6EEF1EE9FC5F20BFAE7B70E2456A720510426EA0DD93AE4B2DBD71C\ 26BA266CBD3CFF9C590B6A0DAF1F36F616F72724F15AE64CE2EEFC1C2973AE0B\ 34E3FEB268DA29D19495938FA547CCC13007D4C468CDCA2D777FBAC5A83860B3\ E339BE1131DB6190971847AAA76655DF6F97766A1E423C7FCEE681795F17D594\ 5EDDE2A964C29F992E1E3E43E8EA7D2E99E99F8120FCD05A3008C47356773088\ A71731577457D1EE2F448AC39D373C3533D124CFF7B8CA187BAA9A0EFF64E14E\ 47B8A1D0F965B5099139D466BA4C85FD298695DFEDC2736DEF2E6F96285755A1\ 2003667021F6DFB6E8F7BFE93AF0908D15B843887FFE4EB111C1ABC13949F718\ E9E042D8572E895D7893C9FFC31518DD7235B777B6C6050B4341ECC726744C92\ 5592A659FBC956339DB8483BC8A1762CF7C6E2DC00A66F18D1C8F14C2FED4B6B\ E0F19CA752F8E79F254C5F04FD0F5676BA41E6B7709948C0D3D59377F22E9ACD\ 015B920433CE5DB61F47D3600F8B3916CF7CB2192F1A62C2C7D34CCF9C85DEFC\ 1B759FD4AFB7DCD6475D2CA538AAB662F8C38907D1D6E54FC3CE7DED78DA52D2\ 4EADC22D43DD4BD65E010BB8E752C391C8AC8783CCA284496373641FB2B2ADCE\ 81DD52FC09B16F0E61174A40806B054A6C3D3F90174AA7C5CA4C6723B9C166DD\ 1B462FFE6B2D3BD71AF46F45B16528CA45624B31D46ADE4A032CF978F83D87CD\ EB:\ 1B51A2E2BDCB58D9E175E2C216542C2E7EF4E7C347662A569A005250F465CBDA\ 009F67AE8D9A3EC146D927A39B76D072:\ FA6B7AC9D1ADEA81 9F7646FEA7A03ADFFCA96D05DDB4BF00D6A928CEF34C27A064C9C31928736748\ D758B8DC9F44590070DAD463C6114F642C3BBAD73A2CE2B981B547427B23D1F6\ 7A77C54E8DAB0AE4477F5F1072028954A53E615D5CFC8F2895B3DAE543F58F69\ 2C4F68A9B949740653B084511E6595522A95573C4A5F09F85957DDBAEA67984F\ 3B029D5CBF44606ADE017E1183EF7124C301949E40B58808C4A3948327BAEA69\ E11EBF9D9E9A5F7C8D625DA97FF0763E38FDBB8A887C5F49B7B719B979C405FB\ C4EDA281986B985B135B74E309B28707013B3A245983C07F2A136D9CB72588B6\ 1BA442DE714C9C091629FFCDFAC95FEBFBE63C90E220F4B9B3D7DD0A6E625796\ 990D94007C7E7C97346C9057B205D92993CD1C1E6921F15364379B5777FEBF75\ 7FAF31663C33FC2763F205761473CF898E25699758C2CDDB30A7DD642583E4B2\ 8FCEEFF668F60724A74C3FE464B202987723C0FEDD04B11149B38DDEC9D60944\ C2E613C244AAE4DA6485BA513250EA26EE374B11F316F1900517074FE3CBB624\ 32392B21325E72F4BD7DD2336E7EABDE29E64077584505C15861F0A7FDA0DA6D\ 543AA898DC0EC81BE952990ED00E1EBED638DCFAE0EFECE83B57E284C8CB3AED\ C4AFDF8B80A37793E76A7B243B242AFA7DB00A7C1771CC5EBE0BAFE0C5ABC433\ 821DDF98FB978294CCE9C91B8F3338FEA31B99B2A2797EF2DBF300F60AC1637D\ 9D2B:\ 56CDA1D2A211F800DAAF2CC5B6E1FB645C7C259FE7B4F0EC04F7A508E3704892\ 65300FBCB39583B0FAA1CF1CB2AF6BA828AAB07AD1248D24291CF23CEB1D57F9\ 9DB1CC77284A5F8E3F71FC343D7936448FF268E11E49FD1D26745FF3CBE06613\ A0425971C067DC73FEC74BE27736014A614A169132C6CCE8DA4EF569670CF0F6\ E3768D6CA52FEC5D7A713B68C7DC3954007FBD34C896413206889FEC2471A7D1\ 357BB511D19E5DE147E97E63647EE6C4C0E7173CA13002CE3E285F2EF5255F3F\ 3882ADC59B7E9CC31504A16D94944203B303A8E2D2D091E687DB658FE7374139\ 01EC3B4E1CA25A25E75D805E4707C62307C60BA2CFB35B54C5F4288EB315B2E8\ 7B9318DB3E619942C1BDBED18940A1F4614956BE155D222680C151DA78AEEED9\ E36DC54C70971172A1EAFE5C55F2C4629F83D956FA2BE31A602FA1B064752719\ 19A87130617EA5C74D3AA436B2E1380714AEB48EBDF782D3CB884D7FECC6FF81\ 16291124B717B8137F0FFFA6351805DCAF4BA0E878B6CE7A4905690406C172C9\ 152E88D69AD2444D011CBC33E8803A0D4590EE4239330878F5C5E8A8E125E4F5\ 0B77E412DA658AE661C73326020587D9F2FB7838F51B95A482646489C67EEC26\ E1DE39F098ED50EBEDD48651525D9C451D9299B473AF1A2E7C376A35AE4CA582\ 05537C6558776ED5C76A6DE1A38A3608615C1F8D33B55232F384B617F6735A28\ 403B:\ 2C811686E0A407B1B61D587ED7C043C0006CF7A9B390C4A2757BEC3C14C25FEC\ 236B53CF37AF788C12165424187F7112:\ 7D8EE12C9E460576 729094DD633A174039270D6A85B6C10A0DD0875B89B0256D9147ECD7095DEAC1\ 16540D4F39A37CE40617E3E3ED147F78FDDC4F32DE32AE0DA4D1913C6CA13397\ 323C8854D5D863B3DFDDE349C20C32456CE648C356200FE4F4ABF2D8D8C94C47\ F95298E1C34139D85E5DD3DB56FEE7DDBBC49FAF000066AAEF0A5B8BEA6E0969\ 645A3C639F63BA673148D46B06957193BD2ADDC98164B6A702707456090297DF\ 4BA8B6573D8749A1C4D58D6CF4F1B0A001C398B2F904F369BD0BB0C52285274F\ 329F6CCC9645B48F5962EBEA6C771E1B60EBFA4DD7EF9D6AAAC9F9887484965D\ BAB8EF2114FD60EE2E7517F26296EF126D9191376DD98364B8B08657BF9EF362\ FB8F6A8E3D232880BFFC748A934C55544F1F6C117A0D5FD7307D4B6C0DD32C36\ 7AC5126EDF55BA34700452EDDCE4E71CF89D9B8ADE00D181DFDC5E427A2F029D\ A00E10C29F4ACB4B31F203A1F5CA176654542138564BFECB6139813A741A1A62\ 505C41E1FD7994A14303FD920EF4B9D141FAEA43496EA8FF338852FE0E03BD94\ A24914B910528890BEDA1C18C98839DDB20FBDD1B93E0D9D5275884D4D79E0ED\ F1C7FAF3663EEC7689FB80C42F5A44A454067913C1450A7D94AB6624AFEA64F2\ F79A541E8C436384AFC023D530F852B680642C0177054737E3992837651A321A\ B1278999DE318C411D4E39789F2C44DC5620EBDA3AA9FD94B6A7897A7012D217\ 710D72:\ 61DBB89D2482423A6A890AF65B08551BDBCF769B009DC9FB35EB43D1DBB29DF7\ 5721430F710BE84BEF1D6753B65D8F9BD2C5E73117872C1D7BEC351BA21B3CC9\ 47E4AD9696E26A1FF624895273DBAA512DFD4C1C7803A997B403F363E08AC1E9\ 1084E2F99C67A28D711017F950459BD842261356379383285AF1D441E5B75D49\ 661B8F6FEA285B4F6CC9F77A93FBF8D59AE926676EF0FE5C2CA738F3CEE0C85E\ AFB62230C60A4CDBF2EA8C3B0187C5BCDCCD5F32654B3D885E1F97650F937DFC\ C93FDE41CCF40DB82CC4525D0C74C73C84D65DA61B1F954B08D4BF5B21F5F177\ 06C646A4EDAE6987E60FD02C6DBA12E9B33B2D6C7688577F5A9E3B13031D92E2\ B2FFAA37BDA3ED771C38A6D898435D16BA27FC11B934E12D4B09B058442897A1\ E8CD27886F697DB988E30456327C214390D6FA3205FEBF6E30BB3C6742350EEC\ F0E6064A6D5180D06A2D9EFEC74967B4427AED44DA08D413DE60BA5F93DBF0AF\ 0FE3F70A744EC99F9D2481D5FA6C5EB350CEC1782B86C2B480692F83B3CFFD1F\ A7F7BD14EDEF4F868DDA8C9DB4892960044CDA1696E392AFC8C735B2833538F3\ D841E8F972A996DFEA2A1816604F1851AC88A0F4D274E4F35FB98EAE2C273499\ C3114B9ED3A52443D5980551666EF42694CA159B469F844A7446ADF36BB88CF8\ AB7EF73904C483A1BF6B9C76CB5234C42C999829D8D4238A283FE2D298FE485C\ D941F4:\ 54C907782E8DDA9845AD7E4EEDD6E1A5B0F79551BE4AC805312C9EAC76AFA19F\ 71B1173E170E0AD4DF95BD22719B075D:\ CFDA223B42DE19F0 49ED4C5CF19D7F5F499B51FC68FC483CDEB1B58B4A4FE77FA1F39AF7CB20F4B4\ 78BA982955CDCC3D614A4462E7BCE483545E0DDEEF5CE510658CE67DFEF211F7\ 33EC0636007D09645ABB7B9EE1BD7EF2300468C96F5B6FCB6E56470B40C6FA86\ F01D957869E8ABE724CE072D17315A051FFDC8C576909A1E804C378B20F3AE98\ F4F8F4C6C5FF67F96FF39E8B109A93BC4ABC11ED2B4C0B2BCCB31E38485F2595\ CFEDBA3D859F20BDAED90642468CEDA31BA982D7857DC716EA4EAF6174A2E5B1\ E0361E69CAFE9CD1A64F0E64C4B4702B9525213C21800E140CF7444580668906\ 19CEF0AC034865D00295979B7CDF63D3530BEEB544342BBB651B8EBA16B8E920\ 8926A83C1F353103A4C36A206612A5D6AACF32B867196DF586C6357429394A81\ B65CD1FD97966721792BC53E7E1880341E3CE2FEA9D48CB257200C516A0BF435\ 1C810F3DF6B888F97BA1765C765B80E94554B100890DE7E0C3D5E5738D62E70B\ C6151D541327887D7224A0B5FF20B7FEDEE54346BD3E21E5C802C3568841FA3F\ EFDF72F437B9DF143B0E6A4FA859A9ED836FC6679C786E0D8559933A941AC1C5\ EF51EE879699325A024DE0D919F88E4D9D86934B7AAE81544D165CF2779C248A\ 0B46F8D4D5A7FAB7B3C81568CDAAB73C405404129D8E56E67EC9FC291A8F17BF\ 153AF4DFA79E8FBF3786C60D58763F97799CED4E77CC6F042FCAE073F9F7BA3D\ 44BBF3BD:\ 1F9B3A83756B933D6B801D33AD8EFE9D40E2D0266B11CC363D99BC3ED52A9070\ D997F397FE9791AC38658950B9B807FE2AF59EB8D718DA067A2F7ECC37530735\ FC52897BC29F17E8DBA021137B2D9455B0A452E0194CAFFE93D67EBD6056AA47\ FE21051107C07CEDC5D4301BB5B135C7BA42E46D55F26CC74887BFA5CBC1EF43\ 77F889B14CAF0E8915D438AD4E0AEA2481CCCEE62B9D1AE9B560576266410DF7\ FAE7CE9AB0D3C3E3818C9884FFFCFEAC84588F8DCFD3253E842AD11FBE367829\ 2A15507D236D6929866544A9B6DB577280E0DA177F99432AEF2757D1E14516D8\ 4E499B041ACE58BA7F8C241F065CC59F30898561EE872D3BE93F815F1D81D85A\ 5039DD7F3A7FCA877D21E82572B792A0CE4BD61273AC9FAE0B6628D15CABC9F1\ 56505CE2E8D38A13BD11BFEF58D81508BACF2A27D9710CF58ADC67BB9ECC584A\ F6DA155ADF9752544238C85D19A1E0E21CE36F395DBAAA0057171260DA02527C\ 2F3B94C89C50A427AF9C906557EFF93081F5F03E3DB2F5D3EFD436474EAC242E\ 62F2D3440304ABD63C5EB46B88A4205C241E7999BF0AE66118A007E03924ACA4\ EE2CE4AA3C91286D30F9651803297280E89831C609AFE1A09A6D97E1C7238DF9\ 8965EC5E7E3A5A70F1DFC0BBE3ED035B07DF7288702D91DF2943EB0E844F3F43\ F201CD48EC5AA46D4890EE823C63EBF7634753EED926A8AC3AAADB861EC475AF\ 6C432C96:\ 01878648BD27829D266AF6256A445B2FB1F9D72AAEFD0E571448094F0573434D\ 01594D6CC424F62B42F4B2EC419362FA:\ 6F2DBCEADBC6B5ED F2F30FE45D60DB1E5C661FF3D53770C9EDEEE81924DE4E4C5EB3B83CF644FB87\ 2422C375768A6A0B6B6311C952C3B9D988E487EC2610C99C48FD4E4ECEA5A68A\ D09BE28CB809B286AC5021EAA5B3DBDF9B54926B901C889FE6A3388C9BD230C5\ 28C65EAF6369ECEDC3974DCA550CCF9545E44718A68DE9CB355CDA455B236537\ CB2295748386B401A4E7035F20A66344171D81338702B0A3967336AF59374FC8\ 83C3DAD1104C0B379B75B58CCD8DE6413B97488CF4FD03EEE651C89A31D95A91\ 22DE041BC238130A7522B49998A2EB1CB665E68FA8F45E339E6781D6D260EC14\ DA068D856C66E8291EF730679CAA190DE5B5FDEF70D30F21FBF590BF3F2C6087\ 2025C59EBC4B3A8657571C53FC5C121F8D590FEDF3F337298D92F75D78E8B89F\ 7B83C3438C0CADA0BAF4168DAADFB02F696628E664AC21E8FAD5550EBB711C93\ 1AAF6FD775F2BAF467161722855F98DC67FE081C9637BF9F896DA99252C8F4BA\ A80949A3236D111112F7A2D2E935F667C21282D08C93D051CDDDDBE5A537B729\ 9DDA0F0DFD7A8EA80CD88EC47C12C889F74E4B99F02C121DF18902E07FC962CB\ 9DB1F618D525C99E7832472856F9A27B6254B318AC2962CD18D838DCD8E9F75E\ DD85DFCFF1E3542BC2A6D7F721CEEFE17AD62AF2C1F3740FA974EB8C2AA65BA7\ 14BA84DD0E6F38F326D5FC9A81D8D3C4B674291861B9A49255D52A56BE8F22A7\ 97E9DD06B0:\ 36170FE27C9C3696DA79AF1108F688F6730608DC4686F464BA2ACA29EA40D6BC\ FC0822174FA4DB9EAB70C124AE93996DF8D86F15614E228060B7101C1B00A9DA\ F9ED7ED5FA45388D6EBABF17A11775426C05E3467C76D3AAAFC952269CFF5782\ CEEB614342A6E8C16571C5E22A1B4729CB996462E9CE1CF8E89EB435CCDC0211\ CDB193697447EA75CFF47BFBEEA6B292E569DD9DF5752A8ACABCEFDF44F8D08B\ 4B8AD9CE9F3A28F74AD7C7488A782755A949E299BD8F8C5913959704525332F7\ 35E0EC0ED2409D9161D49E2C72D4D932F75F34AE74858AB8AC4A2AC2AA0CB23F\ B703B36DC00B4476A7496E96A0C3CE3063706FF17F98C4CE6A0DD76506425A96\ 6E07BC87B78951FB6B90BAD68FEEB6A9412292ADED8E94104698C97F1D8F7578\ B15FB9E72F9984DE82AAB0ED4AAF3A03483BB6E94AE800E2DC426DAA926F1B6D\ BEBAED02D686654EB05E05F8269CD1E6510E91FCA31129565B91686A7B78106F\ 8FB19EC24AF3DF65EF93CCD327E1FC256C5BABB20D6DB6A4A7EA40E56BFDD658\ F0E65CE4EA852E9EF7CD26549875B12EC2AD7A4BAB4AA8703858CA1EEF8BA28C\ 3018C1FAF009D611D29D06C6D7F23EB30AFA8EA777458AF374443461D0B645F4\ 636D96F523023CA312C3C98AF07149FA178783451AA4AF062E67404484711418\ 660A38167D59630A06276FCD2D7B4A908DB3C5F738475F52FA229203F5828E29\ F8381F664B:\ BD63C9A9AF457AA8AC98A656BEED50AA5704FC1F8719DCF7EBFF3F0F17F654BA\ 077D52619BE6E2A945FB98DC49466D00:\ 84167B3A7987ADC2 5E0EA90031BF80B8D03349FF9D54D1E2614A6621A4FCA2366CC11A6EC7C382F5\ 63CE0DBABCC0CDE1FA93B0857C93E7360C70569B9DDAC860BDFD7E13B2A882C3\ E61AB3361F2B12C064C1901E936F2317C8E4BBEBD7A9E653F965CDEB504531A8\ D133A14DFCF064C1118B1505D3614E7109D180EA9B0D0CEEFBCC93D938EC6CFF\ A1E8DEFAD464152DA5EAE8954CF7507149D79C54D47ADF40F4BDE034C5D4FEC3\ F1FC187E47D8B43748B4AA32726ECE9A396A744635E3DC3FA8D769B08ABFD0F8\ 7CA77700EB28149BBEDDE28DEBF3137DF99BF7217D2B36BCE9EF71B85488D099\ FB99870F3F9D23675C1DE2CB6E821F42B263A5F215EFB63CBFB78581783FEFAC\ D044265DF2E80D1EAAD98E417B78FB94F7A5A2D79A9EB85DAB964ADB38D3505D\ 9DEA43532E68C30D280ABF3E69D84846A9DE15353CD2C937B744329ECA447990\ 699E32470947680E03F50134CA1A62FE96857930DD2F22221B0B1762608B9ACE\ 34D907932842BE5E380E27264E0176B9981E98E7539AD68A4327FD9A0B36AC29\ 1BE99F32E63935120B8D6FED34C4F6E6CBF870BF8775F4E3833F882A16620E27\ E2E0FB668980BC757D497949A52A5850D0ECC0B0D40768E6DC5F40D0E6CFA79F\ 0A8917512F3CA467061DD608D4DA6D48E862051EFE8A8EB7813544CD393318D0\ BA48F914C1A45A787D624EDF366070B8898113B8FCA46D7F6E2F449CF40DFBE5\ 1E503177FF7B:\ 8E745FB5E21C3878F34E578D61FA68C6600B68D9AEDF7AC07F2704A17FE65B27\ 00C86E55406273C016340A02DA1C4B742774F193C0C78B27AFE273D12DDF8F2D\ 70E29AB245E61CC3D3BF628AFCDE3C7E20444107FEAC1BCED6CB6A10837FD37C\ 890C444C600D4D9677A32480D09D0A38B6D49BBC43A0B02E576B3C396FD6710B\ E3E1E05D20831FCCBC154CD80540D0F7396467B76BB4665EA58729EB312A0B2E\ 8A3A216C55EE620E36DCE56A0F4AB1058FECE4F3A7881356D7115085A3C78C82\ 10D3BDDAD512661DB85FD93D4A4779EA2B22027FE3E8040EF9145B779A3B99BB\ F4A60FC3AC54E8BEC89A7EE7B76A390BACEB7ED76AEB04FB19F6386FD493E437\ AB0A9147B88363C3FBECD53E0BBDFEF233C8E919F12314215E358D5BEC2CA0D9\ C63F0A27BB6FDD125BE06609C38B7783A0B1A571744E1C9C381A7F55C84B9DE1\ DE6AE75B1F035844E24C89BA287AC2508D75B48305D1A9EBD45EAE2479BD50A7\ 14964346113736D61E028FB962808BBF441290C5FC6E38D6361E4D910F5CE183\ 765287BBFBAC9FE1852B529565D65BC2AE704426C04244DB19135F0F39AE0850\ 2E926A0159C074A90F3EB1893A14AAE1D8291E23DA67D4ED9C7279D4E7F44EC2\ 4ADC1E4D0F9F0EE039A78EF0D881723921CB97DDEF563D782709107CC9EAAC5B\ 040E698FC935A76A733FEDCB934AABB34F0CE5B6B63E16009C9C3DCDEEA9CEDF\ 3E07820BAE88:\ C32F72F4E89166E3EEC9885B1453867AA2E4940C7184A8DC7DCDBD144BFE0406\ C5D9FAE4A432A8B7AAC50E435D2DD6D0:\ 936122A37F14C86E F3BF6B544D792A514B0E9A105DB900B4C5E649A4DDBF9C32400E296F8DE37C00\ 788A1D8DA34AA4AB46C6F37A8C6B793E71F85BFE935C0D616D762749475E0539\ F690AA5ABF21D7995F6136910908EE9A9BB9876B9B26FB3038BE7293ED9116A5\ CC048B5B928FE4B72658061CF212E76A76E0B6C5C3D516BB09184A42E4F795FF\ 8651EC6E999C3AAB35F8719BF72EF5AD6E60AF88185A68DECF957056418CD470\ D2180221B0897EE24BC7545E799AD8B6540CE30CDBB87E1444C54605833C5928\ 84C0A894869FA9C2129BADEEB32D4A23BDBE8A3EBABFBE735B601A693013E614\ 78463D67818E2A3607D2CD4D24D069CB9AAA66D4ACB4CB0B065DF929BF97797C\ 5CB1015DDF8BD33F5F503CB2159F64F748F543188FF8EBEA71A6A669907B117D\ F1535113A8E0FCA60AA095A43CAE9B21D20540C0D869CD7A970B16DAE3E52E84\ ECDD4DA73CB56763F72158D93AA6BC10A0456DDF54D4E23E47B0D0E4D376F90B\ 10CAB0D6CE9EEB0792894B29104182B032BFA6F2812AF43CC05EF13BC7AFAA74\ 69E133FDEF68823F8D700D6D88BFBD04F13C1F692785A31A36B53CF9AEE267EE\ 4517C822BB9CCA44FA294601DFD0FB452B40C374E09542B0FA05AA264D35233F\ 82C2C202FBFFDC50665740732F114B11CCC4BF786E0DBAD56D730AC05E12EC23\ 4BA17418154A968E946F87F7813479339911D16F3422B483F9B0FAB0E20B1754\ 9D2BB46E5BCB76:\ 29DF14368A0F03474DCBB394BED5227EF922C15EBE44718169EE7047D66EFFFA\ 2E36AD3C4F3C1FC3759F9742B6E51356F3262AFE48A4D8ACAACE5B57B795BC8B\ A11A8609ED34A96B59A3051D3CD5668DD8A15796E8CBE2821525438043C7CEF1\ 81BF3E146D9905AA67457C07BBFA4D080E86EEBEA9324D57EF8D790CB10C6430\ 58CF5BE170A7BF0B03CEA9AA81B76A6A090B8FCCDDD159195C3D129D0D6692AE\ DCD6561CC61DE0EC9AD3A84EA6AD1178811113E84328E0F50B90AE9A23921FA5\ 45F58BA6E9B8F885FAA72B89952A6E889322948A7AF42896C80C03E0E1708A96\ 1DE724CB7607EB00BB6362C6E5C0826A40DE29DB0CC05E29D7880A9B3CA3776E\ 6A435674C60C2CEB8B2EC3B386FB3F46A86935F5D1590DCC0815EADCD070A250\ BAB2464F0CD85AA8552C5506488602EBB46F80C3E6F9D5FE9F1BA1E8E3B94E4D\ B55FBDD3628BE894F35A932662B358BDE9E8EFEF273CD35A3605381E3DFB7FB5\ B1FB64F084D645C337C06376E3E1C30533036A2079DEFE4EB076EF7D254AC084\ 8DE99AC6B6BFEB18AC14D531EF98C4B4F71813F82F5A76435C587BF0027AA376\ B24D09AA990B1EEC6E292E46A462B192E0B8EB85110F7B5870113E031D10E29B\ 9B02A9AD8C52D397D3F77AD810364E66A0DCBF04B6948DC322A11980495A6B12\ 1F8B3A8CE2EC4477F96E9832FBD3D777547A1B0199BF7696094AD2883F643A81\ FA4580D5E73CFC:\ EA269A4E6EABB2004133135AFF93EA6263B7D88CB603252178ED3BF30F31C944\ 9193BB64D627832E5A6B6556571384A1:\ F55B4EA476A09C16 [TripleDES/CTR-BE] # Generated by Crypto++ 5.6.0 97:0A:\ 88EC5C9E9F223D7FBA9B30756EF4599D456EC9862840CA14:\ B49FDBD64C0714ED 0BBD:F252:\ 12C9A28E27C2318703CC39D4CCF116D4222C86AC6243ECF6:\ 5FC33DA76B3D9006 F9AC35:FCB637:\ 1E796473468D5E91CE170CC8B5DB6C1EA46D058B5345D35A:\ 4B32CF8013B2D2B5 5F646CF8:1C2B4870:\ 0B6D5A41871596D3BDF22A486BD79D925A01DE716C23E10A:\ 6C164D7221E75CED 0C2E20A965:63C6DFC9B1:\ E061260828CDA4B86631F3FBB74D48F363B0E45604EB41CB:\ 4D6422429C41CD32 A13360ED3328:B3D7A1D9C0F9:\ F123BA5416CF6208A06F4700A6F5F26C5D27C4929711E044:\ A3731CF37938EC96 B050800567C2F9:24950B574E00C3:\ AEC241C64A79B95F289BD4935691CCC72843216233905904:\ B2D3675FB60B68DB 68F8124B237BCB15:487F9E08F63717C9:\ 96A8129959AB9F86C6DA4C25CAC3AA8E6CB4780C9702DD3F:\ E0937FECACFB7CBE 9987D62F3B186AD519:6FBF00CB7E57B85FB1:\ C7B972CECFBC119A6A48FE5A9C648494D255E1C798E957E2:\ CEAA71BCEBB7FF2C 8AC131BABB73725F9F93:87F0636BA739E1AF0420:\ 7DDA46EAB41941CA93ED65F9564A87B614D188CA40741C50:\ C5C42B0F197379BC 01C70F5350B3868244109A:319B4F8A15BD070C940ED3:\ 7E246740B8862DB45BAE9DDA9AA2371CA8924EBD10A83885:\ 1362D0F2A164F4B3 29B2E505CF74276EA0033323:4A81E054B1DDE289B7E8A339:\ B395CBA236BE9E11B5C71476E31EA33FCA07706F41F9FFC9:\ AF32EA8D33DAD998 0FCCA7134678D5B1F19809BFFB:CB2DC5F7DD24CA55DB73DD90E4:\ 7F7B0488E6AF4E17A815C5C47D1A84DFE90023693D8513D3:\ 2166865BE0E1B2BF BC2C8412AAE144C3DBE5FB8FA904:84418EBA5D8723FD6C5C3E6D1E10:\ 34E5CE0294A97A0012E11E0EE2BAE03A701B28C969B50573:\ 58AA4511AE4AF26E F268A2E1569E166B2F32ED6AE8B56D:70FE2961AE8647134952D4100E1EAE:\ A09FF56F666975A778577D50D6B12A21625DEF840866787C:\ 90DB7E59DA534702 B4D921E1018766F3B5B57B62752E1410:EAE2F2B0A7ECCCDA47CB780802BF8113:\ E86ED5142A2BDAE2E15387E500FA176F496690BD009FD017:\ 7585B73BE2B46DED CA032FE8596CD58286FB89F89EE75449F3:\ 588DAB35EC88B532925D113F501F48A4BD:\ 89B6D2747C5C6595FC0763B10FCE3414B4B6800DF6FDE760:\ ABEAEAD81F34ACCF DD8E581A456A3BBD5D4C0FD412F15DD4DBFF:\ 0C0B17BDF30BCD4F2DD40FA59878ABB182EA:\ 1379A08A06CE56C40C2F71402D063D2BC45E2410872D91BF:\ 06EEBB1BC203C72A E69BA9AE4A7890B935EAFEDC4C1533ECA048FE:\ 52AA3C6A5A75E905AA9CC6773D0D9B8B91C550:\ B78843AB2868780685B364FA4EC7E7BF3D8F2FBBB85FA573:\ 3C84AE0D3AF5F57B B73A4B8FE9F8BADB0E976DF555257F9AF67E2FC8:\ 77EC0EB7DD2A673502F480EE6E2CFF32306D07F0:\ 56FB990986DDD678E179AB6FC26897C2996FEEC6E58226BE:\ 4E0A07D63752071E ED9A5313244B3B47B7D122EBF4CDE71BB21B823B52:\ 5E80D463E271FA56B1D8FE417EC70B36443224BE24:\ B2FC5F8BF1C5D267DBB96D819A1C4F9579ECC5F50B45748E:\ D95DDE49F3720F90 28B33AB62AA9110B5E51511444859EC73DCC385B9DA1:\ 91A005C130858BF53E572231CA53B2C12C79A45F7A57:\ E52FFD655C02ACBD8A764EC1C938A34FB7A60BC3214EBA75:\ 44A5958F8539B344 078FD39F4D444A18EEE155F12297D177D0CF3A7DB53EE1:\ BD3B9A1FAD86FFC6AB61987C5854AD31FF922B135DE763:\ EF8BE118E57C9B007525AC36A150C3A21F619F12B472FD70:\ 7F117F99E20199E5 5DD649549E995B9435118A33234E698829D6BF5EC642D1E8:\ D2CD69C30E2BB267910B91171E25D31EAC1F86A161422803:\ 1A96CAEA23524343EEAAFBE71F8932B30C08B93C603FD543:\ 332840A8D9799055 11785EC120BED9A3C964B24D0AD7165C541524FFB48CA729:\ 69F5A5058E69DBC79ECE72355AAE125D0727813FC5602EBB:\ 37CF60330343BF4B535DEED7B84F635CC54E3B4ED931312C:\ E24659F0266162BD 53A0E3F42907DB065E17B055B17E91FFD69B201759C398EDF81C22A6:\ 747B39DBAA9E9C52BA6462D0C6AEE746CB73609FE779368CD4EBF049:\ 7F681F49EDF476AB1D6942CF78F3EBFE9B7C9465B96FA3F5:\ CD93A0B282C2C4A4 065FFB79B513457D79739421F97EC777B53B23BB88A656A4693247D5A7318DD5:\ 1C7B575F4AFD516208D90B19D5BFF8A848418987AFE195D7D683B5840651FBC7:\ 9B1AD76C8D5951C3CB503C0AE24CAD3D1F3015072E4D9C93:\ 3C6815A30F546E5E 47091AEA1CE82EFE6992AF5C5C732D49B16C11EF4F00D120B41E2756CBF7784E\ DB3B42A8:\ F2CED7ED0345477521672A39852D4C006644BD2317521AD6D47F8039572896EB\ 64E543CD:\ C4BC7CB98D99F12665A24433AB47CE6E351D07E6D800DB36:\ 901D49B1E9EB2097 945082A1B920EE6874BE05E3DAB5B7DD011EF6FF80952F01CAB29F9A208736A4\ 8042B6C44481F7CD:\ D143689BB576083DD9F87D970584D10F7EC14849ADE29841D617BFB855F04BD2\ 3182AC9ACEB79376:\ 1D795895A23AF9D60938477D717A4C2F4DF0113728E8147F:\ 21380F578AFD1C07 583BBAD6BA61BB298BF65186F27B343D54EE47BE29B2469F0BAE0EF40856CFDE\ 1832BFC79A499CE164F7F01A:\ C829FAF9118F73A6409A134E76BB74C1F3A0EA67C4AB1183E945E5750D9DDA60\ 6444B80C6BFB31430C6D038D:\ 02AC9E4E449CBE29D49CE0B25EF137AD592A7442377DCFCC:\ 6EB9BB6851B2AB13 FC80BDE6EE7C14BE8CF25C00D651839E53991824EF3415FB127881EE4EC73A49\ C107EFFAE1BB017583B3233CFFCD18CD:\ 6BD12088E4A1B86D5063C5C07601C874DD11B8813DB48D54F7D808A2754D543E\ 9D1782B45AE293DD0C4E5A78F215319C:\ F8040495E58ECEF0E923C616DC10A520274BE053D388AA9F:\ 81F4BC6CDC689C7F FCF9A0FBE89ABF12FE10F9D2D3B801C7551F109562BCB30E40CE8BEF295141F5\ 155F3F05FDAAEE194255DDC5685475EDAAADD7C2:\ 5ADA184FECCFAE942E0B689F05318AB134F48903B2BA4D8B180DE482188BCC2C\ 05FB0E610913FB5A06C2B8676D7BA7EAD9385A24:\ 6477EAA65B50A234927B8DCCDDEB3FBE7404E91FFD907E99:\ 5F04100C1A2A2557 BC91C5CA49644998D9CAC72B43E4FC7FDEC32C7C4E911B24AA37DC4ABCFE0983\ 47AC134A3D4F5322619ADB922B00A1DA123E0ADF678E195F:\ E3DEB62DDE6F5D1D91FDB0234FB0D8A1CA29AEA3A6FACC9E265DCDD87E096963\ 5623037EE6D9F43B74C6ACB933F097A8782847CF80213E73:\ 2A1D76651411F489300592B31BB215A659ECAC6D2786D3E5:\ 8FE416B43B775A22 EDF122577185F6AD11F6C3930A565CC6BFCA6D9E9A50D5D2033D985142145723\ AD5DFA28A8C9EB5D6A99A18294154B596581D63B1B551734955A9584:\ FDEB456EA993FDD98BBF939E59FB0138689473E449D40D01F49740B02A1E6CD2\ 3F5908877DBA2724C4CC12A0AA25D37DF1CAE0F576608B0447D68E58:\ FEDEF66C02B8A055A845B268CF5CC8992F330CBB7D04126D:\ 70802B6B96EDA29D 6392479C6E5917082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089\ D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E:\ F67C1DFE15EB8E5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CE\ C1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5:\ EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7:\ 852F8EA440CB5BAC 83F82618BF2DD4EF4310B5F14F25C2EE63A36987B811C0AABAE5172ED44E0894\ 1D8FB5262C7AFB846615F10A0FB4E9EE04CB1CF83986DD206A751FD5F8879EDE\ 4729F45D:\ F675B2434E294DCB7A044A27463D68DD7DB781BC156ED7159F35E5F867D4842D\ 38DFC9A2ED0CF055B2F97D3682F65CAAD778BECB1F3E2EEE7F0EACF1B00B8085\ 0BFCCF6B:\ 229CC4B93365854F0D1DFC204B7A10D220CF4CE01502858D:\ E671E23612AC6A6F 864172019C96F6A967D57A67DC2FD7D545F7165ADD8054FDD6383E0B127802AD\ 16C09F300AFE5858A291727CC5554216B0CC3DB6496EDE43D050554B7259A947\ 190B2EE0EBF1AE3E:\ 376764C231B95E5F5286F913C01BBCECAB034D0DA9C7E462592D49F5FF47CD00\ 380684DA628B37D3B89B2DD661E91FB3CA8A7A0C9D81F84A20DB949A3B7E7825\ C0F4912A283FAC98:\ 359DA8E7D9C83F855455FB211E858CBC1F22ABE0A392CC01:\ F091D747023D2E80 FB67553B92328B078608B5205B130ACF891C3FBB4B8871E924A3051DE9809ADC\ 5DEA0923B576F2A9CF3773EAD9922AC29BF6BAA2BD9712161C8039F73E642EC0\ 3FC8A55A5BC4EC09495CE6ED:\ 3E667A7DB0ED4258AC8DF0114320EC8FEF6E65D0BC77ECABF170D5E51A53F895\ 9CE646C019AD3FC808F0160BA87B106CD80050B8F702643111D538F742F314CD\ 3D4214F8F2B16FCF8D5C47FF:\ 4093748D277BD6B2E9F584AECE71043C6E47683E9E4BD0F9:\ F4245FF774721187 0C395E448D57AA17E8468456585DE8720557E994F63CBB77005073760D53EA9A\ 2B5613C9BCCB8401F1808BE933AEB42E8A01C497E8D97C8CBD502D24FB7E115D\ D6BC798C07ABDE32A22D75A21A84EF6A:\ 655AEFA5C512A857897A1543A0898C012A4873FE27FD48510E1E9FBD677C4151\ 222582FB0881DAC3D4E5D02B0BEAA19703F463EBB92F2FB2322B52E4B3A6770C\ 1272D2B6B384914CEED77D776DEACDCC:\ 1FD50583DA3D8B0EC7A9BAB3AD14447D51AC817C231F30CA:\ 4192D0FBDE37BE33 AD4B3D07459B913F32336BF93DF71BEFAB6B7A7ACFC69EBC8D987E0DFF89B8F1\ ADECAFC75DCA658693DE5B7424459403905E67E6BDEFEE705B71C4DCB27EB6AA\ F080E15B5DB90AF93EBC9C42EABCB8C310FBC8B7:\ 0EC7B56ADEC94177911B969D69B587A675D8349F3CA94DD550F107C85CADBAE2\ 5E6EDEEA2E2D6BB686BBBDD5187B0E54A7AFDB0E9270E03FE7413138CEC8CEDF\ 9FA3A4D9ED1301EA91F3D8B453D94BB0894B5995:\ 5D05BF58A304CF94C90635D56F37C1A0E9BA10935D428D69:\ F305C881FA1A1F9C 8F0217CF21EE1748F05CA42E5FEEF1BE1AA09BB00AD495FC3A09611348591DD1\ E54C62856C39614782190C38642D42A515D642360DE095C7D55E72DDD831C6EC\ 1489625F3361A1064FDBDC888C8DF7F90B4431775EDE1C20:\ 79844FD0E851C81D5626CB05EC9C2C34ECD37B5D66C94C1E0DE4AE752BFDBF51\ B1BB83C312113EB395BCF6A5E33B8D1462A6289A244AE2D2773A7203DE87D762\ 80196068C9D4F9034A5298FD364AF7AA8CC4846B1898EEAF:\ 78DD18BE23235BB33E2DC8AFB4DD531D1F48A8757223BA0B:\ 99BC592318BBF787 9D38B62D9033DB573EC84257CAED2CCA0D04CA5F7A11B47E45FF523DFA9ADB38\ C93E586AFC80B300835B02CDE13F123A8B2E5BC66CF5C333FD216DA06BA0C937\ 02871142064D0B2A91362D390924A73648DFD9BDFDF504D07CF735A0:\ 60D1C89500BB05D2576F602A93154CA6193678B6D58EE65FE5078118C771B644\ F452F21C1A881373DC4208D0759DE25F4581D8C799CD82C12DC018D6A61B060B\ 32B3F42DD649526CFBD6FACA694DB906325E0F0AD786CDE5F9997BA7:\ 57DB251A06982C2AA7424E1734FE88DDA1CDB78470412CB3:\ 18F8895E0B303F38 B54C5278A5091743E81F45CE4FFAD2640423AF7E5D033CFCED96729392E2D3EB\ D6550291054C41AD58A0F9FA55AA204F4CC94A1DCC83ECD019E5594FB398663C\ 4E8D50709C70661B5CE507D51451BCCEFD5815824EF1F68C641C86C959594632:\ A9A7642E3C372CC2A270D20B2E68124BBEA0D1111191C62544E7149918119EC4\ 3641440EFB83B2EC4D3E27D94547005364F62687655F697C7EA87E8863EC4B53\ BDC88FEB22BAC3C7974A79E2F0BBCA3BE3B4C6A760C13D5645F4BF37722CF284:\ 2D0D09FEF1AA8DFFC59187E9F33AFEF527559D2B51349CDE:\ 4685C00F9FD16505 FA8E29577C3EB4B8C49048A0D61DC6ADD84C02A9B8C7DC86E1DABA258C54D8D4\ C367594C2726B99F443FBF597F1C7C003E49B019B02891872F1F1CFE8EBCD22B\ 3FEF3A5997BAC3459816BD43EE9137205CA0AFE70671D0C03ED01AC7E6F957B1\ B3AF8F92:\ E736CF427A53CEB8A4CE9FDCBBB346B7D84311F3F3E8AF7C4FB5FCA9CE1C0F01\ F4AE272614E7556F6AE12C58D98DE1A1B841A9CE95921CBB6F19A2EECB7E1359\ D28CA79AF677933D13D7EFF3C1BB894EE20A44BFE196303F228DDBD1C8A28127\ 17D791CF:\ 10423E81CA423035E6CF0402BB817816E754BF0E7D5ABE67:\ 588C7B44583F4338 7210EFD49BD2BBDF2EF3488D8DF261597DF326BD2B1908DCC116CA077B1D8810\ FCD788DEFD57B2285771EA00C2A71B928072AD92CD6634C7637B91BD3E138E17\ 9FF15CA24D156A831317972D4EBA7FE1EEE2B654BEC5598DEF97DA4D9AC99E16\ 5CF5441F5B0E6D16:\ C548B70BCC936B8E0CB009941629C83EC3DE6EB7A9C7D36E9F1A369CD8C2D978\ D39796906C5AC405208AD38D6851A0B7D7E07B2E4791DBAE703CFC3D172F1132\ B47393044F2551222AF03439B2AAD4DE66E9E3B1890133DF11A2D7EECBAE60AC\ 42E51F0210C033DD:\ FB6BE4E0CE90E551B235A395A780587E265459F3A2FB9301:\ DB17C1C5F76F8B2A 01560CE12D17C6690ECB8C08087A53ECEFDBAF5EAB66860BB3BEDD35F16145EA\ 13F790818D974DB4D1F4469876A24F11599B63E48F70ABBFBC4CF8911F017854\ 832D61B742BDF877EB2B1D7D05D3413155EAB0DEEDB077ED8B3CE940D30700C2\ 45068705B24AA653A3E31CAC:\ CB6641AF44AF5FCFBF38D74764EF26DFA72259FADCA3E4B78427789FCD098737\ 4A307C488FDBFBDECFF1549346D04E3A03FD7E8E2B3680267CF05F99E983B5BC\ 7F40C9EAFD4A463D88080E23A65A8706CEF65FE7DB3E437C7625F6F3833DD777\ 96043FAB943D44634240EFC8:\ AB41F667999698A7F657ACEA04E70F61ED64B1CA8FCBDE70:\ 1D89DFEECFE84C7E 19D7CFF7182D41F083066B2AE61DB10AAA7E2C8CF302D5313E27E9A86A548453\ ED06EDCDFAC0C4800CE11DA1D415003A06E42DA380887EF7CA62C265C19B3A40\ 5336822490D93B76F0D51A5A4DF4CBE8C5249F53807C42E85711EEB44C72F7E0\ 3153DE0F836DF7D92C02AE80FEE343AC:\ 4632E56DCB6973AEC10ECA9D9EA95F0FB5A0318E28DEA69C9770591060420F0D\ 88197B154654BE281A405E36104408F9848BF157BBD9AC676326D4023D0B0C22\ 9D9D2828678A04EEFBA56CCFDF8CCDF3F1EB5AF8C78A120D2F8A7FD452A56C9D\ 65B6F6E8542BC5889FC515D93146675B:\ E14ACE55594044D6FB3F49C1D3D2F57590609D5E4A489CD4:\ 11692B3F434F1E6F 245548CBB355FE0011E7E07A5BA73ED0A0A02DCC8E5DDAD2D5D4031A08684491\ 8A0308B0F4A115C690FC12B80BD9B9CAE8E85275BDF2A636A98B41D1DCB9A8F3\ 3BA47871E931136FECD36555167C1C272BDF59B5428F1FD628285428B36CFDBC\ 400FBCD5BBCA23E310F2EDE5809BA9862875E12F:\ DBE0660F5AA3D77611CBDCA3A76994F7D7638E8FC528BF57C32C25E7CD3DCFEF\ 15FE6C05E04B6A1023DA5948FDB68DF5646432E126EFCE3D3BFDFD34E5DC0923\ 36CBC1B1A22C458A3F862A659BF39143B5FA990851FDE7D00DCC91128E6EEFA4\ 0E66E417DBE2800DACA867B1E2446C1F8DC16D8F:\ BA33A52369C5A7841F38C908DB1C428168D1B99A8D5ECC0D:\ 7C9D2C555EE392B6 132D28F6AEFCD811A8CD9C7377C92A761A337BF58107DF513B9F27D5D343C190\ BAAAF96D1932A5DC3668BA1DDCAFFF175817A82C7A5930B089EFADD712EB493B\ FF23D622D855E920BD254B540CF779C90F7DCFA78697EED2D27C4CF33FAD8C33\ 574F167648D5CE82EC073DD1855F90E66F1257828435D403:\ 8E76B60626715EB0A129E6C2385F2064CEECED23B08B1E0E1EEE9A1050C9BC45\ C52ECC36D3F503566F68C4A73E8737020DE93FC9BF2E0BA132746370D45E21E9\ E101291511C95102A40A65EADCB5BF3B70E30273122488F8E5A98F88B32492B9\ 07799D3F126DA27718C410B629BCB323199A4533D2BE1566:\ 5896B26A6C98A462BFF52F189E09CB9582E721BDD4435C88:\ 8DFE5071427CC54F AB017A9FFAD2C7B1447A426AC1D4F3C103315E37724D4C18532AE13A5A1CEDE4\ 9828C18DADFBB27785ABB9EE20CBD22D4DE7F61B59A818BF59A6EC9C1E748868\ 9AB46890105616F78C4B511E81CDBB48A5C4A9E2B60061C4D76E000C9589BF07\ 24E6730950ED9420053F554164FD358F8DF17EA944414BA63C2BCD4C:\ 19D963BF720D19DA2AC9636203F5B5D2451BB384A750A0B38B1DCB74A58C7E67\ 7E5EB7CF62281E9D625CB6B3455877E4D9EFB7D9844BF4808D6B35EE6E5FDF98\ 10D29EE6A257BA601BF35E44574D165E739FF91B8CBDB7DA5D742A9F896384DF\ 8A309DA75EE053D86CD0A45AEFC8F13365DEF0255BFBD11A3BA660DD:\ 9823976A01E5CA3A0072F891737F2E804243C022DBF67DA8:\ 1A7D40F7A45D3B21 D88169C7440D4B715D00D29BE2C56650C38B88848A78C7F3397950A89CFE477B\ DC4D9BA25C7126A0BBF98B1B712EC31026987D549B285338146CF6460391BFE3\ DE28BA02DA4DC03712DBF7576B27FF0A9BF70A8F8ED9834C278B9B7D7C5DF14E\ 6E96F417A731C94FD65E4BB53397EAE04F02C70DBB166BB06B51EBF5D0E21556:\ 6AB43161D47BAA00611CF93F1CD22111B37C484D467C671737D0DBC3CC230E8D\ 06CBFFA4AE13D655A3D5F5B4538278956120B26FA62F6664666279E0ADE80601\ 579BE3EC92C236D16B0F0952AD277CAF995758C15E48D7319CDBFD60251B8C16\ 04AC8E3665B3B55CD7C1AAE69C78A8079ADF454928834E7CE857AC1F7C1B5D32:\ D15F4AD42AD3B5E3E96F3C1B80F841A4638FF494433F0CDF:\ 69BD2AE022B36B53 17B3CEE55049B8D5678308E1AA3AC851785500ECD0B549C88A79F4BE3919E831\ FA26AE8CA740C8DC605716419CCCD0EDEC6CD26636C6DFF4502E475C5925B78C\ 728E2033A3CED070311C006F75105EC1250265736D128E484FC75B8FF59C1A0E\ 8B2F6D1509CECC99BFC7F0AEF053BE99A0876A77BD2C292DFB8E302821A322E3\ 19F6166E:\ 9A412BC48FFC5241FF472C0A38B7A6DD90338D07BA5819337EFD2A1DF6E55DD1\ 35611A36964A9130F1D66647C408B300D5A65F158E738F545333E87490D3D640\ 3450A87C97EFE05F4C2FB1AD93B6D1D3DD0B5DA919C30E2FD4FAB0DBEBE3E5F3\ 76D848246ACBE7EDA4EDA0BFDD3222952A4B3E089E91D759E8579A6A5CF22607\ 5378D6BD:\ 30649520453107ADBDB89755E6A45BBC2B1441CAE80664A9:\ 69807CF1461E591A F2573AACCF5AF3863190B964E06CBB3D3BFA62C0A249B3371B0954CA44EA671D\ EA8DB66CA82F0F6A31F905E9A868DF84FA91F5EBD63213EE2EAC81EAA2D53E0C\ A532524E663EDE2D669F22944363A228318AE7D54B78D9D357DA2153D4FA74C0\ EE86CA4FD1A2E4C40F7BE5EA9EAB8972B40333E76CB668E252C2842FD3CEA4E4\ D0B474C5655ABB97:\ AE9AD8224CB1C13935BCF06D72B231DFF0E03C1329B4B095D1FD1025D27749EE\ 054BD5C5FC191C0FF6DF19114F3A723BBC31FD2FBAF568FC11DD6BB75582909B\ 47945780D81D384415AFB1C239E61A47993BA6B3D28BBEA3A7B989CF9D2B0961\ BF215C029ED736F14D379FD7BDBD2811E1D0F4E0082F88FF80B450704CC07269\ 47F82E3E3DEC4E90:\ 44ACC9C403CBA1CBC379BA5728A82184E3C6C5EBDE9937AA:\ 864C402CB6C3996C A79D7AAB3CA5CC819051D9ADB71CACB435E66752D5705E080C6BD918212409BF\ 0E1C99143C7DAD3A19364816F7E055960DD413F45550A4225E178754EEB6EB36\ C78C400B59ABF6138788D5C86182E2FC5EC8BB54D532E7C0E1352E56E9F4667C\ 4D5D6A06CBC657BB447E8A23E42ECA31B8B8CE70C44D1FA08BDC2221D7CDD2CB\ A13C7DA5909D5809FAB74EF1:\ D27B0B90C84AA11EA79C30B8B6D836A0C873F1EFED6D1D70A8CD4B9167218552\ 8CD2D8F9D7AA044CE2465E8C8750D12D220ED7DEE8DD7E967535B68E97F51614\ C7F2DDFA8F0EF69CC20949C2D0A0F69A0CC0D668B934EA6ACCEEDFF36DC9C95E\ 1BD0963BA58532EFD2390BF782135255DB25B09EA7AC663BA2E981D4BC24C216\ 67AFD63CB8ED3996A415FA17:\ 8BE0F9A2BBBA3CEF45DE714CB47A1DA46ACFE8C8E375B5C0:\ 36A3DA85013D20CB 00675A08365A2C219162AF373BC3907A3F315065ADA8EDD8F95C1C72C30C0607\ 92B7DAFA6C6517C24815A974EFB1578A2E45B2A85877CF7AF4499BB61CFEE555\ 974DE01502E40934B30CE648C5558515EB118A25F2EF9F68DBC6A56D47C03FC2\ 76F656FF72092E07AFAB6F7CA3B20805CF87062D5BC48F6809B0010443DB9096\ 30681609E489F84E40C6EB05E82BD154:\ 2DE3E2479861C3935C30F117BF2EE076FFDB3BE6CED29ECB4568C573AEEEECF1\ 2A7A2553CEFEEB385CFE2E148D3520C04C3E3FCA827277C35AB79DF07FAE2440\ 0A75FAFE4122AD1B8DD2127AE7BF57B7206C45C9B1DC31E5EE8E7E96FB488C40\ 2A4B247EB848957D29FAFBA44162E41D598587C4578DA0026F91FBDEED83A493\ 984AE7F21A92C34A3166FD22813D43FC:\ DF1FC69356F3D84F8504E86162BF62786BA068AFA274CF1D:\ 714D51ACB680EECE 422C787B610A81BDAB601533DC7FE9D2AA365AD8D0C6CE79D9B278EC2EFBEB62\ D6F786A39BE2EB40C07964D7E51D6D799714B9ADF950F87A190D8AC6E5EB5AFC\ 69268A473270897C4918F1994BC6D13D5DA7997CCCB90B08DD1398C0679E8A1A\ F2EB22261D347822A2490CDFD4B6AFE1E73073EF7D35D6396591FF36884C5502\ 058A987656EB76E7AD5C723A128D1D5DCC6B9EDA:\ EF213F63D55E34C88D1077F3E83A4E34533F11D913F495E35D2F69CC871505B7\ 2792A49801F546E574FCFC555477D9268EB7F047A9D158A6B13E282F1F970B8C\ 4AC465DE3CEDDC9956BA78BD18248AD3DF634EDA11D4938C2BB8417C59068D10\ 1C426808E089B63CD06FB8DEF20AD2EBC1102CC3DAE5BC3968BC888FC565B24E\ 3D47666CA13D1EE29C2BF2093CB1E8514AFB4142:\ 3B04007C7DAEE3281F302A1E59C19DC27C5828BF1D05B0B0:\ F0EA4B24D5C8C04E 366F71A1A3538E604A3A7E8F2E31812E90717243C69D260CE76193D6D311FF31\ 358BD320F99775D6D15C245BCFE724825F9DE2FB56846834DD215B2D00CE23CF\ 1A6A7F008F9B1FD499F8B7BE608F1E31B08009ADD2BAD8AB09B4D9A3720403A4\ 85EDB1100CCA5FC9C7A5B21F9D7B647EA950137834226EB251A16DA15C8B0356\ 38E0054CB8405EAB05A682551CF75F73CD485E3086F6D335:\ 924E375EB5F65F2F96A728B9CC81E64C4A5D732A8F0CF4FFB671FF2F54EF0623\ CBB46ECD916C840D63201F6D032E32AAB8E55D3716AFECD884A7A576FC91279F\ 34A2404F62ECA75734CA87C2EB0A4603C16FF51DAFA609C25F9B9AC84F5D4270\ AF689112B474EE22B96EB6CD9235018A44BFD65660F0EEA2C4A189A89F2863BA\ 19BF4F392C619134B2AB9833A8CAF09B593508F9EEE6C762:\ 4CDCB5507304374CE290C9A740ED58662B52E63392E62774:\ E186BA54C8C15814 C96B1DAC091798FEB0A74010ABC768D2D5CE0D781752AA3DF34F50A6D9618FEB\ EE91532172589BB22F9EF3CC87220B4DEA792C10F082057F18D7AA18460A3A79\ CBE91A08076C4EFE816C8C90736BF26408415F57AA82B17DFD1E5AC972A103CE\ 747E7F8E76216AC93B683E26A8FD9C06F4355F7D4A59A74EEEA737866AF7590C\ 4E1A41CEE3080FF29E0B6DDAB926B131A75ED34EB990A4E332D6E53F:\ B5D10BDCEAD213950A981584875633CFB9EE6C8FAE1D1C317970E4FD2739B6BB\ 8E3F977D2FAB4448D412A6084B503C918E77DEDEC48D96BF968C66D7E1B4A6BE\ A461AF9CD9CBA8F981ACADC71E93BB33FDD0C3E83F5B87CEED3711CF8031B550\ 5ACEA43308E67D6775951971FAE57BA329B69CD3B0AFCBFEEC4E92AF3358D7C5\ 4E675AA9279F9615C1963D64610F388724FB993F34024ADD1B549B31:\ 9ED95D56BAD11AEB6AB3E936ED432A6E8B845065C876991B:\ 2D8C0EEA9AD90D46 A50B4007340EFBA7116E5C7D147FFD08DF940C883D6F0065DF2EE1DBC11DFB4E\ 2027596A61F00956A2659D887CDBB8F3C768853BA53B3994EF8969582874EC4C\ 89582DE4E113A34B31E3D31D694150A0D7851FA266EAAFD5CED7E7A6889E998E\ 9498EDCD018DBE45C7B71052BC0BD49C2F8FCD705DEFC77EF77C228ADB027439\ 031F95AFB48CA336D821D241160A977117B08AFA9677F0485E45804CF2A31295:\ AA0F41F20FB792774E319AA8D26E600F14F99123AEA292E25AC0F5E77B152437\ 5568846BF2C88A141CF38DF69D5F0A4A13BB48D59C580E22172E8A1F8EC90DF1\ 1AFD59BC03EFDF649BFEFC28D55B92F449C2862F9DCE8D2A38FF251C620F30F0\ 1E13F5175D94099D18AF5CAC2A1B2AD42A13788B5739AFAE2A5330C5FEEDD8E3\ 02B11F2FFD94DE4E7F23D30BA7CAEE4DB4D4E16781625A4D88AE920A5FCFE406:\ 3E83C2C42EDFF2231203B04175289C7A13664D28CAF0367E:\ CFC98241E9ED13FE 65052507F0994AE9CAB2FA2BEC34760B08BD89E993B9A459F1AFB9D120946504\ 56B11BB015BA54C751790F3709330ADC28C52612980BF5BBACCDC9794B063EF9\ 4B26136F89510052043825F456309F9E64885C8365E96FAEFDD81378E933C562\ 833786186A05BD87DFBE30C5461ABCE236E8884646EB36CB13F19A6C37F6D036\ 1AAC771345BA794065A13DA8F353C35DEF1B3526FE90F6108312CDE61714A882\ 1811A985:\ 9656F278A0B988E5BFB80B677CE62820F386997A6AC0289651E4965EB30CF143\ 5FC53C3A34CBAF23D0874F03684096303C946FBCCDE8186D200F28EC3E502374\ 056B15973FB605BAC197F577862FD81317F11946B6645A89EEE49EC947FB1CE4\ 9DC7939F8453BF7F4CD0BA94F08B454508BE41105F579D73DD76ABFF37D12185\ 987FDFDADCBA342500E013A9DCFDE437AFA5CCEA0A772B56ACCCBD1AB18A8069\ 1065B3E6:\ BF60941BA2CE07621165363216B1A8662883B5789D9FBE00:\ 79E1E8AA48BAE8BE 2865B3FFAC2D9193240D4E70F90BDA48BDBA9B8FE9DC80782E321CFBCAF19409\ 5E204D511B864743AF0F4059A955B47D53ABC0D79071300BF4304516F31839CD\ EAE23E47C9365B52A451702928C311CEA1F8D039301B00ACCEB342C251B32993\ 8C9FD47F7642930B7F8A859B51808B8E51E422D9E387DD13AE68B4A1D1B07AC9\ A16D5713AF9EA3D06B2BDDD97B615DDE709D0E8CBC3D1C7080B2F9932A16A1C4\ B33746A08D70EE0A:\ A6CD74B4EA815342265082C682689329A47AA7671CE9058760C453FAE6F468DA\ 8A3AD9B7ACFB31A947FEF628204C9A6F085E99104C1E38CE194F6DF422C3B624\ 9FC3464C25AB78E576A7BC980C3F6E15FCB4F8B0D2A269B4323B998FCB297C49\ 3ECEEE97FD8F6E94B08E83C0B3F090ADF2DAB04E951FFE2C2EAB6F30615AEFAE\ 3958539E9AA6861C7AC1E97AF4A6D4B8591A6431CB1735FD51B110D94E05D1C5\ E5D34E9EBE6B8C9E:\ 442541939F8392881C213DADA197907CD53D37030B426DC2:\ CC469CF927E806BD DED01389883B988753CB3BC1242041A7DA950842C0FF4BA038348972707EF021\ 5C3CAF324478FA07EC69857F93B4D5FCF59D95ED83B1DA6EB247DCB8924C839E\ 474FF125AB188F2173F0B3EE6C143E3B8D0E65A9028930D4FB52914CDA17D5F6\ 0C5CAB8CB304DB9A6B02636D336F568DD4FBD44FBA911B3F8D7D8F3B8A698EA9\ 0D5910550A25A0F48F201A98749EFA7767A9DA32D60397B6794F2A0F4B483D2E\ 6FD729EF8588FE34F8A02508:\ 1723BEE6242BEF711C3B984948427D5D3A272833EB63B70083C68F845A0DF444\ 74B01DE09634DB18918D236E244BBF19C28DFF774D8A23FFD6D02931CAEDC711\ 4B1D4B6D3D0AD8525B87ACCA6FF577479B610244559D1A28B837BD3453A182D8\ D2F3718179DEB55926FE6946398B04A0FC1F320AECE0B3AE1DD372CEAF51DAED\ 3F30F32EF9BCC98A398B67C7EAA478F6D50ED5131377C3E97BB8ACC7FF62F037\ F4282EBEFB97C75E4349A6F1:\ 19DA2B67A303BD41D9C14113367FF130DBEA0E586CC94032:\ 989DB8AF81ADE45E 13BE60919E667B31C3F52317D68AF40FA32E701D947996D754EF21CAF1E0D2C8\ C801B59D610FC2FEF59058A80E95F2164B6CFBFC0CA8EBA67565F655023B8BAC\ 6E22E0FDCAC92086AC5258A9F86FB0E6B0F77BD32711C8BA7830821D4AD7E5AA\ D4B9E763615EE1CEAF11393CF8FC03862FD11505DC88AA80870E518C35F19C38\ 98C18D9EFCDBA4D665C716E19302571156DA8AB3606B5B859637C67C03445478\ D7524F52803F419F0D1576CDA2D4E23D:\ BDC26765ACF6111BC0564AEB8D98894F03BE142F7BDB5FFA2809E637B0EA2AA2\ 30370C822DDD92DB0C271D429F9FD9E5121E7C8F386DACFA628132E47D800E2C\ 3B76CE0157041419F2D652ED49371E809C1EF46B3891DF86B4CCB1DB94A47B04\ 48BCC21A1A32570B04A62720013872859C7660869E2773D75D25F123D9AA45FC\ 4840AF1F28706E2BCB4352817158F02CE90C2DECC16E163E23E3EC566DAF7A66\ 4F7DA73CC65855F87E128F520289EDC3:\ 34C1FB60E4F910716522EF7284BE762E12D92C574C7117AF:\ CCD1117DD7CE8C78 0E08C9AD2B7C2CD3CF87F1D5F4D41C4F5578EADE1CDD1C00FFDF4F755B409307\ AB07FCCC64CBC36D2CF9B4D9332DEB326B1A13BFD75E24223234AF7916F6FE9A\ A37F2F73D9441A49C7E9C5E6CB598ED438CD7C334845F00E6FDAFDA24A164A4F\ B285A5A7F3D6A992691F74E21F3E10F27B27AF202B77F9ACF985D5E6D528260E\ A59D7BEAFDBE0980D4976CD59027670582E5745F245D474A9A6384CB7B19B9E2\ D7531F2558243732D98681CCE406B87E2FD86F81:\ BCCBD9A965628459EB4ECE80B4266C2F4CBECDF281E8FC0512E3ADDF66C5F934\ CFCD9FAF78182C3A7578234BCAE6DB34BED44974315C6D29FCFB6C7501D5F09F\ 13E7D163FD8290A8CA2C883EF490F82A7EFA122D3598F35715DD0209617BF9C0\ 3F462613B1CC578A258D1A708C5323DB478296B09F83C55E8349A4F9A9E0B21A\ BA659BEE4B34B86F6FB8AF8390520C52B9874847B874A61FCEBB625C44DAA344\ 10422610F411101138D9047C72A421D13E8F881C:\ A954794C8C5A6583AC5574BD5267FA456CCB861B035BCB4F:\ D1C4168D5EF23BD7 293D0A81E72071209BEE7B31E2C70A958B552370A0B5454CAF294A3AA7F0061E\ 7DA53DF903CE3537A93BEEBB2B2FD6048BDAF6E856454814C2308760E2C1D809\ 096ACC4B6F1675C6BEF9B0A4FA81A879329083EC0CE758650EC69196F5654174\ 5E805C325963EDAA2F4C000510DE7532A88D236D2A52CA5F4F8F4D3BC28DC7DC\ 1C9286EFF9978E95D666DE1A0E3782F67D9F06986207368C319DF75928E4CBF4\ 3AE35D916D4E8DC800F0D979B244E08933F355F10E227A51:\ 4E47991B92A21D08A1327BD558A743FFECA01E1747E2E05B27B5519B14668F21\ 23FA0875D5E25944A34209C5B67F980B04D5B78CC96670496E8B52B38098C54C\ 2A53CA9213A1F3E26FCBE8A2FC229492F026D97B6FDCCFDE0C449A1319D8DA63\ 1641B80486A9F13A5511FE48BDE85C828F8AAA346315ED5044916A7FF10FDF24\ 732A5AC648864FC3D3305EA609C03726148DF121D85BB66281C8EEC32E5E0C8D\ 8BD46A101D0F201096410BFABC7AE4702CEA5A7B49809B96:\ B79B4914046D2440188552463AE7D4953CD632B74EF57D5A:\ 28AEB01F6AF445F4 16E18ED62ED56EB7DFDC9A16C2A550C9A3FF4CF7B2994750C4716BCCA13D01AC\ 3E9F4687552935685AFED40CC6355CA7B18AA4688F86D0FE9782696FC7FD3702\ 20D6E1E07D14425818A047DFC6A59F850C12DF38EA4601E1D5B5AF2AC29D2B0C\ 5866BA044CBC0ADADD671FCDB7122D8BD085C66E7500C1BF245E24EA357781A6\ 3100150CEECBD4C4C93775A12CD24D48C90BA2926CE0BD03A57894314F9FAD3E\ A6266A7543AF46A82BB5942E87684FF30E1A01B68BBE1B9822669717:\ 855DA36F0F1BFF9176FBCFD921E84709C0C0B65EE2343E5FB716D3A535EBFB68\ A3472F23F60166E0413E8403A4A6CB948A16B9ACEC25C9D9A77A65A849866079\ 396F8580FE8B54773F7746EBB45010EF701624A4AFACE8C0C4F2237359F21DD8\ AB12A27C46F48339C6B65C32B3321B0D1FBB03800A46D49A478D725D23BF3834\ 97148DBCB54CE07191D61CDE1F3EC48735240750D7E1BC61DBDBCA3FC219B661\ 028CF1F178F52F1B4449358A72C740EC3623EF93310B644541F17996:\ CF5A147B024229FE958B9F55854F36E59818E78FB84526BF:\ 179B6E26C9B56072 1BD797B39442A5169CC93A5B49A186E2EF27B95B34187C49DB78E204ADC7F04C\ A5174C02F9691CF7883B64262B1B15CCA987A16058ADB5CAFAC12DC45569B77F\ EEA2A3B5DC5D5B096C0A9CBE3F0C4B20FDF8738930929ED5738CFD7A21A0892D\ AE31B56244BE85809AD136490AA87D02CADEE0DE2F422C93C19B4ECA1CD87432\ 353DA547105EB7C748AB0DC9B2A9377E400D92D66AB8ACA5D9DCF2718986796F\ 4B20FDCB06A0EBFD2BF4DEAAA23EC4D01CFAF68569E9B623FB8729626FC26E38:\ 9815266577A019A1A49C0940BD3697149A50D77086DA172C6CDAAD2FEBDC3CD5\ 56C60BAD7A5F44FC2F219255BA567D3F6392901AADC38398089D8008AD255E8D\ 39786C3DA809E1C499070F3C7BA4787DCDD930EC173E393AC34EEDEF71D8CD69\ E6DA2BD2C76C814770529646FB3D9C15FF4D19F7BF926E0F72840E378FF5F9C2\ 1D464B7FA8CE6514E68BDD95352AC81C1B817E85CB2EF9212353A20DFE14C797\ 8909CA2C96C84A73C93A7C64049A18DB5071CAD15CDCCEBEF9E45D7A4D3FD8E0:\ 422E846979E8EA7AED9218616BAA4C96134D46B02FF4A911:\ 7D2F503105732C9B 76B8C05B6006C39E3D91DE9AF1E018CC41202F3E8068E160183F81F40A9D9B8D\ 8BF163B89AAF149361C04616E5540C56DC69A050812CD08D9C128EFA11AA919D\ EFEDBB0295E2239A54813A4DD5F826836E3504C2ABDBE530912970D3656DE179\ F8CE5D0ECD700604F5680F67DEFD0AEE2AAEA49C1B8024869482998A7BEC10C0\ D0BBC07F90FFBB4E3295C35B11BD99F4178DCD34101ACBDF5E17078D9CA9D965\ A4A04E1C855610CFDCA417C963A7D6628615B0FB1F746558ACF2C23F7FAAD1C6\ 60027F21:\ 06F6497B084EC666DA6706B607DE07D8F31F93ED7F0EA18BE167941216CED455\ 79AE91CAAB9CA67AAE82422F4130A27837B5E6FEE5AC618542BC3A5F594ED47E\ 57F733A63D854ADC13161F35B06889F9D22958CE7016D0954C1E056975CFB961\ A7E787F403FDECE30B6481ACE56DABACF5BB3875AFD291AC1CF42789BAED5933\ E41BEB20F314002A56D47A7D4871EC82F0637EA2F5CBE514C7436F90510CB394\ 783AC9C5E5312FDED24FF9B112770E9DFA01CA9514882F57BCF6A9A7D79B6119\ 970F7052:\ 5A34EF1248E6886E476E059C42EE93EDA4E50A37A7D9384D:\ 901FB557894F2198 0C9CC3DD901AC951FF9FD311B0DE4C3FA05996B687FF0F9053044D5C30358404\ E1F475F98EB7F998B0490B5138F9EDA12E0F792DC0464DADD92483EB44830729\ 33FF5FCD78030FD75D0B3269B5ECE51AD9B246238D10F4FA6E6A06C1A18085C6\ 24EEF9F561E50EC1F4972FD57654902A1592CC617DCF94E08630C460BB463054\ C2F657057499C258BA23B250683F75EA6C28214B05430BC1CFD0A8659188C362\ 8E8653035FD20F3DBBA7FCBFD3BE9B7AFD3FA81179141D8D10031B5C0E335CC3\ FF15F40A82AF84D9:\ 3DE407D6675240D9715357F3D343DBB491E2B5A4F6B3B76F2BFFE495A2715B90\ 50FABB764C58F53BB665AF5C5CDC9E539D32858B406FAE4F6649A1499E3527AF\ C5174E29DEBD45F62DE2CD23B44B9599B63A822FB18BAD935B09D70E9ACFA9C8\ 2A28F2900FDFC97EDB08391E6420C726DC290A6509D2F6236F744EEC83A81E32\ 8B832C7FA9D3E949A7505ACE8CEC9468E31F874D5E1CD4A1654BD9DADDF36238\ 704C1D5537AD7259CFF95A38F21F156A24618CACECBFFE07C0478530DADF57EA\ 4B34F3B4E68ACF48:\ B74C40F0FA6016C94745F73FC4E6C39B1796EEE217223B5B:\ 945F1E1536AC7FB6 7E36435753B7C289495CAD8E1E208917CCC9C925A2B898E87B622B1D2C7407A7\ 6CBD144631243913BB9D452DC6B42C759FCD01E4D3CEFABF9D80E2A29A6D8545\ 78868E7DC8C696738C538695A688BC67D1ED7C7EF3AF687AB99A8B0C691B0BEB\ 71131A8E518A40BAD6EB0AE991421A1927EA61A5FF96C408BD6C4F7BA26835FE\ 71F9EB16F2F477A99BAF3B4DC1DA366592C3CE89BB8287CD8E2942F097BF6ACB\ 1C334270E45345168CD402399ECC8CA5E19801732DCF181C1EC53DBBC61719F2\ 6CBEDD581F77DC8EEC036D0B:\ 7D3DDDCD5AAA7E0B1AAB81687919E03FF63F7F4E619E1016EF9B3F84C9680AFA\ 7CF530C0AFA9F990FCC19A010153BF10EB3CA0899A973A66A7A94487F8E3DC2D\ 31E13EC2B2B9E4946BC97C7676E2329F2F42C0FFB14883DF8B449E16F95A6843\ C3058393E5C72199905E0986A79247D64882ECB6ADD4E6A250FA227253EF163E\ C548F561CE9A00C43C7D9316E373EE1FB715140EB9CD882A1D9D5FF6805F30F7\ 39668E3C8C51E29EEB7DC8005689928D9267E3F74FADFF38107202171C02A7C9\ 20E8FF0A678F0AE7121E16D6:\ 7ADA51356F87873ECB47B3EC609214E484DAA4ABC9439933:\ CCB4D4C48FC17139 6E804B62EA711CA8D09B7B9BBFCC1EB2A8938A6889BC31ADE4548051F8F4450E\ 693FF9182B1BC1A62F4C7998A024506F4AAA85E6733F81121E6BBFAF9EF2547B\ D01C40AD657345AB0B0EE97A8581E837A515071D376409CF4952ED47BE5DF95A\ 2E07AE6921C497FF1CB8057E8B8B38D4D8D0D6320B9A1E4445266C66210CCEDB\ 0D3695549CB3D70D56E5E85DA85D2A096E156477D5F4A4B1FBCEE2E36518FD17\ 21ED2504DF5F19410CD9030A8477ADE57375E08DA2CA15E7B85BD010D76C8CE1\ B3ECDD91B1B970AEC36B37FB32D9DAE7:\ 0B95E5E14AFB699FA86B5CE3129BA5819814FB7C3302AE95478DF30B3FD2CA7E\ EA12DA1AAA0100172A3230EE6677A114394206E60A8EAAE1BD20135B5EE425BC\ 6814F2084A7FB5C66B85E6B443D79C68909ECA4EFCCD0347BD5A66791E8632D6\ 3640A98076C19D4467B636157849F9BE971124A20CAB9CDFD3CDB63CF18117D5\ 47F4A6F761C7AF916BAB021C2AAAB37598C0470E45E672498A0F3745844C89E0\ E4878C2FF25895ED51681574CBC5A815E38363F25BE1A6BBE01A789799081766\ 1D95B38DFDE40F61457BB40B3CA5AA82:\ 13DF6263560C0A2971FD5B50AABF8A0244958379762C82A2:\ BB4E0CCA3D31EC88 F7A5CCC27DCC097B0FEF1DD3E4FC28C513C17E9C843C97E23E185F403D5282F4\ 17640E4FA86C9D53231AA6E62BDE9D6605119528C5EEE8A9A4926CB023D59DD6\ 895F3FB4A2BFF78A63388FC843BBF97268AC6E2E0DEFF46E5A6F0CFB01532461\ 6A6ADDB278E14DEF8DCFE40656776E5FAAFCD4E8A72F7B9937FC86B2854F32FB\ 341727F469D323D1BD0B9F9FD2BAE760C5AC102D2EDD66599CB41B9399F2B99F\ D9D28E50EEE442A1A7F94DC7F0F6918C559BF1BF09A6C6AB3C44ABADB4306631\ 7CBA83888FCE81A5AF3AA43FBE9EC69CB44B61D5:\ 12F3F5A8B6759F29F1AE80CE3A6ABE73802CD1A723E80F83867AC2DE7B430272\ E6F105E530482D114D1D6E9117D821629DCCA11047CA4C187638F3A9BA8E513A\ 1634A7F740F8EE889FBA8E6E2FFEB7830619C882585E6D8083076E0418C011B0\ 95A7CA3D2BA84E224B6C993C6FBAB9585135EAB90B78ECF282AC463832AC2CE6\ 23659806217D7B490C234EA58DAD352D5AEB3C84F5F33C7BF9435F684A128CE0\ F2456FB01AA7527787EAD3040CDC2607C16103F4E5A535B0C9A63DBDE4309C32\ AD4A8EFD1B8270A8152DEC0CD3892F2225062558:\ 2E5B70B7269AB9586BF23E8BAE7E9E0BC063957008D46F0A:\ 943BDEA705D18073 6AEF7368204C0B8BF4C7F9D1FBF33CC7E559A0BEFD6B74D08ECDC5BED0A62970\ E32E011B38EC1BE7A691B877BDE9ABD4A35E5863DE39220635B0C856C87D7CB5\ C0A6328F27A573F07EFFEFB52A1124F45052DA579805D00D71049B396F445353\ 95D6AA92558CF12CB77DBD1302D9F75A868BC528E9AA0EFE897B01B94FFB29D3\ 084AC4957E64ECE3D1949BD04CB328B01845D046C289B144F5D42B4746915C13\ 8A859FF6930ED05AB9AD195758B3D35FEDB0655377DD1271F45DD4C0897501BB\ 50BD815FF6B9705E93625CD8CCCFD566C34ADFD11DEB5964:\ 75EA8AE76211A99049C39F35780C797221C41F662A988D53D07B4BCC058B841C\ B2B259204F5CDF9B8110064B87E8236CAE4657F22DDCA568FCE3B1D81E14BC12\ D1D445B22D4E50B90F71E5500F111F20AF05DB126CCE0BD4613ACCBB180C0EBE\ 16A04354DBDA0E796FCDA0F1BBCBD505281B93E836A1B7505A210EACCCBE6FC3\ 5D0014007CEC5A6F0CD664E7BFEAD74C01D6B3B88B86B2799D8E27B41B1B6C10\ 0890F47851F0F9C8F2808F76CDB20570A9F4FE1BD92725FEC28DF54146A9CE81\ 42FD0D8BEA470F52750A0937AFD4993A3D872D65EA84F4DF:\ 092B81DB2BD6AC885D46310109E1D53AFFAEA6AC59F0AA66:\ 1713E9C1DC895CA9 8580313684E3AD8BA9A1F091AFBE7F2170C6B61556646F395A2D4A182920BA82\ BB9B9334367B81BD5CAE18A279BD55B7F5B639F28FC5CB613C44CB459435C583\ A5B6EA105E34C6233BAFBF55A2D25D19C1589F9F1B3D254721BA872F5763494D\ FE47F73EB4088B23221C489D52B0CBEFA53DCF74D46948455F373A95F0CDB3A4\ 2B2D37BE00C4CAE1C3E0A9206997E6BA6DD03CE7F76CCB30A1B6C10BF1251DC1\ 5C8FAE513B4430BBC39A7202983A857C205C84B872300820036795ABCB443774\ F89588910BEF0E5808890831D9613D75E11A653DA91EC66964C56457:\ 07051E15F921E7D97F48C3BA31B5329E8410E45E36634463406C8E6BD36F35D6\ 27D0FBBCDAEE49E803625B25BD529AE208E8175EFD101D5826DF8D8A14879A3D\ D7BF8C1CFCB73F1037447ADED05A71D9B1B077ACCA26BF18B894171C6BA58D9C\ 6608974A1648F9B967908D25DF1F0D93FBF4BE99E81302B7A871CAA59ADBFB26\ 68C0B5828468F7A208AD5538810C31CB2E131E18D008ECF8F596EABEF5160DD3\ 96AF5761A765C05D3C8C11096FCFF5BA27BEA42A17EE451FA75E2B7EC1F9D299\ 2E5AF048AE3104D6B70E2CB5FE818BF4C5F1C62233D13CA678CEDC23:\ F73F51FFF788A91B32A016648E9086748E6B75180E1D39E9:\ BEBA357FC01A0163 B4F95F247179350D3E1519771561421F8D6C8F54F54D51FA68D06270FE0AA124\ E6206546F08490FDA3CDAA366167A2507FA834907BA3BF569D30EF793232D5A2\ 7559C8847D3B44EFE20B80A14C2421F7FE110D34FDD456885B7C1DE7CE170510\ 191819FCC7368598A97D0145F674DD172D965A90C3B52694292990B57F32ED0C\ E7F9CEE9F9F14FC529678E3804821D611DC811BE618FC844037FB2EF1501F591\ D5CB5F4ACE37F400D0F81BE9809E20FED067200FFB4666E40C5EBF53F779DFF5\ 4E8B89FB23D13907930F7D6DC7756512CD9981ABD64A5E3D3CA1B65090204607:\ 7DA67C7CCAFD319A38C9013018749BCC4F24C89688476DE6233444D9FE8B0AB9\ DE4EC7836945314551D95D6CC6B45CDD69233C7B96377C4DFCAFA28F93C2271D\ D79E5822A3B37BC608D6A8A63754BC0415C487D4A90500FA262683980543983B\ A345DC7C67034E412D1C90522F88D84B088DF3CC2D3FE06CCE15EA905024ABA8\ 166E1A915F70B1796EB1C091041D31A4C870AC18F2D181701CE4BF6B838A2485\ 33475FD52120025484DC4BD92E43DA4B576EF0F12760FFD6C566996F27962FB0\ 443F20216039EB57845A5483C1B73A9D2E344928FB58E18932748F2BCBD62014:\ 8561DD8C43E15F404B4E48974A581FD9C533947F0434D8A8:\ C5703CC501187E82 2621B208787D71EFC115DDBBC1594CB99F7F85EB4D853D78D1085590C9B0E2DF\ 4917B94C7CF171F839F0BFBF68A1C1B9ED073B650F1784576ED5A42368FD3705\ B72D4A9EE3B2128ED2698626881A93599C981FCA80242569F15D3DEF06D6507B\ ECDAB0193301739EE573570AB0C4BE887D69273D7691BD44D2401EAA90AE6666\ D526D9BA785847C25FF6C91D3EE3A1AED72E08119AEB41F1EAA202BCC81BB0A4\ 9153BFB290E7071E03A1F1670029556AC62201EBE063A9EADA1FE08B60BD90DD\ 3C8F6D6934634BD39202BDA3DB7A0DB496643CAC964B20B76B6DD6B2F4098406\ 6328A67C:\ 10909490510DA488F96575A0315FBF02F01647F5FDC8A805AC05FF6139F4E102\ C52642A55EF11307B17A2C83E528F943526D2A8B9E59AB2ED47A250169AD7D35\ C64C29F5296C7A7C81B6A8825BC0EB4D983003B125C8729098CF3A68F1B02F00\ DCCEF3A86EE88CA312213AEC4B0DC012D86D89C48118A300F29338CF5AD3ECD2\ 3157F6C7B46B51CFCD7E845B016CAE7EE671A736D680D5EC06C68CE6B3855E75\ A1038C8A425A833B11D544732AF14043A14352D202F3F5C9DCDF0C45E29CFD03\ FA569A8FD01BA411FB3BDDEC28AD19EBF66B3E2B513AB21E915CAA6C6FDFCE80\ CE79DA30:\ 52A58D8795CAD4BDD915B1FDF917698154D11F94B8E0C01D:\ CDBD875DD5066730 8BD4EECE9E921E4B11B72AE59C51C60C541262274F08E9CA850C21BFDBEF5190\ A69E177B23B180A6C64EF704AF486C93196A6DBCD892F9A436DB0FFE4687C3EE\ 82E6CF38E105A7BF07F99E9F016A25E937E2FDCC085CEF7642DF7F1785188715\ 9575531B7ABE751B3FFFE35E627F4A86E7A263A5A41D4938839D31C82C50E171\ 9446B85D3FB56C6E6E5F9789548D8469ED2697363C56C8FD24BC0C7268853699\ D570913AC858F6F1CAFD84C0A39FDCAF2FDD7AB6E4AF92D2E37F6F85DEDAB8A3\ 433C3E6062F20A738C8517D256167CBD40A0AC3DE23C29E98E0D1862DDA52E71\ DF88C0DF1C0340FE:\ 8FACA5517EF40BC3FA2A6A7AFF133CD23810B253C1E455FF8127460569A7F903\ 39E6FA5D3DED80D956638E7CB0EB13D550CC25F369C2DCA686A455A2F7BCCD97\ 249A4DD908D9F4AC8AE06FADAFC52E76E6D603F023E8BC3BFD5BB00E585B79E7\ CEFDA9B747133001B710ACC9EA8B879439D8B13EB7C381BB80A031E95CB5727A\ 62ABC4ACBBE7881DB2782F7155236595EBAB7659B1FA6756A097C0F0AA447C82\ E3350515C02FD25FB214AE7029422A26DA4D10BFAF8B48CB522C68C90489F659\ 72A21570C23E60ED9ED5330661BE68C0AEC3E6686E2D68500EFD83B32EE2CFE0\ E03E522849079D42:\ BCC08F969399E4AE6BC44F7F33145B1B0C2321D577A75CFF:\ EA02AE6ADC349324 5565DECD079BBE370E3C1EDA1486C027E58E50BC8F2BA314E247CCCE3E99AF32\ 0EC1D66F3E40418C2739252D97D09A89090DF9166E1C49EE0CB963DBE8689F49\ BA75E034950D76552F349F7AC7670352A14DF520FAED9F02AEFD74E87B8F912C\ 40110B9D0ED55354235D628B99DCF7482E049BA0B5985031A61B973652ED28E5\ 3A73AF6CBFE87F4BC43A896DB8CA0A59E6E42CBBE07C42676C09DA89962CE405\ 324832CFF103B5C78848535923562B903867D7D95E076EA1F93EE55E0C36DC90\ E9206A2AC1B56B4D66F37024BCDDBD01FA795D6E307D1998C624D4AA00E1574B\ 78A5556E8A586E8DE9585B9E:\ 424373A6EF41676A850D1836DF76735EBAFF03C57750EE74D61BC78464BD9B82\ C7EAD992702C6AD9773156120C5B8BAE57353A4D49466ED8920E4C6DC45C47D7\ 08C5E264C64683B3472F2C45AE7AAEB423ED3F00189B382716C5E79EF2066CD4\ C10AC071DC354C2E63728D80EE43350C4AFD42881B0F5D98685CEA6B20118EC5\ 86C0B79482BB84340B53F8E4B1CC141EFE6211EF6CD75ACD251E7BBA1BC1F53E\ 50C5C0060038613D262C4E0C4052987137562011510E03247A772CB95490391D\ 24AF3276EB3D741A8A6CE10C555F4D5D0D9566CEB69F7FC77BA15E65FE309864\ 2EB7E5BF071EF554B5958C19:\ 32F0B4E2C8FFBCCB7755AA909E46485E6B78446829FA26B4:\ CB2004E37500BEEA 42D274AAAAAFCCC109C78854F36861CD07A9B0E827188FE94F4CBA603B544A09\ C8CE0E9B30C9FEFCB8079D10F027288D1D72C8022EEBB4CED8C5BE8E00252B01\ AE9EA2C5F52725B5F22430335279C443963DBBE59FD5356665DA34F182E24AF6\ 1651BF78D823CD35DA526AA6D56344CB71961843CC12D1308BEE06C29D286591\ C6A9EC564D625443C224B647ABE3EF97AA95E56BF40D432C79A96EF57E9A3A91\ E7A706D50C9E9DBDCD98259318EC208D6F78E4090D0B8C564CFCD115C0306EE2\ 8B146D9A4DF1882B9F871FF525D3B9C3CFEA5FD31301BC35BCAEA31BD4FD15B4\ 446E92ACD7247BC5D546A4C0FC9C1514:\ BEA9C3D615055504C15FFE50B4A25CA57955958A7F498D32AABA4A88E1B1EBD6\ 08455126A77C59937EB0D0CB10EE92D9607CBE85B5F3F419281D984DAF3AC3D2\ 3DEC8864FD7663261CF40CD7504C02EBD10CB194EBB6C9672C1C3D01C85A5B0D\ F43431BACCAC3CEFDC275C388F32C393423B0DAA3EE9C76D48EDAA932B86D9D6\ BC2BE5508D96F31E7775027E227A4A40314C4D6D096BA8C1FF8EF88EA96184DA\ 0E2C8B070BD846E89EBE92851EE18439BECE1349EEC82054EB452B6DDA35834D\ B0C3390A28B071011A10D730887F6CD847C0ED613E5A217E1F290AE0E015CB92\ 6C59576337975DD63C423A91B6407FF7:\ 82A6EF12BAFD7699D461AF7338CE13E3752BCD601E00E6DA:\ 47555233CBB27325 FB8858FF168E5ED4B497EE55F9CCEDE93F749155B4158DB4A18574E5DE00C516\ DC892F012D045DC5AEE72633A95B2B94101519E0DB99BDEBFF448167DAC475D4\ 00567EEA27562042D3A111FAF1FB5D3A6FD6BC0F29FF85D23AA959A4F0DAAC05\ A8D2CF00D29733711EB524EA58C0E0566BA6ABB8BB5AB873F843EFF5AA5AFAB4\ 9A31235980E97641EB508B50BC99F0250A018420ABBA39CE95E8E2846B7AE7E1\ E1CFBE690581D2DEBCE4E51148585BAC6F66D65E3E2C10B84F904F92AA823158\ 08C8F05EF0FA961EB6AEE6EC898E6559FB32DC99A8E5770B0F891DB8297989E2\ CC7DBE703A536292677E41CF7F0420E3FDB18B28:\ 03E094A8CA5A895C73EE8E2EE30C90C2B0A10D3D9E67432AD2E91ECDE41C7726\ 71171FD84D6B6D660A9EFAEC2C9353FD511D9C2A932A6C8AB4DF0434A950682C\ CCEBEEE6D874425E0F0287F6872D1DCB8311394AB6F6190065B7D68F0B3F65E0\ D1EC4395E531B5B5789E37D7AA8CF6B3E41054B85B9FBAB74E0FBE556665A16A\ 4DC3C9775BBF3602378AE6D53A3DA5E6B0A7B399A394AD8D5748BFBD02CFDC4D\ 869ACE9B4B2571CB6E4A01A813E126370919130B4D844FDCC2A32C1895C4687B\ D1B1DE69C48DF14CFBCC78DF6B49A67D25025204BD2EB2C92AE07542FF64E075\ D22BBB1A7F1A815DD954A9C5F6D8AA511C9F00E3:\ 7E1FF62F578C880405AE520FA53BA2F0105C2132B6AFB167:\ 3FFCB4B540A3CFF3 BA5E4EBDFCD93ABE7030828501D28875DEE6CD0E2DCEEFF2EBE54579FDE16878\ 195C7FAACAE794E6C3089AA92954290D65F329C1511DB2B95F07607076249259\ 35044B9107B681F564D3DB09477B5B75A421842B88223B2CB7F7DFDE9B40C029\ B40D136452DBA02AF1D9447DDACE19C3D427B007F0A737746E6A122C5DA8CC88\ 49BA80841087C4E27FA3771C71AA8F4FB3281835B8ADEE0965676567D9BEEEAC\ 0C3E2B7E844414A0988BFC27B682C1A3D8214C37759C4D8E793E9A275CBFB6D8\ 534536DA22AE947F696AF989A4F1D5202762F2F4CA2BEE376342E041A9B233CB\ 3B7B4749A79B38F822D9C51E6572F8D1AD5C59B8A635A06D:\ 0E78CC6E7508507EF8D3420589DC844A88E34F4F68591E806499197E6C0CD398\ 0F4ED5AC4B82F85720782558D85E704E5D726BC5BB746CE096B1E080C31F0D70\ FBE9BE28BB8C7AA5BC6A460A5C7F6E86D7BA4F307CF5F7B9F1E9A4C1945A9CF3\ 4F8DAEF8CAB0E52767C866784E7B944D41292A708290ED75B7EEDD5AF68113DD\ 2B7AAC39DAFB865A8B5800DA465F70D527E417E0D13A9A8A7DBBFA83D9FBEA23\ 7B518C604E73C4C5C34C1FE79E230C71133FE97EEB723E333E8D4272F973CDF4\ 0C361CCCB45D4803189CA3610B00F422C847E512CAFBFBFEB81912649A926494\ 6B748395CB6E96A79FF195D8520B2E60FB07AB5A5DC58D8D:\ 832F6080CEE1BEC955AADD3C785D1BFA311F2967EED12EDB:\ C034E1AD1B590649 6A1275FBC6098126FE0D33265FCF81A0485776A0967763FF22B12231B34398D6\ 28D5AEA33BB989BAAF759BE8A07103FAACD7D68A7719E23295AA67B940285400\ 833D7E322D5A6F9350F2B289F67C25B86138CF29A2BEA8F5020D0087B02CD42F\ BA68AD34A7C0908608A64F4B5F4A7EAEDECAE68D260AB92D172CD95FB7462631\ 57DD1679BFEC2741D5664BD8A80A1C95EDC6D9E35B040C7A38EE1D06B9BDA80C\ FF8CE8555413DD1B40E377EBF76150F223CDEA9E74F2AC07CDC6E0426CAB2DB8\ 13C6014D4296F86ACC0C07734F55E4A5DEBB510C47B4C019D5E59960A7B3D5B8\ 7257839AA29E6AE1F9558FF072F2FE6D8FF672525BF2BC056B206C1D:\ 6651BD59D1DDCDFF52EA95DAFFCE663758BC46571E0CC3F2CA83986FBC2CDD79\ 45A1D0284AF73D371EAEF53C5A405A9944267F3DA755BF053EB94518ADE628E8\ CA10A936FD747E64C48A83C40FEDEDDC5959735E031B41FF4422BA64EC906F14\ 256673CF4520AE76F10D910DAD129C270392471FFDB1CE601C53E9C032BAE528\ F68BE2A553BBA36EF555D4A8D6D7F8F43EDD91AF6AEC19DB3FB8FA1F33701D67\ 82138F9D5F7FBC9170F50BD02AB0DE07A29B4A9C3CB2981DC251E5933C17942D\ 394DAD2784B7AEA3F0FF46D59DD919C7C2BB3D3D1B3CB541920F9624EDBECFA2\ 414B3E6A6EF69F83F20628C914F373E5D5AC68ABEA3E2AA8A5CF9D2D:\ 8B0E057E6B9953488C98A8292C7F87E0ECD574376C416AE2:\ 994DEE000EFC0A43 234D9E59F8C211DA83A8145EB1887725530805EEB27D19D77BCC951E6F8035A5\ 452C290ECF72C5E69E030824D0F1A2670A817B0B6C966A10261A64A6383571E8\ BAC63BA9CB4D880A27C583BFAFF3FC5D373E0F0BDCB8E398F99021DD86F7FA92\ DB3D4830F6A29DC7C52C1556AAC457FBB679EC2D8321DBEEEFAB900D7E02DA7A\ 2957F18D87DA97B683696CB6E3A3CDD12A5ABD32639DA7B1788349C98A05170C\ ADE1957DD983BB109BDE21549A3C0EC290807DA2917A79D143B9F1C98C4D3F6D\ 57E38D03F3B2473EB15F5F318E30C33F67B0DF4F1C79F56CA1D52E2D77752C25\ 9F47E219F63151DA18A55DA0388653104DCCA9FE04B949A57FFCBBED59AE121C:\ 3A89A8A7DA09A31F0F6D222C293338527AEF97944C7862AC1001B2E26DD82860\ 8662E6AA71B3F24337C1233ACB49D633FD743D2B16ED5C429D4D0087DE42E6BA\ 949DDDB4BA562BA277D951936F7AA9CECDD02261E5F36043EAF97511B65867E9\ 65B2A5B2E8AF4DB5629C0B5E5F869DDA458E20A3DB4D34A4CE1B1642C791407D\ 83E3EA46DF87B5680F06CC1A0F97627163A54A6010A60F37E93A9A3EE9D97BCD\ 9561DDD12CAE952480ED2C4180E051652DDB00FEE1053F3E0B822D77DFB2D347\ 9197E0E8353A3C4EB4E21B594EC86A8758ED48B24BB2E1114EA64C5F2C001030\ 707A9896045EF2B48F8127EEBE2B76A32D698E39CB069C67B971C6BE57678CDB:\ 51F37FA4348F5FC1BD179FA259358A009E608B35AB363DA3:\ 2C5CC0EC6434D1E3 AC691B1AE64C871A70F6436E4E65CE0E10A692ED41B5FB07D35540C7E2D0CA6B\ 7DC54026782D70AAF08916CD340C5140DDA2E27F0CB93F804D15470B17C62E0C\ 5CDA2091C5706DEDF94F720EA7F76370F2EED8830C657B07766689750D30D0DC\ AD8EFCADEA596113233FD328B0053A10486F13F3F2644386D4B177BBC70815E8\ D2F847EAFDDD2ED9FE418231597C958E53DDF0B1EF8E801654CA95303CCD0ABA\ 7FB4DB4B34B199B7DB2F0727C89194F321353F842FC6AC5AD2F6ED982CE27FD8\ 5F8553265345BBFE00D316D7B6237010A93D1967D02C4391C1A10BCE8FDC45B3\ 2AEAA4A61BF99C6C3EEC6C7DC1E82B274A97F47513BB55C7604992F0FC211551\ 9D02162F:\ FDA6F4772BD2BFCFFAC7CADCA4002590E2985E00C3AEAB56F76B4A3DFAC43926\ 7C22792D6DC8E05DCB7D2D79C553BB7BECBD330F4AA4DA20C26E1C173A6A931A\ F7E98E4E9ABADA91FE3C4ED1E718A85283C47A289779B911E9A806499634C7BA\ B246DE4F09EB3616C1C7D2C8B7498B2E57EA7500CC538FAB913F655C23ACC9A4\ BDEBB2125113E4FA3A9B1B3A607AFABA5A6043487FE6681152BAB584157B282B\ 2293CC80CCB8DA5F8593016EEFDF77784A516569768368A94EAA9E6163CFE457\ 59C09173449013EA16CA4D4359AC9A383EF8A3A05FBA28F3A6C45F0F6BCC384F\ FCA5D5FD83EC79E528AE29B0BEB5B32D7B6596FC092B141C831EDF5D41CA586E\ 8C952243:\ CA7536E20BDE645FEA57A3BBEC79B7D744AF652A55998114:\ 5CB81DE076CD674D 1C640B4A7984BDEA3F5F750C5F36EF29BE31864683A8773B4F7DEA9F892483F0\ 3C56426F2772EC33CBB90D2BADD731DF6CE09EE74578A4BE2D3E07FD2B71836C\ 82AC48B02465AC8EE4BB783DF66640C51D145FE7C297ECCD40BE49170F910BD3\ BB0DE70DA38F71C53EFF59237A7337AF6B22CCE4C724C8BCC3891394F29D9446\ 144D1A26ABF6E04983C99653FD2B698AF15647F8F94304809BEAEA3A05381A35\ 994D5815B404D9F8CD10C7EE62BE99FC29E06F6D07851CD34964503BBB6169B9\ 1EF8AC411FA56B528C1C5D269884457998C4A6000525D7AE70D4426095037946\ 45C8AEA41BC793933836CA570CF75D9A5E9138B6907BCBE07C88D4C1BB1F588D\ 186BDFBC8D96D6F6:\ E369F46021B17D34E30623D14F78526C89F54AAA7017447A7AE2BCD478C425D3\ F54983E9FB0963F8AFA3673C3F2DB38B3AD8D0F73174AB9F649B3FDEB40AD561\ 74F289A7DABF99F976CEDFE11EA6B8B12F239DEB2DBBB8E829C9E8491C49D6A0\ EF12AA0404A7957E8F67887BED1A559BA3DFB8ED758AA938F9AE86082D2CB769\ 02372455C129589B1ABDAFCC11C6E37E85F41BB5A1B5E7FAAB0653A6C370EF04\ 13AB4123061EA984F804AE41121D89C9E206B4D5836A8B145A599C0AE79A61F6\ 5CC01C8FEAC1D33A2D703AFD4D5F0E5B1634DE35BB79A0588A30BA04287C0DCF\ 8AD9E81891A70DA0970DD21DFABD2FEEE3D2EF6CF66B3FA87B0B10C6B92950C1\ 4733F5407540B52D:\ AE1AC30A6AF3371429672219CC6D777FDDE1C1285446D5D7:\ CA8B1934A27AA9FB 43544DFA22889BE0247AC5A56049E26E7F606004B8D4BA3111A94FAD81F7B3FE\ 93D231CD1CE7658A26230C76F6CFD8CDAFFEA88ABB7264427CF63A3A3C4A9A6B\ 01FA3D56EE3F618A18CB4BA88A311B30EA55C2CEA8AD8DB65D564D5F5A58D9E4\ 12E82525E4185B5B4170172EA69B1C573C9F6A8156849BF2452DF82301E3DCE6\ EF4DD2642968FC418D97FB04E25818C41EDA3D23DE5F91329A9819D88B3EB2CC\ 8037BC45C0D77F30E8248F946438FA9709A995E2EFAB9DA0F614E04ECE2A76A2\ AD5991557630E2C1C04E1816CD08683B16C9564257C28FCF81D24341BC9C4443\ 090D43E98558FDA5850F1F76A1D150BD5F7284B55A971DDB2E934B05523600DE\ 7070EE002C3F4F34CBE5BEFE:\ 9A8E2F26D5E0ACCA216FF6BE29CCFF21D126717ACFE5796E72639AEE4856D043\ A232F971970558D8606BBE267EC0CCBB584CA96792E01B522F51B4F0A3ECD77F\ 44B063407BEBC74B9A920743E2BC7D93AB3DB84DC20044F699E776D58A01F787\ 76F03F0C5A0F0F8878B6A32823D0E332AA030F64852BCE48A5509F2E37D86665\ 1BEADF1BED4DA0A0B02A3CFFF9C36F6F59256DD467335A60E9484220A2771DA2\ 29D23E12B5FDC2595BFDAD34F0B8DA138D69D820A6E1DAFBF89CF37E82D7008B\ 28D233801F3ACCE6F53CFE75AAB257AB707CDC9B6643CD4A2905A9454ADE457C\ 92D168B818D332FE749FBA4DF9A787A410C6E9F50B02F070786EDD812EF03058\ F95BB542DCB16770BDE5B0BC:\ 621707897A8FF24C3E8E3C6DC8E7F06E7C9147F5FF6B05FD:\ F5BFA58BFD2717D1 615D2D36A997D95EA3195335368D4E7E00324C9A6158C06E58730740E0818F2A\ 2FFE0B9A383754E22EDE3CBBFB7834F387CAC353C83A943104EF15254A468E55\ 140FD516EF90AE2707288D6F898638EE0103E6014EC6379D4829BB949EA2FAEB\ 498F0B67A06CF6BF7CDC46CD6ED7B10F2A18339568B7D66484EF669619782E2C\ F8ADE1181CE2356942CD36758E44D11E9E2DDD54B16EEEB7FFEE6A18D46AE6BB\ A1433D5B30EBAC173C028E8861E27249D764330FFC694BCE053DE44EF98D2BC2\ 7FB04676AEFA2FCEA016B37CB5F128063CA60BF40939F688B2796D01255C78EF\ 96506EBC1E7DE11AE466A8D2EBB135400A16A5C5D7DB80690D2636C0C912ADB9\ 8C27C65C8E59DA432FCFF17B013CCFF7:\ F73A0035289E85D72C8D977E4EFAB3998F19F2B63B89E9FCAF26E7EA7733158F\ 931099AEC9539DD337EEE372597A61E4ECBFE61DEB55B5005E90B33D743801CB\ 1F1B5C99169DBDE75F8FF22410B6A2EF0EB097C79A3FB7ADD583D72D2C61800A\ B2DD2632AB14A006CFC3F259ED96604DAB8FA77BA56E9569A839A6B0E58EF576\ C46DF43A09704650FF9530A8E4D092DF1801B6E82F969E5E67F4EF03AE22D3C1\ 5C91756A465B7C636B51D175DC6A2DCD87715F78CBBDF7E22CE3652929860E94\ A6B6EBB6D9188E15A13D3CDF3A5971F347A687481D68FAB9B6ADBCA4FD3BE8AA\ B0D8399C2549AD6DA76917D49CB4BEBA4D12B6B5201272993D2164251E02B093\ 706C280A6C90E843C2F1754404A47373:\ 7D5C37E1A2450913AE41090DFA935AFFD4CA2FDEAFB49436:\ B7BF5E2C46E32068 4BAFAB7E53594A75E17DA9B26F9602B1B2074E23C688D3EC32C345074BF3213D\ F7B1D2F2639823C1FE8DA4DEB631E13DC2230CB9A39FD1A37F088A7DD154C664\ 28A0A16F0D833AF3F16F5A8A5154DB8047CE9E011C71D785AB755BACBD33CDCA\ CD8B0708F2BC362BAFE5254640F9EE08C3F6C8992EBFE34B802374A34E97C9EB\ 9C5FEAEED35DC5E0EDA01DD818DB69BAA6D59AE8A9DA52E5A050EB9B6EA766A4\ 65AF2438DAD5587D10E414CCB59F6BBDE7E677A85920962B48C575DF4D89A820\ AB8B02DB4042667FBA2861A495EFA045235E994650D286EC5ACF753608FB2410\ 158F5AE557A98501E94CE74987144536F5CA787AC064D8746B561E2185147AA1\ 84C376C69250CC12CFBAA2659E3D14DA0403F8C0:\ 9433395CA8E804CD7A181025AFCF050D5EE235E66493EE5AF8E88ADDFCED5651\ A7A9430D2457C98B162E0C76EE05EA2FCCAFE2C1B3438640B564501408F6FAFC\ 4F6B995465052CB7FB108F6F94A088D648659BE9363EFDEB16FAF59E2AB6D47B\ 4272384651614B82A292C8A9512A144162E8F7814980F82845661C0C3CC88373\ 3B54C9A8A87A026C315F74A8419342C1DFF246128418FCDACC6C2EFB286DE745\ 0B8BB1B992563A5C9120A1FC70425CF48C7012CC282E3B81289EF335C628A46E\ 4D7FFC0E326462881DFC7D08B44D0061DAF58FED53D4FEB9FC899D34BCBDE304\ 2454981FDD354F159E98CBF530809B5B46C81A6F866142280610DFB21CC9791C\ 39095E8A7ACA7557C40A340C87B35E8D00DB4E41:\ 87B28DD21E1726A0AC57A9F243B232E3A46C6D064CA39253:\ 9D36D9BC1DBD0EC1 F6EA75879B0600B62F1300799896F7B424A4E2ACDCD8FE5EFEE417C773C9B09A\ 648F010F9CC695A3342715C6568C0AB6853FCDE462645C2D549BCD36673DA23E\ 8CBDF5AA302E10AE04A1C354B619D72993F0640D828AF8D04CBBB68B1325C1CC\ 28627EFC445DFB98E2D199CD250759AAD254B161AF3862F57D4457397E9D1E04\ 1E8EB5539360EE8FDBF73AB99C8294A6C6D09A663B4D86A63741AB55069C55CA\ 9D161561D7F97118455D4FE71EFF91017C50A1B2F8175A8D09CC6C3E4B51C5BF\ 2C49EAB03D9D2C01D36C5B507BD17054091C12B0E4C89A273478F6849DD16FDA\ A06E2F54F615C64B0BAB4EF8A1C93DEA8BC43E0555D043BD79422450AAA64CCE\ F24916C8687DC6B65901E58CD3A8F4F18CDF72D0BDEE7420:\ D15BF53D4D44F0A18B70D12BE3C4A6DED44DB06F553740DBC07B327C28C24075\ 60DD7C913F5D73E582885786E4B454ADC40C156F75B7146B8A618A9BE43D6CE2\ 05126D72880E582F8384CCB928DDB371403F307108F3EF6DE85CAF538FAB2163\ 62409F99DCDCEF7A0CA8E1D9662240C193DE430EED6B5B15B8D3C2A90BB799C7\ D37C7445C3994F727E438C9ACEEBE89D2F1449D0E83DB2523C063FA903F8A115\ 8FDC7CDD21D899A6C01B18A8D1E1E749A9E09F49BA5331914993B87FCBDBB43A\ DD276789952B520EB6052DEDEBD3D91A22437365FF12A46FE9822AEFED416AC4\ 15BAD2C0848A11628D14794FBC83D1007F0E23449820290FD81DB2896EA62309\ 4B8F9B1F1E903279CFE34AAFB287573574CF65C19EE5B709:\ E84CA677BB9563FC2965F57DF2F0D9B78FBAE62EAAF71224:\ 5F5077413611A4C7 1225D5D4FD1F49FF2239D496FF327DA3E2C528703414099FD1400A024608DE7B\ 78FCBB9741BE38101AAB6388E54100653AE15FEC668FBE9F9BBFB39C72484CF8\ BA23151A6DC4FAAFB627F35CE91F1B2BE9F3B1E1DFF258C0CBBAC425F13A5606\ 7C0CCC297FA6BEA5B97272C716099E9784133732BC359F67A2BCE94E62C7A21D\ CB03EFBD1B387A3D94CA245973ED31BB2EBE771F11D69BEF0C241AD339F7D719\ B892D37597EE729830602FE685C9C55D8420CB3F4B6DB04BA14D5DAA6E979C0C\ 113270ABA4601B8B66B3C8FCC3D09FBA846FDB22F1827EB27EB65BECEFCC5E48\ B75FC4023CA0934F71406633C0EDE28D644472A1EC3C218C081752F41F1FF796\ 57C513AE4694522B83B5C5D0E3F4F22A237654EBC5B64C1A032DE611:\ 93E4C7F2BDB46F448FA1C987D10DE2CFEC3B48BE384AA4931F05759A3F43FA7C\ 09930585F0D113273B2B0FC1350AB9615B852C2598F190108D6D2073E1009D92\ 30B0EDDD2AC6812E2EB3939969727FADE44763A83A585416CC2A3357BCBE8D7C\ 4285CD1A3C237B6EB2A31C73CF7B1C935FF9EC27D6DBFFE2D7D3DDB19F11678A\ EA84A13FA19CB2A574FA324A841709A171F0AE6D1C661089EE817043A56295F7\ 34E69BB7AB06684896C308EDCA833B61A1E60C39CDB3E69955FF29F350CD6330\ 6FFF655AB0F842ACAD1480808E66F8EA32E722E325689D14F9F5D6A1370D1659\ D54ECFC326647F5F860C9CEE7CA1E9D888C5B99786278755164B104F74BFE3AB\ 408683EDD67C5A9C6A0DD8266EBEBF4A249867DD3C9EB51FB2CAB9B2:\ 6532565097C11A19DABBE33579B118B3CDFCFC57AC9EF78C:\ 261FF08A8A234373 FCBF1E7B10B708FB50FEA0C3CDD48C283F47524160068710A1A13742221353B7\ BE18919379C0D55464372643E16A0E6C0FB02159E627792F0BFB2DB290A99015\ 7006EED144F382E693C8C3B170E7FE2B19F9F79ECDC604427A45BD472D897798\ 3294DD36D081427D046AFDD637592CA150A9E0139CE6D3560BEE9853BCC96A1D\ D8C7F194E59312EFA76895EB110417837D95417A636222BE47DD1D2DCDD13199\ 2D734BD3E67BCD7E6DCEC606060D9F8E264AE12C047F3339BCA9B44108D469B2\ 2F44DADCA49247EC2FA1C76C396737E40149AA535A1E7C05FCB1B8181D5AE8BC\ DA411F616B307B19ABAFB36643322A803B1B46A477D0D1048625369CAC798BDC\ 937F8E726D59C635447B667F125E26303AFCB7DC0370160E6152E514EBFF9020:\ 63A887E0D27501AFBEE5A1ADC4DCA5443F9E4AFE1466D71666CB28A22F1D4CA0\ 913AAB49C08378CD41E89035FF15E4150992528AC15300E92C1F73CF6333AE3F\ 17898DDF031712F6A0CFA2147D435AA3A69496DB67FC1789C601AF00C16A025C\ 93F64F1EB7CED97D4E22079CD1A422E3212B55A8687D191C295FAB74DEE44A00\ 10AC51E167F080B4C0E1DDC6A26103FE61F02EB3F62BE3DEA3D9A056E46CB18F\ 154AB72DC93A9FA16C1372FDDC1CBF7850EB671440E1BC6B065B897ACEA27B15\ 0A26D135F0152EA998AB004B16E543C2E401B8C8F39F4089911D84E1D232D4FF\ 8E2614F0FADD57F8EA4B0AC90EBC7564A604128227B64BC534BE39B474056D88\ 46D24604172AD1FAB6AECA830B74DAE1FC6FCF931AC3F95E9C1FF325D6B65AFF:\ 4BDB2B06847394FCD4EB83F67D41F06B0F111956FF1244E7:\ BA6E8680024B3FC2 3DECC0B1CED05031E8FD762217792EECCAAB16D2633BC19F54C8B61AF8EE9172\ 7F8E74D1AF880A72637326E1D78D85C72D8150864D04413FF83D7A2B0E3EF7CB\ D9568D25E3ECCBCA57126EACEE14E35AFF3F052029A2E2570382E7E4219BE8E1\ E30C0656320C3E4B5E4B2191C46E3C5FCE6450B766B258A89B0DC09A95F9E85E\ 1648189A2CDB5A999846E9EC8333782701131046E286D0459192D70279445A2B\ 591CA7D5AD1A95022D2B2627772AF2A6D009B8EB1E2E4E6CDDDE3E85033CBC7E\ B61C6B77011BCB96C93970DC9A921BE397466E21D418DD5A4B3F596244758073\ 0677E3CB4671050B6768470F8F3CD9742E7B9269703B8227F63B37572AF7A60A\ F37F6B3F53F3F3658B06D9B7FC860A294E47480DF9237B53885797C4CF580FC9\ 07BB188C:\ 043AD473EDC7463C7A8864B3E5DE8B0B8FBF700E7E5654BBDA0214B680488D20\ B9F02D931A8DD953A5D22C9477DF8E99F1B55F863D96DD285BE49635364B165F\ 02E3BB45FEF18C8BE5EC665F96A36F4F2CF85AF35E70A6F6EA756398294842C2\ AA9696EE6B7157A47D381E6503B7EDB56754485BEDFAA5F125EA50C2B7EF0024\ EC62D0BEE490C516F1763EFFA23A2772E841540CEED0733C0B6BD66FF2D3E317\ 500BBA4E8DC019EEE025B47E62BB4FA2157A938BFD0F623C85DB379EC731CDDF\ 7E9F924DDFA3E6C5081ED6C6C88BE1FDD62611D66E3E019DF0A9B9671302225D\ F0C5292E7686D82C422079B85676DA81DF752A389A51C2BC2BD177C46E753D8F\ 34FA038F6CFC3CE925C84A0894731DD3D188761B9A0F4112253388214BED7DB8\ 81730614:\ 2B77F833E806D416FB381A09A6D05116AC049FDA023A5E2B:\ 13D0606E5CDAF6F7 7BA7B59BAC0A8C726B383E52F11A995405835ED09DA1EBAA6BB0F208EDBA84F8\ B0C6A2EE46B817B6CE76A06CED89A0B01BD355DF6448735EE9FB73B2C7F8A9F0\ 388908546B539E51A7A06D6C53E5CDA9BF46575B28B92DEBA62685B0B5FCB55E\ 4395EA38CC14070F51EBAA40F67E7F4FD754BC2072FC11AFCC1C3F5159AC9135\ AB07005E77017FF4428F375A0F6EC9E9E1E6BE66DDB4C2BEFD1F4DB489236B3F\ C2AD63165C2599147C021E54010297BC746A4D2933866F963A0C9A81958458F5\ 9E14BA4756B71FAF702B9812C4AD2E5B04490C0EAFEE74CD95F1052FF260BE45\ CEA022A0C0E524A6F2C9CB8054A59702D02606EAFEDB322E001D5251A81BA1CE\ 7B323F6F663A4C079F2E3887604581CAD699E754E5743D0D40B0F24CC3B0924D\ AEB7103FBA938F4D:\ 14A45FFCFCEE25886B7067F1A4FE029AE21E7343CA9DB9242ADEA2B33221A514\ 6096808C4B623F24669D5D65B9BA4BC063920C08E51123D01F6CCB00A42984E1\ CC8A7B408544686E7FC1E79EAA64FFBA12A012DE56C9FADA55F56FE79726D3DD\ DDFE51E1549785F40DB5C2D5F6D2C49F9EC87B13675E2D1C0A6846EA97D8ED65\ FEC59D38EA10FC038AA1BACA09A3998C2DCF2351B5B56AA136064C4FE0644161\ DF09C41564186E2AE3A25095176C0AC163BB28C55181B6AF8396C21004BB0054\ 9161608CE44BCFF29B72C2F22A005E2B7D71213BC8B7417083661CECCB82FB7B\ D615B0D93B40A09ED2830ECBF94ECBD6C25C3289B6A79DF46A164B19767BFDF5\ DAEBADA5C5B9C04B8B288154009D52D21025531FDBE5CCC80CD79BCD0CBA21F9\ 98A05B516C8CE336:\ EDD9BC31C48BA0254D32D297D7BF8E7253CA57041665D5B7:\ A86D049A6B161AD6 3AC25EE64B98F11977CCF9947978F5EB570D35F0CA9DFE2742ECCC7CE11FD09C\ 6E921011EBC965161A0B932650545953168AD660BDCF4F88618060347CB9B411\ 4885EBEB0593B79DC00D358E6088B312D764FBC4A90BC3B31CF5B96EAAE2491F\ DE168941CE3BA9BED3A5448681750FA7CC7294ECCD1CCD6A7C3F4BC106922055\ 933645B8E298ADE83C9697EDB48F2CBBDB42FD70F6CB98B38E1EBC3F72DD77A8\ 4188422A5A3DF5BDC31F59B30BCA323492B4F253C04766C7AC09B64289651584\ 94845B4D3BD13F36C549D030248E7FD19CC102DF2696C403AF58E5DF0854802F\ B1646921BD8F38AE62A594CE32AA0221C521AE4153CA6B0178DFBC0B96F0131B\ B4BAD83CA4199C6A9F30867D036CED549CEF76BE7C62F94F15DA0ABCD28514CD\ DC0D6955E162779BD148339D:\ 46119F1EEE4A5F47BD814261A0C6BD218943EE4DADA6362BFAEEAF4D01FB8D6A\ D8BB2B20C16E2B8E73E495BEBEF3C935E1FF49B00EBBE6F364F38B3AA3E628AD\ 214D95EECC6932DD3916FF8758169091EB1E24226501D94C67FB0C8A69DA693D\ 659A988484BD5BF3E6C41B00840838E5BBDCABD61868A3B2701F7CE9A6BF71DA\ 44CFA116A46B378489F41B3FB4D004C79FB5C21321BB65ED5F9BAE24C5B558B7\ 642D46DD14C2B8C9DD04F68EF91A703C45454B5C12AFCB66E4DE5E649614F09A\ BAA1D3D1D75BBA2AC6871EE1DE4577A37D535653C2D24C6ACF1DF665E297C135\ F70522477649C624E7997BC3ED8B99220E675CC9B1F2CD94979BC9B393E7A186\ 9A6BBA8CF74CE041940566B5200682B19CFD85065EBE6CC64F34DBC92A9E7A44\ 85C81D4C64975E73391AD83B:\ 48AB74AB57DE668C6FD29F1C98B730381E0763913F7E19A6:\ 7277C0208A8BFA09 4C44EBCD81E742D2B08DC7DBCC22411E92F57D9FA9AC3C7EE93C8D176A62FE2F\ C7FAC96B77F98AA3776F7A974B5854F229C778DBAA0F244F5767A42077A7E5A4\ A5BD3BD8A393C379D9C810DA5B6C97CEAA750F638500194499D439BAB2EEAC83\ CE6A51BC1246A4DEA5BEFEF0A90BEA5B818778CC249F68D1507630D2E993BF15\ 4907A5C40F8CB0FD2BF88F5A59F6ADF0F1F5CE9DAA04EA4EBE16F041E321DBC7\ 7ECE9FA6799D097F903BE1B108E153A941CA0C8F1E02CB8130D6BD8C281FF8B3\ D9BA7ECBF10FFE42EC66EC90A12A8A7506A929101E0F952373BCFB3B41ADF70B\ A556D82B190E986AB1A8716161F7E8D33AB449F7E8D898D8F0AE1266437AE290\ B23E36677657102FD6B0C3041F573E19234983202571413ED54B2F2D2610B9BF\ 69240D8CF6040B3ED4026A992FE89CD2:\ 4478B18390CAE6D3E435808A3324BCE26AC469E04D9BD81C9C462DD1CC631EF2\ 5881F29D211EAC5079644721461D55FD70806BE9CF8EDC8E9BE7D9580CAEDAA1\ A03E6B63165575E4898C0A85DD8A12ABD09431A037EDEB6549E6FA92424C76F5\ 035FE5A7AB183A28A212A678C97C53D95080AF4C5170CD454CB11BB5C57C7581\ 394441DD647DE9F24E3962BC1CF9D011FB14515BD452D93BF16297E0931DC007\ 2CF1269E33DC40FEA1FDAF43D33E4B46F009A8E0DC2FFC0E70754CCF3AF4579E\ 1251175D2E29CA7AA9535CB9084EA6651DEDE9918A6F845108B759628F74BF0A\ 3EA029FC3AF80B0A087CE9923CD0B1D181E8661BB55F2D3A8503B5E03FA24595\ 776760C3592796879442B5CC2696633EA8D35566CCBB532B667B2A09BE6A6CC7\ 931364B42712CF6DAE481499702077C0:\ DDF2257D6C7E3735A8656AA5FF8FF253FF3E2D83385492E8:\ 3FEE5005E1B52CF7 8C59975C6947091366941557DE83CBB2CEB8B4E9439B9CD7981676CC209BE56C\ D9D6A37F334E0E83CC2F94AE5041A62328A0400F910815AB90D135F72278C97C\ 2228B8D17574FE907BF9FE1847CCC0E125AD7CDF9361EE9EDE30211077E6F7D2\ 2DF72FC3441DD8E548A3E668F67E7340496E8080B60129F77ACE77B86920E553\ C7630765620A4BE0DDD04DB1D233A61F207BF5BA5F8EE378D48D60F8CCA73742\ 9C7DCCD0AD14B3C27552DEA11682781742B5275D689DC52B80F99D743B1860C2\ D6897F6F32CD203C5D6FAE1EBA0DBD0DBB68EE455B82BA9EE46B0F427CE1356D\ 9581AEEF491373A02073CEBE04B22A97540188C226540F048C49376B1BD2C3CD\ 60D90B27B66907ABE96B9F3BCB324265383BE6F9B4FDA7CC4EA5BB119D2B25BC\ A8B191D0AC899839E95827826AD0F4A9A2C90913:\ 2D4AB476FD236B6561A1A91D2C2A1F57493E1060DAA19F4A633A2857B07FCAD5\ 34443C557AEB8C25AF0B6DAEC2C47BB0F12192C6CCB7A03F99D840403384A879\ 832A97D7557F87328FD58F103EBCE3B826187C3D879B1F3D80CF08F41AED6612\ 7CC9B9784E53F8610364E16A587EBEC13E22ECE24BE3F9F3CBD6095430B381A8\ B62838D439B1D74F9AF503C06375BC7E30D639CBFB4F6175E520FEE2BD2F0470\ DAF914AA94137E90408B48B17FDC69FED073017CCF16C56014F531D343D6A960\ CF09053CAF6FB9E15257D40AA29610CF644830C0CA5671B0836F877AFCD0E06A\ 2A437F299C3CD31837D719E8B370B96BEEEA44547606383B6418A2C8BAE9CA76\ 742E1C5885477B7E718996B3B17D74BFEBB87292518DDBB349209AA7C421E3EB\ 7FE93E9197E671426F8AF63AD7C60829334D962E:\ 182A5086C289C129D13D2DF876858C0B56779A9DF2BCB89C:\ EE531FD00382D1E2 7155EB9E3EFD5AE2DA9B60C2F00364B00C002215AFD91E3BC564D9E436BAE0E5\ EEDF8C93C0F8C72BF35E22A8B9D4700487BE870527CEA56391CC80F2E848C14C\ C24A0FFBE4D743C256064B96DC3451E4F93C1B79081A2501A597509FDA1A2E9D\ C02CCB49F1DC2F0623F3A56972BF3AA21D4EEC2D3072395BDCE99F909B611903\ 188904BF24EAB921E27E061C75C40937EFA66647AA0BBF9A2A8C088F08F497C2\ E2CB9839FDB1B0D68652391418A2CD664718BA93336F5511CFA9504D92CA14A4\ 59FAA90C5FD724BF8F616C6BA695F75B361865154EE6AE0A2C7A801BB051CEC6\ 92B2704212A1DC65423299209A959B1A75758404DB8D889BB6261B444310ED9E\ 11D95C1C0A138272F19AD025995AB8F44729FF6BAE3D025856360C1286DC586E\ 0B64E898A658330E6B18D127DD8E13696DFD750A14EFB724:\ 2E7FAC33AB17984A53797887E665A5040D329732815B9047516DBA272092D7F7\ 07C9659D7AEE0C9487F1A44D2BAE2C1DAD15E3A4D7CA317C9F562739031D50ED\ 6391D67083C15432920D35A66EC7AF77A293B3B83F46E905AE05512864006A9B\ AD7F3A317B9322F0F19492291E88EAD6D494D6A6C6BDFC7719109669E40B542B\ 313B4BE2A65D495C25AB42A034CE10BCDF8567DA3044E9C040B905AD5C6E5FD3\ E7974B420108F839042946A0297B0FEEBCE5173CA8F99E877FBC8CAEFB26BFE0\ 452E997C7B60507B5F18561308770B0559A86C7F789A179C05A78DC5ECD1E702\ 6ACB510AC672D53EF6A077F99AC3D3564EBE697928C156A94C5C4CD59DD5002A\ 8ADA3C81B6190A0CC13F423BD7A494A98C84ADF56748103C4AE0748558AC7F1E\ 0CD0DD29A513102292A900B9E1498DA77E9ED1C65091B6A8:\ 9C0AF3A096ADA3E92633F7BB7B2FF15C94F3EAB3BFFA83B3:\ 53A6552D82EF95DE 5DC9AC7086EBEDDF3AB0FEE8129617831CCB2192EBD42CA4F5196E4CB5506986\ 0D68D4EC183FD284E471CF6E9361445EDA907BBAD25164F0839EC3D2CCC2865F\ E14CF7387F3F14A85E8EF447ECB55D3605D65CCCB6258385819A916324616A8C\ 57FDE027F7F3C8A591C22C83D3F337F699C21CA5A301F469695865EAA89D6D26\ 8D5CAA2B3CAB311F179E5254C1CDA4E8A21284EFDCBE49CD117AC990ABEDE4C0\ DA999912F62B1094BBBE37EA4B5D904D8C4692F387D55D1F87A72D597878D17C\ B9188AF62C313E8548C8CD16735D92F5C1866F2139EB2453B91A1C9EFEEFFAE3\ 6DD3F1B81E35F2186A63CEF19EEDDFA74B6BC90094DFD555B7527A654741C9A7\ EF45EE962D1FB5FA7CDC9285D657C9E43E1B0164F64CA2A9735F1B48AD06ED06\ 6A7491BBB21C67321DECF31CE027835ECF76D296BA2F842AD4A450C4:\ 30EADD3110B2E6603EF5248E340C7FB693550FB0EA21C01F1DC1D2F35CFE1802\ 5FB1C96CAF5C0E5F22A6C5813C81EDA92D0582A3AFE68F4B9AFC7C9CA0CE4DF7\ 30D392C9B7F51B5D19EC73FF8FE1BBA520747EA1318AA126FB7FD94F700D08FA\ C59F7EDE8DB6016C308767B0040D5F85272EA1F9183F5A4E62959A0A3E43F6ED\ 30C367A3A7F9B0C650832CB78842ECA78E72C707B7ED0405459E550AD6ACC8D9\ 009342C86328E69BE238AFDAD8462580DCDA1340C88E93A777ABF14D8A5A4798\ 125C9B8776237AED3D4902A21FC8E54A1D02F46B11ADAEEA85FD0274F39647ED\ 9F1C6825FC393729C0AD88706D0A0B1503951FB6AD606C6F13A8EA546EA5E4E2\ 877319E3A692E482002E50A1FCF8F7AEC1C289BEB26D69FF203961D64A973D3C\ 93455543CA3267B0F9C671A1773F1AAF1B7452FFCF474A1EA17B1316:\ 9D23110F8F59D9F55823EB31C933B55A8EA284B0AEFF654E:\ 0164755CBAF55AC7 9FA8622118B9AF70E0DA09BDAFF78886B3C49CF6FD6F27A7378C72EC153328F3\ DEB71BB1E8B27A0670D847F4EBBA1166A4A0A43C9E83F5E4A80577A7FC217324\ F5528023A87E6F030425FA4B328D60BD821BF03FB719F994F3E65756E1123469\ 8312B65C5965A386DC05B0098A7B69A9997811DCD28299EDA2E6F27FBFCAB280\ FAF0A1EC84A8A6A57392F03D3F721B35951FC6949F67979FB2799E7F30B2129A\ 2A51D7C2F77F2AAB347A07F82DBF869F5EBA4DB0C12AB55627F92D7BA48088B1\ D4913629BEC1410AB7CB63F5E63192D9B128C08C39ACFA8895A59202F2464D6F\ AF26065440C8F6A53DF4ED4845BF04BE313E4CDD887C5AFDEC7725C4E4D8935E\ 41E9E5F68CDAEDFA7B18D8CD6DF8E7C2BD87F2607E61C4425FDF0DFA85D610DC\ B9BD2B3147A1B7598BAED49BC0D59954CF47CCC878A8060C735DEC2FA0C738D6:\ 09E0D1CF073CA78918D504CF0D24199DDABB278EF99B34D0C3393D7DE02CED88\ 7BA0B4D3E185CF0BEE92FFD9F534CD186BCF917DE09432A48C1CB720D4EA8CEC\ 9BC90F949DD226BBC372AD3630B7A4DCDE75812816C56E7935918D14BA1E3658\ 4FE7D268791A36CA5E82EACB6B4C9BE622DA475D8226557D2402FAF7D738A141\ 1BED25D60FA5B3F9AE500ED047B1391ECFBA8D7653F93C75F30398AF955C4F1C\ 6D2FA44DBABE0D96EE7EDAE84408F33E462B41240588A0C1C477F67B2A325B54\ 1CFDE246A8B85B06DBB568354D89FDB193D490DFB925C9B7AA4FB98C71DAC643\ 6BCA02A645EF076DE340AC4E4F138602FEBF29FF55C10D024A0F424DD1E06615\ FAC83A2A89B62249656DFAE27BA505EF0AC4F30A69A0EEA3C4352A95D40AA3A5\ 7147350F5873FDF12EB8BB74DD27CCD898EAAC4E4D4D0DBCF488F0B089738B23:\ 191E940A45F962BC4FAAC5E1BC5059F1C3C0FA0915AD1679:\ 3D6557C0235861CB 9C468511DCE7310072F9DECA8CEF6A14C446F4B0156CA225461D1768D2750A5E\ A9F208247B9F3E531766D40D74AD03E4705AF84D00F27559B4BE48C2D054F842\ E7D81EA3D167C0EB6D4C5717A5BABE03748E29DEA88CAA3822F6B7602D60E583\ 85B6FA3929A14A14012F7C904C25870C4FD9ABBC95BEC25EFAE71BA1C0385A1B\ 7693A5C63E2D79D4EC32DF572EADED07DA55D8202176E9B99A9780145493DBF6\ D8347159D84008E6D84AF0D73BC1A783BD9F71F9F06ADDC1CEE6A46826B72B1E\ F695BFB253B28144B14BEE5CFB85507AC733E96C0CDEA44AB8612B08656D4143\ FDC190348A15586DEA60EC95F87CE0E1B5A3322A15784F1F4D1CDC5E778CFFA8\ A1258E042CA7AE34AED94F7993A49B37EE7C35127D786C47AEA6B43D4A744B8F\ 81AE7AA1361255A6E9CFCCCA4480C437978826A10C3647EE546EDDADAF0156F2\ D4569D32:\ 42EDEB6FF33F92559D7CB43E1CB8F3D48C45D04FD6D11CAEE0D1585431E59B09\ 3DCEA6B6C959B6353563BF66E0918B66459EC33AE16BC409787DD400CC170E7F\ BF13AC75E2BE17AB84D316ABC829459E5E193E1D4FADDF55DD8A7D5F6672D670\ 44B14A5508F6D34AAFC78C78A0E49CD7D4F4D281A9589DD8C3CADE623E90D03B\ ED78D6C322DFF058A5E3BBA8410E3E7C3D0B9A7F8D0BF28D00867D32443240C0\ 0304E9B5BF0D5189B018B80A3C5D9A8377D9E3ABD833444C4CDB4989A84C6449\ 302FCD2C97EA218AFADDEA255BEA2D448835A5D4169A59ED5E59FD886218CE2A\ 27D83E6EE813BD77067A972C75A7136854A6078CC19E81AD345B36E5D51A7AE5\ BC60EDF2996508984DDBA1CFE5B64A87F723753172E7B7EF22D374822D982D83\ B064F5F6295A5672E31E7C6CFB21CD31FE7C96246BC315613489997E2A5B3E5A\ 93B60D15:\ 31C7F37AA0A1AB4FB908B47F03CDCB302815DE0720A4AE99:\ EDDC65C8A343E51C B158FB5A3C15E554B00797A1B7E10A5333C2D3A0887D0D71F2CD147A0B945DBE\ 9B7A7579DE16E55D01E760F3CB95136D0150DB2559872EE12B26697EBE6EE9C0\ 60AEC6BA15E30882D82BB28E86C24BCEB33824F3277AD43FA4D343FB33317338\ A3B0ED7D7BA3697F2FE6474F9A8124D4057A59A511DDE033A17F819A3B9D5DC0\ 7478F49DF0271843493D81A68C26A8E4482910BB86C6DB4CBD0EFDC6CE7565BD\ 1550F794A19C851E72BA7CA0297D0B06F0E605F376303122B09A70A7139A135B\ F18D1840D4EEEB713F4FD1EE730F1F1782C749E598EFEDC49704278311A356AF\ 8243ED1E65D294824FFB5E9C9128D8D26761996C51F8DDA5BB17FB9ACB815194\ B29C1E64897E23859C5226265C4B56FEBE32AF265F9C2A423583459395C7936F\ 304EC59838189EAAC9103C179C78C386FE67863989898CDC6B85FA1D0ECE8283\ A58043CA30023848:\ 4F4BC6E672383981A7D27F0A3C9EDDD29E0698E2B9FB414EA316324C7968D51C\ 2F717387695A256DE8CE4A3B8AA83776DB6A57FAE0D95CF0BBC4350735032A4A\ 15B7AC93E199C49782575F968F1D349C0F6508A42902305AAEB10DEECA944864\ 62840A2AFF37B5584A6F762E99CAA6ED12D59D8BE4EB71C2F28181544DDDB550\ C532398752C14DEB2E130BE59ECAA2602A95BBFCBB2C499BBF7C4C5B6436D5DF\ EEE9808020906E8EE60E001E9928E5A73992D9A3749540AA387E55AC9B266C1A\ 8A468F73EB25B6DC9D662B650367211597403E2C8E4E0B1F3D3B175EDC7DDC6F\ CE63E79CA565F7629DF985C06F99BA5ABE27B7C85BDBA9CA00C394F896ACEC0F\ 8B09BDD10AD0E9C4244092F50ADC183E0E0C600DDBB228DE3F28DE96B45CE8FF\ 728E9B928593235206F98FD15548F99E7DCDA988924DB6D00A8BD9204162B2C8\ B36EB3C147C5644C:\ 46FE912C13C289A8AFD5154E6607C221A44A1AD98C4F6D2D:\ C7F32A4E0B63DB4C 4A1982707F10B83BCF502FD556351C83C4A56AF83ABAD85DA79B9817FCA8B669\ 1EC7BC38192F93838A4259B2179438A4F0B8FF65CB02468870A135E6E582F7DA\ 63E50CC4268B03BD8FB2C2DE222142BE4F1E2DFDC715AA1DCA197CE3756C92E2\ 218889B8B48CED73C1E83D4BF4B924AC6EDC39178FACC616EE7D303F4225D81D\ 0B4C6952E470ED3FBD7D91B919F03B938319167A0FEDA38B0A842B8474692026\ EDA147E8573EC41C74256443D2540A01CF6739D120D03F365190D481C2594D56\ 69D98EEF2EF22BA4F6D3907F95F3A77DC0BCE340DBF09F6CFF7D82320D814F7C\ B1F0B7A6E236E39186CAE234322B6D9D749DF3316CB492F90DAB3C86E3C1D226\ 932221DA62D93EC65D1FA7A17B9981D89044F7BBFDB04531DC6822C6FFCE98CB\ 4AD845EE647832BBD9C7ECA6961247279505B7341329C131FC19F08B8606A8C8\ 5A8DA80CC69348F8BA34A7BB:\ CA89689CB39EFC596DBE373A82F3B267EA515134292D49C50509A4F633468F21\ 29137958FE78B26F6B689B160F49FFAF20DD39E0CD26456797E0C2A252C37E36\ 6D75933093821C939225455A51EA70217E5D67D62683E81FDD46E6933419C3FE\ 204598C57E2F3A814D5E908A645F8BF8249DD74A2EB535946E786D22C4067943\ 41F2BD50FA087AE97371A0AC653C6ABF665595ECB7A6260F3BA931F282F35B13\ ABEF5C69BA2BE90DF2743020C02DA8EF873CFF5AC911E54DCA33EF4B821318F2\ A0E11B06433E5735F7377953E2438BF8B2699B76800E9BEA31BA385E8CB80A4D\ 3E13CF611AFD1BCA4ABAAB1AC0417255A99A7B45DE9152582F51E7579461657A\ 168159F2BE071DF0E57F9DE527328DFE87CC909C670C04DB2B469DA69A954A1E\ 064C5914A3A6AB9B01FC80660E4257A90CD293E625203C97A28C35CC651F732A\ AE167BC88A2FC593917976D2:\ F96E066A5C72C480B8742FBFB78ECF0E87F539F1F3BCE4DE:\ EE9B92CBC273579D 2667F91D5E9F8F2C96D4233314F0CFBA7C538A15E695624183FCF895EC76867C\ 97C0D4635BDA8629C48743BA2D472D284672868216AF08240E35E61CD3E952F5\ 686EFE572ABEC5BB07CA5A2F5E1BB5DDBD920985756D81CD27960AF2B794A1EA\ C32198BAFFB7EAFA9E4A125277C4C6931CE8CDDB030E884E90A48A59CF15F1D9\ 318A86697BC2CC7DEDCE842F71C6B4064E2F911D3C94DFE2F58F00188BA01054\ FB3CFE5D93E82A71869A01CA5E15F34DDA22473ECFE577557687A7CA0FA9EBC4\ 2D2F25F13ADB8800EC3477EE176BCC89301F429E25D86BA8256C2AF18E9C68C3\ 7BD4A8FF1871BB834BCFFF968C5BE3696ACD2634106E9D53D3BA0DFCEFBB2B4D\ 8C42CA6168F03DAEA7960D5306E25EE81F453E268E0D4980F878448C7FFE24E6\ C7F181DF6E0118FB091119CD4279E5F082EA4B031B0A7A1D3E52987F705EB24B\ 3C2F6DA806DF672274BFE45561B12900:\ 3136CC2F6BEAA4974DCA793E03DABA0CBE0AD100954FADCA66F829F1A0293FAC\ 96B001237E53084F6631816247622A835D3DC178A4C7EA87B51E141BA7F2128B\ 66903238E376EBCEAAFA6A8385FAAC87C39C7208A7D5DD985B3578A73817473F\ C0166DC2C8CB55DD2C32F02A586F684486DBE321184AD2C7B7B59FF3DB4A04AB\ 4C5695D52C9F66D99C2EE8D4CA5D6116412E0E50EE800827EAD6B6B0786C669A\ 79DEC09732654D6F8C4847911AE24CAFE778B79754332E0F1991F34F4393EFB8\ 0309389FC409663C655BD22225E76D97A49407ABB0C4A30D26CA9B8C2A85C4DD\ 1CBC54FCD9987DB2F160EA600648A808438E08A690E136D58DD44A0886C3E28C\ 0AB82400E3744C1E571FD82982287BA7B9D6892DBE605C82372856E55B8E506B\ AAAA0AB88EA4D2E29CCD9A0BBDC2BDD45796E80087481B6A11F4DDBD32FAF64A\ 8EFABB8F056C47DDFD110C0806E8C224:\ 7DC34DA1B3AFE3579FA7418BF69F20D7F1EAE634CB1E6755:\ C23C44FD0BFAEA4E 121173FB02C48D6DD5D46BA28BF7A1F336CA04377B920A3CC209238301D4DF48\ 44136DCFFFD09D78C23F1CCF59EC22E203B0DEFC678DCEE424448B88D6ECD00C\ 87F2EFA7ED12AC742AD2ABB85A4EEC20963039CD7D12072806B39AC212CE4550\ 520AE46ADE97D8292FFD4ECEF0105C806DD6C033C09E85BB853BE01B27A6538D\ 6268E3F78D5FE685166F7EB4886636E621C777A6B2A42B64106B5C5EE966BB04\ 8C1D29B0D89175D91F4F57742D95E85F52C2BF93AD9C8F2FDAC45A8A126CCC2C\ 56E14C5B13401F7B411EF92EB66D1D8B5F7CCCA0A6F9A46C4E2F3B574B276061\ 08E863427CD03F9491EA5F30C4313AF84B660EEB2FCFAD5CD771D0B29178E85F\ 35E7D3DA61F439D2998A4B5D319B824639323FB6F736C90B985CC6058A084E5A\ C85F34B3D6685F4D5161712A56B3533722EBB1237AFB6232A02B5107ECFCE801\ 90B9EA1771CCC6E7DF7A12EB99E9130AA454A631:\ 13C1FCE97C6C4698F94D0F6EB90FA1C468A1AE1CE7BCA7D7DE2ACD91F2C012D2\ 6E00DA3640FACBEBA9BE29F2A63AAFE646816D93F0E1647FE0667BC4DD311376\ 27114B0F63D342C39C432C2B32193AFC84FBCFEE87372460345FD757D4D83C51\ EB364631677ED6A46985E2C56D114833685C088D3CD60C1D698853B388F6B891\ 62302BA5D9D017C438F9670DB6871127B2FDBA1A0CF6EB765A44721365408A8D\ A30ADB097EB24EE0C3560E3918D9D92E8E7E690F563823694836DBF18BCD809B\ 9548F33E42740F68408667D7E4B2312C1AA566DA6A442B5EBE11BD92D6DA1600\ C105C09891B68FFF45CB83F4DB26DFC0EBF51695CEEE8B31D8B976866395247D\ 94F158CF3AE621C32E40EA208532D90608D6C805365FCC55FAF4C72EB8F3F254\ 4718CD59B88A4682D0A42E645CF015E14751028111723861EF6BCC99D13737EE\ FC99922FC4B16A6D07DB278C67A585CA55484E1D:\ 82D1CEAB43D9EF707E12862E4BBF3CFA4EDC35E9C845035D:\ 4E71D4162FC6C69F 9417290C8343D14BB905E866113A856BA9823645226C88406BF80AF3FD18A831\ 844466E8734047FD4A97990BD8FF8FE90DEC55AB372A93EAE25FD098D3A23128\ 8095E8E3383BFC3402B6424BB86A1B17BFF93177381C54043D297D3F9389FA87\ 55D8B41713EFC12EC553D55BBDA231010EAFAD2150909E04782E962B231C1207\ DF918A4079B7DE2ABE356B214DDCAC516803F077D3128024C409103937988578\ 65937B8A5ADDE65AEE0BDEFC1E7F008F06D6332DFF02CE0B1C9027C02C471EFC\ BBE78C14308CE073F69F0E436734146DD930210AB072E7A10CC9D1F87DA29F17\ 1B6D93613F631147C110F7628B6FB55DE1F67979CD04FDABE70EBB34183D04A1\ F7BCDEF0527B4F116708FCC0B7B04F9BDF741CC67A4CA5983326A6B48F0C0EF9\ 6AC6ADC57516049B7E4038424568472EBE1A778B62B324CCAF1D7D40C7EFE4ED\ 8E594F5E57F737BF7889111762FC2B8509B60284C3696AB5:\ 9820B0B24D15FA03E40B521FB67C043D1E55AB938687A2168D04035B9A216169\ D1D8CEDED2C86586C67DFF31F401B3D15CE4E287560DB0747E28F86C97FF21E9\ 27E32FA3D2FEB5DD33A1B739D3A2B7CE06473557DE2EE164794EF23570D96EE3\ 911DE796554865162ADA1D2B9D24ABACA986028277223B10AC4FC84210FE8A58\ 6479B8D410A7E4CBA24843352CCAF119DA31D4310DA471DB2A42078BAEA4DA68\ FA0A41399BADD34036B9670BA9EF43B39F786A29C23E19E4F60D119CE2F9C9F1\ 7DC1091EFC85DCA051B095933ED9375E6DCF6DD60356EEB5B9DDBA04761A412B\ E475D5AB927CA00C3B01F136A15C13EB2E1349CC8EF8B4A2E27254B9E2A0C05C\ 20B809B8FD72DBC1DE9ADDFB8D987D0FB31D95C8104F656D3C4DBF1B75B33ED7\ 98C594785172767B00C7699455B3CF3331D19E47C29C52AC844D8A5B90642C6F\ 3D478A84C8DE4FDEFC1D6B421E3938E2C7352A059F69ACC0:\ 0F5AAFDC62CF013302133CDB2658C362D683120239C9B73B:\ CB628A161D5BB00E 77D4ED2A5321D0C218C203D971CB425FC74497708B5E8034741B79D022B2E54D\ 7C7B196C6DFB1B5FDC1C8A18DE787672D47AAEE01C267518E693BD02D1FA7B95\ 42626DE007AA524A8B82F339882625843D67402FEDE26C15099F8F52D03F2299\ 23ECA62A43FBFF8E672316899DB117B1313FA9562F0F60598CB85EF42F7218D8\ 19AF309DE57A6B262F79E4593FFEA910C7BF7015A4D3033D8EDDA1C102323139\ 9AEBF65CBFD9D43ACBB9C28B58381AACF7B25182D20B4C7BE9A2C1E7FD026F62\ 80C72F806912EF26CC559BD64ADABCB6F57F1EEA44D99EEF62B80B5AC08B1A40\ 4B9DC1F11A2401C93F5713C88F9BF1864FDFAC23199F6591EB0C1E3F152DA4A1\ DCD830ADD9567595A55505A7237D245585BE2F802FC483C81BF895CB7EE0A27A\ 8D3E46AAFC0F57A71EED36107BEF7658EDAE3093559B81E9C6DF08DC7DA87BB7\ E17421DF412612CEAA7BEFED5342E5FA9EAABD52ED6FDCB3272CBDA5:\ FDFEF44290CB510F15B987C0F6F2D37BA5BD3CB19B21C0D75BF6048174D64B8D\ 1930F1D4B13B024A60A9C1AA39D6CA247F2D4C6310AB01C45AFB6748D93B5C35\ 3EAE103E6559E17DECF28C11C4DE59223D102785BF95485430A3D3C6E3425C83\ EE602716B990624C2CDB40BD0444EAA313B5574778AFF53BE5CC7AD505EE4A66\ 9B7F77DEC4E1BE571635B444C5C38DB46F9673EB6883E99E918554FF0DE64C19\ 25C1E7784D36B899B1F5151F7E3D5488CAC0937CB6C130141EBDD3467AC3FEA4\ BC940DDC22434F1B1883C1A983FB59E53C44410FC99F1B977CE4671D41543638\ 52630A2887BB80B3E2F8F42C5BB81D15BE85A07FD24E7E8DB66F7FEDCBE28D61\ 26E2124DFEC6F61B584FA0312304C5DEB510146C753EB7CE6BDB95115D024A05\ 002499358D62C998F48DBCAAC7B1BFC42F450F407E838A40B5CAB429C75D30E4\ 5A0A8B767F1D7F1C1A2C1E71389AB6E42FD0F969CB7FCE517FDD5E8E:\ 913BBA8D3FB9A5A7D58F616A6A921C4644819277965087A7:\ B637FBB2CC939539 5E379056DA626CE62D94AAAC8996988A6840CCB2963CB2EBC79C681F55F8A754\ 0B6C602671856561F0FE623B362CD303EB124359581E3BD0763BB4DB2EE6B71F\ 9C5F747BAD3A3D12618D5A510BB3F8C3AA30F49579B24E88A26C7EDC31F8BE74\ 6D1452583611A01E0364E704B64DAA5C9F5A0CA698A1A24FD2EED1B133042905\ F28DEF9241F05F7F391A67B29999BC003CE9A488A5DBB111056520F9BF6D612C\ 163B62F4CD122AD9DF51F346F9D4EBBE6FA470ED444DE596ECAF10042FCF06E5\ FEDC5A6BBBAE01F34FE529279DA999B086669094D97CA5C1F2F7DA853158AA76\ AD9BA9F64CD920F85E4686158C27EC5F49A07F34B893C5A8F3CE5C2D407D2137\ 12A157DFD0B03DED3BD39B6A79FC81C6875D0E10F4E2E90D337AC0C54120E6F5\ E5CBA808F824517B7E78254058DA6D8B0FD014160D65188164B76FC928C6CE50\ FB912F098B943D67CC523C76603D44D256FA0825DD8AEB0937E2533B4FD2881E:\ 97AF2D0FC9B2E50F2C08941BD25CC5AC703F44EC717C3DE880C6459EFD4BB6F6\ 2C9ACF35CD425A68500BDEF9069026944E1F45F4E841615B6961DB2D9D80C31A\ C4A6160EAC57F09DD1F44E0E3C4FDC5CD38685F0F01F6CC2210F5E83B10A5C9F\ 308FA922DDD7946E1D44208CF6992DA34906CB0AA37D42BC0A4F16B8282C8033\ 6CFEDE8BCFBD5878CC6B0D7810E99D5AE81934EBC338FCE4C03156C86FDAD10F\ 48A10E64DA1FACD9B79DBA7A650BA4B1B7D82D2619D15AAB2D0C9CE8CA361A16\ 244C246AECDAA8C3AA3A90E03CCC1D39FEE72509A3396FE6A8E60A93A534FC22\ A758B1FA5E0189ED70E88E868C53C95613A9DCBD6D7C3DEC488618A4F4259B91\ 55691C094C4F5B920FCEF09592A7A786D1A28D5B1582519042E8A14477DE6FAB\ 54CD88626B8AE99D3875888932F9C66D7E710DBFDF56BC435F5ACF80003E21B6\ B1ACFBE3CBB45DB9F36AE2E0B99CD574D11D2E7D007640802CAB0A73DF42844A:\ E5A12BB39909DFA7BB14C3287A8050A764425C616C5AA1AD:\ F4B8C64D45C46352 0E3633046E8C46E483E0AABD132578BDD9D5CBA67743BCBAF7B4DF08380035DB\ 2FC67A0DD2360C698088C274039EDE20BBC315CA5ABCB31894E620328D11E58F\ F72DBBC972765C17D7894CAEF1E702BC2273315B799CB60B10E0E56D4E1DFA2F\ FD7CE1CC42DF14E1418269C539D3FDF23F35D124F6966E982EC4ADBF8D1CA639\ 2C7CA25161EBA77CC54FC7EA02ABB40B40D34086B4BB4A13CCEEC89797F97615\ 8F4C4BD979648C67F3757A29F84C4D8D49C1A066E89AB2EE182430840BE258B6\ E56948FF0B37EB6AAB0289ED63C71C4FA9594E4EA93D288E4BFFB9DADE004FED\ BEA3BC3B1CFE8A8D994A3C35508FB635A79ADAA6EDE65E9B674ADB305625104E\ 263F7E4B2D8E9651B820BD74EC718BE43C6AEF4B52C0A1751360F4172D585907\ AA79EE213F54796686D504B1DFE55DC7CEF59F4B422318BC8670D412D2597E6A\ 1BA6E12AE843ECC64049CCA3967100A0C132E5806AEED14D6CAAA96C951F1AA1\ C6EF715A:\ DF660A38FAECF3B338A9480E35AEF4E9D098AB643B1067B9F8D84AE5E4D1CA47\ 1797D326570A993B12949A35314E261E9D59195EF31E352317D2C63BE60FEB56\ 81FC86A447D26E09C8FB5A9CFD83F085536921BFBE6F92F9F9CB274AD0F97117\ 4E970F6B717E5F24686CA068653785697A5D690F4443773900526A780AEBF836\ C56AE7BDED3E57E4D9A69FE12B0349C2026023D4AAD5808B69097D9AC3CC451A\ 902E95DEDA9E5E0F2426A1E2FF13249F1FCFDA34B4525674AAD772292158FB9F\ D4A5B522314127CCBF2933382E4A126FFF48205D0F7EA1EF4813C34D5BF2B445\ 6D9565FEA30EDCC30F2D1165B629443C3C5DBE802F5214DD6FE458C745932B58\ 9CDA0813AAA6427C709B46C45D764885854693D9F04B364B308AB6E7EE15394B\ 34899D04E50B5BEDEE9E431C83643EAB7ED6F91180F9D64F334067F5B77AB88D\ 10F1093065BA0C0655E5AB0B88D9F60E20887C1F85CAA902678C177EE67AED87\ B3B0F1A2:\ C7A36EACDF6E22781E61F131273155506F778BC0B5DBE974:\ 377210AD91C659B5 CD3546634E4EBEBB21CB70D51E0E4ACE02B49928135B71D23616AEAEB26466BE\ DDED0D8695C997D874355345AC10A9AD6CCB84BC61B9032757CBE2A9DB83B956\ 03D166990DA301671BD4C8385242CE21CE9CFA1F10671BBBC5833A4D013B5A44\ 515120E29E8E777EBDE51F289F8B9C29461E56F77EDEF58D833C7AC5C2B6F2A1\ D6F7147EDD2D4916C2BBE51076D549BEB7E2D39EC96E8DD7BA14311086A3A8F2\ 8F697BD50E66E7FE51142D318BD6CAFAB3D40D8173AEC1F0C6CF518D40F34640\ 550D8D2B1A4722CAA02FB05FFC11AD77CFA42C83362F084639EDA36CC7B9011B\ F3BF7A5820D465ADFA42A12E67B01ECF5EEB441BA68B10221F56FB177C21FF61\ 3B4DC732F384644609D9FD963911A6BE6DC3BDC782A0380A3F3CC49BAA540EE3\ 0B0809329AB9F7E9E6AF0D6DA78BEA036507F8B5C360FA12EF10D24567761107\ C1CE99262FD64A1E11D5089125A8D70FA36A291F0BD7107565B39A421B66591B\ 7C415E10BF33E82C:\ 60C6C6F5FD0D60F2FE85B68151630FB20DB5126FB9B893139BAB6D4ADD721E66\ B68F5DA7D09760F95DC5374E47C0A604E9C43D06F2C7DBAD6593FC160CB55C81\ 7BAB7A1633325BA3C23A2FE7BA0218408E8FA13AB5F7165879B9C9FBABF56224\ 56A72FA7F4447B8E6BF6096E6ECE793693DAC517E539E81CBA254B73D79851C8\ F4FF3AF3D97B5237240B33AB538704C6DFB7887DB1EA49DC18057E8E98DCED10\ D1CDD199EC91552F63D7E0B8270B9E4DC1EC174BD294463F6E2939461BFC8BEF\ F2900EC92CBAD64B6AC273874A89B8FDEFE4D60B8982934EB9297765CC51380C\ 803AACED9BAE5CD76D08BD4CEE2CB0D1DE2CF00872120BEF37036DDBD3A2BD4E\ 54E26D383EB39C2CAD52437C31191406FC69A59FB1534624640DB35A685FE24B\ 79FDB4C092D3BB2D823C508FEA2CA0E97B1FE431F7C65850A15B153DBE7D4C22\ CFDF60437B3C9D383278CD814CFB08A4DDC98AB529883FC139270FA32EF14A47\ C9303DC5BEA28168:\ 465AD62084182C4E4B46F597C49B0EF00F6FF40BC98E03E3:\ 90C4BA4499805CC0 C78F74D057C2CD4BDFEF207FA11D425C46B48681194461266EDA582D7811CCC9\ DC54C5A7038D35938EC37A2C38253B4A0A23B3358DD9E62A2ACDFC8171B9EC53\ AFE95D45AB21428F00E03F3AF50184E5138B0D69546FBE02D5DDD760CA367EE4\ C6AD61F94B21B0DF1D9993B8BBE873F77D5C5F868AEC81106ACBCE2E391D84EC\ 2374122C48324CB4731CA41CC715FEBD36BE839DFC22265347439B3272AF6325\ 17DBADBE1A232737703E763CBE5B2873413FE2A04E22282E375981A0D6DDD5CC\ 7E446CE4EB5ED6989A5AD028CB7E0D03499B7D61D8EB85DDC6A53F7A455A77CB\ 0C930B6B7A620A312A7F978BB5AF8791A2F5CB116A000EDB70CA0B47459746D9\ 4958DC0376B7CDA39510CC9658AE927630B635C38837B6BE3ED31935C1B66E69\ 1368054F61F7EC304D7E408387B0DA71FA571B18056E0256BA89167C169993D4\ 5F46FAF8ABFA9921310E262A1FD45DDF62909089848C74269EE8D7AAD250792A\ 403DE8F48B38924BA0266E2F:\ B4FB5DC3284EBCDBC0104B29B6D110EE04DA689C1C53DDE963BB9820E3792F72\ 797B9CEA9DDFDAE25597D91AEC5C4A8FD9625A3E08B44630092ECC995A7BDDC7\ ECECD070276153F785F0BFB51FF801FA375B5B0EAB6F4C8577FAB96B33F87729\ D4F99646B51EF2096FAD2510045A5CDDD525298AA4EDB95DC36F19537E6F9C3B\ D61DBBC4312B96AA8A53A6328934A526FF6DFE51E6C841D6BD417D307FF1925F\ C27E701BFCF44372C2FEA7EB66A93FBD70A985D3D4F16417329663DA0EDFFD4D\ 7EB209CE4AA435D24D91616F4DDEE729D1658110BAC4EF271CDE886CB0556F85\ 2E89B0F070A75F41A2B4C19785FC1B2506A6001CC7FF39C0FB2E095B8E3C66D4\ BA9B2FB6064EA4202F366BBDBC73A5079FB9218ABB11E63CAA1B05F1B3798F45\ 58D270E8616AED4E2B45CC79AB1E2FED02D82F88018B621764D24FC1197B6F65\ FAD59476A81E1DB2A1A6E0E94B5325208ADF4F9DE15066F4FEABA6524BF2D567\ B75B8457B1EC8284453370F6:\ 88091BA332085DC1451D98A8E5BFDDC9CABB29D761D3ACAB:\ E98559E21C907103 727AFBEF333BDC8E5D25C882792C12E5829635F89950FD18C8F34F4B1A27F405\ 1270DC484B64AADA5AE9DDDFEB0BB8829844844DC02BE2D305905257815ADDAC\ 34CFEB18571A4D930AF2754F13AFE034831E53F8E4968BB799E9FDE8CF514804\ A9571261F87467BCE23545D3858145508C81CD91E311FEA8482C03C0BEC7688E\ AA15BB61474020C14B54B4424D20E4474E886527000DF5B8489C99C8E4D49C69\ F8D2D1292AEC62CEFB7B4D84D1CB0702DB88B51F709B087C0D5D9581EACE9EB4\ 43D5C6C12AFD8120AD777B233442449C9210E4D69A5D01D663D6CAF1C0DAB7B7\ 62996143DF15D9F1B53B5972E2EF5B042F872BBC0B5BD8447BA1ECBFCD27F759\ DA6A96C9B0EF0B99059D3894B76EE98781B23FDD52B288305BB48D7D5848F10D\ CD82B418E63313056039A97B765AC220C1035331F655BF468E868B0C8B1FB3B1\ 0F6D474EBE0E2FCB59A37F3D8E9890596FCF7652CFEF3FC4277C3193226D99E3\ DCE54CB05A3C90A594092C43F90F2739:\ 18333A60E2C7502E1E12B956277B5166890876617152C075C532269CB3BDC3A3\ 17D92E862FB7F4864B8AE4FC33F04DF6DEEEF266B58298223424732CC70B29BD\ 70967F8661013BCF606109D49C7F69E6A890EF80B3762C32EE76B10004A63093\ 9EC9FB3EF69BA4EF05BE0DE8F1841320584362667DF600FF85465F3F530777D3\ E2B61A352D700C1A74B6D569A6BACF6A86A278A2B7C2F0F32FF5DB364CABB07B\ 716F39BA658D1C12BDE3D85CDCF7D9CC949DB7827DC3DE0132A4B0127D96076B\ 76770E838436C680B2DFD8FB71D40B2976645DF4B93BBC3FB33C80D60FBBE0CE\ 2DBABA36EC24C350F14C8042F8DADCD410D3642121DB95790898A08847BA9AAB\ 4864D7B77123836AA5781124BA1447CC87DDDB18242311A4FBD21612B1F9B7FE\ BF831CE1EB068076E0B4CE29313B32EA8260EB0D626CC5C4891D4F42A71CB339\ 935525742EA2058CDE9897F28122F43E229398825DC0B5327875E334A9DF114C\ AC531B235026C211F81C6DCD6C5C5813:\ BA14CD753C30AD563AE217A001919404D1201EC9E60A7910:\ 71BF1C99162D23DD F28C92127196B168979D38CB588EC92F1E61F31402111A7C87CB1C0811951F06\ 8308247AB6052EE03971FEDA999FA8BEB94C31BA1E82DB9088E1435B631EC040\ 39B53E9222A3BF014AD308CE587AD481486A1270A58CBC2A72F5B975AB81D1A6\ B0233CD64B20A24769057E163A231DD54E33751E1289398A4532FA2727E8A6AC\ 8BEE48D500C87311084723E6BBDBAF3265333C8D69DE71D6E43B6AE1A4847959\ 91C0C57BD55D5C0B6F05237D9EA41722399C4B7ABA5864F9414D8A7311FE5945\ FC534745C68576F18A5E6A2F0A435968788894EC6F1430E45E698EFBBB7AA5BD\ 7C4A0FB40938B7C77CFCB2FB27838748DB6EEB356782C393AABD3F5380B556B4\ 786D1C8E01BE5B02E5BF4AD724302436F5E3BA69D5D9C463AB4ADABAA84E2AD9\ 7D2C2329EBF4429CBF4025AF3698430701063743A4AF9FCFCFFA9BE5C2D651FB\ B9F243B64678A9AA308D2F6B5EDDD9C43810515E7CAD9E8A6ECBDDCFE0325785\ 8D948F1346E7600918731B1ED2AF7CD6343532B7:\ C26079BD4967EE47AF00242430A6B84A36DCF190DF2808D3E7722ECC684E58E8\ 12F476F357EC5C73770FD5A06940C35E2F89ECD20E39FB931D4E024767F0F88F\ 12FB67885DAA739ABD57891761796B0DCA6CD8BE0CBB4C1C8AB5DC0D9C8EA94A\ ED98E5F5CFF5BE15936B55ED6CC6D337D27F141E2068059D40D2A393A2FDA709\ 81067FD283945A6E01A90A1D9DC8C25A555F878A46C3F3FE73F895A0D06C877D\ 4FA4125C469BEDE4A38B80C88084028435DACE330E1DA4A2E52EB92F06EF17BD\ AE79CD492A7A07A8F383EFCD60281E5CE04B14CCFC1F977C63E7286AA690DEDA\ C273387876B6CDA430836033DEE7D000EEC58078E106395C37C5020F4C2ADDDF\ 0CC7361BB187D5CECA597BF1E0CBF2AD5AC91D4659C315EC039A80307E569355\ 3216519314D9981ED5AF611F2D82DA3A358FD027414B44EFAC31042439C8B4EE\ 3E4C0455769C8640C0CBD752195A0D4B7EBC80CF881C15BD7F41C96EAB2D6A9E\ 5F2EA83B0DD67FD52C6B50A516828059DF50CD40:\ 9BD657917B8CCC9B5279D3117DD99B6B676C983FB92C5E7D:\ 9048DAE814ECB6DB 7D0F500100462BE796798CD42A5A133BC9128650616B9E72CCE8CB52343FF8CC\ 205F1FD9478C6D8FE84E421C03BFE852806D05A4BCC3645EFAE0D0F357ACDD85\ E950CB794527092676AD8CB1EAE3E52F8EEAF4EA80A2F94B70F95CD10C42F786\ 7D1F0CE740394CDC9C8E8A4A5841751ECCFB3ECEB635D3E2E050851826E663FC\ 390A16C5A421F9BD71653867272AA649CDC77264F41DFA666087CD5E6DC9CEEC\ DDF77104E78299B4B4159A7476CF833C2E85106B9706D9AC1538E834270F9E09\ B05A36F42EC62B4F79CCCBC4CA44ADCEE91DA2231B39F70ED8DC2B47B36FD2A2\ 562934F7349C65278F3F7DCC612DE1B9A0D14478975EB2B9FFA495A82FBFCB52\ 66B5C757856C8EABF1A1C8E5E2049A8DB546C87AB17ED8830B1224A94E1406FA\ 7D5E4CFDF70AF4594297C82B2005C53C08098DAC78EFFCB69CB3B321922A247A\ E861E87AC0D32EC8274AC771CEC33DEF58AC9EF56A32484AFA10E354AEB72F12\ 7E01138B3C4205AEB6D0DB89BC0BBF38985E74871819458D:\ 8BF353E8349D0711C4A0CE2D2ADE28DD23F9372DCE7FB9EBFB177DA3ACB8BB18\ A97889538E51FBB8E835D9048066CDF72C65F355137AA7EA30E8945896FEF268\ CE2F875815EE76F6CC48495D01FE7F8D4E57936133E65212EF4B16013B1BC019\ 72547B4D4DDA809E2E61CFA97300B1B09BC2B08F3E44515F756D3E073180B516\ 064F9C5C5CA7A4C3F6EBC5B9A76953151A8FB1403E64BA82B1308061AFBD5574\ B90AA7D28A59DE2FB7CFE050E2D6F3384A3405C8EC56BA2D477320C33334184F\ 7C2CE6E2F95B1C465356E0599D88A3B9CADC4FFF6CFD1B0DA788167381A4A291\ DED18CB3A4A33C289EC637FE574379E55D09807761538E0D80A538513D78D778\ B4F7AD386E2F5F96CEB5706BC22476D3FE49B907B4C0B6437976919D8C1DF55F\ CB97F5B142154F4B9F4457058862E583A42B5833732D2332D4809BC61AAC43B6\ 62CCE9FBEECE99D27E6D674C7DD17318E8855425D025A65803FEA4D70D0E294E\ 227DB9D5C8ADACC98A068E6C1770BE4AC94D94B519233168:\ 1FA041BB9AE7CB1FF1080589BC676B2D134181CF5CE95307:\ BAD8E5E34E447ED9 8D29FA50F355F8E9812FD5B1727F14CB3059A1FCC348F0021E0AEA8718EF066A\ EF2998B6DB2D9B2E0FC25D900B8BD51A577CB08EBB0F8D5420F924947E7951AA\ CBE6A5778F6F1BE32EBB90D0FF0E68958C485742ED9605476AA7619CD555346A\ 3FBF3594FA73EFBF74670C9766570138D9CCC82A76F8F386E10BEE6021A13C89\ CED94B919001E050E115356E62F5D7C5E1164AF2AA1A508823B8DE6C628C675E\ BC2C95BBB5C2DA8E107D2478B453EC4D5E57EF15015DA8B9AED441927B032BB9\ B4E9F4C8D60FF7FF039AB7339B782FF51E67EAC602C4081CEB86E27FAF5AE452\ F31BDA99D3AD4BEA0CE6DE369586E4F98ACE39E9A2EA3A9EB9AEDFBC92062723\ FF93B653CBE6142E3BD3014E589BC2E56226043EC635B6C114626859C59D1070\ 007C69C1B9B46E69B38CB0157FD723DD1B0BDE08F8F09C9279A287538304CC04\ F8FA528E637F5E152B9953E5A8C10CC1220835F69FB5E33BC2CAB0B7DD625BD1\ 730C1E2C8DA73EBE769146CF98070D5B667939836E5731E31BD57CDC:\ 4E1996018990AFEEB4CAB81B90F1E1545C6D2130ABE4B302FD286840898F9ACE\ 8AA5B9E7B260D4910A4F247197F7320CD253459B7DC631CC65FD6C10092B6620\ 403DA2DBE8B43C8C8EAB90333A10456FE2C53CD753915B5E77015E44F1CF43FB\ 1743E1F29D4B178CA404D823CCFF9DC7B10DFCE1B2A73A0039EB3465C4E88F8A\ FA02233C3C54BF464D8727481C38653AD6131C351678ECC08AF3683D97898B4A\ EFBF60472AA3AA6D602F5C276C43DCEE815232199BB71A199382F5ED029389FF\ 2CDDA22B2A8954E91C17CD5D78B0D8FFA0EE627A423EF726F566BE44C81B7011\ 1F3B98F6555EE999FCD37E2010A7F7B497CDCE086F950FBD6705204AADE1F870\ 4C5AB27B769D02B438BD6C9AE66730D4CE7170F456A7C76F1FDBAE8439CDD323\ 0A7CE630F52D2FFDB31C505690BE6C2361A0B6774C758F57486D9014EE857A3B\ A5BC1D9CBD6B40D24B55907DE5CFE361DF28C3549B5D236F204CEB6CD664B6E1\ 4D1AF0413D03D586C0DA1BBE56A1484DE06C91011956CADA5D2DB68D:\ 9ABCE6D84309211902FF54CDDBBC31BB25193A763DA562A1:\ C9750AC233CF3FF3 F6BCE4F7C6AC3457474D4B5013ECFE114A58F6B85C6B104CB0BCC2389BBDCF5D\ 618441A9C0705488714912B3F6B12A15D3198A3E41760A577020280B7B6137F5\ 707CA945A0E2E0F6C14731DCF9A3179F02AB0AEFF7F054C018BF0C6412C7AFA9\ 1D856EF576C70D6A35F1515367E5899D9647C31ACB9F0EFE2D2A67FB5117CC1E\ F7609EF69E9C9C3C55BB36002A96EDD2FB7449B5A704EB8DB814EE982CC2C5F9\ 65C38E6B151DA2F586F2140DCBB24AC96F29BB34A3AF1EC8A441EE4C701BC9D0\ 66D2DA71A869D5301FFC426E24812C29A4B1727659136D3B0721F4842D18C350\ 5E2FB31FC88835ECCB6682F9B83BF9A2D4E5D2F42102D80092FECB017E823C1A\ BD8056D07D254815EE3E96DB094DBCF36561EA49F1AE928362E4C6DA05E71478\ BB118F27C1CEFEA4F2AC510F3240E50AEE5BCEF9F1422B624AA53099081A9473\ 0FAB191E1CA71A560E61DE365EF3783E212E8FE11A4C9266F8F8F6542C7702B6\ 04488921420DF1E20BD832274A25AC410F86B58BB713B3DA022EF3F62ED2FD93:\ C9875BC3D4BF3C2DB51911DDAEE617B69E77BBCBE26F307E136DCDA3F396AF93\ 8C12E1AB3892B4F6E1882376DB37192E2354DD269F3B9ACA70FB41991A71E12B\ F3B0F5FE2D9C290EA1E514CCDFE05567B6DBED2057CD24BA5C218DFB45060279\ BF466F53E7B72CD0D1904DE6F5C7DD5AD6577BFBF4E31F0B3BEC549456D31B5C\ 392B021831F81703901561047E4055D305BDAE4028D86DA2F69C51CDDAA67D33\ C9CA14A8C6B169DF04ECF51C3E8BD33DB3A28B1292AEEB582691F4EE6CCCDD52\ 99CE4DCA4A31BD5DC8DFCE32AD19C38CB335B387C8341FE5A039D55652D462A2\ ECAEBB0E8D3071E8A7F05E515F42DAAE6168FF097ECF99E505847672874D3287\ 738C8C97232B4FBDA9F1D10066C0C597A5796C770AA281417C390847566DF5D7\ C9B6EB74D28739C3DBD75178B4972B08F090D5CAB0165B8F8FBF321D84BBD178\ 5F1BDC303F950008ADBC15B6752B3CC648AFAB4D5A24A70243F11584D97EAEEB\ 5A02E52EFA110CC9297154E2994078BB9D160341AE68CF52BD4702DE135A8E96:\ 68FC9C0059B999569EEB2258B4E190E97E1F5B35D899873D:\ 97C48E84CE8B42EB 99003587F17DCD76B0ABCDBAEF378EE36D275EE2AB6DC61889052AA97EE06A8B\ 6B30C10E3936661222CFA985BA181646AA9316962C7CB83D84012C8110B34D0C\ 366064F662964153A2D4332C7BAC76A3E6BA7147BB0014CFE7158A1EBCDD5318\ 5096FA6585306E97555AEC33E2745275D4B00423F8EA4E4BA2CD4F848D3B4D9F\ 0F65023298AF2A855EAB8D60EF35A46C7308AB9CE16FABB20B2212900133E15A\ D3AE639FF5F81CF212D8204AA09AC7824C6538DFE715B55E0C46DD75C1A48F78\ 86E22CAD48C38FDD3F80E0E159FB2997687F734B56B0C920C34B544EB81D8B19\ F3CEC5827A0ED9DFCC952827F9A24E35AB6FB199A3B6381D2E7995F6431233FA\ 40CBB6915B5BD853A03E6885B077D8D10191D56E53E4113F1D88D90532ACE444\ 4314D74FEB56C6B2BDD6EF93D7E6B4224487EC068D59B6972F2AAEC5F0488F10\ 1D603A659D80FBE556EEFD0A1780FBAB3163EF1D03689ED3BE2AE1761492F0EE\ A4DE741978B64C0F45668DC6DC1ACCE3D39875E18EB33DC5D01ED3F6A94C9914\ 982A19AE:\ D7FCC6158E5B203214E7F2F90BEFED9408BB56569670EB7142F02434ED3BF652\ 112AB4AB32CB7689EDDCBF5C97D3A6F3D7E198C66A05774D1E69428500C24A3C\ 03B9C39F94896CC0FD6BE69E37C6D4244007EB55CB8EA40F0990234EF042A82F\ A0F8028C7950073DC316850AD928122BEC8D810769AF5E1F35B9A7CA9F16AC46\ 65B8AA7EF70DC7F8FF874BB2240220FB2AE6CB7BD2ECC2E913A7E0C064EDCA49\ 17E588EEA69A13CB0CFEA09F4EDB366D22F6414FEB060C62C75F6DF41F4742ED\ 5F204343B39ACB58E115CAD56D2666D870BCE34B0A7796309C8583897FF62512\ 8E2DD5D7B98980EC06B086CAA4F3B6D4E4C2739E341016B58488103BB298CFE6\ 0D0F29A75E77E22D869F22BDBA2AD9EBBE96AEAFEB73C1EA50116248891151A4\ EE6BA9C9A081D391F4D763DA00F14DDBF1E15C41D87009C6F313931BFFE51633\ 7C43C8A11F957B2954ED68F34B385FBF46AA8D200ED5DEBA8531F125FF2EF2A7\ D94A661BC1D89A8E9A1A9BFE715A3D95F117547E91E175857F95BB83CC49DFB8\ 60120A74:\ 606807F4D893898C22936B09472EA44C4D86A8F22A863F23:\ 1EEF5BFFF8F70233 4AFB9076339A137B25D7D07486C971A75E66C024A563FB24DD9E89E0B5CE1278\ C2CB378621E173AE9C667CBFA8FD7AA6B8497CBCECDEA7BE4041D192FC61B431\ 1923264246E2AC8285761D32FACBC520B0A2C7F0D6984325BD51604FDF0DB5FF\ B1DBBE903C43A25728C5EB7EB98ED51784FB66A12D04DEC4514F8E7DFF5C87E9\ 9832192DC7BA3D429EB116426C0640F6BF82ACE1ACE11B5ED96C88A320EE5C29\ CF5C6956CAA8C2A90854A2A467FE471E2D1968FA88241E1F130BDFD1695D8CEC\ 1B93803A3DC37824DBF9BE5685A35A33BFD60F099E10E6A5393001CE7C45D5AB\ 369DDF162BF602F7462106681204C7D52585176A20010A0D5C2C23514AD5DDF0\ A6C4E5899B189376AC53C5CC2B7A87AEB8A3248A8514EF044FE4E6185AC96B55\ F6E88A40912ECCA21EA1EC328D7CA3F0FE5963B1B7A73A2800181943151BBE39\ 161EAE78BBFA3397331549E7184EB04B34F35B6ADEAC72C196FCBA68F98FFD50\ 2B62964C805CDB34DDD4E57DDBA1D6AAE8006679A9DC8B0594C5B76C14E25177\ D874EE25ACCA9191:\ CF532173EECA015F6AABDA36A4311A11BFBA0E31F82FED5FF503C5910F3755AC\ 5A41D34E7C546AF0175CE1C9C43F78E14067359222868275F142D8967308B5C5\ 2274E2C223162356F83228522DBE91E45DAE0B41DA640ADADF73D9BB1B167486\ 26418072A4E9E952CB60D746C4BE433B185BE7572CABD8378B47DAE8D0A68D70\ 43CCCAA4D6671FF25FF1EA737FFA5D40EE6C4580F016E6FAE1DE15D421D3FDA7\ EEBE50096E70291E5773C04F38125D28E55DAD0ACEA9F8092519F1B27B384527\ ED7E4F530D77FB2AB4A17044B64D7040DF6E31221EA3C8E0450CC247C0D3D8F4\ 25587B0816195C090B4F9E5E5FFB06533713B52A7FB24A1422B43BA970183082\ FA416D0B25A0F5B27348300241B97743DCCFB7A1A8AAD8DA837312FC078D5431\ EFE3AC24CB8570A76A0A9FAF84687A83DF24E88CA3BBF15A375A3057AA60145D\ 2A622A9061FD1A714CBD0BE8720F1BCA985F6E77652152E3D3B62DB9E0AD8564\ 457312427014AAD9CB60CE37CD5F576DD6C6BBC60E53F4676210AF86BB20BB20\ B03462CE1FD5C726:\ 9F53C60932FB8AF55FEEAF79B451A18867199258BB881CD0:\ 75B68C251C5B0DEC D92EEA40EEFFB04585F6ED202DBC5D660EEC1BAA52E2968A8CEF6EA2C03B7176\ 793E3FB4A59CF61E29AD72CC90EC049860FED7C0BB07F1EAE0DF101C41ABE8B8\ CB5AFC63BBD98D5E84CAD4682E03FB0735C7AA0E4DFC105F12EA3F9B4C799D27\ 47576249841C2EAA26B232FC8047BC2F972EF0FEC0C70B5C41824E8F9D43E8A4\ B1ECDDBA69826BF99384D3CDF75A6A137199DDA67BA48C223214AFB844244755\ F0E560933F76D154E2B9659D5904F9867E37B5045D5E0E5D64E6E23EEADAE96E\ 0815ECCB1BE57E56FB49EE7AC399478A62335986AA94BDE631937310C9589B93\ 300A94B10598478732A65EEEAE87243B5111D854C4D11F6FBA956D96FFCC5286\ FB1197A4C374B1B21B21767D6FB5DE19B351A6917E8A08151DC184149EE46214\ 90E4723A2D203787BADB7D721602D00C0FDB429368E3A2B4436528A14EA0A138\ 29367D91F75F156CE2A777DABEAD8E723CE2BDD8BE6B00468052ECE459C47181\ E51368BDA4878DBE034445CA2BBF210CDABDA7D681B1949B21750B5A4C904483\ 7DF2D75D0E20D7F9BDE01035:\ 792E449C773073AC251764612F18A018CEC05E08663B55E3AC25E21078D53865\ B20D4215DCFA3B0550805CB7652954560B8262441586701EC27E7EC79A59D9A6\ 903ADCA809DB48F2054C92096C685E50B5F42118F0DC133B9FB94CD3DAED452C\ C592C25C30253CBEDD8498A911F214E07B956A074B9E36B3A263C6A156FC3383\ 6850014D49BD618E0F0CA52E30E1B628B4E3F7C7D68AC98B37DC54E6A2E7C304\ 72EFC0EE3E032BECFE660B50B88CDB968E220CF067122355263595BEE9819528\ D558D06A04B55255899F0A3A704DFDFF4D49789FE55CD1EE96594AB571EB06A2\ 687277396847B14DC9CDB9262F808C2593A1124C7C473DEE26BC0880C26B267F\ CA7A6F0D9810A2EAE7E412DBF804E4B3A543500100154FD58AD42509DE3F495F\ D11593E9A7762AE20D0D25A2E3367A028E6224658F042ACDA555EF61E2AA03C8\ B28FABC26BFE099897179645213A317FA2A01889B5A0E73185C0D902823B5588\ 78CC2C6B49F54D992A00BCB1E0FE975C04CC2A6257C9C21B4C34390D16CB6BD8\ 05E1DFCF337B485F66C56B47:\ E5364A9AAF1931704A704A65B9836806DBF218AEDC852176:\ 5BDF21C0893E2C63 5E49C42B83923D159A0302BC310DC0552AD04CEE3563193EE8614EFC6382AA8C\ 86EF1376091C86AD82C7C98F6C034014A3037FA9451676B1C0FACD4CEC91785B\ 1D437305384241E8C7B5E479220150F9E1A48C3E045477273FE224E541C32937\ 4EAE0680CE64C6A370A9512104D7CED78E9F2A6C478BE0172825C1EE8266AD51\ 955756B55E409FC1014A6A6D838C6D66DB24C763EFFD5341F8ACCD6CBBB4F1BE\ 7965110E999D83EF873A5D77F531A059AD3E994FA1C62C1F05F97DCCA1C2B092\ 8E554452B83662076EB317300687665169484452ED3533728F331295E27E0CEE\ E0EA20C9A37941342EF92C40EAD23BA35CCC052DD02D2E1E230232A8DCB796F8\ A4EE5EBDFD51017CD22EB1CC247FD4AC0CFDC0B69FF8D59BF72103D7D1B12325\ 47ECCB1D6EA34AD1D0D037077AE6C43AB42F5041E692947CA3A58584E2875573\ 221F4075CDE145A4B07C50C7539866125B8B733E01342C10C9A9E1B6315827AD\ 312B9EE7ABE4981D4FBBC4CD6F744B071F011337D7653B6C43D93C6EA56586C4\ 0184DC2BE1E88C9DAAFEADC3E3A7A737:\ 48AFF615CCFF3B8F3A18154CADDB269F067DD85D0EF412A7880AE3E464EB9BE1\ 567BBCBB4BF07A975C1305B9111A6D45F899A8935A2B8B90AB40C9B8CF1FA0E7\ 4ED5CF56B654CE9D87228607AC87A8AC1B7EEB79FD83246D7BC5FAC28D26E735\ 400E2F6F5EFD7F729E7A6CE9A99ECEFEE04ED6020133B4DACCDE0756E5F3C150\ 8DE68BCECAFFEF5C30AAB454AF870049279C73E32B4072A0A037FD5C8B870888\ 9BFA7F89EDEC41A2AF01A01C9E3DD845F88B7754F4A5E7A2C110E3E617B75D2A\ 612525EFD62C63252E812A109E1BBBDEE5EDAF9FB8507D97FE0A13725BD7B79E\ A0F1632755379FB00A6424CDB8D236F796870420610A4E0CDE1CB5A13AB14DC1\ 20CE241A33F56719FFAA73876EB855D5C25454F64B0E4BC57092D1D8C8285F73\ CB077F1BAEEFC400DEE87EECC7C848652080E99274615874551B64B1CC2B3D0E\ F3FD4ABFC18C5DA95A61D7D3706AB735B4B9066CEE2887C2A714CE8115B8F91D\ 7E01728EB68FBC0D7D632126C460870BE823F5C64399F3CE9E9D9FACD01799B4\ 5E0A2278F693C7A2C9F44B4AFFB74D2C:\ 481FA65B4DDAF7FE670D87EFA173834D41230B31AA3E8820:\ AF5B5455F64B539C 53BEAD5B17B878F07921F079761EF7A267D540BC5731BFDC201F1A454CF465AD\ CA5B1760529A340F8D5D6461A094F20D3F79519496A649A70E5305F6A9CEE0B9\ E6D6C7B1E7809A0D816A0ADB7B5BC992C2532BF94E21A3C2D2A350D8C5095D80\ 29AC899D53EFBF4C0B35AD7CCCC0CC5BD6C9C40D2867DC7CCFEF12078F3A5E62\ 4DA10B7FED2941A18401BE5EA2CBB17311E0FDBB9E3F0F46F3D1A83AB98F2614\ 1E2D8BF6F561AF5CE0CEAD369601C1E4C05387037AC53B9F2ABE6CB1F5581B04\ DA79AB513F477F79CA7AC824B18ACE5A62AB112B3743FB9D811A730D1B3F9B68\ 208E7EC9AC7ACD233B4B70C134F3B297C4633E5CE00D22471AC88BF451604920\ E6AD152EB2A49E7FC6AF77B29599163B01AC3AE64ED55C25BB73F4508F183726\ C1260A6E8D6879F03450F06141BE1C892432EFEFCC8A71235288DF37B541C81A\ 8B8C2161DA0069DC12251A3BD988E2DAF48243F2BC81A8AA97988D7907AD4A5E\ 655557528A8A0E3B3338E26D0CFFE7C793332D2D0FFA2370CFB920E4B54762E8\ AB8933048F2B528E898168F589C564FEADA4004F:\ 6B03D9D299ACC9DBF19DA4A032451BF8C400AD001E8614F93F398EB776A67F4D\ 8AF32224E92FAEF35D5D014210FD48BBCD0EDA63CD638B12D72CC921AE20F3B2\ 4DDEC670146B70E7CD40A309E877C53BC8B5D22BCEB757CD7E25B2062D5AD73D\ 2EA7B3C19377251820169B9CC87A787D5C6D27D1019A8E2E3B866C2191FA9103\ 9D9F0C0F35240B07357F0F857E0E8DE2CACC6313CC92B43B07A3757A2118119E\ B056BA612F1306CB4F7BA10BBD0CD56850D1FA0A48716C86CEC9ED1F88B4E1FE\ 4B7E8CE6EA6BEA15FCC5858AA4FEAB8E66404E78F3E05432A0C8D6F6780EA94F\ 5756CC158AE4669B503C3B2E6325CF18CD356D04790BCA44C71F83127BCA0342\ C22DF8FF89CEB6F81014DCD8EB344909CAF91251A76736CBED0E6700B0BE765D\ 293BAF3C6C039047363570DB741254DB1B221B8365753FB12E48B3D140D4CF3E\ FA0FEEFD79DE5D7FBAB5280E8477C6C24EDC716EFF11FD71BECC21FFE7DB6E78\ 273D24DCC1939C42D2E5C4DE6C3A3ED5B09C2277939B756B5B6B3B1EAAAA75BF\ 2F23DF5DB4E97333FBB577F138F0DD71159AD509:\ 272814882601F9E7EEBD53044D05E3BFE735AF7DA5B4EF13:\ 55A3447CF08BB668 72B4A89C778C8A7D348E3B4447228E65E058AABDA94C50DD11B24954B9F27362\ C11A9432CB32F1E2F9287CD4FE1DED54F83FF0D7BAB4960AA968F6D0A75685F6\ 51625E0064E939AD176CB40837D30209A2FBE85497FD26CC42ADE9B402C2E026\ 87CA259BA33DF4818979C9157E2F236968470F784C8DB4F2D1FCB38D4318706A\ 924ABE15FA31DF55F8DBD0B5FEE7A5B75C25B1000462BFF375231696CCB5D855\ D8B6AF465254DC6DFADD78875023A027228E26286E803841175EE291129FFBB2\ 45E38C594A40463FFAAF2E39ECB165454EBEACAEDAFF9136E602E81AAFA02341\ 2056F307B02EB8F519610DDD864989C72EFCE631CB7405D28AB6EE6F641C3C40\ F90D94DC3804D3400DF8F3700390B2D969D644C129570FF262397DF481CA5DAE\ F635AE4E01BDC9A5DCE8404BED7730B529D77C5AB5ECAC912F8FCEF8CEFE7FA6\ 7A8F201D5598988A15DC385398D8268E93E4105969217CA8DCD3DDFADEB68AC2\ F0B180792B8AA90BAECE7175EDB481D182E83A19EFD7A751DA5989419A28E6D3\ 720585D1F6E1A1662E44D0D786E1860E7B2BAA1F0CF6C243:\ 7F647B760303C695184EB427CF072D2CBE168C00CF8AC8BD67CB75B085503173\ FD86208FDA2D1C24AE647B868E876FB473A399B4A6450D8A6B3EF30353B4D65D\ 3BC08625E965D35CFFC7BF1B362C9E01ADA3158A73E44F50DEEBE8C9EFD8EDB4\ ACD8FC282902D805E1DA403BE81358E5152CAE7477BCD0249D81D5978DF90CBA\ F6A6D34036A083A9A0B32967C192A3D19A42729B9DEBD767785F7A272A2848AF\ D38FDF5FAC11FE4CD9139541F7152CA2AF440CD1DDE5F69CDFD5EC5436573298\ D73BA1E76A4EFC03733657020A09C69877B2A4F2E4C697183F142FBC78922282\ B4457B3501AE47325AE346CBCD8127459F365CFC2D407EDE24143E1CC3D2D0A1\ 99C40E1EA45F49E6B21C10B36C59816979EB18EBEA2285321C3B070173A332A5\ 85345ED422A944221F8BD6AD78674DA56A047BB3406AC25B9298D2AB518CD51F\ 236C3493B244E231F82EE92CFED77BB141211C4722C5456904B11851CE383E2D\ 2588179FC058E860695FACD6F876A2EE98C85A5059A3681F136DBD439C874C86\ 7E429FF582261E8E189DE58A3B1B69B45D8EEA8AFECABB9B:\ 9A35761DC115FC9DE294CBB241A2707F0E3734E8539E605E:\ 7FA6D62960F072F1 88AF6C82AD45DE6C23B0480DC8D4EF4DC9CF75C5D856FA942225C9BECAAAED90\ F0ECB9634D5D19A0BF176FFA63BD67F3F6A177F21035A788E0664E8413BA55B8\ D8470F940F356D6C7E1D1614F0B8D4E25C6C079089FE655E5C9DA7703B37A581\ C00B2CE6E049577887C3871D40885B9B075D29F2D92CC9306B6F0B7E673A64C9\ B1444BE371FB1584D894A740B3DD27DD43CEE1BC5B905F42EB6B3B1DA8D47F10\ 8F322A2CD1508ECF305E348129EB4494DF9ABC135D02748B1514A54033DAE13D\ DB6969DA9B936D7946FCB0317EB71C2339C2B916E0311C83CD0DDD132CFD9D9E\ 7B29A552C899A832CCBEDFE8469863F11B4DA6D916CB15DB06766A95BA19EC5E\ 790F4959FE647D995A254EF52D1811525EC326583D1CED2983F19232746C0FEF\ 937C4A144E18619B62C28BAB3376810ACF2604D85E7DE879A3D5F80684A7CEED\ 448886226F894F536943EF7354EDBAB0CD789AE1B009297364BDAB0DDF265349\ F47FC6A72CA1FFB2322BDB23A2D084BF07AD839FC1711AF0F551ED7428D0192E\ 50F69DD1E728DE81ACB71D566726CC6D3A878320C4CBEE936C19DC89:\ 748365BF0EB638BF7C3DE839631A62978A76C3015A93E582AA139D867A5FAAFB\ 10B6CADDB5CBF08991793D806F7D05B17F80449873087333CAD4DCD0DE97194D\ 55BA20CCEAFAC03BF2C310E38CBA00EA2305E7352316710D781261BC76B8272C\ E8249B2456EA225FACD6BF93E255D68A8B38D062D6CB471D52C6BD4A30653BAA\ EDBC7A7EB62C93CE94527860540A741F7AC884715E713187648801229803CF78\ ADC5DF414B85C44B92E35845AF7AB2B474B8E2B983FB17BE603AAA050EF962FE\ 2DCB1BFCF094144BFA0851FFE53BCFCA33458287D2CA8D361809C56A99B3513E\ 2F415414462C93C0AA07F0664B5116DDE47A13FD085500FB29AED78AB1713C04\ C3644DDF1503CE5A070154F18B601D3127A273F370405ABE1083CD8C6EBB97F5\ D71A5699F18DFF8B5B96D1FD02EB83C151D86A483C2BB1B9F846DA47B48D7345\ EB7318836AB1EB702F05B1E8F552ED990B8B1FB23A134003C33A83240FEECEB9\ A9E16FD1B5EA15377577B41701299D0130C6DBB41AEAC395EC06C241D40C541E\ E1D7192C39880FBEF4D190BABB216769CC75A73E12E0BB31BB4560CD:\ 46115B745C8196BF3E7B2EE39F9B660F4FA9213328B06AD6:\ 32DB4603B9CE7B8D 880CB4AAA5E49F2E67301B8105C7C42E4C3A021067E37A9984F33E82850BD04C\ C6D7948257D1B07264D3CBB5FE31AAACB30779859AC5075B9475D3B6C76B4D5F\ E910E6BAA050F5E45C9253FB667F557FF6C7F3E56FD94EB5D3DDE72076935F61\ 9326BD3FC98FEB8BA62788796A1E8DD5738528B053C579F4FCDEC7913C919A88\ 4991692A94C12CA498E96012FE10732C30410E32943BD5960F560B31A19C4C88\ BB868EB058B788AB5295D0F9B98C5AF21A4DE533368724F17A01D955212AA33A\ 6B96A081085F9FA3BBAAC39C88E55C851D72C24B96B7A3CB574DE516A2A6923F\ 3A17B7E896D5BFEE8E19FD0D1F73073C087890FFE0F2B0481F9FB454201ADCB0\ AA1DC04484EA5DB2EB10175DA8E2C003D6700D0FE3F2C8559BFD52E89295FBBE\ 3BB2BDE1FBD452674F5A9ED11FE5E11B855D2770CC9EF058F173E64BD8282CCB\ FA82451294ABE4B65F36AE2123F9EBC46AAD5FD70C1DCC9BC5896D8C701BD206\ 3C41C161FD8B7327D01003CB4F62832531DB9A964A10F0FC3D99138F138DE21D\ F19D5B7A983ADC46D8BB6C7978BA5344029B7CFD9DF6C6F971791A12758A3194:\ 33175826628CEB8736FF891D93230BCA418002DD41AE0DCCA373E2E21C6D8A65\ 217A1435E18C9F6B854E8C8D37EF0EFBB6997216B5E7D65FE162749801322BBB\ 71AEEBEFDB066EAB2F03D80B9B82B648056EFA7D44D2AD3539D3C651316B83E2\ 1F2306E92F47DF77AA3D47E83E92F0C754DFEAEA6261241E5F2E916E8FFB09F8\ 8A22B47BAF07DA26C0B6A0DA63EAD82643E13DA28924F697FDEF14678465EAF3\ ECF0DC9C43EC776C098B3434921679468BBF56890CF1AACF7F5A1347B2F27B73\ B40AA13A060D02DF6748BB84E9ED73746FC30C6D2E5A70A61CEE51870060118A\ 06A3439522DCAE983DAD0F4B64FACA697ECB4ABFA57E9CE9FE4BF69DD67F2AB0\ FAB9FE5A8E54E4E2E165DE9B400FB6FAF23C624528FEE78F13FE8808EF84D100\ BE45C538EED4A291A2A615E6121BE2A9A37F79E73F3C3CBA7D38FF19104412E2\ 159BB93D07F1A125CB1669B351E5968FAE2B6BA0C201586C3270278C7C4398EC\ 88372B7C23E7CEBF3E8CF0C6A3F6852BCCC1D9DFB09A25FF0457467736F3EE82\ 4CA555C7DADFBD00DD27B30E8DE7D3A2E1ACA8E5ECFF75F7BEDA63C70F5E57EC:\ D781238EDFE368CC4C03919FA36A22D58A732B8817486A6A:\ 348A67FB90EBE157 D184A02AF2E0E10A69A92C047726FF67AE431138668821856BC352973AF3BFBB\ DBD33C7E822F47BBB6AED6B8D3C11DD18667E901625AAFD8A0F4605AC16322F8\ 2FDC90915674A5ADCF3BE6E1D9198D177282E6B09439428654F4B37082CDF2F1\ 651B2478892F2D8AB303E3A20A23E8EF90DC588AD3E36B26142F481ED9E8A922\ EA4E8C1D599F11C87B8FDC197ABFA65C7B7F386CA77110FCBF66AD97EC1C5204\ 453CC156701D31A03B83A453CCDCC2B646DBA2F5A1D8EADD7F805A890FF5DE96\ 40DF414D3AF314D32D2EE33FD81DCF70BD775ED277A4B369EE45B3760BE8B637\ 138A1A747ADB52A5B196253612F969E9D417FA7D38DCA78D3E96E130965303A7\ FBC7E090AB8D7AF28D7C386C76F5553A9ABD2F8DDEECC3E4A4D1B1E187A05E77\ 4980D9A69C4653B28FECCE1698576875ABC5289223483B2759790A6F7A964E20\ 7D058A5893E6D89A623E1C09C5CBA52C5BC3AB5A3098AE3F704B69A8D20D75DE\ 005C3F784787CA6C064CC03E4659C6BB7F4AE3C5D8DAE12DD3B94F8F462A636A\ 8247530A46DA3F1FA4478CFF03CF08780B50FE8572C3FFAC044E0E71231D4382\ D4F31FC4:\ 7F4660F693F8C07345BBD6E74EF3203FF8B653E48E6735679DDEA31C052E73D8\ 616493FE2D601976823EF96C7AA411BABC632EF5DC6C3BADA97655AB3FF3ADC1\ 4A452573E51562AC3E85732150B20671028E64E0C9D938E398968C821C1BFEBF\ 5874AA628D6203C95566A98114FBD1C3D5C17238B8E1255BC02885633CC4B6DD\ 824AFF1B1E7C39990EE2E513A8F3B29490B6E46F0FCA78E7B91F9DFE1D87611E\ 95FCEDB64F64B4A0B95E001DB55769F23D0D5DFA929FBF0942CCB615D6A8A45D\ 7ABE6FF2C5E02BC158983600A04141A63A3575CE14B124738A4671262C75EBBC\ 5594727FC78569F7D83B4FA28E79CADF80942C0F8093473C09C23E0035B3F821\ 736175282F801DC82BA2CA6441B7CD49945FD9DC6539AA9BD15EE203298FA639\ A34BE1631E724EB320A0FC215D71631F574B2F822ECDC8AD59EDE641DE94DE18\ 0037BB815D0D667088BEADC0C3EC88C075C9BD2BCECB8BC4CFADC5DAE8A1CCC4\ 131ED582599DF4BA9E72F9D0F103B8D8909AA5B9D0C3C14B4B85C801C864AC0C\ DB39AF01F3E9BA0390CB744DB2976FC8541F7D46284B6698B4BA80A22F0E8A5A\ 796D034B:\ CE99B2DAEB8D8D838770CD20797B92E9FEE44BC7E613FE26:\ 58EDDF8F4961EB95 C1E31324A12D13EEAE38DB3EB0B8ADA43A1AE6CA8B85ADE8574E0D21699A1720\ 24989014AD40763A5D91EE0FD0072BB253E7B9A7D12AE6ED40394FAC153E781C\ 7520CB682291B87C83CE0C1D6A16CBCB890891381E204D9CF9F54FAEA53BD70D\ 1AAD34A837B6208F848890C9C94ADD13E81C730C88835EFA0620EB9B3D714F20\ CB5C7DAA0822062756748A8B601ED55A265DA8273EA5A3EF7AF27E15EE6002AF\ 65C6AC12B55890C3AF1EB6853503B6499FC3446DBAF92B77A98439CEFABE2DDB\ 72A6C077A94FFEC2ABDC91B1FE9DFDEAF49F58F6AB4E42036BF5A027086E57E7\ 6B67713ED090AA9D85402027D84632355606FC82B07B4F966CBED0FBB5937E88\ 59DB8E5AD58DC2BFFA7641D5E22A537D7C3B5C9F57BBE95D56CF68E3E0748D1C\ CC0468D7E7AC1941B76D49BC957969B6ED6A28FDA9CF75834CC4747FA8908392\ A2E82A9AE352B41DB44161616B35139B4CD42EDD31162B114C604ABAE5843B21\ 79AA0B617752468EE97398D1ACE2172FA68BF1C1D44EEEDB676D15789519DBE4\ 18D7ACC69314032E21E7316DAC522970B5F0EFAD2B1C9AF99A376FE9F7AE45E4\ 314A3CF728017C39:\ EB31D4353BBFD4AB9F2AAD58E69B17992B8FC696BD0D1991443A51589F31D420\ 88D706B4D8E66846596FB317E3A3EF9A7D8CD97540B8A0421D9C8EBBBAB66CED\ 4FF8C57D95E330543F4FD0B80C9223C2D549D08C944923E48FAB6C087A052E56\ 842FA8E82F6A3F73C79DBED3CC018AD14F2896AADA099E7E8F3F864F0D004782\ D7DF3D27B742FBEAB6657AEDF1FB467B014EC47F279EA04C02025A0F8D92BCC5\ CF3C554183B58CC4C892613CFBD85D5AC1EFFB4A329DEA31BE1526E7597E4CC4\ B8FCD8846F41605B9A65770CCDB6B4BD56BDC78BCAE87AC7DF34AB059587C5C3\ 5E2DD2592347220645FE3E1FCAA5809723340492286169292D4C0CB37ACB5B0E\ 119E0BB74C37900EBADFB433294686D7621A21DBBC8B3BE8BF0084E742C3BCC0\ 0580A847BDB76E47D05C46520438A831257F16EEFBFAAC29EFCFB661A3858EF8\ 44EBF3015C5E86B804BE3915FE70FA4085F4879F96D0DE84CD2D34D20DB39246\ 2CA346E35CF9B8A12B7C2B01613528940EBF6B7A46BC015E34A443FA95A2AB66\ A8426D25BB4BEAEED5859A510F3C302312C8B29C8320B33DA38AC5F81AD0D3E7\ D7882548E91309A6:\ BE52BE195399CB2F2D84BB2C791573504C3C08DDB5430C12:\ 48E24F3FF595F760 5F1A8C0633F3404E9AB98D9E9D94030127CB19A98AFD74F0ADB29AEA593F88D0\ 1B427A871C1ACD6DA823CA06A7B4EBDFDF5B44C1D63D79FC2E42C4395AB01D75\ D20314ED6710355BE34E273CAD52B09DCBB33780932FD34640B8F0E92ED4032E\ 2E60CD5E07CD7CB1FA3FA0C2A1D979D48195424E3FDC234C9469D8EB61A42DE5\ FBD467C58899AE2EB9934AD2D2AE36366C2B0CF79F4DC588BCC6FBAB22F826F0\ C528BCE766FF96B886749480489BBA399D26E1ADADDECBE0EBF8B560E25288FB\ 4D43DA676DCFF245AB8FAFFE9AC32BF57FEA4512F73E52F2B05C726DCA64D987\ 0E26CE296A3FF506478D88899D70E368A312420133205FFDB819CA71C56378F2\ DC1AD4C57E67ED057D15A0DF21B5EC609E2636C88FF135544D13E7F68D59EAFF\ 1FD71BBCBD1AD20095708B672D07BDFB559301B8E26F94DC7DD5C85FB6F238B3\ 098B8293CAFF217BB1172E03948A53FBF1EA6382E46C24A2BBFF3B21973B9D09\ E5FA2E24ECFCE4920C864DA539CB95FCB9F095357F2547EE9DA85D0793B3EE9B\ B75E0FE66F27F9FCEC51911B037478F1722D98229AEB5C1A80109777F3D9B5C8\ E3A3FC24A9CB654F9B3A1206:\ DBF587B0D739DCCEE53F1534BDD606AD25597E238CFC584242E8D04D01366761\ 903052598AC508827D580A3ECF55FFCED31E33AD9010185F9851090D7EBC71C9\ 5DFDA4F7A1BB0F5B62D889CE9E8B086BD94CDFF73BD8C83EDB67380954911448\ 86A23A3846040FEAC5FCFA226951D32AF26851BE06609CBC2C983E6F510AC6D7\ 8EC94BF17AC64BA345580BDA6DC7373C487B1A2942CC0DB6231C847B3B33191F\ A65A28E9C2DD5BA26C0F5C937EE8D61612E88661FF9F75EAE5412FB83E21D2B6\ 843DC810624736D474075D43A6BC30F2905462BE2CDC792D436F41A5B28A1E86\ 0F24ED4C163BFD3140029D39E78FAB3EA2428399F200A2FC03BA333B313F8B81\ DA0A091EB27C6FBCA677C86E8E7D80FA52341C1AC478F93B9E2757322E1CB09B\ 1F784DEFD5F2C9F3D91D5A99E04CCF81760D0EB3D6D47E73363C1C912720F56C\ F2FD9B3EB2C35D81E6B5D98A64B9ED907D09FD82CD2003ABDA05FCD89C460F2F\ BE0CFDB7B915CC4061B6380142243DF57F2DB475253CF4205B8704EE664C9ABD\ 16CAA305F374837E2383D90B9DC40B71CA26F62983B5F3EC67A4AAA5B10137F7\ 6FCFBF40CA6F4C0547FF27C0:\ 7D0E35629102D2B43C05955BEBDC1149EA841DEF772A9236:\ A62D0287246F56B8 7E20C76A0F6423C7B91237BA3146DA58C3A8FE3DDCC3929FA2DA53C7796EEB1A\ 763FF3E4D04CA218A0A2B0E4179BD20E75C847A20A8D1AFBC73947AE49F115D4\ 0A10FEDEBC814649FF46BD240D7ABA37E99FEA9EA531D6D9E796F29C551FF70A\ D7534FAFF4F4ACD9F97437BE5D99D8216593B4EB4D5E0FE44E0725BB9D8B2516\ A40862E67376FBA7D38A54F10E75A3D167BF5A0DBC39EA533CA0BD9348AD737B\ F38FD4839F8FE6C49B50CCA89F035F02533B909861222FC6E69CEF8241C5A098\ C9D35390BD757100B62643F1E406043F36AAA218FBED89808D07F8E98BE073B6\ C5BE89B067DCA4AE7C711F66AB32B55E07A5A413B45AB978EA8B43AC0FC2F49C\ A6C99322E99746EA2F5F6405A5EA22B66BDE570646F15E344B431558943BAF70\ 07DD1D3B466BEBE184F71D7C781FC6BDFD6A46788992786AE84FDD6A99FC6FA0\ B32AAA2151534529752F319EF3F844612CDFACC3CD9BDEC29EE60667F36B4CD4\ 369CFA3831967D1619194CFE30024692CF8BCD298FC88F589412BABB55620923\ F7C144FE0E81D3504DB4C2327F5739A698D52AA0212335AFBE7FBDB336DB943E\ 25AAD75B15B4CDC83E11FDD5F95E15F1:\ 5184FEDDACBC6FF99A0045F9F6D79B29A1C983E197890FCE048F1F2E112A04D3\ D57C0CA49CC3F76ACC4A12A032E8E292AFECBE9E1D5EDA0747951232B085F466\ FBB2D7237814B84B69ED5A9D93D8265DE6B8D86FFBC8F3E21013053CC6504144\ 489B7C119CF123DE78964280AE78D2A3B6898BF4C4F6B0AFD47FE8E02ABEC796\ 4B1FDC64EB7B4E4E738BF4805480D92201337E6E9FB7E6F1F3AA668FEB5F449A\ BDD8E7B8039AC207A0B0A35B7CCFEBB13DD3BD450B2C43BDA09827A9A8692589\ 93BC14E58D4E53BE3DA2E4147DAC7CD5F950C3B14DF18E4C7B3B0CF3637D1EE9\ 8B38215736EFEDFA3DD21738A3D5AE9992E40D4D64DF376039CE58EC9500BF21\ A8AFC81D13178958C65820B725A3B600FEC7B3A60799545CC8AD417DAF3A7049\ A8D45047BD03A21A4BFB630F16690540CB77B676CAE494A17247AC715B7D273F\ 89C440944D8E0D741C17FB82F6A9A1C1020826BAF8212D34288F70BB50657356\ 236BC0E9D75DBB86AF0A4564D7E2663FC050FA971D152EC2A1ACD627885828AE\ BB1780DB1264C4C00BE0E0711D871117A8080B2F16E44F63AE20E02F1522FC43\ F2DB7FE71A1F869406F8ECC92DE89E74:\ A1693B445C656AC857AE865C2F146522A6F1C7026637CB10:\ FF32D0FA13F4B46A D5EFC2B4655D791EF70A683983F9A50BCA04535422BDE57B803378854522FE5C\ 052672D4C98C2AA6EBB1FD0B60D2A2279A9EE8D369A375C4307DAE948768C309\ DAD74AFB5BC442BEC942B4E18B4009DFEB9B74C37A2D5AF18A1A6FFA5133DA3B\ 1FE97E9714158ED411E047EC6328D8A082A3C04FA058A89BDF8ECCFE7E5E9C19\ 2E8B7089FDEA66F25B75D8BA9EBDC98ADBFE50716DD58D65DA2B0E3CEBCA7AF6\ 0A18597CACF0A0541A63A52056D504C2DB3E8118F20D9D02B1D4B877A3EE36C1\ 4474D0535C786CD507F231B72FA64EC7BA0EFBBB320EE692E4EC9CE75206F804\ 0AC0125BD4D5F0B4879A6F9785570365821863F1D43551AC87A9104D82C4B083\ 7BF80C0F955F43F48113F01337B9B37B1E0BF0826B57BF5BFD0A0117EF5821E1\ E833211FEC425DA8E5924FB5794A5CFB706BDC13B2D246A89770505BD4E67B17\ 0F2BE51301219FC97F4568232A98F4521886FF6A4928E07DE8849AC38FACBE21\ B2D69BBF8B1FE1A44428A551F04FA62D00B2D8848AE83A42B3FA165D35E584AD\ 036AD0746374DFE44E650F25A4F72DF59D5BB974DDE6CB7E86C4691E825453EE\ BAEBC13BEF7E279E63668DCD98C17CF86F309BD7:\ 85CA6E09A63C848C8CD3E1C88EF5484E30FCC585E268499279F1DBB2866C2069\ A23141927AC4AFD4DC0CFA2CE44B0BA02729D5444BD946528B3CF0DA3E08481E\ 437A7A9717EE0DB2A4E9F99A5648F8A2B9ADBE5FD7A234541C1B5E8DA0B2DD22\ 7DE6783FAA9B79CEA7C9262946DF15FA04487982A514D67FD6D58EB6AB506E7B\ D4663462862FA17C85E9AE1BD6ED106C639D67FEE6E85931935FB859F756EEFE\ 59EF340EFC30B2022F9973D9AF4967379BEC95574398F48E9235716AF57CCD97\ 81B7A404676AD1A3EB696FF7C2D05479541AEAEA281BF11DC4C16A186A9DB1A0\ 8A3DA311F9D9829A28DEA38C730B19C114A0EF1839C6A95C68487D90456603F2\ 9F29E23686B084A69253E4EF4FE70A54A9C6B3D3D4F9654BCA0A65F238AB2A11\ 55CC78AB23D0C8DA7A749B88B800307BDCD5FBF94F1317447E57B872D6AE9FA8\ 1B36C8747BC78AE1C357C115D541B8B83FFC54B02E36D0CF8FBA7E1D54A6B033\ FA419A9A69C4B39040B20EA331438B4B468C0B43D929AC36A79ABFCEDC241A32\ 812EC609D44BDAF61B3F25466668DF9F912A075FEAC397B7B13EB872D05C5A7A\ 729F3C254CBF54D8BE179278A85D89C79C2CF370:\ 28714FA7BABF4E6A5A7E2C7BBF489209DB3826674CDE9828:\ 12612898F8DF5697 0B5CEF18737F479CF817386EF44A017C8B7793080D5133175703BF0AF6BBFDED\ 410B6F55A32E678AD3844E756CA9BE031028B9100B7A354E05AB2CED46CEADD0\ 31C7EFDF5CA52159BF669669997BE25DA8537E4E55CB5712385D00D4B209E475\ D0CAFD2593C019D942AF863824A4B24B90B2B099717D9DF0ECE879EBA5143DEA\ 0AE4627BD11DAEA8670D5E3F52B7C5B899DFD8EBDE05619B0C349205A8837B18\ 81B7D16463C44AD99B6F0639EE8BBFDA413FF36A94991D9CF0ED4F0F517CB8A2\ AFAE1CA57BE8DEE05DB161A10A1FE0C2E69673F6969F76C19F919021FE86797A\ 85111159D9793869754CC1AA3702B05BA590B96A18859AA1D64DCEE8AA254A13\ 3AE1C57D9F7788D956CDE737D5F67B1F31F86DD67B18EEB905BED8CEA6393696\ 17C78C2B70186059FD19B21B2E4DB1755A4F47A116AB39EAD06ABB4D8754FAF9\ 32EA369DB6E164F3577F2529B76368A19A0921D6A572C220431BB2CE1D20CCA9\ 7C3E7DF5E38EE718ED4FE5E64BCDF3274516AD1452D988091562447EF94F29F0\ F8B1161F422A772272AD9D14AD16AAE0CCE7F9F368542C5E3728CA5A3E246FC3\ E65783A106AF2823166E7707747CD4FB0ADDC8DFFDA8171D:\ 3F1C038C678EDB2951B044D2B28DC10839FD112830C5A124D0077E4DFC8C1AFC\ 8011D7FC5EA03FB9B71E96DE73E592F419A1097A7D3443B95F25F477CC6E2818\ CEA472C864D87A260C19124B669F7CB132004845C87CB2B9BEA7CF36983E8A5D\ 09AB44A620B414C3A395B3EDA8034548BBFDC130584A025BF671E4662BE51AF2\ 6EF1E98045599322BDBFDD5E7DED654D8E8964692A611C292E97C7ACAE6A3C89\ F58248F2D699DF3E9C899B6A323FE0D4BD833922A9C028C693687E076F840963\ 39A6B3627B2718E93F18097F6EFF14467B60040E81E0DB2FAC283D56BE1CBB3B\ FB47863F36BCE01DB727AD280B394AC65BCB870954D04C6CC7F0431A6F72849D\ 25ED8D883F8319BCF21603F997461D7F9B9376A18307CBECC0D0C0FED7C6358E\ DD10093B161525999B50C673A557FB36F11BB63A4CC4B3C37B47EADFD332E27E\ 6D1DFBF216C535D087FAE46A941AE6271C47736C47DA38008C78043F8097C0A1\ 41AAA2A9997013E9DDCAECBD3326D246EA06E8BCA96B13998574D9083870091A\ 97D3AA55133282C2348D3E5C9AC097FC7AF858A526F1A0B09224D393C968DFED\ 5EDC5E3AF267A991B1C01B79DA0AABA17CE292253C5A8659:\ 6103C50E4C8EC76B1376D2CD980363B4354FCB61ECE2A524:\ 4A9DC67DCE5428AF 7368741C50FEB6B0262AC0A348ABD964A042080AFC2C95700060C35A2F732B19\ C0E8E847D8980B81CDEFC8625291536C50D2543418DEBA82F18C807315DC5E91\ 93EDC66E6620F7D565215E2E8444016FE1505E696F22C97F9ACC3D459E25622F\ 84489AC227D0CEC84DA5BA682E9493489CABE454576FDEAEC803802C0CF86DFA\ CC4A3F6561ADE9C0419DE9895DDE9AA64ED8E9E0CC5E1548A431D12C46773840\ F741B5CF61534BD1D27BF100935F7217E1B469647045BAB2F63CD76E8AD4C2EF\ 60A33DB917B9B545CFD103895931DF1811471CD0BC2E48A363774A59D0DE1CE7\ 573E06AC7ED19126CDAD543E6CC41329FBE64781F66D275B2EFB2DC12F6C20E1\ E52784EFC9C50B86285AAB90F30F01E50CBB22CCA499EF4FCCF8864572F27EFC\ 34584F5FACBD5B1A12F19EAE5D2B31AC085F3147751825CA9C679C70C353D989\ 559F84CEA30C24D33C0CB1FB9DF90F2F244661CE0E70E94EBE145F8D6ED08D4C\ 4F51FCDE422D2536389F1CF29E9BE85B906F30EDB913DFB6958684B542A09CE3\ 9C40CF80949D85A1B6300367D2D699C4FD71F2C632208E1F5A12B3B746315E48\ 17168C2EC4CBBA01CC6DC9F7CE84D7751EAA66A84AC639F34DAE9F4B:\ 125A71A64FD9BCF2F6199B9B7D0BFD4D0844BFECDDB70B9B3C58988F883CDA46\ F3C8579BCEEF47270E0B371491FB40F0F64F95CC7B055B9F8D651203ECF52E6E\ 113998369D30C8195D18EB1CD2777814B1F8787F1B50C6E89B3CD953E04AD8FC\ 6D0B0FF857B2E3ED15CB5DEFEC6FE887514D06A053667C5069EE6A030705CF9C\ 32009188BA4400CA7E60884A4825F16210E2C4C4839887886EC173FB09A0FA7F\ 1B8C2C9C1DA193326C776EC43D70D5D2CB8ADAFF2E0DC0F437870C284A23DD9B\ 725335AA3228D047A7EDECD64CF8DC52669E72514DDFF6A2BFB0F0A9316421AC\ 2F62A767801FDD8A00993D7C5ABAA47714D6259E86506BE1C37F211F6F91F04D\ B2F3FC3B26BC5EA2A9B66C91124178AA1219F15DAD459B1250C191E908C3D14E\ 7F42C4D8756287D3B6A68051599F0E74499D13826A1B5D863CB358027796819B\ DC9A718EB7F62F3F5BB221B4E4406E17A6D6F04FB10ACD096CAB8FD11E602E0C\ CAD15F119BC8BDEB68C50B382B5F6140E9D6053640CD09FA595C08584160F316\ 26E6EAE0CE40DE68E12717A4E174825B788448F324391C4249E0004031AB7611\ B59B4AA1903E67448A9FB6A2E30C8CCDB4128F3D9CB48DC62342DAA6:\ E27FAE46E89D6C1ED3A8739D081D0D8D2C8AE46D83DA11D3:\ 5A287BD3FA98DA9C D2E6EC03AAA82F6666418C4FFBF6974A767C92D2730837F3D4854037197A587D\ DE7A1EDF6CC053B1CE3B9B218EC24EA0671246619E02CDD73E9A1206C9F99D77\ 0F96C9D1E561404FA23F7FEB51FB14B342A9652A5FB87F55E3958EF62E3CB897\ 9953A7835B2E51A4A68C9BAB7F2ABDB9119F4D8BA100A3CDB57A99F9BC95114F\ 16681A111914A424A9DA081B781450413494857B496AE4E63EE999542E9091FB\ 30E221D5F3902433EF4FC73E9E81C774D921E4CD86D6D6218A47AC50C053812A\ FAC3DABD1CE064859C18AFEEF63897E5DD06F71E84936AEEAC3D2C55855665CB\ C179E293C86DCB6CC34FCA9E32645DF23F41D3A56C1C7BCCE7C0A119B5FEE1AA\ 0CD4AEEA3FE84D79B7BB78D19FCEFC732CD5D2D72DC28E227190C1F4A0915EE9\ A3C986D26EE7258C528F9B07BD377DFECB2B63BBC08621DA43F24FF2D901D408\ 2754BF3FEAC65328C87EB52826A85DDE1C856142EAFA2C23CF401857DDB200F0\ A7245AC2DACE481B2463789B74CE52CF504427D6600B46E0848C2B170E8C7536\ 5E82EE1CE3A6A8F0A7091A30828DFF05A8FCC9123A17AE916D6895AECFEEC0FC\ 684DA570C3BEC0B2CEE4959E7AD2E74007C2B7A5DCCFD76A6A044BC5E94A96E8:\ 3A33C663146466F9B17841C6A1812CCE796F98588DCAA891E9C84AC8744B6BE8\ 99F1E1B1AA26CB3E80B6E3F9FA19ED187FDE0757B6E15E80269FFE667F83DAF6\ 9ABE7133794103641ADC35A9881B15F8DA308BF46ACA2C33B1AE937721371EE9\ 7A0DBBE65AD4DC6C18C9E2C6C00F278B8E13011BDB1F976AE8038DBA4B6DBE10\ 5663E28C2AC1E4375708433E988AFE5096FFB7C485D6ED7D57A82ACAA9755045\ 3E9BB5F2C25C0EF0468EC1C3FDBF881DB6075A8884235E23E3BE39816E29644B\ 37DA9FD767A853C899C3AAF91D0CF9FF31CC79AD965EE3C789583E2D35A2F1A3\ 505061F3EEF131A20E9042A75F0AA32DD4942A5B70E6BE3AA3F20CC621D8CC4E\ 31214AA99DCCF540A80CA3F5E2093161D59D62AC065EF5FF66D0388854DF6DE6\ 8F946E95DBDFCB48A52C495EB0D7BF1B00D79883A5EFD28536F0D5D99D521780\ 5CC4D308E6A50E75255B286902CB586FFAB43A62A49EFFDF2B7D39785D1B5EF2\ 97528509BD90AD7762AF4D62DBF9FDE7D6F26B35C183606DD1AEFDE10B79836E\ 6308AD751B25082F17011AA7B4FD91973277B8131BC20ED6E8064C9C92DD2C00\ FF58B9354B45BD4D1C268CC078BEA5EB4371B8281EB060935274A1F071415BBA:\ F82127A92B2B1CE42A944907BD71363921A27FBAFEEAFAC6:\ 4C10029042307407 B498E657E77F564CFB09C804645F7E40FB6E7C2FA60EB968E3C7D23513D5726C\ 348857B06EEE3116675596DE2FA6C576E0A01C2F95AD3B81C0D0D0D79088E568\ 09F87A67E81583828BCEDD7D154A645D73F3BC5E0D2D1DF790092019FC292D35\ B73EB6CBAC179F95988BBD739BF3316DC8924F6B451AC11BFF0A01705A1B234D\ F82166ABFB7EB4A4A99E9041C0B8EB7DFD89B2F110AA7D5F971F58B662906B9E\ 1EFE77B597660ED73861618CEA40535272BF1704E5349AE7A5FF16869AB91220\ E56606E2F04B8A60DC5F667CC35AAB44CE8F6531A95DFB17CB168131DB2DA918\ 6ACB8CF395597FBBED3B0315F33E7AE148DD5D514DB1BCFE6153E39F4406B6FB\ 8F5A8700135B9F8FAE96ACC7A2E8954336F4B4F508CAECA1CA351AE5D02A0B47\ A525E6D6171D9398EEA8BD969423EFF7704329E0249C49B3E7903C7EC514EF7E\ 543DA8A9444C8453C110F3A9963C23DA0D8412A4DA40A0C2279848DFB51FC093\ 2D5CDC742080B2080373A1B9D9D14518D1D8A9AB7F3C1E34837E3DF80FEB9D64\ 6E8E3143837F84031A894F5BB359AB194EF19851E965D0CF1531ED0011E8BCD3\ ACB3C156361D0CA8FFD1B00CBD71444611DCD3E539C41B18F46C6036669C74F0\ 4FA49112:\ 141E77FA01EE4AC4495482C3E2D004DBC73907007B2D2A2C68349CA02738D761\ E2F4C40F7A7A547B81B274014BE1B394A7440AEB67BAC6971522C1498A5977DC\ 390DDE6E40014BC654109F7442FA3DCBDC29DD1408D47C8C9FE39000CD5CD50E\ E73C4D941AF0F6C0ADC66EA28EDE9A575EF66F486FB1E9FF16D70D7D6CBC2772\ 6C23356D6465923CE9637A68A145133850EDA4E743F19746E526FDE79E0B12C7\ 0E2AB8C5FFE2AA766563FAE99C0F2405AE4011CDE80764F2F8EFE1C6AE12AA04\ 9357085B25DC7E7BEF595837DFDE18C43DABB514D025B544D2ABB19A690D587A\ 7FE25BF9468F5A0E20EB4546916022E3B904C80A862CBB25DD03CDDFC4D842A1\ D04A960C32E03AFBED6211FF003BD2ED384D379F5F8D02BD918CC47B40ABECC0\ C0E540CC8D673D47D25BAD6F16BD12BE9A799B8B2538932D21677A0A481AD698\ 6FF193A455270451E6D4DA3CAECEEBD2FAB6FF6A15F569A29D09EDBA86B7626A\ DB96FE9750E661C405A3542987F1E16CDB3655D70EFE3F6A1AE30C04EC069B8E\ 9D592051190306A571D5E8673E677E1AC0454A3769C7C3ACF2C222FACA2E7F03\ 9BD5C6972FC7782A96C6F350F64F4966A8E492369B6F5A911D38AB1940046F6F\ F69D6198:\ 004742BB9488135DBAC7904BD58A56BF2F11A844821C41F9:\ 1EF01ADC9729DA44 013202D20D95E17606E6E7C77EDA4FBDCEF3CEAEA4E3665AF9B7AA6F4C7468A9\ E03A382FBB0A998074552CD458522539C6ED83DBEF826DEA9EF830BCA6275FE2\ 1A9CC715C99ECBE6EA90E3AB58720B151AF341F5466FD9D1BC877C07725929FC\ FF62A8D2B6F3040368734B3D1425F6A81A1A159EFD39E27E5D81E487B85B87E5\ FE16C54E16E4D7DEDE7D8C4CC04789C8B0A3AE267968AD961C28A1828BF1DEE3\ 46E7662961DA3B207BB636BA0D2B5BE7D33D186D276002431BB17B549C3FAF8F\ 85582AFE78AD3E5879010E3AB3C1A4CCD14C776EF17E67A698AFD2B1941ADB45\ F5D0444B4D06AC85051B61602233CC6162BE0360720CA01EEFDC157065D68052\ 5000ED8B1C9F633AED07420B9D04694745D0013DE91C0BEB7E7C9CCA02780116\ 91B5C47A912DDF87EEC336E12A4207370128003A347641515839A885189293F4\ 45C4BCB26148840AC667E4D48E952F68E9C89A7C5FF2B8C463A98F39B07C8104\ A5DCDBF7B72E71E17C522CC5E0851BEFE4046E836410298EA4461569CEF948ED\ 12DCD73943435F948F431380637782D59EF8D9B6B31C175762ED6C44740D1AF0\ 84A64FA86968857933150B22595B0921D9EA37075914D638D768670F3F95F0E4\ 0D5660B2A023B17B:\ 29A49FCF039DDAF22E6531915769B12323D2A48CF1F06A71AB14AF22FF38C816\ A8469B6678ACB7CFAC479B830C84E65F4E4090C888B5F5120347531332B3690F\ A5A000C2904C25118BB1BCF045815DF8C0CEE58119CDECBE7A6D1F042E64DF5C\ 4578F1897900DC50D2C3567697593A9FB8929D646456C930085830929F59C4E2\ D8262989F87146AF16A61C2A15E1C3126EE9AA97BD2EDEBAB648A098BA4BC6AD\ 5B3455FA539145E57943BA347E379CD24FE0D6BCA965DA723386FB569918179A\ 8DA0D246F70AF48C7B840A23DAC840E5D5588ADCD86BACDD5D9BB39FB71D1919\ 7AF5F3707154D14E2610DC221016FD9AA1B0755059382D620065C3EAD772AA41\ 87DD24C16BF481E21A017DA62D5E521F3DE2E60DB4BD96C3AD1BA09663143329\ A4187C23F2ECD2DA585017071667F1C382FF3F3A3BC50BA23BF6E7863AEE19C5\ E11032925F9BB28DDCF618F5A594B15F56D077D8123C015077F6AD464F787848\ D195A970F1E0030978C81D2C86C86948B0DA7349517A3486480E29B827F18CDE\ 8BE517B2FE120E5FF6546575F2DFB2B45927E5C69B94FC016D44C5FC8ACEE3B9\ 6229491D8D46FB07E5158EAA021C6B69F720DD57718D928FB191B91F78DCF6AC\ 926DAAB34FA33133:\ 8190659CF5611333623FBD73CB27EBF6C9BDE2E0B4F564E9:\ 703710E9623D9919 795DBB320C532AEDB31CCA66CA67A437C694AAF459DA1F46F33633FDFFA9AD8D\ E60FDC7BB6B10107177AD6540A8F6646A6632D9976479B10D7B54907C81F1489\ 09A807130A56EAA7D3DAE7F45F908CA14D9FFB78CAFCFFF2881A63FC9D60315F\ 5C35086FFDCA1A244F12DF72C5E76A8D004946911A4A8E56DD769A2BA56EDDCA\ 623CA5A67917EA3CD37E495CA925EDECCB0413759D7F2888A242ACFF15946027\ C29243661AD28F07CBDF7CBD2159AD5FF710B31F2BBF8138857A5CCAB2A98628\ A2F6A22B78B1F5E70B7F006CA702C6AE1A733031C70724BC1E9AA91807B5F7CE\ D0A1DC49792B89C557B1C3C189F093471035D73ECD46557AE8111D7B7DF0708E\ 4CE1958D40D651FF4E5AC37C57F213F144B78CC22F701383AEF41F017BD4275E\ 672D9875272744C60D53F71EC77E55FDD2E4DDD7A1BF965690FF89C0FA6F0D87\ 6607A8D04A4AD292C4B2B528F376314A0378CCA764BBB4A2BB9A761EDFBA6270\ 827C222D4BD479F990ABE6824C8336021A76F4B5C5F777090787E1540254DBE3\ C301E8103ABBF71B5016ADB11B6CE75A09ED4A5FCD6E1F593DF1A947E92E2884\ 3E807231CDC13BD5C98E245304ACE15566DC34E3AA5DB8BF2159E1997E903D64\ DDFEACAE8E02126CB1D56BD9:\ B943E172A63343A1DE25F7148E75DA6287C8B5B343546A2A280581112CEB3BDF\ D270BBAABBC802249CA134027BEE0E96BC6A04EB7A34F81AB5749414558A5AB9\ 3B3D8B3686958B25B4A6423D40D6D8A743267EFB222D283AEF1032839A7804BF\ 2FB9739064C5D0D3ADA84861AF5C0C7EB7921F5B87E13D4B44E0841CC92C3C87\ 175117FFB932DB9EF0C546AE90209490B138CB9EFF67E32CC9EC218F55B596D7\ B477F4C64924E91D7DB2FC249E24030049537CB120E3CBF63B1CEDAF930E8A67\ 5D863E21C4AFE3344057E4C368904CCED47BE9ADB0880707109781788AC56F23\ 513D014C9529E35684F519E8ED795937DEDC0734AF61A50DB9E48AF7401701F8\ B18707D86244DDBC8E0330B2085305D0446924F30587D260FDDD6E18BEBDE4A9\ 687FA3ACE3995F386D3ED9B7B8D646DA4A44C664DF3DA832D58634F00A230261\ 1B81EB7C4C9A88C3115E1DCB55EB3B92E762AAE4FB80243B4F9C33E65179826E\ 73D57A04C0458070DC6A6C0428D1EBC4C01875B43361140B33EB67BDF3DD2C70\ 7B9B2AFCE9C7E5D2B193CB1E9ADD08AB31496D86B3F3786329CADBEE270B9BFA\ 84AAE8DE2059CE88B409FF6CB9743B2B5E4F59C4EB93565021C149CB309CF9E5\ 5F99D94B76C271ED0C89FFC1:\ C56605CC3B7FDB9E645ECDD67F66707C6CD05B348F14CD2C:\ 4A2073674C9330FE 39CB105721050C0EA06846CDCB0CF939692ED1A0EA2527BB8D92DE135AFBE071\ 417BAC099F3B7F7A06EA3EDD121BC333B7E670108B4BD0C3DF91353F75B452AA\ F2B24E2D99CD0BAC055F7AC5AA4F6358719E8973E4E2E23E26E2912B93FFD5E9\ E4CC61EF203D72ECED180F616D9ADDB797902E96337E517B481F8EF39BDC4893\ 42534703800AB246852EAEFD3E715E9DFC240515EE4EE5F74C819021A4A081B2\ 7D478C59ABB5BF83C8339E2DB5CF4AD779C62579543A8EE1CDCE1D8AF9D22EB2\ 67EB4E96D7A3771DAE1EBE3E92A1376BA6217CD351B1DFA28E76B871F55DC79F\ 2137F4A6271616DACC5DC1052BE7B01DC2DC740BE29CF8223633CA3994B6D970\ E547F55440E2B57033BA1E412F25C97CD2417984EA264F2E95460F458C99B40A\ D29753A43C789E8CC5D97813BF197CC64D7789DB8E7D01005596713DCBC24A7D\ 05257FAD9D635777F497BEF9B993620B76CFC8302AF18AC76A53864D53ABE4EC\ 08A02C7BEBE061ADD158C3D2805202B000D83DF112BCB7E120453AD4C347B5AE\ CA76F76E1319639243B21591B938DAC089B828B381B0C3DDFA914011D658BD00\ 0355ECBCDF5D6A5C8086C8AF8CC6840439D9FA842DAADD0E5DFC14C87ED52FF4\ 6A33DEFAE485648A1D67588C716D4E9A:\ 5DA8B03C7F9041D7F41CF447322736D97FB954D89DB08BD936B215771583B2F2\ 20491501206A18144168EAD7CE59C279B9E8A28C7E4CCC02573A672AE08528FA\ B030FDF7590B2A7403D960BB002460A2D1772E1CA43BD503931E13C9C4DDC2DC\ 4BD18C2982C9ADD95935E24B5D000298A3887AC27721E870D088FC2F8DD70BDF\ 0B2366CD4A2A9DA179E081DFC75532B4FD9F773C906E151CE8CF8167BB212B60\ A0332D2AD96AA33A66D64A5752713B60637BD599AE5987CDE0B4D7B258903223\ 6050A74BD65E5D0D27828B9E3C11D1C08AE1F9FFC60A7CD735BCAEC5DBF179D7\ 3BD88639034E1F7C47E955F192E6D90F6A8B1F74F00C7CBB575755F3A21E0A02\ 7EB2F7A8A376E7695001B521154B4ACDA68E2B3399DC5FC62BA6ED1DEC3958F3\ FBB453C957EB0610BCCC9F1177BA138FFEF23B91B2F8A45504A251302DB9690D\ 79638A25EEB406A42B759A6358EA8FF886FA9379A5223DAF765099DE4947C65C\ DB30A3097DFD1A7467B3A739D376A48CD2942CAC17BED5E7D937ECE050D5DDE7\ 7041AFE7EBF1BB4B2D5EE6CA982492F50189EA1BDCEE220BA900FBEA1E125D64\ 83207658E46918A3B7A7D147799D56F3BCAD506F8849C327B293BD97D86FCD2B\ 7B5A3BF9241D821E5C96C1579206BD0A:\ 23410846065EA605C5720B0BC2053E5A2A331B486657D66D:\ FD110946E8F54E87 FF164D432F068EF38BC3573316474CEF62A7509808F849B9657443D3118F4627\ 86DE31D174FF8BB86DE93B9D92E85117C1F2475D5B80A5CC7F8C91F2C576ADF9\ 3ED9F5B19065006C0D8D32FC1C1C13D3CEF6C93E5B018BF908C50AB8040A91BC\ C433D56B770513E1FD2BF4B487B20ADC0767BA5A9ACE2757DD84E3411B09402A\ FDE27B886717A71C043B00CF2F35DB291150756DFF5F748A5BF5EA6D3A66C0CF\ 08422673EF4AE2D939AD364FF6C892FF54723AF65F9E53FC93A5E439E1A09A61\ F3E02C35F8237719C3787C16CB75077772A9363662BDCAF4D7A323D613FC2E5C\ 6611BFE8CF1D60BC20B6840CE89C96E28EF4828BC51B36C05C5BE257370718C9\ D0F87B3B486789DB2007707B37C9CB4412E266D17256FE6C6EDED088B48DA163\ 36E0367DCD5560BA5C944F98D7AF3B113D6D6718CF7D530BB2F25B32170AF122\ 27379A542E3071EB880A999E390FEC21D772F428BBF23134A386AE761477CA68\ D0860875A11E3B996DCABB5559FF87E64A33522BE02CB04B15C3399788940FB2\ 71167EF6E62AA26B3BF6FBA03B954342704C4007DF1780EF1BF8881B13B4BC01\ 23734D3A8DE5C38A864E40BDDED3753DD2E7CE955B79CCE31774206BE9DB4B22\ BC8E83C6A473E76CD1A70C29B230359D741474AE:\ C75174D425E5658053951488BB414F89A2EE1FB266DF278BE78E42DCC27461A4\ ADC4F8F443D907A6D226189E69CEEF1801BCB7AE721F09FD2518CB0B95509571\ AA91372B8752797E5723CA1B70949C1C9BA8F59B56777F230518932173D17E6D\ 5A7D4E8A2021902DCC244C39DEECD1DF9920A0F7A14ABBDCAF57B0D5EA207FF0\ 00C14C786786C710A0FDE97AA3D6A5F2988DC64C17138D0D45321C8409F36226\ FDB59A73544C52AE279F0EC64AFF23623DB81349CA8753FCF7D7BB9E31FC1241\ A88B9E701615A71D3B53B8E25A621F85F6608B01A1A07D8CB84DE5A5CBCD2AFB\ 6DF5571E13BD39011B97FEF0EFDE5446D5C2EC729176A2D715DB5B6DB96F70DE\ E1ADEA964643AAC3D2D11FE277C8ABE07B53D4E2784D54E09CDED91CF09219C7\ 6448E6889E2E7F44FF0E908ED18511749496CFD0E2C923D6E7F6E94E8F50F6A8\ A9F33358D612FB968A75CC73A86CF9174B0B99E14409CF1496056BF59FCBB5AC\ 504B4924AE7B2D7C62470CD35E847C0E3AFB86456366255912843832DBD393E1\ 27CEB9F87CE376247EB464E08C34DEA43E6876567B3215B56CFE5130CE1D39B9\ F6967652182C9306CAB89BD6260FEBA65ED74908D70B00133553D022478B82DD\ CFA7F15A874BE568BB37A6B2DB1D5E8CECF4309D:\ 9448DEFAB1274C6004C98EE85FCF97CF8E3841ED05AA05D6:\ B909B4879F2AB8C7 94E86836C44E6AD45FF50CA1A0D74C5025C397B9EAF703F4912578A324DE2556\ F06924FBCE0C7E865B129F9CB4CFAEE0837F9D101B5E8CE29272C7EE1A6AF58E\ 5EC397173B20C2682912FEDD5AC40FF0F01711010350AB88E4CB6B806DAC5D7B\ BE7422AC1D1FD83B0DF3A8E4806B7A2921A165A02C0F22949E6D97EB6DCB0626\ 3F9519325025B7F4BA7EA7345946F575171D20150A3DEB031417F752E1092E55\ D669052E1E24C0E550A4423DFBE018CE33197AD4CD7039C0FD962BCB900471B9\ A1B2F001B5C0E8A40B7A3599DEE31B072DBFB81F5A459D4CDB975CE2CF984FE5\ 0144D8B29BBD1B2147197A79534AA4AB22108D4D20CA50CDFEE235B0B5AA9EB2\ 47D9E9B9873488F9E5CAFA91C1CB8839E6FC4AD39622D58300346FBB7910BD32\ 96D6827685EA80A24FD821AB914B20A7B9230CB34E056487E5A590F4E3CD2D03\ E56CDAE09426361B608DC93D2C4E546F426C1DE6073132D497935E02A124D1CB\ CF08E6368071E24F1D27DCD7A3B586CD66D7D215445257404D486008B7275216\ EC6BBDDD4379AEC026AD02EAD7CA7E7B480F6839C74BB8D4FBD758FF3BA18026\ 7371CB83BF19AC6F30D9A54962CDD85BCA8FE323FBFE5FE55191370A450FB941\ B77A7E89942F605275F8B61C8333FC189256B21D20E3C283:\ D5AE51A811E1CD6F1BE11CED422314814B3D6CB6D8547E486AEB4C053227A39F\ 72E54DB1B517793581951534F4EAEC79D49C994D25DEFBBB96F0249B03880B73\ 0CBF723BB1C49CCB5D94A1A12D21BBEC2B8C9D58CCE5BD49475307F8BBF7F737\ FEB52E433D516EB59EB48DA4E3CA3025275C190C4C3F306BA801E7175211EF6F\ E4CBFCD8DF7CEE48A6A3936C0849075CFB31D572187EE18E6F057E7EEF784D37\ D4BC28D36979E7A8D0715569D32CC6F09EEC8D27A604E07B218005EBA77537F8\ 56F7D883592D166BCB5FFEF722EB76DAFB12691A9BF8C635064F3C6C153BB8E1\ 8C1AE48D6DEC6632AB6047743C5BFEEA51B42FBA59F500426B17C3ADAD9ACDE6\ 0958C00EB25B592E183E7D54A79789D08E97B499EA1011D252C07C1ECF4389A9\ 2031B22AD673EBBC51CF30E8EBE997BDFF37E886227BFD88F3C3721EBA42C6D7\ 3688BFAD82CBD864BBC9919B2FC52B745E216D2AB8FBB6FD1A02A99D77A32D05\ 719CAA4C5438995C5456DD8E2725ABFCFF7FFCE426311AC632F3E0A929695262\ C9709DF208EEFFBC9C02AEED55BFCCBA37998703C49279E0907FC091A17A74EF\ 43A0712996C2024F482F2988C6CF9219C21CD35A9E1DF0990C5EE26C14BE5F3A\ 7504AB439B406628161F09856E8314E83A9AEFF2000EBE4B:\ C8F54AAF1AC36D94D2E0332FF63AF41FC4B83F9031463CCF:\ 33CB7CB2846FAB9C A3F7314020EB905728AAC9648E0E20A48E076775ECE129CA40332FB23F2E37D4\ E30B5E7D7EA1917124AD8FA313430BAB8FAC8C68154F403699397A10B0D802D9\ A933B663F4F8B4A4EFAE5C45F46ED57E0CB54CA070BDCD5D22ABD9079E7DBF09\ 598F0D97F4FF706736D52B46C197A89777E35B09FC5E5089D1F08164E90AFB28\ D0ED03E8EF28AB434390BE895889AA6E1EBFADA0075A654ECE885B479C89135B\ 070F3B705619FFD7C42E7F0CAD0AA3B0584452D55E8FEC6EE245AE724216E776\ 2485ECBE03ADFA4E71C25AA8EBF3FFC6D570EC461A060A3E28A490F27ED34C7D\ CEB7944BBB72D088FDD91B6CAC1B6C6975CA4B0ABC5591D167DC0EC84E172FBA\ 6887A875D59CE866ACD5ED6895B67902EDFF6419951DE5C1E337A357E7B1DC04\ B20BB791BBEF56148AB3A5BC7EC6B9580EBADE1FEC6CDB1698EC5CDA5A99DFC4\ B1FF10596243F6201F428DFE52F6D1034F4E31ED193165991C5EA3E6255B8F82\ F3BF19FA2C1C9E949979DF32F665054AEDF199FBB530A9C3E91D5522504CBD51\ A41D7EB885E12B952DE58EA1E1BB88B1DFE0D15B0DCBDA1D906BC03B1ECED138\ 6C413AC9B375687F0AE00BE6565070E019423844CE1999C20E61C5A9C216CE36\ 9510A3CBCEAE029AE651645797FB03530FADBDA8E3115191E0B3C210:\ C7D08547D362AAF8FE7EBEA483A38C2889B0FEF3B4AC797A3529322FBE638F61\ 5338BC15A6C3AD0E779602DD2DBE821C441299B587636B5F90FCDD7215ABEBD8\ 910D3C528DF941D03CA84FE051868A782E907A8346367A353F0DCCBB7BAA8FA7\ 066B9B2E5BCF29E2D20C42F9D605C5B593B07FBBA4CD04FA9B5B587D555BE5A4\ 15C5658EBF26F774E3399E1C150E0F7CF45C9EE4C71A06D9E4D3DEDE7A51BCD5\ 36636779FBDB5FB616243759A731DAD1859012528F1AE29EC798645E951C6D36\ 9754E470ACC5C904D0DFEFC8830689BA946D7D2DE3B7CE502077B4C17337B647\ D6EAB7AA8D48E9C1F1CE6893C69F2251DAEF2DB88259934D12AB1A4D1A4F93E4\ 9B5168C109700F9E716C7DCC6623390C3008508A0AFC987670DB44F9FFF8E5B1\ D4021F4B121345D144ABF066757D348A0BC34D4DD9F75008066B5BA444C86ED5\ CB02B8D8035DC77DFA56045EF607E559C3AE9389962F48AD3496D8E89236D77C\ F668711862777B88E3E17E6680FC4A70526FA4F39688EC1C4B7E47C539FC2A20\ 3377E4ECA9F4090D9AF9ACDBA4C245F1B8342AD9093F6149D3D98A695FE5DB88\ CD6A7961C6C56D739EEF31402EDD9EF3D80DC1D55E140A4C2BE8251D2FDFC267\ F745682C3F67AA3BA8F5D1DC0330CD5D455BEE89AE1AB358CB490BDF:\ 2C73658F0111C07A0A75A1998E5B2246F7A3A77AD7257EDA:\ 0A8B3AF05B4687A1 AE7DFFE7F4926AEFBB5338070A74A9F6E91BBF11683B676653D92332A6031ED4\ 83118B948A940B211051606D97C23B26402EE761BFF6499CE4BB517702D9CC1C\ 853B42261E42CFE6626C92F026C78CB86771F2852BA6E334420D04294A453AD8\ 9CD84014EC614657C3F264D1F657C69D3DB370FBD19F338C6CA6F779540C8898\ 6EF698E484D51D87518952EE663AF8C066855624E8CFF94F9889CFA90A9E7F2F\ 6D4EC5119A6CC36F0C6551E5786A671A1EA74A5D3F6D9845A0D7764320F45FB8\ 0A8295D9C5756B91C711DFADB8535D3880CFA8025726AD4ADE8005867EBC5165\ 6C59B63AC950E1D2597CD6B353EEEF211340415CE4EC196E10F0749B890E483D\ 5FF600BAF56FE861F6DE509BDE62C57D9A50108F0D9F148677C3A4E350816C57\ ADD907889137271A267D6943405D66D1C6F88B994CF7B9306EC688C4C0EB3E9F\ 2D7E24DB280ADB515B54C42BFE4DEADA12B164329FEF3ED502DFC5F20E6ABA1E\ DB0F071D1248DB67B8CE6DF2B714ECC3FE760BBE70C5E99D532B797274899592\ 41AE6C64472BA435E0B0E51989D9C20F3469290C7A9CEF78DC9877D08B4A0D70\ 9E2A50A954E1F35AB9846AE42E4CCD466667EB19EC31F93946DE481738E812B7\ 304C70807ADED09A66E6783B96F017D95C86DF0BB39EBFE5581A4414644210F3:\ 50F8886790779DEDB925B5CA21E0F071605ED5418B440B79ECCA476281C85130\ 20752B6EFE34CA00DEF44AF65EA9E98AEADFA9B646BA3A65B8FEC36F414CD0D9\ 71AC921644DFCD11774BA16398160DA06C6A5AF3DB6F9A3D2D012E573499E7E8\ 4B4324395AC646B1DE374CA0C194FC325FEA7345F1A6FB8F0702044F61912C85\ 9F8143B4583D50041E91CBB1D520A5CE3AF83F00D4D2C6EED07494F275FE4558\ B46669D66FA8E268AAE3FDDF663B0A9D36381E6839BC81E0512F767E32195F48\ 57BF604A9C0786E4F63F36E0650426A8858DAAB71616FCB822C69716AA05E0A1\ 2E0A7B37EC294593703525CE56EA77A554BEA5061E7AB7DB4076C035B0544C6B\ 49EEA6E968EDE4AD659359B8BBC52D81D547130B6581BA3138308598FEAEBF55\ 4276696E84B38BA0344AA9E80139363590685EC282FE2FC9E243897A28A24CA8\ 9254893DA7C5DF62B700992503BE2B91B8588080BFD61A5CD30F03C46A2099E8\ 8EC7E118A04080D55E064AD9D5D5CF3D00727CC66D1DACE00D3F0BAF5F24EEE6\ EE80187A6183F2F3A9E98B6A8131F549D8F7AF8FA2BF63AF0CFD227661EA5655\ 51E1535EC45A6D4219BA9FB6DE4732FAAC383032A7D4F90149277486E5F76D8C\ ED94FD80030E285E4F54DE215C8ED63402A963B6526BC3C9BE5E28C6B7C02D1F:\ D6D8F361FFDD7D2DE03D13FFAE2C81551A4570312D58EC62:\ F6A50F45C5AA206C 653E5169FCBFC8E0C9CCF57474E5F19C88A359E1A19770274394EF9D9CDB4ED9\ 457A137ABA3D09644D26389CA6C0ED305A45A6C831AD15766F45885E245A6172\ 6B4A10592A8C09B2306096592B6457385CC9095952C19033C389CEFEE6C44EB8\ 8F330DE1CCEF569FF52AFDFA1A53DB226E6BFD0B5C27402C4443A466B494BEF3\ 1F24A851FA78AD668C159EEE859B24926ADAEB4F9D654F1954DA30F1A6CEB172\ CD8CEA39B7ACC205C65F7AD550F9835D6B6C35DB88F7B79663B7B5A5317ABEC5\ 7C9412184AC42B5B3574571180CC808F5ADAAC97A5EC9F8D957F547742ED420C\ 1760B9176B37CA4251B393828C0BA648841812CA3137B1FC8B90DA7A1E3C0498\ FD579F9E3DC1A590B6775EA5B5A23C811C0C8E638422ADE05F0432083CE498BD\ CCE6D69B1C57C37C1A95C28471DACF424A1D94BEC17E7F6432E680E24757BF9E\ 1026585C65A40CD44F78C695C2185E7E10C364B760DCFE5FBCB897B4FECA55E1\ 488F95FC58E3BAD40B205F9C74B2F38924253D68929C6E7D3FA160E8D77045C0\ 5CC7517D6C7B960543DD8C04E5FC5D604BBD15E0F9CB5033BAD7B11EFAD14F99\ 0D7F887F555C19E01224035A4AC43D6EA6BEA8C6B796B5E991EF8DA089981E23\ 1A9EFD24B49CD38F8114F2A41C18489780F78E0A1A900152FAC2C253952C2720\ 9FC9DC04:\ 301759A39A270E4DA92FA0CE410EBF3DABB914CA0BCCE4683BA76BE517279174\ 846CEFB1A728F211826DD38ADF512BC2E2923068687FBF9C5EC9F602517CBABD\ C190EE50E578D346A809EFDCB3A33294AF734FF6226643C7FCAFD86B37A5DB10\ 8379D6ECCC41A0BF30647AA85B4FAB76741256A5D1C45B509F57150E88EDCE9C\ 1EA8001E98C226252E2EE85F21FF7E75DD330FDC9054AC82CF4B8E3339BC6FF0\ DEC415ED379810D6EAE3D94073606352857BC52AEC07D7AFA43A8B2461C5A617\ 022C2AF5FEAF05BC2423256FD148A68696B8604143132AE5F59A7AB984DFE6E0\ 50E3B279CA4294DD73E514B48631E20F78EAA96F40E749FD810FA48B3D5EEF1C\ 0FD66B14F82305FAF6D08D04A5755F2880036F274BA069D9364C8616B812F229\ 679805B707E6C24957D0F112F694AA89027E2524A0F624ED8E8CF9127A0D5A1A\ 748771CFFC646C819A6B30BCB1BAA11F906BA855DBE790516BB6BF97F7B03DC7\ 5AB06C81EFE4046A21212083CD62D30E250AE261FF119424603A32C199DBE118\ 0261A338128301F43557077EF35E4BFC8924D23BB9F7A3FE733583CF6D850C67\ 926C6F082C21B2BA7E0D9A52289D8B0E37E861BB8224AD24DB872A4FAEFFD93F\ D1DEC41F8C1916B4F35D12FCFE4A5324A37D2F45C0D2C3F9BCA21D1554CB6ACB\ A88FC548:\ A9D0FDA8E66738A4E3E5E8B3C4B4A4E0F6D9EED74A1B5C77:\ CDD7DA51E14D237B A2430BEE2B78B787A3711A1D3AFE40E0735C88610DD04F7AF71A1EC3FC6A5F51\ 6BCB72E6E6FC23F49902A86A06633C409333B0B7A10A6D795548008C8E62CDC7\ CBE8910FF16330B39C9F440684382562F14CC2A2597A0474C49FFB8E7DA2A445\ 3DAF492062F69B7DA5EF4BD9E080B950A184B20639ACDF459EDEFCD4E43EECE0\ 524CE005144DCDB5BEF5143C5F6117EF49794AB8EA70A0DB889D1C2EEC121151\ 1B5C16C6C4000EDFABB59FAA6278864ABF61DC3B7B91D02272D69EE06BC195DB\ 463CC5E48138093DCDF26120F393A61B18212BE4844738CA17E51AD52B78665C\ C4CEED7469511F2C01FBAA59A65A033A87792F4AD205A4DEDF9B9C91F0436622\ 7FA1322F6CD39DCDE3B8BFFFEB50AC052F48CBAB2CA14798458B3B9A16B62234\ 91C2B785234390339EE88E3C7EEAD5458EB03FA69A3F511933AE0F079A2A2D5E\ 9F2684446AD707F6F825CD792C1A50C50E47E537B816B89D2E9C126B9A2CC40E\ 0ADF33D56DCDBD344734CC651D5243080B0152FBC5EEABD59CF4E784325AC9A0\ 58D8460C6D557DA9B418D08FD836975D8E8D7B47C3531BF1E208A9AD1AAF3E28\ 62FF586927F344570F3DB06A3F7EACFF4D67554377645F850B0821343534EA46\ 2AD8127299D4D549CEFB21AED61A8FC921AFAC85A957CBD12262DFACAB9E269D\ E4E42F1667B5E3C2:\ BEE849F8FF046CAB988F6AE1311AF3C2FA5CA6CE594EE9DA7D8A7EBD065179DA\ D6A141EDA654ED454F46821F8E484D805BB375FC081D0A53AC35DBABDA69C43F\ 20E8FD10CC5CBC65A6BA7FDDBDDCAA111B07FB5F6B091EE3A87660EF5518F7C0\ 86D8A8375243F9011BA6433ADD2223F3B8CFA96CCBF8059595ED3908C35655E2\ 7D97CEFE653321E48D1CEA8B8426488E50AA4CD30775EAF55C3A84BFF61761D6\ 2AEC030518ACE8B5417333B9E790C1072ACC36ED6FC3D40822F63ED74E183471\ A2FAE3128F61D2100E2B842C4C1ED81CB6F2DB031F94B7F4E39D170B1FAB2024\ 70BD3A70F49E20141058B549013CC29DAC64CB3C56EBF50F0EEFFBECE9B226EF\ 7D40440DB8AC592CB7A16FA1E41190174D70DFCF04DE7F384EAB679D30DBA803\ 2E32472858F9154417DEEF3224992F1B9AFA4932233BCC6A03B049281E7061AB\ 092C820E68AE4C57E5B578728DC89C8095B814A50DBE15F3516611939D77DD6E\ 3A5DCDD9696A89C3C369AA2908E9ED3A771983BA81526F956D8B3BDAA33F6008\ 69EB76BE506AEF07B1C68BFE1E423AC6D10E4ECA7D40A35691FFCDD4109AEFC2\ 65C7BEF396545A052F24FDF563E73C767C934D8D1ED19BAA6D2D7CF72455B6D2\ 6F2C7DD1017E1C2C2651BB1E61EA71C9CE6D9E818AEEA5FBBC81797867B60658\ 2E7BBCE28538FD07:\ 0F33CEF21D511D5B58B022428E60664D17E853D031EFF74B:\ 0A6B64BC12561FB6 A33B7D0F50A3AE535EE81517D4776C461BCF7464C2F155449D563FF5C70CBE9A\ 749A13CD728133C778B31ED75C962C170EDDDC34F21C8D4C3492AF837DEDC247\ 57D1C344BB2A92E3F604981DE16E3222B73E5E3266D5967420EA25630117F84A\ E70EED77C8B16E53F61901B7A936508D469CF3062BF4578EBE0FA3C70AE9402D\ BF1DE0380AB20CE99656F5421C2B3436E1EFEDEC902D938371D01063B9C2F984\ 1EA22A896791C4916E42BE6952234E6AA29069EE8D61A10B84C44CCBD5AF7A4D\ 05F6BC02FE443AD794D32B18F05629CB52BD91DC514E7F99E61839A3D0E3FC5D\ C34B286010B6B9761DC2140C5FF643869B860E2444C0097D89287127AD661783\ 2477CFB94CAF234D0F6877CD36D805ED65DB35B4B8BF4985D8FCA8C70D57C50F\ 1A41D43229A7C88EA1F4299CDD56508B6CCB07FD3AABB9AEC3579FC915483C9E\ 149B6F42A967F84831194C72B8AAC97484CFA2027FAB6FB876980479A7312F02\ 0C25E5C9071816039EDAE8A20DCBE76F89563337A7FEE287C51624621807FDC7\ 6769B375E7D98332DFBFDB8B4F5C1882E907FBD39FE2C8A908998AB7D3E663E1\ 73E13B9083316CAB80C8583C3556D25420C69E8418040BF621DDDBABC758AAF7\ 00115BF1372FA420F2E6E3D22B8CD448809CA1AECD4A276BFAD23EF020454EA1\ 459CF05EA99725C74FFF119D:\ 4B4C7B53B4E0BC28E7C7BEAF6AF925E324F3A3C0454240B7107560409FBEA642\ 566BD252DB8681FC83EFA4E6DA54C4C2ABF853B6A4FDAB91F9E4F8599455CB10\ DB8FB7481CD2D1E69673450D882CACEBF3912078A1597A28FA8F6D30165696D6\ EAB0B5F7800F6519193E18F01F736C0026666CB40CD38B66B43572847D4EBF98\ 1894D8DA25C69707C739995A5635F905E25C2AEB33EC5B972EEE04AF00EACCF4\ 3764B1819D6EFF7E5D97E35A167009C01FBC7F0C24C29838D6EDAB8E508BB1AE\ A3FDD2E65B564A5539ABAFC877717A8D43A269AAAE8EF5F84B5CB290C60164F3\ 00F2DA2CFACD52476C5710C930CA033F832873B4B84AA15C557CCCF4A5895DE1\ 2F444C8E0CFC7FA722EF445C65F14C4A15A372AE3DE624B3BF4184DFAA65BF69\ 3147B50637D4465C62424F644760F018D36643D5C959BE24AD9AAD07C9AFEFFA\ 4E6751AA58CDB91478EBF536567F8614B6726F266A726B9B79B178CCCF5E2069\ 372B27640360A3D647FB7FF6BFB49BA29B3B8961316577D6423DA51703F8D67D\ B5CF359EDD938361CF62CC84F7BBC9408B2172D08E574C347D2D669453D786DD\ 72A48074D283B6929B1EF4304722433C149614A6B25669111EDBA9DAB34B1D4D\ 9970C1310CDD9246A5D250DAE9D7AEBEFF16E70E2FFF073239A4202B17413B8D\ D86C6E26D9DC90A7BAFFC357:\ 3F9EF31A91BDDC965C48D6DF92F1C2B094A47C2E5F5F0E06:\ E0CFD4BCD2DC6B55 ABCDECCCEE654A4B3908E39259E750AC8875F1AED64A3B13D20CF3DF54B24F11\ 6D5C1A3CEE7AE3330D0EFAD04CF87E29BA14BF02AFF8C066B41B08A0A0AF3E87\ A04933C4B947DDCCA09BC7ED0FF6BB1399FB9DF9A9202C8A7202BB8FB1642E10\ 14883FEB3D1C57F9D8030FCB20911AAF7410EA89F19DBFDDB006783A5B4D18F7\ E8664DB8EA8E3E4511F82F3E12D9EB734523795213EEB54D3CC4C077D62E89BF\ 61C34670A07E7871C664756E4C4A2F645799C0F74BA9487EE7CEBF7EFB87ADDD\ 11087A39FD768C275BBCF5CC3CBBD8CFBCDFAECB405B16AD243782FAC87E348E\ BD1EBA3DC7135DF6BB92E8D952D8AFB7A8198206ECCCC09291E0015D9C516895\ B9AE4A31909936CD1D31D614E39166C8EDFA72424867B9EBBBF10654DE6122B5\ 6EDB4EDF03E0FA8B91E015543B8DFAE0034A46B49BC8755BE3C846524FCEF2BE\ AFB3E845F0E84C77CBB578C5B911C5E76BD56317D7975ECFCCD490FC23E2ECA7\ C1DC4EA41BB28129782ADA77E13ED32EF1CC4C5A3EFBC85AEEDF51A310913055\ 745B2C26C7C292C432934D1B9B3E6AB6FE58AE59CFCF95BDAC939EDC635D80A8\ 209CD418B65D1F31FC7C8B11F4539966E6AC0534A5953C88E80E74970A8B2A17\ 1232DC112E6BD67A9D2B07D020265ECBC75FE328951705E2DEA26B782FF879CA\ 13263348433820E18993FC2E22FF8732:\ DDBB478CFC853BD0FF6E51D1FB5E84C5772FE3AB3FA46B59CEE71B6CF7E07D8D\ 16DBF7E14C13D16578A1988D47F64C000850DB304EEAAA5E2DFF5818567C2EC4\ 52174918EC045B54E59FC27D31695F9503FECDAEEC2E96AF8BC170D763390CB8\ A2E2D215E521D8BC1C9A2F9B7FBAFE70B63202675B65F9A9F333F41154DAC6DE\ 0B14D0A614CA3AB325A765BC21A73FB333171959A329538AEFB9B30118DA972C\ 0A33B38A4D0FAF1C31E6C9E7867369720CA968642E56B828F8B4E8607E8D35B7\ 2196416B206335379E12CDB1EEF8C8F41BB00F6C9071940040C3B22D396851FA\ C1A90CD7993E58B8B1D5D31CC594A3F439CBC7DCF70D19E53F0E3BFF3EFB9101\ D7B63F2A175005CE8C2ACC01434C6AAA0F82433DFAF40EEFE3ED7C0B39C56546\ 1A22DF1899DC216892A41744DD623C58EF8C28B300E9D9137DC04396C67EE582\ 58E6681C95CBCD8BB23073FC886351F5EC6C9219ED95E0F42C72CF7B62B7F4DB\ A8605D9B15E5C0018A41582DF3CBF3BA7764A0EF4D0140BA79EB698846E32DFB\ 9E0C84741A7E21B059F6C9F3B27E5C26D708A92A275BFF00D0C40F6E06A340AA\ F2BB44D24A60A555FA59DEAF6AAF5790D927FD1F29EA0E0790181C5B2FED8772\ 846AE5A80D59BC9FF15A5276590FC8E64879533E862BF264CD539EFAE2C3775F\ CF3ECD9D07B74F670E460CECE79E52EA:\ E963967A40FA1B96CF35CA1886CB0A200974C968007216C4:\ C7F1DA502B161586 0B9568AEEFAF01DE0FC072FA1F8F10EE4CC157F607EA37075752BF49C49CD914\ 81A7F9F62522C2BF8D7F4DA1232A86020EFF960C8F7B73AA6BA91C40A15A34FE\ E766DD13E57B9AF0B24FC1A3D5154ED1B09956ECA158741B55F464041CC0FEE2\ 2A010270BC596A0BF988CE9199CFBDB82B3B0075C4EFD1F20EB9E1D915D6A907\ 58502EBB2EF76A6EF7BD565C6DFE8AEF96661ED4FD0078C0D3A97249473911D1\ 4F60B2BBD0ADE8EA6CBF99030BEA5210620670C9447A70D6ADD2EBA0064C8F0D\ FA7C8B354C89209C760556F6DE1A586F898CA171A1F3460E370217E4E5143E85\ 5988C70981EEFA25F177095EA3F1E3EC6FC1CCDAA6BF5310C8849CBE5F5525A8\ B9C0D2E12DB5730B750D29AD656A644310365B0839F069DCAC8868B60F5F68B6\ 510019EDD81544B0098179FC2D153D224A19BD2BF4889FFD4712E138ECB82F2F\ 2800C9759AB5FA2B49052BC63703CB2125D0BFD74BAD142DBE4613942B409764\ 3A233098B75C58584DEB1C31F8058D052A9BDA7EBAD241B1D4A3C62EE1A9F3F3\ A64EA96C712088DF0D04D4EC00EB9A123BA4CA039374F8037C1C3BB49FF2E1D1\ 77669C0BF6AE9E506A226C569F2D27AAFF9F3B2C6D44B7209BE29E2959CF93E0\ 40EACBABCCAA898B508FF281AAE975308A3E4BCA8740A05C17D5461041BED828\ FA34699CB19FD50CB7F502CF7F1A483ECEFD69E7:\ 1F68542DDD508744386AF7313C5B46B9B36CC1F862F26338948ADC490E1398F1\ 18ACC5244B5723DE0F44ADF5797D289E13A4D13378D33E3CA6E777F3762CDEA2\ AC2083668A1D2EE9B330F2D688FEC8629515953848362EF3D77B5308E1637A0F\ ED9DD590D42A88392B2B7E75E9B9A4077869A2BAE5585E60F2E3F0564578C3EF\ F508EF1E202900698CAADBF3121621AB6C8B2A23076F114BE5F8249B4D3BC441\ ED49F66160CF65FB5E5EAFA1CFB47B3CCCB142FBF947A4656E22313C7258CB69\ 180B97C5A6B94028E9A94CA95F392405E18DA31815F2ED7D8C921D0CE617458B\ 14782A597F29505A1DC68D3999548FFEFFBF5CED35279A73FD404DACA8AADE27\ C3194F033CC08CA840EFD5621F97AD8E4FC5D7797D8465AFE168630543B4FB89\ 3A6428FD340FBA18496F5DB05FCB9E43EB009F10A4D44FA5F116E9441A32A652\ A34E1703622F4C28FB77BB17A2DF9FE5B112E3695152693142E425753D246416\ 41951479A90C879ECEF77417503DB0CD081C13BC879ADBAF4110C13F19BF69C5\ A7C260041847F394CF41481465C63F6E5F552543EF45DF25739C8B4CC46BD76B\ 2C9A8E43F614C37BC1D19AEC9ACCBADF07BDF053C5AF119030DEE90C485D359D\ 763F124E7DA7EC3D1D366BCACECF7FBFAEEE4E19772A7CC9733D4B03848664CC\ D7D0A679ABD51D0A41BE05F62F3A120B381C4B16:\ 20EF4A13DF4132039A177078C0A095BB8B4D5CD990818535:\ CFB3079EE79921DF 22D74C51876400184E31C74A0F3EE5843ED57A59EBE4E5A556B56078F881990D\ D2CF2DA5C7BD08FA877A62981E698927039F278FB7080EF036DCABB3F5AA742B\ DC2AF907A9AF315B77C98B21E3581B668D9F131B42E4729F25597D277F912280\ 8870475CA96F15F0C6B9303B7BFD97B5BF79FC5BC2D190A52764841C2DD68E7B\ 3C5853233674E3238EBAC0FC9AAF0F9DA253D1215092CF192EBD573AD0A5CA4B\ CFF708391EF0AE8154C393CEFF8CA5E5B7157AFEE5917C0DA6A4C285A5E2C328\ 205BAEF3BF39FA0F1E145DD072BF43687DE36E4F524E493169D01D274E6C97D4\ 1E9C592A5815FF839CF0C39877BAA2F479339D62B770AFAD555E44EDEA781185\ C6D76D186C0FEF2F96006378A0C7CBEE19E7F8FCB52B774FD9564302FB494C87\ A598BB9160B4D44C51B6694E3314ED52EF7619A7D98C33A6655A702E279DDF5C\ 8024A7E7922B148555E69951380250086BA3565D3E806B719399AED264637FAE\ 080ED33B4B0FA8B76CBA3C05B8D81B29CB43A79286B444ED84EA2DA7DA657F6E\ F76BF338D28526AF9482E15ED69F8712CAD5293EA86B2540B9B1BFDC726243B3\ C065D1FEC80C50601C6293CA822BB5257C60E5D49F14FA1875C46BC42054B414\ DC4B1D6152C4EE939CFC7F1AC456E9BCC1CAAE61ECA6071437BAD0A6E21CB2F4\ 3B77E42C560DD1293DB5FD0EBFA36115DDB5943BBA34BC10:\ A8BFEC976102A91234A58944FEA83171C7D93D24277350B3CF1123D62D50B78F\ 6E3EDB3EBDC2823881286614D6B3BA2B81B9445CC78B624D570BAF46C4EB2DA0\ D1790856BB56AC46E8C418F7B82A315B0BDD5E1FF50AAE5CDD786A069767678D\ A38A66DC351A563FC31C438B6D2BABD1EBBBFE576359FF35652E06E0539309A1\ E32A924658BA34AC514E3417AD3DB053DA2947FDBB46875F5A2ABF16F7E8D34C\ F067A7DB89B16226FD16F474822968D42C076BF52DAB16414711FD4986453E08\ 5CC78AE5E6B957B8F4168D85C0E2C4457AC11CCDD2BC42E6B3315623B091F0BB\ BD38B2FC2DCCBDC4AABF610DC078621C50B07A6343A1A8442E0D5B9F8A0A9679\ FDFBD4DBD44818FD92570FB1C66142710A40664F5788771FDADF877A8CF0542D\ 7582E3ADBD2C9464E329177AC757502A2AF907FCBE79F7C040BB4DE56539BAF3\ 24ED42045CAE55181E3EF43350CF2F8189A403C6AAE6D749F5B42F3D2327363C\ B21F1CB805A041AC2E4F6C1AA399BB17CD856B513258C29945505CA8A1D8E287\ 1A83E56B69AD3806332D404EC2DEE586EB64DE316AEF8AAA65C08C4410395E21\ 3955CE27A7E036ED6E62F68CB4B6D342CBB2187311900489B9FBC78BF204964E\ 298C219AA10AB9B12B64621DEEA48CA6F73E8CD638123A4107FA392C5345129B\ 09533971A6DDAF22B462700AC85CAF79BB6A0241E0A1E6AE:\ 299C903D9FD23A9C5D88EE6837A09304A6BB359802D1DD02:\ 160A8EAD3112071E 61FE1D3F0620C7BA9D93B5D457CF2433F7AB42BB25492F8A5BB7F55D031A5871\ CD054A05544247C8F04DF692653A8C887E5FFB482F0DF760DC95EF6D3EEB6D89\ 50D0D3686E30F9464FB4F81B54F96B85F1F0A7B76E93E62B3DF152A44D3A82A6\ AEF7817DAAA724BDB5B2AF4DBAFFD6BDE7E8FDFB30C5D112308A394048B59C2A\ EF403A62F38157529E27668AB907CF97EA49A214D16CCF6F22D7B9F673E29C58\ F44C2BE9134E12C1FC6AD13F846C3E4E2B738A3413810EFCC7BC8CBFC87D7161\ 1A00030B2306C3ED8B17A4A71749696A53FEDE8B5DE94707232BEE81C84AA07C\ A7D0686FD026748AD1E2E813DE666D2C36B99CC18901B99503D53D2BF7EBAAB9\ B58EB26AE05C0790FC002DA29419B04351E9BDD0D310FE3A4AA8D50209A0DE3C\ 312AF5C61FC3F9D7D932C37A8A8361D7AB813051B2A3DCE0B6F8B95BD4EC4475\ 6639465DBE1042A046C2719D5590020F6A4E1B295143545FA1CEA183FFC6A809\ 157678BD0F8212C3995A494FFD60FC58EE002129E56CB236169793B999D92B30\ 4026C28802A1F380DB4B35B89DDE35719E32A8C183FFF45C6F8BD0CB485B1B38\ C508EB1DA4DA151A75A552CB2120CF7C5199B4E157606607119F7869167526A8\ F3CC5BE02CFE4F37DE43CD5D026AA210984307C73E40329A5A4B503890B0B82D\ BD68C79D2C8839FDF534F496755EAA0130DA0EBC0E31E64F561EAB12:\ 4CBC7466274898801916701BB98617BDB7A55A89561F4DB89B36B6C88E192776\ F7FAB7FF4BF9039B8F2521F1D4F5E19F3EF57E18A91B7128C5FBD507ABDF4B15\ 95F99AF60C7F340578DE0523B2D5FD8F3BC81B997DEFC8E3F304C57A3533AF11\ D3604621980DBF1A96A33FE89901BF65EAC0C7AF5184100689904C7D2C30CEBD\ 8398F4E33DEB2F3CCB9AFB41CC5895E614D690323DD5A32CD379247B2E325783\ 73281F6B53AC37009F9CC23947FE3DDDA14EB89D157425418A10CC0BF69192EF\ 1C63CF4869EF382EBEF0CD208788E3C7B5063E5FAB9079044520885D242979E5\ 78BF20CF1F04C6E5B623269F48715BC58D2F74C7B4F5B7145EDF96139F73F7EA\ 52072AD9ADD0BAE79AC1961F9A5359EC322DECC5007019B6C1B3F93E19CD2A16\ 17CC55F8E9AF9BBAA3E25577BE7393D30C23902DD524906B57F5FED71577C40D\ 072FCE4F0D61885E28321F4E6F1C5AE784ABBC154E348565602A8C9D16EAC8A8\ 7F0C4F18FB8B4C587E147AB26F57DEADA50C1E5C31BB0920E9B85E40CB050643\ E2FF19A583CD50454CE26368BDC0EED0FE82710F43138C1F7AA514A53335B05E\ 65291827A1D829700FAE7F68810E4F82E9B58CBB66401CEA0B662260339A0736\ ED29007DFDCDA45CB1FF76EC6548BA5AD6C4EAA0D8CE9CFA949652325EA9249F\ 2AE7A38F88F60E9205192E2CB997E415AF5FCEDCE4D850ED2B2A44DD:\ 0C3B364010A5C0D93A13532F4C8AAA223D50ACAE66A74136:\ BC05FC6E02732767 FFF24DCBE1447BE1D5711BAE7EC2659303A3443519ECC5993F06C2B34A714F8E\ C4EC862B2BB6B5F1733E5CEC90468EA8B2E1E722B4C2EEAEE6DF43DA3D4CC0C8\ EE36260E45E71D2FD9067DA44A1F4E25F58552D4643F45079BB52E58CDB84B2E\ 2846AF57E6A583157D5C898030BD57DFE19870128DCF0B6D03BEF58334F7DF54\ F620BDD8FE7E001506331C5F9C2D6B40F88D8AA79BB60CE6BB71D66E3675096F\ 1FFE730ACA82649B0FD3C52A6D52D55AB9FB385002E18849BEDAA8E075326224\ F194EA2726A9FC412063FFA1ABE1F191A35EAE0AAF1A137F8BB3388CBBF4FCB9\ 804D2E24EA21501582ED7CA4F4A2959A032265D3BAB06F88F084C771761C4E53\ 9248859C818AE82DC4AE12291C4F4C107BAA031D4BB78E2B0636E0F825146D75\ 4AB87A420F8622B2C73667C50977EC0FB654D7612E2578B646DC5B84BB0EE90C\ FD40C53831BB6F39940A98B1A0A9852CAFFFD3FB93A04676B736D1552996E503\ ADD196FF5D99703DD3D2B91053F8BB45791331128D52972FF52A52A1D48FFB74\ 48DAE01FCCAA8B24A61CDEFFF171CF1E06038950C09BE254A7B64580082D09FD\ CF17A8CC30A234ACE62F434DB980C0E4D54475BC0DFC755BFA84C1C912A5E054\ 5F8779E3EAD6251674C937DD3E43B74E87BE10FD1F947E7FA91F7BEADBFBAB9D\ 89FBB22997621BCBCC1A40F0389C68FA852E98FE19FB3CD7681D6111FD2B0150:\ D5BA6D89EAD46B65918F5E7B48CA070405E60FA10D6128AE9EFB099E467C417A\ 0AAAB7C27A19DEE540A68F5D3C20399F9873419FEFB2A4444AC4392FBA747A24\ 86C1A7BD232089E182BBBEC20975D38EDE288DDC2EA0BA993D536A2F346304D5\ 9E90B7F47F4C877857FC812D53563189F81FAE9CF8DF19A40C6B68F0774A0E0F\ F67E01CAAF18E725FDA8B1245FDD1783143A146A5AEEE6BF98EDE27A4916452B\ B0EE509D26EA8EF2ACD80402C3F927A91F0F982DBDD7AE08E556720F195BACBD\ AA30FB252F54BAF3DAB9F859AC8065EE6725DF20F05965BADB31C7629C664D0E\ 42CFE925C4D8FF4694DF23C48D33495A1D7A860B27B49F93ACA2544F523EC0DF\ C10CAED0E7094F0C7582460C68EE922A1B9C93248979C23FA9DDE6FB17E2B583\ 285090FE61813C443AD3CE0411C9B53F3233088863074CBA8E63837F6EBA0A85\ 90963797E8E238608ED3A3201A472F561257238D5434D719037F35C4E2011E43\ C5A9817DF6D4AACF056EBF68214BC1E89F3395D2838EA4E313606BCA816E813A\ 5E6C13471316288D03A6B4D9109480A3E3162FBF0C051553CAB4AB4BBCF2031D\ 156C81BBF40D115A9035ACA04EDF9F38A26D4533EE53F39F1D5AFF2FBD1F7261\ F2DAB62D0931FC334D1F5AB869AB1BF11E687E18A8AAC18B35EBCB594D2CDB77\ 0F01648F6D132A963375049E137D756997F46ACA56C5EDCF347926E6B67277A7:\ BA9FCFE6E8E1F77EA676F3A94DBDC534860D138668519AD6:\ 8782B005DAE54235 7E4A3175450AE6168E6647319B754D765EA933316AD38083332D3EC7BFC27B67\ F3FCFA4FBBD513362BFCCB9B775BA250A2B32705A97F6188941EB58D7DF1FB54\ DEB7DD98864FE8B0CF06F2BDE8C54DB44365061B0AC797D67895A593C7B93B48\ 1E0B16782B638821304676BC9CC6C4E8C19A5DED2C4D939D4A247005CCE4BE41\ F7FC41128E45C5E4ABD528F440CF7DD9A0FDC4E56FA5B377282F9B582434F972\ 7D6A7015EE7EE2A250A0A63FDD4FD05C3C9ED401D3387C75C4B4E4E1BC3A9ED0\ 5D119E17557E89690DD7207FD8796F8DFA3031BAC20AFA355A97DD43EC97B5AC\ AB96C0BBD8A4ED22D3A39B3DE7BCE65BFD3EA5F259EC0DF383BF9AF81CDBC50E\ 6287DBB64425E792279ADD9DBDDA90F409F4427A821FCD7141CA412594FA1BC0\ A82918380181ABA6F906925B78F867247AA91D8DEE8500F1484488EC0151DA10\ 3AE98B51AA8811F394B4BB8D50D3A563D291E9A9C89B933765B39F31F8138502\ 83A9F1EEE6770FCE5432759D504F5DA1D221F3C1A3787BF1E9FA611A55FD6941\ 7F60D0C7CDA5E271602A72E8EB21AA9759F9D1BE29C72953F3CA2AFC95034D68\ E2683A295F31FB799068886AD1ABCE47B87A2517C7CC234BB60498779E25CA3C\ A3610C1F0AB186A2040F554E92F849FC1CC7E083CC6649575D037B61C3945CA7\ DF0760ABAB83FE4D92906E3C4C8C2BA4C15AF61CC6E58EC4C8801E6C94141E9B\ 1EBAAB4A:\ 2111619CD276C8D5110EC5CCAA217AEA3728412FC53283EE1EB15EB6195DC4DF\ 15A9206EE1803858C7F8ED428397A353B29ED0B7F4C8725F3ECF6A1D23BAC955\ ED57EE53BDF1DD04DD545DECD9617BFD562E89A17AA59E4621718AC2D533D73F\ ED11AF9BEE9D4BB492872B4D9231D874992AACA5432A4C682961F008AB83E436\ 556863A9BC3392D4999BC26832F8189C1AFFF6A4C3D7EBAA913BAF4E422B7CAD\ D8B0B8EA94E7D7728C2B6D459A3DF6733E0BE36B4EF63EDF9223ED0EDE17FC15\ F556D79E1822BD9D1C0FA45A061F6CA43FBF97CBC64E96762AF59EC39E674492\ E3E96AEF4F09C4F396E6033059ED0A87DC1160EC55047A4C48B48EF8A1E5BE8B\ 9DDA609697061D20E6E6964546367506CD3D74A87CB349D5A5760CAEFCD2C21B\ 5E005FB5D1C17AF372417EF157C6B32627C7459C031421145E20C08ACA84BD17\ 7D4F95426CA93F129DD9EEE74E532AEA737882B230A969F268DE722B97190ED7\ EF538D05EEC2DFF4BC89002306FC139143C8503B2C77B8262C7C3DB0C43EE56E\ 9F41E8E038781951D67F5A1DF5268430683736BA03839CE52FF5AACC75B1459F\ 319282E072A6CE3800722F2550780C9EB5DB283A4214A9BE3D087CDF17B53CF2\ 53A303D5C3AD95D451AEE896ACB657C12B9DC42C6ADD5DC46D085D1CCA7DA9B3\ 29E1C5C7F5EA0D19773895EC10A9A5AA6716CF25126AF5DA6978003CB0E9CE4B\ F723CDEA:\ D78DC039B9F1C25BE368712FFFA0EEAD0F9373D1BFA68CAB:\ 4C079826FB98EA25 F47B2AACAF0711AD04EC04C760D5CF3BE9BE42CAE6272CFF7172F4B0F7F1235A\ 6B1195B0AE0CF39F28E919040EF7D34CC6FDED0872106A8BA2969CA6EEDE6755\ 6CABEC04DB7896892DACAD714C8D10CD3120B79E5D0E886972064786699FCE1A\ 9343982A08542B7C3D96BC02FF72CEF2381F240A2EF062687E108E5BB3F9CA2D\ 048AA03573B08792C0D89BAF4714D1D33CF59794C9A8C6D83F604B2DC920A5DF\ 13FAB79C6C58F32046C805036FD56B3DC271DC5885243A0317211835BB5CB852\ A4CAA08FF5662A4859C06228B73320A0FD1354CD2A0AF64C4DF0E91337576C35\ 5ECE02728DD5BA5181CF6D35B6521D3649B4C6918B22652093E672C3F791901B\ 477C87EFCD4139E9D483271C56FDF33FB0BDFDB4E61C79EA7D504149B2C83EAA\ 17F1E79D327DFDDC0C5C0BBA35B02769B4B15241DF2EBE60AE06CF221B257BC8\ 3357F0B3256E14E66A143B458BDA48F346E8920BB599D32754E0F89ECE4A832E\ 2CE8C90AB7AEFBF2A2303B0DEC950B618FAB9B6944D99F8EDF7CBBD0A306FBA7\ 558CCE0DB1B2B02C315FC4E503957569AB5821E9C3C65D22B9BCC6C034B68C19\ 1A1EFA3216B85518EC923E131A265323AF45BC06F3F0F5FA712ECAB6CC50B037\ 8B04C58A7CDF84A7DA1153C58DA793D949B9F12A8AD611EE1A137913EEA42151\ 830EF9E451E4974D30CD2DC7C15C4B52DB58C837029B11C7E5C00FB1F8F5C52D\ FE552190AFA39F69683F8FB8FDB843D40B8EA29BF5B26A09580B38072EC612C7\ 6F1A59BB36212C3AED57B546742402C0316CC5320D7D03E97470ED4161BC1176\ C54FA92910EA05FE125E3B54422467C8BE2593A12FE303D882BCCFA393F436B4\ 62743B0C47CCFC9C8D9A878337B7CEE12117D3B6ACFD051930E270043B33B6C0\ F581971FEC18067CFB6B5C16A7E74BF6F04151059FC04F0945CCFB31B2019BB2\ B822E19099F08FC9E24BD45B6F6AFF87D58D7452F5C028A91849FCB08FF1AE5A\ 884BAE1222EA4D94F0704903AF009F9D87087D0410F0C68A574ED50E27FA2DD6\ 915228FF2050B731F5E25464F088A01D600BE49A0A2BA4A230833C6B35EF360A\ 06DAAA5FDAA31A35ADD1D16B1EE223B03FB8CB852B576A92488237323E017D6A\ AA904B5D79A60B9BD8F8312124A125B7390925BC4179286155A7F77AB0D7426B\ EB84D6F790A5166B97987EC2B42E84D251DE0F5DA59B849A9F836D3F5373C33C\ E5153EE29756D325F400F77363DA2A29DBA537A26C530A57E9368BE2236A30E5\ CB9D0B2C5D3C6B765375DBB6F0D79B31C27A6E0FAD4C7740095F6219B299BE7C\ 48A954E719051A5A48FFADC51BF96B2FB0389EAD449E63E42549667342FED323\ A398507CEBCA8B202A99573040C384A251CEAB34D508955ADA861BF6AB73DC0A\ 9C1D291E4A9903E752C5A54FBDE4B73D4BDF38642FD1011F070EDAC8C2370FCA:\ AA33DD431C05B53F558F5A9394D28B938F8E8149AA494CB5FDBC7A73E5E8AF94\ EADA457D0A86C871CFD001E14E29A7718696052EF6392B4108A66A68A103A060\ 1AB1703AC6C7EF17981DFAE8BD1DB8AC47C211E241184B926FF6B3BC35B60E0D\ FF1161902106AB81E463EE1DF41420729D7C164FDE18AA42E697F1C4E01B2C49\ 5FD4E9276FA34C45FAD5AC98DE47F137D1098C0918608853DB8506CBA17C1D4C\ 12A41A9CAD5F7F490D46C15DE97ADB0BC83854114E5F9A1872DB4A3AE8E400AF\ ADE2D5A33A0C6663A394839423CA9B8EBF417F3C5F047C76D61E171F6654FD08\ EE424C2078B063D118CB3F69665342A4C16864029259EF76F303E5A1E23A7789\ F99206E43CF03E58AC070812B977A7D30FBB582429193CB0526211C6F002D233\ 94E9A6D2DECA4C83A3CF092B4047FF86E36E2FE1EB09BCAA1D7B929BF9ADB48D\ EC871D67FEF35B0FCA8018EBEB3AB9527FBADE5AB45A47918C61FF6AE21C2108\ 387C9750F0B37155B7893E1A13B9226A9723B2597EADA5039938AB1679917DF8\ 4C491A2EE6E76C6840177E556B35F292DA3C785CF37E477BA53A1816D592D318\ 6E4FC4A15BEA60AB799C681D8B64A7E17D781EBB6F9139C9CCC789244A6A0E66\ 91E278ECA60A9654826FCEE4519E8725D209A6CE4180C91C17698A5C48EABBC7\ BBE7F335AC4331D4D352A2C99B6784245E046A334179A29DDA41EF6BE685F634\ FE02020A8B787659B123BA086536415BA7AF3C31ECB3A05E06FF1EAF2DB92D79\ 4817C89C568436C56608EFF8E6745C9DE92141C0CB99A13D137D723D23092E6E\ 06D084747E9D778D268CFE64BB2423D92BC5391E395AE4663EE83B2E8E703EA5\ 77E67EB00A6310C2C28119EE9D6C10849ABC97A55BABCA512FFEBA057857DA44\ BB149B5FB0900CE09CD65A975AA29213D9B6E3849FECB62A12FD85FCF2E1EF67\ D121FE8C9FAC0C20E1EF41C7C7F01FA177C66AFD31418ACBA38517B10CCCE164\ 4B5BA691D79D70E4C0AFAC83FE051D871A6149BF027938A0F8E03EB10688372D\ 65DF17EE27C8E193701066DDD5758D216C75775CFD0AED04232FDAFEA16199CD\ 3BE58F7C6EE1EFAF3BE8D08FBB179D1D3D4AD61B8772A076AECAD5F3C82BAF24\ 527A357DA547DD03DF1DD5D9CDB1C8DE65608E673378C1ECE400C1D2CCBEA486\ 7E4F24DEF07CA60EE21513C52180F93555DD75BF22391A0615EBA90A9B4CB4CC\ 95A3DEC8ADAEF579BFC78E5FCFB0AADF05223C1726A6F1367B96F9CFE7711620\ DAE28644514E79605F70C8EA3B60C3CBCC93FBF414276A99AB1E1F28D63E4611\ C1B1A0CEC1F32DCEB3A85EF7803C9B8499CFA7409E15D4488C787B2D04E8F58E\ 94256DDADFF89A0DF9A2975558EEB5E52E8322EA46B96FBE68DA49BABE11A6E9\ 54C6724213881A4DA032E361860AC881FBE19EBF199E4330DB9A7BEC002FBC6F:\ 385F7F95B75CD2676193034A2A842D8AFD585D1EC7A47288:\ 9176BDCAFFCFACB3 [Serpent/CTR-BE] F3:3A:\ 740614949B42870F0851A0D639A37AC8288898B0F9CC3B326B983ADA69BDBB76:\ 3377FFD0C8093067A0E33B8700E2C2E1 3018:053E:\ 872BCAEFB1985B9C10B1F2DE2790E22CF31C362AC7276D437D0DD697F1682BC4:\ 53C8B7C9BA119E81AC5474FB70BF82FB C503C6:DC4178:\ DE3317D05233577D476509E638486ED2ABE26ABFD847C13A8AAB189F322F46B8:\ 47D690C680A567B9942BBD0A2700B884 FC9B1F9C:89FC80B9:\ A2B4D60F8F9B35C56168D80E8828F3931A5BDA190E65B9B06A814277DB2B4F63:\ B3B98D928D3EBE1B9E07B291ACF9CD2A F1CDFB642B:2BEBCA6F33:\ E39D7D09F410CDC21333D8EBE5E33E7A2E24872A99254AEDAFFC633061C32EE6:\ 107FA9631083DE98F5C72A383F541F3E 9C3BACCD6154:DE9920471C92:\ 9F7268895714AFE229162D50CA59F1273744BDC28B198E1685F4323AFAE1243D:\ 68C5EEB64FC3DE106B99C0896CC0689E B5602241E6ACAF:2FD52D0292019C:\ 27757554DD1B5BE2E660576FBAEB238A0F7642F9A65771B69AF276A57FC04354:\ 9BB3DB1661C90DE853294D20A369B999 8E27C11E30E23C5F:0294FE7CC3F020FB:\ 84688112BE481C65B282D4DF9A953526AEBF05FDD2F3D84E7C32830E3BC185C8:\ 3ABFC6E1B2358A3B968E416B9087BBD9 A4CC3F182076E93409:00EE68EB6CC635BCFB:\ 967BA8A79CCD302B294E519813B72EB5C4D24BD86322FBDE08C292C2DC4723E8:\ D7DB3A2BC532D1F1685CB612FBCF33A1 25B63E2B38DFF81FA490:E75F1A6DF39CC7A76D12:\ 6757B7CA6D7EEBFD0E679E18CB30D16ACC71D0B1A149DA27E439DA1BA0BA37C9:\ 3199830075CB5E87016EEAE5B0B26F13 310605508E614C101E829B:366A5DCEB8E76183C95CFC:\ F92107A1778C99C45B4E229567BF5CCAB2C5B1204052B8720161AEDCCF57E36F:\ 378D5BF003FB48A4D183D5227151FE11 6A706D5F6526ED4AAEE00D7D:8145258ED5FE88C34E671101:\ F892DD670B66CCF6B8E458A6F068FBA79F4A69AE3A028E43D8E219BE940BB826:\ 08BA9435AF764BE0E44515FF72D6DCBD FE62E34899D4115DF7FFF51A8A:66F68C5AEC9A4BB123056667D9:\ BCE52007E10A2CF3077D00225C95F2D68FCDF380AC17304553FBC1DA10117B15:\ 3FFED78824BEB8D6D655CC80190124BE 191D3CFE172BEFAC1A8A428DF951:7CE0D419C43342FD2CD8D56685BF:\ 534A1F49FCD2D99E2ED2F094E170809091195EDEA2ED94EA4DEE64F9A6F89E05:\ D98E8D86E9BE95318429FD7286D528E5 2C92024B2587851C0F58C91B822DF6:36FAB117335A5F0C619826ED801670:\ 41422F58E73BE8C494D750910CA612B2FDA0A41D041ADDDAB4144DF30CE7B26B:\ DF0771CEB11F1BAF934289FA42F54319 0CC08B6ED36673C0591901E14AEF4792:250C9E812F38A9192CC65C6EE5B9DB60:\ EDA2AFF3C4923D3CE745EB78655B0D27DBDB5C584AFE56564C7B625903CED927:\ 95C67856E6EB7B0E98F0934A47DF6485 C6B6E1F1BC46E8377F6C397C136461973F:AA0C36B960BFC811185F74D22356686414:\ D4FBFD37C5B9D12E5E43D1867E1692A2B331CAC9E6C46C228A45E95AFA303185:\ 30B9693B12B7F48C1C07F1441706821D CF1DAFB2581C47D06D8F178787729F8FF457:\ 10510051990A826CFFDF9014CA0B49481E39:\ 47E9CA81E014F6AA4F94A7C0B8A533B7A636FF14E76935D9C7A3CB01E3AD64E9:\ DEE733BD4644E258CF98F7FE87AD8E5A EB95043E36EFDF2B5FB8F17B6806B2B021D1DD:\ A739171DAE7EC95CEB492183803D37165D1A79:\ 6BBA2F42B85C58A4916F618A294553E084E223739F575159DE9EC4F5A63F3AAB:\ 0DCA755F625F78C363AC7EAB801DD471 3277ADC7055990FDA21C89F183F0A380E71B696D:\ 610369449E344D609EEB89210AFFD1C90B05C197:\ F3702792DEFB775F10B142CAA78D05DB26A4A8061CEB39FA2B4A27106DE8D9DF:\ 5C8EF39AE0EDAEB76CF3C10B94D1A002 43733C60414C054EACF68F85C67D547AFD0003AABA:\ E8F7CCA960B713991BEF20DEB3DF284ECFE912B479:\ AAE83136AB1EC19B3BC892B0B5E8EC7A6E20FF5AC6C126DAF6189A7E2E344AF0:\ C99EBDE92D57326A37B4B6F2C19363FD E2ACCDA4075886B085C7A7B71E39BD23F71DD16BC4E1:\ 7A0552BA9DBCE00A60AB31F8D0E590D79E2EBFC49713:\ 222373452D105C2F58E87F5DDDF07FE464E47BC8309718FB30674770CA24FD34:\ A03B629DB1C399F8EE32A7C08C0FDDB3 33CF3C69194FBBD03B0496F1982C570B363DDE621303AE:\ 8D2763FAD25E2A3BA7F4EE3ADA3CC05310B453734EEC56:\ CCD9F95EB29B2609CB35C959009B56FD43A60B4353A2F3D60FE78F2219074330:\ 884C24E8368B3DB123F47D03F3812F12 32DE0A03F6D52AA26BEECF4AB22ABF3A49768683F86EA983:\ D4EE5E9BD04A09D73DFA9752A8DFAD00F151E822052B500B:\ F7C88B964D55E40A04D8016900A3449015D6324DE16A024C0F9FBB1DE505C1AC:\ 308E6F85EE34ECE3C70C1EE2CB7E6777 52F14AAE8ADB041BAC458EF07FA247FE50B868888089587933:\ BE61DB06D28CA4D3B418F10F463FC42EA254929C5C87D35418:\ 972C448AA251ACA8F589BE0F5793100D14EE3282DFB321CE5943FDE99D1F31AE:\ 11C202F46DC54AEDFBB543C3A55E7DB8 E56DFAD59ECA41C38A68C64388CA4D2CF94B319C65E033C26A8C:\ DC4A5B96090CC569B623D54BB1DAA4A7B6D879F21BA420D80637:\ DFFBD3EA5DB1F4D7D9613F069BAF8737F0E37A33BAC9A9AE2EC67FF20E37442D:\ 17E670BC9C590D7B320A233232D43311 A89CF708448D7D4B1BD8C252F9EF7A0A7D978A1E862713F807E0FD:\ A244860FB2E83D608B25D77ED4EBBCAA7C2AF886708002C77EB5F5:\ A14BB231478EBDBD7B6A7D7039559099AAA281D25D095F286B8104DF77DE0C8A:\ 5410153016A90F03A3863EC58BD66004 BA6C11D80E304AFD1D922E2B35A47C3ACB34F7DCB7826F76A3C469EA:\ CE19CF171B181B3CC5261B5A38E9142DA7479F88A9B0F7F63E98BD7A:\ B5C0F5A46D855F6CE47CAC0198FCAFB7432AF8810A3746A90CB440DC2AA1CC9C:\ A1A57176001EF2B0417FB7DE1630AB54 90D97D574AFA947AD194F3B94D17D83073D6ECF2FDBDD5CEE09D3D553C:\ 5139448ECB4D8B454563FF5BC6CA47D9BD23329E772F03E4C661E4CFA7:\ D684575372F4EC2F0131D786EF6B9666C38D2E99C2DAB7ADBD1C9FC805DA4229:\ 81301A434C73C64DDB94440FC887542E F4C312864C4FF38BA8D285608FC924DE8E60F4FF0E603AC7D3548CBCE1AA:\ 04823EE2C43AE04312C6F538F03DB4635D13026D546254A1E0BF5AF97B58:\ 7C3F63710A6B10B0131C5BF96BCEEF6AD226FC25880A975E355CC2547435D861:\ B3F1E356BDCB368C8F1D306DAFF59684 9F188A9CC6957F8408FF2A93AECEABEC0D6484AAD13C88060CFA7C52F55130:\ FA96B9A0FAA199FF22357287FA8DB515ED3D522039C3FA649E5BBFDE5D0D79:\ 8C263F3C683F2C78E8607AC7E79C703F0F1D872BFFADB07CBB9E07C62624291E:\ 1BED13CCADDA5A02EE6F3F529A7A97A0 6F129CDB56D48914EFAE7A534C33D03280CF30D12389EB5119106790B84BD73D:\ 29ED54DFD26F097312C42848BD496B78436F907238EC8DBDB5A22FFD76CE76D2:\ 69F48BB5EAA67974713FA974EE645B5DA6B8E5665CE0E40347575D050755EA6A:\ CD6E4DDE0DEDEB87B7BCE9998F41218F 49407E33C46EAFB24B01BDF5300DEA35AA5BB5AEDAAA2B5E47B2B63753A44F71127F:\ DC0A9F56FB2F440305B288C1C0CCB896B21D89FC3F741034DD76B6887740C5CD4A20:\ 3AE57D49BAE4C54AFCA650206B3FCBA71306286F1B9A51624CE3CF08B5791CB3:\ 75D84A34073AA6331A8990572C5FF55B C34EF208CBE5F148CCF3E005BD2168C8D8346B18464EC8A6C8DD156A3ED34CE35C2A16F2:\ 878A83F17390490E68D50937BEC73D4A5BD4183ACCEB0D582464DD9D3ADE683E830E8C24:\ F39D1CF76592D48DE487808FBCA14585C15F29FFB7C9EF9A4AF74B1DC29459BF:\ 50FE7E7F598B4FC4D0FF6D256135861A 6732BDCFAF3C9681E5684208D5C49354C8C221FBB584080639E3A66C0CEFEE4662BCB787\ FFD2:\ 2B40579DD8E87440DCBC664920573309D3342DB52463F76FC7BDDA45861F8775553129F9\ 48D6:\ 8B387194C2E79916F5D2B5E3145B4F7CBDF8190EEBD05B598A3F44D1480FE045:\ 6C7EAE05E72898C271A3D7F1668532FA 3CC7B907609C374805F3E0625C2A8B77BBFE8C22860F749E4871541D27BE589B21773489\ E08EBFC5:\ FCE9006F2073F1C64AE42908C2E7F21EF88422526423ED8E341F869B2EC8E9BA679E9028\ 102C9BFC:\ 60FC4F62E03E3C0ED6DD21259BBF3D4C24031DFF6A20ADA2E2D637CD0FDA2351:\ 6BC92664DBE433FC2580850BCF0E08DA 741C912167AB5A5AEE918FB21480A2EAE39C0038A458A34D4AF86F6968A97A945B4EBCD8\ D74E5C1D7388:\ 116F94F7C970083C2F918454F7C5740F3F92FF83BD5A0C5F8DE592FF115171711879C6FA\ 739E14D0AFD7:\ DCD3F3A96FEF4C6DAD109A65D574842D04029B155BEA7AD54D25D3FF8FBE5A2C:\ DB7728ACBA219FE1AA8259448BE3D6DB CAD05D525C37CA43C187403F3357EBFB580ABB2F782CFA7B9661B1F71B1809920EF0D897\ 13598CA4749763DD:\ C17D53A4B37EF4AF33DF4E0F317BCF8541ED66DFACDA662289B261ADACCA3D4C0066159A\ BDCB108BBF5C707E:\ 0CBD7326ADF581A058CACF74A3404D3CF9EEDFAEC8E47BB30BC1AF1D3660E0E4:\ C4DB5DDFAEE532C12B7313A9258CE63D 6032DDB7CAAC7CE2CCFFF53592FE2F40280F8C79E312F4DDE307E90863A9CA18E320E0EF\ 27B21216216FFA8EA570:\ 5497807495FF72FFC8C994E00CB5E7F5C521C86965FB17AD3578EE6240233A7E2C9FCEDB\ FF7F1B05FC6DACF4A0C5:\ 567AF81216E5B25179143BC1C3AC52D940F93EB4EAAD54AE0A6F33661CBE0EB6:\ EBF6B3BFE42C2AC5AD0B02B7D294DFBF F3DB2D14DDC5CC45CEF2986CE9775A64C435B36D305DB04A75FFD3BC83ADB8595397EE9E\ 1B8137A8227535B3984A7267:\ 7BCED3DCD661CE1BFF9A6D1B52D957D12E657DD6241F64528C496B6D5A729783FA011AD5\ 788BE7DFF57D892A0ECE7A92:\ 818DD281DE7C051FE22A5CD1FF0154293556D693427EF49CB72D31E05B91FDDB:\ 4A3F1F5AC035B0D18543BC763D42D61A 83EF6209E5EC332E9CB0A2F73EEFA34EDCA0DE7148188A5A5E8AF5812EC9F272147901F3\ 8B811FB759DA8060A1F93E972204:\ C4D6D68DF04F55151A46D291F188C71E3C59C06319D4A6B40B86312E93ADA7EE4CCF495C\ D56E0610ADA4EE49EB4982601DA0:\ 06ADD322678535E83B950851EC12D6DCA818D19F1041F69919A1E0A16D868ECE:\ 8842C25CB6F1E93F2485204B8DF65A61 14D9C539288AF393FD3552DCFCFAA4EF497514E7101ECDC92E875BE2D958D296FF1BE307\ DC5AFD29F71460DD7F093A392C8210AB:\ 792DBAD92AF1F5F5E5AB14060E6245D4175A6D73910FBDBFF76A08493464827A108141E3\ 83E3104E3F4B7EC645FEB7740A426AF5:\ 2638477FF92C0A140CA99B62CDF46452AD58B01A2DA667BD5EB3D425E9EFB5C6:\ FC9E9308891984AD0B305CF160A64B45 C4E76E643B92D878A7BC2693EA1D0E1E86A06FCCFEFBD91506D2B8C6024490FC965F037C\ EBA97C607F808E48C9D86E40AAEA079FA7B6:\ 66BBC945447CD9FC87CB47AE7F72FCA83696BE3BE6396ADD9EFAB87A3BE17718CA2E49AE\ 00758AB922A2F2049BE84577DDFA228918C7:\ ABB8BC67A8299C34C4B97105230E203F1BF8032C876E908E6024F31F0778C2DE:\ 03C8C55A12AFBE4B5930A8D8FF80F1C9 C8A5C5A939F5872E56BE199D24422A7B99F797617B5E39E02729AC05ECB1990CF8D287B0\ 8A718495D9F261E9110E4EAD62AC789918CF1CEF:\ 23D2A8B6508552F2075D340707541547F37E622DF4DF55EE3E0F4E0E610216B7E4218358\ ABFD86EF3A6A5739A0EEA49267AAAFD89B28D5A4:\ 5DBF7CE56C2C431FC9B69EB80635D0B7BF58C7860A1EBC876914BD040978391C:\ 9E2DC1FD8EC1C9E1FD0D5273F1379D46 37B26B33453BC31C69BD09D5778E04AA8F5FFD7F367727B30246C81BB92F9ABC3DC9EF72\ 171C3F38B76CE887F647AE42D87319D4209857EBAC0F:\ 8F85405DF5DEA595B58FCE86713593BEAECD39B4F4BD11B43024A5FFBBAFA0F4817AD6F9\ 2C111C08506056654E003CFF9A60162147ABD56BB4D4:\ 6A3CD1AC06DC7198EB08F439CFED766EF40551B1361048BD17B1A88E9447EA27:\ 23783203B030B2AC2AF81621781FB946 44DE8E16D60C2CCB0E804ABE95CCF7CC597B1A9D0B3FD15BA2CE321273006322B4EBC4B5\ BB90E1456947B3B289A9F6DF266FEA780FA13A2CF50A0882:\ 03BEF28AED188F7AA6128016647546160DDDBE80BA403CC4F29D9D90A5761075B170D1E2\ 7EC6ED96E7A329ABF59F7016F4BCF39F61FD82C010B4F7A0:\ 1CA7FD4782991006FF0246581729BE4341A6556C61FEED749EE9F48DE8037874:\ 7DD54BCD7665BD84E8DBC84F367AA008 8136A889B8105FBAB44325DC6114F395CEEA87EB6E69D35C6020AAE00B47942B262157FA\ 273B2317CE08255AF899CFAC6A83AAB7D4C5FE5729A64AD9F8B7:\ 2D6B1B438E8F7A70555902ED6FBFE2ACFC371DE250F32C9D5B75321913837E36646DAABC\ E5B69AA971A0C6FFB5928E0A75A13E004BF241E73754B74F3947:\ 9E8BFDA871A63F32DC05F53D1859291E6B099E2B4474A43E570D6D167A2E99A9:\ 51027A0552EBF97D8372668BDF106F46 80E71459F0F7DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4\ CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D:\ AD68A517A73C9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C\ 674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8:\ 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F:\ 0EB87233AFD4C552D9D5ED5C415F03E7 0EFC9979CFC65020583D4141A6422CECFC1E816B8682A1BF73D05175E8A2E83DAB239DB1\ 5DC57C4ED427EED3C73491285767EBBFA20CCF1CCBA594FC45980A34C659:\ ADECCA8B5879B64CF35C8AED809570D12BA0C0EB19C319C0B9FB1A0A33C04F48E2B755D2\ CDEA8C0582019F7847DBCEC023A4AD27CF4879C07CC33CAC9DCE9C47A491:\ B0B664A621FDA57B3DF93323B61DA43CD55EFE1B1954A8B86CDEF4963E082B5A:\ 63DE5E4E1401030D736BC327D9DB2BB8 FD8A05EA9F872847A37F33D66906C085D10DD980435028CC0F7FA168CE8363A8A5420E33\ 67DC06AB69C2DDB49C1BC0E32E1F1316EEF18C01A95C23B3342ADA89C131E42D:\ B0A2C09A27F4128353DA11A0797B63AB54E2CE00BA58BB765C8F6F65930E69258F2C3F30\ 914FA964AADEC9B8DAFE39C58757D65CFF6702B955550C8A494B64056B906FE0:\ 6C62EF4976E50622F623337E32D70DBCE1E423B4CFF652C2ECB1D3DD194B8722:\ B7F60B3D94FEE7768CD92148FAFEADC2 A592978733D8647858659889303CAC080E95C2B2B26642520CC6B8598C146DDEFBE1E4C0\ 68F3FC0BE9CB0EF3D61000F2E688AB2D9DE7B7A28C3B32AA3F8B872F91D2CCF9C927:\ 2B3D0D935877281412DF2AD20602D0AEB7E375826BECF964E5EE29A8EA1B20529943BE59\ 5C099BD2EA0F70ED95BFF11FDD52069274E8D21B00AC5EA11369BCA9E6052F1ECE13:\ 85357F480C3AC5C8E412523D2C6D45862CBC91394DAAE40BC20C58DC7FDC113E:\ CB11FF4AC49C513BD56A79104FE48F89 60C42D6EF79C6FD920FEB2A9EE00EDDF34B3339F99BF13ED42FC65247166B19C42099DA9\ 089F8131856FAC9CF0703AB9C73DADDDF700290479146F67B49770CA9B53511D94F6D7A7:\ 35409AEBFB98BC6CC70BE661EADF99C7E1133F912D8FBB957A5A61AFC01E622864C1AD2D\ B0898B0D3682042A510D65584C7EFE9517D0CEA31D3385C857AA334478BE651DC48E81DC:\ 53286FB5B6E08E9177CA17919D845A958B7D55361DDE5E9B09B40138BE3F68FA:\ D7FDD75B3F672908845354CDA2EC33C2 55204AF292A15EF0907E3A05FEF0BAB2FC199A874FA3B72B1959CCF5CE59B1A63BC7D0C5\ 709A1EE8152A11423FF3D021726C9B914283610530B80114A6AB16F1821434CA0B5B66C5\ 1181:\ 790F49950B195EFFE12FEE3DEE248147793869ADE0B46B412F702C4AFDFDC92A95889D45\ F1828CAD935CF281BFDEFEE68057906564E63509A464206A3939C9787AF559C2F18E857F\ 9794:\ CA1AA91974D69777335BD4CDE41584FE09A0F90B4EFC1DAB01F5F6EE475C5B26:\ A753ADB21556F5166B8D0EEA24AF4D20 F1B63FFD3C223E65972E716872206B656F036AB58CDC6BECF814B4372828651A28FEB0BC\ 6F7D5E008A0C9D069C5765D9613F75AE3CA564089840C2E5326AFCBB73E9677D60261C1D\ 11DDA8D6:\ 05C44E476B45156EFD1A73CAAE0CCB4A02E7A3BF461377AC5573624F3CDBB03E5F040EE0\ 0A628EAA819B84461B8F39D63308C5FCE21B823AF0508384E0A5784B99FA47AE0A15F8A6\ 31CADD11:\ 67EEEFDABDB4E221A3F5D331E021861D80B3E52EFD3662FBE4B7F96CEC220668:\ ED8A0E2821ED9E46D9E47973CCF4FD25 415E13F78C19D639C7E2A262D03D17C33648D7852706B0787C5DBCA2F7BC09FCEB3C570F\ CF3E121AD6B9E467515998EA53B59532A5D0C86125928ADA505D07E9C0683F0F2862A0A7\ 09B76B9F3E5A:\ 96D6DA75EDA6029E162A70667227790B28DD1D08731D08024FA175861A30D321CF95FA07\ A96077F5F9F3BD0EF809CBA394726CDFCED17507C89295954F7AF19E7CD513D18869E7B3\ 418E193DE7E8:\ BA8A42A5079A1211FF373CADEDDFEBE4230384AE50C0CADB777689E9FCE03021:\ F2CAE7EFFDDCCC54DB0DE734347ABA8D 5ECB18F27BDBC1469A4EE7273423D51CF53DA0BBCB3773C04F90934DF1A4E686B76A2CA1\ 9B325F91CBC13CDE9FBE0E7FB1D205D78EB92DF19A5AD39D9E5CC07A4329EF14115D5A89\ 4F4669D6B6C3E920:\ 47D37261C8ECBB954E6980BE6EE8A89CC31E83CD8703AF97B40308FC71FD5C204C9FFF43\ B35BC9709CF9089BE6EDA572EC4B580F74A3C25741B147D3F2D06A7C5BE8AA35DF232546\ F93B603A91A4D4AD:\ 00B1CFC598BCD9B708AC9CC600AD951E95228C4941FEA43D3E9F9C4C4DDA9F57:\ AAA2D1218D7E5586150602486330D79D ADCBCF6C2797D693DAECD8B395FF2D8951D9D58748398E1886146CF39B6BBE94AE5725B0\ 8DAE80061365508ADEA2F7E27006BC2EB8296E441D9ECF3A1F105AEB72A7B7ED65C0ADAB\ 96DDB4C56D3E6CE7EF9B:\ 204B284617F9E475636543C231788FFF1566DAA35B7188BA5502116479D8CFA3571726F2\ 3F83EE62960DE1C5512364AD31BEBD71778926B4DBA86C69C87BF62D590FF01D43A7FCCD\ 9DF526738DA3ECC07313:\ D9E06DC86E89570392B95234B2B4DD1D424FB5D96D8E5EE6522EC023247240CE:\ 555BBC29444DF1C9B19DCC36E8F526E7 D1E3667AE3F908CA70E42ADB571765C2977A7597AF1E93568BF144FE6B8774AEC889EBE1\ C55EB673F2E05C9049FD38FA112413C1F5DAD6400104493225B2A1FA2EF314267671682A\ 96A15FED5A0920BEB7915759:\ 0D8B1A4D0B4BBA07DC3D66FEA6C79EB79845A303A99D0CA6A1363494FED39D9B2028323E\ A66F48420620AE16522CA5C036984E431645D55BB71C9729786A2942D246763AE14D4D7B\ E8182F4412706F88D745D29A:\ 8FA2C547E80F8370524EC80BE768591403BC8B84A31E823E1EA7B58D13C2C1A2:\ FC552663E080DE3AF70F1843B20C2321 9E66CD55C5F5ABE2D9F479572D1867AE07654DDFC4B09603A7268BDB98CF22A15EB207C0\ 5946957927BF3442FB92CDF2BC64CB1AAB4267884C65AB29F7C7F1AAA0C797DA1BDC2FD4\ 7E02566998933F0371F054AF75F7:\ 4998F91D12BD0CD7C9C3E4D7E4AFF383D87555C75523452F7764B8CB017DE1C9775DEA51\ AC4A84CBC77FEA7CF4D4ADB3F79279E73EB443513AC9FBFEF3F210F80C553C758149CEAB\ 515578E988A8F49D4B87CFC7C3CB:\ EA2BA62A693024D30A6F86F92534B011D6D8ADC81E6DF43A15F1A38B077B47C7:\ B09F47C60D4A913E80DBEB9572CDDA2F 0B515541E94644E05C6D33B0DEC22322A23EC8666C40697D58B0D7E28FE278DC8C6747E6\ 0924A09442A04C167D48CAB29D095BDCC0EACEED2C841FBFF1010769D8829EC1CABB235D\ CEE28CC09C4D905CA1CC8BE624298D76:\ 0FAD0D901C43395C015B252EBF61F66FF41713C2DF9AD2245E1EC1ACBADD2007412DE768\ E5C986AF3F26FC489676AE5F7507AF559A8A23B56C417FA1452D92CC6671F6E4BA5C1F60\ 819811F9704953BF349CA5C4D3A0631A:\ E659BCA785C4BB8BB49DD36F132EC4984397B2665B97689FFFE7509F1A1D7551:\ 069C61C342C4DBEC240C709C3CDB361A D2C5A20331AFA2FC82F0A0D64160B4EC447FA5572A26EC3C64C9F736E43B0915AA7C3E1A\ B6A9D36BE4A15CB26820E29AACFE83024959676FF05376C1AE788D276079F199936AED0F\ 0F688E42E337329BEF9336FFA36FA4005399:\ 7DB91F84F3477868CDC873EE908DDCAB90CBCAF18C0A70791A120AEC86CDB215E6221A70\ 14482F9E3802EA3467001D3601A63C92C6AEDFB4946845F13A52351CDCC6D5F922D19DD5\ B1EC236E822F62655427E62A4D0E84914622:\ FA7AEFC8F4B784C193C785B93E90D08F8523FF065E19B2F8CE817FB401A21FCA:\ A66594B33C8A53C811C2D97CA6D14303 7255CF6B4E647EBC0AC95A5695F0AF0E9AAF91E3D95749D6A49719093B1200B9C6BE09B2\ 6554E36EB6652041744605EB051062C0B6D1CC01257709F751EB7B9667AE7E329E43EFD7\ 44D96300958FADCA3C106AF1733CBCA1AAAF823E:\ E3D3CF5237D3A038F5F6C89EA9FCA960FFF212211D3C2CB3490607C9957B553335B18C55\ 1BA25506EB2CC3BFE9F3EA6CF0AA9EC434AA592FF77B61BC06F0B2B95AFA8FF5FA494E94\ DB731F57DE8529ED53A50C42F986C16EF7C7A940:\ A26E2B0A05D0283D38D7169BC2BA47226EDD259B8D57B381FFEE069F1B98046E:\ C4E7CE77538E9914BEEFD56DCFB571B9 AAD33FEFE3F84DF826588A512B14CFCC1D853F2AB84203C1D4D8F8B86D6AF3F7173F6A6A\ A73843D5658489507104DA3D7BFCF5168D986464C3448F234CA69BE3DCBB6672575564B0\ 2ED92FA0F3877DDCC06D502A33D6957A0E33F2DAFFC9:\ CD0C9764841179AC19328315A39CD34BAC626AB5DB485D0F9B46059F54E08C5492B908DE\ 07B85E7A44EF9462BA8E0A81FD1220C558295A948DA4DAE908535719C1F88B1560673BD8\ 07F5262483B40AB9BB0C64926FDCD1061E504B4EBD76:\ 6EDD7092DA78BAC7E1AC92E3770134A03D2739FF5D34430F7F4D4D6E9764B319:\ 8AEEDB0DE46407E08707969C750E38DC 8168FC2661FBA3600E59774138459C2961176EFC931CBD6B5C33560078EF7518635D6939\ A98B0767639E0E93074057CCA6883F7964A1668FF9F8210E95D0368F6FAEE9FA8D7D7779\ 2AC00EA2BE1146BF56204FE906FB865AD039577C01234AE2:\ 51A47CF78D2484F3451F0C2A43EB428379D1F6893C1B8A39FE3E60F685DC87C0B840E9B9\ 6FF58B5D5FF56AF2D9E6DD1B2701C68A0E845D4D5976BD315A353D67347BC8730CA8EFF3\ AA0DF4BD6DC8E05F7EA07EAF2C39D7D47D9D84B474E7ACE7:\ BBF6DF7DBF4037FB25B611E6A2930DABF072F65AF0A6457CB9DC93972E9ABE7F:\ 501092F826689BCDFE80F092C26B5EF4 81EFF330211A83455CB238BAB684E0067FE4067B8C991BC1AC8E7633D080339190E5D94D\ B793154FC74FB0AFDAED0804E3C1CB51D2C1E13041FB81B2157BC60C1FF633D16CB4B9BD\ 331420AA12B95CC7AF57C713C24B727846B0C7227961F2C2D36C:\ 6886E3F70FD5F90852F3CE559925D769036D93CE8D9476835D517E0FB32E9C96D0388391\ 30C1C25E1B169ABE4BABA9B82C4ED74DD45F597867C5D53A0506AD37542F25CF58F4A362\ BA222FA1DE9038A8FE543BBB44D85B2E0E4738067BDAE5DF7060:\ 432FFA626DF2A52CB0571B6E90C61ACED99991FCE9C16BE3B63F32BE944E2E56:\ 5C8A73A4AFFAD697BA8B1BCD810D8F11 EE2EEF94470FA795A889D2669CB2B80D3155C8B61BA73019CCEEF203FA4EB1D9AF6C1AD3\ B2954F7315935535333C758A4EB3247E19B07308569400B897322A4752612F0FF13FF3A5\ 361DFE0DAA88394F3642B1C6270718F28BE8C76C89ED29B6A6B0BF94:\ BA17AF1457C42E6E6FDF4F98C8E45C0FF78D4849039ADCE1A168A6ACEEB9F419F49125BD\ F26E443EB783108219A2841F82499FCF6870724044D9CBD95AE1F4E2A3D4A4C44C54B2D9\ 90E0DEFA120414ADC438E66B298B72EBBFDD7BF38EBDC44143E16B69:\ A249D7A363F984C302E92C5F94F8896DF3F776225C022878944FE2C2CC5B4C19:\ 5EE7A0639A58783D7E82D1FE5AE0DE2D 577B77E72EFE7CADFD281160BEB544AF2F28B41CFE4B92C5D770B322D40DE7590090833A\ 12EF4FDFB0EE57CE0A4A36AA71C0C39B33E78EC4CE15CA6400936E1561FC6206916DE9B0\ 3BEB08F90930048F493C05BED453ACC98FE7AB2256B5271A1E8958D07AD3:\ A34F475248B72AD9BA2F461A690921544CAD263EC739AB3ADB4E42652A547553B3A303BE\ 29F23BD9BE7977D6750E50A2106ECF52C0A6724AED2EE8D482D09D0D2B9AFADB78B357EF\ 0F52E027243D445B5066572B0CF8812F3E19475650FE85DE610EEC640091:\ AFCEECF27458C2A9B8F34603C639A5FF1250F1D6DEC2849F0D74BFDFAAE36660:\ 5C453B6546216E318A6036E803322401 4A0F51F3716D41FC3E5264557D19CA35FE3B70E215AE6DA3990D1EFE383B9DE7E50DD085\ 5F751F95BC093EA76843089F284CA6176D2F25999230F6A5B9670059736CE084CC167274\ 9504BEC04B22F26045366030599337D1DCE783ACD0BDECB76DD4E9E8D4BE9421:\ D747558707BE24371EB6DDA6B5FF138987CDC42BFD71D75BF1D6DA35591E4B35C32F9F07\ A1C0B82A55AD28E4DFFE43764A814CA13D60EEFBDE3345BA454D49179662ED53A9F3FFE0\ 92D8DABE481E3DB0D7E34D6296102BC45D61E1719C864FD26FCACFDBA986A6F1:\ EAA4738DE7B609D36A756B5DCEA1CF8F4359248FD8A423BAA925F0B6BCA7DBF7:\ 7DDE259B3EC5CD93A2734626A9B99FF9 D8D191D620CA6DC8AE66658AC39D87B8465D32BB2637128191F0F92E47C7E99E01FD4B8A\ 8BAF767C8D66EC280C77E877EA06435A7EB72EB477CC2BB6DE52160E7B66F305DF97AC35\ C821F418E1FC56FF8617B9B595CE824207099A8D9CFE24B616F14EBCFAC508C37127:\ 6A320C22C68E984F0308A5D626C16343D268693F283FD71885860FBEF767B02E16834BFE\ FAA78B6A806D2E0D1B54451532B4F77365989259B8B48AC65C0B730951DE373B4D51276B\ 0D364BED18782613DB2057C4EE9AACB56CEB2D0857BAD4CEB9A190AF7B9E04B8267B:\ EA42B4BBDAB135C2B0BC54A539D5C9A3D9B6EDF21C92763CC8F468BCA9CE5D2C:\ 013847F7E5082E4F5FD6DC16D754A80D A7033720AE2A602FDA4BA5127C4EE042858D0376774704D582986A848B2A0DBA6DF135CF\ 3F1E5D65F68E8940858A35E9C61E7AE2469CD7B08BE72069354A2A13955FA21FF3B4DBC2\ 712647AA20D73428D426F9B279B5A0C82E2A2620F836B28B03BDDEF45FF3366DD9AAE66E:\ 7FA21E16C5213010DB8F3DDBBDFE1E5AA16696875F632EDE3CB31B4325C4E2135B9D2C30\ 42CEB5415306D0FD7AE237F26E3F135732BDE6C753D0D844AB8270A094D5B24F6C753EE8\ 6455B2E936F2F5EC5AA4058099F6929C95AA2AA6CF70CB2C519D6854579CA23192AD83BC:\ AB8512537C3519628BDABF83E005E8685A180AAC1988E48E39A95030BD4FA6AF:\ 693E3B87BEBD7D144FDFC1796922F843 E84897FACE6ABD7B897B935DB435C22299FB4346BEE1C4381948622ECF3328172D0C3A48\ A30EA2411201A5907778C994EBE29637A290EE6DD503B6EF1D53D368811D5DD731E7E44E\ 27EBB7382E6AD4C74F49FFB62CCF996FDC7710B943334284A38957EC822B4F448B7482CC\ B972:\ C5B740D2E9AE85FC5CFB4ECD1E375C05AD9E5040A8FBB149320C263150A83F2DDC3FBCDB\ DAEE0BEB6C1CE6EBD3713DCA848F87200922C1879238E49DDCA5F931F1EA2CBC586402AE\ B83F1BF2175341D4937CAA2B97F4BB51BDDA63C1F50686F2C40AACA7F1F049F08D43C6F8\ 7E06:\ 69BE0E539EE3C48F260249A10B2DCD3A63BBFBB5AFC85D9AF388B79240674A6B:\ 9A1C7753E6140825999B5695A2CAA7BF 54D9C7F322D68ABB78ADA56EC4B23C1478DA181F30C32732C9ED38BBDCED81F063255395\ C52E8EF6BCA23CD23A70BDE242DB86265C11777A13CBC9752F2ED55CF9D816C2F83AF85B\ 25001D486F5812E39F4F661044091E10C3429894E92EA4F87CC998E22ACBBF867D3B5B20\ C97857C9:\ 1C4D79F2EABBF97E147FB8369933B4C7E7BA77C6A539F571AC2AA8E37C5D8BBAA1308DFB\ BEB2F892BAE9064692A20B8A2CE2A1DD8879160C7E46E2E5039D5C32E50BDC961F3A7DBD\ A36AD5043A87C9F0583EEAF9995994E764E19B62CA4410A87F33DEE40747EC23CE6E41F2\ 80858149:\ B66821FAD6EA6320F3B5025EF909411DC68120198DB4B2A7BC148EA922F64DCC:\ 3A875E75096B58800EE21B31E39BF38B 0EDFD9C739C9F72766EF8962032C1003669F5A648B0D21943E99DC5BF7A2507985223324\ 2187574B279FCFB57182F8F9832AA9E44D15ED2D8386AE4572986FBBE0E6E0D5D3AA4DEE\ E2188614F7A8A381B335FCF9B899B86685320D457D85C9F761EAF43F49B9C9061AA606EC\ A4750FE198D2:\ 87CB631FA8E039C050740F72698E74A93D758BF0D090B1993D6F7042E4E3A6360D0BDFE4\ 5EA8423B1C0FB9ECB9514769890BF994BE04E7A17874866FE1A15CB9C785B0A103F39384\ A54AC746673A7A98D9F9E20D409F7E172592CE58EAAD74ECB2BB56C95C6CFAA6309887D8\ 956087009252:\ 33B871FD2A012F18E3914F1702AF7485BB793B7DA154804EAA715136B568BD6E:\ 596028337CAFA821457B88131F5E644A 00FB363E56B460D690672DDFC0B71DF6E19F5A5E74E6E85E936937A054E8F7D87511FBEE\ 4A982792196FE8456A849AA1C2E8310E66D6C4BFFE084E791A5EDBFFCE270A4A50E5E238\ 2A18C3B9DDB1B71EF1E51B3568B75F423263E025D4E36012BD4350C226DC9805681D6F74\ 52591921AF631F6B:\ 33B7C9F0C16B82C6D6B08A42E1467592FC9F4D51DF70BFE52139614AAB3FDA3FDC97FA0A\ 235A2AF801134B58CD643E325A020AE796E333C9B3C3DF1208AA7CA5185B3FB1A7FC3B79\ E717FE1A8B4AF71C96C2A58576CF14906E0CD7A8C4FADCDCF28145D26131DBD656ABF6BA\ 7D522FF9FF23AF29:\ 51D9223DE781C2931F7E2C08CBFE7FCE5CC2AEAE58D22819A60BD9D4A688C5DF:\ 0A55917388EC7A7648973240F8C2EEA4 85F25B5F5D3E68479A0F84CB9F1D92DFFE17975C864C8A974AE1E2DE60292D281712952C\ AF99C570CED2854B6C98BDF025DED8D8A873AEC8276AA9A1A6711C49FA842C4B446EA596\ 3994F33C74F7C9074B4576750770BD5E5BD9CFA01EC26440A122A6BA0E9A5E4B490581FA\ BEDC940EAC9D6BE86524:\ E4BDC3821AB65D06994979873EAEB03796A2A8F5B4507411F6E96EE5A246118EBCE8BD66\ 9514E234A991D708FF1704CB811ADDE53BAE3A147EDF0CAD867ED1547F4C4CF7199B35B8\ C548D037E494E9DB52ADCDA17129563FB928D13F8EB153A4BA85F330F263FED7B14E66B0\ C37CDA03133158D1A0FA:\ FA54E69192980C674DC51DF702B94A43311661E98AAC776DD7F09FEEFF530B6F:\ DEE6D2C5DB36158D964F28370B147CB5 54E53C0739F2BA49B5A2080E324089051EBC24783771981AA4EBD0E63ACC86BDADCC32AE\ 88099729B4A72D8969D2EB1540F8A7FB3B79C5A0A7F769054EF2EFDDCE4BCA0294AD2B02\ ECA48840A2A0AB20437D9085E905AA2074FC8C3561C564F1E992FBFB15877B7CB54DCDD2\ 7BECDDF9AB3A58699D4B901F:\ 6D4B53FC1B7FC8B97BA8E1D1526944490B415D3D59887437A24F8384CE850F8005512A8A\ 4BF1E79D03AC1245600DCC83EA21195835582B041B5AB2588DA8BD956D2FB69465485452\ 85C2DF36D26CD09B082F1CDB278F86FFB6FEF9DCC3C71E9CE6B629D7B2897B69CFFC2E14\ 510B4DEE8B9D957FC5AFA769:\ D22A6E996F80C4AD83209F4E47A17D78EC0F1343CDA8890404FCA4103D038056:\ 3E4EDE2C0488BB09BC4ADFB3D1122E99 2A365C1E10368C49339B3F64A7F25D6682E34A3BB273DEE16D6679B7DEA80FEFCE351964\ 587CB68A939B36D705A32F1760995CB3B9276BCB06AFF5F68CCAD25ABB7CC702D6DFEF85\ 722303C4D27BD81B2D42D2C6A47A9BC4706CEE256B5CF3110705753929B95248761234DB\ E773C05E79EC9FF958DFB728F8B5:\ 75BD73BB09EE09FF5B8E138D84D776BB8D9B26274D42B012B1D252C22A0E29C66B2C6988\ 0EEDEB0F02376EFDE6F02C85ACDC24BF7AAB725D1CE86688ACB31C5C91DFFB290968B415\ F7342AC9D60A49F7CFFD35D350D4B63DE597127C5614D609CA27EDD1CCD869D3C4554C30\ 81450A67A2495BAE987239937DED:\ 7B7E24D8792EAECBD7CDD6A43A1D0DB9681C8964D1A55332103C3ED167B2CAD7:\ 8EB77D48DE2CB3E862CBCD9D53234A46 BB6817631F1F0A703F4D5896FF5C3CD94187A82F8287347B80924856B84CAAA3A05B892C\ C8D8CAFA85F65DD1922F017728CE2E0ED7D4FC9CE844AC9FEFC79FE1EE7181939F4B7A91\ 213880D6B725FCB8348A4879641A628B7BEAB77673E4CAE70CDF36CC92D3784EF7D529E9\ 404C1E54A9086D0C33A50661295ABB24:\ A2875C6E81960A33F8EC626B9E649747E956690DC4DE11801AE67EFD2B563695CC8C999C\ 1784FBEF30B753AF38C413E361D523C42521A4DA656BA0A1076E8773A335C854037DA8F6\ E84EB48AAFBEDEF12D4451E9FF1636DBE938960753D3E0FE96165474298512792B8C457F\ 83A8664A4D679D06C22FAE43465F9549:\ 93C474796CFDA89D8FAC562ABFD5426E1611582D0FE40511A503119A48A07202:\ 81DB28BB02B082FE9F40675F752B9F7C AE29C830ED344F0072FCBDFEC9B9C634703819B24397D59C3D5418B47DD3861B5CCD2119\ 66B4DCB3FFC5E97F6B171F5C51D75B18AC13A78E2CDDEC9D4B23ED26CBCEAAE29FF78F01\ C5B4201FCEBF7BC029C7730F7603EB456D2AFBD27581BD15941F85E816AA6EFB0D7408D8\ 5F83AF88AF157D3C90BC849031CB9B410819:\ 835993AD13882518F2A1662CA9B4160BEDC60E53083E1F8D72CA3AE2F890856E4B52832D\ A83B341D9D992C0D9E489BB04C75149624C6D645BB9909E12711FC087C56E1210BEBA66B\ DBCFC865520E4DEFAD4000CE0EC528916A415C4661E1ED7095E5777BF375DC31CED5F966\ 4C79CB3FB80C5EECC2067B4313CA27AF4F8E:\ 11C63D070095FCD408DC7E7596C177C0A09961B2BDCB6E7C0F300C918E7E830B:\ 41EF5DF5CF14D6D2C14CC4CBC4EADAB7 BFDA49CDF67A114D29A7949CEE9BBDE5D26FF8E35407A266E12F98FE1247D74A1005366F\ 526F7460FF5B5C45D6791069BDF075C8BD396BA71AED8B7F812F0A31403046F30418A11D\ B134127434B14CAF1E696DE716B41AFAC8FAC96687ABB8A81E1EB37C0C518806673A7395\ AFED27408AF1B83B3EDB1D1AAF54B3C754E8361F:\ D645EE5B89B1FDDE1056BFE827B8F7C2DBEB72E89E8ABA4AD0915193916EA8E6AD540288\ 69D0B1E71E396881006482C013B25915563C492B55F6CFF5DEA950590228899EDCA68C81\ 9B9AC2A485CF40023CBD4465170232F429D06DBB42E4E2C9B5E201EC41E4DF5C9674A1D3\ 2DD33A341E2E0D13351CAA4267BD869BB5AF2804:\ BF4DBB8609E7AB12773DEB38FA1FB31DEF23A89137E4B292EB569028B6A5F836:\ FE53D28C28A8CD12C0D66B79CE6EE6C1 967DC68154B9B3957216DA8538588B899005DA3D2CB9500B1AB2FC4EE815232C01970F19\ BF4068081EC07B041A6AC7A2FD97ABBB447C7AF73C0286EDCD99DBB6FDA189BA76212EC3\ 7B23A72FA8213D5C54AE716845E00262266400DC041D89AA69F1DE8B600F66B16485FFDB\ 5BFF89EA33625DADFB00DC35827C4CE73EB098B3A6639B26:\ DAAC288ADD605085CBBC9867F0FBDD007472B15F34F8A7A91F16208CE15F0BD2DEF3FEF4\ 32DF84F66B1463777D3B2F0E3D2A41982BD845217383412BDDF2EB628EC8DF59240A32F9\ FE442E334CA6670C6F3AFE7835C5D12E064F272C610F1084CE39380E029D050E5DC5676E\ D7DD090FEF19A547EF90258670B3A49349728733E69CEC34:\ B6E12C2EE1A50C4860591BC5AD7677BE5C77120BE31814A03B1B308198853950:\ 2E78B846599FB10E51D8AB906D7AC754 6A3C46C05E280864DA7660DD5600F4050AF7EDE52B786F246C2BCAD03C8A88B6BBEDAC3D\ 5FE79AD40697BD88EEE4CEB3F0C8DF2F0F5381321D8C6E89049728B0A0DA9A71AF00DF1B\ 9BA71565C73F042CE22FFAD7B9DE33084BEE400C11E6A6F8398AC35E816E63B42AC23098\ E7C5CA9B4D78395019B6123EA198EFB6A2E92793BBE243B46B1DC872:\ 2178CB3861AC4ECCA38D4C31EF1EAB6575AE0012BB4AEE9615069F62013B920F13797DB8\ E432A8DC486F62A9F219FEFA356B8AEE7B1BFCAECE0DFA4F94E22A2219F6468C2D15A69D\ 11CF93B67AFBBB98F185807D32B794C6FA8F22794EE880084F6BCCD8CB5A7D0C59D0B737\ 781A60B29F17290D39422BE10A6AE430AD37C717D5C461EABDF8862C:\ 91E98D4A6EE9D7FD83D643C3BA829746FF2EFF77FCBFA41D44CE95C4CD76CAF6:\ 7B659AC1248FECCA3EE765ABB8D93D1F B0B0645AFA0E15A28D3EB6ABCAF31C6996CEE3C93B76F957424FA82B174BB3E9945F3969\ 094C0E6E5544D64606B54575CB6CD6E40964B84E94DE2193E7B9A00D4C5D140976DEDEE0\ 40585741F7ABB55CF8EE815F7848C4CD48D30C16783E76ECC14D384F480CE896532CF6F3\ 67E23633642794E6A913B871BDD702934E8968EBE1B2859CC62C01BE12091CFB:\ 406EB5C237784660784E9A1F477E4B8655B07FC54D1C69515C1B046005C05B82D8065886\ 39EB44323FCAA1F797D210FC51C91E3A51AE8236C0C2D6C521F2FAB29E89361BDA2275C5\ 43B54110AF60C7829D6C5CBC42BAEE86FDB0FF22C08EE59E81E63F0A98A6781926770B5A\ C7792CCEA9847055813F065225B49F387E474A333D8B50926E3D7864035D75C6:\ DBD7D9C318FECB268FF109238110F96FCBF2400BE054071478C7A2AFF75B384E:\ BCDEBB1E6BC37F18D49C0A4A1C7665A5 C47325105EFC7B78FF868A0E1CABEBB41B6A184780A52AA1D1E78A284C073089762B8029\ 9A628B3B22124250CC683CDB54DCE31E4072708C232129D437B89C0CB8BEC7A8F658291F\ 50AE9C66A0D62E26528032FBECD9B3112CCD022B7648BF995ABC46C57E821B3F3CE0EDA9\ 7358F31024F532C5D560D016CFD316A04FDD29588E6D50E681068EFDFB8361F93AA979F5:\ D1043171968DF2B850257D7D14FBB7DE4E34FE62217E9972BDE0283E6EB2054874C6CB8F\ B66A18A6F6885522D719EA965A0BE5F079370EB76587B8BBF5672FFD6B4390956C5B81E4\ 0AB21A15C8EF17D1189B6EF8E931A07B192ADDB3CEF0C66B28CF545774762CEC9968EC1C\ 06FCBA860BAEC78EE635495137D4E7B659100C59BD4496A850BC0FCF464531181F47EDAA:\ B58E1583AFD26D09ECC1B81270BDA381ADCE90DA1A6096D27A61C8DAEDDD9F4E:\ 7BBB7496BA015237C080354FD061CBDA 73DBE3EF41EA394F52138D24103977D8010166084F8FECFEA4C5327765735D5002FC7808\ 955D2DA9E786AC33F41A41E47D06E18B84344B4A5ADA2F925E536799ABE3367E0CB181EA\ 720EF44D286DF2223A34030E66FE161404724DB33DDB026FD5C88072D47AAE1BA89738DB\ BE681D79E330856E4DDFCBD2E998E5065BBE6B3AB93DFFCC0EE04BBBB13E47080C511F74\ 61ECB802:\ BCAA1E8F81FF49528EA23C4A62C40953CD98F16F91AE3EB6878C7DB5C3A6CAC4F8551A34\ A5A624CC587A5A22E81CF9405E38913B77344DA59A53FA0BACFA1A4BBF64D234D1963AE5\ E89159A24EB1237B93F25D652ECBB9EFD26E2881368287357D6783A8F3C1ACAB50FE60BE\ 7ABF7225F8AA0A06F54A63577634B9E930618A1CC8892D290ACD04F7933CF654A8A60AB9\ 00D8E0A1:\ 3A945A5C8FD52A46037A426C32946D59AA9B081C4993C634D9EAC2B7E144C040:\ 4C6D4D342E2582177F3641F777D337FC 451FC9DCFBC3C8F106FC9C17A81D1C562E45341B4F05B5319C912CEBBE01743AE34D0693\ 0A5AAB36166780F9E75C154FBB1110375B271C297FC46D4B97BC70C1E8B378CB1E29F61B\ 5B0BCFBC8238E6D460054FEFB4A649430AAFDB7F01CF78A5406A3087E9C39FC2D60C4CAB\ 6CEE3DF6A3A8D2F0CD4134209C323D9CACF15308524519C40A81AFEC9736FF858D78927A\ F66EFC5FCE806ECE:\ C111527D486F8581AAB32257A7577B062AE1D781CF5B44333D12C3208BAF3C8E1276ACAB\ 0F4C325BC0D3FBF3913B13D2F06E8E64E2CF8017634AC9162EF32324A3465156613AFC57\ 779B9340CCCCBDEFC6476D2A4673DF123E435C6A98FBB8E59221C7667CB831EF2E7B5D49\ 26C9A022204F0B3564C66A9C8A7F494EBB337D148A8681982F70524C467D868BAABC86FD\ 50D5A2BC4C858342:\ 94EB2F6DAFC83A9FEEDF7081D40104F661916D4D68611AE3620A7E52D7C8F79A:\ FCB50453BF443A452F735A2A7BFBC5D8 5C1DB0ADA94F46127F18B21406B6FA32EFD090B0FDEB549474CFC19EBF68D4BFCB3137F5\ 47C48174E79DC87CBF308E0E9306E68B5FA1F9F67E005A2E033DF9034BE4F1E8C53C5D47\ 73846E8EA3782C70E8B1026965C40CDC7D5884F763BE3E2B64AA7458F48B6BC76818B52A\ FB743300BED3971A416C587BDDC713A8C5782E91AD001E8D3DDD0EBDB978427173AFA9AC\ A2180F7DEE47FA5A76F7989A:\ C8E1CCDE12CBE92D8E61F23DAEBC35123564A94BAF6F2511B4BAF697D04EAE69C9B1C8D7\ 8E6383F9EB053C6B09F9A2A91EC0EC1CEE7801B3B01AF1E9BA4A481A4C7B73B0DC086285\ C43CE33919DA440C1EF892D9A254FEB9179BAA1183EF319702EDB67FA2EE08F43A719D5A\ EE5D3D7E10F0599278C70F25104885DA2F3CE797D3064FE6400366950661B6F703C8FB9E\ 1F773D893DCAC13DA94162CB:\ E667049150AA0CC53BAB66F3EDFD5C32FBCBA264A6EB12D4563EB5E1E73F2D86:\ EB8D65B2A91A7003E9CB84241B1DC009 734BDE1B88BF91B571B7EF20524347DEA07BDFAEA8D194E00367A905DAB483F76F923087\ B1E307EC990148E1C3B2E9DCDEF1694D9CEAE1A86A2D092D84B1247B5DD627B68E6CBEA1\ 7A539A5C650E8A6713ADDC2517B8FEEC7656264C795B1B0034B30B302DFBBEAAA12AA6C4\ 2BB3857A3C641A7A760C275F9C01521432A697984E12C2C7727A538834E90750D4FDF44D\ F7083842090196A95D2E8143AAFF1D5E:\ 8289B871A4AE2E14F7398E510C5B522883893F59C8ABE42567FB879334A761E5332100EF\ A7C6F6D4CEB8B6778D0C4B543BEA8B3EA58D198DC3FF02A8FB5CF063CB40E607087B5F08\ DF86C906F14336ACB78832F20303533F8A7AE39A95C0AEBFA2985F97DB96E84EBB996F76\ 491D186ADC6D0C681F33F0FD3B42632E87E10DCEA36F222E4E7E8B4F2A5CF58D341BDA67\ 9516C829370C251824000BF463A75322:\ F26DE261DCFE004B4F0B322D1CB4752F2D38279600B0A9421E1577C863A7978C:\ 2A4169C8E13B81AD96DC1CEC8723152A CCF6EDC92B1D17CC548C9973270FA54865DBEE4DD450683C7D542293BB2C59D2163027C2\ 29055943F7872D8CC2C9889B12E9B409D9EC55C346FE69998F013256A250FD23EC8C23E3\ 6B5412101FB35E7A0C78124BF23AD040327C608849E720EF644A552E35A2E98CB8ECC28F\ FA8521BC4CD947E4BD24E4A70AE1A29572C746CDB98DE74477FF79101C9E75F45B55D6BC\ 2BD0FBC9CE24B569DBDC2DAB7FA88A07CF9BE2A0:\ 80FCDC8D13CDA4FD4653BE225654BD597279CE58C66A3CF67B95A8348DC976944477ADC2\ 0E9CD0E24C7913C928B2E0C531D43DD7F708FD4247D87954A7AFABE300085D169D280FCF\ E16E580A0FF5AB435A7B64FAFE9928A11BDA14FD827D3B6DA14373879B4FF12F151BBEA4\ 17DB039CB8226AC91C8567B38DAE42015456FCBECE1C1CA8F0D2CAC3ED75F3D6F01D8F32\ 2F2822D2D4B0929D2831D9C0A801D49F77EEDA99:\ 32EA9D65FF14E80EB4AF36A9C6E8F663CB37CB6BFD131F14B49AB528614A613F:\ 3F1BFB148CB229C2E07719F6F99AAE22 428D69DB8D1BADDB36EA5950FB2F99124A78BCBB0A7A9B1398F84A7E121637B48D12BBF8\ 5F045718C3F0409633E263F62F4992F4C6D497AD7093BC8BB1BE5663B40789DA824AC2EC\ 929C5FBB5107969688A9DB02BACFDB400ED395091A98DA4F806CBD7A9229AB96FB12BF50\ 2243D810B6A9B905C48B7612F94AA37E671F543FAD6BCD9C6B181506F447E90F88F050B2\ C7B7199B88AE55AB922FB1BF4A5EAD00F71E83EEA2FC4F25:\ 5050237A09192DB1FABDE4EC7E865E3969AECB8900CAFD72B223A8E08A34AF993B1F3018\ 32DB0620BFC6757BEE80D215DA0D6B23666371158876E0422D540B2DF889C9F8EA92D181\ A79AA8BDE50ED123C0301527C0987C4EC1FC105E6B8C0EC12750AC13FEE9CFF30E5A6DFE\ 47A6E63992A803F94D6E79F5693292C4D12D963BAAF42727FB9F6B144F6AFBD819C54D37\ B3558EDEB4A049C7947E83E68C6ACE0203C882D9A038727D:\ 4A1EA133F919B366E3084F80E89E091C87F5F703FC9185F5C8E34E14973DCB2C:\ CC96182632AD38AF5273863621B25E55 C6092B37D8B6C14650D8AB31815C321B7923E9CAB069598003744F33EBEF1A693CC3E03E\ B801BEE76182BBCE6CCAAFAA061250F5FC6BE6E07A3C39ED3F4344982E2DEC0A5075E5D2\ A3218AD1C27F12C55D9BBC1B43BFBB79BAB35F74E1899517A839A54AD5274B8718F2AC2E\ 8F89A6CE94972A0AE020BE5256F8B5365B8AEBFEB63B886BAC9D263107A13B95E29A521D\ 3FBC7CCCD620E134D2D45082328AF1BAC6EB8B917B3F70A47B9D5CE5:\ 3F8FCC0A28C43035C055519FDBB13E8E5A4B35DDC04B62BD2AC7064BF7E4F7CA6C5194B4\ 0344F4C0D0C40AC3696C47A6CC2F800139EED2677E580BFF68399D8AA68DF7A28B95FA79\ A1CD776739C1E2FB9C302EFB924013ED0FB2B06EB6B031FEC8AF7BB47E212859E1D13EA0\ 96E029EC051784317F63F5DFC2EB9C7E8E249BD88684537CC36785C54D8DA6F512450831\ 559BE2E67B024171A52F0481102C211DE9138120669D1C2A1F8BFB10:\ C383B62616C48E3FCC6BB32DE3AFE5DC184E83ECB739AAEB94D82E942F0CFFCE:\ 52C109E1FAD94E490BD93584126E30A5 0D85590B10C077184BA269C135DD1558CAD1A3D792BEDFEF45BCCE14E9099CC4B64D9864\ 97223B4D3CC9193E37E31FDE74E31023C9D265ED49E8D7B1032F1FA13F50E486F68FBFA3\ B449F671878BCACA4009CF4607556E85878A2769472D481D30CE43787E1065BAC0506045\ A26456644E7D5149C54C5C8387F5E23DBCC762E4369D4E7E24C4EB7AA5F3FAC3D76EEA37\ DB6DE27601FBD37EB44D4C3F30E5688B549A029C22EE2282E408F9EBB259A86F:\ B317F91E9BABF4361F26F96D001E3D63F3A82F2C8DADC4E4080611711CB4A7D77FC58D71\ 9B6ED93D118C7ED676A5B65CD259B9E1AA77AC2813B62FB869C42DBB0A710D1C986C0F97\ 8517DB2EA942D0F76C06AAD414ADE04BBC908DC428A18729B4D55CA600874EAF530B38FD\ 4318F1B2D97513BD3FF17949BAF9FFF3BB84C3F0065A521B4595E9801B5233DB2023D17F\ 5204D87AE7ABE1ED73F091A63CEB338FE9BDB2B82463E6B6B05883FFBC0AABCE:\ 357D3ED5C533FBDB195DD88811F3D6D50EC133A5E0A36DD256BC0E561ED28CF4:\ 38670C0DFF42CB73FDC3295694CFA934 F8891DD530B83DD5EE3EF9050C7AA6A9C8A6EAAA4C8669FE126EC1C78A6F6583E57BEA88\ 84A368302C2D9C00D6F2D8DBBB98DC35152E43B1A9D744BF0FE1455A36B6164F09F55D4B\ 12290418E14A88F3F80A5EF558FF4EE01CA1ACE680FA028E81C12BF8A18A18792AE98513\ 636AB075C12320038C5BD733DCC8305551514D45E098E8E07EF0A293A489DA24BAB16973\ D270E5D92AF34E6ADF9EBF945648192640BEE963281303D6DE6097E48D0AC4868E87A58D:\ A54CF0CC7FF8A5B041A15C78F26EE7542BAC19254BD4D421E9A1843C66E9D8B136A80E28\ 31E6C52278CA54C79750CE64F6DAC5078BE3CAB44AE9F4D9019CBB310900282A6BD48313\ 7870CF8B0CDD002C61BBE679C2A87C7B1B1F1632DC57CC277FA4767D77BC2F0273879153\ 69012D0124BA8B2B85D8454499843C5F2FD9DBD584F9E2588BFDBA062C9F0761609BCE8E\ 0CF2B487F0F2C78A1C0B6D5C37D483F6B6EC52B7451B057C2D5FF2CD5F2BA443AFBA9215:\ C2B6E94866DE53E7B7BF5827D5C0179A530094FE6AC5F44C9B3330D6C855E918:\ A4EEEA6808FD5626B56AEB9206F86EF0 1712A86BFE8C268C84902ED230BACA2B7B1610B5E6837ECB817D5D945E009BF627039587\ D42EFB7C3966B9E84FA3A8A5363E1077F287150387C3A9AF1719D91CD175A97156049340\ 13A8A39A90EF97974A419796DB11DF04F3AC7AD348F37969FCB4F560B02108674026C17D\ 59D191A92DA7C7E32292D3DBCCB6D3B29C09F794851BBABDF7F455A9F050A069578B6A30\ 315BFA63448CF7A6AE2EC87C507E0A762A18ADD0BE18DF7BBD4F622B1BDCB693B53AB440\ 6E88AA7E:\ 3C43430F459A8E942D7360E97A89B2AD6454DAC2E72F64A1B06233810334C549D63D0BE1\ C90A419203632CFB5C52E205756B751630DD08008BFFD348CD67C96774AF48C50AF4057B\ 4A3CCEB8DCC2223481AFC79FE717CEA8EFA2759C4B64339B2987175D14B4C195CB8E1363\ D4F4249BB6F8A769454237FCCA5F848BFC05158F1D27BF39E1777A3A1648B555A72DA4CF\ 5B297DE904DCD84E36EE569B3F0E1F943873576F97D65B8669ADCA2BDB322E4A864DA4A9\ E09BFE3C:\ CD9057AF000AAF8EEF7F304A770DA1394F8707E59917A82671449D336167E456:\ 4DF89B713AC1141D62E2C824896B80CF EC9A99CC500450A9EDC1E707A9480144E242DF106E840B9E8D3DEA995A0C9F63FCC02117\ 02E8807EC1ABA88F5E33645B754B2E28EDA71F1B88E25B4B03B0909BD075F3855B4F6E18\ AB07406AD94E9C32730C09CEF69F7A4FEB3F09C83D46338926ED795ED4EFBD2917E47873\ FB6F516F6E4AEDA8D0310A914DAA25A08CE4528D67C3E1DECA8754552619027FA6FE7CD7\ A1D9638EDB529445113C09FCA8BD4AA540EABB931B6BE201BA372D213162E14141E3AD51\ AF9E684896D3566C:\ A7A266F5E6CADE688097C04788CFD45BD87FC636201D0F484927B42FADEE8F789EF93F31\ 19D0DDE8E3716C3176360B928D3006A9F42BDC12D0591817DBD82D75FBA44C784FDF2D86\ 5E11215AF461C7DD1F9E3B82A146942CEFC56DFA4F8F80C4F0CAEFDD323607F43B33FBDA\ 7B6BEDF9DDB2A8C908E6D172900D2B4CC633C610812B62CDF225CBA62E09A8A1A1D7CBDE\ 1BF1C14CBF4C24080678677AE59166314703A11607C983C5AB3C7F755B220F10DB049983\ C1EC0ACCB1368305:\ B86E45AB9929C8382C8B068D619CD8450FAC18D39F31D38310BE8DFB8BABC18D:\ 3B10255473C571368D678D36964404C6 02AD0113F276A03AE7A6C336B4DF4092F27AECFE4FE0DE526F6C548BBCA129FA24AAE385\ 0D0889FBB6F99324F7C01C749E5C7EA3F550594B98F4488F546C509CC256926174875DCB\ 99470F2D79EE7532E36A88BEAA0AB336197954B13171897727242BFE37DD15EE0F9BDEB5\ E512A202AC3BC467C91191E83FAC86A80EEAFE0A8585E293558F7071C375A91824844347\ 5B57044ACA87243CDF11AA0838D9509A712626461E9DAFD0058A16DC7C4E8D69F53C165C\ 3CFD4AFAEC80E4F764DB4BE9:\ 7F3B26E6C98FACA940DE8DD01BF79AC15EBA4223AD8FF243909C321226B7497CCE5169E5\ 3A3A342FB1854C1802A38F87F393224EA8F518F633B04BB8EFB4ADDCD47CD2599249A40D\ 85A91CAC62ECE87834C028DD2F4FA50FAC1E6B591AEA8A454FE3BF3B41EF7C7FF533AD2A\ 5D4D690F899F5CCF8D4DF6D4FFF94E7F7567070B0309A905DC671515AA617018F7C37C13\ 763A445D48A5A4569D77815C1349A7E0BCB01D667EC0613A1EB0F12044DC748BFD1FFBF4\ B173FE804CD0C91744302030:\ CC207471BE9C6952378E60D263D69618DED46A78A21D8B7CA94E6BCBC4E3DEF1:\ 44F3D7AE3D2BA40BFBAA37A0709BEACB 459C134A5BE569AFEBB4C7109D43FA4A5691B113D13CCBF47C06E90787A23C3F9C296B94\ D47E2606B655C60C26E9DE647F4CC5BA5A49F5BCF458F40938E06BD259C20254F46F6932\ C63C29EF311B63BE600E5BB7179FEA67EE10F7DA52C1A30E9EF1944D6321C3CE169123E2\ E7D4B4074254D7C4998ED6C153BE0F79895CBE9B3462122BEA0FAE7B3FCCA09E5F980CB4\ 39A2F748D0E704C0184B56332921E85AAD4214EC7DA6EA8C6E852F7E1773A9602DF512C3\ 4895861E1C61D8EA0408F103E88702AD:\ 95042E5A21E494CF178601CE390B4F9AB388C698AB66ED4F2E7578A10984E30F63BED24E\ BC839EA91BF852AB63AB170D8EAAF93FF2188D416DAFCF8C30B29455F70022284A6F934E\ 417F582B774B034ACC257C38C173556CC2909F5AF94C0E7E7CA69286CD7FC2C729DF2F6C\ 2543F4B12506DAA449CA990BFBAF39D386F36D490DE0932DFACA60644D7852007EA5532B\ 6EC98789F49E77239C236284FC94B77488FCB5EE37F0A3CF575541EE2F8FC0F2BFB67044\ 7A7E54C63AF122536C4B61B7A9C143F5:\ DF3DE7C6FB886CE9DC51AEAC38374C29AC993630BEF81F21F725DFD4D6B799E2:\ 825A5B8F13472C46443D47145A1C136F 158C45549636EE574B32800377F970320B9F861641425ED07021C9C4E44B5F1664046328\ CCC1064397FCDB67015873B5EB433F52DF4936AB289A8CA161EC6A43E7459DC36332479C\ 704D956E18C86E11A8C1AABADD88E1EAA313A3D133004A34ADCF5E0F2301C3E0317834A6\ A08CFEFD219DFB5F825CFA794DBA5971E6360DF22E3E0C15881021377DFD3EE69E53841E\ F08B3F95D9D04CAA005ED15870B94557BB73CCE60B73495655C9C164098E2AFA19FA7420\ 6685D8103BFD9476808E38F8401FC582496A8EE5:\ DF6250DDF592B446ED6D976462EEE2CB2D7830E67AB9567BC275CBA74CCCBBCF008441B7\ B1593756DDAFAB05B1B728557F6D027A2A5EF2ABB072F456761AEECAA143795D93D6EC56\ 7D17F259013858513D20CB461BB51C3CD3D4204CBA768A5A3CD4B5D19563FADB62C4054C\ 9F7D8BCAF30F450F14AF29429E3E27C130FBC7B53840A00BACA0281A90293C6D60376B4C\ 6C455C771D1008A542E19B13AE1D4D14E3B8C69FB44550F74384C02861AF985BC210CF9C\ 4625012CEDA24B08842986E2DA30F9009113F0A8:\ 2DBCBA50DDC8EF3BFF1511BF0172A073CE37F42C83BA223D7573A82B13CFB813:\ 68A59DA89E8D3AEC1D4434F7A2EDD2AD F3087E4CCF4C82AA5B3CACFBFE367B2F501D1992D6455F10EA6C047A26ED06BF4393D53E\ B0FD5B8B587B19ABE106269A74297B517D57D89D7CD26009B5DA7BD1B5CD40CB5B4DDA96\ E495A02BF58108337A4F74E2A33C8EE14E730740F023560B70582EF4D1CE87C3AE5F5FE1\ 546F5C16683A0630342C319E2A5C43BBE7EE522BE44F955B4912A765B1AC476828C0C5E9\ 8948ABFC096ABCFC4FF2DD5077926C9A3F21F85D6B3EA941560A307BFB4714A11525C60E\ 4D70DCCA56ACF6FD3B95560CB6C3DE1342D8FF18828783C5:\ 996FC92E3A276EDF16CA8850CF8C9530364D170EFA51D1C5DFC2843A968E3CD1EFC50402\ 7C2E056AEB2E7AA5DC3EBED6CD25728812CEB545ED9FA552B1D0B1FCEFC4CDA5BC2646BC\ 5FAAA4C20B821A417980572112F737A7DDC93C39B533E9808D86A495547078087A678570\ 1D27D4632EA57D398F217BC191A30807999BDC509AC74AF3DEF4B1105FB8B904DD9F2CB4\ 158ED207614A07FC8F3803DC5BF81CAF15B709B099AC4F1F0968B7577A81819858D20967\ 77346AFC426792B9581202DDB4F1EB17EFFD81CDA476AF26:\ B09FB55A95EDF75A610A03183D05A8D03D6CD9CCA7276530A72F6948CC074848:\ 0866EC523C35B5D03269F4F2FB004AE9 710647FB3C699E7E83D1601D49513706C54CADC3034E47F8C20E1523225BED6FAF93308A\ 653921AB1043732F142196A32329AB98094C580657617967787D738A4EEF541ADCAADE48\ 84113C020026F6AF952FAEB1F9745B6D450FC86A04A9C4D81F4AB15089DC0BF7B1548D4F\ 850CFD97C6732FEE47B2320A31BEFDA8398C4AB0D7FC123C43F642CE07AB8DFE87B114B2\ 28455479AF224BF82B04BC3341D257F4EC166D9CBDB1793946FC2BC08B72F7099128CB41\ 0140DF4FA38A2EA4A2569DDE2E3AFB3164DD2F9D830A831A323A09D1:\ EE6EFF319198C6C10DDF6F10546A5F38490A9D9858E021F5DFDFAA8ACBBEF0A446358928\ 5E8F1EFA697D08ED42F9160C4E6EEAE1F15D78207FB207565B9DE9DFFCDD96E88766B2BD\ A996CBD439E45578596D91E88F7706A94C9428CBCC3108E1F61CBAEB184C30E5BA0370E5\ DEB1A9B8A42191BAA3D722CEB9DF9ADB69764820FA95BE1B48493BDA88030469CFD41F5F\ 13731A983FDC9B2CFE562881BC479253A126D57A8BD02BCEF2FC6DD8BF1AB265C924EA40\ F5CF75F4E36EE10133923E2427E19BADB34F221CDF4673D871ACAD8B:\ F6286D8D4FD9D8B373C7ACAACC517DD041E6E8A69578CD444B22579B4D3C3EBE:\ 621D087684EF405E7E49478F145FBD45 707ED22B1DE93A11A851C0B14B1CC4B09E6431FAF7F11E97730D1E9F5C729D9DF12E4DFA\ 53E88A5F8507FAD0AB721510E02EEBDB84EF9B34120FFA1FD80C5C0C3503AD02AF96E4F4\ 66C462C3B4F3D26C78DF8C08A551DC39AAAF7EE05B13D2E1B80DA5A1A532B13EF0D1B065\ 9D2A0B43246E52CF8B6CF4EC5918769C21C51C6D1DA8DCCD2F3B0360248480C36D4F5CB8\ 317973D42FF7DE23D34329FD57B204EDD045BB87DFA5913819F15C6D5049DF1DBCC696D2\ 4C34160249CD84AE0E94C9D50A5EC764C48B26C7C8E28BBBF418525F9FEB0DE1:\ 4F9221B68E45395D5C923C4A6F96826018E207CEECC5DF1560A7587D15427B75FF3188E2\ 19D5EA5F92F909B129D6CDA2AAFD9D52B8B0C05B9E9363E8117E9996923ED6C59287108D\ A2F5FF3451823362B2CEAB17E862E622437A990F7B23A9FDB6791A9FBFC1C06214673C92\ 41164044EFCC6439AE42079D3B1130320A878581D2EBD264D4FB53ADF5A60091695636F3\ EB58B73A3342D3CDF833F7E82D6EE1FAF65E327DBE4350307CBD631042517C448F91603F\ 2BD6038FBB847B53F98A8DF30205022C613365C8C69CC55C6B911CF3D5567004:\ 6886D97D7FB73175DA93375F14FBA49AAA7ABE901751EB42CD243B568AD6DC18:\ 9F9E1F292C86CFB45E0334700755C190 0612DA958E54589E58F7C2E70F374D0CC47109B326598E46FCFD23553E3D84C703475618\ 68DD38847E0096E2FDD36CE8997820679ECD5219FA16CC9FF0F2DF8AACF9116E6FC9F926\ 1674EAAC3142DE0B9941DE77172FCA477759531B77348D914017B5E1896DD87B3DC0CB84\ 4CF642C1919D25E21E2A94977065621A4433265F590DE23612FA6B16B031F6DB3648A42F\ 57DB126211F6FE7231849B5B54694DD736E512D1EEF0001BDD94DA84AF47C71FF61F4951\ 019CBFFAB709278DBCB60F17EBAFA7DDFC071ADB89EDD569CF4A8C7D566FF1B7E20CB0CE:\ 67943CFCC4B795A311DCDACCFDBE44FA84FAFD87889892F0410166017B032B78CE7B96D0\ 3D00222424E0D363DD321634F4D151E1E03C357BEE8AFC7C561E8629EC55EB52567EFC8D\ 906C2AF0E4C385A0011CCB9E254834E55F7870F10BB563BF0A732CD6AC6F8DDF19C0D3E9\ AF3A7F54C38E66BBDF3CF7A00361FEC2F5A7EBEA03C4C42AAA0A74F11EC51D3F5E1F78B9\ 0B09CB524F7A5DC8CD561E15EB866449F4893FD49346290A63A8D478A0C5ACED66550BF6\ 4D2A0CC5AE29886DA6DF798D8EDA7258B74BECD3094D6E83A61A9288EA1A8D0FA91E6F19:\ F1F03359760DEFBA1ED11309F0C1D27A311FA4DEC398107B2D0AB2E0EAA895D2:\ 2FF7028F78B7F5623CBE7D592EE5603A 4202E5DAF05E4E2DA055A9B76CA4C678A5D7F1B5F130E68389A57A52AD82B1A08FD35CD6\ 1832A0964A5C66F91E9F7826DEA9C78F5257206DD3A78C099768524D1E3B01306A9AF70F\ 2FA7DFB02F9717C2C9D7CF037603B96AFB5B9A5C832FFD86793C0228F9F38593338D92FB\ 70CFE3EB0B4B0E149E52ECD784E0756C1934B3DE03B439292052C21B40CB5D39FDD7BF3D\ 81C314F927C6EF03FB4270BD1DFB796EF59F887AB566D2AC112C1EBBE1C98679D7F0B724\ 94BAA6735FBA58D3CD125ED42272E34A9D51407D5550FD3DBE0E06004D31CA3B5CC1874E\ 10A60668:\ DB896F08DC3DD1224CAA35F8D841E6174E03595794F8C623987CD275AAFD213A0622D2CA\ B9DA6C8FB847FAD852352CE37806529A4F06A1620AB065D157E8992981BC74DAAE1AAD30\ 0447E720146174D75C8C09F1A47D307C6492D93E7035A081D4B47EAA116BA2F2643CDF4B\ 26EE8B82BC90FAAE8BEDC463B93F2ABE99BB7A1FECFF8FBAADF907FDDC34AFE59484DFEA\ 97937C02EDECBD1F3827518F3183FAEE67798726A220624A7C5AFBCDCABA3ACCA8862B31\ 9DE90F4C59C13EF1B8FF43DDACBC0A18548F148676034A3D71E928B1D25609C539C3203B\ 7055498D:\ 8739533FF38CD3C2A5969CDF010BE33299B5772DA0F4A56FEFBCFB4C187A398B:\ C28792697951BA0551162D5FAC70775D 2A797C4F230EBA8E8D560B141D6F7498036F7C54D326F67E8A0894E7C7DEBB49A717E2FF\ 12E5020B8F4F3D00236075334BC1C1BE18609339FFE59A60DBCCA006446B05FF8C296E57\ FCABA4121656638EB88214BB0252941598EAEE42966CC162D78D0DA6D54C037876AE0931\ F94BA160CD17DE6FAFFACAA68C5F765CE64BC85B4B132366618C723B04ACBE5392991A1D\ 1570BB5D3FF257256473297D9DE7FA8901F69B8603C9BBC267E3629A33A6A79697CE70B9\ 37E6B15BC6DEE6C0298CEB375B40DB4E0FCEAF71D5302680DE2875F14750E45771D5538A\ CA54A19EE9E438CB:\ B0C2C84FA758C6144BC07E436E7C4A7FD9279C35256524329930F5934B6D7CF4BCE3C7ED\ 4D6603794393D85C28E4DB61D4FCD17A90EE2AA4E6C29E99FD6C4BE9E245329D4F33127F\ 05C903EE1360DC713132281D67D23BA2B738A0F8C66A071DD9C31A19E13489EB8681CA99\ 84B3020F497CC66E5CBB3979F09B0A7C5A043150D846EFE148E7871A45FA8DAC26416BE6\ 936E5D3289A5B7AB77762726F7E4EA82D00D3123183BAF7CC146C761A7FC483055C0D687\ 944BCF9072377A7F797EF2163FE07B7656A56083E351EF3F2026B19FF76C3162CAB2CC86\ 293C537407F0F569:\ C7B7849FE8962C5670F745C8E26B979CCA21F1628305A75E9372A684EB8FAB87:\ CE0C1E9870A5D615C9F6D8826D7B61A5 43328C5C5E30B0396CBCFC0E6BE81C49B9164FBCB9A9081CC22E223CA5CC5FD28922013E\ 4A9A95DEB0025DD15087D516FF4771182A67E2E69E55C19809A8B9BF4F77E02748DB3CD1\ CC0718E37C0A9555E703C579F5761EE6DDC484BF619243A95BA97E8B0A5CE152F3C1D72F\ D69519E9479F4B1C46C23194DD06050224A7C2F467BE08C7EFCB0AF1DF523E294FD7382F\ 4B60690CF7EE8B8AEC379363FF636111AD4CFEA81EF2953BF76C2C8E76DE5B29334FCD09\ F01FD4902C1021C93BA381CEEE9ADC7CA08D18B00FB5E652839848999FABD577870DAD51\ 0E8115B01AFABDD683FB3CA1:\ 1775067911F026BEE6DAC1CB54B8FCD1AFEAAA98D610FE00C63524F9AB0EFFE7CB7861E1\ C7B1243990514BFD92C1402305958731E5E730D2AC179916220291A604B479471A249874\ D1B067558F0D61F29790DC82765A0C4B00DBC0AE2A3B1E608E9D1F429E64CEB08D2AC7E6\ 1DC0A3B8174D8F79CA27260991CBD7D739128012B6DF93DAD582B96603E61398BA8BEEDE\ F70AF98CE871CB49F2557C239CD61BADE4F38E0CBE1EBDC4580B56CB1830B5A14179C55B\ A1C3EBD60F60388B164CA51F1369900E9C3FFFDB39D0E9A594A329723CE60A21E7C87F8D\ 756EE5C92CBD45D7E5A57395:\ BCCCB7F12DE82B841EF1C0171472BE0188C2468C8D660F268F2332530A2930DA:\ 570030C34B809C5D361636F477FA84CA 033362424F88682DB69F71DFFB5C08A010BA4394CE1305A467B4BC7E6DFF93DFBBBD7FAB\ DBE62567612AC8AC5581A7A506D13CB8FED0C856A89D84B4D14D98005C74616704E46CFF\ 43A878B66D1D6B3636949C19404EC55B61A1F5DBBC829AA720FB4A5D3FDB8919885E6CCC\ 35943AC13E655E4149A587C4A60DC54BEE8C64A0DF49656CD4F67FD5ABFE1A8090E48212\ 646D730B50E8255774A3A1756F63DDFBB33DC0D2EF5786B6BB6E303006A2FA3217143CD9\ 237D15F24FF27DF41A9099E53432EBCFBEAA0ECD5FD419D736857E57F8917DAB5C20274B\ F0F61075BE07EC5383BDF320C8F04FE4:\ 11C73FFB2F85FE26E087184A4E7D0E74CA4769A072EC036EAAA0162984CBF53979926FC7\ 09BB59158685C6F131BB3E79886D13F0A644A420D14DE9DD497FBBF5C8CAF27E6C2CFD83\ CFE6A5219EEB8B29DB9D2722FD7E1004BD1152F6698C4DADEC589BBBFA3EF96BCF4E90CB\ 1395EABA2F1D90D5B2F81F312F2AF94583B4F3A8DEF1EAB26FC8EC9C4C2663F4CBF856B1\ BA593A3E3F54B3D3831E24B44C7A5217695F3FD36D834DF32488DF461A118A93264B2E66\ 57DDC66D246720E94EACD77ECF23642A036229143868ABD20F3B1FAE1B852C9669CCB0B3\ 334FBA0D8FEAFDD56D03E52F5D136E87:\ 2CFCC0880B1BCB48651602B2F653034A6B8406B143AED550F85F122DA3BC6E28:\ 68A553188B539B46214ADE17802A5ADB 9481ACE7C47FEC3A22B41B81E1A72363D4F4EED3CB0C93200769415B4779755982EA26E0\ F6363C973A7C59A43FD6CC4B2D1857EB38B5AE5BEA22DA4781AC36F5559A2A2A8EC111AC\ 33275AEB3863B2A7CAEF572A16523A1231FACDF0FEBAF9305B658A4E7B0CCB9A424D5838\ 4B385132389D5545ED6D2BDC3D615D229ACFBCE60205CE1119322C642F4D81ADAEA50995\ E4DEEB23D9976A1FF4A9C8CE7F0CC7DE657690F9651E53DE4E58561E9570CC4526FE03DD\ 686BA1AF9557718D38641B080592C9BFB2FEAEE56AFACB4F811439FE29AD6BA8D6F0ACC3\ FE3836369CE06AEAC64898DB676EA7640D7A7BE6:\ 8217EAB21AA0D8A541AB0CE258E96EDD82866A5460455B82C339F5157C2B159FD8CA8AF0\ 413BDB5995EBEE6AB6E1F8FBB03C67B086DD2E6AE05E0B37ECB43EC2C77E9510F24BA1D6\ E5D4906A10BEDEC2D3ABC09019274E8D09CD3921B3DF7F9EA607011655C684C3FD435747\ 6F97C1FE8314A80AE372EC4C4B19B5D34469E66A94DDF0E0C5546A290FE42A3D00F071B5\ 846DDF4D88E320E4AFF2CE3D650DDCE965C16C3943F1EA5A63D9696F8DCA6D7D65C3FAA6\ 157549B214FC3B44E6C62D124EA327E97A91126256CC475A5C533CAF2EB3F6B08769436E\ CCD52D2AB31A87E1E09D00D2F835BF9A7356EF71:\ 30A6450164DA25B43CA6DB430F827299AB79CA4A52C636C690F7BBDF82BA9B0E:\ 4A87D1FFB56ADFC374C09B2F8D021CE8 3F5E7DEA03EC52DD0CDB0030F676EDF2EC5B91C788D1AC9F8E88391FED510CC64123E47A\ C2B685E5387365DC98DA305A832BE09C50F2E3E5B97E02C92F92EFCE59DD0A18E1227661\ 719B54397B0367359A1EE476E8106D2CAF3988E95BCA0947E2411574E3E61D79BC8C6FF5\ F7D806BDA98E0C69E4F44F70E9B2F1178DA75DB504D3F8096AE002E2C7C36E95EA3D37CA\ 3807E760424D022697FD763B1B85E4D4D15D95153BFA3F74BADF46EC1906B1904D250E98\ 4D7CB5314EADD248A801373FBE2D9EF1B9D82AB3FB0C2CA0F3F9EC0F83268EB2464E40E0\ C40EEEFC1B9C4859A357CC62C5537783D7437E6509689C6A:\ E4E2000ACFA0762A90E16CE545060CB60961F69586A8845D37709DA643894EB7BB29B2A0\ 69E0533EABEA770AAEF101CEC381983F59278E7EF2A55B190F7B758DD97050315B3EF563\ CF92CF9D2CF955F266C77AC4AC8BD7BBE39CD4F5EE6E57854C8F2DDC6462889E1F02DF8A\ 7C1AC02B65423A17299973745C7C4F17E4579F514F199932D98062E3F0E141A8133CD974\ A4B1C8A066C4800CDDE54424F4BE19C4E0099A9AAF11692C27E182AA55DEF8A439A746E9\ DDB83F674F76F297BBE8C1DD7F4A4582260DB38C14E6FC40FB1DD429FAD55769A89BCCF0\ 0677FBE04B07C5BF6380AC4DCF47FFE08AB15370ACF4082A:\ 9361EA127351940052051851106E32E21B5B74CAC5EE2C65A478DC07962653D1:\ F6159606256712C7DCBB2F3E8ECEE258 378FB5CB6B0FAD01796C73A850C8EF78AF71CB2AAC0CF7FE9EDB58D64EFA6D138FB8FF48\ 4500C5E15F8013ED56BADC846334DB7AA6DD1B0C55BCD1A32B93A86B54B74D06F3224369\ D5E2ABF310A13D76CD3C0E037E161047CCDB49C1F117097AB42E0CEEFB4B09EA86305C72\ D1627D53C5D8DB79070F20BADF51DAC0F6D019C7520DF841978F0249E24F995D4C0823A5\ CA663B67B25EEBB8A38A95D27F44E425DE53CF55E5E3811CADDB9C0AD3C415587DB968FB\ 1F2D93D3B02D5628BE64E09AAA0A79E9EB6B72D0088554E77574315F1152F489ECCC4B8B\ 9705B10C96CDF2368DD61D8A345570B4751DB4533643C8F10CA2E5E9:\ 6EC13D2297C89EBE84380FD858E68FEC5E09BA9F4974C03B0C1A098C42644170358B7926\ 01D88B40CDF56ABD6A2D8B7CA430AF87EC349C2B11D44731A0C219F0DF310832ECA798BE\ E87C293C8834CD74724E96A6D7A1DFCEFA893DA180CC2CA8465274D176BB0D25B1FCD04A\ 3142EDE3B74A6D3E1ED86F3289DED1E37D32B9925C8BB51913B2850E5DA43159D4F70F64\ 06F5BCF600B1AFB2244BFEED3B40303C58892BA8A59151F8E2649964E767D918771E2681\ 26CE88156C4FA319F65CB1E2909F5A196399B45EF0B040C3DCA7E79232E4782041C7E6B6\ 5C9C82D8B4517B469493A46831B9E9094AEC31639E353F40D3AF1488:\ 2377222F39987D62CE8CB5F64E88437543E20EBB58F2DCB159E0AECAF439217D:\ 2DAD0FE823C71638F1910AB8D8924C87 41E99B44C7C94FD5B8978507A99DFCF6EC7A49304EC6099AD1C38DBF8BE918860AB5C37B\ D13253B763406AA6DA1CE6779CED6F7F7B222CD51967BD3B61FA48F6B65B96891E34FB58\ 3E0935454ADCB3CF6419216B798A7C0CE5402A3232510940839D4DCA082247505CD68D73\ B1AE4E352B9A95F6CD68CACF68F28A525CC3DAA1504DE85B51CFDC3B693DFAD28D4ED86B\ 70B93B02FAAA0BFE452544C81ADEEF99A59378CE0625234EA69E9F69ED52D5FBB6687F9E\ E248479E1B29ACF0CC3BE7BA5B77537C29CAB662B2DD7D8937B9DEE577E7C8DE85D3CEF3\ 0912FF62687756C6F978FBB147E6B27E923C62F9A38BD7F50D8801E676FA07DA:\ BC7838EBF0287786D89BAAEBA8ECA378E898BB36A6D3D6CC125938D71768BA704E30F9FB\ 7B09A43D85786790FCEEBB46A2A341C4EA50AEEFF3DC57005DFD7BE9C4052AB3CAB38B11\ 221EA39EA778AC6F4111CD1978E5D467301BC7ADDC54D084F36652A9AD3EDB8D70AE6380\ 3B077A39CF064017DC2A8CED0E4B1A7D6FAB58B0FC92684778B7B3F5D76477CAB7C6C1C6\ AE6BCA1F661CF26DFEFCD1DB5DF58F1358D38406E3D880F30E43E1837132B5DEE65EC09B\ 7622CDA1F52A78F8EDF870D2AF375C7526C70E43FF650B8EDCF6A35D02CA479DD560A672\ 45C7087D0376C9915777FCCB390109115AAE52C4512ADAC046C8C1E9092F3018:\ 19F394E4AF235F4BDD3F0798E904A2E114041B351F0D71C5BB269845BB53D4B9:\ 093E57768A6107B8D6F31A083B23B3FE 20143BDD828F687A93266C2E489909BFD6D85884A40018082FDE227841647D162DAFC241\ 40580495B6E0C393CFE2BBE80615C87CBF5E057D74A4CD7589DE69E136870A24AE67F9F0\ FC7B92369903718B9268500155ABBD6C8D0E81FB1104403A02A56FC82F1DE4137EBA1433\ AAD9CE7B34198ABE7D9845DC462DBB4FC6DA4F937EBEAC139339B405ABA51BFC9B06B38C\ BF17352F47C6EF3968F06305123888130738B887911567A28DEFBCE943D18C73ACBE920C\ 386143E0B6B2C9EA30C84A7E4196481F93395C8BECE5F9B341725DA7883DD74792AD0140\ 7A05BE7A2121AFB2E9EAEBBA7574F9582D0455571A077603A511ABBEF9EABEF4553A48EF:\ FC293D577FE018127C31A901490F19DD72D0A3212C828EA530B256E563874E03C7003668\ 84568B2F58B0478B8953F5A667E070BDC386404C47A45A862626D7F621C5E87C3F48A15B\ 8F7DFA5EC168ACBEE32E08551DC7AB5826F42A75CE8A0A61BB9E1F4AD5BE53AC87687961\ 388BB809ECEFDDD93782A956F9976242B20B1C2B5EAE31D28B48A44337AC677C6B865D89\ 954E1159353FCFA1741C287FEE15473CB4004E400FAF336995004964A79E2EB0FDF48C2E\ A09120126443E8771F9700718BC94E5070DA8DAC17BB3F73555F3942AAC1C2830371D641\ 7EE51EBCB1ACB8B4C74BAAE38E6CED7F7622388FBE2B2153DB6945B77AADCF7DC99502D6:\ BA516D7A4B7638995562CE54FEFC84B6DFB4B8A81A03F24BB065B060E4FA2966:\ 23C93FBB6EF742A576769819A5BC6AC3 [TEA/ECB/NoPadding] 2FA6A6449FB4F998EFA3F1679A638602:\ 4D3953E121FFDB4FD7F05FC74FC2ADFC:\ F9506AECFD6B86C4E9D5D973B435E66B B4C8B417381DFC14CD6CFEDC0D83477F27B0B1BD842922D4:\ 7608D8A9F2BFFC14DCA6942B2867239BE3B4788D8748F314:\ 47BF1198D16C123C95496D0CCC9A5C8C 18DE3130F51CD7A6172B3C79F6DF435B41F57D3B2D54DF7A436ECCE32ADB88EC:\ 58AA062B7B9EFAEA2E3ED1F9D19FA6F695B0642EA7FB6EB5C5ED914A4034134D:\ 3D8D2CFB7424BBD7B39BD9BB2C0CD794 64E00DCC29A3BE3695F2198E58EA42E323E99387CE99A0543F7594331E546EADD7163E62\ 5ED6B32E:\ EA6EF6ECA267C02C2C98D03AED4402A85B8CC02326D1FFCF169D321F675C23BF530FD4E8\ AF7A511C:\ C1C1384840D2B15BF8751CBDFB2607CB CF70A73AD2C4714044C8953EA103DDD2848595C182BC6A703B2E6CB90E80357120AC671F\ 10C8060EB2A14451BD69C9F4:\ FACC24C79AD55C3E2FDB55AD21F52595452E116FC526ED3F21C4386D0400F098F86D86C4\ E630E638A24EFF839EB8AECE:\ 25EF77ACC4435B378B0A07AF35D7A283 5AAADAFF6BF18700ECF66DCDB2AA201A1B5C338422E654A9E769C0EC40982E2FD9A794E2\ 9951C6EF26AA3FBF41B29E7457B6A2BA4E39F75F:\ 260629AC2B3838BADABD4765B0BB6A65D34927FC51BD712A36C8AD74AF386422FC479EB5\ 1C5FA2072B4D4A3F259A761C4CDAC375E0FB7883:\ B3763F385F9F53A76F59E9E9B8070886 10D5908E8AB77BBC4B6A2D89A13C899C9044E2823FCBA56FBE7312A7F475E16AB3B26E74\ FA74390B5025C2399AC84EEA37326A6F8EF8D133A3E27EC6A01F97B1:\ 1421E0144AA1061EAA75F81B44E12A8DE1ADDCF46D4E29D636F17565AC1326B8B5E1F2EF\ 097E3BC22CA2FBB5B637E17BF164DAE5B8A0D503085EFDE1E36B82CE:\ 84A6AC5EDB9A96C8BA3BFF40AAD9ADFA C65601054E837A0BBC4D0A50CAC6CDCFD7EC9879316EEE2979F6FF139D881DBF7338DDAF\ 02F3700BBCD7ED67D605030187A588775A3604FFB20A989D6893FED3814179B336111DC4:\ 7F65DA6551B8C2A677054CBFA5BAC5B8CDFFE2593F3297B3C6014D8EE83B00DB0BF063C1\ 68A4C155705A7984BD961A0278BE247FAF01E3BDC6DF3EBA4D39A0566F59DBB3F1D682CA:\ 0B666EE6C0C5FDAAB1D3C528825B8262 73ABA32AA3A6D791EDF7C1FEDBDE65950ACA8E7CDA9AA303DAA259965726F7E54EE8E07B\ 6EC41EE05DF08A8030AC76CD419CAC55249E5454427C9EC1607721A0A8DFF4200175B5EA\ B66D6A33CB1ACC08:\ 39D91242429514DB8B2715FF7CB1D12AE97AA9B31286E672DCD6D5FBF9FDF52739F50684\ F629F7F8F47F4840E399725DB5383C4427FD920D0091B8466ADCE80AA86E945AB09F9999\ DE7518991229A9DC:\ 6CFBA581ADFD1DEFA555D4B1F2924E67 A9956670B38BD99613696110B2717482945A798817EFCB34254271251C1D7912F966F78F\ DD0D534BAABD440A80F75FF20C5D62C21327803FD957699302328B03F12F17A9D89CCE84\ 3227D99E3F223C2E1EB8541FA4DFFDC1:\ 27F0468A37ADD1F81E6C453DB2E89A741C4949D4994ED22D4473B40FE63642B0303933F7\ 4523055F9B2614DEB0A5E4BE8067C9EAE91C573C6508610FFC6CDE32DB8C3BBA9803F9FC\ F1A1A3C8CDAD99F945FB9912BF38BF24:\ 35927642F001AF7BBA592C573D566B04 2AE6CFDEFCAB3176BB1D7C9125F75011127F87F068846B5BB17C04457AA795CAF2459C7C\ 351CCF870CDE051432CF0019A5C411A45979A3E318523366138501A8C167A05B959B4DC7\ C8735B9B15691262F2828A22093EE2BC15BAA5CC06426663:\ 46594307F5E0E998848072D2690D97E32058FB1D4577521FE5AF518C325762D9F076B15E\ 77E04DCEA1C8A2C34A287EFC5F9A301B5FB4C75699A3DFDF7DB8B7EBD61D5BB2C1F880EF\ CCDDA930A8478C7DD946A7BF9EA906F6C6C930DF1BCDC51F:\ C4A3785214040158D8D9037A9D5FD25C BC139112FA244D06DF5FFFAA2E44F58F29AE8B092395B9A67ABB435610674E4FF71027FC\ E2C3EB95F7CAF7E05DE6C095551AE224A97807297F64C87247A34BECC6ABDC900259EFD4\ 048D384AF5481DE995C8ADE6FA7F982A702A44422EC022699B783E7EA57B7A2F:\ 57D854129FB358772683BB1BA42AF91F7E945F1BFF27AC4EBE6B531A581914E8BB57834F\ D16A9E287544CD2840475155E49B9F6859D9E3D235D56CF5E7ECFD47D43FCF50A378287F\ 9F9A33AF0E53983456D75A58FF5111E69D768F25DAF721AA9C69FBE01F2430A1:\ 4A9F7BC01C835442B5F4EAECC8FF50B5 51AB05548D117A49B3C47D2BDFD681A9FA39A1D270437AF03D5557BD5945C66D44842890\ 2152A2DEC23141E4366B55DA9A5FFF68C6C67CC2A7446EB28125986E945D6B7AE587EBAD\ 8EA14B066241B54A6485A9878837571346E7C416376908B74AEB4C5D022080BB79D0DA25\ B837D53F:\ BCF3B29D04DE30C8EB5345C444E3FEDC5D34EEAE60EA71BC355F21F69E31F759DED7AA43\ 6EC595505E1631A52F5416A41A529F39F6958499E99EA5DAAD023593A78DFE9C443C5AFF\ B6E4D9EEC22BBD66545A67FB8F39799149A1601DA998694D7BD65AFF19AD1326F4B988F3\ 7E555D78:\ A076529A62A7C604739522583E1EC20C EE99893A9B1087AC531F3C5C67902E6EE086A11F6D28B3A41A0A692A15EAD2E0A43A3432\ AE88E9EB54944F4138BA95A4E52240B3CC34E1EA6B764AE2703696493F45467041578798\ 1CBB062910A3DA1D39ECFEE971EFD945B44A5FF4C4140B5893A89F6F454F9568D83AD429\ 272832258D3D0B82B7ECD00C:\ 641C64CD007BED6BA89AA7ABB2BA478717C84844D06D0F83251B8DCFB0AA02FE8991F06C\ DF5328B4195B272807B242A0CD51D9C9CAFDBCA8773ED2048FA25360601197C1A8AAC3BC\ AA05B087FF38F53072755C1AECB169CA4EDDECAE1B580433DA6CB30F4A7E33D02C6E3624\ 982853DC5A77BCE8E3E9217B:\ 7D9FC06731D5D44E7D137AFE5F7CB7AB E687266A896382127FCDF60A3F271BD3BD21C0306B8206FE9D9F2B00F4201418A4DACFA6\ 53DFD029639AAE03A6675D3E2B4ABA7E46CFBE14FED665E0F520F110BDCC4E5647BC3D82\ 723FFE0F588062E56DE991922E9F23FFBF2E1BE91625A190210654E0B2476664568B44EB\ 58117317C6B61645C6907ACCCCC4BE949C9D3ED2:\ 0058B2D35FDED2CBC91D454AA55F93B0A249152B3A5C9DFBE907E639CECF1B90580907A2\ 9920901AA5278EABF189DB980372C2A804B2B301F8262840D45A668564C634191E027F69\ 1630602423B9069279FFC20B181CEEB2CA6C15B5A66B9FDBBAE3B591FDEC91D41413AF30\ 36EF4A99E9E1B728E901405E5EACBAB539BD4796:\ 3652786521A31CD6A927E608CB2A87CB 6A5A797BFCDB31CA65F7A0D720B679B5C7CBAD92508E93C565E3AC94DA5B84C041D2A0A9\ 7CE0D138C2D48E8F613C36F4C9A9ADA0A32EBD5E346A0A76078D2B49E559BDE592977285\ 77714F3EF016A607D3426297B4681CE7FFE958B5750F8DB6F88916C5DD61CA30DC2CD2A2\ 4742EA7AF3886C792E1D94ACD6DAD21649A8BFA6F907121166E51D97:\ 1DAFC103EF64B21BEA443931DD0111CB06D5BF42D1824C4E3F3A7D6718F2911756D94611\ 7A12CA4974F9BDE4A99012615D6D1B78B94349216FC73CFDF7BF91126F017A9206F78310\ 6E636AA89EA986A4F4942A8820FFF0D0B151E7A74397EA186AD85899DA5AF661566A3BCB\ 3C7305DCD5113F12E3532B803E0ABA376B232EC1328F3D0F1F884835:\ FE97F4A2874358EEDDE14C5A1DBA9731 A420F0855799B02E78C5A8087857A62E10F6448E3B02257AA678A7895EB9CBDED44D0ECA\ ADD6ECB78F06CD65ECB8ED2183F62691FB42383E4062A5EA5078F146964F1DE275CC4493\ 04D319A4EF99A07C09B35F4C59E6AE9F8799C074C42BAE060E463A25078A61CBBD1818CE\ C67CCB08BB4CEC9A4D3B146007C990AF9E723F858F7D63B81D4536243694AAC2F4C02CCA:\ 6AA3148AA2E4676C3ABBEA8B883560168F04843310B7871174C21F906E4049752617F465\ DAA843BDAC395FED435C32CD2B497D2A58993282E1FC36113060AE36620AD606E0A32FD9\ E143578188FD408D98C36F2A4134B10431BC20779195F5BD01F915987C40622D6D813CC4\ 8684D043AC74994B61F2CFEC89DA1A8A8C44FA82355508605324B20346B62CBF42649803:\ 5F5B428DB8D1FF5165F7C6691BF21794 50A9163557E25C824A3DB605486E137772BFB26F3D60AF6431065B11DFFB65B5F46B4978\ 6612857935365BE801D978A860463351EB37A62BB66EE43E0B348BF509C3AB450334DDEB\ 1FB04F829311998D026F7A66FC6E06795F7268D0E4B71BCF674E42E9851AD830243EF28B\ 854A2CAA00541A5AF0A3E05EA7A4B445264204516A7B824CC8FEAABA992040939E2D13CB\ 832A821267928B88:\ E905FBFB19EA75D647CAE71A3E4AD1FD1150101614109A06C4BEE3E8CE5E677FFFDE252D\ BD7AD0B65E9A47683D10B32E5EA1DEC50746E8ABE6B562054F1F60AEDF267308583DD209\ 157ED0013F91C76A58740CC94D46584ABF2145D441C7721E5C41A7B33CBE13A09D05A569\ C7C0E313232282FA72B2DDF8107930C6A697D9C87EE66DA240658EC5254A4F8E4A99425B\ A77E6D36557FD32A:\ 93BFF08E9CC32466F4436111031037A9 BD4BCFC5B25FAAE48AA8F4DB7FE80F14ED076F13DED25A3EF4784882F38838EEBB4757B9\ BFB1344D422DC20D93EF2947B5D741BF945BC679BFAD074EEA9DFF9CCA6E49B6C40EEAFA\ 40733AFD8A21E26E19E9EBF66074C1102AD6234D129B589AC7AF71096C128FD94566E1C1\ 29D07E220FBE9D4DDA25BC71112D62AE335702CAFB7B46DFAAD51F6D7B4462A86400D030\ CE96B577F0F8C43DB342E4C700C21F89:\ 1C2FB8256D92E620276C95006DF21ECD2C0DC26BF5752369C57745A27538200A5FBA2A08\ B3DC4C6B7037035E96A7E4F97DF66B5FFF4D0AABB520A15D83FBA17CAA84641142044A75\ F675637143F2ABDEA9631533877D3E77CA68B615A4EB9DFC4B0C27BB777604EC60950D45\ 31D4C6DA5412661D2CFF573DB93D4D428EC974904BDC6CE92B0F137188891DCAE497084F\ D3DD3A9BF0991E7D954C473DD7075978:\ 07EB031C2A50E81BFD6150BB8E279F6A C12B1B0A8CCFE8BB72CA3C353F855F7F226DF0F1FFA791785506E972E19D153A92DEF0D0\ 82CAC0B4318E5C0C597638EC01204BCA002AE8BE1624AA4DDBC50759B8813F6533184181\ 395AE665962CD6BA22D82C1B4CD82CC4D2DFC07884C784398D596095B4ADF4A4CB5561E5\ 2C5DD85A2EC4642EF902A91FFD4FA73094D9A10D410743B82B24FE1149A5BFDAC8469D4C\ 74282581DB20BF4DB73321184B29E08D0A3BEB0A56D12AB6:\ 06F1F55E98C7B67858AAB0EAB9ED413B2E8D7BCFDD95FBDE16151A76E3E314022918B276\ 403782EEC2810FB10B8E6742287685675C67935217023EBE32994E1B1C7FFAF3C8E18EEC\ CCBFA47DAE25377A1D38CFCF9FAF92AC99EFCA34FC70F04B03D1A2E8685B2CB2F513EA6A\ 49130BD8F220267DA4FB22E2FA02AC9B4F2FF554395BA7E0F85C378474E185DE7B04E01C\ 8929560B399D768267B352CA4BDA75FEA3B022B2790146E7:\ 0347E502FE1FB58BCE93EBB16AF1671B 7BCCB586FE4F343EB7DE9210AAF5A5F81E62CBA5ACCCD897ED221CDA61E2D4F177A25002\ F5E12AE2AFA0B19113485EE793F3C85FF14D7BC94B23AF502ED0118E78192CB4FD680676\ 194A99157E9349353E907ED93A869A1A9BE721ECC94619E26F120A87C1E227589901C161\ 7328D76F6B1555693ABD6F847ADFAB14CC936D3DA4F8F47BC5B77E323F23BD4DD2488222\ 45213A03CE770FB50D40E174606D3318BE3F76FB07473ED7034314E16567098D:\ B42FBD0AEC444319719ED521AF7CC522A2F1DD69ACB6C6FC08EF1AD52415DDAA4E94FDE1\ A21BDF954DBD56681E2E3D89C6725E716414043C42B0CC842B6A326CD70770881E047D59\ B611B6595FAE0385111BA18CB19359AA7FD318B528D48348EB51655AE17B6DF79DF383FF\ 2F3AD856BA42598DC2D94921B4A93E87BD12490DE43C454B30F4093B30878B5BDA7D6711\ F68DCFBA6AD0AC92804E15B6DC141A0D06CB962244700554B0BA4D399BB9D935:\ 5922D69B966C705B91F8DDB19DFD15C5 7D578CFBB35A1026C7AE1B82405B5F93366BF2280C6E6FB42EC515374AA2294534B1ECB6\ 7CBC925E375D4F6B2E1451CA1BA569D494FD5C0FCE09F9637C83276AE3E1249815445D60\ E47CA8DD9EC7B846449C73F1648640299EFA82C2E696A0F9CA9738DFA459F8AE04E3431B\ B702D4F6D41526DF1543016A8E0FB1DE5E5258FAC9DF77CFC07CB297BA2A2921EFDBB0BE\ 4F355197409CEB98BBB08BD24F48748142321E66C9791E93E8156D3FEDF7B3CABC0C4014\ 8A866D28:\ 50E48B13EDB839D430DB28787D20DDD4C070730ACF59E9B235F101557E88905B2B8766F1\ 9421718D82EBFB7FD8075D1239DB19BE2151782075A761A7A1B78B1613D95340083BFE44\ 9B502D5744512CAF2C33ACDE1F1B18CB53B152AFF2078319399858A3356DD710A1D181A6\ EAD0EB9C1ECA868CBCE049503E372BF3B9364B275A6D68D92F2DA3396FC045A816C2E9FF\ E3797538483CBC25A97DD93E7CC997CF7469E66FEF432B9F3C5F2ADFC55235710EADD2E8\ FCA5AFF8:\ E5C7B48ADB3AB291EFE88CEBFDC612D9 FF2E2C4B8BF3223B6513D612666415DA018A608BEFBCE8141F40EABE933BE55782E1355B\ 5D87FD7A31374EDA7BEECD24CB798A458ACC60ED063322CBCDD796546C0D09AFC04042A3\ 48E30D83309DA1EDFC0D631F1D1264D02812AB2F1ACA5E71076FA681BEEBC71C0104CD63\ 807C1B1C5FA543A2F30D903FCA91B6E946923FD57E1F1396B33E4C44F057693AA8413917\ 002C185FE0E54C2E0FB478B324E7237C6F4A5B439C2B52E1AA4A190263F5B6941244919F\ AA826358C3F5055A1F67AB4B:\ 44FC4977E72F10AD62AD3E3FC7D868FBB09C4B7CCAC299E9E299B3FD5DF116C837B5D985\ 7AF8F83E97699F021F673679296444F96EC481F2C71DEA77E571DDFC49D9E453235A9BC9\ 3DC7CF60B209F305A2420830777D4B3732ADAED70B55406C777EA7CBC71EE2E58F89FC1D\ 4A1AD84A80B8F57C958D887383EEC107D5EA2E8297D75D588B24C8E42C2AB11FB21322E9\ 97B11DCB9AD7C825638BCC25A04E7D9311F24638418095D28259C74E718123CE597D2204\ 1CCAAC3612D803335DB4E21B:\ A830EC3F2B6EB4C27215F68C373D51CB 796E00B9B9C314F46A6FC4D30E251CBC99C0A7EC1012D4C08B3C709F8C42A0A24B52AA86\ A8B4EE6C0B40B9AA749751222CE2E40E97467F8E49498D3EE24BCA8C3F6271AAD7AC9F69\ F56B6F911B8840AC28B10DD63EAB8249A85747F5B97CF2BD18CD163BAF26D57C8E5454F1\ 62BA6D9758151F53D3F45733C3464836491C28963962FEBC6985DD4BAD90418C5CC02758\ F59E001179888D5C56310EF3BD19660C98B40F39618C12DB9DF20A1144E4D88F5849F2A6\ 19903B91A4F88EA8CB0448B2D02ED413C71619EE:\ 35D5A3EBBD297958E923D81114240262166A0E6BFC0C42EFA099C488005ED84257FB7432\ 4568308109E76AC28EC059E7F8E612C2F8639C4510F996D311581D898E13DF6031385A62\ 0C5ECE9FD0745C7E7BB28323A16186065AE236482CFC37F227C99B6EA79FDB095D2E13A0\ 0CEDF8D91648CBBCFE9A72423485899CFBFDBC2CA6AB2CFEFBEFB38522EF1CF2D07AC68F\ 29819E17E202AB863F0878713F1CE248349E4139DC8107328D9907FC8F4987FC0392B120\ F06DB28B7767AABC735535BB9FE18178B5BB34CE:\ 201C9CFDE22F6BE8FC881A4BE6862199 85BD2383419FFC58425316A0B1D0EE6DB75CEF29BCB06C55D961F1880C930C4536BBD490\ 2DC33C528957409269CBF90C28468F4260225B30C1A11611F524B4FC28FCC6B1BA85064A\ CD5AB63686E8DA93A938081F14FF0D7BB4FCDB12B68F9A2821B397A6FEF87511FF67B8FB\ C20D4338A00B7AFBBBFC73CB832346030920A463617A8E046E5B9BDEE2950DB7BA80BBDF\ 04230094F8357062AC03E277AA68D14AEEF8DC810F7BE6C51FB8866CC9FD24BEDE265184\ EF7EE936EA79B68C9ACD37EFB131F2647FC501826A4F4CC5D16D4666:\ AD7D51359CF9E854759CB435669B098EA48DD89DCDF882E2781170086EB679D6C45AC3A0\ 4583FE8BEA6A315CB59541E3753F800BFB186E9177A8E299A9F55E1D034BF8CC876C2F46\ 3D1273E320FB6B35FBE5E6DE0C3C205B6FC0EFB2A0FDED8C606E0422B0C8D72222318BF9\ B1A3D7A0B527253BEC8C9F66115655CE3175828B6659352BBC461ADFA2133808D872BC1C\ DC597A2EEDC72A1D2E2644275C60144F6C7EC00C43B6BFE2E4433A6F42A4CD2073528174\ C466AA9EE0AB24429726029FF1834254B7A839A0D8D4643C131C1BB7:\ 271A2BFE528BCBE7A13214409BAA2E12 89DCAACBE537D9028953B0BDD28FCFD1E745D6D457F48F9247F51A8F6E9719D85F106E8F\ 794C6CA57247966AD2F878421C35528E95CB5813413B6E8AAD530AB09168A012D0027068\ D63ECF4D7D4783BCE8014D34852F5A52C66461E15C965B8750087C43176E70E24FD0D4FA\ 83D4B9166C6311E328E08BEDAB29DBF554AE268476E507D7791AB3475DFE90CA3F3A3B64\ 07BF67E4BFAA67292E3ABAF6967C5450E17C2CD3C096C501B0180BA891EA951E99FA418A\ CB72BE2FCB74FF143BABE55264F6B1BCCA83B81856544B843FF59D9668BDCD7EFC2F1F0A:\ 91B44C174E57C20AFD631C5B21B329A8B438C3249B5E0A4587BB01EB3C3770BDF67C16B2\ 4DE0DE2D61A1ECF3E00094BF562A21B6E2B9DD904CED2FBBA18A18A4228B958EDB1C3FF5\ 5BDE7D544DDDE97C67C1EA5E1FA4F0B0FBD2775B93AA02F4E6E19A43ACC14D022CDA7DED\ E8B2915D8D4D0EDAB2718E56B25A6AA3C79B63E5DC03D57F948CE7D78A15FE3C0C781B83\ B5B116816D55D660F0B6ADDE327231069DE6015C622E456AD01DC1EBF527D05627AD3BF5\ A09EBCAF9392BAD189B511F6E429C1052E05FDAA558CB8D720F5B08AF5C2B7E1D811DB11:\ 8588AF13229A77FB1006467AF02D6AF7 A3647B24A430D05146C564F62665B74242A393B47ADBF341DD56BB1855C0DEB052A6AD5F\ 4661A45F5107EF138BF5FBCF03F2DF6CA6FBDCE61D91CC9327D476B7D96061A4EFE06D77\ A608A78A716541A4C1B4A9D99B473295D293F37F6F3E982CC8687B67ECD9C8B999FFE97F\ 1F28F23531F600D2D91865BD7144186A53B823887FBC4E5B25A6F233386393E40D9FABF5\ B4119E83CB614CD4D302D999AE00E85F78F22687BDC1420784374B87CC7EB772BC468B01\ AD895259E94FE55159FB5F6EC7FB5B7B1CACCD09884327F174A60C38DB31D6A8B8925D75\ 309D2D2850FE4E8F:\ 5ED0A794F77048023665D3B9FCF108C2794D98C4472136EC491F2EEFE3A2ACB89DC6A006\ 7DCF449AF304E0A43ACD79EF1C8118DCE1A73DEAB3CA002390E2DE166F24883619491723\ AAE01FDCC31FCAB8996779604A36F22B1C8E418054BA9164D74CA8ABFD0C39E31A0FE97B\ C4796802957CBCDA7ABC8AAF298C007F401B56EA023D26720B5DC3C9843CA604AA6F820C\ EFFF2A38681A2B18DD37450CB853F5A5612C3F7083C78DE65CDBAAB5983337672AC050AC\ CC013E6DF3EE7AAE6EBD91D328FEC89407668B5BBB40A94135E071A9E20D0420D24A9E71\ 9D0FC72A3136217B:\ BFFD749F285E2BF09E6E1CF31F485D27 5A52582DAA9B17977B476F718A030152C8F4A9C8BFAC2CE9A3A78935B4B9D7DCBCE4237A\ C8B51464E33568F6ED94CF29A2BD367D38D059116C57EC69BEEDD67858E9C06420C082C0\ D4C18FAE8B617EFE427DE7BC07BA2BE9BC9FDD9CD15232FD9A9B8B3B9B9BDD2F801B69AC\ 5EFDA6FB9E2204FEEBC4FBEE4432407894C17DB0B8E0BBEAB451B15A3AEAD171B937E845\ 1664C3A80E9E28F8F4CFCD2F28C1B116CA3CC2775632BBB14832C36FC70073E6FF462B82\ 6F3EB092504BE6A14E78AA2E32148B2E63BB8EE4B2D7BED5E8E2E8F025852F03A65DA77D\ 3F9C6BB6B373C90F6B0D2CB5C2C1AC0A:\ 88FCDB413A956FDF038C69A5842363FC82F9D3BDF80D5574DC0C6867F7EE21EA4CF72DEC\ 9AD83D5F19F9A71B71A71EE76645A153047825B5FCE892CEFABE49F6B0D768951B2F03EC\ A4EC7200141895AA87EBF85CC33AF12EBF0189DAE5F6218F4E485873E994BCEC2E007AB9\ 77BD2C8C77792F2DAC0F29B8F8161B2CA99C4E81DC9DA37FEA73E707200697647AB6C73E\ 0DD1D837D329801A7B5F56CB137A1C23F5FA66213E720156C9AB67398300DE5F979BF4E1\ DB8C8DF0E927EAD3DD7F44302DC9B39AFDB4F287672114288E24BAB76CA10200DB56A428\ A671CB66EB2E4FE80630B94152B06158:\ C0DE2ED5FE62A1B2973360E18660DFB5 BC0990F88218EDE0DE9835353BCF340C5463CFA55FC4551DE21ABFE260A8173591D44A82\ DCC62CA063F395396040F4B09E4CE63BFBC1C1F725FBCEC1A129124B111A9D393D53AE65\ 330569846DA3FD18A682B192773A76649BFA999859B9EC844C6B4496981FA13F8F7F0575\ 30879998BDBF8D3ACF090D5CF543ABA1E9DBB72B6A48B85794BF212BF5956DFCA7714BC2\ 38E5BC3E785916DF9D27A0FB4A0A391314B072EECEACF50DC8693D5777C45E932F5C0314\ A882ED43AFF657935AFCA0B3FBCF97ADB513C754BD0EC82482DAAA8497D26A9E7F4320AA\ 382903AEEBC83B53CC297364446664424ED246037F063BDE:\ 41E85AED70C8464E353FC6E2D5975E0FAF5DB17A8573C7DDE4BBE0E29EB71CDEB210B794\ D0FDFBF7ED7254B1EABEBD8CE203225CC4C2EBFF3B5D5BC51E3010F9946289BA3BBDBE4B\ E7C3FEFE7E7A390B628E29798E732382B482D84D7863CB0A85F6F3CE1072CAB120960D05\ FAE3510D36C9718DB4CB4750565C8745A076A7BE89F52A16DDE9D32A42CD635340F9ED1A\ A39132E30DBDE32FB28354C1DBE9BBF817481903BD6EA8CA4805D03B42F2D5000B43475F\ CC4103717BA2BEC3E2F1542BF308EDA7E2C71956F32F50680415685E8106E701E3F5303D\ 79F03214097A4874CFC0664BE4815BAE2769BA2CE11FD663:\ C37E924EFECE82E275AA6115E2E2EEB7 C34B10E6DD28BEBD7DE1BCA43D8AAFC65917C51E848703C034284FAFDB04DB3FFC0F3059\ 9C923C6BDCF006B47786E1EC68B9D9BDE22D39294CA235E43CFD42DFDFD3D4C49FD778A4\ F61F17198851FE3923CA6DCBC8A6215E2CD8F24E110DCBA58A63058CF169A4CA4A8EA557\ 8030CCB2EB03C95871AEDDF6A090FADF44F8D43D7FD36987F31E0409A7615687C1D3FC0F\ 25796973E96A4DE0382D0965824E9A81677D414EE29EEAE3547BCE77BF9F6D3E6ED1526C\ F1F51130D7DF5B6B34E89EEC7D8866486E02D5E654C920BC42DA3DF7F08EAA0681F13504\ 62B29792166D951CE94E5125FACF103D591C0E819667E42082FDFB7763C8C559:\ C2CAE1A03A0B7D37D3FB79D98E425DAFDBAA0E2BBCDBD0366690C05D495014915ACEBD34\ D320614752D0D667BABFEB9E3D5EBF5C1501EAD8D3C9602E6D33843C18F2868E237DB697\ 6536FE28B02233BAF37E9EC308A4E163ABCD4BA5422F92F5AECC38818371FFFF5AF0FC66\ CE57DE4E0692B1BD82AAF95CDA6FF3C3C2F85CE16C54C151E32F146FC20AEDD4985E13F6\ 8C2E2224C49226545A32EC6C47974D2778184FBE289B14DCB78CE6DE17377557B92AC2DD\ 3C1102B74B2B04EC74BDAF85D2FC8F659F4F067F6C3679709A8F2BDC2429BB7F78F5173E\ B3026156F2EA8FC510D5AA4482E1F5639F5514EEA3B5E979A0E54324954D47C7:\ FCE0F56F8DAE31186336ADE3B46D6FF5 2112DE278B42F0E058EBE6BF868F544F740F0AB25C30459B6F198F74E8CB4E8B677F59E9\ 15CFAE5C208770C3AE03AE597D5B41C97AC6497F67837C20B5D2AC3F01FA5E831C8F240D\ 8115279D81E315060A77B5971506D7DCA40939A81E377015BD6BAE084861A9044271D2CC\ 66EAC30473931B26B5ADBB14471B32591D405B2D7C9F30A1B0280D21D5EF49A1D24F0E80\ 783D31E2A156CCA3F12C7EED45E471BA42635A04057D3BE56E31936E0BEF6E705FAE0E46\ DAB18F9AFF3582935BDE554F650B21DF6DA8BD4C5CD75A58BC9FE50C03FA3217CE60DB9F\ AC52A4BABAB8223A05549532ED8386F6D621E2CB97B829C0FE9886DC67CDDA9E3A0D19E8\ 70DC8E09:\ 67315AF4A1B112817E9922FB3FC8D251CE6BB7CC1CBFBFED1927A172D14B0C1D20A9E382\ 833306A08A3222FF0E11F19FDAD5FDF44911E46FFE688D0226B096BB227A0777B2C5F971\ 01A386D65CE4E71CA590BA8DF68DE85D50511FE1CC08F6F569B9D3F47D37A93BA28B301A\ 72D9AA736B464343DEC323207FFCE6AE59CF22916531B6EB6E92E5674C226E06FFF18F5E\ 9306835957E93EBAD84711E4B059A19F554E3CB0F08ED7AD6EA58730BE7BA5572BECC892\ 28FF83BC11F3036EBD8BFE370C7D74ED1FA03530E86DE89638CC7A1E79EB121F7DF32EF1\ 64AA1D0570FA6191FD88F7D09C1CFF5C55F3C62618017879DBBE422C6BD51BB320F7B5FC\ 00276019:\ A0C7A1DD857747698B49D1E6127F564E [Noekeon/CTR-BE] 21:D9:E6CB9AEBBEFE8C4EE3B4763AF201BAE3:\ 1B17F86B0A89CB174F5DC673C187803C 0FA1:8EE1:A4B6826186ADDAE5E4E5055D899F56E8:\ 4247E4911362FFBF59B407BB5AF5CD82 193D02:3E6DA0:DD4A440EA6DB12B9A7B59F8A56F9E0E8:\ 81ED06DC0A1318D286945F012C5D5CD7 96C298F7:A47A2E54:323B98A8D64754A9A33FFE88A3611896:\ 3CBE77BDCA7742A28E46BDF357674539 E807140F0D:1954A24EA1:4784F2F3CC6AF39DDF680A99C7771864:\ E26C455121A66ED165E6C99719572BDC 5B15EC624053:037D86CA7EA9:8E525E8F28A847EE0F0CD2983CBD2218:\ 1798DFABC785ACA2B0947B2200EFA751 45E0C038C4EABE:1ECF07B2734A04:42A9DF33ADEFCB8829DB8E04325B84AE:\ 0D0DE03906AE076872ECF96A1C8032E6 366BB3B18C1EE9BB:7EFB806DD92DBF81:F427B0752E20A18707FE6EE3A5E618BF:\ 509920DDFB13129FB166D7F15F4F7A08 CA3574A484B30C861C:73C3DF6535E7EA2513:3D1493AB0D6FA0480759227590200870:\ 33C02954E7B23D691DC9E55487B93544 7B7C1CF2E041771A7C66:D5382A6934345A7CEAF3:C3F327FD724506FDCEF4A1CFE91FC19D:\ 83BAFDDA70B7F521325D4666B097972F 6F7ECF3563E45900D78870:CD7B586F2A1F6F1C33A203:\ 9D193DDC4FF8FCF4059DD58B6619A4B6:\ 7FBCFAE85957F510D3BB234A8CE3EF48 5C354F161AB87D48978BED40:7ED102A25E2D50B7FA437F92:\ F7307D92DB9AF3F4F3D86E07066F8605:\ 4951661393781B8C65DC17E14D0B6117 279745A7F70E9C8F8279870A5D:FE2C6E2726177A56F151497E13:\ 8EA31DF7E30BD06FCA94C76015FC7971:\ 1DE58DD80BF16E30CC11EA53DC00964C F803982606FD583BF5AC8CC06AF8:90CA27B45F3BBA71239A2B7D695E:\ D139C37458AFC755E2152F71F3977A84:\ CBA8F0E570AEC74BB05AD388AD00A971 EAB7D98D9394C39C8F8B414892D34B:00106AFF5E616269337A1D03F9A293:\ 30934136861FD92DB16CCEE4576FDE5E:\ 1FC104FA8E1F5E7A163BCE1393C9FE9E 5F1FCEF49BB2CCDEE1B0F26E69A68979:EB5534749B9FEFB16AB0B8D5E4A581DC:\ 3676C4095C06E9013491AB481CB4D526:\ 8C3B99D61432DAEA2FF8D5A72FFCA449 4F9CFE3CE3E86BF2A01AA4925D922B2DE6:5FBBB53B53852E977E7FD7BC350B0563D1:\ 8E23F92D86C55185CB5121B04C366A58:\ A1BF4B384F7BC0E154F081654D282957 921157A2FA3293584B0AE4A63326251D022F:8F9D3B44559151D9FE636DDE0B029C3140EA:\ 0B04F22C6219A26CE72D989F120FE3BA:\ FECEEAB827516C3A7A35A0A4431234B2 AA30402A478C8FA4341A98F17C03CFDBC6CF66:\ 3D84E0B9FEBDD66617EC4CD40B8DE06E3A550F:\ C7AB8FE20D48280AC05348EB99E60856:\ 9BB889897236F3D9934432E39A678C9D F268E0F11C1C53B18373F7951DC04DC85F69BB1D:\ D8D4BF072F0D743D942F15F082A2F5662367159F:\ 9F493B0FD458928C9F4E14E3BBAEE80F:\ E41AB5247E989AB4828CA3C2A65128F1 59D4C8631BF4F21C857334AEE6BCF1585F5F0C5CD3:\ 5FF9E4072585125EC1D08AB79B744C189136D8394D:\ 728E75F900674124142AA337CA1DD561:\ A488B3EBBD9DCC78F4F63EEFD6F95DF8 BDC114F0241652BB4ADA3B33FDA18722F7C8CA0F0EA6:\ A554815F48F5E97A9D79F074B40D4553B7614BC1E1E3:\ B176CFEA51C6BD14EFF032BC66F6C7F3:\ 0F24D4CCAEF29554B886B75382B6CAA9 CFF7BA8451ABA766F874E708A2762CB5FA20B0B880EA2D:\ DA5EE8406F03D84032207B50F84DD490E3B78C8DC9AE3B:\ F47516C38DBB7B8E879F0226D29318E0:\ F85828355C8913A3D52DCA893C6AF736 AE60C714E058625A84B905D94507FF7A0D91CF2FD28FCE9C:\ 4FE77BA0D3C58497290AAF37D5C129C22B7BB62B450C43ED:\ 3EC64B66F25B7DF1B6AF3F64E072A4A6:\ A1F158D936BB8D54E10B590EC36FCCFB D776BF1BEFEBA895F63816B634836D04BE7925C360B847A7CB:\ 012A6BB13F3BAE6F9BDC69DECF667CE8753E2B6F5C2875B45F:\ 29561184F97395058CC4FDE45B78AEDC:\ 77DA790BDAF8445CEF0B3C7CB5682FFA A34724CE5BCFB822B3D60BA0CB5AB46C63B98424E46CDAC89A92:\ D7FEADCB3909C594CEECE8BA38C3ECD2CE77508F117095350458:\ B3C263C819CDBC8E7A7296D9D349115C:\ 7080A7A1ACB9BC675DE05186805CB4D3 F935DF934AECFEF97B2F3C289E8E5F444CFF6EC8043FED9912F5FD:\ 79C745EC22125C4A5EB67A98E56154C4FAC1749C8823C912830B47:\ 945EF1858BE2949562316E1AFDBDDA39:\ F621DD4CF531940FE1EEE47774E3A6C8 2F7B4634AE008B66DC1424763FFCD771521DFE4A8C55B83B3EB59A72:\ 887D0AE0873FA0575CFBE21018E0ADC15ADDDC4CA446FE9961560B5B:\ EEB53F967B99F636DAD0E691DAC87E7F:\ 4AA26B55083FF42C0106E35767FCA76C DAC816A9AD72387DF047FBCDF545B67939FCC12C589B1B4358944CC6EC:\ C62DFFDA9DC4451A0A4356A2BD15B570BF93CD885784C8DB3709B93E79:\ F1C8548CE25FBC255D6AAB47D379DEA4:\ 2F03398A4FA867F855D844EE45B8EBC8 7672DE06D10FD6B5F1B3E5AC61F2B27746586CAE09930C336E46BA801F0B:\ 22C85E005F98728A845775998F23F5F9CAA6631B05FE3AD786551CE8822F:\ 1F534B2B8F89DDB9F70B83A83D03984D:\ 53C876314889F9D06C990384D3641EC8 C1D9527AA95E22C82B06DD6179958B528CDFDBC982E099FF1BE20132AB85E5:\ 8D6FAE173EC8ED2CA49DC9991955926DF776442DC1B017099AE357B73B69C2:\ 51ACEC63AA4B0DE98B36531375EB30AD:\ 23DFDDDA97F97A1BC58A5E3B228271B5 F49311B047ED65667B79E02E347232C305E38DBADCE1557BC9766D0837C808CE:\ 33A4561CA1D8D7E59F3CCF80202C2BB05342C4BE8CEF2D1C413C5362E71EE39C:\ AE1F2169BFEB95359CB55717D36631FF:\ 4694AE380F4932DC01A035040EE4DA04 FFDB5DD9D9A73FF949F98031B8E54CA7D086D7BD83F566E8CBE817F7A5930E68\ 27:\ 01B2143586C36DEFB4300F3179A9CFB0C981A1C3AB7FD6134E83632FBC5EC885\ B2:\ 17FCC4B22BF006E19FE47A7F3D1ACDA7:\ 9B24E8C1B46791511094FA0822AB94E5 985BAF3296A7807B36605FA762CD74033B07A0D19A572032CC90144A30A22B7B\ 5AFC:\ 95C1717EC7071A9C9365E8E8AB56A63C3F6F5188FD56D071515E654769263E75\ 23B4:\ A744181C72A954702461521205CE235B:\ F1E5E566D925F72E67FD7C16742FC5BD A571D98D9FAFF69964D8FD5AE62D998AA948E64C3EC2114F2966273722DC9A85\ 361D4A:\ 2D3776235BFCB3F176C7B82FF34B821DB0C637B3F906FC5E6EB8517110385CD3\ 6B2A23:\ 5E752ED4C2A65DFF022F75750E622126:\ 04E3BC70FE0B5287FB8F3B563B4B39B9 5A96FB6B4022B903049C1DC7B209890DA31B16D9A4161E861DEF53FF461C98B5\ 0D18F805:\ 5C7B8E2A358CE90696FA9CEC20C5E2D8ED1A2A6EF5E4824DEEC0BBC0E843F39E\ F74F706C:\ 690C8B04CB3AAD2265D6CFF3D1EA21F5:\ 7DCD6F2721D22132F53484918EBFE4DC 77552AAB1804ACF379E9FF3CD8210D36CCBE8B5DDEF1C416668953B4747D4315\ D1D5643BFD:\ D6222DA67139F9CB63E66E51CEC9B8C7F2C371D3F1417AAAA99A47BCAD4BADA2\ 9F8E552B79:\ 6A6B6FB6F30634782A4AC05DC64186A3:\ EB992E4B1255989D047D486DCAED9117 E139C1EF006AF64F6EE97E37FC12DF87F93317D7F9067BB80E93690CD03A54DD\ F8009032B41F:\ 7FBFF983C5B55472AA881DE7D639B672E53CA89112C454FC1BCEA3D5CCB5360F\ 8325DFD38A70:\ F304C4DB0E3669597A8D760A596C14A4:\ 3446DD04202AE3F7DF2FB86B324514EE 658A21D4E0B513DD7609A820BE3A0F55C4BED000A009567BA41EBC3695719CF4\ 2A835B42AA8CF6:\ 1FA58300ADEA19460C194BFBD799EE58FCACD72C943A4999959E74EE4226A72E\ CF022C95637FB6:\ 5993951EF368014469C049140FF4C774:\ A8CA0BAD1B2F913D0907D0AAA8C40AB0 A4BB6603C8706616B4E3932F4D17392A71F7C1798C8621E7420BBA20B7FFE69E\ 76A43D732E851EF8:\ BE78096ECEF8D4A521BCB2FAE811AC748177438FED3FA3B69DD294038B189AB4\ 7D3E6D1725362417:\ C15284EBF517E72FF4D6E700240B1924:\ 0403E95837CA6FCE033E1609EBC2E137 1100C1895AC0A3A551BFBF4007E7D14CAF9F7F4C6EE1F70134D7EA376C819AF9\ DD8A5387DB47A68C81:\ CBD14325C9691735B07716B0137F9323B9FB8A09892382CA2E58613551A52D14\ 65577C2ECC5F516E8D:\ 630A843465F6748FEC11706E0C1A30AE:\ C327AE44C20C6B7AAA39CD482B0FAC08 3D9EE4E182C06BAA806BE849E1EEE0F1204B4689CCBE5A76A3FDD8DC814AB2CE\ 102AB08EEF4F7166065A:\ F930939B3DC17ABC2128B4F57DB554CDAE8FB753E5982B63923F0FC2B967A4D3\ EC37694390A5DE94E5D5:\ 71CCC4B282A3B8683CF7B23212C9755E:\ BC3BE9DEC1C4CA5753C7ECABBED3BA03 6A429CD60FA9DF30151381700B21B297FFA3B422A6E5743E1A17014F1B4DACEB\ E5D4E1EF5046B88F347BC6:\ 78F328303105166AA2A007F5A781EA11A4BB64A333BF379F05F7D8615520E8F5\ 6339648C2FB0AB9FB12281:\ 365207F51C75603FDDFCA7FCFD0AA943:\ 6135D9DC5EFCD2336B7BD8504F318522 19026566E90BEFDE96EA10ACCB15475BDF4F051451FFC7F42E93B94B1FB59C33\ 94E21960374B4E694A94B79B:\ 2B3C08655920C3AA770231AA83D05316299EA120EADEAF94884A32714FC1B73B\ 0A9B3B573A53D12890683A29:\ 03D889839F78DAEE42EB1A64578B0735:\ 2841BD9252AB693AD1488E74572BFECF 4964BE4642F182D57708C17AC58BE92555CDD0A0C2B9C0F373FF0093EADB02AF\ E934E0D316FADACAC1AF457E3E:\ EFEE5CF69CDAB2C2D1AC105C6EC38535D91020D1B54D04C56D2C37E592FFB487\ 06131A352330813F047686D534:\ 7531E248C3607BF709BDE889983E8BD7:\ 2C6804B5C23BBB1F41DC3DA8B9B135C8 320A987FFDADDBDBDA13911C14438966E2D44BE18270BA5B65DC6799C981E34A\ BF277C49B0EB6F147528F0E05DDB:\ DF6ABDC41BDB76425F2D8CFC5F6E372D269FA011AE3C2AA493DB30F569B75DDA\ 1552920A9A0AFCB574DA7EBE5483:\ 9B9E8F6A1E642D3F148141F44A702B78:\ 11237C7423EDA19C1EAE0C84F6BC3B7E 9A891EB88E6F35BAD450EFBC09CEA0779C139A9679AEA59597C98EDCC8B3172B\ 36683AB62D3249E8E31538592C8668:\ 02A25E9C253CCB466B6D34FA3B36D113A287F7AC406823EFAF0E3EB21120DAF9\ 2F484E6E9A2C913EC2B8B86E913DE5:\ 0C8F881ED6BFD47B5B8F458488634ED2:\ 623F903A40E152910B828F7EDECB0CC0 EE2D21B3B4D7BB0963A524126B86ADD09F17E07FD7A41A4CD0B957EFC9A9DF32\ 047CC4626615B34FA5BAC3EE160DEBC8:\ EF6064B1616A36CFE516DE3DE86C273016E2AC92BBD2B5345E3C3D25BBB6AE55\ F1CB79C896A5115C61DF76BC93687DB0:\ E0D6BEC46CBA9137A4C19DC9ACA26B22:\ 53088D58E6BB077E85B752DDBC902C52 61C4987F76789FE99F310290AB2444B4EBA482F29BA3738FE8FEEE66B4087BDC\ 2E2B0745EFB15B6F9FB93E60CA5A55A8EE:\ 61719F9D07B0F044E8FA6980C220D4E5297F7612427302DEE94F2F381F10AD59\ 26C133C496E65A3293498D2E2CA5C3F41E:\ 80254224459BB50962188755D792FE3A:\ 38063270D707EC6D3EEA123C6D4912B8 59ACE34D84974EF492E04A809FD3D45CA0B8B445461B59B6524F2CCFA3D2FD59\ B018D4CEBA2094AB668F9671966B165BAFC1:\ 11D166C2ACBC481AFBC65D461864D9EE04C879A4ACC14A1693A57C07971A4B9A\ A3A33BB094ADFD6BBFEF0AF61AFA0C311BED:\ F340A9624C475D33A2CBCC1A5242FF6E:\ 7C76FCFB3D19F64CAC2A7278AF846A70 9B0E3DE0C6A835B46112E807B1BC3A8384DEE51ECCA166D6A757963FFF766AB3\ 2D0E1565861775CEFE8455C64E81C7EF6AA10D:\ D17E90D24691B153B8917DA9C3520D405465D4F2C7FDB2DD82365D0E356DB712\ C5909C594D83AE4EB079F5C392317BAD0EDBFE:\ 977184379DA6CE1B1E3132AEDB6A2FE4:\ 7445CC4DF79D018242B1E6B9EE22E9CD 55A74416A6C1E33A09CF3C1514ACD9FBCFDE9741D0C386AB84F1F01815F3A7A1\ 626B1CBDF9D6D25712FF220B6DFCC91FC97E4842:\ 6268AC60330EBFBE8F3C7762B6B00DD92F0D85396098B57474BA98ADECE9FD56\ 8AF86B5695AE6918648BF883868A17BEB4359D3B:\ A3A5F12ADF2EE262843B4489245A0A92:\ 57C202A720888F578CB6481BE5214CE5 10302F2893D19D0429A4B893763302849B8DD13F79DD01FC64168C938278F7FE\ 9F399DD4271C0B832CEC29F1C26BF1B5DB8B1BF793:\ 2C1F2FE864FDA7D93A08AF5F0FD4186B5ADE3A0833F7029DE495EF6991E72354\ 280F385430D16DFED118C984DB1E3065ED57DCBE7E:\ E72BFE997F80D8D8B16657C6B754505A:\ 22F9E33AB71D200A64C2F05CC426A748 701BB84145F1DC20F7A457624AF353F0148F1C2091B840C49CB5FCC9B637A27A\ ED4AB17BDEEE88FB982337E8BAAE35540283CBB38F38:\ A8FD582216D3FF768FECAEF5F619B056362692D8F43C2E3E75694AD274D753C4\ 51B7AFE90089012445D470C5404A74F40B88494EAB5F:\ 5C6E15752D992AEF84C7D61385168ADE:\ 689EAE57ACACCDBC3C02265A42EF4965 CB1D8554194AC2AE0E3C9F9C2B7E3797848E6AF752690B2A30EEE0D545D41E33\ 6C2EBCB7C24CC5038D79265414F74453AACB5BBEBBDDE4:\ BD19014FBC75D13E2F2EB1F18D8C1D8336B6DCFD2D17D7D27F62331AB78637BE\ DF9C1F4378165D08C79034FBEAC9B2B90D4FD6F197177C:\ C56BE3DF2461B1CE444FA14943E121E4:\ 284CBFEC11CFDC509E5EC53CC2E33AFE 348A8FAD0985490F232862FAE0563E8AAF58A4463F9C6ABCD600B8F6662C7291\ 4666583653A4B9C3FB499C2594ADD05EAF82B8DDB27FACBE:\ 2F10D18D90F9471996EB7127D1219439D1867795EC1911E75DF16AE6019FF569\ 611D9A7043DBCCE61B9D261E1CAC663851C4A0303313DD47:\ 4740158FBCD99CF0DCD425A55783DCD0:\ 312B1208A28974B5135DD517D8F6C643 B15B6F7C6B48E6C6F9499E72311DBD707CC3C3C9534902C988729E520B9DC997\ B3D246F009C93E16C7F54AA9E2DBB870DB6FC266F254A5EB97:\ 4A8E6487E3676E1111C79CD542FB77E20E0C6B27F5502FE47A70B0E328568DA7\ 5C736333E23707AD3A53D65C091B5A886B4F0121F7B90B714B:\ 435E6E1F17830FC1B3129CB31DC25BCD:\ FC83C06D644CFDBD069B8C01ADA12184 8916C5F7DC966C0D7B9C6FADA33BE730674861B908E08392A9FB7F66A58DF32B\ 2BD3D8626274E848235C7A213BAAD607A3377D116CEC891B33E2:\ 56070C7041E650EA2C28902560BEF65100959E1FB2D2B53888E69286861A7117\ 48B7693FB597A657C27069E91F386D896727340BCFBEF79AADD1:\ 3FB7F70F55A40D38B40070F047F0A845:\ 101A58E039261D052C457D83FE99B7EA 04DBF311335F163FEE6A1588FD6FCD433E3AF7D4CCB72FE8507C23853F3F6738\ 6DCF8019AF7C58B20A1CF7F0BF915E9C2C8C6785B702AD4EE599AF:\ 174F696EE3197A93384A8E53B1315C3C448E4F2B1AB0086AE68221383BF12C9F\ 43833283CF54E4EA421E09702724D59B4760EF4FE935692ACB837E:\ F4CAFC7D939BEFC4B7C9BB5645C2863F:\ DE8BACE1BCD71A743E153EDAB0F6C8B7 2F5249B8FC8326634C5D80DA4D6EE63E77162E211C4C562C100B861571034266\ 27C6182EC81439662BE17C3ACCDC8E23AD637CCFADB6EA97816C3395:\ CCDBBF547E5F39797D5BB8BE1A7D840D16A8E60555F84494C551E10E1E9B2950\ 55A1CFA85CD0DF95A9E90F4AE6F43053BABB28604F88937A384225E2:\ 7725DFC7A01FA56A262FF5DE277C9C58:\ 4E856EFEED281F39164BB5D426AA42C0 B3FDFB3E75FC0B934C084152E96DFFDB625FCADDB005345732643419FBEE2760\ CCF336B7B76E45A4E441AC88C94C87F70C48AD057C9440E032A20003B6:\ 021A9DB9599E243EE850AE3803359248169DF6F1E109B5DEFC3E3181A7F54580\ B6655BD4B886802FC7E0F32872A93D3729B4C4E4CAB61DE7C5D9F3D687:\ 276AE6149D3D365BF4DB65B31BD3C10F:\ E998FC4FFD8E0171069FF3F08F66D984 3D3FAAA063794263890F4DDECE9EAF9D8E8E89C11A8F779D82FCD178615F5E23\ 25ED84378682169835C7013C7E23CC9BE74C71BF9D6CF291C3AB3304C13A:\ CD1C1D2E2539E6AC4198125E968C2E68D16427DCF681FA2006CC79AD23DEAED2\ 2CE38DC53D84445E5628F87AC621BD781E1BE45EB83B0979B922EC41D1FE:\ 86F47F53472E329EDE94D33D391EFD51:\ 3E9AD8839B92C6730D1E1B4BBDDBDE08 C7BE811918B7292EF452E75842F1C8C744A9FCC616B1267DDDC9B7761922B657\ D2653DC1DFE1BE4D5F20BF76F3C196ACFE38EE1038FF3EC62470DB25825701:\ E2128982F4EA238ADA0AC44FCA33D64F1FD1D3F8343EA61683BEE0E3D330EE15\ 6D18E8C26EEB4010F8CB0B20FA964E479DC129386D30460611253822A85507:\ 1305148EF4895A0FC12CD652FA9FA2B7:\ BE33A68DCBFD831CD6456D77A2CD8E12 3A2BB9D146DB73B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24\ A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B:\ C03B4714C9E4BAF3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419\ C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490:\ 5580BE3D3A5A727F22B4595BE16E0F3F:\ 678ED31CDE4D6CAFC8BAA875713FF0B9 315FD1212F0B4FCCCDF9951DB7AE90F980E6CDAB1EC35E41332007F3FB00DB05\ 4FECC6F0B639BB916883F02423A768547144D5B8856DD1693B72329A73866459\ 9B:\ 8EC652D3962EF9CF22A2B1849730EF08730F74A0EB86FD0C4EE9E7751B45F45F\ F6BD85167F9FFEDB8828F5D4F3D442A240180E1F296BCDE462CC4B7DE977C02C\ FD:\ 0A127BC8C04D7718AD77F62927CF0B2E:\ C97672CA375539D43E6CC3E06167A001 16B82523B23A8C431B7315C307EF103CFE366E76D7F8A6464FE6C7E3BC78B9DD\ E6A2DA4D09D05D3DF2EC2CC71E2C5E2ADA89E2C4C263BDB24BFFE8300B0AB3CA\ B673:\ 4A0E874F284057A72F55FE2FC5733F2A81E8DA3C35BA2B2758BB4376D8B88FB7\ 203932F4F664B0EB848A182AF957AFF953AE69A59480B40D13CF457ECFE4F4BE\ E41B:\ D5781536A2EDA21FFE45B78B49F5293C:\ 60D2607E881FDBBBBB215CA56F9E1855 83AA1A09444886437356E2833AFA415AA29EA1C16E8FEC269DBD7E502B1D4C09\ 24A42E357F8896C2D5FAE8389A369CB365F771F14229A506A5056EF2CA9381C8\ 08316C:\ 5A16F9A3E1E29371E72B3A96EF2BDBE312CC353AA464C88789D9DAFE2C5024A1\ EE2E39FD450C62DD85E48566D3771ADDE03222178705D7128A6A4912A8AB1349\ DC226C:\ 3ED48E0EED488B5D3F3B4D7A6C36679F:\ 659ECD5DC78B7435CBCB12B50836D477 86AB436404A846C845BBC3261E367E43B71C1CBFBE83A1E678259BECCF7E7878\ 5E2D473402FAB1DEB3781910B24FA07966634B8CDD3C8EACE0E0503196211001\ F31B9738:\ 77E4424C70A4AA48521D003A917803CD0FBC72FB7E4E3F61D6618A84EE7436DB\ BE3B103BF55B367990FC1607CA89E07E694D0E7E4237D0748E9370BBC6C99D2A\ 72024534:\ 0FFC4C7E8EDC3704A564CF4848BA0ADD:\ A0B0AADCB21B64CE81E6FA519D9071B8 95B0C1A5D1D183C95ED5B77A473657CDAD06374613F94B2731157947E2008AF6\ A0A343442A69FEF44EC1C3A9A526C1B850E3196E67966D8CA2467D2D8C8743B7\ 4EE755E1DC:\ F8D5B408682F43946CB95B071F24AEC63E94C74F7812299C2CC7F63A6C9C3218\ 6FFCE730D98020748639BE446870BFE848AD881D02B8213A6287ADC00F430E5F\ 590B6F6F8A:\ 648A228F34AED9F09440653A56299825:\ DC35F21F735FF7890B771720B46266C1 A65E02A60F709E2CB021CDA6BC4D3F580138DD86FC32014E3671D4B917077BC7\ E81BD7D9BD4C61DC5791AEEA8CB37D18C0E2CAB4555C2C797120BE459F050F64\ 1DD876666D67:\ 05798DAA3D2815D7A6C84ED8CE2DB04E183B9072E7472176BC23D6D0F55A938A\ 8C1700C4838CABBC842D5313D389301C23E6B76D62A2A7BB6A605ABBB5A50458\ 2A1373A690AB:\ C8473A5A85EC5D7D67B0DAE1BAF55F0F:\ 7FC23300A2B3F939AA57ADAD11EA06C1 4A2357AAA2042E7EF941158FBAD441083CBDED6F0361246B2A1C28751B657FDE\ C5BD1A197A0E5F90AC47C84218673BC6CAF33A78E2E499E0FC5B7A08A300FC76\ BE7FF78F045513:\ C8659F0DCF964501606EAC3C3F91D17D0F6B8E6076E6C85CC8BB3D0410553E1A\ 261C4A4ECC6C19DF80EFED89999E67035AC997CCC837A2B19DC9AA514E7EA9F1\ 50A9A22BF029AC:\ F4FBF67893DF61037133787730E27576:\ 11684438979AE34D371EBAAFA7E28C4F FCEAB567A1DB78D58043E922B56DCF529FBEC49ECFB44D4E90ED9B5352F1BE95\ 6B894C438202F32DB57D0066B2E2732D495B7B77B60BC3EADB3B8D22CB71861F\ 00710DA68D8CDB68:\ 96FA555FFD8542AC2185C67F6C2B1DE9D037F570716CEBB9AB31258637D9B066\ AF2D2A46D0BC0F4F8DE7DBAA79E1D7771512B7CC788740FF68E5FA26A168DF23\ 74D8602D525AC547:\ 18B9EA7CD25DFDDFB21FCB5EBBCA965B:\ 58E6A7597E2725CE4151C2601432B094 9DD176CC9D27F2B8EEDB272E2C87FF9C7944CFA57BD12A9E1E7A4DADF9F256F8\ BC33E959487CCE2CA07E04DD29A1642F0B8B7E16DE15E45EB0C5CCE687962483\ 8E43EC6BD4A1F68AED:\ 660549FFBC7351074ED0433212D7B57A8D4076DD137D83280DEE8DD50DD7242D\ A3266ADBD2027CA03553F137EBD437083C86AE3D88136D190AD25431EFCF94DE\ 0E38406C9B592A3E5D:\ AB1242B47A230D3CA9AA74A65AD314D3:\ 2DB97AE77EF56836261C2B2857B37C4F 484971404DD0EE0EEFF12365C8960632134926A1C625BF847EA6AA61568F9961\ 4AEC5C688ACC889BA25BD0BE6D39230A422A997E6C861EFDD2724B307A9FFDB2\ 2AF4401ADA3AE4C269C2:\ 452D66F14FF4092DBE60FDDFC469CB7807A4BBF727EFE47F9DD3898B0FDF1D22\ 9F5864C7F22C60DB40DD6F6E4C6E726A949CBB297E251F9687B089AEB1EFD472\ 936FFD8B6890062FDF1E:\ 0F6E2F2743E2459AB610AA4905D3FB13:\ 044478F8EBABBCBA92283C03729CA544 9ECFAB84D359E87B8E46D6F0CFC6BB06EF2F8AA27D66864E36D2840D3606624A\ BA8BB13E53C55371CE7D4BCB1BA5F012273E131F79CA0DC72D89222AB0A32A61\ 33FDE7740BAE09BB1E08E4:\ CA9C5F1C3C49D22C03847418907DB46363A6B2BCF6AAE9D982B502B0CB8E02CF\ DA5C2AC9B0BEC8E4162993C2DEE53B48458359AA7BFC2D8827D8B98227880419\ 32037A7DE2C6CAB4CC0762:\ 5188AA01382907A2F6A586FBC29EBBEE:\ 446D533F257AB6335457D53772391AC6 6878D201901DE244EC5CF495D04794918C150CB6F5C0D953E5B4F8B9622389D7\ F2AA3317CDDC5571E0F7974A6B2415B7547FEDD7316747B949A224F0C7BFB46C\ DD14BB7A332CED6C8813F668:\ 9EFB38AAF7FA4F5E249E128D3F17593537C39E317B766F256836E9F7E3A17FCC\ C1409F1C5CFDA928E74969848DC43FB4E941FF5554F06C50185A1182617CDBE2\ 43E9CE7D9E7DC3597EEB91AF:\ 447CB21EAF8051964EE8781F901A8733:\ 36F18B4676A549C0DE722B2659BA5A8C 23CA3DEA8D4D6E4F568BBE6EA90640EF95FC7429E2A4466FC30BD0D9BEEB83D9\ B35014DF8E7ADBD38ECC65B46E6CA23D89664CF28258D73BCFDD3227FD428EA6\ FA5B11F03FF154BE1598DBE70C:\ ABC4F45E59A9071E2EAA2A58049B2579CA0595090139F08F66C27703F8B83327\ 62862924395D9D345360D082634FF4B5404B296509216E8E276BD81BBF180F8E\ 9FDFA80F43C7F285782EEEED1D:\ B77551B5360452D628085B62AD73F5A6:\ 1D682D5795A81A894190FBA6B24C0F1F 83C71BAD6F39E2A0CB7D925A2933D195FF186ADB4ED7CFBB9A0E4BA50ADC8250\ EED58A02B37831DDE8D67C765535448FE1CACE1B63B352DE87BC9E10EA1911BD\ A66C62FE3671AF87C6F3ACD24A3C:\ 90BEC207BDC7180A465F153A622EFA99BA31B01F4DF1AA9D3E8B2B85DDF4DEFE\ D5991E29E45854CFECE24FEE5FC08353D4C25C56E19AE2FD2CB97CE01CF39D90\ 5315BE033828B4BF30AEF84B8968:\ 773FAFD175509B681A7AF4617A6F432F:\ 8550EC205F5C64480E294FE0C60D73E2 27EB2A8D1DC6DEF8142C2E35324F19BA17DB1B24F7C94836DE9E7508AB3AC9B8\ 37DEEED54723232B7ADEC3AB27534E1B726AA7A47C182003FD09991B5EEC8CF1\ 01BDE534BB8B486E1D74612D7D1568:\ 281B411FA4702FEA5930AA30F14C6CFAAD7CC47B84334C03D063CDF52D8339CF\ 12EAD9632AA3218476A953933FA4D1287FB0DE5CABB0EC8AE298DD0FEC1844D0\ CEC638A1D167C7BA24619053F26D9F:\ 11074EEE43942BAB676A6A54C0F680D7:\ B5F1FD9945A0693DF1372682FBEA929E A020AF13D35857A95FC8745EFA6DB000F6627A41E3B2429AC57B3A862828BCBB\ 22152F68530FD7FD7E2889C2AE6B4B203AB136E81126DEBDB673F1E8FDDFA1BF\ 53CFC7E2B8E00107BBA47E525D36D990:\ E91AB36A19C2050F7AAB135988AA74F36CD5252EC92CC7F5E66E76279386FDBD\ 131A09BD655E5C788C9142A3418EB40C15A29F8262406E4BA790D364907821EC\ 7D77281F6F2B99E69692AF8D0BC229E2:\ DDF28D5F03B45367C97AA207D351C92A:\ 53666B1F1E067310CDB1D4B22B419C50 DF2FFF4CD40DD8B4A6563C086F29A800C5D56517B28EDBE26BDB95EF2E51E40E\ EC70B6EC5132830B8F64DEF59D8974597351F9124B6FBEECC054E76472A3D8D4\ 1DFB6C5CDEAF4F8F655818AB707AA711EE:\ 102FC701D542EC9BC687BE8DADBB953C2F328B009A4624BCFA17212387A13481\ 205A6C7F55CC81FBF97EE5A595597E4E6ED3903C4D91B4142B73B0B15030470C\ 6936FCFFCB15DA3C26CF8207659505D054:\ 83E81608A49F2F4CD6D4CE9E38F8F9E7:\ 02279A85D49830F8A904CD9484A87C54 F17144E09A92D6390CE9BEB91CAA4ED3E5D1FCC65630FC7FFD7CC70476E97F83\ 430EAEA112D52912DBE6CB77F774AB551EA321D755C4A62A7BE4FDA10BB0E89F\ 60C882A239ED2AEF199B3C8F48FB10013019:\ ACE1B6EFDA7EE7407DFCDBE573B954B7ED7E8645DAAFBB25246E15446D2E4CA3\ A3A2EDC39E66636E763153D8BF37F9D3DE907FC9D98C3ECC9782E8B510216CC4\ 14C4F4D28395821A35C4845A850382DECF86:\ 8E1F0454359FEBC2471FF02259561758:\ AC18B91487815D98AB996E940EAF2287 1CFF90AB8BCF241A734AF795E3DD1FB0F63C196F423AFDB2FC3342F416C00D61\ 208AF7CF38F4C821B29F07E6A55DB219E8BC04C325765C47D87C281189ECF549\ 82F752CE7ED382D194B08D03B4A7534F916129:\ DF5FB08A8AE10DC102D61877CC48DAA16843EA8CD807564AF2B6F4F82B4C3350\ F318FC2A04D88E805098C71C63E0937CC8DBF7701A48A37E32A67E33304C2286\ 6743B83B1730BDBE219B93B695A24C6D18115B:\ 5AC6369174587D48E1AE1B7744F46C97:\ 1DE42C0FBCCD3D87301E750B0066E847 9CA6CD595F4C8A21F6D5947A0DE2B61C76E422D6C677965BD2C5559A11E0063B\ 4F93E09EDCB777D6B3EC51B379C5437BC88AF8EAB8E72F8504952B743D2215B3\ 3C1C98A1BB16B07CF3C1893ECB3C6F440B75E1CE:\ 6EA26BE272B9D9A53DE12B89F9EEFD6425FB9AEAA2642201B1545F6C3D97B0EC\ B4BB6C37828AC99C9EE23AEA72DB4C8FBA438AF542EB262673BDA1E0D16BC933\ 4CE74FE1DE6B851C9C21EC245020F1AE124D58F3:\ D73F74BB2331CC59766404A7FD68FC12:\ C912AA5C9C69FE793F9B0D13E79A491F C0F380619D41DE3D3C0FC84C606DA8BE129644EED457395E263A3D56A9A109DA\ BE2F925D4ACACF2176E8762C4ACAEBA27123C074DA90B1F71D6E30B283265B32\ 7B0C2DBD94EC65A70FDE2953B5E25AA9AC0DE428CB:\ 7DD11E74A9568DC2B22267E13AC51F15EFFBD02F64DE4388AB2EFEF3ECC7282D\ 930F52336E7A6283CA638CA4CD98708295997576AE4E4BEC3495CA57F2FF7B07\ 10B629E9F67FFCB91C99F7162F250956D469D41B48:\ 02CAB723734573136AA95AD75F64BB54:\ 5C9CACC35FE500E156BA2CE520CDB23B 01513EE1D2E470ADCE8BE57112727AAEF1480C38D92E68FA99D568FF4979EC51\ A3A63E21921933642002B99F41E590CBCF257B735AB586E3F2CFADCCA522946C\ A1CED4EA49D07F5C70965AECE0A7678FF56DD9CAE320:\ 2FE8BF3C296F7E36517DF326103D7BBCFC7AA093B6034373E6571E1CB2AA808F\ E0166EBC122458CE819ABCC6DA5BA4E6AFFE98F9C4DE2F7BE01225A265E57621\ 681F0CE8683DD642924F54734D510A660ADB7382E438:\ 4DE074EEBA050628135F6E0BB6153455:\ 7DCE705726988AC486109D330CB4841B 158604D8D8A4508C2CACA26910C43941A7737304EF901B34ABEC9BCA8F7395A8\ 6B6395BC8B60FD952A12F4321A0C556280B7EB192673B758ECEFD4ACF1EDD738\ 5705E97B661B24CBDA98777737FC1939A7DD84DFA810FE:\ A7C9B667DC31C97D5095776AC3967E9F3B2912C7E596FF507F2D10FBA8881C5D\ 6FC1F17643E83600CA5CF78B28E3104C4A97A3B3AD9ED537DE2AF85737572438\ C200FD3D8E06644CA347618B85243FECAC8B062F9CDAFF:\ 529AE17D04AF5F81DF48B7BFEA78CF25:\ D689379FE4A642D0A6E988BBC0B0A74B D93C5846F4647B17032AB3548D81116644B093B5B19E4E2AFC49198268DF9750\ 716F537D9BFDC9B466909C496FE259134F8950E2994336A3EA2D3B41226FEE6C\ 05A279B12D23370EFC7B09D6313CCA54D5940C828D066889:\ 527CB7BC14045AAEC07C679D842DE0F7DBEFDB86FC6DF79888032A872C91D12C\ E8778F2F7A0AC7D2FFB3A6370398ECE9E532AB4550F269D0CBCDC116CA6C60B8\ B2A161D34AFDB049A32665A90541BC97051B6C73E2264712:\ F02044299833E58B08F0DF2E7CFB1559:\ 4B88F3384E330930637851DAA0FCBD6E BFC943E6F9FC3E8967A860BB09AD85EF183000779B202B5E5DE738F010D32768\ 3154F5C03E8BD2FB9B26C9385463B2B198F160DE25E7D6BEE423E4836524C636\ 87A31BFE042759C3BC94D3D2CB8219DE07C9444541D148CF24:\ 9DE102B2350C51B27B9A209001ABA87F74DA02B3EC7888EFD095D350B1670240\ CCC2868B8DE8F75AC21DAF34A82BF8FBB585C8087F9309C30EE7FE1516BB8DE4\ D93EFA938382AA834ABFF1069EAB633EA817890BE0340C7471:\ 5DE936BAB4C06AF24B4083D42006B6F1:\ B355BA45A1690385C48B557E22DAAF37 D1592D0C67A705130543605408D6F919FC30A2BEF6D4D0CDAE5A7CA1AEBCEB4A\ EDF779C9DC7F36E1742CDB993A8FE10C3DD02878F9B906EDECABB5B6ECA1CBF3\ 13B31B0A24C075626027E113A27D9A8D2AA466FFFBCCF0A69ABB:\ D2F41E4F5FCBA0CBA4B116BEE8A18E07610AA1CCA0309E9FBF35ADBD2842AC71\ 7F996C569697F73BBBBC852622781D2F9D0A06F59070019109FACA505C91E70B\ 8C592020364C8DF7464C1F5170A0640D3910F74BDFB22BF10FF1:\ BBF991E78408A06E251F1C3A5CE70D52:\ 9BD49245886221FBF69C849460E29BB9 1C1B4F2F4297E12CBCBA6309AF806D4484683299500447C0C7E89910679DDCD2\ D4BF27F759A9D8E8D6FC5C3B358A510F69F4BE2A460DA4183985D426E1E5D171\ D5AC363330FF4C42E893F20D9BE08CBA3FEF9E4EB56260B866FED1:\ 1DFD895B9E4C944D6965517F115729D6C6CBA48F1FA75B63CA669705FDB31EE7\ D73973988F5B73CEED023AA6398AF1C01ED3CD9FCF9BE04AD675E3D49A50F9FC\ 386533C12F89BF5CC0C8800A2F769D2BFC01FE0E4D7BFBDB254FC4:\ 270DE1437695766D234EC8AA7550955E:\ EC6DBCF2BF725BB446A026DECDBC3536 96E90DF1B05F9FCEBC85566B90AA6B54CB45B20F86A2FF093E09014109D01D82\ BDDE0FC837D2BDFE461E8C280C517B1E9C4899D19E35939919FB29DCBDDF98CC\ 59C29298399A9E3B75DD0AD13061D785136112251DC93DC6458E354D:\ F02AE9B596A60B1B55A0A1AED885AA41CCAC58A620ACFE54F222592C4F9FF9E6\ 38A6F8E57276420EB14104940F128DF0DCE8998427A1FEB6D0077D92061CA9BD\ AB42554329C8D44597A346CAFDF19DD6EF1E271CB444E1594EEFF448:\ 65B0D4643037333894C2567F1200651A:\ 5CDFB2A7DCC2E1903BFDEC88954BD0E2 F41F334F73D002068F64A43533BAEA6A0AB6703D68AF6D85621AE7993CCF08F7\ 637E047C0B9E8F679B7228AAC16ECE23B3019F80900100AD079E5F9FE571C524\ 9C3CF9B8BA13C7566F0EFD29AF4F4827C1676D2E895C8C743DC9B48E33:\ FF27467D014B193A4A435A0851A6F70C27BA92ED82A2E4ED18152EF20FD5E7DB\ 1EFA494ECB64588B29FFF34827A49EE511C29A93B68CA661732C286AFDB08727\ 1421D4F4AA8D0BC9E71C59E4CE6169227435BC2652EAB29F3A63F1E9BE:\ 37C4175403C4A0CE66F44A0D89398150:\ 2B447659DF9022B1EF5EC995B4EED6C4 0A17E8BC90EC5C507694C084AD918F6B42EBCBB0FA695794CB8A41A3B8F9F4CE\ 3ABC272B3B1F2E46F55A89E13A99A4509FB68EE322AA95ABDA5DD65519056210\ FC327BCE11E8A772998ECEEAAE0718D5677746FF68E4E24E890C775AD3F5:\ 176F5728351F63009F37BDFF6D7B305E77CBFBD621140530BC4B9CFC65EB7761\ 13BFA8FC6282979907E78E0A14D2C7F97359B3648F841C98EEC4DDD0F15BA1D3\ 057A0EBE0212EA54D3F41ADCBF5315EE23926870408FCBDB0D47292A1F01:\ 30E5E7F3199B6F4B9B4799D0FF8DA9B8:\ 8443B0454B241D603E3A4CAC72D562CF 1F322F9D6F5CF8D38AB21E1B655261316C1CA0BBA2236F9F2FF5550998B0CC0A\ 376826CF6142E3D1165B3949D172A098C6ACF50468BE1E498FE020CCE0B37C5F\ DD32233CDB4DCC5BA2A70AAF1F27683B1DE6A210DF857AE6DBEAA5477320E1:\ D3930D3B1915CD157DECA33D14B79F62D0BEC44F51A669E07F2899CC21A849D7\ 6011453BD064189415B726D9AF12C8F50CB887AB6714FBC71CF83E3953BF52C3\ 7FEBEB48D14C62B1A64F04F987BFC6F311BBC27C79F4520C2C710B69047BCE:\ 711E9F19B40F63409045565634E94FEF:\ 00D36E6FB099D38C94DF4CE767A26DB9 C830A4AA5EDD5AC64121F0D47441884D2E9CDEFA5F7138B4B8505DF55185170A\ 80164F8B1BF583A0EEBAA52ACA5BAA81471CAF81FF79E234FB5DD5066F8E1DDE\ FCBEA047B9B02C80DA480FCC5B67378AA3554DDA138256696A875FEDDBB233F0:\ 35A8F3F1C7333DD3F1713680B1ADBB4268FF3DF157C7E1A83DFEC1C224723FDC\ 864559B9436CCF36A6F930AAA7BA03CEF94C2A01ACC587E3CBB334779833ADBC\ 22B873E71506207A4A1320FE881C0B5F6EC5B384B7C50E88FB8100AFE85C0E0F:\ 8D2FC9D115F014FB6F61AEA91DA55153:\ 0E0E45107F52F186FC2F38B35565B8D2 08155837372A1F8587F31553D0CC20BFF1B499D0EA035FD3809CC14F6BF2A5D9\ 565A734831A2EFCF4EA5939FC74BB76A0C8822958C8FC73E77D4C856339E5790\ 22EE3AE26E737A8E9C6E3A9481796EAC61035BD97AD45EC7CE746AA0D587369E\ D2:\ E9B72DEAFD9DF0839B94F32937C8F4571F83C648EA7E26193A264A75734DE940\ 006D9CB5F10E2647E5253D234898021118578CFD50F7D9A32E59C48A98859D05\ 7CFFB16F9C345002A0C577E875A561A15C78983771D75A7DF7286B8924EBA24E\ 59:\ 6F7035148AA370DE95DF32625C61DF1E:\ 89D60899E5C54E72C9E86AFC88E283C1 652D41B854C0D18458B8C583D5122DA3AC6B278ED180E9A98A2CBBD23854DB32\ DBCF4377E44F339DD6571AE16693D9E5AD9834D38836A71002C40BF320C28EBD\ C5824F6701EF35996C8D6C6F843C585C83A42C5F775073AC065AA1FBD61F7F18\ D68F:\ 3C56B8394BDDFF0471148D0A9CD7B0F6B179EC21B829EA808D6E55450CA688E8\ EDEE29B1AC3AEAC76B0C3A2D8604F09FF3E777085B522925CAE621DA0E66CD80\ 63440838FF3FDDDF09A64F3ABA5CB43B88FEEF6572C053076BAEF92454729C08\ 7AD2:\ 7CB41B5675945EDADD9065E47EB1A2D8:\ 883FECB5355C16D075A7DE014BA9A05A 3756825A44E0C3D7E90C0F4EBFCB2FA4561EAA12C693E7FD8707AD206133D0BD\ EEDA0BA65EF58030546076FC9904214E65CD9DF37DDAD962626868A3B32AB476\ BB694534D37A77953D6F1109515C5B5FC239C88FCEE22BACF54C44E03E9E3784\ CD9099:\ FF9FC9F00DF578810D3D9F7D50B881B2578E9D7EE8328A3F8C702F9298800621\ DCE4CDC2E55E2B75B0574A57A9296400F811FA6E899CB8214583B969C9D5CB03\ EA966FDF32A2F1FCA8B0B64BE84C18CB4A7F7BD8DDEC03953E744520D95A6D65\ FC735D:\ 21C9044F7F1F71AA0FB698E80120DE7B:\ FDABFE4911247EFA953293DD7FE6D5DF FCD4675A023315724B2BB939E6E1A62E403B90C9DD267DD6C2E4B39DFD171117\ 4B9D13004827B08A65193BC21A9A6C0AAE8C2527ACE9C62AF6810ECAD8671403\ CFAAF86BBD72E3BBB1875D9254D04A8209AE9E800E41A7BA5514F9913E94CD84\ 69A7B6F7:\ 5C7AEC623C486C256635814A95F07235A4D6932FC23CB54CD0A6C76ABD58DED9\ EC90B9802B7D4366ED11E7AEDE696D3A47B716312DB0577662C1B8B8F8523EAD\ 62FFCA8F3C6D15CE2280B7DC8144782D9CDA5D609F871051C79FAAF9006F686B\ 068E9B97:\ E06085A98E76F04B2B78476A4FEFA542:\ 9A619CF8924C6DCF2CBA067A34B3A761 9483B567F791C819D9F4F607AB82E0E2F75DC02BFFF7836563B1F89CF0F3C859\ AD93852485A76A5D51260376C7877E2A875BE3C6528D339C6BE1597688805022\ AF963A47A188112C714CBEC0435AE99B9441CB7D5D3B3048CF9C3CFB91C7D248\ 3C3CBABE75:\ 3FF3298943869CAD3CE99857B849455232AF6A0420985364BED603D012F1AB29\ DAE327C27FB107FF25E061A60933772EE5F9FAB717378E739ACB6D2F09FD8A3D\ 1B02C2359E0AA8C07593367BFF1C5FB70C20BA8742D4EBA2A9D12678FE08CB75\ 8F17428DCC:\ BB11666DCE893166774A99EB9F4E4A55:\ 103399E7EA5A24A0CA60FF24DC08B391 00080A114314369DF72FD1339E2A83F2427DF458221236C416ED129563D07E71\ 1BB378FFBA1787809C8AA09B031D23033EA418E0BFD8E694B0904C73B964D73F\ 975462D3264C3F8E09182F732E8E14A2FFE3F50E5A6F81BDF6D49D8579AACD98\ 52E699C23502:\ 04B30B016A92070ED18565327AF7CB82C4940B3289B28BA4A1208357B8DB6F79\ 930E885E05F617C5C152D619950C1B986CCCDFEB7F9BE26C41F2142DD05C25C3\ B92857B87FD7944611AC6ECFFB66011CC313C2BC96581D7624931D061ADA6FAF\ 4EA4B72D2E73:\ 1A7031DBAD6A06FDFC79B25C77E9EB9A:\ 64D45D74ADDB71224104B3A4188916AC D5576F37BDE9BC6FB4BEF8F83BF565C8E710F05D9F2FE47E4266EB23875C54EF\ 63C5937A506B7BC3FF6ECA77D953EC905A2F3A84B36CAC6572BF8564D0D33C1F\ F3BDC96F374AA75C7262F49338AFA81A6E6415FE60E4E61F3994CDD19589BF38\ 9CE4BA169B99FC:\ BB5653A4C90F6BADB14DE8D41C55648BCFFD7017F8CE43CF7D78A4FEF9DE625B\ 0B9EDAA83C901C5079E7A3E2353E9679032A029CE34C5DCA41D917659E2D46AF\ 062728E7D170FD743C1E52851CB00AA95ADBC2216C109523B605041C1C220959\ 16EF8ABAB9C471:\ B2414750A8AE2768688F7C82B6DB8C63:\ 04B8131DF59B53A0BA806FBD07EEF083 47621B4D2805AEE6DEF034678EEACB4D6C4395B39D8ADD4A60A9165E2CA7B388\ 0404B40AF1B1E9083AF8FA1D69CE83BC9530B67D2BCDFE9E36D1FF05D6FB6213\ 49FAF662C55F62727C447B35AB2336FE86ED7C4F3EA6880352EC6826B5E61BD7\ 2478941454973E3D:\ 95AE682E1A4A92FB00D8855C22E3763064BD8A771EB2AE675E0C676117AA425B\ B885C63E7FFEE58402170FFEA5FAC4B5EAFB53AFF6998804C6F99AB09821F8D4\ 2F8B7EC788F0E10CDA6714788DF679976F928349FD8E8F14548C1FF4FE9025C3\ 547E486B0ABCC410:\ BB7CF3E17CDE92291B4F5B97D5091ACF:\ B5D12B6A1B4AC6904FC2C77DF2A76772 358B57B91E90956DD981B9AD2F570908502F1FBEF230A350B324316FC52E1BC6\ E69A2CCF39990AAF1FCD59BC7B712CD1321F7F9915CE1A46D0A1CE9E3F500BB0\ D0F1B9DB3E1EAA8CB532489AEF8FF6FA4F6970D7BC8045E0BC9F304E257145EA\ 7A5828902FFA9A6B89:\ 70607CBE0266AC893D82198992E0EB8687B6787350E8797A96B16FBD8444A092\ 058810420DD51854E87E532BD45402682C9FA77ED1499CE07D6DAFCD5C15D056\ 000052E3D9403FDEAFC91C479AD9DFA313DE0C9AA3700664D32190348B29F9FD\ B5BFBAF249F10FF0B7:\ 2F5B82638FAB8E485826C4B65992577A:\ 5BD1063BED52DDA5D04D0F85486763EF B713EA5878BA973DB81463CBC2DCCEAB876AC10EF2BEF98F141428A933DC6968\ BC657F53AB286B28FF6E141F6DEDA0D0E708B20F17BFBFCC0D994B443A853A29\ 2C94A254A8055B713122AA27D079CD6741BF813DBD9471A8981E433F824311C0\ 295225FB9553A4038254:\ 4A8D9EA5DF1462E152F8DE358A92B7283723D49565CDACB3DB050E4C93C152C1\ 4063265DDFB76D46FF2319309169C2086A31D521BAE0B9B3CA670E1C2C033F31\ 56BB9350B0BE208A7D41101A0B063F71771E2AE2A0A5984DB5341C76A5091CAA\ A536AE7CE4695FD37B99:\ 8F4FCEC73EFFE3DB1DAA37494D1229E0:\ 82FB062F71C5984EE7A80643BDE0659D BD2C3B366C5480ABA112A5481AABC79A024ADD95F6FDED50B328EADC4109F669\ 103636F1C6DD7F1D57E307535F4FF3DC963C96A8DDCF51470FF02AB21FFE9100\ 08A8DF16EB2373DE599189DFF12CDC348D67A6F33357E86DFA5F813877FC1679\ 74AE1E835469497A682D68:\ 11CEE8C48CF3398082D0820F8FD1B200FF0D0BF29E8EA12F845EF999C1B4E9B0\ 938CE474755921C86DFF4658C29615F0A2D64179AF384FDEDB103B3B642D3FF7\ 99E24394BE70C9BBFFFC56194FE861B124C9A605629ECADA990CB736513C2843\ 5D1935E3145A3CC4BA754B:\ 7E3D876FBE4849C64A2E6FBD6935B8B3:\ 8699121F1CDCEEAFC4ADD47DD4822507 3E4A39011E58A44C9ABE3368A899426D034DB05E097060C01C63F0DE3149D0D1\ 69B9F185B7C38506AC7976E6E182DF704844F1DB5736821543E978B9299614D0\ E3027B7D39B4FD4034E3562D71C685FBAFDDC16D0A6C4DD1A5B3DE255ADD980B\ C2CA50B117CC6561CE792AD8:\ D5445539FA5E9045304A7FB13ABFE5E535AA8BD830AE8FA0A8787FD0497A995A\ 9E42A622B2D9C00CBD66E48A74C4C32CB4862FBCB38BEA626DCF65408D7CFBC8\ 2527DD709AE68908D14A9F0AAE118A7A90A94BF970F6E4375E42C377609C04C9\ D86F5F18109A8B21B22BEBF0:\ 4856224AF0495A558349E5A8A13EB199:\ 7E9E8FBF19BA323CB2B8060E79FB526D 0178CC505660EE73D385D55A680C13F66811CADDACB97C303D90FB9AA735B91E\ 025A5871125B1F8F728A1A4CE1ABF2B68A1DD66F72E9CB6A28B7BF13190EE5C8\ 8D68FCDD44FFBE340935B0F32AE0E3071554B94F7CC069AE0C1E465B7FEFB643\ 04B84B4548A2B6BEB219CA9C03:\ C43FEF0049C62915C5E7966A2D51AF66A61AC78A7E7725D007E41808C3BF0806\ 71EB8710CE36C78905B4EF0A2C4F294F702AE24D2DBBDBDA8FBB7E3DBC1EA0B9\ 7A884AE62B008770A08C909552D48F076268B9C14F94EC1BA17D504A63BB7B68\ B7D2A7C0ED2AF76CCE495287BC:\ 1D8F327BF9485ECF42100325FCA85813:\ 28C5C1D3FAAF5703E95EE78096C53022 7A8B2BF9414A0648449541D609CE1DE8D3E8060BF09F449BE3F98FC4D6CA7B41\ FB3DF2306B33BD700C767C99F934C78051BEFF6F21661F4C211A2AE7D8BC328C\ 57953B39E1B424994B0EF865ED752A5094A4DA28DB42F1D492435E7D4FB92B4F\ E61D5034921D0371B0DA05E90A43:\ 28261AAFE01C7FEEC442ADE2C7E298C09F7BE36D8883A3A81C8266523B8CDF1F\ A4C45B9C41E96FB53F8781EF4A91192342C473AE3E2B0D3C026803868D0978DA\ 488EBBE8282CC07AE95E8042C863EC66A73482481450B9715E8279D5D4FEF788\ 2F81913679FC022624BC9E800C9D:\ D84FEF97E5FF1A5CB866B8965AE205C1:\ 56DD14E0C72D31557A35F16D93F36973 459F416851ACC54284A9E82CB878B82AA6C589A9EF96BDCF18F47663083F53A6\ FB5596F976ECC5BB49078C07E7F31E68AFB84F6BE1C157E93A4D0D86505881DE\ A2FCECFE477BA35FCDDA2CD2B9E85194A63FDB06DB8AB5CF6C25CA323C09D6F1\ 14BFEA93CE791FDB588A068D27BAEB:\ D7E8EFCB3081AC49002FDC9B899FACD2326AA7D13ED97360AF2859F86ABA346C\ C7A230E0889269DBAEE7E83BCDAAB0274CC84B4C3353EF0F75646C5ECED75AB7\ BBFF646376155DB30EAA1CE5E0AFC3BA38D0EED7FC9EDEC2418FB6BD00E8DB24\ 8C07B2AC8C92D5696D1B26456F67DE:\ E274D29F8D942F2DEA0F2EB56EA4A65D:\ B060E8D64520B1F3FDD513421461DB88 2CC8CB49AF1488C956C3E065C6E4E14E40C0890BC5D0042E49F0B42E0FC54347\ 0D34C98A894FB31EBAEC18327888CDDDEBF3A6467DED49BDC7AB0EF1F3BE1DE7\ B6A7C0B63D94F818E21823E9AD75D4416C55848FBB6BE2A9F06190089E455B4C\ EC9B5E45AD86D93A31E4AA84508CF9B8:\ 16C084E323E61E22443BB67DD8BC82A4F42DDD86A187242802F4E6EBA7381D7C\ 9BAF5D439884B2B7231F93951AEF45E843EAE09AC7208D774B5F3798ADD4CE74\ A41508E0AC7D7DB8A6C47AF8BBC49C41B96DF51867BF4C650EB39DCFFC6AC736\ 5952C585CFECA818C62BBBB2A653D426:\ 710DF4F3ED2C815B98B0D6100F79F9C6:\ E79A134DBF61E5B7229C75C312F5C02D 4CF8A7BD22E0EBEB7BA5D619A9964EDF83518B08A074597616385B8D48AF8A7C\ 1F779E728229B69FDC5A8624F95C9B891FD27153E5CA3BDD40C7BE56D2A5FFBA\ E32CAF544B5BAE9A7A9669BBF1ECEFF913D037EF7DD016496C52199E3613314B\ D78084518A5661F42DFA7E87ADCE83C5DB:\ 6051562B133B0AA03D3CAD98E8696FBFC45BC457D7888DCC302EF3A6CEC34295\ FB6E96237B2168B8F7EC6566E49A28840D12A9B4A6429C57F2EF46A2B8F3EFBF\ 79252D86D7AF9C600AD4E01728791F349DFCF97E6B0C487CF14EA8D79FD72A54\ 88FCB6F728C5214BFA987B4A0521A22F22:\ 6B1E9BCAAC6D93564DBE4EA67AF7FE82:\ EB899146B055647A2A32798D45EB8DC7 0C78FFF41C47BA8610D9EECE738A4451CA1AC3267D9F6268AF5E8EBE432E8252\ FA8E378E0C4F0A7000C93B415249C66719BA3435593F216937E7F7DC64EC3E26\ B38055822175D8D27979CF4AF86B3A61447E29BEE7EFFC249483FC29815B8A93\ 791DE7A8E3182AAEC0A3ECC4C5945A203D5A:\ 56562246286CFB3BA6BD411A3009CC25BFA6CCDFBBA44BC90C1EE7B4FB07A5B3\ 66183C2B230844108CCEED0FABD01B15168F82AA9B8315422A5175D86DB2EB6F\ 452837F2C9D4EA7956D6B254E4E4979F278518617A1985BE35B71F80B6CF5589\ F076689E022EEE974F496147F29FE5810CAE:\ 641A4B7E4268220890E145488960C185:\ 59432C9E1519A223838B180634B51521 34B22337AC8C2D57B79208DF0CC4AD245FD02776876F0EBC5B3EF57A4E35BD52\ 2B8F8F3ED20F630F2C4C706845D1142FE636C69BBAF78E9A32C86F7ECECFF5BD\ AB8ED1C72CECF59E7120D6C1A1C91BADF25F7E2E710FE6A8C97EEEEFBC2E45B1\ 49DF05FD33C1D8B7A37F7A31CDC43A56409961:\ 8D4133BAC7BC2644BCA4E525AB21D57036DFF7CF713C4A80B913E0E0DAAB1EDE\ 268B7D2629CD5DA5E69DEC179C64666AF7944482D051A43E3008DEF5E1871A1D\ E6DEF3539AF563F42839F67AE0A36D1E18381C8D8A50E27E28998E3637BEF02B\ 409AE040DF719AADBE213EBA57B179FC5BB0A9:\ D3BC0E0818C1D968378290A948DFAD06:\ F9CFED1A6FD8B74DC354D25315A12869 6A70DF92C64A831F654DC3C347D12317441F012C3B34B62E3BFE9F4BC65F9EE7\ 7520B11A109D60CB5C97CC071504E900ACC32C85754CF17685C12178C40FF85A\ 453293404AFADFBC4369EE134AA1EA6E417BFD290B2FFFC5B244CBFF10008644\ 523D50962D7FA7779B818D20DF1032E0D08DBB36:\ 938BAC00576D4C6A3AA073F1AB7E06FF98F57838F17F7FFEE2BA079DF12DB2AE\ 79DB5225B274D943F90A1BBCF239755E2117AA9C7631AD60D93A03DC2D848E5B\ BD3CBAA245621B4E124AA1772BA423DD3D6B86478C8DE0EEA53B43728A299305\ E96A93FE337D06500DC4C19E96AD20DB495D2A01:\ 45931A0BC3F330A3390A1285121CBA69:\ DFA9D41C68B05242052C49B3F9476722 1B46DC2A194A4EC1D6DECB3B4EEE8B9E815052293884070A0CE77818BDA476FF\ 820CE494A8A620358E560E978BE89F6753FF625E7B9FAA2183E173FBE7B8EC09\ ED968733010412A31BE5155FFB5E1A31063CCE011425C2C0BFB6E7851BC6937F\ 324F8B6CD7409C14DABDDDE9D90054B97D01A9D030:\ 7C474EC6ADB6D2E9CC286690FDC89B3BBBB53DCCE2529FEE1E7385A73ED7812E\ C1D0C07558218889872793A7ACE8AA08C2AF2DA5CC529E588A26896E96F257F9\ 5779B797353B3784870FD49706C9F53C0D3F7698264B92E437435431AC793ACC\ 740A68B2096FC4BC696AD35BC84BE379F08C2B75C1:\ 2BE723871AF751A8F29FE427EB4AFCF6:\ 9BD948CAEC0C63433EABC81058FC54D6 9B09EC9C26135DD7E328C616BACFC1166CB0A6DE265DE3930EE2F6C2A2F17A6B\ 9ECB4C695B1D6195903AAAE922EA99FA72F2FCDCB4A0CA4691904809E9835D2F\ 87ED4B8485F2B1378A8D14710E0CB21223BF4A031996FFD9BB053597B124FE42\ D712369DF9E42662C4F353381B016FFB39117953231E:\ 93FFE4FA99138A95461489C915CFA41F0BD8E73DA1D02D6CD28B4516A1D151B1\ CEB905E4F4282A586A41F567D324D6D90E1814CF86E463CCBBBC20C7F4A95174\ 4CB375A621FECCC418FBA8DAC781A8E89E003B34E1C3D95313543318517C02F0\ 2544854305DB91B05CED444B02956E1ABD7A464CA158:\ 3DC16EBE791AB24559F9B2F1F6C80D13:\ EB15B43C7C1FA499E13972ABB38E5059 77D6EBCA61FC06C689515C26C8D13F7BAEF7539E63ECB3DED59B3A12A5277674\ 507A94EAB4F7333159929EE79BC000CD474AC416159E0CCDBD77C4218398C784\ 4A98B549BE8CBE06B7A3CFA269347DF9BBFF1C7E9346F6045548C922E1E5B961\ 84A0F5384242C404EF31CD0ECA6B5A0D3D1B825959F87D:\ 76AD0A59D48C62648DAA6AFE551A76D734EB420CAE0ED368EFB29ED715ECDF9B\ A06BB58AC17986CF78307D12C8477F7FCBE77D47D14700F998561F8045C4CF53\ C98B048E21C773AA68AA6DF4571C64084DE4D96CE838C103643C077E1CB35EFA\ 664820F478F4844312FACEB4FC014E4B8404B8BC8C3540:\ 62A399748E8768CFC4354749FE98E1AE:\ 9DE4950CA5BF39BA05EB3A5B867FCD59 8973F0C9A1AB4E76CC645D59DD60877081349151C5F39705D432C6AA3AC1AF56\ 5AF923F6CF1635919F59F28F18754462D0A63E909AF3901D0D4643CC627A3D75\ 0A737035A1C43E58BF43E90BF44F7B766CDAFC1001962DF30B54462DC1156A4B\ A34FE80EC38AF8EE0715A01F2835907D2C2341FB624909E8:\ D88924E63979C8990E1508D198C019573250A3FEF243ECF82B5C6F3D5977CE69\ 38A688C63F7D44890B1AFF1F0D82C78C21B2F2660E612093E161C5CFA9D02B0F\ 13C3689AFE54CB930370A24E8EC7AD90C3AABA0278CA36A14E938929117CBCE8\ ABB102ABF2CA46E7413D4DC265AE42FE513954CE88C330C7:\ 00D7603484E89AA807CCDCCAA7FCEEFB:\ B20E59D1782A9B2D156E82083F5F0AE9 6E617AFED34D6D72176C41071C562D462ABC10C698A3D30D7CCE1702669670C9\ EF485FB7239DB3BF58B0CCEFF683BB57EA7C717B007D19358517E78DA5BB9B83\ B336441F99367523E3824B842A6F58D8E4525D8A04BC011DBACF413F8B2FDE1B\ 2E69B59289ACCB6F67E8C74222FB8EAB8396DB82142C9C227C:\ 0D63C50EE0DF01B0D6757489B6124D16779A7756EF292C0D1527B9B12A9C1EDD\ F14CF75B9AFE7AFFE082916D44FF3D7FD5950597A3D3507D9C25240DF0959439\ 1ABF42D4B9F126F9CE7C5022724196878C7FB7D845D28BFB7E2B8063D9BF1CDB\ 06632FAF53B05CEDF1BFBBF7FD9A900893C1A1BB80CBB13B80:\ 2BC487B3F0B5849461A34EC826530DDC:\ A626101B94FB228B40D9BFE968B93283 8057464E6C7CA4832841C68AA8DAD0820D9B6F914B58152DF50D17DC0573EDB2\ 143EBECC208E15F85040624B1AC941A5739E36508964FB23DD6BBE4A869ACBA1\ 660E545794024D8CF79F2F7F47F7AD27132EBD9BD45DF4F0B4CB2E892F3B8F3A\ 5A6A4443825B19D2BBE1ABFF243050338A8E6A94E7299779C04B:\ 2152EBD90B8D0A132CB4A0FEAE79D17C415C64EF95C08D178B6D106860A1806A\ BB36ABA214ABDD07EE9D188C6EC64281008739C5ABE99341BEAE5F3BE8947EAD\ 04CF713DBFC3E808EA1A25721298083736851F618541FD740F5037977157B751\ C2C665AAB37B53EF2133416000861164309944FD2C7BAF01E0DA:\ 24EC777AD83D32FD0B3E273CBDC3D06C:\ 0A864DCAADFBCB0B21681045573805A6 9A1964D4FA2038D123902B51A09FA1A5EAA84B5F6A1F622E78F799D487EA90BF\ 44C6D591C5F1785628A98045DB7E5750C6782AF367186431B07C8782C1D5D5D6\ E09455079DD6DD1F7B0AE3BD3634EFF698A19A6D86D91143179A7B350A956DE1\ B44946BA9E111BD690DBB0277DBC2C79F5627E491C4BFBA09A7E91:\ B13D67461B776D04C361BB32202C29F576A082BD63A58D4A059CCDA610546D32\ 87992D6D62B72DDE8FD2C828C8CF40D4C8E83FDC28457510F90C3379A394797C\ D9375F139042116573728BD54F7A42B312813D656DDA88245318F957D4A560E4\ 5B395DECA5FAD456BBDD6EA37CD9AC21A87377D2FE18DDC19FC83F:\ 4C5C40C1DE409372518E3D2486181C44:\ 989F5547C5F79F05B04E40353DB89A76 70A6A74CC6C98DEA90BD6D18D8BBAFED2CB45F757184DACA942B1EB2728BAF94\ A245CF5A3F27FC8CABB9564BF803EA75DE2B62DDF361454823ED68B691A1C4C8\ 6A0361543B950FA9D67FF767C1DC20E384B7FEB48518D0B251553520E39A05B9\ 50A7BB2B44B7B8737AEFEC2A875FDA8B901E130B3947B65CF9736103:\ 1254535BAE8A3CEEB81C5AA04851A3AD15CAEB906ADBAFC93F05436619C037C5\ 9ECC67B1B4419733B9D5BA4323225B4BE11CB0347BB750E1B40603E23FD06736\ 3C616ADBAE85C1526FE2C8F11AFED5CECAB321CF97EB314B999AB118F098E2AE\ 1F89E56F13FB501E77C02DA692E49C8BBEAA1AA9EE97E7551756C2F0:\ F156CFAA28C87F157DC989170929E8A2:\ 94A82BC348B0AFACD194C3423AA8875D F5AD5AFB27665589C9F524176716C60BCFF9E3E41FC9F6C5E8B83C5485F956C9\ BA7BFD0D8742F6F391D75178E6B560C0BB32AD3701998697C23EBDF74CE4876C\ 9B1C89E43736653D6A0AC442B143DEED7F2C5E84DD4874E1854E676CAC32F0FF\ E5C0057F83DEA1BFF2044D5FBD4768D809A61FCFAF4A654AE21D233BF8:\ FD66135ED18956B6F07BCE45BD57F0FD1DE39935B8CEEE781988DFEED303D189\ CD49725F10BA59876F00569C1B7E941F3EEB21BA0E04D0B617C435D5638331E5\ 6EB7CE315C4FA4D875ACCD1C4B8660E15A3FDCDAA77398271E80DCB0B8B861B9\ 7A2E2B509234BD538FE0E8EAEC36BE2AD4CFC46591487297981769036A:\ 4E36103C8C67DE1AFBF8109D10BF10B1:\ 41EB43240037C71DD6D6B2CCA3261338 92233AAFE15359C0E59E8EF3595311AA370D18FBFAD06204346CA4F2F0BE6DE1\ D3302819BE77F4898615C4D3D887F3F0209E66E77B002150CA32709C91099BE4\ 20E95B5E753D6F5C0C09F67B0DCB5DDAD0842F6CBD3CD16A187691E24A7B2F14\ BC95EFC3359B80A2C3C93FDE2BEEBDB20020A3041F5D83EB5AE89FD09637:\ 7285EFB954C50E78998DFAD44F952F436CEB2C47D303DF1281CA8629145794BE\ 88B62AD6D8F35B00C308B321901C3EFB2AA32121276C64079EFA6FCD86F7812A\ 8AE11E99274DED703DA1DDCAD91ACDE50C3FB38900E07D4C1F6B74CD6010D6FD\ 6116B9BFD956BF0A3D391C39EA314236E14DDD9AEBDD03C1CC65C6337348:\ 11A8AF11A03B80A71452973CC6664AEB:\ A46F37AB9C79CAE2C0067913BEAEFB52 9A94824C6C3551364320E09FD9586C515AABD15AFCDBBE31C2AF0E7188BBAFF9\ BD249C3892FE6F4D16927C1B65D3106B3EA4977E1A1DBEB0F0BD88ACAC7492F6\ D5834DCAAA12B9723DE2CB00D634DA187C15DC212542C7B0D495FAB7ECADF22A\ F95C4CE4E762D18EBD4673F2A2AEA54F43D0048C80A907CB609EB3B3FC5F1A:\ 9F6DAE40324E5E369817F79A5B4D57474B75C5E9EED2A7450BAF7A5E94F1DFA1\ 194EC919030EC853A7B33BC1D3D5C0BAD403102C5BFD76383A8723C73E88B406\ 5267E075A5A42665384B1336E7435C36BCE4DD98B220D42770C6485175707427\ 8EE9654D9E9798F73BABA1CBD48C80178332EC159A5BBC7009D7D627FCD37C:\ 59AC380799FF7D4A6126A445ACE889D5:\ 18FFB0A05F2FF079D89E1D36082A4579 E71039961AC14FCF7212ACA932E1C6307696CF7D98A96048D888CACE6B95A32A\ 268EF802CD311EDAA92D96019938D7F6D1E12C70306A1A893341F610D387248F\ 00A113BE0BA43CE254B0958EE5DDCF10BDE3223EFF0BB7FB71C833A7A3AE52F7\ 8E00B7A294A23B76868A53B74737E23B93A7B89F6890791CBA7657715B9DA9BD:\ E411BA4401573E11E51D6D7E318D6DDCF23E5927CA429DCA57C419BBC391CAC9\ EAE01A2384F4705EAC94B06F151638BC7299DD8FF570404363430E9B06FFAABE\ C5E1384485E7A085AAF6E2692742F7E9003B18A4B9FD5D772EB0A326655F38F3\ 9B2D49035C484AE4B4F12B14A7BC74A1F0ED2BEC9906E45C22C085C04679DB62:\ F1E297E1C4E33229EA69EA943BDD5C41:\ D43BE1D1871642996713B6400DA4B0A7 [TEA/CTR-BE] 0779B5A4D94C4B572257340F8F86FBDC5AE955DB72E588CB3D8298FE27ADC668:\ 6D787EAE01A5D7946C8526B75BAAF2A8D1F13CE4AF93E469A21B7C53965A1CE1:\ F580309FD46FC90ABA15E05AD82078A4:AF4D336BEB213C0F 6DC828712ECC5C470541DF1602B85F4007CF93FC070CC7762D7956B7BB549B6372DBC08B:\ 09DAE7B36CB22B70FD79C64244E6E45987B5F7EFC8CB0B8E3CA9F43764807BE1027B7BB9:\ C86E8F484AEB12370C20A3A0EE5590BC:13DCCD64DDBC8E41 5B65BD1306636A3AD2E0022E02E85269F20F76F45B136EFDF4C899F8C9656129B4CA8046\ 2AE80783:\ E89A69E8F2D8150C05B56F2A4A944857B645B16280612F58FB89B08EE8A20EBE11C862D3\ 9A1A59A1:\ 4C55B486E92B56E40276A86483AEE6B9:3967D01A6CA67F89 311BD2A8AA6E97C4E84A3C322A53181D72A6C189C7B1FE6DB283BE9EC3193EA91521C1CE\ DE7304F0DE4995EF:\ 10C9482E1BC5FC5F3E0204D721A9840ED5921483104A783D46B376E9B74BCAD25C5C4632\ F523CA72CC6733F6:\ 2803FC9BAF7D0373B2D479046AAAEDD9:B91B7AD2875C1EE4 55243E865867E2281B3DBF43521D984804AD038D8A4D113DD1E118358EF1366AA82854D8\ 7DEC5C8051C9915F685F55AF:\ 02BEBB951E42063A106A0797227CD7CD037BDF9FCF2DB5405645B1CE17C0D6C36A361109\ 7B9D74599AA5614E90BA6046:\ B45B330DC5589E6AFFE1A11C09C4DC30:04F4F13187E04998 37B0677F9DDBD8DB1496F75439862C17100C2BC735087B9A0970DA487DFEB9520B2C5B22\ EC089777A710FC7C5EF5B7AD83199993:\ E8DF3BF04F4EB8209BA30532885CB16F4DC4CFCC9DAA5D195A8F92BCD9B41ADE5B7EAB7B\ 1BCEFED039E3A3F8810C2B34A3E3AB24:\ 9344248E661DDF45BCB9B6E529B39431:3444DD3711244051 DB572CD1DDEBF0C06AE910471B108064A73851F460F3F79A303E463230162B99452DBC0B\ 0BE88A17765D4E317B04BAC5693A5B2E5A1AFFE8:\ 19D1415407B422F155D1E8EF9C99F2C77F68B39516D4CCD3AD020A4B01A64244FC0E3012\ A19FEDACCDD64D948372A2D8FD2F7B7BBDBA8CD6:\ 215C4753906EE909902B163EF367BEE5:A9C40171E5946170 98E56143F834948EC76D2D3651787E8B6D1959FBAA1E4A8A8917091E626D3A7FCAE23E59\ 726A9B7E6808CD6245ADAD71EC52EE49F8B6983AF90165DD:\ A2F29D9B387237DE529BBF8FA26704D4246C68F0C71FB986A735BEFEB239DF8220B3EE66\ F0C8BD4B764BD4C8DA951BF3F0589315F5AE3E7F172F3F17:\ 63689A7EA77EE56313EDCD9092EE74A6:4FC29C5D1A03780E 05796CA4B977B4D81B3F898ADB404805F6418425C6FA44C77ED6CF8B3A5C6A4D4692A3E8\ A1D0AA88429C73DC0931BEE46EBDF759E16C975D8528EBE66092C686:\ B8AB041041D2E9E48909A193956F9CA68D6ADADA5C2EB9A6F6795BDB751E704B2F9F3E6B\ 5531F2A2449C7C710367B4BF7F0EB293FEAC04D3C387B5C3D4F1F2FE:\ F6DB0F1401BF9E04BC31F0E5AAE3B6AA:FF0415F250ACEF92 5456E7301B77AF7E4E571D7A542B4DA79A6C3E198E29B973DD482CE44EDAD6C8BA2A7C6C\ 044B9187C0920BF626E55E844C8746F8FA3748DA84A49D2393AB68294304CEA2:\ 86927873D7469420C6E817A1A9382FC03BA4DFECEEC08400E3B0995F1C695D2599B3612D\ DE5017E0B2422F233C86859CBA4A038D2F9E1DD886720ED63365A9184B1EDAAB:\ CC5B8B7E1D9877A5845D9F2C4070061F:EF786B15E7F3F602 E7CE6B54133D74C1D1F6370AA96F6993354E1BA145221B91B689B5A759F808D7861A7384\ BAD3A192FDA08A36E9287B20188DF4131BC2D47457FCD3705C0D510A565A6E7D8EF7B22A:\ 3F1DA63F3BC4BF2691FD10D71CDFEF4FEB29F9E3C918C432AA7A7BC8F804E693B0A25F2F\ 935F9F9A8009959A118884E626F23FBA1C624CF719951940690C890AA05E8C87E55E3098:\ 899D47EFFEEB386DE8342FE3A3242FEA:CE412E40677E5BF0 F2369B2BEEB9FB44CA09D59D3C9A22E107E960CA7588066E9B95EE6926DAD5E91ADC1320\ 6AFEFDBE39DB95BDD77655C132FB108F4721EDF687CEE1258CF5C43D60F8EC31D5A26B02\ 2B925EB2:\ EABC0FE834E386A647EBCACC5FE48308E475C5DBB7D18F404A83F50FC2F93CE75E4591C0\ 334479B0A9920CC3D9389CFDA9E2D532B1C491B0F1F3057C797AEDBAE51CCEDF72023556\ D98868B2:\ 08C7C0A9B04684B49554E83499D2F277:7D16029BCE205DD1 2A101F89BCCEE248AAAF5EB65D9AA97240B9644FFA73305AEE2498A085262573D23783BC\ 442D6C296F126017403421AA5AC8E4AEE44E020DA81BF52DF9D0652E42F2768F1428C43D\ D25E63E2B2FD7344:\ E70DC7AC1E4A4E1461F6DC51F64B0C236F3BE15D5AAFFECFC1D094A4D69063E14EB4059C\ D14481A26FF7DBC6BA07059856C2C764338B07E1C961FA56275AA450929BF62399B42362\ 9565E3E7C1DEB293:\ 9D923AB332BA365F20DA39217C7D1650:49B9FB1F976B6EC7 375D52ADA62453CC4F83B43BEC349E85119D9233ACBA7328F3009041FBB9E83DB788B79E\ E543D93859404A91D0166397908BE510D0FCB58F0033D3884A0AAFF9348E4E3825E3D4F0\ E8B7D592C7ACFCBA11C2D9F7:\ 27F658DDDD613482AADFD44E832C372665EC2001697602A274D84BF3C2C76A5626D84C8A\ 80306E31FD8748256FBA279732AFD0CEA0102EB103511CAB71458F881841A3D49A43D450\ 558DAE85159310F67DB2B747:\ 7BD5159E4DD63ECF90DDA801DD608104:7A60E38CEE806006 F81D39C6A1A977FBEDADE7F2A1C516FEFED8621E0C3FE4CC01DDFC4035EFB3F2DFD468EB\ 8899C9368A4DD48327EBBE739E6A68B063BCD5C03A896B47C1DA723A5AF8DA8629964D43\ 73F38F297DA5FC11597E0F0AAC6A328F:\ 84DD988BEACF8442FB917A80408164008BFED0C6B66A05E5EF5F46CBF5C126108F3986F7\ 336E5BCECB7F4645FEEE00F20511C52A750029CA31D869340170F30933E92A0DCF703EAE\ 3A7F15AA004D84358F76C4D3965E67C2:\ F0DCB57019B3CEA07D6F8B81F8A974C6:FBDD2704EA4830CD 44176AC9FA9B8502B675B559FFC21164366F73BAD09982114F21D2CBDAA15F88651EDE4B\ BE5B644EC78B375ED58DB3A4D814A6DF7563F282E8FEC7C9965668039AB4988F6E87DC94\ 13AB3367500C6AC1ED5968E5B31F44F176B02F7E:\ DE0DC6FBA50CA8E81E265781993875746F2C30BC80F682F085C644C162AED09718D09B5B\ FFA421F8B26FEF78F222D55C5CFC71048F805393377AFBE94775057B432D712CE65B62B2\ E48A2F973D3882D10BA56AA3DFECD37DBCDD2D57:\ 92BEEED6E43A5D7A6F6211C85229D86A:6B0FFBA1B3FAB3D1 1788E3C83C04ECE0D95D27BEAE329CB99D5E84FC3EF4A45575C630C8B946365467386261\ CAFF1FB8C615C840E6EC28FB0A42C633B373F5AC79C32FF90F4883E0DFABF01963C78681\ 70CEA96A30B4DA4BFC1107E31AB53D63A9543373E505C779:\ BC545A4E753BF6BB554B13DE4CD53644AA7235F2593BB0B69B11EFD66B3CEC201790271C\ 83138945C5A7347635F788CA0883CECB6BB4B53610A64E384F769F6591D962620B660CAC\ 0A587FE9212B5A247001B5439D62E144F91608CE39756FAE:\ 2A70897594FA8D00C8792ADCEB16BAFC:530C2B6E298FFD38 4C8E284F44D41B80818BDB68A8D57BD63F267BC0888CDA54AA48386E32C561BF8E3B370B\ CF9615A74659846F476DD0FA6CDEA8FF11FFD3FE7D5BA8590CCC66D419E9D96ED3CEE7A4\ 6CF559345FFE61AAFAE1ADC3868E6C9734AE56B41E35B6D8A2316E4C:\ FD08FED590AA383CE472B91572CF6E2244A897AE7116F0821DCE23223AC1DDC28207EB5D\ DDACA086188DC78FE5ABAE43D3FC4F0F259C521EC38B8DC0BDAAE7F80B7B27DB75B00E35\ E8A88380FA5205B002961BC6F1A4E81BDE84F7A3079F10F8CE644588:\ 85EDC49CF905E1EE9A8205C3709E1304:82E743E483BEC9F2 F33FE0DF117BA01A850C2DEB6EF8CD86CB65433ECBB079FD69831A06096DDBFFFFB1EA23\ F18EB4B4F397F51A5662462D8DC8DA6BE49F9DA578A90E12C8CA33F4579BBA602EC4F442\ 2D93C5FA8E8EC2C9640C0D3A0F0201A5F3D57DA94A163C25E185F5F4089F68BC:\ 17297C6EAB5EF458AAA16A1F0D7A1EE3496CAABBC623F2127307EAA81A78A756E4373F39\ 1DA290357927B703EE1F0623A3FF7101CB78C3525C059BFAC4A3DF3588021953445A521E\ 415AE2576948B323F08E3CE108989BE73EEF7F00FF01C1C587B312E5D80C0D6B:\ F207A0C6B1A66ED1D50D256693DACDDC:6171F470E638F864 59170FF4B0A175B7EF8BC2B2E0AB81AF6C994FEAACDE9D255606A1DC476E89980A092763\ 2819B55DE0892DD43F0D7CBE5C4279E6251BF5296FA03C8A2F0260339BCE64DE16155F31\ 97792C2379F11D102A2F7825A97A03D6A62C85C3A1C5BDAA18E4BC25F6C0BA43595D194D:\ 64EDCCBCA6BC3C6880DFC6BBD62DA90084AD8CEC2A704A7FFBEA8751F467BFBB5DADEB43\ 039C6F17FFF1EE87844C7EFA72A2EDF1EAA332CC4F281E5E813672C7A7AF4F85FCCBCB1B\ 0AE11F869382015D7DCD676BD4B482D175A5AE61730C5A29DFE7B14F7549A7DA12579667:\ 358CAE6A62C661EB1B365BB5C37CB744:4F8E99D3BB7E3057 8FDA3A1460325CF70E0DED926596E870382B6B4D99FE89E86CDB6DC1B25C82C5816DD622\ 980FFBD4148AD82196865644B90A6B282DE1B92A99CD2AE0E804FB330F95724CA5B45A2F\ C57B0926AB998EDCBB63E61E8673FAB199C2BC83998B7F43E8307B57222C4D76CBC606B6\ B4AE8D1B:\ 55E3B003AC093190C81300E08533A11C4C96D30E3DF4E030DFBB1D2BE741A8F30188398D\ AB8198972D85B44948AF438D6BBD9F47CB1307389F456F35238B1901F03D8FAB0669B66B\ F7DC10619D5DB72AFA4990F52FEF4F96576542B55251B83E7EADFD984DE5554909C89758\ 65B78A61:\ 4ED8501303B4D3F924D5C7C4097E57C0:2B3A19E6E2EB6CA9 3599E1DB61A7B8E74620BE5965CB0E160A69767048BE47083BDE3FB650D0BAC5532976F2\ 5530580B7EA047A346F5E8D413B07CA19928444ABC3A94CC52C7DCFFA3CE402F395CC182\ 7B13DA3B33E4658041E2F7393D90C27D928EAF9731A5054F289F736429D6644FE7906440\ 58309B8607587B9D:\ 6AFCA1CE267A3A90C6CF0179699DCB96BE1C42F0E7985C2D4D8D725C5FBFD9F6996DFB59\ C0A5BBD09A58418E1151C1BD847B44D58384837E9594E445CFD87F8E324A0BB938838AAB\ D0A496DDA178C927810E674ED0E36D257EA79743261F555B0E04E1524460DED8C288D71B\ 330F5AB0A13A6FBA:\ C8378142EA256625CDF42F9EF7DCB2BE:7E12641A0C703137 7B902233AF687EB4D0B8711FAACBCD2446038DE3F41FA72805BFBE69E00DC9AC5936C848\ 1539C1E97DABB61CFFE9D492D758F8D8DDFF7AE764DB8D4D946CB3207123A1F95F7DF76C\ F0BD8B276004C9D685C93D123B407A78BC8342FAE45D91B5DCEB7EE5A2EAB15CFA38F4FB\ 3586C45E7279DEF3A5376CB8:\ 5554A20E71F2C86C77A13DCDB065D01EEA0880BD648F3C17937623934C7EFC77B37733F2\ D1E96BEDAC273954C3F8301A749D14CF74AE76A9CDBFE559AD9643BA818080E1D8FAC761\ B45B48D0E19F51657115E8ACFD6E81211D890EABF55E06946CB90599005B535A6D274E22\ 1F7A697B92BCA34D1F09FAA7:\ DCBF96AF1456108A9B9227ED94CE806B:05C03EFCE65A8210 A226BAC3B9FAB88446697ABF579D5332EE60985E2EA7065AFC56FF26C16CD4B944C7BF3D\ C3CEF4BD9AE3000F17CB304B649D3A30776EDFA7D067D439A5990F2B7BE3FA5A6447D22F\ BAA0683E7ED683707C30557557E2291574A76C68F32BFBA14E2CDE9E1FABD5034FFA38EB\ A9A18BA405412D3CAC48D0A6F8B5033E:\ B22F813952B9667C95028571AD9F8731A41617A9192671573DAFEEC9821B1A82296C8BCF\ 6DFDFE16D31F2AEDD69E9B18E8B34BFEF7D08FE47466AC0299F8E08922E515307E284BCE\ 85E70C7BBD4F7783653BCCE054BB82A14EE89EEFDF53C772273442576D37F90D5E2E14C7\ 0769F2F3ACEFF8CF1E71281D4172BF65:\ 2B4B352CF67C87C3397A3CFD44E6758E:C5ACF3B41053377D C85A0F50724680DF59E0AC198F7412AEE6734C05E53F6957BDC33A89E40DDCFAA4F1E211\ C1E3390EFE49F299478DCD9026CC2E3B49F35E893ABDF851C39F76ABCDF9B5E3E4FA2B52\ 0966A4E1AEB36E8EBD1BF5DDFFF64C9935E89B75DF0D78D1B54D9FA6F8A87A8A47215915\ 70B47E091B016A381A3E76B3AE92EA014EB03905:\ 13C3BEE2154D3C4A9109B1F3E0D1D21CF47FDC283A7ECEDF2338FADC4F893896A8EF03D9\ 98EBB98FB732FDD1B11061ED6FFCE2613DE72AA898931F4B5471BF1B96D35FA467629275\ 5C1B77AD5AB0345C6B3E8FF05F7EFACC393762A075D36E88CC5EE1AC3709DA398E21F452\ CE9F255D93BDF03AD42444C2ABBE0211C38F9F84:\ 81BF9C41D2404B0A468380F8CEBD5996:2EC2328185E51927 EA03F0920CDB09256BB8D2DCBBF5E0F9C14FBF0449BAC0AD02BBC6F3C5646FD13F2995B0\ B6E37B8BEFC5E85DEEEA696E4DA351DB87D694AD896EEC2F810538CEDAF434931E6A69A0\ 19A2C73C3309FE7FF028D7A8D387CEFF33A63C4FA3669B41EF3DD8D7A0A923B4AF8307E9\ 072C32020B42D4CA2F6933486762E8E3286582FEE0F1636D:\ 847772497AD58F8AD957CE4B2D83D16C8F6F0E7A693DED94B7D1D11832078CBBB9783AAB\ 878CC9AAD7CD731E74D314DE0B9E9B9F65A279C05ED1382D26882F8BFBF06192E587CBBB\ EB2167B96DFB3269B4BAC805288365849EA703E56FAC7F13805AE140E894B8E684642E73\ BAAC18E7F0EE1637FC17C42789525AF0DA8D10DFFD7BFA53:\ 5A6F131AD458C1E9B3C004109CC78E7A:FF6CC874B337996C 4A90541507A87188EB104184D464D1A04B622CD3C706B5A800B57BEEFE5AFCA521568626\ 7D2BB696F64F4311D33A83C553022C482EC939A77D6F2961D668625E214AA9081056643A\ CCB0FB9C67892D20B674E5AE2036214C41D162C7B44E453F87659943088A8468BC127357\ 41B2F3E7F3DDED053B73377E9E9CE47EBE52A4FD503245CDCEFA4919:\ D3489D41497715E8CA4B828E86A03903AE435C170FC4DC149D599832EA64ED7917F30E45\ 91151B08E46986FD94C2983AF9713AF602DBECBA6B9F9692AF43E53A3A04AD8B8E33E846\ B95C8CDE80AA03D46C923137938937FD7A285CF322D23405F2FFB8C836B2CBA663C4967B\ FE61DB36860B6B741826BA4F22E5393879AB76330545BE2B62389491:\ B0221D669075C7DA04EA353F6712C7FE:386BC7C0AA935689 8C52A4AFC465477D059AA22CE8CE343FF273987F10B249B1A19B6F95A69B0C82F122B22D\ D4FC9AD3DA4AEDCA876DBEE1AF12101B5CF065EF20E2EFA1B50349659F77DA6928BB5108\ BD9226424CA31C7ADF49C4F738F013AA5A55380ADD25E840A60A5113B08506D71B702A45\ 25DF234AA0BC459222879DE4EF24B305F6B6E7D5702E3EE7320D5C1FAEE2AC70:\ B054E0553AE9BE63A3315509949DC984F145DD24B152E6FB15D712067AAFF77733F7AA8E\ CC4D60E47E4CC1305BBEDD7D572ACEBEC9FA31F3E701E2DD5885C1C39B371B6582D14AE3\ 2D31BC04976E3805EE3BBA6C727A82C8009C1AE39F866C6C5C4333498B32337E435EDD70\ 0A48BDC28A7918B8DE08E02A6CD3BA196C7236379C12AA86FFFD0DAC3D7390AB:\ 5771D7A711C92CBB93CB776D54083382:7FC654F95497E5AB 18AEB9393D3A19E52A9F83E7E419C40E533CD2547C186038B315787C3F9616CE14A5A022\ C2718D35CF6B54227C4E496E1552D392CC060B87E843313705797996CC5E73BF43141BFC\ 11452B209BE877D7ECE2A7A4D4C02745179B90D5E6A205ACD8BB01405632D1813E31938A\ 37F43165A1F1C5AC87A1ABD8A69AE655D4FD70DB124FD3420D700726705224533C9F6713:\ 51E70E5CFD39FDB62418893CDC05469738E3E144E4915064F2ABB82F0DF1D1147AC59EC0\ 01A5EEBC6763AEA4748825814E4CB5A90B271007EB8FDFBB867A9911E9DAAABA4D692B1A\ D9AE2465210037A18E64A742D831AF8AB925B696DC0D18F45B80C0F6A46A07E3322E26AA\ DE193F64BC2BD998F819C440CD47781A4DC21B831476145093319BF8FF4C00FC9E33DB25:\ CDE4F850BA8D7F1C9114149084656B49:A6250EFEB105609D 9DEB4E27C4592FD5DB48D3DD21DE22342C3F6F1533F288D8BBF3FA65E67A66854479737C\ 03F2FA5C40E0001FD84D9EA4604594CF571F03BBFC06668D12DF9EE61CCC0385B4532924\ 3D5A5D06C19791389E89FB54A6B85D005B64C08EEAE5FFD7DC1C9F1DB87B5C55D06FFCEB\ 1C9BDC3F78E5CBD67E06AE24500546B17A756F9A1639DF24AA77CC53B6893A31D87435E3\ 3B1045C2:\ 44C52C48BC865C5FFBFD05C2B27C4D2B69F373CF704A2E91FB2CB0D429B957A6EB3089D7\ 9182311777705987FCB9D8539BB2CCCFA1FFC8D49EBE6820D01F10597315E46985F4B4A2\ 160FD97BDE4E5F5C7C7441E06E089540788121B761340DCC2BA676670432C0B0C712D6DC\ 3B565B25AC5C31177A50499F716522CB5ED67E9EC63C73E6FC6BC68B0C5C7B4102D4F59E\ 79439CF0:\ 44738E1E4B7A442D209F2661FBDA824F:6CEBF2964385D443 15DCFFF177841397C5B02A1586B9EC69250F7C397DAA9C0C2B172234B18072B894ECEDB7\ 6F839878EBD358AD6AB62D387456AAE59D865969E9398326B140B1B16867847F0BB30FEF\ 787EFD2E7F61ADBBC9CF13A519DBA56907787269D5FEB735F88A4C6A313DEA440C4FE07F\ C374E01C83D65CA5A26631C745F35875BD58890A066F82F4A46846937792C9E893C87856\ AABD0DEBC110AD4E:\ C8065C6F95C74F52907EF0E1409608E15C1D9C97980891B93AC41A6100080658C4F84FF7\ 70F0BF240B653B60A91796AE3996C449447E6E1E19FD7C48B8A6C6481C2B5F59262C895A\ 57B4C65E0549DEF9603FBECFEFE9AFA60A26A417D5523B7E47E5C04F07323A88A447803F\ 40CC46D57ED5ECF43D6F1A1BF48F03D0D56D7594B83BBE856A476E9A49ED457A1FC76314\ 0EE67FE5F77D0769:\ 7D8DA95A23D6B81028BB069A712AFE2A:278E3C3D1962967D 47743B5282C40BC1D37C6842C7DAFE01D49FEEC11D27D212DB0FBD852712416CD392ACF4\ 1E1A5CAD44B82032FDAE4E94BB5F94ED0ECF20EAF9C68B49F9F0D0D3A49A377C18210130\ 44070654606CBC11E69959DFF4E975868399C4BD3A3CDA32ACAAC037A8AF3155F8D20AA2\ B76285C6EEDB5AF9E31865BE1A86E5615F8E0CDA4F0DAA44DD3EEB1360C262429038E8C9\ D43054EEA4C67E9C26504FDE:\ F7081D26253675F37E0E644CF5FD2E2DF27B760A57A2C9753B2BCDBAEE6EE70DFD83680C\ B1B4166DCE85F48E52943A3A7E83969F4D674226323C12FB306F5BEE80B96A8BF99BC497\ 9753465E587E9FBB43BAD2003C8DA5F99CE06B6D198D024E7E41576539CA2176DE8C78EB\ 4926CFA264C108A153724F49E38B2215641BF885FDB366FE4975A6AE5B5C9DE89EEBE3F3\ 6406F0169F09FEDC9D582656:\ D798EFF93075E16619C04C27B44B7710:81D4628D9577608D 440DFA2B6F45BA97928C07323E7639678ED1B247376F8B51BD5107BC66538ACAE5D9F692\ 4B9060AC5CC37D360F951D81CC2680213B48BC1FB392235D9E74076BBB1A7277E4B4CC6D\ A3D8B011A31B92EA82DDEC54E3A982988E9823F343E6638A6C8A8B4F9FA1020A81B7B707\ 776BB4991B5C7DBCC9BB9D041154122FAE8F6690675826AA20C251B29EE5647B160041C5\ DEEC1B90BA21207B39FD0A657527D480:\ 6253441E82759549F5791B82541649A09600395E37DA34BBC9B075E084C1C027D3A533D3\ 1187C4F0F3FC26A2DACA5F10461953F3F2D8A0C152A367C0E2B99DB3831FB9691C815290\ 2954A26C0D14AB3B8B7B5DA82450FDC4B37D6904F8835326D35ABA9431F003E867AC26F9\ 170DDA423837F657E908493CFC06944B359A42D1761DB68A6A61D9EF03DA83DBD0B4F69F\ 020FDB560C687377021C09977BC8208F:\ 831246376C66B8468E7A6E6E897878A9:9955251D87DE0D7B D2F7A97B171A9C774D0DF23173044F51282364ED0F373E86EA57C6AA726F313FBF49DA8B\ F30411F4D85BB62CA06C577396C0CD74D8F43DDA49EC5AACF46D9D3C20F68FC8E36FE6BE\ E147040811CF9C6EE80F3B011494C828B6822DD83F635C1AE32A115FAB35E5A7186942C3\ D5E3A25FB2A2D18D877994DC2F2066DFE5873889978DBC5E6686F24A9D4F69AB8F7B9F19\ FB723D39982D2C22A68E0D526B35C3782518E721:\ 4B48E6C50D37471DB4D311A3303722020E874C6A578E4CFDDE95C44507906ABC4FBA603F\ 0494AD42CE4A660BF4CA06BC7FA1084DE0315DB0C85081D8A06CB823DC876930F948D594\ 020092F3AEB703F95DF7BC94DEE275572BF9D6D6A6FC51AEBF7579F0CD49369A8047D46A\ B9E47B8D90C4EE61A24536F638987E4D343E2D66DEA1FD670CA98AC284DEA1FC28ED522A\ B1F5AD0581357300799413CBE6A78C9571B134C2:\ 59C571414163AC80C5856A8E8EA9A524:9A6C05BA3212D92F 0DFE5D7CDEF8C0EFA80C66136189518199FAC9A459DF9FA5369D4F1AE4E3938DCF790F65\ 939A4D8E27CEEB7F7BFA098607DF2C300D61B00E4821B3A52150F5C38A9B12983E0232E3\ 05419FCF9D01628CB18D22C88E69091EFC8ED328317894145BD9C7488EBC4C7DAEB5DC9C\ ADC240CF47B1A0A6D720A8EBABB78A2BA0193F2C1485C77DDC47258A8B9E34A4F4066C6F\ CA22E44AEAADC6FDD6C398EFECC6014662286D3BFB339D2C:\ 248E8FED5CED6F9FE5BF2F5FE9D668757A222AD0525861FDF8DC86BD52C75AAB502F3ACE\ EDF16448107C65CEC8C462C50D9918C7CE84CD7C1F17BC16625D4D9CBA7A335E8DDF31CD\ F86EB9A2CAB4E6D46136F05DB0FC7E9811CFFE1DFED75A1394860731187B3F4D053BE3FE\ A79693327F6ED98C40277D747D8601447D5F02401C0AF31DE0816310F81F83683E405AA6\ 4CC47953CD922ECDE6ABA6AF4378BE5691B78FB0C2918187:\ B69C5FBC4525445638D618F669F82347:346955985318F429 4A25E4F0F608CB42CE5E8EC7B48A822918236B42D074D0D7C8D1209E4F68E4DDC9F90B25\ 4BF967FAE9058DE032C1084A1BD9645B7647774FDE927DDF1776D5F829CA436C9E8F5D6B\ 4689B592E7EE0ED9F88C12D1C6F30165406BCB2177859523855BE160E7CB477EC73AE50C\ 66F827563B4173EDEEB4AA6DB82B3AFFD9E719BB0701AC3DF37AAE2992348F33BE426B85\ 151D7581F1553A0E99C339BC407CBBCD3EC9D603D3F9E7110CEC5A50:\ 89A0DDA3BA5012B8D10F97F1546BB16AD2123FB97A8DE83EDFD42222EF62A07920C93B8B\ 3A123F5CE5EAFE1F9645975DDBBF031AFA61166C90E2A5677A07590B483CF6FA9D1597CE\ FF8734A3D9554AC4C946A4551EF8698CCCEC3AE7142595D3130AB2712719595A6A143856\ 53DB4B52FA784D75869926237F43C8077732A4DEE1C66220226815E0E77F868C68AF4268\ BDD89ABD6DCCBE42CD2CD16617467E188D200517FDE85989BFF9A751:\ 14388CE990670FBE1D821E677B829621:E13F97C3B492F94E E0592FD880C54A90F4A3FC3F1057712CEBDED7CFCBDC017C9ADDFB9714C044F1A5AA11E9\ 300F9DE1C15F8368B5DAD6DDB87BE1B6B2D3A32EE21DDE6C1098D2B84787E12366B8734B\ 37130D010A91A76CB6CB153EEE3AB7736A2D6EA3F6FC6072870F5EF351FEE32777CDA4B7\ 936A1062CFA69CB94405E1624E2D56FA06CFF4D31616B20FEECC2D2CEE58C81E3DD0EB56\ 3EA825C87914C1F38FB9AC35C04812041F2D81A32A9C8546ABA9BD5AB6E71942:\ 003770A75B796934A5C6C8362381B47E9DD791DD860AADBF9F71D4F76D648D210EA1F16F\ 513FE403B0FC39EB84354F585756E95E9C114679A1FF6F90A98434110CB1EF5FE540280A\ 6A82C56855E3A0C83FEA2815C4BDCC22308DF7769A22033F6B2C91ABA1F6BA83D03CA788\ 2EA584E2C2183A1E74A75F1E934E3E0ABFFEE26515528704B669802FD6CDE0811B98BDE7\ 120BE82828E0E67837EBEE0DFC30FECFDFD5B4D5A251571DDD8A42E46583CAF0:\ 8E0E06D39EA04A2ED224FAB12F875169:4687DD18DF082821 01A8E66CFBC585451DDC5BE634C7C80DA329D3DF16239DE9EDE1B6EA4EC912B5106999EB\ 348DF1009AFD0ECB16FF5A7EE023BC8C4963D52FBD8BBBA5D99B0512D772608746FBBF36\ A362761CDFD5DBA5A0AE5100D0FE1AF4EFF576CB1370A4B403DF7B06E22DFC37B1E1AB6E\ 1152E0DED0F1B5867CE72F924EB3D5A122EAD315C7EF570DB199DAF3042937205CA05E22\ C101527F9B9187DBA80461DF3A0855CE0D32A80255DB81327849901FF16061A52BFF8410:\ 0FA83C7A283B563AD3A1D91FD96E5033EE3BD79C786E6398504D2B152E8174BB1F743D2B\ 5F209A7792E89D24B0E91F9A8B19FFB2AF659F0826C743E85F469E31BAFC645EF27DF183\ CD7AE419ED8D83AD229D9CAC3C67E8C6F3B722215D24793B3AF04283A17DE3B36E34BD48\ 309B2C8DFC5A4B55C0DAFB7EF0E40355485B89C381E9227A7080C2353D05E2E97F58EA41\ A72E3DABA27753D44EACF8B9C03F21FBBD96D5DE4D36EF0EE7F8E554E1B468126F5F3AC8:\ 282452A3EDEC7BA6850A6DBB481F18F0:AC2FC317AE3C2DE7 525585F116281D04FD8C06E92EFC21C91E936913C1247CEE67727653974C09F768F31F07\ ED1F3FDBD6A21194846E9C7E96E94728D640639C77B299102A8D7F6CB35904B00DB8455F\ 1AF65B05DE83ADB6F2759BDFF79CBEE13FC46669771CBA432E6F777FD5D9C879C5B891BB\ ABB568BB541CFC1A8E567D718DAF292697370206F4B69541F9F44DCE287FF966B62431BE\ A035BEB6C13573E32233A9ED5C50A0D71457FD8B99390FF345D22AD61B23DCD0A0464B95\ 310097A2:\ CD13EC2531031AFD1B215EDCE6B60C6F1E9E8FB13D83B9DC28EE9F586C3C82AB7FB3359B\ 6C2354703093C883C489AC1AA24D21255E2BDE7BECC0F77B55E23090B18129701553A908\ ABF324C917EFF7CAB5B12D6FD4CCD0928748A223DB90F66B48D79333968EF22502A5EA9C\ CCF588FF9FE70AC2DB669C2A56905EBEA7AF56BCF42031F3866C77E1D62A793F39827458\ AB46132868CFB8D72216BD41327B8473F24F68FEF8D0F46F339D533949B609FC2723D953\ C5F2BC6C:\ A36BEA2CD9E5D98B4B63A2EED52F8C1B:C2BCD83BF070721C 47A0196C08AE929B236B36A04B7441FA40E69EACAF3F087F160709AF390C5769E1452EA4\ 1F4325EEED011D33B82454C7B6CDF6775E0809BE8068772E66EC81CC0319A7D27BBB50C2\ B7D0DCAA8040FAC70BF3947B6E57127422E979242ED79608566A4CE9C8E0EF3589249996\ 601013B4A32D3784403D52F6E0467FFFBED8AC31E2C200F169AF68ECEDAE791AD6D4E518\ 624D9BFF90116F154686DA7342B071E9A9435FC4AE2F42536FC93D98D6DA6697AEBEB47C\ 94451522116467E3:\ A14B00431D6BB8042C402005AF87709D098F6366527099B8044FEA9C173323FFBE5F53C3\ 013DECC92616652FC26B8E46E0FE4116F3A44D8C2E5F08B0D2B0EFA3B42CDD4809D2B8BE\ DC6940DDA928B58D7ABC1A7E753AD1DE54273C87FB18E77D58C4AA1867C7B01A6F8C291C\ 3EEC5DDCE8CD3722749F3DA01C9DCB4E7B62F220697B5EB47538FF8FFD78E4CE949A0265\ E8346D2ABB62F5537789236072548D8588FFF3D8DABB7AA51634CE7051E824EB4BF7415A\ 2DE90CCC264E2917:\ 52874F3F111082522E9EF5ADED117EDA:2455286EA57BEB7E D32975CF8583D36F57C092295D8FBA7C44722ED0F385C102EF12E5BDBAE80037C5FF0725\ E6B950EEC1413E628EA8088B9ADDF2CEA379235CD62FC01762AF3BE11DC766A17FC10F85\ BAD826E94147DB78EF4E0974D4566900D87643370A8C88F42471C2479B7686FE97332D3F\ 014809711124619D13644E5C95FD083212F580F9FA3E2CCDDC0DC33D782C1D103093B9CD\ 54E4A3113B6C75A7822ED24D9A422D719B26C21F4FE73D74012E81D9FF58F13BF1B681C2\ 9A94068A47FF18B9610DDF80:\ C8D6A2E21C15290F42BACC559380F1ECB797306B7B59EE22E452F971D049D24FC7C21BE4\ DA40A91BC91A2FE47E35CDA7C6A63BA7F0F38D038002093FB5E83CF52D197B9DBD0160EE\ 6CD4BC690E0BAD9379352400453E85424E2583B9FB7502F2918C60E0976722395BD8FADA\ 4C1726B249E4E8BBEAB59AEA3EB8B0D833FDD9A934D43542404633299FCF6163A4327820\ 2CCAF90CEE44FF094FEEAAA88EB085606A50E96C447234CD2F4A6602C18F71522D58BCD8\ 02DD3B97D5247F61AF099FB1:\ 1CCD49253B736228C454B8331631042C:43666BD9D4555CB5 BD15B15611F5D38034351F16A47A50C53F9952D35B0C888663EE6164F5F228584F25536D\ 8EFC04FC9BB0CB228857440875E320CE25534AFED42F830F7BE88AAED5D91C128EFD7067\ A30088B1A3AB3C00FCC3C658262230AE7541DB9ABD0E1288EC7B2091050FF3935575FD32\ D7CFAC6D599655307F530304FBE4E16E647AFAA0EDFA51F4CD075182F2B6D1E8B2F15211\ CD52A996430CB634B099965A37B442B1E1B8104AE9DA9978412F53FD9FB1F24E5AD0A2D7\ BADA6011C87593392A629E1E916CF28D:\ BA61E2BFF557EFD75AA4E9DCBDC95E3D02C4870AC3604E5DB01C38C5E489254CF4B4D062\ FEFBB3CCB044B488909AF465ED13785E5034DC62F65DA7E7CD0B53E625D9090123E8DD54\ 8E377C4B9AB085A4AC083A2EF1815F115C08CD8AFB8B814C17B2DB422AF48EB71566F8D7\ 246C2001795FA20AFA9DC6F76519CBF7378267A1262B87A98E6773E61FF3211A5994E2D3\ FE2E06AB52BA830CADA7EFD02A36A66F2D4C559CCEE4769C0339E56EF3946E736B048A39\ F41C0FAE0C7650B3486DA5A2349624E1:\ A9AB5A6AD1CFC14030B05F52CC27D166:81F7271353D4D8FC 2AFE5901D507A488E8729205EABCB8158347BE7FCB6C4FBC5F20EB471F00AEF1FCD46892\ E679EA9838E22882B80B1D68258D24392C219F9106EA1175D54F5AA495B6B3E0E60CE6EB\ 6E1E892F2CED18DFC18D62012A4328923FAD58CC04EC70F832E3E1B8B2F1327414C5EF9A\ 57DDA4D40C63289A5346520B7CF4909B41A8190B668EB9E5BE78F55155945936DB2C20E4\ C184BD2D3F6DF976168373A1E465E89B0C2ED18E750643932EF45DB0661ABB74088AA216\ 3C06A19E917D7B6F513FD1DB784534D624EE5575:\ 4DDCA5CC4014C19993D857ED57876B384E8E06523066A86A4A4EE4EC597CCD3F1619D4C5\ 124C088B1E89E969335BDEF659CD3E2DBB2FE26079EF7F5352991D26B89CB324234E2608\ A77BA1B66BB194D4CBAE3DFD6B80359ACCB81C3E69CE2BD30BF991930AA22FF0A2D02A0F\ 460951DC829FFD8F095CB245AD84A152BC59DF1925B0F1BCA25FC2355AD25B25D821B22D\ C0AB2749AB7EC0442AE798674D8E11A87257AAA2767894914056C8287B139751DA5CB49E\ 8DBACE28E2D9DE52C508089F8DCA82C7386619B4:\ E3D2CAB6F748F35DD4E72335A0241476:D97CFD5DEE5CAA6E 4541B90A451368513D4A09BCBE2CD48155E512FDF240E76795905DAC75CA9BE0264E5A7F\ 924C4706925C7CD35392FF441031EECDF0D9EFCE0E6135E3F4C1CAE57286552C4AA4D407\ 4C9F7C922B53D0F4CAAF6914F81123EABF9B012AB45C9AB989AD979A197D7094AF9A0EBE\ F2DA9AD8E32E5FF16E14475F0694A79346231E532660E0176224F21676E304A32405775A\ 937E26FD3C9AF3A4DA27F2FC131717805CBACFB554AD1ED56036C18456B5C8211F2CB2E9\ E34AA5706E439D1FD5DF049FD63CF2490B74998AEEF3D63A:\ 37BE67361D55FDF19B8AD1A39BA3DD47210DA5B83614B00A72120BA2D9E5CD65890C58D8\ 1A3060A39A4E8CDABE0D2862419BDAEC7695B87E2894FA5A5B05E0E1D1E6B35D5369CE74\ 1BFE4EC755DE0BCAFCC1FC160A6260561AF899A735817258BA86062AC698CD50913E0043\ AFA85640C52BD8F1B979011EC8A20A5A0C52BD73552B2E1DF1481C62F2BC74E8150943FF\ 4E888D944B253D0CC82848DFDC709792A2FD987EC564FA6D47AC98C3B271CC0A6ED3FA4E\ DD159715AB1972E45D51926E42E88C309A95494AF55C9E7C:\ 801D788845FC6152E33E6A2CB42A2A22:5F5FC8B7D6B6C3A5 9550E29D3D0E9483B8746D24A72396DD16DD31F7538548C6090950908C51E4AA9250B171\ 3685E1A7337A1D917D197B72EE8A0969D58CAD94C73A9B24A63620BE8152013669BA44DA\ A9652C99787B338FF96C6FC00ABD13561045A1C25214695C990360F505D83E9FF3FB3711\ 535164E06FFEA4A0050A09D7134FF72A98C67F3BD73BF90E2CCAC943DB049A788E7B62E9\ 2C9178E433255A5644DC67B17CBC87AF2AA145B3E4B657F31D28B9282B0E6B343C8759C5\ 1457D48EB5880CF255B2058A30388D306D896AAD42EDB05158223FBB:\ 22473327F8358F22AAC1473C942B78067FEA10319F52A6969A889AB87A09FB2A21878B30\ 8627C0FAB3C1358C5C30F198FD5EC27B9FFF78F4C4BB97ED9804443C18C01470CAC1D730\ 95E8B9E2CE4E6766EB4DBE31DB528CAA80B01AE979A3FB32F056F54B93704DE4E45D0EC1\ 9FC8E571294C279CE3C1DAB74DE63C741EDC1AA7C60A8DC1EEDEB738FD415F22F9E42A22\ 19A1BE56404E8921D95DB53F7B2873908C9A7E09A7B80EB40968319CAD1FEF85D31B916C\ 2F0810CFCEAC1E77976D0DD2105F71E9625209ABB16E7CCD3171AF38:\ 540E936A8F7DFA7E1069D1ECB6DA529F:7DD8BE5EED8A3B91 ED1ED1768831FE993379B5EA6091A5CECECAA6A1E4218F13755A75CE982B5901191B3F6F\ EFAC14A3D68190F66D759389A4B72FC1965516E16412E1DAFAD962A23420E3D108738D6B\ F1B7D8FD2B6DDDBD590E88EFE3353664085D1BFB7B8E2FF4169ADA322530724388BA3784\ 64B2DF93893FF936274E53916490A4917CBA6997BDCBB9A84ED1E7543B89B64AB70F8CF9\ 3713FF08A5E8EF164E33A6C85205173E9D2E3B0D31E565CBFEDE77FBDE48CF47E742F56B\ A466AA124B725840B56A69F2F46543C31C5DB8E926A7FD968B94606B77CF9820:\ 6F5F24233FCF42897405065C047A15EDB1BD4AC5824498D186E76D44A01636E3BFA6FD96\ B0FF5112FECC0F7D5E754505AF90F25F91FC121E5729D77E569744FA7095BE9C15216DA3\ 53AAF508D7A0BE30C64549A1D2F092FA65DF3C29144030A0B3407DF0C80D29A82CAFCB3A\ FC106FDD282E3E3792D034262EEC388134F0A0ED182D29AD8EE98FFC3FC18256DAB7D237\ 4A31F293F88812AE33758A35521093334BD204CD2F01BCA1F914B9C1FEC402AD226102ED\ 6C77459CE4D20EBC89CFDAF01334AE4DCC07D48ABAC694B86A90A5DF236BCF06:\ C3CCC1F40F2234124E8E44BE4D230D51:7BB01E9C965EEAB0 A9CA7C9133827D9AF63A9A2D98F12E96708714F3DBA3F887C044EE50BF508A4759124EE3\ 748CFF9E3F47976EFEF9E9E91DB6ADF75F2702C277D87E7EF2DECBC60E861FEAF695E93D\ F183AFC6548AB8F5BFF6C12A25E62C81196F3AD2392FC77326DD521D374F54865532157C\ 75F1B77AA93EB2178F6117AF2AF8ABEAD69C2F4B3FCD3F0BCF24CA460FB596E47C4AC6D2\ 873A96C90788A425400D8CF579733E553B9C38E538F2B1C762D6201EFC132E92ABB69121\ 30F22547BAA1E44FF487D1C4B2B06B3A4768A1220716C44657F679E1F200164046325346:\ 1F1B86628E58A2F6220B26B25DC7723D22B02F2E5E011672C354C6D1CBF272100F066893\ EE1A9E353E841AC24D0AEF62BBB5480ED978C84BD5B052F1424D6238641C9F11E5787D3B\ 94CD7D866FEA1D2DBACB58DE1B6A0582B6C103926953B3203C94CC8B87F0630E77650E85\ 1449A3BEDE5B2C1678A5F17F920234238C0C57C51181E5D1E7B1082EA9D4781F825574B9\ 3B69FFB03BE688210B74B0A6338370340C90442709591671D19FED7D44795B97409119B4\ CAD30C84B296C7CD76C3C3B8ADB8B273A35AE34EF402D4B22458EEBB1992C7A32919D2C5:\ A8E311DC7544747FA09537683A4979FA:F010A1D16F896398 CEF68DB7976679BD69BC5819CDBEA5749593FC2754D2B0860A87A3B16A680E9B634C7A23\ EEB7ECACDBFCA2FBF26AD3AFDBF29E98230B43D410F27777010F09ABF76C69E0864BA2C3\ 7ED9BE1C0E812154E570509F0C8F07C45A52E5FBB3DF015FD54BE20D8DEE69FFDE644EFA\ 4DD93E7C8A7582DC19B5E1C69FBF190E43C7EAFA92C67083DAFB3890C25324E3590479D6\ BAE27E8E90B6F28EC39BFD46A73CE92F17609B596CD2BE34700E37E423CC9B9160304198\ D917357347E414627D7BD9D36ABB5BA07BEA6C9302F73F370D2DA6393F3CF310B65BBD45\ 374EC60D:\ C8848BBA822123ACEF694A77E942F57FF02BCDAF6E6540FEF7A075B890A8CF32B9372A95\ 53B501526455EFF2B764B5C3E8C3BB08085074B4EA0FDE7D4CE94BF284603423068E8FB5\ E9252C73DE7DB341AB624D1C44E79ECBC22874A73743004B99BD6316BD7C92415C1F2A54\ 675FC2D26B0EAEF760B329A1BC24D140BA8F28000649F1FF43F586E2899FE63C133A67FB\ C542C87A4369539D8254DED0EF157425B379CF6F10BB0DDB7937441E3C091602C76424AD\ 5E856550CEA7FECB24D54333C437251122C72E4D21DF23371B01D05E32FE1907F198F18B\ DBF68351:\ 6CEA1E32C1732B9AAF2F9A85A9022895:FCF3906F4227113E A7A87EEF419C8600662C5CBA01DA56DF0CE6977991502A27F5FEDAF68AC26AA89FADBD15\ 63ECF3810643174D9A2B6E940E65ECD0FC120281BF9F52C0AF2F768924111941FF1D8424\ 788E75CAF63FE7389ED1C736504F99BF1590C5B970DBD7E0D13C283209435EDE2360146F\ 4F734A06F1ED649324985857FD3CD80C82E896C368E44B52C35C958D5CDB1DE800BA7343\ 412CD66274A97037667767FB7C7E4B95C261106FF3D34A209B998C38F2639F74631D1BCE\ BA04A436D8DDE90C2A1A38CB44EFA7AC782BD5EAD9F3A5FAC879AA63F6FEA44FF967D709\ 92533375BF94C2EE:\ 2F7335F36D102EABA78F04185805AB6F88BEFAF2ADC84DD6DE9629E34A00D934FF017D7E\ C8195B8B7D380FAB765646FCEAACAC912EFCF6E522052531D04255964ADC147ED533AE5D\ 5917ED43F7E21BA784B121DEEB879B41B2D00C8A18FF075CD810F8C5DE84B8E3A137E9D1\ 911BAEAB91402AD0461E58A58F45AC901B0B741C63A78C13C82B4709B14F7DB1B3896206\ 7F5A08DE2FA8BCD91CD6BF3FC17950693D0DFAC9CB1680E68D9C9823AC12B1F37E4B6C16\ 63F5BBE7D8DAF7961C3D7B37C34FD2CB02918785E8B7B6777704AA4F11CD974EABCCD678\ 4504A583C56CFDA7:\ 808372C49B7BBBF65386566C6973A76F:805EC1D405B86CED 4F25B31BA0783DD6842D607CEE8FCACF6ECD2D5D6D885A230874782F2441ED47DAEF2138\ E6EC20333CFF9671E008481F80986EB91A46C08C9D22D2B6335F8E6BD10144324726FD7E\ A311573B1A03E6E6262B89D145B01BFEEF14D7904E0C53966747316842DEF71AD1144CE3\ B8C08C16980A2EBABE9A5501C89CF0B6F610808112123A56FE7F726639A20EDF2C531D8B\ DD30D9F4032C9C3F9C165634A898442C3EDDB0D8A63A855CE44E650E428B60C536918BE0\ 45A902B0346F232545B27A0C5EB15F79BBD1190552A68EE7C1D29D04DF1C70A7CA254A6C\ D47BCCECE1082A20F35E7E46:\ AAA603EC1AAF270AAFC06A43317B6FEB2398633A9D1C130F2C67B6C19E9C391C9396914A\ BD907B1419551202E6228FC7E06FB78FF669A2597AEA85DD4A372FDA60ED0E3C30E872E2\ AF2A250DBC6972CBBE00A5F1B5BCB7353175B5D528E32CB035460E12C8A3DAF3D1D4B25D\ 0CE9CA5AE3F8250548EF24AF92F4346A0C5716619A640100922AAE13C7824341A938E14F\ E9D51AD691932421669D958C252DBAAF943C5AAF64C89AC8B381602D3AD0937D8B8ED413\ 2803C2C9F40838CF1A2064D269A9CA2266DBB642852DEA101E4E6CCB40C377F17D195FED\ 673F030484DA66428B3C7D03:\ 299F9BF1E1B34A0D39E6D49B67DF754D:A4C997CF160DCAF7 3B0CA636F9F507E2D9CFDF06B3D69B44A3647FC9D6C824C3C1FF9F31162E7A40394D9558\ 9123310056EF2B668F59B93EA71CA45434D104A91878A6DD3C4349D374E39B7A4635FA0F\ 0841824D02BC92EA6EFDEC08BF8566CCA111E478C569A96B9F7A2306A2CD5464EC4EB0FD\ 642E91A01EFC0CBBD08EB28B34D99989BC3D55DBB5BF32FC8C0CFBC3E5B89DF3B01EC4EC\ 8FF3553DA1714004AC52A2F14EA090B3DBFACA8A7664053DE14A905339D2952964DD501B\ 638EADC396DC05814203C4568D5469D7E3FADE0302C14BED2FEEBBEE5A78ACD17D0D4425\ 9D4A47BEA7C4935967125BC0F0E228A2:\ 253D1DC003D0BA2B60422354551E3684951A5B77C142061BF86EB95DCAA1FA06E2E047F8\ DD94D3080BA6345E2F72478110899AB51D5BCBC6E16E564C407AC37A08F34108FD9EBFAE\ 560FB59A6A37DDDE8F014EB525AE9F5F63046C263721E72B6E94151A129A3BD446D9AC21\ 602FE0D150251754B4334462A99B7C5792B901E03AF71FAB991AAC8B9A75C29B2FAF3517\ 8946735608DF583B27C80661A53FAA4AA581B5AAB2F7F034707C9B812C9A22FEBBBD21E1\ BD4821C4E45E3A072F8301435E238C7489B23646CDF37800C9D40CE69BF17ADE4992F733\ F71C2273B37D1F17B68D15FE61163E84:\ CCDDD91BCCA1490EF312ABF7D7EB545B:B091FE75641EF510 74CF8F2B03009D38E874C23AC4A01855EC591D2014AC96C5F6C4D0BBA42C8C3764A3554B\ 9D5D44D9FFC259E266DD0A2649B5D299139F2ECDC1CF7E286C183F74051B150674E9407E\ C8A6E151E174EE66012DA6E2303AAF3AE7F677C17BDFD546589F52756CC02ED3BF4483D1\ B4BF49FFEA82F0A9111BCA3C2B5DE08FF67E5BEA7D2E74564D686D554DD9C31C291ACCDF\ 76A0AE0ECDBB17A427D4223BB53592EE37E398707CCDD0AA70F815AC3EF6585F35A5E1AC\ D44C511CCB79CD85B5D1CFF534B0CC7F89C41CB4BBD351D8FBA99EC6717A98BCABDEB16D\ 242F4DE41CF5BEBA4BFFFFBE600386FE55CE9F0F:\ 2747D5D76CC1A15D8D410C081DFA56049B7421A90B01EBCDBE9E31B70C61A58E0D2D5985\ 596520528D6C0F64063C3F2386F4ACF2FFF68CBFB8A7C78B97A573FADA6AB69EC728CE77\ 666C89250F9942F80FA653CE60ED9B65949D491A38953C688821A1C4B39F88A72AD5F454\ 4D002456990F1C4F3CE293BDC8DD68BF8E13818A05454565D9B87AA9F4FC906E4AC61A52\ 3C1C65EE7467B498B5A06AF633A37B5287854365DF96A2675A3A454A25A345BC1F9A0375\ E091C6BC55054E2FCA011B1E3BA1C964A3470DFCAE1A937F1286031FB8435FD7487768DA\ 018E69AD3029A1C6EF4EAFC302EACDCE8A02CC23:\ 80EB0BB542D844F4768820077D8B81C6:E6936F2688231B9B 44F6EF40CB3EEDE73D0BCDEF4009F48EFE4045B1422ACDA5111D1BAAD4827B33B37911FC\ BB51A9AF5E6E4D675A968F119DE1A64075DC4670B92FB83AD3B44796522B0D8187EDFF98\ 2D38C7E8EB63AD3B838FF50662685D4106BB1E0424B5631ECF069D988C446CD2E97CEFE1\ A2C3194681873266F5E02C7018715A3DA9CD927FAECB6B8AE6366998141ACF652B49353A\ 8D6B9A6238C331138CDC90659BCADCE15CED1615B96D050250E5196F88F5601F6B538226\ 45825C88580AC543DF13FB4403BD895000A2CAAD12DDEB584D70A0CBB8C029573F5A530F\ 9E5BE2359E6011DDD4FC25E32397CACDE24178D0E0AB186E:\ 3AFAABBA1BA4E009171471B45D465F449D2F0DFE600893F2D60F9BD653B092C7CA980C4A\ BA1F15C08028835A341C5E59423AF6BA5E6F5B3C34E69CB2CAAB42EE3DF6B1FA10F2A611\ FB4871AF01815135426D60EB540D13B9058F154D6643FDB28542A079DA0549E9C62BFB6D\ CF3F6FD40175C86B2CAF712E42538F3B6C5C57024D36AEE3FC93B5E70CACD49776302E51\ CE84B4075BDA7B37FCD1968A6F561F625B1D32F3652D8A7BEEC11A11CD8737A9C9F87D1A\ 4CCC3F24D201BC8C1CE24589313CB0387C3911C924A572237705774C89840DB93D5BEAC4\ 7F75E04A10839355A775A02FD417FCC2A0BD104E81E3CA40:\ 89D3696A74D8D4A751C1219C3D742DA8:BCA7BD8D3A8B2682 950F2F4CD525EEC6CB634DEE121B847F35D083523526D9E20E329C263EB892E5FF2ED907\ B354B057101C73C094476768A225268BCAE04C564EEE9EC9D855E478E192A9FC22F12D44\ 0803BC49C5F20683DA0CBB09CF704E4938AD0620A4C40CDA769EA03C236B0DAAAD30B432\ 84486A8D2619E94BD1B79F01B3AD9E70874BD6B929BAB1121FBD585CA2C0D25B799AA487\ 7FDF222097CF0B8CE95593D0CDDACC418FB1734ACC19D365B410DCB94C3E64B11B5E1C61\ DB6B4BF2E291FE653E2EAA266C3CE7FA16857001FB6C2259BE0A9157F629B6E37BA037EC\ 3A716293AD59C1A254EA4FC60DE1B875F40BB328B5B6CC148D5FF5AF:\ 34E2E8205BC53EDB71913053F33227BD0CE67F1D509A0FFC5F70AE3B59A7226811821797\ 26A242F1AADA28E15C3B04589D5847C762A36A73B7D0696C7393D5AC73DFE5DBA39752C8\ A06BC4DF90FB52372598B43726849B0907DD640C9D0D4C9990D5F2FDC9F1535400DBB392\ 1C046556B0F8DDF88C46D8D7924E954B177B936EBE1961C89D5616761C51D576D60C22FF\ 8973FD324DD7340B76D11F6612D80AE53CD3E5702AEA0EEEACB6FD21861B68CEF12AB12C\ AB6BF023D6F6F3771B237A9F68D5516EB85BC0907E947D702AEBF2FD72C196A087EB38AA\ F77E04BEA1F6798F6EC164BEAFAD1BDD2955B8721AA6717505EAB952:\ F544BFEBA760D22BBF72BABC88528618:869958C2FDFA5C52 3F20E497CC4C46C5C0B145DC2D1208627A07F0426608F4C240CB2C0E1B78858FA22280BE\ 9DB77EA591738F57ECBB4F242386CDA36E926FDA022400566C2AA3AA885B5AC734DE191B\ 61B66817B9A81D9F9FA9AA5F061E85B75DEED7A7C8E4C047923C6BB484747C0447381452\ 444FDE4658AD1FD3FA214798B4119D0133DA8EEB08E4104F84B4485047E9E48195F4408E\ 3473565036388A53FB9D657A7166DB7FE8F0978F01FC8DB66DFAFFD2E9B9FCFAD241E05F\ 856A512BB70DDF8CB32B34F00A06F7A5547BA92DD905DED80937E3A1478142A549A34B19\ 05A2C0183975E4DE684458DB2F80F39138ADA478D425453909AE585EFA7A91E0:\ AEB26738E31E6C09771AED38B68F236CC9B3B7C512B16DAE7BB44F2F8ED5BB38FA0FAA8F\ B4F8C9E3BF003CC4342BCEDB7F978F0383C7677622468E5A4C76F9A91CE4F3C2B26B9547\ E6384EE50BCA15D22A7EFF7BC69E749AFDF6F0BE7DA7E60BA86C399C34C580E18E5FB35B\ 2D52ABD64A31F508711C5AD753FCC47D38933C581AB33C6F57E90090C7824A345046492A\ 6A94293040ADF91673D8FF6FB1B6C989D0C0A962931504ED2E1E056FAE8EADE632D27B39\ 8D893F2D3B420AAAFCAE4EA0688AB45335BE5E8D5E1A7D70A4C6EF1EDA6BE64AA0CDE393\ 9230E8B027B400CBA2615525C0377E22D5DB9EF150C316680E545B28D5AB02BD:\ CD3603440E0D4ABFB32196ABAEA29DBD:47D173BB5D14232E 9FF2357073EA8FEB5696460CA5570F82A65C9C8B23CBBDB54161EDF09BBB952A57F9E02A\ 0E60B53B9B29E47F64982A9D3AAF92CECA9B1B4F899C37EC998679E1C6E608FFE780EC78\ 0517AE6EAFE48474BBDBC2F59FE732779AA27380BD7B003F1D9D9977DA835C52A6D67429\ 14276C92689190A1DCE67F31A165A08053063F08C01A5C25B5666540F0802C7F79E64DA6\ A2E8EE51888918CFA3C5437891E1F7186ACD7B48CC2B7C6E961C95A10121D4B2F20D737F\ 74FE62D4401ABE8EE6EF748D646B02B117885D6F9F7BA65A01307454094C66AF68D25740\ EE9F45D7B9E12D9FBE44C13D98BBB59FFBBDE75E4E217F9BF794968A4B55F2B16DF6DD40:\ 30E20775061AC476109DEBEEC9CA69882E3F6FF8D05B913CE1ACCCBFADEA87B15AEAB81A\ 8414EEFC3938D0149A0DEBC42E1B3E4CD4D6FA0CA171F7CA194A5F57BC2BA3221E43DE68\ A269714F5BEDF0F12FA33C456F839D30C4A9C7667273350CAE1E25BF98CDE73BC10FC5B2\ 02F88C7477B2973A077C567DE8408C3FDE4EA6722056D7AA0AABA3E332D53B686423ECC8\ D8C69524D3E94AE42FE6C70CDFE611C7DA0E300BD81FED416CC0952F008A9F4CC6795D85\ DD0732228628A8A3266782BFD7E041D6D135C329BF7C02F209EA97C288C613049ADAA270\ 2F654FB81166C23F2EA91FB969679917CDCF22CD878AAFE6E2CD8BCA63468AB745762E7D:\ 7ECC2FA94DB28B0C4CD002EA020B6111:00519E7C6392488A 7E508A73B21580529EF3C160A981240BA4A83989EC072F7F8296DC7DA3B9F785D11FA67D\ A1843A31BEEDD09919738D6E98AC7F37402FA60968E0EA3890CD0A0238B31AE3A26EF28B\ AE750FF2451D98D8B405FEC83672C3A531CDEE25AE5566EA23C51CE747CB44092B82AB89\ D0C3D0731DE92D1C862E50DA27A7024338FD62311DBB7BD2029713263EE16F9FF37EACE7\ 1EE5F25AD185A9E0327173F4287A93BAF814ADAF5AF869F2436BAAD8D8D3EA4908A816FA\ DEE43AAC1B7E408BC049D2383F91D25D4CFC3537784E0071B5BB1614CE40C8E1EB9FCEF2\ 99C8C10DF96597B10BFF0606CA3CDD6AB72BBF8D4341222E36675360FA3193A0E275C955\ 90056585:\ A5B2EC64C27DDC68D99C9F82F0833898B11B2355DF8F1CAFA49C4B3D67327A2367AED1C8\ 330F5A700C788529F78AC260E0DB5231DF15E01BB616566CF4E3A64F1F42B503E4240386\ 7EA24A5DBB80E5B6403BAF272BB480E0B39C77E4D092FB8ED54360912930F36B91C94F39\ 689F6571D948D9660CE319E1D72EECC0AF93072417F4A65F0F1823581B9DCF874094E327\ 41BBA233F5A998C1CAEEE53C331BA9F9D437DDBA066160137AC5E7D006DE9EF709B1D033\ 145CE09F1FDDE0C5B278201665BB835726314E1B76E8DE23E4FBE36C22F5D7009E6B7DB7\ F151DB23CD520666101F7D3F699016CDC3F286402EBAE4F59ABCCC3A86502112935EA87E\ 1A993F6C:\ 0C8D98BEA46840B22546EE369F77CFFB:4FD1822D02B9C1A3 [XTEA/ECB/NoPadding] E197D59E064818B7C8AD72C29E227E09:\ 04CD161E422154E5BCA5249582B9D4C0:\ DD0C8719A8DA117DD9D1DAA189E65654 AE53AA320088B4042EAAEE3649FE6E36445696F01CA40D3C:\ A3B303C42178F97F719449529D51511491B41EB70E6101C6:\ D8C8ACF6B4B68A837639320798994979 655A6B1D6970ABA078819E5AE1D08471A0E01E0A5C64E612504F4BD9BE4A8AE8:\ 7DB966E1A2B7C0E8EAA9D308EF89652A5857461D100DD0CEF9C6FE7BB4DFE33A:\ 24059EA6D8A9F0CA678ED6680362596F F3B1BB81C053DB02A8515885CA6DF124AB04927D2AAF6F0032BF17B4B437E1F2C7D82F89\ BAD898DF:\ 215D5ABF53C4AA0D7571A0D9D05C3B6D33D65BF35EFFA4778FF59DEE90900ACDD4FC6645\ 368A294F:\ 2434D48F17E0A7D91F255FCE60F3D6EA 06F0A1AD9F9EAA665044D0A2EFA10ABC30F7FBA3FC47C6AE1947B7E9B47733547E5C843D\ AC59D09393835061D834971E:\ 066309B116A6692F279F2526FD284E75479BF7FB5F63096AD7108CFB0DB39062A2627594\ F098F0BF5A3B4C67CF29E993:\ 18C1E1EB3925EEC61559DB74EC99491B 2FA1106E95056E070352666F059A72DF6CC949BB3161D5FFD8FE46451444D096BBD606B0\ BD443189AF001E5BBBA134DB1FEA7AE9B4587438:\ 1DF05B34A733F83B7DA1F194507904CDA99C374174AAB472CC598E06960263BD9DD0EFA2\ F4C14CC8AF4039A55EC00125766D25FBB7139081:\ 5258617DB39A2968B1EB02565A2BDD1D E6ABE28FD1E9392CFC65978D586D31D344140673E345D6AA06C75E1C03E4E314831EB94A\ BCAF6B23F2C34670A79500C6142EE722FD7E408D751DCB30E5C63F5D:\ 3EC6FE802F4EAA740DDF34EB79798F458049FE09190D12455EDD6129BAE85D22FF4E96AE\ B59DB9413DC24D41730454F65C443C819265B4CDBFB87F5ADDE7F4EA:\ C4A02982C1291093144C64DA1E7E3D67 213595590E62A55F241E3D4CFCA65C1BA23BF801ED05D25A8FD0A06A9846BE3C28B9BA45\ A2B32BE80ED468E007EB6EFF0EECDA4460A700977B84464631B642135BAB8519248CA0E0:\ 5A6D52C19193A6C002D58C15BD2490CAA36550B684A726C33F1A12DFA2D4764FB75EA336\ 823833637765F37547103691B852FAB81BBD74EF6C20BB885AC42946998E74D2B8C2BB75:\ 58B61987700468A366178595E20A365A 7DE080A1683521CEAF78AB4C3160D326A07FF4C6F446A94FEADFC0BC8464EB781D743694\ 734C5938F7D2DE4822EFFF34A82EF0C2E11F92CF1E0B2989786FA990DA3AAEC7FC647675\ 024BDB47F20C67A7:\ 1A5002651E1686F56A6BFDD8DC40DA9DCAE7E4773237720BAC8962DC2FEBCAAD885C4A62\ F13476B303B2700150F5CBA1CA976A753E6971095F175E8BA2D97E1F1C18FEBB0F8658DC\ E957E65DA18D38D8:\ 75E691CF7E511D4B1A114C0E80BC7C7E 739D59F39F57C04D1450926AD161AE7CF1522C4929CB299C2EE03842E3DA7AFD54AF4DEF\ 19867E278678222C85D8901526E62A008D449478FE4249173B6E80980B9F91D09F7F5CA8\ A174EC73A57AA878E74F0315B6F3E15C:\ 59E210F2DF601ECB05F4FBAED1077A9AE1B783526DABCB881881BCD103658E03FD6C1D12\ 2508DD039470226BA0AA50AA087D40732D77D137DD2CC96824E24C44BA8955D250297C02\ E3D444F4F1E78F5A02C50C7314CE356C:\ 5161285DC54A3D9ECB691C0CDF987D33 3A483364A30C28F9B932A11152D741304802030C60453D1E9433823A21F033DF5A6FB43F\ E9CCB423946DD363F9EEA9F0E60898652E8E4C4B6AB6410B468861CDCE22B3043BBF7252\ 0232EB34D1685274A3FDCBFD9753DAD0AE467CF7EE661145:\ 11AB2B4CC8CC30311EE2B979C6AF90C5EDF073CA2E483C2F0207E8E95AACC55F0120C9B0\ DC689A2B645EA1560FEBF3D027F0F24E551205091D04A72657209E814A9DAF3457ED9653\ 9FC1CC8937D76E2EB4854313E2C067F86EF889757E014B35:\ 19B8DF4B8C9BEBE46AE4F71FDB4EF5D4 A9E72827F67035507B5F0747149A73AC2763000470087FD6F8F165FCB872AE7BA58CF568\ E1D70D28891881F0464207E5FF67CD2A707B71286DA7635085B3B68F9228A646A186C8D0\ 9D3E31B56562ACABD0D5AA32F608C54086642AEBB72767643C90B7DC02FF772F:\ 5AC440B8C9AF2D5843B125711F519D34DACF4D86CDBC856933C96D5B3CEA980E9DEC2F0E\ 2BF6E8EEF38214D59B5562324C009953DCCC4ED2D6C6B55211AC5E0EDC7C8AD3F8760823\ D55365D84525E09DD3145DB6D700D9BAA4A92F38EAAD8CE33000A0ED72A1FEAF:\ 3D29E84526A1D60D177C03632DBF1E96 D24A21AB1ECBCF2EF83A1FCBC1032EED930FE269AFF8EDCFEE26FB1A2DA9D063EAE522E8\ 41024B7FDEDCDD6BAA1126834C996B9FD09654901FA8830C64AB1F5CA3BE896D5E60BE29\ D08C9E0A4F07956551E618F1FBF46DC8255A4E2F4DC8DE5729CCBB39FAECEA0A4C45F53F\ CF5C3973:\ 2A2A34F1EB3F99FAFADAE4A68CC85799D9EB7B1F0277E71D56FBC395E3A93980B670D36B\ 87153B90B8154EA962C39A049088665EBFE6D43A5E9A04A93F4D683DD509E27BD3AC659E\ 5AEEE8B62EC3037C425EFEC0E726E8E572017940725A794E58817914308832AB59644B03\ D1155D33:\ 10E1FEA37BE818FD0CC1421E16A3151F 9CF0C3E72880B2C3FEB787D84866DB80D4B4EFA60E3708CE6FAF0ECC29EDED0C8D9EB269\ 57F1DF63FD39EB11158DD089B9622D161AA83E0BB921067F77D6F4479B17FB9C9F30C4F5\ 6A86EEF38733C8D557053BD4978E41B965CF1F2025402836AC90935E9564BF23F5FC76F2\ 9DDBA491446695A82D54514C:\ 3A8E38AC17AD900742F711491153A7FB93C04F981CF75FB34FC9B28A2C24A81C60AC4585\ DFE04FC026B6731A8C2404E65DE9FDAFDD32685A3863EC4CC77490F8E0D3ED234152FAEF\ 3C8E1BCE7E4BAFD1171141D5ACE23BB3E5EAB0F20D000371DEF9E831BF716B6AC5EC2313\ F013766071F3AAD4492FD780:\ 80477A99D76ADDF3DEBEF9E8FF185DFD C1BB0B801F25223FCDF8CF13251877AA8472CA6924C0F51F1C968E981CFEF665F99EC57E\ 4C33C3B083D7DC62DC0096B062CBB6DDF4D39DC28843A74E81A5F9558FD9F5F74D3857BF\ 01A341BA443A2440C85CF069A757AA0E1ADD2B67860F3BEA805EAE1316BFD5638C312E96\ 614607B5BD816B55FA16C301B71212B5B1203F2B:\ D481D95387B075DDB6771A669D3E11AC591A629B53405802F016E710D5E919E195A4553C\ F83337ABBBD506131F363D2BB5A8D3B542AE8A99B4D4641C373BABFE737C14AC6612FE46\ 6D2A83C867F42D4004685B230D3FC1C23D3410D767353A5C523B0B36E0D35D9B3D9605AE\ 9C8402D0F7679A3573F3354E6BE0F2D173355B6B:\ 978393BF38701AE612953AE4C060B632 0C0627A330788002C9DCDFBBF23F46ECFF4CF793D93D934CC553A64ABAD1DEA3710F775C\ 71D54412BB3B6361B54C5E2DE7244CED9B546D146F20D8730FDD8AA155EAFFBEF34C70BE\ 1F6199F67D88186ED039E00BB88B7DD13F071AA4C309CF92C10DE3882674B5C5C5EDB457\ F826C2D62724E1AD328CC09FB4113E083E4C4D31717FFA66914890CC:\ 5AAE35C53504B9DB9CBD7C00B01AF71772BE3E911DC6EBE45C1EBD331DD81CAAE710F963\ 7B2B22C12BD16B0D84F0B41A59BF169938475F56B57347362C7E6EF4F9ABAEC9F44C3BF1\ 1BC2D02DD0DB00A8DB780A1D1B399C11485EAAE96E1AF12EDF48B4CF6FCCD343F16CD056\ 5E843EB4FE1DFFC1EE2FA8E0F73839D6F6E131442154A4972F552DC4:\ 9A4972A00B5C1B22AA07DA8C1C8B8FF9 F2DF92A7AF36169DF9F2CE6DAAB0788284FEFC9D1C43619FAE6CB75576EE173DA697A01D\ 96835B357C89B737794D0E5B2C7F02F8E5DB968E2D000AFCFDF9B17BFC8383832A2CA177\ CBE99385C9314F94977350C2D4B4AC6D37E0EC8F36E666C54011B2ABAD25CA922946A7B0\ C9FB5AAF54D618BBFE59C1751404200BA90051B5E54F64C7045B72B01681FCC6E7763F8B:\ F090795579AE3AFE49B96ECD3A8C01D449DA8AD81AEABAC135EB9CBB904647D5B1522B20\ 8F325C0597A2294CC1A10164551549B69E96F5AE72DDE9A4656AA533FBD7E98A6E66BE29\ 663176D5621CD21F29494D1CF6D784432B1524BA56BC3E67E9FB4378190268B4DE6BA74B\ 8B2B0E1EA52B75C45FCEA715B8A00B7D2456BCE2B45B192EDC10FE777FE53260F8E25397:\ 8EBCF7F6F9025BD94D2985A4D3982A84 EE4C225C44528549B4F609723FB33467DBF135FAAB3F6C82DD9E3383714F39EBB31FA595\ 850389D1BB1C1E9DDC3D1E0439F21B819B3D294B15EF81EA1E95C36E75D20B4C0D7C3765\ E97E9A2B9E03B5F5D5705DBB35C241779E232B0781EF9A3F371D89E451DC68F6F7E0AC8A\ EB7F8E41DEE6A0A86ED9195CCF12BDBD820243865FDD31B8D0F33418023E2089BF65A5C9\ D20E03DD7D4C8287:\ 355BDD01480727A7496347973315434AFD0D75AC1AAF3869A461F78EF5E5923A7C4F749F\ 7929C497CDCA398F4CA868A860E0296A952BC115C07B38D5460753D134E8111C0C108136\ 154EBC7A386921F754D1F116F474C4B7DC8B5515ECA301E30D1D4661FF2814621C0CE1CE\ 812B317C94EE900FD23FC2D941504B345B5BCB4DF7CC3A01BD3D759E4A7C4C4FA893B6B2\ 30D21FEFFB69C0E4:\ C2A7EAFAE3BAD26025FBC1EC1F3B1342 FC2B09E77FD6C0DFAFA0EBA6AA058D2357A620E4EFE70E52E8136B5294EBCF97E3DB642E\ 3062EDA1DD93DAF24E97FB14F41C53D38729105BB46DB59507B6152CBF7747537F9FC8A8\ CDAB5028AEBB26FA8B5E020D7E1D110C159425ADA07B6E2526106DB5C1B4E2F62B5FFDD3\ 98EF3581EEA831FC686389C19E679B394A79D24AA34403BAB37A8B313F82878605E027EE\ D34926D390BCFBB1E786153B0379C382:\ F330598D81495B8AEFCBEF71B791A872B394E7A472E4E9E4D4C4DAABF7C2EDA0AF52CC16\ 2FF5001DF22EB012792A509C25566AD0BEBA50529F015CF3C4E6139C80373604EABA6F75\ 93AF87B31E300A3A2C5B9DC10EB36DE921BDF7E5569BFE8A4155F6F5F272846194E0178B\ 228E15DF6787AD158F0907205FA941D76BA4A4F2C121652806B463CC1DB8BDDE50776BBF\ 19577A25A66B4DC3230870963E53A137:\ 86014B66CAE76E61371F64A580B3A3F7 2642676CAE2461ADAADCE76CB12F9BE1A85DA497B5B6FA3FFFDA136E5ED6E53ABE52AA96\ 1D3D12EDA92644D9CCF6EE1C0023744BE75786CE57FCA3102D0E4AEFB3F6CF7E0FC1C74D\ 37DDC4CBF3CD59560DE06209006A55E8C463156B8F1D81C7C9FDC270A39FDBD67F53A196\ 73514569BD75BD747076C2CDBCF51C98995EDFE830CA8372279EA41819DC68ECA82B2476\ 53BA8EB10A8F909A762B74D9D46D7BB3E29C725C74504D0D:\ 20401A5F52C04821DB0609B9113ECE78977DB9A614CAEF283062D84985985C50090D64F5\ BE66BB90E68D75801900FEBFFEA8BD5790337BB0ED215011E541AE1285FB3B305E05F4A2\ 4E2CD6D3A62EE76CA4DDDD2E371A67E36DEA94EA5C26CA1D1B322F249DAD9C5DE435D770\ 4B4F29A7D960EB9582316EC193C97BB5B64BBB2ADE27F250C2BFBDD48D660825EBE99E75\ C0E4354E0E5B84338E6361A5C9C368F095D3630C3E9878AD:\ 372ADAC63D66E934514CB2E26B388F25 26BA6EF5054908E2CE4618CFABAF79F8D87DA4605B7F33EFA1C6AA0F039E138CCA821C75\ F0B2D17E52932B25CDCDE78DA2BC77432786E865CB153E0A0C637E9691D08679075095EA\ 47DC18F40435B2DDD071D066F3B2B792FA528C0A64725F2B07981A2FD91F658C49B75317\ FB963B2BB68430EC9FAAE98963A8EA85F62AD4F77E115D3FD979DB421A773F2454E6AF49\ BD950550B126921E2FA581EEDB2387EA285D652DA362BBABE6F7D8454074B6C9:\ 9CD37096F29ED2C56C7D2842883A79D712F6AB9F5F08AED655CFECAA2F482FF470D74597\ 188C280E8FAA0B19B51B56A4A8B2B8E3ACE48927A61787341F5DC153621C14110710895E\ 4AD3886ACE7599919C985C70A8B9A7891FA43D1CDDB30726A2D5027D77386E5E8B80BD7C\ BCBAA250269C250A8F2276E052A88997182528B947751DECC3E8555A8D4C6D6C223F7B6D\ 431AE2C7931DB88200DA4D987FA0ADDF0C0C8997B7224E06F9701BFAAB2E99CB:\ B4BB2D7C1DCCF12BF555DFBFF33BFA09 C1EFE0B080811DBEAB17EB4C00E62F695BA71BB8E27006187F6F224F29D83820BEF01EF2\ 6D3CD5FF85CD5B005FF0DE9A8795B20F31E4D98A3BAE15B7BFB60FB8642D77C12E488652\ A26B5E32116AA0F7177D1E3F46C31DFDF212683B08E84C0EE72A15466974FC5024F3A0FA\ 2061F53AAA86B3A29114D165C150D6FBBF0F07645C91CB5C9EFBCB292ACCF7159203BF83\ A28FD040E92711854CDB4679A6D885FBADD29438BA11E9ECBA68F8BCD4433F7DCC6C263E\ 41C3E64D:\ 781D45863F3047C63BDB423712F166E4E5D018A6CD05B70E1131622E93BD6E0CB56735B5\ 335001B9B971A671475DF0EDBEC0FAB32DDFD422504A941860C223D86B77EE2A4F7CBC44\ 34738CF7F59059EFC0CFE4693FA9BD553B5EF3C1F311FDB66C8B4117620126768A742278\ 74D9BC89FECA06CEBCEE39528378B1B5915543453E667860D94C0406543B341175650D86\ 5D245225B0964BE723516490D8F908DA7B73A72C790A5B6CD6B980D0FF8DEFE9BE085916\ 3D3527D5:\ FB8C5F864EAD033E0F3D427E76B5C9F5 B863168DAF023E33D00F90F5BD076FA62F3BFADC93F0A1EE0E1466DC87507BE3E0420F88\ 4D40511F5C1A6DC912E70F33EC90D52E2F98FBE89EF076E3A95CF011F6ABA8A946B409C1\ 96ED86094597D35C548EF84ACAD0CB3E292CFC4D43183F4D97C43BFC5445A5DDF396159F\ 9662D0D844391075E5A209A00CFD49AA86519F7C3DE285D9DD02F3924D0836C725AA0669\ F3B98C4B42AC893B90F55D4F07B83CAD7F693BF49D72423A369E7FC563D44229CBFB5F7A\ 25EEBB50DBDCA0852851D417:\ 3F22A08DF104CB891887000C0B975296A0A736B7D074739DBB7B16100EC96EA30F84438E\ 3C9B6F38063C2C4FD8B39262D828F000B8176D6793F8537598DA976A29228966AF45F698\ BE394FD0FBFED864BB1B81BCEF8D9FED2BC7FBECEFC31D319D6C54648C9C0ADBB83B18A5\ 6E8C1D72DB37FD24EABA87F6C9767E3B3FA4566DA71D03539EB8E558390EFB8B1839AFEB\ E11FCD2F81774674228FB965D4A78164E57F5348DB47E06C0D2507B9738F3750D1780D49\ E485B9CF89A7C716F9A628AF:\ 4ABBB43F2BF9C69B02AED5D4D82310F2 FB669C4A5B01B8808E3A7A08E47D2ECE63202C4F896402163D88BDE3FA02A0C7EA924B80\ 8AC430A3A157B09FDA1991A18DE25F842E2DD3A221AD2804660791AE592E60D9991C59D6\ D0E50CA49F1F4FF5AABA0C81DA2C36EC169B420745357B82201009C2E2EF15853C65647F\ C93B587E25415AAABB8AAA7B441F8E1616A1DDBA24C83935C5A4755C19719837AC1EFC72\ 75B37E264B1AF004513D53BC94BFF7D6763AB8AEA592FFCE8725BF2CC06C711AA2691475\ CDCDB82A28ABFBB1D166A20D3563B66060699F16:\ EF73A9BB5596BC30BAF024316E5085A71F83CA9C8BBEBA4C0F5EACE57BD0F19A9688590B\ 4F255E048E90EE2F8316885ABBC82BD6F15FD6AD56C3C58D5FE6BF3BBBC6795E4E9D424E\ B570CA5775B39EF117F4D0337F88E6B3096F0206F89D01F1EEB39A388F42C44CB03AD06A\ 6A4E914D545499852E2EC5F1F35556515FC7D04E884D48D92BB1ED179C485EE5E5B136F8\ 1BEDF14ABB843AC9292B80440FDB5CDD50EB573C744AF2444BDFFFD785FE3535F698F446\ B533FECEFC1ADF7752916B2B77C68F1AD08A77B5:\ 8C366409428A56AD49CF09F5C790325F 379AC957E6721F2C33CFA9C8E8FAA85B3AE28E346E99FAFE06C5F2497724D800C332A3DE\ 25424523CBDEBB0EA95AA31C88B8A00ED3CF0E90B42BC1CF690618CC15796E1966AA5706\ 7D5B7E172A1F818C1C7EAF58C27E6EB3F647879E9785FC8362210C8E8C458A60AF1CFDBE\ F698869E3347645C6D9AE7407F8DC7A1F84B20C1CEB17E33320F9BECC4B3E8E450BE9F59\ 56F74CF33F764526F097DFCB63C57C9798F791B471C494062BB6675C374EA7273E69C12B\ 5349172AEED9C66AF0380490B74F2293AA22DA87976580994A5109B5:\ 7AE8556DD6A8EE6E86499658479AE39CC400452F06071044CD165FF5C2B85FD59DE4BFEC\ 7FBFE20F578C1E21A53BC896D3FE5D77C7F908FA96A68FADA439645F621ACDDD9E2F351F\ 1E4D87BE5BCA2D6C93584DC331DD623925B630EC01C296F64F71DF0DD92232C7B0A0DB82\ 1B1761A442CA73EC3FCBAB386B0FFA35754ED91B113D51CD9239DF73ED46BBE1485075BA\ AAFAC363F541870AA96EE7F21C4ECDBC0DA9F309B2CAB1C77D6220B2BC9EF5F2319607D7\ C3D32C9F007C21CCA676872818085C971FFB778138C5398EE372DEC9:\ 0D852CA9C6CB0FA6A95F2B0D414A6F19 84B35BBFE1FFE781B931EEA1556DBA23D38673BB229EDBAAEA95A93736104DF3805D4968\ 95F105FC5433F698CAC70526A74EB67935788C35D87E6ACB63A285999CB981173BA6EB6F\ 8402F89D4D2DBF0A5DE904D5BDFC4864C6E48B906090DC418E9A91BDA8BE63E3CB341B57\ 0EBA6C5095A478C0FF43C062E12FB180D0B74DA39F7B562FFE9F652B3FF4356BA024777A\ C34D7F84C45FEA5EC21BBAB205C6FF43EC92782BEEFD471DD8703FBD5DE167A829443F5F\ 1EE398475A40049C2AB577B5A6BF2581420F38D22F46142B59C92ED80F44A22A49644843:\ 17B0379B31BE60CD613289C2176135F971DDAAC953B76C8B48BA9FFCA0A040EF00E97A32\ 0FD19C9D4CB269AC205DCEDA98DB7390992FA4FC567DE5A39ACF08DACE83858E03E3BDE0\ 7B75AB74CF4D90DA3FF2B95476F9A81853BFFEBD91450E71E4D5BB5291BEA641F8773611\ 12D65E7578390A71CA8778CFACD4D25F71C90D289AD29045358D1DC8E14983E75CCA03F1\ 2521969916432CB967202086B62B33AFE1FA5B5A68BD4BF19888922F814577ED0E4F09C5\ 0D884A7DAE5B08B2AABFA8FA159BEA131841CB0F3B63F826E36682208F78839D9E84D917:\ C071C64B7DBA548A42CF9656521425FB AC1211AABCB5E081D8C95FDD138A42FD6F1D808E37077D65D8FEAC80791E5D169A32B2F3\ 33CED7B84CFA383B430BD7611726230664C2471C0413CE30006872B0707DBDA38F9640D5\ E376D050DDD5526A3313AD1247B6CE98F1484D9FF0169B7190F8D4CBE10BC03234E3CA25\ 81EEB98DC5969E2EB57A4C5A10DD5B5619D80D5A9B9C3595EAD7E0B5B622A5A2F685D70C\ D687BEA1876C74A29DE026C1F8F673D66F1171B1633A05393A9896705A8E504BC474083D\ B285BF8DD893D3D699505345EB97985948DA52A17AEABF279CC28E9793D360E8D707D5C3\ 6C0047BDC6ABE83E:\ 40BF0E1D3B5D92417849BBAE059D7EA6F22D409F5563957BAD0A4398F963AC823AE33A6F\ 6E908AC004E94A5AB9E3E7C4184C94FC90EBFAC6CC70C60FE939453507BB65913FC9A977\ 21A730880EFE22439DF0C516009A06FAE30F6CED63D9CEB707C331D0EDC2945EE3561EDA\ E176E525E66EEF01E4FE4880F8F7D79A32E45CF71300A262A5F78079C20D7A9EB543D226\ 9579EC077A33EBCFB9289EB85C979951923ED96ADAA2984D6DEB1F5B3FA9CDD859EF877B\ 7594E84B99E3A9D2C8B8F984428D18A1B59EBFB851CB8EF0B4719725CF07D73E580C18B5\ 37BE3AFB34186668:\ BC12C0EA9A1D8C2F0CA4F4683EFB8E38 2D2E50EFC0C6378E1D6BF584C498600F883CB10A49E27325E20A018B0BB3F192C7462F1C\ F76636CB86F3CE38DBE3A70502A7A6F72EEFB76990773407DA628C11FBEC2E8478EF2F98\ F0BEDB6733F695CF0158B8CF5AF6097F84116CDF8B973F3B0A6BC863B12EFCEDF0AD18F4\ 755974E9A05E554654115EA2B309DC37D41B7C1C6686C6470A7A528BFD2E8ECA7E28657A\ BB5BC34532C38365FA1BA9DAA3CEBC85A9F30195E6D4EB52EF8CD243AE7DB1D082501FCA\ 2A93A4A81C4E1DEF5F4E0625BB088D0B2F4C31DC26561179DC3B46DFCACE0E82CA9A0505\ 8E2118194F6021CFDBE0D8C1D7B6D41B:\ A6A0348A6F587D6664381AE45F8A0BC69C51F7BF6C26755452CDDB4F1F101EA2224F61BC\ DBA8E97067DA55F4BF59A5D7CF12ABCF4DF18B92E4B6921569051F5E70F25698FE0D6C19\ B891B48A3E03EBD7FE4A79A250A8B5FE6662D4430725AC447B55BBDAFB259B323872B4EF\ BB452FB968E979006EA49A789F4C3743DBC1306AFBF5A4B1F421C99A3AA07A2E98A47B4D\ AF2204CECB2AA86FB9AB60125AD0CD94C799CF3EBEC65C6F4F2B864C11F513CEA9D6280C\ DF16B1F0E1F943A444786E1DCB1851681572ACA9571699B82CE9E5275E6999A1EEB599CC\ 8A0583D11D47938324E95B67407A0D68:\ A114856E299B436E09F437C57B15109B AFC793265B90D53B647275124998999B3D8C91440541DB7E8CB0E8837AEB4653FC35361B\ 55D659148D9F25E3C109B1BB92C037397DA8F91CD5AF0B6EDE7667BFCF1DDCEE76AE83F1\ 67D937EB67005D48A9503315476A43A45001F621444C562563DE6901E969F6662249A6BD\ AB7A638405EA3AC01304FD2DB772CC7AC122CD3D65B749A3F31704910950B642C8E5654D\ C10B07C614C65A07BDE2AB52196999066284CF0F6EB66CD1A62C29B683A436C5BBC15704\ 688BAB92972421903D53F2072F7B8D53B02B70F63E7A7503207360A4872E04CBADBFEB32\ 1BCDDEA5E89419FEDED04000065DF73BE58A79AB5BDF885E:\ 6CAE06C13E54BB2375E3D3C741E9C61D3813AB63CB157E54FAFD28E9A4D935E57D74032E\ 5E669844D277F211B480F0E54E4F0B09C2242FE1D5EEFF32E1313759A47E7450B55E09C4\ 37D1EF3F60A0572134C2D9B5258414BA5D84774D65FE545F1B80E7FC06BD7669D05AFAA2\ 271AEE74F8E0C247070CBA2FFCA62B6CE5BFB0B6E75055F099939AC44FEC6E9A3615FD57\ B3723119FF14C927BA06DFFA36E91744E035AE7A9F21625D74BB62C41802782201D1043E\ 5B9AE266997FABBB42ED800EA1E2F2A4E78C265E3CBAA9979ED89A8FC6C9F16BC6802A5E\ 7D2D819A7D8357B9C40B5BCC50726EBA3DD0791E11489771:\ C722C9F2A15369264DB7F54FEB0207B8 936C9695CF82D4241CAEDA1E8C80DA52CA4837BBDD2158E2CCDAA99EFEC6F1FA29D6ADDD\ 6FE3A660F50FC6C2AE456BF742081FB471A317707C523638AA27DD85621CDED72631C469\ 0A857512265A11C283193BE33BBA6E77EACD56E9DF9541BDC3567814E98F0E6D57D9B254\ 40FB7AB62AD9375B2A96F60C4E4B57AD02F62EAA06793D0C5761369447B9A0621EC2F9AF\ BE8F52E8720CCF67E4A1BC7285463E8DEAADC248CD8207739F04FD13F72E0A7A0CDDD5EA\ 0B7111582A389C21F499BB4349E8BDFAB0925E4C299773A9A546913D37B7951C9052EE94\ 55391880A77CC66F133FB8AF5CBDDB2433F3F9D52F94A15D8A9143D0729F6D60:\ 8144D92331D338C920C0BA0C6B32C6EE28BBCE148F6B56B5D2A12D029734A41B8B4071E4\ A7601A88E8CEB031DDD38E4588CCAA900E8E23AA1C3D4AAD39FB75B90A8C47ABE3641FC6\ B04EA1E74FD4B4B9E72310F79D25509B3DCA63BEB093A08F7149A23E0D548DD5C20449C9\ 0FB41C88CBB6D1D51D35DE46D4112090926A7948563487E34E7507CCBA9825BB48EA8709\ 239CB49CBC0FC09447570E1FDE99E1316BC24A5CD38E53F613152BA9BAFEB065AE30CD73\ DADEF90E4E907C0E55EA0488B9CDD20926B3893D8429E4C9FCEA17087B6933064976F250\ 3ACD2D8D0DF4CF6F10BFEC0C914B0C46E6FF575464FCEB1EDC01AFBE446F77AC:\ BEF7E425E917D067300D40D19AE12ADE 23D35E037CBBA0A76A46DD433B547E17B54A81782A51D13829BA301250ECBEB0EB598F76\ BE470D8411E7E58516873B4C9BB87E4B41C4DA3BB941C3F8A9EEFAA507D30948692ADD5E\ 53AF8EF3CE42D6944D8E2994F45F4090B8934BCB09B94B3BF04726F42B00ECF9D9893BAA\ ABFAF712E022F82317CFEC8AAEB7242BAADEF7526833C2EA481816856BD423CC652CC043\ 01C7212BBE69F251BEBFCACAF0F12A19F99EC4A88E4381403B24322133373ABE881C0F97\ D706EE4CBF3F5F7E69B8624F50270E508ED0487B0B8116BE1AF904C23B4F704BCB8AF92B\ 118A912B5CD0D759C3F73A6331E1337B693B7EA65A017CB62C51A4E4AC7C6AB9530DE747\ FFCEF27C:\ D968A79959F5DCB6486FE846504AC0E8753E56410795AB9637BA84EDD9AFD692DA253ACF\ DE1FCEF40280D30BAD93AF2386B755835AD1CB18D472DAF37D7C69109DE9898E09C69DD8\ D5DAD6D6640246B28F905FC0B1329D44E9AD2DD4D5D467862AE364CE7A81D5433B00CAF1\ 1B9A1D7D54910CB2B01888348ED423A2BB40CE0CC23210CE10CB9B123AAA8F41A3B25114\ 398160C0E9241CEF67F52CC419AD31E5E04C4CE91716ED99702AE69E7A1D501C47A53F81\ E611827C7694E9B4B9446F263FF1170F4CD70B432EFEF97F0916CC6BA81A8E11EC996526\ E9202F6910FE8A427CD0BC8C7BFA23D0DCE30FDD6C2F36B582A3C9B698BC5CC6CEB3F951\ B26D586B:\ 19796BDCABF22920277106075D0E0EB0 [XTEA/CTR-BE] ABA78D16A7A85065A61F31B9C9CD4053444BA2A36C80E97C4C7BD0956676FA39:\ 4B33050781F6003A1A4CAD8B188DA93FAB60C28BBC1E5D822CF7551986E2A5C2:\ EC1147D3A4CB70A20AA8664E88E60985:7A38520947DD623F 14E75459D23667074E7A7373034443BB4B2C7CBF90EA1A18D59A93598090D92CAB4F8F15:\ 7C2E05A9570504B7751E4614FECEC7F7449FA1B25895C4435A29AD9DA8AB41A8CF06048A:\ 2FEBE8549A5DDDA945398955CBD4D3E9:2A95AD603EC4B59D 9388E427E80A52FE5EB761560A2494526DDD7B4729FAD683E6C8B57FB46782B9D016AA0D\ DFC9C313:\ 8020D203BE99C6EA448C64EC4CFC2F02AA220CC6194EAF81D938467E8BB69200B2F67AB6\ D6CFF596:\ 62F04E49D6CC94750FA5CFC871DBDCCD:25723E1410D2EABC AE15285DF8745CF588C3D075C545591CE8C87E0840CD8EDC9336ED08E42D2A4A6BA0B7D6\ 045AAB25645208BB:\ 82777E8462001C6BE7990AD149ED8AA462CEF8FAA7F3377CDDF07BC89F0A2EB39439756C\ 31D21E932FEB672A:\ F7E815767C7D7542BD8F0DB41C8C0E95:8FE94927EEB3ED8F 94E0F6198EC8C7C7DF35262ED38CDFF2D5BC48A1FCA450D250345996EB01BFF3965F221A\ F4EC43D8CB7FB89ACEB01B1A:\ 8468BE0862149C3CA03983C7AFFF1D61C33FAD83477714CC51D40C6F1F045530E9651757\ DFFA70BB1C4780D6F44A0E9C:\ B64DCBD21A7CB07620DEE39C74BD598F:74DFAD2D6C7375BB FDEBCC1AC9107EDAF4AF10F34B6E1C8EE15797901F35840504754EAB53BE680F30BDD571\ E9B50289987C6292BF2CA838D932DE34:\ 76F9EC52A2E6C5EB209E7CFB4BD40EA0CAB974068A0CB4C3490349D3024CDC522D11FED4\ D91D32223FFA8916B39D458999FFF43D:\ 728984B99C7E92CDEB49DE0B3FE42AA8:888F01082B9D2103 9B0E0711E375D8EA9735F98F38C58E9184E66EE71DD12B9E14F80095FFE53C6461A3A362\ 650D150C2FBB6F84DCB0789D6E7CF63D8DA9CD6F:\ EC83CD5B6D2DD5B438CCFDE65580F1A45053D01E15370119219B39C124A4D99F8EFA44F5\ 001BE7F18C7E0033CB1411AAB97E104196434346:\ E55ED01805B70BA13D785D8D859F15D8:5C8907CD33AFF98B 22E53F89A5E86CD4A874D5CF372E51362E8F71728FD855730CC87BE1F57EF26577689C1F\ 5390C158B6E1ACDBFF1B5BA5D90D6B4F0C2D484D9F0F513E:\ 33F1FC8F0B7B13EA9F2676597870D55E285F7692B5F89CFCAC80127E5E85D1D3C5D624E2\ 2A4C36066F7EB9AF665AA1C7799863FF3F5EFA3FF027CB9D:\ 1D22726357C301EDA933D7910D3135B4:E046855FFD91DF19 C1EAE81700F699ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212\ CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC:\ 25226E84529A261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A7\ 2372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D:\ 065EC565D8BC713866CFF86B0ABC2BB1:27100BF3F22105DA 325748DA5C629AFC738D34BF32C84DEB40543C276A3A2C13C6A4BF23B885B6AC348D2746\ 7BA3714BE4FB1B764B81FAD7EE2D062277B4EC428F0A6E6CADAF5EA55860F8AE:\ A0FD6A60A1B8A729CC52D41FBDB2E5E7896EE8C9944E6E63CD1A769BF278AE2E8CF48115\ ADEA864B00DC65B950C68D09079CD81D35459F5F483F9040FC38AD50778B4217:\ 6AA995999C4EA6C83070988AC0A795F7:01B5B1C6E92BBEE6 23019A5A7C61262EA124DAB215A517423781B9C1BE56B63E794BE6836026F7CD55531BFC\ 08665896FCC7CCDFDCEA09207A8785C8DCE932A00A5D105A2D6682A32604D1292207F195:\ 47CDB6D6BC25AEBAD70E99524CB0EBCDEB48E0531A35E505FFDA421A1F27ADD6BB9ADC57\ C3525B989C0C1DCE37577877CE328E6D317D0655DFA80AA8B62273C7AE8DDDE05EECD178:\ E6D35BBAC75EFAB74AB954C8C2D0D1C7:6582E6C1B4A47B2E 9F8B703434DA473871B05A0D83EC424FFBB0DA17224C95D33178FD28641C1ADE87559E7D\ ACD11F819CAED832B095F6F804FF63D4E239D620B8E6CE8DF1799D028926A3FFE28BF433\ 664B166A:\ 8E1F3C026E4885E3693FEEFAD56DB8A898269D61CC92CBFA0DE1DA833586619AE9D0B98E\ 54028A2AED24BF2878B1894F4BFE090CF0A7F2627106DC0700F43D31914586DD1A1CD7A1\ A7F5D82A:\ 3145D3926C22A5AB4BBDCC163CE93E0B:CB8BEA9267176935 4592FFC1D25A2ADCC9FD5DE77DB143AA6E17934FF882E2F8E2BF0D8BFE6DFE10AA33D124\ 199BFAE8D3C2BC2B4B9EB37FC6289C0ED2A6CDDE407F78C035CAAB36653FF686FAC37E51\ 76B3A821E21CF7B1:\ ADE67B169947C994E246676FB301C44204D8817BC3291DE6F35552E1E8BEFA5763F1C605\ E2CA7442847030793EF1CD830F7103ECC9928FC98EE4B346872ADADF439464BA40CA0D78\ 63C4C9946E723E71:\ 353358DD5493234F6BE6E3AA3AA4D393:A17467FA740E2541 E3100B239057B16CE51A754047F20D6537DE016ADA61056761C1D9DF3939AC8C0AB155B4\ 2C9C3BCFF3B63BDADD21954C328B4CCA4F1EA6A57EA8B7A99BFCE72E57CA2C87C4ADF0C8\ 44CB76A4B8DA35BD0A3952AA:\ AEBEC1E382AD5129278CB4C5A67EF92E64BAE93C1F4266FBD40AEEE0E28D5048E81B0CDD\ 2EB7851B7A3CA43BFAB751C54217DE5315D9EBCF94238FBA5A8114C28F1AF6B9110DBC84\ EF13F621B8690AD7480E9E90:\ C313724761DEC636790E38D93F299530:90C5A696C66726F2 6FEEE7F77DAE629397B0EEBCE6A4E7CD4FCB4F14EBC408A6798475F3EE5C560F0C38FB0F\ 9D2334E85B75C36632EB4C9ECF80F02B47EC1D589720C104B111197E5CCE4D08441FD98B\ 9D67E108BD5AE4313B5725F7B86BA4E6:\ F73ED0FABED7812409A04F100F1523DA22E013055537803A3F6B2ABE9479A199B2DF80F3\ F379640228C47C0475A68A86A455B4E53D2CC078A9EBB04F37764714EE9F0202BF15C393\ CE87A6E339CD0EA52DA997091383D151:\ 3ED02192D605AB5AAE56CC630BE39141:09808B88D15118CD CC1B18F695290A169D5DAF220622250E4C3383C871CED8648365EC2DEC9A14D5A522441B\ 35B8AAA51FD6D06EF8E5C8F6A12F8EF068882B826E1B97844F0F088C1214DD1769E6F1B3\ 29CC62FEAE91D1AE9CA752AF80A966AFF9495BD6:\ D86A1A79CE209972F3F5DCAB0389DBA578CB0EA6FF657E889CF6CF7C30C746131E71927A\ 3CB2DA42A823A19E176510CEFD9AEC30D7F648097AAB847840ED396FDFE4CD1EE0C131C7\ 63C17F551457E5D0D933EC1CD30ADABE4E69298F:\ E53B03BD00F9E5817BBE38EB1760F950:D559750E3DC7CC19 D150BC8369DC06BA57F7CC241766549A52F2D49D7AAF9CF7D6BE0334FAE2327FCC76104D\ E5EDF782E32B8CCF92669B62B25FC619DDAB77BF9AEBB2D175530AE97B56BE01065B9532\ 4EAF86AFDDED0C93DE01F139E6B0302DE8F59954F0B20793:\ 16DCB3F6A247FCECB4B5C7790796166540892230E00AACEF9EACE255ADF579F6BBAB2F2C\ 92E8389EC54A6F039963E980550B073C0CEC4FE554B2A23C69776D35AFCD128559104141\ 5CC9A15BD1A4A89AF43F702B06F1807FEA53490B80686A52:\ 48E7EF6FED168BCEC4069E3E622530BF:7C8A47B36E7EC263 1B1508A165845B4EA7692CD8BE5A38B42AB114B9A63E3243D3DC1AEA8D279E2A12BFFED8\ 88B7E4702CD51CE577E04B9E401C1D6ADAC4222FB87A5BC81CA331DE77BE79D3C9287839\ 8752DC9678D5ED422E40B469515A64D1E561DEC0D3599CBB88AD71FB:\ AD25FC4AACEB3BF13B5620DD0437C0E5EC62869F5C0296C7A0666CFE974603D9509E2980\ 4075560D1674EC8DF26BB7FD8F9438731927DF583D8DEFC45E960F0F03CC71539E56F6F3\ 3FF324F265D4E3596F97630FEA0521C29210830BD5514E8DC390573D:\ F931CF1396F15FE1FBED7A230961C729:5DC1DA62482AA6EC 969875002E0CF955F29EC9651D8AC98B667A8700E96EAFB42AFEC3EFFC9A219B614BCBF0\ C32028EA2ADBDDA5D0E3444E1658C7E0CE20362E00EA73B2428027FCA2061CF6B492DECC\ FCBF06E519D05BCA2282342DED05B0CF2E1E25639F58DCD220922B690C5B5E23:\ 4A1A307B23136A6C15065ABE453209D1B87413260BE453F7231629F99709CC9F56D25FE6\ D2976B2EB968B83C4F58DD21DDCC0DDB4434633181E4384EFB89EA93B679AFE93C77E477\ 6B28F504514DA0471C49F6E5E40BA90BF167B3849AC6D7D1C05460EB0D262936:\ 238F54FD6D70A8E8E03F305A8136A4C2:9C764FCE696A60F5 0116DE193FF6B1F703B18EDF87610137D14EBC3119A979CECDD460C38A38817CC12FE56D\ 2110442A56A1BFBBBF4A1CF701B502C6D37AD1A6269546E07539FB4EE8612216FD3E69CE\ 47513CDE9AEEA674D6DC1719EB4A08A513DA5CF063CC9C6C037425DF4A44766516E41FAD:\ 05CB3542A26697484D30EE15EAD8DDF8B5D940F5BEC00878DB6FA73D1015B758DA221815\ AA1FE5F237AC3F9D6A24E946097A9B1F8DB04D5AC68B0B6F164596FD087E06649F05E750\ 3617BBDE7868085FA3053C79A1C878C8FB46CFFF98F782FEECCAADBD93A087497A9355AE:\ 84BFCFD08B09C9515D703EE5F629242E:8B22EEDB409EBD8D F8810BD894C82BA767986F98DE5CD7E7F9ABF6E82D88AFE84A6735547CBF1E13F285C35F\ 8C5B3DBDCD89D9DDA3AA4CC4C153426E573A585C9A21A77CDC1EC886F64874ECC2482458\ 706366950A1650A30BDDB73F9A619CEDA1B806CED6E1ED00F63650C09490CE87112F1319\ 431FA016:\ 8D2769AC11176C15B77F0CB8A72B34160A1E3939EFFA43E098B50271D9B031FB9F52E6D9\ 49B150AC630B2CFA85072F797C9AEAD9F15735C69274A9BFBFA4BE9E759552B8E02CDF6B\ F07DDCBD6C5BEE9C01568D6129676D20DE0762C5D466252CB286E0A1B7C1CE6E4BB3FA4D\ 9B56761A:\ EA279EDFB80A909C95158D9107E7BAB4:3D899C4A9C64C494 E1959869B615E838C4362ABDEB51A3D0BFF2CAC32AF78E27106B1161C5D6A893A5A31B78\ FA92AC70DC3A9CF68DC62280D963BEE9C04CEA5F1FB32B15582B37FCDAEBA18DA3B22278\ 3D2E7484256508F26BA549AD56AFBA3F5B0161AB6A4A6EFEC326477E92B025FBFD29498D\ DCE8B9D274DDE71C:\ 95936503497BB10E8C110CF1A819FBB13DB05DA88723055D8CBCFF2B15C8DCDF12BC7810\ ADD4A82AE8A85DFD6D906B5936189B6F0B18B9979A0C55C08E53BDF37BE251AB364D85D9\ E94F6AE957131AF7CA475BE7F19954B45CC3C00867B9EB574B614CAD4A66BB505EC9996B\ 7DF9467A39096CC3:\ 09EBFB4079E906C5F8BE9B2041A32305:998215883ADB9F54 8B2999AACD2CA034908EF05C394CCEF00F816E57FCA840C6010760EFCD6E3F3AA088784D\ 530AF024FD9E3BB2B4EBC5223FD3DB3493EB6E2E1876EBBFD4BD0090004ACCEFBF3756BB\ 82CD18EE4CEEF6FBBF09AB0DB0465134E848672FBCA3BBD6CF8AEB684C4A82244D7A5D44\ 468E0F31C41B908989B7EC26:\ 51BF0E20F1FDE6F5B7FD1B72749709999147D80866C7D12E8D37CA2896D67F889FD5510C\ 8F74C62B8D044F552EE7B009F943110CD3EEDACF20DB04F3522434D5BA4E0CCAA29DAE39\ F18CCA49EE1CBB9515C13FBC38142775ECECD778BE72497487D5A0763F20A6F84BFEA19D\ 4674066E934D8D73ECA96C28:\ 809C0B33709493BA086F146697A9DCD5:F263A312E9A219B9 60C66BE7E8951C3E406F5635AA22FA1869BFC560F337DEB230EC6FBEAF805A778421CFBA\ 07166136F1C1F3AE674F895CE24BEED79C81BED23C320B12C45894AF037CDF91BD540563\ 7772D4BE4B06E72181286194BDA09BA7FE682972E1D8972A09096612114DAA9CABD80816\ B5C50B2C1644FD6ED8521E7F82540F15:\ 64A20C4BD5F7949AD3583B00651404AAD4496D5C3C39A7D463CE22238A741DE32083AAA2\ 38E3320DE7FE007968BA55B1F14AB1E88064F2C112A0E97C37CDFA9D97355692E0E9552E\ 2A71D22DC2B5866902221B7AF4BA94810E74CD4D6FAA8E57263EA721C2959A240FB33634\ 6C602C177F95B40B11E0DE004CCDF6E8:\ A794395BE934B5BF5FB38EBA5E0D5406:4ADDE2D9335FFEEB C37A738A4E6144F1E5EC5B8E1E61C71AA0449D83E3D207136CD63D1A8F978D8D0B00462F\ 3A10B193B2F5445D2BB8F0C71605F277388A23677CCAEF508041C406219D8FFF569E44F2\ 4D4DFD9216D261E244DB588FEDA33EC4B87A5114378984559004ACEE5DDC6C16C2A25D5A\ FE42C961CD5C418B44E218A749A357351131CCE4:\ 64646829143CB4A25661723F772932F14BF4898344F70EEF3186889849AD9D1D98CB4805\ 26FFE8E7B6AA15F3A9346D10111E79C809FF435EB8851907A90530F2B96A2C0E1E1A2587\ C8AE735222967BC82A8106C604C9F2FB15E4D7EF3D8F9806455ECA090A0027BA5D2D5228\ 7E0831422377336450F45D268A6D2BDDD474FD84:\ D9653B71A3003270F83DFC49AA48C8EA:40E4D61971A2D857 2E3ACE745E2D36728751E0A18448971BEDA6F21A742E21DEEE68922E89E85747EA4BCA5A\ BD903FDD7EF705359E847687C5C132BB2556634DE165F00BA0E4693CF364CB1DC100A073\ 253732050AAF7AD77C2983532908E888A8DAD84E43A4ED29335A5515940177F8325E5D36\ C6892E42665EEB814E6689F0E06A3C5A69D042F50EAAC4DD:\ 287F31451FB5E6769B3EAAA58506EA403BC6F47DE662BC5BDB558523706DAA72B16174CB\ F0DAA28C5ECA6EAF37EA0866467A8860ECE342104E63687A2191F2927A0FAA1624BAFFDB\ 8660DB0FA50627509D9AB5AC422ACD521436355FCE9DA020C11D402A02EBB46DA363A799\ 9F348DD815CF60B115166BA82581CC01358B5C7F52401E98:\ F546A2AD3A1F291A995F4C058D9C9F78:7F993DF4D373BA6F F51E1F304ACBAA9CA94555934652761CEC135E591492912468C7FBDA2807A61EDABF838F\ 0EB47B99DD441C54A03C65AE73B2343A9E12C6B1B7474BA6E88755C90333110861AECF6E\ EFE5CBEE18ECF2631FEDDABB3AC0FE36DC66B1E78D8FF5162BC5323F85932B2154089975\ 01E3FC0DAAD12A51AE1F1387C8ED8B132DEF421D0727AFE59788F4D3:\ BED9B697D1DC34037DFD5245FB74D684103E9F6B649024911976336DF5451443FD4B32A9\ AD91B2679BC138066DC9BA6C367277EB7A7AC67C505CDDEC6300D26FF5C9E5825420F356\ 532D78080459362399FB9F08684EC2693AACB90382E326431B1AE0822BC6E3C4D67DC93C\ 301951E8635E3A19A71F0EDB63D44E53951B097B5A0FE3681E2A472A:\ B8A2DACE13F418A8C576AF7F5DC03E79:00C100EEA0489AE9 DD2B20530B72F4E675F1FD7AE4FA8B0EA84B2946F1ADAEBAC8DAE5D1168C4084744F879E\ EB9507B340EACF728D0D10786A6E8A4408908A6ED0E6198D8D1675C918462B82EA0F544B\ DB3E194ABDFC9B40E2AC4BE61E907A70352532648C1EB6D72FC114544DB439516DF681F6\ 42D487924ABF0524C068EE4B9E45009BB8E99DE5CA73372A2F7DE78439150ACD:\ 4A4EF7F6C0933D12A4825EF1C293FEE5F95DBC69521323B6BCF527437513B878D0DCC039\ 0708B64CCBB8C3D7D1D1FC574DE35C45C2D48770DA757A65A177F8AC25C3F1F59A848E5F\ DEDC9ED2801300F1A3ED44EE8A9F5A79924BE7E9FEFBAF6836CF18E6F28DA81F87DD2ECD\ B48CB009A448172B556D977315F798218EFA44A794F257D250CE73AF151F74B5:\ 3EC3D092356A5B6874DEE6031785E19C:96F16B8BBCECE7FA 5BC87836612D3D7FCBAF662B16924062C237658471CEECC0F1300C84531215406420D7C2\ 02922DF63F6864345581EB8C3345BF47D5FD9769563EAABA49A042A21E1CB39F51165BC8\ AF5418169C8A0A9222C4A333559CA6F3DAB374D6A342D8AE24E41C51424585520415590D\ 2874F93A7919F2BE0F25438F0953FD3F8FD2804435DBE1190660227330D5B0FB3BBBDDC8:\ 077DFDB7F6E7EDD024C475FD57BFAD68BEDDF0737C1A460A589A8647212A61B33827D953\ A2FEFC7F48E2979C4DFBD4285D747C52E3CE232FBF2307FF9F04E39C3D817B7402FCE656\ 08E599E37F208BA8684611C8859B2DA1F7F6797DBE58132E0BB143BF990D1D3D8226C2B9\ F6BC50E8A03DB6C6560582C03A3D68F48E781B054DD69615B5A63B6136F2AB75BB9585F7:\ 11132C6E22979CB5C213191045E750FD:ABDC21EA87125B00 673436400DC4FB49950303A83E0BDF18E477F638B5E768172D86C2223861A86E73A5C423\ 9FF593B84BC3B98B67C56897B6417C9E5BE8ABA361E4EDBFD95DC3B15FE96E51BA717742\ C449F635C645CC3830CC7EDD36D1D34A1F09C46C33700BBABA29EE856A86BF6D146166CA\ 975B2BCAF3C7E3C6614A03FF47BDB498BF3BDFC328C79228303AFE01BD80FAB8D54A0F2B\ E38FE911:\ 34723A46EED388E0A273E9DE120946892EEC04EA668325C654F43800D300970DB9009E29\ 9963EB08BDE37E4AAE1B3E540EA2BABE50534B93D3988DD1F93F0E49761D83C3F95EEA97\ 9241A22A80D969ED22D826686BEFF174896D74A1F7000CBD164DFC07B92EB66EDDAD1194\ 309CA143605094BB8C330F31F5232A0A24936594DD4E7BA41E6039A3CAA6205074656CD4\ ACBEEFBB:\ 6A0DA91DBCA54101F99ACB1362CB882E:7ECFD1F603D67C77 B5FDD61F8E6110D7AF03DBA5AC5342F9119F2CC317F1985CB3305E7DECD07A1787EDBA37\ BC47AD1329D0752F4400E506A098CC71B83ED798CA67A01863FDDB8BC2952C951B46BE9F\ 8D9F83B7E0FE32F8FF69FAEECD49D2ADFD62C405104DEC61B4C3AFB6088B5369E88D11C4\ 9E7B5F4DBA284CA2BF5846275C5C2DBDFF8EFCB4AEEF12E215AD6423E9D5E6213382D75C\ 27D0E6D14C78FC36:\ E42423B8CE44B0C3F7BADCC2E0EC469969E9531CDD4A0B7DB8646014A5D4BDAAAE109619\ 8860270A1283724DCE0E886AC9489593FFDB00B478E8D6BEF839DE633D678BA945F26D5E\ FADD08297AEF5D3618645D200C627D6B6097BE81248B23F825FA4442C34C2F25A1E41D44\ 5E283CA3BB723681E654DCD7932A637834958D0C80DE6AE92D298B72396BBA5119DCD873\ A403358ED479D453:\ 08AFB509E7385CE045789878C4B13D46:A3E66AF196BDBAE9 CDD81737DA50063D7581BC6FC8918B542E0F161D0D4BA408B5890196320C71DA508651AB\ 850C565105C854872ECD8A336CDDB5511399219D1E15387F21ECE4CE0FD896508D041C3F\ AAFA75EE42E24B6C5FB45BC7B98FBF17E734FFD7C9E7160571FED42DA5CCE42750D46989\ CEBC803002B72C14390087AAD352BDA885B771AFF5EAE3E6CF1428AB628F2E792A92DE72\ C5E0234BF0AE05599A15F829:\ B492AA4DC9B8C4CB3CE1AE1FB256D0455444D5BA7495BA36D8EA9B6BDC89881C9AE6044E\ FE078AA9525B71FA983D3DADC6A03B5B1E327262B21718CB7EC11F46E9CD18DD6D94A9C9\ EA923A459DBC518578D17184C6B19647C6F6FD3A99CD1EA09B97508DDB6B7439FD6308FF\ E609A7B1660B1399B07F637D7C20B8990A652177A3E634092784A6499A994F7B2644FC1E\ A597EFB4A4E15F08749E5186:\ 178178B147A4454EBC944527EB05FE22:B3C0BCCC0FC8C398 45A13F4D44F679618C049E0F6451C1DF764CD6975A08ED9FC21B7F60938FAE7EFB90D9C1\ FC9F6EE0653319532D6E5EF4C91415360C42B13F3E9C4467FB910D617AC9A73EF44AF243\ 75B1E8A7F5A5275E18024276DB173D723B9A834E4549980CCC09D5DC7D9AC3B6967C1127\ 9C3E3847C3D1E9BA98E7F9F577E322C1985E06ABF75557540E676ADC9741DB1C4B078814\ A62E001C3F98B116E91A6E4601CA5F90:\ 59A7C4B96EE561294D33E83DBBD876250CFDFB91AD6A1F76E112DB95D9F0A2DC1C5BB58C\ 01F650C933C9948A18C879E2115DDCF59499DA33169481A521576695AE9A248A8078F5AD\ D5DC1E63AD39A001346BA3E3B541A9FB101B327B0DE2363BF17FFDA8CBB33142B58484C9\ C7D888E0CD7B4482CA3A883930E35D581C755537AD4A7876E1F028C8344BC76ECBBE2AD2\ 5BDE23FE9F5293C414D2FEB1FE94DC1F:\ 0A0035EE3EC39ABDD835B30D054E63CE:6345FFDCAEC79C12 36144BE61EC490E90F95D38A8FA17A2A9C00B4843AA12D8030D01536C349585814E7D280\ F292BF5C8CF2F4F2E68CB991AB0253045626AF958C5F591FE34515B29694AF39899DC4EA\ A1B526C3AB2BDFAF51378D0ABE33EC6892EF01D281CD2817112D1FC685C86693A2734C5B\ 5CFCF6C8145C990CAECC9B318EF7F5BE8B6740B280A39FBD8B9ABEC947277779ED62229D\ 2E67EDB26F34A9A72806FE1E93A4E2E2E5D119E1:\ FFC4706302E667EC36B915B4298BB11B0D2D1FBCB0DA35A12D1255AD4048FF593B880E96\ C2F9451C8AD38D304148E2DC920E9B26ABA72CC05603C6DFC21CBF7B528142422537CD56\ 4E0877FBABAFDA326B196814DDF9FA8515C91CBA0D45EA8D9550C6B95D8FF35DA3F3A1B3\ CCA42FEFC562177FAC15DB5279CA50D6A7D342EBA98A426BC7943133F71A97E074AB87F5\ B30F8F23CD26A8309D78F69D8B39FF2DCC3152F8:\ EAD6297D0A3A3A8612A17C4C336E19D6:66B556952B67E560 9B46EF1D1046A03836BA53F6EC68FA57B382FAF02606B4F272404C754F368DFFB1225CA6\ F9A26F22B0554818BB9F784F2AA5368B42E82A4C2C1052F656BD2C0272EDF95D997833EF\ 7D1547E08E407CFBE1C996E9DE05EA5166E1236FD6FBC70A494FCA1A6A17BF4B3AB12E92\ A78939BDD5A538E55D39E789DCF2F4DF7A8F79452FB4ACEEC4FE364B973357518A79D761\ 10353CE90D48BAB713D7B7D63AE14AFD7913F4EE74F02B51:\ 6E9151C9F82CF529E7A2B63C97E451ACF59CF00971B9789FEA5E8B1FD3071A64B312FA65\ 65A89E42DAD21C9D6BB5197C7C944C69AD6071809316E8BE5B67A775916A7E8B633BE189\ 00DD59D26612FA4624D12AFEC3C1BC39D1C9146761E0B3815889D0B3C37B860D4D56DE04\ 2D163D9F7236D1293B42822870E4797EF63FC00D3A8900E85F5BE156EBF2D97A5B71B56F\ B0AB95FBA03C4671CBF97B300D4E90569EE9D586A4305533:\ 4E7FC8BD2DCF8D0A6ED122C394D6464F:CE96ED105D3C7931 DD3C2F94FCFD7C101022B328D3F11A81E8A47A9CF36AB9C03AE81433B18581E5B1512417\ BCE9AE91DFCFDDBC5BD6957FA2602E12223E98122BDF22F0DBBCBBDD4E88CD2A87C0334A\ B108845CB44ED56BF25FE3C8AF0C1463D2A0C6E149C218B9942C20C4FA5F42CAAE9E0FE1\ 36B238B495FE1BB33EE712CD11FC78E2536D7DA293D5E624BFF86EFFDCBDEB7CCE8B05D7\ FD4D6D4B926C6234E602D84B3E93FA5078EEA598C3E8CE3CD9BA61C8:\ C749DB2D42DE856439612BFB902897122B6B57B6E5B3DBE2844312CF131DB3B7B65B4096\ D1ADA9C665C95ABA1AF299385E8401310FE9A43DCF1D0239F4C88493827F7EAE7FF5B8AA\ 2F7A1F8E42F9D3B90EE84E92B4F136ADFB4D459B22195562AD525F0FF12E64C9072DEFEB\ 31CC0331B7AD8A78DAD43E18BF84A1AC2CEFA4858BA1895A15CD29F4AA29CED0B5D5590B\ D1AE2DE335E795CF5645FE9F9253077144F30EDEDFBFD93F47DCA24C:\ 911E1A315CD2C8126019607442FD4279:CE1FB0B32F6FB617 FBE74B418AB2B39F83383824C6909FBF0750738CF218EBFE913492E6B458CD25BC79CF2D\ 1BBA62CD4EA9924F13E9BE3CAAE81F9393E1B01C213D13EC7B32D42C4B896614397EBD25\ 960F2543AEB59DAF8E061F80B2D34212202A91D35AB9E9E15F26A8BB1E20E9C8645EF0A4\ 0727C705EA03600CF88F58E2065E920DAAF41779281D02BA70DF465DEC7D34669F6D0D8C\ 527AC7BD9A0EC3519C8DF317A697D4745ED94B13FED3FC8ABCA76D6B4FFC1390:\ 79E20320F675AEDA7E1D50A32C6B6C17F1BE8FE14CA9818C30AE46830A41569059926D7A\ 1C238F7AF469C19705C5EDC127EAFFA45026A39F49A5E71E3034CF4EB738775CCE69ECAF\ 62CE39CEB45D1204709B26F809B53255D1513F3F8100DCE3EC915E162AB17C62EF70D804\ 8C24E2CA11D3958CA9D06A1F16E571CB5BB39B0F28478A68BA51AB7A5C14611DB5781C2F\ 3302A15A7635B60A849D9C0080C62D244FB03670EEC92A4FB403A7BD089027B3:\ 5283BDDEC2CFCE31E61A003516C9D151:7A2E404FB6C3B6BB 5D22783F9FF3BBB0BD89621E7C18E4647BABA0C76563CE14EB2AD5C4F6F51A49C513A4F9\ C12CEA6B8C24D27BFED626824109E9B39B7468F39FB856D6C3946AC95C1A211FAFB4F767\ 3717EC97182CB9EA000BDE3F2905439EA5F6579FB7E6A0E8BB33D2FA3F02A5D678F1002B\ 4F95B2FD4E1C2559BECFAAF1D712AD4E37F6EB9088F81484ABE54B3A959550A2B41F041D\ AF19167E394FFB9410D71C2CD90682D0AA6CD22D8244B6C025B1F5E877DE97372286C835:\ 811F5009DE77855B575D9BE64ACD8272699862AEAFC0B6284F4481CFC5FC1D028BA072F6\ A2398D1DD99A731261C5E4543A0FEB7E089DBC6FA7AE9DA555D0B92A58A4D8B16A39777D\ 3368B6F698144B3E5773EF0501A41EFBFB30A1FFED14E11CAF106AAA515AB9FFF8AD9AD4\ 917155083754A44FAAFE449205D47F5D7296CA3917C575FD3ED10B26FA6A218B00374DFE\ 8EB43AACFC5E7DA3B514CE47AD69016EEBEE87CA8AAD668CA270D6328F7BAF60B0647CAB:\ D2EE5AD0C6B1277836223D2B8999EF6C:CE3B759B6881D0F0 87719A3ED11A24F7EB0AFCF7743456648E1E6F170A4C98AD8296CCE7DBC9C59F761CF8AE\ 0B7719E42798C45DB57477F8D6640B5BB5A07352DDCF46FAD9CC19FE8304C1000E2B177E\ A8BB610BDCC989D34BE946F9F37C71BEC8922BB1B067EB8F6FC6295392DAFDCE5CA39419\ 87CF2072853297020A2397A0E1F71FDA7FA381196C942B01A8A3F82874AB7D6AA1BE59A5\ B9B1FFA357F17302A8E717E0A664400505A183F5D1D89C1E7EDF87713C5C114E10D17412\ C28AB68E:\ 1E52C0BE4B78C8B45805586FFD14DF7740DE330877913156D11D9185A2414BC5E1317CFF\ 85B416F2882E769B74F974F0161BF7D582D25FAD24820A08A4E1D43D214E8AE6B4EE382D\ 52C4754430628B26A4E5EC17FFD939A45C7C1EDB55329A20B3BDBDE7B62746D04A07CE7E\ 2F28BE210B6B188492719B6044ACDD221A12FE6977369FF0FA5D12E2A5F492A594992BDC\ E86A62FF3CE6E5A42897830CA156E630EF707705D6BF171C250C965F5563E235E898BA0D\ B9A30FAF:\ B793A8EB1336E6F82E4CCBC6A2BABE79:B573079D57C8FEAD BC5477DFF13EC99549F3DBA37E83231F9182CEC72D1314BD587383E6585BF97CA9FC86BB\ A7797EA49CEC4C09433946B82962FEEBFBA4DFDEC0BC60B38A9E142C92C0B3906B461D2A\ AB94321860DF947F584E810D502F84097ACFF6223CF77801C59495ABB52EE88CB775DB7D\ 39D566B9C13DC47127A64A325D7AA12D9B7D63A272B92D2FCA91DF310CC58FFB5CB8B80C\ F44B5F376AD8D06EB87C262456C10E3091ED47F85F6336F3FCE3BF04C2DB9DC0F622C158\ 0DFB14C9040DE592:\ F2A1C03F2728F33CC8745FD021011F74D89F8EA351101CDCC26D5B164032E83BC7936562\ 88E124D597BADB78E0A1EE1DA1F2805ACEC4C6F5C45616465735362045C72650E48FE70D\ 8685A2B1F982C059FA7FA04E6FF22AE885BECC2D14F8540884AB6E0C438459E89AC8D4EA\ C698FC0C516E59ADFE79800C3F49DE880C43E3745F9F3892E9808E24CC65DF92BCFB04EA\ A60B37D752B73C5DF02EDD4805E5CB14398F2BFC0F15ED5556E653A4FE7643CB609AA7AF\ 839DDBB2772CB327:\ 639366B19DF1C6C56B84341ECF8DC970:874E59C9D25196C8 C55BA1C5035F6D543A356D3FAAE8E8227D29F3D5EE065592F980B8424CED3DEE76749570\ 8C0C720FE6EAC681146ADE443AF03055294294F138275D519E3466D698D8B48AC20164D3\ 9587DD97B26C1B6853B5B274183FC73A810F00F3D748B1E96E0E7B10DA3147DD917B314B\ 8DB75EAE7DAE87210D320BF5BB3E1A44A66761F91235BEED601C87EF419A4F18EBA54CD6\ 634454A5BA0675EF68F22A7DE5592D396A9BCC181AE411E9452F9973E4CC612F72F38CC1\ 0659E477E4293A46A4FD65D6:\ 66F3195F85BB50C69719AB217566E65C682D5571AA5A6A964FC013FCD12C0462124980D7\ C8E423A9848BC784261924A4B76B8D3D56F2B0E5EA6BABED53C45FC11BD34B32C0AD7219\ 77FA61D896275584EA4AE3587101A5CE90DA4B9E874C1EB239FAFC0DA27487ADD0473591\ 5FAD188519B7C0451BE0CD042944F3E1BDA69C4617A6CA98D22A62DC6F1581983EC1A124\ E76CF2AD611D7697C8EB76259C679917BF3535A1C04F53082003634F09111FA8467512D1\ D69840BDA1A1A808B8664A85:\ AF36BB2B821552C3949B694C33A04716:BCBD3B723C5FAF64 F8F640858D8A5169CFFE6F222302138E35DADF658FA53F9610C4A115F0460E9F44CF0259\ AAF63714277B493E94FABD920F22E2585D0A3AE55812751A54D3E194E733FB14C6260677\ E1D8B46F94B69E31B83F6826A93B6821C3F3CC6B64138650CAC4500447083D66422EA346\ 2D978FAA70A5D6369DE9FF066FCCC8AEAAF7C39705A3432C8F69D67179D92893CA230E8C\ B0FC559E0CBDFF0AFB3108603C2A9786E2E7F6BD965F1098236D9910BF228FC8733F1687\ 27A209F57E7E4C6AF7EF620BB158C864:\ 4CB818690D084522ADD573C3ADCE75D50A65342D16C2BAB23153503E1D163B17E085EE92\ 80DC5C1D19B041B1D9ADC43D2426FDAD9B11B21CAB5E3AFE0FEC9CF3A9117C47F39066D0\ 041A1B7282E10F2F1791E7EEAC1DE2AC70A1A12BE2C646B2113F41216B5DCF6474B9ED8C\ 3AB2D1BE23A5AB533699D876DFD512661D6B18E9F29376AC0A0B12D7B6B2231EAB5D61E7\ F7ACDA7503FF8E58E320980E83E877738B749C89C626FE24DF12089B973E50815EDB143F\ 21DFBA48C0B70DA7C1DDC43233AEEE35:\ 1CC4ADA25984BFF53CC86C7364278440:C9CB2BDB19911DBD BB97677E03C9259E9096A6B03EDFF049EF942C5FFEADD4C59B8FCC713E2F42BB547D58D9\ 487FACA73248BE2C38DCEDE9310B7844D68F3D0EFE4E1925433476D1618769306A571E2D\ 4768715398CD560B52CC492213F8BE3DBFFFBF35877061BEE5CEF46A8B8D43FAE2E41623\ F0DED34DFB8DDE42D7492E75F2329CD4C17A8B86D60AEA10A8C68078955004B8CBE4BD80\ E61FE9B01B9CA83EB5D902819D4A6D8997B75A7F1E86CABF7A5D7C8C44B93B66F8C80D32\ A7438900740BDC2F7DEDF4B6E729FD5B8A1C8D5F:\ B20E712CC5B0041E191ADDC5083A6014104E8DC5021B477CAA5AFA6395B7606E68640FB9\ EF5E208FCF0515575BEA9C49FEB32749FEF89EB579A869DA3213F5DC86A4AE12CB02BAE9\ D2F45AAD2B5FDFF1FAFC57AF290B70E47CD00648ADA75BC476D7E048DDE9D138133F081E\ AA0C1475E0D1260AC0184CEAF6F99CDF5140CBBC282009F72272374E946A26BB2F0214C8\ D7DB0BF7676CC582C8DB8D14048B99F7C99F550A4B6EC89D1B1D4A067591FD411D206878\ A5F413F0A3E67671F0FE340811D6A77D55B6096D:\ 37910B573950EFE3AD2AC0F3229F34B8:6DC3FCC797E8B292 0BDF3471B6A535F918863F7C902519F33BF9A613CD5B265C20A4DA957AE43DABA8185A51\ 2C7215D58CE22B24567A986455AF60FF075232B9E540C6ECBFA71BEF3CBA65B275AA1A74\ C91396CFEDDB7E39D2EB07C407C070CEB3486AD025295BE09FF74DDE2F1DD062EDBC294C\ CFF0B0B3DA798E435EC727AA17E1088B6F9E2AE415A19F88A87F38B366EA6F3DD01BB05F\ D65F73F8F97474EE5985400C25CECCBEA9D4F0118F81264933F6A61C307D148C43853C0A\ 5D93DF6EEF2A2206079850A05E08EA9876BA4F6B202E810A:\ 5D5C57860E0F0AF71142FED28B1FC0CEC703D8746AFDF5F93BC9B80F4D0A358A3B74EAF0\ E128BD14A14A4F85BCF2FB40ECA5083D60473FFF6396C8C718EA44C5E64091F6C268CEE4\ 33D81B139E0532E7684CE4D2392B32383731C04829916A2B73F9FFB7D4BA1B9BC95E9D5B\ BA4112FD0ABBF2BB0A3C5CD06FBF52CA87E91EF399E051309230BF61F84CAF9476787B59\ 10EC491855020A2838D19313FCCE4893030988162A8873A559522F1D4FA7BCC82183350F\ 31D0BD8CB4C846C72AACDA246330FD4E869D900004A5D655:\ 31AB675C93F77A7F5FE7A829DACD46E4:9200A442F4CFEA07 04DF7F049025BCBD7206B4A12F7E8B599C74A616A91A7B7A10F148DFA5DE56AAD4DA35DC\ 9F7580151EEF0F87FC3E630136AF059FC49AE77AA9809F7019ABC9A409E8EA5801F50671\ 672FB20D5CFB2ACF5B86C7FCA4805AD6864FA0062DBA39CCDB369FC7FC5F19047206A4E0\ CBA96D0202AEDBBCADF69DFDAB7328FC40DA82491F429AA770E177D775F728FA32AD548E\ 4614162F84FD2EE5B8BEDA5BE1EF85460C4665782F44939DEB7571B6E2598EF78BF0661E\ 5D4E6DA2F493C1D0F2E6073302A19C26F2707BDE2D5A6936CB4F9F6B:\ 1111C0D8F2C9577D3707BC247D460104ADA84F30DFD8A8EDF6478092832F2E35200445B0\ 13BF16A419C6D231A66F34C76C4037C62C377654CACCF9B770F7339CCEA0DACAFF7DFC39\ 3535293E8B347DA29FB207C369853A9E3CD444C67CAECB7AE4DC42B60F3BF0EB2ECEC7A6\ 482F1BB767300C539E8FB9046B31A267D1C9ECBE997EDFEF4B46A0DB501F4FED4F81C99D\ C15FEF56D4A7ADCAD808F8C6B16A4F62CC0A4C39F57BAEB0914F829E1D4E4B72D93D8167\ BC3CAC068C327AF3D7C887B65B3400FC4C6E6400326945F7079C6EF5:\ EB2BC3806990CEC6A01D863E1AA28056:7056216A1187E1C8 963524B3D92412DF49F8DF7CA10032FE6C56ABD03866ACCAFA9E45FDBA070FF683A52960\ 6900F1C7ECD437B56A74390858E4D3276DC8DCD04215470C0AC21611D8EC1EA9EF8E5120\ 06D876420F139007ABEE1397247BEB37DC37CD237E3909C75D576D8D37B5FF9F7B078D62\ 79A3B0500F308F991256394F78B7616B28CC6A622A98B43A9531BA25917F6D7BDFCA5FA1\ 9DA4F372AA871C7F253C065A4F923E734740A5534474B5B661164B00605430FD112B197B\ 8570D27A3B44A4C367471FC58F533146305CAE20D15DFD9539FA4C6920F09F73:\ 36FA83EAE79BCF08ED631AFA6C0619ABBC6731051763B61D2EA51B5D859E5069B0FFB480\ 1EFE8DC3EA79D9AAB849B98F0DC180C3A7BE4237A0283372B235553692A926F8C20B9466\ 935B5CF7254496FEE811BE2406563345C16ED4D37A1609683B3216DA5D01CEF1E2C0CC30\ 537AC8A9ADB668C0A8D7DE1EA14AD9619A064B1D9C11B8A224D76ED68838EBCA0D323D80\ 1E293EB2AB9D2F64F3C1B4588CBE074446A0EFE77C5E58F3715691FF50056B047444784C\ 154E230AB3C27A36DA7E61DB7774C9B402536013DF4DA7895E51AF1933A458E1:\ 7FD1AB8DDB8343643C4DB7D90BE1F9C1:F6CD6CE2D5F1DB56 C1EA094DE4B8DF3E530F4E75E08DC4793EB744FADB50E94D0C360CA08FD184E5B6E8B685\ 489335C6173CA117F2CF638CDCFF0F0E3329C36125D8780F4589EB76EF76AD722A359C84\ 632865A5ABC386F838EE6DA8E6DD96B6DD53C3AF3EF08315B71E53E442893EAEEF6D0022\ AFC7D08DAD0DB051CD709608ADF4CE94988476CA95EEDF3CA63328B0EAB1211082655417\ 2E3F2ECE07C25C62992E81985B9B1D9E3186AC83B167D206EA7B180A656BB4A8C5F09DE3\ 9B2ECDBA96E1354706449717BF720E9F756FDF4074FA9F5B3C0016E32B94AAAB9484295E:\ E66888E7F4A179F83B178AB7409D2C82E014922644F2276D4C308EAEB9A9F42F4062EB1B\ DB77EDA72C4EE499CD970F1583F284523D375C33D5AFE5264220339604B46FEC19BF61C0\ E7B07F7B710815801B02A4CAE2BF77F28A0EAAA026D1136580FE1B8AD1B1C40DB1A23FF7\ 878531DFE96B18EFB5CDC34198D23A22F005DD7DFEB91359DBC3BCB1E840A71EBF85DD94\ 663A906C315A1EAEA2E5FD673BB56B23B98D2F54AAF3E82370D75417DAA68C05CDFD15C9\ 592FB9BE87B5C37476A2559E56C4D95834C48ED6B6B0E4661A6F8017A358D0DDC9FF3080:\ F674FCB74F8175532C3B888AA1F685A1:FD402E1071C463B0 47F823E98A8F3DC6E872A177EEEF167E82D23862AD0C28E8C2172EE541F28863A5530EC4\ 2EE5E6462A467BAB8372BE75990369F8FC299C13729CB508332906671E0F8BF40A82E865\ 51E9CA7FEB3E0FCF8BDD5EA5539756802A450D09637978E91A2DD4843DDCCA8C63EDCAD0\ 2B3AA18744FEF1C78D9618686E4B5A84E00069328F1988CE852AC7B17E2DC24280502154\ D9B1604654CB54EA5E4D069643D6A43D988555AE9CCDF057F896CDB600ECA135406B5115\ 8694ED6C8BCC898E2E4335A9432157D306E12C77059CD3B296FD9C9A225719861D042ED7\ 26BE7302:\ 42300596CBD9EC098AAC697D227058DF9A88051904604063E95C509F9F03869C68AAEC10\ 63701259BD652E9AB275F07BFE164057367A74EED02C72A96B3673ED0510B782E6F4603B\ ADA717221EDF098D13EFC76A41CF6261D36C64D7B747303B601B3114EA603F9BA42C12C3\ B89642DF4AE2797569B8798604FCE8BC7906F09310858209A4F678748610DB9DFF24BE79\ D3D5D41A4F0A449A7EA03628959E5D44B801048BD685A7541D57E9AEFD215D45227276BA\ 6B737908C2AB5066CD3FD555A69729B711ABC683E7236B3D0D82F112888006D30CB1DDC9\ FD680FDC:\ 68101E5C1C4C16FBD08F90DD040E222A:F2B05714F3B87180 1D4C4CF8F819F57243A3CED7F2D8A284AF2588B0C808141A698C1C2C6B7470659344245A\ D162D527A3E221AC8822668541D10A536B015E8AA35268321144D6D84A199FC147E12028\ A3DA9171E8705CD65A54210ED4EAE211AB1F864383A2A9AA014E62ED69C60DC32B540126\ 71313B45319CAD64B0B26DDF9AA48E5D0AFBEA3EE2821459CBA5F4FCD798A8647526CF36\ 55E0421EAB46B558B57646C56DF3F6C62B92E8BA3D818811CE7BFF4975AE434B23E095F5\ 942827ECFDE9954C6823FD5198E0002E189C63006914672B08A61012FA7A37A800BCFB3E\ C845D179DC210044:\ 1B98BAFD01369C2CDB5004819CA0E2075860A4543B1A6564B32F097C382F944436065859\ 9A71C29CE4791683E436DB052DAB361A68D6DBBE3587AB2F6AF60A102B59FB62DE152DCE\ 0737B968750174D95854AF51C95473D17060082051DCEC1766DCEFAEB2B0754D9B95980F\ 143DE1D6676DEB9FD6EEBD01652B4166072974DEB8F26CEE33D918CCCCFB915253797984\ 5E86428145E9225F69BFA8FDFCFFC80CDB0274B48522195CFA77F33328E472FD767B6C3F\ F39B66CC42363018E38CFE221039EE5065B7A64FEFFAA441B6E87003DF7C60790B9CC46B\ A6ACC7557609BD9D:\ CE1972241FA1F27CF1AEE36A51432732:4DEDE955E0196744 2089A7FDB2728AEE9D176E603055E77ADBF6861C98A185B642BF02C04DAB8226570F746B\ 66C1AB8271FF590CC51A89E93F9C6108EA593F9135AE64CA62C11E165924C4734332BC34\ C090E7383E7E1108392CBDC103C4BB847C443F7951F17AF7C610CA07889FFCB27B40AC17\ F8E0594D6DEB391E3D6132C3998CF6F707CDABC13CB702F7F0E97F266175F0C1282682EC\ FAC95C8A709CC3092010D48F58DF41DB72E04013C5B5323155CD2D9720E0D40B13BEBB08\ 1F97310FDEE5D00FCD7B5E5C7FEAA2A4FB756916FEFE38DC0025CE7381D83E52DE05B09B\ 1273FE3B16BE372DF94FDA35:\ 7DEC8416E69DCED8D5B6CC3B831307AFC33FECE9A0567DEE0A5999C804CF01FBC19AC1B8\ 555223D3DBE6CA50BB096A7A87ACAB5A5F0ABEB3111E98FBC09897708A18481B51EA78BF\ E3CCB5AFFBA10F4B980E313E3ABE98EA7E13E38282778514F70D16F7940B6E382AA77BFB\ 4044D6F8EB9D95DA97A142DFC876746FB8338200787D3FA27905E57FCF861BFC8478745C\ 7C2DACC162115E5AFBC80917ABC5358957ECBB65B593010177CB1CE947235A94721541F9\ 0349011188A860D1D23CDD64C3B8D101A87114803690788337CC075B1D37DD21097FC730\ E528D94FCDD4BE1E9D8FF00F:\ 17192110F1F1B1279CD586D5FAE45F4A:A01800F5D6B63103 6AB1E72EE86035D1E1E92B3E79DCE8E72C77E3AE2C4C17A345CE25C373C5B95833DF02C1\ F34ED2FAC60F6EA77762C8F01AB976DCD2F24BD46136314AFC6F1336032ADCBEB1642A7B\ 46C8CC6B122D67C1EF3E578B6B4AADD9CC655FF37C2D7B5CD3878C32C3D5B0455A2C1DC9\ FF743EF2ABBEFE2D8214D48413032133D821AB161F300CBEFFF376EEC0051D4A769F5203\ E87B99DE52EB687EC12D747F2E55B84FF377F88E3F9B72900BD7A8B18E970FFD41BEECE4\ D1978F25411B7EF8991122C4B4444F1FEB3E88A89E48B3CB721A62EAF0784CA549445852\ 10A91A593E2E3A02063D1F76BA62B997:\ 0D6121F6EC196C1AC20C818918A2F2683877EEE0189D94511CDEB2755D203F75851FBE49\ 8818C6013098FF6200E2262328B8084144CD2782DB5BD5C51E64B3FCC2F2D789B9CE3899\ 29E72BB65A264EB554213AB772140D7BBDAFFC818B2D6D0BF4ECBAD5E984BC17C1E7EB6B\ 1D435B92B2E1C5A8867233DD9534F3898C7F64E1DF8828BB765E382F9E2A46B5FC9C3802\ 2E1E5C7D09E791E187073DDB688921D22172AE4C972B1B6F802D4FD75A997803B9B87E9D\ F2CBAE978C3E6E1FF18AC8D56CDEA3B9B1E9DAA74EF3FEFB018EBD9902AD4ADDC67BF010\ 0D9335569D6499563010DD12DD3E23C6:\ 190834E408E085E8CC3793E57146FEC8:1DD4835D46E42E15 12025BA46EB9326EB77DD3729B51E1A2E845C031B89DA66B8D73C02AD33263522AF4B92C\ B5CB4BB254057012033B4D8A147AF3DDE90B7951DC0FBAF0C98D4530A367E945D6BA4C54\ F57E9986A2452AFDDC8D64550823487168529B5D970A6CA0FB5A8B73D4E9576EA334E418\ 75DDB2955C1E81A8DBCFEAFE660C9A594AA169FDC78AB03783738175B4C974E28F8DC593\ 782C9AB44DBD49934C3AFA35E12A8ACE7F02A469B1A7847461D00B85D34BA01858B624B2\ A50F192DBF4B7ACE9082FB2BD4B9E4C39CA49300FA69D3C1755B839C90184F7BFD322CEC\ 78F8221B0A9BAF3845AFE7447477EE4B1623B384:\ 6BF880E9AC252DA1FD73270B64018ECCEB005CCC89AC7D48B48A5E61F15D21F5524B0057\ 136BB21FBF084BB16B1E5D09C8BF6082AC285120945B63522255C943D137F76804F5B6B5\ 26459E9FA64B3B5CE1B2AEE7BBF621B864F42556E0251FC8829B536F565E929B5C61CB72\ EEE11961B52A956E4B2D3BA81124952F6FD8B4EAB170544D0ACDD2D97977328549F851E8\ 9EFFDA3057D193189EFA71B60100C4719CF0D83132327828C48E452ED59EF0709F295349\ E1141B003BC688800C86F3B778A18678403BA35309373967AD8B6F5B225B85D2F0C16C1D\ 5A155023A0010BD0FE1EF31139F18FF8CD9606C5:\ B7029C1C72337170854CAEE83C38A031:DF167881D0D693C5 79E97D129AD18FC0B12C3CB00C872794D8AA7647BD743E507E0A67C0434BC32E58AF6F72\ 0668DC6FBB1CA58A0774F01AD16AD46A83A6A493719DE8D88B709632DD1BE56238F6C95A\ 599CC92B9B84EC18C43E2598C752BB9E2DD1AC58395A8278876AFE7F152F72934B903FD2\ 3BC1F76718A3518DB74DD8CE3E41918E62133B99742A5869450B09854ABA3E9466B7C44C\ ADF80E126CBA30CD6117755701F6F5FAD161159425B197C4B9804B5A7940627D2A2257CC\ D7645512002C4C5B09BC0DD4919AE3C96F70FAEEDD4E48CBBFAA2791109F2288B641F3AD\ 145B37EE68EA0CDE249F1669604E8B717A5D247A8BB25AEE:\ 7C5B40D0A68AFF288C04331EE8EDC20CCDC98512858E54C8888DBFD550231D7463F1BC49\ 3C23C9FCB93EE65F025ED0A0F470DA7E15A97B900F64D225B71D7C8CE6511A4B74EB0A7A\ FE7E4EAD04517198635BEB48FE2C41D6552AD5DD48936CBDFBC9CDFC35248AF5BD85360D\ D8A3BBF4CA4E87D6E345094CF9AC5725E32736B2AD12C0FDB4E9382372FEB011F6F7D222\ 175A92698D1D74B3795EA05C99DB64FD6E439B5DCF85859CB4D9398072C8843BA1D1F650\ D5F2E2E2BAF2F1C3A66A10BFA879FFBF6203118771CF893982AA710C67C2347A8ABFD74E\ B814400C306BB95458FF3EF850DA5E0300A1ED39A1B5611C:\ F7430DF9CCACB9230AD4BC7AC46B52F0:F9059FC6D69FE7A7 57097A044B43E7A3E111EA95D9111CB2B7440A54A834416FE02A4F34C4C8C34741CB340C\ F66750A9683E23DADFA23320EC4E0A0BBE692A8A2F816863BB078D7FCF6C056D5F2E8169\ CD639B148A779618C32901CF37B85DEEE483DC0F30B522504070602CF032EB17CC48232F\ 86FECA67B63D06F0B25C717A62676B26DE840AEE70D39432567EA2868ABBE2EFEAED6E41\ 7BB02E0A2E9C30D7FF850503380343838E7EB155E1901547BCE29254F27DD1979C2608AF\ 0EE05696D5F3D3F678FD457AFB048E41CA852129B5D78A619231B60DE4E19B60E2F699CF\ 09E832CE02EB63543C02523C092B34FCFA10BF9BFD9E32766E412A27:\ BEDB29A971B27E7959B48857AD56DC1FF2776EC258646F26C935928D4B1F0B874F0F34B1\ 6C5E1936D6F5E2263119EA967A9C441F016431059CF8B54CB1AF52A7BBD1D5F9C378E302\ FB9C9910742D7E5FE8777F2F5D976A569D54CD54F37524A0FB9CB5BF5EA17763171F52D2\ C823C1E12A99C2196C45FCB1AE3FF170B05D5EBF8EDAD51D7FAB7B6357B84AFFA19DF67A\ DAE39C964CAA610889E1C79218C38762B7A4B522132D9F9235CCF8F8D810BC9D7EA44C77\ 599DCFD1404EC6BB219D1F1916C0685B23D79E57A280A1D3FF5356F948F15889527C4235\ 8A137CBDAF7ACD8750D5D317F295B821E450C7114279FEFFAB4121A7:\ 500E05FC7472AE721E0B9DF4629EE350:A791B3A28B063D6D AF72E9E989D375EF3D4B16E56B025B0B5E3732337894E5E5AA08D9763E905C625B782AF0\ 530E2E3C8BF1D3F336BD13208FC0A1D7F0A8BB91E3FCD7C9E45541C29809C8F7589042CB\ AF994C56F5F96F10E2140AF452D376B5DBBA2C72542E1E59D63C99E08334ED6A82605737\ 236D4AABBD45A92610AF0C2852B2A63CE0A0C8D1D281D1002C8C37942791684475B10C1B\ B81E8CC3E7CA9CA1BE881113AEE41857F25E5C6D404F903E93F16BF912D767ED6AD2604A\ C8AA5937303699168D8B034DE7B15F25DD25002E22E7DF90B636457FD62E83731675E32F\ 6052BF1BEEADC5E65F1B2831A2702B0377816792EE9DFE04BC6410E9C597B633:\ 936EDF889D6629BC65F387545190C03C4AEF91B9A8A13E4E51B02A9DCAFE990CA303DD9F\ F81EF1C83754657D4C2CD8A89BB5345DD280376FF8996F2204BF1ECADF126D992172CF45\ 2A5999C1CAA455A0AF9EAE12D8B5B8CB4992F215707542625DACB4C460ABE2A97B804ABA\ 14F365C4A99EBB92FE4174A59D74C0D942D75F920E46264D3FB929C60ACE11F4982F6E5C\ DFC8AE73DCA838021D898E22916333075268A29D8BABC2A78AE5E54BC51791679203B812\ C4CAC0A4251224C4E509F6677FB140B557665BD85AC3B3EF2D204129A84344654D6AEC97\ A27C8FBE1D5FBFA272AB20615D2B97A31AD82D92F6457BD8B7A35A98CF8D8384:\ 19740BD949A0AAF7A2908411B588E75D:D0CB88F836751471 5C679ED0A8FA89F7763427FCEABFF3640D680E74B633889AF857418D8142B83322A084AA\ E7521A5DFFF2C8F05A345D05359BFA873E24CE2259F98B9F40615F3CFAE9736629C988BE\ 0949924060A5A85A59BA733FD75F53F991EA3D37D9C53C58C4999F380DE813B73342F427\ 39B169AA3568834F3D3A8AC0912AF8E3F116B602DE32760D5F1A4DBF7F71F783E41A3AD2\ 73E54B76E4A6439C9739210F5A2B5FAE2806AB5811D22B8F5B5CF68E80B2921F2980C285\ 8861A66619CDBE4BA9A3B2F6094C9774B5F9C07D8B99BEE0E4FE02E0082ECD24497236C8\ 621A413E2F3DEE93F38E98DE28B95B621E8DA964C7419AB2DB4FBB5ECF3A9637697D35AF:\ C5C9D588A11FC4EE03A6C8AC33064C73DCA48BF7C3813EDB9495FE0DEA94FE7F60B5E491\ E802A06CD0593FB8169230144BED6A76CB353C564DFFEEC8793F28E659127CC9F4C25D33\ 1A0718AA2A91B463A3A686DA4A037C4217EAF907B70916A70229EFF66118D932F1EDAE98\ 7CAF21EA174582ECD8CBEFE7A3CE1F2683B408F56A6855A56BB9C8CA9F8B334F1C9F03D6\ 8D69CF500C0AAA729D0E7D8C40B9199D9A8484EA45F7A483E8052DF531541DD3E354A31D\ 7B2AC271A045A72AF306163DF714438930D6B16D15A1E0132804DF1A94C2CCE769FE37B2\ 0E84E147748653A2F4F6EB228AE7C1AD6BAEEC853F17C1AEF07756C42E2C09AD84538D26:\ 8CBEA7813B209C17DE9441053D8CF013:DB8858BD18B36B06 CBCB57CFD5F6E8E9FD5F987FB13C1ED23EDF09C2929F7C01FF6D4B0AE61E4F1B3A5CED6A\ CBEEDF34831C96B9CAF72C2551BF6011A432DD25540EDD5C75E1018F34846404A912F23F\ 580BFFFFAF8CEB875E7274021B5E2B47F794ADB79699D3D1C6D26E0BF46203C3D4422754\ 6056CC2708224FF3FF9C5463733F41E10804A4F05F8DB4B2FF72B96BB4CF240A2EF2FBDA\ 20E7C91BD7D4E1F7F322533A03F3368A88DD08C36F21EB76CD59AA5C0C3E2537F7283B6D\ 42F6D24B8979246FB8970B6705B755D5EDEE4D7F71DF1595F9953E954D0775DAE56F1840\ 09764B5DF00C136920F887F4D78E8932E671455F98280317FAC41C0F5050E4A1CBB7CE46\ 0FE75EF9:\ E5F790088393EC494F34AF1B4BE73B63666874BF31D74D64C749A0DD067F6BEC681AA339\ 6CCFFEB2E30572C7F9975727EF566827E98CBA94093499E4F666DF3BE4CECBB861AE5BBA\ 78D67B6686690A5A5069D47B1D3757F6BFD28F734A06F9E37980C574D2975F0A9925CA94\ 88A11926DB59F3B00639DF25C3FEC100688AA640AC67C9788103A9BB85D53E2420AB3374\ 953F00D49217A1AB8883B71D46D361E245C6F0A5F68A6154DD94D8380FA853F6517B7162\ 78F3CE4C75ADBB27B9F774C2FB749DA9FF98E1E52FA2C0B4746502BF360E77B56E623667\ 395A59F4FCC2EFF4D1C2476B014785404F62AC1570C464BB0DBDB3A767A2D8105BEB8955\ 1356289B:\ 281866EA198A1CEAD6E334039B2CA436:F8E76A4A26185CE7 # MARKER: Stream Ciphers # Stream cipher format is plaintext:ciphertext:key # A few tests from somewhere (maybe the original reverse engineered code, or # the BSAFE vectors that were published soon after? I don't have those posts # anymore...), followed by a load of randomly generated vectors by OpenSSL. [ARC4] 0000000000000000:7494C2E7104B0879:0123456789ABCDEF 0000000000000000:DE188941A3375D3A:0000000000000000 00000000000000000000:D6A141A7EC3C38DFBD61:EF012345 0123456789ABCDEF:75B7878099E0C596:0123456789ABCDEF 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 010101010101010101010101010101010101010101010101010101010101010101010101010101\ 0101010101:\ 7595C3E6114A09780C4AD452338E1FFD9A1BE9498F813D76533449B6778DCAD8C78A8D2BA9AC66\ 085D0E53D59C26C2D1C490C1EBBE0CE66D1B6B1B13B6B919B847C25A91447A95E75E4EF16779CD\ E8BF0A95850E32AF9689444FD377108F98FDCBD4E726567500990BCC7E0CA3C4AAA304A387D20F\ 3B8FBBCD42A1BD311D7A4303DDA5AB078896AE80C18B0AF66DFF319616EB784E495AD2CE90D7F7\ 72A81747B65F62093B1E0DB9E5BA532FAFEC47508323E671327DF9444432CB7367CEC82F5D44C0\ D00B67D650A075CD4B70DEDD77EB9B10231B6B5B741347396D62897421D43DF9B42E446E358E9C\ 11A9B2184ECBEF0CD8E7A877EF968F1390EC9B3D35A5585CB009290E2FCDE7B5EC66D9084BE440\ 55A619D9DD7FC3166F9487F7CB272912426445998514C15D53A18C864CE3A2B755579398812652\ 0EACF2E3066E230C91BEE4DD5304F5FD0405B35BD99C73135D3D9BC335EE049EF69B3867BF2D7B\ D1EAA595D8BFC0066FF8D31509EB0C6CAA006C807A623EF84C3D33C195D23EE320C40DE0558157\ C822D4B8C569D849AED59D4E0FD7F379586B4B7FF684ED6A189F7486D49B9C4BAD9BA24B96ABF9\ 24372C8A8FFFB10D55354900A77A3DB5F205E1B99FCD8660863A159AD4ABE40FA48934163DDDE5\ 42A6585540FD683CBFD8C00F12129A284DEACC4CDEFE58BE7137541C047126C8D49E2755AB181A\ B7E940B0C0:0123456789ABCDEF 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 7D0EBD8586251EBA5612E7F0AE1461B85E7D6D01870ED72CAE875737359780097099D507F3F9:\ 2E 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 9E10A6E1E7C66081EE6B06A86F27B31528029DB35C156E571A7A39E09CD7FDF706DE80056CFE:\ 395C 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 193FBAE8145757A70ABF7E4B5DA4BAD3C8208916085ED2462C901EF01FE42818B027A6E0EB2B:\ FEF6A9 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ EB75D7A79E5F7C25156A5A63FECD9A6A67F48B97448EE49C3E3311C940ECE6D317F7CADDAEB6:\ 547BD96F 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 39979C6BC7B8DC7243AD1148C1AC76899922F9759DF1988CE2FEFE0FF91CF7E908F30777BBC6:\ 284CD53FE9 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 309D05E88D1A980CDBB341930F0086CB0672C85F37BDFC2CDC36D80044AF6B02E3475E3D2712:\ DE8C6ABE0052 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F409D463A1293AD11F4021982B7397D554F504E80C3AC0A6DC5C54CDDD090309BE00F9213E5E:\ B4D915156C6488 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F76241985FDD3668E0860D9396012F61F338EC7E41CC23BFD0B62869119560DC2A0604CB3C6A:\ 68B5FEF1FBC10AB4 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 61FDF65602F7A63ADF57B05792F6C3642241EF46B97CD86171AED28D26D67BFD6E1E66C7ECF8:\ EC498E2BCA7AC2BB9D 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 75258D597494A88866F4FE45B09ED2BE41D49B7D653539508B4BA1A3B6F9A08C3C103267D820:\ 169D98FB855CDD15E205 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 9FD90A643014F30D5D2BDCCBC37212904F0AD69FB23637B0FBCFA2B6E61A2A7B8DD9B6B3A344:\ 0C5710A5843C9AA2C675BB 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 3E04F9E7804F3F8267B2F5EABF4722183BCB17266F81EBE3A3EE8B00D5C9A727105F43131667:\ 837C0042EEA1A15CA24AD014 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ FA9B2426AF83EC289356B58006370907DD5D8A7C1BA887F188B7F695DEB96F3DE94E5AF4DEA0:\ 4B5509356362D35FA63C5B8C44 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 80ABD7170971295FA8D525B1EBB8CE95829CBC9C81AAD2472DEBED0F087558433B84E11CE574:\ 3F6CEBC8C94447FAAF9CEC4E778A 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 0C3E9A53C6862E2121F3D089737FF54F96916E469BDE5A645FA134ED4DDF76AB41B569649A98:\ E0A97B4D129FB0BFDCAB24076DD5C2 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ A68686B04D686AA107BD8D4CAB191A3EEC0A6294BC78B60F65C25CB47BD7BB3A48EFC4D26BE4:\ 97CD440324DA5FD1F7955C1C13B6B466 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 07001BC046443693F173F723638A685CEB7DF1CD61D4E93A52E44B914063903A578138EA0FD8:\ 31DE7ED3BEB6EAF9131922D06201A19366 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 8C68C80B6A01A6571642966D601BABA39B1644177C7C3B35A9D91669F7AE8D22A57308D05F1A:\ 368C7A9662385B308F696A0C58E5E57E768E 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 2A0BDB20E12B4BAA2E8C3D40B333B55ABBD0A156826BFBFDDE066F9D73398841E4A38CB78B5D:\ F745ADBD90EF249FFC14183A9E20F69BC68214 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 64ED1979AA8B458EE96EEC995E4EF2894DE0D029B1C0DA497A9BD7A81ECE4A408C253E9DA074:\ 872DE53D5116911D916A947041D22A0D50B7A5C1 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ DE31449883D5E651E6F889E2F18C453F06276D13999607FADC393A2619DAF7E2182C214872C5:\ 27FBBBE2EEC453C3D5970A6BAF03FFE299EED3FEFF 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 81570047B8BB9E5968B15F9C286F3F2B6264F8BCEE5C64A698BB2F35B697E32FAE6372BD07A7:\ 1BCEBC37EF602F758CDFBFA1F1BCA61AEBEFDD79B179 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 0D8BBBA8FEE3CCEE8CBB3548F52AA85D9FFA58E50655E19FFA31DFCC97F65116DA34BA775559:\ 6FBC9F1E72F7E6EE8D233C4B27EFB98351B5FEAE803732 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ FA087B45D61566E102A2B099CCA04A499191C54BE21C67C17D40A2EE81B0AE1F525AD7E61BEE:\ 852F2F3CA64B0C256B080A577E135A54B01D9079A8785EF6 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 0E79E4BD49A8CFC6BD1031FDB6DF4BBCDB96D64967AD1710C3BD96A8287064B211A984C82C4D:\ 8EB43FD27CF769A39BBF2FE02B9E4C6ABEE996DE591E5FC521 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ B420CB807A85D5EF897AE3EC7C7CA53EB2580F11B9C815DC6870FD3D0DAEB8EFE5AA28DF2E9C:\ C3CB4048B42619DBB1A16373749B8264960CF7CBB1EB6D3565BD 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 92762FCEB9FC304D2FF7994AA435E4774FFC1D97C9CB36F89722AED507310EBF028EDB0F6323:\ A7F0BD928BBA925A49B117ACDAA68702B4D4342F8FD62503319BF8 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 978D46FC073896B8875C7D4EB2F7EA35F58877550071F056584DC59E722E850E4E0DE75ECFF9:\ 3BC2C34F2653E210A1E15282FFA01149DF53AA6BFAF5FE04523DB614 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ AE6AFEAF83A30B85D865FDC86362F95642E7A9CD157DA2F12ACFE9A718F3FB996C1C222B2432:\ 6538CBE80D306CD6AB1F027E4EFCAB804D407B00B281240B33A8C7F40D 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ D4192C0818E7E4CA10AD05FBB3181C41C4D0BEA1805A883708FDE321B70D6C7D8B5601079D7C:\ B7793A33C33FE1C3EE024A7EE40BBD13ACEB02049159717F35279D67F730 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 65029B1DD806694E4AEF4B63016D0685A8EEB682E86353C049378EC540BC0F4BB682740E3534:\ 0C9856E6B845A33EECC0F30BF1974DB4DB088BF02314EE48FC369B6515994F 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F33562228D9339F23EFE694E45A6A5B4457F2865061384B064DD45321D399FD1DB1C3CCBE64B:\ CC26F0F11FF7759081CC87B0296E46E1A29611FA042C0F09033F12FD06468624 5EF2DE98C92BAE4C15CC2194D37ED3558A44B6FBC7EEF695E85E33DCE1C2CB8CE0779A73D6DC\ CD1B906CE940A4FD19C4436A7832D4BDF5EC87AC472BB281DE038D3A20DDB8791B2E12EE0B2B\ 3D273F14D90EDF7F07D32E03D74B261F5E501C0D6DAAAEA6E2474379AA983A54BBCFBCE08E6F\ E0E48959F7DEEFC0CF9FF10FB67DEB51F78248D650D2432BB1FECBAC3347C541BAFFDF0E7072\ 89EB0CDD8C5FE960C5C8206D3DA9D4A2B43A9A3D2F449A7C2834C152E1A07DABF6BBD7BCF931\ E238BB759D4005E540612A8F7921D368B906586A06AE9ED078C509E4AE7678F01F8ACB681AAB\ ACD3D644D9579AE28937405F59161E45123CC61385B1BFC75B738D21CDF690B5D041AE425D1E\ D7C9CA20583B79AC7BD28135CE4B9C1012A8FB7A7791F3B016AE27872CFA7F7BA29D5E1C267C\ B30E2E7238CDA5FD6BCC1C904AF236EF9E7A88EC71DB8700A7FF0BDF09FB24110B121DB825FA\ F79FC7587F0D8853AE90CAA6F479F5D3E221E4C832E27B6DE7340850F2231AE13AFC8E9C94E7\ 3BE0F631EE0549622A3BCB2C79C7D6440F694C77DD66E9F98A5CF1ECC80EC3F7D0D0A14B6D4B\ FC1BFA5DEC3743743F7893E94AE563217546653E2F75271B1CE5B3DFDC01B0A3A5AE6E4796B2\ 6F8059B1B35BBD760A08B48BC60323BA42C8224E7EBEF5C3364544AB3D4C8D93A7805429F787\ EE5B57D85A570F05268B8FCADB24F16FD4BB95BEFDEAC40C50C55EE32988E7B15334449F78EC\ A703A61260FAAE9F695715637732837FA0559B6B6BB602D55915B7E401E2B53151D3633A933B\ 786210794111073B3238D16CA7B14D0993CEB7F04A7EC1515B1E79F4BF518B2195A29A5F59F7\ 595CCBB04314535BA452351D23811E01CED3E086F2A6132294541DFBBB6352D0D58AC70AFE2C\ 187842CC606C59527F3EEF330FE4923DA3D0CB838C7DBEEA26EAFC032F3C15C80FFA09C9342A\ 8910A968412DC31247831F1C2CE9B5ECF365A84880DABEB08213F6EBEF78D42899DF0A21349B\ B01ADEB9AB51B1C312EF0F5E80E03BDC84CA28AA4F662F7FEF874F8572956F44F49477092F45\ E0254CD941B70964706677C50E9D0B98A6CF838FF4FF81E60E0CC4706F0701AD520DA6D6123B\ F6983EFCA5F081AE9E548464BC049BB66C28551D79F8FF465E406A12E5605FD236C57BB7000B\ DBCB52429F2C2CA5B257BF065CABD0B19D4F1AFB91985FA20248BEAB707527B40ED4B79CFA28\ 329B4A2A83018DD00665EBA2E4F7304D665BBF4E05A179A0C0D78449A4A72493390B7DA66F2A\ 0206B8655714BCFF0E5804CE02EF3B718A14F7A1882EB763701CD6064409B545303F54736599\ 59F9219D5AE51E978525D1D564DDD6A4408D3E47AADF8870DF2B1AE657B1C077BCC231F70422\ FE0BA5E86A7C82AE64A6D8739A57EF629C7D4BE277E6F5BE859F17AC4D960CBD09B13856:\ FCDD62469810ECE85ADBE33A4D967BAE4FF6B63C6F0D7CD6116228D7DEFF2F741D7FDE4DFEFE\ 48DC89046222B23EA184B1E15BB70C2293CD25AC3C047BD0B53A246A78DCA3482E752FBDECC1\ 6104C9067ACDFE811D3537AA7AA750C10050A6746DE68F6B543BAC92C42E5F8A946A2CC843D6\ 79508A8FEB5D1904C5E61C151E5899849C3FE54700BCBBD009E10824953C41D367470690959E\ 951AD644D05999FC8ACC64A61F2889794235403EFE4B55AECF2DCE5EC6ACE52AB1ECD8B8E931\ DD8F05E783CE446DFD41D7B4456CFED0E54838E38F4CADF51E33DED230D42300192F8E1B6D8C\ 7E78E5C94AD4C0227EB8AAC759CE436DBD22025D0B1D014898AD77902BC77DF45F137F51277A\ C6AA476AAB193EFDFE0ADC781DE75050409A94B9B41C6EBC99CA065D99C5E6DDE5EFA43BF3F7\ A011DB66713D44DBE5C818C29B89B37F2A17108D53DE0CE4D9FE3BF7480BB65E18B5531A410C\ 5060B0F16715D499C2FCB6B6C3506F1E6193B629572843888C18D796DD5D5F7C4A62C658869B\ 00EF502C620E110E5D9E2DB8729E4CE731925FE2F41D16A3B5A9B7B9A2062E96AC93A0F4A3C1\ 7988E46002EC10556DD0936444BFD2ED9C1F7D64FACB3439842763EA0D6554ECAE5515ACE038\ 7B1A96999D218C8F97151B0C9CEAC62AF1D05E7553909D789F9C6FBF0C8CB0921168675DF8A2\ 8A7A4A6125324BA9B5C5BACE51DBA568C25D77947D8781538A9BC667129C25DA915C70F2E0BE\ E3823986BE2C3B0D84667BD0DE153EACF7A34AF495AF62452A2C3999886AA2F032C212DB60E6\ E85A9ECEF1FC7EAC3AF28E4F56B0A432AE32A2F239EDD233375CE3C62F77D976FF44B4132779\ 189C0B2AB6316E057353ECE809188EFD7BFE1D1F845789386A860705BA66A9AFF09D1F05A542\ C86C96083D1317C9053467621F6CC34469A0F61220E5CCD460F9144710571D5D920D70CE7687\ CA0CC3838C1B7A27D915BFB071036962F7D3672D2FBD13E360980CB484CF9155ED528489A684\ E4C69262021C9E77F094D1449E8D8F9D358B4DD8B4F7E4148AED8FC6265C1975675C67E5674E\ 4976A64BE3231191EBA7D379451176A02052D0A7AF4676B044414C0ECC075E9D67B117E225D0\ 669F5676ECCF3F2E3EE1A30AB100FF777CE9C51C78396051BD4D747B7B167D8D897FFA0DE5F3\ 1862FA55741CFA45E1C8AD935EDC6F734989CA9072F1F6148D133C09E6EB797A723DF2B45DB4\ 475AA127273A3977C1913860BACD285741E261750B2B7921DF53AE1F51538C328F94A3FB04C7\ EAE66E1AAEFF01C02CF4EB6EAAA0D5EF2784414D2E3FDC6285B9F4713ED629F100AFBAAEFF74\ E9F9C35ADE18142C4DDDBEC330AF3FCB6F3E77F05F2D773B6BA545DBD4BD13AC2E1D2B300BA4\ C1614E779E761A9765D5C6F15EBB6A769290B3ACC8074761189F3DA0F3A4A804C2C3472E:\ 51 4F3657558B507F48C7E1C7D78C396B6ECCCD236154C94EC67D72A17E02AD38EB5719E50B558E\ 5AAA4A6364670A195AD3B932B1994BAA9ED914E11B939D92EC42DD4EA4F4D117FB286C3434EE\ 551884EA3CB4E6C83320AFD10A4BEED39E96E5D04257934E33E13296A18674393A3A5F23B6AB\ EE2044322ABA0A4211F604B698FAB9296D86D2FFB41AA0AF73BE170193B486A37797819E2180\ 3851947EB4EED45AA56F0E9B1189A72DFA2690355220C122FF3AAA584849C65090DAD778E387\ 6D0E7461A459BC80CB334B3D9DF4984ADA808137DFD32BCDFFB7C59D7F15F239367B0C883994\ FA4EBCBE89FE18BFBDAB6924F03FFE95C621C71D956809734B33398460DB4ADCDC0598BDCFFA\ 0311B4E35E570F89FEF167861CD57BB1A48764AE557CA475DA66021BF503E5EF5EB6F40260EF\ 2B8018916314459DDC1FAE820C492545F20F9A5F284A465DC1675150E7707F38C690E8FF0501\ 68EE5EEACD67DD48174A80144A057F5EBBB0B3A1D65D61AEF93532CC008DA66196D5B1200FCE\ D7ACD48F2E9535A3F08D6CCB2F6E20983676244BF3F0C97CF22E496C99A9DCB8C76140C7924B\ 54F95A859C088CCAA8B3B925AFF6393BDAA9333346D1F3D18E6525C5C5584C6BA634AC465854\ 3CEE45121B5663FD99C106AB4479D844442C6577A28CA84C8D41AC3D05210E3994A793E238EF\ A2797474D770CA030B092E835524B843970FBBA98B01C5FD64844EC271C2924B20AE17EF7EBB\ 472418FB9D31E6F7F065B40950536B697DD773F2C0C1E0FECCDEEF17AFCEFB8297219BB25887\ 0D32AABC8A91E4710B37723228113D5C9504005014D0358B133217CDCDEB164E02F57F30F7F6\ 316B5BD82255D7EADF98E27007E834E98A4AAE8EA0B42AA51B316C4D5201EB3F2CDC70A35D71\ 9A99DDBF0F4078598E1B5233387E20384932E4A59D9FAE8D3A4AF93D25BD5C18199353FBB488\ D9996D44F0889C572DD74AC545BE159862352D3948EDF79085D812FA9CB1CB2A42A1AAC3E9D4\ 90DE90BABAB42B66C13618C18BB6606DB69FF9A737129F70C27828E95A8450ABF1F18B5C271C\ 0A48A63490BA622976FB7EA3BEF37A4AE7C6350E39A1ADAE2018F6003A7C5CFEBC7E0D934D01\ 9FC9E1F1187CAE86FD50CF003F08EB7F139078EDAD295FA175FF3F6E79FC015B37000DEA64AE\ D28598FA4DE06EB62163B18FEC329C702F9EDB7561645143ED8027BD7863396F4164C632827E\ 90724298A24DEE1450A11F737C7B7DE56666DFDDADE45345961FE7DD9F95DCC7A5DBA76309F6\ 594E169B8706C21B19AFA85E312BA656078E7C072C125B3233C66A130249BEA9B8C33D501ADE\ 4F1A03747B1BA0C7BA9240C9D2DCD339158C52CB46238D09DCDB6B9090B797ACAACDA233AC4F\ D5C796AA722F352BF3766C673060DBC7901EA9827FA7ACDB32C64E7D58966306E8959A27:\ FD33B57D9ABE946FD81156CF3F6475849F742B7FFA9250B1E1A4546416A479A20C959E45E7D6\ 23279E762C85986D22B42F6E64C0F118994A540304E94FAE195691F858F77C2B12772B888D23\ 80344DB66003BAD5D0E305396255004C468A7290852B02C6E4A920C7EFB3B448E6334191A8A1\ CF19BC3A70851FFF422C45B133555BA01BBE9D06D685665FC58A7CBCA76EF2B22C14504A5AC9\ DD8BE5B4DC317B1E70E65194C04DB27600929221DE48D4B90F1A28F05B801580DC23BB79CA62\ AE7B2FD9CE99D195A05776A7C779AF8ACFFA9B78F3C09B0036A875F7C837776EDC0DB1997C98\ B8905896BE04A6FD1B408DC26926513D91A5E32BDD1E51D9E99284A2F32959E3282D4B8858EA\ 237DF3B4AA3A493D196734DC11362B67CF20276C48BB1CAA07CEB2FA37927773A0EE3F8C18D7\ 760907A1677A3C75B6FB07E98809C56E9D7AB64997CF6F54B292E56759E54A33132BFAFA5FFA\ 7183638A66D436E70616CC4A5724103A7FD3D5B61924A6B6DEFBE6200124EBEC929F61FCFF58\ 2766C2B5F78AB953835BC1FF7DA76701A0933A91DF9F2ED680E60EF410C96DD9C7E72C773DA3\ CC610F80E9134A8075375B921A03FFA555C3C26A027543DC6DA55ED6F6FB6DB10B34075E4057\ F74C01A97B9BC5A5B05B83A112FAAB2B975D3062A63534E38C9969E5374698BB585B0C470FA1\ F74561C1CDF939C7E77CEC8A49F5667B08A6DE363D36B93FD2F719DDC27112DDF10DBA73CFB8\ 86834510E833A45C8835EBC19904D911FCFB10112D0E6E4F636DF88D9FE028E79F5A0818CA52\ 0AB3E9D4E049BF574B8B2F1C196E8A69137B497E11F3EFEFB750315254FB218411F5A7604FB6\ BE3F2FC63F1ED170A1C53AF8273CAC3780C23974C98BAC1902754A672ACD09FDFBA2DD1B72B3\ 01A80B7F1EF004A08DA13AFF02F4AA8DF711480925C322D43EC25242D0FDD4420E200DF964F6\ CCB4CE2FA5CD9071E2DA17B6A06492D99AB4E24810BF4132C1B73AE746D3864AF44D88B08AC3\ CAE02E1DC44BA8AF450537B7C2642B7BD4731E14D3927729A65411851B76823324457A3A16DD\ EC2D3B304E5F8CF9823E5A062439B5953F6ED9A7EF0FAF93F629FED8E71D024521C6AA922B03\ C4267B964C65E83D9C2CF16067ED6EEAE9EFD3A3843085597A683CD80E91858DCF5C04AF5E1A\ D937C4B4DB4EF30B495E873D0A92636AC2EF4F6A1F9A26A99620E6803C1BA230C50D339039D4\ DF0E3C718AF32F24D80EFB446C160F8F5D3030172F924B8CC3996D454BDA5E958498823D86AE\ 9E55292D33E6E7ECC0CBEA239ABD10334AB9A3FB1763AE997F5F4764637C7D6137531E4D8EAD\ 4D05C39D825CFC3FB16FA17A760C9BEB4516563AD0C40AC607FB616E9845DF833B989207579F\ 5A32A29FB54E6D5D7FFB90FBEF64128957BEDEBE936293268BCE7FE0E8C455218B1DB7EF:\ 257F 8554C25CEA8F0E19357FABADD66C519E97622F36CBE09828CB271DA5EE14DD3451CC8FD25421\ 45EAF13D7AD49A42B7092ABABF1C8796CE4B3C4A16BDA80FEC5F69049F2B94550283E5626B04\ 43F32FEDAA5C5BED3AD64E8D6C1DCD3C7C2C5CD3B38907653CED0D7E6BBB25686654DC0167C0\ B0994C274F645F2AB1947C56CC64AE8E920C24690ECC1AC67DC4B95E69F321232E71A6B859FF\ EE32657FAFE512B4BD33303C0838EF3E275562E09373A7E431E552489DE6284B58299058993A\ 44509F2E10B07B3DFA7B20103FB9497E6BFA6353C930A0F9D565A12F241697637E7ED81D1BD5\ E609787F79A0C95C1B18422A42D7690DE2288F5E5C8E0AA8BEB5B3A68ED358E3196CA20AF163\ C20316B8E64216581DDBE553EF330A717DABBE0AD1209B9A541A7BDBE70A22D77995BE26D99E\ 3903C0E251CBC7990AD08489431C8BD80AB62D63179EC93E5EDA73E46B22B4D518B8765C2C0B\ 3736817A9EA60C86A86A1A69BB7C3E2D05AE0AE4313B2C766DEA92481C7A7786EA82EDA96EA5\ 0964765A171D552037415A3D7F20B19104C7565265BCF660B4685B66707EB778E39B5B34D551\ 729CB39C8C4AD50E68FE2B988EA8F770749A336F79189D6B157E9F64D17BFE477F7ED5997918\ C18E0CAFB2C7652CE554FAE70C52CD7A7319F768AC001C7C2D60C567D9D9A6501640544004A3\ 8243B4EFC37425A46ABA7BA98BDBC2CD7F106F69485819DA79FB483C2B50FFAF67EE27A4D0C1\ 84B20E98D9CD859FF2A336C1544745EF4EFD79A9906BC3B9D5B5E358BA1FDE3101D0B27E9F02\ 51EBE26EAE239EE8393E1DFF8947E6036FE4293253D223E89E7F6B439E1FA8C67A9440DCF5C4\ 0BD7744275E66EEC2175706046F67A55B8580A8D902F342E24A76509077AB3C2272AC4874E52\ E15644A35A78D57C650692B297EBB6C9DA215357567EFDD6D2A64634C2F0FBDC39BFB6EF1707\ 9805A0D9C2506DCCF9C858441E2478B49030F0A741EE8303D3EDA6FE0D82EDFD38D5F66AEC10\ AAB25AC72E39A46E0EDDA0AAFBA16F9CCDE84316195655569EAF463D2E046E3E9A2D56E78E8D\ 495BA69BF997BD972BB724901CCDDBA065491D7595211995C6F44644C63E275FE1EE3F2A6C61\ BDB05E7223CAF113EBD060D9740344BF8FD878E820331427DB67DDF921DCD27C08C5B176B864\ 07578907ECD6A561AA6CC206CA6CE5F8BBCDB7CE3797D0111BC52DD1FF4082D6AF0D65001C9A\ 13F42F4F66CCC9079FCE07AE288EBA8735B7D983D8E3038B4A774DDA3A162AC943D27F8BB41C\ 90E14422E69E2DDD726819F613F08B1D2D7DC25634035B5BAF6CC0AAD642160DFDBF3B3862EC\ AA88493F9153A5371469212FE7A223FF11A85C08D4D8834F2D3744F6975D06C9522505B0D107\ 44FA476690E9885D995777C6DCD79A0F49FDBB44ED03936A0F2629E4BD4483F94CA76DBC:\ 4BB0E901B9BE38A39A8E116C77C05704C8293F44D394ADB23B0E87AE8C66D9A9BDFD51BD5CFD\ 6ED04FF5366723074327E923BB63E200698184BBC24A47DEAEA92CFE39A9AC48F22A1E0B76A3\ 5B9729F8A14AC41B430FD4373B2C4D2AAA7560E3D60FF4EB63D1AE440C8271E3339C716B592F\ 1857BD63D9951FC38D334F75987FA381DDDD324D62DC9D1564EA417BEAE82B0F8D5D138419BE\ 02E69FCED4DAD1D4991DF70B701896E180ABFACCBD4CFC07E07D23625371EE0199D6C7BF146E\ 2987CFCE31EFEF4D6305682DE92015362FB1926822C672920359932AEA49C9969CD958742BF7\ B436F03734B3E0B899A513D3B6DAC6A715633BFA7B30DB6988EA2E14EDE3095267BB5407CF7C\ 8B693A06227E990B256A3CF18D64FE3D2EA8D4D168B0DE71876F3A77F3563739C5A0754823B9\ 7BEB1B16B32804DF7623888D57E6877B2040E68BD1328A69A3F6F9F3796EB8300D53C68F8189\ D93A11EDBE4608175C3D2522CB0CA8BEF0D0FB752EC50CCC7ED709EE5CE90CF44F788DB78613\ 692ACE14A617973914D9916D4FFDAA07D50673A5F0A60AC73031D3A96E89320C7A81A42D3246\ D95099219F85FE5BA00631D833DCFDA19A029A7670F848CF16BBD271E64C8BD741DEEF9871AA\ A68B10C08A64A3BFE2F99D7D04CB86A1F0CABE561654553131B3F903D420F2CE748068A81AA8\ 33609693C633F04BC1DF7BC391B2DF083B84CC9D4E14F3803E704720D7C884E5026861033582\ D0E854D61C766274FCFB8C8ED428C5B9F2C8FAE0111611EE0A0278B72DC305033F51545744AF\ 98C6DC2F721CC42F71531D3FC8C0E003B6C9E65BA3588C42669BA65D3662160A8A6CD0B652F8\ 7FBEBA6F4FBD0499AA4D8B06B9B67F4F0144CFD8AB517C86B68F2D648E161029EED96979C24F\ 0C64D232D4E162C5EC93E2F5C8483920DE7FF0B23CE3FCB6E8675435D579031B36A10B08A4AA\ F16B563DDC94C8C5C922D7AD8C72FB15070E00D1B9AA09C8F693CD179E8C3CDAAC20FE4CEC4F\ 14DE10478C419359A8543AAE601DF2C1205BE051A1BBF572E257DB5EF8C8659B6BA93683C76A\ 6979BCE9AD27C3DC4BDAC4122EC8FF7FE53FC651EE4B68AD38502157027F7741B30F013F0DF3\ D2BB14764355FD6CFCFC855B838A18F06896817E9E1252E1F466408FE09184601DCF3B0EA47C\ 62AF09B84F890E5F94A8A6F94614E9BFC5A6EDFD2E7F2869ECEB8F03BDA424E2FCEB9FBD676A\ 3C051690E555DCEA6C124681D1255C2E0661B1023C15BF071B3EE3A8E8E6DA8DE8AEC78EC3CF\ 9C7A1C9EB23B8B706FD5E8703EA10A1F6FB29A0D42139D1D6EBD7EB145EA565ECE19A4485474\ 8908BDA769E9634DE30E3F06F3216D121A92323CA73374371012BE9BE82B158BCF9B634192A6\ D58538C3208DC6DEC7A9BFA83905A69E9D6F78E2885499885B5FD8E88305BBCD2192216F:\ D746FC 72DA33B988192326A043A7B70419ABD6B89BF899D19E0AF5C1ABF6B3A2842492BA6D4F254E7B\ ACCD74646BD6560FC87AD5E59B77750437045BDF17CAEFCEF0B07983BFC470A9F034BEC6218A\ 012EE7E6109E83849B5890833B5D2EC79A5D3570C7AF5DC8ECA37F4475A352FEEF4BD0C33F31\ 958D2E99113467D30CBCB9F6DABFA01D3728FDCB13B6ABC5DA6C7F470DCB2055DBAA0E779893\ 99AC345739674F4F4AB66C4D7B2D9F04DA0808848108DDCF1C6D70190A66FDF84D5B5F19FFFB\ 0CB28D47731EADBF183740E0E06CB33CBA47ADE2781EEE9A7B13335F4A7C629B2A1E808D92AE\ ECBDB969659E67F93FE25E6A86EA9D471E5361FA961C35768AD89D8DA6AB16B9C1C4690C8AF2\ 3798AC217DCD23F77DA4F531CA9C25FD73C6EEDC174AC61B1D38BAAB4238AAF93A336DDA9C21\ 981EB80957059FFFA939D1A5FD2F6FA6131880E59C5CCB6A6FB73B077172AE85E6EB0700A3BA\ 09C9DBB0699628B24C8A50D57C5C6C8C9CFC6ED3B8FC8213BFB0D2277BE162E390DA561A1787\ B6029A6908718A180046CC777087E271859C190C1B6F517EAE660FF7CB950BFC3B8E572BAADB\ 121B6E68077632AD28D27866D7A76F854808C68E69F3620E079A99839CAC76E31F259CCB1A9C\ C04C05E2E74AB9323C619C0EC6E5744EBC1A22F951544D5B4AEC306D8921BF6FAD4E749A3FE2\ 5B7B8F206B558F14BFEDA34D29793AC53A4ACB9E519C05D0EEB9C22F785ADCA395EB0E7C2F6D\ 19D1C10FEC2A3EBA50A47990B64C108294AE6B26A7E3805E5599596DB55D2D820BFC27DDFAAE\ C08970144DEACCA2544CB758EAAEA728B10ADC70686A07F4AE77B14F2D58BE107160D738FD53\ A5BA74A1ACCFC1A7E90B888F397C4807BD347BA9739F2EA7421016EE9520E217CC7390A2C686\ 55F7645D1B8B44FA61AADC92FCA2DFAD3954E41DB3A15E1C7E529A32D6ABB68A636BE5538460\ 3CB605F6A42F8B4FFBE795F8F644588A27A7C3C406179C8E4128585D2980D51DDB831D3BE643\ D180CA129C183337E08E3257201D77D56F84A8DB60582DE8941F70618DADA81C33AAEB0D9D0F\ 2A3C5E60A8042C329668EFAF8E50F72C806E2F17B785B355F2CDAB7E5FC75F86BE10ED77C982\ 34CE7881311A9639CFE5BE4373348922B0B4F368C376B8A20E04E154FB6F2AD6954A7B8FED2D\ B2FFC94EFDDEB0BDE09EA6D64BAE5D670F4DD245E253F99341C1F80117598F9A5C404AAE1EF5\ C8B225326A5F1E4B37315A328D635FFA212BAD1495AB583D1286439024C6C0C9BCA7AEBD4607\ CA2AB18069B216E289812B847B33EF52F0ADE59A5A44AC63174DAA82CE6C1B80BC8440A814C1\ 8E5811FF086188C4EFEFB2692BD3C6B7B4A6438C61B29093E62666F5B760354DA1927D97E0E8\ 07D6885F44FEFC453A6397BAAE5A9F8BA53E8FE56895831D6B1A2DA44DFD3046881BCCEF:\ E2B67D05FAE6CECFECDE72E33A41696FCDB48CC035033C1F53A8F6B4C1BA0824D7D553197FBC\ 22859B2B32BF2A636DE8F1999D54CB973CFF9D633D39F8F7C32E4D6248CECEA4222ABC898FEB\ 6764D4FD192758D14CB0EF7881C50E1FA07C0705AC4533B6536EB7FF6A430D8CD4A145E15679\ 6B5D280C5933F69E813E642ABD145E43A03CC1ABD26FD5F0C6430C5656998BCC126D522D5656\ 2DA04C6AE0B19293CB11E2A06765C64C18B20E5BBAED65E46807C0513E6BA36E3231A28B426D\ 62720278CC4986E1CF3F71C42D4F1CD45D7477475E7919E353FB498CF32BD81CFA4084BE21D8\ 698F2040BA110A32DAF535E1B1F4D6FD3A7278E55EB5314CD460B39704FFB019F1004176451F\ 029D473458CE705E62F2A461DC2EAE9DBA2BBEE77ABB320C6FAF2FCC5CE8DAEF599E3D379155\ 45332EF305D8386F34C5D9A2DCE8FCDA1A3517821B761856D777E311F918761C873DFF638D80\ 6967DFA28D5213A2C17DBFA0BAB947B7FDEEB4F6648F2F415FF09947E6E3EC01EAA96AE03C6D\ 07BEA5FF5599A47E23389A2D00577175FDA3620B4A3AC3C22092E8829CC12814976E38A5412D\ 8C8795C3EE89B76C8678FA6273C06F12AB9121BDA619948E1F2EB6D6C46844642C532E03E449\ 4CD7D89E7479F2B75CF3D1B072FAEC4E293B50E45DDE6936485EDFD091999899AB44059E192A\ B81F6661FF98C5DA37C545980721C6741FD0CD84F65AD04DAA49CE4F494BE674CCE1212FB868\ F22E81097E1B3D16C9EB43035979DE7FF557A5540A36E42A0BE4940280D3837C46115AF90F88\ 73AC0F26FC265DC0250FA0DC894B16CB77E0A5C80F4E86EF503DB8A42DCD9F800AB108EFB8CA\ C4C3CB2683D73C1B4EEDBC3F80547C167F7B72DD0AED7E5980174124812AA97FF26F1AB6242A\ 387F8C5C921A93BBF6B132D20C3797035A131408561E5E2C51D7629DB47684D76672A5B508E9\ A59AAB30C2E2E207689DB69F8F3D8F79A2142A8CDFD8D251DA941FE8BAFA507E9E8A7C69D6D1\ 6A272594CF0218052B981C0080676DD245F419276E9E07D8983F9688FC8CD9AB9B16756CABD2\ 1DD320A6A435EF40C4C88CCE50A98D79FC0EA58BDB4F11431AF00D4921B0A49995A9CAD78CB2\ 28A8274B7272E3F82671258418592D03008715A1216DF499197946B661293729DFAFA6239482\ EBEC503B7836E4B7B20E47C2FE6BF62C845B9227069742B654056A4F31A0B4937F1056083921\ 25E63E82F9045A54799E4DE18D8010AB5E3E3B9FF008D494DFB5A2041A6A5B89CE72F68F777A\ 8DA398ED66ED6637AD105871A1BCD7679F55AF3989CD3603836E9636C8A1ABEF86D4AD3F6AFE\ CB1D6417C7030CA8AC09E3C15E9C275477097D77FD32509B7643C5B96DD9F9213DE07A083B5A\ 8E5FDCBF4A41890D4D1B854604BBEFAB06B598D3193E57570FD137372DFBF983819CE35A:\ 48B842FA F3F1796F6C00243B96CF802443D16F213BE4D527551102892AA6BFED3FE95B1A4B3E0E3C52B1\ D32595B83D7575379B34C36F4ACA0CF3D9CCBA91AC0DF206D9A98B39B48EC8F168FEE924E14C\ D9DB1700333EE88992667774D31B42FCCA673A3C1A0F72473FACF463578619C8828604F056EC\ 6948DD3B6A12F7C92AF902F3F6C8DD2309D9B1DE9A2B83AAA8F3DC15B5D2B1ADD86077CEF344\ 6538F7CFD4469A031F91717A87C23473B8B6D2961484D675C0AA938207C326C1A98691809228\ 64D9E5B57361CF9004B613EBB2F75CAE2CA11D6EDE4944F54CD8CFDDA923BE42908EE94E8AF6\ 64CB9E4CCC86B31605C0FBEA52DCD22DD1827BB361F13C8558AA6087A420C3E2D6D7A67CD1DA\ 849456EF7CBF827BF856FC397B8F921819F6FACF26240D89D7B9365589240CA03C30B2FE3D29\ B2E5889C683D6EFFF09F90385AA6B518AD5C0F581788D9D6F0B20FF8D2C05F16BC766C107753\ 07FD80FF2DEDBC64202527149547D784C7A97FF8AAF03820E8D3CE6D94FE8F4F09961BAB6ECE\ 873A099F49511A4F1AA527A0294F9D4C2C7CC13B66BFF754CA60EF76D0678AB6C247027C5658\ 506EA706784543083F83E6F11B3310C0375BA203A857C87F846727DCED355AE64773262F8632\ 58C77B8A3A8466283B5702C45FF6BEC024DF5E0D72BA36D81482A0B4E15EF0FE18609F925B94\ BD8D42A9CED97E32DE17D90B8ACC07233F0A684FB85EEA4EB25A5F9F29B3B8897C8E735114BB\ E4162869C1CC53908894A392F15B49CB1684A03822D0E02F1C89AF37BD4A22451145A97D28DB\ 88E3E85E9D17AC0BFAA8575676F4E132B20CC91C946FC973DB2B2E8EA35EF7B8CD1AE83951CD\ 62AE825F5209B1705A6FF0DBEF9D3D350426E5849A26CF767E44E9527D9DB39C7E19B79876CF\ B38B26FBF3F3017671ED423FE20DF87A39BBA1463E894FC1B713D01E79488B4B751856D8AE26\ 75B136FCADFC0251C30FC472302368419452CE227BE74A3E167A76BF8B9B225A57781CAAF79E\ FB924E4A050D1FCD723550205D04C17E4C865302F8C09CA68903D271C4A3AB420255B69A7C78\ 79C7411D6F2BFBC1E3EC555DB70D8536ABBC9CA80E620ADFCC00C088A910E686161DC9D6E383\ C74283A0348D7D3C49EF028A549A5D9849CCED60064C25ABDBDAD3578013B4CFC4939A30FE1F\ 5D043E119CE8BA1B8CC67F23EEBF06C08DDB254693C3F66DA3E45739D284E2D797C3FDBD3517\ 830674EBBCD92E1C87BDDFF9C477C061BE575866AD1D6D81C5CDE36F32204A6ADC96CFB0019E\ 2A74742FA541BE8FB5F6A73928E5AB1A21489F8E385391261392A04241140D7EE97C57391B85\ 7C6D8599DA250270A2C07F3F05D64495F2E4FDFE7336022443343E7BFA9FC10077B2357406B9\ 68208775A2B0E07F657153B4AB3206EA83984EE3A5D03DAF44BF30AFF2F181BD2A1F02B4:\ 12E5CF2EEF42624BC53D8A0FEA029E604CC6D20FA927ABC186E00771A634C5002012D6AADD89\ C5192C56B8E3E4B54DCF041056188A5671CCE981D4A02137DF7F40533A760D200648F24D5C18\ BB08E3A694730EF165A1AAD4A117B8D800D0B8ED9F6AAC1D9850A0E12CE815796D5220376226\ A5F29232810EE969E537459546110B9B747C1F0E441E59682216F27192E69C7034EDA3FD3BF7\ B9F4D2EE0688A5FA20607FE37C5BE1051F5AC439903794F7C4F34C97E88CA61FFB46D948E5C7\ 8937DD683F5EFF633AD94015B51B9244C0B83313CCE16FECE79FD5BD26DCBAFC05E1A34DF5AF\ 398E09599E9CE94158D2FEA6F0E86C7B054DAEB531A1E836E05B1CCCF2E9F8AF048C94CA1EBA\ E9FE7503F367FAA363DF74AA9E7E1C3D2A22E0C342DCA5A5266387F86A02A8F5B848D56B0F2A\ 5C119FD930B8408FBC801914295B0FB7797C0F214F8942AF336AEA5F24BEEB021994EF75A15C\ 29CE5B3FAD12886F934746CFD8E12CA0EDADEB86F89396D17FA0D7C992F24AD06A5045463345\ C5613DB25967D87B9A72CBFF8E2B008DE3004F45CB6028EFD0AFF07602AC624E11A2B4F908FB\ 8B28605AD0B27A2F4F96DA80E5A4AD1247EC6F5F0F9702BA60845E5AD8E15F12F2A74F8E2D18\ 568AAD6753C2C0A91D6823C412A48053C877C6B21240941F14AB921911424F4DBADE8B02F20A\ C65E68170F9FB64CDCA5288059C08D39BCEB78606693D17498D892E0C058AFD44A7269A8B2F0\ A3C036A4B53B2218CD54B0DB5E2CE2F59B923124C304273F39365973151AC85244B054980588\ CE632026B05EE656357D1D7DCCAC80256DC59CAE11FFE5C9C03742D192963802BF27351DA535\ B087296A85658481054FE5E04CD072A5F77770C391742CCE3DF8FA3ED45CB29375F7F7D25A60\ 35264BC677CC116F27C58A61696C8FF4BB117C9F452A441E543FB95E8BB857E071EA4061118E\ 137C67E90F8F82134E477F1266BCA6C998D9EC25EECB1FDB19F0B11B3D58D2594DBB943D019D\ 4174ECB4A18D42681CE823CE33CD803CC68A00A89E9DA7D8D3441D5D6BCA1CD8B915E0B814B2\ 0C0D5526E67B0ECFAE0B318BC63318846620E9EEED3D981FEB6E2CC2A9AD1E115E1E29C1377B\ 8A173B166C579C7DF0713C88A8E75EE73149C2DD187EC6165E30B92F90C62F963531CA593602\ DA6A2DCFC2524CCE80BC764AE1B24EA2D903EE25B7DDD545AE3D3FDBDB97987DDBA315788542\ 6EB2BE46612F9362BDD0E65BAC163B0BDDC1FC171BC91D3191243FE0851BC36E95F928342879\ 1C122BAC07B2F6BFE9362139854CD114B249F5F6413121F1D7F2A63318DA26F8E9717E1AB99F\ D7F894610375B71A04A8E066140CDC42349D5B25128D401C784F2A5DAA7E6B6B331C8D2221A4\ 0EAD0357E72AC5346DA1712FC85D42C2E1BEB0569FC6FC31641D9785E1ACA85A67B69077:\ B2771B8F57 190D0B444816CFE9A58BD72DF9C8257F5036A75386F85F20344E8094CC6A1445E7475CE75D3A\ 3F645084D9481382CD8F33AE9957BB977A49FAEBAE48F889ABDFF73C8CE67D3BDB99D6C7F764\ 1362A75D7BD1FDB2522E1CDD246F044E482FF989834C7C4CA7CFAB83F75675DF9EC88AE7FA04\ FF16D1415DAF85B119DFA9A740A745FA632BF3662671ED20198CCC61549F63AD75B04C313091\ F301CE2F9E9E7323677FC926ABF881E1EB1ED92EA0D4E6C9B2E2B74DE021CA73C651E93758FA\ 036CADB304CDCC3E685F7DB07CB275BFEE14B005A21899D3FBC79EE80BEDEB579F163C60FC52\ 5A231FC33650FCE48F798B6915D0D85B7551E93D99B8E053CCC2F81A808F73D2A5E7B184739E\ FFE57F33536107457740FC3483E28CECC770D083BFB935DA436D19FC65DECF57C94896ACAC4D\ C0C53A41B9B270853B10AE3D31EB205086D4AA8AC6E488BD82B39DF844B782591CF7943D78DE\ 06E189AAC9EAA1ADE0811D5CE37805FA53C76B2D8A1D4CA7E8D9C700F77300DFFC17818EE1F3\ 675AF79BF797DB6ECF3E60F34C0629A52D0F5C9389155EED7D4D9EE397BA77753C584900CCAA\ F3C4EE0823644DAFBCB0DFBCE1E1516EE62128EDAC32D2B1463E4CFC98F0268AE4C2BFB12C45\ 0FFBE84D3601A0F62C30039628F66B779DA3984784122784CA667277FA504A1FE731DFB70479\ 0B7265C6EFFB40A3515D1E370BC879C74E77F7765E7F473E3E44397026AEA2F6B0E0C23089D4\ 9D7E6E218EBA7A1FD841A90301EB4C3782A6AC5C52DF861C6F495F6CEFDC1A597956F32170DB\ C01CDD5F431ABE5229440EC56265490869F9E0B82D7847A40EB6E18CFDEC0483DA195A61EE45\ BBD9B3098DC2EDFB19590EAC0225D10E2F4654C7EADD240E535785BDBC0A4FBE5BCE491AB773\ B717516E369A95B7135E77EE18BE2387BCF450E18FB205A46CB2041B846269328A7C161D6A70\ BF0C84BE33542045F837C31FDF12495444009DA082C5B1ACAAE10445B5CFC29294A19F81A749\ 2E05C04BBC6A7D47CE681E7978025ECA19B01B1D7A7D8F03CEDC9E651D9A0F0D2D3CEA75C0A8\ 00D88E79D550AA1A306839F080C7D9EBE010B6523141D9FD06B5AB40099B37B31DC592CF967F\ C055027FC93BF4631454F5E0B4940EB2AC81BBFB3BF088CC00C84E5733F5B7620FAECFCCDF23\ 6DC9E25D2A07EBE9619438CA8EA09B03BDE999AF5F163B2048993418A47EB3D3B87CD96D5C5E\ 94F169E05BF998022D41C1C494D0538A49B47DB7BA9D4339079872421895941AD12946D74BCB\ FD741DA2E18A268803FFFBABBCE8FF4DF0563ABBC4AB0F4C426561AC10CEFD47D1369439DB50\ 33EBBB048397BE3595E79A11420153FA157371388FFEF1D1525C4F5DB8247E048C8292ADBF45\ 511CFE147B2B374EA9D0D776F66C1312E13FEED497723B1EE445778EAF1B7FC0F419DA1F:\ 8F6EA7B4AF404A493EC11A2E3869D46B71CFC47E26537804E0CE258B6EE6A85164C35C547DA7\ 80653AE8D290CB34F3FA4E17528E5938E237EDCCAB9385EF5501BB0DB7AEDE91A32AEB7BE0D3\ 6477AEA80FE7D0714CC8056B8651394C1AC88A230721AC8A3415908A321B79003F42DC783453\ 898A47D5E3FD0A24F839D5CEEF4A9BB51C1DA54EF0481297B5293278985275723D2395C7BF28\ A7F78618CF2E841AED31FD98C7DEDC3C821B92CC731714054B1A51FEA829470B32D83B63F087\ 686BBFE3E3B56FD6332695FFB8C7F24B243FED3E314EDDA8B3CC5E2D0F6B968092A4CB44E52F\ AAF9A5D37866EBAC3358AAA4A1F725391D226D30D7561A8F88894416F0B055FCADCC55F19FC5\ 29D748828F2E3BF78CDAE9AD826067D266E4ADD86AB680F3DC5E8AFCDCFFFA1971B9A1B9A21E\ 0DEA1F3339F54D19973D75C812DCE634B792932B99724B1750FF95759EBF9B33DC92DBB3CC16\ 81E56F9B1AC1CC91E863735A96C9709166A5835B81862E0514D557F1748F3EC77B6A35204D68\ 7028F9597E35BC28AE8DC60029945AA216C2979BB9D87EA6CDC49CB43F48B5181C2CB9102005\ 5D7A33513D8C8F34A27CA058AE98D03BEC7AB1806010743C55F7351C9B6C552B8936F5F092DA\ FFD9DA4B836EFC280097895A9C655E5CDD3BB1126F92528A94C1E8BE5B65F188FBF7D198F480\ C26713C9D881FB760383039FB926AB578EF5EF7746CD531B9D8EEC55325C4CEC543C832A781E\ AE64E06604A6342BF886B038DC672305925D72C8B8CFFF9DD99311A80F3BFBF6F5AA94059B30\ F7ED70F65C022E9C148C338FECE35AD3147A0AFBC3034C9C4D876D0FF1CEC97C35AC3E5A9D7F\ CB02ECC02D8F01550E961B283765EA7BEED4C3194CD054E14E2127280D117DDE0710D706FD65\ 1761FDB2AD33979CA5E44344BD615B1AD45E9ACB55F8562D18D7D15CEE6AD07EF245F7B07A23\ E7F20C0E25D4C274A54CC030A6D21A12BA65F7D530D897435AF9162A609F91E7EF9F923BB5B9\ A075DCCFFA99F075EC96155549027950F3DDF6B35D4E053B9E255EF4EB8B9A1DE30EE7BD516D\ 24D607ADF658BBD7DBD1F58FBA34C0A6FD81AACE142ECADF63FD763A03CA13FA4032CD10CEFD\ D759AA1E34484625CAAC69939E796C1E8E4817E0EC17E8D3C456283C162183E6796EAB5D4613\ D3ED080808DAAA70DA3A945CC0ABECA5B44649F234F0207C3811A9E4A0CA173096CAEEBF3DE7\ A2136B5F48516DFB4051D9DC98D90C3A011310339947F1A40493FDAD6098B17AF61AAA9C610E\ 21131B97A33F94D8A11F7A33FFBAB4F85973A2CEFFAD0E7FC555FE5816D67FEB78E696FF34F9\ EB76EADD09224EDAF9FF2B0C44E8346419D1100C223AF42976B031C10AD1A57D44A0A042459E\ 88D4265DA5A3017C31209411E67F468A5912457E8670D96BE6D460741866F5DE24BD45DB:\ AADAD8921C1E 239CF518A7A49CB68A264F57C1B9776D26D0E21264BBB25C552FA15915FCE66C2006D8AE6B5F\ CF9F0D4F780C94925EDF2CF9193C2F0857C050E522F72D873EB3698CE789FFCBC7268EDE838C\ C0277C6CF4135522E1B32BAF00DA4A63492D733222D451A3335892F83C560BB0C074157659BF\ 280198698261631794BBA5440FC2E624BD6CF0F9A3C014D3046E891D06AAD67C123D52373003\ C9E9FF370B8D0F6F18E5D425B71F4F90110E3B9683B6A1162A0571B695C6D2C4269B1114DEDC\ B345AD5C7687F889835D374683EE01CD3B290F70A66C3731981573A4B7FF0729E42801E94E29\ BA0D3CFF7D5CCD6AEBA27A44C84B6F0A28F27ADD6277AE5A2ABF9738A9AE473DE4937093AB72\ 646B67839752E048C00C2EF7607C7863CE5DD7C761258013B176494C7AC826A19ADA853A87C7\ F10F8D148627CF69D3755C77181847C469C8721A5F92FCBBDBA729DB34AF27C7FE37FF3F28CA\ 56587E22596378664EAE0E8BC1F76DD7F4D28717A4550E7D668C143215646BCF3BD759BBF03E\ 2671A1D01C071AA8F9E45638072FDDE82DA96617953DBAF76C22DF09F0C827B3A0439F1F86E2\ E1873F3DC854C8F1C49768153B2091941ED2361528D7BFFC3158B548F9EEC81677EA1D1A4AB4\ B24DCB221DFB055608BDCF25FE92DA59F87965F5B5C60363518BC0392C5F1FDCC5D2AEFE282F\ B20587D0F609594F5A1FB5A0B9DBDC3227C59EB4174D0EBF1A5BB17E52E489825CD50C604D34\ 671C0224427E0DA9E6DA00C41465FCD836895215C14CE15BC4B304E3A06FA984094A887EDED8\ AFF731FD07DB8F5CF871B2C27586C427A8E75BA1FB9D7A422E99F48F81E013257D2F580798D0\ 400BA3EFA12720F497946478C4AF612B280F18677F39EEFD539B66574F35B7ED8A918A8B0EBA\ 8870121DB7B55F3016AD93E865319A95C83BAD41266699F2F4D8DEDE59F181F6FD4AA179FD3F\ 16A9270CE16810F99E6F2AC5F54C7598E86534BECBA5D083E6B3B9C67D9F2B83EA704803EFE9\ 148E72096DCA3C97B296B1D86950607F5D17153C9050AC6AE97FD4C9CA448BA98E671BA92264\ E2F87B9CAF1D63506739DC62FE4FD97CF6D1105E156FC4DC1B4F034D5C3AF8C9F675EAA460A4\ DED2C847135A64A3B1980BD4625A29912415A3A947C0B4FCC9A2B8D3DCC6F3261B89E9898A43\ AA60B8B274F01FAC72438D5B5581A05D6CA300B06BB5805CF0E86189DCBB8A60587DB1F19043\ 6786374F6A2ECD23FF8E460782A2E4D8EA98E167FA330F336CA7E4C7F94C03DCFA55AA57B6BE\ D032C484EAAE0501F04B018901DA071E519009E0B26542822DC3E7B9799B34AA9EB69277FEE1\ BAC2E98E80296F6554CB3D60B6DB62811EA97BE3BEFC12F156881540509988B92F42249FB4AB\ 8F39A21232E2ECBC30907F8EC123B0D773B1C8B67A8DB0B0770DB559F6EBC63B23CF806E:\ 3D1D43BCA6010739D96D16DF036C6B04047BF3EBE1CED4DAC2490559EFF84120E194923FE454\ DCBDFC7F2FF02B8F3E70AF354D333D826DE8C4DECC83ECA6BCA35A42E7F16C088B970205C119\ 4A21F6A5B41CA13097E93098878EC5FB52D67CBCB36E3BD6643D407C2CE10F071A7EEB44D9C8\ 3DC579DF0ED3434B65A6C5606022A134674E714D02444D5BE22ABB4DE8DA93D928B2E6A02F22\ 07197A730BAD7C43A75BE382C495890631CFD4C943BDA20DBCABDB5BD5BBA0DB6B7A2A8CC985\ A04D4732DE32536087259B73023A0994915884AE9A14222C5A7A57F838B15091FBE3A39B39AD\ B962B36F03F3A81D52DEB13EF79487D58AD6F9591EACD2EC7BC256126D2EE696C611AC050637\ F88594718D6FF391A794099963C9EE7E094048F36D605165BC7DFB8DCC57B59115AFDDD2C66F\ EB4C289A00E85BDD6B08EA290D6788022A9D52BE4E87D2F433A52AC998109584E1AB7F8D414D\ 10728C58D50F8C4407FB9701868F3957BBDF48861905F3CEFED2AA6488A03B84E37F6848642E\ CC0193FCA1841A44DC6E6BF30BD17E1FEF02ABA77492CA5525FDE471D070C5B2A3AB0E1383D3\ E9C7AD274C2534E17741A4628EE9731CF69449796134F523F76C0934D88F0DEC7CDC67C45F4E\ 28D056B9E46F97DA29528AC6EA55662F3ADB6B5112B04EA807B40AADB0CE0B8D1B2149381EC2\ 7DD75513FBF8B271136E1CA59D87B0EAB956C37AE0BF57E099738074740E7B10D66CB01678D2\ 488C4F1F8D9011A717F68750902BCE93D9C389F29A53568E60E5B735431050469207E8720127\ F18E4553329404289E15B1292B8DF3FD88562B981A9202E0D92E3A83710ED49AB83BBFBF4322\ 3584DFC9C47D7B5DA45D199F81F40E94DC4FF4C5AB7A92D9D246E690E053C2BFF4307AA5C212\ 48A2D1FA5BAAD7BE81A6F07C61509FC625121184D73A0AC1630C345662EB6030C660C911FE5F\ 658181B7555EC35DA7F8FA00EBD2BFD9BC809AF4C125F1B5CA88B65FF8B93EA758489B481BB0\ D4DE2CCC0E68381D8F91C66815FC08A0546C0BCEBF52E0D918A61A597DF46A8817D8D5265DD5\ 59FCC426A9D7486D325F6650C5A078FF1E2BC11F27E298960A9A97007F173483C83EEE55159E\ 01370868C8C5C0FC139A9BD54F46F8A9DE0B7B82B80FE08DA0D34EB531D9CC2C46BC15F9CC23\ 814B98D38A39BB2E2E6DD9C7BC98C44BF822175610F78E034C5311432161B29A7A6653DE0040\ A99EE878E8BB9B30F004B31ED464BADCCA96596F6568B508E04D82BF5D2D836CE4FF3613C529\ B8A25DC5B8AB96C541C74E2C9B40880979ED2D60783089275CA75610FC2868F6BD1B5880D0CE\ FF0A8E4DDFC233111267DF38535841E42231C3AED60BC89B965DBA6E805B429F5A15FE0F54BF\ 5ECC3207156A5DD019F18699090E8BC3A6E80FE9213C2F0B59DE9AFE60F1646382F7D04D:\ 633768D40512B8 24CF445438C0D1EE449DE2AD694CBD75526DCDC1D19EB4F67D679C87F5BA69FB70BB6903CCFC\ 332D4C6744F617DA3C61FDC45EA5731BE4C141030659CCD7C6A2120AF422CF31FE39806BC536\ 1172948D12D937A67E7FADA2A49F91A5EF107B1BC2C314732A64AA49198208466A873EB04F8F\ F832BB4813384E0F9E395D51D1908C34488EE81EEF5754103907D8850FD3B013BC8B6BB1AA65\ 2683C46F7AACB7754C0AF944DDD2A94E7A4D5F8BFB4B134F2F834068096EF5DD82C198E101CC\ 7AEC73AE88F0E0E35FED59E7A53A959D8544875BCEF200135D309C27A2D74EA95F2645C3E2EE\ 82E2162057E4E47AE26AB1F3637DDE57023C4E97B83726CD47F2ABB1C6C7B880BB14F0C7FE42\ A52550B282961BEDFCABD97B5BEAB51333E90637B29F6041A9CF0A3EC65318FC013E583A2E56\ C89525BDB118FFAFD46BDE45CB3EF582647CCB40EBD6EF1C4EC7AAA9F79391F1A38B418D8810\ 5C24E49EA226766496EBF19983AB76C6C4EF3C9D1BC6DE59C2B975CD0E3F41BACD5E091977E7\ C40F974FEE8919F6C0F58E126375B697BBCE04A584A64BDBC1343774D9F0146FFF543A0CF0B2\ 28C30B231693C98E7A67A8EE4294D136F64F7C150BFD06C989711AC42A35A78D96E04F98A4EA\ 2111A4FE5831E30A6EF96300F14875B217D1E94D12B41BE2D112BF81B30961BBC028BCA2B105\ C97E841D1C7B02FB360ABB442217366F90F469A1AF64FDB5D95B9E50F85591F3CF499B440E02\ 9EC31A49CEF6EED2D7B6F15A49B6515539F9C3F5C5C4651A9B0442ED9534A863D15B035D581A\ FC705DC598174DAD2B8E4B012AD4C4E5AB965B778B5382EF8BE6AE93108290B9905ED5A37EB8\ 5E819447A48113F61B9E004F42F3893808E2240E6355C69B007C42A33549F2AB08BD2C6A012A\ BF27CBC4774002FFD1AEF10F971331B4413E632E020848C9E9972EB4FCFF9D7C0EF898F29931\ 3745247CA3F22A699F7D31DF7D7A908A64AECF10B9A9A7EE0ABA37910AB7C7187C4F5F028264\ 83CE39134A54D1DDFA183CB97C3A940A88159DE9F3390031219D3218B7166891171A7CE3D7F8\ 7CB701B9527280FBCDC429E285D645D01E668887F8462E2D21040928A06FA8F1F302C6CECDCC\ 7E97572AD1B46C2AF8DD02BC9701DFBC7B8D5A973A100CF332F780324BCCE3E8080EBE251573\ FCCA30EDA25360F1618F25076289A92CA4AE2ABE59FBBDA609568EE283F747F255DB20074944\ 5022B78C0AF186AD7D8B599CF18EE9E78E84E81B8CDBEB8CFACA1886937D6262486DA8DFE9F7\ E2C28921A09AB1C3BA7AD57BC7200AB49C12D562FFAC9F7C529A0067ADFD2FFB865B9EAC9C02\ 33C24D467C2B2267B36CD342EC88CAA672F77FF4359E1DC597FE50E82F29A2D973AB1DFBCDC8\ 68C373D4D6660FEFD160819F71A4AD464A9EC67A214562DB24472D5B278C5B2AEB3C1A79:\ 4917B75D7DD10C7DAAC6922C3807DC446A8AFFBE5B2007DFAAC632EE14AB8809D426B6C31A47\ 51F5AC0AD459AD4BEDB81E4E9A26A47A2E420D529F2D598F0D1597D21E36806386F142C00A2A\ B18DBE21820206EFF2283082FBDF19B8CE53C324D5FAE648C1E67CF44AAA2F850E21E9A978CD\ D5FC0F98A7F153BFB1C69A0982E357841BE6BBBDB0B994638BF7651CF0986F508BD69A21A4FA\ 1607B5054745D2EE18F2D11E115A1F7B6686C5E2E84CEC92BFE4A9525CE7573F31849B3AFD55\ 1A0A12387E3658B03730242318AAF5C8253265C116809936C0E0FC52C665F518DA04A78080EA\ B0693240C3AD5BE4E9F08771F5D6A31B8EBC68708CD8188A44D9E22D67F9D839B27F4F91BDDF\ 7AAE3F5141A3FF4EACA4E2D6FF788E2B5B2E5F3BA296D55C62671E4F1CFDE3123C4ECDB2640E\ CD477E0AAC5461D5A79AB67184BE38547C08ECEE1C51B45F2CF1E9B407EFF3B6A3BC14AAC5E8\ 3387CCE406B115C0EF7BB0FB7BFD563481A707434ADD742918DF8C711A7CEDCE355D34B5D08B\ F07DF9630FBA1B712BAFBC784F3C914ADA7B28F9CE1359C951992627677A70C5171A63408A49\ 4C097A1C3AF7113AD5E2DBA66DA11876487BBF998B024AE60D270E57B89ED1C86BF0396F836A\ B8940BAD499B20DB8F9631A7D104DC912BA1C0ED22FA0B1762011EE84183AE19F87615352C87\ 240FAABCC5F6B8D970B5A7544655B352DA64910C81E1C57B4FA410147EC16744DB0F7BDC5E91\ 8FC90CE7420EE31ACAEC353EDF5067B24BEFDA4A3C773C73876BFA2470405F44F683C6C54254\ BF9613E2226A40DAA7A703A15C582FD8CEFA9CEC0AB2B8F28EB7C3D97E2FD44B6E6934E44997\ 4C5DF97F69E377E80BF02E81115F43A5C057D4AA68A111F9E7B5A4F87A7193C4AD026F06A85F\ 4D6C8C86B378F40F8860A246419F0B4036C6CCA20891F5AF3C804F05D32292121DE0FE7431AB\ B29587F9E38BB3754CE18D1DA91589F4BDD28C472FF4FF6010391EFE83834A2E61AD7059CA60\ 241DDDE5412C67BBED50AEA0789911BCD56EF0612DD00F82C3EDF4E39151B9CE5EB12D4983F4\ 1EF9D756311083AD080A64CBA8518855A2E7BB50B2662FDA413469F7B906F6E7E72FE778A95D\ 3689553F7C7AF367E47BB47A7C052C3506D976FEF9F3F3389C456F84ACFE21A28CD3EF275CFF\ A495E1577DA1B95E867D0050B27CEE11F3332E66E04586974E815B13C34E0704EC151EE0A9C5\ 85D7F6259C6241E7D50A78DFB83E6D45C0F988DF270E65175FA688741F0800E106C14068FE70\ F03E3989B6AABBAAF4929B5DBB080BB559D1153735E28FAD7F32699382CC8AE5BB8F72AC5392\ EEC4F92FEC0CFCCE3CF36F0AADB781D0E7CCBB43977BE203BD4A92336C4ADB4DD28770D39447\ 06E93360B54965DD846F4E17A96D301DC7DFF7073644F4C630B3924377E43BFBBFFFBD8B:\ 60B01F1603339963 C9C8A2527DED20D6CBEC16939C7012335A7E0BFC8D23D7CB7A819E63FB3FC39175D2F1964557\ 4D9DEFA9DD9096A00CBF062AB5A30F99CC110C5F67BBA32526C96B0A62DAA9A38BCE99F67DF7\ 3CF4C424C4EF673EA3B1EB32CFC0C44254566A74A9EA8610FF9FBF1BC8957E54E91A169AA98F\ CBD119B24E3EC19E0E6E23FE9288D02A230BADA7A77391A691021F0565AFB0ED5BAAD85697B6\ 8A42BB71C1EC0ECC99B227BFF334F2F218922B56BC6BA15CE9EEFA0B3536465CB7D81AF4CDFC\ 59811C99B499A38A8CF945D9A83E1A15C4085AB27B2C413031CB54D818382C626FCB4996D738\ CCC697A33A8ECDAD86B1082CB97B38DD8FE47188FD9D9D773A8F72D5EA74ABD533AF7C2300A8\ F5C881277F274734D14279A08D90FAEBB4D6AED98C94299DD411EC1412CF34004DD2E7BF812A\ 8073E586800E0DFD62159F754FD01C3D89756DFC50D468D1647A4C77D0151727ECAF60257851\ C06008D3A0BA6B74BA815456A789C3965102F5D5F1277B873792CCB0E40B44B373DBD2FFCAC9\ BD674256BE1DFEDC78D7909FB375B607934921F3851C90BF8B82DCDDD91C42810143807C62DF\ EE6183E59701AE53EC4D0347B127C0D609EF4D951FACA3667D29FE914AA449C941682D7A17D2\ 42B4A333DC970CDFD931D35288EA7076A7D4054AC233A6AC17E612FE32570A9ECAB968DB5B39\ 964E6E301E63B815F13DCB99793312C6D1AB998A1E87D6ADE96B497931FCC0FCD3D0ECF79C23\ D44BE879ACAF1206856A4F12B948548BCDABB07664199E1291ED4B2C6CB0895FA7DA30486F26\ C5C7BACF8C5A2ECD9EA43DA809067E1EF29F92A0DDCBB495AE07CF77A0D3E3973848CEEDE377\ 4BDFA19F802313665A64E7B9291B2153080F7BBD28E727624D5DB27561FB8CC4D45BB66F9A16\ 20BE69A759265CC089DCEA331508E495F770433966582058337C0D8CEBDDA660DC74E9FF1791\ 06E0831F9BAEA68839D98CFD2C2507F85942E7E0178581BC5185440C6E8470AE31794F422823\ F80B4A424866918F7146235AEB6D69DAA7718A18EACCFCB05A6BD6CC8B656CB03FE0D8FF5AAF\ 936417827FD51D811E1182E4B726E0AAC3252FECE247CF120A0985D8FAC1A9574FC8882A5830\ 32BD4778997825D84A96CF7C939544BB358928D2BB64D695B6F5B002889505B3D8B98FFFCE5A\ 48F9A05E05461C462E8B30E566B95CABECA00ABE7385B65B5B9749DF238EFF814F5F0F0C378A\ 366179CAD80153A9F5172BEA4EE42CA2963778D70D4953907935BCC09C899EE3D8FD5EAD0922\ F71576442A760522C4D0118C9AFB867C338131EA0ECE114AC44DCE202D4D998D585A9E37987F\ 0057556B526D39A472D66425580AE3AE64FD24B663B1B56C7EB14F543E3611BE367D31167B99\ 037AFB25A049E80DE1B4CDF8EC69CA049BA9B51101369938995D2A8F82244FC4E8D92A71:\ DCC0C301B6C08825CEFA3555DEC86A5BBB7B86B015699C2CB7586E7D5B27B85237D0993B9E67\ E77BD06C357F274781C52AE5F0AC9AFE42E8343E0CE46B77C639C18A1859A007F7B6C5F8F90B\ 13D88B7C041383FF4E6D5457AC473370331073684F248B998C0ACF1F5EC1B32B749C012E68F3\ CB8F35368171AA4735A3B7DD988205E9662520D0916A425628F48A4A1AF94369835C2E042512\ 89F1550C7AA99AEE184152A86E00D121FA5026763DD8B106BF9ECAC68366362464A58335386D\ E0AC155E344B5C687B3CBE126E18F4A237A20F8041831289D79F12D2F53CD1EF0163614BC2E8\ 2DFCC2714C02280113EF1908FD40D3763ACC6AEC03128CBD3469E152E81C2252DB94A972B189\ 1FD62D774AF979EE53BBFF7A4B6EFD30B28DA1FD5B8618CB6CE82B3D408CB165FA55FB8C2A55\ 3C3EBC448426F3691ECD20EE48F9F06607A4F10A16C2E9A186C1AADDD35908A34620C3AB189B\ F8C666B9BBA5A9787D751550196569E7B5231DEBD02283B5B6EFF002FF33941E755731A1E2ED\ 27EDB322284716960E0E421F6C00D96E872474C6C18F6ADF6DB307549FE6FA29CEE34EBEAA1A\ 3B5EC7927CCCD5ED29FF0AFE7478F78D461FE000623775A010F9319E22D0417E9014CFD944B5\ 165E0A3A71758E7C15E4C64F26F455862B6A806ABCD8D542FC07358BDEDB48E06E07942BC335\ 92D44269009A079C6B5067B32C083277B43CD245BDCC9F32AF924A69B8FD6203E147E4F24D98\ 6462B4FCC19895DEDD69CF631D9362C21744004722B419ECEDC53266A419623188E9234BD0ED\ D0B6B434A747050EEBCA6485CA81893BE4D488D181211161A7D1BA0D91BC2EE94EDCB99A45ED\ F8160A9120E477913A225C336A24E08A7640A8329C9D4277FAB518B67EC41ADEE3E6845EBE8C\ 53C6F7273B0891E237A3939AB9CEA6839EAB641734AFA5206CED08100DEA1031CAD6DF653926\ 30A33B791A2B10036948CD441D20D013A1BFB2730A0D265FC7AF87FA58EB42CCAA6F954936DE\ EADCE4A160045258A6B65771C8916396751C0B39D804FB642A7FC071887548268B6DDD38DFE4\ 22720BEB1BA13278C284321953F2CEEFCFFCDD051A0B847238ADDAD359720054869202346BC0\ C0D2CF83408A68CA1657754C19BBAB2F1A302FA988B73CE061DC7C98E8EDF3918360FFA4214A\ 7F7AA75567A2A0E077661CB379B40743E719178D55B2132697E3D73C924C15F99925559E2D48\ 879C1A798FE2E18CF15A5B3819F36CA5A1DEA0F257EFFA7C9F1EED365801CFCEB2EC1798A543\ 4B0702E7339E4785AF3F558A7EC6CF8D9EF7BC5A57DBE2E3CD148A210F86DD59C9D75D949870\ FC7656972118585DEB702E02B8EEB2A2C291F46078812A09FBA07BD5473F2415444540C615BF\ D49F9635BA7E4BC935C27416509FA81B6787767CD67F296253F55F0B55B293B399E316AA:\ 9FB8C092B2A0DFDE70 A946842004EB370887F8E43D082718924A419A24F3FFBDA01CFEE2A57E061B5E939B2A38C798\ F62EE5C62F46711D980A9CF38057E73F6ADB9DBAD2A1B4CBA828E79E5A587760D6DDB3B04AD9\ F61CD53E501668DCAA42CFB5DE0769AA8688060CC7D2C9D845E181C18A842D9E3C45FA1FAC06\ 0CBE4E9D3F2C168B3584AC87269DD455112BE67218D5D4C027A1BE4ACF7C68FB33100E8DFB1E\ A8DA8F63B7D89A5C972B2D4DD0B2627149759674CFD8C7C91FBAE6C6DC156D8F2D58F45252BE\ A15B0EE577230386F6ABDA8B40579F216166C8492E1F9ADA792C42A987B270A2DD4ED6E21B8F\ B5AB98A8D56A782F8039474D0233DB9CE6A0A2B8B28D16C2B7E69B8834D3E2579A8038CDA9D7\ BC37D2E4E8E674DF39B6B62AC55BC76A83738EE0BEA1F236B938E0F2CA63D1C97362E00364D7\ 8BBA094AFA3546954461138F2012B04144E8C95046E4C1C5E8AD6D17C5C9F74721CE68F84000\ D101FD25182AAF2888E3E75052EDE707D2E16FF382A04FA30488FAFCBB2D70E5B4C0294B8C8E\ E04CA6C6A8624E476C25451BA7E1FF956FC0CDF4E8207E6961B1A017751E40A3888966644022\ 7613AD3C3A3BD853816C4B0E17A7D1267B2615A1482CB304EFCE54901A35F3A56E8A392F6EA5\ F8B79309F69EE8A936FCAA6B1DE2D5C6108043DA1C11CD0E199EAB241385646F4ABB81315268\ AA77404EFD3E2070E8342251C9D433E474C5FDE3546A2735C406194220CE42B830E6A483390A\ 2BA772BB36C9671068CF6E7BA70EA29AF7BAD1F9362D368E69E01E29566C27C6D3B926F7378D\ 0BD7195202D052B3148F7C5D5BE19C0772960B9D08EB31CF2AC357C2A98E4594AAABCA37221B\ 09529DB5EEFC26CFFA57F973AF90813FEE0D8E25CD49C7634B033E4A3AC8E370348EF6B76AFA\ DE6DD823CFAC381AE795852F95763EADE551F65A729E3366538E8723BA2A7931F217C0E7554E\ 5C7F9E02CC2923717D6F285AC12E4E126006E99EA0393356A3DF5EDF1CE578B9A5242A8D3526\ BEEE473B2EAEBAA89B593D93398250AC62A5B111E8FC473E77C4F64C61128AAD86887EA35362\ E1F1AA1B72126846E7C00585EFD36D3C350BC9F2E6C99DBDC4CDFB18EBED3F9AB9324A58C944\ ACF030FF70A196A6C125DD2C79E698C9995C9160095534B104D5859FE5546FFE5EA14FA398A1\ 2E15DCB0106E8D1962A41D229694F24F858744BC09C0BD303572CADBF0E389822BFAE830C71E\ C5EED78C5F5903A30308331F8DE92E20F1F94561D74344049419C6158E533F3B29F6C8F0242E\ 832475DAC711D5F1A3AFBD853E4F48905F0E1B90E6C3EB4560A7F5265A10601C8B9EB7706B5A\ A9C654366D4894BC88DEDFCD7E75AEE80476D5C7FBE5DB7F82152D98B0B27AE01161A4037E69\ A96CBD11EB512259E178284FB41FF4A5F16A37053F7587C2F237F10059FC38699B86ADDB:\ 3B6BD8169D4643AF7E792FDBC9A2ED78BCECBBDF7EFD7B7C86FC7B96C4A1E089888BCBE572D7\ 15C2ADE3367E948E02C723DD7B4CB2789BDE1664375529E183C061E263A319ED240DA7193A9C\ C7CCDCC188F651E1C2A875B06D6A27EDC6F7D7B4AAD7D725AAC9983E150F7B54A1DD8D36068F\ 65A505CE401474AD2C79CEDD0895E64AF67907D2867845D13286712FD294C4F1604582C2BA78\ B540614A7FE2D72B4C943305D8AE39EC416E6D1FD9FC6BA6A6093BAEF7D29BF04F879166968B\ 3067228069FA0D1CC1EF70B870EF4FDC2484542CA88FEB946C8169F8E786DEA68D654986AFE6\ 493866943BF065ABA7DA02E9B225E1F9428B3466212C733E9CC293189E54B703C0C6F3DFA17C\ A183F4F752CBB1E4803715B2B49B00D70EB36816CBDD856065BE5F86A5DE04A3FDF0FC5AF5C0\ 3E95895A28A806123559E642298CDF940912C7B58A1B0A536FE6AA9DE8A5F98C02FFA7C8A99F\ 1ABF7129BD0EB678F21B3273BA5CA047188F303E6F8A32A7EF864E49470478EBD7187C71EFF5\ 7EEA68147AD3D5C87CAC6133E3B8F71221E8B742BD60A4E73137978FBA51F459C22EFBE66D8B\ 496D9385A8BB9962071F997A2AB3E730A529269213F121583E1A02F7B1F15F754BF6BAFEA740\ BEAE9DE0CC3103F9A9A61373956AA02A5D072CF658A2BB250557723F64BFCB7DBEAD7441F25D\ 2EB1A54AF9883B9BB25653539D5CA8289B8CA9C3DAA69486958D6B190183D677598CD9A4CF27\ 9DBCA1E323FF83B82DBDA3F416AAF6FF2C14DB6CE5052E5657DEAD8DE3C7F14C74A4EACA1C97\ 4DB989625E0B9548245A3D7857DF36A7066242261336E72347A3D9B765861DB6D9BF843F2274\ 6C063AFA1F724D83204E5CB3A9E8F1AC86C8AB62A83B323B48D52CEAC0C3CDF4630B35F26749\ 800DC95AAD88EF7F83844413E04A17136618E9CB799DFF24432798BA5777966A07C0A3F24159\ 963B9EA803DA5562D544A6CDE1FF21D6D5AA7CAF38D436B706F2706AEF6EC02F003A023D7476\ D0FAAA3B5DC397524960DF83616EC5D5B11D2CB148BD1D2D6AF388AA4B978F1A2C2A2E6AD548\ F5F7D12B9BB28C96C062FD13EADEAC01CBB32ED06B75A5DB7AF0DDC56DED1EE5CD509003C211\ E3B5E673B7CBAEE0A2281B156BA5264CFA602080CEB2626A038BAAF69FF2C3778F06277F71E6\ 2375C78683B4809D2017725D9A4AC03FFF0D3474AE23AD183C012B201DE91ABF005944CF60F0\ 96667E506C6879771172EFDDCA4BAC2AC65EBA86BDE7E78E6F6970D59861708A01EAB138F33C\ 197997B98507E5D016D7B3AAF9F774A93F3A7152C22279D2DB55966F387118A0A23C36A539CC\ D75DEF4367017EB0502F7E5E08CC7541074280A90A6CBE0E4D881154DD3836E6E50BAA61BFC3\ BC4E4427BE0519D74ECADFC57A3D3CC3B3288A6195A4E1E91ACB74F7CFE2F4ED917BD7FA:\ E8547EC6BB8CE2F8D4C8 18D660AF6D52144C394F285EC02FEE9AA28F11EA732D393CA23B6C68A1751EF3BE0F28159E00\ 55FE925E3EAA77308D9FED109C764405266781B890836069A817C8CC2F33476F02480ECA4F6D\ 389B2F44A7207F17AE94EDE443064A1C6DFEE28086033DD69C4AB8622A9BB65D1032E14C4F36\ F753E70F9E399EDB92092FAC60F9540A2F8E6D2DFC418BCE35F56B1FB7ACB6128829B27326D4\ A4CE6DE1ADD9755BB6429F5BFCF9779CE46A041466C3CE353534DC114F07A62AF0BF7472BB0E\ 760098E920F77D3F3F48145C9501C699ACB53B9821DC56875662E524C90EC65C3BAD9A2D2D15\ 2D504EEEE8C64CF87278F964EDB34A2B89889979C71E02581A4B87C3B6377287AE1FBDF2D777\ 900E318201B257A1818349EE5A247B755D4173A9A6E9393B136D92AED9D8420D40C91CC095DA\ 913FBC8C8976D61A2D1AB5191DFD0ACF9B9A694CDEE2BBE42DD8B600616F40B97E6399068FF5\ A5FFF39456202427938AEF8D4DB27D8460FCBD4D91E8F2C16C1E9704479CF48AB364A26C85C5\ C2531A7D624EB8A3FBFD5591E91FAB465EEA54296C0314E944588FC8B74D6BDC68363037C8CE\ EF9EA7D97792F25266AFD6B2328E53E8AF6FA5D8D8DF625621FA21E29D809CFBB86C8CF7B018\ 6A8B90159724A57C5E6892161E6802BBDB36141DC5909D4BA3CFB59DBFE8A5833F3228A9AD92\ 54815D69D09C1BA3FD21CE5DA19B277D46B2EAFAB171DFFD7504A71FFB96AD17422E7DC9541C\ FF16BD5AFBC498BFACAF7E5D5D79EB9072CEC455BEC783F0935ACFE8E2594DDF5252B598AC3B\ B6F7F8DA99AB326B8C914DE01E4FFC0D174803CD4B69787726D9324FAE54CFC17C0E8A08692F\ 3E9854630A6EEE746864E0FD2D9785B426BAE60901C9E7478394159B4E7539869398282F7998\ FDBDD29FA5D3218F05C623AF3B0EFE1D98AEF1B05DE593906A6BEC93CEAD1EBFC743E7D96832\ 45CFB6DD3D05A456868DC0730FD426066A261F27776B910244AE61111E4CABE88A0B75E97B66\ 4CA5B3E896FBAF5550948DE7E6A695C413021C702FA31988D734E4E2FB3B71CB33DE3E942035\ A9D6D0D0C9FCD554C3BE6797173CA5BD7E2B0C7AAAEDA585BAFFB630BBEBA0AF1AAA95C67915\ 2248BCCB76470C2896FEE0821435F466B788AD81291B9BEAA98AE92731ABACFC67FF5CEDC3D2\ F528243346CFE6A1113C71DC8E0E8F9F88637937B70863ACD5F413ACA4FD0916E9173A8ED8C3\ 0D14A2A3D017766353EB0A89762678A11D3AD47FB961E5DE31D9B24F98128A273E3C1F282A1E\ 214DEFB324D162F9025CE8CED03CCC1B140131CF0E17EDFF2EF1F53CFB3BEA8D7ADF14D84FC9\ 8D43CF9F5F771423703FCC3D034D108AE32904975D758C8234A2261ED6DB23B0C04212166DED\ 54B0BC15F62E6E1ED9B020D79192271A6A2714A9998B3DFD08A19E8E2BE334DAF2BA6626:\ 024CF54DA77692C014693C6FACABA08C52F75332A7D5084E2D12F3547CA2B166FDD6B71EC89C\ F9FF02CC4A289B133DBE6AFC9E87A7A28D62E7C4B636E4ACC9370E77D900F089163961BB6277\ 64F444F013501BAFEC9F80F753C9FD0055D4BAB050FF1C1DB22C95517AD76E5686DCC7DE0D1F\ 08DC2EFB287C41E279DB75CF4F67E43C452D10537E8AA653D284039909D33C4EFBBB47FF0939\ 830CEA000B447FEF774BFBBC378008D0B212087A73D572C54BD9E665A7A4D2D533C7BDE9B976\ B65FC7BD540F4E9C81B2D26DBCCE5EC12739863C8C76071AB93C2D18F84C9198E6C70976414F\ CC1DE005251B308009912D6D2757AA9359BC20FF60130E12F4BE75725B69D5F29A4177DF104B\ 78CBD08F735E1DBDD51C0443268143CDCACD180726EA081A9B252B26A4A6C16CA6225CDA357B\ E3CF4F72D7171C853DE6391944CA2065A32298EA17EE0CFDEEF2BF46A6A83BE4E06F076DBAA3\ 74ABF450B78CDCC3E5F3976EA2D9248CFAA75B292542C55497339A149268E895465B44AA16AA\ A91021CBC32B761D1ADE1E5CEDD5403385C23A2DC36B468A2EB54DDD3A78A7B0491F2ED546F5\ 034A9D4A7BA067C10B920045A04A6D27629701F92EF442DDD3B81FD992C61D17D81625727516\ F3163E9E2FC538486D5AF1C0F09226143E79661E6C52449DB9518E1DB541E0C0F862A7E783A4\ EB78E916E9C9CCFFE358D139369D416E15B361740530E525FAC7FE1A5897C658A66C6E8C541C\ B1C5B0DF7FDF1818341AE975E1CC0517CBD55F8166E499F48C78DC017FFD4A2FEE2318FAF150\ 34EC62D451F559DD47B09F4ACB5536F593194B43ABBB5B88C8AF87699F38C2987B4D212190E0\ EDE8BE80E97B0E8FC7C5A71C694D2FC7CAC8470440D6E6225B415E6A6DA4BA879468DB40D765\ 9971A38DE502253EFD724AF9DC2C702B9F45D6613181877A2E3E7957D0CB6849101AAF3787BF\ FB188264EEE9337DDFFC7405E80ADB30DC5CB367EA438D502E3B1DE303D5755A46A46D8B46AA\ DA4E363CE08AC181A9E4EA6B1DB9B3AB551085DACF99849624DBD7933F1723B7AB4190CB429F\ 696D8DA5DDC92618BEA7E235E3D8CB423DA90E90A8540561FE3B27ACA309FB9F1D4373AEAB4A\ C6C45D90E1D95C0B2F2B7A9A9DC468C8654779361CB4DA6D6713C7218328707DB6F8382A3B8F\ 274712FE3E70B439001E80CECF6A7385F91B720F815211CD9533764CF8245FCAB3ABF7FF7271\ E93D25DAB94D6C75CFFDCBEA6199E5A6069FC13892085E713EAC8396988CD6554E0ADF4FDE2D\ 8C4CE6FAD62FB2A0C54D3DD6E55610E14F6DEBF5126FC552DF942F06651AA8E4AD9D4A35C10F\ 611822FDE83ADFCA8ABB678F9465FFDA3D5AE38CF0EA04DABF0763C68E95519ABBED916AFA17\ 1A487E72F54B6C88794DFD6F80660A23E2F26BB6E844FE27DE41B062910228FD1030583A:\ 2F2758E4C63F9C698C6503 F6F77F1E437560515CED6B16CE05A52D89B68DD10EE26E826F0E6C54264619B71A4AC1F4D56E\ 204947DC46804E29689E8EFC3950CE25482C4ABF907798691A3282374A822289F24E0253346C\ 0DA48BCD2D28EF6CA9485221612ED197A3E602810C97B644ABC1A43C40B29BB99C5DBAD8D641\ 146CD621EE1149A3E74C51B460A4AD695E77A574E23F4E74FEA26EFE64FCEF59844EAD15B28D\ AF3FA97FD49DBCA5AFF113289E616B4E898CBE2C7073215C02C3E33D1D67261075D077414DFB\ 32BE4DE414A21DF902AD16AA76A176ED1B7A9AB8F6AD35635A38034757CB52C48B3F7BDAF5C6\ 87DF0836AE7D11E91A41733C721F68CA8D882F2B0A6B00C133B230422A9E9A476BF016082036\ 876D7607A34BC9021E867A24C33E1130589E3F6FB2C75273BC0271E849D6DDB84F430F6548CA\ BC9227EAE780379BF9657FE9569460036A7C1CD8B4C63B3587F0ECFE522128A286CD8CF0F2B2\ 52D433B6A4BB4445AD845F9E56C35934B90AFEA01DD6D5671754C0B2132D4FA6562B9DB9488A\ 607BC6607197FD93F7EC345A0F0239514F1DCCAB1DD67A2A12B2DC2511FC789EE8257402BB64\ A02C703D70EDEA45D64DEFD9209F9172C3DEB8948C0CDFA05E3B33AF4CEF56F5ADE10D8BE406\ 61742249F6FFE71E49031AA605054719B59B1667695E1A07C0D126CB477BC005C44E6FCB47F3\ D08A7A39DB4A7B446A810EE60E71BBB3951890CCC182D0613119A65BB08309BF87214DB179A1\ CE2D3F21C3F2132047F8EB5F4BEE3198F316C669E007A435921DBA101CE40A07DEADEB308D2D\ C2B27EEEA201B75633476DD8EF2091FA1F0950FE713BA1BF06F1B55168CB416C181EEB0374AA\ 728531BFE226CB67D7B2F5F283EBA5D1F87F3FF90AAE06130F34EF44A8D2CFFD7E8A5CF9AF42\ D3A7AC0FD4FF2DB47A38DAAEB3A7C22280205879415418B429800762F597CF5C4A4B07BE8273\ 827038F83D805A4E6ED95D415E9FA13EB8F5E401241ECDFA71DDE6BAC2F397155948770925A1\ BA9AC1BF5A65B51C26381A09E8259D4AA8B62AA97454D3F257C0E5FBC9145A4F4A47BC743B3D\ E964C2FC8E273DFB21B78B6FB42F8B6A66DC766F5729F1BA68426D4EF7D5BDF9E28BF39B964E\ EEF5A880E2F67B8393A57A5DA788B51C181EFD35D919C20518D32425A4050022EC73C080D404\ F1400D1EFA7FD2DFD8AE759ED20D3657795A4DA020D1890830FCD80093AE746DF9250F2749BE\ C1143B8C7E20DBEC9E94F69B768DF054C202E17A0756C02D32A008AADC2F009D057AD556081C\ 68832EE240EFBA8F46D6D99F96F66B508360A42B38F0EEB367DF2AE78FAFF7C30B0A22CEB9EC\ B05D683E3963E7B06EDCA94BEE20C8D991B1931D0C4A1321569679CBA497406F6E2F74B36F93\ 2DF3134B77747D321CF4A19C05ACDC25C548AE81F1676AA2C18B7C14E6465569AC436D46:\ 6F2A05211F8D2800394D5FEB91B7740DCBD71033C4395845528B814C495B9CC7E242905B5C6F\ 30F024532A50D8A1A4AA3E67ADB9B33159767DA566E5E50E7844C503F48BB9647B24ADB996E2\ EDE2208521DA9B5BF15B344F748E215EA3063A3E5ABCB592F2C04FBE841BCF53A731DC1322BD\ EE3F3E91310FAB216ADDAEBD5E226AEE12FE00ACA9022137478C2CF93DEA82B302AF5238EAFE\ 873FEBD1F222377DFAA177D8E1E313085AA5B1A28E473C7303BF0D131C5F8188896F2304FA95\ 83ADD474E92924FE1782740CFAC20AB4C2728CA3D0C41F6C369EC1662D166723E0262A7E4100\ 4F41A795EFF54585AD8F8D1137EFAE0F158F9B373ED73DC73DFFDFA00730AE381A71794D48D4\ 2C90BA49AF77EAC887AF0E01AF68665F081AE40757C6CFE430C3996EA4BB2F1EAE8E97413DD5\ C04F1B1B64122C448F40701C60DAC75E34909B9B8B61895D819EA5F55B2FC6CA5492AF520E81\ 6AC2EC14498891D073FB65E3D33272CB5771A479188CDE2FF818881481A4747BDB20F0A60155\ 7E016C564B8F5FEA42694F12681A7D2906B2EB0DC0DCD8B98E763C5E3334D65B84AD23AB7C5E\ 7CF8CE1EBB34494E23FBDA3D34994BB20207AE5E12BFC95A217F3907565E742FED414060B86A\ 14C710F5F5DC79F0611F2B2532ACF37E210B123C15B51E03936D8C5362B2BCA153B19F7F255B\ 0BCDDD9FE6FFC5DAE45C42FB0277A56FC5F6B56CE49FBFA7B1C8C249E6A5EF497CC7C8D7CE32\ 0BEDC0D6EE2ABD5FD67F6E953F5D9BB025F7853B04E304C382E3BC80D6E5C87FE637E38A8293\ 05348CAB5BE542A7DA8A6B47A1186B6590934AA86356E58D6FD059D333D8AC6ACFD1315EF3CE\ A933EACD22933C9F29A7455D83BA1A8DD9B69189A181038542026ACD15085129F824475E1EBF\ 76B591422951D96498F1FD5CF93701D2CEB12F466E701B1FEA1D38C6F57DA33A69D0CA041BE7\ 86A045BFC27451A76B0105F00F9640180A97A39D6BDA768D330E7DD5CEC42A78E12D518D7742\ 485717A383B983C8749315037D39A100248087F4FC40143873B11ED80FE496532DA3CD09C5FC\ 1E22311922A3445E07FB84F9924063503ED11369F70CAC8B6CF7D8367658C333A2C421447FEF\ A05FDB39055F4A46BEC4AC90A2868664E47AED74AE0B0B5604C06CE8C33BD2DA41E8714AA852\ 8C68A84BE11CCFA67BE6F74AB4ED104342D76BDB9DDB8F38CCBF28E118888ADB1D7626122FB1\ D265ADD42DFBE823E93AAD3EEDE4D472AB139A7DEFD026B758F3669EAFA7A1D99386A5E87056\ 0DB879884906C0CA9805290FB19187AD24E7C2BEC4DD3D4025E7B29667ED94599751378DC4D2\ E0A5A916DD35D46518451328BC7187D60FAD9CF47CB13B8B4BBC9AD71C064BDCFA9A1F674AAE\ 15015B5EE1BC46B1FE3C4FA2A83DAD03239953B55316F49B5CE605AC9CBE41B02DB59965:\ 195CAE9B4ECBCB8DEBDC6C48 EAB25B3642470318B8DF509B4B1939289B9EC9CCF3A12181C8AABC6A72747AEB41A68F69AD8A\ BFC1164765EEF06961714B7F49D8098088B245E05DCA8E52CC7AC8A5E97C6DDCCFEED8B6FFA6\ 1EE8DD8644BD31888D27F81D1A21C1681771B732747FAD3A238381C80B004244B0A1EAF51425\ 957D2380E7BD777F74833DE0A3E3CEE8953A921F9DB5B6B8B8BA19982C7CC2F8C2005D1BD8B2\ 022FB01A687D9E0DB6298BD42630A9660B25EC35B2CE6385C8C15A79670A23ABDD74ECC9CC79\ 14055063BD762659F41DDD1AE6F7912428A55EF0EE4EDFB257F05BC04C90EB67196608108599\ 887B5FDCFC265FE811ED1A21E71DA52EED2F1B37884BB888A23CA74752E1D612E3575B54F556\ 85FB6BA51743FF5BFE44384FED0832819BA014F613D7B19A046AAAC4C8902212C6F54BFA57B8\ E9E5C50BED0E0A1F56AF878A323791DA52F173BC284F3BC38DE23D27E06CCCCBB4C1B7E0D6B3\ F594FFB71E39120076D78EB85722A7EC25EFD39FAF7EE4D020B3D05D6ABDEC9318075EA81995\ 97E9056DCEC1678CCFB0907977BEC59338AF03D28A80669A629A70D6C7882484E2E4A43B9C01\ EB5FB0E034D8A6E5B54238F3EDC82DF6741055D093F4E43C6AC4978A4F7D00DBCF4110E6266B\ 70F7AE7DD2A93A74B16A3FD7AA249F6182E84094611EAB686DDA57D091CC2E156026D72B7D8D\ 29965F9CF1583CD921DCFBD57BB0532B0B502F4F4FF6FB19DFD858AFC912BA411310122987E2\ 84D9463112C879E9B0DD686F9DB45923A69B3BD200ACDB83FF41366A2C417CA841D9B85B7CAD\ 21681B8992D0243A6C30476B85AC2B3024A6331C160CDEE694D09416300FE4C7FA1B76F05BF7\ 9E5FB6880ADB3A1DB894ECC980A10895163BA57D36060C5596ED1AD1621161EE6068184EBF42\ 719E9A9918A819B77394D25D26481BBE51858A4BB0EB3C693CA99DF8A504E3B1FDC84A497312\ CC4396F7C4EF1043B70484499CC24002737DEBA24D9AE4C538410887830AAD0E5C15498C5AF3\ A24597306DD953E6B342DDB22496A66E156BD753F4876C26421CE720E2C3C864982433374351\ 3617A426374D0DC812C9C1568950B68F8A8EA1AFEB581C4F2D53C48654E19E4AB76BEC7C8D38\ 4366F207EAD9D044F8E5C5652A6A73626F5AD08A0C3AFB50DC9E6541E24B9246370F834D6E45\ B4C8EC8D7F4C64F01EB97D11E8DB1C1EE7A489926732E8C8CBF6873B7B947D98F96698D2F2B5\ 513F2AAD60F481B39D6CB49485633CC81D1B98F6A7ACD09CDC001D13F059C1921B7AA5F7E760\ 05C51291F902E6F566439B9D2AE60A4AF32E939714B55BAC5E5A8E2053AD063E05738D03A704\ 441BCA926D069CA0910BF5D4EE3F81B4D8940E1B5980038339362F08C293A2F28CD0385C28E9\ 0D542C36BDF80172504110A03B3F57EC6F700D38CE039E7227FE6BBC8463057D92ECA65D:\ 7D681C0CA45B1919BB9DB6102FABF4FBB21CEF49BBFF6744D4779533839A414C06FEAC76C278\ 20EC237A08EB003D46AF81CB4354B701A8D0C8CDD6BBDAEBA2C5D7D1D089B6D530B787BB25C2\ 9291239FC3DD2F7FA1BEF55D84E569C40308D792EF44BDBD9FC557CD618B6626157567C45481\ 4009A611698576378B094988D2AA04BDE298B96AF7942A1DDA481546F080BB0D3B093B288152\ C1DE21C7A6429A6C794AF36D387391A5C71A388EE30D9A887268FA4FF2E8D249FFD62BB6905E\ 7FA605EA81AA0E21BC895B333CB7EC253693A6A035632DF8FB6AFC8DB3A59D05BBAE5A5C49C2\ 0E24235082C55F7EB8573F18B3D379DA4188DDA7DC6751C5F20DE416DEE4C09E8A43D60EFE26\ 6F0048A127617255653B3AF4DA277A11D3391C4C4DDF9088A7B7880F8CFBFAD185FD436363C6\ B36E9FC45FFDD896E502061A7B154B67D5A0B715AC4B970D27645CEFF88770290A3B9ED84E18\ F306FF39A9C70E9EEA4DE6E661BF81D6178336E556A36A87024D7C2EBF04C10E19B8E5F6BDB5\ 6C7351B51345F2D6C29D5D1BB28B10357818D482A2015221DEE8798F326C223D8E382EE38B3F\ 2B68EEEDEB726F94BB1A33C5893AC6EDF050A90B7DABEDD734E269B70C5E3ED5300C370E8EF0\ DE215A69799145B11918D2DFBFF65F80C00BDAEC88153886BAA2219EBA027B6B93B6DD6D27E8\ A70F7318326E3A0F2937C6C25301A33A521C5AA47E609980C4DC03EE018A128F7A0EE614CFFB\ F6081A89C0CE27E097EA6C639FECC0B2241B18651177B3FE4EBEEFA15DC588562D08D4F63938\ 2C86C15B99BB96AAE55F841F14ED67C435BDCF48595C0EC4D2929D75B1C4A1833C9AED228DB2\ 0FA1AAC9EAF5ED8664E56C586B7E5A01C2308BA61DF95FA3FCE90FB91B049C51DF7E58141EE3\ 1744FA1536A9516E16BDAC93E223C616ACD2EF48CE973B6D6A123944DD0B3EE161007F3272C0\ 92E953A008B0F1DA7FB8E2B8A2506D762A82D89AB1A60E33D1D96AA189A23F6D475D03F7C19E\ F77A6290C8456EAC591C40E92CCB5B60A5C5248EA04E6037AC206232F3EA830661A344B82517\ 3426B31A8EFE80CB6C4B9BE4144B48162C63A1B95CA6E3D173D9EDDDFD712D56D9D6215102F3\ 43B35F9B36ACB7566A3BFBDB376F48CDF0F0365330EC35BF414CA33C2919410E429699B97B57\ AEA59FCF3F21C261286276E9E2CCBB1E50A970493BB1211324473EAD9360C98703259BAFC93D\ 424FD2CFA0DE257BCC90C328F7EA2890AB3398D173E19CFBF3F43902B43C080612A81DB02FF4\ 8D65C214727A81F9F19C8C4E4C6D40EFD03B0F5084A9595A5C5B330652036E611452EF24516C\ A8AC71CA5B7874C209861A12DD5CAB8E310784E82058E5B574116D6CD88D7CB4C228E5C44599\ 6703C93E73460023CAB06462C9858B19DF2329214ACFFD82EBF2F9ABED4D1E62B38FC2C9:\ 18B309BB8EC6931F8C1F224D9A 2549472387BADE846341B6E3BE1938D72EEC5E11805ABD34DAFF0E8C1226D5BB797FB149795B\ 1A1FA79D5F24D91A60D7C664D82ECD90803EE9E941AA5DECF159698727A984522CCB02B024E1\ EEA19AA163A6886175AEAEF0259D1103AA35D44B3D64537992BC1452DA51C9C133F118A88659\ 42FFD9BD48DEE841294BB59308BC6173A4CB9840D4B118E31C479ADE52D9D281A9B97ACD9CFF\ 85504C2FD4859AC73653B2F08C1C9FE2712E0BBB26EBFAAE8D5FF3261DF6C1AA330FECDA2459\ 82D406E607602AE5058242D7040B8A0A0F8FE07131912FFC80895B0A3AA9E3E8E932A5083A4C\ 987D4DB0FD651DE6E00FA13B6454237C7C03D069C57ABE94F2CC23E23E648CA81DD010D06406\ 5CC225D70657A5145F947D4C8EA3DA0695D7DA7569FAC76033E01AA3C2770385E8633327AFF7\ BFE3B36FED73CCF8323AA2949A3EF3AC72F2D2046DB3B98FEA69FE98B3B9FB9CEE71ECF90DB9\ 0B65B27417A8E1656E8444D5EB6DBDA3AFB8BB527A26C51BDDCC47938254E38D58853BAA1717\ 4CE36ABE1F4708871D41E77F240795CDDBF5115654CF724E0A68C776F705CF1623989B8D2E04\ 7EC25662CBD1075FA6CAAFE7D911C61E30604E3361925B922D1481A071918F0F2F28A4EEE8CC\ BA7FBC6FFE2C0EDC102B0BE7361761E6C75B1441B9D8D22898238CEA6204B060BA4CAC3F174F\ B103947C08DE40753F3CC319E0EF163193173560BC94C0A24646F298A3F24FF1C4E6D322399C\ 6F92201B288218D443EA102CF2BDCB016FB7F4E1EED7D48D4316081484109C4F9588F8D909D9\ EAEB0725F6EB487E3F12A1E653A70F3EA5542F68983018F5E9907BA9B3AA86335FC55202937D\ 0F45D43389846C51A121346AF692A00F8C4627A3BF58451EA0E8EC047A5D2275F944F67305F9\ F46E58B218360810C94CA8295BCA1A3F4997133360683E8F83EFEFB8D27EA6448AEA02F5507B\ 5C1ADDB848B5FC185A934FBAA03E6FB058C164FF4E0304E388487E1C37BB83D3FA64E713565C\ E976F9D1C6C69BE7EB6519E67CAD95E90D4FCAA8AC90D43A2074B41E0A6F7773B618DAAA1607\ 5104D9BBBBD97DD219530EE47AB277AB0F5A8378F6345E045CEF9D9C625D82F568912C131140\ B98FC8FD5DE20D5F2F33A542129EE85D8139D1D49FFE7C49C412439F9B62528A1D1FDFF6B7E2\ FD645E63814F597BD52AAE1D90E0054B6B1A7D11D3A361A46D0F12FBE93D236911D2A2D06DCA\ 1C9E71B6A439B75A5513077D568EF9CCCED07181629277AEBCBDD6547E0163BAD4CCECCF5CB4\ 2A87FC1764AD39F289135557B5F3448C8903C75078D05A8AE2F77E60D5FC2BEEB2749EF604F0\ 5442E1DD139C97545456351E0CF51248E9DDB5C18E5FA8D66F8BAD3F87EBE09D0BFC51402096\ 0A4EF76D357EA5B7338898AC6F27C1259A52B1687900BA66C665D8351777298881A7917A:\ CCCF1A77029D9C52B4C36FB1C15EDC2539FE0A4D6F51CD45E613AFF6D4D71427F104DF270B74\ CB9370FB847CE64DF227D9CEEAE19EBDCE1C1A281B5D67EF617528B86BC5142E4AB877236AC2\ 9B8E290B941134B8C6F7FFE8C4AEFF033543E30B0811624C77E0B5AA06988B46EDF62AF7EFA7\ 1749BB1E18C302B5254AE3469BC14C640E01F38B608E5311C62A47D2FF307A7C5BEDECE1B8B0\ 1A56165FF8F6D68E979B5C35DF532933635E4D2A9E4127D2B7CBC84DA74FA6E7FB88A923D794\ ECA14E45C33F728D5FE66A43965E13F535060CBB2941979F934DF418A5105F2AF9C587B0260C\ E7917A06C03FE5F345D3059FC783DFB513378B215D17849A671089A3A5A136B79438320FC79F\ 05D03F96910BEB415B744B28B80438319BCBF2681DA358387201E74D68FC65DDE18F7A7CE9C3\ 8342E8156D685CEA43087B5811ADD784413F4A4898372522B341D40EFB7A4F37BE9A9AC48217\ 7075E0CBBC95A4616724A2697566A827F18789F4A788B6FC5B98EA8C52D4E5F57E89CB4F56A2\ 975017B39C23C7CE80DDEDEB0D4B008CFECE71043EDC59AFCFD7B880C246F4F4370D733D7671\ B417A39CB1AAAFE237EEB78A84F3DCC396E12694FBB841C8625D68FC3289F56E99D0BB17579F\ 8419E0676C8D4067DA5B4E0588D0B0F9F2A0568740475CCCD9E1598E905F5D6E8D2B3FDA6126\ CF3C954CCEE4997BA4BD27EE1486156362B19287AEBF1F6965796FDFE2EFE976007510C0B452\ A97035A913999F690E43D23EFF7F97209E6FE6FEB3031C5D59D2E03CA437A5318F9AE8359045\ 8F64D39ACEDDA1457BC9B7E87AC666773580EB2C2B6763D98DF65B6CEA506CDE22513090F35E\ E5EEC1511D707E271BD8B279B0FA06487F9ED4E462282BDF4E532231F9465D5084772A152E50\ 203F185335C02CB65E29F6FF02AD2C0069DA80ECF10C8A8794E98754929CB2305E2830B457D9\ DDFC7C8589A91959373279A170C7D39B25EAAF3C0A9CD4B5FBC09915C9ABD9B3BE52B1A645CF\ E72ECC29D86BEFE3FD4EA60858C674F4B80514FC223C9551BC5080DCB55BD3FF5C7D6E506824\ 236E9168B43D038EA0899925318CE4AC85BDF007B5586DCBC226D18B33D17D6A2B66F478827B\ CED487D62AC73AC4A1DC503045DF98B3C5C60ED32B769E2464EE09D212A8D02A30CD0841AAA8\ EC3F21EDA30B2D6A2B87F3BAAB38AF5B5478E004A9F3B1EFDA02C5024E8C83FBBDD780E7203D\ 81F08FB024EEA7508BB554E98A0270B732445E2F57D50B82A943BADD2729CB728E356F8F6456\ 4CA55B545332BFC24FE5C4FD6613E5F82AD6163A9D45E22E3F871F7C7FEC2C784E2A886E781C\ 3B45CA32863C729149714EFE9D345E3758F9BA83E25677DB261BED30EA50689FFE39862C225A\ 605897779FDA656B12DADAAC515B4D05453B4DB307D5D441BA48590D0215547A024A6654:\ 00C03EF75295806B9C351F89FCD6 40B8DA2DBCBB6C202250FABB2FEA9315D78BE5208437616A16646CADD9D0B0AA2239BEB7E698\ A7C764CF33BE1F3A783F0FEF0746253DAA0DB5C912440C58A8B4D17A4289FBC819E1EDDF2639\ 5C7547231CFDD2ACF6D2CDB9DB04AC73BBA3841E5BB476AC18E39E010DCA432C171D18CFA150\ A2F8C913B0F00BCF61A976480183A777A1EE9280075319DC3FE8BF35113AD2AF6A8869CC6372\ 89D8845E2DEAECE42244DF5F8C3610E0BB3A16089D32A41887DAEB15534259A0852555AEA52D\ 7BC7F4DA9E8E93D236151742522873153BA0E3F083F473C0F51BBEFDB322B34BDE7E9E3B2CC9\ 729C48AA3C6A27C54550FAB48F805FE4C073E1EE4B593CA15D6E702154B3825DF5936E97238F\ 6184A7FAEB6B33C25F9C5E92009A0A5684F299AE7DA60B84653B4233EF0254726FC4D2319EE7\ 3644E510625F80D02FB4D18D210F019013C9B76421BB833DF3A852548F7DFEB8FFFF3168B326\ 96852B85B7CC62EAE28D3B4BEFE4591BBFAAABB5A42B7B600F48FBC8A56555499292DBAB37BC\ 69D93BEAEE417580EBB8120BC6016E1031C9FFEE3BB793927B632D35E2573C067D3200377284\ 395F995FC6FF47FE26539A55D6697C5B8C52FB1836B7A8C0A691DEBCFF4F9DFC32DB43B3DB58\ 26D4DAC23A1332D2F8EB52DDC4D0CD1D48A59D89A168EC5DD80D3389F88694DD53464BD5BEE3\ D60BB0C20805CB1D62BF86F232B0CF9CAF75D2162AF79980CC4989B6F0FBB505650EEDB31102\ 0FB8F3844C4EEE994274E190A42B783D01C7DB90DBB237713E38343E48D53D923426EC428491\ C446421BA13DA837FDF7BB1A3810FB05670760F9009C117CB02E2FBB51E1184402FF351EAFD2\ ADB05BD0B319E481B234B0F1512308E13C91411F9C2D983B615C48055CEFB1003562C1D0B29E\ 88903A6DB2815C8B5BF146075CFA14CD8CDF59DEA035A7624697B1ADFE64A8BE8980D26AE531\ AD9139B1F9E724A2E431D4B170F46C42E84186747B163C39A1D3BB3C2AD0D73E2FC19C7E1185\ E40F8BC81D8931B2A86CC56A4A4B0C422031F8B93D5BEB68E3A26BE266F737DF729FE815B08A\ 2877A6518DE1B753F4DF16CB655C0A27B420BBFE0DC997FDD7EDE4F95F04F5D53701C9FAC435\ 3D4D9370C9438F418231C593FBA37777BEE9F42A912A70FAA1B82B711300E84B2DB12E872648\ EFB2D91B4DD25F5A0B9EC113F76C9410C0A43B48E70D7D37DE6F505654BC209A42074E3BBDB0\ 4B57C1DC2C15033D60666C49D97EDB5649D6265238B21EAB2C84E0B5205BC671D457BBD1BCED\ 41D57E07304A72830E26DBEAE598447AB16A767DEFC3487487880A81DE64DE84CCDB06754444\ 5DABCAFC048CCEE7E5AEB6782EA6F1E67609635676A0F13830C3D5291345090C822513FEDE4C\ DA4D00137BDE30683DA84F58324413151D33099C1869FCE3660BB6A30E11EEFBAC191AF5:\ 43BE6EBB5571E9AE73D0A4F11405E5A09A248DBCEE76D9FFF09318E5FDA50B86CCE4334E6F0C\ F79AA44083AA896488ADEBA02C038543F7ECA4DA5B5110EB3AD4D70DE2A21A32B568F05067B0\ 93697A1C715FBB4685E622ACB8F3E6FE2C9AEB11897969395C387B25791A648C7A697110D578\ 7F32DB5EAAC8B04B24A1DBEE72983054ECD00A57E37A5C2169D19B2EBE8E76F1A99312C6D119\ 11239578C1F2009DBC09EA9F38F706AC5E59BF1DD489AE38F7EEBA9692471B2F342E87A4E794\ BE9BB0497546B9D4D45E381FF3D45500EA202DC2A680C16BDCA210335BAC87D274897CCF48E6\ E813766AF5461084289CA27FD283561E82F144CBB08A704647E980C3795200C465D16A7668B2\ 238E70DA6A81D93DF64609037D22CA744E7562C0F58506B899FF1339B93371BFA5F0230DA588\ 3634DE5C5623C67232358D3D38379B82EF5A3B08BDAFC618E92F3E8E65B179822B2421A6FEA8\ E385184F17FE136CC4D9288E2AED7F4BC8D9C26106E40F8AD7C8F158906A0579DED7181B04E6\ EAB501DAD016A098A8C75D159CC2898AAE7E67E2F0D3422433C4688C566FC0FC214628F6BF01\ 26C354ECB7A626BAD22878764A370F20901B39A3D16E9E6AAF9FF74A532712DD9A4CE8E24B53\ CBC58DDCD96B41ABD04A2BCB4A6B968A053D31EA7D8F8D656AB9466FD46374E452ADCBC69103\ 98441669A1A51E1F80514FBA635B807BAD7A18D00F0BF39E44C7FFFD97B2083C7361239A6773\ 1A1A68B53829CA92B0836F94B76DF5CED8A30DCED3F6D231C2C386D6FFC86B9F556EF871E0AD\ C52D66AFEB91CA512494BA5ADC302B5D30F7F84205F593BABB81F07C3C5AEBA649E40CF6EC90\ 3350A01E30D1C24096D4AD06462E914492C0E342CE333D1D05D0089125C04B82676ADEFA258B\ A8C925E57C221C5FD169BDB26210F147E56A1DFB1697E7C21F8131B9C2C4DC5D5579B8E7DAD0\ 4AD45B1E1B8E2EA6A1594DB7034995653C9740D05C13EE79FA642448F1005B3DC1FB2AFBD2FD\ 4B7C5D2CA9D96A3F22286C26852CEBA0765AE8C11E189D8E979B385A2DD77AE9DFBEE9EAE48B\ A0A068F9689099D360EB4C8F99C1978D6DF0F2F3DD2B721A9079D475E0CD066E287D6708B924\ B78B8619E7154571B055E6D9BEC0EBCEB74EF927E730A962764B09D8CFFE90EDBA0A782376B2\ C0E9B840F7AAD85F8374C741A8D65D3D8FD2A4CE9848BC6F259CA5D01151C11E137D539991F0\ BEF86854077180285813C8FDB5E65850EDC53A4238005191D798A0876BE174980E1C8FEEA43E\ 53EAEB2CBF02BC69862D6B9771F79BD3FE544835D9AAB1380069246C930BF019FC0138B6ACB2\ BB330238DF7848B423964C8476A8E5A53E0CC259D4D58971E0889FF10A04357BCE979C640FDE\ 60ACFA9FDC8160E78490CC6884A637BBEC35D47F3C5E1E93A3198EB398C47850FDBB3600:\ 1FF724B44BFA454A160460164B97E4 92F94DFA72C653A73AC33A740CD9C917466C163873B9D90F4F4D6C8FF427BFD0F24350EA3491\ 783D175F73437D8EC634AB63AB445F5B30BCCBE09FA9825AB28E326FC52CC33EDB529E92E75B\ 9D5E447BBDBF9BA7D6F04967E90A56C144B5894D3A3C4EA2FD61CC59160E656B7AF60D6510A3\ 19F043F0FACE3E9E8CB195DF5D2FAE6D45C3300092E26EE90E1E714F41F165DD22D27026A3D6\ 8E150AB7C6A81484E2A39458849BDE93F2654A35333DF2DE42291235E2462647AEB37000118A\ 358B9A3E1CA8130F7B48DB7BC2AAF7B5279B6995DA28D8942EB41470E30F9885ED5278DDA22A\ 69088BBA20772AEDB1925261B7480F73CE7837AE3FB198E39364AC30BFA6C20E7A8F95D0A456\ A20AE83C028434545EDC952E091B12537625B9EB8487FF705478A34F587F17DA64EEC9B0E9CB\ B609B9AD290A6553709EAC85D50CA733B35914FFA3A39FA4E0A0F53D8E2AE80D13401C328F0C\ 51C45EBD0EEA1E73F1CE5DFAC5F04BA4D6FC92CDCE759B73A30515F7EFBC206FF5D2D5F1E638\ FC827349FECB9221DCBEF64DB66387CF2BAACB9E97ED6966DCAC0919F1FB2E0A0044E48623C3\ 1E47B40DE61AA82D703E5ED5CC7984FB73F3EFCEF355ABBC5A75C4CEEAF34D41139A1DEACFC8\ 416150A231729C3A609D2976C2482D7B77C73B27D8B20369426F525E8D0A32D500A155BB4E2B\ 839BD10556CEF79EDD1549EDC8C78FA6718836AEBCF2DA9D5D182A543C76A37168C7B1CC201A\ FE0559D2995449EDC7E11EEAC81577351684871FE7CFF80642C238C4E376A7C61E8ECE2E9B80\ 97AF9ADE84114B8FCD4337FB0832FF59E9B6EE2974F5659F8401908300FC99B93B5703B773CA\ EA586413009982BBFA293F523F3981E80712F471123A7235458CCC242F4CFBFA2DDDF55084CA\ 62819D4CF4F01020BB2586701AB99EF0E40CFF2AB948A9AAFA44C1FC1EFA3D9F2F47F91BB8D6\ 45EA0699051B83A61187B48F1DA5FF1E9347F8AFDD042BA30A193E06636BD8D6AFED22A8E67A\ 2E9B4BDD7FBCC80492F9D37FECB107F44D93F4C352A5CDF6A603F3AB39E78062B046F679D6CC\ 80D87CEE0F9F718CE8EDAAA6C8B2D6C70AED59F58C02E1279F18D68928C4AAF2688E8D283002\ 15531C08C8E8FD91DF26C06355364684B27826322A0D247E5866EAEC66AA54A30C97E71AF538\ B83DB2F89168B0FB6737F9E56617DDCC84CF7CDB9910CAAA582B2D18CE103D1466F554287CBA\ C753FABDB92D4B3500D14CFB5DAB5BDA49FCDDA541569DB38B046C063B2D1DF35CAEFC183C71\ 42B4A8FEBFBEEB25671E4B7844E82D7B11ED990AB4CEAB28C876764C1B3510FC50D4E4DAD614\ F8928592ECEB38FCA604C3ED3888A45A8AB951FADAA962BEB81F5A517821DE7B319DA9C6B297\ D52112F5BA0FBE0242237082BA2B0081F21A3AC1EDF48DDD41FEE7A227D0A3B26FF0DD73:\ 598BFC4E02D49D5D82FF1031F230B1E9D289648EFB03F8D9E7818EB5023066F4E5FD2A1E401E\ B20581A69C2A084E0DE4436AEAEDBEF9504C7C0560FD2AC6E94BFCEFD9703C8B959BB9EED253\ F4AD7B6BF476E7F122B5196A45410C0D8D53FFCF7CA72DCAD7E3359ADD694EAFFC5BCC4D062E\ 129595490147C070FC21BB903F8964F234D69B890527985CF28E003B0E82143F87F91B7042F1\ 15AEA2CE15B49F1E8A2A9A6DB2B0F0478847880418B2FACCED2F54E7BD30BF766360871EAEF8\ 1758C750E8D1B032F299152ECFFACF43E726AA158E26EDF352B185DFEA6A452E0EE95DB05CE5\ 6E5FE2F75C1EAC692BFEB433B17203118BDEC883591EE735B889DFFEE6880721D11959910A3C\ 0008D0B148FD73F8C211AA4CCD86E1BFF6C4C02B87AB5DFD911C00841289B5969D481B798BC9\ E0E91BF409C6C1F84299CC31EC2B7ED0A84FD1D4A26244EAD85F81121949CCE7973D1A333F30\ 1269A1C437CA998A225AFA8394027381D37E598FC00B62E58CD062E415CC2D6CCF325CF44FD9\ B56EEBB1F9BEFF521710496C63CAC94FA1095B41745DD697138DBCD71C096915874615DA84CB\ 97FAF5269566B4530744726C911AD5D6F078F9812091C5E6B0523FC9070AAE823B9226CEC9B7\ 0A36465779D6766A9C4711B403B207C9170E1739E56443FDDB401E1937F86E8319C8E093D01B\ AF7A9EFC41D84DE3D20B60A69A9D92591E1D91D4209E987E5DC413A65994EFC6DACA40E6BAF1\ 5E61495043FFD03E94A7DEC7E98004B93822FE56E4FE51392E24DA1F401EE1FDA7AED2EAB149\ 7459209FDA614B3A69DE3F3B6E8222962A5B29F0A28859254AA3200A1F59DB7F36AFE39E0F7F\ 2B89011725672FB8B3F282186881476F69C782689D6D7ED426B1D58F36B3F2E6372BFBCC89B4\ 017DB81D350A23F59FAEDDD3C3A125A6AB46FDF3E8C12CF60F850BF651FDF60943AF01FA55E4\ 0B4D9DFD31442892B1FECFD0C7402DFE97F15F33AF0A1FE70EDB72F555594E67C22304169913\ 6F9D011231AE19CF6F25F5B400683D07B2C5E91BAB306EA3D7BEEF47F10A951BA2FD7022AF66\ 8117BA672D9A3183F908EEA212F5FBE3D7BA26BB0DF0E1DDA4FE80989659FF10CF5EC682E431\ D7D9F0F232C39059AAAFA376584BBFC7AFED07FAE0CBC9B241BE0CE4A61649D97536A47CBD2C\ 875B9AB51D255684CF74A99687E7DB759056C46ED1F826ACA2BD9B0763340FDE52236388FC68\ DBA8F620F07D2452E7A8C67177B1A51C74CF8C142E33D89B78792A9AD20A7402C963ADCE6AFB\ C5D36592AB284BA52C11365E256FF4E9309F00AFF74629DE4BADD779E1776A7D797256FC667D\ E3C2D11E27127FD24020C84FBEC99BD8AFCA2BA1A3641B97DCF4594CA0DA9BA814D4F73349D7\ E04D3379C548245241CD5EFFFEAA0CEA8AF3A88162B9B83B743DA7E5998D8F00E3955F2F:\ 9503468A21F5695D3D070FFC76E14A5A 19B7000075DF02A525965B3F59A35D09F38FC2FEF8564F7DD39C34D875C692833BB9547E1606\ 5EF7238AE95F3A39175BE680C63B91AA592C9DA6D6AA31372F25A3B95FE40DFC0E9B4F45C703\ CE60E7A2F3700D81D7FB70CB958F58A841E0E13D431FED62A4298D73BC4D0935E921B3EC670A\ 1260C20FF7557609166D40D32A59AA67682173EA2FF7B21589A37E05054C413E78CB3B4CA675\ A32B32CF92A63C3CB115340DC75C3C8E45F33AF4B31D8B4AF466E7E054AE8D447BF359E5BE94\ A34B52D1FF16DEA89AD84811159D7A48967A29BD8840AF80677A15DBE3912D2BF2DB8F998B20\ 516B2197B7350967A5C2185CD6A0AFAB165CDE4C3D9CE0DE066B25EA297FC710B3CC21CFF4D3\ 2A7F7A0529DA626AA0A3B17E890D6BD1CD6E9FECABD07B8DC7D0860E45E5F3A071A1AF0D461B\ 0D9C94A54EBD84EE1B6D8F0FBB432C0A73212ED19B16461A5B30F3257C93060390C1D5A81165\ F8B341BAD0057034BEFD47025024E04342099F78973E46F6E3946E7AF975856D28EAF281D230\ 77BDA73F1B908B6B88FB40FAA0164B3D6C8A32BDB61BF081C2C043045D2B2126E34685C87721\ 126DBCF2D226E2584A2C1CB67676C06EB19C9BDD7F4DAEB02289E748C0812723FE99BB09CF48\ 37831B59420363A5FA7E7877715273F7C48AF2CF03050C0AB2AFB8888CAE62F5DC8B705DDD85\ 1B8354A30D9323B77D9BC4167D2715AA21AA6D566F1392F574B5A23229F9FEA21EACE9736F32\ 3553C2A6F294A4060C7724C5D2F8DEBB5FC7BE61AB25752881ADE4A6C1C1B9230EC89D181C2E\ DCD9C0393BB0E5C22CE3279B918D990368B95F9D84F98A7ADF09C4C8DA5CCA026D10A4635131\ 0F63913EF23831BC66F7B405EA97BBFA8D74C049C328FFBAE1BEF8AFB5CE8FB7EFDFCA514D45\ 036BDFF84045A911814E5B28CC44CEACC7484BE3C399028E31A585ECA083EF18182DDF5E95A6\ 8C86BB8249FE534EB66625CD7367B032234CBB52CC5CA4C49E233148156D45BA7A80BEBE4DC4\ BD412777FF38A6A9CA268ED707C86F1C9178F1C51B69F3BBA9A751758AA2A66240ADFFC178B4\ 428830B0D6FF04A2183224B627DE686526D460A4ACF890DAED0E4D2F181F692AE66336AD4B40\ CA11302F0D4FF97AA219B60477E2FAE0A8682F4B87D4507AA2EE2DBF61F76E8A289030959812\ D5BF2248271E10BA6D83BDB71FA6BFF16694EC5F8EEFAA2642B3C1C661BD3C60035AB7E4AFE8\ A1361D2EB0845F6DD37CD5F8EF5AE403D9436DAB73F0D3DD408F9AC933442405B3A4C2156EEE\ E9E4FEBCB41774A96259B7C45F513AC24A8B8AF555355FACA9732A8B95062BCDF1A18E09F75F\ 4B3D7538117E8E8B449A212A4ADCA3C6724799E3B2AEE646F31A3EA29A211A4209F93161E876\ E9138C4B6A4B654A08184A4C2330F2D7FDA7F9C61784E4FF04F87ED6F30D95B857B022A9:\ 4D8DB26DD443C4495849B1A9F05D59A64B88C3BC7C6A8208E02571799891D1BB268DF842E162\ 43738DC811CFF37E10E0279C828AC5922191D2282E94B551896B6C86EAD7C05A7E25CB5854B2\ 7D1A3680EE75FF75E5F5C2E421BD7F3996B19F5074A2DDC87326F7CDCD0CA4E56112C6242496\ 1FE8A8FC85CA6E56006E5D9BDD1A29CB831B9421E89C2038BA958BD00D596CC7F6440C61E922\ 1F3642920ED9E1634924986D9AC1F889A8B02819182E1EDCCD96F71244A9BFAA2097EBE53B18\ 222FC15B219AB3E410D7272C8BC8CFEE1696A8B90E2B0F9D4044728DF3BD8CCFF988D5C1FA67\ 9BD78D51453F796022E7CF1AF96619E999C3A574EC2C2822D93B4E0E9FA31C26429019F59D36\ 2CB996764D2246A8DE9398043BCD292A1E492C794F7E1DBD02E3E0E73E7CD381257C4402A8FC\ 6AE3E686AE844241F191DD557EE254E1E8AAC99A3E946682D317563C473D653DF8CD5818F615\ 651EBEEBFDB2E8E27F744D4B830C72B69B235EEC4AA2431F8F35B8C73C359B718161444425EE\ 5A70F8D965FEACD187ED4557B56260AFF9632E75E0609090B9F130A9A9B81E53C83AE23B36AA\ 78ABB50AD0CEF64262D7B106AFA9CC1EE9D5F61A6EDB232F2152902BF0AD86101CB7DECAE8E3\ CB63A515468AFB873D8AB5C3D3F132C2BCF29C8EE9C98E7FE3037DCE5E1E365D0F5BC3319089\ 2FBDCDCDB1B9C49315319DD3F508764EE6CF68394D46A9AEA9DFCBB03E3C60E70989C5CB645C\ E060445D2FB569F8A7176B067423EF657396CBF0475F2A79BDF714499F642A064210A538EB16\ 2C16F505AB6B2C101DB317DC9907BD8FC42CAACA246E8A95A2DA8270E2F32299039E36CF1AD0\ AA880707318D3D998C5DAEA87A5746C754E3B64D121E3D22F2359FFACF08D9C5EA0AD2D6AB97\ 60B4189CF532686C8E137255C220BED27969D24AE1DB6785355E7C789FD8021075E243FA9641\ 2D087010B9FB20B10479D055F7B7D631F4B8DACC3EB5DB5338A94775F9191D8361D095E8B29C\ 56A8206E04CDFBCFDEB8AC953D3425F41E1A6E313FDE132EA0425BE42BE8F4903D3091B894F0\ 8243F59760CD9F3FAF8D7ABF567A927A99C8660AC55C37D2E0BE845A91A47AB971C684A28889\ BA53A2CB81072FEFCDEC751E7D5A0AFBA49E31A110B533335ABE1A7DD479E20BB84B73E87BE0\ C6255F9A961C68BB3648309D2F8BEE5F24D4A30B8690890F0BDF36980981FCC7BD98889B8DB4\ 087C1D0C20022018BCFB0A1B22F330F0AEE6AB795C099C214215003087F337F574DE917E8595\ 745DAE00494E4339F634F3A2E98F80380A05F9FB871C1D14719D7E95241ADBD9E60D96EA5097\ 8234BF71BDF5330B2793B8E546E075527A0965E60064C8AA0B2CF5D2EFFC063241D4363B1893\ 271C6B3DBDC266FFC7B9D6644003C1BE5CE1C0F78A7FEC3346E31CE674EB59046327070E:\ 165013851816370C99C2B47DEAE6F41DFB 6ADECF136BF4135FB584DC375E92B88C14F8EC184BBE9371A97045A7C3FD0825AABD14A4FDC7\ F587BB5C0A7695F738DCA4A3CF362058700F4DCDD4420B6C236B5B527FC66CC6A13543A51CEB\ 9B42B21C9EF4B368B541EB880A2AE8A7C3D9A94AAB6C34739180F07645B7B523B3C05A97AD09\ 3B0EB7010433BA92CA744DC5190C05F96100E79A3C264A4B81D114CE98AA84F6B1935EC21C5E\ A5035756C10399BAFDC1AC3A42BE5611713F5FD764F7A6CF3DAA97B36733C1AC71F4B4C3E078\ D95A05D87424689E70CA8536233D733FB9C9AF9813AF8670CEBFD81DA31D3F0233E0B8AC6CF6\ 5F720E5A8EC0447CCF961A25A68A1E50D2D1D0F87E0089EAC17D5E778243408A9CA33AA73426\ BED6EF146FE083197DAFEE1E7E08080A82A61ADFA9E2B69725618C3507215A9F599B29E43E89\ 800ECC4AB9D6050B094D4E22B4528F9874384CCB2B87D91875897544806A1BE8E141EC84B9B3\ 410DD33A1DAB0FEF1F65ED0B8CF2C43307D86F210B652E6684E6AD5A5CDF581AC46E5E7CFF68\ E80252F1CD6A8A73D13855D5C338B8F24C8A52AB4C635A7C895B365D296AE3B80AA73A514299\ F996A574D7FCED7C249CF14E3DA02F36810AA148FB2FE42BA08104FA3C04B2D363D17FF53363\ D2D33FBE9DBA4777BECB70692BE9DF4A110327E89B1E322B9384655E941A12E16BEB88EA1600\ A5657F5C699407E132E7D9AE03D3F39D3F0E3A0FB459761361DF949020CE3B75AC49B58047D1\ D818F3443015DA8316B10DBEE7F8629E901F63AA8D2EDE58E77CEB5C0A94B05C4D87ACDD3B97\ 6EABFA39C4A5862A4528166364CF43C608AE1862158FDFDBD599F8DC1B67A3B6B6FBC296D538\ 78F5A01F5DD6C5CE02AB9D4BC7563929BBF3BFB8C7A8F603925E99F98E02C3CEC3130959F6CB\ 9FB0CDE693A3FACDDF06A33E4D766FC7E01B3C67BA4826B0656BD7BA9E7CEE5504524F47EDC0\ 642B707BE5E11ECB84908B95488848871FFD96DA278AE7176BD8704836E248CF9F00CBFCA2EB\ EA155D240F1708112AB0F31904FA684C3AEBE5B9F5486D8EC0ADD1C9A877F3B49E5DC7305F99\ B0DA97D453EB9D1ED41DB5CF025100D048404951DBC804F9152B976C0B08F02D0117DE4FF023\ 1158697E4DF098D3BE1395CA873BAEE64C36FE3138937EF55D5F098276D20EB4F5D19F99DBC5\ FB88D57890DB2728EC97D1FEDCD38F1CB2D05FA103B66F591D37F4DFDA80D7F11378956012CA\ 2F5E32FAA082565420EB91476A337CD813665DCAC92FFEA96B4300583C6461C231C7654C8CEE\ DEB775FD968E5B6F2BE3A3A29EBD82AFC4E475FC4F71ED41C6FD825596A3E1D653F09DF2E117\ 1ABFDBBC70F69A7AB8712A03A807EE56CF0A2E2C1077F8C7C5C25FB1E981A1F837720742D5F1\ 91D5F0B8C6FAD60D4046794F932A03956CC5436C74E9400C6F40E0F35CF54939C7851B5D:\ 3142889174F9F5FD84846155E4A752B91E7A9E549EC7EB806A046E3ADB941AB1A188C1BD0EC9\ E93D60A1164F440D0AF639CFD40C6E17A20B24D2012479FA01819EF6DA4306C0E642A0EBC866\ E0BD1006643D120D90C50B224BDB742BC398351FF3D64BB7CAC968615CEDAD679F64C304B49B\ FC7E275DC66C0B56817F810DBA4BF8CC0F9A71A26AD4E784918F70597474C3C2D7C526F4856F\ 5BC7A939B5F129118DD1980C2044C8C843312C0DD803E9618EC77731F0E601DBD62FB0A4B2F0\ 9DF129E054448F59C965DEEC1B04E1865662FA4BFCDB9DDED13A8FA7A6D594F2ADBAF45BCEEB\ EE017D04FD1CFE071012EC258647FA98BAAA9628F37460289AC598962C1080A33E31F2ED07E5\ 10A15092E0374BE6520D892F0621E95D4C7385D874DC8D6A5B79B18E942DAD742073B67AAD20\ 7FF9C7F61CA858157C9164592DD268C6627E7873C13831BE7FD0666FE8BCB7D2BEAF2FAEF2C1\ FAB74A8F2B8E8964BEEE7B7CA9F4C3F58DC3242AA6E40991AE32B082BDAB5E784AA9BE0C69CC\ 386D4074D4125CBDA87C40FF4B6B563FFD8431EC4AF544DA3232D78CB944592BF3B48F912F2C\ E5B8872631CB34FDE7B204C0E661FC9D5EF02070BCFDDD4EDEFCAEE5DE676740255BEE02087B\ 8DA08A6242679838DF4263EA73C61FB73B5423427DECDC131E1AB0A485C87ADE2A3E6A413059\ 48010B49D03F1AB428243CC98C43407BE41B715752E9A7B4342C21B16EB9BD740511C75646C3\ C5BEB0A8A66D2A640BAD624387D8B0889EFB7193642EB0E8A7287EDEADA7DB365202C1645B62\ 2B0EAD1A8BF2290CBA6EBE9937428A61F3C5C843997A72C4E1AA71622394533630EA54436061\ EA3F34FD4259CBB3694BE5E5303718FEE8D548F6C9BF03EB82F5693F4152638A66116249E32D\ 68F02973258D516B9DA2ABE8D13C5F189D79A61284B6C0F4204E6FA9B8B7F0401E95B569C460\ 6F3E5D8619311129BE3D63489DBE29F47F4116E786A1312EC53540FDA97F8B2C118541D8660D\ 33BA282B7BB43AE1993DADF500394C519F32D2EC5BBA04A1BD02E9AAA084E127736C7486C878\ C1DA4D82CF94CA06732723197A0718B99FEB0504F01C8B7BAA2F09BE0DF739658A703ECA0098\ 9A0B608F9FB4627D56FF08009DAC83876AE0856E42B24B3A5DD6DFF8D83CE07EBA0F21B570C0\ F206238D44E966D63DC94A2D715C9A56A7F99309F8A512801D57000BC59E57D2A856CCEF243A\ C153822FCBACEE87C41A75153B71ADA7B884B75AD7E5010FD3C9230230A2545E784FD029C0B8\ 6F81DC4E6DA708F03F6A5167C5C793EB8FC29F51A3263D67457A631B37D65769BC9A252B761C\ 2F3E982C4E9F1CEDE6A7E3736DB8A7433FC58136560AABFB36A2C3495AA8C1E0EFE79BE95CA1\ C93F3857A9D8E8AF64978D4B0814C480906A3CAD1F34FE90003B2C7CA883977ACC62D148:\ BE6281335EA5230E73E784D383537496C36B 4B5B723AA28E9E0E919A276F20AA4375FC4FE86BA5E9A3C62BE3A5CCEAFA5D9245D4840F5CB5\ 0B75312CCA8A65BC43B4138379EFFDFEDBCC90E6DAEA4BE65ADD65C765AFBD0D4D76CEE405C1\ 2C56DFACD8B17A1F4C1F91E108C30E529B8EE8544A8B7130AECBD2C208BB841F5D50BFE6ECA6\ D262BC2912A1FB4EFE644C9E64FAE643A9C8D554B6DEA630D4BC2112E898CD8C2F9BE95FAF38\ F7263113336A2FD99D2FB5F3C1D0F977CFE561019C51C92A171D7E271FEC0EB225B55A776414\ 2754DE8A2F9145BD5B9FA8CB9847D3813FB5358043799C7E3A78FB7DD8938FCF4E064D79782E\ 01DEB5CFF083954A687EAA095169E02F1C8CC3B5084617BA9B89D542EF9B93F213DBA1B4ADF4\ 5B87B14394E6AF7C17C6D79F136DCBF909DF8FAF62AA70726998CCDAEC519AEF238D71FC031D\ CDAB3E79DCEBE2A7A6241207FDF5B66916CE31DBADE4093222B0D1ABF69A9FA90F9BADA3373A\ 75F18625FBCCC20318B7B7C1339CFAE3122A7AEAECBDBF807D0C4C2BA882467E1FB72458B70B\ 31BFB10451202CD10AA31E12587493E66B5282B2D8FBFAD823472BEE1A66F63F0471E985F10D\ A9FD43B7ACD6EAF23C56AFFC83192A383D9B69ACF3033A1216EB9732F88944334EFC31F81892\ 588F1D197ED9BCF0DD40F7EB3CC5A9C22CFDAB86CA0C89C638D1035C978A54E3BA544EEC2AD4\ 6A8D57AEC61E534139EAB0ED4095EA8CD5EB132DCA6CB7F988C7A6E0B9DC9D28F61781415666\ 036C39304A62C6482B851819F2E0A513DAFD2CDFF8C8EDC8B6A3966A2F2A9E7BE68655CCCFC7\ 68FD92DFB3565A28AB967CB569F940E09FED962BB21515D5C753ACAA3AB2F76C1FAD84F30CA9\ 5809772032E23E2FDE043D563FC07D1289989E9859CDB8074B361D06384C295B2943182D7C46\ 2E88E8E0C599D1377389602CE931142C5CB30AD4DB3AA6D01BAF616EEE1922379B30127C643D\ 59C134298BFAA172376BDEBDF0DD47B52879172F96B766E30F669252D126E5C0837FECE300B0\ 7EA6926BDECBDA66C8EA66B636EEDA74814486E1B3D20FBCB1B4F5DB0A915E3E4D2B1AE7C7A9\ F13557110CDCC0E71AD28CDF566D97232458F01A803AF9BE6DA0313979D66791130A8E3CB111\ 101F8A2710D0404F32B0CA2F4677B5DCC34542B651491DD5D173C93247657C181074F68223E5\ 440D5386217899F939835BF19889AA6FFE59027A75A38B32CD6975C3A543B37FE3FC52F4DB66\ BC012A14EA0E2EFA6CABCB6DE0BCA100E60BC25BFB54FD5B23DD0C1A8229CD0BE80B7CEE710C\ A8598F6B6B5CBFE3F5566B8B15CDFAFD928851E07D6A6FBE26439F1719CA648ED6F4396310B3\ E128A34C4D5A17CBED908A2394D17186ACF6F46848A6D32FBD5FD8BD14D320E5346CBB73D2A2\ FDC323F5A6216559D7D0C177803FC1D9EBC9859F71E85E34D3C00A4C364068088609A5F7:\ 251E008BB0445ABD75C166586B0AFC536ABF124C9C7A5FB568EA647330B5D7EC79DFB57048AE\ CDCAC37400DD26BE375884DDD8F7B6EFDC93DB9F62F393C1987C45B7857ED49747F7FA57244F\ 63F273F3B51D86FD2AF9CA6755568BBA9FA528E0FB43798EB0315653F495727914FCDABC0FE4\ 3EA93AEA5893A1E1A9488D5889D7D3ED05584174CB3CD206D7CD4C117933487768A3670E283B\ 295807C6B1E15AC03F46782D70DF796F3A9ABD41D8F1928502F7197A99AA6112919D7B6CE336\ 2787A6A770CABFD4650EF223D1B566B1A86EDC96DC294669161AF5FB414D6EB0912ABFC11436\ 9815BF5B9805EFDFA17BD57C8C28CD22A34EB7FA23A1ACDD32A66BEA2B382FBB29FD1DB18B8C\ 3E539B42A2BEC7A14EB06907BAADC0E003FDD9689E26712B3D99261B4714FFE846E5425B1BDD\ 90039FD225EE93C0310583B7D7FACD3CB9644C9219DD9EF05BB58394C6C3C2FAF455AD50558A\ 80B7C6D7C9F4DC2B7086C6E31EBBF9446665F8727FE0AAFF7C483DCD3AAB34EDD181CE00393C\ 93A28C280EC9F6513F0787689C3EF4B98408C110067BF3990553E902D5D3CE1F7C4473E7C9AF\ 84CAF731B5A31D5994E5DC9D7820820EFB514C8BECD773CBDF6E818DE24AA4E461613F7859DC\ 0BFAFF61375BDF20956F66EB534694D14DF29A78A0488CE3766BC85C1FBD3999765572889BDC\ A13897C09FA11C10E2FC2B24C591B3E3DEFE7E0382166CB2551606876D98B2C77B01B84634BF\ 34C26EFE2C8B4C360DD248D63734ED6B7C9FE0487321E0AB25D428A0486404DABD837884572A\ 0B0E9F343562D7B767F2A5C94856E6B9E3832CBF063B525352DD472275103CBBFA032CE5D952\ 911F00BA5A6F33461D2D536E341D09C3C1F1B5C1BB9BC1014AD9BB25F2F19D4AC04347DC5440\ 581D4BACF25DAFE6B82F526736875EFCC056FD89A01DCDF72FEB0DC70E12C2243AB8A28F9637\ 8B1633C9BB08625584F10E80CFF77D050A81A2925231D08F215E381ACDBCF11AF61964185611\ 435EB7C70CC18A2810EDA5B55EF5A622F6484D8E579C7315E78F0EFEEF6E4C85A7712259682D\ E4003FECE559542554B36AB37CBA4B8BCF07F88241665D806A0A213FBE1F98BCE2895D3BF642\ 0AC591A8FB947E6EF53780E2729F45677E06E425DDF65D545A9177FD99B53BA47B46AFD200CB\ 9301001B309FCDEA4CBF2E8EB9427C84EC9E560CA4748061BAEC60D6FEEF6E3A70679C77066A\ 428386050D6AF7A358A92E3357804DA0C61DAF3335EFB18750519B9B7AD2F3677462C5562461\ 1B8F0B4278388422AB646A90705AB52D65B2C6FC4BF295E59EE88CBF8624F1B03BE99513F1A3\ C922F129ACF665797D56877283F60B89BE4DC0F803762F6072EDA1212C9A6E3046942BF97933\ 2386F83F4E6938A2FA6B951C4D419594A37C6016253B88DECBC7C9DD39E1164A9CE64BAE:\ 99972572DC537442E8C105AC248DFD511470CE A29E49FE59317DB85DF4CAFF962DA6D4DC94594BB7B195DAE82B7E32ECD55854762C857CFEBA\ 610B39D2F9D8091B38D6A225AD2A2CC2195DCD5A80ABD06CFD12BE30E914C1FDDAE3BDF398E2\ 3E994F6877095BD1EC8E48105804650D6F872229C7F0B17C8C9BB9199A1E137BA50A34D8A626\ C0DFD6AF1875DB00A498CA6F36DCDA712B2A0EB8FEE3AE69F2B6BABB9D779798234165886033\ D91F5B74E86A91E03513817FE24CBB71D4DCDB3D0AA421E7256E3F1D7F332FFD974403EAC2D3\ DF374881F9D95258B29E46315D326F08EF18909B2CA4DB8526BCA9B06672940423D9B039362E\ 1CD8EEE68296584D94EEB2162C3735E099519F694D94EC732D59F4E1413601E8177D379CD4CC\ 788DF64CF234A8B1FCE575A803DF5FB44014484D7C9A527B95EDDE983A072DF17D042026DAFA\ 0E3B2328626AA8F84C8FCCD98E321C8012B896C32762FD7BED3F0636C6B9DBEE15EDE2AD9634\ 477F9D9F0C7F8287A1D1C77893E08A2F5C2590A6B8260862DC4AEF39E7A0A4993605064BE04F\ F8E47E5659EDCD0AE97F800A520E587674F423728EE3A70DE8681B929CF6046551A6B90D13D4\ 9A8855A17EAB3F4C3BC4ABFC09A5D3A1876FF119CC8A75623DF7A8731AE551687FBC8E93468C\ 9E3FACC033A254E46A20AB8D0B9FD4EDE15AC81DE9056145339FFBB450F01CC801E5443229DA\ BD75E391EE7C2A62678F851F5F1D6C4AE6FDC878B12608A218BAA1CB258D42C16A84DA809A66\ 772B5EDC39D0AFAD4EC22653FC98C15A033698F1B4671B8EC331A277B489D1B166759A0CDFB9\ 97C19CBE2A500F474E0C856B1583AC5C86A655208D2715E3D47A553BE7000C8286B749C850F7\ 15F99A971C51CD21AA58FC37ED1E7F2857B21E1FBD183AB8C5C29457C9F5072D5B94A45A5391\ 796ACDF93431E494D18958C79AD5FD9BE02D42C1FA05BFD360A62D43A4F07406A8AD0C677936\ 35C3EAFF28F24FC01360E4598AA651C35E9944CDF1A5A4ABDB0F925C03CA2ED9F3B0C4C76114\ 80023BD8812C47BD61622CC01FB7DD8255279C6B17A57CA938329B80604C36AE7E847D7624D8\ D296656573A24970EEBA52BBE8420AD06E9D312F05B6FB5D1D45689A072701B0F39AA226A4D1\ 78876821B54430F96D480693E5269B551AC45D5E48007D026C451FB9FB9106AF072E7591C6D2\ 9803C75D5345A6BA0AA27A9DF7C7E15FFA47EA7AC241304B6D3D511ABD0E4ED9D56502204009\ 0ADA249C10EBBB9FE0F7E02922005234428561C7D4A96414443FFBC3144D4B354B50EE52DD31\ DADDF3DDC8B7B2C221F631279D5055CE38FC5ED54D5D811D84EFD1413EF352B17C94CA7DA223\ 9398896B1559B1EF78C657AD8D6E968CAEC86CA22BF4706FC8CC1D419C6FD40F502C010C65BA\ AC9394460AA133332E342904C7B4106D1B84A7F6C73599F7F3FA2BB0255E06C133556CA5:\ C107C43BCCD34DB295D0C6C64ECAA5E37D50DC0A88275976E4C82D93527BBA3F038FAB94F84E\ F875F0E8357E5459AB23BFAFB1DFF7926C7F17B11B47E93EA1D5E8DA1295C0378DD812A9C87B\ 7F52C21E546462063EB11767774C83D95730EB5FCD1A8DEEE223B95D6F4F5BF16C6A00B5BF84\ F2DEF735FDA064DE08F192E2D240FE7A77CF4912DF51BEE784A36680F5CBDEF5B85BB912104D\ 6B0B888FDB40B4B90456662E1FBEDA2BEEF8B19E171C0B70B454E10A847ADA2C0760331ACBC2\ 3EDE26010ABB1D8166165A88D3F3A6D629695CC614048529CA98DFF0D801687587A4857DA083\ 2D14BC954ACA4E1FE5000B9D37D2DDFE89115F43811F2DF4E73A31B7A0752CC80ED33C53ED53\ B1E333C2C9EB63843A46B2C40D81315321B657A2426711DF4652CA64EB671E1365C3F32AA90A\ 29441709B77E7D18D9F2206B70BD91ECD39A2B17240508BFCBB2C2EA04EADBEAE814DFA98EE6\ CDDF7F8023CDAAA12B5E0B6219EFBAC1E4E4D108AF25ED9CCCFF52859CEC02FAF3E809413859\ EEDD622BBB2B45570364E8205ECFFA530BC98F464093F5A4473FB6C3868CC1691A36CA4F4AE7\ 65312DA992E74135EFEAC2F5FF8F8EBA3B17B88247293D6C183418A50E5C06722E0721FE105C\ EBDBD404714E23355EE78116FE3D0A561EA5C6DD06F509EF38B31EE88B941E13682A3A54648E\ D7ACAF6DDAFF80746363E7F0550B7A306760480894F6D4B9C449C714F9DCCAC680A494E07336\ 8C04450FCDE296960C0021F05774C2E53308668A2828BAA39CB4D98809BD852A3A3864ED1370\ 48AD86E121953199C35D955F606CCCF2AA11FC873EE4532F884D9C5E72DBB48FC220D2FB3E53\ F78BC1DFC39F8631254800A47C83D85953DF95A58FFB94DBD5EF36B456E42C513D083CAF5A5B\ DA7014759CE8646EBBB99E5AA6F8B996B5389DEE8D4FE2F945EE68A6FEEEA1DCE81CB55478BB\ 87C60EAA1F2D5D7E4F0380FCE0ED00FFFC05F60BB1B685F1E9AD0AD42A7330A9A70F63D54BAF\ 837136FB53203458919882F2F67EDCFBD631D0EFAF6AE2DCF75193C6891A164BAE455E1BE35E\ 93FF1F907B049D56501EA27DA959792E9716F7357182C87E5E68A78A92E603EB82EF4D175445\ 7504D07EAD8F6C13A855A2A458FCFB3D6264BF0C8C79BF7613A1E703E44EDBA5FC4424F86556\ BC98D89CBF9CA2280F4614AE53AFD3B31BC0A45AAE6FF0744ACCC3579EC6BDA9EFF4332F2EAE\ C9EC99024D8255C72AD5CA75B2E97004717D04ED6484B9B13B1F3BD1E9B39B0762A5560E8F02\ DBDAB9BEC8972B1283F4267E55885DDEBF764E26D050D9A148AE386850DD857BD5A3568A0FF8\ F172F5B9754CCF16D1BF4BBC6FDFE79A51466E9DEAA38C5EB9144AAEDADF7867D7B866A7D76B\ 5BCBD25165BBC7392A3E51ACD40F71919957FC23E19ACF21C5B62DF36337249CAE5FB22A:\ 388E2850F2A8DE89492204876A7DD8A3DF568F58 40F2EF525F91C2B7A8DB54A86E4CF21B08EF3C7C34450374A358FDE05B75C166B02ABBA087ED\ 9DEFCAC5C38F970EE7B83E932FF490B7DB64C8FE3DCDFA7105C5CF67A159F3DB52A6093147E8\ C8B7E066723912A8E1D8B9618BBEF57B1696B7DADD547C246F74912282711303E22FCB202171\ F5357BA41C6D5B5FC32D1FBCCEF5B0A090670AD75C15A7469717FFAEAC7BC588A8D9DFD5ECED\ D786BDE5EA70762CAF3F2A159CB1FF8DCA307D2DB822C2DF5B1C3D81FC9D992781B6D5215B3F\ 4442537E1DB75F3CB1DD53E2F26765F9172DF5ECF9A0E572774E8448ABCBAB3A63176B7A8090\ 984C5EBA6AE2CFC0872AA364A5A90F0FE6C72AC3EC5873FB84B908487438242C8324CCAD23C7\ 9D03928832C3153DA6D5D5EBE50D00F844B85928F04DA60B3D4C2A81C9DEA01EFBCB94FC7FF0\ B66AE81E2A85D1C28C5387CC2B6549AA7B6A5FD940E57057EE2B9A98D490DE3A40FBD493CFFB\ B71D0FE44F58110C2830DD18AA017C0F45480C7B404C73A3FA756C807C8C569C29339933321A\ 74EB2D1001754C5CDCDCF80C8CD3DDDC5E64BA3736FECA5FD9801B54EF8F6F780FA4AD09BBBD\ B87DF9A07D88B005E803AC7670B236F0C508CC874D120BE45BC9997CE2D56B55F94A547172E0\ 46A01C18A63BFF3BFA7D60FA49D1856E002B36EF6D38DF71CD1E45CD6FAB59264F6550DF8459\ 1FB7145BE757993AE5B9327CCB5FA23C2AF8B35D50F17662C6A8CFDC0F0B47270D84F4CA8FD3\ 5597D18C757D4D474E788098B759705567A1740818D508E9CE6593191820F1735A48B7C43806\ 28F725D86BF1324843A4D85C2DDDDABAFD0EEC45265D95FEBE3F9FF87363F073F1C96E569861\ 5E9C841BAB30EEE72D2C559CFEDBCBD21AFEEB6391EF578B8E6F393577D9B3A36D269E65E673\ FAFB0FC582DC899C8145DF1DCBBA1689E3819DCD784106EE6642945ACC8C9DC44E45015C02C4\ 084416CE7E19322DBBD5FDD55B35385AEC50308A4CF06EB4261A638D681344F48DA7CB2E0EAE\ 5326F54DE4589E8951B7BC42BE7994FB64AEFEBDB7FBF8949E6D7FC360EE722883A3D06ED3C3\ C2D0EBC6AEAA0606543888C600EF69C444F08C1DFDAB3671F44C85B0BAB0FC91712D50C1AD97\ 9F32C25F3C9CAFCBA9E8C82817D4A1180EB4766CF7844A27D47067ED7376E071BC7DEFCFAD0B\ 8C138324D77F54E3E41D4BB8C33892B84860F97468223D3F155B04698019256A11B2A20E1720\ E6F40BA100B2D887240F78EF499A5C253385EE2D4A491CAE743FCEDA6C1A0C585992167B6039\ 954774262A9F604A972438AA52C4228A4A30C7830272AB66E23458BBF3CF055EBD6566832951\ 51B7C60979A87D806432FCC107C5F533C32BEB0D4C412A0EB7932840B1B1414A3B091BB69201\ 589E2BE699029E09720285581958F71A350A24438541F3D05CD921FDA0FAD525BFFC30F2:\ 59CFBDC7D164AA6051360ACD53540489ED573B013B52305E530F3D51BCF8FDDBD35DA519C9A0\ 66AFA8E8D38E9AA32894EBE216D09C6B28454B2D1CB1E62947E3C7A19A33B95EAE69B6158D7A\ 179EDDEA39CB308B36B8F446EF02AD0EE039225376000A6717A27D8C7692E3D9F210B521C561\ A8D46E022D56BB93F232FEA37257EB30EF41C92C727126FF7058A7DCA2C5649C3A5AE6CBDB5F\ B9C5CEE676885A27773433E1E3756218041AB4F95E71771DE5D52E40A425FEE63C3D93A0886D\ 4C56E69E0C01954249210F792B19BFC25C3FB872EC1D9BB94CCDCD695F43F5D7D1210A803539\ AD9B68BBBF893FE055D715A8EEC0A289D77A3FC8FF9F2B7B6994E476F16988E6DE7E002F0083\ EBC007F0CC0FACFF5E0238ED1C0598CACAC390FC03F75B876E8B8AE1F35E1A64D3F2635ACC52\ 618004A21B0F8FC204AAE2F8A84FA419A930D266C619D4F736AFF6D2C1028CBB129C355678B5\ 518645316A3F9C38E37707548CD38A24428A989E14EABD3AA8D3BD1252496E458193C5CCFC39\ 19602987E4CD4C8264E1B8279B598A910C235D7FC9C861B517B59ECAF0B797F18519420A993B\ 016C9A6728D707EE7EFBAE8FDCAE866DFA3686FB5C65CCB11A9DB7C7B3D15E8A747679BC9DFE\ B2177698BE98A216514009BD1BE3C62A0234252DF983DF15969E97F99DA7913BA518C52017B7\ EEF0B789BDDDC3A083BC1FF8018622CD3455EE108FE7DD5BABCAE1E0E88264016C0A1FED524F\ EDFAC1BAA8D9D4CA330A27128E2F774F3134CAD49A41548D0BA303717D8EFDF9EBAD46FDC719\ 24FDD61989E1516E4C2CC6AB099CF68A3721AAF8B4FEDBE794D2A5D60F3A618F1D4E697A60C8\ 8014E0A9B465538E82FC37F94FD368AB1B0EFA99FDBAD037F2162554C714E1A539F5DC35E620\ CF81454912E92943AA12CE4447B83DAB8B75EE124A34038BE4297D8C88C6DF3EC8361912B883\ D4BEBF5858F5116A3B8F9A818E0C19B42D11499A70A75A577E46B9793BEA5E6195F23394EC4A\ F1F1F4BBBD10CB1B672568795AC479865C4EA8540BCFCE77F78C7F0B0600693007A5B69B6827\ 5617DC6ADD55B5192D6A4C8BCFB8B822CB6C9DC831C4357AD605ECE9F15C5C3C0953807E65FB\ 3E06FA59A8FA4314111564691962AC895715053CB22358A69A2DD658F14239C4BEA0D1940F7E\ 786A53E1390B74DF3B176D54272B62B1D61245B958884349A7ECF2ED98198244DD0001FCD5A0\ FC8B3302B0B659CD94953AA0C3A0003E74A074673E9C3C39DA5DADCBEFD0A638CB7B3711FC17\ 967E44C01B65A64EDF9E9A0DC1DB5E810E8D3096A959C918E9813E2934C8CAF1800B55C623AD\ 350FF26006E97919D250C2EA700A54231E28FC85E2193162F4783027BD86F859B01868678F2E\ 1C911F23364E350F4628570FBD639D15F30AB2BDD7512BDA269C631C3D4DACB0B3FA6F84:\ C2F4F2996C7BC1F19B88BA92B41BC6F42BB4DDDE56 1F9093D9F61F1FBED0E57C530B3A38755A4F8E09AEE810FB7033F47E7461A4B6BB2EB898EBD7\ 9B3BEAE94B0BA1F3D43DD186D33F7B0469BD9357B4A8CFF6CA3974D795C11B55F7218FA5F7A6\ 5AB3799F7CB571E670F12C5318F734B9A63C0ACF016214EBEEAC2FC77961BACEBE48681EC078\ C933C24B2A1431AD0D4910859F98BC3D3CFEA2CD07D5062639D5189A0C439D3E8078669B8123\ EAD0038B9B702A82260014E6A07A965C2E7BC16D5AA7BF8CE23970677144FFDBD4902E4C195A\ 66811CD6C0B3E6F38525B3854620F1FA4B2B699108CC090EC110DFBAB90C289C37171414AB86\ AB0A1F09EC28A844B21A2A3803D832E3C1704339CECA91B93E98014124E15F7EF2ADA34C2267\ C5FF600385B6176C2E8DDB02266628EE51A58716F1C6ED39FC82553AC1D646B16208601DCBFB\ 9C75B1821BDE1BBCFCE0EF4134759D1CCE23DCD4BBAFA24D5BAD86D09AA3B9EEDAFAC4B405FB\ DD6B107D6C65B0BE3194F41EDCECBD1116C19ED72BAA7E1FE91684CD430E683D72AF2E7ED471\ D210189E9651EEF40943111F5B19D9A05B453006E32323A9489D1FEA7EDCBD486EF8CBD8369C\ B342048F63E0A8503E61C17A4BA2AEDE680C48834B28B43A7436AE84C1737F68E0E6ED6983CF\ C17E33515D6C2303AD08971F990793EF2F6596BF67AD773104BD01EC4848122567C6A4BFB0AF\ C89122296839B9B01A603AEAACCC0EA7A8C0801562F50C107B9FF06990DA929B3A6FC51955A0\ 010FE2C412044DFBB519B0BE5F151AC8FA5A3E537276D8C6D18B9666E607C03E886F74D9F4BD\ 3BC20122C5A111E6CA07C14D3D12D43BB80B5D3D69C11538A56A9CEA77FDCB9BA0A73D992B60\ 64F96FB32A513E310261E87BEB457382A6897334F486323F90D85620C4AD93A7F88A3F310513\ ED54A38743D9918C4B12714373734862E6EC1E5681E85BCFA8FF283BDA08D7333B95596195E9\ 4DBFB5E65EBB0DA07A1A913AC2E936EDF3075A8C6CFD07C80E60B3254C188ECD0661A4E276A3\ DC4A729E6E5FD18AEDEB28B81694421885924C5D6CF5EFD257AEDCC39B1A8B88406200D19BBE\ E9AD2346117F576F5AAC7A82BCDE6CB19A1BDCC70F335EF6543E9E25F157E189EC8624DC3B8A\ 6724DA2691E2FCF06CA9AC2D92E9335B70248EC33E8F83532DBEECBBF4B1158F3B2766BBD2D0\ 11C931005FCD3EBE3AFB23F252E19D12AB9304410DE599FA6A4D37EC7736155D92B668D7FBDC\ BE5C2CA70536A5D401822261801D9D0177C81287A33984A56E9FA0DFE02D150A0A3A223BC86D\ 2D7C0CC50E8FFE77151CB709D6514889750165A2306E7F204BC0571BA1581F4059DFFF9D748E\ B45303362164B24C975926549EB6EC3B4372530DA1A4E3293F1B0403A0B7C0C4EC72F18AB1AD\ 83533791E8846191F0D27A1B8BD6F91A3A8012A18E3B34ECCD8374AC203BC644ADAB06BD:\ 22D743189DA67A78A29148D4545DA4B72DE285A43B42D9CAC731B34D12DDD16541A0EC412A77\ 5E24EFACA5C206081E5C3328F88E2BB0C06BA703044E05CFFACE073068830D9C856B2920CC6B\ 006257796A7FE2ECB3CE6644913FB5AE98F6476DBEE36936D386CAC9C39B0D9766CACF5DE9C6\ 0084F09B36282DE5F109417FE711E0425BE00FB55620F386C81F0EE91F4E2306D8D134A1A458\ 13E36DCC9F045E4C7A18BF1427BF5C3780E3EFBAFED3E4714A6EC62C0309803C7C187F97C780\ 2DCA176EEE313A574B49C81DF25E427C8C373A9A5EFD6B290AD9EB6ADFB52BD7E3A4B86B056C\ E75D50AD4564F5755A00F148ECB36673985F8F17F084D75BBB251FF261C06BB1972EF6F5AD98\ A8221AF8E962A869BA395AF096ED24B58B810C7449E20DA628A69B69673278C6A1DD2DFEB5AA\ FD226575923095CB6FD06A1379404945925B782A09E25FDAA51ADFDDCF2F8384FC1A8D53D36C\ C3423099B54B03F0FBF5ED17CF363B140EDD3B4C20B982024A9E4F26C1B330D2A9360B737A13\ 90163E7347EF8FDC960F03C5F9194F8EC838CDFE1FE4452300548857F424ED392CDA3D88F831\ 58347D931E87E11F938BEFC178C2E191FCD5D1FB6087D09C2A25FCF65AC3286401A908420472\ 02825D6BBAE5D937E3117F61C1E212BCD6520BA984C04D1A9A03AFC01793063AD19288FB9AE0\ 324106D305D9CBC1AE8D4CE73808911DC45A3D543B8FB87347E5BD3103E95BFC51245DEA0C6F\ 4AC7E9D40B28CFB48866930D91464C1B602238C7E2C4752640F1B4344DDAB38C34BA694B93E0\ 9DC086FC49DFAD08F37C1F543B2768806C39E9386CA47DB9373EECB375BAD545DA04742C6725\ 5668B63E2408C564DA1FA44EC9833689DD4EC5EC8AA1525137CF7E935F079979B7E09E211E60\ 2A991AEABEB423A939FCCCFFB9EABDD6B03F24D2D0DE2D01FB40638F069234A66A7A60E3D667\ 6A82D7927306865FF74D4456E9B73E498B88CFED4C0678613A74440886DC0A17F948A1FDA388\ 7C99DB2133EC4D8A09CCB6DACE059373250F8BDE5EFB11C3897D592E1B9E080C185A4ADD3C9E\ 047C5DCF9781C228F194DDD075423D89E8DB2053FCC1DEA35FFA3909C791447E1CC85A77B5DA\ 82D2E012AF8D2C23017219ACD2E4245DE9197A0F4EB43EB3B203C930D48287321845567AC0F0\ 1B639442715A07BDA9457B38DFE779905990C0CAD83696514BF524F889DF87031B0CAC938265\ 18321921523BFD2676636DE5526C3D10C176AB27012A609992B3BD01D822F11AEC3C88AD3E1C\ AC3F9F42FF60D4CA0ABC2BC93CD8096D66C135C4FD6E7835F506D26FD5C0A4405FB353FA10BA\ DFDB343419FF6102052362D5CB6841ED111E55B7B609195A36A6E79932C363D7924E6725D28D\ F66FC871357EF8F78CAD93AF7C20B9CA1C9590EEBF12E15B1A2EBF02D9EC43A78B7C6AFF:\ B49715EC3C39DFB191BDD75B46A2151C033FEF2652C0 8EDCB7A73161A699F571C3E4837B05B8510F8B47C6177E293F376EC69B607781280EC24A8EA3\ F1B57C6D4A842746A35EE44B86D6463997B8F506168C3395ECC8613E1DCC181A26CE0B541551\ 511CD570D3B912F0E7F10EE18E51B9C83EEDD4E81FA6F14529E886A5E6F3D1A815847881DBB5\ D432745CC24D2BCA39ED8641F35297A46ABFB5E06FBBDC9B23404B42B4F6122E0A29DD945AA3\ A9374531E60CF973D4E42B5F21385F2BAFA38372DE67205335EA1BA7B9C6E75F85C9437E8F69\ D48524971B6FA192D6476B16EBD6434A9C802AAABE857389A9538870B7A17D1A62B2033AEEA4\ C84666EACAAED730D8B7557C7B3D4421F0074372606B95D74518B017D8725E691995E215407F\ 51C745B09390AE6E7ACEA17ECAE1C9786AD70CBBED26A522D215B4EDDD5C5239612BFC9B400A\ 6F33AB66F5D4E96D497E0BBA951084496D8BE3621DE03754321A6B2A9C4394B04FDCDF606933\ 0D5651177FCDD78132ADB1C52910BA87BB544713911CAA9B8491907AA9F1FBE1650A8B03D216\ 5A97E68AB092E26A03910472347D1E12F9868B39B872F3339FA8817FD5427F073527FF6642D2\ 0F3DAED64C670598BF3E6163D88333F66F0D6F50952CAB037F29F2C6F5E7985C5C23CFC1AD2A\ 051BC94F9A0116E28B6075138B207DC639FF8D6C96D4ECC9DA9B5365FB61338EE7F398862A03\ D70819403DFB08301AACB19D5E20BD17A428AEA172A63353D6EEDB8B39003912ACF52C6D6EB1\ 832629F151835D3F518A2E018BA9F9A4D192EA9683AF1A726403BE65C1E97EBF80E55CC8BF9F\ DC4C7692003E8E5E10B62179A669B7A87E88B8395255344609DE906F474E90A74EE6F88D25F6\ 022DF4BB9C2491F20D0A6AE16FBAD102CDA4A99214BA494D7105CF54D34904C67B76A73B75AF\ F13D9F9597F07B2C2A72103759A6EA6571AD68AE11BEA14BC8A02EF623137F349036DEB2B105\ 8A26C58502CC55629F3E5EFB9A3F30BFACD1BEB34D26B73666033BC3E8957D5CAB95DB5BE1EF\ 3AC844E6179F5C3DCAE207CEA301937C7B6F6392B7A3C885E291A2772B0F9998D98853623177\ 79E9EABF3E5281CAD5A9827EADCAE9371604ABD85BB9811E9DF0A7DBC9AFDF8C0D2AECEFE899\ 6A6B8C355C49E5638230CB00B552BECA580928987C7A958F95AB3E4C0EB30D2C89C2946F0F7E\ 2DF961C02F8DE4676636A0EA87D5941DF710C55EB37EAF9E2D0CDDF0406065EE6877F259BE55\ 11853F777BCFF730E642C671C12807B4A590D59D40D69C3E4278A32EDC63658F47B0F01A3361\ 136AF4F777DAC44AE1173BC71812A335B8119B06F71324642560A609289B9A7AB6271AE98B3D\ 3EF010200C4222077110CE34558F860C7252E96AB61127F39C9767BDB716EE2E812F9AA39577\ AD4820C5F3580BAC84D6186C72D11DC2B994F72E7885A08CBAF3D6CDCA020D86B4D885E4:\ 7CEA4FA938DAA9A9E01D791409298E10C3921441647AE602446766820A0059E6289EEC102A51\ EC6C884E2B007052B9FC863EE06E21429392E2AED8831125E8AABCF6E184BFDE646279340448\ F61F1C6351FC6739E088F4213A63BB95B38FC6B83BF38B8FB45D27FABCEC411B6F18A8B9E3B0\ F4A4CE3DA6FDE2464FA8F37AD06C99362CCB716DE824CCB62EF8F5D8873D8237837F020C6797\ CFFDB23E004D532E3640A0869577ADA434FC7DD3C1D287083CB2547CB6FEEA2AEB3774629775\ 53960FB634700115D677D2C12DB25AADD1DD7D52602CEF1F8861E291CECDDCA69DB08D98F2EA\ CBDBFF1FDB7EF5D08B704FC6C8F7B4AAF2A62A68267BF50FDD92FDD106C56393CF431DF3D7FD\ 82A3517609D32787DB418E2E41C55EED489E3186244DA744D5D50FF4CD71EA8F58C4CCE5D84E\ BC4D5A37BBF7A7D93994B3B8D41F4D2D2367A4A8CCAFEC61F4D1D8FE637C9FD275CCB15B0496\ 4433F8F0A8220EDA6D3B0E96853447BBE97BB9EDCF60899896A0829FD2D0E17389F5A55FBA37\ 1C55E7D3E93F27ABE89474A243B2867A1F16F474E6972FD54B8A683884360159F0F8109D05EE\ 799731A1C36CA22AA6D0320BC9B25FB1FBF9F1CB98886CF53DAF959E1FCB277173339C1CDF59\ 702E4E3894843C336B1E527F5CE2D2DA9A22824D68FEA16222810C42A78E70B574BB1D5CB42A\ A6E318EB0A71E415E9CD0FF6E98001B16134B6AA8CC258652E156B16407FF5F7ACFB27FC869E\ A07835E38F4476B4D9D014CFD6FE90DA6D9D64C24934DB12D6237F9B782BFE0537F30E1B3115\ D875DB468721FA0201541D4EC6760C6E3E7D0EEC428B34ADB6F44928739BEA013996A9AF4E1C\ E74585C8BEED9A8C778633753930AD8A05589138B647828E01A841524B1A87071B77532D7DF3\ 3173AA606A196DAC31A26C3B7225CD18A0DDFDEE85CF90D8C2796B1782BAB320116101A63BC4\ B7C4FCF336968BD2DF51D329E6BAD996923FBAB99E9F198E067DAD4C8267B0B80587C88E9773\ 755D1BF62FB694AE313DC6AA85A4C0740E4983E2527E5CA9C860327BBD67A53B9DB1FBE524F1\ 8B422F8DA23323926ACBE1BF751188C01264AB49F0A3DC5107E85C2F5C3897B9DA326D04BEAA\ 8C9DD5490938934855E67C3A0F34C5F74F25D710BBB4FCFF65AFEF6877E51B05739CF64573C4\ F18EE1D2C19CD4F966C8A037B93ADD684A956091F82D91EAC6D929401A660FEC7A969B2D4D44\ 523362F50CA7EA5D37E0047384F24411CCC9506CF1484F8583344EC6DEA320784C5C496CA9BB\ D30066A57D5452AA33CD03D041638DEF81D2761DA24E2AEFAA6A128E86926DBEF4F6CD832A1C\ 0E120B0F7E10B8C970754E5E0919A4CDD9C288EC9316E2BCE4357B8E3B708C8BDCDBA04080DD\ 1E986317E1316E95A7B0DB6C87DACDE723BA6E59277BCFFE4607ECB5B8FBAD0340631D7E:\ A0B8CA1B1F83F3303578B0CCC449871843D7C8360F93C6 DBECB1C042AA98E8593629327CAE8C1984169010D5EAE745ED9122E71827818ADFEBE013E774\ ADDEC8A2628EBEB1473A8864E2FAB7C9973553993689D72166197B31DA18F5B0A95363F4E765\ A419756BDA665E66C10DB27D712ABF7146ABD48F9DB2638FF3CB3099FB0BC26B6CD4C64A6652\ 63112AA378F6A093C11891B641C74D2C0F816FD5E52F37F01BF84BE64F9AB3727D8031213A79\ 1F9C6BC1EE49A259CCAD511D5CA26DB3272DB3751D73C2E56BE46684D6F9E952DB9DB1C9E879\ 797C487F56993420102418AA512F50B1C1339ABC6FC13E905DBADFFC651CBB420D6D9BCD7B86\ FA66083DEB317FB538A5381636F73CEEA73F28EACA590F6AEB4153B5DE87B25A7D58A7E89659\ DE2673C751343C72CA13B2B5ACF96129DBD9587DC1F427485DF9D75366C099F186B6E0821805\ 977C728C11269C4650DC21D8ED1ED60CD00C41F0A362B9E8F938A20E7B68B51A264750D4F825\ 3CF216D17DE03191360D6C9B33CBE7D2ED1E6214D0665C34D03EF11662C7CD7B25E9CF939B05\ C77943ADC1F8F4D3B861842D5F4B147529113C414A66269CFB33B0334D7C18A80821EF56C151\ 1A2079AEC4A2C9E5A1FA2212A358CB5D994BCFB43042D5696F895A7E2F24D1F9F1C9EA37F56C\ 2F41824B1A628FD1ACB5D0BA64B858F68816C76B11D3154337E49BB54CBB894E7F4781087FEB\ 75123B50F59D34E12E99D3BE1CDD6C1167A45D4DA1B5E4A0657BBFABAF3CF360C1BDECD6C5B2\ 9F268CBE1CE12A08B7C3EBCCCDE1521CA93C16259ACDA418D48319BCB93AD13F6E379D6CA25C\ 7277CD5CCAEF1EB90B2036D6CF7BDE5E64CD038C469F936F56D86D2DDCCDDA23810C2391958E\ FE7C76512F66F11F44B9E9F1CBD24AF6E5A728D01C7FDEB95A17214C48F52938404BDE078254\ 872B6003351A464D824424DB0D573BE4A2A8D836F342022B87097F8D20EBCB3AC56D26FD4720\ 77845CA68200D60261B79C4B60C6477A1A597C81E72D09BA38BD4B0E5E692B436CD1B541D4E2\ E72C24DBC766022ECD4F6556499AAFE062B260E104903C4FE3AF208B6D25A5738760B2FDAB52\ D1A5E66B7348F7172924E15E0A4F00D0FF01F6504092555973DAB665AAA68D9E6E54141805CB\ 409FB511507C66F76578C40A034F7398D88576B47AB98EE94CD18CFE6D99471FF56EE064B70B\ 224A43E691AF4166D97CFAEE55A6B73CE15FEE6AF7214D12C092A5FEA66EC489D868902D5293\ 48B212D5A478A33F918974620818C12CDB01B150610C1A2B5DA3B693617C64FB9D084B293C3A\ 1E460776A5ECA6CF50419B4E6DB18FAD314F0C7877213FCFAE640E11B4D64B0EA1801D0CD7EC\ 123A9EA0E290872A8238FCC8FD358586EA73F2A065E0C9B8BE847B836077B6F3867F23539AE1\ 9E6CC3A245A059D1C3A17E70C68F92C69AE400351B9AEE6BD3E896547622262D02370247:\ 8E536C2B3E9964DACDEBFF25C78DF2B29CFD2F423E3B85EAC810F536E18CE420763AE2F07E9B\ EE944437DA35D5843BDA0FDAD0F5C0C70474B84402D56B7CC1EDCAD0F6FD87ACA8ED695BB2FA\ F60F916C401BBBB744B0C6BA13D12C8557EFBC024441AB86B0E63B40D86082B51677AA296CAD\ 65B16335740DD87F75614A2BE2A025278FABBC19FACC257F01B395D803B3868177AB0E8B258A\ 931A9F41F2F3D08EEE08B4A8384BCADC8348B199443853D97C2DE47E896142244B123B98D22D\ 281F6C5999E7ECD0AF5DEEDA96B65041807A7520BAD6525F9D2F5DFC19630297C5C738510C94\ 78C0F105765B0E15995042A8E1F255D572C14BB7F8556E45BBB38FC00ADEC00DA5F7BCA78B26\ B8E38B37DCB845F968010DF7E908078504D4C6B09246140E27044D9796112005C878C983C27C\ 0ECF9C12F2ACD41078EFEA7B1BB1CC5A6A288B3D2FA67E2FFD0C42046F06862CCFBFF191F435\ 07450409670E3076DB2C6DA71550DAC99861E7D011A3998D3A27A268D93B09DAE44D7263DCE2\ 37CC7D136D977DE988B24FBD7A0AB103669733E4C1AF667EB71961F242C0E5551DEDF1037FFA\ 037BE420458B8921D59C6076F9DFD257EE563B922E703846F709E8498C584B9D2963C16C2160\ 7E4E3F4A8E72C41C54A51EDF14BF9DD69A78EF3BF0F0420FEA75D62BA644389F5DCB01D95B5B\ BE6A268ACBD7A0C8FCFB7BA6076EDF1DB4BDF8DCDCFF73E5D99E864C78A6E909DBDAAABF7326\ C572CBC82DAC8E276CEEF2E75A29916990B1C0B9AE8E28106233DE6EBF15407BE06D20B4C201\ 28F15FAC31841DBE8CFDB93EEAF7204BCC824933F80615C1123419AA8E28737D11AE352C36D2\ F69CA9A348EDBAB3952AFD8136B4FDD2261A57BE6C42206742A8C54F94432D480A52DAFF7ED6\ 25E6F5D1FD5CC409392400B80D62F1052190314B64694003022D154F7B12FCE34E3B9CEBB498\ 1A722E2C344475134F9685DD95BB419ECBA2AACB502B28747665F4A1650A881B37F6D45280B3\ 35E68AB613D826757E1BAFF076E0E45CF5899A73384EAE2468CD16B12B5041E736723A771CA1\ F93E80FA664BCE73A5D88BBEBA76DA2FB3521D70FB06D61532EA28D7AF279BB6C0EE77FC3EC9\ C8C4B1652CBD71D64FF5E55817921E5C6088F0BE653A754335D9A030C89B4AAAA3586E77D8B2\ 3D969B5D1BFBE7B5E8D0C4A612B38270E51A63591F7DAEB0815DDE403F7ED968FD1077F94270\ 94C5B212D03B4DA47C7E968FB8F982C81398BCCA00A304A1F098B451D9A2EEA2DBF9C2561097\ F0C16666C8471FEA676CE01A6DEA5EBCA591C509C3C0C943F5AAAF8456E1E98508E5527040A2\ 8DF9F3010AB8DD3C7EBF25BD7416BF65590E5B3B3BEA45477C063B90FA0207D56D716D2577D3\ F5808C4C40941DFEEE64D2AA91710A5B2169FF77E21369A595F3A1EC1A956D916DBBAC22:\ E09C01FC9C5EB8AE01A145C966D18B54D86962C307539BE8 510F5C74619D838446DFE399B6D460EC17CCFE8EB1FB0A32E65D6C8FA1C36E2D02CE83C39603\ AD466C16DAD9528CEE7E3644AF881CE6E764FC8F6C96B51B7E3467D9E52A779F091C174748D4\ 9BE6FF831AEAE0D9317DFD0F9054E6F6E9AE61F491D23860FCA94E6E99260A7FE8311A91A337\ 57B140B9E08EF8CA4CB62EBA23FC2001D5F817F861A901076DCEFC95324E426F839AE0ACF452\ 7F70EB3C218FE15C2FFE7CB522F7F8780AC620E6E86CFE47C0F37ADFE0057A9E66D4DAB6B83D\ 1478D57819291CEBB798C1D97363337B15188705FCC6108F1F4CD55B956304DD270CA10BE504\ FD93B68A7224C02A065F2877D93CC48FEC8A5BD5969629BA11169F0812A6C268FF5D09346F0E\ 848118993F240F25FFCAEE40FAA3CA451F08FC167C5A2BC3F2F43907A03B116BCC93C7320C62\ B3DB61039CCDBFECC1D9686144EE8EBB884020C5D7B7FA8AD199CEB512EC5224149A911A96F8\ 8E6F4D000C72B20CFAB17B0028876C777F5ECE01720BDB7DFB73C2BA43DD77032B1A23712439\ 459FBC5D539C63A16DC168BAA923784AEFE68C403733AFA0C9B70101358EEBF05C81518181F7\ ABB606FB180937799D256437281984017D56AADF3CAC1064FB198D54BCC5FF354961B1C11845\ 973F93BF878080C3206DD1976106EFEC6768DDD4A00039168E00A7515191A1C06145A5460BC9\ 323AC9204AC1A4AFEEE7CCE1662C034C63566DE3FEF9671FB4277702F4A3429B2D7B8FE1B7E0\ 34E00B2CA548DEFBE7DF7BF3B77FCBDBDFBBC105E375E9B9870E7FAA4ECA36FC6E25A6D4E04D\ 1001C5E0EA40ED893B59C6E7B16536028CDDCE2DB3ADF756504A546CD7CA1E97FD83D7FED79E\ C25DC4780544FEDF3675FAE8474323A8BBE081C401D097572E02DDFD088117C7DEEBED761490\ F812A2F2FC1C38EF62B597710655AE6C28D290D003A41C322654395FA3EA0B5389B3FBDD5EF7\ C9D3E159924FE179B2B8C25F36EA1A26D883DE42B2B800C9629CF99FF280B9ACCD51495C60BD\ A9E6963EE0007D86963BCDD00589333B7C84B8474BCB2BD28B6B5ADAAD16B452152ACBB951B3\ A603283623D2A445E70F991A9C5C5B883237BB6200A47A7D601915847AEA550F3663CD366A33\ 981B123BA770ECE42ED5B933FF829682594422D1F3341D04120C1FF547A1F80C08F097E64D50\ F7A9E1E2B28638543BD36A603C40ADEB9CD5453D572FC0309516AC24763303E652C170DCE7E2\ F30CF22EB5C8E1ECB222E1EC2650334DE8C7504985CE290A48A0702EAFC9C5752E87510484A8\ A4706AEE25350DE1D691547CE9F474E440FD3A8C22706F9362D8F4A6D7F2DA1D3B6E458FAB7E\ 601C0811A10FF6BC5CE7AE7B5E7CCB9FEF3216A883EC88853340B306336D58F744659D67BF7B\ C738D0E89FF18C7B386D786B111B2C90BAA220267A7454E5229A4E800B94D2C9D78C8753:\ C813B0E5702C0C6DE3328EF88A7E1F823ACD43EA6AE2A3339FB3F40E71DF4085142161B6414D\ BDCA3450B5303E2489E7D0A943E836FFCA6D99C473F46664818F5FD0CCE69A5B0DB47749C1C5\ B85BF8B93DBF8685ECA343B7274800D757C3D482E9E27DFAA293C37CFC4E6A87A51B8E283796\ 8D9D71E0CBCA79D7F7CA29C849CDBFE3C0E1A67212AA88D55C2667E7E18FC77ACE1325C6C497\ 01D0E51BDF69216EF105FE3EE23234EEE479FF85DE0451F0245515DA9C7696EA7B589922D44C\ 65DF23DF4FD437D2A68130EFE72A5BEF60754D7087692B09CAE3D964CAC2CDF2E4E47152DCAB\ D0C1E9EAB1ECAE68001A934EB8BF08B35BAA4857A085A477AAC48D3C33104712947053A3A6AA\ E9420761A148F42AE11F29507595DD468F9A0B24BD667C58D52E303673C5BE286D9ACC26FA8A\ 401E8B4A2FC327BBAD64E7E27FFE5C9ED91FBBC7EFFB9DA538121567D934F43B89A10A9086E6\ 94818B3F9F076BCC04DF8BE4C39E0C8FF4891E45B0147D435A946BD2A099C64D4DD6E3BAB8CA\ C7A44FB825FC10A0CFCF2E07144BF92513B4B468F89BD04B451A59A0F36B0B1768C8520ABA30\ 6EEBB7BFA6470BAC3C99F570034C3B8C73824A14719AB2A7C9177176C626447F2392DD1CE5EA\ E77F66F3EFACA292420E947C96074557912526ED5340A282581825055327454110F16A601058\ 77F16346CE130514CF938DC48AB7C5B6BB5814860EF7342087AA12283BE3F4E5D052740F74FE\ A37011E2FAF3A991F6F64ED4D0B27359646AF04177033E9A85A70E1292EE24F17E3158605F3C\ 4F5E50115E3FAA01584D3615617EF0A78B6301B4ABF79E0F13F227C03AA55EBECBA7253A74C6\ DD3539F9A9651AEEBC0444A7F2D69F175D757B25B53006CC424947AD0FE57A722B3B5C994992\ 74AA31A994EC8981A18A29695414CA397F3EF2571E165002693CBA1F54A72B9A2E0E0EF83C40\ 18C864472474A52A53CDEF878471648D2748FCE41CCBB9B55A1DF82AFC07B378B814D57EA8A6\ F60F8872ADF7D0CE4FB942424602508D1550711365BE45433656E1A4734BCE2E1729038BA26B\ 9D3BB3D47C960A7E1A3286A41632B47147F533F8514A799B96B740BE43DF9E5D9596DE6FACE8\ F75517B97E6764D700AE9B0F4EAF9259DDCA66972EE5CE74D376D59D9A7F921D92E172368191\ CC21FA0B367A8522F9A05DCC89776596BFDF7DC34B71B2171E8D74F8E87E26592E84AE240DCE\ A4F8236F7E13FA1D254EE7CA048F36DD359733A5097090293E676638C54348DA584F38BFF03F\ 67E61A38331D31769D41BC04C8EC73CFD9A66C95656F87563E17BFD7A5CE3C1B2BEAB42BCE01\ 7DA00249A77AB05EB39A99999E8C374FE9EFA7323A542C7ECE218B1005B100A171C94A5A7169\ F679E0C89F6AFAC45202B3344F1C1F11FC749FF120A7B1B2E30DF2AB3A1A20247D8EBEB4:\ BC7974BF2DEFA077AD76ECF9B5FFA109B688D685A736A03F42 A3878B8AD4FA1EB390BCEBD93724540756966688C1ED1F877932E75D50C1253CD20E79BC6FA7\ 1285DDA89BA56FA95BFF11E2EE1B171DD95F698971B3B850EE1BCB8EC181C3921A8D9857203A\ 2A96260818B0B7807F1F93C32BE2DE700E75C81D3EF9A515B708C516327DFBE7C642C14238E1\ F2E2348F92547B2A1F8058E467611E3D139D1616FC616715754E8593678E32A49B2BF820BE3E\ 55AD895B388F43B587596103A3A01271DAD456205BD53C03BD8ECCD9C7182B1BDD24BEB7C845\ CC775D56150DED9E059BCEA42AF4072803778040E1CD33EF81A21767006D0824C90185C54948\ 8D9092CB0EF9175AB351B394786611C6CBE7B47F1762BAD1F39AF185B9FBDD3DEA790D1BF5FC\ A6A80E4EE953DC61C54F7905F45F373AC9299C67C9A543AA3597E84653C43D80D11BCFCDB635\ E12A846CB4B0D4F82CBC40DE236E6D8DA39BD9C90A03C8C9C47C8302CB53518A2D7328BD0463\ B2931EEC975F3699C28C8B2A08C3C40ED78931C6FB807441B0B154F8EB0F8A0D811482864A3A\ 755E96C62CA19609A63AFFDE31F11A65CA9A98268F7797E883558A9221C57F32E126F156945F\ E4AAFA2C5D9E4A2B383794F23D0E7296613DD73558F5B16576E7D8F0D87D4F2AC6D3196C2827\ 4822C648175C919559D85C13B97870FAC56C5151CBAA305CE02A23621F3C50A53E4C39FC6ABA\ 9A957F32DEBF5DF62FC34BFB94B186D376EE4FBEF617EF511AD2ABB1B3FB8CA56735BDF60D9D\ 38BF4AAD71D91F194DB1B8AD003D803402B047CD714EEAAB30C9B7A672958265E032CD9F1BA2\ 55856CE3CC55FA29589610624F25A68AD3A0B668F69426C5D91D17C5FD721628B0038ED397D0\ A0D88D4436F317E78AA05446B8DCA1F3E7A1B16F754046001146487B06A6C1DDB8C98D3D0727\ D9CA9F5A99A428C63018EDCB49D810BE4C3D77E2F006F9787DC1C0745062A4AB11734EE71175\ DE27FB2FC04502E1A8E127E374FBC983227FD935035DF6D99A99C9700213EEF4BE0AB6DAABAC\ 727D6FC09CF528795E7FC36481EFD8E982AA5721895AC421D73B902B01CA30103AFB77594F8D\ 62B021C7770CFA088549B8B6292481901AE54D542AE2B547A41C8A2E54AD264A511965065E1D\ 5352CD37E0F0E9A17A0A237E894618079F5FDFF5019A2DE7037CB7073426F1933FE7777933D6\ F212DB8C5686613D73A82C070CD06ADD134CADD2C746B8B175CC73DC606F0F2206B269E3E2BD\ 7070AEE53EE4BDEB702C8F5474305D3A99527779967DF66785AEE17CEA574FED7250CCDC111B\ BA529548FC52B9FF81F1CECB530BD3A5D8799DEC62074C0C5F2927E0AD6677CE90B57FFB1796\ D9F62157C4D4A0FC09F4A376D8D6E96EB58AB67073BE683E1A0B3DFB6BD5331A73CEDD91C104\ DD8FBDEEEBF4F80CF2C79653947AB84F10663621160D20C32D60F15622EDBBFA4B1B4435:\ 30C59A448D99C6CBAE0C75F3012A728713BC357DCF1E814FB0E164F2502D8E1838C20A053FF5\ 41E0D51EB389D0932357DEA124126D40AA8EED077239B429DB16D18FA4537D2694A7E78AA8F7\ B5CA9E2E4C62379A860D4BFEF73A23509359517C8F191C83ADE0351EC54855449441952B8D83\ 40F9A8E9692B79C9E52A48F55F7D281D5A093DFC313E704DAB8897B35142D3055E2B26816D11\ 8A1B2102580D87E888B5BE5C26E00FC6BE2A8A2DF05E35D0F34B43191F1A5BB5865D2F9F0695\ B5F163F5AAEB43A21190C81344927DE4DE397DE23905509F4A94144276EC3085E353E9409BBB\ FB4CB4871F67C11F93E772BF800DAD9B56CE49ED9E807A7AA2E82E9341FC5531EDE9D39C5DA8\ 1158501B0C0A23894E04418DDF6B3106FD980C676E65B7599197FCE7BED861FAC3E3DE4B6113\ 400933C276733FF335B725889885D1F05B104D60621E823E9E1EF47FA982445FC5F5FAEDF701\ BFAE44EA5DAB480861FF4940C13D9E4351BCA2B84C21FB3EA23433FF7F2E9C56DDA92D645180\ E6EB610B39309ED073A700C891BA183AB048FD285476EAB85042605B2BA614B390F5B0062647\ 31E736D9D266A56B62344A25AC7B95F88A53916BC0A764B373CB04ED7B1F84290A368D2B2F37\ E794CBCDDE38AAF38915C1E0035B190C7AE546C9C3641829FA089F3E454373A90BDCF7BF5FFA\ 1E91D89BC026C28B00275EF96EED2A3E311CE73A3F8BE58C5E30380D67E55BB16CFDEF9EB6D5\ 2FCC797C0C017A4DABB554FBB4B3AD7D4EC0520EE5CB63BE6FEA34F8EF1B9B94CFB1202F4A1E\ D694ACCE6B5D0A07147F0C15A554A6B05BF0224092A4CD3EEC46DB5CF93706D6EC1184AC2280\ 9617A6A9FDE605794947A10B11F5EBE05E674DD48908F71DE8045C71F345D22851607353201B\ 0B0B0FE0744063FF262B91894584784D216E63A7E0A550680053C85687C98DC8E8D31AE8EBEF\ ACBBDC2AB15176136042A72F6E80A12168462723C42FB6F759392F40E4C38C74685B164A7AEF\ 478CCB598B39F3A84646A945CBDCE3339E369720A5BAD10C32058C07F7AAD768A693B3CCB9FC\ 677B5AE21CD4EC66992B8D1EE676DC0108A9C2E4344FA37B1AAC704D6A9AEDAC68741DE35FBB\ 8D103DE27CABEADBCF06E214EAAEB615051528456AB7477CE95BE4DD899975806D8F21055CF4\ 5DE6C98456F5A8F0B30AC2647B5A61B7A10BB77C91D7353541CCDD5CC98B24B5B6CBC28AE123\ 713AF68D9352407A232E65316400C25647840F0B60B8172325D3338561B797A9DE775C847A28\ 8D535E9A42530057487A8D4DB74A9E8D989B1A6CE6A9F66AC9121B8FD1FB4259275CE1BB28B8\ 25D1825DDA3330AD4AFD6B94B166C4C2B069C77B134AA105857772657A42976FC1B671F21B68\ 67F6F2F79DDA6AD5E207602B57055B0654FAF0ED455F164A7033F6B91E28054232030D56:\ 9F442E3FB2EA592A0CB7B0CB8D8CC4EF5257C2DAE393C21BA0BB C3E72DA2352F1272F2A862C1802DE449E63051F6D9DFA19260EA094B450FB888C40A82AB5283\ AE400000BD786852E0A9502FC25AFEBEB3BD6787887DEEAB68A7DA7614A9446772DF7FC0BE33\ BA1494FC76DBF30F7894E644FA1DF0191612BE7516420A850C46CF65389CD5AF7C5A534E7A40\ CF76C90BF322166E26057A3CEDF2497B57742ABF06774C0E4A8675199F3CFC5DE26402B40BB3\ CC303EAEEAED2F7AE6A0ACBD24D54549EDF40CF1EC6180B59CA17D4568201D211E400EF9D47A\ 320514F62404B010F730D40A1ABC45D4FFE475997A8692202E88D8A4BE2E3891D41096AE609A\ 19105E5CF74CE58EC9C574F0815DC470DE7E36F3780684EA0CC402610327879AFF283DCE3FEC\ 687D4F4A58CD4DE931DD5F3DE319C93E775BC417C29E6DB8B875F2F441B0BF7119980322C071\ AD77B723E0823C5062D479820EB6D53F9F39AFF69D69C741C8C1C39EEDEC6A15336E0F25FE17\ 92B17D236C0567D14703F6C64685707C7221DF34EF5E3849CD44C3199C9D7953F132C0DCDA32\ DB03D1A1C97511AE7A6D440277CAD76332251201B1E2FAC46EBA667C2905C00206145A08B25A\ 8FBD1478084E52300BC8187B3AD4EFD51CD7E2AF440BF7B61C52BDB5E25B2EE89E186F8FCAED\ 91E557DEBC038E3E0EAE0F894D89F1843E12C9A450721977D74ADDE7DA2F13C4D1F20884F03E\ BACD1DBBCCC6815FAF755554DEA59BBE56B54F3EDD76220F35F82D9EF760A72E5EB70A20F45F\ 9458B2F42CEA0068133321772EF76C79760ADE842ADD7A9449B30C9E88D9B707BADCCAF72986\ 8EDD11B9460B39BEC7605A54CC156AD27B6D96A474D183EB1C0D2C5EFD388DB9ADDA2EF38B06\ D723A0E11D94D0610701E20A8DF084F8AE67FF6DFD52A8D7EFC25D73802540FCA4C7E99008BE\ 15BCF36461FD9D5D3F66AA25510DB2DC7C715A5A1D40ED8DE77F3145BE7918BE39A579BB1AD3\ 9B64750436A2619A96094EBC67B6C7095A9CE54D32D866DA097AE970C5254113940BE9E89497\ 97F8F0FBD38281206D2F36AD1D4E0DF47FF3917173FFB99652F74EBDF85E0C26BE6E88661811\ F285A02A8995CDCE78820711266D6A9ED3B29220DFE13D7FCADD3B3460903460EDC6C877BFEE\ 1705C0688C6B19B8AA29A712864BAD9D221A973D133317EBFD85095706D553452A31E9FA1C2B\ 18E11269524A8C585D0D852B5CEF5C20C898776C36F269F09BF33A645C860460263399864151\ F13B10DE554AC09EFC791652451FE761D93F6B159CA6CE312AEFE8989A0C173F0C9C3D185DA1\ ECA468B1C246F9EFE6D8CD7BCED96DE3D6E6F34ECE1EE378AE4A3D386EEE3775DA3192617163\ DB46D1E7BCE606B6A43E07A9C17C6FBA952E2A6EAC4DFC3D4D31B447C85750361B9F08B0ACCC\ 87887CD270CF7A898B8C0DE907E28337F9E011F20E219D313E3BFB708A3273149DF69193:\ EFAA6D16D871391B565E2CD61AC153AD5A52CFB19535E0F0F0C0AD361D70053885367ABDDCE4\ 8793DE9FDCDDAA35ACCF7E99D76A98DDC4FAB05C31A1F39B971F20D2AF515B4EC62C686AFE08\ 6E7571EF15629281B76988CAE44892015C3DBF8F44731CE3D2C862F8A1B0600BD7C10B6DD5CA\ 276FF73AE22C411A6FFB7177819132DF0C012675B59364231EC6222A270F80004E403C20A63E\ 0EEAFE8F8B1D7F389F53A27BEF11BD9486FB83678A971A49D584405C9010F1A28EAED00FC2AA\ F4A763659C28D73D0F79429A65BBF18F4736DED48043CC8D9E4BBCE9C8742FA66F566CDC64B6\ C77F0D4C5EB39C45B65B748F86E00B0A94850B4A3EA2BAE4508DCE0C2C040032E714FAD46A91\ 08CB9053E5DE1108036E816027BB28E8A4F9BC8FC4E0532C0F734247EAB51C3EFF525FA160F8\ 2AFF051E3E0879A5C0B37BE3EA7FB811CD473D711C45DA6C35A499BF6F4CD9A61FF77FE4D62F\ F750EB353427496F34C46741A612597BEFA6E78EA7F73C3A9AB06D66C46E0254F5BD2634FB8C\ 87B188A7ECBCDA62E7C60A60629EB89630760DC9946C898FC6A8FA1CA72AABB45A44EC09EA7C\ B7A83E32088957703617C53FC8612EDC540F2B9F12263EA3DBE1C137B7401C4BBC79601C8986\ 02E0FF0F9FA82CC31CDFCFC876C8692727982F95081B21BEB36664A103D743BB4DC43FA4D886\ 853C555787BE2EF4BCECD3F960271494B3272FFBCFD15DB4F13C808B43A93B18FA2D412ED8EE\ 94798D45177F25B64BE91681901FC0067D78CDE05797968A4A5A17EE2DA3B13D05CCAB6C9BA1\ DDA97AA52B7D54348C902EEC725B2F27C0E30F080FEEC33ED2406172833EBCF7324AA784E34E\ EE33987AA71B631CC63577FF8DEA298986EEA883FF69E95EBA40D94AD348AA8D92997F4718A9\ 1A963FC2954D6912EE70297B365133822978C251E4F8A3CA7233A6A928E36D0CCC15BAE70BAB\ 7D6FD849F2EE215206CB09E91A879B475832EB839A19032985A3AD58C99E89042080B4BEBC24\ A4643BE342057385E33C6C08C8C66E9E842051B5D53AFC272EFF54B6287CA60A54A45DE35B9D\ 83B0ACF58A5EF76A9562630DCE413E2650AC40E6AC286D170A0FFCC03EFBC6E19F0BE6A7A694\ 10F019FAE61CBEEDD64AF69D9346ECE739B4F0DF179406293B16137510060206B34D47069ABB\ 5CF345E8273C6E614B9140DCDC7721920FAB33FEB009E51A1A65E2A004C5E24FDE771A4FA06F\ 692D8D8FF6E41CDC2B6CCD81E001EA39E529367B7CC7DB6602927E5A7916410AEAEE2267545B\ 79E3CFBBC6CE1EF761555E387524990EF18539BC4B69F65C5E7F6BDBD4C304105C7436F445D6\ 1B69578ECFA9DDC357BACBC0919C2A796B17778EF65FFAC0D55CA5055AA2042B00B1B92F9227\ B061EBAB643853CEA690A77138B4276840E895EF691370E6A36434EC092A815FDFB12AA8:\ 98D9C8D2899042442EE0AD2507DF56B749696D07D2B3BEDAB9D13B 70FA4F489BA7A72EBFE10B8A591FC75809D116425A300FD9DBCC0B8863EE25A11D531CF58FF5\ FF93D05346FBCE189515B84C8AB100CE6B802A340E11D522EC771C1EB4071A1A3874674E285A\ C4A8AF302E95BCFAF741B3FBE85ED098EBC177E509FF2B120DD48FD41C914354A8818A4AA8D3\ 6EF2926CCE7C71FA19B0FF67ED6B9D2A3AC3FDB6108E3A68477C92897891176D4B03D4E26292\ B79FD0AEA177B0F058D3F0917D642D39F4DDC8D02773C1C75F705529629E25B10E465148C498\ 62B0A89F1BF62AC70711AD6313387BB0185E8AD71F8CB4244655011E7170A304DBD9D1FF3EA5\ CECE7C3207F3F94F838CB61754672BFBBC8F9F7BF255012D759E6A2E07E90C7DCBD8E0F87FAF\ CE0B095957A07F5CA27D6754F3B1FB5090D4F971486F533BE5012BF3C1CC4ED7F7963854EC84\ 932B8B0DC8690F1402E201C0821A345CBBD7B65BBA2849287B4EC1C62D822919AA1F1F46CCE1\ ECB1E01FFA7445A38B1BB8A7AB84400159C8B1738EB3642F6BF12DD4418F2C2A4B5262891F16\ E5496561C6348286DD2C1DE2C8FC1657E49A0C039AF09DF56C5EB561DF4CB947FA0A932A07BB\ 0970B3FBC018D9B17A4CB87AD93E51CB2F3CB13164AA6C3FD719419F4B67D1B03E3A9308FAE9\ D6DC94B4B1C0689C9C97D9BE77D395071825C3ADB32D0702109F702AC8D7B762DEC9A1AF5038\ 59F98F7AE75AEF4691F3A55174623200205D7DE038071CF8B02736C99A3A18E92C10E866F6D6\ 9F416EAC0EF9420DAFF040BFE3CD7AB9A240268C03B9D66F603C6A1AD1254D736BA669F9350A\ EEAA647D3B7FF0CB3456A9C39EA5F936C5F6B124281ED41F760BCB1E49056F74142A0F6A6BB6\ 4B85958F8B25CF7A9B90345ACB5C3ED17B285977125A090F7C7FA391DCA1FC2F442746EDB895\ C466D665C949BDF2AD3E56049A3F62C916987AA911CB3D72969F920FBC4883AB0B365109502F\ D5AADB0DA1B79324D3299DE64C6944776C0E9F575DB1812C408FB263F7CC7612007216741B5B\ 397F7F3E7CCADE3E9F9A891FA1FCE70CB46DA29E520F7E7BC049A954D6F6997E82A7B49C1E98\ 0BEBFDEE9AC11D43C152988C1BD90B9E643A1761898993BF642B4465DC05D87FD83F1BB98CB2\ 6F1CFC986DFAAF1BFE98096C65ED8FE76AF4D085837D46F63AB58FCF5FADC6E098D319AD7172\ E0B2CD6AF62E10C41A46C5F08B2A401C212D49E4ED6F7A372B5565D7164897CF6CFF57E0F25C\ C814A1B46B01C78D76391D76EAD6D9A9F37B6DDE47BD32E153DA5CA8AAACF436D4C91BD5BC85\ AC9550D4181A3FB20F6B0DE6E136161DF570D6BC72C52AB743BE670F3B83351ED71F3018B333\ 6DD861CC0DBA507BC2A16B6EE7E0F29E7472772E7FDF47DA7AA4BA19253CA2CB69BB5EBAD19F\ 30C6321EDB5D908DFAF162550E06BA90276B9901BAC6E7F1F21D9E7E6895396ADD9E6DD5:\ B2511B9C8A29E538FAF6C9FBC0C5EFB8B53548000F3B69A8192D1074ADEF8A589A68F0ABD991\ 5F869AF21281EA9910C20FF08006AB2C558FAA5E42D2C3117DE89C276C1977E36EB8DC80AB91\ 9B142D35ED73382D4736F9135E16F58B64D5FF75D235637AEBF4ECF8677F214C039EA29D2B95\ 37F88B9B20C20F590B26A8394A2B9D4A4798EBA65EAA6342F370E732459DF8A13BFBB49F5331\ B5B0B60526FB42D093271807F7873DFF03F5303725CC3E2AA847EDA1E413E8D11E9B8BC85C9E\ 2B95E14F38991CB01164EF054076D028D9C0AB1EFBAC1D0CAF727194DBD817A6FDCA84965434\ 495FEFBF6A5B28D8E816680002B03754178FCA6C5EC96FC069D30CCE54307EC1EF1D4EEC73F1\ 45240D4BD8C86BD1C42A79456683A8D1720B24B839ACF53FA450A5A5AA6350E8DBEF67B8E072\ F1DEAC1FF5940D1BF7EFFF618DBD461C66298EE462230CD07AA44D1B145432995F17EB6BC069\ 6F9260614FB1839AAD3AFB70B767232EA053D3A03AF278BFC4396B31176082A97E96B11E88ED\ DE6E419BD34079C5E2C0E3063EEA2E8D285B11F886B1AD177DAFCF6C5159ECD12393743FB6E8\ 734147DC08F681C79B8ED889ED4BC2908D37168604740F92F13C8407A2F7F1138217154FFB55\ 4D1CBA031337867EB64B03FC343C35CA899E2B279A3879F1A282535E53B7C54E1429FADE2FDC\ 31D371BB3A0C6FA886E592CA9E3A41864CE3B3C1A4C64737A835C40678F2F22A48BC2F02BB63\ 462BD9BC8A0108DDCF3A96FD4426EF9F5F9515ACE83D9B37DEB30D9FB6612E1F8509E7B55730\ 2A86F491A6DB9E7BF4FAF867D8237A491D41EF94F36A691892275248AD721092A5EBE87CE010\ 9D497221E17B6582A0C6AE2E6D9486B8CDE0046A196FE4F6E9490D2D3341DA9AD473BC94C341\ E1B003E5579CE7C07C8ADECD38AF583A226EB1365C853FB512F27B25CBA25FCC210F3093CF7E\ C680A2A32CE434E7AA563236D86442E7935DCFF3050681CA2CD516054DA3D94C159A935EE03C\ 96D2906391BF5128D82FC106A2948649E8AFA0C5A3496F42206DDEEB12168A248B4066D9939C\ 036CB94E54570B18E234429EC67AB15B8760EF62053F2834DD41667C3CC57291C7AB37395908\ 7A101AD986AD201A7BE01E79DBF19D392DC119796382C7F1748D86418110309C27451A89F111\ 24F41F8D497DFC0874C9618C8DF99199D2E366E7147E8DE0D84FFB122BB24ECBA72ED6F42AC0\ E0A4B73924CB2E193E4DE685B9C0C557F2AE0441B93838003F59A014EAAEF999B41ECC3E0A9F\ F58C38406178BB2271F2DFEDD3B8F4611E1795755EC713F5E7F4967919BD21AA336E767FBB31\ 0E2B305EBEC9E3CFD2F2DCE6F2695D29C3A69AEDC81344D1975522B20E2A39BDAFE01F370C4B\ 21AF921E5D39A47D5F9D0373F69BC94E154A95DDA966B83E9D72AEE63A3C3F01FA45F7EE:\ 3EDB5024B4439FD8463FB27E72DFB2A0EEC2A108770C9EC58D91D5FF 13AFF54F5FDA5CFB464DA7CB2B7EF98B3E19DC7BDB50302DFD044BC96A26F889A3C869F861DA\ D16F832D9095855385F7CEEB11C9FF029E270A82AA00B71D62951AB702C24BF5AB04E72974CB\ 70E575995F093E28E3AC8B74931B77FA74BFDD704E841D3AAC4C3CCD41829B052ECBCE10CC90\ 9285F644CA5EE801434B95B7BFE1E8D13B8BBF0DA6D608CF438409B9A5BEA68CFD03A0C040DD\ 53698F0CCC5A23AF583848CE756821435B9DD99B431CDB9EF5419B8D595260CE0D129A475CB7\ 8105EDD56C24B55860A56CA0A404B695852637C8220E7B26CABC0EF8477191FE4CA80356D693\ DA691FBC7881AE3740D17740B5B39C01FEA3463484A016621E1320D2503F1B680F62FA2F45F8\ 5D9CE530CE7456257D86C68198338BAD10CFF149DA46B4AE5F4B4942204DF5D45887E8171581\ 283BF27B420C99314556C74FAEEE06FF34492F7D6B9E1DDFB4C7B0C68AF0DB1309548F3B0C14\ DB47D59CFA2B990C67AFE1A68E765180F7F28B9A022FE1B9D46BEB9CA70FC84848C640BD2658\ 22BDBB22ACF459A83ED381DD01C1B4FD8F560EBAEFB47798116BA55D7401F876F841DD7CD7B7\ A868D8E25F177C856F9DE63A800FB38DB1B75A1AB8F5DAE7F17F78158ADBE74B74F55BD6D2A5\ 853DDB39052B7F8320266734019EBCC808EEAA974B9B25DA57CA946FE338E551DD1ECAE44098\ 5FC7EBE545C7DDBD2DD6D9F8B998460788C1B9BF031A3919F56D425B08ED00BF8B413A094D88\ F5BBFA5C080D1E9988DAFC03CB7DC3DA3963FF91A57C35803263821EAE880A90F4A50BE0E253\ 4498E8360AEF2E6DCDCE3BF0C9B44B865E82B26644010A5560E0C94E6C12BA664399849B71F5\ 27F74411D41D408C938805C3E9674B8854B8505EAFD47EFA6157CAAE3CB05E11F2A689AF1449\ 9895104A59778EF19385D6640466CF19E45DCE6B7367D55F802AFA2BEC0553C730EBFC603CDB\ 6BCA10B5066BDDB55EB6E81AD2012D7B9802ADE7A8AE708CC5816CB77E52B44648032FAEC763\ 942C3AE1B6E226F2B89590D9D738A9BCBB8D8F1C92F3F5C84DA4628ADD590E71AAB74E91B7CF\ 558459B641A5F5496B93A973EA4F40A1A3DBEBBFCFC01559B0F081F01A83074C16F101E46563\ 9B159ED430C194DC78D398EE03B779D978FB4BAA7BA417B12BCFF174F22F71020264B5F49D91\ 0718DE1EBACB8D80DC7D45882EDC842DAE134679F60C5D59A0B8B71082009A5D0C335CD44389\ 9E62A2D693EA93F593F1CB33A0519EFB246421F3BAFDE66A44D6061BEDB0E93F1C5DD6CD6D22\ 864FC0407664349C83AD6C3362978DC255F0C9DD421D9247536401887301E5BFF9286FBF0D71\ ABA606A4C3DE065FC95D282209ED7A18221969C79147191FE629076234C62995A07F9550CDC5\ 201966645DE98A12FB2F36AFE4779FDFC1AD49A59992AFF96E372AB59CFB056A37F3CB56:\ 7037C2E54E86E1F52D497FB4E60229BDBB7357FD617924EEA72AF90D68BD5075267A9B02B8C0\ 2EBF86782C0B4BA174D9FF66014B2AF61184C722D5398C531218054D7D8F30EB6FCB0A871115\ 2AD577B2D51179E6266173B6F4CC868AEE184AD2C39D06432AA31D672BB75FC710A8BED7CBC3\ B3CE303C13781E243441E7B6A1B6D223A32D4472EFDC8E50F6947AD601F4B07EE405AA66AA71\ 313612F904626550F6DDBC71A24B3FD9F036ADACAE04A035C13E2DF78AD9458174DCF3677776\ BAF8ABDB1668D39F4D4B513A2DFC8D36869154DF1D3F45EED4DAE86E77090FA21B0C2514CE24\ EAC2A0D928EB487843CA5431D3C6FF527BA67D8C337DAD9163EFCB9001E027A4EA629624474B\ 112EA2DCBC213365EF44B1388EEA3C76D02AEBF1C2731FC54AB6D197821984DA98D22FE979DA\ 6920C15A2A4F19FE86A7A49C1045421149548BF31A48254D1908F56B885F39909BE3553D8242\ 2FC41AEC0C63D047DC65A1DD9C7413097A8B986C3964A498C3C99C2E7A4DE23205265734C29D\ 457C32A2FD4E598C136C2B74A51511024F75E9CFFE60278D7DD4E674EB07F1EF7149B9859A3B\ A40E06CE8DE91FA588CD228765D7FAD214DBDED8B7BFD6726A51CEFB803740CD87D8F23E7385\ 5691B6FBAC114C929992BEFE46465FFAAA6C592B0570C9F9EA87D36856448B9A5881A8F3446E\ 9F884FA0D3F6F396AA1B95CFF30873141CBF22DE721E355675BEB018E2A725B296F029E9A683\ E43B9FA417A3DBB5E9F5756EA1DF3C3797E70E54960A9ACCB28CCAC4A4635BFE1F4A2A2CA5F8\ 4A9F2FF6B2498C7F4F93ACE34128B73BCE971BE0A5920E9A938F37402F1BC4DFB2B651A7F30A\ DFBC991263418BEB635E25C1CE3E748A0BF9D9C6D4CF3EE48646033EFDC377FA5A5472375349\ 900D1F1DB1D313DF7E64B9B34C4A7CDE434E16A9D93797C07D50400D13E7F65486DADF196099\ FE9F71554CEDD782D89B92AEC58E007BC903BE82C26DDDF2C86B8FCBD52ED64A19FC2920C74D\ 7F0B47AAE7FC176851AEBA05E33EE2081DD244B751BE89D8FD1E74A798EEE60A493CC36AFB34\ DD96C34541EC3A2C32F1285DDBD88BC71138DA04E373DC80D958CD369C64FD5F26485369ADA4\ 1B93F5D43C47E2DFF1CA55320A70A0E07903964571DB66C75FBC691691B0520A2D31A3BD0CA5\ 22D842576D01B57AE4580B8AB4A6160159A96DA5FED007FD02E4D63ECCAFAC155251F316BB54\ FCE1390AABA68E296756AB4F0189F92816FE9710C3E190F4679687631E99981F17429ABC4CA3\ 482C56C0E42061171BAB63AEEBCAA30B3CC4883A74ED71E47D5D8930A700F6D5DBD39627996D\ 9B93B978A8ED52D6E87752CA617331543CEAC386A6E3A8F43ADBCBDB46053F570119B3F19B2B\ D92477AD98AF4197C274C2B569E013A7FA7850D8425F65AA425581B720E27BF9D9399A76:\ 4AA2A4958F5A0F91B928D76B91C36506F6B4C7C3EA41EBD6416DE2AECC 2407970735E9026331AE5641300FE86BCDF45897190370274A476C8790502949D887AF8DFFB7\ D1CBEEE0BA4BBFD0AD393E2D0698FBEE8F3E56C6E08C3ADC37A2B2AD1BC1A5AAE25B21B6E779\ E41DDEF6C1FAC6EE571284F4DEB791EE1F079DB666E2E64C1378763C3EEBA9B998C27C757E70\ 8C680CE0E9C64B3767B4711C62D2C10F7905364DEE5C4A7DC533299BFF6D55086941F876CF1A\ 803F04EBC45EAE5D48612FCFAA1E6FF325CC8643DD77B48B16CD6C01E767DC11499644B6C301\ 565E16BCFFCE712676FEB37841608CC173456A4BFCEF5F9A40FF521CF94A9A38E20622277426\ EE49330442455945510EB10259B6FB360F1C38535CDE3CC563DC44F36F978A1766CF91D49592\ 1BE0ADF59EA0C659D97E1C321BED0113B840350085179AFA32426A6F30AD9CF478A727D89DD5\ 693A087B16AE1C40010984D8AE35323FA84598B3F7A13BEF741A6BC59B47BC8D5250BE51E563\ BF30BA364E54B68B75955FDE0809C56C25B79831EBCAB1DE292095DB60DD5E6F8C68386EEC70\ 4CDF5FD9B21D2011A955DF9425E62E94E7B5400801E549959B1D7512A5F69494226824FD4E14\ 80D28ED9D41094AB13D280D6E324DC2C61AAD4141F82BCE5B2342654F2A78F08A5C272501617\ ADA60BD42A7E5214072B104A6EB88916E59694D4C72ABACD08D31130C88A6BFB1CAA47E3F142\ 8F4EF3D55DA9593408A60CAAC3058FCB5520C86D6B5A127A2D711180313690B79EDBFDC16EB8\ 3496C458426F00B56F5DA2AE368A297A76E2F6E86974FAD93297E55269E03E59EE09EEAC0DF0\ 2655DFECF618C83575EC012F36D6BB05196CF85D49F82D99C5DD164AC87AD9C5AE7698B721AA\ 293A63EF98535F7547BB044A3EAF9E9F3970DDB3DFB6E1BACB4A457E7D8D63780BEA7CBB1068\ D66123C401ACDC047E0819A4BCAC745C2F4EFFDE8249B1FDC0428972EA8FBAA981F004C7CB4F\ 652326E43819BFF7530D44D8B42E52CB52EF56E897DCBAEFEE5984E9369E3EE7BFE5EC40FCC7\ 30E2C15C05D6319483329E117B79F94E441F1F4BF0814501418AA5349EFBD62F7CA3E5E67257\ D9FB373C8D3DAF0080493F181EEFBC69C5B9F8D2EADD3D9D18774CF76C2C063C9B487FDBDB12\ A9B5A104D1B6B5C4081E6A83EDDDAB5026EC6A5236D2360550372AD28461A60D9E5ECE6E1005\ 405252035365C61DA77ECB6126C7CCE1A5F1F2B5E8B53A50A49B6626159175623A537D0593FA\ 142194E7F137A88950B5BBE35B30DAE7A6375831FA9A3AF07E35A0C92BB60EECAD8F6AFD225C\ D68B7F77BB8D96CF9225324527F5575A17CC29C380650B1D6C8A4F273FD3492A30EEA845B028\ 3EFD0DC9E7D2F241E77218342F4B263855D3C4DBA5279891BDE280942CA5F39A48A73A605F65\ 42E64B8D234DBBF3765A6A142E20EF90D4D30F5C93B243E39D86411A5EC1C04D0BAF7157:\ 1587639AD9EB4304EA3BDB1B51BD4A3E928941107B3E4D0BD637C39676F1EC92F01B7139A4A2\ 5AA3060945143EC36BF7A6D38478ACC037988AB7D334C8DE4D0C4163F8F8180A0B45CA17BA0E\ 4D850E169DD0DA41EBF7EBD08B6E059AA7E5012286BBA63201F44129C0B214C31E338C0924BA\ E2552EA450659AA96464B34250DE693E4A1B917B63EBD1528BFF6DEC61BB70E84309245195D6\ 4E9B30A880CCFAD7E39EB3C526E657DDD41183A13E16C23B9E18194F14372EACB8DFB31B6DC4\ 18614C4A2679C1D101A4259DB50781795C55FDFEBA2A5621831A2142461D3BCF80799DBFCD41\ 26C85398EFD911F7039C62A32667C4067E155C1BD9DEB210E6006FAE5DB67ADDA8EDBE2DEC75\ B5BBA1570C2CF3E3118C0DB8E5890A94708A9C089BA5822CA7F59F897DE20020DE3EC4F6D092\ DE2159A93367083FB15A302F5113F49A521BA8C863161080EBF49FB603990D1F920FF5C23455\ E1560C1D54E5E7E4227DD35E86298E12B344FB30F1F9565382E073A2946D7AC8B3CB903D7649\ 01A04E79F5F09E563E6A84FBF60EC88990ABFC71B071997FB6024F1BE56B94159EDEF135EB59\ FE37EEE584BF4E066D014CEF83151103C21B64D623B115F84E0ACC52435DEA7D39C11A68B608\ 332C56CA5B9CF0EFFE59040FC386F947170D22F2453A8EB948E3FEA25CD482A4822335005DFF\ 5A6ECA44221231E7EE7CA8AF990346B049AF59A95CEB2A7C884A5DEF765BF8D837817F4019C0\ C323B2087159CAF7B9E6EA2678DAE509B4C607134F6293DD2591DDEB92D9884D96295A811593\ 89D44CE9617921842F6D7249738500F3CF2B73EFA762B9EB399F8E2DB5B29EFD71F1A6AF0B37\ 97DFA41651947F330361A5AC495C0D3A2B9E4F34FA5D186CD946EDE0665F861EF99AC831F0D6\ 7351E848D9C9FBB74EB97F4CE03B5B9D70C103A7530063C4A7A3EE331F9A6314335E1B433D77\ D158AA36563ED4DA4CDB9B635C5EFBC5B7A840A6F74B0DBD906D949BD419FC7503AD21E285B2\ EB01BD7123BF7AF375D05DAAD012121310CA7A9A5ACDA2218D5FBA47596F2BA86FFB59090040\ 40CEA480E2EC50AF9953D379CAD0A00E375CF4AF2F225C4C66B2BC26F751B3FF35512CAB8B94\ 4A5120EBFE7606281BB53C7AA3CD5012592638A9C6B8D855264940A980DB68FAD2441691384A\ C8ECB31C6529787B5B51B534E94F1DD21E75E8D666F74485642BF4FFFBA1DB6D8D4F40442127\ 6BF1CC7B5AFF5E57241B1E14BBC4DE84B137EF7BC9E1434DD36FB9A91B551E82A9E82F87FB53\ 665DE96A33B5B3871EF88A18560AF91C050AB6476700C7FBBA84F861E1A738691BE2BCE485C6\ FD4E6D958CDE8DA49BC4B2ED3ACA18D12E8802967BAD848CE3C5CCD25B4941BC96B0FBFC745E\ 802D86C8E11642F3A0C2AA1026ED148D15D4EA27D68B26F7A73A15F05C056A68FD8D1D3A:\ FD7760119A0432CB5928F24CB65E989B523B540161A3703E2E9370EEF544 BEC2A17A991E96730F4189382AA0D0B9FB9F3DC9478D3DA9BE077815332DD60D74A5B06E2EE8\ 91E2DE94FB011BDBAFDD287053B792FE58B6C0DDAA56731A160CFF5140FBB15AC775C99E5265\ 42D2F885902869689561B6CC222F216231537665F3055258B99CAF7E24A756AA64F9F5F93C7B\ 9C790F0F56C83CF32F265C75A1FE60A0D03E2AAEFA99EBF6F3B5C3FF6D12CC8C8D1BD9F13EA6\ E3EE9C41963824CAB090305A928B7732F96C8538489AC959AA38CCA32669D3477E25102349C0\ 59E47DF8CF161E174B75918249D61F5F8BC5F5010B48A84484AEE8149822750112052557DBD2\ FB46C741338C1AC533FED2B753906A47AD8FEC3853BA882A35461FA5BFD649DC1349FC9D8A04\ 117029FD146E54B4B434AF5ABCD0194C226FF3AF3FE22070DF5FE6B927D27AC30B3CC304FEB8\ A8F087ED668700E1268AE6B2A575E44ADA0BED14592410F4252585A2559F6A59E4E226F53F5B\ 4DB4A9F886E6BC044580B20EE79D5EFB6C035DB9D24A2684286071DBCDD5BEBD4B38DBE2F990\ E7D0C30E4BECD54607D673A6FE226946D54BF84F11E4B10FD44C7EA79AD5A523BF38CF23D856\ 311AFE8BE54A9E417CAB529A77BB210AA8E3DD8C0A9F810FDBDD9F7EF1726F489F907BB6AC2B\ AA5E6B7CBFFD864B8B47E91D0CEAB50ABA28245A1A93C3C6A3B0A907F678F2424FEE8C25FE94\ AE69C454158F8ABD844F499F4BD39ECE28DDDB373C8A1C40C0B060927C7A879E1FD03876830A\ 7C2A67E9AAD1AD7B41B960C27D0912039FCA6E49075D1CC86619AD7A8FEC8422BF3AF1DFCB45\ E2826D96DDCD8616FF4EB4CBCF2634104A09250739D6FE762CD05619A9D552D33B8AAF54CB8B\ 9AE834DC2EC340530DFD16D8E122F46092B03CEBD8AC54B70D0157F0D30DD4F1CA25EDB7F527\ 741AC5DC48E2AC752BFF7CEB19FC1618008A4F622C9DC1B29B4CC13C2170E7F771ABF40D3A63\ 4FAF580D97A3D7F7014EFD71425639EA7E026557123C347B3E2E57C7A7BF14BAB4B86EA05B2C\ 7DDA0787F4DD4EDE1A2F7675DAE9661E3F13D200FDBC64649B977BBA5AAFE6DEF9EE606E3152\ 675144015D012B663C219434A9F413E4331503B0EE68B7D53C71CD30429A33A6FC421C3EF8CF\ 7C63954B071D36A0EA1A9973C0BEF37DF9FF62C3FE6C9CF9D5F040CA663EFE4D9501CBA1F9EC\ 71F55DA295954E119A2172252618EB74DA2A931AC8532F9745BD6FF660E9E851D58976882ABE\ 61ED14DA8B2C0AB5A16EF9CC949B1F8854103F4D8C55E02802E9CAC30D0B0C8D5FE26D987BA7\ F63C195FC376DA3C0518D2B8D9D7CA945EAF8ABE2BEF78F99FA8EF19133FABB845BA842E1CA8\ 6927207452C129FA12ADCCA3E4752635675C4226B473749817E57986BE452B67F9D6D8845EFA\ 0B1642905D0A9A1FDD6F4741111E578370095FF5623EDBD4DD92D7C4A9E51AC4660FA2E4:\ 27E92D9318FB1F44542B1FE1D040204690E57E289012A86D785E230A6A473A0CC3FF61846382\ 6C5A6BE0EC29A42424539114D11325B75D7F84B8BEAE7AE78122AC69E8537FF94D1E5514F12D\ 5B2A985DE39B68996471E15FE5AB14E533D36D61EEC01B70EA9749BB431AB9533D1DD1DCE6D5\ 69696057DC693C0BCAA9BF18DB7B6DB009230D492D01E7FF2DECD0BEF61E4425E1706FD396FD\ 2203818AF5EC5833BB7C902D325F47E3ADD947DFD7F7773CB791C7878FFF63916FC373642F38\ B3200780C9831D8C173389AE404C6ACB29E844B96487B8F59B4A5C64CD03F1BB0AE9F5200E3B\ C642D2FCF3A422FADAC4A23788B44B4D085D25C346A381D43782BA28240AC89C75BE6E346E0C\ 098CC65D785D3B522EA3F03DA743D84471A2FDA73B637A849C0D924CE9DE42E74F77AAEBC64E\ 844E69FAC8D1125AEF4770957ECBCB1E7F3183780E30B188101D598D7F89FA6A8B32051C3D44\ 6F9DF12A850F418282F819CDD06A95B0A08FCAACAB87D1D9CC91FCB3A762EA11427CA8045C6E\ AED46D823E6813D2C1C9D496B726A3F06DE1C5D70B943CC41E39D7904105875E9D6D1571D07C\ 3FD63007A759210CF93D8581529D0C3CE80CC60EBDBE318DBF63F914F1BF0E991F51932DCE90\ 08DFF7C6C29EDCCA1836BDADA487BA7080A6D154939FB82A0F41800397576636804E97DDAC08\ F36508DF60A2538F0DA657ED17A54AEED2F46A9D924B97C5A8442611D12E140D5584B7375C2E\ 47389F339469022C055E7303A144D63566069DCBF40432EDF8A6693D2764BA19E590114B44FB\ CAD4F1699FDCB64F89AB053D34355915E987F260E09D657283CB7758FE7633143FDBAF479598\ 6A9E480E8448FBB16EA49C51E6359491A5215DE7947E3AE0FF018E8DA065FA6C17AE90D07431\ F8F4B6B956884B3288937F40F72B7A90E36917043C994B354DE67E3DEAAF15B683A62B023BF9\ DC0E6DACA05D75FA9B8A16CCB8802355B0ABDF961B34E18853220E5D01BE63449F002F23799E\ 7989E9EA37BA15B525AA053B200B4AE796DB432242B9EECACAFD1EBBB9037C90D837AF20407B\ 194ECEE1A4D468BB95EA0135C84BDD8079818C822768728CDBEE416FF0B5311A3AD893437D57\ 60A14A94F4ADE9A0C4D7F2CD33AEFB982B8C05E4CD0D8E7C50C9591AC3678E1DB93796004E71\ 9705288C15F8FA49CAB636757ECB0037B852B755B2B519552EC3F1D9EB79676DFB793806043E\ 880319E9781B9702E3A39C80D8DD30A9ACDF993319287ADC774EF961670FBF74EF41CCFC4EBC\ CB2A571945DD5652F7FB85B20C5BA4FB4B7AF0993C4ABE8DF1231DB8E635BF7E6B5F73DA5FDB\ 042E699F68EDA254EAA50E9B180341C1AC72E0DDA1275205AC0AD31388F2D002E3DD3FFE26FB\ 8CF8B69D9728E583B1369F3688AA9F3EC3F1C306836635E3F14F37FC6FDF7FA8578BE943:\ 8B73381DC14BAD9CCA68FD348320642E282C53740BD4E479F9FB21A740C4E4 B5E5EC7969BE71F2CB23A1B3F03683D760849D250CED76939779CB56F68A1FB0C5203E70C709\ AA3BD5F46BEF4810F7A1D5D3DF80C7E887BF8D8AAF851D22A70663CFB11F9FAFF3C7C3CF7989\ A62D3D51A317F5AB3F34E3E666FCEF0AF7565831C148AE441EC5B944267D2A5724225EA7FF93\ B39A3B4840FFE9F379598721C1C8E5C72DFB37999932C75D16C5F43D77199BE6FFC9F19EB8C1\ 9296AE5C06CF2B7263941D6CD40EF0D68E3D4E309E46794EB0CEF97FFC79A2209B49657CA501\ 0257AB977BEB3070192E13672E94C99E8250CBA79BA46A23C1613D46EDEB7DF6D2AF8F092811\ 5CC002103BE69BD1E7BA4D81EC5CEF372DD1A6FE6B2BBD643C04E0C7AFE61BAF19140C0A45A7\ 226D059D66EBAEA5346F6C79B32F234813CA2365D3F45E13F77ADE50C16A216ED9497BCC77AD\ AE50DEDA9636E67504C71D499707951CB28EDCEB16974A7F8015170E7CD9A2962D529EA97877\ 281DDBDAB23988502C46A0F2CDA4700DE1923334CFA6F344F4F8514DEDE2DDC82C0079729840\ A459A59DC89C57FE7CA34784178FDD70D1AD7F46C1D464DCCA8D0D9CFEC542A0689441360C33\ F1EACC4B882DE9BFE1B593459A13B73E86BD8C0B0282C69387B0506FAED80D13A2CD8A61FD55\ 6AA52CA111A250A9759B65C9815E8917A81248E47F7AB963A5D26ED23F07F1DC07F74490F97F\ 0EE79AC55532855E44BF85AC6870ECDB6EB454F04332297D1A219E76CDD92BAC023036C580F3\ 311D5255201F6617AD800A7C1BD4E0014AB554840B72BC2E6492CF27E246DFEEBFA679789260\ 0B13CDDC4B71F644492950476B21315B6BB6599355EB2ED3B41DEDAEC9915803204A77B2BA17\ F5EE77143D62939326C6B0E47D013C8B4CA35EFD56969CD9922DF373DA3361692F2215D1D79A\ 620179B399ED509B75D64229E678D50BA5DE297D4E3F43E63910BDE9F50D81477C4204205F74\ 3F94168FE1B1D49BF0DF9B4CDC54043BB0992D1D8D2DCCA0E2BC3D16BC9750DD2683C8B60313\ E9A8E613DE853B5BAA0A6F987F6E7DD4753E285ED6FF895D521BD38567588F36DCAAE3CFC13E\ A204DA65E1D8FDBDB8406FB10F99C977D2523B0556C989D7A13E4B6CFCE1C92CAD06F513D4E9\ ABF607D88FECECD8C47413ABD8814DE84075C4BD8315EBA45571247DB384BF6C84661B93E4CE\ 7ECAE02CD3B2E5C93F08FD020AC41B583B73E5C1534D5F101058B9EF51BE65959D30E2A74F64\ 3F55A71DAC6441D3C03A117A675F6472AC5BE7C3D05791E85134CB10CD4C8A4F9E62EBFB24DE\ 64FD5713CE856BE832F4D6C409390EDEA43E8B1BBEB195C38478342B33BE0595334B3D0EC5E3\ 92BABACF0052B3686AAE8AF9A9D49093EBDF6507E073EABAD120CAF75A172E08046542B14958\ 8AFBDA53A1713D91980F04E95A048BA7A92B98C4C090A622ED1C9E9BBEE79D1F24E36DA1:\ A497092296A16CBAB0B6A592C33FEAB468D38BC809F666492B55F6A0FA8C02B38856A0ABFDB5\ EB16423C8FE8C50DF5522C27CB55251A8560E25633B97CD00434266786B57AA4CBFF2334D072\ CC32652917F8371F17EEEB05B46B520F97D63EEE0DBEB2FAC94896C49D13EA71EC1D6553B05D\ C266D1C2B8AB82932B5821A5DE558317B0C42DD1CC86DB784564BBAF915F5467701FD7C28C9A\ A51DE741D90FCB60A16FB21504F77E7EDD65CEF98E1C88CDC657BAB27039C3A89A022B18783E\ 65FB6F7DB2D8DB623BCAF56FD94634FCA45C9537BDFA76C6DBA3F4A7F39037C2B935C25DD517\ AA2DA9CD8F5E83AE7D3E95ED63025E925253D1C5FCDBBBF18310954C22CE7851ADFB0527C057\ B51EAA8504082D138DC6569F9736EAB6C11BB0DB9243BBBEE576A1CB9390F92362F7A3581E91\ F27B3B47FA0E2E375584D8B7588BF5B5EF1EC2CA21267685AD9E76B985F5887B0A6E313BE827\ 5E3F7C0BBE87228DFED01E37A7213349150191860B1AD3E20C91DD504C2FF642AB869E4B427B\ 11B1C22A6D1029BCBC7610EDF9B2F4A2834A8897303A9C5A313D7C3B18796CB0F0F968B175D7\ CA252ADF80CFDB258228FB6A1A9AA52F8847E18866C4F1038B28A6A3EB14C51098049C519FFF\ 83136206BE095094C66CF3F683BC5757D2394DE9E0808E42DE433988FF30326AD87C4AE38521\ A2B8E4BE8BD7634FC62FE02E450510A190A767B3475639A86ED3F31230C21B2C9BE5C1285C8B\ 127BF153B2F3D082F4F6B18BC2AC3380BFC4BCAC748C7C8F781F58CD674DA01CC6351C354FA7\ 5879E002A6C95986A516035F6F2A9C50FC8BE5AC79B7E9EBE8FB4F4DFE1683C52C966DBEAC35\ 5965A04F9AA6C91833BD55F508B04100A88FDA58F14E5C260859EC7CB60F625928EDD7CAF8B3\ 490655E234CC511B523C40B56BD07CB9A6A08A3642DA96C3D889C1D95176C9FAF6E28E74A548\ FD6F8C3B0FBCEC237A5BD739A2DCF7EA93943DAB8CB5F228E0C752867E116842EA867AB7FB0B\ 4A6D031E9FEB8780C1318DFDBD6CD335122568E7B7294DD851C800156E13B445D64B22E9CB46\ 49B07E4BA64D2D22387173727EB434AC69D7A3F5580EEED15F7D4F15B6A6B190630C3B4BF6CC\ BE98549152E5E6EF47FD02E5ACAA8D1C7E8621FBA77C4C712C6B91EE273B81C9CB4B0F5C6103\ 03F700C441DEE3C05540B793CD4E72C787F262F711EB788057486250076C2B1F09B93B2DD962\ 098CDEFC48CF50A90DE67B97819FA4248D45BC29B3325C4EC1EF95C9C2B1701190BD7420FEDA\ 9976DDF8CF70AFCAF1A8799738C5311757616764701CECEFF27D2676B1F55E3749751080358D\ D9E9A9125287342FCB08E6BD33C776B0E0E2A6F28A043F52A6508DA1C7F867512E13A64A20DB\ 83D86884B50141254C71B7388F6A7D65EFB2D069A815FECB0970A3300CD5C5AA73776E2A:\ 8E3BE5C3118FA8382BE650BF4727BF6B84F6D962367AB966A072BD5913335457 # This is quite trivial. These were generated by OpenSSL. [MARK-4] 97212EACFDB13D5BBC037B01A81CBB736B8136124E275E2F25823B8B98EDD3C4BF7F6AD52D:\ EA57CEA491D69813935D09E0DED97221B4E909BC5C59CC8C1202BD0E7BA82C53DBD27540D6:\ AAC76CB1CE2BF5144EE9A543328AFB95 87742937D3EB3D9729D4C668273DFF01D6096DE237BCE72B598727935704DE047378453395:\ 120EE944C947D8EAA10A446BD6E65BBC1D5821764262F2129FE2C37B65A38C5FB41D4A27DB:\ 141619BCD6053F33E5D479E32F937222 B0B0488DA6A74775D3C3B3459309D21E20D00798B45EAC2C6FAD29A1A8C1743E744D34D1B5:\ AE1EFEE98A07A2654C42B68FA24065C02714D43EED8C0AB336EFEA1DA1906ACE3586C96DAA:\ A2F81CF25695060C04A2ED2E6F92339A 9BC14F96CEDDCF5440130D170608752B75A2D1BD7227F8CA2B991AFEFEC0EB3B9656ACFA53:\ 953A60AFE169AEAA288638AE7DD5DBC2120418F44470194E6B869584BCAA13D7E0FBA35FC6:\ 4404423C571E0843B8EC4F5B0380EB60 7B083BFA430729619537DF5BF575777CF5A433206CFCB8B175AA4BB5AE46EA82A69A15C2E6:\ 80206B94450FA80D81D44D3E751C8541E15B9DCFBCC05DC6007425E52851DF51B8166A9EF2:\ BD348966C075CE6B78BA2918258538ED [Salsa20] # From linux-2.6.25.9's crypto/tcrypt.h (all zero IVs) 0000000000000000000000000000000000000000\ 00000000000000000000000000000000000000:\ 2DD5C3F7BA2B20F76802410C688688895AD8C1BD4\ EA6C9B140FB9B90E21049BF583F527970EBC1:\ 000102030405060708090A0B0C0D0E0F:\ 0000000000000000 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000:\ AE39508EAC9AECE7BF97BB20B9DEE41F87D947F828913598DB72CC232948565E\ 837E0BF37D5D387B2D7102B43BB5D823B04ADF3CECB6D93B9BA752BEC5D45059\ 1514B40E40E653D1839C5BA092296B5E965B1E2FD3ACC192B1413F192FC43BC6\ 95464554E975030844AFE58A811209:\ 1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A:\ 0000000000000000 # From Crypto++ via Linux kernel 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\ 404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F\ 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\ 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F\ A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF\ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF\ E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF\ 000306090C0F1215181B1E2124272A2D303336393C3F4245484B4E5154575A5D\ 606366696C6F7275787B7E8184878A8D909396999C9FA2A5A8ABAEB1B4B7BABD\ C0C3C6C9CCCFD2D5D8DBDEE1E4E7EAEDF0F3F6F9FCFF0205080B0E1114171A1D\ 202326292C2F3235383B3E4144474A4D505356595C5F6265686B6E7174777A7D\ 808386898C8F9295989B9EA1A4A7AAADB0B3B6B9BCBFC2C5C8CBCED1D4D7DADD\ E0E3E6E9ECEFF2F5F8FBFE0104070A0D101316191C1F2225282B2E3134373A3D\ 404346494C4F5255585B5E6164676A6D707376797C7F8285888B8E9194979A9D\ A0A3A6A9ACAFB2B5B8BBBEC1C4C7CACDD0D3D6D9DCDFE2E5E8EBEEF1F4F7FAFD\ 00050A0F14191E23282D32373C41464B50555A5F64696E73787D82878C91969B\ A0A5AAAFB4B9BEC3C8CDD2D7DCE1E6EBF0F5FAFF04090E13181D22272C31363B\ 40454A4F54595E63686D72777C81868B90959A9FA4A9AEB3B8BDC2C7CCD1D6DB\ E0E5EAEFF4F9FE03080D12171C21262B30353A3F44494E53585D62676C71767B\ 80858A8F94999EA3A8ADB2B7BCC1C6CBD0D5DADFE4E9EEF3F8FD02070C11161B\ 20252A2F34393E43484D52575C61666B70757A7F84898E93989DA2A7ACB1B6BB\ C0C5CACFD4D9DEE3E8EDF2F7FC01060B10151A1F24292E33383D42474C51565B\ 60656A6F74797E83888D92979CA1A6ABB0B5BABFC4C9CED3D8DDE2E7ECF1F6FB\ 00070E151C232A31383F464D545B626970777E858C939AA1A8AFB6BDC4CBD2D9\ E0E7EEF5FC030A11181F262D343B424950575E656C737A81888F969DA4ABB2B9\ C0C7CED5DCE3EAF1F8FF060D141B222930373E454C535A61686F767D848B9299\ A0A7AEB5BCC3CAD1D8DFE6EDF4FB020910171E252C333A41484F565D646B7279\ 80878E959CA3AAB1B8BFC6CDD4DBE2E9F0F7FE050C131A21282F363D444B5259\ 60676E757C838A91989FA6ADB4BBC2C9D0D7DEE5ECF3FA01080F161D242B3239\ 40474E555C636A71787F868D949BA2A9B0B7BEC5CCD3DAE1E8EFF6FD040B1219\ 20272E353C434A51585F666D747B828990979EA5ACB3BAC1C8CFD6DDE4EBF2F9\ 0009121B242D363F48515A636C757E879099A2ABB4BDC6CFD8E1EAF3FC050E17\ 2029323B444D565F68717A838C959EA7B0B9C2CBD4DDE6EFF8010A131C252E37\ 4049525B646D767F88919AA3ACB5BEC7D0D9E2EBF4FD060F18212A333C454E57\ 6069727B848D969FA8B1BAC3CCD5DEE7F0F9020B141D262F38414A535C656E77\ 8089929BA4ADB6BFC8D1DAE3ECF5FE071019222B343D464F58616A737C858E97\ A0A9B2BBC4CDD6DFE8F1FA030C151E273039424B545D666F78818A939CA5AEB7\ C0C9D2DBE4EDF6FF08111A232C353E475059626B747D868F98A1AAB3BCC5CED7\ E0E9F2FB040D161F28313A434C555E677079828B949DA6AFB8C1CAD3DCE5EEF7\ 000B16212C37424D58636E79848F9AA5B0BBC6D1DCE7F2FD08131E29343F4A55\ 606B76818C97A2ADB8C3CED9E4EFFA05101B26313C47525D68737E89949FAAB5\ C0CBD6E1ECF7020D18232E39444F5A65707B86919CA7B2BDC8D3DEE9F4FF0A15\ 202B36414C57626D78838E99A4AFBAC5D0DBE6F1FC07121D28333E49545F6A75\ 808B96A1ACB7C2CDD8E3EEF9040F1A25303B46515C67727D88939EA9B4BFCAD5\ E0EBF6010C17222D38434E59646F7A85909BA6B1BCC7D2DDE8F3FE09141F2A35\ 404B56616C77828D98A3AEB9C4CFDAE5F0FB06111C27323D48535E69747F8A95\ A0ABB6C1CCD7E2EDF8030E19242F3A45505B66717C87929DA8B3BEC9D4DFEAF5\ 000D1A2734414E5B6875828F9CA9B6C3D0DDEAF704111E2B3845525F6C798693\ A0ADBAC7D4E1EEFB0815222F3C495663707D8A97A4B1BECBD8E5F2FF0C192633\ 404D5A6774818E9BA8B5C2CFDCE9F603101D2A3744515E6B7885929FACB9C6D3\ E0EDFA0714212E3B4855626F7C8996A3B0BDCAD7E4F1FE0B1825323F4C596673\ 808D9AA7B4C1CEDBE8F5020F1C293643505D6A7784919EABB8C5D2DFECF90613\ 202D3A4754616E7B8895A2AFBCC9D6E3F0FD0A1724313E4B5865727F8C99A6B3\ C0CDDAE7F4010E1B2835424F5C697683909DAAB7C4D1DEEBF805121F2C394653\ 606D7A8794A1AEBBC8D5E2EFFC091623303D4A5764717E8B98A5B2BFCCD9E6F3\ 000F1E2D3C4B5A69788796A5B4C3D2E1F0FF0E1D2C3B4A5968778695A4B3C2D1\ E0EFFE0D1C2B3A495867768594A3B2C1D0DFEEFD0C1B2A39485766758493A2B1\ C0CFDEEDFC0B1A2938475665748392A1B0BFCEDDECFB0A192837465564738291\ A0AFBECDDCEBFA091827364554637281909FAEBDCCDBEAF90817263544536271\ 808F9EADBCCBDAE9F807162534435261707F8E9DACBBCAD9E8F7061524334251\ 606F7E8D9CABBAC9D8E7F60514233241505F6E7D8C9BAAB9C8D7E6F504132231\ 404F5E6D7C8B9AA9B8C7D6E5F4031221303F4E5D6C7B8A99A8B7C6D5E4F30211\ 202F3E4D5C6B7A8998A7B6C5D4E3F201101F2E3D4C5B6A798897A6B5C4D3E2F1\ 00112233445566778899AABBCCDDEEFF102132435465768798A9BACBDCEDFE0F\ 2031425364758697A8B9CADBECFD0E1F30415263748596A7B8C9DAEBFC0D1E2F\ 405162738495A6B7C8D9EAFB0C1D2E3F5061728394A5B6C7D8E9FA0B1C2D3E4F\ 60718293A4B5C6D7E8F90A1B2C3D4E5F708192A3B4C5D6E7F8091A2B3C4D5E6F\ 8091A2B3C4D5E6F708192A3B4C5D6E7F90A1B2C3D4E5F60718293A4B5C6D7E8F\ A0B1C2D3E4F5061728394A5B6C7D8E9FB0C1D2E3F405162738495A6B7C8D9EAF\ C0D1E2F30415263748596A7B8C9DAEBFD0E1F2031425364758697A8B9CADBECF\ E0F102132435465768798A9BACBDCEDFF00112233445566778899AABBCCDDEEF\ 001326394C5F728598ABBED1E4F70A1D304356697C8FA2B5C8DBEE0114273A4D\ 60738699ACBFD2E5F80B1E3144576A7D90A3B6C9DCEF0215283B4E6174879AAD\ C0D3E6F90C1F3245586B7E91A4B7CADDF00316293C4F6275889BAEC1D4E7FA0D\ 203346596C7F92A5B8CBDEF104172A3D506376899CAFC2D5E8FB0E2134475A6D\ 8093A6B9CCDFF205182B3E5164778A9DB0C3D6E9FC0F2235485B6E8194A7BACD\ E0F306192C3F5265788B9EB1C4D7EAFD102336495C6F8295A8BBCEE1F4071A2D\ 405366798C9FB2C5D8EBFE1124374A5D708396A9BCCFE2F5081B2E4154677A8D\ A0B3C6D9ECFF1225384B5E718497AABDD0E3F6091C2F4255687B8EA1B4C7DAED\ 00152A3F54697E93A8BDD2E7FC11263B50657A8FA4B9CEE3F80D22374C61768B\ A0B5CADFF4091E33485D72879CB1C6DBF0051A2F44596E8398ADC2D7EC01162B\ 40556A7F94A9BED3E8FD12273C51667B90A5BACFE4F90E23384D62778CA1B6CB\ E0F50A1F34495E73889DB2C7DCF1061B30455A6F8499AEC3D8ED02172C41566B\ 8095AABFD4E9FE13283D52677C91A6BBD0E5FA0F24394E63788DA2B7CCE1F60B\ 20354A5F74899EB3C8DDF2071C31465B70859AAFC4D9EE03182D42576C8196AB\ C0D5EAFF14293E53687D92A7BCD1E6FB10253A4F64798EA3B8CDE2F70C21364B\ 60758A9FB4C9DEF3081D32475C71869BB0C5DAEF04192E43586D8297ACC1D6EB\ 00172E455C738AA1B8CFE6FD142B425970879EB5CCE3FA11283F566D849BB2C9\ E0F70E253C536A8198AFC6DDF40B223950677E95ACC3DAF1081F364D647B92A9\ C0D7EE051C334A61788FA6BDD4EB021930475E758CA3BAD1E8FF162D445B7289\ A0B7CEE5FC132A41586F869DB4CBE2F910273E556C839AB1C8DFF60D243B5269\ 8097AEC5DCF30A21384F667D94ABC2D9F0071E354C637A91A8BFD6ED041B3249\ 60778EA5BCD3EA01182F465D748BA2B9D0E7FE152C435A71889FB6CDE4FB1229\ 40576E859CB3CAE1F80F263D546B8299B0C7DEF50C233A51687F96ADC4DBF209\ 20374E657C93AAC1D8EF061D344B627990A7BED5EC031A31485F768DA4BBD2E9\ 0019324B647D96AFC8E1FA132C455E7790A9C2DBF40D263F58718AA3BCD5EE07\ 2039526B849DB6CFE8011A334C657E97B0C9E2FB142D465F7891AAC3DCF50E27\ 4059728BA4BDD6EF08213A536C859EB7D0E9021B344D667F98B1CAE3FC152E47\ 607992ABC4DDF60F28415A738CA5BED7F009223B546D869FB8D1EA031C354E67\ 8099B2CBE4FD162F48617A93ACC5DEF71029425B748DA6BFD8F10A233C556E87\ A0B9D2EB041D364F68819AB3CCE5FE173049627B94ADC6DFF8112A435C758EA7\ C0D9F20B243D566F88A1BAD3EC051E375069829BB4CDE6FF18314A637C95AEC7\ E0F9122B445D768FA8C1DAF30C253E577089A2BBD4ED061F38516A839CB5CEE7\ 001B36516C87A2BDD8F30E29445F7A95B0CBE6011C37526D88A3BED9F40F2A45\ 607B96B1CCE7021D38536E89A4BFDAF5102B46617C97B2CDE8031E39546F8AA5\ C0DBF6112C47627D98B3CEE9041F3A55708BA6C1DCF7122D48637E99B4CFEA05\ 203B56718CA7C2DDF8132E49647F9AB5D0EB06213C57728DA8C3DEF9142F4A65\ 809BB6D1EC07223D58738EA9C4DFFA15304B66819CB7D2ED08233E59748FAAC5\ E0FB16314C67829DB8D3EE09243F5A7590ABC6E1FC17324D68839EB9D4EF0A25\ 405B7691ACC7E2FD18334E69849FBAD5F00B26415C7792ADC8E3FE19344F6A85\ A0BBD6F10C27425D7893AEC9E4FF1A35506B86A1BCD7F20D28435E7994AFCAE5\ 001D3A577491AECBE805223F5C7996B3D0ED0A2744617E9BB8D5F20F2C496683\ A0BDDAF714314E6B88A5C2DFFC193653708DAAC7E4011E3B587592AFCCE90623\ 405D7A97B4D1EE0B2845627F9CB9D6F3102D4A6784A1BEDBF815324F6C89A6C3\ E0FD1A3754718EABC8E5021F3C597693B0CDEA0724415E7B98B5D2EF0C294663\ 809DBAD7F4112E4B6885A2BFDCF91633506D8AA7C4E1FE1B3855728FACC9E603\ 203D5A7794B1CEEB0825425F7C99B6D3F00D2A4764819EBBD8F5122F4C6986A3\ C0DDFA1734516E8BA8C5E2FF1C39567390ADCAE704213E5B7895B2CFEC092643\ 607D9AB7D4F10E2B4865829FBCD9F613304D6A87A4C1DEFB1835526F8CA9C6E3\ 001F3E5D7C9BBAD9F81736557493B2D1F00F2E4D6C8BAAC9E80726456483A2C1\ E0FF1E3D5C7B9AB9D8F71635547392B1D0EF0E2D4C6B8AA9C8E70625446382A1\ C0DFFE1D3C5B7A99B8D7F61534537291B0CFEE0D2C4B6A89A8C7E60524436281\ A0BFDEFD1C3B5A7998B7D6F51433527190AFCEED0C2B4A6988A7C6E504234261\ 809FBEDDFC1B3A597897B6D5F4133251708FAECDEC0B2A496887A6C5E4032241\ 607F9EBDDCFB1A39587796B5D4F31231506F8EADCCEB0A29486786A5C4E30221\ 405F7E9DBCDBFA1938577695B4D3F211304F6E8DACCBEA0928476685A4C3E201\ 203F5E7D9CBBDAF91837567594B3D2F1102F4E6D8CABCAE90827466584A3C2E1\ 00214263:\ B581F5641873E3F04C13F2771860655E2901CE985553F90C2A08D509B3575556\ C5E95690CB6AA3C0FFC479B4D2975DC443D1FE947B88065AB29E2CFC4403B790\ A0C1BA6A33B8C7B29DE1124FC064D401FE8C7A66F7E65A91BBDE5686AB652130\ 00846524A57D85B4E317ED3AB76FB40B0BAF15AE5A8FF20C2F27F409D8D296B7\ 71F2C5994D7E7F757789308B59DBA2B2A0F319392BC57E3F4FD9D356289744DC\ C08B7724D952E7C5AFF67D59B244051DB1B011A50FEC33E16D1B4E1FFF5791B4\ 5B9A96C553BCAE203CBB14E2E82233C15E769E4699F62A15C69702A06643D1A6\ 31A69FFBF4D369E5CD7695B87A827F2145FF3FCE55F6951008771043C6F309E5\ 68E73CAD0052450DFE2DC6C2948C121DE625AE98128E199C8168B111F669DAE3\ 6208187A254928ACBA71120BE4A2E5C75D8EEC494021BF5A98F3026855037F8A\ E5940C325C078263AF6F9140848E5225D0B0295305E2507A34EBC94620A83DDE\ 7F165F36C52EDCD11547C750406D91C5E793951AD357BC5233EE1419225289A7\ 4A2556774BCACF0AE1F53585307E594ABD145BDFE346CBAC1F6C960EF481D199\ CA88633D02586BA9E59FB300B254C6741CBF46AB97CCF85404070852E6C0DA93\ 747D93995D7868A62E6BD36A69CC126BD4C7A5C6E7F603045DCD615E1740DCD1\ 5CF508DF5C9085A4AFF678BB0DF1F4A45426729E61FA86CFE89EA1E0C74823AE\ 5A90AE750A74188905B192B27FD01BA662072501C7C24FF9E8FE63958007B426\ CCD126B6C43F9ECB8E3B2E4416D3109A9508EBC8CBEBBF6F0BCD1FC8CA86AAEC\ 33E669F44525863A22944F00236A44C2499733AB36140A7024C3BE043B79A0F9\ B8E776292283D7F294F44149BA5F7B07B5FBDB031A9FB64CC22E374049C33816\ E24F7782B0684C711D57619CD94E5499471328733CBB0090F34DC90EFDE7B171\ D31579BFCC262FBDAD6C50696C3E6D809AEA78AF19B20D4DAD0407AE22904A93\ 320E369B1B46BA3BB4ACC6D1A231533B2A3D45FE036110851769A678CC6C8749\ 53F98010DE80A2416AC33202AD6D3C5600715106A7BDFBEF3CB59FFC487D537C\ 66B04923C447100EE56C7413E6C53FAADEFF0744DD561BAD0977FB5B12B80D38\ 1737357B9BBCFED47E8BDA7E5B04A722A731A12086C71B99DBD189F494A35369\ 8DE7E874118D74D60737919FFD67503AC9E1F436D5A047D1F9E539A331AC0736\ 23F866181428340FB8D0E729B3044B550141B2758DCB96853AFBAB2B9EFA5820\ 441FC014227561E8AA19CFF18256F4D7787B3D5FB39E0B8A5750DB1741654DA3\ 02C99C9C53FB39399B1D7224DAB739BE133BFA29DA9E54646EBAD8A1CBB336FA\ CB4785E96138BCBEC500382A54F7C4B9B3D37BA0A0F8727F8C8E820EC61C759D\ CA8E6187DEAD80D2F5F980EF1575AFF580FBFF6D1E25B740616A395A6AB531AB\ 978A19894440C0A6B44E30327B13E767A98B5704C201A6F42899AD2C76A378C2\ 4AE6CA5C506AC1B0624B108E7C1743B317661C3E8D69F05A71F597DCD145DD28\ F35DDF537B11E5BC4CDB1B516BE9FB3DC1C32CB971F5B6B21336798053E8D3A6\ 0AAFFD5697F7408E45CEF8B09E5C3382B04456FC0509E92AAC2680141DC83A35\ 4C8297FD76B7A90A3558798E0F66EAAF516C09A96E9BCB9A3147A02F7C71B44A\ 11AA8C66C564E63A54DA246AC441654682A00A0F5FFB25D02C91A7EEC4810786\ 755E336997E42CA89D9F0B6ABEAD98DA6D9441DA2C1E89C4C2AF1E00050B8360\ BD43EA15237FB9ACEE4F2CAF2AF3DFD0F31931BB4A74841752322C7D61E4CBEB\ 80381552CB6FEAE5739CD92469C6953221C811E4DC36D7933866FBB27F3AB9AF\ 31DD9375788A2C94871A58EC9E7D4DBAE1E54DFCBCA42A14EFCCA7ECAB430918\ D3AB68D107994447D683853B30EAA96B63EAC407FB432FA4AAB0AB0389CE3F8C\ 027C8654BC88AF75D2DC6317D326F696A93CF1618C1118CCD6EA5BE2CDF0F1B2\ E535901F854C765B66CE44A4329FE67B716E9F5815677287648E3A4445D476FA\ C2F6EF8505187A9BBA4154ACF0FC59123FDFA0E58A65FD3A628D832C03BE0576\ 2E5349979433AE408115DB6EADAAF54BE39870DFE07CCDDB02D47D2FC1E6B4F3\ D70D7AD9239E872DCE87ADCC72050029DC737F64C1150EC2DFA75FEB41A1CDEF\ 5C50792A5656718CACC0795069CA593265F254E4523876D15EDE269EFB752E11\ B510F41773F589C74F435C8E7CB90552244099FE9B850B6C223E8BAE86A1D279\ 05686BABE34149ED15A18D402D61DF1A59C9268BEF304C884B10F88DA6929F4B\ F3C4530B895D2892CF78B2C05DED7EFCC012235F5A7886436E27F75AA76AED19\ 04F0B312D1BD0E896EBC96A8D849399F7E67F02E3E01A9BAEC8B628ECB4A7043\ C7C2C4CA820373E911DFCF54EAC9B09551C0133D9205FAF4A934C8CE6C3D54CC\ C4AFF1DC114426A2AFF185757D0361684E78C6927D867D77DC7172DBC6AEA1CB\ 709A0B19BE4A6C2AE2BA6C649A1328DF8575E643F68708686EBA6E799F04BC23\ 50F6335C1F2425BE3347804556A3A7D77AB1340B903C9CAD445F9E0E9DD4BD93\ 5EFA3CE0B0D9EDF3D62EFF24D8716CEDAF55EB22AC936832055B47DDC64ACBC7\ 10E13C921AF323782BA1D280F412B1208FFF2635DDFBC74E78F12D501277A860\ 7C0FF5162F63702AC096804E0AB493355D1D3F56F72FBB9011168FA2EC47BEAC\ 56012656B18CB210F91ACAF5D1B7392063F169204F13121F5B65FC98F7C47ABE\ F7264D2B847B42ADD87A0AB4D874BFC1F06EB429A3BBCA4667706A2DCE0EA28A\ A987BF05C4C104A3ABD445438CB602B041C8FC443D59AA2E44212A8D889D57F4\ A00277B8A6A0E6755C82653E035C298F3855AB3326EF9F4352FD68AF36B4BB9A\ 5809091BC36546461DA7941823502CCA2C551997019D933B6386F2036745D272\ 28526CF4E31CB51113F1EB21C7D956822B8239BD6954ED62C3E2DE73D46A12AE\ 13217F4B5BFCBFE82BBE56BA688B9AB16EFABF7E5A4BF1AC986585D19353D37B\ 09DD4B106D84B01365BDCF5209C485E284741565B7F751AF55ADA4D122547094\ A01C9041FD99D75A31EFAA25D07F4FEA1D5542E549B0D046623643B282157550\ A472EB54271F8AE47DE966C5F153A4D10CEBB8F8BCD4E2E7E1F84BCBA9A1AF15\ 83CB72D03379002D9FD7F12E1E10E445C0753A39EA68F75D1B738FE98E0F7247\ AE350A317A144D4A6F47F77E916E748B2647F9C3F9DE70F561ABA9279F82E49C\ 89913F2E6AFDB549E9FD59143649406D32D88542F3A5DF0CA827D754E2632FF2\ 7E8B8BE7F19A953543DC3AE4B6F4D0DF9CCB94F321A07750E2C6C4C65F09645B\ 9290D8E1D1ED4B42D737AF653D1139B6248A60AED61EBF0E0DD7DC960E65754E\ 29069DA4513A10638F1707D58E3CF428005A5B0519D8C06CE515E49C9D719D5E\ 94291AA780FA0E3303DDB73E9AA9261837A964084D945A88CA35CE8102E31F1B\ 891A7785E3416D324219237DC873EE25850DF83125791B6F7925D2D8D423FDF7\ 82366A0C462215E9FF724191917D3AB7DD659970F68D84F867152011D6B2557B\ DB87EEEF55892A592B078F438A593C018B6554A166D538BDC630A9CC49B6A81B\ B8C00EE34528E2FF419F7E7CD1AE9E253F4C7C7CF4A8264D5CFD4B2718F96176\ 48BA0C6BA94DFCF53B357E2F4AA9C29AAEAB860989C9C240392C81B3B81767C2\ 0D324A3A6781D71A3452C5DB0AF56339EA1FE17CA19EC135E3B1184567F92238\ 95D9343486C6419415F95B41A6878BF8D5E11BE25BF38610FFE6AE6976BC0DB4\ 09900CA2650CAD74F5D7FFDAC1CE85BE00A7FF4D2F65D38C862D05E8ED3E6B8B\ 0F3D838CF11D5B962EB19CC298E170B9BA5C8A43D634A72DC992AEF2A57B0549\ A7333486CAE49623765BF2C6F15128427BCC768FFAA2AD31D4D67A6D252554E4\ 3F5059E15C05B72748BF07EC1B13BE2BA1572BD5ABD7D04C1ECB719BC59085D3\ DE59EC71EB89BBD00950E1163FFD1C34C31CA110775398EFF2FDA50159C29B26\ C742D949DA582B6E9F5319767ED9C90E68C87F512242EF49A455B636AC09C731\ 88154B2E8F3A08F7D8F7A8C5A933A645E4C49476F30D8F7EC8F6BC230AB64CD3\ 6ACD36C2905C5C3C657BC2D6CCE60D87732E7179160663280915D88938383DB5\ 421C0824F72AD29DC8CAEFF927D80786F7430B55153F9F83EFDC499D2AC15462\ BD9B66559FB712F31B4D9D2A5CED87758726EC612CB40F89B0FB2E685D15C78D\ 2EC0D9ECAF4FD22529E8D2262B67E9FC2BA86796121F5B96C61453AF44EAD6E2\ 9498E412934C92E018A58D2DE4713C474CF7E6479EC068DFD4F55A74B12B2903\ 1907AF90625C6898481611029DEEB49BE5427F08FD16320BD0B3FA2BB799F929\ CD20459FB31A5DA2AF4DE0BD420DBC74999C8E531AB43EBDA29A2DF7F8390F67\ 63FC6BC0AFB34B4F55C4CFA7C804113E1432BB1B3877D67F544CDF75F3072D33\ 9BA820E17B12B5F3EF2FCE72E52460C130E2ABA18E1109A8213344FE7F353293\ 39A7AD8B7906B2CB4EA95FC7BA7429EC93A04E5493C0BC5564F048E55799EE75\ D6790F66B7C65776F7B7F39CC560E87F8376D60EAAE690391DA6326A34E355F8\ 58A0587D33E02239446487865A2FA77E0F38EAB030CC61A56A32AE1EF7E9D0A9\ 0C324BB54928AB852F8E01363852D0BAD60278F80E3E9C8B6B45993F5CFE58F1\ 5C9404E1F5186D51B25D1820B6C29A421DB3AB3CB63A1303B246824FFC64BC4F\ CAFA9CC0D5A7BD11B7E45AF66F4D4D54EAA49866D4223BD38F3447D97CF4723B\ 4D0277F6D6DD080A81E186893E56103CBAD7818C08BC8BE253ECA789EEC856B5\ 362CB203BA99DD7C48A0B0BC9133E9A8CBCDCF595F1F15E256F54E0135274577\ 47C8BCCB7E39C19728D384FC2C3EC8AD9CF88A619C28AAC5992043859DA5E28B\ B8AEEBD0320D527809563FC7D87E26FC37FB6F04FCFA9210ACF83E21DC8C2116\ 7D676EF6CDDAB69823AB233CB210A0535A569FC5D0FFBBE4983C691EDB388F7E\ 0FD29888818B4567EA33F1EBE997552ED9AAEB5AECDAE168A89D3C847C053D62\ 878F032128950C8925224AB093A950A22F576E184219540C5567C61149F45CD2\ E93DDD8B48712100C39A6C857428834A1B3105E10692E7DA85737845207FAE13\ 7C330622F483F9353F6C71A84E48BE9BCE8ABADABE2808F7E2148C71EA72F933\ F2883FD7BB696C2919DC84CE1F124FC8AFA504BA5AABB0D9141F6C689839897A\ D9D82FDFA8474A25E2FB33F45978E16885CFFE5920D4051D8099AEBCCAAE0F2F\ 6543348E7EACD3932FAC6D143D0207709DA4F31B5C36FC017334850C6CD6F1BD\ 3FDFEEF5D9BA56EFF49B6BEE9F5A786D3219F4F7F84C690B4BBCBBB7F285AF70\ 75246C54A70E4D1D01BF08ACCF7F2CE314895E705A9992CD0184C8D2ABE54F58\ E70F2F0EFF68EAFD15B317E6B0E785D8232E05C7C9C4461FE19E492023244D7E\ 2965FFF4B6FD1A85C416ECFCEA7BD62C43F8B7BF79C085CDEFE198D3A5F7908C\ E97F806BD2AC4C30A7C6616CD2F92CFF30BC22817D9312E40ACDAFDDE8AB0A1E\ 13A427C35FF74BBB37094B916F924FAF52EEDFEF096FF75C6E1217726357C7BA\ 3B6B3832731B9C80C17AC6CFCD35C06B311A6BE9D82C293F96FBB6CD13913BC2\ D2A3318DA4CD57CD133D64FD06CEE6DC0C2443314057F17217E33A636D35CF5D\ 974059DDF73C02F71C7E05BBA90D01B18EC030A95324C989846DAAD0CD91C24D\ 91B089E2BF8344AA287223A0C2ADAD1CFC3F097A0BDCC51B8713C65B598DF2C8\ AFDF1195:\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F:\ 0000000000000000 # XSalsa20, from NaCl via Crypto++ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000:\ EEA6A7251C1E72916D11C2CB214D3C252539121D8E234E652D651FA4C8CFF880\ 309E645A74E9E0A60D8243ACD9177AB51A1BEB8D5A2F5D700C093C5E55855796\ 25337BD3AB619D615760D8C5B224A85B1D0EFE0EB8A7EE163ABB0376529FCC09\ BAB506C618E13CE777D82C3AE9D1A6F972D4160287CBFE60BF2130FC0A6FF604\ 9D0A5C8A82F429231F0080:\ 1B27556473E985D462CD51197A9A46C76009549EAC6474F206C4EE0844F68389:\ 69696EE955B62B73CD62BDA875FC73D68219E0036B7A0B37 093C5E5585579625337BD3AB619D615760D8C5B224A85B1D0EFE0EB8A7EE163A\ BB0376529FCC09BAB506C618E13CE777D82C3AE9D1A6F972D4160287CBFE60BF\ 2130FC0A6FF6049D0A5C8A82F429231F008082E845D7E189D37F9ED2B464E6B9\ 19E6523A8C1210BD52A02A4C3FE406D3085F5068D1909EEECA6369ABC981A42E\ 87FE665583F0AB85AE71F6F84F528E6B397AF86F6917D9754B7320DBDC2FEA81\ 496F2732F532AC78C4E9C6CFB18F8E9BDF74622EB126141416776971A84F94D1\ 56BEAF67AECBF2AD412E76E66E8FAD7633F5B6D7F3D64B5C6C69CE29003C6024\ 465AE3B89BE78E915D88B4B5621D:\ B2AF688E7D8FC4B508C05CC39DD583D6714322C64D7F3E63147AEDE2D9534934\ B04FF6F337B031815CD094BDBC6D7A92077DCE709412286822EF0737EE47F6B7\ FFA22F9D53F11DD2B0A3BB9FC01D9A88F9D53C26E9365C2C3C063BC4840BFC81\ 2E4B80463E69D179530B25C158F543191CFF993106511AA036043BBC75866AB7\ E34AFC57E2CCE4934A5FAAE6EABE4F221770183DD060467827C27A354159A081\ 275A291F69D946D6FE28ED0B9CE08206CF484925A51B9498DBDE178DDD3AE91A\ 8581B91682D860F840782F6EEA49DBB9BD721501D2C67122DEA3B7283848C5F1\ 3E0C0DE876BD227A856E4DE593A3:\ A6A7251C1E72916D11C2CB214D3C252539121D8E234E652D651FA4C8CFF88030:\ 9E645A74E9E0A60D8243ACD9177AB51A1BEB8D5A2F5D700C 093C5E5585579625337BD3AB619D615760D8C5B224A85B1D0EFE0EB8A7EE163A\ BB0376529FCC09BAB506C618E13CE777D82C3AE9D1A6F972D4160287CBFE60BF\ 2130FC0A6FF6049D0A5C8A82F429231F008082E845D7E189D37F9ED2B464E6B9\ 19E6523A8C1210BD52A02A4C3FE406D3085F5068D1909EEECA6369ABC981A42E\ 87FE665583F0AB85AE71F6F84F528E6B397AF86F6917D9754B7320DBDC2FEA81\ 496F2732F532AC78C4E9C6CFB18F8E9BDF74622EB126141416776971A84F94D1\ 56BEAF67AECBF2AD412E76E66E8FAD7633F5B6D7F3D64B5C6C69CE29003C6024\ 465AE3B89BE78E915D88B4B5621D:\ 418078FE843F5984DD3C7975D1FF51AF4DCEDA640999AAA3C28618AE286CA150\ 51CB4D55F9DA22A213EF14A2B905B52C99A557854C7F2A6D6ED6F69C1C6649F3\ FB67B8628468029B3367920C2E1148AA1F3B9C695CB1426F09CE84045842946E\ 0454E41AB1EDB32CAE4B95669DE4E2CCAF00BA86FFEAE6A9C5FCE4153BADDB0D\ 8998A600537A9649939CB7D7A9C4E8CBCA0FAB77963ABD516699879DE0B1971D\ C7328668111FF5B77C253B9E6346D1A2CE6E390CD736156AD7F44B339CFB141F\ 00E7A766C06E130B0C31D88980D2AD8814A2D641599162AB8AF25D93067F06A4\ 9637EAF6523806B8FA07D56628BB:\ A6A7251C1E72916D11C2CB214D3C252539121D8E234E652D651FA4C8CFF88030:\ B2AF688E7D8FC4B508C05CC39DD583D6714322C64D7F3E63 FEAC9D54FC8C115AE247D9A7E919DD76CFCBC72D32CAE4944860817CBDFB8C04\ E6B1DF76A16517CD33CCF1ACDA9206389E9E318F5966C093CFB3EC2D9EE2DE85\ 6437ED581F552F26AC2907609DF8C613B9E33D44BFC21FF79153E9EF81A9D66C\ C317857F752CC175FD8891FEFEBB7D041E6517C3162D197E2112837D3BC41043\ 12AD35B75EA686E7C70D4EC04746B52FF09C421451459FB59F:\ 2C261A2F4E61A62E1B27689916BF03453FCBC97BB2AF6F329391EF063B5A219B\ F984D07D70F602D85F6DB61474E9D9F5A2DEECB4FCD90184D16F3B5B5E168EE0\ 3EA8C93F3933A22BC3D1A5AE8C2D8B02757C87C073409052A2A8A41E7F487E04\ 1F9A49A0997B540E18621CAD3A24F0A56D9B19227929057AB3BA950F6274B121\ F193E32E06E5388781A1CB57317C0BA6305E910961D01002F0:\ 9E1DA239D155F52AD37F75C7368A536668B051952923AD44F57E75AB588E475A:\ AF06F17859DFFA799891C4288F6635B5C5A45EEE9017FD72 F4EA120B47D15466ADE07DF0F2FF508759D9CB1035CEEAB43920E9094FA50B86\ 8673B07173557D4B994B1E9D35078C1C7369DF6B6ADB2EC0E6BFD280FEA8AC31\ DB44BEB0C2A4DDC6198957BD0592E3E587D304863B893FF8EEE0EFC70CED5D71\ 2651C3E9DD1A0DE0480FD8CCCBAE4C50DCCBACB83DCDC3E2CEF7DBC645F0AF46\ 8163FB0E015EF48AD74694DFBCE2DB8430A6E91645FD16ADBB72E21A0FBAEDF5\ ECFF829CEA9CBC22F82902748AA52DA5CE903D9F2BDE77EFEF5FA3970C720E89\ F25DD05157247BF0DE2D2129C3F856238D4FAD:\ 46F396F0D2D54189968BF56B5B2F35588C3AD851E00FAC6507598F3EA0193A58\ 6C00B18677811CC305B0261D9AEBBB9C0485A5800C940AA4F09C4FBDEDE12553\ 824C429C7954E0B8DAD889203D292517B98A64E8D7A37C1364EB0934751323D9\ B9F8498F50D729E977FB742880222F22AC5D7BFEBE6905A4C344D82027398A70\ C334635792DEB0F20B83861B05E731F5627AEE17DF20413C79957556E66A9700\ 85E9AD40A73D9A964381584976C6F111619A916FBB5F5D305DF862D5A56BAC9F\ F9B436F31C85F34FF890B5AD3299EDA2B8642D:\ 3070F0DB09C523507D36404DAC79038A393E9F0E3CF5F870B16D2A06DA68DCD3:\ 4AFE87BF79EB938D786BA54C26FD6D7E62261EEAE8B62202 [Turing] 0000000000000000000000000000000000000000:\ 696626BBDC6E09F6DA9ABAB5B56C14878246DF18:\ 74657374206B65792031323862697473:00000000 000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000:\ B64B97325A32BBAA3A967545D99A50889D7EFAC385A4A20E3C30C87D799DD84173802D01\ 6513022FE0FDCAF79625DA0FF7F66E76DA56926D3115D9F87A939E1C1B27A87386006244\ B1A5360B0E5BAE03FC64C766B348A4FC18C9D95516B4BBE0F4BBAE2B:\ 42A6B922EC35FC7709EAE8CA0F6AA212DFBC0D6C:FFAA3441 000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000:\ 0847AA490901FC9BFB07F12590622DC3E672ADBD42813B79BB28B4C4DDE2A519751363EC\ 00EBEDBB684E4D1FFC02CBDD1FA2E3F8E593AFEE8648461DCC054D32192A6517F41AA4D6\ C3B75DFFBED80CEEA3D28397D6B86722185CA6BABB64088D13A75DFB:\ 53A6B922EC35FC6609EAE8CA0F6AA212DFBC0D7B:FFAA3441F4BBAE2B 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000:\ 833E62C8D5E8B0B723F8ADAC68340288319D6F73762E7655EE35F2AA8E2E21DDEC2C1D2F9C48A1\ BC05DA8E7A87A650114C6A065E21DCE06142D4E6C40B4616AEE65E869C1D3A1040C7DA1A44E6AD\ F49C51B12058824D79B7622614C0F8E1B968F7F99A94959ADF845B7BED3B5771B6F7E30C32C2BB\ A8463B2FFDEE4C4623CB69C66A7AA4E1CFADD429DFFA3F9BFAE9C9CBBA44246765699B2F7211E5\ 4AB6793969835AE9F5EB2F66DA83EE07701031DA84F357B2DE473D7A7952462AB42940294E6349\ C73F6B91BD769E07B0FD9A212D551A66E7D9B7C6F8077D16DEDEF30EA0AF61226DBA8333293870\ C8693C8AF52E5D097CCD94AD9BE287139A5F5AC9E3448A1CA781B068F76B64D362AD99080B38F7\ 5506A5E81BAC8F4BD82A4F35A8526909D35023C3C7D9F13F54CAB1D16413774815F20D07CD98DA\ EA8200D4399C43494F769000C84752A9B95561B23626E8DE135FF44651C7243488C1DCDCEC0A6E\ C8FA9A1A6FF8706EFA6AA8A664727A4BD2EA3416E0631F4911F1D135CA96A227004930D8BD4135\ 56697B941F03519489DEEF118E44F54EADA077F1E253C33740CC79305F869CE1E857D368A7E0AD\ 8F1714FAF0BF4756295E9A5A57BA1CE7DF4CB44C324B62A78534CAA2FE00913638A740AD9225C1\ 6D29096DA4DE452AC6C1A2BF0CF1C5F135A1D214E2730246724A1FB37D7AE6BCFB19F3D191E1C7\ 5B024B8442:\ C3B75DFFBED80CEEA3D28397D6B86722185CA6BABB64088D:\ 0847AA490901FC9BFB07F125 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ A1D8F7780442DCF29F883A8379319273C91B3297E87441290B3121B7FE0F72E68D9D507703159E\ 457942A4F6A7E6C5C0D6B82204FC70605B16641376AD819C8268F208A3E727DE352FC57CAB0DC4\ 2FC9863C9952BEEA6A79D059FA52DCE5BC1815C1E3B2018E3A5CC93E86D162787C9A38B30808:\ 510D879D383902C3A1287F58ABC5FB35 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 8D8EA275C14DB64CB19760D598A38073E3BE840A016889DCCD5387B3052483E8B72AF6FC590FB7\ C2365AE8F64EACDF07163D24EC80F390A714BFD910A15A7187CFFF1CEBB7F9A07E187C5E7D24BE\ 21B468CC90F6387D63FCD4EB8244921395C5104964AD85B8A4815BE83EA6D77DBEC292F50F8B:\ 0F57C4CDFE6F6317EC7C50CBE8100603 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 3D220053B6F702E7CAEB74DB867FA24D792968D4C2A59CCA308F806C3A5C00147A00293309248B\ 8A6EF0C50B7214B442E440E44991E419D4723CB59B6E42C53864A9AB62ABAF837DB330A5E1FA86\ 3FD5EF5D2ECACC9F04382807E537859E97D2615A9FA70B1BA046C006A37EA20FF3DF6123D0D2:\ 197F3A50A197CCB854AA6C85D608F93D 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ DF9C919108DA643347B191C2332715F4AC01AA13CAFF0CA525E214659E928F8C2903673BADF322\ C52BA8C60E6D682BF4447704C8B653AA386562B7F20D880B23A73E573FC5E6E1FA797307B0541D\ 42BA1DA70A7096235F28F059325F4B02A178360D14CCA63E1ECF4F24DCB06872416D72E8BCD2:\ 743C96AD88706814461A15FB11EBCA52 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 54B42471FFFD76D364CEE2013A5FB8B145915408860C3E3F6F56F75E41031CCEB973FA92C9E67F\ DE4A0FBA7AEABFAF65DDAD8C6CA7AF13656867BA72ADCA70373F304E4CE9081367F179FC65988F\ 5224E6A4ECE1C3299C9ED1D0B699E4C5481D907877441F5E4B02526A91EB134DC7BE551137E5:\ AFB5E81BC51672AB968B33AAB54E40FC 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 35108EA6DFCB3251ACFEA14C7978A1AE729E3E20D1AED75FCC26713DD2416855C1F03F0121A0DE\ 010C1CCA302706DFDBC5F0DFF3E6B3F6C0A6C90BA96DEC940616FCBD4406662B822ED87A5F826D\ 14C612C8A5BAA10A4757BC278C0C3638C8AEFBDE11608E30087B08D957B23A0FA7C73FBC4981:\ ACCADB90F6DBC430AF5B9CACC069C58C 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ C77753E149061AC705815FBC5E6DF1E6B022BF45CEA31959D671A1938A0FA7622ABB2FFA8687F2\ 05A7DB417F61CA5968A88E6E5447CF2639BB8813C66DD0A12A8FCE3C4FC893AEC2B2A5786AA1DD\ 27BE50633198341E224BB3761381F8E5CED9B17CEECB08D2017D4800B584F4E078A33BC75BC1:\ 76DAC1C77B73EC50F7380129345991BF 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ E3D437F8F4E2B5C79BED77075E618682EE2823BA800F59FCE2E6F18C355314903FE3CD41349931\ 323413F3B85248D0EE4F79BB4AA67DA37CAF06902C99EFA396A79DE4AA2CB3B0E67A0B87356D63\ 261ED20287425AB3E7455375AF21453536085D529D3D07525FC578455D9E43D529A7230A2510:\ 6E35E3D8E6D332E27C0BE03C8A5471A7 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 334554121BFE766D9E1D99C66E66E9580C9362D6A239A8A392153FB052BC9D5BDA4AA20B28C90A\ 16A40BB68240A41A55D5FC245FD5CEDEBABAE81E92171B850E50695CFE6E0AF004FEBE4D8AFBC7\ 8DC82D270CF66176F0B00BEB5F14D2FD261AFEE2A2B49370E6298EAE5DEBB86750E8EFF5974F:\ C8E48F6BBCB573B8006B0A6B0523FAE5 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 631D5CF348368BC46C49DEF8FC8BE88FB53A3D0D8B6B19D9B4296D556B9DAF82D9D3830DBDFA74\ 6E09EABAC61E54878916966ED13F55570A76794B52366494D46B0418927116B5F466BC262F1655\ FE2325D89FF2087F6545F0CE710CA99F603DB5B7D967A3EF00694F07EEF4D19920E30DFE3640:\ 39B1805E219B7784D334E1DA137B71ED 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 44CDEDD31F2EB9D7E5C52BB62E3D89272472981B6A56B0D0056A6210A836F4C7CE02BCE4120FDC\ B1F8346810D4273CE45A957FDB4534B332D05DF7BD67D2B116FC0355AD416C77D8A42FEFF6CD9C\ D4986F5CFFA6E85F30B5968D2D11BC407309B7908C7EA28451B85B3EDF3B1081596E300890AE:\ A783DB338CA910BC771BE1BDFFF3D7D1 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 8F5BF391BB2FA4A3D727122BC05DEF4473C936FFBFE6E0A37276657418F18235A84C9B1B817BD1\ 63DC8D414F61AF31E1CFA51CF692952CBB501F117643F2EBC7470C3F870CB173C55D93CF810D4B\ BA9AC41570A93ECA91CBB204A006A484956AF9473C50FE281BE39EF0A23E324137BABD00C4C6:\ DE89AD958277237ABF4143BCA129B902 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 92A18810C64D4598C7CE3FF3D2CBAB42CB3DFE4976DE40D95621134C4BE3C066D11220B2E68DC3\ 054CAF977838AB5684214FAA05D27E5E110ABC7B719F184A64EE825A730D9B390D35195E452FA3\ 362B0E6880E547F983ED4C7199D321680497C9722C930D61EB11FE15807CFCBD81036D4AB6B6:\ 9BAFD22926AFE2BB782E07E3E9713A47 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ BDC0B3934130AB769D5FA9A2D43BCF3B3BFBA90CD76F04AB3955B287058298C4E627C2AB7F3951\ B5BC44DEBAB33E3DCCC471E17162338C3BB42E418B7E33D5275547715BC7AFB94669BC5E3D30DD\ A55C91D2BA23396ACCF20094D2CBD425CE273BACD304EFE61A01768C077DE5D4BD38307C25F0:\ 9AE5CEA10D25D4980E0D848D14166BD3 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ BB0FC7E77790B8922EC54D8EE7B74764C057B6066CA342FD2BA2FF5945EC9EEFF49F568011C64A\ 039CA7256ED642EC7CA86715293D8A94D3ED32E6EA74B4E437948187C29B5EDA90468FD52B6AE2\ 711D9B72B97534914D73C6E4F24D8B8D4B78328C891801FA94C6058EE687BCC0FAC6AB3E0775:\ 5DC3289BDF8E0AC2E11A6A846D6D3555 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 749223E6659B4990E3FBD44C422131460CDFDDDA81A0A90426114C09183B308FDDA2668540E468\ 3F0D2DA5BA5225CE30BBF4BA350441123E390D85C0A90CA5C34BA7D4624024807BC42666894A00\ D2A3AECC60308117F3C7E14859CEC97553145FAE37796DC3DD869AF7CCD112450DE85A13FE5F:\ 9028DC083356F6539CAB46B85943CD28 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 7F55CF196A7704A73CAD784B3C9747615CF0AE344F576614CD5C4448979D1F2F58787B25DEE890\ 4A6DA1907ECD3B9BF7CA2399C794FA099380D1E9396D170B2CA89D1540469003405160DE22F403\ E09D75DBB55AF8C8F346260569D7B09242EE7AAD06BE1B46C26DD9F72E6B7F99C83DB9B7C194:\ 119830CB54051CF9515FFA349A97EAC9FCD97433 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 66881BEF696C04B312B95D664FE71EEBDC95EE998C85B57D6237769EFE0D7D471DA4D2FE41053D\ 4DFDE1442C8A3EFD14F22C41292749375A902746A86B117929F46BED63F16D94073836DFAB3201\ 419E728F2A8901E4E543A5C7C021FFB321F275A4921FEA3F3A2CC54E05CCC985AE50BA731B6A:\ 1A1412B8FB13AEA84475FB158B5EE83A99DC560D 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ FD771ED1DBF5BC652A502E75BF74251FB72F67DD83276D6238C8A88A9BC667BFE7FF46AE6B62A5\ BDA67499001617893DE1CB83BC08793DC6DAEF2A294315D53F3F6E7AC704350C456460A4FDAF4A\ 6F683664CBE88C476F2AE6F47C7B23AA1F024D13AA1DAB8F952D4142B51C984E55C2899862E8:\ A6E318E21447AAB02FE846D51CD0CAFE6D020F6C 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 0523E8B622F04A650A50AEE32CDDBD3A4B25DF714094A6CB5783898C7323DCA8986477FE389AF9\ 42668A44CFA42ECEE4652A1709BED798154E5131F6840726E3EDD8F7A5374ACB66B25B60E193CF\ 6D2D7E1212FB04E841ED5595B9C38020433D9CB390BBA523118206A0BFF01DC67E0D46AFEDF6:\ 28845F13275E38336B32B99554E6F3A195D1AB28 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 1142B12772A584401A94ADF193D301C320382C62038452064C10B06B8A1B311678CCC4D0D2BBCE\ 25DD343DD733D4D7FD5EFB6D9456C7F690F9EFCB28862E2789316CF649A3D868A6273B915EEED7\ A5EB401E59740D7899A7E7306E2563F086FF419A4827143DB9550E145D468876C67F33BFD092:\ FFB05F0DC00FF74F159CFC3CE7B1BA5A09779483 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 02B4201C31F165C497154DB1EAFE1C082F88931B9010FCAF8E110926985C37A9BEC4DBC680ECB7\ B9F45D024D521299466AB9246E7F4E40F8C5B402B5DA0A318248675B6A006B67E5B02198EF6063\ 24CAD5173E6A6684715CA91479B352E1A5711F6DABDA6C835BC1674E74504E02717EEFEB26E6:\ FD79C0D751B8B9DA3C40C85B944EC105EB3BDC1B 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 5E3AA5F59F746A8481F1F1CB6D63822AB4ED3D4B7F94304A1C0E9DDD9646C617287038AEF0933E\ 90C523BBD736905EC5FD0332356C24E4D6B006D0FABCE86C09EFDC958EE748926D6AA9BC37B1EC\ 879FDA063FD134705AB21439768CA8791A6F7D996A722B45707904BD13984D61A4E5DCD587B2:\ 18A0DCE520BF4DD0724F5173022106C8EB370B5A 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 6CE98801210B00DE4F71DE0CB62E2D281C98D932C96CB34A009E1F3430F50FE287D66CA2FFCBED\ C97EEA7CF2FAB70E3592C5CBB8625723B91A13D078C8DE1279F393D277419FF78E84B49180E7B4\ E9B3E48F0F66579AC34566A271CE963581D7DE48E747D79660C78ADC308347597DD7862FC72F:\ 7480690DA8C0E3393A161E29C312139B007131A8 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 32E8CE4394B86237E45BF3CBE2AE3355FECE63BAFADB0ADE19C6EBA100ABA5FC1777688CA8FF0A\ 79F3657688458E4BAA47E9D7AFD9A4C1243F5F083809E367C59DDEF9A515D3CF395FB5C0AC44B5\ F5D96884AF0BF1368C4D00EB8E06F0D805496219D9D8E8866E901C592D60E1449CF50D20E983:\ 0E31E26B5374E9DE11F528A6E7E57B03CB6B983B 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F76855E776AF2E29D139ACFF506BA0C1C917265A172242A2A5652FBF9D8A90872503A12F9A4620\ 11E0894D9E34CFF08D979F37CB2553889A2CD0B8932C2B7A47130C0F724DDA8EA904F8D9FA5127\ 498ECAFA9D94D392642EABE1BDD8433A1CEC7ABB0BD065D9AA0FD04B68368E49A0FF08D10117:\ B4B6FA36F7F42D89DBDB51D887475D5376CC27FA 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 7E42E03FDB2966552705EB79ECF02C652B2A62EFB7DC204E25439E7BC5C41D80F90D756C14A6AC\ F0C79C15975B713E547623F71F225A073FFA501202031C6AEFD6D794B093A56E1F88A5BD8E76D3\ E25921E1BD75B33D9604820A5F92415A3BE2C028BE60D4C764890F7FA8F89E9911DA716E36C8:\ C2D17692AEBC93A9CD87248FA0496EE027B354CA 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 295C77B2D2CFCF4376DF06D4CB168A5FD315A46816986A024030685D35D6BBB62E0519B8753ED9\ E6919BB94A828A172B9C01DCB6058915DF9889D1AA0AEEFDA89724D25FAC07BBE1208BEE8A3CB3\ 5509CB9A12AAB14B75C4B0FF0A8C0F444AA96D6C9E3457669C3BFE0AED6E17599A53F614EAC4:\ 1DC5682D883D41FFB9C6D9146A19DE5596351DAE 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ D2252875127726975223224C5B4E66ADFB573582539A796770B84C86FCE47B886A1CFBAD755C15\ C49EDDC9932D3C0CF4FD41EBBA79D46C1A883F1B3B2B1626BEFD26B4708A26995C896B90354300\ F1BBA09945D441C7DFD1EF152154520C1FA86D435C6B3205AE6FBE012F835C6B621A73A98B71:\ DBAD2FE9A4B89C17AA39AC48BA3A1709543ACA62 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 9CFB54F9B1D66A5A96EDF432EF62841E52D33E90E399E049C554DE679B887E056A8F78D0653206\ B6B80E0DB45C0AF1A36303159F4D1EF034B28A4835D04EDF61251F9C40493CAE5695EEC6E10AA0\ 91B760B7146159A491CAB476CCA1E39DD1D1B3A08FBCF327C15122D83197909B8BE0F72485A2:\ E4C4AA2357758D79D8528C833607FA757CA50D6D 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 8F0A8C023B79F012A1A2788B5A20E5861397481AAAAF72E70467C06209B0049E7C3FB8762A31CC\ F8D2C939C49FB5A0D31D8C64C78B2412EEE0185A846A8AE5974A1A0D55DFCEDEFEF3644845BA9D\ 17229FBC258C59605F75071F356C01C4959F7F1BD8FA294D65037C077AB2CF6C58B62759E8D5:\ 3264792868880D91C28949655BF9EBF87779DE78 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ FA183B4B91F78B2D16E8B7289D2D86259362F253CDB65B0D1C2FE45CF7B78921EA7BBB516327B7\ 454EAB0E3138AFFC09BD0DC6BD85D264321D33429496098DBA7B5F7F677077FC907A717E93E141\ 732FAE7E4B68DB130A928CEFC90062865FD8F83B071C3F22539AFA812955CE00B156E34426EE:\ 1D297636D3B1B64BC13420645E9A6CE6C6699289 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ AEA85A57F3F752FACE718C71531426067D6FC70DA997D59AB23013635D77F65D92864D76272491\ 71B2E655CDEF807E85D86A42B7722047DD38434975FCD6BB71A56292938FF230C75FDB57D9161E\ DD6C64252AF0B39930DC8E38748B0BF399B93728189AEC248F9322455DCE6E9555B9EA097E42:\ F0E946A71123EB5A6DE6B8BC44F843FD45285564ECC20881 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ B36A7DB00583F48EEC653314FA1C7D2B052F34251507FD176F12D955F31528A6E9FAE66DF4BA7F\ 2787982E95CCF1FC600F2C3DD7546CF2B0ECEF1A4E02111F391C99E6E9C51BA359F8BD211D2554\ 89F1C85D57D867CE43377B4674EF4C626CD7F40AE55584C390D4CB226DD71C379A0D0C930425:\ BBDE3BFB69D2301556CDDC0C34DA8827D10217F607DAE9A1 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 6D608E00EBD99EBD4E2CB2C8159969EF2E9B21212FF4A1FC4165E4E048A4569BC1EAD2D943EB96\ 19D68BBB806F72A5C0ECD1584CE7B0CA6F322AB0467B64318E3041E5B0468D88234BEDFB91FDA8\ 026551BB4585E423D6C2D6AD0A0909B9849A6C329F9F44CB53B8AE2A7C00E3C3AA1F42DCBA84:\ D09DEE33E299290B4FF3262A259BB29BB52F584A25723F0E 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 95CFA8627DF9A518B3ED1A5DC93BB27AF30A9B37C46E1313FEA680F94B434B5A39A4DD74C75C9F\ 9D1B2EBB7F154436027F3A6C6EDF84DBCFF604536409CA6B8FF2A66501B02AB95BA0268A41B511\ 0342976B9DC96E5F2B4F7E32979B4F6C275D3BD0CBF7871AD03FBF78E383A8EA9E7C9E9082A9:\ 65298E00B106B798D808647F16572A09C15927E24B8F7DB6 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 94D2C237DBF27F6D25B1F22735AC74BF4F92D0A7F8378DE493F82153DD3A28EFEA69B99A4EE1EF\ ADDE786134327D0AC17585C66F1245466FF98F6B41F69D84333121603DBBF76B654135BD4271D7\ 19DA93196511B5DE8B5256A906EB4341C029A016382C40B726B30BC46B6CBDE97CE6F13739EF:\ 0681EB738C45B44BC134112E8CB420A1C3780D71A8413422 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 160B99E09742B020BFF397E0FB1890052D1A03B145C8905FF61A604B19AE0F5F7FE6A8AE1E75B6\ 502AD879DA2D081F5C6CCEF60C2B1E4B3C5023D9271857BA043585E87F2B480556295410C0AA55\ 642DC4B3426210D7899369976E11F4D5CFA86C27FF10A5C261EEB6D70A093F20733C34EB3C76:\ 75E916E939A8B762371C349082B56F7CA5342D240FC310FA 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 2E8039CFD8E4BDC9BF718E5FF80E19723F9E67042D4160106E50620362550632C08DBEED7B2CDC\ 71DC56C452ABC0766D883B657A04538F7353D9ED5B5BCB65FF035D8CB97051D2A5FD2C96EE1BF6\ AECAD901E005D2B6A62F9FCEA63FF6CEE0E1AD27468D175217C50FE00F44C23F777CF551009C:\ B76EDE68222C46E013F96F2112E6ECC52C079050BDC7BDFD 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 200B3DA16D1089B0EAE8814400688690E611FA120459AC843EF81AC08FFF4589B5DEB62944C851\ 667E6CFA21323B1BB063B4F803A11AB28856FC81D11C4097E2FA710B2AAD0AA0101F7E8B575F63\ E74960AD851D055039411CA2F3029AFAF2E8A8B85EFB677958BB66D7F8D28483DC2F3AAD2ADD:\ C119544812869B717339FCA3EBC5DDFEE645DB6193E6010F 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F3B0AC1ADB198D82D68845EC4C0F354948FA2834A3739C8C8BF95B674A5D7A2C811AF0B517BCEE\ 62D9D5365F44A0A5B5C3B75F952383AF0248CE8E728E64959B672162D44E15CCAD0DF0D80EA2C5\ 1BC163F25AECB4E49359C93BA9338DC57C5AFA50FD7371EEDA38EC1BD0D77913C64BCFC93D5C:\ E866DA8B4439CEE798D394FADEEC2108C5C2802829C1486F 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ E01640C6FB90ADE04D5F4BC99A42EC5C25E27E4EB59B2991FEE3B3B90119357A5F6E6FD4EF2EA7\ 52A79FB92A3133541EF6DF00E8B243A47F93485BF4110DD61AFBDE83EA7C0EB4A338849130D9FF\ FE2F18EE7E32F3359464A488128559A7A61DAD85DFB909D4A4C95D321656D2C7F3B6D9876453:\ B1A1E8A1CDD487E053E8EA1A85366A956116B0BBF3DBA2D0 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F94EE0B40A4E97A792FB8CE1A09E0E2F1577D29FA6A7EB0517DA02AAED5A952150F57E105B9D55\ EF9440F591A19931965F78D326A0F45E6BC179AC8B826872D3BBD1478F43B62C22B471EDF82BF4\ E6ACDAF260BE3CB14F4A70BF947F0F70ED5C133FCFE06A805F06CE41FD4340A02CCED54C46FB:\ D7C76ECF8F3E333986D0727FEB74A933FB078ACDA732E8A5 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 0194823D67E3D53DFAADE5625420EB0BE7E58C254E47A54858C52F42427005D6DE162DC1FDAC14\ 3780C202F6E1A0573250C2B050B4985B147440F024E0F7222794D70EDE913CAEDCF4F997E32402\ 25B5EBF179D179E1F1B35146250D42FF59431BDCD213DC2E0E7AE0FA4C20B1483B72A225C9E5:\ 4043315440250D9D80D6CDD850AE06BB000B2CAE4CF3E4EC 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ DCA07BDA8327FFAF65A6200C0163ABAF7B267BF00665319154CE603BCF1D971923D8F6A877D3C3\ C991CE741F92AD78DAE00B6FA8A07F4B5521E9607D248B25EE2A6ED0A2E62032E3536FF5D420D4\ C3197D24F79019ED6F98D0A91D424738E82FE4DD2F6EC8C35C5DF2A36D0A5F6911C3247F3FD2:\ 2B9B3D6C5CCA6FF1CB13E304A3E33E359AE5698C43BAF498 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 4ED372793A4B85C9D0FF69654D4BBE78DB2B4258A385DC046C094629AE232F136E63EF18FD3150\ E9EB93504D06B5B2D354D1D3DBDBAF1B99599435B4DCC0419F278868465B43658ADA435E6492C2\ 0438DCE19435323B5E6485F384CBFF46D166E6E3CF97F32095C03F388BBF4E627A26BF35B9A2:\ 6D7A73687DEFAA9FA22344CCD67BAD74B4BA6A058DC7BA9C 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F3D3E04261645CEDD6B423A102168281535EFB7B43EE0F07B925B710FD6171E8C38F815992A133\ DC16B6EC99FDE8BECBB29205C185DDACEFABBEBA824424C1F910DF7FFFB81D934FA2FD1D41344D\ 7397BCA30D26BA0EE1CD7A430FCBFEE31483C6EFC9D577A2E3CC0B8C5A1F6619A1C0F85B0B16:\ C49C6CFB09608BD78CDD826009220526AA030F2216DC6229 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ FD3866800048B2E0BD760ACDA846843D421B61204EBD31097EC45C6CAACE840CF611F01A9F5EE7\ DEF380269A1C805239080B88549F19FC30365129B8B75117C2FE3C8B8F98D85CFA9FEC85BF5D95\ D196F939E8A6140EAF06834DF13F0D1D4A3630E350666BAB04582DC7C6DDB08A6CEB8C54DAB3:\ 55D7A1004D57B763ADAE222CC95C90D91453EC7A006D922E 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 647281CBDEC5661CF5B3BDDA1E711505F4422309C4079F9D1B3AE4A49866D9DE180402A5300CA4\ F65603DE7A797F497C326342B6F1DFB91B247094C99358C0BC875367F3407ED1E7BEEAB674E575\ 9ED55ABF01FED9AA360F4F049C4DFB60EE680C6AADF6880C5A52AC4592A6BD8A02653231900B:\ 9E232577306C0F1B81125646AE9D18C4C9CB5A41BD1F49C2E7213C31 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 5657DD6E9316DE1934E7C04681F88549FF92BBDC43E1DE589C08AE609119E05357EE5A5FA205C2\ ED588E7EF53C316E3C5023923E1185352DF17605E0AD8CFDE15BF56B2B3C4015142B3D9B3B4893\ 241150ED83E5B956034F91033FC7C83749A77B08C37AED9E919781265E7A41CBC32154E45FE0:\ 64FC422E55B6DE470C8EFD59F894D238F566B94BDA07916ED9A7EC97 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 53368F208092A0D7B842B885D2E910F22E9BAFA33DFAD2548139B6FFD845C1AF579B77D40840A6\ 95A6BC0FFF8FFDA411A42153D7A349C6C61C21C78D9F664ED84AD1FDA1CA7FAC8676525E8011E0\ CB22E89F8BA394B962F84CCB0C7117388CDB6B0F6C4C1E0A466F48395472F3BF02363C24E81F:\ 5834B00FEC3DD4650BFAE554545628CF93E2C4CB47310082888295BC 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 4E4E29CE1CE2A1BB216F6BD85844244731E8E2998886BC15234DB5E95DA1FDF09DA6F8491590A9\ AF2719ECA6860F7BD1D2DB7FE6BB05C1C38DC2402A95DCC6EE556524E373EBC003D56EF2A03B91\ DBEFDB3EB0BAF3BD0058B9BD77AAD361655B42229791D6C6684D1DC62BBB8A69E0B9B3577DEA:\ AB02C30031CB74190E31F994D3EED4CB516002717F7F259BFC8CAA00 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 358996611F1464D8F0EC63833E3354C9258D358EAAC807DB66841FD48F5711495FF4C4A278018D\ 3AD15E14613B4EC54AC78DCF4A7EDC299AC237213882F10BCB027B01DB9B453BD0D33BD88531B4\ 0F9977FA9BB54B9448E1BA9EEFA984C826A65CF0D241863B945B8684F59E006449A740C92D58:\ 9C697CAA308F7E76DFDDA9588D9002E9B28C8FF79858C7E02D4BDDC5 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 873EF326CFBDEE5506BA5BD86EF7C37CFE5F649A4064716E38135C9FFE206C1267CBF14A1646B8\ 3CA770B1F86D1EA1438C216E753234C2AA08475B42883DAD3A2B67892E01D6D2DBB8CAA21D1A1C\ 87B66B895842D4E3F3A2E3753FF936AC8AE734D9A2EFE9789830DEEC38ED8AB0F15F1A91ECAF:\ B2F3D97249C90040B9D09F0CF30DAA31BF586A7717E911D1333060A8 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ FAD37FCF8378422A2257170B1B87DB04076E366910CBB6381B822A8F66CF6FDAEE1953F4A5B36B\ 211B0B73B7E93E3566DD9CE06004F49B683E803D443E601938E8C84C6E2757E4C1666002B9C915\ 412CB719129DDBFF748E1D379B724C09082DCA39B056691B9ED21F47A4E3857C498C63E9E91F:\ 39D944EDA34DE7D3E92BCB1996196BDBE7D0D6AEA85F540333252008 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ A63D061A64D62DB78C51E8DD7A293BF15CDC65FB4A182296B8804A902D039925F13D5D9DE52702\ 7A116D581D2F77FD306C6D675D13526A4C3505364670C16139FD5D479F9B9363919E86B6C33A56\ 28FCCA1970EDBDF2B683FB9E54BFEEAFEC001551266133F0A5E72FDB8A0D8670EEE71F21BBE1:\ 59ED6E2136849971FEE7F5DDC529B7CE30C18A05A2308480FD792A5D 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F8B9AC6B917837E768DAD946B8274C1A1623846A88ADB68D5A75934E8C3BF3447971FA635FBD24\ 0E626F226E5F00E5F5A11F5297BFC67711C557B308FEAD4A9FBE170793814F0E78FCE0FD18A91C\ 88B93E38BA31EA1AF2A173582DC432C5A00D1B08BD87D6AD25A11A902A9AA761911E894C8E15:\ 60BD44AD1B7E9895CF569D087BE7F8AC9EE737169C0861A0B0097A5F 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 417152A3907586B9E8F59D2F62CCEA5FF9556A6B286B61FABA146B067FB56A1B549D9E9409228D\ 5C5FE54B577F6902ABC9D4D5F0258D6ECFBB214E0A08A361DA479DADDA854C96EF80CFBE8BD277\ A1D01D801F7079F94B4B92F3A42587104B44259F894CA375C0E4597926EBF769203C922AFB0E:\ 7F050CD0C1D36397C06231716434969D8D0514E92FCC1D550B4B2933 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ B2EB626B3C6A8485425F75273E8B771B263F1CBFAA40A0786ABB5042D04C7D6AF7FF96B63842F8\ E8FBACF665538964881BC1BD0A0F0D33CB038DBCBCBEE96459282054BDE39AB31E82E7409CC564\ B2166E6C03DCABBDA449E99BD094A32942ED21BA03A3BFD93620DEC36A86F299B7B018F4D325:\ 63320839C85CE863EE1FBC962C057C623EA2531B9854B58C3AB10216 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 076777CB3F25CB914EC32439031667DDFAD29EA5EC4DAD2A8CE97134966A4B21CC2374D4C31103\ 6CFC8175C55A9C4D1647589B73A8866EFC30BA1E3F7B7688F2F819B868B884111A12E90D78B3BC\ 350C41BF9EE79DA16D27C1C28ABF12932AF23E6F57F50DEB79682829A5FB4D95CCBCEE8BF01E:\ 09292F664BC64AE5A21DBBE7DA2E2EDBE3F6D87446A0BBEA9CE7E6E1 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ A4ABC46FC552EC00DA3745959C1198733C064521B7BB0E8F7F5384051A4A23C6FA5CACB2A762E7\ 5E8FF44DC41DB1B1B3A72BFF0116DCECEEA3257E88FC863E562C32B9BD55112CE7B2825DA8BA6F\ ABE9458BE0ECA65901A671FBB7369B62A3579C47029F6212F775E01ED3BB9E2A70284D49C9E3:\ 56D4718FEFD691064778EAB35BCAC749ED62931F9A5B46137BF6C4CD 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 8D8AB1E9E8385824E18C6560872C73D7B2D567B9B4061EC447B0694B3109D05D89955A4AB47541\ 2223BE082AF95066146D77E22EAA042DFE360AAE8000FA375B4185DC1A056E48DE3E6282F4FC2D\ 9BE215BF09C7C5ECAB95CD29E9286542C35654AB23982221C2BF5352358D8FF27A6BBAA34AB6:\ E48054A763E7A3EA9CD093B565D664248218A872E58DEBBBE1419B91 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 9287CF8EF16BFCECA5ECEAD6AFCEF50FEB39FB637DD78E0C875EB68B162A70EFF53C08FCF888E4\ 14E4EF0AF8793BDB5F5641671BD8616E1610264B364E4BC5584EFF564FFCBCED53A9AFCBCD205F\ 8A7C60F2125550D93102121A25E233DA212FAEFBC7A453DC8CE2F2BAB2D3D02CC1F41F7B677D:\ F0549B6B0B6F1382593F986E3AD9BBC541AE11D1ED9A2C4D7CECD236 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 2DC8D0716265CBCBFE491B26B0CE8144C51636D7A5E45F4558DB6EA78AFE5CC65EABB4CE1D3E4F\ D2D1C7266767DB75B331635DF7CF3E46432C2D37ACF08BEFC73C9A544B121AF5B48FAF56944357\ 2FA4B3B4F9FCFF215D0D813116E398C1945F2B072251A92FF2ACC078DD82E298B63AC9FDF2CE:\ 81580051D3030AD104AB6D1D0A03E00AD011BD5A2C48B407DFE79188 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 6188BAF16DE19FFCE9051A868B3746988E699825AFDDA484C242FE08867E19F2BD27C3AAFC51E3\ 856BD6ECCD5CAF43F79B4192ADF5EC7B13CD476D6F8566044646DB685B32AE0E83F23A33E31DAB\ A93585272646A9CFEE0626AC517DF92642DFBFAA26BA5E2158D7101A7E3E319AA200DBD0ADAE:\ 7BC01C35F8977BE59CAF0D4139A65D1D52A3088482C72B3DCDFB30558B1BFE0F 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 35F87088FDE70BEDAFF51621580A0032902AE95DFC7BF73466EFA2CC5FD2ABC72F4B958352FEA3\ 3CDCFE675A0E971A9CFE809794E1DD4C951548BDD9A6EF3A2ECBF2C404E291BEF95A42A1A4EF22\ 85304E7F23157F4509BE3B482F59067143BD503210208C6D0AA05DBED3640F30926C04D0CEFD:\ B0E8BF51536BA3FEAB51E6480730F80114F50DE1A41EF73A477DC524809CDB98 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 91682FF67AF5D75F08768D1385CE7257FDD619992DD1634F6E6118BA4CE94EF9D8F6D620E94296\ C523B8C780BC50F2761EB35B0F243788EAB761951FAB2F7742DB766E80E96D1080E5C0C6513D68\ 25885B9F865398D7A5CC7CCF1A9A976302B4933EACC4CE9E1E213C7D95326D70BDD34CDED8CF:\ EBBE1D35F01304D1CB6B400664B70E57C80FAF6B630A6719826DD79E4FA8200F 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 607A183B7C5F03BAC0D00D7DADC446255AEB8C78078DFAE6B167CB43A25815C295FD4D134EF8EB\ 9A5858240E39CEC6D4C9519D681BF884274248346639CE90DCCFD55990174B960817ACEA2508B4\ 9C9263ADD321F11F794C681CD8D191F57911C60D9B7AC6018837A8A13651E6BA4DEF8E890070:\ F9BA1DFA6B93C46AA579CA6BA81AAD50B1E9B1EBD81D26FD36B20C0EE2C251B7 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 82137497F0E3EDB4C6AAC483924F051E5460B8E91947E0A3FF9CEECC7645E519D262A4F1E0611B\ CD3760C4D1E8293E814713C61A07AA7C12F1C0F206C97DBEFE191170FBA988347B52DB7241594B\ 252800B7667BD1DE9042F4B88A51B13F507925254C0A03C7AE3C704A7B4F9AD96AD5992E9997:\ DCC24C1F5D2C7240EDD9BAA530E1BDD68739F0CFE59226977C508AE8D4C87323 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ CCF9B2CC2419FAE9D04C92E246385E4CDD87E29213092C677B9D699B7905AAE392AA270DC013B3\ FB7DE8AE837C81023C8EDFB0F03DB6A548D4D460075490507AF6DB17A32F48C1F99A6069CA94E9\ 75D1FDD78271EA47AC9EC196F37286B53A8B540E44A8B8835709DBEBC7A7EB246971DD0F4722:\ 917D882FEF03ADFD6669CE45EC62CDDF5FF1C03721FF3193C21C5930CF1272EE 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 05164B3F11E848547D665D426B1145559B69322F8FBF7D28B4E0E96E59390132AEAD0D39375B38\ 3C216728DADAE7279CB9059E725D3EE4772CC41BA8058B88C5A0DDC3B5E8F710C2D4CB55B4A680\ 7243B569440FD548A13F2996269F1BCD38911F7B811AD2204D35DE8E99FF129E9248CBCDE2FC:\ 1FE748157BE5CF6DA0AEC0DCA0E7720BC1EFEA43BD409F719FD2A7BADF8794CC 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 6ED1A789681A608231E66A5E07023C61DC71901C4EBE810A22D1416C011702CC66D33C06365F65\ 055ED9CC152B7F6729F9A69FC5957D89FDFDCF7955156D0C688D94588FB73DFBCD5B7CDF9E0FC7\ 8BE9389158A395028ECD0D91353E3692192481C676503FB1849082FF38BB90DA4FDE760FE5BE:\ 2C6825ED9252193DD2F4F96CCDD9223DAB33524EBA2DD3D254852D8F40A4FC6D 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F4B7357D06DB0100897B838AF028EA1148D7D955653E1ACCC1FD919BDDAC4981329DFF1288E06F\ 0E2805468F6BBBE88F3E27ED6C5B73ECC63D946C4B90D841BE5D3007AA205E2685EB112C7D10D3\ 6E3F0449A4D2F773379722846F4CFBD85060025C41650E7AAFD97D348959AE3652A8E93F80DB:\ 0ABBCDAA3E91D88CBF4C38CB284BA3306FE470A1388C2B96E46936BBECE1CC3D 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 0CD874631E7080D093A47992DF9816EB03F83A23D9CFF79FE7FD068403FF3E0DC3D4D881952B10\ 7BABE1C83FA226A0D37DA5621161F478BE0E986E76D477ADDC2CBCCE3CA94BB29DF6E4387AD9D6\ 2CB8550553EC5D19A24BE2E7E386AFF65331483662E155F38EB3DDE79F54A1C75B0AB9F83E7D:\ 800A51F252F9E6D431FA3DCDB426E3D4BC3E1A34AD5706385F8D063FF5B716B6 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 1B907B35122B8E5D9CB6EC43BB6BF6F0F5C2FD7B65E98AE1F4360E4B4A9EA3165CDD59342B0A22\ 54AF793A09E2AC76F6230413ED204ED47B9836EAB4DF6D82469CFD1B5393E39DFF9E0DA74EB56C\ 99BA357439F1B01C158742C9CBEE4F7CC8E15AB181DAC526380A2CC650F7125C93D20AF80640:\ E14E65EBFD403DE7EF39C663AD4E08B99ADB01D00B2AD024176E0EE35CF11A42 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ FCFFF45F031BE2C3D6B85032C754D39B83688D3470587ED1D13D9DFBC74CDE191F33D5567BEA4E\ 3665F0058AF27C7C8FFC45EE5F012CF340B836824D508EAE7145BA2067B6BC926C5007F7803FD4\ 67084B06EE858F1A1059C9EF0CBC85E9BD7C454010AFF2B0CA04A9AEEEC54F07AA48634A5F53:\ 8FA304D1DFF976D5649AF564FC3E3917AAFFA59F0E4D560D415F27490FBBEC37 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 0F34E8E8517206BB8EB2426A684694052AFCD7DBCDD3419303973A24113B58CD08530000527098\ E72A0EDDDDD78380DBDFD60EBE30D5150475ED2C95CCFBE860DDD94BB45F6E40E81C5263C7B2CC\ B79F1C6CE75AF6D2F1E572B43823EE63A3CA73E1256AF44FFD6F0C67E396348D489CA663E478:\ FB9E93C4F43B223837F9EA773DA68A03842496B8E2BBE7141673855DC3F73114 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 32EEF5793FC730D20B8A8B9DAF7E54BEFC79B9713F8B19FE252194831E8A2DDFBDE392C5190573\ 62EE1171331F1256120D693CE463D187A5ED1F8FDAF5D5BB9D483C3E912DE8ABECD2E70EF9D921\ E1DEBA85FE051BF3D25297AA9EFA0C8A836982184254703ACF1694C65A1B2BAD491D9395FA1F:\ C506703121027BCAC2DC90AAB30B5CD30AA87773B98D3B182115B8F1E32F4BE7 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 5E779BE50FD31E25442C0B04D5FBF92E83FDB492F22EA12899A435E468C9CBE839CE66A349B299\ 1DE381389A310F653D85D972B9D9F2C875468EF1ABBE2C9F8DECFE452055164A1EAEFF4DE0962F\ B3E34848672D1D1CC1F91CD4332D520254C0A9B49525608C462292CC4F189B15F4FCE120555A:\ 18CF7B4A85C5D9901E1D92DEB6487B6292C0A94589183151575207C4F776F4C6 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 3586BB52787EBFE1033261802E9C88E29933425EDFBB199C7650FBC56A2223EF0F12A7450DA282\ 93812ADAA43E5EF663440EC16905BF2EB9E4626F539D94D41D0CB11231D1BBBB145A3A19E384FD\ 645667CA2104A0C1D56F90848508B2D37D194AF882EE2C198EBA68A10B112A3EC9E6265B6726:\ 45DE118319AA726809A10C56D46915A88595811603B9A146DDF183D24DD0EF1B 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 9ECF899E3F58E481103B201C076C52EB93148CDE72B6EBDA0EFCF452E13195D89FC48BEF1A9117\ 7364C49DAA87F296CB8B91B67E40635648445984928207379C85E8126D94015A223F2DBF696FF5\ 3958AE5FD52E9CB8F5575730A874CFABB1E097F85E69177A47776EFB1C1CF90C1A1D62CA34BD40\ 10006E432403F8F16012F6F4B440854A19A208629AE54BDDD860A4BE4A1159BAF061E3FA861339\ 636815C3DE489782D7895BF4472AE48DCEB1D3836EDEDFED8EEE4F86879E4A9864100BDDFBB854\ 8CD4C7109FB0DEA6E8709A89F6704D0741E69538D11F151D67C991B84A257710A8A22E42BE4E68\ 065E77FA1F2A6F5F2CE7C09FB221C86CFE8299501E547ABC79AB1EB9F7C3BD2418E2EA3205BD51\ 51163CDACE8E334EF82E8970164D0CDE7E0A86817387078B10FA562A09820E0BA2ECB8D6342227\ 0E18370B0DE7F5D5B875B226A365A3CA40835E84C3743A50632615AF9ADD11B8D2FA4D0E4DD885\ 2DAE6FD3C24CEC2CEAFBE759627B59FC7AF5CF91A5DF974ECD1FCA9B062DABC4A1809D80C18931\ C713820DD4C5F6FB09E02D419E4E461E4419C20686E7269A2BFAC1F114D9943B96E26D4509A44F\ E5D9EA4E2D50F0AF4B7AA476AD21EEECDEB09DC1CD19B3E501C2C42EDFC830DC94E35EFD7C461A\ 21E05A3EA4EA83D7496CFEEB0D44A25D756A09367D353F1D0B694533D57801AD0D9CB03D3B4072\ EAEF914C46CEE34201C25DFAE244612AC425B5F1E932A0E4FCB73EE2209872BC107F77DF5828C9\ 58E22CFD979DB435337F6FBF85133A5534E685E3C07EC607F92CB8FA7AA5CF2E1A8C52F69462F0\ 07BF759DCC4E51D183D88A541829A279AE3B4EC70822B6E6A3C6CF08E9145B84AF7FA76C6A792E\ 35C6F39992C568D6846C5987C9CA1EB7E730F6E298D199A6F0609D6BEA3473321261253EC5B276\ 0FCD458B6766123F0BAEC522ED99AA9AFFEF817A491F41CFCFCC0882D3E0C3E7E6E1E3F948464F\ 95CC9C9BC8E4543BD50C305A1822063224697AB2AA2FB210F776FB705C326530E50AA5CAB2929E\ 5F972BC45A3F8056078BDB203E75531A58AA279A3EE84615DA808E2018EA49A3FCE1CF6AB487CF\ ED6EEB611182D1FB2D5B6E050C443F6C61833B0A16CED574DC2A72676F55AED91CBD5B3D518D06\ 678BBF5300CFDE4E39A35A3291A270D5442EEA2459B76EB8611F37388ACB558A76E8CE5C5C08D4\ 21809FC3A15BEAA37361A80D58D5CE60E5119D6B8173E464EC4F01EDE72F3D1BA6D4E7089A606D\ CEEC5CB5181C7AEC6ED1CBB84F1779D3CCC2F54C341B96F96A8E2042AD7BD3FC5819EE1B741179\ 211588106D5561334180B4EF9476ED01B44140C4594D2C0D6EFEB0C167BDCB20772505B894A2:\ 71CFE52667B4A931A046532C71D60787 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 24660DFE3352E0C6FBC9FBB3A981589A2873679C88693EA1D12022A3BD95F693FE99CDEED2B828\ 347414BC75DB4907D60AA1DD9C54DAD229F29351BBA0646A668FA57FC06FDC44E04E40CF9CCD47\ 1A82976F14AE7CE835F89E27BD607CFDCE54464C4871BE8CC4A2CB9D62760CD08F7896648BB032\ 18EE30D5855A20114081CFB5B402461E098B5B2F561E628EA3FE0E8313CB955B077BA58B756522\ 3ADC84576F10BDC0608800003EB5E5D705A563399341550047C1265FD9A30C4E5A3A8B603CE2F7\ 7D6EC6168A6598278FE662FF3B7B923F54348E12FDEBE2A74E070D4F4A7A75A3949FD36F393D83\ D48B80604A5CC32762E72916EA951C4D8FC4114B9699C092F316078C1AD390CB8374653F0F3977\ 15FC80908894FF89FCA4FD3E27F8CB15CFF26239FD79F212B91084031C45110C23BE81BFF98180\ 25ABD3190C767075B4284A433FB87ED5C551DCDC30F9FF937918BE347FA95DAD0C5BEA42C24C61\ 22F476253A0C976874F57E824C3C15FDCCDC225CB2B74D4CF0C9439ECE94417A805C91FCB399AE\ 5127B28D6B5FD82C24496CCC901F265EC169AFE8B5ABB4BE5BF98831EA1D5BBD95CD30194FF346\ 1E04353450DC7B82E48A796B1C5A5871A1DF22E5558887556CDE9FB342D420F338E5C5E0FE9DCC\ F97679FC22F743F4E853FE459E3C8FE402BC05B22F2E429511D3EEE94F422037527140CB914C58\ 0FE1E0AD937869A4E246A83DEE4E65D63DC109EA44F6081F45D08590D0CC30397251BFAF74F981\ 09D052C92EBA9C3C1DF373B52A5DE581A212405AD9AB62B2BFF1395DD26BE790A9591C21238881\ AE8E4F034E389CEA9E7960AE05A097C4AF623B4EB14017E42940ECA45483D78F40BE6BF986FE7E\ 7CF75AF15E5840CA3DB75B9877D2895435252395C1659DFB195335FCF2DB3DBB6400077D9860D3\ 8F9D93984136BDF8542C46ADC71434B17B9D5FED0785D282C44FE6D08C5CFEC856DE0EA33D6A92\ CB313D17074966436A757F94402164D3883A7353D65AADFA2B39EC9E979E574AF9964A34BA636D\ 761B448CEA9A10B5B7114B3B1B53AF5F5793FADD06BE1465114519C2829F3D23329D11F99018F0\ 1FF9F9855A744A97494B90282288022ACCCC58D6AC48BEF73B7504715B6565578EF875A9ADB904\ CF1B53B933FF6F0F19FCBB3FFB87443B64DBAF472A16FF3A29ED5CEFC6179AFC478707D7C4E58E\ 8F3C82A9AB4696FB14C4403CDB6F2F5D423F39A346F809E7EC5CB2A21C9A5949E4C4F888FA0A98\ 4A5F2324C1A810887D0E960BE3728173F9B8BDCAEB471B8CCE8B837C6D424468D92831C06DA69A\ 4505F2CD98DA06F73326839FA913974172E4EF2BF1D8BC9CBEBC8943768EEA1D49FF05C2D86C:\ 98DBAC0E4C2624FBC6474652ECEFB1E7 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 9633FD518CFCD7EE436ADAAF7276B57B740D98BB4395362FF04485A69735B816A59C1237481A70\ 948E0948F354DD4EF220A1D066975A00E758D87159D5A5A9B0F76BED463F27A7E2F9628E38A749\ F96A446CCCA40A70E387D39CCE3192A6C090FDD3C70160B51EE3B2FFC39B46E6B443C778776CC9\ 65D691D35E61298F41ECEDC4D80C28CF72484D79782336B56A95B282279EB2DBE7F1300E0509F2\ 55BFC7ABEAD61C6628F4EE410D12D1A8B48FFCF3021D95A6002D8E2C0E1E8F4291855D941AFD86\ 6F5D93E43EF630AF63AF7DE546B518BB8FA0E7936CD2CD59FF48F542B1795B1AAA36800ECB054C\ CEEA862418E33AC76697996B627B8F9A15344685E2BC087FC9DFFE48C8A842AC70E5BFEF0A8D32\ 5E86C7BE2A217A2581D37F2D185D07E09C4B859D98B325D03C399C0B36D1FC8B46BC20DE9F1985\ EE87362797B984E3E5D5B5DB580CDC916012BB40F3C97DA934DED61996882A00A0EA65C2C3DCC9\ 4B5E88733EE2E8664275FE26810707EE2D8C8BCC3E4A42614AA1DAAA7DDAE0434F9137A9B4B88F\ E89D12B99684C58906260DA869EAA396BFBC71F9367F191E475AAF4A0CB8831CD39BE94C51D95B\ 2ED63987DB37E4FA59E48DD7FC4B9E524208EDA0D5896199DAF89A645D6B419EC27899AA1A64DD\ 496B2F7914B69952DBD6927D191FA74A7561EC6C577F47CC115D8F24C738406E1E51698AA45266\ 2DFFFF81807CF1429C754C6ABC3CFED8E7697F08267A4AB6F403EB167FD42A2BC386A07BDB3ED8\ D59D98E8AA85A92B5EFA2B9D3801B81AF1A12F351DB4F275A30CE635276068AC86597337AA1AC6\ 810EE0658EAEBA4CB872C5CCC2FD5525B81EAA690498DE590BF4ACE022E9AFF53C533D40A938A2\ C9459E0EE809F9ABE118E143CD40C284E986E053F7250D2DA54E77139E2BB248EAC2403AED1E46\ 0C4CCBA8AAFE729478F180754A9330F8CCF999580D63B9AD63142DD865A94920E1F37B974EBD18\ F6246820370B0E85E9FB9BB27FA4F98F48B10E659F9849B51DBE89E62A545EBAC0E91087928643\ 4E303518E0F19B19293D7F70A91CC0FA7EBE39C0A4DF4D142D9060451D6D4EE029473441C20C06\ 81CC5ED84AD7F8E0712DFFA9D3FDFC319030253AE11330023B3C74990DB102523234562664DCFF\ AD0A26B3AC1418E97C08AEC16EF934A61FF508593360275021294969A0BB17EEBDEDF8A63FB4B6\ C2C64FD875D472CD6CAE8B6085F3FD30237D3B31297A4BFD1235296CB0146DCCB8526BCBC776D8\ 347C21BF4D716FE3070227D72C3C70B3F0BDD0172FDC73F69C37DB9512D1323FE57D60CD1B99D7\ 7BC95FC0021F9D98FFE142CE8CC764549039520F7479F092AE10A2CAFA06AEC496FA24331F5F:\ FBCAE48796A9AE72E0A4D218BDC0859B 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ A14B6E9A9551094EB317924F60FF52AABC369053AACF65FC84B5A49A1CA7EA17F874EEDB3B622B\ 04415EA80821203CFA4C6E7F5C0F88CE49DC7E49DC58FDF15DAACE114BF7FFC13666F3C5954795\ 4A664FD9DD0BCC5779EE33B858B767B155A167DF2A3C93A5735C8D54F0E29E1037386EA2BE9277\ CF1E1618F96F1164DEAFD2F6FFE62E550B1D7DCDC737AE66E2DB6032559946110742036201CAA3\ 6E3A0897AC470DF4CA78134266302F15307EF18A0E21146F3404B5BEFD22ADF97E5888A2207D9C\ F9A16E329171558C83D5270A3BAB99CB941E36C4B308A4F27FE98FB8AA84818B63FCB44DD6FA97\ C30A86D87E8B7656CD05D722A7B3483C9C338FB12D7581EF94FCE7639221DF785C9CC52DC27CB6\ CD2FB396066AF964065ED0A9FDAE5A8B202336378EAE2B5CBFA463C9F7668B0656B0DE6EED47BF\ B062DE72E8E721EA5C3363CE2749FD0F3A67899E532B19EC5E54FDD399CB2BECF16CF0A91FC404\ 364C0A8E46D52389D7D1B2B7CA0270A650713D8F6F812DBAA7F06CCFA24E200B7C8438B04323F9\ D29C163E0F734B40B0389B1AB5D0EA77265B2F189650164661AC14B1B49287AFEEF33014D52C59\ FA06540E5F7090DCE8C77ECA6CAEF38E9293A79875E9E04DC2B79C8B2FD9A7419A9522DF5FE5C6\ 66D6EFDFD8253EB54E6FFB41AB6ABF957784FD88646AED00672DCF495A777AD8A0A4F91C9F4FAC\ F930949F2B59008C2A1CBB2D3E5FE0D4A8E0CEB63AF23E4758C995382178C4FD07D0777906DCA8\ A919FF9B38CF2F9F7CD9FE276F12FC7B0DE1DD31F3042DC74654ABCEADFF0D196644FF8175854F\ 8EE3C65178C45AF19E6E43659CF1DC46409336A48EC5935E941593300FDEB7FD738232A5417F1A\ 2B3CFA16CD08A3835FA08FF233208A385723D566952C7385192BBF1C2E73A2B1376015B7484998\ 9CBAD04866DF8D5EF484C09B640D543635852DDB3A80F2F85926D4154575F999714C4C88AE7435\ EAFB151BC90A5BC7951BD6E4A1CDD568B5D0AB42F9B1E1CDE0E7D42F6C29337359AC383168F001\ F43A79DC440E153EC16E62D5218EA23C2F8CB80201EAD61131BBE1EE5C85414FBF0D0BF50F2B74\ B89A94C391E567229745C15B8E7459BE663C6AC83DA708F5BA562608F5814A3713D040A7452513\ C8EB36A3F5088F09C9CCBF9A1B26F1211ED41F33DDFDB77CA9E5319DDE52A749C88CC7E0907BE5\ 0802C63EBDF5702B93E09CA89EF9FDEF41A8A47352D166401FAF92A8B35DDF43ED66B98417E304\ 29DBB317C8718D39BA5C364597F6C034B20F585271958AB284D184DA758650AE8C9DA359BB922E\ DE4450DA14666AD5F02ED6135DCEDB532ECD6CEA61B071FDD364421B941E03DE48ED1DBD73DE:\ BB1B359766D442D2E9FF3F7995A26473329055F8 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 5ABDB1C683F4DC2946F45916427260563A2B99D6A45693A684DCB02ED3FAEA19867E3D4199CBC5\ 906A4416E1AF936E3277F5B46722A7EB85DB2502C830C49C39B526DBA34EFB08B96C161ABC60AF\ 3466751BF5F1974E29DA846F9FE0A77A7528CD2EC911673301A5FD70708A088739D4D2CD991515\ 4BD06BBA1A0CC682CCE16BD1D0C68A72D2C85CCA0B33F6091DE098A599C3444FAECF15E7DA5769\ 1B7BAB3E458069D5F03FB5BC7C068B80B47DB1EFBCB075CD860D3B391158F615935EE977193625\ 61C99D06F0763F9DB85C987801CA9D44D66E8EF8B64B45289BDFEA52B514DA12A2359451B92641\ 983991F17F4F9DDD0AC174054CAB0F70171083A18A103405D861BB4F2530D077BA68C528058C46\ E497006CA82E7FD407A3B78EF7C7A8FBC4359ED109337083DC8EA9F6CDC9AA694C353642CCD20A\ 344A5B47C42F31F25EEB82EB1368A2171B5DB13E4CADFA21558D0DDF10EF45E7E79E8143C556EC\ DAAD047CEF149404902521DD965CCD0BC9B8354967CEF3C1C50779443B08BFA82AE49BE9927330\ 609AADDFB49E7DE339447B73BFDE525DF8A4D54D2D7C4FF0FA285D39DF0F2DA25E66F0A77DDA50\ 913CC00E5531B449D8499198E0D326D07740A29D438E2393D9D6F49606573F35F924F3125A3727\ F5C3BC485CCFE6DBA28CC7688B6D8B88C7AA62F405F38887F2970FAE4BB38DDA60531011DF615B\ B58207BF10BB0E3087E0F1736A1192BDE595668AE6B4D7A370ED2572C388901C23122A8684E025\ 6BA3AC3F7F547028E31AB28EC0EDB31E922F3FC3BA1265ADB8C19A87774A89DEFE0D51B0B70047\ 0321993E671224CB07D017C4C0C057AD7DC2DCD634CD88C53E74454248C4D562707EA3299E6C14\ 5C4A86EFCFC3567678B24E5B8D7481CAF2BC6D2194490B29C0F2A6A19CD33240114F44D5AA852C\ 69B12951B89E599A36E42C32020DC5D45E1080B510E898BD08784FA7418D6DC1BF8D089206684A\ EB0513A0F4D431C44423B4E2666B9BBDAE879C0F1DEFCABFFDA4A45DA816AC4C6CAF1DE1F35D19\ 5C88F05733D60509E20301CC64FFC1AC3B07DEFFB364A65B6C58EC10E588FD5420189FC3D5A3D6\ 7CAAAA3C6B85986F29984B11A81CCD904E96290EE31DC937D26C84C0E19BE0097952E8F5D0312E\ D44AAA311C09EB98D275268AB6FA7075D60C8881AB1CC3516DC79563F7E04D4136221E41827589\ DA880A812D85D91AC9A8DB37B547524CEB835F033B1A452587A39DCEA47C26C9AD418749C82786\ C96927B8BDEF0DC2149F38836D3A3522904E08288300A69B16F0F5E7F5DA6B6248D7D2800786E0\ CAD44E36E32F89870A28B8D9D6685DA341A85F9DA2AC526B39E9A9326E5AF5D3E38D8C99976C:\ 05C3DCC6D59016C8A56E2A005CDC423B9E79B2E1 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 66E3E90396ADD580D0CAB8120EBA8B827B94F8EB5CF151E6DE08F163F540E902C98F6B069D4952\ B8F0D4469C3B90D67FF87A60DC75063B69AF405A72B3045A7A878820804ABB23ADCB1D4717C9E8\ 9BB90ADA72714255F3DFADE1CFDCAC240F4AFA5D5AC955106390AED2E72E673EA8B45E2A92A166\ C6131B5EDC7F3FAE3C256E586C56ED9CEACC32CDC249E6F812D4EDB4783ADF31CE6C83BC81F77B\ 6705C1ED1C37061A9D3BC91D7C0F889F5C91E574D80E3CFCF19754201CE5FD4379EF087369CEC7\ F68587907915FAA2195544490DAB9D3434AE49832556232A77CAA32A1D6FB6D797F0E388DE8A98\ D7A7B2D5FD71BB4983BC4790A652F8FB99D4A7D0E18DF328BF376FCEBD2FE8EBEB67AAAB608881\ 85706F0E320765BFF8516280F45F53677BCEBDA244DF9F5604FB8C816E21478F25E44DF83903D2\ A3CA94BD8AB15565B60A4D41B08A155C42E7AB92922505C793C1796EF03CDE688F1FD0E4527888\ 6F0098A72FE0AA2FBE87F56DE1D2F2B8A3EA2533FEACD41880067FB69FEB8DDB8C9B7276ADDF0F\ 5DCDFF1FEE3D4A9DC8E66361AA16931D1C737F08CFB7F5A874F1294B25BC2DCA5757F65603B8C7\ 2E7985723628AE7A6D9A0B5BA1BBA655F639410C681C80B0A9C3FEE24752FCDDCE948314E3D341\ 22270608F563A623569412F5BA073E54B59EB379672DCC5A85D6247648397804EBE8311FA5070E\ 1DE5CD66EF2FD736D5598791BDFB0F6EE30C617B3471E9BCB49759A679D8BD1D8FA86748F54C7E\ A97556AFF98F0F49A1EDEC49F97652C197C5D6618E227306DED51DD5F44D800B23DB2FA2BA2599\ A215B7DE3F34AFF7ED3911A5C6F7F57CCFEC6A47C7DAF1F2728FB58AE10400C3D8B29E4B1DC819\ 14D3890C1D09B6F52019D4D28A1701A9CC86EC9150ED845BBC5DBBD1DC26318B0420C64A1825DD\ 9AA0C8E1B47836F5C8C4C2B70F6B758476E9BE624FB42EF954DD94F8E326B8EF51666861702A5D\ 1D65D62135F89E3564D3A913061AD00A3EBC3C5AD3C52CB732304792D0FD2F14BD0644A5E3BEDA\ 6491E35EB1B0CD52FA3FF75228F55230FA20444C272AB54DC0C0DBA7971C923AB8CD6E72148284\ 019321302E2B1A3580A20A4923BB6B6E104529D948B5770E18BD2C6CF34B389F1A4A9BDBC464CF\ 8FCE544891145D980293DF4F0FE6F35DF22117939BC26C89735D027541B562A93D0C611BD7CB87\ 1B556A3E3F0FCDF1F5DBC7A9D795C1B45E1DF6D91E6C7AFEA00E00E44CB6D25CB6C2D658D0032D\ 67C7609A8598BB427FA9B8767FE3E3BE1733CB352318E6099F7EBD3B1025DDA5FEF1F4BBB7B173\ 5828D291B77236E7660A23393F116EDFEF8CFDE2DDDC3017480B4E6D8A16AFC5EB4955AE855C:\ 0C68CEDDD3BFF23048B47C9BD966A19E46F7E2D4 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 99350D7C2BCCB1F021C0E1269D7B764B0C3015839F0645127820CD4A8413E987892E8704AB3C3A\ E99150F2BDBF9FB7745E7BBD3FC99B573C5DCED0E842D98242D8F31E5DD69B6A8100C7DA0C0E33\ ADDEE224B9A7ADD35ED065743ECDE4D38A47D67B3553FBA06C4D2F5B7A53B423C367DEE0AC3CF9\ 4B9A7C620743609E27F16EF8AADBE74FED3A727B00F8666562461D126038067B44B3CF1D7D41AB\ BFCEEF122F6BAB5403EC7AD66B8B60F790DF1DBAF330A040B1E542E783DDED48C1D8E196A9FE32\ A5B7EA6F63446E9BFF93B0B3892CAF044F87002381F92D9CCD7FF554E07EA42CA7A44577C47B54\ 97A212157EABCC342D650A41F3CEDEC99E5207FD0AB916697D85A619BFDE3AC899FF424AB3EFE1\ 7C9C8B96F58AAA9362DE3DDCF097D7E88EA3006BE01FEF9BD9481CF9E1DA674FA133D114D5910C\ 4D61523CF20FE135CA48F3379C0A29D0B05AD4A41E782968A1520BA8DC6268830C55BC92D19232\ EFFCC65F351194430EC4F25DF2413DFFC08783876B87A0F6AC630CDF04A4FE19EC6C56CCE07515\ 4866E7CB687FF5537C880679DF8DEB23D7278ABD4AD260D445388132F6848D8B6191FCF90D0D66\ D4B95B3EAC5439D6C6303CAAA73B968FC385EBB727B6A5526B0162E2AAC32401C62B3FB150C598\ 846241854996E412E99873BA2CAF040B137250F7706EF5376ADAD52FF13B812DD74A8792E2474D\ ADB993C2239494C9CFBF860F1216EF02246911AA8FEE28042A22A5BFE311406E9C1F4EF8233587\ 10A6E55C07A31F59B19D70500835FE15B3B36BB119A4971A67D66F3BE04E27175069C21EAB2F28\ 737C5F564552CAAF7D45CA4BD7FFCBA429E7593E603975EE81A97E8BDBD2C5CADB1C18818DD494\ D7186D36B36F289118A834297C2B8C3BEA35F716435F49E32559DDF80910C3767CDBAD107070F7\ 37EC37DC47F5E3529F863096FCAFFA389E848D8F411B54CAF289C382C0AAAC6C781C03E78BAB1F\ D299C8C14D2A37916F2287D6B5B1195D0A176613065D8C3038096A5ED63DCA5F9EFA2E3A5D5445\ 87DE1BCD995CE4CF371873D0F5032AED6B1A08686E4134B1EC63BD9E755863771B885CA610E03C\ 86DB96CA77E9E7CC0C4D97A185297501C20A5953D70664CE9712D4143B0F8CA7941BF6F114F8A9\ 2ED16C5ACAE4B2BDB940CC573B86AA7918167BA3AEA93AF833B51590A09D4CA299DFF975C2F1CC\ B2E3112CF5684C60344917F6400D1B1B6FF0A986A1CB955987354EA8B69B4203A664882F6F1544\ F71B5E89D104CBE8AC412E4FFE927F9181F54F1DC4A06B488D7058FF1B59D67A47B42276E9E4F5\ 5807CB1131340C5C7D5FA901A75999B3EEA02E853868E6DC4DA82A2DEF303E2473A8D7D6C0DA:\ D9A5B1BDEAA3E8DEF14E7692D97F502C48A9ED21C2429BE6 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 354FBDA4E986570038B707CD6A79CCB72E00640B07DD1418643F2EC5BD5B281D022EBA2413CB38\ 0D061EA457CD4F60208F7A99412F0CC511005371CA55BDCEEA21DFC3AB42CC654E0A5E0BDE063D\ 63E4080AB120959D0B298273F02A070BE9355CE28583844CB85049FA9813DCB0A1762322501073\ 4578E48A543AFC3BAB1F7D50E3A2FA561440D08488BC6135EE12047E89EA92A22E175F1FBF370B\ E1C4B596E14F77BB4462F34418F6BCC1526173FC8F030A0604F24ADB94AA01C9602745803BA767\ 255721F0907B2F387A5F31C3B45780CB1F8F526169E5D710CA88901C5585CA980B4B39D8DC6EE3\ D563EFF3725E3E149D6EBA1B2239662304D504FDFD53619D17F35D6C2597BBEF1257CF40608548\ 4540FE0FC2FBAEA3955F49A6BC71028D984804F7DB46C6E2ACCF9CEA144781D795BD4F65332E3B\ 0FCCE28A63028ABA2EA2D03C8BBF76BCD8DCF50343FA40D53C133736A632E78B11D3D5CFE6A990\ 4CD9598CE9DED58F3350BE38937867F59B66115248946F701998A9A3724185595B114E696742DB\ 0EB92398CD9E93BD93AEEC0006B9449EE5EF94D7DDDFF9221336ABF8280738617170D89D2B6B5B\ 8BE4570430F6721C2DF50A94679A7FBC3D6D5E32953D93F8C2192C70CF945B2EFC73D3BF5AB1E5\ EBA34EEE60B755918E2C3E71CF61D666607FF099D2594AE8EC91B9882DBC27FCD235C4AD01A568\ CA39B426624948D732F7DB11F277EABE1F53AB877F9841B4DDC3C1886FD6F37B20F3D80BDCB874\ 8E99F3A30F12E5D3FC5407D40D95BFCEEBB41515C4120267A543892D115C1830220964F841AEC9\ 563368DDE3E837C3721DB4B5E082073FDCCD87914D495AAF07890B1673FD8A614E5873634EFCE9\ E223C2F5B83DE8453B773A86E4346DCEEA885D7BBD5D9B50EA3275A7C7A9459F5FF974AC0296FD\ 6F2B7DDB178E123112D56463F2B048829D3680020B549D16AF318C8FEBAB7CC6798AFD96F67347\ BA86EFF75BA5425833F1FB581E9BBB3EB668F80A441C69F61FE290D03830AC59E2B9805677995A\ DBBE6ECB0DF9166385ED4F896D4F4A8A12B94EB26001D7429D4A81EC3FE613DF395E08D2A59D56\ ABA82F9E7196EF2B9CD024CFD3DBA7D50863344BE7E291B8295B46E8DCB765078DAD3C3C2DF539\ 84BDD216BB5BB596A5CE204762737AF55328AD03D0CC0BD11823E89A59802FD2D774C830DBB16B\ 2AC25EF359454F853FB85142BE2745A6A325F421FBBB41F6EFA4F4F931B01707E137B5E66F96B2\ C76A34F866940F0C34CC8B6560D55C18B468BACBE4220440B5A07228F4BC635CAA92325BC5F670\ BF0BF3F1C48AF93A85A7A245FC4EF214ABA06CDA6351920C3229468C547B0BF9C7CE3CC7142F:\ 57426DC52887DADEDA58D6297A1680E85C1E65EFB9285D99 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ B01557E5B83A7C68993572EC916B133F1EFD32358EBAA3ABF519CE1FF7BAC100E603DA5A16DC49\ FD5ACF9B04DE9C4ED5A862AEE3C9E301392D32246461D3DA41DD69240B47C4554D6B036CFFE7A8\ 3C67D32785D77049A056A4BB9AAC1B94A43516D56C2B23DC4F0F8BC203614144E296F48065ECFB\ 812FE28B0622A24EA973B6BA4D35F9CC1263D6B6DE14FEDA3A2B62B7608A84BE07743F1C911806\ EAD62CBC130C55DD6465960C8041D17AB27A2EB0661D2D6FE03B284773D84EEFD68AE37BAAE934\ 0621D3656785CC409846E61D7D44B327F2D5CE6247740929C42C193EF515A283365A6C22368518\ 9F32522C12F8D6FD67BBCCA7D5BFA7275E0E1877C3A16033CBD35CF07C7655C9D1AAB6F08F984D\ 5FC420F07B498BCCF77C310DB9358BA43E015780F0C79E42CAFE0AFFA5F7A47ACBF79D5921EA8D\ 3869E74D7A56CF05A3BAA75C8E6A38F78BD7638AD9842CD095A9E6D5140184C99A35AB3DC6A0BB\ CA717014ED032FA09C4AE182183113594BC6D78731A0211D82C91F41F6262FBEF6D1EDD2FF973C\ 1173C70071A6F516DFC34FBF6EDA87CD097EEA24A693F19D8474E6E53B02B5B682B4B77D25E159\ 2DDC9B9EAA12B19D166F78F3990A1F557CB6DC795754C00E8066A7607861779237798C100D0BD9\ 75354F1E307BA6E10870817482E4DBF633293B67670E27E81C88BE245C0FDFBBECD2668B1300E9\ 1D53D0011BD0F67399EEE363FD6B63C8BA86807A866F3B5A00A2C0224C40CD6838B717BD2A58A2\ 4115CCC0D8CF174C3ACEAB7D98482AA1E29F29DE27F7C3B60BD5D991B73803345EC59347C1922E\ CE2896A6D8772BC7451D665B210E7A7CD1631EE2C55893214111CFD2CC3944080F212AC85CAA45\ 9D44C669B36CB59D6A09E15B2146A0739EA5AEC2275000E5CE45A3EC36921C2917DB20042A7635\ 2C28B32D912665FA5857C7D6961BDE4FC9F9279EF39D9EB2B826D77293280730231B0F530BABF3\ C3A25DFDBB5E5348C5AF8690844DC8CBCB55754F5E5D5BF3C6B0EB639038D58BE4F631299600F8\ 781906ED42D6603A432037BCB72FF07592497A288F9AA7AA379358395F7BE07602E547D6C37DA0\ C3F22C395068BBC799E2BD00BC306CC5624D00CC55CF46C0BA5CE9D722051C9BE866BD244197FA\ CB9DC70A124AF897396877B92DBD891C57E6439F51168D9F43EF740A7E810966EF6009F8973663\ E695FC97946184BCD39D13130B4DCF218087F16A7344036AC7FE0111C7050464A4D32EDE1081CC\ EAB6A15777D9CCA0BC644CC82EC660BEA8F416B53DC14421E811436C4088A37CB1B46B83A95A35\ 3BBC54FBB836618D1640AC53A2BF916965A81F6E1149C0EA89D50D182B652D97A810F5B43819:\ 55255DE499962F4597F5C976155D223EEA3740A7544D6BD9 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 23AC39460E6746D760C584C6B35EE1F579B43161AFB94B725AE5E3D1DB9B5E85D70068A81161F9\ CCEC724CE1D2ACCC9C5CF21AE056BF733F9134AD16B2121F16644E43CF1D38C498DB715F134FF2\ 677DEEB796B43641C9C508103016F94B91EAB0311DD2C8E81D4E1F4115CB329B63F34F68D62314\ BA4C77EBCA6DEA17438B9689537CD849CC08AA11665FF59BE715E2341072DCD3BD6FC12E21E176\ FDF969CBA0FC63705250609BB745E8578BE290B74E990993E2D09F8B3EAB2DD36F360734EACC54\ E03A4A588ECE8C622DB610C0CA883A699EE4E97E31F6BFA1F0771AE380A1502D178AEFC0916BED\ F4A0BF876B18C23245C9FAA024CAF00832A60A083052D17E6BB8A6FAAA99CA1272CA2D166A3CFE\ 60D19AC01F1A0101E8E39508BA99E10D66D0611F01E4F212434642A2742A6B454E948EA7B55BAA\ AD242420C052EFBFB531BEAD83C60B7015B4FE943FD6962B08B1FD6CF2767D5E045EB1F223011D\ 83B061F0AE6653F7BFA64C0774AC423C74F17877C7BE62669B095DEFE73F389D4C25C8BD78CD4A\ C76DF63C36A19082C97473B08B3F2FE8C5D89143F4D8177E9372414673D340B301A85C5D9200FF\ B36D5BB12ECE203CF00181AA5034C09A7BCF3843F98E22A02EDFC1A50F896774252D1CAC93F578\ 9BA684431BDF3C7978F3647696DEF4489DA921B76E56D46E208E31F2B320DEB6196E723698CBF4\ 3204E68EC8B86DF48344E2575F3E9F1818A334C66A942EC3C3D6439CDDF970D4419EFD0206E413\ C99ADD9D48527676672C96B268683F49832EC8C1B5750B900715A7955DBCF06A2AA6995475D15C\ 7D5EB440E228899315101E6A8A45842EDBE41785AA4B2808956731BEE81AC9ED8741884052DC10\ 090FF82CD9CCCB2CBCDAEF343143C5D7ABD58A730AF8229825EF2591A253FB52F1A21C8E5CD64F\ E327FDD55BA792CB1E8AE92A3EF84F035D72F808976350165ABA7675D8A520B9EF9CA7D04F3D26\ B8ECD7E5CD61A19D0CC13DAFEF2283808B808B4C5DD01E9A6DE54662D4FD21083120723D84EE76\ 2C197D33277E0D87E777FB2B619A597DBDEC83A93F87ECCAAF64D3223CA1E2CD2F7A46092EC5FB\ 0CA5350D575828AA20D60DA75379C7D883D662A0F66880C7170E11BAFCFCA74556A180F140E173\ 6612FF94CA2B5782FB8990408CC77D39FA68262C738A607F27CB5247A00482A7C17C19CE01147E\ 536898826372F81157939C70BF693C9A194619BFD5F9D56B5C63C0C61B3AD6AFA5F03BA313E4DC\ 69C6E0F1DB8FF4A3019C5A4E990886197D5C1A31A7C108D94B285FAC00C617D68B177C26576CDE\ 8F621A6FDB021FC25C9534BF7E7E1755611200C59193D8C28C7B2CDF47A05CE9D7A3D89E6103:\ 2AE43BAFF61783491A33341B26F65F7CBA8E393B19C1E97BE420FE58 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 040AD7CC43206F37EF55970D545AB43710E0BB8AB6FB66F7E7CF60869F5C61C018E869CA7FC0E6\ E3798649BA2A1B7CBEFB1C59EAD2A3117AD370CC3CC9D5714430429A002BB092098BCC6DFDB593\ E1DE2546D8E410773F3EEB2E10A15AD39D51F7A87EB244818BDF53DC3536C955982A733B5121B7\ 2BD5FCBA34D479F246F505BDABFC6A0D95CB0FA64EF6287052A0BC26133718958D19C7387BA152\ 10DAF602037E407A731B918F681FC2005A6CDDE141E405493BA0987978424C7B189C94B13BA8A3\ 0865241C1D6EF06A8E3EF3DFB9D0E2443B7F47A4FDB1D02B5FE31BCEC51086CC38BFC7CFA2ADE3\ A75ECDC3B4D01F3A9FD71EAD8E5A0E9870C605DC4A6F1BC3932937EDF7F4C72794978C582A4819\ 2C12156B142D9F8D00D837057296D2E1263BD7939D56F56D31FBE031BC7B1194E2B19A7E3A83B4\ 82BB57AADF5FC8FCC653227ABD1C895CB3CC7FCD5B7BDF86FEF7C55B78323DE51E2BCFC370880F\ A872BFFD4CFC0909A9F79B8089EF50E7E93239E679E158D6D518F7C5555F325953A36221C1269A\ E5F235CF338BA7A8615EB1D0B54CDE65291F6EDB3C2FE41FCBDE0457CF050E5E30149C857A91FA\ F767743C968C56B94FF79A4CD6F798356F20091174187EF169210706E84FCFADF57D96B7077433\ CAB883C73C060475C207E611E679B9A795428FDD891626CFD6B868203714F71BB158086F93D86C\ A5499C0B9B8109E1CD0F7E6FDA5B0840CC3FF0C1EBB4CEA6DC5562BD64BF08EA6E675EC6298C9D\ 5E1296B327B4EC150C0373580011D105DB11CD4E8FC8F3E49A64E2AD9D1D2261C85FAD9A31BAB8\ 6C7D92837FC297CA387E945DC82CD10255D14ACC503606C0A9BA7E2F4F1C72A5E17801091ED1BC\ B2B9BBE91EC4EDEE5A908EB3BDC51EC443BECA0E99F5BB8A2656702B49723B0A3B37F6C7443BF3\ E85F77CD3DDC39A7B016F1F53683E75C103A4C78217D2CF5D5E156E2293507E25E17CDC7B22136\ 92E0A15C0ECDAD687DA2ADD96D59B609A7A9956DB3705C22E38460933FF5302343C5B36ACE8DDF\ 022127C5F1046EB03B4CF2BA625989C2EE484D365D04D69DE3612D3961491FEE3F101A9CC66543\ BD52D0BBA41819CA542E56C58F1B2861C224EF4A9A50AA4CA7CEEFBD3BFFEDBE82D5FDACB315A6\ B9A4F99A01BA7B09FB9D826DAF4AC7B913D8A9EE93894B834B8F2A9B242F515D7D6C3A2FE9FE59\ 7583497785A299DA86185235FF8D255A17BF45851C67DCCADDDBADB5D5B49D1E357793AF60FC39\ E15F201B6082999E5252B6C34B542003C209A8F28DDAA58BEA27763AB060510D132219BFBB5CE7\ D8F6759D64E2D25604156E4657E3EA764B2C3D2A0710EE44D5AD6EB9C7407FF852C2DC161D46:\ 2372F9B0FF27B8B5FCF2735FA58AEE77083942303E1378D777407E0C 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 063AAC01A9FD95C649CB7891779D91D9DD1EE283A256083007C910D584A8A967412B486E9C302F\ EFA2E4B3EAB48160CDFB924C3E4818315C2E8939BE010349D20A80E34886BE789BEB3403CCBB3D\ A87FAC97F60EE091656565843AAC43EBDE6B7A65FA71AFE86DD8B00431A75A84F7B40231061806\ 491AE5E20143F09949FF991997C93950E209313E28D1B1F17FD790AA03F6E9530C934566A44FFA\ 4F059C681DD6C9018E1FADD0DE1D3F48E6CAE065013B1CDE175A6714DC64ADC360700D2E36C120\ 70BC591FD06A4DD02E5555B26E9A319F9AFCF1FB446183DA03C53631D97DA89925ADFAADDBABBE\ 11B118FADEC43A6B726F3FA10087E6FF75AF9DBE1D0BCDC29F88CF2C31492CCD38C834F237FF58\ 709ECFAEAB5688C3287D1632CCECA70ED625840256F93BF7D21F05E7AA3E4F10117C980826B9A9\ 6CA135C510BC1413A1A2ABE79DCC335667771EB5D327DD9FD8659D8385A79526AFCF88D15529AB\ 76955E6D5D4C3E452CD22EEDA7576ED1ABDEE5D75A003D24307F861DF68335A2E071010F5F74E9\ C5CCB0ABCA73B474E7EFFDFE50F8171B4BF4322E7B5E1B555E50B16F27F078BFBD7EDCC55E7E4A\ D0752925226E2EF083AF2BDDAF3F49AE3E4BE98D174F9EFDB42FF413B336248FB6551ED9AD42EA\ 2F619B25E9BC3C26F7C29733692A091C754C23B60925EC99E013D002EAC4234BFD35BC420B7AB2\ 69419BF731E1680E6715D7B268C463298FE1CFC554CE6A0875D09177E679035A9E4980E828B894\ 87CA9D8AEE9406943EEB4AF2B715EAE982C0B129655B392F765C4BC59CE9AF4049FCDD52C50600\ D4423045D61D4F917B2BBA7D20CE7086ADA6786000CFCE344BCFB937F829FFBD9388553B5F4E90\ 71BF8AAD6326859B78E4BB9F96FED01D84E0C22AA6FF48FD3A2171DA8BD32556E010E8FD120C65\ 02EFCBC0FE8F3BCF58A021B1CDE9156EFE82DA463805504309D515A7DF571BA206508CAD4B9715\ 8130576BBEEB5757F166E7ABD74CCA2F68417DF7076E2F7DA29AB4A4242545B41EAF240F1018FC\ 12E581A9C023FE555AFD6FB4E08D6016A465B03566EAAA4FC5B6583366639DA696CEB701B446BB\ B320E649536C14454B091840C0DED9BF51111E3EDC26E7644CB8CD342FE5F19E8D81D9F21FAB9B\ 5B4C0FCB020E4468C8D5C4C6C42312745827DF00E8BAC1DCE0838BCBDEF39C05A50489D8E0B9D1\ 230729F544C5ECFE071F67900A394C2B5F3E993F0B1EFE487DF0C92B0C9C378D6ED097C4DD09CF\ 59A5470EA59E0CECD91129D26BB8FF8A145E2FA70C1F2AF7AA615712797E24546B22ABF8542FEB\ F3C7948C328E7D8470AAE32E44A4E71FEA0974CB76B7775617CC450999BDBABEB98CECCD756B:\ 6951EF357C02124B4D1E31E956FB7A3E1F8EECAEA99C2E3F379D9F10 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 5E45AD93CA54638C779AA42B69C9CA40E659E8169C53F968126C05D39F08C5794136E206FC9CCA\ 51F496C6E781AAD51424188D80CC2AB68745A5B277538ACC82AF5F9C2F7E24A2FBA1801DDD7E2D\ FB8D1C0A599E6E7DB9EE28483E9A2F1E02CF0C0640988C66B57F4B60018D1A7E251D4FD87D8D15\ 2BCC74BDDACBA9AF2460C3738505DB119029B4261A96BF5A95F385420713C283E843BE2797DC28\ 1C3F1A77548E97BF9B6D764C523D2C462F77DFE2121A9BE7B436CC4B4D6D00D8810E1B80DA3D53\ C28D20B06272CC48E665150A309DC80B8E4B2C8457C73E0A81B734F82F0431877167F116306954\ 6FCBB7D0C828A8F92C60F28B679825CCDB9AD1FE0C20B184753AA2357B04DB9EE3AFC26615DC80\ B7A080748709D2237CC22ADF374D74B3B4A1CD4265FD247E4B138C9E8AA4FEE4DAB218090D9C4F\ 6CE5CA6C092F109C5D0740F0D9BD298FE75979B5EB122E3EDC0F1B5829F87E3D92EF91895B00B1\ 5CBB36CA712BF71FBAE7D5FA4F912C324C6BF8C7E2F35441F9F38982E6D33299160B058843CECD\ 911A64473CFB46683B3AC23AC940E2B4E253F47B160522A76558CB8F487C87CE670DAF81E5650F\ FF511DBE2DAA34344B1133E57DF8E7455569FD89C2763D7D3214E7B158320E795FCCC78AB535ED\ A3FBEACB25CDC81EF7DDCB0A7C7579F78D6585DDBF6EB1234357495EB8A36B7B7F81F50B3CB7C4\ 185C208425DF40950363DC9917D129A681466B1C8F0F02ABD5A45BF240ACBD2263C74E8AA2D9E0\ DEF480ED29773AA0D6BF518C0FCB8B6B005A2A41A04FAEC5C650EB280B3E92326244902DCEF85A\ 581517EC6CC917BCB2A69F2A070F9D8E0AC15F79790B0DCE9E508A8C55512E2C1476BB63018D01\ 4E101F13FA8B0B5CE0D5D6531DB60BF1E0C709C5154BEBA3CB74D8A7FB21C65857E692B2438722\ 8E48CC4EF259E94C2BFBD7B8D6EEF502E5B30227D08F8D9B31F61804220CD7C0B36FAE7567E664\ FDEDFF60C3021B1E4FBC8234EEE749E01F0E3E4D6AB2AEFE5B170C01CE7C7875F12D8DF551EC46\ 46D9AFEB43D5A47C8D9CDCC2200BAD5D32624492444BD7552B7E0077292AD15CE6B26A8FA036C6\ 7CB71338BEDEB6E9AB0A17C1452256AFCC6F9E457525F9D285DE4BD16FC66309A047260C932EBF\ F33E2E3E6EE3C0B3E54301E0FB5382498995E9C5D8078560A539CEB8BD22600486BEF999F8C506\ E3B40BF2062D3DFA98A3303C52423C8134D713B2E7F5DF254237460655B4FC668AF7B3886EFF4B\ 9214ABBCDA6D33DC7E7C9FB9D67B056B9ED2ED7FB31892EDDAA32BD99C77C533223B4E85808F3A\ 0C50A2B196A6B091C1E876587E9631959BC0FE1A6711242D52AFB80664397C4F00A14017A2A7:\ 3CA260A152BCE7AFBC673137B4B258DFCBCE5E4946B909468F727B54AE3171B6 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 85DE284F504C0C624AE145B4AB67FB7D91EC26D0E9C3873106C16D5C09BC7CE453B4D495199873\ BC375B31ED963978074F6F28ADCEFEF618DDD53B2393D4C99F6FE8F09B307403538EEBAC5B7647\ 449323301689751FADA050BD6C8B8AC14C0B645B0847957C803D9F336229D9C59D3A276491D4C6\ 06FE6CC1F936A97246F1EEBF398A4109D75DE8BCF372F8966579CAAC9A254C14DCB573F6868C08\ E8D932A63905C8E318E28DEB26134CCA2CDD631389B130B1D0469B86C462BAF826EBD48CC9B775\ CC5D0002D87CCFA7DF9F0E90A80B1DCC0F0741A3CD6F39E51FC10CA683DF6611D3ABE6C453CC27\ 675F825AC3DFF2F7A521D132C71E230E84C520BFCC1437905624C398B4C5908A0260E7C17D8C7A\ DFBF75B059EEA93B87CA731D82A0505C590587796C7FDD614DBCEEC4A984E0612EDDCC055B63BA\ DD66DA0541D35E4AAC9E766CD67CEE5CD75177387C5C8D94C86434ABC1B14639FA2599812532CC\ CF2D72B3443145F5DBF2312C74263A48D8B7D09E8E622D9FA1723029C84C6D904609C253AF8FC3\ 0D574559247BE10029265C2DE89E12C4C4505434969E8703AF5906A278AC9F3E7E01D2A8FE09F5\ 2C121CB3A97C7C3A4B9BE17D146E8BC2213189A356E4D9959DB4170F1D004BB2D4FAA7B56FF489\ 8AF5DEAA337B1807B52C63B474E1FEF110AFACC1D57ECA33A2DD248BD830A16309CD9549BA44BF\ D33724FD447D217E5E543AFE7DBE74C503383C5BAC4CE75D20632BBB92FF02DB888DA566BD7E59\ 4B613C3754E1FFCEB7D53C0BBE678399BA448B9E35F0F2BB0477B767B1488EC90CB4733F1956E9\ 6E1845535BA97224E569799551F07B8CEA084FA8852B17A9D8B34C0047A15F8D2754011C3B523E\ 3E5F5763EDF6A06269AA3FD281B8F9F1B263705A9F5170C34B9E7C46F40A3048E7B98D21CDBC6F\ 721250670E82DC60DA8326427708105C297BC05D8BDE97B0F78E55E00D5B65C65DB5B11849290A\ 6D58FF4F3B88697879993509FC7A5092AD6E194C35BBBAA74C2452FA12150CE3B6F1ED8DCEA0BD\ 600F529EE4D4A84400EB8E756770E7BCB7E279626F9EE6B30B9E9F952DEC4150CC71B0F9939809\ C7D2DEDF98D01112A9A58821A0BC96D267AB9A2B77C21AE53F1135F9FD390FEDACCFA9A6817121\ FA5719ACE8C079DBC8391C1B4BE6AF67ACDD52016933A99C9F2BF62093D5299D093EEE7226C49D\ 5BD519ABCDE8AD8230E3B3652F374ECDA7F0A6BDB84A8EBC9C657213B402EEA5EA5FF2F426BF8E\ 189517255E38E19ACC793971CB4492E8D346D25C10EB626CD709DD670631B2F19C95752879DAF3\ DCD2A07109625F4D8403B6E153E3536521B78B6D6AA7ACCAA42B0A2CF47048099441A5823F64:\ 003776133C69B7D16F80023FFA5657C44DE96400BCF49A7F7ACE7BA18B224F21 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 09CDB68A29150A0DABA207A6515339A0AA10470318DD7C6C9CFE89F8DD520B6E5DC9A612C6E365\ 91159E162592D695B03300A2C5C4C28C8912DAD980E9AE05533ED8D7F05A5B55A8DBE01418C1A7\ 1F01FFC89ECE38B0B457FFE586AB48780E0F297EFBC7A27F713FC54D0E8217D760D545C6A384F7\ 5865C02F0DDF49B0FDFA7D920F57D988B3220DC1BDAFE0325EDCBB37E94C09EBD0E17E42FD0E91\ F86B958D9BCDCCF525F8FC4F16ECF2404077257EE35C6E86DE6264910E33621535316C30752500\ EC0D52BF3256BBE976B38390BEB6F960A6EB1954356F8D94EE248AB021CA09192F808F8026C34C\ C95DB1C5FAC16255C518A2E3B0283EAF066F6B31A03B2170377C08C1D83D350762347E61365B04\ D8DADA99FBADBAEF87D8008BF09EFA3153CA0C79321C0EEA989E74252CCE2E2A34F0FDE7AF1394\ D94E2DC52E98B25680E5DF6A1F99E6178580F3FC6FB1217385E5BAEE4AAD33B434CD74F56CB95A\ 8F9F263A0CB5CE04D5939AB62077A5852F7F1EF8E7AC72A8DB2C7B13616B061262BB6A18970CAA\ 340A469BA8F86EE8D1776B3B5E2F20F64E4D02F6A3571C7B5DB810746252B6C51E584787925164\ 67B0B564A6C92935C7F05A856AA6080AF0BDB0639921A281983FCC406E3612B0A3626805ABDBD9\ 01C7E0E93B69505170CAEDD8B811AAB18698F3ECC6B6B0856FAE92B7D72CFE805931CC3C8BB65C\ 784162C1B88D53C50BEC2370982C0F4F0419D26D17CFA4E6757C782605B9419134FDA2F09C568E\ 50BCF07626B9E6B401F55B43036C72A339570652EA50EE4BA5CE3AC1E098F61AD23300D51F95F3\ AF334CCFBBE3413D418A1009137CB9EF22ED141680CDA3FF7727BAEE26C2E35780F9FA8B63F122\ 9B24CAC1DEE900F52C03B734F54CE6F5E5F32D89E4C991D3788786DAAFDAC3C262906DADE08612\ FB9F8EF1364ACD2EDF23416F1AD0BC3E23D5A5EFD11C3838D3E4694D065E04C349F97AB5B9B4D8\ C0272CBA7AFE0998BC6CD51F1614476285F11163D20470073BBCE0A06EABD199EDD2523C9D595D\ 47D211D844929E3D614C26A75F7CB90734DC3B9DC7005DFBB66101D9B0C3DFDCB03F972087D093\ 4EBFCDD1C9BAC0F62D50C5437E5A9834DA80FCD750D8C577DF7703A63B847D75B9505C522FD241\ 10C1237F7A2DA2C6610661E154FCA6326A0272BDD16BB78C9891D3F94B1BCF064A1E0DA24B582C\ 962FB807C3A69B4489AF0EF8488C59530EA5D92A95A12B7C00F28889AAB6A91E0D9D6593944AB4\ C89CF11AAFDCA2D72A1C0C793CB4C18ABA658207517B041C7830B3799BA802841623F3EC6C3D6E\ 2E1A11E0E33A1D1F97A4E6D771D120B11C52736AFF0AD3FEBA59FF03FCC087F50E36839B4119:\ 085A85EFA966BC844824B45AE82708DB927709623911A1FD7877636C62EEF2C5 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 0C79B2CE647574C631FD55BCCB1DB3BE69BA847E0F23AFB00C21B7D41794C10F3B8F61929227:\ 1510BFDF958D2C4BEC1EDBFD675ACE6F:6D1DDDEEC1BA73C15CE4851DE0B6CB0E 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ DC61600D30CAE1E33CCB50E4F7CBFCF7C889CE9DC780B264CEACDD1C21133B49F9E1BC4EB879:\ 0ABF45AC5AB91F794B98DFA5FA0CD894:00DA828DA37D94E0841A484A2EFA4C19 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 6072A1F5D942825E92CD02CD362FD79B209801622723A30DD7F99AB5D7830DD88DF4BBB29E24:\ A6787289DDC9376947BB930EFD48CCC6:FD020136FC6D6B8BDFE9C13CC6E3F2F7 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 846C5C3DD0BE453FDA15DE04706DF957036BF8771305D35A99D57E5EEC0276A0F8C69928D05C:\ 15175F1FC90E93CF104366657D8BC80C:874B703E2D1AFA6A9DB2CE90DC30F76D 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ A134A7EA12EFCA03BB8B0D2420A2234C7CAB5F9D990A83D9C2E014F6DD6427F25044FAA47977:\ 51846E247DD72812FD39BE78E1B2F50AC36EA2E3:7487C24E287E5BCD87B20A15B9A5B7B7 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 69A0D15F8D18562FA4754B77601184755E99E3C42E618D497F8A165F25B393CEB6B00FC7B723:\ 3803A2009424E2AE8581075A53ED058A274EA8B3:E359E0E5888FE70D570BCF0AF6E89E0F 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 7876DE9ECF5FE512ED7E96B24466CB3C642EB6AF65FF7BC6151A92F08DA4BD8CF110866E698F:\ 936225367409CF84A999E6FEF051FD5E75882295:99EB3466CC3DD02A69420C158FB77159 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ BB7D4F56219322E943A1F8B23EDAE9D510760CD9F9F6DBFD8F4D88DCF237980B64AAD59747D8:\ 0EEFE7FA570C584A0A256B8192C964D86D37C3ED:4AFC9814F82675F50C84CC306E758A8C 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ C47122CD6BE53F777B20E91324A92307589A731711BC29FE6902935C307CB61BE8380E261794:\ 0DB2B86717F826082435438568139119BC66B0BCBEC2BE20:\ B254D36F8AA0429EF8E197245B6B92CF 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 1050A35FD348E0EB6FF6FAC7CCA1A342B471FE1085B3B7928239E1926735E3832627FACEAC22:\ 31A10A2F283FBC4B9723794D41C935B03395746408A69787:\ B69D21D86FE5C58FE8936043477CFCD7 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ F9D965BA84542E60148704BF612E95BEAA5F6E1747E22EA8F59DCA7FED5D4888431B1C0CF164:\ 8A8062489A1A70F9BE06B6FE1567CECACAE292DD7D7AD296:\ B030A9DCFAF8393C46696F79D6599428 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ CF2485D29FB99F8ABB7BA07CCCA2982945BC033427EAB654711318911750AF51B560DB75B9AF:\ 1A738B670621D0F433D38AE8C527E3A534002882D5487EBA:\ 0B1211AB1B6266EEC19B7CE5EB1B2612 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ C5D1027641C9731930CBC636D34C027A561D787E008859E2C97FF3CDFADCE02A126298842372:\ 2273D359BE54CD6C8F5F3D5E0D5CF19D9247DFD19F5CC7F5F09076F8:\ C9B2B798B7B4C57EF9EBC67C2DC036C4 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 1C50895355461A627EC16B84FE6B8490AE09CDA0DC6312FAC2402CEDCD7C3B211745083CEF54:\ BECDF3EF2461DDC8BB7153C4DA7047CDB396DB9060A8C23746CE6089:\ DE503503CB0418F161D46E03EF29FB53 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ E042BB60BDD972CBE0E76304378A5763AAD9E142FEDD3FF7501FA2EC0B49EEFAAA91F5ABCBB4:\ 0FF69687B5BAB2235F7F00BA631ABAA80623F7998C643B2C3CAEE314:\ 272EF1CC3DE16447EBC186209B8BC4B8 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 79A412224B54CC67A462A02A97E800CF052F39B083F628A6C2F2CFD3BD2028704426EE7ADF4C:\ 1CF78658191C43325399D78B8F88128629FD623ABC455944FED3EEC9:\ B13E3072909CA56B16C01F27F5DE34A1 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ AFF10AD6FBD068C28D5E1F7A29149A49D6C29768996FBBB61142D6AD74C9C399A9133F3498D9:\ FA90065E64D8493DB9C16ADD882D3BB51CA0C0B9C06B3FFBA5E04A2284D3AEF6:\ 95784AE2EAEEDD1AB38C40C810E66EEF 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 7E2060D913D10A1A1C936B7357A65449D590DF4E75DF36E4271F244E4A492A8EEE05475F8834:\ 4F0D8A0D3E14455A155BFFB5FE4ABEC0067C01E943FAE93E81983A0A76EAD0CD:\ F919E073CE8C9205FD228079DB3F8BB6 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ C441EEAA8FA7661E14AD10F2B38D1210DA891FC230D298EEF4D9504C4C950B753D9D33E05961:\ B2A5718C5A08671772836723C357A15BD6FDFAE38EE748ED2E94B5921DCFC1A7:\ 0A8B2DFFB1D0534252D8F20A35FC28B6 0000000000000000000000000000000000000000000000000000000000000000000000000000:\ 1B7713FA6B8D47BB8EBFCF6F154788C0A47C5FA71A6EC061AE6D84EEC62649DB8DA7D8651CC8:\ 35758E318556EAF61FCF8B83E9C10F70DA4C1BD85336E087E3A2E72540B83177:\ 926F710B6040C8E755AA2F30F5A1F093 [WiderWake4+1-BE] 1234ABCDA0B1C2D31A2B3C4D55667788:0DF79CF5E34C6DCD0596ACEDD702AAD9:\ 1234567898765432ABCDEF0110FEDCBA:BABEFACEF0E1D2C3 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000:\ 0987CA45C360D114EB012D9E47459ED88C0B95B927E5B3B6D0A34A13C20A7A3C\ B9B5A2BBFAA44A1924B40BF469E7CFEAE869CD443717A45F01AFC0A8231F8BE4\ C6175BEC707A80826A73CCD57A2207C93B2A22C86DF66CB4823F11BF8C60F48C\ 16E1C18B95097CF2B4A762102D13E3F40D230FE8C183303AF32E43A6E4641B5B\ 792CEC33CCC1351E194899D7F6D9B35E921F1ADEB65C103717B3DF71792C4426\ 9DBFD7F7F76678F355ADBC402B1F4BC0AEE90ACC054888596CABC597EF56D8A5\ 2B0CAACB3147E5E450429990BE7D4267412600B4E700FBB3D0D3E5AE542FE5FF\ 46E5FB796080F4E03FEDB133D598CA782ED9353AC777BB7CD457A525A8163D68:\ F234567898765432ABCDEF0110FEDCBA:CAFEBABEDEADBEEF 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000:\ 5C2AB1625BC271890886964C53FE7B994896042A9047059316035D4ADAB67AFC\ C18414F17EF8891D3D49952D31CC01A4BCB98F2A81EB3D82602FD2AF18430681\ E21DC6ED32E6F2A45FFAACD4BB81898FFFB504DFFA1E8B1953C474AA61FFFA97\ 0BE71A02E9ACC64DE7F2EECD5E7C1965548E290DB3108F79620B3F2E381143D9\ D5ED2A7EE66C32D697E10ECDE7C7907FB011EB9E9862094B9384490484F3B3FF\ E4B82648D57D9F22F2410F603BB12C3D22B48A9AA72215BDD62E849755A33B75\ 025252D67C80BA5FF8EAED75B62669428F791D1FA9B39789266E41C2848AF99C\ 90E10A1DAF45A4E1EBBE00C9E1E436D550DBC547BD0818E8E6E580BF911E879D:\ 00000000000000010000000200000003:0000000000000001 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000:\ C65409182C9BE91884D6DA11EF91971717C3FBBA228B4088E616478FD11C5D74\ 076B8226F824AD7DB07B7F4FC38B8A442BC51F6AA51496911D9DA5E21083A7C3\ DC45860D0385BFF75404A641581E2F87EC2BE542A2F70A075A10F4A2AE8DCDAD\ 4BD1396978866C9497F4DAAFBAF75A7B8437D09686800C0F819A6E7DE6BAEBF9\ DBDFB5C4B3493AFB55311E06EFDE37C848CF99C0DC3832D2BE701FE121E1F27C\ 32563D559CA5E2CED8B66E4000FD280C8BE9116E91DE032E8D3C20760AC5FA5F\ 0611667720ADBF0DE5CA79A8DA58D5EF9237C2E722840AA596444BDA66B15AE7\ C513431DDD22D67ED170ABE6A3E7CCB9EF8D7D5D44897C5916FE0EFAA827E86B\ 0C3FCA6A413F8C7D8BC7735A649AFE06CD64DD4086A6F3E80FE6CD663D61C0D4\ 00BA48E6FFDD1C971DBD4BAF46B5D6502A6EAA6096C48D5DAB484CB9095F5942\ 199B35DDFCEDAB9E573B19417829347087C111D2F87D3FBBA5EA2160055B1F56\ 234254251868D5EADE48F0DF21C1182ECBD201220251B080342B4AAC08C1AE8F\ 9F8410D93E732360ECCBB3D2105C3273CBF4772A4477E95BA924DD2C61AA8719\ 1FF467AF970B323BA61DEC5E08FF012E51F3E6D5EB8599C76E29BCF6B07190E3\ E37FEFEAF3A1D0B0431A0795F319A1C9DC09500D648481C645F7C268691D465D\ 46BA742B49241BE0E46E7164493F78E523DCEFD1063487133D7D10C408AB5655:\ 771C23C6FE5A4873C5185CFFF61F58EC:59C17CCD08C4D7AB 107C217F5AF5E15ED2C0AC85FE26742C53A70D8ABBB47DFC319F2E307A3327ED\ C74ADD0C982C5D438852743889CA15742B5A1272F1FA85889F100D294D3A0C36\ 3F7052CBCF23E9FBA30FC8CB0AD7757FFB40166AF2A1509611AC6EC8438D2FDE\ 66046532C346EA79CB1840BACB9850050368FF5EE1790011244522A20B1C3B30\ 61FEF9DC132E74BDB37E835298E698FDFA60DDB9FE72DE583494621734609855\ C5C99B58E863A0B3CD6A82BBF59D2F3EE03AC6464AB98EA087D33B978C505E55\ 2210EEFBA7D0F81B7435BD4FB9340C0BC75F7AABC90DE789CE3FF899058CA40B\ F57502AC6ECE700381443577C6F807809212CE91E70DE4A5272A5FF11E403F9C\ 7CDE160D7A14C13BEA47C8CFEE4E6E6576A7B7A93C0E203D947ED5CD9A124434\ 914A0907B68A5DE1061D537956FC3A3C3E2CFB82641F2C33000361DC665FAA61\ 5EDDA3862DC54B463D5138E2CE68AFD0DF520F999FB0A0CDA0B09455BBD7BDE0\ ABBE9939479EDBDCD2B9812207400EBD486234FA19ACD819F2DBA6C09F930EC0\ 4665EE163597B69C6B5C13B1026517836BB23679E9C308B1AB119D52DB48682C\ 2776E2524C00233D69435A201BC7E01AAAAE6CECF70F25F26D253AAD23B15DF3\ 79A48EB973434FBBCF807AFC7BB6C5B5CED51F8E8BD47C45A26594F89E32F36B\ 2A8D28791625DAC0993548A49C2011B4CDF4730D7C85C93CCEE16C5926A9D67D:\ CF329218A3A3B6B08B89B0D9D8889F488B0CE31E621EBFE7EAFC5E45814E82A6\ A2FBDB762922BEF71F969E5FB2F0C81060AD765E86A4A664B77C4E028535809C\ 3D6B78CBCE1D5D4F9D75D0198D3A7E7BC9F5B24D617821DD5B5386DA2E629FD6\ 0DA58E4810380E18D3D6F056B5117F29067AF8AAE29BC6E591DC2F7D38C3EBC7\ 6760A297D351EE92513D2296F3B2656C7B360717D51BA235B3C6581AE6264FE4\ 0494C2DD159935A7F36F040252DE647C0688B1DAB9853A47DA378A04065B3E72\ CD57D1C52085C3E7EE99A33BDD305E318184A1E132BB8C673ACEBBCE7DBBB261\ B66039AB388D3D94DD625058B0B582D1C261A61DFF23D6078E7B4114958AE0E9\ 7FE3F4E9D88289F57C9B31B31CE8F8B8F72EEA086314F9B117F3EAA024393125\ 298BE358444E34BDDF2B4DAE77870588F8C92199AFDB218A15E8D88361483B65\ DEEBB0C33C0B5E0674CA4296996E756439BA809A180FE192A3ED89BDB5207956\ 1D2E935E5AAABDF04F7C5562BD371C41844CE9A29CEB6E5D3E1781C86689C59D\ E57276567EE3F08D0EAB63B67DD949B58E47C22162E263B84EFA4EC6534AB0D2\ 2931F5F89B405147B2057BD37C1C93F45BC65EC64019D70F6BA6BC684239E12F\ E164DECAE9A2640F47E0A1D8C0F4CB70B4C2B1417CF1D4E82CD79599BD4208CB\ 786EC8499954410D58756D21551223987BAA744DCBD4DC1709F392ECD3FF30FC:\ 50E3C199E9D556552E79026253E2E9FD:69EF9A725A8DC78C 83A1729A280FEEB72DDCFBAB631C322C6A5FC558A49879F144A35FBF8B0636A9\ CED7D1C96B6E86C406387C67A2395675FA362408F088811AF5EDDC95BB2190BF\ 2E06E34D00BC54058E4BA434F8DD1FC932CF1FA4C06EACD36938631FE67A7EF4\ 7542F6B566F6819C3D77FEF2CA072ED30F8A98D7CDD8D292190C61CF27BCC49D\ 5407E2C84F7B24148AD89ED31ECFF089ADE4DD97D7D23DDB13A980D9CD54759F\ 3B7FC287D63BEAAAD241CF4C3237E4751D5FC96BFF9EDD91514D1A598D5B7056\ AF1EBAD0F908841D07B0D848316C181BB48212034E5FF696CD3212C605720A6A\ B7606370BD2996C80FE30E924D2A9AE0D6F432446CC9033740A41A9F749E49BE\ 9E1307F7F1012F13DED442835C6E961F47879D259871E763EBC1F8EAEE02853A\ 5409E6E207C48F16AEE1973F517ACD71990CA26888B71621EC7B4435649E9277\ 1F842DBB87F52C6C0AF908B99050C4C5BD774F40AC9055CA2D869DF5D837A484\ 8C43F70600297A4BFE9D5D91077557C9C67D186473DABD022483CDC96890A8C6\ AA1411048B646BC3499597BD6AA8BF9BFE2FDCB050CF2F2701C6F06ABFD4FF7D\ 80A6074511E975B628A3C185D76864D198383B69312536831889714CDAF904B8\ A518B47B5FD89C0D5900A1043BEA33351929710F4ED6F85A0FB03607942C48EA\ 047371A191EEA22447D88C200D5A0D10C62528C83329D0BDCF9122DDA3C01C65:\ AEC06F99E3408F738F040C16DD934157ADBDD9489B19727298BB426433A5D1F4\ 2CFD9CA4D5C946D31C069DEBC1BD9BCA52FB28BCA8EC84A32218DE629231D46D\ F052558743E60F3A7042AC71D917C979EFEB8794006F0929B853F5C8D9C1741E\ 44EB8B85880BAD4C013F2047FD2ABCD06708D5A1483E9AE03B48F197D1BBECAA\ B7C18F7F8332CF797A4E969AA032827D37BC63F49A64644DDDA852FCE8BBF890\ A0E03DB5EA89CA05B11466A40322E2A1DB398120A8C84C522871357E92F954B8\ 87F86E14841A127E74D102178CCA7F83F2D5B142A9D05A9F224F27E93CB70C33\ 24D7C783FF0D3C475195CCD7535B9631DD1B520924EF14EA0A9BD5EC8380C39A\ 774234E41624D3A7E89FC2051F3EAD8DDB37DC8D9350452887DA9E7585949D6B\ BA846A6AE0F3F2B469DB68F3EFFB3D52F828D91ED02234A17F4AF974B9DBEC92\ B11813F0CB8289CA2F4465DD1A6182C3570AAEADCAF50632754986FF2B550780\ DD069775FCEF49156422A63DA7CCDDA14DDAB1FC0DE5DAC3D8793F605E093B11\ 76407E3EF5B326DD3361BC4AE824B96237E34B67BE42BDBFEB7332D19DF1CFE6\ ADE42FE5ED3CC3460FE6D1046A38E83B7FFC3BCBD26A49AF2FE5EE09C558D474\ D0A2EEC22DCCF56BF208D7A1DA1CDBCDEE3A71CFFE3C205A8913D555363E3362\ 31D766F1DD3E0C78931F8D5FA9CBD3213BAB06929A5D9EE04E772646D32832DD:\ ED507AEA3196727632963F503ED26A50:D5A58B8F626130C7 # Checksum format is input:checksum # Randomly generated by reference code in RFC 1950 [Adler32] :00000001 35:00360036 5EC8:01860127 679496:02F60192 B32AB23D:04EF01CD 8CA9455795:07770267 D37EAD077220:0B3B0298 E2210CD33A1068:0BB90295 5BB33F53C9D00795:111503D6 537A0E6291C9DF5E4B:130F0420 387900E329FB770A78FB:167204AD 0CE184B96C789E7E0A6EEC:207D058F 773870CD456F8797BC61EB73:2547063A E5FB7B41CDAA1C4FB21D195467:33B00622 60D382B3CB4341FB141360855BD8:367006F2 E48EBC5C8730639FFB47C12D238856:41FA0775 4A25B557982801088B8B4E45AFD7DC0B:30AC065B A864D51DA8BE2CED6E2498FFB1E56C4EAF:54D809A6 580E32B4D34F21CC2978076EB3A6D0FCCFC4:47CB092A 5B32E288EE8AA4E866678D65DDF844F5B3CAB1:70720BF7 B014940A8D58C8550E9E1BAB1E96540ED0AFA6DB:54DA08ED 2A085FB051FD798552D6E1F60DE222AC5F595AAF73:6F340A7E C1A30E3E8EEB24B5350A75D1D38255FE834CFE6C638D:7D950B59 A8BE4CC3005FD904F6E58D5DD60AF8AAC3928F2FBB2B45:97790C37 C6D1E2B2B546867A22ADD3A422F2111ECE6ED49CE85F0ABB:B12A0D68 A28FC69AE1044743338EAEB08DD876267B9DE4780182568D82:A7F70C7D 5C575A7D25204220C994D3E130B48E14650477D64FE646890033:8F750AB6 C3AEDA730EBFBFE54DCE695AD46CA06C4D2D197680C4C42645D60E:D2A40DBA D28292D1255B080A66BE9CD5C213844C2564DB843A95416E5A8DC215:BE1F0CA8 A8E22320693BCB2368267AC0F4D448825F36A080CA2C6DFD67DA66D124:CFAD0E6B 41BA45D14C618EBE7C0AE0150F1D18EA457E54164DD6E3FE8227EC874D65A085A5BC9B06\ C5399B4C5D47A5D639B9F2E1C1211C46DDD56728D2269C7FBC1E9EA82B1DB5FE2974AF83\ D33F5E7039E3C44DFCD9359492DE314514068E483EAF1637ABD215117D53755229962A37\ B91176170EFD1AA0DC751B53059D32DD4FAB3C0AAF52375854B9FFD2BBB303CCF617874B\ 60CA368AF6AA6C149BABF22885F443F0D2870EE9A8E5E429BC00B7AA0942025838D8ED14\ 89114D4BBA666678BCB6C75B66902559186BA330ED378EA5905DC8B41C474ACAF54BF191\ A0B20FCAE96DABAD046241C58324A6C1CCA5F50D1FC4C35FD565B53693D0FBD874D5959C\ 8327CCAFF79760FCEDF5C0CDE1721054B443FDE8D771B5621A9AFB0F935409F5C63638FA\ AFB99BD5A3519408A30452A5BFF41AA62DD077AEF418942F076F730D10277ECDA8C1A71A\ 4E16FDA1F61FE45660AA554E530D31562818EC961EB116AD5161687A23B8DAD5E0F016BD\ 7AE0AB63E710B20AFAE8928C616292D5DF207042617BE830401C30A49FF8308D9060AB7E\ 124417B139FAA303AD73C7B102DF81D763CD239C5EEF3A5FB60C374216263A48B68C9CC0\ 2121CF90AE72F906BE21C87315FD88A24237215A725992F4B18855D2217A4D033F459744\ 0567736AE9BCCA4A7187479399B03E75CA828736614209FE0D3F71A9C90CA6310BBBF387\ F983BE221729763B290C986B8B43BEBE7F3AF9A895BA29663C4B204935C0F7182549E96D\ 96252DA545ED4C54EEE6C1A174AC74CE9C22DF29159F8EB12771CB8396E6F07D0FC43EAF\ 930C0AF228D53527235637E5408A234B785A9E2CC8A30C7E27E1FC55FE6FAB0B3465616F\ 5EFC59B1B52F2FE8A4BCEA7EE470AC47E148165CF025B99808494865D5FFE9263150821C\ 10BD916423101EE3B8640CFAA74A4EEBC86349DB8C8726ECFD1F4B603E6755FFA0586304\ 196A11EFDB7F892B5C7E0EF1A41E99ED60ABE3402D5017240869A26F0447017A31392293\ 2FFA53E56BE913A0EA465A95E0370C0B5A8418733BCC2FD7D294F23C474E3C3D331E2B7F\ 42051E7BAF2026295B56837F497865D4D60B02EB2E76058756D2E306519046B6A3B71522\ 36D73B2C698A8F0155C4E8F1D634D5737C3D7005B5557E2FDF1EC77B2B16239B5C21D105\ AF86B8BE5BFBF52E00D63349568CBE25E6735BABF057E3B01CAB9520D5D03D2C4F7CEDBB\ 7C6FE4943B95B27CECF671AEA54B8740074445D4F14C17C9B9A12E581B559CB17149A131\ 613FD35ADF9ADE4DE981DD01E45262002B480B2FD524E39B307BD5A6D1CF9178B59B98F2\ B43EA4CDED27513AAC550E1754DD6452A9434BB59B1186F9DA61E174D6610C2B286AECDB\ AE9E6CBD4D2BFCABE0B83627A13F87288ABE927A891E372163A87A437CD1F4AFC91A940F\ F55F5DC6CFA5AADF689946192050BE7C:9DA7EB84 # Randomly generated by reference code in RFC 2440 [CRC24] :B704CE A6:47CC72 E5B0:5AB692 C52385:9B469A 8E69FB27:2B8005 4A87C90369:452CCE DC10A8E4AC5D:60375E 6B48125403AF14:D8948C 0BDE9946163348C4:6DC026 384EB1EC12064AED51:29B27C AF4F16B80F0AC808B595:1158E2 0C571D708F3CB0A234196C:24D7C1 7FE77AEAD433AD02533EFEFD:E25DC7 D990831F658D306DEF60A10D5C:E0C845 826CE458F0983CB46E68BA73D27A:BB86BD 995BFA6433F4185E76DC67F6D30C35:AEC6AB C7688868D06251C906A919F011ED7FFE:B9B9EF AA1E9FECA8E4FE3CE31928FC262A4015B8:ED74AD 5273E2B97EC0AB37B1F3004C1BF69E7A0C77:BE8A43 2F68AA285719E8F8B6C1C01227EC83F2C6ABCB:A852E2 CFD75FCCDAF1980008AD554AC7FAEE2E60317121:D6F9B5 29AD5BCF5F4FD710F0CD859DF62AD678F66DEFC0FF:3C15F4 C70CE8FB338D808338FA51A0125FA9537206EB6961C9:A210AE 141240BD7DFAF34FB8AA5ED107A899AE8CC29201B4CF32:822081 10C4F0E357A90F7FAC078282A92E9E10E347D356199427B9:D7C1A5 A982A5BEB78D751C6999B8F487F2A186CE587A0B558F3BD39D:1AC0DF D6AA6D70B1E5DC2985D0952FCCDB6227F1AEB01CE24B8B2C2F3B:6BF464 C95155A2CB524B40F1F7DE80D2E0718406B309FE818AF6580B88EC:BB641B 6E68D0055FA2B284183000188682F36D31B26F8D04950E381F965DBE:C62516 260D0ECAA0E8E9F595C5AC8E1D7EEA2DA7603A96BF83251B3122C80D07:876037 80E559D244C4188ED223ACF70E358CDE3110B6161F70C3289266873E7802:B8184D 637C9217C88420128CB3CACFF911FAAA2257CB093715B882AE7B708E2EFE46:E39818 D2272C22FDED6F8F1012F230FD29B56622D8B25864101E801EA80AD0038577D043F299B2\ CFF639EFF4E083808D8C9A11DA0C6BDE91B58A6E1BD6F6E17D860E4860493EC7B90D3884\ 73A85332E39DF103D0133B7B3CE83BB88DE9333D80C09837B882B231DD2D1C33676BFD77\ D5596B6AD4BDA0BA63150310FED783496BF0E10107889E10A95D81CDEC48C06319492BB6\ AD17EC9D13A29294EE578377D772377E18727C38D96952322791143F63D4B8B849808448\ 400D2DF85E9722BD8E766A4A33F53F77F2DFD3BDF8AF16153886C9CC7B47D62CF957448E\ 326DD9E3E01C558F1D68230EF8D0B8F8D9CC427C94EAB99CB5ADBA109ECF52604CE483D2\ CFCB12A11486900BEE7A78B9FDEDEE60E00DE69703C2AC0756D3A0D74A155BB6FAE5C78A\ CA3137FE28928AD124742449F9B874E8C10B159C4E508771B6848F9A71DC4F16F42D8EAD\ F4B0ACDC38D83A9F1A1E73A6D46C437A82B575D287AA0339F3A3390F9DA40897F6C9EF94\ F4816234B9C92F9FD7D0E4D29F21D97A1465EC5341516F8E7614190D9CCA97DB96AAF91F\ EA4420DAE08C43289775FA96156F8DCD8CD02B34C01297A79E2CD34EB211F3464463D33B\ 07DB91519C4C53AE9A8911E5740CB564F628344203A830356E106C45DAE9BD29CFEC398D\ D7DA04FE67CE1A7DBCB8B0B35373DD241690A391899940833F570972AB9F49726DEB55B9\ 5F60173E7B32E81BB67B9141826862646F96BCB8331A8458615C2614076F5FA8C860DAFF\ 2684570384716CACBB375813E2331F809C4A7BBC3134858E69032814812D90BA2AD8CFE2\ C5DDF24B8C802F857CC424842A1B9340A00A6824C6CCA9374DF99A882401B466C72BC690\ 2E467C9932061A27FA3DD75253DEE2F9FED87FC9E5963B1674628B3D227F2B476DA8CE3B\ CE3C845B582A51D46D975A86D0C347A0ABED6AD55E24941FED982ED0BD92A01097E02ECD\ E37F00442050B8F5FC22C295B4CA3EB66CB4A424E490CEAD354B263F2E0EDD0DA0D6BA6E\ 7F0CD84C13667958F936FF18938C657B0CF0951A554C06934C132030FABA32C7B038266A\ 91DADC4C5D65EFF7EBC76E16969D5A7BF0FAB573295CEB76C8623A79922EEA61B9C48E40\ 2AE547381D412F5C2C4590452A2651921E3BA8C5E3AE5313E1B61D83624DF2DB092834C2\ 9185DE44355B2D5E4B90AA81769040AAB8CF59F91776FFA86A7AFB78BA67BF90F71C9996\ 296C497ACC2AAAFCF6DF4BB59D1657C97D189E4CF4C14F834E562F55D0A2D2A0B3576E89\ 6A7F6D567BB78B8956AE4924FB573D509A5BAE3C75065D76EE5ED2B5D4AF0B55F17A4406\ BCF38DC7302D8E68C3A34A5211F06BBB555525BA3312E4BFDA85CAD2BCD5F08C45010D51\ 00A0AC4679B54E518DE2FDAFCA039AF8E02DD713813A91292FE6CFAFA1E92712C2652586\ 1D3C48D2A0253AFD14A952871052130C:97E8E2 # Randomly generated by reference code in RFC 1952 [CRC32] :00000000 AB:930695ED 9112:DA3AD8EC 7814EE:CCBFF8D0 B833E34A:3CF5EA01 E82355DFC9:E26E344C 0AE1C79DBDCA:31666AED E03ABB0006E852:4B755129 6A9F7E0C99AB3BED:3E3D892D 901D636199E6900216:A627CC4B B56B114E357B346E3248:83845B2C 9F85F4ED02899207CE7EDC:CF52BD20 37548C6B4F99996A9E243790:90D9C1A6 183C1DF8F8808870F6DA2A3FB1:079BD60D 6213908DA80D4FB2DF29ED8737DC:994C68CD 8852141FB4405E0C3CC6A14EAE64D6:256409AF B8BD524FF91CD2699195636E7035B241:AE189D30 F1BA35E6503D50A6DACC2B3B3038B6261C:130A8886 E3F51AA78DFE8C2083C0721BC280EDA90F4E:A10398A4 BBEF661E8064936B079B7D398137C7DF7E9B50:67A1B46A 172949BC62843B24357BB0BE815A231E076011DE:B1FC384E B81EDF9309B0FEAFD9D3C33DE2AC278A39604A5F5A:4F204EF1 8B93D005AC5CB91F7422B1BB110070442C9B9D3DFED3:F2E02E35 C2AAA8A9116EF67071A7B89BD930219A0D93B4D429222B:9DD0E0B0 7EABAB1422497A99C6B99F91F6E69DE1915A3A87DD71E637:72EC609E CD3FCB8FFC0DD5E163E8B6CD76A39C2804BBE91821D780576E:ECC18144 DA267A57335B8E73F77443B2C74596851407D4C5122F1B22B055:A0B5C467 EFD26D48E020D6C8014ED651A47ECB61142BD1E10A0EA69D41ADA5:74E5B3B7 3A2A70233F5A5BFAFB76A58B9131C877B6C1691F05D7B79AA7F1AB28:E84AA432 21D411056F80656AD1077C1F785F4C44A8BB8C87FE5DFE14469890B52B:CA157CA5 # 1K of random bytes ECE01CE672A42EC6007EF3FD6298DD8554BD3D01BE8C8D9A945E150F087A1567BB17266E\ EDF2DE3BE79C0A14ACA1E02C247C4C5E126C941F0F123546BF6AA6B15C1639215C38F79C\ 1E441E8AF2F812ECFC89F2F9A358AF8D65F29A63AA49F42028B232F6AF3EBCB80E2CADC0\ 07A62879A065B0253239468043504C081FD6B5FBE1184F69C4D157883BC25E9D5985C0DD\ 0DF137D0AF6278B07CD9935F5397DD98FF1DDF2F47485CDDF642ACC901174F664D218770\ D1C05246FE7E51B5435626A55C41900DD97663951FDF2EFC18F3087C24FDF23603676D73\ 2B7BE9A00E55DEE023077196114D9F516BBA13C93DFF4930F045484193B2FC6D41B7C9FC\ 1C6F362232ECB643CB5F74B637DA845D9510B881049FB651A47D1439D187020A89F48581\ 5D683509EF570023DD9D6E60DABBB244E7B94D56D2FE9E37D3ECD2CBC4EED7FD9840FFA5\ 47B44C06AF2102BEB08616C22FB45994372CCB9EF1AE5FCEBEBC7DB1F0A74EA260A50C32\ 32A36084CAE7A95FC54A61CC7B022096DA821428D9DD21A0F108A5885AFB11D777ABCD63\ 62FE011CDB7E2B36FC943C3548AC643357AE81917A7FB508202255727707E87B801C5594\ 3769152ECC6A8BD98D4ED4CD74D823D4176A66D3B059D711A58F7BA890E93933E81AA735\ 27FA1B7044406C8A38F14C19936C26A09FB1F4C380210E55A55A03557D72EB7EF1D9FC77\ 45817BDF4A328CAF340E7F6AF05182C08DA2165806263A28B0748FB5E33AEB8ADB4D4C95\ 5C998CA82998C26049CC549F77A77756A08986A2AE5C84E0C1EA8A7E9EA9E44F653A0C90\ FD5BF615AA8F7E5398063BCE72E1EE15A32A7A96EFCB6D5365FA7E33CEA17CF0CA310DA1\ 67C6EEA1494A4C581420AEC2489ACE5F67F92F92D8D871B96F6583C7619E156495828C9A\ 3A08A33FCB4980522E2BCD7A9D5994C841A7E684F132BF8AEF668C1045BCED0C6C7E5B0D\ FC46E24190B2A28EF0C34B5C14E16D36BDC3A87089297360A47D6B6121475274128D9C9E\ BB10CD0220A1BE87A8A015DFACF19578075572836B4D2E54190FD709D95636BBBDFD2420\ F893AF11AB4B33F489EB2C884AC4EF3505072162663698361A1FD5E9980236481A23EEC5\ 10EEE798AD558ECA4067C363B5E892A489A9913DB71506241C2B743F2402DF8D75F07F55\ 1B9E2CEF1ED9667BA421E658ACB9B10FF4531C0174C34F17D96F869DE142FE6A56EE1DDC\ F0FB3CF47E856E3718ECEEBEAC912CD0A057C81C46F806AC8814F3F66B29B2433409129B\ 23224FFAC15ED1F21FEA148C41DE6B6F6157251B60B4A5E3CE91961EC36618BED42759B7\ 0403EEF65388F0E5AA28F305B48E66DE1E21D0891D64EBEF281DE976FA877324DDBCB104\ 02926EF8B6D0F7B73C55759E8B35756B393F12190E5EB0495DE818334F3459B6286D7FF6\ D8C1D4BD9C3086F1FDA0ECD33C4FFAFF:72D73FE9 # MARKER: Hash Functions # Hash function format is input:hash [BMW-512] :\ 6A725655C42BC8A2A20549DD5A233A6A2BEB01616975851FD122504E604B46AF\ 7D96697D0B6333DB1D1709D6DF328D2A6C786551B0CCE2255E8C7332B4819C0E CC:\ 0309CD7A44E6022671E84C43CDB92F613931D1C6B71467C039034B1263C2BF92\ 203E27604BC53FCEA9C2DF3B10862C9B6FB6E8C617754EF49A2B80F51C74ACD3 41FB:\ 1FD4AC6551D39EF27B5F1F886D7A3A72EC60E0AE2966649C3701952F29B2DBF8\ 58AB6E18101D038BBF019299C7FE5F62A4BC3973E089EF929AAF25B9A8BB7D39 1F877C:\ 8987D458CF27D4C1B1DDD115FE5C15A67AF431561812B1D2028C3AF0A52FB8F7\ 334205CBE003CEAB1446261550870EEA6921C2315D750F9C49AD7877590A9BDE C1ECFDFC:\ 5A443348F0B3330CBA5060B16EF21D5597ECDD597603B3E86999099C5595BE38\ F726D10090472DAF5EA77315B6BA62B2507A7C08A1B6786DCB30148DD1517882 21F134AC57:\ C1ABFEF8AC91FDC20900045A226EA8D5FF2E3E5D0F00CC9194D19F6546075558\ 7F72492E5D5F5A30AE63F95E9DFEE6F07051A8E9856E701451BE1CC58D320E3D C6F50BB74E29:\ B1EC7BD5A91DE2480BEE26C93A84E38030E2B2BC469B7D4A8D91D32CCB889805\ 436739DCB5A14B1D4C0811EE2A0D9A667C0FBA00F48800F39AEBE8D7DA7EDF1C 119713CC83EEEF:\ 8652D6C03E8B42F46D96E2357DE252C9B4CC483C32ABCADFECED70A07C8E1C8B\ 637A6FA1E278C8BDF651D6FDD8A29A48DAA8ACA71C2277F709A83A80C62C5DA5 4A4F202484512526:\ 86E05AB43DEC6C078B18369AC5485B4FAFCA9C55C36E736BFB08E169A2667C67\ C14A7D0409FC735B18618E84483E1B39DA47A41E48915096A8DEBACA7A148A03 1F66AB4185ED9B6375:\ E072E9D923E334A5C0E129E46D4EE6E5FA2A1494F6CFC4D1498B80470A0B920F\ 2B2D56575A771D8271205D973F23A8DA0FCD3DE5E569269B50B3BD823DC8D955 EED7422227613B6F53C9:\ 6D8B04C1DAB6BEACDF7410B9FDBC96E74D9FB11A949DD164C817BDF4ED2DE978\ B61ADABF27BE4FB8DDFE6B9AADEF8038C217BC56B17C78D19A80922CF84DF8F5 EAEED5CDFFD89DECE455F1:\ 66022F69F321D34378271556AD6793DEE887BB6DCD07344CB0C9F9FD8F6C9080\ F296B99D7D42A6B4242A84889F41894258419CE871D54F21D78AD5BD7FC81A7C 5BE43C90F22902E4FE8ED2D3:\ BF48CFBDF5876FF02D095482F4DB28693A3D09B9FCE1DD25BDDB2F80D1100AA8\ 1D166E37421A3281B9F25A981DCD6741272E3F4E596B5003FD86F85C9C31BB92 A746273228122F381C3B46E4F1:\ 99F9C27A26186098430839356FD651A6C203E39ADC06EFB3A6C35C3265FE37F7\ CD3B4EE520218D820F3189B44341EAA6CD753A472A8FDFD7386CB5E3A1D9DBB7 3C5871CD619C69A63B540EB5A625:\ 2630080B86DC7DBF5AC325F645B94E0A5FA967913AE02BCE4B762DC03E8DAC4B\ 463A881DEA606FCCD2767F6044040DFACFCB774E19FBDBB8CE89AF937077EC0C FA22874BCC068879E8EF11A69F0722:\ 9828CAC020097A5A74E5817EC37034DC0346F07E0CC17AC03E386C7045B6977B\ 9B276EEE6C591E970D0D1F2402515BB63E520C6737B4131BFD114E8D58B4F035 52A608AB21CCDD8A4457A57EDE782176:\ 7BE3BD61CECEE09EF1160C1CF7DBCF94F5E1BEE3A30F2B27B0580C3BAC5D2592\ 8291372CE81237B867D4CA09868A0CC7984F2CFA4EF14479761E2EA58FB78BA6 82E192E4043DDCD12ECF52969D0F807EED:\ 68A2B3C34D5E023F3BCA7508BB0B5E9BDA5375E245FA394D2CF508A03B48AF97\ 005B3A4DBFFC0D38CA4416ADF504745F94FE9B0D3F5CE334DA9805F1F3ECC978 75683DCB556140C522543BB6E9098B21A21E:\ 345692802192594F5516D2B22215DECB648E6611B9A24D159FD2978BF712846F\ 1FCB61F1E5A5AC25832D7E7BBCC0D0FF2E55EC2C9C90EC1E0078697117ADCFAD 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ 3E3CBB918CF27C6A73D0145CDD3A8F159C56AEF938F69884AC6FC8C3207593FC\ 8D3E712ADFF0CE52FEAB8B693D8933D87DCF8A3F58BE330B4B5DF14EE3D635FA E26193989D06568FE688E75540AEA06747D9F851:\ D1C6A2F12589D77610EC236DB751DCAFEF5A9DFEEA63E307DE01FB4B852DC577\ 6CD59CC6DC2369584B9DDB214BDDF5D5C89D0D1EAC9FB8F7C0F041452CBC11F7 D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ 64659D7B159C8F276DB1295039EB6FE2435405DC1A81BF4575B9C27A2C41208A\ 0BD331F34A60DFF31AD29F8730C0786ABDEE4ABC767092D448CEA3F97C7A6976 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ 6CEA91D04E9D4A3C994BE9BB24FEFAF967B4DE36D2566F368C04CC2ED9FAF736\ DB71170C207F31A7F08B7B8D634E7C38FD591A38948DE4ABE70CC64F3A2EE108 A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ 5B5CDE06BF8B5AE80A67D96306AC7E96AD15575195B269378EA65C6F23DFF53E\ A4E02639F3EC61D640D3D9B2776DEF2FBB3B8AFA1FCA3AA55BB5208788671770 AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ 0374C843999A2898BD79A0CC8DFB924E7BB9E5CCAECDD151B502C1A234F1D369\ 1F3CE29D0BC6F044A2CCA8174F7537078F3FF0CA73E8CF1D2040D25D1AF3295D AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ 7F1E7A420B60E6B42622E4B5E2900D6CF01230C962565A6F7CB8270C8CBCB4E4\ 77D171E183B3C856FCE7369FD25D5E285E21777E3C738090215D97E25ADF1FF6 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ 52A8179F441682C0CCF7F781C0CB905442ED82CA60ABED14BF032DBC5202CCE9\ 1A66369424DEC0E4C45AC16F156A9AC7982FA4A7AE941B4F24F8DA7A4FEEC4C7 FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ 50EC175DC458FB3DED1E3AF7CA87DD6CD08FD89B0BA403EF666E98787D3E38CA\ 48946DB41F38C8FDFB82FD0AA71B08D9069E7136775D22E0583BDA3D8228D3DC 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ 47BE44B33C90FD2EC18B839C5A60175EB76DF0A8A587D6EF4A6712868CADBCC5\ 4AC88BE47987F7A4875C16C31B8A6D691939C007B6724139187E76413716F226 A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ E0F91DA11320E76952D42C897503DDF79670C841DFD059AD40F41D9C5BAE0526\ 27887F5EF09A214AB6F2E5425AA1C634C29C533C596B1BE95B1D39EA06335694 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ 0CF4B313265173B60D2F99B87E81E76C10E855A0F67FD5F2D61216CAEF046A86\ BC2B7E907412C5499A162BD1D019729653F2A80969A534776494A00C8193B8EE 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ B3483C99D6B488DC2E34F5024BBEE33B55D9A66B7EFE39657748650AC4301BA6\ DC64A3E3E8C15945575DA963D29399BA0B1AC3A6CECF549E132A5E2DB3B5BBE7 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ DA79A14B066580178121D3F60E0D3370F667A297FD9C0435CF8C65D35BB3B4AA\ 894AF7946F65CCAA5F7D9FC199CBCA9BE3FBFA958C0DABC992A50DB2236ED51C DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ 46:\ 4A7873D42769DA269B9869E0DFD5695AE343DBD69FF8A68D93542B5EBBE79480\ 6B2D84ADC69DEAA58F54008164FB3E2AB02577865FBDEA88A8BE7D23EAA9441C 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ B5A0:\ CF42B5F7ABF540B69018484583A7B1CD1A38064C6E4208CE0ACEE27B7EE74CCE\ C544FB2FA1921E95B5CACC12546D35C628ECA4C7053F37FD236E63346D474D00 B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ FBAD4E:\ 9F955DF8BAA1A5ECF0BDFD408002B1EAC93B89C8AEDFABB9E5239D6D1AD1C129\ 9901E96C822BE23207570E1EAE9CB82429899158313AF79FBB06EA3915436F7A 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ ED2C2492:\ 0FD1772A21CF32F0D43C00DF44754096704B0DBBC3B323500C3B231C7FC47B8F\ 35E8F10017F4B1061E82E5CC1D823014DCD54AD7F3588614E2149020CD8989B4 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ 6B2EE4E542:\ 41D2D44C32A90B30ACE1C7F6E4AF5C3DC3ABDB1AC7365262C56CB1AE6DB6B5D4\ 2AD2BCFD9228D9DFFD5664756E326E9E88D053FD3A3D252211463B7171F5CB5C 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ 2A1493D8F4FB:\ 4AF72DFCF27B0CDA02F35AAD1A90C67378B63523E80DD50A2AB512F2CFF2969F\ A48DD8EDDE239F6BD5484D98FB26F0757831D7AFAAB5A21DBADB1C1B5BEA2336 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ 30A934467DA4B0:\ 7161CDE092AE657F61BFA5957B5BADB16712A173EADEA014F622BA0CCF8B4BF9\ E0E87B92032A5E1EF762FC7B734BD3B2AA526303C7EDE369885CE63DA6DD6DAE 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ C0308E29446B8ED3:\ 52E566F481EBA7268B1C9440CCCC29EDFA7E03B4D5BE7689D9E6B9C0E097FC07\ E378D7F189A144A31A7CA4280B3D566732C3DF2213A534B37D19A1AEFC332E90 C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ 723B20F67BA610C2B7:\ CFB6068414E7ABFBA715292306824859C4A8034964CC77C5DB1208FAED6274C3\ 7196850F81071E904BDA8CD1ECE8D66ACAB354EC5802846CA42A217941186AC3 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ 0C834CE6EADC2BB86BF6:\ 7CBE1D832F1530C7527FB3D8BB8F0BF7A2AF523A507EFE68AFDD1DCDE2852DD7\ 89AE87BA2DE8C6CE85AA0D6FD8EB2C4C0DC9E489A1D10105B56D4FFB1260EC0C 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ 1540D29BA27AB8E309A4B7:\ 2B4F480C3799B7FF87DC0DBE2DC4348E2D42522EE803D89165002E8810734373\ 7B8605909795397DCA7442CD95799B91EAAB9993641F0578D4C86C7D01F564AD 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ 32B58EBC38FC2A6B913596A8:\ 1556B21828CD8C1F98BFCC63415D4A4F9A916403EE0D65ACAB7AF2280FFA044F\ 5A0B773B7B6210C2D390A17464A791F52398264714FA89F990B03E810155BEF4 F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ 38467205F5DCFB34A2ACFE96C0:\ C17C6DD9964329D4F1AB10C57967E985A15EDF1DD3DEF79436198459A4D33136\ 7FADE1D20967BF3EAB50A8FBB892F0E71B0BAB981BB1D3EC64EBAB88447A66E9 CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ B06CF0F5A0EA15CA907EE1C27EBA:\ 81B3181C9610CA1EB3359A05329F597A7EFB663B86B413246C0755583B04B0D8\ B266AD0343AD5813195DBFEDD031AE5CECE6DBA846803CB1C1787B838D66F295 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ BCF84D0D4726364B9BF95AB251D9BB:\ 48D1EBCCBCEE10E72A9AEE1785A2E97D0612BA7443152514A6F59A232F6D1A17\ EC4415044A946DF2073FB1B979501B24ECE23C380EA1246C3F09B024C53D83EC D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ C7F157298EABC4DCE7D89CE5162499F9:\ 6470A4A9540F4B9DEBBAECF5A95D05AFA9646FAC17B57944602F37740BBC3FA3\ 1C8F1D199013D15D4227209F89C333A493C4D83C8AEB186A9394619EDD1EB8DA BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ BEF788CDB5CF4606C9C1C7F61AED59F97D:\ 4446970CCDF75D54F79CCB3881A1ACA24D6CA8DEFBF0C248FD6E477223F2758B\ 9369B8140EE48BD0229B097F514E7A688506A890605C816714279105BEFDF112 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ 86E779CF053C77785AA9E692F821F14A7F51:\ 4FEB1F07404D63A06BCDB2BCC319480CA02BEB7981972A092AF5C27001042EF6\ 3500955E57F5C3C54E0E964BD94ABC50BBAAC74F635E522D9ACF6740F26FC4CC 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ 43304FBA401EFB2BDBD7ECE939102298651C86:\ DE3F70F58116EF74466997946469929B5283B0289513AAF1F8DF770AEA21D9E1\ 308A5D1A30CF3912F4351BA6B1ADC4C2B35185C6479E5D160D678EE34BFC6CE5 C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ 87D68D28CC3897452F6A22AA8573CCEBF245972A:\ 89C23F143C74B2A3EA4E1B52765B01CD38725DD432813816CFEDCDEF7090C01D\ 9964DAF8F0EEC99A23B20F1502CC8CB41F77CD35D1E1B1CCFFD96821525705E2 EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ 22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ 770FDA46E0435A36A9F4B9E81BB9945CD82F05ECCD6B46DAD48FF92825E2B4F5\ D21608AE6B945AFAC4650F2408168D3538488FC20A8447FD01EC2DFDF55F8F36 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ 6FD2A68D85527B6A15F4E7499FF2C6028C74DE9CD2AD0837DFA4FDF64FEC3164\ 6BB89A80125F27D244718C635B5997D7CF014B5ED30A7CC5547C6C24C188B223 DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ 9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ 0AE21935400D5DEFDB036321F900999BC9AFD61703510168190CC8D36D2BE4F4\ 9DE95C902C286DBAA91F516D231EC4D2AC55425D05FCDEDD211E67A3EFE51E12 EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ 24DCD83A82A389C7DCBDE997F9F1D0A52A64566699E5D8B8CDBFF0F88A427AAE\ 7C6BBB419F013B8CFC780D47101616BAF0B2C41CFDDD24BAF46610364FC82A03 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ 97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ DD99BE3D8FB3C4A307E6ADFB18B638904CC12A033D61D1095DDFDC0F6FC62AE5\ 27CC5AF45084D2BE4A416E1BDED2E855650A9CEC6FE618B0856563FA1FDDFF38 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ 359D189247A6B503F66FBA5CCE4BEBC7F6551239301BFCC608CFCCF8E9896305\ 5A6E6DD96F6813605B486403BB943A747EDE6C9F8AC586ED6E73DD4D4DC0296E 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ 66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ 347E5762FA00809092ED5E660E399CF51EA861687AF8AD6D4EA50BE431764442\ 5000D1B33D9F3B05D7A961E2B385C4AF3ED5B5E767E4580C931747E5D3005CC8 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ 4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ 710B3E6D37198D55FE6DF676CF727F982E2B24E38456627D711E18C789AB9D99\ 6276C12F9605A567D1B7FA524296DB2E53D4DAC2F6089874CA099EBBB10E2071 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ 9E8D69EEDAEEE8F426D478B39693767D1B28CAC4CB47CD1416C73F82E29EBE06\ 2FBC41AD10A398F4EF4C124A70D96384EC5DBD2BE869DD84C9BA6808BAE6368F C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ 30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ 8F109A4B2F65CFC881CB456966630C91EF26E79838CF1E090488B9DC348FAD9F\ F050197B373BA326AC5F42FD81F3D9C944238918E748453233EC309FA0000670 F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ 05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ A94A8BBAAF30DA2D1BC52EFCE0541B8BD109663AD73830261B6179CA31D08CC5\ ABF512CE3DE1118DE1230B31AFD5A01B5D6A49B370BEEE77A3988F9CBD32618C E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ 548D7A65D8BEEBE56C466DA17F8DD80722A7A2A59352465A150F58C1CDC75E80\ 49F5734EA16F32F5CE5B339CDFD99D930D20A6B8655B6F20DE4E7E7438C405E8 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ 00:\ 19152CBECBB159ED38D70436671A47CC9373EBC74EBB31FB22E36DD22E0DA921\ 15745AD7B1B0114596F940B6BC90C19EDD53A9AD012BF1F5B6B419FC8A1A6597 FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ 37FC:\ F08612959457304C50026B146FAED6FEFE60EC27008F986130DE8D487C9BB29F\ 7A6A5F51F5083C6EEDBD2E9DE7A7B7658B8C10AD6F01807B4460FD3B36FC01BC ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ 2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ 599BA5:\ 436A9BAE3CA9FA4E8627C359D8D2628B0E2C341C75502B3EA80253E5448A6A52\ 4201DFABA2A2B42185DF0F94B06A8074216F057E300E16669A0271AE69B1A54C 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ 479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ 40706B05:\ BDDEB8D9A990C8B92FFD27D8B0EDA074D9F1DAF0E3FCA1F1D708D7B3922D5FB7\ A92BD49523F74516CF373ECD835E399EF6E8ACFEB2C7A61166FA3FA9FEE0B5C7 ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ 29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ 31D06C77A4:\ 76D74B7AA7C1787F7D2689144A9665416AABBA5B2646EC52C22F7DF5A20C7F6F\ B2B1FD5C45668EDB0EE468A99567766F594D3E18F1D8162321445EF8F25A3D20 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ A259FC4FBD72:\ 2D26A2CA37790EA1ED334F854CB6127F9D6EBBC716341A175B7C6625511974AB\ 1B6ADBC71014F258677089C2BB397F0669C34F686C008706E1DEB560B5D43DEE 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ DBE5FE9694AD6D:\ B28CF291DB775DEC4E87BD30792BC2CCF1B528F62537176C9206CF255F8B7959\ 10C65E3C308FA2275B021FFD737F88856107BDA44AEB4199EE5675471E789A81 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ 7EF57B91397AA8A7:\ DABF7F4D5455F3C9505CA6B49CABD8ABD3EE4928CCEF88DC60FAAC08607CD686\ 1C316294D3954AA514672A289182C3FBE49B15051D4645214C5D01A6FC783899 BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ 7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ 44B78B2D48DE1A08AA:\ D4B8A36DE3B40CBCA69B5819C5D4E524E8C36FECAEB8092A5B02FFD12C19A17D\ EA1B09F1430F1F62EB046CB0F7697233FB51E3EEFEA61CA2C320E97B34BA6ED8 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ B3A6C9FED24D70749604:\ 61CD40E83B900F9730DE8BC331EA9F75F81D138992E500082FCFA41610BEEBBB\ 5ACE85FFF570462D9960D17A67A2D2BDC8CAD0D401DD642957386C553310CD42 BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ 8B033F77D384CA01593C1B:\ DBE49B8A74C886BA4B5E3E1FBF23274D8122019F7E66C61DB04CF5F61D75340D\ 34811558A575B179F2B45C7C7B60D3FDC1C5D9BB8F6DE53591AB9BC905702157 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ 013C23F1E9611D595EBAC37C:\ 826E66301DC5F89FA5559170A9AE0E07B1DCE27A5EB90029DC4E7C9A2F005D25\ EE319DBD74A0F2D3034027ED03566F2D6D768A4F4BF88BF208AED0AD623D339E 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ 9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ 4EC5A49FFDB59A1BD6A292AA0E:\ 70FFCA06DC5C2ECC63E938915A70755843AE11990C4285FF4448D5DECCF9CF00\ 4C04774B6419E80D5E96CACF830F16595C995F37F629D4C82D7D5837AF28E6FA D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ 498E1F6C82C6CAE6FC14845B3C8A:\ E5C313F54B334BAB5746161EDBEA426AB1EE8FB01521C0BBE3B10B41F88498C0\ A53D14D4F0951C0BEF8110ED3DBB4FE93CF0C538E7B4FC04D9D87FF98B690736 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ 88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ 5B01FECFC146BDB251B3BDAD556CD2:\ 40A3015076E0BD34B7A5EDDABE5C948A93C0C62C84470CD24EA4B624CADDB37A\ FF2A9C654988231085A216F619697175F5AA2B6211C9E32D0FF4253EA95FD7D5 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ AE9CD5CF0991878A311B549A6D6AF230:\ F69BD0F7B6AEF0BA7FCA622865756298B881A4E747090C77F48B5BE74BA70DB2\ 2BDFAA758FF43698CA821472A121D46B3CDCFC62D139243B757A9456660843B4 E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ 105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ B50C7C681E773D109FF7491B5CC22296C5:\ 7DC20435E62DEA8C32FA4D6F90D16D711F4E43A14D74FA29F648EC2D0F0FD22E\ 10BF36220A639AC67AA2F5DFA0454565C9AF02A90F97F0202A1EBBEFB5859A1F E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ 190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ 2C7CA303269ED14014B2F3CF8B894EAC8554:\ 9C7CFFFBFFE1E8783080510B7F9F11E04B3F9C5A6D17F5ACA02E07650347C352\ A3CC60096FBCF21055385B0BA1EB3C6E4282690BFB32413FD55DE09E06403BE9 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ 1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ A0E94AEB83183E924DEA9C94DE5F76EBDED8FB2D344C3CDF46FA8D738FF331EF\ 1061F96FD3D5D1F75EB95525B8388F4AB481D5BF9A48B9DE8E5DDE2F6C0B526B 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ 8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ 37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ FAC419F422D0A0C09653EB9938D6FEDA794CFE6162FEA02D35AD0C53F70CDFBF\ 5D60C4D33A5FAE394AC6938371A088977413172BC2284EA3C78623508726508C 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ 85EA51D49894E45BAA3DC707E224688C6408B68B11:\ 3722EE99604E8C8C7069FB1CC07B67F9DB082BE5BA359AC8FBBA285FFCC00204\ 39F96DFAD898124A779E758D3E8D28A41F3B59990C027F6E88D1FAD75112779D 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ 8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ 04E18D475920CE828B94E72241F24DB72546B352A0E4:\ BC30D45D62D909FC5ACD1B87B9C70065228D2722A360A1D25F726A8469F725FC\ 163496C39E7D31AA2B3BD9016A2253D7CD05E4D678A35358847090A778D8CF8D B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ E1DF1CF42A685BAD183FE9E7C3A21DF52826174DB659CA114E8EAE39569E5B20\ EACF33A97ED436207F95568248FFBF922833A1D7153785FD869BAFC494ED82B1 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ 578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ 44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ B986BEA853B9CA92ED1F11D2205CDD09ACD3DD7DD4A4F48ADB1892F9B0296AB3\ 99B4CEDD69A6EC8C1E8E4FB30FD3040EB7057CDD3C0104EA910875196F93C53D 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ 4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ 4DCE35639B8F219455E77AB4E0B99A94CB2DE19842D9213F11552EE9DD7A57E8\ 54EEB7E91F7E13152F757068E40105BB355306B3F16540991B11D215C02E8B80 B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ E71B2170F0F3761D1FFF4C20A01374886E483724954F5F683120E4CDE589011C\ 7EAF775F3E0CD93953513DC0A119412E12611757F3BA846A33545FD257E5591B CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ 5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ 27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ 29036EEE2CFF84925CE84157EC3B90EDE0A434B52AD89C0F91E84D0F2CFD0357\ 1F610E18829B9B69984BB57FA055DE6288F43C33A9A19CF71B4045195B2908AD 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ 06E45A1A77F1CA437BB4554E9AC2791C74D7C3E7202D94C64C6ACF258FF7217A\ 46A8FCC49C6C9E56B53ADE741FA30060E35E365FFC9CD7BD3AEA92D011924D7E 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ 29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ 3A08CE7F48E71FB89CA12701C6BFB6D6ACBC3847351E0C4840CEC0FEEF141B69\ A7780128837FA082E6803FCAC832DD57E5E8AA776B058ED5062AAEE0D3B10EA2 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ 650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ 797015514DF48346879712ED2AD3BE484DB7F19B94DD8A4A77DA987287298674\ F68E331432B15CFA0CEB395E40E2BD424B850293CD3BEE39B6F042B58469FE54 E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ 7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ 8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ 8930CF8606BF372E0F355E6036146EA14AC2F0605B2C192CCF3E60DEE5DD95C7\ 730581274AAF4DF61438051FF8A566B0A537E1ED13FF250F11EFD7F3257F9F60 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ 1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ 040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ 375AD74C0E39D401D4022174A5FA4363447C85D72ECCF1D380845149240DFD32\ 09F81E4AF263F429B8FB6116062880152AD9E40F01EC23B61E390EAB9AE3F502 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ 0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ 0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ 49:\ B0DD4E0619AAD0B8C44B30D106A0A57B8C10172520E072865B6CF5B12CFCA23A\ F742AE9FE222C5D900C84BCE529C87F93BE4264331A7EDF7A1C0071F2265B1F5 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ 0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ 2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ 5B52:\ 4F70DF19FFAA4650A834B1BF154B61F077C76467F2EB38B3A60E26D82702294C\ 7E91611C63522D62B1EF007981516018833F9C7030BDA0A3661373F4739C8E94 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ 89CCC1:\ 24B8C31CA0EA5A1C627BBAEE4BA822323AC4198415FB69D99B90B26DAF42520E\ 6B489F05F9C48AF52BB7E11FC4D72C37CBFAA04433559EFC388CE9C83008C9F6 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ 14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ 22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ 6DCBB4CE:\ E1573F9C0D6D49D8A1D6B29663DB387A1EBB5F107C37A4E6330673B1A23DF7D1\ B1475E14EA001319D683CD902CABA8E33B90A10FB7F1C5468E9A4FDBC7BFD2E1 A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ 7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ 881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ BADF45685F:\ 669CAA7CE8599AF49B6AA8963FF4C19E43247953E0EAA7453EB954217AB9CA86\ A82245E4C0916F7E9631F763A12B8EF516E5AB33DAC41D8FEB1F88B8778BF185 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ 312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ 96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ 9B62C60A4771:\ B0D673B7F25D73616323175F04CD969285914F163CDD0513CC97350C4BC50574\ 228BF1271026013A82260281554EAF29471F4CE3CC4472AA8030A6CF20982C32 F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ 9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ CA58D5DAB38ADB:\ 61FE4777C89455B9FA259F9F8DEA012CBE1DC51538C54E77CE7D95EAC48E73F9\ 00B77B51B00018A6AF84C407877EE9B0DC3FF5788638A52AC8B150E823416640 E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ 21691E1069413848:\ 2227BF50BD45C41592EB42EDAB9FEE3E78DD0FCF0497BFA733B99D9B5699D3A2\ 7932F4F81F7D4AF43A23E94CA7A9A88D82C2781602EF5E1ECF4712CE6F72E8F4 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ B57D6D0C2EDC4E78D6:\ 67F82DCA717D47E9E0854BEDC55A1756CD624F58DF755CF9702DE5CD73B57F6A\ EF7BBF40922A915F383D7D3A910FF95936EC74E35B3B2AA6146F30E11AF3725B 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ 8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ CD19E781AF20454AC880:\ 83665C2BCA49C95BBE584DF52242068193F7A9DAAA67B0EE36FA9A81516E4CD6\ A3D15A222F95A2DDB7494C5DBB7E83EB30A72BA342DC98060D1F78B9C8F0E893 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ BF0FE3C32C17AA188A8683:\ C505A3841C5589D0B2A428D684C9D14520C6359A5AAED6A560663947899E42B5\ 88D5D7BE55D580931B25AC2E2FC5F3AF360D60741C0BA82D5A94BE61D2CCC830 F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ 0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ 2E937F21C005F17411473041:\ EB6FD4B2B90F79F0071C8D2744C352DBDC7807D40EAF5979DBF21410CEFC2CA2\ B867010A213C34090E3AFD0C8EA65F43D1AC48EAB67721AF5508D6F193031611 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ 62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ 2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ 29F695815D866DA99DF3F79403:\ FF96DEEADD3C3668F9C9FCF23EABB6C08A908D89B997ED4005FDB4ADDFDBC165\ D47CBDC2A9A064D95BEDDEDFE1F5AE0D7A05EED7D1B30D3DC1D3AC8850425575 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ 84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ 3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ 1BB15B447589E86E8D76B1E9CED2:\ E0269128AD1687BB7C35926E98CC9A9C7670C1276C3F10C37853928AA6C0AE7F\ E414D379FCBAE20DF0161781690053B9322D8AD14D66C1A4B7B35FFFF9CF3F16 F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ 4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ 853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ AD3D7E886DEA4F005AE4AD05E5065F:\ CA5FA777561C6C13ECBCAD526527343009BB1EB77B4BCE263FC24E00A5A5FB92\ 96D2BA13598A646BF936397E43A7BF9D303CAE83E3654CC25F636F7FAB03C2B1 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ 7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ 68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ EAABC35F5C2B0A0F2379231953322C4E:\ FBCAE8C494C5FD0ADB640CEB4A15BF634293EC37CCF119AFF5BEC95F55578ED9\ 0D26861A045E0F242302158D3EAC801185498D6D8033662F2E0E6BA5B6F04ACE BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ 4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ 2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ 159388D5C3277E227286F65FF5E5B5AEC1:\ 28500180D6F48671A4ACD83C9BB5FE3665CF9A6163D8797A2A2F9EA3974619B3\ 12769F67C1BB279A409C05A6B4E371F57FC658096923B5EB086D920EE8C748E8 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ 407847DD0DA505AB1641C02DEA4F0D834986:\ B205C2E223BF2A741F35294E9B7E1C33EF745A31F5CE2A00F6EC43B05044034C\ 4993D5112E4BA7CEB2BDA4C2E2C8E09B52CE6C2AC7B5374260BFEED8752B65C1 B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ 33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ 99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ 7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ 38FA9FFE97CA84452F56C26702F561BBB105D1AE19D78C3528132DAA809B006E\ E2359EFE54EB35FE0760699070D2B33B2401A5C12132797DF0BDAF96A8DDB04A 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ 2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ 205AA1615DB44057DB991231D2CB42624574F545:\ F5D3FCDDF5C8E2E0513700B11775B0B3C73CD16B18AE52BD3ED225306EE9B5E6\ B5E402334BC5A4FD1AF5D47138D44217DABF5CBDFFD6978B956EED71C21E05CF DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ 2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ 157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ 1A25D0833B2CC0A1A0D7C892639D0DF281D10334860F70878287DD4015A3F731\ 2093AEF197D49A1BE99F1615EA38D52A5F3665AA87BF20E89DD7A04E3DC09CA7 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ 0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ 0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ 3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ 0942326FEECAAD788EEB7D50863FD9280211C9F63B16ECD51AC874A80B47988D\ 61799A10D3B23DC23AE26C179ED5EBC9E32B7697B0566079852BBFA5FA21FFAC 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ 46176EBF044C4784467C700470D0C0B40C8A088C815816:\ E9F908BC91CE95ABBA48644FC7C1F8E211E3D2EEA459021FF7E4496C6F1AA3EC\ A73AEF2813B33819139CEB6ADD5FCFB4EBEBCE72AA1E30DC328454CA69FFBF31 D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ 91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ 1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ 5CEEE2800816DDF676BBD3C8B7D95012808E62A1838CD292893B05085DD08B95\ EA245FB84283BEF479FD0E2B8BF9DD1BA722344E83DC391A85AEE2C930F985C5 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ 1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ 285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ 6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ ED0C620D495F5190D8667F0F9B50C9FEA28FC01AE9B219027973A341BA87118A\ 821451D5EEE580C4FAEE46DAD21C43C72523AE86A8579576247EB8E38D0C6BA6 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ 27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ 9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ 138F2DF9686F705E5C55020B89F04AB66654B0CACCC1A8D374334B6BF6534335\ C7514206B6F772DDB0550CFABA22D22B913928D3ADF78BFD25DF9DD517B2E3A3 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ 3348F4E8C4768C3EF687A8E2A02E307FD8591B41235F8C14E5983AE7361968D0\ CB877AF488B975001AA1E7ACF0E5844C107A102BF028FCEE89CFE751266D88A3 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ 8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ 4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ 47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ CA7257AC51700539DF617C3B7EE9ACC7C4576332996F905D9D3733F1AAF3287E\ 2F852BE394E533F64EA19733276B0E448496F88500770675835E133904E4071B A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ 2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ ADB3B6E2083CB37ED5F822D1AA2ADA18560C663011CB16CFB804A5F24C0525F3\ 4D8CB10D19528BA02BB43BD501BF0D0AC67968B0687DCB21C013527A99AE9D84 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ 5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ 4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ EA781FDD2DDDE4B42E1A6B75AB70CFCF17DC413CD9591254F91F1E9741811916\ 56EDC92823A3145DBE4AB491E86233DAACD748CCD2A86B551D6D47EDEA943C82 A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ 07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ 6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ B2DCDDF444C51976F2D71D020BEF76810C8CCAE2B94C34178C600CCDD04B233B\ A2D27DB4E8F07EE01D611E490564B6071858BC8B8F8D23BC6B8DA746DAD4A132 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ 29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ 98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ 447C299F7E5C90CEE70A7577EC148FEF194F40BA7C3C8CBC96FF81D14490A16E\ 397CA01F3C0883E050F805239FBD4189122B45B1101EE1F303281D2AC1580E2C 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ 3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ E2:\ E21AEB7109CA41F1C41F4B66E80A6A4248AED43341F1EFFABB61341C3F0B6355\ EFE3DAA8D28D60F9BF851E6837625BF2EBFD8A68CDCB50718660D5CCBFD93910 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ 1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ 3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ 52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ 61EC:\ FC015B69F1AE0DC7004343FF941378B8A23AA45A3825310E9A81C2A9EA2D4F96\ 1F4C9B8CACBC91F0D2414590C389D24ED482B95252F37B5A6CC6BFAEA5C98C32 E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ 9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ 2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ 609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ 9B5EDC:\ 45CCB97F9524BA87A7E69354030C71A07D875C5E958EA167EFF581703B1D5037\ BD91B8806980E3D4EAE0ACB010D210CD89F781DED33F5697DAC285AEB37629A4 FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ 63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ 42D75D68:\ 142922E983887BFF20D0EE26BCBCBA34A1A70717172B8FBDE0AEABC5CA258C39\ 85B00F7908A21A75C014D4B2542A1BFCB7469BA9454F66670B6C05BBBD7A92D3 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ 7815BF3C49:\ 41DF07681C94633DC430AD7FFF9AB7146F1CC3A66DF3A81D990ED3D247D8F9A5\ 880EFF20C2652FB6C6631EA41F54D6C331651FDC20783EED65B83AF458D0AC72 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ 61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ 025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ 951CB2068CC6:\ 9BEE78530C0A93CE8564AEDE785D7086CE066CB74C3B8F70D3851CD57DB8E647\ E67DF0D543EAFEDED491613BD3268CC7CE8DE34614A79D6413C3FEE218B6965A B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ 93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ B0FED6A8052FBB:\ E2548952816803ED478241CBAB10F69DB4CBDD98447BFAF4E92AF9A3179B6EFA\ CEC56C757944B519C69D1759811732FE3C52912611271231342D9D62F3472967 B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ 35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ 780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ 015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ 37674C6F8E380C04:\ 0E673628FA620668F73E652DF7927EC7D9DF9426F157B055E39D23AD7FA9CCCD\ C8013FB8F6A0D2EFFEBE00BB5563B100B5361F33808AE20E23580D414F909CED 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ F22DA873C601016A0D:\ 1B0E41061FF47E71F22FCD508E8560F8E4C9748DD8E520A9CA478F3E3827330C\ 6F19E299E221367E6B02E1606A1B23F2B3F66762D0F408B3A68C9DA9018A45DD 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ 472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ 994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ 1373FB09A1A6E3C7158F:\ FEE0EA0269154ADD8FCC28BC61D290CCE0CA04FEBD3EF646D5AEED6542461D4C\ DA983932BE7ABF3E0C2639ACF75AE2770D1B511D996E19536542FB4D76505F69 FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ 084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ 339612E830E9E7A9C29065:\ 82DFF74AC5CDFFA0D1D03049F2FC227DCB77E373381C2E74FA316BBF9F6D55AE\ B7667A95AE4D4D367130620217E245E9DDC641AFF823475AE40E4E3CE56FCD40 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ 5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ 8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ 377838973C1D943C22ED335E:\ 97D7C677B7D8EA600DE069CC23C492C0C293EB8E9B8987978CD43B2CACE445A9\ 0D1CDFA4E0F347EC9B7E6394DEF55702A13DC5DE3C5E43B8B08F260BF0E654D5 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ 725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ 798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ 8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ 2D0C9E7448DE3043AE22FDD229:\ A0A9203714A9DCAE2402958E6BCF759B7E900D13D5A8654501ADAC70B5CEDF27\ D21F5E92219DAD31DDC8466D8F559470C638D9F9B45D4F539D36C54651C4852C 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ 5B6C338CBB8F6659D342A24368CF:\ E6D9B97F5BDB0BB4F5D2322CEFF8A1A747361BB937BCFA69EB8C23D98BEA5C5E\ E25F9587648912D5E7F90E73C031A27E27FB11276CCB63E47C25B18649AE5DD8 EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ 76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ F6954BA0801A1294CD8D7E66DFAFEC:\ 0A14506B804455218133711A3BA8307615E4F80A5334B86555B9CEC77C93450A\ 92F6A18BED9BD55B1848F78C2A49A76057FCF3509663F2E9010C39D94FC9918C 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ 055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ 256FB33D4260439CBA73A9479EE00C63:\ 8D03AFCB3940007FCBCEEB023C105918E6540D87658E59109CC6568CF804BD3F\ A2B3968C28C650E55276218482BB8E42944272673D6A137D326477A1BAFE8F3D 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ 911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ 5994C1DBB3B5C7871A11F5537011044C53:\ 4862476DDDADDCDE60A35260AB6C448B9B6DAD7ED296FC48B81E288D0E397E69\ 4535CC8999F4D7F2F3E09F5CE034DB0F71EF5C812F3C6BBD73FBEF14B252BC55 CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ 2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ 586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ 4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ 4E53426CAA453F8DE1CBB57932B0B741D4C6:\ 4B239C5B1C8B83924AE736E9D30582D16BF00A547023244247B389259BC62649\ 81606439AC9DDE0A7D371B73A34CAC998823803D7BD62ABF8905C9BD550EBAB8 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ 868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ 83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ 2B0D1C2780D8826CCE4B71A77C9833AE59C2BD0213789A8892CCD7B4FFF1D8A7\ 80E81AD4C2C1228D55DF5BA3625DE4860DB05743E4D07934C434BAD5A769131B EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ 0880376CD5FFC7EBCC6E80FAE0D78DBB3532500BAB96CD4B755584D23E68CF59\ F5297A34AE0A90184773412BC9548A80E4C54391B4CB59CE292D704C614DD1A1 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ 656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ 46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ 8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ E725B8C82C8D1F3963A77D505B0A929FD58846061BEA2BA7040B7D3B2AD95EE3\ 781CACA60B372EB5258A44A65BB9EE655A1EF9102F8BBD9E41FCFB2871DAEC7D 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ 7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ 4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ 99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ 31175C65FF1133F5F53DB80DEB90F6B2E79727D4C8E77C5E3F5DEF70525B871B\ 50249C6F2EE1CA6F11A7CD9C578CF13D5FCBD74DE1D05AF6076A5459E10B4B9D D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ 66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ 67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ 870B40EE6B774B732E15DEE647F75BF3D5DD6FD364C7E1BB184D8AC1F0C991E2\ 486DCE6BD6CEFA1DFFE13C50260D4A0FB6C23E29D7E62CFF0F8DE785CA53C2A2 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ 1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ 48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ 15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ 8FDE68D448144F3B4BD12011DF94A463C40BE946821F80EC8197E36EB46554F7\ AD8B6CA9F6FCC8C05B3C0C2C909966AACBA2A1AA6E980E57AEA1CB35B01DC991 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ 7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ 66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ 5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ F19E37E56DE97B6EF009CB1B0A8FEB42891DE80A9895C7413367C71FF34815F9\ 77A053FD621C30738C347262DF2B07EC3E455DC729803FA3D68BFBFF42415500 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ 7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ 1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ 1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ BC3199569054F2DBDC66744F3B6B7DC23D3708BCD96A8C7B7C5D9E58087E2E4A\ 5D5606CEF88AD63044C9A4F0D019358846EE83FE98CFE9C5B03B29A2D31B3134 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ 9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ 0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ 45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ C44780E409877812578CF0D738A6394B1EBF7183941323C2891D9604B93E5748\ EAB2FD4732DCE6D9A5D1F27B7FADFD5DFDC87264BE97F86F700AE87A5D1B8227 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ 1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ 98474C61C2639BA15B58D98429F0E3489504CC6ED3BF638ACCF6859443AF2BCB\ F85EDBEF50191EDB6923636B21C2E76E985831F187575BA82E9AB4CA40CC482F CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ 60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ 0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ F94556B89FA106C94D32F723061D2E88EBC4164B1B02D0485851782F84CC3229\ 7D7A3AF9A1CC430702B78B5BDC9E50ABDD703201AA73F8811AEB4A80A5992C64 F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ 10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ 568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ 46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ 60440509E00573D66609563D8F1504A196AF06D46F6CDBFEEAFF61FE46AD0845\ 6EE24BCA13DDED11818776CAC19376AE7415338A3D4F0035FF276188BF11420F 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ 8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ 4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ 01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ 2D552519EC54E5BBBFDBB543EAE5482D9B964A952E880A88567E7DDF1DCD0D5A\ A353F7BE15D7634ADBDBEFA85355839FDA2B738DA987BA568103EABE2CB53D23 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ 9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ 447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ AFB37A28A4F216A6CC3D6AED09E82F40B93E445F892040F21D1AABAFE99AF7F0\ 01837CF0AD8DD2E2983282F35ADFB9DCEB49B2C80C85153772A8E587ABE7F18A 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ 74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ 5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ CF:\ 721B1BC60845499B1A50B716F97FA9FD584132C1E30A1705779DBBAE644CBB57\ 51AD1B1B379CC91BA4C3054BD060B88050BABA98BE1864B1B96C3691A096EF21 FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ 5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ 71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ 1DC8:\ EFFFB02598398243D8784EB8ADA33D314C8D396406BB7FB6A668085B23438AB4\ 580BFB5258E5D616F9030C6A8928F4F753D6800C90EA2812482BED268A806E8E E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ 54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ 009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ 2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ 99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ C25E88:\ F1CF53FFC952C446EEF49F9D89370757C74CB8F2D99223C47EABD296151161CB\ 86C6A34833E7AC6B75E8119A8274FD2B9066EBB9B787A4A37C9036E6E01BA9CE F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ 65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ 3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ C5C06729:\ F1C9A73B10BA528A61AB86F91A9A05261B447049C7ECCF37AB1E0C1219F14F0F\ 0F2C5B419A7595550F2D651A17368C3FB7538A14FF9FFC4C4D9098803D942D3B CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ 68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ 6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ 551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ CFE0AF93EB:\ 5A1A31490BC85FACC5101EE18093BEC7C2CB717A54AFDEE47F98660032D912F2\ 3792F1D0AB0BE8A3C7F0D000DAC238DE843CC84178CBAA910090AC827197AD85 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ 331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ 2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ 05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ F467BC75A9D1:\ 24B5A99041785BC5C5519190B4AAAF92770E35D07213A6DE55EB8811324CC63E\ 3AFCF61F973A896CFB30315873C0071E2BF3BB976A53163422A01192915B9C1E 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ 513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ C6F4756017FFF5:\ 7FF6491E79CD3F743C3D735A0AC1BC5EC3395950C65111D7BC2E5E3719AB0FE9\ 20DDA443B1FD8A8D557633B95E68354EF8F78A91A769CF0798871F8B11B77478 C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ 798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ 9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ 45DBA58E6CB2C8EA:\ 0154D5832EC5594FF994034BE3FD3E61E7EEBC8E43C20C6CC9910F15650FBAED\ 2915087AC641DBF60A2083FF14AB084A27B5CC9A4E84C54A6B361D38C72746D5 B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ 01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ 86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ 10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ E8419D48FDFBD744CE:\ 5B617AB6F6FFA82197ED058D4CFDF54398FA3CD95074A745D389C05D8DCE1B9D\ 4B9E88CE4B519017EA3A55EB89D06D2CE321F4801D079D5867EAC366BC270968 A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ 7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ 6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ 1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ 4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ 359D5D1EEA105F28DCFB:\ 1D96D1CE0C82A43D4135ED8A022A5F145AB42FDFA024C894939D6FA422EC4F62\ 1A1402113E1105A96273DD4F7884879F63EF41830A1EA0B4516937BBB2DBE44D E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ 2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ 6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ 8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ 7ADFB974EE205A9BF7B848:\ DE1255FCB5A191E19B663DF4A9DC5471F39F13BE5F8A9CC1C3F6FE2844EB8CF0\ 38E7FF1825D26A8F135AAA77120925ADDB6ACC12EA1BF0E60DFA236FBE38458F B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ 7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ EC77F29D211BE89DE18B15F6:\ B17A24CA14830ED093C39E8323EC0DFD903172458D023D10FE4125D0EB4AF0E7\ 578B1EA1D5148348AB8D6CAB98B20B18BCC52A6CBA85851D2B74B20735BE6E48 DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ 4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ 49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ 9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ 50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ 63EFE793489C39B8FD29D104CE:\ 602B683C28F25E9F20C413D2B357DCDF3E339945C5BD41FCA69FFFD2E1658F9F\ B654B94B62BEE72087EABEF2F2F6AEDE72C7DC45DD4549CBC75465CC10D4C554 BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ 02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ 711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ AE5B257BE36A7124E1060C170FFA:\ E90126404BFED0DCF726CA50A6D0620305D1A84EFB0E768044D2DB920FB041E7\ DEAA465777D312E2867E6E9E50559BB5ECE3A4ED6F844504C39E12988917FFF5 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ 5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ 70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ 001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ 480AB79D4E6415B520F1C484D675B1:\ D98758D0CBE6C5FEF11A4EDD8E9170FFA7F37F40914B4D836025B3FD71FA2B51\ 8164266D974A40AE2D7C3C359CA675E94B04D08D3EE56346A51B82366F1EF0F0 A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ 84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ 920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ D42956588B3B58CD948970D298776060:\ 7EA57C6B9741AE7C07E11766DC6F69C83A72533126ACAFCA968832FCBC7A28DF\ 18968BB582E6933898672E322235C9D8FA310F485169C55E04672FFDA2A01099 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ 3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ 678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ 2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ 8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ A96CBDE5FBC953D9E576CD216AFC90323A:\ CEFB46600FC757512E917DFA063BEC761DA6140893D3B7BA01677C6D142CA296\ 0B4B016CCF9C9A175D8E83CC2F1A9D4171D6074E2405B866CDEE57683BD4334F F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ 593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ 0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ 358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ 67B5AD93D874812A1DE6A7B93CD53AD97232:\ EB861B333F0763CC1F0747ECE23FF46B98962B096CBF95335B6BA9992F291611\ 5887E77A812CE6F78B00530194C71B97ABF4082F31C09F547B025B4388199E75 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ 85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ 352BDD3740DD6A16792AE2D86F11641BB717C2:\ 51CBA976ABC7E8D55F67B1A056B311B861FEE85D2FD69BED53DD274024D87DBD\ 269C41B85F6A1C19FF3D32C444CC7BD8F11478147BBCE99DCBD29E34988EA808 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ 71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ 865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ 2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ 9ABA31EDB903B28FBFC33B7703CD996215A11238:\ 10863687D6D1144DCF9D03C10CB66B33E9813EFB9118EEFB947FC68997E6CCF6\ D93DCD4C2E33A2D187F5E6F5569D291F16B985908F4015599A6214C24AF791B9 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ 8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ 13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ 9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ 32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ DE8591FD57ABD6D73CF01C94083F916C897FC0CABC1049BCD75D64C768D3B4C4\ 2F05BA4DEAAB83BB643BA451CC224B0A61110647FA35AC14F63D9C2FEA5231C9 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ 3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ 7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ 4E529B73E0AFA555B75A7EF2B43F32D71002045F0ABF519C5C1E31F7213AE10B\ B1474BED81450E9956779216B0DC2D4067B181744D9E66AF3F34306CEFD5FDE8 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ 2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ 41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ 1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ 6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ CAD6B2E517A3A890D69C8058B427CF4CE48C775B84EC7E47D12C3D2BFD746D3F\ 6DD1814F6721B5DA519A6630E581846F999F727970C67940DFFF70015DAE9053 C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ 58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ 21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ 104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ 24C90C5D7F0C9471FA119437C8CA847E81D556F66FB6316DD0FB53DD57DFB3BA\ 7D14AC4D1C9C55F04FB6FE2EA9E67178890A3501567059015B7D993256CA1C54 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ 4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ 76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ 4BA61EFF8CEC62389A932E24775211189098BDCDFDC6615AE79948914D6361C6\ BBC45B7DEAFB4A58B78AF4ABFBEB8991EDCF30A2A586BE8C6CECF9875C734D7A C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ 7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ 36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ 1F6CD40F56856615AAFD4103618908530C8EEF746389ADCE64E2CADFFBACB9DA\ B4E5F973CBB86E607AF00F32948E4CF8BAFD2782653710B38FBF890922773AE5 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ 8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ 7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ 57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ 2E6D38768361D7BA583A5314947E43FA294E29F87BD7CC2D6F49890912885F90\ 7D8FA6BEF24B4824A4FF777C5FCF04D655FB0F9C2A6C7ADABEC9B92A6698D33E 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ 384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ 4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ 55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ EB395350C2557F16601D19DC75031348103F059A0FB890CC2A002932E0619CE8\ E52F0F39688DF0DB724CB095B69A5643154C9336FBBA50F35C6A4C05477737EC C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ 4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ 761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ 01449772284E566C1E31A6924A2D9157BDCDD694B5ED1039370BBB11F58851FE\ 5677B25276EC84FDD8472426735C532BCA3D59ACB6FDCE13C0DEA9376DDA8AAE 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ 0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ 475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ 6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ 6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ 5E4DE3451E6BF67CEC13F960D86FA9035B1AA4A824F0AFF446271D39784A0E73\ 5FDD00AE53D6347DDFEC4EC6A552AD78AF145BBA1CD4C34C300E3AAEEF88838E 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ 635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ 822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ 1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ 814E7B36373B0276718212ABA4E0D9760E433B680FC59869533E4F1D34010047\ 977C91FA33C0C6DFC2F6A4DADCE34BC897A3F7E2CA9935B99D8E5425AB46060D 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ 1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ 698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ 47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ 9B28504942E11B4FE971337FBB905DD772EF9D4982AC4D5EC7C3EFCEBBD1F32D\ 6BC7EDCE173A75DE81C5651A3D1DD22A5D63A2763986356331F18BD02D77B036 CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ 8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ 696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ 7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ 01:\ 563AAB317672C0DAFC3578FD23DD1416A577D76099B850801C82B03A7FD9037D\ DC84E7960817B893C2AA5444C46CC5ACED01821E0A299A8BFC13860B6DE3A0C2 D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ 0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ 2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ 9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ 4D4B:\ 7365A562E0A02312B2B26D583CA242C479A96F50827B4E87B4E7D4F4B4174C39\ A76E843FB1D3D2F3731B06161A02BA5E64860D916E607BB5954765B34F57072C 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ 1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ 18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ 299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ 4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ A3BA86:\ 8B9F0CD8D4D56DCB17BB67DB05580A6B67296D4CA8297CA8A705ED9C9948EA9B\ 1DE211D205DF7836DA88C2CEA2ADDA29124E9DD9D5A95AA7E300BFC52E8931DB 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ 69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ 1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ 61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ 477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ FB9E4AB6:\ 34C0FFBFE39B0ABD5B261D66499A8508F360B0D61296DB24E2496C2EDEBE80C2\ 642C12976FA54EF41A766F6722393D7B154AA0BC5C4E20A2CE0527F9A16C3AAC FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ 31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ 59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ 7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ 91355C6280:\ 2EB1C4BD6D8E41981756A7F83A41D5DF0FC770707AFE22DADEE6BF92DF54096F\ C4AEB6E0114AC3CBB33BD8D6A47260BAF4127CDE97371979B21E8E32EA205265 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ 62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ 225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ 1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ 366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ AF1AE717238D:\ 18485311BE9C848C38BFA25EC4C557196F1E39A4AC812B77AD2975182A9C2768\ 706905562B0722A2A1B92A56EB47E2500EC1621F59B6B0059EE6FF8C2DB29326 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ 85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ 16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ 528F9AB49C79F2:\ 753B20F511FD288F732ADE82C0F97D7A05DC4E6B931F7D1D0F266911A3C7DDBA\ 5DB2BB233A12D9508DC071E760844F376AC74CDACC5C8321DB2E6DDA9EF2F9D1 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ 584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ 4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ 4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ 5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ EBDDC89186839B77:\ E4ECE8FA8A82C0C44328A5B11C0C0EAB3B165A919555B8ECD121A828B0892E16\ 86EF62EAAD10C87B41BCCD85E60F37AEAE96503FBCE970D895E1E1E551CE1A85 FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ 6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ C66F252F6E64EDC96B:\ 0C2A1D85CB308CEA8D84108224FC6DA66A2654496A14CAB4457B672EF9BD2D25\ F0D14098334846F0187D01D74CF8B18C22B3CF9E00ED31F1BE30E960E3C26AF1 B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ 5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ 252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ 25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ 232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ 5363892A2495DF8C1EEF:\ 46C390535747C9C16A4797C28DDEE9C2CECC3B8F1A89EE67C91A0D06220E6633\ 9E7B4A7D6C6B2B27D0A011D51BF7EA0DD61E6124D329269BCD4B92273C2A311D C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ 272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ 414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ 49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ 199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ 5C6D1BE4BC79F08A1A0A46:\ 6C7060DBE2F17BAE9F4503FA61FCB2B3C6F9F8E1710FD2092CAB5865E05C6E3A\ 9A5D2E5A94E4C9DAFB9F3E47E52A6644990D8F397C93DAD4546A7C1C35BE8CA7 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ 2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ 443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ 6EB6E4A80358ACC78647D043:\ A614F68BE815612E5E571B06DC69C3C86A8A4EFF9BBA9A981413F60C7B612B90\ 6A7805BE3E292F1154CB0E1B003B86F40B23B99C579DA381D06C734E60A49806 EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ 01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ 90BF2C4062FD2AD58F906A2D0D:\ 402CC283CF76060F64F0DE59D14910D710221F63537D5E30A1388496CC2260DE\ 1E3BCACE354FC1AB344458DD9BEDF3FC36336D67B10EF21FC6D6F48ACD265C8D E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ 3EE46FB67422F814A68C4BE3E8C9:\ AEF42FDB10807FDAEA631638A64C06A9125CDB7F94BB91AB345E1EA30E606FC5\ FBC6322075A50FE2D13D19FD34AB072C41B96CED205CC5143A1A5C98DEA311D0 D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ 4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ 38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ 806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ 4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ A17E776C0D02856032A6CD10AD2838:\ 391C3A33EC4B5D75C910DF0F00F6AD5D4E8844CDB364B2D7B0155BDD4F9C0E1B\ 6C7825938F642840D06CD0E6F67F87DCCC34F6FD83587FD9266D603CA625548F F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ 39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ 42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ 4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ 2ED1C78631FD23B4C3EB27C3FAEC8685:\ E51079072C571D0E44C975F232F052F78B497A1C85995E194691A85AB026E4F8\ 0A4993D3A2B4D69F607558CEFF54D766915E5A4E0C7A42C8D307FA03C6DC4C74 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ 94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ 286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ 04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ 72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ CD90333A77BC4E1988A82ABF7C7CAF3291:\ 019BE27AC6E4B1FB3F1602025A8DE3EFA7AD6E1D0C6975E8D2D519A997328154\ FE0738A00366205FDF8467B36D8970A92EF450C20F5BEC013BA4CF8091F571CB 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ 29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ 5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ 626C48322E9791D5FF72294049BDE91E73F8:\ B996713F0A3AB5F0198C127B5C3079DACE7D4D98A9433D9B790833B62395A379\ 7B7924EB8B9F586903079A8413597E37448F3222B751DEBE8A5B83385864F7B8 AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ 1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ 42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ 774BE89C1114DD531C011E53A34DC248A2F0E6:\ FB71A3351EA2FD4C44E271EA793596B245C6F0634E79ED1EC72C6A4CC9DBC892\ A9498A7ACA0915AB20B0DAED223FAD794A6F3822C847CF52B3F217D0BC605B76 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ 246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ 47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ 94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ A7059ABE99182714983B9C9D44D7F5643596D4F3:\ DBD3650B1739E8DA775381B5521C5CFDD689FE81309B3A69A4B3BCDC62DD6C45\ 68B84670E5E3B1B4E0E834600C36167E3447C5C1009E680C7932DB2BD91057A9 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ 374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ 6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ 63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ 5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ 4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ 55B84F2AC0B917467F20E9EC5F6CE98B3987C59A1ACAEFE3AD73D1C26D724CA0\ C4D8052CE82E3C704C7834499BEC67620D4B073BF3DA41AAD2DE69AFA4943E3B 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ 575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ 7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ 591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ AD4231D8A6C04C1517D1091D399110019055D5C5EE1D3D75456DA17C5572C10B\ B8B808493C3A69EBD668AFFD15A9E92A692A3C7A394F929B1E7798E692979665 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ 37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ 3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ 9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ 24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ 70CDAED98ECA25B7099C73201427DE23F51D7115160A105DED7A2FB6B20F2DEB\ 31B6A2734CFFC2AA6189DAEA538291B34D0AAC7CA9C57CA7063A31EF202F38EC D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ 33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ 0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ 52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ 45186098139174A1D4D657A79B71E6E4FB3AE790A52FF0A1690D787FCB6FBA70\ 25CF74E3CDBFAA5B2B6D1880699315FAC59FB18714C65D5EA66E6B1D47AE17C4 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ 7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ 5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ 806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ 7E804307383AFF5BCC80306043721A173E61461E401C1331ED95B8ADB1CFF5CD\ 0943CB3BA8C9A7A02987DD9B6EA2912368284CF14A55566BF264CC244A353227 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ 271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ 608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ 990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ 2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ 8B907F2B968634263C0CC229E917FDF0AD93D637299C10D8F76EFFEE6C6A6B83\ 85803FABEDEB1694EACBC11D94FD00CD310C287C2C537BDE39B88A4A15735DF3 C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ 56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ 8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ 50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ 1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ 9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ 4739DB195476A74B06835BA91DD8DFDADE704A06557307E33019738083F36714\ 3C96ECF28523C1BE8CA272ADF7E0EEBB64EEF31FE4C5EF03CE7D46ED6FC86A71 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ 5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ 4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ 261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ 31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ 68B8AA5731F7D00D547D7E3690761046B54E91257984A46E2CF9BA2835ADB621\ CE3DDCF81A02A95308300F1E992E3BEDF832FC0433F0A64D5CE277E679933E47 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ 266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ 7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ 357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ 5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ 719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ 2CD87427875CC3480CD19F567B049B1181D7F46B85F3CDE505005452A0401A51\ 7E0E3D2A2157D789A6D63C8484386EFA9F9717498D35B20CA2A0FD2FDDDF7E15 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ 8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ 3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ 267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ 8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ 5E0A947E07586E1A7EB441B4F44211F3731595E273FBE30FD5478E762C08411D\ B9DDAA9F9B9D860F5768DF78FBEAF9EFEB9ECAEE9A9874FD38E9EBDE9DDF11E7 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ 1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ 4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ 3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ B8098CB26FCC5ACD64C492919EA1C7ECDC9B3DE4854D69E7947E05BD0BF6E84C\ 240FA83ACEE02C829A959614107CE03DB8ACA40D38F9CC57B7F94C3C220DEEEB 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ 994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ 37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ 7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ 9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ 0F4C4ECFD9A8431D5AB9A245A77CD70974FB75F1824FE68583E9F25E73BA5725\ 88AD0C328D73BEBEDF1FC99D898B7D1C9EB9AB048896CD0446A3E932A97710AB 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ 394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ 43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ 7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ E8:\ C90025BE7F02FA18134B63681B5A635A51C06EE37878C4833E0A853FA474AEFD\ 06BEEBA4597ED8E59255EE4DEC81B34D6EF3DF617A885F50B79F6EF9E47B4003 EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ 85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ 4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ 97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ 345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ 6427:\ 5C21E22D8B2887134F03D05945D91282B6321F122E53640C046FF9B1692F1210\ CA46CD8471E95F3C74F7FEB1DA0DC8A421EEFFB3699351825F16BA621015EEEF 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ 89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ 630012:\ F1A7011447E8515E1502A3AE56F8BE61EB4200BC4D21C8E1875B73AB2A42DE46\ 13D6404B17A740B60B57F742C92F45C07880498C44C989C15CF1CD37B3F26E77 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ 95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ 4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ 78DFB921:\ 02BE97BE60F581D73527490734CD5F8739DCB9A5089CC49C7619277CEB30D9A6\ 9B85C53EFC55C780A6494DD172B8BEB2B69F86DD4B7CBFA3E47F1720ED394383 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ 4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ 91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ 9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ BB0D19F909:\ 38652A2D6674A539559F3ED0996542C23D48D8D108C2AF9C10DA45C9DBC11906\ CB4AEE8EB04C88789B763C66B743356336C8950303B950D72A8FCA05B9C67CD9 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ 6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ 57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ 00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ 77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ 81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ 04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ BE6BF8082E8A:\ BC091874BAF2195324C56EE8386E13AC3F49FDB329C2D5835848AF2A3653BCEA\ 26EC8C370912CBCFB1C20D3EB9AB53C6160CDD5351836527C5719084A575EF64 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ 06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ 6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ 4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ 58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ E839A9D4608F03:\ D8025F57C003DDCC6ABDDCE2CCFFDB9C11BE984311A749A632D7EE4EB073C58F\ 0074096C17CE0A46B37700581D9FF074143F34322D5460C4BD1E9EE6AD497F40 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ 10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ 2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ 2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ 8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ 8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ 5153592EA81C6FBF:\ 99812EB8737BF609B3BF4B8ADE116403183DD7332DAB4F43BB4917DA0B62ABC5\ A4772D572BDDA22FD555AF55309D31FB93492ED3EF4455FDE4FFFE7BF8DF84AE 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ 735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ 1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ 7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ 39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ 9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ 604F5035C46B8197D3:\ 6B242888A6E956F10A8BE75E09287D59CC25155B0AA8D8BA02E095D0AFAA2910\ 4CB2051AA4B3430B724D500AD0317208C3BA9FB1265BF19A974E90F4BF0CE006 E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ 94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ 7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ 60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ 7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ 6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ 07E3B953ACF99964B847:\ FF77EF8DE1483F8A498E3554083BB69F7567FCED495E6BF0C9902CDCB5247FAC\ 6A4B50D1CF9CEE89C400ED3E4E6FEBB642F1AC3BBD018ECC04CB1A43A1331ECC D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ 32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ 7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ 8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ 07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ 4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ 6C90E8C4D100ACD9EED21E:\ 83E0BEDD263922F016CF539F9E7B43ACAFDDF35C8CE730434EE3E92ACD264006\ 031073A705F5585BFB66E53EA6A733901AE40634B6F4D86FB554CE0EBC5CD807 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ 18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ 886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ 4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ E2DD603D9EA24DC7C5FD06BE:\ E063490AC5C915BAF98C37660EB17A85798D728FB57CB0ACFAEDE8AFE847C902\ 5D8BF55B6EEA096A6F0B443B38D0BC77DD0BCB8228ED2681BB03A013D15CEB79 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ 742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ 69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ 9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ 779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ A80012976F31FFDF305F0C9C5E:\ 2F2FBA371016CD20ADC35C032B61100C298FBAF81506E83CC6E9BCC61244838A\ D83465658A6436BD488C55D27B82BA3FFC5223BB97A03AE33E05CA750FDF56E2 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ 9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ 53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ 479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ 3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ B461A40645BF176601F1E760DE5F:\ 783AF05873F418BAF09AA3479FFBA6CC9949F90D7CB9DF1355B46B020712EDD4\ 0477F7B2980DEFC4474B2D3C24BF92ECB5DA64FBDF167EDD9D9D48792D2B4DF8 D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ 5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ 8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ 1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ 86C226169FF257954EBDA81C0E5F99:\ B53D11E8514950F60345F266290DFD57B8550C011F2BBC1C7CD718E74CAA9847\ 3E98CF794975661C7D46D6DF10E14F0AF2E0EFBD480A350AC60E0881EA7090FD 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ 431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ 40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ 0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ 2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ 83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ D3C356C914FA06B9A7CE24C7317A172D:\ 0E21302B185191492D2625F0FC4A3380ECD75D8EA945E35FD6E57EB7142DE249\ 90EEE2B6711392F8856874DE50E6D2FDF1D23A228877298C668251FD0F06B709 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ 645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ 39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ 68F50D79F0C9C7314E750F7D02FAA58BFA:\ 1A77E749C8249D06F08943F5CDFEB5D65C804F1052B036CCD7A6F16120315AF7\ B20C6BE56CA65861A2568F7E726420E909FAF47E4ED96A3C299AFF94EDFBF6EB 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ 4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ 717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ 4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ 9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ 39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ 7DF95B60FA8712A2271FCAF3911CE7B511B1:\ CDF5CC029A5946BB96A524D865C6BAB024A2B598A9A657EF631FA582ED9BEBF5\ 6C18D955528A3DD5BC0D2466F7EE0EF8AF1C814E3858E5DA3A2BA951BB2D79A0 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ 261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ 0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ 61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ 37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ 2A4B61FEAAC1BC466DD77EBE6E800F87950B28532F71BE5E4D56DE28F93C1F7E\ 61C793745A91B8CCDC29914989730B7DF933E6C7F1B1A08638953F966F092560 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ 4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ 339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ 5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ 7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ B7F5CB9923AD97058EC067700CC746C127A61EE3:\ A40028E17CD5DA2DB800437A58861565E0A55CD3DC017FE48C7D3F2D4706D7EC\ 742A21170CB86B32B5B9A1496C5C5DDE4E283915BFCDC883F08039679E29ED43 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ 70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ 495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ 5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ 00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ 2A1F1C7FAFBE676D2A7BC67BD80C9387F493643E2395852AF8A6846A5DDC191C\ B17FCAA17BB82266FEA390B3E45DED4A15408A29DF5AE390A1BC945D5D97C1C7 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ 6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ 6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ 1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ 0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ 2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ 80C5090FDDA7FB8B550602FBB156D650958E0EE131E21C09FCCB57FAA9A9C868\ C5947E409BC5CFA89C8616619E625C7D1DAD8686FF59C2CD1D9940E336472145 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ 2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ 5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ 9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ A779BC3D4F6315BEFDA9CBBBDBA4C9E24D810CB46074D81A6E2D66947A30F62C\ 4D3EB92AFC6D9BFBF42DF3D8528982FCF7AECA66740D0E753040A2C6F71AC1DB 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ 8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ 90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ 6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ 0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ 6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ 46D64790833ABF3E17BB4B8CCDB4F0A2DCD23FDFA3135744306F4916A658CC5B\ 0BB60DD65DD2287287CA645C0B5904A7227ED1B40730A6F335BEC41706769E9D 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ 70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ 5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ 2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ 4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ 27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ 29EBB2B1BF14463500B983F8C9FE9EAD506514E9AF11202A9E0930B225EBC525\ 8A09324010C52FF35E902647D9701293A8F8A007ABC3D6A7BE629C5078A42BED B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ 0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ 0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ 8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ 547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ 758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ 8DB46A5D23103103746C2FE2480CEEC56FD9796AD357F5BC45BF0BC2D2E8B95E\ A0C286090AB858183C2A051B80FCA8776670FA3DA8722329848F057C6EAD4991 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ 38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ 5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ 3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ 8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ 5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ BC933D42AD3267F608AB201D2813E54250499D87ECEEF837863F59D8ACE4ED6A\ 3239C4C7CD7E172F3CF3CDED5D84950E066E2F549A767BA421CAD4A223313C1D A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ 3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ 80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ 49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ 9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ D84DDA22FBE020F57EFBC8C612B2F781EAA81E4C9B0F013BFC1B3C926A5BA778\ 28F8C6684A25B2C567DAD1B705E7BB417F5EAE6D8BD2BFA6ACBC7284F3C19E81 A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ 0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ 639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ 877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ 1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ C4966858DB87DFC7DAE95CB51A8B19DD481F75B3FF554B18458C0F25A285F613\ 5D73FF6F1B498B957E8481F16612D8B52E187BDE76B3A8D1A6324A3899F056D8 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ 9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ 10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ 8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ 88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ 0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ 2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ 04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ DEF5B398B53E2B884AAA19D86186EC7B386974386B24F5C993417C1B3377449D\ 0EE19D00AB789E2D63A56B01101E44692815644147D1C2D66A9A68579BEB2B50 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ 623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ 15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ 817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ 5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ 59D674C09E78B40FADD298EE83FB2CB4468CA96AFAA75CE3F4B451C0D353C28A\ 632A0DE753800D49FDBD6EA190025C5340036910BDBACC91C2D988B6FB2F8789 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ 21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ 0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ 7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ 7A3E81CDEA3E783B0D2E77373D7E3AD3E069DF3C9F16EA87E41CD7178EBA02D4\ 9AA344C562EA9DB6FB20645F5F3DB9B62EC1F18ADFB5C10C77C1EBACEECC5E25 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ 4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ 92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ 539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ 0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ 7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ 2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ B26C758C740DA514E7BE7966C2E371F96C263796688A771A955005D907AF23D1\ 9C47FB0FF920CA3DEF21E13B4C827E4AD586DBC3D28F3576DBC6694F48E8BC37 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ 76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ 4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ 0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ 52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ 27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ 720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ 9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ 919998132C03BB57E2748C5715C4D3CCD72250633983A61174E5A9B53BFD3ED7\ FA7BA8698BDF766B31B29E387B1E44E1C10402C3A9F4FCE845865803F805CB18 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ 131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ 808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ 71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ 6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ 74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ 4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ 6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ F0EECEC5514F8001BD7AF333B78AE40E0D20944AAA2710EB3524236ABE3EAF3C\ 999DB788869647B5737B60FD4BE4753722C2CA6E905E030EFD04749BA46251A5 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ 0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ 2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ 0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ 2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ 8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ 284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ 584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ 582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ 8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ E57A285664BF66D2D2C7F8AAB8B75224A793C799D16A4774BC0C8693976F33E3\ 10979C84FDC302822542581BAC488F68CA0987E7147A782B036DD211DC798408 D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ 13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ 3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ 682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ 321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ 1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ 63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ 21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ 910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ 63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ 8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ 90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ 43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ 4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ 8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ 6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ 9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ 53BCB0FD89D9CF4A3738A01154D2B280F03B1D68EF7B512F6C657A0264488CA1\ 093D70F88C08DFE60CD418E938D74FE18EB3D525CD0492C8BF85FD2B2709516A 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ 73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ 2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ 574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ 298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ 6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ 2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ 8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ 07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ 48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ 6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ 7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ 469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ 6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ 40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ 08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ 665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ 4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ 186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ 0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ 0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ 1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ 99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ 1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ 14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ C3A66CD4EB2DDB42EF85EA0CD65534:\ 6A6ACBD03B4A2CF63356C7B40B1C11B4E407349F13BE2A5EE0162D511B053760\ CA9869B3036FE9D68475BFE3957B7007E0380F174B2CEC30ADD94DB65E43B4D0 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ 6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ 70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ 013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ 5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ 44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ 8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ 1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ 9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ 9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ 4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ 323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ 8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ 53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ 11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ 5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ 41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ 19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ 647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ 142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ 40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ 40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ 3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ 2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ 94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ 4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ 9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ 561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ 5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ 303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ 2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ 13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ 46B568CE294C89:\ DE11315ECF713973B7D6E548DA33F68B53D8E9BC11F7E89C3CDD334EF748A58F\ 84B03B296F1B05357A8873449CDC49CEC6C893A629439B48B6DB517F4B0C9773 F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ 9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ 49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ 32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ 2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ 03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ 0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ 685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ 2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ 3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ 0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ 20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ 2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ 3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ 5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ 97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ 92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ 3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ 2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ 703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ 05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ 4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ 99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ 1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ 688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ 1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ 4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ 181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ 00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ 0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ 2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ 537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ 2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ 8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ 5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ 8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ 4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ 9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ 727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ 9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ 3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ 0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ 854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ 813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ 740168046E1DE04598A62F5B92372B5198F2C44F579094D274EB5171CB4CD777\ 0763D54CB75D070184921C3CF65FA371E96F8FEC8138E7E1E1590CB0CA26007A 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ 47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ 7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ 4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ 0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ 4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ 22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ 52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ 7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ 7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ 204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ 07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ 5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ 56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ 6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ 15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ 259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ 5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ 317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ 5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ 504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ 32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ 85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ 3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ 281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ 6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ 82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ 8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ 0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ 2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ 1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ 265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ 5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ 4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ 092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ 0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ 29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ 3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ 49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ 3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ 26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ 5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ 91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ 42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ 228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ 5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ 25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ 2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ 688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ 7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ 3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ 7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ 394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ 3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ 8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ 09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ 9EF7A93FB957D1B7EF09E156186699159E65461C9C5F478CA8F1B25C6C6AF982\ AC15F65E57ACD3ACACA75CC15C38616E0016685417E37DED05B4FE579EE2955D 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ 6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ 26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ 9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ 0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ 32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ 221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ 36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ 2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ 72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ 83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ 0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ 3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ 6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ 210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ 889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ 123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ 71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ 1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ 6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ 3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ 57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ 4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ 2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ 6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ 0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ 31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ 97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ 4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ 75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ 40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ 80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ 15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ 5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ 16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ 278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ 59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ 97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ 806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ 01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ 78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ 29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ 31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ 320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ 908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ 369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ 966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ 5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ 76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ 847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ 950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ 30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ 89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ 5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ 9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ 735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ 64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ 25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ 2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ 180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ 9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ 120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ 07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ 6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ 4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ 7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ 57795DABAF40687B2CDA7A5014168F:\ A2C211D36CF26297E82789FDC7E1564AB1A615FC6277E2AE77E1FE7370C0FEF4\ FB7B360424C44F393FC4EC2AD5061E633AFBC8D3FBB961322CDFB7AD5A4A443C 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ 2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ 6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ 5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ 78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ 0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ 273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ 3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ 6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ 1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ 8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ 0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ 98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ 048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ 00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ 8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ 4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ 7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ 63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ 54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ 6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ 3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ 50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ 742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ 2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ 79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ 59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ 4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ 7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ 5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ 0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ 9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ 05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ 5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ 3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ 3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ 9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ 6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ 60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ 6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ 1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ 1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ 7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ 37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ 42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ 5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ 7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ 24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ 0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ 3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ 44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ 3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ 5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ 1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ 4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ 1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ 14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ 0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ 78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ 2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ 131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ 8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ 8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ 455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ 69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ 7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ 39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ 1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ 545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ 75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ 38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ 090FC9BC045271:\ B5BA769BC397D0F2B541E1C996C40F64C3E6BE52950898BC0380513F8E6F754A\ 41025B104D2B5BD872D1D427A8E98F089C9AAF3B5071668C65437F0EF48855CD [Comb4P(MD4,MD5)] 636F6D62345F696E707574:\ FD1A64F7BC61608FD054303AFA2E31608AA3F3788E3034821D63A0288A70B573 [Comb4P(SHA-1,RIPEMD-160)] 636F6D62345F696E707574:\ 2B5F61CB57F94E7C7E6D7439FFF2600286658539\ 88224E0AD8C08C2FAA61963C8F761654AC529325 [GOST-34.11] # Using the CryptoPro sboxes. Generated by OpenSSL's GOST code :981E5F3CA30C841487830F84FB433E13AC1101569B9C13584AC483234CD656C0 616263:B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C 730B3A80E44DDB0AD9A04D990D22F84009A86E5E8A2E00164EB168CEB279:\ DF252A7F37EBDCF4995B5419394A6D3D2C782D30AB5FAE89F3665F86A4BBF78F 67C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339F:\ EF35DA69225241950EBA3F20E6EE2D86A6286707EBE04819A81F79AD71DB62E2 C4852EB81C5EEE208BBDCAA019F49142FC132197EDAF0E02374187066A9E25:\ CEA05A7CA858638868FB64A1BBC015296980A6096B4EB09B03F1C8B075FF25EC 12FC7387466C9687EF618EB38BEE08D4F67564BC48DFDE8A477EBBBC425C2C54:\ D1E138CD1DB357091037E6041E6BBC7F58E32C4294F938868A9FF5E66E174EA0 A040EE298C760CD98EB6467BC03D839A31598922758D475AA389881F465A8BE79B:\ 6AE26456D06C682AB63DE2DE3D0A8A932370B12204BAC4B04F78472665A350D7 3679B590CDB17A11BB39575C88F02BA1EC7FD72A454D3A30E702073A9451F7CA\ CBAC5B985ED5AA190E017597F2A038DE1F0F08655D429544459C7ED9EE75A4B9\ 21FF517FD4FB98E2FD0D79EFADB1CDCD:\ F2D03BA660317AB8AE88490C6B25B79D74B2C307AF0DF128E82E98204C3504E1 B3980FFE5331EE30B407FC8EFA18FF6CE35C841C1622C405C93A51CBE8B2EC9B\ 4AFC999E2D87CEE18FCA7089E26FF5C5CC7AE1E29CA6E766E03831C8EA1D6335\ 19FCD34683A128126B989C4D079113D30BF4B6A89A9D0E7AD63F42C05CA5F576\ A1C8BC2569E437D47CD3228465355770290D18C4AB263E81658141C2263738C8\ FFF4ED69D9243D55F85FD95D9431CDBE3EE682E90CC06A7241AC3468E36C30E2\ 601D4B3941898F39E868967D99643BD84ABDC1567D2CC8BFD8FC27BB68579DC9\ 74E902B57291EF5AFA85D793E9126B33CF2D8A4D59520C314F33ECB78A8980FE\ 7283B3E414A23F0E2816A211290D45F83ACF45932151C47084B0:\ D8A200CD03364E0FB2A396FAB05E67E0EB1195672316B0F54D1D05425E2005D0 D658E6C4786E9CA4E60B8961514C406336F46691F29A9B2B1C07784E7EDC6C55\ 355219ADC0B551A6C0DA07112748745D3CDAEE2E748A599091D2DF0FAE4B64E3\ 9D7D915D33E204F3BD0B05E45379418F542FBDC8B917594AE9385A9783BE7B20\ 3C0C7D6FEE8162AB8D678FE0E1D07035002DFDB94456042D8E5EC5111C403158\ 4CAFC73A302AE6BD91759E72460EA7463BA5FF80FB03AD8A61729B7EB2CDD6FE\ 7C9E39ACC81F6A599408CCDA167320511820D114237F9E85F13903A406D9A282\ 77DB2F3FFA99998FA16569B7D88A08F1AADA05CD59A3524ADC55EEE32F9165A6\ 6C94E6672D7FF6CEE45F85BCE98EAD9368B261C155B30B3209FA15388B7ADEF7\ 0FC45E3C43540B27B490E49D1E913186449247994553CB4E4DE086D85B65CF6A\ 292EA66D82B194364278D4600A05E74E972EE7DC81B32BCE93B1A6EE16765840\ A4FFAD26B0415DF2BA3153C4363A12CD68F9A9EAACD4B840865F2E9CD587DC79\ 86899F36CBFC29852D7C4963B65B301E54DA0801AEC14134206FD1F5F6AD6E7C\ 370DB3020ADC873758D09B0E2BCB2C7FA5358054F6C1881631590B270779A43E\ 8657409033C7C88B976399C22EC541D4FAC228F083B006B40A11DC118A804F11\ D78FA10A566995EDCC2EAFFBF3F0CFEEB2F7DE36A7E5EAB1F6C6C2814611921D\ A03327F69DBCE369EA9264DE8333CC352AAA6BD28F5683861C460763579980F8\ CCA8EE6964D2D34F64372DE76BF91D95A3886733DEEBB9FB31C05E8859DE8025\ 866F8FEB41623AA599678D0460AA9A0332013611ECEF0C1DAF6AA60848262ECF\ 95BDBAD61FF47CB85B09BDBBB357BEE558F5F645E40262946C089CB52FCA84C4\ 873E9BA632175F8D201C48D37306B8CBFBAF10E0B173741E7B10D3AADB576F62\ 950A09C721685441849C14F7A2CCC29E7BD37E2D46F24BC1021E6CDD75DB400A\ E549D106B1254735C15B2C6327EE01A3C17FD007711BC974393551AE1091B8F5\ DA89FB8BAE42C06F9DECD2C4DBD4679C5337A4C5526D398BA28A39B21CF1A7F6\ 7AA28228E44297812F6A450A3EADA691E44A5637B78FC2591AFC0B36EDB22C68\ 54AE9038F128B92092FF2AD0ACD061901BB8C7D2478A2C6186379773EAC4DB3E\ 726C7763943083262FADF6DB7E576C990F336B57BD97B843CF50B7B91492F786\ FE6EEA929F6DB8CE1BAEAA9906163215499D6C0735254A047501BD8994B40F92\ 23F925C267DD90828C3A1B92504DA79AEA14A11F39EB23AEEDE03781954613B8\ 40387AA7160A29A24544349591DB2F7BEFD09B28BCBED6A99F0D2A34543DEC94\ 76663B8C70642EB5A8624B393D7AB42D4B4F55070E2CB0AD39DAE18D17CD218D\ 335C19A3C0475968A9A4A1E71E561469A56970B3952060CFFA415C120E7E9F41\ DAB9E59B003E03AAE2A59100FBA56AA00EDA54A4FBB473F5F6CF07044DA74628:\ 12DF46E869E72CB058629D3554917D7ABA7C6D9D432751F58600138DD5862BFD # From TTA.IS-10118: # "Hash Function Standard - Part 2 : Hash Function Algorithm (HAS-160)" # Telecommunications Technology Association, Republic of Korea, Nov 1998 [HAS-160] :307964EF34151D37C8047ADEC7AB50F4FF89762D 61:4872BCBC4CD0F0A9DC7C2F7045E5B43B6C830DB8 616263:975E810488CF2A3D49838478124AFCE4B1C78804 6D65737361676520646967657374:2338DBC8638D31225F73086246BA529F96710BC6 6162636465666768696A6B6C6D6E6F707172737475767778797A:\ 596185C9AB6703D0D0DBB98702BC0F5729CD1D3C 4142434445464748494A4B4C4D4E4F505152535455565758595A616263646566\ 6768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ CB5D7EFBCA2F02E0FB7167CABB123AF5795764E5 313233343536373839303132333435363738393031323334353637383930\ 313233343536373839303132333435363738393031323334353637383930\ 3132333435363738393031323334353637383930:\ 07F05C8C0773C55CA3A5A695CE6ACA4C438911B5 [Keccak-1600(224)] :\ F71837502BA8E10837BDD8D365ADB85591895602FC552B48B7390ABD CC:\ A9CAB59EB40A10B246290F2D6086E32E3689FAF1D26B470C899F2802 41FB:\ 615BA367AFDC35AAC397BC7EB5D58D106A734B24986D5D978FEFD62C 1F877C:\ 6F9D2898EFD096BAAAAAB2E97482DDB6389B8E6CAA964B7A0E347E13 C1ECFDFC:\ E405869DA1464A705700A3CBCE131AABEEBA9C8D2FE6576B21BCBE16 21F134AC57:\ 5573DA2B02216A860389A581F6E9FB8D805E9E02F6FA911701EEE298 C6F50BB74E29:\ 163C9060163AA66B8B7C0CFAA65D934BFF219BCBC267187CABA0042F 119713CC83EEEF:\ CFC04C6F8463DDAB24CDF8B8652BD11DF23DD1B95F118328DD01580E 4A4F202484512526:\ 7A5C2CB3F999DD00EFF7399963314CA647DD0E5AE1BDDEC611F8338D 1F66AB4185ED9B6375:\ A5A75806083AA9307074EF8FBD7DF592985E5F714611E812216C0449 EED7422227613B6F53C9:\ AC78FC53A1DB90A634F1AAAF90119C889C8C24B59B98B7366029CC73 EAEED5CDFFD89DECE455F1:\ 672CA6826686BEDB258532830D606B258C6DE60154EC0957CD8B858B 5BE43C90F22902E4FE8ED2D3:\ D98CA07E172B0BC53D679D2F8D002C63FD24A6307F2B7E1EEEF28BE0 A746273228122F381C3B46E4F1:\ F122BE39C91A6C17CD5900F531E680D54CEDEFD4F0E3D113D26543D4 3C5871CD619C69A63B540EB5A625:\ 2A26D2AD2015C67CABB7895EC5FA25473D4D1433FAE92B9B2CDA31F0 FA22874BCC068879E8EF11A69F0722:\ A69E4EC1648CBBD595558EE4EA345E4196C2881E85E853739B1F4604 52A608AB21CCDD8A4457A57EDE782176:\ 5679CD509C5120AF54795CF477149641CF27B2EBB6A5F90340704E57 82E192E4043DDCD12ECF52969D0F807EED:\ 455584A1A3BBFBB977AE08DDEE93DA5ACAE0F2F4C3CDAAF089728AAE 75683DCB556140C522543BB6E9098B21A21E:\ BB779E7267CAF0E891547EE3E3BABF17837671CF731ED56334F61CC3 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ E7B181DAEC132D3B6C9DFBF61841135B87FB995BE20957B8CD095E2B E26193989D06568FE688E75540AEA06747D9F851:\ 44729646A05AD0503A876B448F88F177A0A263AB746CA6E30676ADB2 D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ 05E15793E417DD4E02CD6C5636D42C1638C164D70B79F717F25D1A15 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ 2C4077A8858966EF79AAC3EC6D82855EAD22867BA45D617A68CB926E A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ 2E897B479FBCBF42D2139F6768DF147A3B85C36A5B3F3C066EB0565E AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ BA76FFEFD006B81EF5991E697D0425621B16818EA27C11056E00904E AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ 1C1E758D87399A36BF7C8A2E6A55CE6A4F0C498737956959959FD2AC 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ DDEA76409C61F6D1873F01A34251C74C37B34F28F7F482A84395B5F3 FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ 777C523CF42D0006ED1F88F1BD0C3A5EF21814723794B8461A375C3A 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ 8D7474ED6DEA4626AD3C1D06D2AD5B198CAAD07B12077C680CF6D89B A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ F525D4515D3CA54A2FAB9C679E93561FE151EA0960751352CD7F591A 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ 9A8455F41F693B91B3DE46BF66FF09D42DC300B856B1DC2DFD12555C 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ 81AF3A7A5BD4C1F948D6AF4B96F93C3B0CF9C0E7A6DA6FCD71EEC7F6 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ A27A051A36A1501974AD8E9873E9DF231AA9AD90EC1D7A8BBF8F639A DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ 46:\ F217812E362EC64D4DC5EACFABC165184BFA456E5C32C2C7900253D0 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ B5A0:\ 5CA92B5F5830E1E5F8DF4391339DF7DF1F23BB31AA05437C103F1652 B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ FBAD4E:\ 9F01F07D930F40A26407760104EFD10D4436295F6B8C41FE2A4E09EA 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ ED2C2492:\ 22A3FED1F4E298C37A1D7BA0C80E994B11D95F290F3945A3CEB2E2E6 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ 6B2EE4E542:\ 35F1AB1263211F738D3F97D0E4840C387E09369F23BF9239150D0306 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ 2A1493D8F4FB:\ 34CC708B874D40478E82324BF3AA32FE9F85AFF8C60B4BADF97003E3 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ 30A934467DA4B0:\ 5F339B2F87E7F695B236267C819BA1705D97644AD72E0871C7E3A913 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ C0308E29446B8ED3:\ 8E20D5C83CDA8226B58CEFD74C293CA7579CBB3949CA9EB2F61565B8 C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ 723B20F67BA610C2B7:\ 606255348812CFB5082F4D4BB6BBC2FEEF044E381FEB0E346061AA4F 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ 0C834CE6EADC2BB86BF6:\ C885274CC3BF110995FEF1154A86772F28B41E745E86E935B4E3A03F 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ 1540D29BA27AB8E309A4B7:\ EFA7F7E7BFFA6A5E7F7D1C24E7A0A9DC9A6F72B3E9550A0AAA06CCE6 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ 32B58EBC38FC2A6B913596A8:\ ACA7DCCC6B809D511F4C248CAA5D1374E734C1ED6B995760CC3C56D2 F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ 38467205F5DCFB34A2ACFE96C0:\ 6F1EF55CCC6EF9B68DE54C14448487901022452AB761F84644E9A127 CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ B06CF0F5A0EA15CA907EE1C27EBA:\ B297F61FF06021BFE1B9D350B3F54D810BC16ADE17001BAE1B4CD4A2 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ BCF84D0D4726364B9BF95AB251D9BB:\ BE9A75436C3988FB2FE21D0C10EAD9B9C807DE2E13A9BD8437F13332 D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ C7F157298EABC4DCE7D89CE5162499F9:\ 4304582C3892942B1960822C965788B22DE19F1C6D5E204476ADFD26 BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ BEF788CDB5CF4606C9C1C7F61AED59F97D:\ 0480EF8519C32F89C65B8DD450025EC49CBDADA6C4CFCFC6FB4F1C61 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ 86E779CF053C77785AA9E692F821F14A7F51:\ 0BDE9CD50D70F00EED97CCE40C3DF22BB4904C08C4177C3A95985D97 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ 43304FBA401EFB2BDBD7ECE939102298651C86:\ 3BF3ADDB761AB32A38B7B47047AD45B68EDFD88ED475227447EA1B1E C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ 87D68D28CC3897452F6A22AA8573CCEBF245972A:\ 6182614C8257EB05E9AC0950E15E6044872E5C0AB2AF4540764CA0C8 EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ 22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ 0B5DC722EEA2C348325FD9B3D7F08F365B71D5B582C27BEB79B51D5D 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ 29C2B817C75B6417BC89C262AF9D58F0C18FBD991F59F4181F237038 DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ 9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ 62C5876694D88007709B50900EE2E6CA9505CC90067EFBF4C1D95B0B EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ D362BE7896B2AC3CA4DC3161B7F6C5B3FBE65F32D040402B8D306B15 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ 97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ D420C7BDF8D86D7B1CBD1AF7868EBC4FF17245595B94959A0714333C 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ 2E04DAE6E3FDF2A47FF40E6F3E61B371F3E51A5864A31CC11D127620 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ 66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ 22817A21CFCEC4FD2348B6BE8A7042A37754D76A3F33A8F818312CC7 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ 4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ 68CAF2203317A8BED30C1792E888910124F2F0EE1D24D47274BCC856 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ 7BBAC0C0F192D2C479348358D2247E4C08966A512F73D40445B52EC7 C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ 30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ D226D9E1F36EC4222693699B6D0383C1452E391C41EFD7645289F8E3 F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ 05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ 294A1E5A0629A2736F188691A35FE1ABB55472785DAFF6CD88C6D537 E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ C533DCF88CD1A5DFF22B914D3875BD57FC17B2E1F474AE360C3877D2 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ 00:\ C9B7AD7A32B70DFB5A8A2FF9D98B300E484B996ED752A732D84DB6F7 FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ 37FC:\ CF646D5E5C81818C97A01F393F8033CE3CB7CCD07FDAC9988766BD1C ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ 2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ 599BA5:\ D411E8A7CF50AAF91076A8CC5F01BF5B6BB2CCAE8046BF47871891FD 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ 479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ 40706B05:\ E094C0303D1841C6E4C0864857CF36CFC980E3CB4D78F18E301117C4 ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ 29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ 31D06C77A4:\ 51948E1772C2C2EE49158D02A975B27477BD041262954C3E60F5ACC2 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ A259FC4FBD72:\ 8214A2B0E8BB60CD3E4DFB0D0855D0F6C4BA6D2728D0687BDF75F79E 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ DBE5FE9694AD6D:\ 8A2AE6B9AA7B1E08F8C7DC3BF5AE876660D30F79391714A175381091 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ 7EF57B91397AA8A7:\ 702B1906A63D0F924AFEC3BB5E5C5742E85F9834EA6F5306644811A1 BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ 7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ 44B78B2D48DE1A08AA:\ BF2101511220B7DFE54B127C2476EAADFD4EAB7FD0F6BDD193078AC8 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ B3A6C9FED24D70749604:\ B07ADBED912723A07FA5353F665EC14FF82D85E90BE3E5A1F5C90FFF BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ 8B033F77D384CA01593C1B:\ D1718F0D387AC427111A7E90E575DE5F04778EA2BA147A8451914FF0 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ 013C23F1E9611D595EBAC37C:\ FAF7D793024E6D05E77C5231712478822C915292FCC1427E6ACFD3CF 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ 9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ 4EC5A49FFDB59A1BD6A292AA0E:\ A375D756A8F39C72F67CA489C95F99350FFD0515B151A3BFF288CAAA D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ 498E1F6C82C6CAE6FC14845B3C8A:\ 1BD1B6F3144A3DEE93DEA1DF03C0E958F485B8AE164DCEE55F973413 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ 88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ 5B01FECFC146BDB251B3BDAD556CD2:\ BE88B495D0CD90281AF2094B8D7E72EB417288CA16F751C09694B682 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ AE9CD5CF0991878A311B549A6D6AF230:\ 7DAC046254808464024617D63A038267FE2CA65052BDEB569A0A9C15 E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ 105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ B50C7C681E773D109FF7491B5CC22296C5:\ 89F6B320EFABE42CE13C9E20E4829F31A7848EEE3FC854E603FBD46F E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ 190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ 2C7CA303269ED14014B2F3CF8B894EAC8554:\ A805DBD3B8DF5E03E05EFFFDE1B94B35A23C5D77C2797D984E56656F 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ 1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ F05742CC1DB422A3113AC49602E8D0DD6CB472E7ED26BCE40BBA09BD 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ 8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ 37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ 45945F867B7E1E75EE496E0FC4AAFF71A0CC539841D153439AED4DFC 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ 85EA51D49894E45BAA3DC707E224688C6408B68B11:\ 5A8AC7533E1354068B564CCD214EB2A2E097DD60E08BD69FC782B0AF 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ 8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ 04E18D475920CE828B94E72241F24DB72546B352A0E4:\ 059F7EB983362FD44E94E2BFD59CCED43CAE959C9A483EBD5E6E2036 B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ 22D62AD272FEFC89F73256EAACE00C7B8E998FB322C8EB67DC1EAC6A 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ 578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ 44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ A396EA905EB612554BD00E4FC1BB4C5247D73FDE4BBAF5380ED42DD0 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ 4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ D8B5B24B9E92326FDE5DB1058EEDBEEDB0B65982925734B6E2844036 B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ FDB9015B20DB446F79575E6B8C73A98EAC731CFE2E59BD46DBDA0E35 CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ 5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ 27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ DF1B47E73E8CBD2CA852CF58AD68B5F8BAA1169C0795961041E8A918 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ 1E8A90918D6EAD31E446D4EE2673871ECC5C7DA9B18ED511E1632E0D 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ 29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ 1060AFD1E1B9F7F41291A4861774B3B0C95A812788A41D7EBEF4A893 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ 650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ EA91EDC393491B4CBC035B8538DF08E3C6B8CAD18338053C81FE2E08 E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ 7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ 8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ DF1AF149E5C92CB29174C1EDB6ED891EBCE4366010DC7CBFC9B1D757 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ 1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ 040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ 5F698408BFF0246B05BAD96CB342B2FD2F11B6804EF2FA07A81B0920 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ 0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ 0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ 49:\ EBE6D61E8A946E0D45D3889F9E360ACD3A1A7D6C4B1307448E6E7357 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ 0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ 2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ 5B52:\ 1B7F6BCB2271AC9C3B558E95F85285EE756B03B767A01AC57D7C6E94 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ 89CCC1:\ 436D1BCD6B3DE2677A72B93E2CEDB60C84A4FE125A802E2997EB2E67 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ 14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ 22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ 6DCBB4CE:\ 62B10F1B6236EBC2DA72957742A8D4E48E213B5F8934604BFD4D2C3A A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ 7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ 881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ BADF45685F:\ 1186BEA0880D0A96F6A56BBB431F4D264838BB0180DCF66EF0B599CA 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ 312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ 96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ 9B62C60A4771:\ 383D2F41ECFDA5994E815432999D192E1A282FF5663196A4A268A67D F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ 9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ CA58D5DAB38ADB:\ E2594A633B2DC671FD0DDFD3BF7238332C425520827C524FB0E19778 E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ 21691E1069413848:\ 234764AAE8C39B1571D7741BB176FF86246070EC9AC97A1B2EB35472 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ B57D6D0C2EDC4E78D6:\ A634D7EBAA2BC0043EB5E237690E38FF1E05EE5A042882A233A2D92A 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ 8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ CD19E781AF20454AC880:\ EF03FBB1EF3296EECFB98909E416D113B5741E44962EC57993C6DA5D 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ BF0FE3C32C17AA188A8683:\ 210D245CC8B5A7B4C1B118A9890ECDDC34A66EA92805B7A7C19A944A F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ 0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ 2E937F21C005F17411473041:\ 517BAE010715A020435CFDB531B856C5704E0EC611360F60D5B76161 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ 62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ 2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ 29F695815D866DA99DF3F79403:\ 79D478B4BC5E6FC2D406BB1C3834A5CE397A88E80135F55D8FE32C5E 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ 84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ 3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ 1BB15B447589E86E8D76B1E9CED2:\ F7BA7A56AFC1C58E62841C3B98F5677199F24B534B0D52D9A5C95495 F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ 4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ 853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ AD3D7E886DEA4F005AE4AD05E5065F:\ 78A90B769E9A326C93D5A6A6105AEE031DCEB2C8D222B36E02F27DB6 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ 7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ 68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ EAABC35F5C2B0A0F2379231953322C4E:\ 3D9D5C2FD2F60F4BB89E11FD3BC2FBD65602EB3F3F38D6FA03BDCE2C BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ 4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ 2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ 159388D5C3277E227286F65FF5E5B5AEC1:\ E1FABE16152560387FADAD3324CBB94D8AF968786C3C994C8F926D32 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ 407847DD0DA505AB1641C02DEA4F0D834986:\ CEF84F1966215B1511F5E0DB564D6827898184FBCB88BE0213FC563F B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ 33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ 99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ 7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ 8E4B5A2B79FC1E7D0526AACB5B9AC01A569635644C9249DFFEE3B927 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ 2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ 205AA1615DB44057DB991231D2CB42624574F545:\ BAFF55CDAD66AA77AD677E13A138B2F17286B504EA6B94EFFD9D9A95 DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ 2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ 157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ B4EFBE1167755F5A75B72CF15E0601662D036A16CAC8602A909FB328 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ 0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ 0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ 3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ FA4BB608F8F60841E1189F8770051695CDC9935BDA7187C36419228A 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ 46176EBF044C4784467C700470D0C0B40C8A088C815816:\ B3A877231519C24E2EFA424E6057128EA105B54C65E58074B5B1583C D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ 91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ 1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ 9F385C0B645DB8DB8B73C98C40BE264FFEE6151C7B5A0964E67DAA9F 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ 1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ 285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ 6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ BD6C865993082EC7B3808C13FD140FE0C0667B3EE51B9F8F1F4DFFD8 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ 27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ 9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ 8CA844ACFCAABD3B969F86C2F1ECDF1620574EC8C24426BE2DCC1BB5 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ E8D549FF8D53745A4C5C75BDAD92314025DA877A77CE49EA134840FA 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ 8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ 4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ 47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ E6BD80787F8704FFF73112E8B368ADFBA3A1109162C769491349DCEF A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ 2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ BD7D9E6CF9D2C1030F892533E01B72B5288E174B0864D81D71F8C6E6 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ 5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ 4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ A5312E8C7F0A3594A8ECD1ABC5CBC14B2585F0B1FE32A4E1FA0A2E25 A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ 07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ 6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ 2E0D739386AAAF37980EE421AA8C19B19AF52E70F59DC0A6988471F5 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ 29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ 98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ AF3E0CC6E64501F10FD39722E852355FD6D80D32190631E2F06C22AD 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ 3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ E2:\ F009E05D1AFE2D33D2C5F4008B46F31468A7BF5299D4F0AB0EFE4FD3 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ 1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ 3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ 52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ 61EC:\ 76281BD1613843A3ADBCBC78D1923AFB5B8AA2DCBC48934DEEC84AAA E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ 9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ 2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ 609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ 9B5EDC:\ DA7C79E04FCA2B69AAA58199CA69105B6B18FE67E29F380501AA7FA8 FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ 63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ 42D75D68:\ 70ECB261757371A282903C696715DC03F106A339F076203BAB436E94 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ 7815BF3C49:\ 740D3CB455133173EC652AA04709EF0F549F19A9D4CC6BEC9E876B5A 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ 61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ 025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ 951CB2068CC6:\ 663835A81A2A38D5AD3A37BD9BC96618D27CA32286E9091834A0871A B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ 93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ B0FED6A8052FBB:\ 2594153AC2DE681F4DEE340FA344EC388773A377D5B89E503254FD2E B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ 35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ 780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ 015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ 37674C6F8E380C04:\ 42275C296937745758FF2B7BEE9A897191AE87E42BD10198D9466C19 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ F22DA873C601016A0D:\ 143F9055EB1F736729C77721FB65ED5EE142F6E969132FB22989C11F 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ 472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ 994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ 1373FB09A1A6E3C7158F:\ 449A0313CCAB4427032B6BE9D66F827FFB4C71B538B2104F9D14D14A FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ 084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ 339612E830E9E7A9C29065:\ 21E2760644A19ED18ED0CD74C4E4C071D770132AD215EB6F7D42B01D 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ 5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ 8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ 377838973C1D943C22ED335E:\ D5534C72BE2E4B1FAAA813118B0D29DBB86F624067EA34515AFA08BE 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ 725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ 798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ 8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ 2D0C9E7448DE3043AE22FDD229:\ C0CD413B1CE000A1BBE3A2CD103C7F8F95925AC6C8A5C922AFB5F96D 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ 5B6C338CBB8F6659D342A24368CF:\ 93C6BF585E994B1669184AC71DC8E772B53443E668DA0786D528090B EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ 76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ F6954BA0801A1294CD8D7E66DFAFEC:\ BFE15BB51F680F2F489F0FDEB32F271090A09D1563F29FEAF92104E0 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ 055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ 256FB33D4260439CBA73A9479EE00C63:\ 6D735FB7579135F61B771B2BB0D81514CDE9C977ACCF6FEAF6EDEBF0 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ 911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ 5994C1DBB3B5C7871A11F5537011044C53:\ 6D93153145904CEBE0E8A66C272BEDF4F0D0A3C53AB30264135431A7 CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ 2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ 586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ 4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ 4E53426CAA453F8DE1CBB57932B0B741D4C6:\ AFE30535675A7021BF618941D94DDFFCCEFCAA1EF06CDE306D5D7A75 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ 868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ 83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ 916501614891BD99400A8AEAABF69326FA98B833AED82386AB19E507 EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ 9C3759905E47E49CC7057C9237545D444F758535F991F7E8728F3A51 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ 656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ 46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ 8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ 733ACDF9CED47F2E43936ED6C2AC0F824F4F5B5D2942522D4DE5F6FC 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ 7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ 4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ 99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ 530438B7A86B16434C82713EF7392D25C5CF814C7C6408368C4F2EAF D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ 66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ 67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ 84944EB018F8A124E3C969C037464EE32BACF8E58901D2E22291DF9A 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ 1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ 48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ 15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ 1311DA757C405F2A0EAB110B0C515F05FCD59F5495A9704252DA5AB8 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ 7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ 66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ 5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ B5FDAEAD7E68333CEDB5D4AD636AE7059EB31305E2C831787FD51265 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ 7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ 1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ 1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ 2919FD6C376AEC9F502893A9970B9AC6591855227C0E137BE01705AC 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ 9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ 0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ 45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ 8910E7ABC3DAA506974EC13E35C43133EBFA91DEEC99BFAD4954447E 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ 1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ F8B4A4A6FBB8C8432712B5B815B36685C86656C3F67D05BDBB44B49A CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ 60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ 0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ 926FE0044B12422D3E4BFA52C59252ACC91DBF09C488AE9D31C7EB63 F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ 10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ 568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ 46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ A4E4B4A573F7B8865D77D7E57F7D840A55261A96E5FEDD763D0811F4 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ 8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ 4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ 01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ EBFD796B29F6059931732F98602185B6377C4E6E40BD26C810D6DA96 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ 9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ 447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ 3FB7392A6621B852312A374C14A679AFB0E3D2EC6A2D147BD5E873F6 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ 74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ 5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ CF:\ 8B3750655AF5ECA10CC4F291043590E2D19759253047A4C1DBC86577 FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ 5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ 71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ 1DC8:\ D3A5004477BBB21CF7D0FCA84E51A7A57E93FAE7222570C01B00E89A E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ 54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ 009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ 2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ 99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ C25E88:\ 75B77C36E394711DFD35C11AEC8C033DCD7C18712F3B06D1FEDC1077 F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ 65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ 3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ C5C06729:\ E52DF7FDF957269CA0B0F46553D554FE2E6367019B379A1E4F4C7A9F CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ 68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ 6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ 551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ CFE0AF93EB:\ 41853CD54692DBD478BB1E2D6CEDCDA1D139C838AC956A37C87F098F 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ 331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ 2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ 05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ F467BC75A9D1:\ 1F2727D5132C453BD321A9FC7AA46FB8B3341D90988C41DE8439D2F1 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ 513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ C6F4756017FFF5:\ 5E745F8966D91EEE013B061281BC20C79B0323000A15BBDE7E0D25AE C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ 798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ 9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ 45DBA58E6CB2C8EA:\ CD2EEB7D48D0260986BADF16F15AA09B5229B7830C73EE95B8CBF85A B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ 01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ 86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ 10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ E8419D48FDFBD744CE:\ 3322FA727A0089F500A6A99D67419A76C7AF77EF2893E8D385B42720 A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ 7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ 6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ 1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ 4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ 359D5D1EEA105F28DCFB:\ 234C1BC03FD4C3D38DD4C736B59A9107911210D54E98B3A372F57236 E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ 2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ 6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ 8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ 7ADFB974EE205A9BF7B848:\ BF229F4017E1674D4CB87B70D3D777C7114F085D77216437B860D641 B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ 7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ EC77F29D211BE89DE18B15F6:\ F95DE3F40E5FAF58D3320B5B24ACEC7DE6B4B7E54C2F80F6D314AB5A DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ 4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ 49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ 9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ 50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ 63EFE793489C39B8FD29D104CE:\ 04B3BBBDDFEBA441005A48CEBDBB1C6B6A674C2D9B224DA29844374D BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ 02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ 711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ AE5B257BE36A7124E1060C170FFA:\ 6C1809CD88A0EDB211986359498E0AC37E25E8EB62946938C37D3C26 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ 5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ 70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ 001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ 480AB79D4E6415B520F1C484D675B1:\ D2744A1BBB34718FCBB614C21E1FCCD0FF88615CB82AA03803AB9460 A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ 84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ 920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ D42956588B3B58CD948970D298776060:\ F6115F635D98B572FD1BA85763ECCF8BF273FBF7B96F0DB0120CA8AD 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ 3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ 678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ 2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ 8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ A96CBDE5FBC953D9E576CD216AFC90323A:\ 5EE73A4F13A08A2D9B1E52DF88972FFB9F03B843A387EE52B00EDCEE F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ 593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ 0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ 358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ 67B5AD93D874812A1DE6A7B93CD53AD97232:\ 44BC64559BDB910B7079E0261FF8B49DBA141B32ECBCB70B3ABDFBF9 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ 85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ 352BDD3740DD6A16792AE2D86F11641BB717C2:\ DE82ADDE823C312F83B3D4C0BD35AA0395AB747ABBC22A70973E2A6C 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ 71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ 865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ 2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ 9ABA31EDB903B28FBFC33B7703CD996215A11238:\ B1BA910C9F5E126607FF2531AFFECBA791261E354E2C1A81FDA7A756 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ 8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ 13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ 9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ 32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ 3EF8D4A6BB8E172374E806E8D65D5F81B3FDB36299DE1C0CCC26DC65 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ 3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ 7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ 1C89D6460B3F13584BF8319EE538F24C850CA771A51ECC547652BAE3 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ 2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ 41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ 1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ 6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ 99981766CFE3B1888F2A008EFA1088016CB29993567F9BB74B5C4D3C C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ 58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ 21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ 104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ 0215E91EF992DCC7E82D16A2C9B27921C1310C182F59DF8BED5151E8 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ 4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ 76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ E52EA6714A3978810DC19E999C32516D4ACF0CBCD67E917A4FEB56D0 C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ 7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ 36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ 4C3D6321133EF74810E60D3190FFF3CF20C8521CAEA6FF782D7E3BAB 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ 8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ 7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ 57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ B9F006DBF853C023DEBE2F40035A7E83C49CDE656EC86A4621950F3E 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ 384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ 4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ 55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ 0A5AA6BC564B8CB2F5FD7255455C0E7A5DACE0050C3BBD259FDE2AB9 C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ 4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ 761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ 8CA4E085F04956B5B16520E3A767F8BA937364FE5F4460288AD4F231 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ 0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ 475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ 6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ 6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ C0AA34391CB3104C41995F3DE782F012D421585E5384E047A997062F 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ 635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ 822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ 1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ 33C10010A0B810386AE62F3F927DEAFC0D5AF0AF3DC7A8355CB779CD 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ 1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ 698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ 47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ 842A2E13D2728CA55B42D784BB6BC4B889E56775AD56BF75789CC57A CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ 8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ 696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ 7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ 01:\ A576281CFAA89DCEFB1D37772400BA4CABCEEF33CBA2F833336A74F2 D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ 0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ 2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ 9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ 4D4B:\ B1579476972D42FA388FEEB8424834672C4D1A4225EE2DB89DEA7359 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ 1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ 18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ 299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ 4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ A3BA86:\ A32EC69648B4FD9BA2431ED0FEF036188C19788D7DDF0D25B6B03ECD 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ 69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ 1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ 61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ 477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ FB9E4AB6:\ 2B8CF4C8D9E6717EBCE4F0584ADA59A8ACDFAB98AD7E33F355B77095 FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ 31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ 59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ 7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ 91355C6280:\ E583849474F3C759B7A3093C7ABADD61425073AEA2678E278215708D 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ 62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ 225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ 1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ 366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ AF1AE717238D:\ 10795D3ABCC077F4A1F5B5653C478F9DB42110EA9F34925470B3CD11 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ 85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ 16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ 528F9AB49C79F2:\ 31A843B4A9F332F3B6B099843540AA70651B26B80E0BD75B77F3AA9B 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ 584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ 4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ 4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ 5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ EBDDC89186839B77:\ 1029CA117957D80F3C859E8394DD34969331CA3BCEDC436B1EAB0849 FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ 6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ C66F252F6E64EDC96B:\ 6096E9914C1AC93A6809DE7AD91119C637B00BBD64DCC3E1FAC1E1ED B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ 5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ 252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ 25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ 232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ 5363892A2495DF8C1EEF:\ F583F07DF2327887C6F10A9B1D509A744F3C294A4227976E3C3722E8 C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ 272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ 414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ 49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ 199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ 5C6D1BE4BC79F08A1A0A46:\ A9F43B9621FC5902DF2458FD53D0CDE90AAE7000855C67D853C7937A 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ 2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ 443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ 6EB6E4A80358ACC78647D043:\ E9675FAAC37C93AA61FF9730679A3D1209ADBAD4652582DFF5B1BAAF EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ 01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ 90BF2C4062FD2AD58F906A2D0D:\ CDB500740812A0D70C68D0097DCC7ACA86EC066C89D36642879A74A5 E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ 3EE46FB67422F814A68C4BE3E8C9:\ 66F205D7147991A940AFFB7401B692275338519A97608C584362FFEE D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ 4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ 38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ 806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ 4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ A17E776C0D02856032A6CD10AD2838:\ 909FB29277AB2C4CE4279C485D4FBA7E18FF1A88C66DAF7ACF630310 F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ 39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ 42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ 4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ 2ED1C78631FD23B4C3EB27C3FAEC8685:\ ED535EC075C983A08F7D7AD5714EBC846F25E8661492B2B31978EDF2 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ 94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ 286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ 04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ 72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ CD90333A77BC4E1988A82ABF7C7CAF3291:\ 87F15CC2AEC24168D8BBAF188825F3BB0178CFB5C5899F2FD042CE89 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ 29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ 5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ 626C48322E9791D5FF72294049BDE91E73F8:\ 31BB872545217FDBF11077E86B1EE451475C31DC5E0E636EFBE50825 AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ 1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ 42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ 774BE89C1114DD531C011E53A34DC248A2F0E6:\ 26D69F0AE8E4DC61C6354FF570FDD913CAF21C18697F0371F2D323AF 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ 246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ 47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ 94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ A7059ABE99182714983B9C9D44D7F5643596D4F3:\ 175393534D90B614B158105C95E18A1052A56D0E775EA1CF51AD5853 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ 374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ 6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ 63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ 5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ 4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ 3DECD71DA22639985CF242F2FAE7172459042C826495C8D8D95C3719 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ 575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ 7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ 591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ 2D0A56864BBEC6449FBF7B2EAE53DA46647183B56FA4EDB1602E5163 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ 37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ 3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ 9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ 24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ A0FF9E11FBB451943A17E3AC510DE0B582BB072B16DC4E03F9E4019F D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ 33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ 0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ 52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ 4FEFBE74645949A1291C6F6F05EAF4B780EA01EC5EA5105ECDCB984A 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ 7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ 5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ 806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ 7CC9EEBBE0DF46A398233FA31286F8A530292B53E48BA54B6AE40472 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ 271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ 608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ 990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ 2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ 03D718DA677C4018E52288BB30E4E6E732A16144931176F0A8C73970 C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ 56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ 8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ 50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ 1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ 9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ A9ABB430FC1B3D8C6CDEB5319878E7B12B118E2E03F40562A376418C 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ 5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ 4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ 261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ 31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ 4A7A58B337872189A06B53B6BCC50C29EF9D0BBC491832907AF14EC8 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ 266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ 7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ 357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ 5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ 719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ 808E01CD273919BA1BFF011E0E7094EC6D5C4962912B08F11965AB58 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ 8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ 3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ 267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ 8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ DCBCC30B6909FDF00650F1A10CFBBD419408F9D37F378C5CA693B803 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ 1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ 4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ 3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ BE077F12762EF51859B6C520B19231E30442AC268CE4FD47366FF9F1 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ 994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ 37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ 7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ 9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ 25C425265AB07D0A8EC659D4D5EE618BDE87003B7255FF4B5315F1C7 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ 394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ 43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ 7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ E8:\ 046CF62C41CE9B0F54B667558063023F59887BADA9CC288414ADEE7F EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ 85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ 4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ 97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ 345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ 6427:\ 37E3844080986179FDA99E9B8C54E294643060795B66E810E3E25D9E 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ 89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ 630012:\ 3B503D615E54132B42CAC1A0450A0D7E2EDC63ED87BF109C509C7987 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ 95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ 4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ 78DFB921:\ CB40837DAF4A882538464DEC0A999DA482B4AAE08708EA6D5D7FF461 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ 4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ 91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ 9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ BB0D19F909:\ EAE911E66661DCD3472B458A48B74730468923C7ABCAC7F311F02463 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ 6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ 57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ 00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ 77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ 81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ 04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ BE6BF8082E8A:\ 307D5A8BA5865A4D281ACB2F3C5EF16E3B11BCD8C0F82D22D47C2CC8 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ 06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ 6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ 4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ 58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ E839A9D4608F03:\ 58666B325D81CBE6A4BBAD91720E2BA93C70EA114E7F77323C5BE486 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ 10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ 2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ 2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ 8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ 8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ 5153592EA81C6FBF:\ BC296FFD39381CF1C96228A9F380F41C871B8788C654ED9B384C17FE 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ 735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ 1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ 7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ 39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ 9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ 604F5035C46B8197D3:\ 0CCEAE713E5E39BCEFE7A2273004816FE005D5EDFB2A965CC9AC9948 E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ 94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ 7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ 60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ 7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ 6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ 07E3B953ACF99964B847:\ 7997FDF30837D8B25E85FC01316E31B61EE814490DA002A04816D7CA D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ 32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ 7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ 8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ 07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ 4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ 6C90E8C4D100ACD9EED21E:\ 9897B479871AC73DABBE6221E27BFA67278F2BB044E3D0726FCB2B81 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ 18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ 886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ 4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ E2DD603D9EA24DC7C5FD06BE:\ EAD2620FBC4BDFB14AEC8C7B9AA882BA3EB2AACC9A15D7D36DBA086D 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ 742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ 69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ 9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ 779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ A80012976F31FFDF305F0C9C5E:\ 545E59812C7AEA1BD1CD48880D6650117DFD9E58A791DAC1072B19DA 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ 9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ 53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ 479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ 3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ B461A40645BF176601F1E760DE5F:\ 7C2FA00961BCF020B95A0ED7193EA3583340BBD37898EF6A464C1940 D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ 5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ 8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ 1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ 86C226169FF257954EBDA81C0E5F99:\ 232DB22EB2C19109AFEFB71918EA2DAA7C0D76652E1884EA7A8AE646 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ 431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ 40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ 0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ 2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ 83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ D3C356C914FA06B9A7CE24C7317A172D:\ DB85AF5CFCE746240E6D44E73CEF66A72CE5968284D35FFEF7FBFF6C 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ 645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ 39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ 68F50D79F0C9C7314E750F7D02FAA58BFA:\ A1EB42FB0792361F0D6809A2E8DC062F09F2855B39BC2C4B7F54311E 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ 4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ 717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ 4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ 9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ 39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ 7DF95B60FA8712A2271FCAF3911CE7B511B1:\ 1AF4A3AB9A07CF064C254D122CC7DE15E0F0D3CA3DFA50EA1C43A78D 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ 261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ 0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ 61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ 37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ C14D43525E18892C79142D887D2AD3992848B72CCC087F64F0F1D621 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ 4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ 339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ 5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ 7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ B7F5CB9923AD97058EC067700CC746C127A61EE3:\ 116C0462D50D57F948015EC74BE9015707313712B45883C02FE84E1E 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ 70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ 495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ 5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ 00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ 96F7111176641F6373701BA594090079146D4220F30B5120C12498BA 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ 6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ 6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ 1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ 0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ 2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ 9EDDAB2C9C60B122503C1C30EC6E74050EE13C7E103A05F9ED41D992 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ 2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ 5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ 9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ 54CC87B9655180C0E1C6672350AE1952DDF51EE5D7E215569652AA2E 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ 8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ 90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ 6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ 0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ 6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ 4629C97F9BA98698E0DDECA5E0A3B6DE210EA9E84BF942C2CCF4EC68 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ 70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ 5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ 2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ 4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ 27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ F45034AA94C1A2686EB849EF4262F2F5BA9ACDD0E8EA32401E060B43 B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ 0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ 0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ 8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ 547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ 758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ 62153F592C49D3C0485F80073319049A510C730327940CD9D52F3698 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ 38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ 5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ 3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ 8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ 5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ ECDE4D6EB0CF28010B45D0D310E7D05F08B80AFC44B8A359BE7E1923 A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ 3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ 80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ 49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ 9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ 3BFC5018CF15CB88007929924B3E014635EF135C91F9671B29BE8731 A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ 0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ 639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ 877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ 1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ 22715559AD15717722B1FA0583996090C79C3DF16CC1E6E0F6D3E898 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ 9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ 10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ 8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ 88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ 0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ 2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ 04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ 2F36FF8AB7264F7A5766DE025018E19B5A64D90994B743B8FBFBDCCA 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ 623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ 15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ 817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ 5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ 5AF56987EA9CF11FCD0EAC5EBC14B037365E9B1123E31CB2DFC7929A 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ 21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ 0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ 7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ E90F81AE86D72DCC2190AF545A345150A629EE7DC7237C1958CFCDBC 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ 4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ 92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ 539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ 0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ 7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ 2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ C1C80B60ECBE67B7A49940DF5E3EE7F31C1304844D9A333A172983FF 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ 76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ 4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ 0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ 52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ 27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ 720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ 9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ 230620D710CF3AB835059E1AA170735DB17CAE74B345765FF02E8D89 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ 131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ 808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ 71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ 6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ 74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ 4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ 6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ 34A58DDFC5C2222281FA73EB34BFB5E152272CC3AC7FE97AC58C08B0 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ 0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ 2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ 0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ 2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ 8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ 284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ 584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ 582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ 8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ 0790649A6F6ECC4DCACAFAFB6AEFBF6C6F7EC883C72671DB211CD163 D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ 13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ 3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ 682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ 321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ 1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ 63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ 21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ 910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ 63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ 8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ 90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ 43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ 4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ 8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ 6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ 9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ 97495BFEDAF1CAB18E85190B374729F5543FA3F1CD88438156F01A0C 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ 73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ 2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ 574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ 298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ 6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ 2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ 8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ 07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ 48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ 6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ 7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ 469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ 6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ 40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ 08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ 665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ 4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ 186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ 0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ 0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ 1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ 99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ 1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ 14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ C3A66CD4EB2DDB42EF85EA0CD65534:\ 6297DABDC66A68A28E2F32FC95E5864035001CCB7A0DCF592467D415 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ 6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ 70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ 013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ 5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ 44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ 8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ 1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ 9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ 9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ 4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ 323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ 8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ 53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ 11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ 5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ 41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ 19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ 647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ 142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ 40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ 40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ 3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ 2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ 94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ 4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ 9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ 561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ 5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ 303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ 2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ 13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ 46B568CE294C89:\ 2C700B4059916AF3F47D9017F5725F42B0D51895331F090048C276A0 F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ 9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ 49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ 32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ 2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ 03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ 0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ 685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ 2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ 3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ 0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ 20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ 2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ 3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ 5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ 97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ 92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ 3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ 2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ 703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ 05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ 4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ 99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ 1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ 688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ 1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ 4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ 181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ 00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ 0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ 2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ 537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ 2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ 8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ 5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ 8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ 4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ 9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ 727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ 9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ 3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ 0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ 854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ 813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ B4978F5DE02905355D9D40FA09E6F8A297CA546AC8382CF10152B2B3 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ 47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ 7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ 4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ 0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ 4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ 22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ 52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ 7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ 7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ 204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ 07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ 5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ 56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ 6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ 15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ 259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ 5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ 317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ 5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ 504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ 32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ 85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ 3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ 281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ 6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ 82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ 8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ 0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ 2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ 1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ 265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ 5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ 4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ 092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ 0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ 29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ 3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ 49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ 3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ 26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ 5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ 91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ 42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ 228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ 5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ 25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ 2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ 688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ 7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ 3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ 7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ 394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ 3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ 8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ 09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ C1756C010C173E999B6CF11E3B6BF4400C8C866A18C2673A4705DF79 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ 6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ 26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ 9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ 0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ 32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ 221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ 36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ 2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ 72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ 83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ 0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ 3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ 6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ 210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ 889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ 123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ 71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ 1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ 6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ 3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ 57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ 4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ 2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ 6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ 0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ 31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ 97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ 4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ 75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ 40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ 80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ 15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ 5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ 16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ 278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ 59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ 97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ 806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ 01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ 78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ 29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ 31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ 320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ 908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ 369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ 966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ 5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ 76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ 847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ 950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ 30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ 89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ 5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ 9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ 735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ 64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ 25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ 2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ 180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ 9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ 120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ 07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ 6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ 4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ 7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ 57795DABAF40687B2CDA7A5014168F:\ 98E40C176C8C8EC46AB940688D47978B8D1CACEFF37C700FDD06CBB5 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ 2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ 6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ 5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ 78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ 0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ 273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ 3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ 6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ 1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ 8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ 0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ 98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ 048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ 00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ 8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ 4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ 7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ 63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ 54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ 6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ 3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ 50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ 742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ 2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ 79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ 59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ 4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ 7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ 5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ 0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ 9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ 05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ 5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ 3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ 3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ 9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ 6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ 60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ 6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ 1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ 1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ 7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ 37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ 42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ 5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ 7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ 24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ 0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ 3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ 44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ 3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ 5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ 1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ 4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ 1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ 14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ 0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ 78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ 2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ 131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ 8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ 8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ 455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ 69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ 7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ 39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ 1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ 545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ 75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ 38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ 090FC9BC045271:\ 82698AD78DFC9E39665C9DFD54C7BC44DB0EBBA2E741E80D5292669B [Keccak-1600(256)] :\ C5D2460186F7233C927E7DB2DCC703C0E500B653CA82273B7BFAD8045D85A470 CC:\ EEAD6DBFC7340A56CAEDC044696A168870549A6A7F6F56961E84A54BD9970B8A 41FB:\ A8EACEDA4D47B3281A795AD9E1EA2122B407BAF9AABCB9E18B5717B7873537D2 1F877C:\ 627D7BC1491B2AB127282827B8DE2D276B13D7D70FB4C5957FDF20655BC7AC30 C1ECFDFC:\ B149E766D7612EAF7D55F74E1A4FDD63709A8115B14F61FCD22AA4ABC8B8E122 21F134AC57:\ 67F05544DBE97D5D6417C1B1EA9BC0E3A99A541381D1CD9B08A9765687EB5BB4 C6F50BB74E29:\ 923062C4E6F057597220D182DBB10E81CD25F60B54005B2A75DD33D6DAC518D0 119713CC83EEEF:\ FEB8405DCD315D48C6CBF7A3504996DE8E25CC22566EFEC67433712EDA99894F 4A4F202484512526:\ E620D8F2982B24FEDAAA3BAA9B46C3F9CE204EE356666553ECB35E15C3FF9BF9 1F66AB4185ED9B6375:\ 9E03F7C9A3D055ECA1D786ED6FB624D93F1CF0AC27F9C2B6C05E509FAC9E7FCA EED7422227613B6F53C9:\ CAAD8E1ED546630748A12F5351B518A9A431CDA6BA56CBFC3CCBDD8AAE5092F7 EAEED5CDFFD89DECE455F1:\ D61708BDB3211A9AAB28D4DF01DFA4B29ED40285844D841042257E97488617B0 5BE43C90F22902E4FE8ED2D3:\ 0F53BE55990780B3FAD9870F04F7D8153C3AE605C057C85ABB5D71765043AAA8 A746273228122F381C3B46E4F1:\ 32215AE88204A782B62D1810D945DE49948DE458600F5E1E3896CECA2ED3292B 3C5871CD619C69A63B540EB5A625:\ 9510DA68E58EBB8D2AB9DE8485BB408E358299A9C011AE8544B0D0FAF9D4A4EA FA22874BCC068879E8EF11A69F0722:\ F20B3BCF743AA6FA084038520791C364CB6D3D1DD75841F8D7021CD98322BD8F 52A608AB21CCDD8A4457A57EDE782176:\ 0E32DEFA2071F0B5AC0E6A108B842ED0F1D3249712F58EE0DDF956FE332A5F95 82E192E4043DDCD12ECF52969D0F807EED:\ 9204550677B9AA770E6E93E319B9958540D54FF4DCCB063C8561302CD8AFF676 75683DCB556140C522543BB6E9098B21A21E:\ A6D5444CB7AA61F5106CDEDB39D5E1DD7D608F102798D7E818AC87289123A1DB 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ 5796B993D0BD1257CF26782B4E58FAFB22B0986D88684AB5A2E6CEC6706275F9 E26193989D06568FE688E75540AEA06747D9F851:\ CFBE73C6585BE6204DD473ABE356B539477174C4B770BFC91E9FDBCBC57086E6 D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ 31C8006B0EC35E690674297CB27476DB6066B5FA9825C60728E9E0BB338FB7C3 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ 3B8FA3904FE1B837565A50D0FBF03E487D6D72FC3CEA41ADCCE33DF1B835D247 A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ 37FEBC4DF9D50DAEABD0CAA6578812A687E55F1AC0B109D2512810D00548C85B AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ 2329810B5A4735BCD49C10E6456C0B1DED5EAC258AF47CBB797CA162AB6D1BA8 AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ 6FFFA070B865BE3EE766DC2DB49B6AA55C369F7DE3703ADA2612D754145C01E6 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ B30761C053E926F150B9DCE7E005B4D87811CCFB9E3B6EDB0221022F01711CF0 FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ 04F1B3C1E25BA5D012E22AD144E5A8719D94322D05AD9EF61E7DB49B59959B3A 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ AEEF4B4DA420834FFCED26DB291248FB2D01E765E2B0564057F8E6C2030AC37F A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ 03D26AEEB4A7BDDDBFF7CFF667198C425941A2776922DF2BEC545F5304E2C61C 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ 435CFC0D1AFD8D5509A9CCBF49706575038685BF08DB549D9714548240463EE9 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ D477FB02CAAA95B3280EC8EE882C29D9E8A654B21EF178E0F97571BF9D4D3C1C 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ 24DD2EE02482144F539F810D2CAA8A7B75D0FA33657E47932122D273C3F6F6D1 DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ 46:\ E78C421E6213AFF8DE1F025759A4F2C943DB62BBDE359C8737E19B3776ED2DD2 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ B5A0:\ CCE3E3D498328A4D9C5B4DBF9A1209628AB82621AD1A0D0A18680362889E6164 B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ FBAD4E:\ F871DB93C5C92ECD65D4EDB96FCB12E4729BC2A1899F7FB029F50BFF431CBB72 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ ED2C2492:\ 4EB143477431DF019311AED936CAB91A912EC1E6868B71E9EDDB777408D4AF34 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ 6B2EE4E542:\ 9A0C1D50A59DBF657F6713C795ED14E1F23B4EAA137C5540AACDB0A7E32C29FC 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ 2A1493D8F4FB:\ BA062E5D370216D11985C4CA7A2658DDC7328B4BE4B40A52DD8FA3CA662F09D1 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ 30A934467DA4B0:\ 3A083AE163DF42BD51B9C664BEE9DC4362F16E63383DF16473DF71BE6DD40C1C 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ C0308E29446B8ED3:\ 4876E273AC00942576D9608D5B63ECC9A3E75D5E0C42C6ABDBCDE037785AF9A7 C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ 723B20F67BA610C2B7:\ 4797BA1C7AB7197050D6B2E506F2DF4550E4B673DF78F18C465424E48DF5E997 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ 0C834CE6EADC2BB86BF6:\ 41C91BE98C5813A4C5D8AE7C29B9919C1CC95B4A05F82433948CB99D9A6D039C 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ 1540D29BA27AB8E309A4B7:\ EE354290E3F9CE9123C49BA616E1A2684A90F3DDD84E73A1D2C232F740412B18 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ 32B58EBC38FC2A6B913596A8:\ FBEC0B6D71696EEDE900B77AA6D7D25F4AB45DF8961CA9C8B3F4F9B51AF983AB F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ 38467205F5DCFB34A2ACFE96C0:\ 9D24AEEA08F9A4B5FB8B6DE85A2296F5F4108DDD1EEA4F8EE58819CF84EDB765 CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ B06CF0F5A0EA15CA907EE1C27EBA:\ 732034CAE3FF1116F07FC18B5A26EF8FAF3FE75D3DBCA05E48795365E0A17C40 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ BCF84D0D4726364B9BF95AB251D9BB:\ DEAC521805BC6A97C0870E9E225D1C4B2FD8F3A9A7F6B39E357C26414821E2DD D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ C7F157298EABC4DCE7D89CE5162499F9:\ AD55537347B20D9FCA02683E6DE1032EC10EB84DA4CBD501E49744A666292EDF BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ BEF788CDB5CF4606C9C1C7F61AED59F97D:\ B1F990204BF630569A3EDC634864274786F40CE1C57165EE32D0E29F5D0C6851 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ 86E779CF053C77785AA9E692F821F14A7F51:\ FA460CD51BC611786D364FCABE39052BCD5F009EDFA81F4701C5B22B729B0016 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ 43304FBA401EFB2BDBD7ECE939102298651C86:\ F7B0FE5A69FF44060D4F6AD2486E6CDE9ED679AF9AA1ADA613E4CC392442BEB5 C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ 87D68D28CC3897452F6A22AA8573CCEBF245972A:\ 24204D491F202534859FC0A208237184471A2D801FB3B934D0968D0D843D0345 EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ 22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ 81147CBA0647EEE78C4784874C0557621A138CA781FB6F5DCD0D9C609AF56F35 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ 5B6D7EDA559574FAE882E6266F4C2BE362133E44B5A947ECB6E75DB9FC8567E0 DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ 9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ 86F87E75C87F9BE39E4AA6D0C5A37A5964D6FFDC462525C0642C9DB010DE38EE EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ 959FE007B57C2947C36D1D66CC0808D80DB7DF45D68A34852B70D2DDA192C25C 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ 97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ 1A93567EEBC41CC44D9346CDE646005D3E82DE8EEEB131E9C1F6D1E4AFD260F7 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ 549DB056B65EDF7D05BD66661B6D0A39B29B825BC80910F8BF7060A53BFF68E1 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ 66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ 794ABFD7EB622D5608C1C7B3F0A7821A71900B7172847FB0907AA2899972663E 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ 4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ 9CE89958CBDDD8DCB22F66E8CBA5F6091A51953189464803BDC773ABC7FAA906 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ 6DA733817DC826E8DA773BECA7338131AB7396417104EDA25970980C4EB2A15F C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ 30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ 66C9CDC8E8C6C9417D7FFBEF3B54B702EEE5F01A9BDA8DD4E28FE3335DEBBB51 F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ 05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ 24AB37A93674CCB1CEEC9E5681EFC8BDF9FCC7721CF1CAC175E0B20E461575B8 E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ 574271CD13959E8DDEAE5BFBDB02A3FDF54F2BABFD0CBEB893082A974957D0C1 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ 00:\ 1947E901FA59EA789845775F2A4DB9B4848F8A776073D53D84CBD5D927A96BFF FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ 37FC:\ 0C1B8C1AF237E9C5501B50316A80865AAC08A34ACF4F8BEDD4A2D6E7B7BCBB85 ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ 2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ 599BA5:\ C4315666C71FEA834D8FF27F025F5CC34F37C1AAE78604A4B08DAC45DECD42BE 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ 479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ 40706B05:\ 5FF8734DB3F9977EEE9CF5E2CF725C57AF09926490C55ABD9D00A42E91A8C344 ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ 29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ 31D06C77A4:\ 1E141A171CAB085252EA4C2F8F1F1087DD85A75AB3ACD0B3C28EAA5735D349AF 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ A259FC4FBD72:\ EF763F22F359DD7F5B3FE6A745C423D6B641EC07BA5235232A0701510F74426E 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ DBE5FE9694AD6D:\ 6A769F93F255B078FE73AFF68F0422A279939920E4690B4AFF0E433CFA3D3DF3 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ 7EF57B91397AA8A7:\ C06DD4261638C44AFCB186F0AF5DE20EA53AA63316FBB71728F874FF3DACEB0D BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ 7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ 44B78B2D48DE1A08AA:\ B5D84B1809E83B5E75AA53BDEE79E3A97F3FE3A7D3162EBD4908240FF69131D8 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ B3A6C9FED24D70749604:\ CAD7ABB5BBA5905B5181DD2DBC4E68CFD01BA8659F21C8290D3F835C1A68BBE5 BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ 8B033F77D384CA01593C1B:\ 83CA09C1F418B5DAD0A7F64A904A2E07C3314F7D02D92622F8F4674BC1F6AA3D 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ 013C23F1E9611D595EBAC37C:\ 330DE3EE16AEF6711461A994863EED47AF71B362D4C2F243534EF432F63A091A 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ 9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ 4EC5A49FFDB59A1BD6A292AA0E:\ B5675197E49B357218F7118CD15EE773B39BD59B224D9A45CA71C6E371D938F1 D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ 498E1F6C82C6CAE6FC14845B3C8A:\ CD9038C1066A59990DF5752107B066EEBBE672CBCA0F60D687D03A9D821934BE 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ 88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ 5B01FECFC146BDB251B3BDAD556CD2:\ D3172CA263AFF2B9DB6FB13337F2543C5AF51151801A76194012F710306C14F6 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ AE9CD5CF0991878A311B549A6D6AF230:\ 9E3D4BCF580EECE39BCF13E5716E5BB8F5E8C3FC3723F66246F836D8DB1238F1 E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ 105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ B50C7C681E773D109FF7491B5CC22296C5:\ EDC2D3B49C85B8DD75F7B5128DA04CD76BF4878779A0077AF3F1D7FB44F18931 E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ 190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ 2C7CA303269ED14014B2F3CF8B894EAC8554:\ 80DCE7F04DD6AC17CE709B56CF6EA6C0A57190649BB187B5E6D95FA18100C7AC 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ 1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ 49BBD5435D2706F85FE77B84A5FA15DDD8259E5D2C20FB947F139373E5C86121 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ 8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ 37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ 6B6C11F9731D60789D713DAF53D2EB10AB9CCF15430EA5D1249BE06EDFE2BFF6 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ 85EA51D49894E45BAA3DC707E224688C6408B68B11:\ 7E738E8EB3D47D18E97D87C7B3FC681F86417883CED92BA93C3077812BBD17E7 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ 8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ 04E18D475920CE828B94E72241F24DB72546B352A0E4:\ A278BA93BA0D7CD2677BE08C9DFC5F516A37F722BB06565FA22500F66FE031A9 B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ 9C0A9F0DA113D39F491B7DA6C4DA5D84FE1CC46367E5ACC433CA3E0500951738 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ 578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ 44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ 6BED496D02FE4CC27D96DCEED14A67DA7BDF75E19B624896DFF6B0B68E4FCC12 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ 4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ ECD2E3FAF4BA4DD67E5A8656CEBEBDB24611611678E92EB60F7CBD3111D0A345 B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ 634A95A7E8BA58F7818A13903EC8F3411B6ECB7E389EC9AA97C0ECF87FADD588 CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ 5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ 27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ A0FE352BA2389B0430EDBE1201032EB09C255514C5C5B529C4BAAFCEB1AC9817 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ 9A0BFE14F9F3127ACA86773A620945731DF781A6D7DC82930CCDE2F69DAC8F94 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ 29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ 19E5101BDE60B200A8B171E4C3EA3DFD913E10111D96F9682ACC7467282B4E31 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ 650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ 4CC2AFF141987F4C2E683FA2DE30042BACDCD06087D7A7B014996E9CFEAA58CE E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ 7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ 8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ 9A8CE819894EFCCC2153B239C3ADC3F07D0968EAC5EC8080AC0174F2D5E6959C 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ 1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ 040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ 8B35768525F59AC77D35522AC885831A9947299E114A8956FE5BCA103DB7BB2C 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ 0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ 0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ 49:\ 955F1F7E4E54660B26F30086F2DDDAEDD32813547C1B95D305D882682B4FF7A0 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ 0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ 2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ 5B52:\ 8FAC5A34EBAFA38B55333624A9514FE97D9956E74309C5252CD2090D3BBE2F9E 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ 89CCC1:\ 62039E0F53869480F88C87BB3D19A31AAD32878F27F2C4E78FF02BBEA2B8B0B9 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ 14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ 22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ 6DCBB4CE:\ CE87A5173BFFD92399221658F801D45C294D9006EE9F3F9D419C8D427748DC41 A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ 7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ 881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ BADF45685F:\ 2EF8907B60108638E50EAC535CC46CA02E04581DDB4235FBAC5CB5C53583E24B 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ 312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ 96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ 9B62C60A4771:\ BE8B5BD36518E9C5F4C768FC02461BB3D39A5D00EDEF82CEC7DF351DF80238E0 F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ 9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ CA58D5DAB38ADB:\ 52CBC5DBE49B009663C43F079DD180E38A77533778062A72A29E864A58522922 E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ 21691E1069413848:\ 3A8DFCFD1B362003DDFA17910727539E64B18021ABBA018B5F58D71F7A449733 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ B57D6D0C2EDC4E78D6:\ FA221DEEE80E25E53C6C448AA22028B72501F07D1FF2C3FC7F93AF9838B2D0A9 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ 8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ CD19E781AF20454AC880:\ ED9C8B87FCE27BE4E95610DB1DDD0C035847F4699DFC8C039A798A30343A6059 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ BF0FE3C32C17AA188A8683:\ A485CC9CF4CA4F659F89A0B791A4423953424AC57146B879D385A9E4062AFE52 F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ 0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ 2E937F21C005F17411473041:\ 93CD4369A7796239A5CDF78BCE22EBB2137A631C3A613D5E35816D2A64A34947 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ 62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ 2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ 29F695815D866DA99DF3F79403:\ 3751CE08750D927EB5C3AE4CA62A703A481D86A4FA1C011E812B4BC0A2FEF08D 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ 84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ 3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ 1BB15B447589E86E8D76B1E9CED2:\ A88C7EF7B89B7B6F75D83922B8FD00F034D719F97C67884121434447AE9DD3B9 F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ 4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ 853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ AD3D7E886DEA4F005AE4AD05E5065F:\ 2B4F8F9EF7D6ED60BB4881E635E0F887A51B0C1A42BAB077976B43D2C715E11A 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ 7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ 68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ EAABC35F5C2B0A0F2379231953322C4E:\ 586CFFDC434313CC4E133E85AC88B3E5DEA71818ABCAC236F0AAE418F72B6CDE BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ 4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ 2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ 159388D5C3277E227286F65FF5E5B5AEC1:\ 52D14AB96B24AA4A7A55721AA8550B1FCCAC3653C78234783F7295AE5F39A17A 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ 407847DD0DA505AB1641C02DEA4F0D834986:\ B6345EDD966030CF70DFB5B7552BC141C42EFE7A7E84F957B1BAF4671BAE4354 B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ 33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ 99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ 7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ 0347901965D3635005E75A1095695CCA050BC9ED2D440C0372A31B348514A889 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ 2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ 205AA1615DB44057DB991231D2CB42624574F545:\ F0BF7105870F2382B76863BB97AEE79F95AE0E8142675BBCCDB3475B0C99352F DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ 2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ 157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ 631C6F5ABE50B27C9DEA557FC3FBD3FB25781FCB1BBF9F2E010CCA20EC52DBC4 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ 0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ 0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ 3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ 3757A53D195B43B403A796A74AAFB2064072A69E372EE5B36CC2B7A791F75C9F 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ 46176EBF044C4784467C700470D0C0B40C8A088C815816:\ 0CC903ACBCED724B221D34877D1D1427182F9493A33DF7758720E8BFC7AF98EE D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ 91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ 1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ F23750C32973F24C2422F4E2B43589D9E76D6A575938E01A96AE8E73D026569C 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ 1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ 285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ 6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ 1ECE87E44A99F59D26411418FB8793689FF8A9C6EF75599056087D8C995BCE1E 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ 27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ 9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ 71B4F90AC9215D7474B1197D1B8B24449FD57E9B05483D32EDBEBCB21A82F866 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ 3B3678BB116FADAB484291F0CF972606523501F5B45D51063797972928E333C0 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ 8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ 4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ 47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ 4068246495F508897813332962D3AE0B84685045E832A9A39AD5E94C154D2679 A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ 2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ 82696259536520E5E4D47E106BD1DCB397529AAFB75878F332D2AF2684493F1B 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ 5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ 4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ B494852603393B2B71845BACBDCE89FA1427DFE4AF9CDF925D4F93FA83B9966B A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ 07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ 6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ D8A619C0DFBED2A9498A147B53D7B33DD653D390E5C0CD691F02C8608822D06A 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ 29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ 98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ D82E257D000DC9FA279A00E2961E3286D2FE1C02EF59833AB8A6A7101BC25054 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ 3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ E2:\ 8D5B7DBF3947219ACDB04FB2E11A84A313C54C22F2AE858DFC8887BF6265F5F3 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ 1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ 3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ 52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ 61EC:\ 607C3F31342C3EE5C93E552A8DD79FA86DCCAE2C1B58AABAC25B5918ACFA4DA5 E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ 9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ 2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ 609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ 9B5EDC:\ 0656DE9DCD7B7112A86C7BA199637D2C1C9E9CFBB713E4EDE79F8862EE69993F FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ 63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ 42D75D68:\ 4DDD6224858299F3378E3F5A0ECC52FA4C419C8EBB20F635C4C43F36324ECB4E 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ 7815BF3C49:\ EC096314E2F73B6A7027FFFA02104C2F6DD187F20C743445BEFD4B5C034B3295 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ 61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ 025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ 951CB2068CC6:\ FE71D01C2EE50E054D6B07147EF62954FDE7E6959D6EEBA68E3C94107EB0084D B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ 93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ B0FED6A8052FBB:\ BD6F5492582A7C1B116304DE28314DF9FFFE95B0DA11AF52FE9440A717A34859 B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ 35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ 780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ 015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ 37674C6F8E380C04:\ E717A7769448ABBE5FEF8187954A88AC56DED1D22E63940AB80D029585A21921 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ F22DA873C601016A0D:\ A95D50B50B4545F0947441DF74A1E9D74622EB3BAA49C1BBFC3A0CCE6619C1AA 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ 472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ 994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ 1373FB09A1A6E3C7158F:\ ED53D72595ACE3A6D5166A4EDE41CCE362D644BDED772BE616B87BCF678A6364 FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ 084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ 339612E830E9E7A9C29065:\ 810401B247C23529E24655CAB86C42DF44085DA76CA01C9A14618E563B7C41BE 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ 5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ 8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ 377838973C1D943C22ED335E:\ 9F01E63F2355393ECB1908D0CAF39718833004A4BF37EBF4CF8D7319B65172DF 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ 725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ 798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ 8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ 2D0C9E7448DE3043AE22FDD229:\ 7EC11DE7DB790A850281F043592779B409195DB4ECEDEEFBB93BA683D3BCA851 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ 5B6C338CBB8F6659D342A24368CF:\ A74AF9C523B4A08D9DB9692EA89255977A5919B9292B7CD0D92C90C97C98E224 EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ 76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ F6954BA0801A1294CD8D7E66DFAFEC:\ 344D129C228359463C40555D94213D015627E5871C04F106A0FEEF9361CDECB6 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ 055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ 256FB33D4260439CBA73A9479EE00C63:\ 4CE7C2B935F21FC34C5E56D940A555C593872AEC2F896DE4E68F2A017060F535 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ 911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ 5994C1DBB3B5C7871A11F5537011044C53:\ 24B69D8AB35BACCBD92F94E1B70B07C4C0ECF14EAEAC4B6B8560966D5BE086F3 CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ 2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ 586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ 4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ 4E53426CAA453F8DE1CBB57932B0B741D4C6:\ 19F34215373E8E80F686953E03CA472B50216719CB515E0667D4E686E45FCF7C 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ 868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ 83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ 290BD4808E5676EB0C978084E4CD68E745031659A26807AD615B10CDA589B969 EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ 70999AB9818309AFA8F1ADC4FEA47A071A8ABD94012F7CE28CC794A0D997C5CB 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ 656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ 46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ 8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ 83120033B0140FE3E3E1CBFEBFF323ABC08535C0AA017803F5D2F4ECB35F5DFB 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ 7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ 4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ 99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ 5584BF3E93BC25945C508B9188D0502C6E755BBEBABFC8CB907FA7A252EF464A D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ 66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ 67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ C234B252C21EDB842634CC124DA5BEE8A4749CFFBA134723F7963B3A9729C0B4 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ 1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ 48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ 15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ 645F25456752091FFFCAADE806C34C79DFFE72140C7C75D6A6ECFEEDF6DB401C 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ 7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ 66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ 5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ 2D7CAC697E7410C1F7735DD691624A7D04FA51815858E8BA98B19B0DED0638B5 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ 7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ 1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ 1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ F664F626BC6B7A8CF03BE429155EE1F5CD6ECF14816DE49A5E229903F89A4DC6 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ 9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ 0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ 45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ 06425E83E4AF817D735E9962C0CDDCE2CD40A087A6B0AF3599719E415AB9A72A 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ 1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ E8C329149B075C459E11C8AC1E7E6ACFA51CA981C89EC0768ED79D19F4E484FB CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ 60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ 0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ C86768F6C349EB323BD82DB19676E10BD8AE9F7057763556BBB6D0B671E60F2A F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ 10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ 568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ 46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ D97F46F3B7EDBFB16E52BFEC7DBA0815B94D46E4251E48A853EABDF876127714 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ 8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ 4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ 01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ 51D08E00AAA252812D873357107616055B1B8C5FB2AC7917D0F901DFB01FAC47 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ 9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ 447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ C6A188A6BDACA4DD7B1BC3E41019AFE93473063F932C166E3242B7F52A3C6F8E 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ 74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ 5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ CF:\ 2B31FBC565110110011AB2C8F6CC3DA8FB55D41B1AE5E04310283F207D39682D FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ 5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ 71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ 1DC8:\ 1351F5DBA46098B9A773381D85D52FAD491B3A82AF9107F173DB81FB35ED91D2 E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ 54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ 009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ 2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ 99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ C25E88:\ DFFC700F3E4D84D9131CBB1F98FB843DBAFCB2EF94A52E89D204D431451A3331 F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ 65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ 3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ C5C06729:\ 26726B52242EF8ECF4C66AED9C4B46BF6F5D87044A0B99D4E4AF47DC360B9B0E CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ 68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ 6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ 551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ CFE0AF93EB:\ 25E536315F08A40976ADECB54756EBC0B224C38FAF11509371B5A692A5269AB5 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ 331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ 2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ 05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ F467BC75A9D1:\ AB504592AD7184BE83CC659EFB5D3DE88BA04B060B45D16A76F034080DDE56C6 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ 513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ C6F4756017FFF5:\ 5D8EE133EC441A3DF50A5268A8F393F13F30F23F226AE3A18EC331844402FF54 C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ 798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ 9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ 45DBA58E6CB2C8EA:\ 712B1CC04C009B52035CC44C9505BB5CB577BA0AD1734EC23620F57EEF3D37FB B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ 01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ 86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ 10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ E8419D48FDFBD744CE:\ 942E39E230A2251FFDB2F85202871C98597008401B322FF9840CC90CC85B337D A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ 7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ 6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ 1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ 4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ 359D5D1EEA105F28DCFB:\ B542B6CD8EF2DAB4ED83B77AC6DC52DAF554ECDA4EF7AB0A50E546BEBE2D8E5A E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ 2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ 6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ 8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ 7ADFB974EE205A9BF7B848:\ F7E9E825722E6554A8619CCA3E57F5B5E6B7347431D55CE178372C917BFB3DC2 B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ 7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ EC77F29D211BE89DE18B15F6:\ 14BB22B98EAF41A4C224FD3C37188A755F9B04F46F3E23A652DA3DB9E25D2F2C DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ 4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ 49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ 9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ 50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ 63EFE793489C39B8FD29D104CE:\ EB5668F9941C06E5E38EA01B7FA980638B9536CA1939950C1629F84A6EFF3866 BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ 02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ 711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ AE5B257BE36A7124E1060C170FFA:\ 913014BB6E243FAC3A22A185F8227A68C2311DC0B718E276BBBDB73AF98BE35F 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ 5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ 70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ 001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ 480AB79D4E6415B520F1C484D675B1:\ 0284418C10190F413042E3ECEB3954979B94AFBF2E545FC7F8A3C7DB2C235916 A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ 84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ 920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ D42956588B3B58CD948970D298776060:\ 8FEBFF801787F5803E151DCA3434A5CD44ADB49F1C2FFD5D0CD077A9075A492D 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ 3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ 678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ 2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ 8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ A96CBDE5FBC953D9E576CD216AFC90323A:\ EA7511B993B786DF59A3B3E0B3CD876C0F056D6CA43CC89C51C1B21CCDC79B42 F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ 593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ 0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ 358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ 67B5AD93D874812A1DE6A7B93CD53AD97232:\ BAAECB6E9DB57971D5C70F5819FF89C5093254DE19EF6059C43CC0AFDA7C5D34 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ 85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ 352BDD3740DD6A16792AE2D86F11641BB717C2:\ 56DB69430B8CA852221D55D7BBFF477DC83F7CB44AB44DDD64C31A52C483DB4F 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ 71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ 865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ 2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ 9ABA31EDB903B28FBFC33B7703CD996215A11238:\ F8538F597F4463CAD7A91905744B87156DB33C65BA87B912427FEC3669F425D4 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ 8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ 13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ 9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ 32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ 447EDA923CFE1112A6F1A3E4C735BF8EE9E4F2AEE7DE666A472FF8CF0FC65315 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ 3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ 7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ 74D94C13AFEA4DDD07A637B68B6FE095017C092B3CDCCDC498E26035D86D921E 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ 2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ 41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ 1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ 6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ CC11196C095BFFA090A05BA0BC255D38BDA7218D9311143F4F200B1852D1BB0D C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ 58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ 21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ 104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ 8C085B54C213704374DDD920A45168608BE65DFD036A562659F47143604144C2 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ 4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ 76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ D2E233264A3773495FFD12159EF7B631660C1B3E53A3DA0F24AE14466F167757 C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ 7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ 36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ FFAC7CA5FA067419D1BDB00C0E49C6E1A748880923A23ED5DD67DDE63D777EDB 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ 8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ 7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ 57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ 5B2ECA0920D32B1964BBF5810A6E6E53675ED1B83897FD04600D72E097845859 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ 384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ 4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ 55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ 68F41FDFC7217E89687ED118BC31AC6ED2D9D1E1A2F1B20A2D429729FA03517B C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ 4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ 761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ FA2F3DE31E9CF25AB9A978C82D605A43EE39B68AC8E30F49F9D209CB4E172AB4 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ 0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ 475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ 6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ 6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ BA2AF506C10DA8D7751E67ED766CFCD47D048D6EF9277DBD2ABFE2FD5D787B79 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ 635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ 822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ 1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ 3CD33F8811AF12183C53E978528F53AE7D559432724029E55FCFA9B990B91713 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ 1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ 698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ 47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ 3ECC9D27994022045CBEAB4FC041F12419CEC8060C8F6F9F0372884DF6074B5C CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ 8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ 696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ 7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ 01:\ 1501988A55372AC1B0B78849F3B7E107E0BF1F2CBAF670DE7F15ACBB1A00AD3D D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ 0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ 2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ 9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ 4D4B:\ 5C4E860A0175C92C1E6AF2CBB3084162403CED073FAAC901D0D358B6BF5EEFA9 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ 1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ 18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ 299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ 4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ A3BA86:\ 272B4F689263057FBF7605AAA67AF012D742267164C4FAB68035D99C5829B4F0 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ 69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ 1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ 61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ 477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ FB9E4AB6:\ 9B28E42B67EF32EC80DA10A07B004E1D71C6DCE71D8013FFA0305D0D0CE0469D FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ 31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ 59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ 7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ 91355C6280:\ EE53F83D2E2CCC315C6377EADDA5F42F42F3AADD664E3E895C37CBE9D0E9B9DE 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ 62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ 225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ 1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ 366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ AF1AE717238D:\ 21CCFDA65C4B915303012B852AB29481030F87347C29917E21F210F2BD5EFC9C 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ 85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ 16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ 528F9AB49C79F2:\ F5BF70710DA440EDB43AFD3EB7698180317FFEFA81406BB4DF9C2BB8B0B1C034 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ 584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ 4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ 4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ 5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ EBDDC89186839B77:\ E83EA21F5BC0976953AF86069A10EB6024A1AC59D609688E4A9759BB8B6C9441 FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ 6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ C66F252F6E64EDC96B:\ A2D93C6367E1862809D367EC37F9DA44CB3A8B4319C6A094C5E7D7266FE3A593 B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ 5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ 252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ 25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ 232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ 5363892A2495DF8C1EEF:\ 3C647B195F22DC16D6DECC8873017DF369EE1C4696340934DB158DC4059C76DF C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ 272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ 414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ 49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ 199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ 5C6D1BE4BC79F08A1A0A46:\ 3BB394D056D94FDE68920CD383378EE3ABCC44B7259D3DB9CD0A897E021F7E2E 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ 2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ 443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ 6EB6E4A80358ACC78647D043:\ 43640F408613CBF7393D900B921F22B826357F3B4FDFF7168EC45CBFB3EF5EFF EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ 01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ 90BF2C4062FD2AD58F906A2D0D:\ CB3713A5D5ABBC6AF72F8B38A701C71269B3B51C62EC5116F96AD0D42A10FD90 E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ 3EE46FB67422F814A68C4BE3E8C9:\ B304FC4CA22131857D242EB12FE899ED9E6B55717C3360F113512A84174E6A77 D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ 4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ 38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ 806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ 4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ A17E776C0D02856032A6CD10AD2838:\ A3CA830D4771C1BAA7FADA76C5FCEADD0F3CB9736E19CFEC52E9E74F56BFDD55 F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ 39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ 42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ 4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ 2ED1C78631FD23B4C3EB27C3FAEC8685:\ CA158C46370E64A9F032F5BA8E091460FD555EF700EDF7087E56BEBFFA261DE7 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ 94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ 286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ 04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ 72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ CD90333A77BC4E1988A82ABF7C7CAF3291:\ 5901CDA0CD1510DB5455D072D2737A6721AD9EE3272953A19C7AB378BF3646C5 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ 29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ 5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ 626C48322E9791D5FF72294049BDE91E73F8:\ F64562D6273EFB5EBD027E0A6F38C3FB204A6DBE894EE01200EA249B747CFE66 AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ 1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ 42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ 774BE89C1114DD531C011E53A34DC248A2F0E6:\ E7D7A113B3A33175D0ABD2CF4F9ADD8E41DC86C93C9552C5B3588277FBCAA24A 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ 246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ 47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ 94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ A7059ABE99182714983B9C9D44D7F5643596D4F3:\ 3B40C1493AF411AE7849904D478DF2407254BF62B88E9BFFD7B42BD2A60CE0FA 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ 374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ 6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ 63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ 5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ 4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ FEEB172AEAB2F0DEB748FB77801CA22D3CE99B7A9F9789E479B93D1F4B1D227F 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ 575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ 7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ 591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ B240BC52B8AF1B502E26BF1D5E75FE2663BFBA503FAF10F46754DC3D23CB61C1 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ 37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ 3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ 9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ 24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ 3EBACE41F578FDE6603E032FC1C7CFEEF1CB79FE938A94D4C7B58B0BA4CB9720 D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ 33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ 0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ 52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ 65EB4BD5ECCA7164CE9B66727F112C1AC6120DDD200DCB5CE75B7487843FCDB8 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ 7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ 5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ 806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ D7155F6D3A90801F5E547689389FF62A604C81B7C1583D9204AC6B0194F0E8DD 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ 271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ 608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ 990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ 2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ AA7ADAF16F39E398B4AB0ADA037710556B720B0248D84817B2CFDF7600933595 C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ 56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ 8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ 50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ 1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ 9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ B195463FE22A160802BE0A0464EE3AB4D2B117DE517B331C7BF04C8BA90C6120 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ 5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ 4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ 261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ 31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ 9F9296C53E753A4DE4E5C5A547F51763A96903B083FBC7A7828EFFE4763A7CE6 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ 266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ 7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ 357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ 5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ 719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ 51DE4090AEC36F6C446476C709253272CAB595D9887CA5D52A9B38086854D58F 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ 8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ 3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ 267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ 8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ 87A17400F919F2F53232B2205E1E8B14BD5698A76E74B9BDD5638A5C7BA5DE1E 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ 1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ 4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ 3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ 9742536C461D0C3503A6C943FA8105DBCD1E542F728D71CCC0517CFFC232EA68 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ 994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ 37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ 7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ 9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ AE3BF0936497A2955DF874B7F2685314C7606030B9C6E7BFB8A8DFF9825957B5 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ 394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ 43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ 7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ E8:\ 5FE0216DCC1BDB48F3375B9173B7B232939AA2177C6D056E908C8F2B9293B030 EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ 85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ 4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ 97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ 345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ 6427:\ C339904EC865F24FB3F88F142A8786D770934E006EAEDDBF45ACBB6B38431021 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ 89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ 630012:\ 4CA8B7FEBDF0A8062E9B76185CF4165071BB30928C18F14338C305626789C6D3 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ 95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ 4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ 78DFB921:\ 23D2614420859B2F13AC084453DD35C33FE47C894DD50C087FD1653FCAEEA00B 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ 4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ 91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ 9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ BB0D19F909:\ 5590BB75247D7CD0B35620F0062B90FFB2A24DE41220ED629D9E9A7ABCADFB51 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ 6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ 57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ 00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ 77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ 81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ 04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ BE6BF8082E8A:\ E5932441B012E503B0B0C6104703BA02613E472AD65655C085B0ADB07656B28F 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ 06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ 6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ 4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ 58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ E839A9D4608F03:\ 21C0D84EB7B61774F97DB5D9ACF1DFFAFB662C01ED291A442BEC6F14D1334699 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ 10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ 2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ 2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ 8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ 8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ 5153592EA81C6FBF:\ 0D1E6BB88188B49AF0A9A05EB1AF94255E6799515A2F8EB46AA6AF9A9DD5B9E0 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ 735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ 1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ 7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ 39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ 9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ 604F5035C46B8197D3:\ 935DED24F5CECC69E1F012B60B7831ABCE7EF50EEB0BEA7F816C3DBF2B4ABDC1 E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ 94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ 7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ 60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ 7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ 6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ 07E3B953ACF99964B847:\ 6755BF7E60E4E07965BAC24E51B1DE93E3DD42AE780F256647D4CC2EF8EFF771 D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ 32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ 7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ 8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ 07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ 4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ 6C90E8C4D100ACD9EED21E:\ 62C9F5E5B56E2994327A7F9A03888DA7BAD67E387593803B1807482B137B4509 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ 18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ 886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ 4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ E2DD603D9EA24DC7C5FD06BE:\ 9927FA5EFD86304E73D54AA4928818C05B01504672C529471394A82E049E5F95 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ 742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ 69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ 9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ 779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ A80012976F31FFDF305F0C9C5E:\ 84E056BF7BDFC73A3AAA95B00A74A136D776069BEEB304423BEAD90120DB6350 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ 9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ 53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ 479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ 3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ B461A40645BF176601F1E760DE5F:\ 401C3BE59CC373453AEF9603F7335C1D5FE669909A1425D7671DCB84A49887CA D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ 5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ 8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ 1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ 86C226169FF257954EBDA81C0E5F99:\ 020485DCD264296AFDB7F643CA828C93356F1714CBCC2FBBDD30F9896C3F2789 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ 431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ 40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ 0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ 2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ 83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ D3C356C914FA06B9A7CE24C7317A172D:\ F8C43E28816BB41993BDB866888F3CC59EFBA208390144D3878DBF9FBFA1D57E 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ 645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ 39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ 68F50D79F0C9C7314E750F7D02FAA58BFA:\ 4EA524E705020284B18284E34683725590E1EE565A6FF598ED4D42B1C987471E 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ 4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ 717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ 4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ 9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ 39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ 7DF95B60FA8712A2271FCAF3911CE7B511B1:\ E4963E74AE01FF7774B96B4F614D1CB2A4CF8D206ED93C66FA42F71432BE2C3F 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ 261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ 0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ 61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ 37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ 0F0D72BF8C0198459E45ECE9CC18E930CB86263ACCF1FC7A00BC857AC9F201AD 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ 4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ 339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ 5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ 7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ B7F5CB9923AD97058EC067700CC746C127A61EE3:\ DD1D2A92B3F3F3902F064365838E1F5F3468730C343E2974E7A9ECFCD84AA6DB 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ 70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ 495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ 5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ 00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ 21BF20664CEC2CD2CEB1DFFC1D78893D5CA1A7DA88EB6BFD0C6EFCA6190C9E15 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ 6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ 6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ 1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ 0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ 2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ 6472D7C530B548E4B47D2278D7172B421A0FB6398A2823DD2F2B26208AF8942E 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ 2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ 5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ 9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ 2AC7FF80EE36D500995C973B8746D8466715E6D8B0F554AACB5D2876D7F5B874 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ 8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ 90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ 6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ 0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ 6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ 9FF81D575F7BF0C4EF340B4279D56E16CE68821AFCDF2A69105D4F9CADADD3CF 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ 70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ 5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ 2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ 4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ 27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ 09EDC465D4FD91C5E86B292F041BCC17571E1F2E17D584DFF21DD7DD8D8BFF35 B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ 0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ 0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ 8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ 547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ 758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ C6D86CC4CCEF3BB70BF7BFDDEC6A9A04A0DD0A68FE1BF51C14648CF506A03E98 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ 38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ 5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ 3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ 8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ 5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ 1AFC9BA63EEA27603B3A7A5562E12B31E8FE9A96812B531E9D048385FB76D44F A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ 3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ 80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ 49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ 9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ 9B5E15531385F0D495FDBE686E3E02ECA42B9F1B1CE8837AD3B3E42E6198050A A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ 0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ 639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ 877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ 1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ 216FC325F942EED08401527A8F41C088527C6479342622C907EA08FF3290F8C6 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ 9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ 10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ 8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ 88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ 0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ 2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ 04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ 43184B9F2DB5B6DA5160BC255DBE19A0C94533B884809815B7B326D868589EDC 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ 623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ 15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ 817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ 5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ 348FB774ADC970A16B1105669442625E6ADAA8257A89EFFDB5A802F161B862EA 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ 21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ 0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ 7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ EA0E416C0F7B4F11E3F00479FDDF954F2539E5E557753BD546F69EE375A5DE29 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ 4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ 92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ 539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ 0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ 7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ 2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ 59E904B2AA0CCBF2A9D127446F113B7CC3D07B970E07A322325ECEE66AE0C9CA 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ 76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ 4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ 0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ 52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ 27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ 720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ 9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ 6C2A841318066B90A9604D0C8ECCB2986B84A0C8675CD243E96957D26E9C1CFD 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ 131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ 808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ 71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ 6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ 74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ 4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ 6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ 0EC8D9D20DDF0A7B0251E941A7261B557507FF6287B504362A8F1734C5A91012 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ 0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ 2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ 0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ 2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ 8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ 284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ 584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ 582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ 8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ 0EA33E2E34F572440640244C7F1F5F04697CE97139BDA72A6558D8663C02B388 D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ 13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ 3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ 682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ 321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ 1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ 63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ 21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ 910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ 63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ 8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ 90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ 43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ 4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ 8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ 6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ 9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ C7490B05B172A1DBAAA66FAA823108D44C82F1E82A41FD57FD95000F30DE747E 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ 73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ 2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ 574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ 298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ 6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ 2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ 8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ 07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ 48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ 6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ 7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ 469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ 6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ 40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ 08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ 665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ 4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ 186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ 0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ 0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ 1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ 99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ 1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ 14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ C3A66CD4EB2DDB42EF85EA0CD65534:\ EB351838FE8225FBEBEA9168DBB708872CA43AC93480C3AFFBE6CC3A15A2263C 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ 6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ 70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ 013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ 5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ 44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ 8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ 1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ 9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ 9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ 4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ 323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ 8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ 53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ 11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ 5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ 41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ 19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ 647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ 142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ 40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ 40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ 3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ 2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ 94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ 4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ 9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ 561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ 5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ 303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ 2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ 13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ 46B568CE294C89:\ 96BAEE8ECA9DCDBDC467549E307D95C20A07FEB72ECCC780DBC29D40AE7CAE45 F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ 9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ 49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ 32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ 2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ 03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ 0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ 685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ 2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ 3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ 0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ 20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ 2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ 3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ 5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ 97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ 92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ 3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ 2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ 703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ 05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ 4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ 99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ 1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ 688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ 1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ 4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ 181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ 00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ 0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ 2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ 537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ 2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ 8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ 5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ 8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ 4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ 9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ 727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ 9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ 3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ 0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ 854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ 813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ 6C8723DA27CD98E20F2583D01868051EF2DAFA645901F82C74D5320EAFC18AAC 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ 47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ 7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ 4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ 0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ 4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ 22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ 52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ 7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ 7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ 204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ 07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ 5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ 56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ 6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ 15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ 259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ 5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ 317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ 5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ 504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ 32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ 85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ 3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ 281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ 6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ 82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ 8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ 0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ 2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ 1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ 265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ 5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ 4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ 092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ 0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ 29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ 3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ 49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ 3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ 26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ 5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ 91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ 42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ 228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ 5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ 25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ 2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ 688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ 7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ 3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ 7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ 394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ 3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ 8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ 09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ 3D20746DDA871A104202EC1AD7D60D8E165FBF97AFC1929511E41781A35CBA45 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ 6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ 26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ 9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ 0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ 32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ 221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ 36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ 2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ 72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ 83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ 0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ 3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ 6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ 210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ 889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ 123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ 71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ 1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ 6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ 3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ 57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ 4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ 2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ 6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ 0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ 31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ 97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ 4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ 75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ 40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ 80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ 15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ 5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ 16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ 278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ 59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ 97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ 806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ 01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ 78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ 29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ 31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ 320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ 908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ 369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ 966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ 5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ 76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ 847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ 950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ 30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ 89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ 5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ 9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ 735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ 64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ 25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ 2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ 180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ 9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ 120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ 07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ 6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ 4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ 7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ 57795DABAF40687B2CDA7A5014168F:\ 4BA150C2F4DB2449515CC9B545EC0012747324700D0AC1E554EAB84A262BAF00 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ 2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ 6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ 5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ 78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ 0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ 273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ 3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ 6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ 1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ 8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ 0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ 98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ 048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ 00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ 8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ 4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ 7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ 63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ 54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ 6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ 3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ 50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ 742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ 2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ 79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ 59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ 4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ 7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ 5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ 0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ 9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ 05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ 5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ 3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ 3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ 9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ 6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ 60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ 6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ 1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ 1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ 7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ 37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ 42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ 5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ 7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ 24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ 0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ 3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ 44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ 3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ 5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ 1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ 4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ 1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ 14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ 0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ 78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ 2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ 131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ 8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ 8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ 455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ 69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ 7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ 39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ 1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ 545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ 75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ 38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ 090FC9BC045271:\ 192EAEA84038D588AD55DC5143F2BB10040EF78BFC7FB91F6B5E4C053466AF00 [Keccak-1600(384)] :\ 2C23146A63A29ACF99E73B88F8C24EAA7DC60AA771780CCC006AFBFA8FE2479B\ 2DD2B21362337441AC12B515911957FF CC:\ 1B84E62A46E5A201861754AF5DC95C4A1A69CAF4A796AE405680161E29572641\ F5FA1E8641D7958336EE7B11C58F73E9 41FB:\ 495CCE2714CD72C8C53C3363D22C58B55960FE26BE0BF3BBC7A3316DD563AD1D\ B8410E75EEFEA655E39D4670EC0B1792 1F877C:\ B0665C345F45E6DE145B0190335EF5D5AA59E0B49FC1425D5EAE7355EA442284\ CB8A2152D565EBDF2810ECCAB15AF04F C1ECFDFC:\ F1850B2ABB24F3FD683C701582789D9E92B6A45F9C345F9DAE7F7997C8C910E8\ 8003E592E59281CF92C92D6B51A1AFD1 21F134AC57:\ 68D437327F158287C304BBAF36F782F497DA2C480A1FBB268682362218641F90\ 70A014919AD7331C49BEEFCCB437FE9A C6F50BB74E29:\ 03566EC003FF55184F0C85BEEBC6D1ECF5E5D082D8D40137246F8FD42BCE097C\ 09418845EF60286FDD894A00FD2D6589 119713CC83EEEF:\ 790D700FA34D6A835BE311B639474780148A2F087AC2FA86E8A1A433EC7A04FC\ BFC5284A3E188B7D91C6D094EAFBEECB 4A4F202484512526:\ 638E65758A297CB09DED1AC5B9E8F779802000AB791F67F33C60BE36443793AD\ CC8A4A58E98688157A41784F02A4BCB2 1F66AB4185ED9B6375:\ 308EC6F2EE3F6E01FB3AA06EB7C8CADD199354751B69FD4BA4D4671858F28BB4\ 5C94E712AD9D356FCB443067EF5ACA2D EED7422227613B6F53C9:\ A88F2FD112E5F11E775AA7858A3A5202E8FCD259F5D112BAA6F568240D2ECC04\ 7EAD88509E4B8A747D370751FFB2FDC0 EAEED5CDFFD89DECE455F1:\ A22A31349D7816545BE31B80E992BDBB62A29480917CEABD0AF5F2FAFBF276D4\ C29B63A04910B830B8757C81E223B7F9 5BE43C90F22902E4FE8ED2D3:\ 36CA9CC329F9A00FAA5F4F21170A017742174D3CF03C084AEB759F6FA0390349\ E1B502E435CFFB0BCE4ED46C0012A65C A746273228122F381C3B46E4F1:\ 3DA54976B291DF77F10BF95E9B7EF9FB2F88DE075DDF6650BA788590F4E2E3C8\ 30D3B7DFC0193656B0A185E3AAD9AA5A 3C5871CD619C69A63B540EB5A625:\ D21A7CF252358A1159A55934456E67D9E1DA538D4E9F9F1ACE2FD75F3074B27A\ E2B356144BDA7BA0B1ECA1AA201B20DE FA22874BCC068879E8EF11A69F0722:\ 8A0C6331429375F052960AFFF6D5FE33759F97145D60B262BEDE86D525499455\ 8FC1800ADD09D6887C275F4DD3531CB0 52A608AB21CCDD8A4457A57EDE782176:\ 18422AC1D3A1E54BAD876883D2D6DD65F65C1D5F33A7125CC4C186405A12ED64\ BA96672EEDDA8C5A6331D28683F488EB 82E192E4043DDCD12ECF52969D0F807EED:\ 4A59DA05C6E035D59D93F559D4A130D3ED91C22EADA53FD679FB0B0F31398A6F\ F83A5A9739BFD4E95F57318FCCB816F0 75683DCB556140C522543BB6E9098B21A21E:\ 98E6BCCA5F2BB30C554700202E0604F7C86B4941F0345325100C83B1234C4585\ 6DFA761E70DCD972ECB1247AEAC29259 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ D3C3D76B3D3926FD4CC4C05A087C2D76992998A5CD8C13FA3D233E0ECB2AD8B8\ 1BA4BE581E02BE91C7F82CCAC90013A0 E26193989D06568FE688E75540AEA06747D9F851:\ 7C53DA060058183CA6204E77F0709AEBEF73557C8F5E45C195B7E9416E726136\ 5D03B8A2D6C01A102655344E725475C4 D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ 2415C1D053CA207C17D99D02DBD177CD1AA7F00B0D0CA2CF30B4D2098EEA1A04\ A68E5B1C6DF2FB25ECE157C423EE8AB7 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ 90DA42B0C314445EAFD8656B26644ADDEDDC713EAB36289BFFC6ED4A85BE66A1\ 0F5ACD6B3C61E9C36A17C26260872DC8 A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ EE209E98A75A67B09008202CAD380917EB1F92C5DB4E8F2C64900AF8C603D265\ CAB317BF7B8E2251E479F8818D3022CA AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ 1198EFA57E1A7884DAC827E683255575510E1F92024A135144659BE87BBF0D06\ 3ED26C987647B923A091CF11680316FE AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ 0435E54C016C0791677DDBC6BADD55D146754296B31132B0B1C0B5CE4AEDB03A\ EAA9A2DC5157D7AF20B8E36D75E1CC00 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ 88D898ED7E6E54A683812B372F678A5FD73BCF3160A969FE4584651ADB3255F9\ ADCC8B85DCCA5C3BF8EBA3A1B69D9B90 FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ 7AC343A9369FA7BF45AFED43084DC1E275AB1B70034CFAACD4F3CB5E5E2201CF\ BD1CFFF83BAAD3897A4CB8A0DE5C35C4 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ 58877B8DD98C51339E4302ABE95CF57662CF05AA01938161CBFB5DDDA724517F\ 0C002D54B54EEA7EBD64E209DAEB8F01 A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ 1CD638128718BE351385E7A156C3F0EE8B210D1565876F8ED46C227B930D188F\ E8CA27760FE189D3B136836561E9A0EE 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ B4DBDFD9922AFD1CE46FF1CB27C30E2AEAA967631A04001C7EF2B5EABD3C0678\ C0FF219BE7B9FA04CF83DD40BC1B33B6 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ 503DCAA4ADDA5A9420B2E436DD62D9AB2E0254295C2982EF67FCE40F117A2400\ AB492F7BD5D133C6EC2232268BC27B42 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ 64D11ADC77AF5C568F37E44EFAC5FD03C460391AA833ABEC4E464237A8937EED\ D23EC513DD2A71D0329BEAA8BEF395C9 DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ 46:\ CF38764973F1EC1C34B5433AE75A3AAD1AAEF6AB197850C56C8617BCD6A882F6\ 666883AC17B2DCCDBAA647075D0972B5 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ B5A0:\ 882BFF904BFF1031139503BF6E0274C7A3928C2D73BF474A65B97C22F65F32BE\ 26AD1C5F7E4FA35D5B6253AA4076361A B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ FBAD4E:\ 80448B7A76E0F0666048C02165A4FA8DFD250A227CCDD4471C3703D07762362D\ C1DF55FEC29E2A31FE70958374271DD7 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ ED2C2492:\ 6268CD6B41F4C5123EC4D54D1E6943ABB32DBE7BFFB8EB95E4FCEE5C12D4647B\ E143C27F1281CDD275904920441508DA 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ 6B2EE4E542:\ C73D18DE07A65ACC7E2D8B2A51002AE28CBC4B0A6EE7F81A6B483F81A6DF8FF6\ B33F632A6E6312888CA714821C0B13DF 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ 2A1493D8F4FB:\ 3A0BEA62F42F9CEEDB348F6E1613F00356ED9766A5C19F0C2EEB05C74DE69D39\ 43E16CF72281FDD92715FA3D51515931 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ 30A934467DA4B0:\ 1092F63955F3DFEF1322CF9516F21540215552BC5709CCDA17AD276ECAA091A7\ 8451FE9925791B8A9191B5D42010156F 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ C0308E29446B8ED3:\ 8CD022971D5769761B8E96B442444FA1850F1201AAB0AC9F6E8404E2B3EA1D93\ 6244EEDC7957C80B7FAE60B3F216C6A0 C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ 723B20F67BA610C2B7:\ B6575D53D353360521B20AA1F993F6E2B5A262D1F508789D5CE2469E9F3F33CC\ E8848DF690CCB0D676FB949EB171A7D7 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ 0C834CE6EADC2BB86BF6:\ 7358C6A0AE58EFA14F65B8E162F07EF2D0AD8DD2006A98293307B76B3BA9E71C\ 308A6694F0B56DE8D59E58536C3513E8 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ 1540D29BA27AB8E309A4B7:\ 18030C2B5EA23B6C66BDAF180A41173394540215CA48FB3E758433FF9884EFB9\ E56D2922BA5320BA84BE36E6EFE6B89D 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ 32B58EBC38FC2A6B913596A8:\ 6F9F9016AC3B6A5978A5DC8C7506C8B4D28742253BC542E79D95824417AA5429\ 91EEF7E2B9C58CDB0C93616AE9C1F88F F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ 38467205F5DCFB34A2ACFE96C0:\ 424421BB9399BD44AB76500273D7F1E1421A2BFDE1A1C130C0B3474409D8AE92\ B3E38539CFB09ED1D23C62BB32B9364B CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ B06CF0F5A0EA15CA907EE1C27EBA:\ D07A2CACEEA869274BAEECDA43B6020930EF383A897C72A7AC7FBD8FF5CEA7F8\ BE655844D9F9BD2B498880FA1527D94F 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ BCF84D0D4726364B9BF95AB251D9BB:\ 25D7AB5E930819CF5F59ACD2542691AD66481DA547EAA9C2ADD7C8EA69A475F4\ 16C430EA1DE840974E3236A62520911F D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ C7F157298EABC4DCE7D89CE5162499F9:\ 36A6BF2D4EB3CC6FB797914E734B2CA8702CA7CC6D539B4DDB233EFAFCF06871\ 2E845364A4A929D31A440C7DAF8B134C BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ BEF788CDB5CF4606C9C1C7F61AED59F97D:\ B69D40A90207EDB20C0068F402008C0E64300B89A1B6AF7930708B263C790A08\ 7F3ADBB4C84295D23392E0692F35BDBC 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ 86E779CF053C77785AA9E692F821F14A7F51:\ CDDB883B9EADC59D2894178B3BA6F61E5E11C2C415C89E554E20A17E4909F8D9\ 60F02AA80E1A5129AEEBF2CF975711A4 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ 43304FBA401EFB2BDBD7ECE939102298651C86:\ FBE0056D65AF279EFF1573F169809A05B6A52112B662D07CDD2570BE5E198A28\ D1EA49CBEAF0C05E76A9F09BAF6D1F34 C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ 87D68D28CC3897452F6A22AA8573CCEBF245972A:\ 26473DE684CF58D559C7C0CFD360A9AFFDF33900FD69A3A946581484B93EF6FE\ 6FFAC461B4551E136BEAC64CC33A4C15 EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ 22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ 462AD97BB0156A5DA3DD0E9E5BF06D31024FE43BB80C018F6858EE4332F2EB5A\ 78ADA06CB55DDC172AD87F88E26D2451 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ 9F890FA80A4C48B67181E89DBF15175CE48B21F9D09405218A8CE3C075928278\ 0E142FC59851157D14509FCE79D1B17F DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ 9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ 2D9A3447D7723D837B8784FEAF03B8F9694CDE5FFB84C6A6628895A345BB8F3F\ 5BA725416906DE063B1CEFB722C7E56A EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ AF415063A5E25C6E55ECA7F9BD1CB0C71A7A059B569737036B339CA559CC9C74\ 66FA239EA57CFB5FCC50944871C008FB 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ 97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ 6811EC07E6E85A289C881722AE84E6AEF01FD2761294C6ED9856D2F7EA1C71A8\ 9B2FCF4A9E56533360EA22317561EC05 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ 7C90268E981A3C0FF19E14CE9830A1B9DA5FC183950875961582644462059DD2\ FADCFA68750D7D2F44DFCAB9FFCE5832 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ 66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ 64E9AD357B58C6FA0D26D0D1F48C4AB057B9F80965AC38494E88F542BA41D6B7\ 98FC2DD88290F8DDE7948C19B5A1F260 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ 4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ 3D73B33F001387FD1E752068AF39454E476B8407038C772D94400458C93664EC\ 5226AD1BD3A19A6D9A6FBD6E6A62695C 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ FC619CA9810CAAE3639B3FC661388C454167271E65ED0A2E5E8BC718AD21B9ED\ E895A658C946DC2FB15B33354DFE402A C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ 30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ 5843123A28F0B50C082023AC43B7299C4FE67302532DF4805BE6DEC3B84515B1\ C6C98F8A4E3D6CA826DA4A11300C3B9B F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ 05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ 81EDF06E9B64F3016B1547535ABA4DB08760FD23E9580163192F663FF6210600\ 1006A1393CF20DE4656DBCB029FB6314 E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ 14AA679B0C11F9C363F549330261B45E1E90CE31F4A1B0CE5CB9EB81BD6079A3\ 742D8602356C50985D0D3E540FDFDCFB 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ 00:\ E430CE80BCC61D87FDE0A278CFF54D730C03A03377F4AC10B93ED59C5880117A\ CB20F1705AEFD29BE033D2F202594655 FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ 37FC:\ C9F74AC47F9146F091DE6309357F3C2AF3A9C4474CC005AEFACE3C7A552B6127\ E34EC82C3AFCAACDD83E695CB86241E4 ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ 2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ 599BA5:\ C42ECC8863077ABFF689413CE37B61F0436DDB62E56DE4E3333C26D95AEE9E9C\ BE1D8AAA6744C0DE6BA9CFF0FF01A6BF 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ 479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ 40706B05:\ B15392718CBF4A7C7FAD1C15E7F26C446E79D54251404E646B4DCA3D42142ED5\ 140D0D30BD836C7D513CE6F5E104D42D ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ 29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ 31D06C77A4:\ E03294C68EDF4E8826B699ABDDBEF75467C49CAB56E085E4B83A58B2D9BDFAC9\ D58B45AACC0EC0CE2D6D79686A41AC13 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ A259FC4FBD72:\ D5539D7AEFF9F74DC75B6E95EADE063BE419B15A4179CFD06D4FD2741E22B2A2\ 4395AAA1C0242C995EB5EA891347B4DB 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ DBE5FE9694AD6D:\ B115A9968B054C934C396D8188BA0C33A23C7189CE88B1DE4A06CD319792D286\ 47EAE1D88FB0B87443E46292A5C645E8 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ 7EF57B91397AA8A7:\ C8FAEF757E6D7B0AF46DA1E57C71ABB4AAF7CC91C5CDC33BA8A738172B95DE08\ 7EC4C92692CB40EE3787BCE3206FB7EA BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ 7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ 44B78B2D48DE1A08AA:\ F4F21BB74593AA107DC195FF52A3F90816CCEAE8D3EB9D4577B28B49C339837A\ 52700A62EB421E8CA1C87F456310F62C 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ B3A6C9FED24D70749604:\ 83544511A07F6058D9FE5AAD7EA837A9E180D8BBB884C5650B798942983A605A\ 514C21D8D63DB0E25AAE51D26F410BC5 BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ 8B033F77D384CA01593C1B:\ 8ECD8459FB904D2EDDB14207659C2BF96EFBD3E4C8988736EC75088F1CC8115D\ 3FFFC8CEDF1C01721469D27968A6856B 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ 013C23F1E9611D595EBAC37C:\ BE60246E27959DC8065C6D4DCAC93EB7F7146B49C759BF1DD5EBA46A3ECF0747\ 84A9DF18DEAB7A19AF7F6290CDACA87B 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ 9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ 4EC5A49FFDB59A1BD6A292AA0E:\ 9235BA18C55E2CBCA0FB1DA3BC8D0DFD848CA0E51DDC1020D4BECC0F138DA108\ 7929FEC93AF16F5FB29C4A777DD91548 D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ 498E1F6C82C6CAE6FC14845B3C8A:\ 08739DD866C6216ADCA26D6121E5D81FDB1F7BCD4802C2B811D73C282277D401\ 4B4936E5589F62279BB33075705795F8 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ 88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ 5B01FECFC146BDB251B3BDAD556CD2:\ D2A2E858A5DD85D62E6F51AF7E42352AC0D7A68A835431BCCA47557E3B5C3373\ F40D3BAF85AE416012C7C982B2325790 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ AE9CD5CF0991878A311B549A6D6AF230:\ 2990D7EA068A0307047B151D5DD6B1B2358A9EC8AD9B6B826CF1BEF399D488BD\ 68D77DF8BE99F7DF7AF14AE0CE636379 E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ 105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ B50C7C681E773D109FF7491B5CC22296C5:\ 4B3087F800E4084D7F685737AC635DB459CF70C4FA863C711C1143CC10F0C4AB\ 0A2370C099FB282F9C1CE5F015BF3F79 E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ 190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ 2C7CA303269ED14014B2F3CF8B894EAC8554:\ 5D347FDDB118FD7DB270898407979D2D1531D3FF6642EC4F22917EBBEDA6CEE0\ FB0DE11432EDDDFCBF0E2AB9CFA65804 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ 1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ 954637B87FDCC484F2B61F7F42558068029F96099C1D6B9246585092EAE68924\ E5441B45027248A2728833169BFA5004 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ 8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ 37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ 78726E91AC311F4D104706362B0314C243CD81644125881FBC03670210C89FB8\ E7BFF6C61FF68B234C3171F16B398F36 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ 85EA51D49894E45BAA3DC707E224688C6408B68B11:\ 80763FB54688F122269430980AA3ABE09091020B8CFA6BDE0EDC2C63AED8B8BA\ 097CDB79B8FC7F5117508FCA4864A14D 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ 8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ 04E18D475920CE828B94E72241F24DB72546B352A0E4:\ 80447583262DED037DA88F3B98698BD8F7AED7D9BF4D99F8132EC3E7D16BB844\ ADAD188757CEB32B359C56E5007EA3E4 B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ E5FB4AE5DDFB4CE8221DF4BE70240B76851E55FAE86BAF35BAD9E7179E24C95D\ A6F0F0695A8A5291A2394B92A6FF7B7C 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ 578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ 44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ CE6B07C0C7DA2FA1E6CA05DE0652FC9F1F452FC261E73E52457C72BF0D51BAC7\ D66160CFF16D6A03527982E7D4393507 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ 4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ FA76E05F8D2832DADFEBA0107A3137B7B9D4D19A77A1E78F8BBFECDA7EF46414\ C363453E8C4902C302A4E18CEA4BA157 B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ 1B43B70B6BBBC768C1F4B3CE241667ADB5246D29981723846168D2234E19A513\ 0B1F576B4974C613639A449E61B2CA79 CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ 5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ 27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ 938252393A532D9E1F91D5C222E2DF2CC7AE102705BFB83FE30DCAEBCEA82BFF\ 9BDA7CA67095439859146632494D3CE4 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ 47633AD0C80AF26BF74D9598DBD5BCF77FC6BFF1BCA015A611D7B8240F597D87\ 67FB8B0BF5C333156580AFEE121C299C 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ 29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ 04456322E1BF27785EDF3F596DB33E693AADF76D9D259352D97ACD561BC45236\ 506FBA3530772242CB369A83A38CD749 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ 650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ F8B1F2C317B9D1898C305DEC3C6C0AC45CFE7F995E944968206C1C1B2C92BD1D\ 4FA392FFAA6094C6AFF95E47DC259EE9 E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ 7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ 8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ 4F439197C66439BAF65618F826E299A329380B558A52B0711182580BDBADBABB\ 13AD66D60FADDB9DED226F0B401AA8BE 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ 1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ 040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ 1C8B99BF6A3E80F0B8C67FA9BBF07D19C15D484CDE38F8FAADB748AE024A02E2\ 9FD2D7BDCE66D46C1A5239D7453FD3E3 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ 0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ 0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ 49:\ 46F87BC07849E95104E67CC3DC71BDC109C1102BFB1ACDFE2F6A23173B52BF83\ 6CE00CD7A5A5FFE7D3BB8FAB33DECEDF 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ 0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ 2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ 5B52:\ FA12B9D070F697FD5391F3FC9C44056CEDA63F035D766655AA7D0A575ED55B15\ BA6BAF56300940B565E37A248E2DCAB8 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ 89CCC1:\ 5304D6DB2730FB07B85348B0226B1A81A546BA1FE201ECCE1E552DBA6AFB84CC\ E7A6F954E3100AE1724B82CF1CBC4128 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ 14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ 22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ 6DCBB4CE:\ 135114508DD63E279E709C26F7817C0482766CDE49132E3EDF2EEDD8996F4E35\ 96D184100B384868249F1D8B8FDAA2C9 A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ 7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ 881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ BADF45685F:\ D560D54A2881ED47CC8C5AF9818FEEAF08B621B1AED4569D08807A0B61F902C1\ 691D8B08FF75590FEAAED6E75F4C9E3F 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ 312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ 96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ 9B62C60A4771:\ FE5F30A315584092A271FDBCF4347A24D14A1F98CADC88DF288C36CEA8F89E90\ 20019933BCD4F5A7479E3E4A57644C49 F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ 9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ CA58D5DAB38ADB:\ A4E5EE130FC105818CD1A0DE74F1085B9B4D93889C509DC3A208B5230D39D8F3\ 04BB403F72BF0CF5E02C4C4A0831F328 E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ 21691E1069413848:\ 9FB5700502E01926824F46E9F61894F9487DBCF8AE6217203C85606F97556653\ 9376D6239DB04AEF9BF48CA4F191A90B 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ B57D6D0C2EDC4E78D6:\ F2E0FF6CF4801CFF2ECA1703E4E956C007A1F2709430F1F7A0A4FDD16A063522\ A4DFB6C41FA529C2E325F8CDD4F8DA96 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ 8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ CD19E781AF20454AC880:\ 62029D962D2E323688DC5851C549DA39EF49CB994D2D6C51C57B9BBAB375AA10\ BD0605208D9946EA472573880230DD2D 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ BF0FE3C32C17AA188A8683:\ 25E546F76EA9F98E03E3B2F4AB608185073658E7EDA0777BD5B047A59085C3C5\ 00916347D4F77E38E35159AF133ED638 F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ 0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ 2E937F21C005F17411473041:\ BEEFCEFF9E2D0825D60EA20E5271BF49C4AE3A5B54B56050988DD3DF5DB5EB4F\ 1002EFBFBAED2FC72179DE44116976B2 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ 62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ 2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ 29F695815D866DA99DF3F79403:\ 7D18254D46A14D0383EC56AC9CA2FDA7885AE673468C9F3B45BA792C2C23C9FF\ 82491E6AECA15D076AD3A3432CFA650C 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ 84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ 3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ 1BB15B447589E86E8D76B1E9CED2:\ 1E3E007CE37792D8A4423B797E876E89859590DEDD39711AD0F1DE2FD925F432\ 0B44BD57DDC7050427943E3C957D4B6D F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ 4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ 853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ AD3D7E886DEA4F005AE4AD05E5065F:\ D1D263B5311B05C7B9F7783E3AFD9A2E75791CE0503ED820474B35340D2CC84B\ 0270921BBD965722011AA30CE4352926 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ 7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ 68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ EAABC35F5C2B0A0F2379231953322C4E:\ E482B0C1B2057F1B6B897BDC230DCA2B48FFC0E4600AC40A44DCE03E99A8D1DF\ 94908A9FEBA0405DA79569E75059F9CE BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ 4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ 2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ 159388D5C3277E227286F65FF5E5B5AEC1:\ E54BC3B249DFF637001B58D13CBF64F453E01AD68A554CA994F71EC710216EF9\ 769F1C8B463DC7B4A90A0CEACED41E3D 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ 407847DD0DA505AB1641C02DEA4F0D834986:\ 01DC4CED4693B36814443857931C5D3CEE8762FDA0220F8E9E63AB1EE9A7135A\ DE21C5AB3791821352FFBC322F3ED208 B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ 33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ 99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ 7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ 587C8104936BDD74700666663843746015906CF4C681C2A6FFDD07B732E9E778\ 7B165E117DA340BCE4E27302BA288299 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ 2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ 205AA1615DB44057DB991231D2CB42624574F545:\ 51753384C8F9584BE3ED4526B9B29A97DC8A87D195D0155E7444950EEA55ABEC\ 5C0D7814F1DFCE5CA4BF1D50EBC709AD DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ 2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ 157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ BD1E1E9AE80B7FA79ADBD47D7A28BA44F4874108CD9BE5D327CC93C6ED4DACF8\ A9E2A3491D4168BFFAE63FB2F1070DE7 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ 0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ 0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ 3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ 6B7C1144FA984261377DBAACA78A03AE580B7F3A17D69BA0D56EE908DD9EC9F8\ 7EA30A7626ED7CCF25B53A6994E121E8 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ 46176EBF044C4784467C700470D0C0B40C8A088C815816:\ 76414F3B9E4FF8D150280C8E44BC54056849B25351352D9D9E986B3ECB6EC050\ 542709AFE01979D2EB97E51D41217E6E D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ 91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ 1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ 92AC60E5DC492010A45F46AEF05F403F7569E1B4E2D0C909C871A783FC12457D\ E281AFF4C4CEE0207D20EAF546285070 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ 1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ 285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ 6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ 8F99032CB49BB022EE5FB32446E1D39AA0FCD749741E4796979D4BEA5AB1B04D\ 241592EC6058E54B8EC9EAB274EE632D 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ 27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ 9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ 8BB4F3CF0390A31D682213D22354DFE7D580C811682259872F2A29A08D373FD9\ 98F842334F64F81349364A930C82BAD4 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ 0BB7DAC544569E6EB74ACAB01A846F74AD2A0F31D8FACEE4D09FA49C81B93BD8\ 3B4F129B96DA4C0EAF165FDE52EF295B 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ 8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ 4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ 47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ 10DD9348B2D95889EE613907824A10EFC708A101A67672FCA4C6539F5156C7DF\ 805DBE666FCF4CC578F421AE3CF27122 A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ 2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ 444B8A6F1EE118DE3FB3EC76B2FBAD9EF31916E1F99077DEFC51C2E59C8E6A3E\ 207BA48E5EDD66C72B5BEBA67401D794 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ 5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ 4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ F4D17C6299BAE7D0E6D15A550B311F30C1B038AEF56FE375F3B4BAE14F7EA427\ C5AA987EF93285975CE5F9E46A3E4C20 A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ 07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ 6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ 39F911E9CB2763C8911AC3153040E48F403ABFE373E14B709A476868D3AB5841\ D1088F8393DD728305BA341138365D27 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ 29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ 98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ 3ADEB7EEECF9069F143A10151FD4506AEEF3A0EF94CA65D4448ACF1E892B8EBB\ 0887631804DD64E153AD41FAE0127A85 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ 3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ E2:\ 14830877DFAFE6F886A22DE7CE9A5FC74733A8FC27ECC523B6B4524E6312CBB2\ 2B51D7EB9DDAB37BA54BB2C0BFC32A6F 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ 1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ 3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ 52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ 61EC:\ D109532BC4217326B3D25ED2D2F3F0D2482CC5BDD054218FA8BEDB91CD814F7F\ D683AA2AFCB8342CD34CE54D607E3DA0 E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ 9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ 2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ 609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ 9B5EDC:\ DE64A37A7456638D3ACA1B895F4A88C26817177986A9F2F5B77B49CFF2C3E46B\ E2C49ABE89D741375DB87F4C898F6762 FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ 63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ 42D75D68:\ 8D9743710C171CD399A0D712E9D53374ED8E0A97672A40294C74F0D503F0292D\ 6F41D5CEA08FB3C623C4EBA56848770D 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ 7815BF3C49:\ FAE998D1074E30F2EA0A8B9FE259FD2E2A36804995EBE7E3A5AD34865B1A3316\ 675297FE8E33EEF8ADCC02BE8C4765BE 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ 61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ 025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ 951CB2068CC6:\ 0AA9CCC3C9CAE1603D3DA5E95F304ADB8FA575833929B09F7C1095D968BEA047\ 1DFE8AAAD3AD11266DAAFF95F6667ABC B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ 93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ B0FED6A8052FBB:\ 8FFDF6A4752D17D496F8ADEE7116BD2AF0A4B726BB3F4C5F85BE2C9DFC34055A\ 509E4FE016930D9951A7212553E2E908 B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ 35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ 780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ 015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ 37674C6F8E380C04:\ 278E83CFF1FF6CC4B3AC41F3879DA87AE63B535B43815E273687A4CC519855B4\ 52CB6AF0198BB9FD0F3E43739BC0CDD7 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ F22DA873C601016A0D:\ AA4B5A5FB94FE19578F33323BA1EEFC5B6ED70B34BC70193F386C99F73863611\ AF20581B4B1B3ED776DF9E235D3D4E45 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ 472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ 994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ 1373FB09A1A6E3C7158F:\ 3174CF3754A6FE603631ECDA4895171A9DCF7AFB02EB72AE270A9E3EBF2A65A7\ 2C3436C233FD4F17F7FBAFBAC0680C63 FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ 084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ 339612E830E9E7A9C29065:\ 354813D9823D2F02D75D13893A6ABDB44E9E99666533429CC6F7EB3FBA10BF9E\ CD4A18BB9D5188E6E8F91DFDDBE8409A 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ 5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ 8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ 377838973C1D943C22ED335E:\ E2EFDC5007E4C13F811043DB967A423DE02AF411B4A251A225CAD041E83BD4DD\ 89D8B24198DA00096CFE2E1B3F5D1960 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ 725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ 798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ 8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ 2D0C9E7448DE3043AE22FDD229:\ E44C0856F0C245E002F914CF300E98C496E725A4DB561F2995AD9C8B97F341E1\ 5625B56B03D4D5880927B8574F5E5D74 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ 5B6C338CBB8F6659D342A24368CF:\ 5D290C5DFF59A3A3DB8BC7320B8F64A4DBF67CA4F5DF9A07F235EDB6460345FC\ 8971040481C9A5D0F09B62262B9ED9F8 EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ 76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ F6954BA0801A1294CD8D7E66DFAFEC:\ FE680250CAB1FBDB6AC8800DDC28E70100DF8DAAE38DA27004872AB05D40B15A\ E93EB44266E3014F0960038B28252C7B 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ 055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ 256FB33D4260439CBA73A9479EE00C63:\ 511B13E53FD353FA4D38EF0CF8F1AF30DA554828A5FD1C53EC41F73D9ACA6C54\ AC7972C933AF4A2FC7AB852CA63A1BA6 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ 911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ 5994C1DBB3B5C7871A11F5537011044C53:\ 554CF00A9AAFE0DFC8D49EA03288B52AED43A5104E22B838E40FDE7358491B57\ 74DF455CF2EC73C53A7B30627A142A41 CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ 2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ 586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ 4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ 4E53426CAA453F8DE1CBB57932B0B741D4C6:\ C13C177E6453F78E81BC4EFEA7A10E9CA02273A6EB757497368539BF4AE1F1BB\ CBAE0FFF5DAD55EDCA61F474976CBF64 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ 868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ 83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ C3E5DDF4572A386C99F998E68FCCC7F85867A73E13C2058C18391A922416FD35\ 2CA6B659BAD021E0D9A05789F59D3C67 EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ 157481D0A24BA9FAFA1800C9713E702976167FDDF52367A7932AA3CFF22F4A2E\ 19A016C7BACBD97CEC3EA6B1E87CB3D3 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ 656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ 46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ 8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ BCDD36EE35C2C771852E27DB2CDDABC155AB43D28E6289F0ABA4F93E793C999F\ 30836C7483FBEA5A73F4EEB5D8D32FE3 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ 7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ 4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ 99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ FA7F66D37C1DC3E81BF55C443ABAD5CF79A3D9834F77A206291138AE31438B98\ 6737DC4599EC5D10F7F005D1833B7D2E D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ 66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ 67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ 8F0E47ED680661F1ACE9EEEE855D935FDFC66B97C2E9A6FC7341F14D9327C8E7\ 2BCA3FA67E59804CEA41F09E1C4F8715 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ 1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ 48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ 15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ F105810E724C2C55162CF71721E3F59871F06010BC7F052AB282BFB6D4A3BF18\ 4B892BAF8FADD02070F64B9E036DC5F7 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ 7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ 66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ 5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ CBB0FCE4AF36D14B63BC72D37FB4028327843FB22EC033BFC068E7B081287E31\ E3451D8A1D97692B379FF9E6ACD40240 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ 7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ 1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ 1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ 44E4F77C0D7BCA6AD57D334F974BDA8DE2E08E104F14A8713280CE73897A945D\ C23AD058533B85750D9DD9D2D7B5D1AF 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ 9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ 0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ 45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ 6913184FAE1EF9FA2D57B1B7BD586D51DE9A5F387037266E7B4A83F4366498FF\ 86C89934C05332A7E641149EF627FA34 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ 1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ F04FF5AAA68F2558586D2748587DEE3CF28BACAB5BE5F887D24A068311BA2D9E\ 9BC0206C2706B9C109E7162E3ECB6346 CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ 60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ 0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ D4B8CFB2FE5B63BB5BB678B98B465A2DFD23DFF498E778EE0535A5C077705AA2\ CA2F039832BAEA0F735609B3E4E18CF7 F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ 10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ 568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ 46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ 25B7237DA9D40DE047D41A30BD37155C0F108D7296B09079957D4EE31224A4BA\ 256AF756D154878910C158E49186728B 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ 8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ 4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ 01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ F41B2D02D321F4BA106F931EE27D3F74E8D397BACECB0A1FA90BF5C837ACEB2E\ D8F0FEFF07B7EBEA6A88D0CC54AE8E6A 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ 9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ 447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ 9673A1A3535B8975CA0F512CDB0FDCDFB0179CE229E756AD70EAF1E5C3E1A413\ 5E9FA7653EDBDCA4975AC18B17A662EB 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ 74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ 5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ CF:\ 32429CB1B5DAD663A0663E49033DB2290945019DF7E792CDFF3723EEDB88CD06\ 03B3FAE0228A184F8EFFAC45112F453E FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ 5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ 71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ 1DC8:\ E91DEEBCD72BA12E2215602B488DED203A1E211D6358CADC6F906FBD89CA928F\ 541222CBD8FC9A20B573EF22FC178778 E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ 54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ 009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ 2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ 99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ C25E88:\ 45290A24291E81CCB8D7840B6C4812AC98983D7BD3AFE46B427296AD636862B9\ E03ECF605B114CB47C0207267BC05958 F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ 65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ 3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ C5C06729:\ E6BB2FAF5ABB3EDAFFE9E47F62586409B443E4C698070D61FC082261053270EC\ DC2484AA0145C851031E3C99DEFF2389 CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ 68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ 6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ 551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ CFE0AF93EB:\ 79B792B34DA4425BB0B4217ABE23E5DBE4E87D3940E2F7BA52CA146618580A62\ 545C44B81E06620AF6E273499073E3A8 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ 331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ 2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ 05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ F467BC75A9D1:\ 9FA1D0AC7C37831731B71C19AC9E81EA115083ACE6D94349CE89FDB79B3462A7\ 49D76FDC93892F2F16AB0F7E18CDB79C 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ 513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ C6F4756017FFF5:\ 187CDFDB3757D80010D1E53157A5CCB0FCC34998EFC6BB3CE2E60768F5EEAA59\ 0656B49C0E036A3F34C9EF25F3BE587A C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ 798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ 9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ 45DBA58E6CB2C8EA:\ 7043F54F390B6ABD0DFF06F266E0E7B3E41F8D2E8DD43F899AC456662447A823\ A567B1B0FB8C2DF24E5F6689060CDDB4 B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ 01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ 86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ 10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ E8419D48FDFBD744CE:\ D0CE0259AAEEA5BAEFF52929423C3DA07A8C75195F86D733A718D1C46A1E40AA\ D404750C41D7A158E79F278830B4C07A A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ 7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ 6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ 1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ 4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ 359D5D1EEA105F28DCFB:\ E4385A3BE011AF20FE4566C1CEBF4AA68270E42BE50AAAAE65F8F605E980B1D2\ 736FB0E794330D764CA96BC68B8360BC E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ 2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ 6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ 8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ 7ADFB974EE205A9BF7B848:\ C979F00656A09E68485CCF07FBBB9108B00C5FC11D41F5966FF086F26C710247\ 8EC177EE6D78C623C375A9E6F761809A B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ 7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ EC77F29D211BE89DE18B15F6:\ 36139336110D1D6C27E4CC1F26F428EB8BDBCBA3AA9FFDCECF72009FB46BFAF9\ E3464C48BEFA4745BE36C697DD3BED8B DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ 4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ 49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ 9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ 50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ 63EFE793489C39B8FD29D104CE:\ CE3268B8EC923B3331EA2CF85132C0733CF8BF87DAA544F8EE386D5DE9FBD4D8\ AD94E00B705CA5B61A3C1790B650080C BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ 02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ 711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ AE5B257BE36A7124E1060C170FFA:\ DDC398879BD16FB681FAE1512E3A1AE7ED2362DAD8BEE0D12D2256B2D8562820\ 43DC0CBBC0F63197B75E9982A1DAA8AE 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ 5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ 70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ 001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ 480AB79D4E6415B520F1C484D675B1:\ 350B4B2768020EAA95452B90414439A38BE03686131D45612C1B85FE06FD9196\ F27D221F4FF83251AA8E69AEF72F904D A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ 84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ 920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ D42956588B3B58CD948970D298776060:\ 4CD1367112C40FB7E3919DF20697A4E1CDC55FD0F01BE3953B1998B5FCB473E7\ 6E9E75D5D82E2973B3DB89538554933B 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ 3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ 678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ 2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ 8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ A96CBDE5FBC953D9E576CD216AFC90323A:\ 878AD52FA09FD4B6465083C9C9E6A2DDB81302E2DB0CAA934D03A196972ADDD4\ BB8FF869BF0069E970D6BAEB5BBA9B79 F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ 593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ 0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ 358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ 67B5AD93D874812A1DE6A7B93CD53AD97232:\ 60071A7E2ECFAF3B5B2E84A677FB98E44BD3725ADDEEC5C37EC62052D57AF7B6\ 87A063FD39C8F6E86F79D97F246C757B 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ 85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ 352BDD3740DD6A16792AE2D86F11641BB717C2:\ EB929023D66AC20F11BF68EBC43069D27F35077A68D21FAB30854FFE53CBD784\ D7B25776D9F266F106433751E6C38A68 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ 71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ 865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ 2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ 9ABA31EDB903B28FBFC33B7703CD996215A11238:\ 6A51975C9FFEE8B94135A3BDA954DFE14E6267DBC9253F0BB04515A6B7745AEC\ 611B7B66AE57D3FD3770AED4F412EC84 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ 8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ 13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ 9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ 32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ D2DC49C04553F09A8C3D7DB51DE890A71DBC10FE4E910C68BA5CA5DDB313D0A6\ 8375275C291B4DEB41F45E35A558BF77 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ 3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ 7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ AAB5747D7DCC77BACDE81A58C37764F8F41E08F2413B40D4E6C792CEFE52E4E2\ A406338752D7AD1269E7D5284FCB7400 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ 2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ 41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ 1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ 6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ 72B526D74CF9521E00D9D6BCDFC1FB1760C6ACDF2DD75171305DB45D38098FF2\ 3C5B8ED3C21DA73FFB8DF7217CE46DBB C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ 58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ 21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ 104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ 800CFA48B4647F7783BCD41B2C0F7F7D4D0FAA72481A2A42C4E9C43C9F62E27A\ CB4DDB73E318061D396059AADE4145E2 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ 4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ 76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ F782FF0DE7D5442D562CC500256EE4B5A00E885C8CD86009C53F337AE003854D\ E4B89794281A64375E3F696A415B95D2 C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ 7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ 36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ DE34506AD69085C6357D62B0B127CE66E25E8EC5FACA5BA898C75CA19E9AF24F\ 02406716C61A71D62BDC28D718C125DF 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ 8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ 7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ 57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ 6F4FEEDBA0ABB4DBF824302250E6B668CBFFDCA0B8C338236FE02A8779D8ACA3\ 91D8D116B2BC43D40E736096470A0BC0 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ 384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ 4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ 55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ A040CE1CBB996723CBCDBDFF7A6A5F69289737609534C5AF36F6C420A6ADFD57\ 0794079509D07E62566C58062D8186DB C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ 4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ 761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ FF13C29C5E0D746CA27AEE38B6B49A13C1B3D70E62875443BCFC22A22E75031E\ 60D68A917E3AE1D42D374D44CDC9F4C8 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ 0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ 475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ 6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ 6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ 3A4418A16896ADAB7C6DC783A0FC9F8D7E949937BE1D68B5EF02574B2B0C9BA9\ 02FB9C15ED64FC825D598AAFC1B26347 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ 635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ 822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ 1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ 17F84411E60F6BD856D09C0ACF314E7546466AB0C1616284D2240D22BCCC7240\ E5A2D656D35257AB49781BDABEF6FCF9 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ 1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ 698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ 47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ E577F79B0E05355B8F63EC1E639BC5A51A72BBB0ABAFE76D3133DEC4DA9BEF9A\ 361F3E3C0ADB4C07E2757FE1D4790B9A CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ 8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ 696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ 7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ 01:\ F78106F10E6C1F1CA5190FE541345145EE25BC51D3C1CBAAA04C0DB2A3BA2584\ DDD30F3A889B94BBCB9573CD9417574C D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ 0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ 2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ 9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ 4D4B:\ 6F42FAF87DA65516FC0CCA70A385F26EBDAA94DF64AA5E7A3119AC18C6214E3D\ 0B61158FBD6C2487E0ABFB0C6C85EF87 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ 1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ 18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ 299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ 4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ A3BA86:\ 82FC97EE34A8FCC276AE1C8130555CC2D339AA6CB34003488378855529F9EE3A\ F819EC104DD2DE300AB7DBC04B2B4017 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ 69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ 1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ 61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ 477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ FB9E4AB6:\ 75D140BE47E116211F4F668E05ADD36C83B3E481DF9F28064A41898335D97C80\ 5471214E29C0B849875845C9B8DE25E3 FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ 31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ 59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ 7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ 91355C6280:\ 1A04CD93747CA583A58AB4A8C7C8C7A33F025EDE1B2DD080E5AF0C4DC63C8715\ E436DD57FF7F401DECEF813F330D6588 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ 62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ 225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ 1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ 366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ AF1AE717238D:\ FB0626F2B189679DD998BC18F30DF82D0907B62AA77C8669E22B53860E398850\ 3D884884163A561739254CA13929B69B 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ 85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ 16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ 528F9AB49C79F2:\ CC2EF9602F80D0734295C7C158EC366608CF60A423D0836644B60831A94E7EAF\ 994C81F19174FD6CA75BB246BBCCA200 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ 584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ 4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ 4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ 5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ EBDDC89186839B77:\ B5A7160112E0825A7C03643BEB98B1FC2549B81F01C3C4271DFF99BE57D472A7\ FAD133808D7D2D414D6011E9A2E8DFEC FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ 6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ C66F252F6E64EDC96B:\ E7B3118D7FCA9D294F596D820F468CD9027920777A41A706EDE877CBEB9517F2\ 23B268C5E805A374051822692E9AB44B B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ 5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ 252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ 25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ 232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ 5363892A2495DF8C1EEF:\ C3FA6C9D0FF231198AECA80EA428AC4B32C481D390CE4A90D0F65FF7D58F696C\ 1FAADA1673D7E2D161462C95C2E2A310 C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ 272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ 414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ 49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ 199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ 5C6D1BE4BC79F08A1A0A46:\ C4BD1157C093ACB27BD3BD7F444F836BFCBA0DAFE11675104C6437E5981442BE\ 999C860DD6E1B75FAF6A553E907B61EE 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ 2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ 443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ 6EB6E4A80358ACC78647D043:\ D099F3C8052CAA2CF9751B1ED2D472C21FED667892BC1C417600A4C93EFFE88F\ 1B17B36D37E4D26B9CD65ACB13A6DB6F EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ 01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ 90BF2C4062FD2AD58F906A2D0D:\ 7A9FE13FE3318121BABB340A3B045DC89D1BE2D0EC05802C9254FEC39EFCDE16\ 3C514DCDBA3FF93F9B097486C2012385 E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ 3EE46FB67422F814A68C4BE3E8C9:\ 8AEEDE5D6E2F9F1C7A6644A8DA0F93574DF8CA33B2ED9D364615E1F9CF1A8013\ 15410733881CE0DAD2F6FB5A916A97E1 D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ 4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ 38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ 806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ 4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ A17E776C0D02856032A6CD10AD2838:\ 29E62D8C1B71F826544A0CBFCDD99CF8AA1C97E153063120D295EDF69E2ECB5A\ 2783C66760D0F87BF944516824CCFCB1 F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ 39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ 42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ 4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ 2ED1C78631FD23B4C3EB27C3FAEC8685:\ EB2F1BF2D9EE857B189318DFAF49DC3FAD79501189AC9B5765DFB234EC4A62F0\ B0E34E7AC3F494D6F05C7BB86AE5CDA2 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ 94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ 286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ 04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ 72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ CD90333A77BC4E1988A82ABF7C7CAF3291:\ 2A9CF2FD012B025616478CEF6971B6F9E494A63AAB5F53310DDE70FC6ED27F1E\ 2D7804AEB8D206F641A73E054DA620E6 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ 29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ 5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ 626C48322E9791D5FF72294049BDE91E73F8:\ 5F8E2DE742036B6AC4A7D8987B47C4C7A1CCB7239E1B3EEFD1116D6392C79177\ D68C66221F31D0FAED9134429B89BEEA AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ 1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ 42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ 774BE89C1114DD531C011E53A34DC248A2F0E6:\ B0B1F4058417516A5C5A9683A5D72B489E6AD42273D591791D2CDA7360A4008E\ 86C8899369946F7ABFE29BF92C9CA965 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ 246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ 47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ 94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ A7059ABE99182714983B9C9D44D7F5643596D4F3:\ 9172AAD6C15B4DCD79BBD84FAD0601119D8B4E3AFED17B594FF38424157985EE\ 27B65826B9905486E767E85AA031E07B 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ 374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ 6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ 63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ 5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ 4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ BAFBB3321C4798548F5DD983EAC1E16E1F3EF2BA5C9D69A340F6CABC9C7FE9F1\ FD95A692B7387342304945674D9D2E4A 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ 575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ 7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ 591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ A055E0A9C4575CD4D7AD84A240176F21ED68F484A269E0C9EFFB6FA93746E31F\ 64B0B90C513D2B57EC78E9E5BA3BA99C 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ 37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ 3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ 9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ 24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ 788D19AD68D1B26CB0078389B45FB18B3DA35A57A1EC914273158EAD43749BF1\ AB49B1A68D4831CE193F5852D20FD96C D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ 33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ 0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ 52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ 9C8A4F5BE01AD5AE0946EF7E9F5A82287B6344B966EE28BDEDFE4BD43D840D23\ 2054D5E216716EA4F80B457CBC110D1A 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ 7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ 5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ 806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ A29BCB89FD2B89006782088BF9A4AB939EABAFF6F4EEFC31B01A66B73CDF0B97\ 7D945E051D7E9F02F19CF32AD4BEBA6C 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ 271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ 608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ 990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ 2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ 61D3B13728925646476D67C8D626D2ECE69D9B42503FA6A0DF2B24A5F2AB0FB7\ D74C2F1F7F04304C49AC94BD4E93FDA4 C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ 56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ 8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ 50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ 1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ 9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ 589AB9981D9ABD1D712D59C6863D850BB1D412D24A967D76CCE78FFC998F8C01\ 6DD4B115A1BC4DC49248AB5F758C215A 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ 5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ 4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ 261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ 31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ B3CC7224A1DD208E739C5528239B8D335A129EE20E59102621180E6B51714E0D\ 60078F4E7328726434AE41CA273515BA 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ 266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ 7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ 357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ 5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ 719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ D33AD2A71C712A6F8AD9AC923966B4DB8C4818C79CC60F8275367D2452CFD2F5\ 542FD1888D64C9E912B92A186842B000 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ 8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ 3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ 267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ 8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ C12D450A020CDE18C24323FB4E3FB23255714B1D4CBF29719F74DA5E6151FAE9\ 01DC21A6680AD159FFB2E7C0AAABDF5B 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ 1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ 4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ 3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ E5B7A9B41FA0CEC3252FF95099523DC845C69B670D8DFEBA3E4AF6DEC659C4B2\ D4B04F5F7062209485A37C542CCBE7E6 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ 994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ 37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ 7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ 9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ 5E2BA5382C357B5A1987BDAB9A2A0B053EB75EE770E1994E630F24015AB102E4\ 82A95A25B68F5DE99FE9748FA48FF696 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ 394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ 43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ 7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ E8:\ 0467C2B9F02AF8CEAF4F8FE88D1DE3EE03D78EC26EDEE0E34B6E7EE49AC357C3\ 5A9AE352FF4932D75E0617B8B0C61C80 EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ 85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ 4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ 97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ 345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ 6427:\ 87F9ECB906C9D8AAFA8DC62AF858C99609A8E9590BA5BC91A89205DE44F06AE7\ 976A9BE918AAFC9134DE9029117152A1 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ 89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ 630012:\ 510CB484B6D4B47A590F6211C7F33592246A2E05A1C69258B6CF9A24C1A3AFC2\ 527841AE3FCD552E5103DD24743AC6B3 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ 95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ 4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ 78DFB921:\ 03F3BB45FD70966AC5EFD9598C480ED677C86C7CF00B10261AE6790C5279A5E4\ 7386F3D31726D9CB619B92A79CCAE25C 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ 4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ 91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ 9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ BB0D19F909:\ 68A47C7D124E8AEA5CFEEF7A9D8CA7AA8DF6EEE6652DE3A385231F29BC4B983A\ EC8AF2A61329B64BB59A45B77A38E4DF 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ 6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ 57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ 00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ 77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ 81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ 04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ BE6BF8082E8A:\ DD3BBA1B4F8493E0639151D9303835F492606E2DB3AF34FE65156A642794196D\ 00A6C34A3A5FEA66202C3B5A79980A8A 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ 06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ 6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ 4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ 58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ E839A9D4608F03:\ 50D3B02AC7B907B310C1C0105EB47F6DCF3AF0E473785DAA54D8037A9A3E74A5\ D1A41D811202F1E3C8A140173D92F60F 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ 10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ 2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ 2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ 8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ 8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ 5153592EA81C6FBF:\ A6BBAE1FF8E00DCE34F640CEE2CDB5BCFE4382761BE36A940E50EEC12B5C2A02\ B2B6BE18A7C87A36FD2194C4D243EC38 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ 735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ 1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ 7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ 39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ 9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ 604F5035C46B8197D3:\ 7ED83EB659536B36061773073B148ED2117512372E49E0A3AEE48B96353EC936\ B32688B150C585944D2008F21366B531 E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ 94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ 7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ 60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ 7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ 6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ 07E3B953ACF99964B847:\ 2516E0015ED162073238996D5A03239087E01C2091F7B03637E6C89A758F565E\ 45C908DE873E378CAA433BAF339D0552 D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ 32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ 7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ 8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ 07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ 4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ 6C90E8C4D100ACD9EED21E:\ 6BAE42ADD06C6A20A05D845E7BF391F1EAB83E83A710A18527FC03646104E52A\ 8B417CFF375753882081F31B6F2295EB 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ 18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ 886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ 4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ E2DD603D9EA24DC7C5FD06BE:\ 14690DDB5A48FDF382DBC745AD0330C1486124F6AD2E5AE4A850E38C264F99AE\ AE6F156062AB1946DD07AFE1700A8294 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ 742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ 69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ 9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ 779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ A80012976F31FFDF305F0C9C5E:\ 9DA6652BA890007A01126F0F65970ABF3474C7659C6C80B04DA2CA592EDF0F39\ 9601BC0DAD10A0DD6E316A286E2338EF 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ 9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ 53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ 479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ 3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ B461A40645BF176601F1E760DE5F:\ B94D578DE79A437BEAD951E9AEE912540D0139965CF0142F1FD403534959B75D\ 11E0B2463201B10364B905CF9BAA57B3 D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ 5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ 8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ 1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ 86C226169FF257954EBDA81C0E5F99:\ B85F56F69D3BE57A1C2AA553F90BC1B089E8F1C561881BE64630EA6BA4DD3BD5\ 301512313A18C26DF3E97E056A59EDCF 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ 431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ 40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ 0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ 2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ 83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ D3C356C914FA06B9A7CE24C7317A172D:\ 7D9508FB795811EA1442DB3ECB779CB0494736E7123B252CF88A9A0B50D57CF0\ 0B87A6C4FAC27F821CD55979D586AA39 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ 645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ 39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ 68F50D79F0C9C7314E750F7D02FAA58BFA:\ AFD94B061F354B04D0718326D7E10A6B598CE31CC39C52D265D6CF04E4D9EE75\ CC200149367600312E7514A62F0F0964 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ 4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ 717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ 4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ 9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ 39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ 7DF95B60FA8712A2271FCAF3911CE7B511B1:\ EC63CE9DD979FCD132244BE11A45DDB1D00FC8F80160B8CC456F5C5EB89E0C3F\ 675B28B92DD9E6CEFAA5DA57B4908646 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ 261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ 0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ 61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ 37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ 86301FE98F3FFABB0CB0085AAA1EC61BCAD6171459A8623BB780EC32E46F5264\ 9946A421EBFC7DE90F0E74EC787A3E03 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ 4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ 339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ 5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ 7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ B7F5CB9923AD97058EC067700CC746C127A61EE3:\ DDF8D547BBA4F43D8864CAEF1B1BED77AA12E41F6886A5D8758C654B7EC1FA5B\ 0E77BA4E7680C7830DA161E14CB1E65C 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ 70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ 495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ 5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ 00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ 72953FE4CA34E717E304DC77AFD9DEDE32A8467127B9F78BB0BE6191A7ECD051\ B7DAE091B1758907DDA3B1D25C0C5883 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ 6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ 6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ 1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ 0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ 2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ F36A9EE455066E562FB675F399D9DCC6BCCF68FD1B0BA9F7DCC1EDFAC1F1E234\ CB67B5A0F770E55435F75F9EC84A9151 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ 2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ 5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ 9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ 37368F5A074DA0E5075845F76B1AC5858DF793EEF88A854C7DAFE3B90720707A\ 145A5DCB0D9266C6148204CE693C5432 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ 8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ 90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ 6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ 0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ 6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ DAAC83B0C5C8F8FC3BCCD259C27D964673B4DCA790B4B63899E1B6C19CC291FE\ 6F88376281E0FA320ADFADC82A8FF4EF 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ 70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ 5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ 2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ 4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ 27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ 357258FA6579867CC0089C8B3C93CE10677A5AD4DBEEE2A27CEA90317ACEBE72\ 54505468875BCB334E0B6F70CFE59082 B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ 0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ 0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ 8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ 547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ 758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ 06E9F892A2716DE18DAC1B8946604473ADE060AFC8CB1287E389994076FF92B4\ BAE3D84854470ED061AE31A97B7D0DCF 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ 38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ 5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ 3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ 8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ 5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ 64047790B1656E78953B981B1BBFAEAF9D2B1B8953AB0304791238393F3372C6\ 373A1E087B57BE48806229DB73E1B1A4 A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ 3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ 80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ 49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ 9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ 9CA6F39087E6457E12C969D41C8BD66BDD6990CE23D355669E7606B9203D2168\ 11237955DF6739495D94F0C48CE02845 A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ 0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ 639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ 877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ 1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ FE99F19C79A89080E2FF90981DDE91994542D4BCC1276A82D1A2E53850341B9A\ D5422CEAB81E69DAE5E91DC5FF60E1A3 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ 9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ 10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ 8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ 88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ 0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ 2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ 04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ 92E1D994FEA2FD500A4B7F5139119058A5B70EF6174E553F12FE7BCFCA24B00A\ 28391E3761BDCBA3FD6B033C1286E28E 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ 623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ 15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ 817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ 5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ 6BFF1C8405A3FE594E360E3BCCEA1EBCD509310DC79B9E45C263783D7A5DD662\ C6789B18BD567DBDDA1554F5BEE6A860 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ 21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ 0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ 7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ 86B7CC3544E5F91F12A910A56ADDD6B5E7DC7DF51FAECC2FC515EE669B5912DD\ 116AA13052569EAB597CECA922B1ED32 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ 4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ 92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ 539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ 0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ 7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ 2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ E0100D6A02568B244DF7EA67F280AE5D956BE63836B02BBFE8875D6DBED16465\ 582E5B4DA7A67602508C679F0A50EA2D 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ 76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ 4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ 0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ 52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ 27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ 720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ 9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ AE559C732E55C521B7731E9C8065931B93AB5EF16728E3F3C738E7D507B18489\ 388CC3CA7BA01AF672C22CB767C295D2 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ 131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ 808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ 71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ 6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ 74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ 4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ 6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ 5975FA4BCEFC79FADC79CCF1254BBA9EAC252E24C7DEC7EB8972D265EFAD3F6C\ F648C49DFFF5453AD27D62FF867A2F03 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ 0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ 2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ 0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ 2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ 8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ 284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ 584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ 582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ 8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ D8A18FDF0DBC4D9DC9A399EED833D258BDF4E06C50C12550B50297DDA05784AE\ E91F339766021B2CA6BE1577823D920B D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ 13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ 3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ 682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ 321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ 1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ 63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ 21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ 910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ 63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ 8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ 90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ 43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ 4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ 8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ 6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ 9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ 96AC67D6C90BE81E7F5EF052C4CDE52C891F48FE9E387758DA5DCDF13A07F75D\ E17FC03C6137999AB1DE0CE90E15EAD5 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ 73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ 2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ 574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ 298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ 6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ 2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ 8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ 07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ 48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ 6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ 7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ 469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ 6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ 40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ 08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ 665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ 4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ 186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ 0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ 0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ 1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ 99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ 1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ 14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ C3A66CD4EB2DDB42EF85EA0CD65534:\ 3CB4482B4F5FA15B8C240ADE9D99534E8D914A4C01290EF4B9417597431EDB1E\ CE456DC60B26FBD9C88DB5802D1CDCD9 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ 6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ 70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ 013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ 5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ 44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ 8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ 1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ 9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ 9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ 4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ 323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ 8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ 53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ 11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ 5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ 41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ 19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ 647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ 142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ 40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ 40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ 3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ 2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ 94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ 4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ 9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ 561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ 5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ 303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ 2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ 13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ 46B568CE294C89:\ E17A2A660782BD0EB57B463AFAA745F658BD6D073C56F69DEADB629D4EA93C1C\ 3603392DC6D8414527A962AE3477FD34 F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ 9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ 49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ 32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ 2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ 03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ 0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ 685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ 2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ 3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ 0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ 20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ 2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ 3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ 5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ 97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ 92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ 3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ 2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ 703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ 05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ 4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ 99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ 1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ 688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ 1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ 4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ 181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ 00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ 0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ 2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ 537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ 2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ 8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ 5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ 8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ 4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ 9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ 727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ 9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ 3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ 0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ 854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ 813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ 74B19A3CC577847C757B08C2E19C9E9492F8C5A8EB9E983C68DCEF4AD4EE3028\ D2E626D343ED2DBE90906EDCBA513E8B 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ 47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ 7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ 4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ 0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ 4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ 22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ 52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ 7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ 7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ 204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ 07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ 5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ 56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ 6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ 15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ 259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ 5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ 317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ 5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ 504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ 32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ 85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ 3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ 281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ 6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ 82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ 8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ 0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ 2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ 1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ 265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ 5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ 4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ 092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ 0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ 29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ 3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ 49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ 3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ 26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ 5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ 91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ 42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ 228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ 5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ 25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ 2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ 688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ 7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ 3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ 7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ 394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ 3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ 8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ 09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ 5531A34D8565A94B7357BA7171AE7EDD1E61ACAFC1747DBAC4D4C022B8ACC664\ 9C8E44EC2D6455E623BCACF10C3915E4 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ 6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ 26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ 9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ 0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ 32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ 221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ 36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ 2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ 72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ 83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ 0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ 3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ 6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ 210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ 889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ 123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ 71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ 1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ 6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ 3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ 57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ 4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ 2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ 6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ 0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ 31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ 97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ 4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ 75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ 40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ 80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ 15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ 5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ 16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ 278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ 59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ 97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ 806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ 01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ 78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ 29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ 31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ 320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ 908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ 369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ 966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ 5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ 76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ 847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ 950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ 30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ 89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ 5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ 9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ 735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ 64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ 25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ 2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ 180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ 9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ 120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ 07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ 6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ 4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ 7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ 57795DABAF40687B2CDA7A5014168F:\ 978A5C74CAB4D5B773ADF64CABEC0DE036D087E041F6C1A985530C2250D283FA\ AA7FFAA0142588694E67245BBA56B9C8 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ 2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ 6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ 5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ 78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ 0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ 273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ 3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ 6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ 1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ 8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ 0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ 98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ 048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ 00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ 8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ 4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ 7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ 63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ 54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ 6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ 3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ 50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ 742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ 2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ 79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ 59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ 4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ 7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ 5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ 0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ 9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ 05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ 5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ 3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ 3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ 9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ 6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ 60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ 6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ 1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ 1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ 7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ 37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ 42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ 5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ 7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ 24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ 0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ 3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ 44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ 3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ 5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ 1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ 4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ 1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ 14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ 0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ 78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ 2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ 131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ 8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ 8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ 455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ 69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ 7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ 39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ 1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ 545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ 75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ 38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ 090FC9BC045271:\ DD29ED9468BB12DE8F9CF64AA766B04477D659F032746AB4D09D56A540DB1A3D\ 13F7C91B27FCE10C4CA8466F4A06C2C2 [Keccak-1600(512)] :\ 0EAB42DE4C3CEB9235FC91ACFFE746B29C29A8C366B7C60E4E67C466F36A4304\ C00FA9CAF9D87976BA469BCBE06713B435F091EF2769FB160CDAB33D3670680E CC:\ 8630C13CBD066EA74BBE7FE468FEC1DEE10EDC1254FB4C1B7C5FD69B646E4416\ 0B8CE01D05A0908CA790DFB080F4B513BC3B6225ECE7A810371441A5AC666EB9 41FB:\ 551DA6236F8B96FCE9F97F1190E901324F0B45E06DBBB5CDB8355D6ED1DC34B3\ F0EAE7DCB68622FF232FA3CECE0D4616CDEB3931F93803662A28DF1CD535B731 1F877C:\ EB7F2A98E00AF37D964F7D8C44C1FB6E114D8EE21A7B976AE736539EFDC1E3FE\ 43BECEF5015171E6DA30168CAE99A82C53FA99042774EF982C01626A540F08C0 C1ECFDFC:\ 952D4C0A6F0EF5CE438C52E3EDD345EA00F91CF5DA8097C1168A16069E958FC0\ 5BAD90A0C5FB4DD9EC28E84B226B94A847D6BB89235692EF4C9712F0C7030FAE 21F134AC57:\ 2E76D93AFFD62B92FC4F29CB83EFBE4BA21D88426AA7F075BFC20960EA258787\ 898172E17045AF43AB1FE445532BE0185FBEA84D9BE788B05F14DBF4856A5254 C6F50BB74E29:\ 40FA8074E1E509B206448FBE757D9494B9B51E8D6E674A67F53C11EF92E96C3E\ A08B95EBD4172B020010CD6CF29539A34D6BFA002A2042787AA8D879A0F5B54C 119713CC83EEEF:\ D1116786A3C1EA46A8F22D82ABB4C5D06DC0691B2E747AC9726D0B290E6959F7\ B23428519A656B237695E56403855EC4C98DB0CF87F31B6CEABF2B9B8589B713 4A4F202484512526:\ F326C7C126DDC277922760FEEF77C9BAB6FB5D3430F652593703D7C5E30135CD\ 0B0575257509A624184330D6AB1F508A666391B5D4690426B4E05301891DF897 1F66AB4185ED9B6375:\ 1F5B8A6E8D94F5E2535D46842B9CED467C39C2DB323963D3F3D937E9DDA76FBC\ 17072DDA2AB4771CD7A645145A2AEC1B5749BF9EFE0CDE006CC3EF8936438E0D EED7422227613B6F53C9:\ 2AEEE7A720C030A820CD7BAA8570D72CB90B7A238C38C358676358A7AE9A5CF2\ 6635B2320D61C1284899E654F0BFDD0A3A9C343FFBD11838B57465E6C3AD3A57 EAEED5CDFFD89DECE455F1:\ 7B1C1BEF3B4DEB4B4812C81A6E7B3F2C66FA95157FA3B9D2959DC56B8ADD1001\ 70D3C8D1745FD230A31F89FA17889C4C58946B5D746E47B71ED0394B66D1BDB2 5BE43C90F22902E4FE8ED2D3:\ EE41401AF509D6FC0944CD4A0BB29D2DCE0DCC862606E669E31381E5D6CECB46\ 3143645D696D14E40169CDC71C75686D6E8732B432092626421CC6CC196F80BF A746273228122F381C3B46E4F1:\ 9B53B410B9F5DCE90A77244DB407A3D0F4898D112D0044A8F66AF933E26666DE\ 63EBD2A4322D8FE525AB354CE9676B6A14D0CE6B3D24E6CD5832BEA0C5153CEF 3C5871CD619C69A63B540EB5A625:\ 2B53FE6583FC24EE8A63801067E4D3BD6E6934EF16BC822FC3A69F4EE13A404D\ 9A3CE2BB4A12C77382BFDE4D843F87FD06ED8AECC234A3A24CEDFE60BFC06933 FA22874BCC068879E8EF11A69F0722:\ 80946CA68E8C16A9667CD8339D1C5B00F1E0D401D0ECC79458754794838F3AE2\ 949A8CC5FE5584033BCA9C5BE62C7C08F402EF02F727CEFA43BBD374C2A67C52 52A608AB21CCDD8A4457A57EDE782176:\ 4B39D3DA5BCDF4D9B769015995644311C14C435BF72B1009D6DD71B01A63B97C\ FB596418E8E42342D117E07471A8914314BA7B0E264DADF0CEA381868CBD43D1 82E192E4043DDCD12ECF52969D0F807EED:\ C37C9DC2E20D8E2F0AE588D7D45A807CCFA000FC948AC42A8ED63BB14F318FC3\ D4B963F7305980E6A0FD2316B55B63142373B1A29002264855C716C5C9F17F4C 75683DCB556140C522543BB6E9098B21A21E:\ 9073C62555E6095F17DF71AD02BABB9100288633898489B21C906A3190875BAE\ ACCC83BE80ABD11466FEC371BA2C4623D07F0131DEFAEC13A8C732A9F8417163 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ 23E9352856718E1E2D68A21D56D93117CED7628E984FF04ED8C0CB9B10539E4E\ DE284F94FA71BF4B83BBB493435FD6BE26EDDB09DEAC39680E6B05ACC87B8C4E E26193989D06568FE688E75540AEA06747D9F851:\ 909D753426B1DEE09FC474F18CF810D5D5AADBF8A09AF495BF6C22ACA0C67302\ 1BFC5D2AD94F50B24E1569E956694B21CF2CC8B4F3C7EE4CF195E4424CC415DD D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ 046C6019FC4D628AE0DA7092F9910F269B853D3B57052039AD1375C665405F9F\ D79D57579F42C4FFF249BB85AE65113A9F4276CEDE73E9CCB0C24753935A006E 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ 51C909A6528949BADDAF1BA0B154EA9C33FDE5074359505B76D4B7ED54352DD8\ 93D40B142A5F802F378CBA7B8C3782ECF2A048542BE6C5936822214846A8D5E4 A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ EFC8917E1247742A2D4EC29AFEDDF1E6ECE377B3D8AC6E58C9851CE9C99BD599\ ADEBFED657BAACD1793FC91B04DF2957BF6F1888869286002DC4AD9AC7F76793 AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ FCEF88BCC7EF70D8C3973429AC5139155F9BA643B431013F1817ECD2FF3AB287\ 880F9EA54DF7503CB3F73D7CF2B87D2E9BDBD203378FAE74CA4BD2667A4AA706 AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ 470BDD8D709875C8E6F88591B97D6486C5F03B54BFC905757483E013F63A6C56\ 984D4518D45C2D2298EADB44AF3A0C35A76B573D452F5747844D3AD8F84A2E85 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ 429FD438B390AD0224028975467EC228F9ADCDE71E1738005E3717C58F727AA2\ B7C61780BF0C5F8B766CC6D34551D87D22A130B8C215614204E607AA82FF8469 FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ 790A010AEB6F13E019A1DC35574B1219E74FF5DB6FBD8746733664FFDBCFE1CC\ 6E8AB39117E3244C4FA3C0A962C9F50030AEF88E193E7E0D4C4747345F30CB54 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ AAF7A391600270F7B5A2A3BBC7474AC4154EBEAC03A790A57FDAD96CEA2D043C\ 9FA5F6916790B92F8032D668ED9A07112DC5B2373EC816AABCA6F577CE60415E A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ 3E2880A974E50F98BD6CC0F9D769AF348CE3B7E8FA38CF0CA2DA5FD704C9C0E5\ 7D5500BEA3CB7477927F9C394AA3F9BBC01824350291B9A0A0CBF094BB37DA55 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ 48E55E0340F20466881A732AA88459AD4BCDEF364C3BD045AE099F953D89F159\ 57AEF204265C3915BA42FE4235196BE3D0F564676227C3C0DEACFBAF68F9E717 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ 9D8098D8D6EDBBAA2BCFC6FB2F89C3EAC67FEC25CDFE75AA7BD570A648E8C894\ 5FF2EC280F6DCF73386109155C5BBC444C707BB42EAB873F5F7476657B1BC1A8 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ 1EAFEDCE7292BA73B80AE6151745F43AC95BFC9F31694D422473ABCA2E69D695\ CB6544DB65506078CB20DBE0762F84AA6AFD14A60AB597955BE73F3F5C50F7A8 DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ 46:\ 9A7688E31AAF40C15575FC58C6B39267AAD3722E696E518A9945CF7F7C0FEA84\ CB3CB2E9F0384A6B5DC671ADE7FB4D2B27011173F3EEEAF17CB451CF26542031 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ B5A0:\ ADA5CA5630660003C4D16149F235FAEB78132F7F773A631F820CC5C654B08EAB\ 4206BB4EA1389D1CF74D3B60B86E484C90C817CDB5DD5DBF327163B4646F7213 B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ FBAD4E:\ 71A0801D32587980B09963A0F547B8B6EE3BADE224671BF44F12E3DA4F21778B\ AC37FCC73EF45FEE1C96688BAF9020F487B1A16E3AC91B504845D6FBA879134F 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ ED2C2492:\ EBA678B7A0E5669DC7FA5ECA5D5F19FE625E113E5028DA5EFB138923CD444757\ B06078E0BA064B36C72CA2187AB9DD31DDA6F24668F46C32F8EC21AC59AAFA24 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ 6B2EE4E542:\ 12DF92D889D7BA0DF05BCD02D9DE58C97F4813126967FF78BDF759C66C4CBE9D\ F68AB31A0256C776730BB25DEECF91F0997868AC8BB86DF7A0FC110CB0A4DE5D 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ 2A1493D8F4FB:\ B8C7CE2BE4CB32C140E75B75474248C1DD77D19B0CBCA31A3ECC2A35C532E4FA\ 3ED4ABBCDA27AA68A9DDA06B245443E5903A65652A94ED3AF15065D3E7736E47 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ 30A934467DA4B0:\ A0AE9DFB56831FE4A3223C501B697BD8243C471E8343ACFD37A6B587FEAC7457\ 1C23DEEBC9B94A540A02F1B1E2251E01229C9D58C4279F155D5566FB18E81295 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ C0308E29446B8ED3:\ 631E7847124A70FE6EB293A44A25C50600B5E7E975CA9FAB5AE64AB86C7E42C9\ 12DD6EC093F01A8DEBC6E1F5E487AF97DC3FD6C53002765050BE963FFCD4D989 C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ 723B20F67BA610C2B7:\ B989263BB4E0424F95FDC9A49C83A3769FBF31DCEDDA7E005AB5F22F43D2718D\ EBD39085971F7EB7822C9FA0F67F776CEC4E35A9A8B8C835EF4E9EBDA1922E4D 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ 0C834CE6EADC2BB86BF6:\ FF6ADCB9E1546798D396DB78452DF1A375B65EE3D54FCC915A8CA3DA693E2493\ 1999B0FC8A4EB92F6FF85E42BB4CFD9CE7D7863EEE709C9EF37642B696174474 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ 1540D29BA27AB8E309A4B7:\ 1051B7FF77274B784E7FB7823E756F0C4355047E489775BBEDAA7CE5A75EFAC3\ 31492C016CE02EB2BE8BA2FE6B735B9A1484E73AC06DE573C5D0B4A58822A36A 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ 32B58EBC38FC2A6B913596A8:\ 5639A2824297CA099ECF2A81EEF1753F6314CB663D860F05A39E3E801FF82060\ BBA10628E2C0D9E0A84DD05ED637FC0B65BA03BB66E46FB256F2A5B28D3F41D2 F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ 38467205F5DCFB34A2ACFE96C0:\ 97F9D642507E6DD179D56F4B815E92D0D486826F273EC711B8F9CB76AFC79F90\ 0816FDBC13DD3A59FBECBA1F3B6953F879F27C8987B24C6FF8557A2C834076B9 CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ B06CF0F5A0EA15CA907EE1C27EBA:\ AFEF2AF5A01B89BE190A0E6E796AA51F1F8C356772C6FC7731F08AAB8BD81AEE\ 1287C70D564F4F169E37B07F28202A85F468281B4CDC1273CF61EB30E3BDCEE1 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ BCF84D0D4726364B9BF95AB251D9BB:\ F467CCA67C387FFC9F1B173A084C451095D01AD0BF3953AC103A76F0F1BC8616\ 7305A926A941A53417F1611A505AAA205BCFCCBFD343465DAD8A6C1E80609A9D D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ C7F157298EABC4DCE7D89CE5162499F9:\ 4B389A2A0DF5E295EA9444F2739B5492F290C4467B0B4CDC1CC9ED2CEFA7A9E5\ 27E0627CDAF0BDA58F17D13F94AF7D2DEFF6FC5D53DD9157674475527FBB4F86 BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ BEF788CDB5CF4606C9C1C7F61AED59F97D:\ 6590FFFB7311AB7DAB370FB518CCC19BAA9AF7C84179ADB002F8FACD3C44AF28\ 30A84DF1E2C2402368CC36614A6EA22903063E57D00EC511A46A9A03FE3819F7 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ 86E779CF053C77785AA9E692F821F14A7F51:\ 895796B2A0824C55F030D82E794925C38D8459F38CF848519F120FF6A9D5A03E\ BF006C3EA5021E8F3B3408FF12F01BCDDF7A085BA0A9A58944FEC1F554836DF8 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ 43304FBA401EFB2BDBD7ECE939102298651C86:\ E4BBD54BFB99D345471F8AB94271B4B748F5CE70C21C28AE6559E03EE7890A2C\ 814043E624A6BD2944350756B37FA8208FC7473A67B310CEEBC17D965ED688B2 C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ 87D68D28CC3897452F6A22AA8573CCEBF245972A:\ 80D862AD05428A299213E65B50310463FD22C505E693DD4719E0A120EEAA35C5\ FC1608A08D22E2CCDDECA49878BC26ABE55A3C9A546347439A942ED0C1A6A23E EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ 22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ 021B3B392DECCB9075559F88C0C229026A2048CEF8EEB2D4F94803DCF2DA0A73\ E004D7F14E9FD662670B59229AB3883C340F4E3A8C42624CCB90BEC1156F95D4 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ 97BF33A5254C8ACA27486428440B1034AAAFAC8B498ECB830C2581DC68518079\ B65FB0C595997693DDB8D68D9564EA98DC43CD287E2E018DB7DFAAAA205C547A DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ 9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ C05FD9C3FA73F80956FF1C3B89160EB520CA640E201B3FE5E6E296220E81B59D\ 530476010D3784CA08692B8C716A3BE982B37450A96D30A401D3BA3C390D9DE3 EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ B980E657C13726DBADB6570EA3A9E633869CADB798EB35C482697A04CB712F1C\ 1E8C5D0BD67E43E52DA294E82D5E80A695A74A3D27C0C672ADCFE2C928859A6D 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ 97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ 6ADFC561835FDDD70A9FEB57C513165D12AEB3283F0DD7774DD58852DA9E969A\ BDAF20DD44856FA60E11BDFA2DBB7E3347669FFF7A57A8D8D37431C2B309972D 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ 0E7459BDC857B949CC59A9C649B9625268BF9A11EA81EEEFA4ECDD410E2F6FD2\ C78289C01365F99034FF8FA8C115DDCEBEFA26A8D6468F5030E641745950061E 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ 66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ 2A8CE9DF40879B24DADF61C9131F694E5531ADE6B7AB071CA10ABDD3C2E4A22C\ 868A52986A329F880137EE76109770927D2658E63EB486D880290AC0782CF5BF 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ 4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ A83CE5A6A58376D57DB4C58DA1B46C131FF1BF8FF2DE5E8617FB37E5098398ED\ B53F9888B8752A8AFF19178F2F6BD7A33FD36C59E4A631906280907FC1C5AB07 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ 9EBFCEA2DB1676EEE6B103119543C6049DEBD8FB8F1E01A5AB5B348E2919E14C\ 8CFE8E542F2AB747B0FD4A4C3EEE4019BB046E24BFE2091FB9C65DCA527B71AD C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ 30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ 97B08BE7653E9DF1B5AFA459EA750A3AC9BF3577BCC7E5344FC861184880926D\ EF354E4C65B20EC66C47B7AFFD3E7493958BAB0A90724D3D8DD9E1D561FA60C2 F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ 05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ EF8AAF08159BBCB88EFAC49A33A5248B7ED0544960D8DD54D748A91C0D84C69F\ 308BB54CB5EC97D3F81CDF76E68E0320815B93F2A00942F2168CBC18E8377708 E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ C0A4D8DCA967772DBF6E5508C913E7BEBA1B749A2B1AC963D0676E6F1DCD4EBA\ A3F909EF87DD849882DC8253347A5F6520B5B9F510973F443976455F923CFCB9 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ 00:\ CF03C946EB7022F60FB5439462AC22684E47EAACBFFE19B797760B4A24A5238B\ E9D90E17D40EA6FE7B2885CEF7DFB8BB489401CAA94F2DD6E04592E33E76B9D1 FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ 37FC:\ 2C35F1A57A17CB29403A2B40FC307BDE10BA8F7FEC7B94E1E42EB4EEB952AAD0\ 0EC46A26646CD51DB0C6B238189D7D470E21C29BF8710423CB5602CAB75E29E7 ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ 2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ 599BA5:\ 505E6E607C90C57BBE7CE52BB42DF3D90BC32DE554025730C84ED0F89A013288\ 5D7A40FADFF7A4B01DE4D29735AEFE0E0469F4F172B62A0DABA889E152308FC4 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ 479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ 40706B05:\ 7BE2C95413C589EC5AD69F8D80BFE9F26540D5C1832C7A49A31A8F5655D9CE8B\ 47D97C69CCCD693C211904142A5403DA7AD09FBDB825698FE201988FCCCD2BB2 ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ 29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ 31D06C77A4:\ 8AAC9201D76DF13424A32552F04390E499B6168711B70C875789DDAA9B115F8B\ 8259A60D17835E2587F8901C3CA782DA9AFB28BA87B9FCBE05A47A42F48FCD48 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ A259FC4FBD72:\ AA52587D84586317028FB7D3C20892E0288BFE2FEABD76D7F89155FFE9CCBF1A\ 09FA0FFB0553E83F79AE58BD30A35FA54892B6ABA0093A012427DDAB71CDF819 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ DBE5FE9694AD6D:\ 48FC282F37A3E1FB5DF4D2DA1F7197EC899AE573CA08DF550E61EE847EEB1D24\ C074FF46BCAEE224EC7D8CEA4256154F0C4D434E682834F6D827BFBDF75112F5 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ 7EF57B91397AA8A7:\ 6B4B0F126863552A6F40F45E295DC79B9BA2A88EA7C3B2F607AC1A8431A97844\ C2A7B664443FB23C05739DF5494FE9824DB80B7F3E67872142F17E2C5544E1EF BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ 7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ 44B78B2D48DE1A08AA:\ 7EEC7B730056B1BD4F6FFC186FB45591E50CD93CF6E4FC958889F82D3F32C5C7\ 4D03A4BCF7D2754298F134698AF4559B0E29BAAA365CC00DB0D51D407179C56D 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ B3A6C9FED24D70749604:\ 79CB925ACA072EBB3B49A9D0E59BB07DD1C223C1F26C91768B929472C51B977F\ 85C6CEEB54BCE89CF9FF6155D7FE8091540F1348CE9592A6403F92105477870E BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ 8B033F77D384CA01593C1B:\ B5D1ED8F039044BCFEF41E99B2F564F45991B329B503FC91FA29D2408512F871\ 1E9DB66F8AE172164650545AE9E3DB32AA369EC47E81A77111276E6CA38E4D92 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ 013C23F1E9611D595EBAC37C:\ 782C008A9EE3DDA0A182267185C995A2AF737BA8CB2F6179F2CDF52505F8D933\ E712FC4E56D10E175EC8CDD62DE6529CE1F078BFA0DC7A5284F8C565182F85D9 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ 9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ 4EC5A49FFDB59A1BD6A292AA0E:\ 91A0241EDA8CA597CBB0F703AB7DBAAF859CFF77B20401AD46230CE3B2BEEF66\ 85775DE37576014D8DA1BA672D47AAD95FB53C590B650634CEBB43A175738569 D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ 498E1F6C82C6CAE6FC14845B3C8A:\ 00B02DBCB7A3BC117701F2F159FC4492923C437D3369833A9BD09E78E260D48D\ 37168D36C49777B2E68E6FE9846106A6AB8768C3971FAB31FD922AACB87D1CAC 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ 88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ 5B01FECFC146BDB251B3BDAD556CD2:\ 3DEDF819B357DFAB1C7092ABD872A1554DD0962E9944EEF9F7F8BCE830F2D74F\ 1D9BA2B748BBC6EE0B7600BE8CB0FFCB79924D9F51CDB9B06BD6FD37F3050229 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ AE9CD5CF0991878A311B549A6D6AF230:\ 5FBE194557B0426F96BA60712176DF073EAFE04F2A50515455412EA3D80C1167\ 58AD952598F48031612181D82A16EFE4668FFB3BCCE9563A772FE416FF6DB3B3 E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ 105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ B50C7C681E773D109FF7491B5CC22296C5:\ 2E8AB1619859C11473DC7C474CE8B0AE44B1C38417816FD95B9E0614F31E51EB\ B1DD16D1CBB584C4EBD28AA99F4A68E09DFE3AD462487F2608124B7528293045 E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ 190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ 2C7CA303269ED14014B2F3CF8B894EAC8554:\ DB2D182BDBAC6AC866537E24712332CAE74DC3D36168982E4453DD6E00965834\ 5255013BC0A54FCA17AEEDCC4BEB79BDEE192CFAB516D24591C8699F7C758179 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ 1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ 90A2C05F7001D985B587A046B488BF4ED29D75CC03A745731B5B0CE51BB86387\ C4CE34018A6D906EB7BEB41A09AFE9FEDD99AACC41B4556F75229C8688C7FCA2 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ 8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ 37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ EA3991C4A8A5F0146402DE4AE235054C78A48DCA340A7D4AD8753995F82347EC\ FC0054D64EB4F20ABC4F415C54701CBC61A7B239A7C221B833D9EA9F94B154E8 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ 85EA51D49894E45BAA3DC707E224688C6408B68B11:\ 1313023B753ED1727F13CC67A64B989A8BF6548324DF9854D8D5A963ED3D8602\ 57FE6522B9C6D6CB1BCADF322C985601BA36F7E67110192094AA8F9869A458A8 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ 8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ 04E18D475920CE828B94E72241F24DB72546B352A0E4:\ 9BCA2A1A5546A11275BF42F0B48492868359C78D94785A0EE12DC1C3D70A8E97\ EB462148FAED1FFA4DAB0E91519BD36C0C5C5FE7CFCFF3E180680318E1FCF75B B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ 8492F5E621E82FDBFF1976B1BEECFF7D137805B5736AB49216122A95396B863A\ 0481212B6DABA8B05E29E287BB0E2F588F86407C84DBFB894E6ACFC6F6B2E571 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ 578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ 44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ EEBE4EC0FE3E0266527F4D9F57A017637EAB92377D82B15856A55A22B008DF67\ F27AA5AC04E1DEEEB2C819CE41DB07DBF6DCAF17A192A4371A1E92BADF1E6389 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ 4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ 9E36E6291BC2296CB4BA71109CEDCC2A3F0B4F1AE5E5406DC4B3E594551D5C70\ E6F814D2C9B8413103EF07535886B4AC518AAF7AED64ABED7A5B0A26F7171425 B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ F1089483A00B2601BE9C16469A090EFC49FCB70E62AC0FFEA2D1E508083CD5D4\ 1DCF2DAAE1E0EAC217859E5FEADDCB782AC471C01D7266136185D37B568E9606 CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ 5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ 27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ D063EA794CFD2ED9248665A6084A7B99051C1051E41B7D9DCB1537A1C79CBA6D\ EB4D844C6A618E43C7CA020D16976999684FEB084616F707209F75C4BD584D86 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ 424A86D746C87C85DABD1DAE298A488E4CA2183DE692D1D01C4B7994EE5124F9\ 004BEA84933C311CC38EA6F604A7769EE178E1EC160A9891C42C462A13A62286 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ 29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ A9403C26A96DE2C3D359EE29F3FD1C581154852D19AD12884B79E7082D2DA22E\ C83553BABA2BDFF2A2FA15947A8E6ACD5F5D113EC091BFD1962A0A10401D2C98 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ 650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ 3D23632EE4C2D4F4118A02A677B5A32427C72BA54899BA2E6CCD22EC3DEFE0FC\ B052E3F83D35786CEA2080EED148A0A94628E735202E6B2809994C5F5BDAFDD6 E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ 7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ 8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ D8FA886884CE577A7282DECEACF4786E7C68FC69B141137FF5DC7CB3C5F8ABC8\ 45716DD27397E8BD5CE245107A984A3F8B21F19F99ED40118621DC85303A30B4 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ 1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ 040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ C768CD313602FABB2193F9EDBF667B4CDABD57D5FF60BDC22BA7BAD5319EA04E\ 7CBEC5D4B4C4560AD52609FDD22750B618951796376ED41B2A8EAFFDD9927722 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ 0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ 0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ 49:\ 8562CE9399806623B2695712266AF3D4C14F77D2449143379246962C22398C81\ 3544A7DEE4C4847F09D3CBE437349B7FC6738AC97075B5DD9E2ADD6ECAA610F4 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ 0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ 2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ 5B52:\ 99ADE7B13E8E79AEA6ED01A25E10E401CD1D055884575EAB3E66B2294F03F8D5\ DBF72AB1AE39103189383EBFD2E43258510C124A894A793B206FAC752C035789 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ 89CCC1:\ D12831BA39DBCD41F56BC7FC071BDAABFB6E7572D08B2FDA3BDDFC6FA5662F4B\ DBFA431CA2E38B18172709072E50120DB6BE93E86CB4ACE3C11DD0E1F3F5C712 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ 14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ 22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ 6DCBB4CE:\ 527D28E341E6B14F4684ADB4B824C496C6482E51149565D3D17226828884306B\ 51D6148A72622C2B75F5D3510B799D8BDC03EAEDE453676A6EC8FE03A1AD0EAB A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ 7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ 881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ BADF45685F:\ CACDCF8BF855040E9795C422069D8E37B6286066A2197A320BD934061F669952\ 27BE6B85FD928B834D3CA45E1AC3844D9DC66D61581E7799CCFDE008639AB3DD 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ 312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ 96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ 9B62C60A4771:\ F454A953501E191A12A80C7A5398F081CEF738E25D48B076A52F77FB09EF0BC2\ 325116020BB06C2C585DA9F115BD9D8F13B50E8E1FB1664450FAE690B7783400 F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ 9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ CA58D5DAB38ADB:\ 5F968CC6ECF71C588A3C3BA68858BBFF96861F66C0733FD61FA91A479A49618D\ F22D9490219DF8008DC78840AE022C5D41AF2B890D0214E562DA8DF0CB3F8522 E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ 21691E1069413848:\ E7149461F9CD00B71C216C50041B3EDA9707D7360D4C21740C44C212256A31DA\ 398FE09708E450EA4E2826B7EC20BEF76CD2FBD9D096AF6F77F84ABC2E4FB093 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ B57D6D0C2EDC4E78D6:\ 77097413CAA5A2D38259D47EC078871FA09EE5614D4C14FEB7A95C921C0AAE93\ B8737A6DC89E57693BE8A0710206664B80B657A1079605A0FF9664BBCB0722D6 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ 8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ CD19E781AF20454AC880:\ 55D8E5202360D7D5841419362F864CC900E11C582FD0CAB2FF5F1680F6CE927B\ 5379E27A335EBAFE1286B9D4A172AB761A36EADE60F10468EAC4CEAFBF63C7CC 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ BF0FE3C32C17AA188A8683:\ EFFB03B497ADD6230A0ED99122EA868138644AB81E861491E526FAE37C39872C\ A731804A0004599849478A787BC7FCE21903ED551D7DB881D2A2C367B6168547 F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ 0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ 2E937F21C005F17411473041:\ A2269A6EF2EA8F1CF8BC3394D27657B0DB996C55E7C47784C0B451202FC52796\ 79D79E06F8DBAA9A63665FD0E914D13C6E056EA006DAAF4CB61D2629468E3D25 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ 62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ 2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ 29F695815D866DA99DF3F79403:\ 5A2970D5EC346A8E4E1D5D1E57DC22F6875DDF1CE3626B49A91109E0DE991033\ E932F883B6A795016D5014E268304ABE2F7577505AAB00956911781F075D113A 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ 84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ 3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ 1BB15B447589E86E8D76B1E9CED2:\ 2B4356A64DF31936B27F4530F076EE73E71E4E48ABDE04FF1F548E0727F4A581\ 0B71874187FD96ED510D0D6886AF11960A0B3BAD1EE75DDA4CDC148E162EDAE9 F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ 4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ 853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ AD3D7E886DEA4F005AE4AD05E5065F:\ EDCB59984267BB00402A78F2CA345EF2494956172E10927EE63AFF23D0C834BC\ A50C47CDBFFD8995036307E9ED4B143E853450367D0E14AFC8490073653CD850 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ 7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ 68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ EAABC35F5C2B0A0F2379231953322C4E:\ D0B453FBE709C69125DC8FE9E8AE9245211612970373B454F8656A755E8435B3\ 21DD3A980FA28719641747E254DC42C9BF012B4D6DBD7ED13020A83B44C504AA BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ 4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ 2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ 159388D5C3277E227286F65FF5E5B5AEC1:\ FE97C011E525110E03149FAC4179891AFCB6304E1CFD9D84CB7389755554EE72\ 3571D76B80B9333A695884192340B3FE022D4A233B7AA8E8C7686745CFE75E67 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ 407847DD0DA505AB1641C02DEA4F0D834986:\ 1BC4AC8D979CA62A7FC81C710CEDF65AF56C9B652EEC356AA92DA924D370FDEB\ DF076F91BA4FE1EC5CD78FC4C8885EA4304BA2E8E64944AB4BF4D1B3D7DEE745 B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ 33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ 99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ 7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ 76E970E9449D868067CD23B1A202CBDC99693FF6FA74BA644EC41CBF8FD139CB\ 0F5D1106FCD6C871C315FF41C3EAF99C636288F0FCF6A40B480CB881D87E098F 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ 2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ 205AA1615DB44057DB991231D2CB42624574F545:\ 871666B230C5AD75B96D63BE22870621C68FD0899655BA7DC0E0E5299915AF25\ 2C226DD7217601D3A6880D55EE5A20B10820E21C74F730EEA9D47FE26DEBE006 DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ 2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ 157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ 7E3EF62552B28A2B18A71CEEF2DD8659C8BDF291385AD02FED353775E01594F2\ 7CC28CC78663E17CB8B39FD4EA48D494AD0BD7AEE9277EC9B21E46523812736E 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ 0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ 0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ 3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ 0B87F6EBAA293FF79C873820846C0FCC943E3A83BD8111931FF03FF3B0BF785C\ 961CA84CF3FD40E0D831DBAEA595498FC12DA88CC507DE720A35C01D73FC9595 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ 46176EBF044C4784467C700470D0C0B40C8A088C815816:\ 681BABBD2E351501C285812E06F20940FD865516CF028B4787D1FFCCD0D53770\ 5E8E9B73C608D5A8DC4F08EEE0902AC12936DDB8C7B29228C6AAF8D0B909C30D D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ 91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ 1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ C46D2262F186421D07FD740F922306D99B1E3826F6A32486BE5A91DC298F177F\ 50915E17EB4EA2E45494C501736CEFB0E22ACD989DA41AC7BB7BE56B04BFB5E1 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ 1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ 285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ 6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ 0B3DBC770332823E686470D842104D3B3C1452F64F1BCC71C5F3FAD1C0D93F21\ EFBD48D73C7D4909227B06B06D54057A74E03C36D9C106EBA79411F1E6E1CFFE 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ 27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ 9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ CA46276B0DC2EC4424BB7136EAE1AF207BD6E5CD833691C7D37B2CAEAF4F484B\ 96A3476FC25FEB206AD37CF975383DD522CA0CC6200A3867FEE7F178D6953FEF 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ 815B44668BF3751A3392940FCA54C1E3E4EF5227B052332AFE6EB7A10AC8AD64\ 38CE8A0277AA14BCC41590F6D6A10B6B1BABE6BB4F8D777EA576D634B0BE41C0 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ 8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ 4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ 47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ F47799A8547FC9C07D0F808029E7335607D72224BE286E118657BD13A2C51D03\ 74426D9EEB7693BDE5EC6181574C1404DF29BF96941862BA1A0A9A5903319498 A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ 2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ 8A0AE12A9E797FB7BD46CBB910076A32873BFFCB9AD98B4FC37316AED681EC49\ C65ABBB9586405FF96CC80DA4BB8FA73BE1BA9E737595B2307CF369D61BAF59C 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ 5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ 4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ A3C6D58872BAFDEDFDD50C0309089240D6977D4D3D59FB3F2BE133C57D2DFCFC\ C7C027296F74FE58B2A9A6CB7E5D70088934D051CBA57001FE27965CFA071A6F A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ 07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ 6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ 11E0E521B55F02BEFC7207C06444FCC0C16DCF6F34962921B709A322F35E2193\ 477B0DFA21F213F209705FF3958531A75D94346075FEB29A288B62E2315AE270 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ 29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ 98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ AEBBA57C8ED5AF6EC93F4AA45772FF5167B7EA88DFA71364F37D8FC5FDB7DC3B\ 2C8331A08023F21D110B7D821E2DC7E860826235E7E6291912AC521384747354 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ 3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ E2:\ 2DF1E09540B53A17222DAB66275CEBECEB1F8A5DB26B0C41F955FA0549F3367E\ 82299E0CD673958AF7DFA04D741AA63BA2C1AD351764DC9228D215F22C24CA58 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ 1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ 3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ 52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ 61EC:\ 8299CFCEA5F00C93A5EB8A84A13628A68B26796D53FB6A986C95B0B1C248920F\ B946D8AF98343D14EFC74A4611C53CCC27C5F14C7237AF28364346CA5CD70D1A E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ 9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ 2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ 609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ 9B5EDC:\ AF57BEA357FCBA0579C4204C0F8DFF181BC8A473014BAE78DF76069DE478B2F2\ A390327A65BDD24BE926551C78F70B0D5F1C8F4B970997D557F06336A315A749 FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ 63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ 42D75D68:\ B299E421061EF26C32BB4F50EE669D05FEB2CCBA3297289C30E6434057B3EA7F\ 617BBBF7A5555328FC291F794987577F458350DF99AF3A5778300BE0BD80164F 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ 7815BF3C49:\ CBDFB0D0E720F87259DD0D0B4E9C5319E7F88AAEF7F7AB2FA1CA639AFA016082\ 2F96B3C357A4894CE53CD713FAB23AD052E8565FA3B3A523CB9CE39A6BD535CC 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ 61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ 025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ 951CB2068CC6:\ 059A181C83A22BFF0AA9BAA22D872BDF23CBE341032CF0BF57997A4A1924D24F\ BAE9DCA14B6D290692B6A6B6344CBE531734F58AD0224C6E39BD1E87F870AAD6 B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ 93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ B0FED6A8052FBB:\ 9EDEEB10EE1B7BB8F16A280D8CC3EDA5E909C554419DDC523B69ECEDF2ADF3B3\ C9BC66FEF365342471C458126F083A3B8E7C0C9D9D77E9F90196B71F9AADF492 B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ 35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ 780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ 015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ 37674C6F8E380C04:\ A6054FFC3D81591BE964C4B004A3A21142365B59EE98B2873D488293F93A8D71\ 54BF72100012C60D3C9418F6AF8EA66372CB4703F5F6381DE6D4B9B98CFF1E90 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ F22DA873C601016A0D:\ B0E54A12FDBA0738898F1BBF0BA81F81DE77648D8D14C20BDD5D90F300D382E0\ 69F5DBA7EEC6B23168B008B9F39C2B93FD742A5902A5E02728F57712D6A61D4E 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ 472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ 994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ 1373FB09A1A6E3C7158F:\ 3CE96077EB17C6A9C95A9A477748876C6451098DBEA2B3261E6D75B64A988E1C\ 75D7EAC73BC2402AFC726543E2A5BDB76689C0931FF762818DD2D3FE57A50FA9 FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ 084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ 339612E830E9E7A9C29065:\ C9ACD6D98A349512B952D151ED501562F04EA4BB4B8965812510B9B842531A2B\ 41A0108AC129CF9C9517BE790921DF64AD1DFC0B93DDBA3415EEBAF0DA72F6A0 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ 5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ 8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ 377838973C1D943C22ED335E:\ 26B4E5C4FA85CB33359450E7F7158FB6A0739984565E9D9EBE6AD65B118296E9\ C1098C11541C871EB1B89853F1FA73AD8702EBF4FC9BE4D0AB057E4391DF964E 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ 725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ 798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ 8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ 2D0C9E7448DE3043AE22FDD229:\ 913BBA5C0C13CC49D8310014CF5AF1B63BA3D5DB8A27699FCFC573688F0E826F\ B5A7B5D10D3A1DE693AA66E08C0915E7278F61B5FA30F1263B134F016F74841F 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ 5B6C338CBB8F6659D342A24368CF:\ E5D53E81866283179012D9239340B0CBFB8D7AEBCE0C824DC6653A652BB1B54E\ 0883991BE2C3E39AD111A7B24E95DAF6F7D9A379D884D64F9C2AFD645E1DB5E2 EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ 76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ F6954BA0801A1294CD8D7E66DFAFEC:\ 5DA83B7E221933CD67FA2AF8C9934DB74CE822212C99E0EE01F5220B4FE1E9B0\ 388E42E328A1D174E6368F5773853042543A9B493A94B625980B73DF3F3FCCBB 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ 055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ 256FB33D4260439CBA73A9479EE00C63:\ 72DE9184BEB5C6A37EA2C395734D0D5412991A57CFFCC13FF9B5FA0F2046EE87\ C61811FE8EF2470239D5066C220173DE5EBE41885ED8ACAE397FB395E6CA9AEE 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ 911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ 5994C1DBB3B5C7871A11F5537011044C53:\ B678FA7655584970DEDBBC73A16D7840935B104D06DCB468DDD9814D6CF443FA\ 6F9245824DBFF3AB5FFFEF24B29CB2978796F37E7B49B1682D59F79E3C169E81 CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ 2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ 586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ 4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ 4E53426CAA453F8DE1CBB57932B0B741D4C6:\ 66C64D5B0585DD8C40BECD456E4B0188061AE8059F03E79FE04C40925442BA93\ B052F52087B30BDBFD4816BBD148696D4FA6C61F216253D7AC178B39EC44C770 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ 868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ 83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ A7BD506DB9C0509AD47413AF4B0E3948B47C18278F15F5B19FBB0B76E2C1C1F1\ 9DB9438528EB6D87B0B4A509567DB39F32641E2944365780914296CF3E48CECF EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ 2E681F9DDBD7C77EAB0D225E2AD1F72256BE239DF25933BCD6CEDD757269B35E\ 2A5352B3298A4CDA0542FF7D3ADD2B0CF42F10FBE05A67C8763D54A78A43AEA7 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ 656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ 46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ 8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ FD9BE24763F682043243525E5E0780534A82AD5E83B65EB4ACAF5353313A4CC7\ C5EEA9DA141DE570232CB4126287E5C77657CA8D6A16B5BE53F470343E722FD6 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ 7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ 4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ 99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ 14EA33BB33FDF0426E0DFB12DE1C613BA97141454C8971BCCE25C6D87A6C2403\ CCFAD1E8A6C15754C3CC5AC1718B7F7F1EC003C1B98D70968C5DBB95540B4A17 D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ 66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ 67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ 3B4B395514E0CAB04FC9F9D6C358006CE06C93831E8948FB9BD2A863F3FA064E\ 78EB57C76DD2D058D09AB3D105C28C2DACAEBD4A473F1FA023053CC15366082F 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ 1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ 48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ 15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ 2D7D28C4311E0424D71E7F9D267A2E048AA175455FCB724CF0B13DEBF448B59B\ 0F28265B0F010F4E4F4065004904A7C2687A5A1B30AB593BC44F698DFF5DDE33 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ 7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ 66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ 5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ CB665EC69ABD75743C8713034E9E41736F8C1CE2C77A8518E50388C411E6284D\ 9AADCD4D3BD5A9EB74672325E41E8A67ACF380D1E8A61684F0E501F5663A031D 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ 7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ 1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ 1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ 4515A104FC68094D244B234D9DC06A0243B71D419D29A95C46E3CBA6F51E121A\ BE049B34535DB3CCBF2AD68D83FC36331F615B3E33DEB39A3381DFBCB798FE4D 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ 9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ 0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ 45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ CEE3E60A49F7CAED9387F3EA699524C4CCAFD37C1A7E60D2F0AB037720649F10\ 8CCE8769F70B0C5D049359EEB821022F17C4B5F646B750E3070558EC127057F1 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ 1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ E6ED6F060906D1A772F47E83907507F88A151DE401ED79ACB56BE57C2596792D\ C0BC5A9DC1045E37C6A31DA1C36200214E4F5698AA2754EEB2CAECFC03BEC39D CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ 60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ 0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ 9ED4EEE87F56AE2741E8E4D65623E4D1FA3AA111F64A85F66E99093BAED990FE\ 1D788D6A4BE1A72A6615281EB45E1B6FB60AFEFDD93987F794084BDA962FAC7F F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ 10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ 568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ 46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ 23139BDD84E9F43A6CC615F0F036199328D39807BEC9E786D4251B83B30800F9\ DBE8EDC0B910FCD9D9F204C2DDD4D3B92BC26A0CFAABE764BFB90A1444733CD0 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ 8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ 4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ 01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ EC69397000AED63CB7E86B4FB0BFD3DCEE8A6F6A1CFE01A324DA13484B73599F\ CD37AD392662D4C41D90BACA66BE4D6E3424EFD35D7FF4CB07CBDFBEBDDB7B50 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ 9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ 447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ 2EA3EA00E6E9305CED0FC160E004265221306A2BE9613474126825AA3C3170AE\ 07E5EA42F6B74F0B2C1BD2A6CD4D26EB1E04C67C9A4AFEFC1DD0CB57C2A9F4C7 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ 74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ 5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ CF:\ 6A7ADDB28F4F2C23CF0C264579FBA5F892E010689F837B84D006D91402FBFE9B\ A44B9126F8B5DE1EC6BBE194A3E3854235056A09901D18E8D6F1727DD430212A FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ 5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ 71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ 1DC8:\ 2C0EE8A165BF88C44C8601C6372E522DA9ECF42544DCDC098698F50DF8E70EB7\ 440CAB2953BB490CD2A5E0887BEEAE3482192DA95E5098D3B318F16FC08D1E1E E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ 54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ 009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ 2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ 99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ C25E88:\ DDD4FF117231ECA0445EADA7C7F1D84686520DAA70E160C87DBBB3FB32BB9E2F\ 4CC53DB5413D4E88DE18A0118570318BD6D0E5264D779339AC6F4F4A95546A53 F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ 65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ 3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ C5C06729:\ A9744EFA42887DF292FC09DFEB885F1E801855DED09DC2F97CBFCBD019751878\ 619DA1BC9573201C7CC050E2AA1D453E951366D81C188D329B3CB861C1D78F92 CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ 68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ 6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ 551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ CFE0AF93EB:\ 89CAE46246EFEDAD1147EB1868C23A6BE54F6BAC75F0C98A9AEFC6BF3CCB89AE\ 012F2E88A9C838B55E57B232CB3C80BC3C2E9FB3FC9768C6226E93284E208BF2 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ 331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ 2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ 05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ F467BC75A9D1:\ E80A63FAF248AE762D13887AFE8E1954F97327EDD9641CE563F4148F97966698\ 27B3A12B06EBD710D4171B86E21BC13360A541845354E0F4934E6FBBD7ACBF2D 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ 513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ C6F4756017FFF5:\ 09C10C4818A6821C170D6780D006F7E853E30FE2D9A4E96545673704EC0A1A3E\ 356375715994E1AC1D8CB0E56DBDB2F77DC558ED228FB56EE62217E63455FD0B C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ 798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ 9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ 45DBA58E6CB2C8EA:\ D1CAB5979EB7F53C97DCA5D725D8B33008906D7759FD3EBB8401EE2FFF01DB89\ 5495A0A062D47F251BC3FC13988607C6798969D213C941EFC152E7DB1DA68E72 B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ 01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ 86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ 10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ E8419D48FDFBD744CE:\ 96AD163869AE2FFDB89B96F4DC700ECE27D1F4DAAFBC5FB81A8E9513C6EA5E2B\ 6A8BCCF4E49A294AF326F872740661629AB780581155810E492424C24F8D1DD3 A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ 7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ 6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ 1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ 4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ 359D5D1EEA105F28DCFB:\ FD2E7A6E11E5D00278099EAF403054D617ACAC5BD3D0A4908191782C89F9217A\ 3F0118BC2B284FDBCE803F66B78DD795EB18DC16BA85E19CB6393DC56C06ECCA E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ 2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ 6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ 8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ 7ADFB974EE205A9BF7B848:\ AE53776D969A9B285641998A9F2C70CA71856C956A3C430A32A1E03A8E08D544\ F16511A27CFA59F6B8275A2357F8EFA6544B1CD0C00A9460F47954A146429E49 B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ 7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ EC77F29D211BE89DE18B15F6:\ D4748C8E17F4117BF2BF71557ABB559247552126C36192C5DF5C6C3E307D879B\ 703C3FCD7099DDAB243E2F1D5AE5066990A7B38D3F2CD7FB115AA6D135E7261D DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ 4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ 49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ 9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ 50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ 63EFE793489C39B8FD29D104CE:\ D8FF0481A63890F0E5A536EBBA2F253FA2CFA19C0F353587AF4BDC3190E4F8F5\ 4D17D665E8B2011121D444BFADFFF3E192D97FA03B849D63F36DB20F4CF88A74 BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ 02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ 711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ AE5B257BE36A7124E1060C170FFA:\ 52D771B5016C6B1B93D3BF6A13F718A7B4741D528798609308B54CEA6037862D\ 923751FDDCE10580A7D6431BF208DF17C1B825F7C7401CCBD6D806B744241ACF 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ 5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ 70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ 001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ 480AB79D4E6415B520F1C484D675B1:\ 36D472A8AE13D1E70E1FD275117FFE34063BEFCCF6706FAB0816E1B81F7FE7F2\ DDB2A122F1F52C9950644659430F81BCEDAD5D833DF4814CF60AE6C542CC4478 A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ 84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ 920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ D42956588B3B58CD948970D298776060:\ E504AD7F33D65B8D3487B28805D478778C901C0AFF5F889AE95E2919B4F431A8\ 0116A8993469E822895F3C21A41D67AFDA93A5B29B6250F76335A76FE8919274 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ 3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ 678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ 2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ 8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ A96CBDE5FBC953D9E576CD216AFC90323A:\ 1DCA53BE0A34114447D1C1443B92B69DFDED705956EAE60BBAB39178CCB11F52\ 6A302AAE83720652EF4C5DD450A3647DF7B77C4664717D935B4F5B20F206FEFE F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ 593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ 0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ 358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ 67B5AD93D874812A1DE6A7B93CD53AD97232:\ CB1B03B180E04021E0099050EB6B7EB9092C5BD5C445E9D31EE39C724F038E9F\ 619A96D3A2812CA7F208FEB2D074C3F817262F7504705623E635B9F273E37A59 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ 85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ 352BDD3740DD6A16792AE2D86F11641BB717C2:\ F0482F098B93624BCDE1AAB58097198649A8DC84421826D1C1011AD41B948384\ C8ED5A97C64C134B38A0075812A35F9CE3CB200972C2ECDFC408714139B9BFF0 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ 71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ 865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ 2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ 9ABA31EDB903B28FBFC33B7703CD996215A11238:\ A3188426CEA0C18CB638BCC45C4337C40BE41F6E03CD2D7C4FEE26025C5CA281\ CFBB3AD1554D45EDC2EB03E2EBE3DE02F57D36D5B6A88A3C61A6AAEDE62180D0 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ 8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ 13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ 9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ 32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ 0B14693E6320668D64EBB3BF6EEB81AAFCDB7320ECDE80A245786D1B0A808A15\ C717DC8E8813BF64BF4AA57C29C33E913D6CE1879E52E1919FB83E4A208EDAA4 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ 3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ 7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ A9ABC3F554C1E717935D28C28E7C26AA9DC5BD6D7B02ED7DC6AFE21A0EA027A8\ 801AE076F2872D08635EE81420711862EDC4E448C85513289438B3C8BE456B5B 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ 2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ 41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ 1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ 6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ 04DD83D20F58E854D857F24720C50A4B5F83DBC8CABD460D379417CD4813772A\ A85591B90462F34DB3FAA4DCAE335FB1252BF41162E24975A0DBD308C41A4A6B C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ 58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ 21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ 104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ CE76B25C928CB75C09C0674E8FCD22089654182CD3D84B85CC44B186A8B1A7CC\ 1BB66F389DA6D744A24A7B02BF5C85542D1BA8EF0DB4A86D2FC394471B396519 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ 4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ 76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ 02D1671981C2E85D0455EE85F41B8E9C32B1C80221DD432B8BCB5FCEFE0996F3\ 2FE9FC3EEB3F1F557AE1632750B92D05239AF857C42D59A3DAEB9629E1158BEC C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ 7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ 36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ 6B8BC6211FE5001E07B7D20E0C49D314211E3893A39DA241B8839BB3A494F9A2\ FD8561009D22CCA1330A69362B386E715F1DBE6291DBEECFADF196DA47E53198 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ 8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ 7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ 57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ D00E919DAFFF3D5E51AD3A3046F5E59D64B69CBCDA223CB28BC370201D2C722B\ AE74DFE0086B0EB47BDCB62FABEE870C3340D46E55D8CFEDF2DD3CED8A8DB3F2 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ 384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ 4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ 55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ CF63F28F107A509A416F9A92C4E4DB4DBF00FB52C2E16D8BB9694E09F9142A90\ 4C34E1E960BD97B8CFB2C53E7660C79B841D1565CDAB83293234026A23A56D12 C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ 4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ 761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ F21B8D45B6A857CE663C074C18CC54D914CDD5EB0D968E6153A5F70069345D20\ 5DDF4370EC473FC80B05F937D014C0A464582CB4A73B1B72041C5C99F576A41E 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ 0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ 475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ 6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ 6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ 92287F42AB1A2123669C4D35F18257D3A536445F0E4D2C801E99F8529CD9E2A7\ 9205982C280C7A6CDDDEF24CE960EC6CA9A35F590AEEBC40448C389E915FC4E0 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ 635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ 822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ 1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ 74A9D8F9F72908C7502D1C41212CD86CF4344721A6F02D390346F2BAEC6E6137\ 421E6516C3235443BC2337B3A77630712A12F11B7BA24B2D7085499BA74BCB90 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ 1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ 698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ 47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ 7432861132E6894BB6AE5115398198317E12CC73C0C5DFC61CB189FF5AA9FB0D\ 62224CBB1BFA8B105784405718E6F8E15E041DAD80D11AE507B33C15C6CAC824 CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ 8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ 696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ 7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ 01:\ 6AF4FF4C423051E3306ACE812E5CFA85532B73DEEF0DFE601D2630632389D0FA\ B2A109214D32508D2391775665B87A94D1DF29DB1214CB48DEC10DBD3D8CF591 D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ 0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ 2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ 9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ 4D4B:\ 4648D263B608CF28CA65B28A361EBB00E0784C65AB1D55C46A785737B6C8D83D\ D52E3367D898921EA36DADA42D893800D0BFCF86554CDF5E7630D60A2E8EE29F 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ 1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ 18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ 299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ 4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ A3BA86:\ DBD3732440010595AB26F84EFEB07732227A7B7B52D6FF339C7FF1B644224920\ 2AE33A0AEF5167F5B0474D74A5B50CDB033D6C5C72894A3686FE6ECB36E357F3 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ 69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ 1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ 61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ 477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ FB9E4AB6:\ C24D4054110889290CBC40B82AD8599229D8E86E4CE76BDDBBB6F5386223512C\ 9D7E00973C706442B2C80EDD20904067AF8E4E681AECBFADC6AA15A2EBFE7DDD FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ 31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ 59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ 7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ 91355C6280:\ 4A6404D278A0BA70488C18D7D1861CDE26FD57D66A9AFFE74F1E646E616003A5\ 2FE42520504AC4ACE5CA6665CF9155F44ECAA05D55F80FE9794ADE17871C5728 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ 62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ 225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ 1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ 366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ AF1AE717238D:\ FFFD1B1E31377DFF00B492295BCCC735733B021F47BB4AFBA6549EA6C1BA3832\ E8587099AD0CC216AF5899AC683EB7C246871E21C30FEEF9BCEEDFC78D0C966C 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ 85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ 16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ 528F9AB49C79F2:\ 33C8F40E1BD1EB1A3A70D2071D27460EF0F6B2D3ECE373743842D6B928F3771E\ 4B7446A9ECFBBF552C064F6B26095401097581C38B95E9551119A1FDCB3D58E7 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ 584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ 4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ 4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ 5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ EBDDC89186839B77:\ 2A11CB6921EA662A39DDEE7982E3CF5B317195661D5505AD04D11EE23E178ED6\ 5F3E06A7F096F4EAF1FF6A09239CF5A0A39DC9F4C92AF63FDF7211E1CF467653 FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ 6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ C66F252F6E64EDC96B:\ 9196BBBD194541FFEE7EDBAB970738BDD3AADBD6B73D1C85B580AFAC1232AE80\ 77F743CE8B5B6F2B418B5134CCCD4F83645E8631885B14FBBCB909A9836C374C B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ 5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ 252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ 25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ 232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ 5363892A2495DF8C1EEF:\ 1959CAE3600F128F72E1821C337D841B14CBBFEF3A6D22286F18BDFC3EF63528\ C11BFFA841A6D2208AFEB5664D524DE83090AB0DB07CD47EF52F4D2EAA8454CE C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ 272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ 414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ 49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ 199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ 5C6D1BE4BC79F08A1A0A46:\ A913DDC5BB089C121FF093BE529225148DF787D48F4F61699EFF9FC2910282A8\ 98A81A38D66BE9B06428D6466A614CA822A872C1C2C4D503D434D3B1D6942102 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ 2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ 443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ 6EB6E4A80358ACC78647D043:\ F10B91564AD93D734743281949BACEF065A6432A455236F1BF798DE9AEC6CCAC\ 9B8D373B07C5ACFBD676EF21E4A3A9E0F7C38E8756D177D0A5C283D520844B4D EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ 01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ 90BF2C4062FD2AD58F906A2D0D:\ EF26A1BAF33D4DE047BDD2CE34736E042ECD33AA569FFC0CB81ECFA66E9F87DA\ 8D025ECBA24BCB187E4201046FB99A02DFA6F1BF88EC2B88DE216CF759FAC41D E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ 3EE46FB67422F814A68C4BE3E8C9:\ F8E079A6DC5A6A7E7F32FF7E8015D1B26D43B54F166F2111CFB2B1EB238CABEE\ 58630EF845E0DB00DDF1D800AD67CE7B2B658B42118CC15C8EF3BC9FB252DB64 D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ 4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ 38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ 806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ 4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ A17E776C0D02856032A6CD10AD2838:\ A5BFAA52499A688D9C8D3DDC0BA06DECDF3829BE5D444ACFA412F4C6E863F478\ 6BE9935805310734E4F0AFFE05558999807408E97E100FADD0C93FF160F8B11B F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ 39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ 42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ 4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ 2ED1C78631FD23B4C3EB27C3FAEC8685:\ CCEA9FCF1AD93270AC4690E96B875122C5B5EC20D2CC27079CBF893126C44E02\ 08A8BFA139057D72BD2638059EC8DA8A720499AF9D4C117F86799D7515DFC6E0 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ 94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ 286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ 04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ 72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ CD90333A77BC4E1988A82ABF7C7CAF3291:\ 2EFC5DFE028A35503A25BDF8B2164D86CA7496B7C5DED09C5D414B6977ADBB4A\ 6988AB9939D1EC65F46BCC99C1DCD5F19E035D8D3DC387361200E4DA80C80671 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ 29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ 5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ 626C48322E9791D5FF72294049BDE91E73F8:\ E80D7A934FDAF17DB8DBB1DC6C42E90E139211C2F599890C06B15D6248FDBE68\ 2D77D4E05F26D72852F7492BCE118CE7C36950BD2C50F9699BB47D89C3115377 AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ 1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ 42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ 774BE89C1114DD531C011E53A34DC248A2F0E6:\ C414B29FD07720F46C351F5C80BE2094E95D13AD97BDD1F7C5207B695693CD5E\ 1E0169B1AA2E271115BD5171FEC51D04B71E3E7CE1618FBFEB382F56F65F7EFF 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ 246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ 47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ 94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ A7059ABE99182714983B9C9D44D7F5643596D4F3:\ A4679A4CBEE6292203BAFBA8913245F30E046ABA6C0937B407C00B73D17D8D69\ 6690EE25BA1B39DEB3DB93525A8FBCFD88173BA9C7A65B4406D0550BA9B6CC07 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ 374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ 6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ 63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ 5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ 4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ 5F49D6594DA939987D1906294B33A037F63C79E078531DFA7E6CE67279D4D5DB\ EB650FF8690F23B63B7E9C48EA8791B80FDB34EF66DCF0CEFE45842ECFF4AD1D 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ 575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ 7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ 591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ B77FB79669EA52C738E58A9EF3ED1501BBE7974478AFB5A8BED44549D6232FF8\ D7AA9EEEAF02F6755327951093243110D7BCFC0E51299DB793856B57A77E8420 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ 37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ 3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ 9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ 24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ CACA0FF43107F730A7FBE6869FBA5AF1E626C96303BE3BC95155164199C88922\ 194511B24C48911186F647CA246427F2CE7BA747271CD8D7C5E1D127C21F1EAA D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ 33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ 0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ 52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ E5106B2A0D49D6D1E13E3323232101CEA5DA71CAA24E70EFCAC57E0CCF156CDF\ 4C2492B03CE0E13437018DAB76B9C989883BEA69E849F33BB937A397B84ADA6A 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ 7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ 5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ 806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ FAEE462E4BCED12AD54D3757D644396ED9203037741661AEA32BCCADAE568C4B\ DC925EDA76610E964FBE3FB26B33BC0BC123DDF9B528715317CE5C92E00AC96F 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ 271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ 608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ 990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ 2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ FBE25B43E540104A3AADE897838C63511928AF5ADD4F952F1E6D4C39E70C923D\ F191FAA36F46B21F827D9B437996FF7206F73337CF20C6B0DB748A707455B420 C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ 56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ 8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ 50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ 1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ 9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ 0A41A004573E0A983FE9C93BD57439A20C8F99B800A60D4A07117E8D9B25C0EE\ 38BAB3CDB6FC9216B8E07F0CCDD028C418EF97B6D7E15DECDE7425497644E2E4 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ 5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ 4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ 261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ 31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ FF081507F979F69C6743E42EE758858713B570CB48FF85EF0D728C4E1BB5456D\ 035E498C05EA4CEBD820E134BB252AC76BA4949A4FAD76871A9972AE2FCCCEEA 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ 266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ 7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ 357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ 5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ 719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ 03444AE8319EBD121E7707B9CDFD1FDFD52F3D6B3D4BCB2748AF421A3C8666C2\ 2D8C0D8A096767B1CD16A8D54738C5F67A6F9D48C90827BE71691A42BE87108B 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ 8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ 3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ 267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ 8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ 5EE0A4459724037B7318815A80147C172D6C8F8874C9A0057706FB3E300FE936\ 815F07672E6447B771DE699DFADF345C3BB5974CF019315FADD5534DFF6A079C 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ 1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ 4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ 3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ 54085A2F9C327E5D8EE225EFF5BD2C2837E44E8057CF1691E6202050079D2685\ 1061C4DA8D88FC19237E5B658950E66866E92019D9E425E2416240A59D25A6CF 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ 994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ 37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ 7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ 9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ 3EA49B6ABD39CDF04BCCD648FB7E1F8AE3DAE9D3E3A5EAB9CE29BE356DEFBBBE\ B1BB93AE40D31CC1F011DCC6C6AC85B102F2654E2DBBAC47333BCDB4758A1A28 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ 394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ 43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ 7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ E8:\ B3851790CA47575DBF988F82C3B501DC8390A8E8598698166167567A0332913C\ CC8868584DB4ACFB2C9DC0F0A6833292F4DCEDC47CF003217689BC2422B53B93 EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ 85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ 4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ 97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ 345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ 6427:\ A710CB26C632F289504CD0039BA6AB9B4D3524C52B286D466E2F8939F8684E3F\ 18DCA298A2BA67EB710997B7BB10AE279438B9B4868D0ADB248F282BB440A130 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ 89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ 630012:\ 8F677A8089052B47BE60C0BB7666E403A5DAA5E28A2B632F2E496C587F1FDCA0\ EE33D9E78DAA4EF575B13389748B8C24110053B0B96A082C06C3F80EBE8DE976 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ 95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ 4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ 78DFB921:\ CE631E6F2C2DC5738C0FA958571773B58AF130B94824331419EE57E2691CE5F2\ 9DB3D8FE456CD1E7CDC07F6105FA1B6FD729C2B419008CCD889169C3385DB1B9 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ 4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ 91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ 9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ BB0D19F909:\ FFF677BB58909C158EA677BE704253505B106AF934F639ABFEC63BD0C63097AA\ 4BF032FE924149DD991D335E1C44C0220E4D13CBC41B6A98FB5A05FAA3FE15B3 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ 6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ 57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ 00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ 77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ 81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ 04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ BE6BF8082E8A:\ 451EE587226C99989F5EC10050983B1FD661228A4AB48618F1D1173C94FAC39E\ CFD3C26C16653633B26097E31A0F2213B4F1153A57CB48A70D2AF1ADEB1BBC06 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ 06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ 6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ 4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ 58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ E839A9D4608F03:\ F9D6AD8686125E71FE0856E806D68BA97EF123443938D28283387F33E3AC6E2A\ 7DE042A3EE5F7994C1EECC5B6F22CBAE1349CAB2FB7A0A0125EC2320320858D4 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ 10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ 2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ 2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ 8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ 8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ 5153592EA81C6FBF:\ F26F3268FD620FC476A49AAC3ED1580864934A2F6BA881ED8C8FB757AAAA64BC\ DF501E1913DE600BBEF6F12C949FEA8FD68C645086D5E30C9253588FFBD19BE5 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ 735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ 1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ 7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ 39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ 9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ 604F5035C46B8197D3:\ 080845D6FD22A00B30FA01A4B4F81FDC7B46CA4C6A676AD5863A9DBF6611BA97\ F24FB59BB5BAC4E376B3B8B3357166782876B701273FF351BC8C5805532767D4 E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ 94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ 7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ 60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ 7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ 6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ 07E3B953ACF99964B847:\ 2678A8715FC7E538522DD7608D769508B63017D9EB6CC48F1CB07D14E7410669\ 36C8316BF3211E09F62611E140DDD14A07F97F9F372E99C084FFE289EB302BD8 D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ 32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ 7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ 8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ 07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ 4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ 6C90E8C4D100ACD9EED21E:\ AA03EB09417435DA9E6E7803F3B6EAB66FAA3D59CC622950D61F9B962B69145A\ C2255CD752CB9607742092697B1A79D124817AE26421E61D1176764832ED354C 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ 18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ 886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ 4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ E2DD603D9EA24DC7C5FD06BE:\ D3012F2FB56845B258D7598C0BBB2C97D53B602DEAE9326DC3678B2228454A1E\ 29F28848ED140C70BE85CDEA9F99A8DC347DEABD46D362ED1AFB231146A0255D 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ 742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ 69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ 9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ 779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ A80012976F31FFDF305F0C9C5E:\ B50C896F2CDF7F105DE751FF6CF664E592FAB752D652B06898B9B288052DF22F\ 721AD87E702AF043E6B1E88929850CBD5698A9172C3932400B2538E401A6F081 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ 9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ 53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ 479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ 3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ B461A40645BF176601F1E760DE5F:\ A34A2F27C32F993A7E7007867733547481293C391255FFD0E5CCBE91E1CC749B\ 13525AF6ADFA0C2D1D64BF87DD65B996ADA9111C5DF55BFF8A5742E54B8444F6 D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ 5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ 8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ 1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ 86C226169FF257954EBDA81C0E5F99:\ DD5F4B167175D9566DCA6C5B1B54A33D02EFD02E25E23BB6FB02D878A4415E5E\ 8682C209BEAC04E9882A272D01E8EB435CAA5BCD74FC825C6B9082D041DFF333 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ 431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ 40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ 0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ 2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ 83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ D3C356C914FA06B9A7CE24C7317A172D:\ A43AE5DAD936697564AE1BD9B8624C5C31CC36607322AF40E253F10C285467AF\ D0D08252D2BAD76EFA52E4775C9C26761ABE38212855A80112FE02623FBF0A13 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ 645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ 39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ 68F50D79F0C9C7314E750F7D02FAA58BFA:\ A5AC23D4A0D533CB9D8A68873F5CB749228458D43CE6BD0536C8733777B5E6E3\ F28FD36BFFE69002A0777BA74FEF22DE3FAC4C818B4842816C6094496F968555 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ 4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ 717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ 4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ 9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ 39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ 7DF95B60FA8712A2271FCAF3911CE7B511B1:\ 07F3BCACF5F78816D515CEDF1CBBA4FFC58D83AA8687B0E7252FAAB43E7F59A7\ FF7415727ADDF9A22560ADB5755A2C6DF8C7E6DCACEB53106A714D807AAADBF3 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ 261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ 0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ 61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ 37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ 13A592B73EDE487036C8816BD6FC6CDC04DC6133409A6EE990584160518F9EF5\ 73264CF04D38A3BA75D150F4F026F6DF8936E13C8F4F3ECC9ECBC43FDFC488A4 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ 4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ 339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ 5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ 7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ B7F5CB9923AD97058EC067700CC746C127A61EE3:\ C2FB590AB74E230B8FE159892F94DE04EF7ADAA02B918D4994F996538D257F5A\ 80C9B3BE8F410170B0C5CAC3F507401220881C5E08D8BF0A13247170D39085BC 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ 70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ 495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ 5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ 00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ 02951596A13A1A41188A4A1D6346F7EAFB60A2051EA67C63237D1A9B79EC4733\ F33ECEC223DEDD946B78387B6F2DF5E9AB6AF7DFBABAF80F4FCC94FA087275E8 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ 6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ 6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ 1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ 0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ 2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ 5AA4E32F0EA3E853929BF64ACC9565A01300BC007063B939F6DBBE9CAE0545EA\ 95FBCAC32575AA0727EE4D937071E6B3BE74E23FE76FD63EC05C7F7D8A407AF0 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ 2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ 5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ 9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ 495B2AA2103159D9A937E9DD56B059ACA98A5E3CB7B59BB690DEDC00C692E9D7\ A18614A73D12E07634B209CC630D1818B09F1076A941FF80474493E3D42B9812 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ 8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ 90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ 6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ 0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ 6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ 217B5A985BED80008274470E254443238C5AEACBC7EE2289F0E63B7AFE6D0F39\ 5E2361FD6D9DC33B4F54F03FF56F6B264976161D80091788EE9D262F147A35FC 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ 70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ 5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ 2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ 4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ 27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ 293C551E753BBA7F314DCB93A0FAD94F3F5DEE6ED45D765A708E6FD277601F03\ F6C905D7E1EAEAEC513CBBBD672B817F6D60FBF02C20167D7F4B7B84AFEEB3F6 B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ 0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ 0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ 8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ 547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ 758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ 89FE6314A0246EFF3BFD07A95FE239BD5071467F53799175B226DAF6C3DB618C\ AD4CA1C1AF64BF5793F03254F560E6335BEAAA86BCB9E961F214B2AE97B47AF0 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ 38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ 5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ 3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ 8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ 5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ 7690F703E894EE22D4DFF55A7F8D5021D5F17B729F95A59C4D55CFB225C67BE1\ 05F2E7CDF56D140E566648E9E9C39BBED96F985A6DAE1F21D8BA500F7FD40EDF A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ 3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ 80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ 49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ 9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ 65E415C7958A47FCA9EED3846FD1283AFEB38E5130F57ECD99DCB21BEDDA856E\ 3B5FB9F839E579C5EA386EACA8CDC0A9549EAAF6EC452DD6CB5212B709BF5C59 A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ 0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ 639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ 877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ 1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ D6542A2F0654B9B874A627D3D53764A65B1DF2C0CEC3BCD0B4B088FAA1095E54\ F1799757C4371F8D544E298D600E21E11B2F90D295712621231A09C58B05A704 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ 9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ 10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ 8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ 88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ 0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ 2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ 04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ EC983E787628B94C87FFF8D57D2D058667D12F5AF458BCE79BB7844FB41D9C55\ 920F593C8D8730EB8D54FF1D51CD8AD2F1C2A0F7D6B299A21266744E47D142B2 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ 623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ 15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ 817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ 5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ 81950E7096D31D4F22E3DB71CAC725BF59E81AF54C7CA9E6AEEE71C010FC5467\ 466312A01AA5C137CFB140646941556796F612C9351268737C7E9A2B9631D1FA 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ 21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ 0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ 7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ 4E987768469F546296AD1A43D54C0A0A6C87E7E4E26B686612B1E5B1554B689B\ FFD56D6A4B454CE4A5717625BBAD321F8D05F19C225259646F21416AA2D7C2ED 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ 4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ 92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ 539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ 0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ 7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ 2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ 3D370DC850BC7E159CEE3F24D9E915B5B1306FF403C32C7A3A3844F3FC8D90E3\ 5F56D83BDD9C637BC45E440E1F27CCD56B6B3872EC19101BBE31845108DCE929 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ 76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ 4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ 0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ 52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ 27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ 720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ 9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ 218A55796529149F29CC4A19C80E05C26F048ABC9894AD79F11BAC7C28DE53BD\ C9BDB8BE4984F924640867FCFCE42310ADFA949E2B2568FFA0795FBB3203DE65 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ 131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ 808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ 71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ 6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ 74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ 4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ 6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ 116AE94C86F68F96B8AEF298A9F5852CC9913A2AD3C3C344F28DCC9B29292A71\ 6FAF51DD04A9433D8A12572E1DBC581A7CDC4E50BC1CA9051DDBC121F2E864E2 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ 0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ 2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ 0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ 2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ 8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ 284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ 584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ 582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ 8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ DEA56BDABBC6D24183CF7BDE1E1F78631B2B0230C76FF2F43075F2FDE77CF052\ 769276CAD98DA62394EC62D77730F5761489585E093EA7315F3592717C485C84 D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ 13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ 3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ 682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ 321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ 1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ 63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ 21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ 910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ 63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ 8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ 90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ 43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ 4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ 8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ 6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ 9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ 6E010624E0C2589F52A7FABB75B077C86DF04E4BE6FC736DD00346231370A9A0\ F6715E683F9733226C6AAD1947EB466C7DB79979DD367C33900D9727BDBA24A9 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ 73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ 2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ 574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ 298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ 6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ 2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ 8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ 07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ 48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ 6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ 7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ 469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ 6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ 40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ 08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ 665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ 4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ 186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ 0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ 0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ 1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ 99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ 1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ 14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ C3A66CD4EB2DDB42EF85EA0CD65534:\ 7AEE30930355718679D387DFBED08EB700B324BB2775BCFD11A88D37AA69A5B1\ B0010E8A5C38BB20E5E5DDCF5BB2436830DCE8DA2048197756FC85B20C16F0A0 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ 6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ 70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ 013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ 5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ 44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ 8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ 1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ 9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ 9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ 4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ 323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ 8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ 53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ 11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ 5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ 41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ 19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ 647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ 142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ 40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ 40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ 3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ 2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ 94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ 4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ 9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ 561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ 5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ 303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ 2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ 13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ 46B568CE294C89:\ 76583E740EEFB6394F6AF310AE896E1B2D181581165CE1DCC2317D7EB044677A\ C0AA6323B5B14243D0822EE49DA1C676FBBC1F189B919BCE8A0AB283D60308C8 F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ 9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ 49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ 32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ 2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ 03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ 0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ 685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ 2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ 3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ 0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ 20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ 2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ 3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ 5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ 97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ 92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ 3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ 2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ 703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ 05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ 4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ 99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ 1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ 688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ 1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ 4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ 181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ 00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ 0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ 2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ 537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ 2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ 8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ 5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ 8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ 4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ 9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ 727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ 9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ 3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ 0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ 854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ 813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ 68CFEB4AFC84FDE5B1A2F73A914C705BC211CAC69FC68189E3587412EA741E46\ FD230AF54BAB9AF65AD5322CB691B04EF045C15A187FECC7AEE9FAF20C8FC658 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ 47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ 7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ 4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ 0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ 4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ 22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ 52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ 7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ 7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ 204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ 07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ 5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ 56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ 6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ 15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ 259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ 5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ 317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ 5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ 504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ 32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ 85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ 3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ 281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ 6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ 82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ 8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ 0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ 2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ 1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ 265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ 5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ 4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ 092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ 0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ 29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ 3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ 49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ 3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ 26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ 5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ 91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ 42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ 228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ 5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ 25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ 2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ 688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ 7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ 3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ 7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ 394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ 3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ 8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ 09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ B141289FC8E97191C3A45A125EB29831C532F764C9924A5EC1755267E7DBACE6\ 8C9EC4A685455BE06A75DDFA80421F16A3FC96203277E3CB22543B9C07A94C7F 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ 6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ 26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ 9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ 0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ 32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ 221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ 36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ 2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ 72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ 83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ 0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ 3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ 6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ 210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ 889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ 123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ 71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ 1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ 6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ 3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ 57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ 4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ 2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ 6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ 0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ 31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ 97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ 4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ 75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ 40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ 80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ 15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ 5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ 16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ 278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ 59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ 97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ 806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ 01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ 78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ 29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ 31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ 320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ 908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ 369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ 966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ 5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ 76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ 847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ 950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ 30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ 89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ 5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ 9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ 735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ 64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ 25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ 2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ 180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ 9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ 120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ 07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ 6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ 4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ 7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ 57795DABAF40687B2CDA7A5014168F:\ 29E5CD96099C4834FD0ECBE8132621D0345BE3DF0C7AB9B8B86D91E87FD8AFA0\ A4F209506B8D8FBABA154AC65552BE5F5C6BEFEA1DB664BC558F57480A3126B4 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ 2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ 6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ 5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ 78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ 0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ 273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ 3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ 6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ 1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ 8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ 0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ 98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ 048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ 00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ 8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ 4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ 7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ 63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ 54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ 6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ 3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ 50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ 742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ 2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ 79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ 59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ 4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ 7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ 5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ 0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ 9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ 05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ 5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ 3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ 3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ 9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ 6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ 60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ 6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ 1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ 1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ 7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ 37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ 42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ 5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ 7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ 24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ 0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ 3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ 44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ 3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ 5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ 1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ 4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ 1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ 14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ 0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ 78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ 2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ 131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ 8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ 8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ 455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ 69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ 7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ 39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ 1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ 545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ 75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ 38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ 090FC9BC045271:\ FC4E8EEF8A77598A389BD58A31C348B22C6328235A39F1F097C06D189DFE0865\ 8B89C16D9B26A43D17A25F1B4007852CED212856059D8B5EB42EF6066C845850 [MD2] 25:A248ABDA0C79140E2D99170DAD36CBC8 3386:43C980AD45E7B3B1CD75CA4E7D9A723D A0A806:0D4596E208051A05DFF8116455562630 7664BC7A:E561C90B5534D750BC251EB77A9E7870 94A3C94A0C:2D8026BE7A76954A9E096343C39ECD8C 2BA359656CCD:2C549D1C220B32CDFC242874E6807B0B F62E1519F7C123:7D473DB4CBC7B479443BE0F5BA34AB88 731E26C302E41557:DFFFCBFDB186EDFC3174BD6118B9F4AE E96E54E58C275946D6:DDD255C1D97FFC23ADA446D630E648D8 A05EF276F00ADD9AA737:7468B835B7FAB5B85E95BCEB563AF71B B2E29CEBCFE26335B65604:96CCB8AEB6DC5B5D0502CA2DD5795197 4A926951A34CFF9612086FA1:CA2A050506C450FDFF20DD7E4EE5339C 501771E1BB1766FD3FA714BCC1:FA6F95FB2DAF9E4E153D7D78590EE138 07ED7EC95443B759D36E5699547E:61B549A5FB75E337A194E2FCA382DE25 50AD2003A260C982EFECA7D5912BFF:6BA8E7DDD4019F159FF72514CFA156D9 940866DDC4A37CD965DFFBE3E2B0C341:6A92E7EB476CB01F9C404494260E3777 62F3333A791881457264348DA07FB6B7C4:61017AB161754960D3F1D1F1D10FE8F9 E68EA199397AD1D0C9A76BEB4D96722CBDA2:B373D1E21455608FCA99654850ECFFD6 A7A8C48263FC70A6A77374CD0E685773248D26:07FF45303EA30885D7AACAAD2E16BD50 654C952DA2E3C7998473AFCA3C9AF2AE89B2DE45:C9444F92EE581185EF649354CA8F4BCE A4D93A05DF87F08E3113EA2D0CAF8F70CBC2BE4B2A:B46ADB25D38DA1F0E7F6F8C5DD129D40 EA12AE41BE9B71EBA74C9010C4C884FE5DC9B0C5C65A:B6CFCF8CFDC2FE63CEAA66A5573FDA81 C3AF0ABC9A2B464A1C4F629908D1EC556F20F64084E733:523441B8A2FB07E41E9B1B8CC5276660 3C8BCC24A8DC88690F6B6C7CFB25DEF15D37335EC41C8C83:\ F80ADCB9C78CF9DE5211091CEC3E310E 65E2194B8A8B5B30F5C53D01F8431E8C20418EE6A06F89F87F:\ 5833781CF79E57F605F9D73D3B7088CC 62FBD128DA286D5C6C5A3E73D463E5B31D7FB06F34DD050B3CDB:\ 987C1F6BB686F3A983D611C22C5086BA DDA05271A7C4860D49D2CE62A0B59B11BDCAAF272898EB8E18F1A8:\ 779D23550876E50A7C19F4777C84984D AA8DB1791C56E3C88122A1AB77A9D8BCE0D53240C01B789DE7FCD594:\ 9540F40D24417EAD9465B26D8A7746CC A1C7EAF91BBB251411A86595BC66D4E5CCF227FB2D9913F3EFB4E69B3E:\ D67F49DE6E7BB44071947A6C96774E02 611B90477FDC084652039E3E3F55EB74EE1A3E14BB49A08882AB67EABA73:\ C7F8C0C4B53D40634A084A0E388186DC 5E9F73521E348BFBF3ECC570012AF45C9832F673FFC61CB034908EB91A6672:\ 03B6F0BCB2A99CE4CE51D92DBC9ED3B2 275C7EC5230978B84D4D87B929EE90C04269B91A32A69BFE2B30E84361CD8905:\ 72721B4138FEE747BCB950DD01291C37 BFC3C421B77FDC497E417DF9A2E8A480CB975BED8E3B90F0BDFC567D66D8747D85:\ 92BCE15368AA8388D71E1CC5B4773536 C2B801C8419027751EF0C9EDBA783BDD703259834E0D28F1CC18BA82A2D9DCDDCD5D:\ 7B194DE6324A19C54F9AFEB352EF9A8D 787B37C5C74098B78B693D33E5DD5A12BC2D502D3F69852DCB5CD56D6263E846F96ED4:\ F63A8C1958208D999F55917D9A1F3228 0614889EFFDC294287D820C8A4459FA44CDD02CB1DE0F678493C959E7DD1DF90257AAF0F:\ 1E20FBB25E31606B0B22FDFDD2639C71 60D169B12C1ECC464591BA572EC74B454D417BBDC49A82F01B9A4FD1273404F6FEBB575E51:\ C23B75350BA0174D6A4BD629A8E43311 642350615A9C6CBC8894D72176AB2EE4AF3413D15C4D4D9B38D071C95FC620FBAD6AB37FB8E5:\ 3D0C91CA852FB8C51AB9441D5A3C1F94 C6299D1B98BB473500364EC66A3DD9238DCCEA4F281005FF630E99B5C8D2A7AC5FB1\ 3C693ED05D:E2B2458ADCFB7D0BCD4789EB9FC0D2CE 9D5AA26103830005ED7C966E120253DD7ADF49C56BD89B211B6B0D5B491066A52498\ 736122A325F7:C8F205DEC0103264BEF4FA0501CF007C 7E038B83083785FDF4696310B579D3C0D98A0092FF2D71808C620225FC54E6973B90\ 7E5ED4A50BBD5F:91F01747135E4E9B18A95666FF4C8801 CBD41D36CC3F85C7427E3D04DB05E66D32FE7E9683A35B9ABC5B06185E24A867B954\ DDC4FD41E0379423:96110102BF17E3CB91AF30EB0B527851 61F01942CFBDCC748AAB816527D49848CF698A8AE5E5EDE8C3C9178EA5719EFBA60E\ B1C4C3324C6B1AFB2D:94EBDFBB3060FA8E7FCE7A4538CD6829 3E96A6186BD855DF00FCE2693B1394151594448B516DE0B9C8D15396984222497B15\ EE0DFCD47AFBD8AC3F83:D39A82F44F8E7D8384938DD8C42C28AA 9C8CC760D830780DD8671282D6A2909E9D163BC54A04119586404BCBAF5489C79491\ AB236A4F9781CA58E58408:1F902D98C973B382D084FBB40F0920AB 00A530B70C406BFD533C2642B94FF767EF4C7BCB28EA5CB69C62F52A01AC1A25F1ED\ D918719004757463E6663340:C7FA3641EC0626AC66FADE4B77FFC795 8DAC93EB30AF1242B93B4C1C8D7D2A8E1320B2738C3D40E623E7380AFE596A783A90\ 2B6A19DF17D15356C24CEFBD66:437FF6F86D68E35D5BC507AE88C8B0D3 C3D2DA59D6435405406E342683A324DE6844C527687521E43066270CDF8534C110FE\ EBD79B5F2FB00FA3B9A31E1D548F:7B4E56A2014BC8127D6DB1699128310D D178D2623180FA605C3379B2EF0D5A3272593EE49588708303F5744E8A26DC7F4E3B\ 4435B85A8E68B5ECC40AC7DCB2039F:CEC9CC7590DEAFB05FDA5D42C5CC3A71 4B2C6190EBE39D5282026FDB3124D64094108DA1237FFD3A52ACA1BD96FBE752C4C3\ 631C33913BD5DB067AB234C4628B2ED9:E0CABDA82227CE74EA7550053F942E74 9A75285DE0B739BBEC8AF7A791FEF5375A8E722134B6299D6FF167F43BF80F5CCD83\ 8F76AC2278C6CA5BE7E5C339ACEB8BF77A:117451E0A38EA5E87D6817003D9DC6B1 A2ABD527204652A5DC3C672A1E47F5CA34FB1D7F300580F63B463959991DE6DE1472\ EB21CAD19D4636C26B0F1FA99CBE6DA4CD70:EDBEAC9A8676D1BA66949F71B7BE5005 FB2063EF9B211AB8ACF3D1256DEB4E30D1B6DF1882308FD7F80F27C2141DA8A89551\ B878410D914C4099DB464738EA337335828434:4DF72B07A43EF126FBDEAD01E51ABAAA 41DEB68691AFCB42C865CF29EC0C2698CE621594ACD0D3443B8D025F6A4547DFD058\ 740A837867A2C1E204CCEB27740C343BDA0AB6B2:83A4F9739748D0402BA738757FCC517A 38C8C56CE471F839B8FD15AB3AF0E1D1A3FA494E7DFE660D5224E1C8D43907E5CBC5\ 6CECCCBB44CEC1AFFF26EA7594E33D05789DC49E76:07A7A27D722092692035AAF579751495 6AAE2909D84B75F7AF3155E85660A1CB224DF40A4EA6CEF0C0F28AD149F3486AC3E8\ 37E7283E07803522CCE7000D0213C73B09FE77500852:C7324E5968CC534F8B98406165C5ACF5 9934BAEAF002C98F527AB248B8D44520456FD552409845CF1E666E41151DD3383E5F\ 658DD3AEE63DCBB94BF5ADE141D753B57BDC3BD22D6648:985711D04A1636B27B98EFC2DB61A806 69C8BB8FB1ADA90D0B9739E62AA1090D12C750945EC15F28D03886BDD1ADCED71699\ 48E085B56996D4537A35F72FEB5313F3B7BB3DEBA66B2B84:\ 709578A0AA3DBF9CE4BE69AF71E1AECB 1EEA19E3548286905BE1092F54EC9E372DBB9950E77EAF7E9C55031232D8D70AC9DE\ C5D71FACC235EA339B859D54C4D3245F8702D535467E918F86:\ 26BC86988B1C278EEEFA648345431254 24215B243E36C2EFC561CABA961A170C0EC406344AD712DF5DFF62CB80B4A12C08FC\ 009E4A359306601ADDF31845A88F927BD86566634466BA15E5BA:\ 2BB96ED578D8C61B39DEA925DCDE859F 4B6AFF3B20CA5685D3E173AD26E443D38748340B209D63E60F26988AA4C31FEE1427\ 83DA23BDE5D322C6AF97599C63183EAAC6B9DBC3611E6C2C32054A:\ F54BBB34D01EDA10B43753BE8BB9C219 26C82DDB40254A854F3FDD1334F1A191101730DCE43972881706FFA4D307D7D91598\ 93252B25732F3976DE9675C7128990D7E321CB023221E2A89BA7E066:\ 951FBE39B9172884541297FC8DD4C2BE F357FE7BE2CFC971379457338EBEB69A40286C9C0FE5DB16888E2E270EAD23BCF7F7\ 0031770B08B5C7C4CFF2E49C6BF9844F773B3F84C49C575173C691CAFF:\ C2AE33C5E43079851FC8D2671F5F4CB9 F5A11AC76D127223FD9E95B3E743B7EFD13BDE1E502D0E81E33EC85852420EFB3535\ 95BB7591E11E3A79FAE079239EE4C87FD141BAE6C6B7019B9A57BB6498E0:\ 45F83BFC62EBAFF4EA00678A138D7E7B CE9C44FA430FCB3BACFF6B384A2A6C2B0617C0737DB20B0B78D86C6F7C341D19801A\ C2E4400822DAE74DFA40A4468CF5D1081D3290FF35AB4775790E22FAA58BCB:\ 882D31790CC7FA4B512EF4A00B1F5180 BE2FBB79CC864E84C625D71F9886DC29F9D5D387BBA4AABC2DF2C8C75FA45C759E19\ 2E0EE1A31BCD51618402D8898E8EB937630F6211734AFC590F99AA67BAA0DA69:\ 497353E9FFE29110092E859CEC5B366E 53726A30175CCB0EEE5B91B542E7FFA6EC7C2DD20784563D5D379B0DD5F632060B9B\ 9FB6264AC792830B6555767F91BD0D6808134624E7A2D8901A6BA01F558BE4A549:\ 2CADCE7ECC0BC5DF4043C9A3F4F838B7 :8350E5A3E24C153DF2275C9F80692773 61:32EC01EC4A6DAC72C0AB96FB34C0B5D1 616263:DA853B0D3F88D99B30283A69E6DED6BB 6D65737361676520646967657374:AB4F496BFB2A530B219FF33031FE06B0 6162636465666768696A6B6C6D6E6F707172737475767778797A:\ 4E8DDFF3650292AB5A4108C3AA47940B 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ 666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ DA33DEF2A42DF13975352846C30338CD 31323334353637383930313233343536373839303132333435363738393031323334353637\ 38393031323334353637383930313233343536373839303132333435363738393031323334\ 353637383930:D5976F79D83D3A0DC9806C3C66F3EFD8 91F1999647F001F7B4D4452CF7C07B64A994EFD25DCDBD9F6B260A77C8855AEB3EE8C65EAEE6\ 397DF26F58A1729BF7A12ACFCF1C4C07A760B829D4158164A57037C15FBFCFFCD85C987C9FB5\ 319AEF44484965425FDEED7D182861A0F3F9BA42BCE7CA288355DF484BC4476B1C587C401BD6\ 196A401A9A99BEC075E8B99CEC15B3E9292F6399F61E00B27837AF4CCCDAAFB235E90282A08C\ 979628E084C66FF24E6E180AB9BE50E274861E174FB511760CB2EB48A2A50D9D70C97B864236\ BD6AB8C2D9BE95E44FD317FBE6135B800C00E2422068F399F6F9427340AD4ED5CAA1DD96C76E\ FA688679F577FDBC02624F7D936A199A9CEFBB4F2A9FD15A1A81ABD5703A55FE3911455C8F0B\ BDB6C6479B24BF8501654DE0593F52713A53929E46FCECBF708ED4EF00768352682B8BF7731F\ 2682991D3CE26497BD4419B6BD67A04907C6A1D84B2B7C2B8C622EAE73AE49D978DEEF8214AA\ CCDFDDBAE1F10D19AB6BB7D38D5BEA2A6141A55BEF2BEFB605FBF01A88BB7294E4952283731B\ E737EC395B8B537558BE7889CC9C43C855F6CBF4131FB2FA17D72E334F775466F1B9C70A4325\ DFAFF502D71ECC73E113871EBED295D9FD66EB2F8CCF456075666C9FFC121BFAD286C457AC11\ 91354CD5AFC3F8678CCDC3371B2D86F378182B7F40517FB36DB0194A0D517D9CF235D91001FF\ E86F7386717B9CDA393C712E3E2628768EA5FB41B1E26B11615B6187E0CE73015FE6811420C1\ A2CB00D69399C91AE4A21F759B31CCE31CF01F0F9D1E40162130EDE0ADC73B641121F1286FE0\ 3619B2768E1FA021311CEDC5B124EDD6B1AAED550CC3AE65E0DDE172F9A8CF136D417C859DA5\ C1B6F2166810AA46BFBBC2C13B1D23EECA6159CB09D511233A50FCE4DB27E3D35728CA1F35C1\ A5D538BC4B1F2D95C8B8B424B346FEC0EDBE78D727B9E982EC2DA3CC81238D2317648CCDCEED\ 1C887E97FDAA0E764807F5503FC97A555D99B417185F75F06CCE3646E6C1900A64DAB07881D0\ 74FDCB400043275A4D23C5AB64FA7ABA88D225EFA9AA399A7C18640B09D37F189D5B8AE4256D\ 20A50B5BC26DB9DD6B2A81436A098DB8283BC6BC64C07B0F700A2BB0A4440DF1BB4B63197EEE\ B31039AEA6B2517B54D5B6F93F9432D94E5C6755F4B847635C8E70E7B66A2ACC479B36BEEF51\ 3B583CEBBB97310DA9B96111B137E37A3DB5656A1E3C2F7DF8F7A84857FF376F6AB085C80A3A\ 3733D519677805DC1AB9F0278C78A2A55026EB6998761E8F1853EEE64B843B74714CBA56B578\ 766942B241D32000384C9634E09BCC45E80F5CBC32B86C33AF2E96E0602CD081DC9174B33F15\ 06951A560C0141F940E3F2E84133C137F7002F0C7CBD7D86429963C1B5F8BC3996685FDA856C\ 4548F3317904D4EFE606070F783E7BD746537170A9EBE29967C36A2CA8ED8AC08114C24CC860\ 013195:\ 3A1237D02204327A5D2CB7CEDF024363 [MD4] :31D6CFE0D16AE931B73C59D7E0C089C0 44:AAE7B2D482382AAAD75FDE64DF8FF86F 0246:CB386D6A1189CD159F4458A1CEF7B28E A7EEB6:1C4E79A284594FBCCAF9C67B4C41A7E4 93C40129:FCD8841C546F832310476AAAAF7E40BB D9CFF9DFE7:E05B135D5DDF92FFB6E85F95E1B246AE 6C69618F2E04:9FDB803940A796F1A3812C3FF149FD92 51CB4187084217:EBB806618D65266CD195CCD4B00E5CA4 7FEEC81F78691BB8:E1C8A1F598A1465C30B180731D134572 D9F6B614968646FFDC:D27628156A0EF18309EC5085E67097E0 747F01DF7F723DC311AF:FE1F19114FFA1695A28B92315F6911C8 E933B52C2E88CFA8E26F3E:18B8AB7B5B7610CD6262A05417AD467F A1483E3BCCDAC94A9A2B1A63:39F0B4AD11180EAAE992489347AD13C2 F1C7365D2B16368DB23EC806DF:A2CF9BC244949E0B9917AFDCD0EACC65 8DBAA281D14C19F35C2AAD537F7C:F2E6FDDD6568EA8AB316111E5946CC9F 785D55E2AD30E4960E6AA3482B648B:A01DA0D565A3753717D1D81ADE3166B0 BEE8FFE30FCF0BE745BA22215B320F66:68A5FF4E4CE33D50E8F42B49505279E3 28BAE5F8B5ACD3BE26521E0CAB1C9A6541:93B775F3BCCA2F2BE24D5CC63BBB3224 2A7415DBFDF5FEDAD4E8DCD96543FA6D03E8:2BC3478938FD5EF823D2974302E61ED5 285A585DCA6B4B4D59554C80BDF8B19491984E:C7C6E691B1785C64D8CEDE5B6F6B98ED C7FD53B9E39B4A447442C45B7AB3FD0602C57DE4:3DA2CF785958E6C115D8843BEFAD1979 D83F308D3AC2F0D82C3E69A08CE8BD97AD02E3492E:82F6CA7BB64799BE36AD89714AEDEB83 936800D2940A8A22A5D54804B451F59668FDE5187416:6E4F874F35C5BD38617A31F9EC693B44 C7D740B0DF155D9C1F11D1F6AB708A22FA1F2146D48953:E72B78BCA0A764CDAD13FF69B48B2A8E EF7CF50DFD9B72E8CA0099BF631BB334CABDF76192CB951A:\ 9E7B7A7458B016BD68736D1512995585 F5A46EAEFF6B9A9F01653E35E90116342C470425CAF7B942B7:\ CC032DAA2546C0C2BADCC0BD77EB12C1 D8AE0DE315E449498FEAF2FBDB1971A09B7BF658AA70AC782E15:\ AA1E5DCDD854DF06B715DEAB33E62E0D A1EC5E04538FE815D26B6B3BD9A889A43416F301064B15BCB480B7:\ CACCEDF21D2BF863F1F4719B4B83F18F 97EA99966751703402F57A2B5B6505BAFD1C440B8147C87EEC246F0A:\ ECCB8D37D12527CBA6D493169AF12159 01864FB76236CB325D893BD1C7778E017284ABE61217C9B5C6B41E55A7:\ BB7EBA4B6592A688CD29C782FDB74EB7 976A837D0AD29D030D376C3D8BDFD37F4E0AF1C4BB72B043EE3B6AF44AFB:\ 4B814B19C0DCBFA31405AB495034A4EA 6E72B873F63F61E03EE166E6E988951ED02398094FB6DB178B2AAC3A56E248:\ 95BE77F915BA362E80430F4911DAEB22 894B431AA20CC3AD8CC34C95895E0BC2DE6599FDDC863040ABF7735FA2128905:\ 4CE468F58CFA95E789D74A47FD8BA37C C79F893B67218FF1672939A1BFE5F7E48A5E81E502585DAA16378B95F853251EDC:\ 777CF61193AAEE17EF6B68B5168AFD48 DA074189254813206E7A3F4483CAE746550F5658A8287D0250E988FF49E3EEBFFA81:\ 011542927FD9263EA2CA86D668DBBF10 E881A6FEBD17422B451CA7DBC1D4A7D9878970CD3E7FB0274247654279FF837886C68B:\ 2AAA877A05C4D944ABF15C603C8AB6D0 0ECF376EF3EAB389E65F415D4247031420792C988E47D63A354481B52C31ECD552728A79:\ B817B64F224083D701A6BBF838AB7796 888941D7E809DFDDC49BA6B2EE804DE1AFBA451126F0CF8B9BAB1D04A78EE28D98A4A90288:\ B320402832D24B4EF38ABE044B521EF4 9634A438BD14D8DDC3AE525A04C37E7BCCD803570C1A9123F714614B365017360FC50F280936:\ 8DF996A89A7D2BC860ECA7FAD90B34DB A9B5ADEC5616B4BB3DC89A5996A4977DA8C1AD36910143C267ADDA0BD80F9054F4DB\ BF02CF585F:98EC309FAD45969BF125350868669D39 CB76A9EA278044A520757E020ACDED18A5417D096796B8E8119DE09ABF5F17F95E82\ 6AD61E39858C:F29AB28DC618F5E4FB8525387B00836B 914502535D0F05A72A316F15BE8316BF9E579EDE86C591B8037D1EC036D95F8CFEA2\ 65032029F6B696:CC09BE6F76C27424ADA44C52554F05AF A273736D5BEC5C75463FEFCB2297388BAAF202111517DE2506D331BF7F560E020D34\ 7848C2A1459423FF:9AA76F6791DC4ABA5DAF67B4A62CBB47 F6DFBD94D04077E328166DD05FF54E6C7BEF77E104648951895771BD4897B2B7216E\ F6A66A7B18BEC8A639:A90B980820FF501957009DF700451D78 6B5B94AF15D1F60A181925BBF0372528964F79D5F2AE04850AC53105D9D732F3EF69\ 9DFE26FBBDDF43E17CA2:BADED5524542AF6A21F796EBDA1A096C 520817840BA40BB5AAE8709ED60F89D7642BC81C7B7D68A52566E353AE869D0EDABC\ D8B3CFD3200851AEC7F632:BE5618463DA165C84B7E1C8307A5A301 3F793FECECC4896206D2A3F960394DDBA4405615D3DC17453036958DCD2042AB4B6F\ AB256522ED1EFD38C22D9FDA:9914518E9351F15DC4D60B243CDA1B58 2F859EE93CAF6F3944D1AED1194A53C236D95B721FB892D5EDBA47CCBA6D95EBD498\ 5086A8E3C0D7E84831C41ED70E:99C81ECD5B50F43DE3385A9E0D482CCC ACCA7AA450D9FE5AF957C5C9FC152822D0A7FA9322B044666B3264ED488656A805D9\ FD95EC243FDBAF0937BE9460D77B:400ADD0630AD12EFD9695BB69AE126CA E84D9DC677B38B6A9646D2648441E12D7DF7BB3DC0AC0CC20C2783CF0C1C45B93272\ 9C33042D0B013B562DB482D50C24F2:8CBECF75DBDAD10C9D480579B476C6C0 07C14E13B62BB89468ECDA029F66EA279EC9AAFB7BA7C80FFCD9946F88CB80F32317\ 7B77C65C1CE9397775C980A02B481C92:320C6C79226261DFA3D2B9BAFC51A3CF 7F999F347589D4E2901BC1CA533E8DA0D3BCFC39564DE20FF0537759CEC5DB807D6E\ B2C9D4587AAD0297BA6CB0BA6BD436CAB0:0FA0F71F8E8B9F47A966283F3C8BA4E3 3099FBBB801C8B27A26B549FE23A834966A9AEB9C59EC76E6EAC7C20D934370C6B42\ 3DA31582F8BADBF3CEEDFFE69D3333A8E15D:B2CE84058F967E45000D287500C9D81C 839ECEAE837ADA0AE91E52343B095B9CBE6E1529B090677C36F4CEA1FCACD1067977\ 88954417C61F951D678B6B1E8EED9FE7E0D2DB:7498590DBBF71F17EA3F4EEF7FD68641 A4F122E71DAB34E6E35A27BECA6F3753E9DE662FA23E4B6492A1A0145AE3CA7362F0\ 1258670B9C955F55A300BF2F7D22B0A020E5CA15:98754DE80336A4BD012F8A05617532BD 6FD5D1E011D2C155BF4CE63FDA59BFEC91755D6DE6F646CBE774BF96FB8463B8C880\ 6BE81F1238C5F9AD1F77A2A277D2694D12C3E5E9CD:C31E7ECCD70786BA1E2301239E2C9EDF F1B68A476C7738A656E25FC954AA7A42CB7E6BDD3142523F6566CF5B838D13E0E011\ 263407ACC6BD74B0FBBEB9B918529FC5848031896C0B:90FF6B4BEE1A2B833982850E2F06FDEC D223A6E65743997A871BE50E918F03AFE9B9847464A465BE1EE852BFDB1501989576\ 95F18A7928B0041575BCF5A095B3291242DA05D766E1AE:72C28BAFBEB177406866743F1B8A2B6D 784743D4AE588AFBBA7425AA095A1E757017EE0F126683CEA69901458D237A7A69CD\ 2235FAD6A1DDCF1E4FC98017B3FD2081BFB6E3F801B46FED:\ D956EE28E490B90B9C57CDC723A310FB 3F18CF84A687A40725F32352824C9C2AA7444A4888E68D6892C8778D478EF4A5D97E\ 64F0D4D6D2C8A20AFEDAE41F7FB30EAA293AB43DBB16FBD9AC:\ 51678626D21DFDF58AEB6B35E977730A D7BBA140CA4D4C398732FED7CCD574C326FB498E8750177DCC9347110E43C82B9CED\ D9A3BE266A6F93C1D5CFE5C6EB2D2768C5841F562EE01A4770B0:\ B9DD09BA8E4A8B4200E943F928420368 C6B516FD918CA874B08B446C7F421AB01532E12D4ABD34CF1B7E9AB6B478D04D21D3\ 98C9E486223A803003E93EA6FDB6323FA52634383D5A9E43FAE4CF:\ 6D14138691FFC136B97C432E88AE1957 4C4E1022271853F9FA261C3A52BF46E806A73ACB3E3AA25343D826B5291BF5DF1713\ 77D76285273B2AF7CD2E50A3D5D2BC08742817A29851AD5BD1F8EE02:\ 15AB1275F436B96CF1BCBFFAF15E6EBC 3141EAD348142A07B4B7853471FA243511F1D8E6C633EA25BAE04CDA97B1AFFFD0B6\ 47131C67040986EBE78E86D89F1C86CF591365F7AB45865EDE0628EEFD:\ B58A8F44BACCC511DE13227E98A69F3E CA547E696B455522A16EF1191F8C39196BBBF6EABA00693B69698DC1344416F6F3BA\ 1DF367B7EAE71D48165678F7C78B0096D6DD5EE2E7EB618E85758392EB7F:\ 8391004470075BF3CD8858C492E7184F 2FDE680648A3CB7210D74BCD690A5F03B1DCF7EED861DA0F4C4E3FEB7B6B7D4B4988\ F5605B30613B87E7DF8D3D6050721BE4F6FF0674EABEF58720685EDE942F82:\ 2CBBC00DD0EE6EA828221934A4605A93 C6E48AA0604F18E1F579BC827779B850FAAABF96327FDACE8C10BEC830AF1EDEB2A6\ 46A5143AB342B9191FA5B02A581C4CE68880608B9D37120C2EC560B4AE309C94:\ AB6200335E0B4DDBDB719BC4E36DAA07 84600F3274F4ADE17F1C8C7AE3CF650D861269DA9079F2474DB121BD29FFB9A09D86\ 44A62E8E88C369722FF09108C430C8FA6B0E9EFF4DBDF1F353E1D25E5661AA3E92:\ 526A127BE8518E713CEA69D5147E9382 :31D6CFE0D16AE931B73C59D7E0C089C0 61:BDE52CB31DE33E46245E05FBDBD6FB24 616263:A448017AAF21D8525FC10AE87AA6729D 6D65737361676520646967657374:D9130A8164549FE818874806E1C7014B 6162636465666768696A6B6C6D6E6F707172737475767778797A:\ D79E1C308AA5BBCDEEA8ED63DF412DA9 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ 666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ 043F8582F241DB351CE627E153E7F0E4 31323334353637383930313233343536373839303132333435363738393031323334353637\ 38393031323334353637383930313233343536373839303132333435363738393031323334\ 353637383930:E33B4DDC9C38F2199C3E7B164FCC0536 [MD5] :D41D8CD98F00B204E9800998ECF8427E 7F:83ACB6E67E50E31DB6ED341DD2DE1595 EC9C:0B07F0D4CA797D8AC58874F887CB0B68 FEE57A:E0D583171EB06D56198FC0EF22173907 42F497E0:7C430F178AEFDF1487FEE7144E9641E2 C53B777F1C:75EF141D64CB37EC423DA2D9D440C925 89D5B576327B:EBBAF15EB0ED784C6FAA9DC32831BF33 5D4CCE781EB190:CE175C4B08172019F05E6B5279889F2C 81901FE94932D7B9:CD4D2F62B8CDB3A0CF968A735A239281 C9FFDEE7788EFB4EC9:E0841A231AB698DB30C6C0F3F246C014 66AC4B7EBA95E53DC10B:A3B3CEA71910D9AF56742AA0BB2FE329 A510CD18F7A56852EB0319:577E216843DD11573574D3FB209B97D8 AAED18DBE8938C19ED734A8D:6F80FB775F27E0A4CE5C2F42FC72C5F1 DB7BF252A4641FCA34866BCD5F:6EE7E13A9D83DA498EC31AB7F1AF2F9B 8D62994630AEE95D4C2F192B3F7B:7BC1620BEBB0BA89F8E51454A2F90421 BD68233EAC90E380907F13A3DB7A4A:529961E476F563084D25E0F981CAF73D 8DF425048D0BC1CA3544975250B956CA:5127AEF56B982E136A90BB0617AB89DA D18ECD6B341CF10DE7AFF3CA82EE04FFE8:EBFD075F46B974E971971CE09CA3960E BC66823C5C3B9328940D2C1312B90DC92205:436D62CA86CBE2D645B728C3A3D012FA 247E8B8F71BEFEFD1B001D34362851B71C2C5C:69D0CC38938B60E5308F62748C91FA78 B2B8E155E9409960B216FF533647F1BEA88DF5E9:550C07A2545183EE4A46695CDE92CEFA 87BBCDAB47CBD7A8DBFD46175E901B2F2014D2574F:AC1E96028760970301A2201C02E7BC2F E68232740643E72213C7CCDDF3FB6BBBF8FA91318E07:4ED55A365805C916A7B476F29161BC1A F0521C42DB4D92770C7BE97BC3BBCCC13936A72FB0ED94:ACE41D10A5771692320E8AEB0C6EE308 9910BCA80E2A1E98D16871CAE15129D0E372F07CC0076C6F:\ 349B05E073186D50B8E98581C90C6254 BFAFA136A48F1DEB19DFB707E34B495FB1C72CEA1DF6F47993:\ 31BB7F0CEE1528BE4FE0CCE8D140F622 DE42D4B7A1FFDA4F086142F8D9C9A29F752A348E566F8CE53FE0:\ 6D7E9235A586970F8670FCE5FE7A4178 45BDEEEF37A626381FD30D7AE7DA9DDB4AE8F5F17E919A8286AE2C:\ 9D1D7ABC247166C9508BB99934DAC532 C5661640140037B16D5C98DD120AA50FAEB3548ABE84906DB82E0228:\ 0993CF5D2A56DF4D47F9FC2DD48F62E8 B5B9EAE5DF6E2191C154D7128A2286E9C7E682B24CBC72962470BA89CC:\ 1BE6103887AB908F155C0EB3968F9E37 264A4620BC5429260CB2DD0BD1639613F9AB513189F54467D46767B737F2:\ 828B112BCEE9225AAB202B54345F002F 03BB178060230719B7AEBD628334EDCA158D062F3AEA6C0073370831FEAA32:\ 2C07E94CD50F9DDE6C9C99085573F6DC DF9A276CBECC9A28D999A67BD14D28E1C5827DB2F0B0D48BABA57F07BED49752:\ 3D39093BA64DBD00C07183177CFB4F18 65ADA2267A286CF3490F5967574E707FC3C03E837D689C997B9A634E5B4710119B:\ 50C430128BF7499760DA8164F4FFB71B 2954D2628C422A02C1B8A9D2950D177B508FBDF57DF94BE3447FB79E40B2F65845D1:\ FD9242F1604EA977F5DEDE760AA9319C 053F2617C86E5468D53D869CD260549392C53F6A7D8429685B86AFDA12CE4B611386ED:\ 929AEEC5B56780EC07B1455B1D2E0580 FB55D0287923FEE055AE96937735BAAB47E488E3C24160E13B5FE2D06534A2E00F957FF2:\ 35C6713BF2E172D0A30A142869EB3B9A 38AD3FEC103EEA5F808779233955B03EE4E7677A894A8159DE95E9FDCE9BC57D919C13C66E:\ 73E6A3F3BF0891DC4FA050936FFB702A 765D5F0B37926C40D544BD7AA4052EC15BF4F367567C2F1ED21427C785724EEA29303B055A25:\ D2DEDD1D77EB642E6CFBE87DA2537AAB 86DBEF8CC3D93F340FB31E92C2324BC3301B9196ABF4292263AB0B883E002423F063\ 280B0F385F:92032B502AE736973AC4BE67E263809A B81F79B5B9B17DA768607C66B99976BAD8F53DEFC743EDC387B6C2584970BF5FDFEA\ E48E99AE4C09:1CE836B431110C7E4099E5D8F8E54C0F 8A8BC0EE1763CBB2081E774B282085DBCDB5F198DEDE350BFDF7B290BB097180BA50\ 318A833F5BD9A3:0B278644E43EBAD38FB5237405B31C35 359AC2B44FCE85DECF35F5CF9536C7F6C48BE18F44731759A8D6C5DC2BB8374AF0E1\ 2A48F8D111286067:37FD5E056A2050789F8E95E9EEB8E564 6213F3543EA1B634B8D9C86A26D08D1C8B7DADEFD9BE50721354395B1A99D653DF74\ 75A5FFC45A7E035ED0:79FB0A2C96B58FEA3194CD6FB3030C1F C2409DF528DFE67C1488D7E84970A82E006EA1B34D97728EC821FE0597D8204906DD\ 8396948C2CFD9A86E13A:E235122E1DB5E26DEAFA30C64C8FB5F9 4E314E192FD989FA432E727083199163B6448C83CFB98A968189BF7F3DD69B635EFC\ 381BED87108A794C19336A:1C494D375150DCEF2FD51F84AA59D601 2183108500C74144F21D67DBE132EF997B0DEB97513A381334D5413A6805733357A6\ 41A3EB2A72F0813C21589A9B:23D80B20EE33C33D8A75E485309ED45C F43753ADBFD4B2BD905C0F06D5450673D98AD6F50E192625338F5737DF8A0B375964\ 2FCA66CFFA9C96EBA5F57078CE:B176D8F4982A9CCE331366079033FC1C D04E4313C792988B8774DD759AD8BDBBF98306F4F6F7090F0E5F68FD8A2351544634\ BD44F7423F30FE37881874F5B819:9BEA5C357BF5202B6976307713A903B5 DB266910FB841658BB855DC312702CB639834C1E5C50AEC2AE199D352D2E4CA1DE6C\ AF81968D586A31A3C5D65AD0F4912E:768434AC733C239B8DBCA7A459A2FB42 43BDF85AE7C27AB66EEBF743F1D4B67F2BBC98EDB8B92F3251C81CCF54A219F6A684\ E1B65ECEF7B3FC9C95AB3B5B7F374FEB:46956F7F64806E86C9973DA6CE2FBF90 A87792462EA3BB903170039536B13C1617BEA2285FBEC835A7FB2CE7FCBAE27FF0ED\ E753862E0AABF04DA01B74D95C042E1FF9:6D78DF86BBCBD8B08DD7FC648AD0DA64 CFEE147442E699CF016714EFFB3579981230BEC61D7BD8CCD4CED1556278DE848627\ C9D72FAA12AE7E00821839FFCDE8E2A421E3:67E9F45E71CA07B2E0D0D4B658B84228 32CA147C83280D487ECBB61C3FEB34F0D44D6E5414E2A544EAA2C2992A19469090DF\ 86C2D98DC4350205A50416DC045A28580BE425:1136E79134EC1B4AFC61F39F9D0EDA2A 03B674C177DD0E9D3C450FA48AC356417B319874C46B04F9387E823785FB6A2CB103\ 5B17F7B3B789BCC1721167BC393518737AD65A1E:CB5084C965F8433B3F739A3F85AD649B 7538B43E81C97808AB82AB9BFAE52E2395185B3779E0631A11FE85B189C9F390BEFB\ 1087577AE977CD79AFE115D7462F60C4693BC16E0A:0D88491C0EA8F820A253F250B831BD26 FD04FE966AC54F6A1BC4FBC86FA328248AA235D9F190C7D7D72C2382C094EBABEF78\ 72BBD5BA4611445B8374F0FC0269E5032392B95B8DDB:CD9965783D9A1EA097E9D9E2831ADCE7 98948A1E28A1F7B97BBA154ACA43BB28C05A197E8471F1D35359F5744C66BB9D0FF2\ 34B7B5E2E73D533E5FC78C13FFF2B68B3C7DF94B860752:037A76A6C9B017AC440B3A9330EDD0FB 06449B27F353990EAA0A81C4A0422079B5296FBF87209D084DAF4C81C796433E9235\ 71733CAE194EF225B12E67D1F5F21E0A50486F1A3E57C6C6:\ 75B70BBCEC3769FD56BB04D7FCAE220A 75D4D3B833E659784D26E988145A3B7B01774CE6321F61A08B0A0C1A4645FDEBDAA4\ 9323B051B47C1F6B38185D60139CB7C22755FF6E2BB7FCB5BC:\ 2A087E2C8002DF98EF390183E96D52AA 20DF7267729FD77DE12969F507383E240F39F018A0666E32A58846E0ECD9FD6D7A13\ 2BCD755F463846A1C861BD5593DFC71318DD7BDB905C315FEB72:\ F414EFECC9C65E20FB175DB5C7FA2AC0 E96C3DF4D195693DF4D3CCFACCDA4C6A18EF039F886F33B6980C4F1233A5C704B3DF\ B205751A6B09145AB69E47A1653CBD69A593040AF6B3D6F5407267:\ F14A6A40918BBC6901639C04C34C1B3E C44CC1C20FDE000FBD7F49453FE4519000E30AEE2BCC504B4FC0911807FDEDF488C3\ BAF39A6D227A22D8888E9912C1AA9B37DDD2EE9C509B300E864493A1:\ B82E59AA885C741BEAE1DD7FE19B1ED6 B37A592ACDFC58C2E4E78FCECF067111846227CC1C53347B141F5F378B64FB5163DC\ 25149B88C28E6E390C561245D73485DBA5D616654EE17A76C20300E774:\ EC58A5879BE2E425B1A126AD80E32FCE 3104C2E23C21C174A512C7DF0DFA11DE82FF6D9B8CA86331970F8C29A5BD5F58DBFC\ 874B9F3F81136E8FB1AAC2D244C697637526C8A680B3072C86272FA684BF:\ 51E46388BBC048DF3914582F8ED32E0E D6EE0400EE5E1C18B170D309D17A8C79918449FFDD945F33C79DA666678C0EA732E3\ 1226BF56398B0C0BD654F286F00ACE0184C486440433D76E74E3ACBB933F5D:\ E2592235FD61589C07E26861E34B75CF 8910E1CA14F15DAE918DAABBC4C7555417ED6F8BED1950CF7B6B321E14D82AA49296\ 0DA9068F8B24A0C061EA41FF7C7DCBC797B4CB1E0A35C8F86E33CA0CD558E93E:\ C0059500DCC36D2C1B8D07D521BF9047 FB7B50ADDE9FF5D8DEB65C4764DD3FF42C15F498D65018583F224734DF414C8E0523\ 5B406BBF79FF32EAA14DC9599AEDB4A9F201BEF4AD2D324F1736EB95F9B70BCD1B:\ 0E2496AD1385C0695F1123141170F9DC :D41D8CD98F00B204E9800998ECF8427E 61:0CC175B9C0F1B6A831C399E269772661 616263:900150983CD24FB0D6963F7D28E17F72 6D65737361676520646967657374:F96B697D7CB7938D525A2F31AAF161D0 6162636465666768696A6B6C6D6E6F707172737475767778797A:\ C3FCD3D76192E4007DFB496CCA67E13B 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ 666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ D174AB98D277D9F5A5611C2C9F419D9F 31323334353637383930313233343536373839303132333435363738393031323334353637\ 38393031323334353637383930313233343536373839303132333435363738393031323334\ 353637383930:57EDF4A22BE3C955AC49DA2E2107B67A D9C7DD80BE463DCB2087E3BE65F0453BEBBE1B6A3440CD10CF26B60653F00C16B92CFAB17F4B\ E6F2A7A5F463D1558653DEB907EEF6579BF86ECB460A252B7D92C6FEA35AE8267332E8169284\ 86B1AF0AC4F61238A8A2D37E7648A9B8F3E6E972CA989C6C6FCBECCA418650DD5D31EBD1E6C3\ 1288C0AD0EB3DE61EDF01863EC11C2BBC4D03D78407999EC1A33F606F1A49F6BF1E626FAA2D5\ 7E4FB2B6838B349C28B32E90377D71FDBDED640E21700A0FA6475F34462098FFFE1F76E3E824\ 09C86EFAEFCA4599E764B682FA4CAE0606D39F8F87CD29BE2ACAFEC9C0343A4ECCB8F43B1100\ 49AE7B74EBCF01567A86F3B3EF75D38874940BB142FD65DEFD1A0ED4C33086915E46F85306F3\ 4CB7A110D68365C830B822330784EA44C168D9428065B206B34721EBBAE49B840AA74B0354FF\ B1D744A29451A6089C3C8B2C7F242BB9A83894F311ABCBAD2D0F614687D935E5703CE323764A\ 016AE97D841F7122BF6BD101343790FB3FF889DF86F770B4825BDA11FDDA93BC1CFD2C0D9CFF\ 907330BFEF4758BDEDC2012B025561A60B659B4E9E4FC458EF33F7D5529A64F10D87ECCDBD26\ 0AF5F3D76E069BE60FCD10274C7B4E199E8A9E85F0D6565939808E51B52684CA76D5F83B515B\ 8C4936ECF342B770E1D910C55347527EE495E6B16423369E781037CACBA212C5A7380789EE16\ 8A90FB2B291B975005F1ABA7DB3B9D950202E168CBC8DFF5FF951E28DC86E6FEF0371911CA1E\ 94CCEE27E42F7EE907273B2E87438D3520D1DE94C70057FA79816E5BAD7A840FFF881BCD3C68\ 0543BCC19E847A3136EB84EE7389E3978E122FF782702D6BFB1C26ADE57570D15DC8408CC132\ E8D647D8B318FB76E8918D2513AA9E62F64E4EA3DC8D618E9A596F2B6EA8D0C55E2791A71392\ 8A7D6401B533CD86048E3581EA8F60FE8F94F6FD5B577B73BA339AA8C5B4CDD093AB895D6F9A\ A5575BE5C9FCDC461A1E9DC50F31938779AE8BE160476AD65FC1F7FF9601B07E48CFE676686D\ D772999737D0264EFDDF546167F4393BFAF26CF29801A4D4CEB04A5A551332DAE0014EAA9E09\ 0260CFCDB547883CD0A622102AD1C1B975353BBFD2F1C98C555BCC4DC26631AEC0E9FD70F609\ 8785748F5E2D3A1963F99355D05599C180FA35920E48CC0594CA3F3B1A05883B28B73EF43FFB\ BD8A0AB4C4EAAFFE5793B415B957CFB27A46DABEF173B316BFBA466023C7C89EF4A5FDE003B3\ 602E722C9E2E3E624E2B130A024A2B6CAEC46FFF282412BEE4F28CA4ADC6822219D76BA77F91\ 1EF8F9AB52C5066806A1D47EBE40045F1DB3590BF0128A56CC86943670FF83E8D4E120F6E4D0\ 082386EBDF83488DFEE827371C773A2B7A03ECDAC24EB977A16361353DDB164ABBB1908CA2F2\ BC694E141DACFCB241746786FB24C04D2DA7AC188436201B3556ED2D6874B0AF6227AA072B51\ BF8699:\ EB16D2E1DC85C8EC527FDB6BDF228A63 [RIPEMD-128] :CDF26213A150DC3ECB610F18F6B38B46 61:86BE7AFA339D0FC7CFC785E72F578D33 616263:C14A12199C66E4BA84636B0F69144C77 6D65737361676520646967657374:9E327B3D6E523062AFC1132D7DF9D1B8 6162636465666768696A6B6C6D6E6F707172737475767778797A:\ FD2AA607F71DC8F510714922B371834E 6162636462636465636465666465666765666768666768696768696A\ 68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ A1AA0689D0FAFA2DDC22E88B49133A06 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ 666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ D1E959EB179C911FAEA4624C60C5C702 31323334353637383930313233343536373839303132333435363738393031323334353637\ 38393031323334353637383930313233343536373839303132333435363738393031323334\ 353637383930:3F45EF194732C2DBB2C4A2C769795FA3 [RIPEMD-160] AC:FAF1685349FE8B832BB2FF1CBA482583B3560F3F E9EC:C4EB5003F5FC64E122194EF6FBA841B30B1E8761 74524B:D5904A1D8BA51B972BCF6D00681A5F0306C57AC5 E233E3B4:9CEA3480EF59215C514C4FFF9B813677120AA8AA 445A2F97AD:6AE5414CBE327CDD20FD8887F2F94D7B69222AB7 A242802B76EC:5DCA1535835D75ADFA1B204C5CDE68C2CA8F1D67 CBEC35D2FC21E9:C9809CA68C9013F34B7525936DB84B5737C591DA E8F3385F8B210A7E:497049F4D70E7B42A3F30582C27CC22DA5A51CD7 61A82B5B622C48F6BE:DF01106CAF345F6E084DC5A46137EAD345D445D9 4AC97BA5461EAF9228FE:C44507E89C39B4E9965FC9610B6B82985B1A2B57 0E0B7D71B3CDF458B883B5:39F567E3B8A7AE93BE5AD8E35067D8B2AC81B9CE 43A4A8265FB24F3279D6CDE3:F6342D8150996D93CA43369A69A502F14DDE041F 5CC368C293058FA49906602624:893A6A07EE0A2669BAF707ED3BA2376125EF9654 0A52FEEB91C5D0355FBB35E93F5D:5162732EF94AFE500679F550CBECF8043B70ADA0 A3FC5E1467219DB6ADD73F59808955:3DD7B8C0D2278884B5A5C22A3CAA061131A5AD7A ED45B0BC151B3A739D710AB3AF72A32B:5BA207C3A45289463C98A21E2138C3758D2DDC4A AF7F01692A1AA195E2A3856DD936285F2B:D744FC79D37AA33E16C60DD7973B7E0D1E790828 5028D7983E49966980AC8A564CAEDDCCE890:5906BECDAF00A5C700D548EFA92FB23FCD1C8D6F C17757BF03B8661B4407D06E4E47E8B6C678FB:2B7202910CDBD3CDA240AFFAA5929D6F82FEBC48 5C4172923580ED789714245E42FDA873F405EE97:\ 053DAFE5970069C38F5575A54C4BBAD3FDC34DBC 74F77522AD9FBC0E45DA88354EE4F5552EAC5F02F7:\ 0B72DF59FCC468CC4BEF4B0A77DA59DD4EA4486B 33A75FB9CDBFBC9A257B122BE7ED337BD65CB1FFE9A8:\ 1B8A94BCEFE1E6CD9000A70AB342FE7930E62220 8D7042CBDCD336C86E7732A1E633BDCC137380AFC37D25:\ F18C667A28AA595890E689D6CD19FAE3F9FB7D7C D9419BA075C613F701E19DE6449E21A22FE4BB58067A5B0C:\ D656A0F985E186388C2A211AE0EC8EA30B059505 8E5A281FA95E7E9B42EC0CB0B9A35B54851257AC78494078B4:\ AEBECEDAFAD9EDFDC204AC1303D14F549EE12CCC 3E01A429466E67653B7B07751F8E497929A0DE5515FBA7D69FD6:\ 1640ABEE310D1860D7944F0B9929D3E4264AD358 1CF65AB71AD544D423CB904F064A5D227A01761D6A6188296201E1:\ 0181503434C565B41EFF7C432E220BCC290F0A71 5781599B64981D4657B3C4751DA4D7594BF446E386621EC838C30D84:\ 07D728840AB1449D31CBADCD5466D887EDFD4650 44C392B435A8CE90062F7BA756D23FD7A3582F23C61DBE8A06BCAA2B62:\ 4ADACCC7626AABF56320040E42174BF284D4333C 053AEE544BD93733C6FAA8AF9B89D1D7C1067832273F23EB6BB5D1D7ABF4:\ A993D46BFD0705CB8692F6D6B88AE5DCB20CBCCE 7A641E5243317176E497DDD286E47A2A36DEF6451A4A44AEBA12C03CFEFA57:\ C0CEED6AC5A60323EF0B6D07535AD5264EEF0AFF 3BD0AF34C27EFCA58CE047F265F1CFC8BE60280CBFA57225AFE6B353EC1B1B86:\ AED53C23187ADCF3C2D85FE77AA3FFA7CACC85AD 5C861109B9A1FDFB6E9B61737461F722E6582C94C9B406DED106DFF2FBACDF5B07:\ CA900EED8F00A8144C60756317CA7B23FE5797DE D0416B0BA3B19EE355186AC2A09ACFE91964F229DE3D4119AD5AB4A09CF0FE10DD2A:\ B2421A5314D8311C18773DECC2798300A36CE63D F7077210023297CF642C3755338EBD2CA234C22269FFAD31A7BC6B12EBBFFCCEDE293D:\ 797538F704EF4FB5D7E93DDE8B9C742EAB19010F 169ED88895E743A171581730D9CE32B90E557C2AC178F00AD15C13B2639BEA59AB5CF95B:\ 2BA71C7B2BE43AF1825A3BBC7DCCD104A8F8AB74 747EF1D2FFE2942444429B7B6D46631C7BC8C00A63D44176014E8594D9F2E09451E956B0F7:\ 5EEDCDDCCAB146BA30C9613D5B4825DDF6D0DF57 546E13EFD694F71819385EE6F9A8022EB57B0E6173AD2042984AACBB6CF506102317DDDA6773:\ 5BCDE7DEE110935114F5422194178110A0C8558E 8D0AD66F63EE8211654EB12362F5CE0F7A0672A3E77A0F3FBB6E6986C13ABD2DEBD6\ E7F916FC7F:54FD721965D4C6DBEBE9E3D2B5A334957EA3F0BC 6120F98D23DDABF5CA10022CF22A58CC89CD516F6B9AD1901A6C450B89569BD75B6E\ D43D1AB1ED1F:560FD1CF282E07A4FBBCB495EA33C550CEC1CC1A 7497FEA1D85825B29DBECE7C90F52B1B4760393693B31F56EB366571D49CB6B0EE85\ 4BDE58BAA64FBE:B61AA965CC9A9A1AE9A7CC0087E7417CF942A0A2 2470B0926239D1A1B94F85204EDDE011000E3D08DB9F59E86A8CF7217C48C5DBE5CD\ 00480FFE00A22B89:81586567893FFA39A8079018F46B9FF14811C590 56199F4131AF9AEF9BB9F1CEFD8552E75E1B607770A461E6DEBA3664972908DF469B\ 7E065D0DB531608171:6B74A4AB1C06E029004F14DB759C344DBB770B1B 554809F00123973A8308B8D3D5F10EE4E5514DA51F615E1F606957E1FEBC87BA9C36\ 9F6ECF29F99CDD57733F:FBF816D9A81A8605487F6529255DDC43D031065B 4315B59DE93EC8AB4BCD8EFD4FEE3B87CA4194C24211EA0E79055DDB1FBA7511203F\ D56C0154AE12DB25ABB434:F465D07419A5F3AADE344BA5D64A5133EBA1B873 7C2D0A5131F7C83789B1CBA64E5E6B3485E3340ADA2135008FBF1862BF711C7A6559\ 2FD4A49C511E29CF910003F5:C9D8494FDDF45D298164D5BDA3DF18AB29434D58 7597DB5290120386E158890C7BCD70DFFFC100184A8339F98E7EBB17B23B6A88772F\ 4A05F2E0A7B2059DEA991BF154:CE9AB0CF93F471AB913043DF76270514AD281EF7 B17BA36D07623609ADA5CF2D8F878025F02C3A4F578021BDEC12345A53780C71FF9A\ D5F280BF8E1039E5643389F478EE:2B42FE8018B985141E4EC9604F2C75D454155EE5 AB1FD81A1D2128A9767132079C36929BD76336157054FA889AD09B117DD753166CDC\ 9AE51EEA15DDF8D7B3113F8534DF77:22954D720F8259B5F04D288A453DFB54712BE71C 53FF3194FD863938021F2033F2E31F508AF10E8D0B309FC2E3477495141732BDBDA9\ CBA44F83B5459FCA222A894783741C7B:544E6CACE0C57A4AF18F0913D951191869EF933D 160EA25128E0509398038A0F490BA73C62A03E58997174594FDA1B45924F406DD3BC\ E56253021B446D27ED16CD7AC0EEFEAA48:6A56C5CB8CB5F4E64EF06FB32D94188884682A2D F18CE863EFD88F83ECDAA3ACC57786AD1A961B31446436D4E8F86F5999D475EA783B\ A3473D09C60D0CA6FE3D8BC16D5B5460C296:\ D85DC07C16A44C4DEFEF238EBFDB7FD14C73A788 890D6A3EB3EAA9C75FB27D643257A8196387A5A49556CA3E81351B2668E56FE1D0E1\ 5BA1139C59B48F879664F6CB3B80A9BABA6DED:\ 50F41FFF64A49D8753883F71792305A0EB0ECBC3 370A044BC71750BBCD57491DB54DD6335F426299A3FDD0FBF6C419856CF2FEC70FBB\ AAF6AD0ADC2B31681BE7437F1DE7D02393034E00:\ A31C9760489983399EA803BC7945914B7CA59142 64BF8D78E7E1BA0F32F6D4D4F1AA68B12965A7F942B2B152A47869750DDAB6F1F33C\ 82BA1E75EF76F1B2D9769016CBAC063717FB06184E:\ E2401F5AA89927A7F51D4D6345B482B135EDBD32 F434CDF6BE6104121A533FB7F7D4F100FF1F0F6DDAA76297A32BDAE535CF040CB38B\ E51CDDB96107E1045CF24444BF482D9EA131CD163A53:\ D95AB29A9F3C2A2DB6374FF7A0DEECEE521BA792 1B99BEB5458C96D9D402D85CB1ECB797D352AC8C04F3FFACA76A33B365CEEDCE9ADB\ A53A5BF381ECA73D863DA273FBC47FB3F9A9F6F25829C7:\ 220F85E79731C094C8D457CF97296F89EFE404E6 034A75357AF6255F0B55856FA240FDCDEBAFADBFBCB500D17E1830A3D074B252AB27\ 77333A9381D63DBD4DB685A72A67E41825B331F0E183DAA9:\ A0671C3BADC8D07C59F6551017B00211B3C35B9C 9C17DDD3617C5522491DEB7FF1BF56076ACD10EE7C482D606247EBD6D67F8062A3E9\ ECF29D938E04879C062FFEA08C2F87F3BE840C50294FFA1DE9:\ 47FAD7E0D17A05345E130FDF458071900E90371D 147C4FDD4BB30F38661C0A4C57CFCCF5DE5369B089EDCB74AF24E814AD4BC17A466F\ BD2501E745AE16D2D0C976D3DCF2F93E2E7088733BC6F4013F28:\ FCA67427FAC3BFFF73FBC789A4D8FC0058B1729A 719F6946F69E185FBDD545EF118F9527630025ACF9B62DF5C38E69C9855C7B63E905\ EEFD099E0635D2C40815A01B5EA79585DA3E4F1A2EC97C46DD1F00:\ 7EEF5539213A672C7599B489B0F80B954B0E9D1D 997C62CF0780FDD3164780D38BA784905E4A87BF1DA252E13F6C320040193E5CAD1E\ AB40A6DB7291DF54952C1DBE3B76541856D2B71591D0794435243372:\ 7E882963AFD9163AC13F7E4C1A7DCA9FC4C6CCF7 D93D8E8987E0D01BDAA37B1AFC53A07C5A7F46273D1F77A472D83D0F9D9B241599AF\ C51846C16E33D1C1E2E532BED264C49B2A9919F324834B097509933798:\ FD21687491F7F8D2A8EDD82DB8F08137D6C1499F CC54B091B967D610BE6D6D889F909F843419091CDAE2C4447B8C830045B12760964A\ D8D05EB0285A428BACA3E7B7398A37F7982238288732710EC97B5E32122A:\ BB391A32D4F84199A444F6E9476B908209044624 61B9077FD4A0E2E73060B4B26E86FC7A8131E0E305A5D874BBCD28BEDFA46FA84DD8\ 9431FEF6E16E4B5B3781956DFDFF1C1843DB12329F6C1C365F9A91B3A1F15B:\ E3D6E5F7196B310A56089E76220A59D523DDA37A 9CAFFBB1325C6579B094C4EE8F5B1EB9CCDC5EE861FFA090E055FF2CE6323295AFCA\ 2DE193F15E5FE64AB7AC655B9E99145CE1786F266BFAC834A0FF367FD174540C:\ 954D88771139F64710E8F31A0B990E8A1E569A74 BC15671078B9AD440EB3C16FE28A33216DB848F19A289A6C805655053311A2299F9C\ 7D091D3AA130E0DF2E318E75402D54528A9C67FB4B14D754D4DC41E1C06787669E:\ 69F3A729309B288EE077582807DBEEC2ED5D4360 :9C1185A5C5E9FC54612808977EE8F548B2258D31 61:0BDC9D2D256B3EE9DAAE347BE6F4DC835A467FFE 616263:8EB208F7E05D987A9B044A8E98C6B087F15A0BFC 6D65737361676520646967657374:5D0689EF49D2FAE572B881B123A85FFA21595F36 6162636465666768696A6B6C6D6E6F707172737475767778797A:\ F71C27109C692C1B56BBDCEB5B9D2865B3708DBC 6162636462636465636465666465666765666768666768696768696A\ 68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ 12A053384A9C0C88E405A06C27DCF49ADA62EB2B 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465\ 666768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ B0E20B6E3116640286ED3A87A5713079B21F5189 31323334353637383930313233343536373839303132333435363738393031323334353637\ 38393031323334353637383930313233343536373839303132333435363738393031323334\ 353637383930:9B752E45573D4B39F4DBD3323CAB82BF63326BFB 35B8A2F1B5F332F159AFB86212DCC4DE02B3FBA3794B0E5FE74A4ED9F1A55F55AE7711C6FEE3\ 178A410E3979D8B07594D769AD733EA00D64DCC1D601B871F918F1FDD914C2B6F9EC49B8AC13\ A62A07E1091E0DD024E645BF3B602B4706583060CF9502E4EA6911AC9EB90E13816530B7683B\ ABAAE225781440C35E8031515C45D5E4F5493FAED6B0457DD661B713895FB9D22646ECAD7C07\ 187B65AA508FE4F5B15A5C428264910143581512DCFBDA974902037D82451E4B1E12AD3364C8\ F848E2B2A7D53D25F30C06AA6C62784DE8B8B6D097559C62D340C8103D51E0C303B1781F5A95\ AA6AD1B7EFE3DB9E8D8BE9D1271AFC4DA9B0928642818965C922DDBB0B0A53E6D2ECE3672E95\ 68D0E285177BC5E5A9C2349788F8987267AD5ED26092A552AD3674344DE7FD79B9E33B855DA4\ 7F8CA0A70EE806945A6417C92C97CDC14C6BD9B7B25A2D89FEB62C594FD11A7CF3BEA1EF3018\ B26B0E401EA8C7B8F07DAC07B77ACB78C3F45A73BA9FC32301EB3A19DFF000F3413AE0E92548\ 1D8F93D387CD458D749BA848BD4A92B9B7AEB0E244E479ABC4A85F50E94C7299E06BF0DAA158\ 7F49907CD94C426C33ACFC31E08D183A4353A36D8C6D39AAA1AF20519629C01A45BDCD60B115\ CD490E9873D74FBEA994B75BB7FEE9F2167850AFAF42873D44543E3D6359A0A0A140705D4021\ DE256AB12C38184BF822B9B69D7FB059C32EE332D86AB9DF26D1CF832381555CAD1688A362BD\ B1F2982A55AAA37E5137B95B5961E8F354EA30ECB13B98DC697605556DF4C4EEDE6593016B7B\ C30862C55C6651DA8A3589DD3E9EE42495374BA7E6C6BDEFF8CC078559DCD99581061348B13F\ AE03259832EAD8BB84FAB48EBF725C6C5037539FC373791F21D34B56DE04A6CBC591B798B7CA\ E2AD8BD5BF9E963559C981286F26802FD1A49A5A906AB814B34FB514A8ED0FEC7B67A550A59F\ BEDA7B0685E69ADD13B68A69E070CF2C9E8D6CF4CAEE4ABA732BA20A8BA6C3DB8BFFD392CC2D\ 14D46367D451F0A3B77A411B128224AA473247C4A9A446606CEA8414E9C09DE13301C8E60B2E\ E51E9801E1CFFC6E9EF283238E2AD209E5D48105D48044BFD28BD9F32C53D5D37CCB158FE597\ 983CBB45A05F1B9148F25772ECF3667554247CDB2A95A99E06275C36C6E4FD779DC9F8FA4575\ 16EA4CD020F6726E3A32DF65E34BD85DDFE16B285A0AFB0F3E2DD8954A9E636BCA5CF7FED181\ B041D14D223F10AD0DE9E23372DD7A61718CAB6B9CC7C1D88D98697356811AC0B834228A299F\ 6EEF970E11D59E9FD307DACD40256AD7BEB203175CCABF70D9137BC29E2C7B0494C3FA6D338B\ 027BB993E870B02EC68A08EC8A24BD163D5AB43411AB7BCF1A09F64A7EAFE15A0C350F5D6F0E\ 68C1A83FECE5227112F8E6F8EF11149B3188970A279C9559BF11E7A4EF9F72C9C1E9B58EE48F\ F880AA:\ B48C57CAA63FFCC261E4B3532E75CBA497B4FB6C [SHA-1] :DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 A9:19DA91F2603889267DFD77786E07A5B8F067D62A 97E8:D617ED3AB073B4E7A53D2A238D7DC55F26EE3888 D45C48:8E7E3C02A55608B637C8AD621E6AA933821C40BD AC42E6AA:FCB240AA79C665358ED174887E186220F0DA2608 B520B2C214:0374FD36056476A85427EA2F7B1412D65A17D64B 9E2D7971A47F:DA4106AAD290AE4430618FBD3C5D1FC6C66ADAD9 F1EA1C9B787BAD:B234020692659C3DEE19F7E75390984DD7E7EBBB 22BB11D0A3DA8661:A307CDBBEC5297114EC00193E056C0E30B15B499 C70BCC3952C8330A17:57AFFC668D529B05EF9FDCE03448AE6B4848522B 24B2BFC2E6D47E0467B3:393C606D9C41D743BD234EB62D36A381151FA8FA 179BA867948A881232F2DF:F01A9954C602AD6A295512AB1FF58AC0AFA3CD1D 0DF890F7B14B4A8D16B76AFE:5CEF1B50663EED91BBFBDA9EB7F34757AC5AB330 B0DBE17E0D80568C0AEC5E39F0:22AA3BC193DC2986C10CEF2E5AA4C673883D32D4 AFFF20DF4873A1AD68AA924DD5C3:21337165D43D02685C5FEC0CC1C73C44DD99A072 BCA74FF24F139C9952074F9D16F6CF:9F48417F472141A2CD49CB3CBB4D3544EA76F949 9779CC9003344147C0A718C6EF20987C:C7255A698F731CA134BA102982345CF0A305AAF0 06CFC48642CADA4A5E1A4BE7D42AAEBCB6:044581EF47C9F2DE49F71B284B7D80631775A6E7 8A68E58F72C5DE3A63FAA08DED9C89435372:E485D9B0FCED9EE033A4B4759D211023638BFAFD 9AE8D4749CAB071975A18F45A49FA950B13A38:5BD5DECCAAC74D57D7CE628ECFB973409B364982 F1413BFE7319315A7A7FE2D32F6E564C9186CD8D:\ 633002546668978822CA81A44E0CA113EC95C088 58E747CCFD7781CA99755B24BA4EE7C13B59095796:\ BBAB138D0A3369D67C9ABD0A1E0583EA6DD2B402 90D6D80BADF7D52A7513892976D6C5BB28D8562E7748:\ 8F9D0D4F0E8F208BE8CEAD973776C9441C9202CB E033E25A7D550BEEBA3965753D86D4AB982EBF0621FA8A:\ 0B2EB3B57ED697BCA7D73E18A479FAD38EF99ADE 0EABDACFCD5484F3B4C3D52D38E3E80CEE792B0CF600E2B6:\ 1F04BBA35687BA07375BFCC645E2DF26BAAC2294 C6A3FABC7ECE7AE5592A107C437F80B1EA24488337F1AE6BA7:\ A5E8F975C621FE415E49BFACC94C189E644261BF DD5CBDA778F532D63FFDFD67D0A5F4B0262B4C505B4BA0F25882:\ CF03D0BA50F9E569103B85BDF43B949E907EF0C3 389CFE2CDC0B55DF41C1C704FE9D58585B9E5757FD71415F73F073:\ 00B0AEF6D2BD6213175DDB6B4E7968039F70AF49 45B1C7013FCF2AA9928B166F9666D3E76B61DF676DBBA7420A159BFF:\ AB5CE29466A6BFB2DFD93DBDBAD389A0B7F97C1D 1F1F4B688D24B30C8146D576156A7FC3149C66682B28C97EA157950B67:\ 18A9AF9587796E9E8493D20D8AE6F2EC82103352 0F84EEC636A3381757004310399D3B3F12F97605B701A9038EC04B1CFC81:\ AD05B1D89788743F97344D1C3AE3BA9499353371 AEFB942B4B7A9BDFC9A97C447F7065E21A917F5393EF14150C5569CFC28DE8:\ 939EB0F17269FFA80738F66B3B45011A04A679A8 8BCCF096CFB773326D7487A06D217A2471E709DC4C60614FB5A7E481381982DF:\ 3B69259D2E5E00F4208E8D2CC84D798A33CC1514 232F3F1AFE834DD615BAC06A2510D1852E946F34B9E2085F7A36FD8844511F461F:\ DFA0A9DB29A68171E01A6C7399B90F974A13F940 704452E58745BD09D159F6AD40FA9B8C7419A2AA188D8B3AFFB00AC34EB2E304A0FF:\ A099BC7BBED72769786FD913F61F655684031F93 A62B2098C1D208024EA91470C903F8426E5D8F660C1DA268D0958E4BC11D2CD98F3835:\ D2DEEC7774B67D924D131224BF6C908597F99178 BF7E4F3FD269AC9CEEF6A08DBB5CB5BCAB5AF7080B8D675A7332F741EB9E17963E9BE157:\ EEE037F1DA86921B491CBBF048B9BD872418DA9A FF94FEF100BD0056A37830E6B1DBCE8B832EBF819867932D46BD7495BCC5CE2E9DAF08F1CA:\ 97517C81813BCAA6BEC71CDE13DB4FA44CF4BCD2 88EDF78F02C8E36CF0CDA3D07A9B1485CFA8AE44884E290461A22D599A7F30E3A88E52F019B0:\ 44FB2EC4643E984CDEAB550BA1383CD6E7847CF6 7FE04629976A8EC967733E95F2BFB79DA1A126DC5CEF391291320A57DA487D49EE7C\ 4247F8A932:782C391A16A08F98C32C780D7A1F2570A7675FA6 97807FE1CA7BBFD000A057A70A6F6F026ADD4EC3D50AEC664A2BF970C0D0D36001DB\ B7231640ED9D:C06024CD60C3859D653B5ED18AE949ED7C43C05A 98184A0CE7EEB9C8DFE36D6A19FD668A3B6F0C9A493835D63A70A4340AB6F8A7ABEF\ 0E5E09E4807334:7B7EA4D0E3AA0581B1DA3838ACC370E9394CDDF8 33347AC8506D2C2F74C458B2AA0BE72CE38C752A4623A62DB758A9A6827287B364CF\ D4C077F0D1DB9034:A1FF355DE693851B9A62D77CDC709826B27D6B3A 7DB60CBEE84BDD9B357951A59C724A757B90D77D85D61F5B90FCD93D101DF697F490\ 4EA0F2FA1CA7BD7440:2409204F9658D8BB4C8BFD10420BD576FD7401FB AB8AEFD1533F3F07DA8BCAFB5C0C12E6BA7364A7EA2525796924B075242C22FA0028\ F97B670DE6ADF935F082:B3837EB32A441C2C10E112677FF1569D2C6372F3 890225FA3A7D120C325EEA0A0CF4050833C62C527B6A009CFFCA8DC2094135051B1B\ C8ED9F9ED37B5DE16B4052:5AB7E0AC97C202630A54BB3BEA5F485BAE9257C0 5D6F1CC0ECF25EAB98398A20D8278F84DE663FA9252361F01AA3F9A0D4FEA71CC86B\ C63318A5E3019A6FD96851C2:2E3E5F3488A5D2C8C02A3B7E566844F35C0EC2D7 0ED8D77EDA25AB5B9AF72F39A49B688B595D79363C563FE8F0265DE2FE0E490B4A2E\ C86DC789CD0B05716993500C19:F4FC59ABA3C8D6F57DBA4F865DD24666251AA2E3 89837C88BE7FE04FF3364AB6D455ACA1860D5C11FFBB56E16F817857CE0E3EB8106D\ 9FAC60FF571B181C86A830EDF292:31FB958B1D0935E46891EB09F8BFB99CA6809C5D D5E0D6AE8AB7A630EF2206D5160338C7AACC6A5CED2E8A3AA224626F1BD16DE547FB\ 822CD1FB0EA84C1259A427BD1AFCA8:69124A48D475B5110EE562C59131DA40707F897C A9CB3047ACAAF1A2AE06231A4DB46E28EB76694EA03A5FF78FD3C36797CB74259621\ 324F2897D80CC8C070454E55C341A3C8:53F6A0A6DD49C2D58413FE55A3CBF334D559A03F 338ECBF06225FBA761755EF7F9147A1AB2AA696BDF2516584EBB948192C6BD240902\ 451FD5E6ABC48B017A71BC608C87DE1623:CD0AF641834C8DEC7CB735BA31CB674AF90EC3EE 552150498BEC425BD0DBA052C9DD61714CDC22B1DA7F915FA7286C8CBB7D722342E6\ 91C877B748DBC369D4333F287587206EBC2A:\ 9B658AC6B9BA14176CD55F3AD40EF51722F25FE7 6467642AE2A5C9D1A98BEAC2567A7097F00624AC9FBC1A7751487417EC33BDBE7E15\ 97E0205A7F85B10A06B7F8CBAF33E41B3FAE28:\ 48514214D5442EA393C2F29A0B632FC2C76B3221 80C293CA96261C78EE05F7D666AA2D4C84D30A8B66EFDB0E34B0625E7CD2F691CD4A\ 92D07D66E22E837853F7DBD5D34BE1AE02501083:\ E2E5864D1B24C5E8C1A2F8E54F80C942207DB2AB 6FECF376F676C90422AD0A6440EE8EF2CE1F4A4F5AF46868F77013F8A582D465F09F\ 18ACB8F1052E603E4634AD345A63495C80ADD64940:\ 22C6DA67A1B13AB8D11DBA2989E88258CA12CA2E B6CFFE9D40FBA3830F2C20248690AB0862FBD8B1A5EBF832965F2AD7E8BF3C74A930\ 62C79F9CD16DE48043A69BFEA723035A2C81FF118184:\ A517711BFA20D7324C710DBF3C5A955EF465926F 47C63FF1E5AF57CDFC0307BCF453F528E5767CAE52117854E9036F20286D1C1BCA27\ 70645B4794BD5047EB59F0EA5F751243AD8EB5FA3F69F7:\ 533815F09B700B11A674EE0647F8E320F79A5ABD 995C78E561CE4F9D9B9226C01DA4C55B5C4A1D5099027B1123AEE851AECA3B70CF54\ BC7A74A4185D3781EAC76CD63718645A8F15CAD1911F529F:\ 62E81989C86A4AEE3A9DE5114AB72821AB7B1150 F713F0C9CDF3A28629861AE19C38B73664352AC6939C976AF92A673857AE48DCEC04\ E8967EC5AD8245CE062D8AD5FE5E92F39F5DCAAC9884F8B5CD:\ 79221ACEB0F387413AF24481A55633E54DE4232A DEF310EF52F8839F15BA13C8A5B90815867AFDEF25247FA10B6AD03E70952F5AD0B9\ 836012F119315C43C90DD6B5D018B3C75BB01659535588A4C17E:\ 136C5C9F49B4C0C41E87762878846279E167D8C5 4FD13DB66F140B6DC804F9EB821FB82800976070D59EE4C035527EEECEC97E1EE5C9\ 973F1A25362A84BEC6EAA38A47078CBA24C6B7155CF76E30C22199:\ 988A4CE4FDEE20041D30AAED622BF1CA4E01C5AC 57BD9E7BF1647FEAC33DA17BA902FEA19F7FD09E85CE23BA02EEC263A321580423DC\ 0872A9F794838EFB820A8D3D3D2AE81574F77825B70C569568A31EAF:\ BD95E63B9EA0ACF05710DDFD13B77D518BE21CB5 A222082AADDCA13A7CBDF9A9AD12BA723456BFD8B515A6A52F8F861226CF94D5C3AB\ 0B2A151A3B557DA8DA72585EFDF60FCA469AB30EAB12B51571E906557C:\ 03AB52978F19B3FA870D84814002A305AC58AC10 89AA2C4D4F81CECE57B0485842B0AF8B857E7609CC0F29F0343A5B8A09181A63C8F8\ 4251C497136D1916DC5634DA842793C1B648A381B2534DA78E78E7898BE6:\ BCC5DCB8FF9EECF6B282FDDFC8635B1923C2BAFA 94CF076400B9C2911C2C2C1BBCBF30E50157EA88CEB3B4966E61A18BA2C58ECA65BA\ C7952E5A629E0DF53F4B8A9B031765A639C87A4941E42CAF4A5572AC05B085:\ EFD01DA5BC765BA961954C2D7E5FF2104B1FA58F B8847AA6FE095FA629D090307AA2D686C7D628B12D63BCFD8E4F6BE8CCE039E8CB69\ 683B8B70DE74DCBA93A019D0B459D707C4F2BE8EEC9B0280F6ED26D99BD454FF:\ 32CE1A1F18A2FEB9CF0189E37D8894E7CEB70CDA 676DD8B7DDF731349BF6238C855E8136AD59E734B20ABB500018925966EA4E076336\ 90AFA11E57550766745BD3401459373A418A360D4C4B9275714679517C73F60FAE:\ 81D2AC8F3A2C92E190ED1AAA0F7EEF24579E697A 616263:A9993E364706816ABA3E25717850C26C9CD0D89D 6162636462636465636465666465666765666768666768696768696A\ 68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ 84983E441C3BD26EBAAE4AA1F95129E5E54670F1 3AC0944F60DD6E0988CFD28AE2103952C6070DC0A97EF7AAD20B5F9CB8FBE054368BF91C6791\ CE900B487B309615F29F1A045D210D226D2A018ADA22D27C:\ 968569B83FB232766A9967C9FF6E9B162BF49DC7 E5EF4476F1A0C19631E317518F0E64A8AFFF579A264FB3B00B55C108F76F667919731882DE49\ 05BA0493AA17E1F39115D136F9A037C704F5D329CDC36CA728:\ 170A3BF2284128B2A02097800B6A3FFEE825BFE5 AF500080F6905D82050886CB27371AD9BDCDE1D3858E66395CBD034D8A69198AD33A762534CF\ 9C7F39B22DE123AD03ED25BEC4E73FE05A1CC506B8D06D32B0F3:\ B79E4B7FD2A3DBCF5E9BF50D91BF651FF713DC65 0AEE08E2D291A3D500160C74FD6A8F4C64531FCB51297E503BC4ACBA07ED629AC3CE70D1EBE5\ B4730DDF29DED06B9E9CF8EA963718CE4BE9373C35BC1188A5F054:\ 5CD361EC04BF2F526803FEEB81E729AF5807EDAD 08D2CA90EB94205F40277F2D47DE7F52025B31B57F62DBD443BA005D6301FEE4F4DC57181C72\ 69F1FBA4210E26358C48887C09C4317CD890315BBD563C948173F6F1:\ F788C706B2B67D4D698C2DCF99E45B1A8541D3DE F0B38F0505089A926595ECA3080BFFEE28929EF769577D91A8E5E2867B01EA4C58A4CE62101E\ D2DA38D608C266346DFB5FC14800D618E958A8572B35B23393A11613C85CD443D2B4DE78D5A4\ D641E70A23467D7CB4BBBE362AFF2AB35D1A075CA33EB619DDBC9AFC65586F077A3ADAE4B115\ 0E0FE9274280FB011F0420155E5848920D9E25D1BE66DCC670D4395FE2847848E04645C13B33\ 4E4BCB588E069510BA6D014115579706670D2D93E3080466CE6BBD07CDDB9670ACF68E4E36FA\ 17E03EC3F88910FBCE247128486B0475775AA5642812B44F444A14DC547E7D5D98527302261A\ 13FEB8BDB4A7A0FB221E1D08388B4353AE2DC7E3464969DCF12B17ED0A5E549B8FF8A8956FE5\ FB69C1AB428BBA8CAE7E267F52CAFFFD2DCAE8F9B5D448AF548C7BE88443649254089A281A1B\ 7537896D7D4C97399F0513E3976981843E20C15EDF14378DC4425CAC30ABF7CB034B6D4AE213\ 360CCDD1C956ACC0D437C177C983EAEB9FB5F3A5DEB19CE3319C9368C2A7AF4B077A6B1BD417\ F17E2CA36BBDA826718515FDEBBBEB5268801073457F8AC83ABD1EED888BBF218DCC4554F67E\ FCE107A216B0540116691DAE98F34FB218969728E3165425C7EF1BB033329DDE4CD98A731772\ 7F4E6E24AFBDF39F79D71CF3C6B93E75E007500874BDD94F7484C15EC5F5A509FA4AB14828B2\ 895B0280C554600DC9834D23F824E1EC4662CC62CECDA8B9F9F31A6B4D589E5F95401644800F\ FD2132F60CB45A91940CD420ADAA5DB3577F41E099EB79708F7A0C61D37923B503DE8810C55F\ 80AF43B4D87060070BBA4A948A41DE58E7A7DBDA9020D77F290A62F1DE6E47521C495B6EFCA4\ 0FC97FED9DE7389836F82BA05FEE66975121C38A6C7926EAED407E37CAB7E7005A891A93D88F\ 68DDE4DE9FEAE55D6FE86FF34CAF9CCD7263085C2CFA67A77FD28659FACC7AFB9734159D35C6\ C96A755FCACB2048ACB7756696F4E481328A5A93A9D0BF8AFE0C31A98E1E6A4BED0C6CA661EB\ 7218F9C5792334121604587A86423B652FBFA1638C96CA1715164C7D074117ADB267923F06AC\ AE45B493438BFAF384CDF7697AB0E0B75C6D21C6FF1139752143FF84F4652BAC47D44689E7A7\ 3A87E4491C0D9B8DC60D546E4350BC66BCF814ED004F202AAA9CE6E4638ADEA6B485CCAD2D55\ FF7A597DE0662C746AEB34B36C7D46FD47A67DB75363D314B40672A6289B60F1D444090B606F\ 73A9CFE3BA46BBD3D5E629AD508D6F6592DA126E9400377D7DA41295DFA37E5654FA841A5616\ E528C65952846DB40FDF29DB7317B8FEEE5B0F670EA0198520E58FABEBFB68BAD63709C5941B\ A9F8DBB064EDC425B263DF4573EB6E3CADD080D9EF7BCCA048F60E163448DD6531B6B9F8CDB6\ 6CA368FE6AD9B651C51284E51253A3B64FFEE4806A0A88840BD61CA888345648D7743A060A36\ 105C88:\ 8395ABC1B17BA7BF947145EB1DF1A2050C8E78C3 426F74616E20312E372E32332D707265203F3F3F3F2D3F3F2D3F3F0A68747470\ 3A2F2F626F74616E2E72616E646F6D6269742E6E65742F0A0A54686973207265\ 6C65617365206F6620426F74616E20697320746865207365636F6E642072656C\ 656173652063616E64696461746520666F722074686520312E382E300A72656C\ 656173652E2049742073686F756C6420626520737461626C652C2074686F7567\ 6820736F6D6520415049732068617665206368616E6765640A696E636F6D7061\ 7469626C792073696E63652074686520312E362072656C656173652E0A0A596F\ 752063616E2066696C65206275677320617420687474703A2F2F7777772E7261\ 6E646F6D6269742E6E65742F6275677A696C6C61206F722062792073656E6469\ 6E670A6D61696C20746F2074686520626F74616E2D646576656C206D61696C69\ 6E67206C6973742E0A0A466F72206D6F726520696E666F726D6174696F6E2C20\ 73656520696E666F2E7478742C20746865206275696C6420696E737472756374\ 696F6E732C20746865204150490A7265666572656E6365206D616E75616C2C20\ 616E6420746865207475746F7269616C2C20616C6C206F662077686963682063\ 616E20626520666F756E6420696E207468650A646F632F206469726563746F72\ 792E0A:\ D233D919F2B5358520B725F427C4F35B5D866FBF 436F707972696768742028432920313939392D32303038204A61636B204C6C6F\ 79640A202020202020202020202020202032303031205065746572204A204A6F\ 6E65730A2020202020202020202020202020323030342D32303037204A757374\ 696E204B61726E656765730A202020202020202020202020202032303035204D\ 6174746865772047726567616E0A202020202020202020202020202032303035\ 2D32303036204D617474204A6F686E73746F6E0A202020202020202020202020\ 202032303036204C75636120506963636172726574610A202020202020202020\ 2020202020323030372059766573204A65727363686F770A2020202020202020\ 202020202020323030372D3230303820466C657853656375726520476D62480A\ 2020202020202020202020202020323030372D3230303820546563686E697363\ 686520556E697665727369746174204461726D73746164740A20202020202020\ 20202020202020323030372D323030382046616C6B6F20537472656E7A6B650A\ 2020202020202020202020202020323030372D32303038204D617274696E2044\ 6F6572696E670A202020202020202020202020202032303037204D616E75656C\ 20486172746C0A20202020202020202020202020203230303720436872697374\ 6F7068204C75647769670A202020202020202020202020202032303037205061\ 747269636B20536F6E610A0A5265646973747269627574696F6E20616E642075\ 736520696E20736F7572636520616E642062696E61727920666F726D732C2066\ 6F7220616E79207573652C20776974680A6F7220776974686F7574206D6F6469\ 6669636174696F6E2C206F6620426F74616E2028687474703A2F2F626F74616E\ 2E72616E646F6D6269742E6E65742F292069730A7065726D6974746564207072\ 6F766964656420746861742074686520666F6C6C6F77696E6720636F6E646974\ 696F6E7320617265206D65743A0A0A312E205265646973747269627574696F6E\ 73206F6620736F7572636520636F6465206D7573742072657461696E20746865\ 2061626F766520636F707972696768740A6E6F746963652C2074686973206C69\ 7374206F6620636F6E646974696F6E732C20616E642074686520666F6C6C6F77\ 696E6720646973636C61696D65722E0A0A322E20526564697374726962757469\ 6F6E7320696E2062696E61727920666F726D206D75737420726570726F647563\ 65207468652061626F766520636F707972696768740A6E6F746963652C207468\ 6973206C697374206F6620636F6E646974696F6E732C20616E64207468652066\ 6F6C6C6F77696E6720646973636C61696D657220696E207468650A646F63756D\ 656E746174696F6E20616E642F6F72206F74686572206D6174657269616C7320\ 70726F766964656420776974682074686520646973747269627574696F6E2E0A\ 0A5448495320534F4654574152452049532050524F5649444544204259205448\ 4520415554484F52285329202241532049532220414E4420414E592045585052\ 455353204F520A494D504C4945442057415252414E544945532C20494E434C55\ 44494E472C20425554204E4F54204C494D4954454420544F2C2054484520494D\ 504C4945440A57415252414E54494553204F46204D45524348414E544142494C\ 49545920414E44204649544E45535320464F52204120504152544943554C4152\ 20505552504F53452C0A41524520444953434C41494D45442E0A0A494E204E4F\ 204556454E54205348414C4C2054484520415554484F52285329204F5220434F\ 4E5452494255544F52285329204245204C4941424C4520464F5220414E590A44\ 49524543542C20494E4449524543542C20494E434944454E54414C2C20535045\ 4349414C2C204558454D504C4152592C204F5220434F4E53455155454E544941\ 4C0A44414D414745532028494E434C5544494E472C20425554204E4F54204C49\ 4D4954454420544F2C2050524F435552454D454E54204F462053554253544954\ 5554450A474F4F4453204F522053455256494345533B204C4F5353204F462055\ 53452C20444154412C204F522050524F464954533B204F5220425553494E4553\ 530A494E54455252555054494F4E2920484F5745564552204341555345442041\ 4E44204F4E20414E59205448454F5259204F46204C494142494C4954592C2057\ 4845544845520A494E20434F4E54524143542C20535452494354204C49414249\ 4C4954592C204F5220544F52542028494E434C5544494E47204E45474C494745\ 4E4345204F520A4F5448455257495345292041524953494E4720494E20414E59\ 20574159204F5554204F462054484520555345204F46205448495320534F4654\ 574152452C204556454E2049460A41445649534544204F462054484520504F53\ 534942494C495459204F4620535543482044414D4147452E0A:\ 6ECC9C5DA3C61107935336EC58F3655DB0C210A7 2020546869732069732074686520637265646974732066696C65206F66207065\ 6F706C652074686174206861766520636F6E747269627574656420746F20426F\ 74616E2E20497420757365730A20207468652073616D6520666F726D61742061\ 7320746865204C696E757820637265646974732066696C652E20506C65617365\ 206B65657020697420736F72746564206279206C6173740A20206E616D652E0A\ 0A2020546865206669656C6473206172653A0A20202020204E202D206E616D65\ 0A202020202045202D20656D61696C0A202020202057202D207765622055524C\ 0A202020202050202D205047502066696E6765727072696E740A202020202044\ 202D206465736372697074696F6E0A202020202053202D206D65617473706163\ 65206C6F636174696F6E0A2D2D2D2D2D2D2D2D2D2D0A0A4E3A204D617274696E\ 20446F6572696E670A453A20646F6572696E67406364632E696E666F726D6174\ 696B2E74752D6461726D73746164742E64650A443A2047462870292061726974\ 686D657469630A0A4E3A204D6174746865772047726567616E0A443A2042696E\ 6172792066696C6520492F4F20737570706F72742C20616C6C6F6361746F7220\ 66697865730A0A4E3A2048616E79204772656973730A443A2057696E646F7773\ 20706F7274696E670A0A4E3A204D616E75656C20486172746C0A453A20686172\ 746C40666C65787365637572652E64650A573A20687474703A2F2F7777772E66\ 6C65787365637572652E64652F0A443A2045434453412C2045434B4145470A0A\ 4E3A2059766573204A65727363686F770A453A20797665732E6A65727363686F\ 7740756E692D6475657373656C646F72662E64650A443A204F7074696D697A61\ 74696F6E7320666F72206D656D6F7279206C6F61642F73746F726520616E6420\ 484D41430A443A20537570706F727420666F7220495076342061646472657373\ 657320696E20582E35303920616C7465726E6174697665206E616D65730A533A\ 204765726D616E790A0A4E3A204D617474204A6F686E73746F6E0A443A20416C\ 6C6F6361746F7220666978657320616E64206F7074696D697A6174696F6E732C\ 206465636F6D70726573736F722066697865730A0A4E3A205065746572204A2E\ 204A6F6E65730A453A20706A6F6E657340706D6164652E6F72670A443A20427A\ 69703220636F6D7072657373696F6E206D6F64756C650A533A20436F6C6F7261\ 646F2C205553410A0A4E3A204A757374696E204B61726E656765730A443A2051\ 7420737570706F7274206D6F64756C657320286D75746578657320616E642074\ 79706573292C20582E353039204150492064657369676E0A0A4E3A204A61636B\ 204C6C6F79640A453A206C6C6F79644072616E646F6D6269742E6E65740A573A\ 20687474703A2F2F7777772E72616E646F6D6269742E6E65742F0A503A203346\ 3639203245363420364439322033424245204537414520203932353820354330\ 462039364538203445433120364436420A443A204F726967696E616C20646573\ 69676E65722F617574686F722C206D61696E7461696E657220323030312D6375\ 7272656E740A533A204E657720596F726B204E592C205553410A0A4E3A204A6F\ 656C204C6F770A443A20444C4C2073796D626F6C207669736962696C6974790A\ 0A4E3A204368726973746F7068204C75647769670A453A206C75647769674066\ 682D776F726D732E64650A443A2047502870292061726974686D657469630A0A\ 4E3A205661636C6176204F7673696B0A453A207661636C61762E6F7673696B40\ 692E637A0A443A205065726C205853206D6F64756C650A0A4E3A204C75636120\ 506963636172726574610A453A206C7563612E7069636361727265746140676D\ 61696C2E636F6D0A443A207838362F616D64363420617373656D626C65722C20\ 426967496E74206F7074696D697A6174696F6E732C2057696E3332206D757465\ 78206D6F64756C650A533A204974616C790A0A4E3A2046616C6B6F2053747265\ 6E7A6B650A453A20737472656E7A6B6540666C65787365637572652E64650A57\ 3A20687474703A2F2F7777772E666C65787365637572652E64652F0A443A2047\ 462870292061726974686D657469632C204356432C205368616E6B732D546F6E\ 656C6C6920616C676F726974686D0A533A204461726D73746164742C20476572\ 6D616E790A:\ 7B01AE4E25243CE9B4735729CEBB285C1853473C [SHA-224] :D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F 61:ABD37534C7D9A2EFB9465DE931CD7055FFDB8879563AE98078D6D6D5 [SHA-256] :E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 61:CA978112CA1BBDCAFAC231B39A23DC4DA786EFF8147C4E72B9807785AFEE48BB 616263:BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD 6D65737361676520646967657374:\ F7846F55CF23E14EEBEAB5B4E1550CAD5B509E3348FBC4EFA3A1413D393CB650 6162636462636465636465666465666765666768666768696768696A\ 68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ 248D6A61D20638B8E5C026930C3E6039A33CE45964FF2167F6ECEDD419DB06C1 3132333435363738393031323334353637383930313233343536373839303132\ 3334353637383930313233343536373839303132333435363738393031323334\ 35363738393031323334353637383930:\ F371BC4A311F2B009EEF952DD83CA80E2B60026C8E935592D0F9C308453C813E 8000000000000000000000000000000000000000000000000000000000000000:\ 84B3F13B0A4FBCCE4C3F811E0313E00DCBD27431C229EFF576598BE8D1AFB848 4000000000000000000000000000000000000000000000000000000000000000:\ 94CE3F7973AAED52C6C446BCC59BD8D43B6695FA3FDB9E3D1CC47503A432D3D8 2000000000000000000000000000000000000000000000000000000000000000:\ 6D0855A335802F0BC20946F3C48C05B6B98C14B578020D5F42A166B97FE6F59F 1000000000000000000000000000000000000000000000000000000000000000:\ 56FD25956F759E64E853071FF01587C364EAF6286C97DA600E0BE78C701637DB 0800000000000000000000000000000000000000000000000000000000000000:\ 067DC6A810183E9069F63C2020B692C122C8D58263ED7F5C0E531504DC3B6E06 0400000000000000000000000000000000000000000000000000000000000000:\ 4B78063B9C224DA311BD1D3FB969BBA19E7E91EE07B506F9C4C438828915563F 0200000000000000000000000000000000000000000000000000000000000000:\ 5778F985DB754C6628691F56FADAE50C65FDDBE8EB2E93039633FEFA05D45E31 0100000000000000000000000000000000000000000000000000000000000000:\ 01D0FABD251FCBBE2B93B4B927B26AD2A1A99077152E45DED1E678AFA45DBEC5 0080000000000000000000000000000000000000000000000000000000000000:\ 0CAD7906B177460EF96D15A612E83653862592A190F78FBB7C09F4AA89E616A7 0040000000000000000000000000000000000000000000000000000000000000:\ E30C1BA805347BC13F4E4E4E82658AB2C1C97BEF72C4F3D555590784C64B3587 0020000000000000000000000000000000000000000000000000000000000000:\ 3B5C755FC2A3A868DA0A668B2704635B13E3DDA0ACFD386B4C025ACB644400C3 0010000000000000000000000000000000000000000000000000000000000000:\ 9F911FC19889661AF03C2E9849208883BB606BEB75BB6C162FF63F65E4CA8157 0008000000000000000000000000000000000000000000000000000000000000:\ 3EC07F4585EF5C91814F7DDCAE396DC42156DF82307C46C7AE977CFCDDBD04A3 0004000000000000000000000000000000000000000000000000000000000000:\ 7E8BBD09E5C09DE409CDF71C4B39F59B350B4B5DEC4A45D0B6127FDF873B4602 0002000000000000000000000000000000000000000000000000000000000000:\ 1616C4B5C8DBB446F269F2C9705B857B4A4315355A52966933E6B0E51DA74A76 0001000000000000000000000000000000000000000000000000000000000000:\ 36258E205D83BFAD1642D88F39A6CC128CA554016DE9CF414BEF5C5C4DF31019 0000800000000000000000000000000000000000000000000000000000000000:\ 9B885490F45E3558384E94FE2C64773323AE14BCB8F9E8E02B3FED18EB930A30 0000400000000000000000000000000000000000000000000000000000000000:\ 3BFB6EFD3AFC93BCD7ECDE51304456C2DC0C697A337DE3FD611CBEC3B3BCC53C 0000200000000000000000000000000000000000000000000000000000000000:\ 1D8052462938001AFE80A3A2DD04EA8B28AEA9F613849C5285401B7DF2E8D604 0000100000000000000000000000000000000000000000000000000000000000:\ C15F125ADA3B323C7D79FB6D1C96D87CA7890C468A209C66F80B5EA223E5E533 0000080000000000000000000000000000000000000000000000000000000000:\ 4C49B88894D742530818A686961A640CA28692C2E2AD020B7CFD86DE3E594068 0000040000000000000000000000000000000000000000000000000000000000:\ 85BFB6E1A0AA50099696212DCE8A0067F4FC8A2C4DA0946B6106BE1DD01D7D78 0000020000000000000000000000000000000000000000000000000000000000:\ 5D5E9793D0F89CC3A709D2FFC1B488F1FDC7CAADE69BA027EA7B44F18BCD082F 0000010000000000000000000000000000000000000000000000000000000000:\ 1EB50E78E6DFB0A4725FB71BA0443C3129A6822213F3D40DA2439FCD2BCED580 0000008000000000000000000000000000000000000000000000000000000000:\ F7B7700280839E9E0FF8AECCB3BE5C586DF0BD6B7BDB4AC8C8ED45AE3EEF3686 0000004000000000000000000000000000000000000000000000000000000000:\ 2E0D44F2BE93B23ACCB8E7680FA0B58E25F48E33334481A9297C8F5E9428F326 0000002000000000000000000000000000000000000000000000000000000000:\ 672504FFC411A43E4E9CAC5A44BB62DF4A7DA166D18E4D47607CEFAADFB667F1 0000001000000000000000000000000000000000000000000000000000000000:\ 4A9F5FF8813D3465074FD633B060B49318D9EE98B3CF3B3F4A3C903E4AC66396 0000000800000000000000000000000000000000000000000000000000000000:\ C68386BCDCEF8EDF31D9ECCE2A34E006F49AE1652FF0BBDA847FF6601F762815 0000000400000000000000000000000000000000000000000000000000000000:\ A5FE20624689A0F3378834E922989DDAAEDAD5BF51D3B1F5E84D63778A8F43E7 0000000200000000000000000000000000000000000000000000000000000000:\ 03DE22D278E3BE1E8FDB7DA3EE6679E6D514DEE8FC118FB27A91664CDEBED8AF 0000000100000000000000000000000000000000000000000000000000000000:\ D1AD35A94F018CCB8E40A06FED17DB11F0638DA3F3E638108ADE5D151ECCCE23 0000000080000000000000000000000000000000000000000000000000000000:\ 4D205614446CBDF1A8160A7182BCB24EFB32D725E016BB91D84C1E7DF55201AA 0000000040000000000000000000000000000000000000000000000000000000:\ 72171D3BFE9863D702B81AE9C69135AD007200A5A7B8DC419F884C944A309DD0 0000000020000000000000000000000000000000000000000000000000000000:\ 3F0A6EDF24B8D9F9038B828D2F45F7625123F8A1B07E39892C86FABB2FE687D7 0000000010000000000000000000000000000000000000000000000000000000:\ C9BF3EEA4D22268BD1EF0027A5E1E398F0D6C4A8190BD99AD869A8796EB0CD4F 0000000008000000000000000000000000000000000000000000000000000000:\ 5706ED5B0DB45898C5C01F4C4B5360043E1029CA00B33C33E684C27C30222A1D 0000000004000000000000000000000000000000000000000000000000000000:\ ECAB997B21788D277CFCCC07AA388C4B199AE63D6E606CDE28328EC209B794BC 0000000002000000000000000000000000000000000000000000000000000000:\ 58D2C35FFAC68BCF336A44B98AFF5740823CABAEE65865C608D487FFCFFC95BF 0000000001000000000000000000000000000000000000000000000000000000:\ 909F22C2B34103BF854580C5F2C4F64C2520AA57B492E422D1801A160B6C6E67 0000000000800000000000000000000000000000000000000000000000000000:\ A0FC0A816AB024C9DED26D9A474B53C66635376400FB3AB117BAB262321A1308 0000000000400000000000000000000000000000000000000000000000000000:\ 9DEBEDEDB5B1B6A2A2FABE9104C8D3F425144F290490ED788D6B6A19994C703B 0000000000200000000000000000000000000000000000000000000000000000:\ CBBF98775780C3B92BBC871C1D5137107BE63933D0F3FE1BE7AEE434AA5509BD 0000000000100000000000000000000000000000000000000000000000000000:\ C1B245D91A44973947297E576511B7FC55CBCD06159CB0F111101E601B36843E 0000000000080000000000000000000000000000000000000000000000000000:\ 6986E93DBC3B044D949945C0AF3BC35ED63915E0268E9395D552D4ACBC5A79B9 0000000000040000000000000000000000000000000000000000000000000000:\ 5FF28A82880765E64116AEC484F2B3A0EC1DBEACEC2BBC78737E5504A94C2DF2 0000000000020000000000000000000000000000000000000000000000000000:\ 76DBB5BA9EC438D93638BFA8F62664201E29BA84BC6B1AB704D9688E89431503 0000000000010000000000000000000000000000000000000000000000000000:\ 80D3EB7836CB04382BBAF764EEC343F07C9618BDFE98E01FD2BA2958902253C0 0000000000008000000000000000000000000000000000000000000000000000:\ 89FF132255600368DE253F025BF92BB5AF9BF4D1FFEBB25575CE30EB77E4E4A6 0000000000004000000000000000000000000000000000000000000000000000:\ 2012053E7AE584DEEE9B71A412FCC9351C29961E9D3972615C10EA59329A1D3A 0000000000002000000000000000000000000000000000000000000000000000:\ 414DAAED4DEFCABB5A3E4A82131B914E597522EFCE506AF7B294A14486B40ED8 0000000000001000000000000000000000000000000000000000000000000000:\ BC52EFFBBB3C6F7C66AD400B707CD98930A828F6B5BA3E0C71D706F42000E80C 0000000000000800000000000000000000000000000000000000000000000000:\ 6225473F5D9BAB2A34928D9F3C9891C990982718319F2408D07670A7460D783D 0000000000000400000000000000000000000000000000000000000000000000:\ B2B2DEA4697FCEB6CC466A7859A30C2BF5C6E477F6F442A1918802BFE707990B 0000000000000200000000000000000000000000000000000000000000000000:\ 873D4CB3F71AA7704660011B30E9B573AE0E839CF0B102633F197290F19998A7 0000000000000100000000000000000000000000000000000000000000000000:\ DA24CF903BB826BFC026106F54EACFE50C0E8319BE205B47E181642723DA2305 0000000000000080000000000000000000000000000000000000000000000000:\ AFE22988EC899E95704B9E87082EE375F78DB2687478CCFBC2DFDC1E121C49F4 0000000000000040000000000000000000000000000000000000000000000000:\ 497D0D90F9A77F1D67F0567E67F7ED60F9D324CDE0DB266E51AFD4B25CF24FA4 0000000000000020000000000000000000000000000000000000000000000000:\ 0845CA0AAAF8F899437303A1C4A24101437DA7C90D1147E653295BA68CED2D1C 0000000000000010000000000000000000000000000000000000000000000000:\ A1BD23817C23BA5910B9EE8404740A0CE3E81DF31A5AFCD172B4613ECB1A9B65 0000000000000008000000000000000000000000000000000000000000000000:\ 13EA147D01F645B321E81F39D15CE4AEB9CF2E0373D6FCBBC1CA7CDCFCC40C29 0000000000000004000000000000000000000000000000000000000000000000:\ 912E64C464286112AFC2CCD15E638707F293D8A8133E03D6795E96562D471183 0000000000000002000000000000000000000000000000000000000000000000:\ 1AF94AA75BDB9B976831E1A6A1A7BBD14697F710E514AC4019B33815F167B555 0000000000000001000000000000000000000000000000000000000000000000:\ E13FCB8F649438F18530EC00DAA36A110FC641A226C3DDE990F82C4B561DA4DB 0000000000000000800000000000000000000000000000000000000000000000:\ C8387BF8DBADF1C9BA583A8D27B620F4BD13CEE4EA2EF98BCB0E1BDFD6F3D8C8 0000000000000000400000000000000000000000000000000000000000000000:\ 79A257D3B1260EAE2C407B55A33C28E19777C185B5254AB051442D2353B35464 0000000000000000200000000000000000000000000000000000000000000000:\ 6552EBE29B1B037562F1888498BBB208054638E97C0C625F127C1A203EFFFC65 0000000000000000100000000000000000000000000000000000000000000000:\ 2D77A6F16003C7F09E6DAEA5CAF4E61B9CD822CDF21A33F300EEAF33264AC67F 0000000000000000080000000000000000000000000000000000000000000000:\ F5B8339CB1EFC7F3FCB94DCDF8BB3EC191EE016609082E47242EE6253A05DA9B 0000000000000000040000000000000000000000000000000000000000000000:\ BD7CDCC82D46856DB3E580548999DFBA0D8BD38E0EDBB797188DE335D933C8B3 0000000000000000020000000000000000000000000000000000000000000000:\ D340DBC1256765FEA41925FDA295BDFEAA1055CBFEAE0FDBA8608E3116D746DC 0000000000000000010000000000000000000000000000000000000000000000:\ 49293309D25CAFC914C11063C2D1CD286A4500D519B11B4FC98500EFB85F6D9C 0000000000000000008000000000000000000000000000000000000000000000:\ 6091339D451E8F830A46C5CE040717C9D06F36AA4C5A9A8A9F1622384A6EB694 0000000000000000004000000000000000000000000000000000000000000000:\ 6CBD66038B54D94A931006EA23DB48C300E1384CE7FA0F7CCFB8EFE2FC0AC4F8 0000000000000000002000000000000000000000000000000000000000000000:\ 8A1A30A8F415D71BBB03C5AE3DF4836CE54CBCFD78816BCE86E0B983B059E972 0000000000000000001000000000000000000000000000000000000000000000:\ 8039AA16A81B23F2410448563996605C13766D1E7417F4BDFBD8AD5D0D33554E 0000000000000000000800000000000000000000000000000000000000000000:\ 7549D699D3D1989D940600F25501C243E9AF21FE51EF2ADB8358C159C9E9663F 0000000000000000000400000000000000000000000000000000000000000000:\ 831F3936CACEA264EF4FAE2E36B2110F6729BAF434E61A6EE379D0C014F2DAAE 0000000000000000000200000000000000000000000000000000000000000000:\ 013EDBD6B8EA866D7AE7F553C079663CA22ACF4E21E64F0085ECE1B449BD10EF 0000000000000000000100000000000000000000000000000000000000000000:\ D9B846387CE55AC512A1E2807AAF6F8DCFBEB462ED6D4176CC56A0B0BDFE1047 0000000000000000000080000000000000000000000000000000000000000000:\ 0528B59ED6EBBA187A69C3C41E88120B1315CEE497BB6731191DC05000CD1E78 0000000000000000000040000000000000000000000000000000000000000000:\ 1EBA730823BA27ECADE25B38144D339053446006EC3F66131AEE473EA3FB9E04 0000000000000000000020000000000000000000000000000000000000000000:\ B8AE9BF4E323C6EF3BFE75B6969EBFA68FE6C14B06481CF06869D12C555DBFA9 0000000000000000000010000000000000000000000000000000000000000000:\ C89944EF4886967A517064A212E38BDA5FCA80CA54E18103A75D54A6E230C694 0000000000000000000008000000000000000000000000000000000000000000:\ 452E5D0AF5DABFDC5C74868D916F1E390A7354937785F1F6D4D0B1D72F06BD8F 0000000000000000000004000000000000000000000000000000000000000000:\ 87AD2F7F2E5DB1BE3BCC982EA058955AE34A3CF0CBF87DC4813AE5B0E6B3C517 0000000000000000000002000000000000000000000000000000000000000000:\ FB4635AC471CBEBE2EB3367F259232D7B62B8A6342E1BF73294FE447C3B8076E 0000000000000000000001000000000000000000000000000000000000000000:\ 9ADA02E914EB181D22E7F6D9B3F39804A0F758BDA23995E567E3A1EDFF0B60E8 0000000000000000000000800000000000000000000000000000000000000000:\ D41BC420CD25BA9038A4E1D1C4CEB1B05D993D0B68095F46B4BB524B72F15287 0000000000000000000000400000000000000000000000000000000000000000:\ 329954D9CB855DD7798E587403353DD69CEBF91A5020AE5FC4D742656E4CAD0B 0000000000000000000000200000000000000000000000000000000000000000:\ 7FF37D832DB4DA7CC3473FC3F0B263949630F21DFD8522A544994C5A3B12644B 0000000000000000000000100000000000000000000000000000000000000000:\ 7F27BEE720048484188F774D660D86276B6383AB2E40990F181E5349DC72FC52 0000000000000000000000080000000000000000000000000000000000000000:\ AAFCA0AC1D6C80EE40FB43FAD51F006D39DE0A101449B450A3E0FD9D44FE0230 0000000000000000000000040000000000000000000000000000000000000000:\ 941A10F2333950E3501C6229C085A54185E55A1017C9B8DFD9187B614371884C 0000000000000000000000020000000000000000000000000000000000000000:\ FA7862ED967E19EC63F91344184684099C7BD734EDF810509E2FB308FE5DAF16 0000000000000000000000010000000000000000000000000000000000000000:\ E5C92E4C6590AD2F982267BE2B13E110C44D9C69E93516F594B7E433A0E93AF4 0000000000000000000000008000000000000000000000000000000000000000:\ 0656DD98DED7D764BCDEE4E96A9699E70974AE77CF72F166B7A979B707F1878B 0000000000000000000000004000000000000000000000000000000000000000:\ 1FA047EFED4A196A9B538C099E50B67A0F537897FCA6F0AEB386F43E65D48A31 0000000000000000000000002000000000000000000000000000000000000000:\ 74BF1C0E1DA85358FA86ECBBAB419C9223F41D47702583593CD01539E861DB73 0000000000000000000000001000000000000000000000000000000000000000:\ 846C472932FDA94B56483E7A903C6545B5CDE4FE5D0A2FFA03B52AD53570D54A 0000000000000000000000000800000000000000000000000000000000000000:\ E78743B610392B52CD122071F9071A8E9C35AABEC0BD63C73C5FD12171838B32 0000000000000000000000000400000000000000000000000000000000000000:\ 4A435A44A2BE1F40D8E6A1F7C332C5330EDE4E0F55505304E571B4443255A5A9 0000000000000000000000000200000000000000000000000000000000000000:\ 18122CF13AB2412FA65CB693713794DE6B30403B65688234A6FA940FC6D506FF 0000000000000000000000000100000000000000000000000000000000000000:\ BAE3E67A9D5505A5685EBB52B8510B44315C0FAA422F0EBFD4EF3413490248FB 0000000000000000000000000080000000000000000000000000000000000000:\ B7F300939FCC6EA45A8920C7B8D3F18E753C0076062E4A499B69AF96328CEAF9 0000000000000000000000000040000000000000000000000000000000000000:\ 7E5AAFC21B6238FFFC561283AC2B592C1F5BB35237061629AC9A4AF7153CDB3A 0000000000000000000000000020000000000000000000000000000000000000:\ B98F3C9FA25CC07AA02F7456E15C7707DA6702628AB589351B8737A814DBCB9B 0000000000000000000000000010000000000000000000000000000000000000:\ B01668CF19C69B22737F7409EDE201CC37BF1B23FC0630FDA9364652171389AC 0000000000000000000000000008000000000000000000000000000000000000:\ A8BBE8B393AB0E3D0E822C8AB9F23B8F1C985E93E6EC17050CC6A0D82B27A078 0000000000000000000000000004000000000000000000000000000000000000:\ FB246A9EEC0AA00A971416718CF0BB789F44496183642024C5A3C8043C5E72F0 0000000000000000000000000002000000000000000000000000000000000000:\ 5937034D4C6184BC32CEF38ACA4BCEA720F3D3061191D1E0EB5C84E242C7DEEF 0000000000000000000000000001000000000000000000000000000000000000:\ C0DEB1F9A2060A3CE111BC6C36DDFDEAED2713229EAC55C75608B9272E10B78E 0000000000000000000000000000800000000000000000000000000000000000:\ 08CC99BD1C9E6C2AC03DD17C7BE3F0D744AAC4144D542D2F4D2F3366837E030E 0000000000000000000000000000400000000000000000000000000000000000:\ B5026F002368EFAB1FC2AA97BE628698C41DB381B44F8BC2C8BE3635C8F0BCFA 0000000000000000000000000000200000000000000000000000000000000000:\ 98A020137D37236B11D0ACFEC699107679EAF0339E8C0AAB3AFF1538296F754E 0000000000000000000000000000100000000000000000000000000000000000:\ A30B09A7870D5FCF10704CA8A00083FF4ED2D0B78F530161C698A0DC272C5F12 0000000000000000000000000000080000000000000000000000000000000000:\ C4CEF7219FBA14B0515FF84CA552273E471EFB23A26274778C11D0FB61805A8D 0000000000000000000000000000040000000000000000000000000000000000:\ 0F70F20E2513A79AD1D153C98981D5CD21DE4C134977658D1C9C4B4367A73F99 0000000000000000000000000000020000000000000000000000000000000000:\ 690A81F1FE0464FAB24A2E9861C24E52087D902B2DFB344713B42285051E5C81 0000000000000000000000000000010000000000000000000000000000000000:\ 403E430C39EECA88D967926B543A06FBB68654C348801FDE7466F34A5579E2ED 0000000000000000000000000000008000000000000000000000000000000000:\ 715623D0A82109017F74E8DE00BF5B700BC6C161CA403CDEB9A09B659268B779 0000000000000000000000000000004000000000000000000000000000000000:\ 6E367FF2768A6D4C980D7D1B75F312663CB816E5C0191A8839F6F9E50A44853F 0000000000000000000000000000002000000000000000000000000000000000:\ 81F33A1BC1018F2C4886865F55AD2FDDD891160D06717805F2687155E26DC2E4 0000000000000000000000000000001000000000000000000000000000000000:\ 1C074CA4ABAF8B662D0C75635F84FE4ED9011CE476C45F8214F798438E1CB9FD 0000000000000000000000000000000800000000000000000000000000000000:\ 003D837BBB718E13778188399EACD53DF9781EE8AD3F77BBD35F5B617D38AB24 0000000000000000000000000000000400000000000000000000000000000000:\ 37212E518E30D555EA442EC7467B1E95DC06371C9784705D0D885D1C61981029 0000000000000000000000000000000200000000000000000000000000000000:\ 74119615B3146E59D08DDDF07CF0614264D73F2118CF4A5CECFBAA691B005F2B 0000000000000000000000000000000100000000000000000000000000000000:\ 3269AEB6831504CB8679EA40F749072951EB1728CC5E21E45FD0D6B423F6FA42 0000000000000000000000000000000080000000000000000000000000000000:\ D504FD065F8D2BCD3D1D3A4B298328E09F1CB44E3106D156477E992AABE9812C 0000000000000000000000000000000040000000000000000000000000000000:\ 8AA4012B4573828D21C20AC64D18A6EA73DA0347B5D1A71442091CA48655DB70 0000000000000000000000000000000020000000000000000000000000000000:\ 650189D78DE4CF754ED237A9DDADD9686B58D85D06D82E937DF6075F4CC87642 0000000000000000000000000000000010000000000000000000000000000000:\ D140E61D738C3298875886B8D8DE576E48FF5C7E9F4D0E66D0149D0BDEE19F49 0000000000000000000000000000000008000000000000000000000000000000:\ 59E7ADDB5E068640DE3F8FB015017E7AA7495430D2533F87D4ECE9F7EE548FA3 0000000000000000000000000000000004000000000000000000000000000000:\ 5481B8528EF488D0A4ED259244306AFF83145B7D675E159EFECE21DEF7561297 0000000000000000000000000000000002000000000000000000000000000000:\ 671EAA12D76BE21EB2CED2F61AC1E98DF94C1952C2CDFC047895C74F15A7F3FA 0000000000000000000000000000000001000000000000000000000000000000:\ 6CC4F0E930B34481D03A4134331852EAED66667E3B3D8605F7CD3777551D2B6F 0000000000000000000000000000000000800000000000000000000000000000:\ 58A971DF91F981284DFCA88C6A21AB89D4E6A12E0D8A1E12BB585EB697D597E3 0000000000000000000000000000000000400000000000000000000000000000:\ AFE25F910412D62DB9FEFBAC5CAF3D240153725FFF1B8D85FF835BD418028738 0000000000000000000000000000000000200000000000000000000000000000:\ AC99C31BFF7B16E8916E8ED5C969CE7DD1B7A4A009F2F03EA8FB240B1AB16CE5 0000000000000000000000000000000000100000000000000000000000000000:\ 85A6CECFA95E645104A45E2E34E98F92039ED921ADF65E78631E270548521637 0000000000000000000000000000000000080000000000000000000000000000:\ 1C686E808A38E9D3D800AB94F8EF98888FA959593FE9A78850EE01CCABF170B9 0000000000000000000000000000000000040000000000000000000000000000:\ 058AE81BE2477D2BB0EF309F69713D68196A0A9D758BE3814B565088FD752AB3 0000000000000000000000000000000000020000000000000000000000000000:\ 5B1919A40F9A5AEF568E1E24B414A85C0D60D1DCABAA2CCECA09A91D78A91D15 0000000000000000000000000000000000010000000000000000000000000000:\ FFD4927E8C35AFD614A39AEC5654A8CEF3CFB47B737BCD55342BFDA0B9D81E53 0000000000000000000000000000000000008000000000000000000000000000:\ D47A6B8BDBA65DDF5820DBCB3F1733018CFA0A3A278540C7FBD575E36E20F063 0000000000000000000000000000000000004000000000000000000000000000:\ 9D8A03520FC2F2653AC52B7C0DA06F5436858A811E5F4B2DB0B2182C2C8F6D12 0000000000000000000000000000000000002000000000000000000000000000:\ 13A17E3E7C07F58935075A41B2B5B332CC64F7099E320430DBEF41685DD95B27 0000000000000000000000000000000000001000000000000000000000000000:\ 9250C7028C00AAD64F1A1140F4DE8812608FCF15F3E91AB886C911E71BD41324 0000000000000000000000000000000000000800000000000000000000000000:\ C019BC0605ED4157C8D3E4761BC74D403558E426D04403B17C9923AA5A732C48 0000000000000000000000000000000000000400000000000000000000000000:\ 524FCBE1456CE1D535E6E75098F7A817EEB99F6D3B77A9705BF40674E84AEAF6 0000000000000000000000000000000000000200000000000000000000000000:\ F4A5E902E2633F78A4AD90C9305DCA8CCFF31A8CE6FE8DC3755A591D201BB51C 0000000000000000000000000000000000000100000000000000000000000000:\ BB242C3D49140119969CE07F0021E400ECDCBDEB3FC8C92459EFF346878A6FF6 0000000000000000000000000000000000000080000000000000000000000000:\ 362B9130763C98696ACE92E946F2646EDB7A9D419CBE12ABF9CB40B9BBDB32DF 0000000000000000000000000000000000000040000000000000000000000000:\ 6BF88E66479D09985823F2B87BD7DFDDA415442B5132B2482F9B092CD3FBAA4A 0000000000000000000000000000000000000020000000000000000000000000:\ DF6777DF2585349325132C5A6AB16481498BF9A1957EBC2F113095669C7AFE96 0000000000000000000000000000000000000010000000000000000000000000:\ 37108D63C635FF214AF8A98DCA6A3E288FA14EA8F5E8C52A583B6F12BDBA3CF5 0000000000000000000000000000000000000008000000000000000000000000:\ C22FAEF7E57A7BF3E344132436FAE85BD59A9BF4AE01DA2545A6EE3779773AF2 0000000000000000000000000000000000000004000000000000000000000000:\ A1947F12BD61D72067884D47AC2C8DF8541FBB4A9EB2D0F1A8F6997207819AE0 0000000000000000000000000000000000000002000000000000000000000000:\ DDA4ABDAD1290FD66A171D9724A409B02612F8606C58D85D530F30E7CEDEA3D2 0000000000000000000000000000000000000001000000000000000000000000:\ 658FCE7342D3C8E1EDEBD0EF0B72612346500B72CEEB1AEED11845F1AD1401F6 0000000000000000000000000000000000000000800000000000000000000000:\ 518EE98053E9D1F1F42F9E59DD74A6D9AA0D1F1FDDDD4F799134B4C111226D98 0000000000000000000000000000000000000000400000000000000000000000:\ 1F2513F0CD6195005B81727F7784B1F109C2F680A5E3343A9EA0FAC21F35BAB6 0000000000000000000000000000000000000000200000000000000000000000:\ 2D05A4ED553CBD1F532EEA35D158F01F2867D49A7120ABE733A5F6C2E5C92C21 0000000000000000000000000000000000000000100000000000000000000000:\ 0BFC42AE0F93D32617BB3C7CF8E4A6515AA8668922E05AF39A27CAE39F9CA221 0000000000000000000000000000000000000000080000000000000000000000:\ C3F2631B8F76C94534ABDE0EB456EFA47DC43B08F7CDBE379622621B28458915 0000000000000000000000000000000000000000040000000000000000000000:\ 9C15E4A671EB6E390BDB67AC4441DA8CCC9E56AFE28B8BCC928FC6F3E552569A 0000000000000000000000000000000000000000020000000000000000000000:\ EFD7A7E53F7F21FE9B9D4A5BF3BE5AE7ADB0947F8412BE25F7E88A45743E6FB8 0000000000000000000000000000000000000000010000000000000000000000:\ A524AC0D0DACF565BBA3B84015D995202E1F67409D63FE16D442CAF5C72C3D3C 0000000000000000000000000000000000000000008000000000000000000000:\ 80073614FB76A09C3DD701E83BE717117A3694D05331B032F8104CA241F11482 0000000000000000000000000000000000000000004000000000000000000000:\ C475A4C797002B5C66A21DEF4295CDC4C9DE4F045FB0FCE7A1BDB977224BAC97 0000000000000000000000000000000000000000002000000000000000000000:\ 6D8547CABF8F0AEAF7A9B3598CBA769F545C61E8873FFD6D5E7EE9C1C5527F95 0000000000000000000000000000000000000000001000000000000000000000:\ 7187108D9F4506C15B5E6AD523167BD2BADABE69242EB6AEBCFE52F70874E757 0000000000000000000000000000000000000000000800000000000000000000:\ A195EAA4E6377B4C0360C343D52F82704BD85BC5905D669C5E4ECA7C1F028C88 0000000000000000000000000000000000000000000400000000000000000000:\ 72C72361133DFFEBFD3EBBB8FDC6B76DC530AA7FF5E22EE709B65BE866DACD86 0000000000000000000000000000000000000000000200000000000000000000:\ 20F3BF2E8F3876FA733F41CECFDA7C641CE579B8ACE9DFE06A64A4BA72BFA901 0000000000000000000000000000000000000000000100000000000000000000:\ D3B0F2A184D2AEDACC760448DC351B63E975D5E48444320733F19381EB973659 0000000000000000000000000000000000000000000080000000000000000000:\ 25D380557DDACD3761FED7B1EF2AD9B2CB25EF263DDDC08E34646EFBB696F718 0000000000000000000000000000000000000000000040000000000000000000:\ 7DF39F3B439912E4859500ED516F4096EF60A96911F626052B3315416C307F90 0000000000000000000000000000000000000000000020000000000000000000:\ D05070BC61FC95F05359B8B36C70DB0E3D5FC077F73C02CCF4310A24C91A0F33 0000000000000000000000000000000000000000000010000000000000000000:\ CD3683D700693575FBB3355F844458ED60B1A45294CD27CD380A9A10E660E407 0000000000000000000000000000000000000000000008000000000000000000:\ AB19432215B64F93A344F7E6A46B386C4AC159924AB4A6F366FB8552A96DBCE6 0000000000000000000000000000000000000000000004000000000000000000:\ 1F6B7158C0B0A4311FBEF86E39BD812BC94207D154B9CB2380433F16F6821B7B 0000000000000000000000000000000000000000000002000000000000000000:\ E65A4E3567D420D98EF51C29405AB004A019D794C51A67A680F6D54F21F08E5C 0000000000000000000000000000000000000000000001000000000000000000:\ 53382A486C2390F7FF94A33BAFCE7285F382BDB5BED4FF076D7A161B169D6B4A 0000000000000000000000000000000000000000000000800000000000000000:\ 9E36673A278E023992B653AA0683CE64BA7CCE51239E091C80D98BC627B45A00 0000000000000000000000000000000000000000000000400000000000000000:\ AD51CB9156C8CB66C202133E098061688A0360EA0E5B49A9F47EB00C346EB1F4 0000000000000000000000000000000000000000000000200000000000000000:\ 9DD8990FD868111F6854AC54D85BA38B9B0BE3E02037B4A3DAD2D0D9E89DBCE3 0000000000000000000000000000000000000000000000100000000000000000:\ 8A4A51AEB3BFE9FEECD9F4AF22D2D34C534F3A2B127E959236407206A4E1DB2E 0000000000000000000000000000000000000000000000080000000000000000:\ 32F59D1C8E62EE49BEDCCF59007194EEBBC698B888050723C5325A746463E3C2 0000000000000000000000000000000000000000000000040000000000000000:\ FCCD7332FBD25CE39EE7522F432185F2322EF05CF1F5E36A2458272FF1397A0A 0000000000000000000000000000000000000000000000020000000000000000:\ 62775BB6A290E509389C0EA6BAE5C8567A0E034A813F9AD62666B4871D8FACA3 0000000000000000000000000000000000000000000000010000000000000000:\ 264AF724EBD387076F1427EAF7D7E94734A209DDFFAB1BF455528D8BFB548681 0000000000000000000000000000000000000000000000008000000000000000:\ 96FC8FF80897ED6F514A67FB4FA5CF9D53814E305FED248BAE6B5761A331E0C3 0000000000000000000000000000000000000000000000004000000000000000:\ F98B7C970726889639C19C75FA4E63BFF6D48063806A19EA4584B84F3C40079B 0000000000000000000000000000000000000000000000002000000000000000:\ 76CA7485A665D0B76ABBB2909B193D8F8572C8DB77F969256480F63728ACA867 0000000000000000000000000000000000000000000000001000000000000000:\ 8004B9B6A39295D73D00759682C72DE9A49E7278189CA9A1D704FFFDE8F8AECB 0000000000000000000000000000000000000000000000000800000000000000:\ 98177F21E631C18FD21733C5BCCF33243970AC5EBDBB19A257DC96BF43D5151A 0000000000000000000000000000000000000000000000000400000000000000:\ DCE21D3195A4B65B3B2C3EF0A954A157785C8CA4FD195AE15BD7F420D9D5CE14 0000000000000000000000000000000000000000000000000200000000000000:\ EDC0E40C3027D41914BF3144A08078742B337B96DA8E503D4FF84BB6A8E97D55 0000000000000000000000000000000000000000000000000100000000000000:\ 013F21DD7052786E2C338B57F23EC2C7FEB0C12F7B3B28FBB5AFFACA27103F51 0000000000000000000000000000000000000000000000000080000000000000:\ BF8362CE587255D74A374DE2775680C02A02B2106D05EB9B1EB83BC88A9C97EF 0000000000000000000000000000000000000000000000000040000000000000:\ CA72BC9BB4F0F6E2DDD3D641D94A62163A066AF9D77AC3937CB00D134DFD46F2 0000000000000000000000000000000000000000000000000020000000000000:\ 6B42A2D46EEBC60C0238517A9F2B78BA27CE4B87ED35261FB0A0DEDDD39DC753 0000000000000000000000000000000000000000000000000010000000000000:\ D441092F524AE16D1339E78FB13892732A5975705F90F82E54EE09D80448E49D 0000000000000000000000000000000000000000000000000008000000000000:\ C7F6DFA7F3E4F92D6C20AEEAE921FA209685D0C20714D69A95D1F94FA41D097C 0000000000000000000000000000000000000000000000000004000000000000:\ 300223DF08C84B22C569FC15ECAC264F9D1CFDAD758962B406C757FCA69D0A0A 0000000000000000000000000000000000000000000000000002000000000000:\ FB81B52E00690B2F03F8D410A357E582F6F4367D4359FE7DD7CC6C6A3AD24CEB 0000000000000000000000000000000000000000000000000001000000000000:\ BD5ECECE8B8CBC564A91294968C3BE209B15730CF7594D2B79BEE0D44391BE7E 0000000000000000000000000000000000000000000000000000800000000000:\ 80179FB24A6EEC0173DAF26891251C3054EA8D7280F88D4C57A3F52B5F1AA388 0000000000000000000000000000000000000000000000000000400000000000:\ 59C6F16A4878FC819F3A3CDFCF7C5A8CEAFE9231CE259A7F9E377E3D8B41C16B 0000000000000000000000000000000000000000000000000000200000000000:\ B18656E3D9D293F342A9A4B88884BD9A650D72368C1703B74ABD2D4ADD1B6A5A 0000000000000000000000000000000000000000000000000000100000000000:\ A7213DAEEBA47277122DFC9FFADBB36881C6FA9C89293D2291407522639E017B 0000000000000000000000000000000000000000000000000000080000000000:\ 33D62D3A60AF659D70978E12F6AE01D6D62686965288B584796B6AECC37167B7 0000000000000000000000000000000000000000000000000000040000000000:\ 3F2F1919206CFBEBC68DB1BD552D78AFF61F5AD296AF45F15145E176CD4E93BF 0000000000000000000000000000000000000000000000000000020000000000:\ 4ACA600624783F035871A05365EDFD0D01A67C9DD59D38A68117474D81F4A93E 0000000000000000000000000000000000000000000000000000010000000000:\ 9B352CDE8F0BDEFCC8B1F37D34B3641FF6F55C05FF5193928402ED95C986D1CD 0000000000000000000000000000000000000000000000000000008000000000:\ B14B9519FE51B738F81BA61AE48723835412B544F41E8CA4D3C2BE8B8E7B7ACB 0000000000000000000000000000000000000000000000000000004000000000:\ AFF464673EDD86FED0C0CC97BE3DE9375E61503680B17AC4FD44AEDC02EF086C 0000000000000000000000000000000000000000000000000000002000000000:\ B600CCFEC9DDAE068109C82B0B7BA3632501857EB23CA7860FD26F3BC1335697 0000000000000000000000000000000000000000000000000000001000000000:\ 884AA440D0320D6FB74A8B02BBE5F7DF50CC4B83571523CDC4A2683776AD6218 0000000000000000000000000000000000000000000000000000000800000000:\ C20D94291275F858E53FDC834B0E02FD496145B8713F53555E863425A61D1E88 0000000000000000000000000000000000000000000000000000000400000000:\ B1087C12C70D6224460202DA3FA5B985D3D2B130F2347D6BC7DC7668856EF5B8 0000000000000000000000000000000000000000000000000000000200000000:\ BE7F81F61289AFD0E08467938F054F69D2795E570D0F5C7577125BD37D72069C 0000000000000000000000000000000000000000000000000000000100000000:\ D7E79AEEAEF9CDC5889C68E98DCC7C1D85172D0F183A62815DF0104CA67F3068 0000000000000000000000000000000000000000000000000000000080000000:\ ABCAB82BD056C3A975C8CC78B160B1A726EA2D58DC8775EC9CC1E97B1887263A 0000000000000000000000000000000000000000000000000000000040000000:\ 716A3871C88D6C0D6AB03C6C925CA5B0FEC9816CB393BE5226E387048DC379AA 0000000000000000000000000000000000000000000000000000000020000000:\ 046284F44965FFE307372B5EAA47D0DCFC282B13B1D13FEE3786A0A2173CA034 0000000000000000000000000000000000000000000000000000000010000000:\ 0316CC9C233290D72C53938CF8D216E24447D95114C3F9BBF2FA508EEA9E72CB 0000000000000000000000000000000000000000000000000000000008000000:\ 388A34BA91711C31E14675BBA6CC29A157237E2B1B6095B02A49373A8ABF43B3 0000000000000000000000000000000000000000000000000000000004000000:\ CCFC11FC56D48DAF0F233275E9E591B76758CE6099465FA3E8B925FACC8C1D87 0000000000000000000000000000000000000000000000000000000002000000:\ F1C19314208EC565B4E50664B650FC0D256B4EB5A177ACDCCEFC78BEF7543A6C 0000000000000000000000000000000000000000000000000000000001000000:\ 954A6575B642BDDDD05409CF5973BA837F25B2E391950BE91FA23334093D88F5 0000000000000000000000000000000000000000000000000000000000800000:\ D8C9AE155F36F1EDD6A9A0FBCE9D8A2D97EFC4896EEAB31FA4B2A267F10F83D7 0000000000000000000000000000000000000000000000000000000000400000:\ E1291A0E2D900F2D61C7B915EC60CB2F26C58DE63B0DA7F1AA1F40FB609C7261 0000000000000000000000000000000000000000000000000000000000200000:\ 18DA34910AFFCD9B1F0B80D57B2B545DBD3FCBB9327B0744553B0AE309D01F2E 0000000000000000000000000000000000000000000000000000000000100000:\ 0B07727D83B28795BD6CBBCCBEBEA5CDEDF3430C407723FD2F5270BED6F574B7 0000000000000000000000000000000000000000000000000000000000080000:\ 6580335A2908A8845A95E26E793D522451579D91C90A4C92D8667361957C4FA1 0000000000000000000000000000000000000000000000000000000000040000:\ 34B59ECBD01296EA9FE6C2F1E22AD83AE34AD9917F762E5AE194700A95F5B08B 0000000000000000000000000000000000000000000000000000000000020000:\ 8C7809B15F5525F59885E518A954871A34A4850A0C5AC531CB5564C91D10FA81 0000000000000000000000000000000000000000000000000000000000010000:\ A1F386B9AE9B170E1F02E3FA611B991E4A383E1D998FC03F1026028B70C5FBB9 0000000000000000000000000000000000000000000000000000000000008000:\ 25E947AAA44B7574BCE0D0AC4D91D63489A7837F6AF73764EAB3CC83EFF2B01F 0000000000000000000000000000000000000000000000000000000000004000:\ 1B85D67D1481C20BACB50AEA0C506AFFA04B258C049A8CBA641DD4D3A0ECE1A1 0000000000000000000000000000000000000000000000000000000000002000:\ CBC332EC5110FEAE214FF569FECA4BEF1B3CEB809F0E2362E3924A762153785C 0000000000000000000000000000000000000000000000000000000000001000:\ 0193D8FF39177FC604D8C0E60D5495222DA10CD84D4AE6D12BF84CA923158B31 0000000000000000000000000000000000000000000000000000000000000800:\ B6A210AEB8D431276712B83DFB27A338166436C37B13E533E6A664BC0696E21E 0000000000000000000000000000000000000000000000000000000000000400:\ F1337369C5303A28DA9132C4562C7D1D7381E3F30575F05C72DD3E969CFCA5EF 0000000000000000000000000000000000000000000000000000000000000200:\ 5BF54EC3CE05919EFEDDEE2AE288118DB06A3AED340D89CFE279D0C6927CD336 0000000000000000000000000000000000000000000000000000000000000100:\ 084E640FA57CBF5F097FD08636FE5E98E23839D95C532099EFE1A7A838DBAFCA 0000000000000000000000000000000000000000000000000000000000000080:\ 63794A3BF8875AC2C32BA6238D27E7E15E56A3B794B8D2D6AEC82FAEF2360E3A 0000000000000000000000000000000000000000000000000000000000000040:\ D9ECE2CD2214F52C55DCD9BCA56A900EC79C1343F12DF8A60F0298D255896B61 0000000000000000000000000000000000000000000000000000000000000020:\ 9633190BF775667487569D0F5E7ADFEBC899E55AB9D62AAABE9F8754A3FA9C20 0000000000000000000000000000000000000000000000000000000000000010:\ A3ECDE0C1D9DAA6B7A949C87A1AF7963C69CB2C412FB3086C495F14630C17B7B 0000000000000000000000000000000000000000000000000000000000000008:\ 38DF1C1F64A24A77B23393BCA50DFF872E31EDC4F3B5AA3B90AD0B82F4F089B6 0000000000000000000000000000000000000000000000000000000000000004:\ E38990D0C7FC009880A9C07C23842E886C6BBDC964CE6BDD5817AD357335EE6F 0000000000000000000000000000000000000000000000000000000000000002:\ 9267D3DBED802941483F1AFA2A6BC68DE5F653128ACA9BF1461C5D0A3AD36ED2 0000000000000000000000000000000000000000000000000000000000000001:\ EC4916DD28FC4C10D78E287CA5D9CC51EE1AE73CBFDE08C6B37324CBFAAC8BC5 [SHA-384] :38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA\ 274EDEBFE76F65FBD51AD2F14898B95B 61:\ 54A59B9F22B0B80880D8427E548B7C23ABD873486E1F035DCE9CD697E8517503\ 3CAA88E6D57BC35EFAE0B5AFD3145F31 616263:\ CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED163\ 1A8B605A43FF5BED8086072BA1E7CC2358BAECA134C825A7 6D65737361676520646967657374:\ 473ED35167EC1F5D8E550368A3DB39BE54639F828868E9454C239FC8B52E3C61\ DBD0D8B4DE1390C256DCBB5D5FD99CD5 61626364656667686263646566676869636465666768696A6465666768696A6B\ 65666768696A6B6C666768696A6B6C6D6768696A6B6C6D6E68696A6B6C6D6E6F\ 696A6B6C6D6E6F706A6B6C6D6E6F70716B6C6D6E6F7071726C6D6E6F70717273\ 6D6E6F70717273746E6F707172737475:\ 09330C33F71147E83D192FC782CD1B4753111B173B3B05D2\ 2FA08086E3B0F712FCC7C71A557E2DB966C3E9FA91746039 4142434445464748494A4B4C4D4E4F505152535455565758595A616263646566\ 6768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ 1761336E3F7CBFE51DEB137F026F89E01A448E3B1FAFA64039C1464EE8732F11\ A5341A6F41E0C202294736ED64DB1A84 3132333435363738393031323334353637383930313233343536373839303132\ 3334353637383930313233343536373839303132333435363738393031323334\ 35363738393031323334353637383930:\ B12932B0627D1C060942F5447764155655BD4DA0C9AFA6DD9B9EF53129AF1B8F\ B0195996D2DE9CA0DF9D821FFEE67026 [SHA-512] :CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE\ 47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E 61:\ 1F40FC92DA241694750979EE6CF582F2D5D7D28E18335DE05ABC54D0560E0F53\ 02860C652BF08D560252AA5E74210546F369FBBBCE8C12CFC7957B2652FE9A75 616263:\ DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A\ 2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F 6D65737361676520646967657374:\ 107DBF389D9E9F71A3A95F6C055B9251BC5268C2BE16D6C13492EA45B0199F33\ 09E16455AB1E96118E8A905D5597B72038DDB372A89826046DE66687BB420E7C 6162636462636465636465666465666765666768666768696768696A\ 68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ 204A8FC6DDA82F0A0CED7BEB8E08A41657C16EF468B228A8279BE331A703C335\ 96FD15C13B1B07F9AA1D3BEA57789CA031AD85C7A71DD70354EC631238CA3445 61626364656667686263646566676869636465666768696A6465666768696A6B65666768696A\ 6B6C666768696A6B6C6D6768696A6B6C6D6E68696A6B6C6D6E6F696A6B6C6D6E6F706A6B6C6D\ 6E6F70716B6C6D6E6F7071726C6D6E6F707172736D6E6F70717273746E6F707172737475:\ 8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7FA17299AEADB6889018\ 501D289E4900F7E4331B99DEC4B5433AC7D329EEB6DD26545E96E55B874BE909 3132333435363738393031323334353637383930313233343536373839303132\ 3334353637383930313233343536373839303132333435363738393031323334\ 35363738393031323334353637383930:\ 72EC1EF1124A45B047E8B7C75A932195135BB61DE24EC0D1914042246E0AEC3A\ 2354E093D76F3048B456764346900CB130D2A4FD5DD16ABB5E30BCB850DEE843 [Skein-512(224)] :\ 1541AE9FC3EBE24EB758CCB1FD60C2C31A9EBFE65B220086E7819E25 CC:\ 23F031A6A4378039B66A5A178BAD217EAEC094B7FCBA663A47DDCF33 41FB:\ B9CAAA9DDAF14985F6A3322C8F0BD182BDFB2DC3CABDFF56F14940B1 1F877C:\ F320534DD6AB164DBF32194E8DF50638BE81B3442911E116CD004959 C1ECFDFC:\ A2AE4B71475C13CAB784E7439B1B46A7C43F65CA7131AE0DBDC881BD 21F134AC57:\ 300D8A0EA0151A88AC8F4115878C65A7CF46546E091298AEF70414A9 C6F50BB74E29:\ 1C727F7CC34DCA0B45545E642475F05356A51235DA43DEBFD9D4A9FA 119713CC83EEEF:\ 3F6E59BE0AB8CE2AF98695BDB82DB02484DD32B8BEC6FF990FE62A2F 4A4F202484512526:\ DB2C2598BD3C70E7A692BC17A05F4766AE774EF17BFF1903F1E0E333 1F66AB4185ED9B6375:\ 9567A563C89743C3EC317902331F1D6B44D507E1AD3831895CB84ADA EED7422227613B6F53C9:\ F3FD124C573369CC33FA357B53B5A728AFDDD0E88E0709B9529DEC86 EAEED5CDFFD89DECE455F1:\ BC4CCEA347C20202D9A788E940E4C6A04F01AD9BE95B04E057E330D4 5BE43C90F22902E4FE8ED2D3:\ 58C4C23F268A352D4D060D9FE05B8F9439AE5C6E684E48144C9416D1 A746273228122F381C3B46E4F1:\ 146E2AF3E7964E03B2E49B83AFA070DE29A92378E5F74445A29CFB37 3C5871CD619C69A63B540EB5A625:\ 0508EEEA8E53F9B54F4B3DA38A65D20B3F64E03C4E4E807E2AF400BA FA22874BCC068879E8EF11A69F0722:\ 616C6D8209D8985CF498EA61D00DB2C4A2A448766281EDAA29F42AD7 52A608AB21CCDD8A4457A57EDE782176:\ 56BD9FF5DF1FD7F90CCD4463CFAE358CB4B9682083D76C46A29CFA81 82E192E4043DDCD12ECF52969D0F807EED:\ 65E27CABFF039416847DA007BD52C4F156707FE23CCABAA0534B0A8A 75683DCB556140C522543BB6E9098B21A21E:\ 7CDE364D7C4BB5FAB5ACE235B9B772F3DF38A0608D08FD312CF38558 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ 9B4E2ED839D7A996111C2DDA1B38C080843F6BF1EAA436D8323CDBCD E26193989D06568FE688E75540AEA06747D9F851:\ E262D8F26587552677CAE10464A72C914B3AEC2460A462F0EB9F900A D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ 4C5A54AAD044BC8819FC2D895FBEAEE6AA5AAAE3094FB2ABA671A5DA 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ 46640BA3C20AC292DC61DA325F3E9FDB90B5ADF3C0B18910EFA2B463 A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ C5908366A0986227FED0F781D44D0D1F6E82C3F4F13BA039E584D138 AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ 59DB014CAC582E5242C03910E8B2A2C2DE3BF6E1051038A1D0E1B18C AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ FC81767CA03BEAE9D7047A68C9C11387A219C8A41C3575A1D76C74A2 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ 93C0C5B021AD05F372DE7D8ED85E4A62AAB60D1B1916AD0274FB829E FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ 6F9190F15AFC1193C170FBA6E12205A13181C9E4AE45C737A619D6C9 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ 59FF99C3D587404053F312CA731778AFD2B25B28AC66265C6704E1B0 A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ 0E0F9EAE23B2CBE152C03A024F25874292A4C43BC33A8E0A71EF30CD 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ 9003F81632338473A42E6C146F623AF03E2B3A84D480ED60BC46244A 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ A02BF7A5DD4F19026A185B6D235EE69028C9FE79DE1DA23540E346C4 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ 2A30AB062D6017B6837652C64A7D33D01BF8B1F2D6D67567D8E52403 DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ 46:\ F7EFC8E93C910FF48EB19A150B5A68551D53A697ECF425BA4A0A4339 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ B5A0:\ D303345BBA22F070013A1220D9B437FCC98F5A9C4FB34C1608FAA528 B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ FBAD4E:\ B4FC1D2805F90B4B4A1179A49FB11D5B2669D13AAF744B84DFE2DCA9 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ ED2C2492:\ A2A83B496729CA27349DD9D6F7C67107277775A3B1066D25E6F0CFBE 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ 6B2EE4E542:\ 4A4EF2ADDECFFF390F4294718AE199FFEE59DD8AA8860AFE6385A764 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ 2A1493D8F4FB:\ 59D1E2B79593483456AB50898F12B56076125F93FC9B62EADA31EB58 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ 30A934467DA4B0:\ AECEE981C52C13CFD8DF10B352B8E2FBF1436533C985DC842881488B 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ C0308E29446B8ED3:\ 0622DDAB744D3158D334321B54DF50CF392A0BB31ACA5A70B06D9360 C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ 723B20F67BA610C2B7:\ C6C286FA7FED3422DF5082ECABA3124B4DAE8106A54FCCA63E85268A 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ 0C834CE6EADC2BB86BF6:\ E7D40A7106E6813F7AAF483379ADAD987F36F91D09C91E9D26A3D8F5 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ 1540D29BA27AB8E309A4B7:\ F446FC32046C86C97F49FD230C39C59A7871215E036D27AE6A47EF0F 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ 32B58EBC38FC2A6B913596A8:\ 3329A838C163C43D65DD865FD5F023F1FF389BF03EBC4442BF99DC2E F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ 38467205F5DCFB34A2ACFE96C0:\ 0CF599A4497A8193961B9B44C498786F9F90867A5E40E0CA71F433EA CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ B06CF0F5A0EA15CA907EE1C27EBA:\ 403C4D00CEB423A7E997585317FBA3D3C8D5D16FB4D73E2969605CFD 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ BCF84D0D4726364B9BF95AB251D9BB:\ 118B7A682A6D05DDDADE062F944CA129DC1D58430D72203A5AF62DF0 D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ C7F157298EABC4DCE7D89CE5162499F9:\ FD63B77D42B249F2DD6197C9F19CF530F3D2F821DAF3C2C61C342685 BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ BEF788CDB5CF4606C9C1C7F61AED59F97D:\ 83976BC85DB2490589B2D6DC28310C0F3F040E9B6176BFC5761A5423 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ 86E779CF053C77785AA9E692F821F14A7F51:\ 042F5CA6D3875F640603D5F21755DF11768E719FEAC6E823A0172409 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ 43304FBA401EFB2BDBD7ECE939102298651C86:\ EC86D53C6D7205C6DB9028A7225D24811524A6F40A8FC90DEEFCEE50 C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ 87D68D28CC3897452F6A22AA8573CCEBF245972A:\ 3C81E8DA5C4C8C711500BC756AA1D0942275A622691A600033FFE36E EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ 22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ C460AD97BC680BD9C535560934A841010A822A681F85A50CA27C31B5 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ 3037D5CE1604341DA47B20BF11B59CDBF79233CFE7318D974C00E0E0 DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ 9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ 43885645BBBBD5A695EDAF58079DEC1F3D6F23C32D327B38D38340F4 EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ BD0170B17230106BCEB4FF173AAD9E41BAE953BA025B4B4CD8AA81A9 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ 97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ A1E1F99A1F114320F36266220E3B7C5BF2A509CA890DA2EEB1177ED8 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ E8970C064C1421C07BB8F06B709E4500C7B5D9DB6524D9834C1CDB3B 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ 66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ C63F1FA3D6E1F95261F3105A5A2DE1531B4285CCF9F94A376C0BF2AE 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ 4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ 25535A1A8615863550DB80FEC1D9C1527DC26996F83CE5368E77E083 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ 1BA7DF7DCBB08D251322DF8040429943699C41BF27B1CAEAFCE3EC8A C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ 30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ DC889CFDE54D608BCBE8807CDE65BD7DD74CB4EAB62B64C27510F69B F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ 05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ 23F31697AC576E97FE5A65EEFEA633DFFE7270B370C6501CF30F708D E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ 62757F1F3AE853A0A588E5B12FF98B77BE7A33A6771A5D2460C11BD3 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ 00:\ 262C5045797C6E74C0C2771171862DB0BB64881925BC6972EB370AB8 FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ 37FC:\ B81D30AFBC576EBD8062413AC329E0D9F4F31AA3742C38D80B627689 ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ 2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ 599BA5:\ DBF958A2735DAD5F8274B1D8782E301B1D91F3429BC957ACD2C893B6 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ 479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ 40706B05:\ 0E95AA29820434A6A46B9D7B34F83D73DD75BBCA59FCB608EB416ADD ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ 29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ 31D06C77A4:\ 509F1A9C348B996004671933D9D6F2B02B8DBF4B16738D5796901063 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ A259FC4FBD72:\ 93CE54887AD50DC61E2F7EE8F474A87090292AF62F37D7A95C9DD708 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ DBE5FE9694AD6D:\ 3672E38180921DCFEED32113CF65C2216C2D617F4EA91D9F2C20950A 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ 7EF57B91397AA8A7:\ 8363106BB80BA7FB88EED05D42782F92F1EF1547A8E7F02C0EFA792E BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ 7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ 44B78B2D48DE1A08AA:\ 2C02729FA9D8E97BB37DDF73D073F329216BFD7B4705DD47FC8AB53E 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ B3A6C9FED24D70749604:\ 1C152480D970CC4B452C49F1DF9EBC6E0510CE60882956C2DB0DEA16 BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ 8B033F77D384CA01593C1B:\ 5F0D066AB3BB235D9054DE4D3ADE14CE57ADC4D3FA6FA0C0E61BADAB 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ 013C23F1E9611D595EBAC37C:\ 937A74032C1D8A74140D2E8A528D1DE16E98734B9D32367EBD95F759 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ 9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ 4EC5A49FFDB59A1BD6A292AA0E:\ 3BE59D99C8B12894C2394FF84AAC78377D158F62BF9C722462FC3298 D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ 498E1F6C82C6CAE6FC14845B3C8A:\ 123E369DF8D28D008F8B8C9B919F6FBAD260E00E788D4BE4F7979FB8 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ 88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ 5B01FECFC146BDB251B3BDAD556CD2:\ 8AAB941709671B533C4C436FFA4DDA06DCD067F7AE2B8B7B46001256 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ AE9CD5CF0991878A311B549A6D6AF230:\ E1D0554DD5206D68812FE15A55F567D6043EE6F0ECA6D85465816FCE E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ 105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ B50C7C681E773D109FF7491B5CC22296C5:\ 172C06DF6E5FBE26D9A0612E38EF6D7F6C91A2E819A25114159FF98D E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ 190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ 2C7CA303269ED14014B2F3CF8B894EAC8554:\ 02C877BB37D2C7773E32F4E89C62FF8DA920A70007782EDB73984053 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ 1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ 2627BD23534A9A41CECB2F4355BC6827325277BCC3F2746C8BA43147 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ 8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ 37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ 2C9AB3D8D819E7C5432B984A62846E19ED71C2FEED4B050508251210 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ 85EA51D49894E45BAA3DC707E224688C6408B68B11:\ 75AFB673856DF404A0504FD52FC9DD6E3249F257D0DC38D5E8A2D253 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ 8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ 04E18D475920CE828B94E72241F24DB72546B352A0E4:\ A01AA45810D1055282DC385A7E540337444F8168ED598DECC9218C81 B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ 2F9FEF4B937E6BEB5C7BB1ADF350DC0AF2736049FC4A7DBB653B97C2 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ 578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ 44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ 8AEFE7AFB36C05E360FFEE24E065B5490A3CA34098D21F8DBC268463 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ 4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ 4AE1D45A7B08465D33C494219CE9FFE225D56FCA002CD7CD1A696C7C B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ 36F763C8892E45F107569438030FE9A67E6DD7297746D817D85CBA56 CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ 5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ 27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ A6D391ABFEB54E66CF5EEA2E944C0CAE0CBE06FEBD27A31D1DC19372 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ 74810333181351F6AE6E4C643F0BF6490D1F18193E57F0C11E781316 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ 29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ 1940B9DF8D114F8A6D8F20B5767F1DBCDF421B9BAB5ED904E690CAE1 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ 650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ 3288B06A5A6E325FE541A1DFCF8C36D855BE30698D0EB152FC9662D5 E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ 7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ 8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ F365EF50C98FC089CC2C8110E2B68238BA29CA13263BAFC60BA75CC7 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ 1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ 040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ D835703EEE7C6379BFCA0FF5F1D3693FD7ADC6EF2CC6DB19720E479D 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ 0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ 0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ 49:\ 3079FE0A5C096BCFE50A9CE3EF152CFC4380E399FB1CBBB72C8AC37A 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ 0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ 2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ 5B52:\ 8B481609E6AE190E02920B4292825EA72EE2B6797B891C6979AC31CA 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ 89CCC1:\ 9E077CCCCD0F671EE3E2859577B626ABCC2E560D5B9502CD118564FE 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ 14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ 22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ 6DCBB4CE:\ FCEF079569F9A5FBCB9B7602E4B621D9DCAF0EA2FCD18806828BFC2B A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ 7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ 881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ BADF45685F:\ A7BDD051298A0476784986AB3E968B0EDF1954DE6D44696AB5F92B36 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ 312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ 96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ 9B62C60A4771:\ 09BC51FD1AF88F5AC845AE39CDC20154440F8382ED919412809787FA F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ 9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ CA58D5DAB38ADB:\ 3B2CBF2BEED62C035B3D136A601CCCA220A89081C5DC6135E14BBED0 E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ 21691E1069413848:\ 905B512336A509C86F19BE9A5C2D832374DDF642B494546D04DE975A 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ B57D6D0C2EDC4E78D6:\ 65B10B3379B9680CE849CAB1C3323AE020BCDEEFEC48CC40AB76E173 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ 8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ CD19E781AF20454AC880:\ AC95FDC67277206C70FA3D9F9FA274DBE5ED8BEB21C4330637405437 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ BF0FE3C32C17AA188A8683:\ CB94318727F7D2B504BD6FE08FF976E5C3EE7652E91692EBA55C46AC F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ 0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ 2E937F21C005F17411473041:\ 8E0261822B773DD87649D452B4AB2ACE8E9FCCDBEF50CCA7A18E09BF 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ 62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ 2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ 29F695815D866DA99DF3F79403:\ A6FD4E798425D165F93C587422A78E344F3591A79EE4B3D61C6BCC9B 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ 84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ 3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ 1BB15B447589E86E8D76B1E9CED2:\ B45C62148B5BE55C5A6CAC66BDE40A23926E4591CCB17FE3FF3C1E3E F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ 4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ 853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ AD3D7E886DEA4F005AE4AD05E5065F:\ 71E0E0F46D1DFCF3A4C7611C16AE2A505146C7302B98808BF3EABC09 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ 7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ 68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ EAABC35F5C2B0A0F2379231953322C4E:\ 024AA063C928CF0A61982DEA49CB1D8D8A338AFB25C0FAE0DA7B51DF BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ 4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ 2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ 159388D5C3277E227286F65FF5E5B5AEC1:\ 1D803972FAFB79D78906AA57CB692FC1374B3F707E5BE0937A70005B 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ 407847DD0DA505AB1641C02DEA4F0D834986:\ 005426EE362D3E6856A3DEBBD31FEAFEFDC707390CCD05ABB8D64C48 B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ 33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ 99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ 7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ 282B254274C4E48BC0FEDB609980F95DCFAFB8CAB169D953F757AAAF 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ 2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ 205AA1615DB44057DB991231D2CB42624574F545:\ E5A4DCDE82364226300B19F58AC4FCB8B6CEBE1E3BA3DC460AF0249E DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ 2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ 157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ 24D79533275BC13DB1D99CECC1558612DA7ED65B91EB045FBAC56151 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ 0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ 0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ 3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ A64A85C821E0D5A6AEFF534C0621ECC69A52D9CAD322693B9985B17F 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ 46176EBF044C4784467C700470D0C0B40C8A088C815816:\ 8904D08F2037217785B2153DD0427C24E34D69BFB31CBE0428110BF9 D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ 91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ 1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ E35DD40EDC75D0E800E03F53C042E57E4890112322BC3C7262A0E09C 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ 1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ 285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ 6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ CC199D06959CE1AE735060E9A83E48F981488E5C4D90CCE5D3C11FA4 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ 27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ 9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ 051BAB45E42B163C727A40127280F1A77A4BE63AD66E74F64197D1AD 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ EBD2BAEC5F87230C6BAFC891AC7480863835B0B7FA44888117920E4E 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ 8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ 4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ 47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ 0200F9CDC0113E44BC56CEFC2DE33FA1C922D4D2C6DB542D31FC23FD A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ 2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ 1AFE47E7903A8800A72BEEE759B6D8D7F6454CC31CE4847F70F0AC65 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ 5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ 4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ AF7DF737C397F0B2BF0D23279F0D134CBE0D518CE582F3053147EB4C A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ 07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ 6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ F03AE1D8D584A2C23BE366574802EE9922210E73B74207498C557DA3 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ 29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ 98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ 599977A2776A5F79CDC72AC42D00CDB0ECCBD2F90A475C46A53876DB 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ 3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ E2:\ BC7407854D7697C3228715B18499DC7BED6B6C4D6AB4BD6E6C3EDB9B 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ 1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ 3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ 52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ 61EC:\ B04D664E950C5BB962C892A754CCC7AD50DC4C830643B0F76802A402 E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ 9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ 2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ 609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ 9B5EDC:\ 929B29D079A8A2DB526DF89B04C6AED1B274005594AFF68A924C6F63 FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ 63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ 42D75D68:\ FD0F0B90C84940F2E14E5CBF16D516C1628380783CD2061BF597D7BA 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ 7815BF3C49:\ 3B5ECFD1B5EC042DAD0D8E65E86A5F21BA72799F0456B260C6AEB3E8 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ 61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ 025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ 951CB2068CC6:\ 66684694F3476F12208DCE43C2CCECAAFF8D2452C601B88037020D33 B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ 93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ B0FED6A8052FBB:\ 20851889E5D68DC2BC7C8862EC3C09816CC4F176441FEF8719336A8C B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ 35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ 780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ 015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ 37674C6F8E380C04:\ A6169A86418ED26216C7A69E1506880854179800DC03509A58B24575 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ F22DA873C601016A0D:\ 55BD56254E8C9194F13A68A5FB08C6A94AE7B23DCFF563D2DB22313E 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ 472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ 994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ 1373FB09A1A6E3C7158F:\ AE007CD6C37751ADAEBCA977081741AED832DFE8A27FD44BD9326FD4 FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ 084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ 339612E830E9E7A9C29065:\ 816990A773A7153A8D3DC3C4FBFA0AC011869D77825C088FF729FFC4 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ 5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ 8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ 377838973C1D943C22ED335E:\ 96951DA605DC0E6D5580146A8185BEE67247777C71C0C9AED2743B58 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ 725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ 798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ 8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ 2D0C9E7448DE3043AE22FDD229:\ FEE912946A41EB4A919B1874FF473424E5B7945001FC6721868F9DC6 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ 5B6C338CBB8F6659D342A24368CF:\ 64A39DBA2443003CAAC682AC715EE9AC63CA1C8971F635E39B1DAE4B EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ 76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ F6954BA0801A1294CD8D7E66DFAFEC:\ 472D17BBF29BD8979D56C0B3C5361FFC1750C6D8BC2DD31DE130268F 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ 055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ 256FB33D4260439CBA73A9479EE00C63:\ 04D92B3649747B69ED2716C98C0AA8847AAD3763C84249384AE449BF 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ 911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ 5994C1DBB3B5C7871A11F5537011044C53:\ 8FBB7FC5A5931D03E9780DA4D401B78740B2B41D2BAC1A6737AAC648 CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ 2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ 586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ 4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ 4E53426CAA453F8DE1CBB57932B0B741D4C6:\ A442750DFB06A9C15CE4BEDFFBA0C5FFD0919F2EA6B6F39DE1A2845B 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ 868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ 83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ B113771AB71AD0195F2780B75A45852703332474F42A9B5CFFC2040E EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ 2AA36D8DE97C460350B9037110431FEB7273513BB1BD3AD7EB843A1F 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ 656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ 46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ 8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ 91A28B940F7CD8EF11FBBD7AC17C51320CBAC869C6F98C2EF38DDA89 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ 7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ 4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ 99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ 7BFC08D9E33C0904F5DE5D075CBD098C3F1611DC0FB068F27700013D D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ 66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ 67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ CBDFDA39718CD2C13A3D1D7C7D6AEC9EE40CDA1165420AEB756EBFB6 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ 1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ 48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ 15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ 9D6FB81A85EC0E5015D6913761724F01DEA539A72E1D943DCC414E1F 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ 7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ 66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ 5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ 50E9B1E78BA993B8E22D34F2B4095D2017F9517DB8B00290F2505D03 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ 7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ 1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ 1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ 818B55B4DB9EBD9724AD3ADDE2F5956D58B173872944E61C033B2E4B 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ 9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ 0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ 45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ 9D9D4FF67AA3A0168504CF47FE8B75E27BAE44E6AD6F1203BB0C86D4 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ 1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ F0C22507F52A9EEB923C0D16F408FB291995495172A970556E63627D CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ 60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ 0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ 4E3014EDD99E0312791C5F493223AED72EA2E03E7F6C127F11B0BE76 F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ 10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ 568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ 46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ 3D5D15DB3A016752B2081C34C565889B4C2A2D2F28475DDD23FFF2C8 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ 8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ 4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ 01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ D0DBB060ECCF842740BB7D87BE353E220091540C21E8132338EE6236 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ 9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ 447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ A5FCAEB00A0376FB2E62D9DF53B47344DDDEE7A7817E9539F5FB6024 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ 74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ 5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ CF:\ 77EA65E0DA9F4AF1740DD2F707D5087C5889AC836D118662AE779572 FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ 5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ 71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ 1DC8:\ A60AE324B7407F015AE663E0ADCF6357ACD95CC870D9B2AE6DC210A5 E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ 54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ 009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ 2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ 99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ C25E88:\ 133061E876D3FD0983A24E86BC112897DEA66C432A709C04E9524165 F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ 65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ 3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ C5C06729:\ A75CC22D478664C1F47A35DCB85007549B614AF79077AAE116364A49 CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ 68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ 6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ 551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ CFE0AF93EB:\ 617AC34A250B3212FDDCFCBE33DFF316C607DF729FD8235FF8666344 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ 331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ 2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ 05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ F467BC75A9D1:\ 212BD8E7FD102DD1FECD99DA298A2532D58E5D1EA8B6C0E16448CDA5 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ 513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ C6F4756017FFF5:\ 0D1AD5DEF3F7C71B86B7CAB0008A767E52F1AED5CE18D2082F1CC912 C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ 798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ 9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ 45DBA58E6CB2C8EA:\ 61CAF8F25D0203A6BF9613113F6695B3333195F56FFDE003073D982B B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ 01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ 86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ 10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ E8419D48FDFBD744CE:\ 67BC257E7259880EC5FE45D57064F2818C3BA2C3E9F1964FA9FD385C A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ 7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ 6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ 1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ 4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ 359D5D1EEA105F28DCFB:\ 386AF3129215423C0F7E9DD3EE4C864EED97ACDC594916624B938AEA E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ 2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ 6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ 8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ 7ADFB974EE205A9BF7B848:\ 7E1F10E11B6872E84775E755E0D6E45CC31C5D51E324C84E4D730003 B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ 7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ EC77F29D211BE89DE18B15F6:\ F3833130635103FDD5D6DF6ED6833DA47C1807358FA2573AA5927CA1 DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ 4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ 49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ 9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ 50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ 63EFE793489C39B8FD29D104CE:\ 4DB3798AF14B1E892BDDFAD9A91CB88F65EEDE6F44D01B3E6E121EFF BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ 02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ 711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ AE5B257BE36A7124E1060C170FFA:\ 9BC5A86FE2F740CC35D3B784F600E3397623DE9428F932319E7FB18F 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ 5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ 70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ 001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ 480AB79D4E6415B520F1C484D675B1:\ F38EEEE36E2BCEE81C070DCBF29C665B34D8E62E090B76729263C6D0 A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ 84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ 920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ D42956588B3B58CD948970D298776060:\ AD1089AE26B4666348B9F590E21043F46F7FED60749250C0F08C2398 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ 3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ 678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ 2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ 8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ A96CBDE5FBC953D9E576CD216AFC90323A:\ 96FE01AAD3382B1FA6A46EE7ED6C71A96609D61C5679A62DC551BB4C F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ 593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ 0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ 358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ 67B5AD93D874812A1DE6A7B93CD53AD97232:\ 3DDC4ED0DBBB769908D0A1826F2C30FAD926BCB2A479C102903335B1 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ 85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ 352BDD3740DD6A16792AE2D86F11641BB717C2:\ 24DB76ADCE8E68D6F601038745346555AC9B18C0B738CE5A2806E30D 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ 71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ 865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ 2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ 9ABA31EDB903B28FBFC33B7703CD996215A11238:\ C96041912FE468344C0DB83BD877EACDBD26CE20C344FD5931794E06 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ 8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ 13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ 9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ 32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ CAFBC968A3CB44AF0B774E9AF243C0797DE084C2460E9FEDF17AFBA6 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ 3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ 7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ 455D4D0DCCBB5DCD050E8BCECA56531EE6FEFC0359FE9A9F1B238060 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ 2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ 41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ 1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ 6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ 9F9CD398D06D222D8539950201D40BB8DC52667F5CAA1F5C37439573 C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ 58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ 21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ 104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ B5F12F4FA2AB2B961604ECB0D3D109119E84123EA742ACF48FEF7445 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ 4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ 76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ 386B07094EB57E88C541B70F307A1BCB44D413976BE0E145E2C2D9A9 C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ 7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ 36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ 6D8D756C4A7065787140F50F8CB839E4BE2DF75321BEFBE2ABC59764 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ 8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ 7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ 57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ D2D2C3B49A220AFA7493FC0D61BEC9D94E094E574DE1B811EB3FFC0C 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ 384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ 4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ 55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ C18AE14E86EB08D395B43DB53AD154B369C89AC596BB584D7BEE0EE9 C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ 4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ 761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ E3A624A9B767C7334DE271EABC921242888CBFB17944C5F414AA7F05 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ 0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ 475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ 6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ 6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ 67295FA4ED1D315327EC1A2D0C8EA1D4DD612EBE7295883347EC83D4 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ 635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ 822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ 1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ 30269D654FAA84F1B03C0D75C4BF756D320A42C402665D3F356DAE7D 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ 1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ 698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ 47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ 8A26859575E355A571E05D2EC08B8307FBC15025150B7F4E8E3CFAB0 CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ 8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ 696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ 7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ 01:\ 0F3A9EE22B9742D82198966556DFC9C3246874094B816062D2204FD3 D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ 0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ 2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ 9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ 4D4B:\ 756462A2FDA3F8BDC73F29402EAD09581EBAB86DCBF36AC7A83C420A 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ 1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ 18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ 299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ 4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ A3BA86:\ 18C8EB44C99BE9B4240D3DE1EA85B52209A80F161BFB220DF3A56B69 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ 69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ 1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ 61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ 477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ FB9E4AB6:\ 24915386E0F96531A5EB7A39F8E0DFF5EF3F3EE7E51360E31012322C FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ 31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ 59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ 7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ 91355C6280:\ 5E0BF93B3DB33AAB7121FBEABA567440D22138E0C66DCE38724992AA 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ 62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ 225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ 1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ 366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ AF1AE717238D:\ 0D98E67CFB2F86653E32DB40BB047CAC62A4337E9677115C2123B02C 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ 85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ 16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ 528F9AB49C79F2:\ E21912B71C0E89CE1FC0D74EAA7021B454C05409CFEAAE586F72AEAA 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ 584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ 4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ 4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ 5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ EBDDC89186839B77:\ 6A1B85C7B5DFD6575D82EA730F7148E5F43BF5835FB8DAF78E29E462 FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ 6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ C66F252F6E64EDC96B:\ 813D793D41C7B84C684FA8109C185EA92036D1B9065A93711489BAE8 B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ 5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ 252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ 25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ 232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ 5363892A2495DF8C1EEF:\ F3D1FE163800A7D5EA20B558AAC1F9FF71FF38C3F54F76330EDD0A8C C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ 272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ 414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ 49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ 199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ 5C6D1BE4BC79F08A1A0A46:\ 733B61BA46CA74B57BD413FFA022264658869A43634144BAF2BDFB5C 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ 2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ 443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ 6EB6E4A80358ACC78647D043:\ 063CF3C2F5F2E784F26B84873D2FAE324CA3381634DBE22CB4AD839C EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ 01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ 90BF2C4062FD2AD58F906A2D0D:\ F8F63C56FD61F1E58347A52E68F7AC2DD6CD808496B9E4772917F45E E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ 3EE46FB67422F814A68C4BE3E8C9:\ F4FD363C47E1F3D133C4828141DBF83241140361D314065AFB605E4D D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ 4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ 38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ 806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ 4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ A17E776C0D02856032A6CD10AD2838:\ 5213B12119C28283DA474BFFEA26313AD2BD4CC4970E5F8FD7383586 F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ 39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ 42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ 4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ 2ED1C78631FD23B4C3EB27C3FAEC8685:\ 96CA7E9274D05EDBD080090E6A000318D74105DF81651A855DA33E07 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ 94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ 286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ 04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ 72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ CD90333A77BC4E1988A82ABF7C7CAF3291:\ 6601A76904EE9942F19EC6CB24E4F8B3EB5C552B0C1EC6E757010A62 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ 29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ 5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ 626C48322E9791D5FF72294049BDE91E73F8:\ 222077A8910BC25446740CBEBC40709018BCCE9CA135C3D2609407E2 AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ 1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ 42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ 774BE89C1114DD531C011E53A34DC248A2F0E6:\ C85CEDCC7CD03E37FF27E8E1352CEF2F3DE6576CC0C218810D9B2F2F 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ 246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ 47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ 94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ A7059ABE99182714983B9C9D44D7F5643596D4F3:\ 1DC5FE115F63A2C5DF894DF3DF1450B77EB14F1A3CB26D0DF23B0A58 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ 374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ 6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ 63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ 5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ 4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ 99380AD592C94B9F18172EBF1B18EE520A00002FC8E698CE87FA9212 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ 575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ 7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ 591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ 2A3DC44539C1F9DA2BEC57FECE1CC1CDA65AC20BF4CE05EF4E9A4B0B 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ 37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ 3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ 9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ 24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ B45ECB6370D92BA28B53D96A3114568B91F2F95F963CF31C2E5A03F5 D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ 33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ 0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ 52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ 87E7B1B3797C3445D313BDD3946B93415212EEB9371D2F039B865366 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ 7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ 5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ 806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ DEE769CE07F3BDA013035F381FF1880143F87FC38E691F37B7FE1443 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ 271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ 608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ 990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ 2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ C94C7D071DEF2C0AD891F3C6FC10430164D4F46A8B6F150F50D892FF C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ 56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ 8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ 50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ 1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ 9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ C829025130E4B5801C5C89A793A1F1C524EC2BE5A665950BC471F542 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ 5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ 4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ 261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ 31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ 6643B89BE6E03C1C52EDC396C8CD1EEE99947CEA5276FF83EF6086DB 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ 266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ 7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ 357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ 5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ 719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ 8711E010ACFE691FF86D575CE73B2A76B11CE7C473D6266018DA137C 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ 8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ 3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ 267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ 8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ 06AAE9EA3B0B15CAFE01B97900C17977E83F871399E9D39279D6AB35 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ 1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ 4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ 3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ 22978FA6F43C526CF120B1E4C2BE84641C75749707ED95AE32282472 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ 994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ 37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ 7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ 9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ 5670455BFB73E038F87501A0EAF2E7AA0BE985AF844BCE9ABB832ED0 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ 394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ 43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ 7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ E8:\ 78B195C6C6F04FD3A075A60DF25EC1BF9996B85A10746400C2377C01 EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ 85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ 4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ 97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ 345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ 6427:\ 859CF23CD89486FA7C32BAB68947FE9032A4C013EA19F2D6A13D6D08 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ 89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ 630012:\ F3CF4E503317B874CE95757F0C0644646E031DD15C36DE66EB7C6DC0 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ 95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ 4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ 78DFB921:\ 2CC662C14C81E895133DD53154DDAA130E4CE8BCEEDE76DA6DF01473 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ 4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ 91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ 9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ BB0D19F909:\ B9C5F0BC4EBD9E6CB78D2EA5C79EF4887329BCC51734AED4B09376F6 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ 6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ 57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ 00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ 77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ 81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ 04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ BE6BF8082E8A:\ 75E74FC5F0A5759B8A669CACF874EC7B9FD96B4660C345D1BE92F2A0 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ 06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ 6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ 4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ 58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ E839A9D4608F03:\ 6A447E4338072182F73660C1FF58EAA4546FDC4F6F567E0ABB4DC1C9 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ 10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ 2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ 2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ 8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ 8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ 5153592EA81C6FBF:\ 12DCCB19D7B65F960224882B6F6988FF65BE64F31B04F2949F42831C 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ 735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ 1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ 7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ 39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ 9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ 604F5035C46B8197D3:\ B2F1E13510E19996178F34A6A07982F73CD17953541A94FBE55E8C12 E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ 94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ 7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ 60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ 7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ 6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ 07E3B953ACF99964B847:\ E83EC4B9C2DE697EE9540B2FDA1EEBC13A440BBCFB90DA3A31AB6F01 D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ 32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ 7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ 8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ 07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ 4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ 6C90E8C4D100ACD9EED21E:\ F364226164C3285D2151637DA229141494EF514CE6815D53853C396F 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ 18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ 886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ 4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ E2DD603D9EA24DC7C5FD06BE:\ 348EAB358B094840264EF09959D8190FD9CDAE6B0F8753EA9597DCDD 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ 742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ 69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ 9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ 779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ A80012976F31FFDF305F0C9C5E:\ 71F976F90B45DFA3DA49413EC568E7059D8F096BA3043BC862D8C699 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ 9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ 53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ 479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ 3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ B461A40645BF176601F1E760DE5F:\ BC73C79014FF681C08CD531001C8B3DC43B5CB8FBE22EDA68914A901 D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ 5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ 8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ 1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ 86C226169FF257954EBDA81C0E5F99:\ F82B56ED43F90E67EA9176D18FF44532163564E3991B2F0AA1ABBC16 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ 431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ 40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ 0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ 2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ 83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ D3C356C914FA06B9A7CE24C7317A172D:\ BDD56AF9BAA66AD5D08E6F439F5BDC9F75B6D232BEE8AAE8A75A37B4 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ 645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ 39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ 68F50D79F0C9C7314E750F7D02FAA58BFA:\ 5447ACBE8DC8B440F263E5EC6B0558AB5E962EB4ED33CEC9058B9DAD 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ 4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ 717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ 4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ 9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ 39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ 7DF95B60FA8712A2271FCAF3911CE7B511B1:\ 0069EF1213B3DBBAC09595D50A5EDFDD9A694C27CF1C906FCE529306 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ 261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ 0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ 61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ 37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ C24FDB3F1694A20F838F211CBE06A63667E6F53808D418F9E67F5C45 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ 4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ 339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ 5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ 7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ B7F5CB9923AD97058EC067700CC746C127A61EE3:\ 9AED1E2396E7CBADEBE222988E89088EB8662D9ECB82484DCFAADCD5 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ 70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ 495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ 5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ 00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ 5B392FAD87C1B929FBEE57A391C0B1DC16B259A40404E69C92932882 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ 6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ 6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ 1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ 0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ 2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ 6A67D956D2B1745B20058EE5AF7689318E0F41E35331D5333C27F620 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ 2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ 5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ 9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ A2EC7CA7F7878AE0BB9A089F426C94103E1C7B7BA55CDFA82FC9979B 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ 8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ 90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ 6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ 0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ 6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ 99D7A1E42F73F44821E8503C34FEF36913C5E2F7BF3126806BF85D21 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ 70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ 5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ 2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ 4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ 27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ A57F7E1ECD17133A0E61964F19936F88BA80C43A5D8FD454CEF6D73B B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ 0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ 0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ 8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ 547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ 758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ 00FE33E7049FC993D9D57C36A09577808263BC45F8159FF22435D29C 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ 38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ 5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ 3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ 8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ 5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ 598555E1051F7883582409DFDCB596804A4316E36B4F619EB0504D43 A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ 3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ 80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ 49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ 9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ DFDE90F60032C8C0043B93ED22E434BA372C17C599BC8A0E0D9C4F36 A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ 0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ 639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ 877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ 1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ 00920AD9A60ECBC8C161831AD2BEA94FBC36BB355F0197B1DC04F42E 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ 9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ 10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ 8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ 88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ 0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ 2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ 04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ C089D04204AC8F290BDFF56F5E81245F435CD3377B8B58FC473B22A8 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ 623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ 15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ 817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ 5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ 43FF1A91FD6AA39FFD919289E5FFABD13F13816DD5403BBD094F4158 [Skein-512(256)] :\ 39CCC4554A8B31853B9DE7A1FE638A24CCE6B35A55F2431009E18780335D2621 CC:\ A018268ED814E0AD0F2D0304E8FE3F4118FCEFC07454D07123CC2C3E40E06A4F 41FB:\ F91902DDCC9688462E48F0BCDFCA031637F0D8DA577C1E2AA316B5C022450BF2 1F877C:\ AE5520F519D56CB15F15BE222B46548BF967397F353D40B109732F066F6396DC C1ECFDFC:\ 2638B1711F1346D08BF02B5D1A575CD924140A608512AF5B8E4475632599A896 21F134AC57:\ 391CF2CCF93B44FC60E965E77D1D83DEA8CE6F8DF64872721F6CBA5A7D5A8052 C6F50BB74E29:\ 783AE71C0BADC74771C4A30C1A02619ECB8AAE05A49A514A45985B1B78AEEE59 119713CC83EEEF:\ 234B29E28E19C7008E05FA529F1DF2A52219FA1C93D414937A7F53C3B10273E9 4A4F202484512526:\ DC278F71C1F634918A85129BFE0D7A9FA45156FA4EE970E89F4E85D5E3A9D24B 1F66AB4185ED9B6375:\ 9A3B62CC26E36C9A8629320242D18900A5BA08DDCC37D06A32A1CF7C6F6AD718 EED7422227613B6F53C9:\ 52A05352D70DC99E888AB366ED71F557FC3A44E408E0301C00970C9B9DF0768D EAEED5CDFFD89DECE455F1:\ 46077CA953690BD06F228ABCF2F2F8E5452964069C04310AD3DEEF995478EBF7 5BE43C90F22902E4FE8ED2D3:\ 0A52D798101EE6F154B260743237DF31E15671FA8AB6FBB048F8DF46ED4A1044 A746273228122F381C3B46E4F1:\ B054A5DDE925709DDF26C1FA45BDC2A9B6B82C71F2A80C7594082A9031FF666D 3C5871CD619C69A63B540EB5A625:\ 27C80578D5FA8B471E7F5013E9221068FBCE0C9DF15DA33F8339E1282163F211 FA22874BCC068879E8EF11A69F0722:\ BF961E0B1F629AE5BA8A5A0F5D120CE7DEB8186F39CE57142BEAF8D7BB92F496 52A608AB21CCDD8A4457A57EDE782176:\ AEB4E6D540B5887ADFCB5D005D6E453B35F8305A4C5CEDFA39B6AB63FAFB9CDD 82E192E4043DDCD12ECF52969D0F807EED:\ BB872A962A4C9916350B87C40AA475C1A050370891238EAD820B7C12565D5E3B 75683DCB556140C522543BB6E9098B21A21E:\ 941704A1F94EE92BC65C12D665799AE654E59630422F0D55F3011B2DB511D5FA 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ 368F23396932F2258289166067635CC1A7397BC4699D21C937156986179D4B22 E26193989D06568FE688E75540AEA06747D9F851:\ 6B9D5FAD64AC4A0C0412F1E8A568BEAB02F109529556A51D66A5716C0F695DC8 D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ 0F363ECC1B9F971E7AF89169A686237E3AAC4330300F387F3A589CADAA392AC4 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ F3B9E46D7CDBC0EC120761EE58876454FCC3EDA92920D6C319936CA6B36D8CDC A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ 00680831552EC4EF9706264FF51A9C3B27EC3ECEA96D5EFDDB386EDB2A5E42FB AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ A1AF52917A60B9D58CDF795616B3E29E4BCE1D88D0902D85F0102D95774A74A5 AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ CAD6AA978C8F95272C4F9C0529664DED99AF248554C14B9D64953F9EE7636097 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ AC5E951C83DD9228382A2419D0B1FB9137FDEEABC3C597A178D348E4180C0381 FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ 0B309226BE30C552B80324B5F57492597F1ADB39E0FA07048BF0558096EB5722 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ 7A8AEEA414409DD1A7305EBA6752A5F3EC1B4A51D31D775215F37D797B864F9C A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ CD697F37A1E6379A4A127224827A29C58B7D48FE5A8FB94281E32356DFDFC00B 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ 7A7DBDAE0560E7AAD205E8D1DA28C61EED8AFAE6A17B8452D64632E4491B2220 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ BC861EE3BAAA81D9B145BCC16346EBBB6245AE1613B69443455006F5B6730D41 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ 9EC82726E31BAD61A93C9A34EA6634E6E0A2023B04A47EB929A92B1F692A5AB7 DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ 46:\ 38A42107F2767F7144FCF9A753939CF3A44E5A54A01F5A5DEBED987CA7FA421C 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ B5A0:\ 78BDFA9C96AD96EDA8A3E2AFFF06F92F2F1BECFD4B9BA6E3A51D4A42A40ABF71 B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ FBAD4E:\ 94309484994A3CF04B882C8D53315C58FA2454D1CC753C8B703A073E6B5BF476 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ ED2C2492:\ DD0E9DCA8B0B9A754816FC0CD75EFE3119926C2946FBFA60E85328D1E54A0CE3 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ 6B2EE4E542:\ A45830D06036D67D5893BEF27404EF6E2FEDB7A310FB45E3C5B15B32A3AB96F9 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ 2A1493D8F4FB:\ 7EF5AC7C9D83383D2FFA30E340118D556DAD25D5EB3771FAC674B027E3B53D49 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ 30A934467DA4B0:\ F3EFDB3615A0B5A241DD7A59D27B075C7D880AC19B5CF973C6DE56815E5AA02D 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ C0308E29446B8ED3:\ D74F60A0E767A8068A16BE3EC6F0ED2F5534009C8FC3C4BC7466B987A4582EE6 C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ 723B20F67BA610C2B7:\ 90E61A8C10FD1830F3D9224EAC3231C284B57DDFF5E1FE4B05858C89E7F5CD03 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ 0C834CE6EADC2BB86BF6:\ 5D03C3C3A6CE9A4AF70270E6737BA7194FB0BE9333B6FF53CE470F15AE335117 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ 1540D29BA27AB8E309A4B7:\ 9AA90EE34964A1201FCE5B195C7C62FE118D6318FCF7ECD0D3BE7FEA480A1D7B 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ 32B58EBC38FC2A6B913596A8:\ A095B61415CAD26F554D9FA725290CB1C6E213D88C1A2E25A2030DBCA69FBD0F F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ 38467205F5DCFB34A2ACFE96C0:\ 4C2D4D0E6C05D8EAD7468053CAC8F7399823D13AE53DC23545A6F831676DAD91 CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ B06CF0F5A0EA15CA907EE1C27EBA:\ 91DABB844959046A64958991A4A7A18F5B24DF9F112F97E275BBB8C09C495A75 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ BCF84D0D4726364B9BF95AB251D9BB:\ 978FB5D4157BCE824B8F88237D6FA7C0DC526882BF13476A34EF1756F396A28D D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ C7F157298EABC4DCE7D89CE5162499F9:\ 6782789AF2F889D97D9BDC0EB98713CC94C2F6CDEC176D8AB8A067CBAB10CE9D BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ BEF788CDB5CF4606C9C1C7F61AED59F97D:\ A1A9A97CD2D77E51588E5C659D209AC0D1469C6E41006938695C5E8DBD450B33 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ 86E779CF053C77785AA9E692F821F14A7F51:\ 7279BE30B4F1CA70D243818B223EA198B51B9E04D1231483C40D6325AE5C03ED 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ 43304FBA401EFB2BDBD7ECE939102298651C86:\ 40A6112CA57D40BBCE88FC0BA62137FC3543037BDDACAE3FECCF5E1E1EB99BBE C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ 87D68D28CC3897452F6A22AA8573CCEBF245972A:\ 53A057E7182DCF231E9113392C24832368632D55FA38560D2A8B7AC4A3BF1BAA EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ 22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ 0CB6DC402B26B013A5EC764D9C8E3D70A389B126C18A31AF02F0B5E7EA1B9F1B 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ 48DE1D6037C0882AFD1C0EA6A2E4D154B68F20741E4BCE7639BD1C21A58BF0C1 DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ 9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ 640EC963CBCA339B5F01C0649EF6D01A1AF4C9F7E84622CAD95FD3B3D44FC98D EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ BF067598C5ECD7377A9C787B352079144C7B0CCD2523087292F066C44FBAAEA6 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ 97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ 1888363FA0F4176B75CA5A978A8937D87B6CF330D1632FEE17BEAD16EF1EB74C 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ B0D012A15DDC5796EA900C2C1B5AEB2307B6CFC80CFF88A76BFF2FADB81560F6 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ 66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ EB73C16F090ACB059F8E31C92F6239C61E721E8C47D6CD64B55501B757F17671 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ 4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ D90789EFA7CC0FCE8E0BA9BE68F9DE25228D9B3B4E12C3293BDD98C43DEDFF45 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ 095FE20CAC9643225C06B5D10364247D97C909D66E05DDF3C111062AF4D08D6C C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ 30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ 6C6B2655E9A5F60B2FD15679EA3A22E82D677870C47001C42F5390ADA1E39AB7 F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ 05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ 8C7AB8B3E4410566E586B851BC660CBD0814A9ADF847D51FC03E74E413F33147 E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ 08375C3267E2196834E65D2ABF25EA2A33E74ABCCA281E4A4D816BD7C8B5ADBD 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ 00:\ 3CCDCBB0C34CE4241173CB0E85FFA50955A8D597381AAC3E11F362CB23EAEF7B FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ 37FC:\ 2EE4684B5DB641809A9B74E1D44C5A8C71C7A57B8974EE9C197222B1D23F1380 ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ 2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ 599BA5:\ A21894F2710469B386A7AA124EAD2AD09AAE7EB6F3B5CF347491CD9CF41EE73F 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ 479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ 40706B05:\ 19CDC0972B16F5A084B23C8437FA11392DF5A1D07AC5C3A47B7326459BE5B673 ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ 29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ 31D06C77A4:\ E11D1332806BD947D675DC8E67B54B6D3916B7261031151FDB49522813686E00 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ A259FC4FBD72:\ 5D7B5CD43D331B77E9D19AF0C76366E1587DD7B6C1FD25324AF6AAB01F6CCB4C 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ DBE5FE9694AD6D:\ 5CAC4B0D209C0584F7B015E97CAB3DC8E4806B892477E16F0C10150B72EA4BA5 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ 7EF57B91397AA8A7:\ 54BF78BB3DE4DB0AD5B7072713EBC2CBA4B0905F2DB751E290BA4B0268224A3E BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ 7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ 44B78B2D48DE1A08AA:\ 0A3D37F3E3229230B572DA75CC602A84494CE54E3F71B6B4502119D97EF5CF38 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ B3A6C9FED24D70749604:\ A10FDEC0AF7A84254B0CCEC804FC6459A967D2BE4F9213209F2756A2ACC8D9FF BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ 8B033F77D384CA01593C1B:\ C73C5491C50C2D82428408997197F185188DE6B37CB7FF390E71CB3BAF675DF2 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ 013C23F1E9611D595EBAC37C:\ B2D5CAE8EA14910786BAF1C9F191F984DFF3139B44C82970100B818C63437BE6 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ 9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ 4EC5A49FFDB59A1BD6A292AA0E:\ 22096E7B0BF4D02D6D7917372DE40061C98912BA4780CE8EA2809127EF8B16C5 D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ 498E1F6C82C6CAE6FC14845B3C8A:\ 1EE4600134EB024596BDE2CBEFA4FC7A28C4C5ED755C8AC56FE610F2ABB189C0 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ 88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ 5B01FECFC146BDB251B3BDAD556CD2:\ 462A31BE893A3683AD570B07F508FB094DBC0CD9473208385F62EB673EC22CBA 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ AE9CD5CF0991878A311B549A6D6AF230:\ 792E3A09971FA8FD06977085DE010586B925E20726B845D500F8A885F26C318C E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ 105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ B50C7C681E773D109FF7491B5CC22296C5:\ BE1D265301623309F6F86FC9AF57D1CE79508ADA3D399D2A329B313388CE75B7 E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ 190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ 2C7CA303269ED14014B2F3CF8B894EAC8554:\ 9217FF1985FC7B5D3C3659D88E121278B182A724ADBC33DAAB22AC1A3D23DC3B 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ 1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ 735DEEE414C6BABA288B90AF36D3D2DBC8F6939BA4F5ABDF07CF58659F68E78C 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ 8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ 37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ C9634F96094D298D3451BD375760D6EAA55B0DCC3ABA31F60F5B857F9DD6C6EE 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ 85EA51D49894E45BAA3DC707E224688C6408B68B11:\ E517F08DB939F856EB454201B35AB1AB440A4AA5BB1909106948A3527BFB28B5 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ 8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ 04E18D475920CE828B94E72241F24DB72546B352A0E4:\ BA7C163C9772F526B8383088F6044909AD135AAB6D768A10F52D6492160EB503 B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ F2CFA80FC4F00E0CB60BEB539BDE774F7859A7D8B5A5D4DE5443DF25A6D5300F 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ 578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ 44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ 2A56DBDC7ADFFA534BD5D85075C23E237BD72436FC704682FDEBBC5A66B8E3A0 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ 4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ BC42076ADE8F4064F392665BC6B38DF1F318EB1F187F69739D8F1B12EA7D852A B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ 5E0E986BCB24A4EA1ACD804BFF693FA0D4FFADF04EABC2306DD290FB3E6B8311 CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ 5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ 27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ EC126D1F638BCA0E5B6F564F3557C40055D1D7B7D1A20F4A99E048C91BBC9081 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ B85C3E3BC8A4C5357A9E8F865C26E2CF06419F06D6CACEF987A2D062141E91BC 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ 29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ 7360743B6EF8D22E3AA211DB4475F9BD5A35C7CED9E5A9467020E50842A79A24 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ 650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ 89E18B58920943DE7867A603C1B73075743C4306CCD1D78913D7A3B740D3C825 E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ 7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ 8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ 1FA9AB02096CDE60D0BC70D57BDF91434CA0F05917381AD7DF87B215586CE909 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ 1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ 040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ FEF2A642C782251B43096681C3E08E8E8CBF4E5D1D593C76E6908AC1A8F8D387 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ 0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ 0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ 49:\ FC607D26583E38ECEB4429C2FEF1901050A154A035535E85FDFD368ACD4B67FF 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ 0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ 2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ 5B52:\ 3D1D387BED0F63DC7644E0642F717AD8D230560FDD59D40BCBEF43D25458FD28 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ 89CCC1:\ 00D88BF06EB22471678C9C4849DAEF658C19BA46F818FCBB696C2C1977DDD1E5 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ 14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ 22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ 6DCBB4CE:\ 617440B5A98E810A8316F5D038E6D39B73A4561D963AC21641EA1671B593568A A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ 7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ 881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ BADF45685F:\ 0E52ECFC7E59B70B21AC4F6E02AA5A277DC315F111092DF7D9451FD84DF1CCF3 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ 312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ 96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ 9B62C60A4771:\ FD95F439AB9837C8296F635BD54F146D4F6C3EE8021F991938B99635BA55C05D F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ 9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ CA58D5DAB38ADB:\ D8A7E38369BE51555C48D30178A90C961C429825C0335EE77D91611C7DD7F99A E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ 21691E1069413848:\ 0931E5ADE3D0C28F3EC2BC467DE1AB7A2604A06260E8AE4C54C96DC8B315E369 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ B57D6D0C2EDC4E78D6:\ 4DE61FD93F93B804A55B72760ECAE851589C56F4EF73ACBDE9694DF338C5B41A 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ 8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ CD19E781AF20454AC880:\ 9142F5AAE02DC1E3912AF868E023DE29292BAB840103DDA21C4303CD2D953298 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ BF0FE3C32C17AA188A8683:\ 2C5C98FFFE3E2C815D290E00F1CDDD15B27807A3EF9878A226FFF53F203797A1 F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ 0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ 2E937F21C005F17411473041:\ FD453F0448152F1FC7D4995419874AF356DEB6111D827C3316A2286B53149CF1 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ 62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ 2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ 29F695815D866DA99DF3F79403:\ C0030EC3D454644ED92CBF2AACF9768D1EA21B59C22DBE98C8F2BA696D1CE9A0 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ 84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ 3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ 1BB15B447589E86E8D76B1E9CED2:\ ECD9886C5257852B01E916CD257FAE9CA07C8A0F27448DCC63E959827DA750A7 F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ 4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ 853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ AD3D7E886DEA4F005AE4AD05E5065F:\ 3533601FEFBA47577E021C44F49AAF61D4A6A6F79CFC8F4A9805ADECBE1495E9 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ 7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ 68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ EAABC35F5C2B0A0F2379231953322C4E:\ DEDBD8E69D095F7BABA95CFD1313359F645C822969B69413E22655B2CDF9656C BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ 4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ 2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ 159388D5C3277E227286F65FF5E5B5AEC1:\ F5F30CB5D4ADEB62718C3FDF7FCA1AA50E6ECDD334E1DDF2134DFF178D60CA67 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ 407847DD0DA505AB1641C02DEA4F0D834986:\ 9AB8FBFC3C53430A30DAB8EC0AA96A4B85F538BCBBE4AAF410F0EF12BC979AD9 B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ 33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ 99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ 7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ 4B38BF69C2D08D92A2A92905852B8EE90B4C684BE7EC550E1559F57202633661 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ 2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ 205AA1615DB44057DB991231D2CB42624574F545:\ 33EBF28D8881B61523689193F6A471A783C0F5D76DF73E47C035A24004F1185F DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ 2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ 157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ 5171E62CBE96290D66161D561E95BF79295768B65E0F87EE0A8571418C74B96D 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ 0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ 0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ 3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ B2CA862FC344030728EC4DF7CA5462587AF39ACC4AB97F7437960E7FA3F0208B 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ 46176EBF044C4784467C700470D0C0B40C8A088C815816:\ D0CA3B616E3F1C29E4A6F18913EBEDAEAAAE18401DE3C7C26DDEC12746CA2765 D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ 91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ 1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ CFAF20BA211E0E57BC2B5C4E9F1FB413E20000E28A2594DF0F524FA385BD063E 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ 1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ 285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ 6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ E360D12CE51F0A0408DCD07311D795A66DFEE13B5F545D1A87FA01888910BB2E 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ 27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ 9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ D91BDDF47646FDB8704BF341ECFB3F7A38865B74AB66C0FC61739EA27F3B40A2 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ CAF2CC15CDF0DDA5B1400321D61A02B30303606D69A40F3A9BB4B852A632AB0D 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ 8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ 4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ 47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ B93C7B2B07866E6FBE146C88CB92DBCE7B4F33F3D90C1B69D2EB39B17AA122B8 A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ 2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ F5259B275F25DA827232684CAB4B615609FE0D161916293FA173A71CDE464B37 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ 5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ 4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ 3D148ED7CDB57EDFC12FFE9D5D6373DE7F94927C7C1C5F5A5A883D3D6806A8B5 A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ 07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ 6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ 056067952A0C8980EA0D580E45516C2CB0D2ED3AC0666474843F4A3C8C1CD7DB 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ 29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ 98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ 646F10BA11E7B11292E7F60551316C36625382F200959F3569DE356F64DDEA55 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ 3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ E2:\ 86244EA88B4719B0D9BB3A5331E7377ADD4B344787E1E1AEDB5255FDC91A3BDD 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ 1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ 3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ 52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ 61EC:\ 050E9EFCC769A37A0D2E2025D188420F64DA7462FF23C84097BF0459B5BC72E0 E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ 9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ 2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ 609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ 9B5EDC:\ EA579B71967AFE941AF6F387EC21333A6D54D0DCCF8B8030A62D4DCE323E6CDE FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ 63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ 42D75D68:\ 4B4E15C2FFBCDF3D85EBB40DF82B33DBEF5FE7DB148F0D1DF56B2649127455E1 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ 7815BF3C49:\ C24FA9ECB586C843DE5D2ECC64704580777EC32B92167A383BDCF664F7B9F39A 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ 61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ 025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ 951CB2068CC6:\ F639AF0E45033DC8F3643646ADDA30FD522B1E375CF34BD4F04E46049DEE8246 B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ 93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ B0FED6A8052FBB:\ 6D76B610320C5C7732CDC5C23781D7F931DCA1DC4DE0B438B2A07442BD1FA90C B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ 35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ 780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ 015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ 37674C6F8E380C04:\ D7B30952F814D5BF6D4203443D21BD353E866CD615F93B555220D1FB0A7C0DF7 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ F22DA873C601016A0D:\ 3DB2149AF362D83E1AF96E2FD2B7A08C367D9F59BA4B65F0FD09945B39083FCB 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ 472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ 994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ 1373FB09A1A6E3C7158F:\ B912AA656A2E33D9710CF86EC449461078C7ABDE85D8E31CCD39F4ACC8D67F91 FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ 084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ 339612E830E9E7A9C29065:\ 811EF2AAC250B75A2231CC9BE17339AFA3778FD44336E4B4D1CDA73FD9C1B4AA 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ 5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ 8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ 377838973C1D943C22ED335E:\ CBAB02B97B7636B86C23CC21FCA742453E75AC7B29B95072BF03DF27BD7CD13B 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ 725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ 798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ 8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ 2D0C9E7448DE3043AE22FDD229:\ 83F63733C1092B4BCA9BAE01AFDB80A0DC5FC1D60287B3BED5A2BECCF94DCE07 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ 5B6C338CBB8F6659D342A24368CF:\ D785429352E1672E59AFD2CAA4445E2129F80C1A31EB98661528DC4D15D827B7 EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ 76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ F6954BA0801A1294CD8D7E66DFAFEC:\ 5444FA5B925075ED148D11844224362FA1081A15F2BD44859A717B411DFD0F83 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ 055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ 256FB33D4260439CBA73A9479EE00C63:\ 2B6BB3691B9617D1691EE51528BA35DFE0F6CA83CA8DF670EEB9AB41BDB03A5F 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ 911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ 5994C1DBB3B5C7871A11F5537011044C53:\ 793DF7427FA71156E9E7F0376C5FF0065877C8E937154010B9739360A33C26C3 CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ 2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ 586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ 4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ 4E53426CAA453F8DE1CBB57932B0B741D4C6:\ 566A86949F03886D205E51FA7E7D892C24BDBE4D9D10E956DEE0EF61C88EA4C0 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ 868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ 83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ 48872584A1F006928081F777B8AC410E564A16E2D9302BB395DD49B91682D8A6 EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ C1D4648E6E385343201C67A184C7A6F598905A37A131BAE2F942F33F6E5DD816 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ 656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ 46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ 8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ C46C4D7AE2DB1CCF0541100432C6A914F517E13311880DC00C9942AE28327ECD 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ 7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ 4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ 99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ 95B9F8B71DA1DEB5FB6ECE239A78D4AE05C16D1A6BD0A3A50ECA8913E49E67E6 D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ 66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ 67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ 06C41AE52120920D08807C1B192074578683D619855E2086DB03A4F451C235DC 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ 1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ 48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ 15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ 1484139C615266CD88D53299CEB4423CACB8ED0F61A168D5CCEAB5EC42D157E2 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ 7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ 66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ 5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ D10FAA55A303F8BB1C7BB04A88401230F87B06D41922F1783DCAEAA72704C06D 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ 7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ 1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ 1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ 85C0A4EB3930C65A860DECD952073587281A8F300D25B56847193C966D11A651 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ 9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ 0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ 45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ 11372EDEBEF36CCE2AB05D2D1FC69619B8122BBAD2A0C3DCCEFAF025F3D2358B 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ 1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ 8393E6903E3F13269E12A36BCABF0B2AC562C88DB8D6E712B02051784D6231D5 CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ 60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ 0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ 9852F04E0B0DE5BA2730B13F309918D0A9659D55C4F1AD6D41E021EA27400231 F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ 10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ 568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ 46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ 441F12172D7BA309F914F6F0C028A03F5BB65B6311A575DCC4F58743C7F96806 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ 8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ 4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ 01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ 2CB9727430FE2AC583B1FC544D6D1D40435483C68E842A4C8B3E848472A121F8 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ 9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ 447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ 775D4282398533FDCEB51F582DF79F0D58F266BBFE7054D63588210F03DDE1BB 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ 74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ 5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ CF:\ 8B7A28798F57467E11F67618461E2D68FA46936E1140E3E04E7BCA5F5770871B FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ 5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ 71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ 1DC8:\ 3DEFD55D53403A607EF9DDB4FA46AC538369A384FF5B1BBEA52A4E58F90573BA E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ 54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ 009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ 2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ 99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ C25E88:\ 45F62D59A636A8534EE1BE1C59E2886AA7CA91CF46918CA2EA58BDB1B261639D F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ 65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ 3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ C5C06729:\ 8AEB26E5C317F7213F4EBD663CD03470579EB1C9123CD54FBE51366B67F67ECD CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ 68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ 6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ 551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ CFE0AF93EB:\ A7732E2C8A537FA70093190BCF79D4B6027F9F1117D806A759BBD7C8E86463DD 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ 331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ 2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ 05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ F467BC75A9D1:\ 405027D542CA47AAB86E8EC3559949073038C63F1D387950AFF366324F7BEA26 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ 513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ C6F4756017FFF5:\ 21DA77B4FEEB0E383D1593CDFE0C4A85D2DA53EB1CE0B6E459D23337DE40A567 C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ 798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ 9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ 45DBA58E6CB2C8EA:\ 7A4D72FD944EF3F85DB6249B7CDE3F57234BBE83594090075FFA251BC9496EA0 B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ 01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ 86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ 10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ E8419D48FDFBD744CE:\ 7F972B1F0E3EB173CB63CB7C6A8907DF8DE1120FB5AF85528F0B13CBCD93709B A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ 7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ 6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ 1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ 4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ 359D5D1EEA105F28DCFB:\ D2FE6C5C26C24F492C8E29B2E2F2138A1488AA25AD62E28D5F602E8E324DBBAB E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ 2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ 6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ 8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ 7ADFB974EE205A9BF7B848:\ 8CD3CCD8A2080C0CE4EAC9211D3B013FDEC990FDA15975133D01E917CDECB43D B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ 7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ EC77F29D211BE89DE18B15F6:\ 072DCBC9EC0CB4C069005401C1EF6F08AACDB4987F34D3FDC0A10B2C63440036 DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ 4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ 49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ 9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ 50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ 63EFE793489C39B8FD29D104CE:\ 9C5C246D8DCEA6DC951C75695494979DF6EA10C4C02DD850D566E090CDEA7F7A BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ 02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ 711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ AE5B257BE36A7124E1060C170FFA:\ 7CF815EE452712716457935062D65B4A02EC61E035D310F2DB73B2646847CD06 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ 5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ 70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ 001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ 480AB79D4E6415B520F1C484D675B1:\ C4D9850774AE7356E1611F3053AF679461585643550EEA4D17DFABF56080926E A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ 84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ 920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ D42956588B3B58CD948970D298776060:\ CB5F77251039B98B8C824C4A4B9D0488E91CEFB9C0034A8DADA90892CF44130C 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ 3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ 678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ 2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ 8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ A96CBDE5FBC953D9E576CD216AFC90323A:\ A81B4D1186780D240DFA3EE37E1B0D7D88D25C55F6F301A79DF30988247BBC70 F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ 593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ 0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ 358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ 67B5AD93D874812A1DE6A7B93CD53AD97232:\ F0425B89B75EAB5D927E4A03034FBBFF2F80E59D704655EFD75153D1CAEC7316 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ 85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ 352BDD3740DD6A16792AE2D86F11641BB717C2:\ 2F5C290FDCB38D252A6C5AA2B0F2519FB47AA97F9B5151DBED387B3E60D639C0 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ 71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ 865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ 2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ 9ABA31EDB903B28FBFC33B7703CD996215A11238:\ 9C4B1992D5EC2DDC9504D85D97D9A845972E2501B09E13EE4C1E2ECC84B581E7 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ 8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ 13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ 9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ 32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ F69FD7169508A69D59F81431A40B355CB932E06A850F19B334E758B4851BDDE5 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ 3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ 7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ 392A2AD8A05DA5927E742523113EF9BEE70672F85247F5C05A6FDBB507434964 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ 2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ 41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ 1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ 6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ 7120ECAFC3DDC28D152D796B9630AB7A7B7742E9F639F831A42595AF6A8EC8E4 C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ 58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ 21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ 104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ DA9737030E97B534C1EF0204519BD64ABC568BCDA2C04F426EDB8F4966E9AC7F 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ 4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ 76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ D6EB621F0B57F913E2A782E63A67808E788E1C4673ACC7467DD6A9218B747119 C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ 7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ 36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ 164AAFF496C06CC2B089726C5F3702EFF2ED35C5159A9B74306C5CF3639EBE90 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ 8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ 7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ 57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ 99039CFBCC6B979118FD416AB3CA7F2540EB62F61E8895685C32BECDFD661F8D 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ 384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ 4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ 55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ 146FDD252459AFF5E14A963AE6E7FD1C9C509911A4A100B2CF62BFFD4E2A8D4F C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ 4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ 761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ 8FD3DAADCCDA89D6FE84BB94B4BA194A969BADCEEC9E510EAB6D77FEA83F5930 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ 0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ 475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ 6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ 6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ C900C0A33321CE80ED34A3D3A88AF670A13019B06F2066DBFA14104A79AD578B 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ 635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ 822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ 1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ 815BA6349B6C7704802C59C9D54FB796C64CDE7E4FC87F870447E4E98EEBA3B3 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ 1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ 698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ 47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ 4F726B5A60D083798AF6D1407D1C17368F553502424162D0549C93C5B370749D CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ 8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ 696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ 7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ 01:\ 8970E3E29F24F3CB0EC4200101613BE64C14EA7C117DF6704E392B62D7F9927F D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ 0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ 2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ 9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ 4D4B:\ F6CBE810CCC93A606683E556FBA4B78AAB5BC74CBA137F0D4E31F5705ECE4AA5 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ 1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ 18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ 299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ 4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ A3BA86:\ 4BC436A09B83523B49B9721F1C9BBC96D2C4B2A9EAFC461DF343E819401F10FE 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ 69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ 1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ 61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ 477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ FB9E4AB6:\ 967CFF9DEB5B79D5A79E7255B50BD14B7A060CEF866E22768765D3D192367F44 FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ 31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ 59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ 7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ 91355C6280:\ F76063CC288B4A2945D50FD90AC056149BED0F4E68EC1A2907CE290FD7DB7242 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ 62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ 225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ 1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ 366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ AF1AE717238D:\ C09252DCDCEE60B6D40D7CFB313CDD1B56E0C95D5900F213D0CF33BF27F0073F 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ 85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ 16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ 528F9AB49C79F2:\ D8E3DF304D967FCA273D4D9DAA82EF70C1C3E01CB391094A2C35797ACAB3865D 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ 584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ 4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ 4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ 5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ EBDDC89186839B77:\ B702FE508BF21919E30EDDA6879F47DCD9A07F860A779DB54B7F93B86074E13E FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ 6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ C66F252F6E64EDC96B:\ 338596124CF38B825E1EC2F1882B414F1A2E5F88706361D5C7B22C38E385BE97 B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ 5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ 252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ 25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ 232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ 5363892A2495DF8C1EEF:\ CC632B6299B71EAF8106B35771ECA7BF2DDC3FA5B54FC278D402AEEA12E5DEE8 C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ 272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ 414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ 49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ 199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ 5C6D1BE4BC79F08A1A0A46:\ 2E3A0AD6FD16B9DC2E43C209464B340444712B1DDEBC1D366D198723B06F5A87 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ 2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ 443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ 6EB6E4A80358ACC78647D043:\ 587B6CDE5AF1C260A1F225337B6BD487B2140028B1D1266A58C4D9B1DCD0F59F EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ 01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ 90BF2C4062FD2AD58F906A2D0D:\ 11C167C3B9114ECD0EFED8DEF748324D873165175C5467CA286A954C86057381 E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ 3EE46FB67422F814A68C4BE3E8C9:\ 35175ED1977AB325C9E2EE0FCD6519EF0A9BD1C6DB9E1A9D62BB3CB684EC28F4 D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ 4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ 38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ 806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ 4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ A17E776C0D02856032A6CD10AD2838:\ 78A2B33CA04DE4C0A372B8C49522F3BB92B8242D38DE344F827F0BA922A398D6 F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ 39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ 42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ 4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ 2ED1C78631FD23B4C3EB27C3FAEC8685:\ 19B67B2C65CDDA7F8CE2F1D8E811E19A98FE81232C36779A48791CD74374AF7A 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ 94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ 286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ 04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ 72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ CD90333A77BC4E1988A82ABF7C7CAF3291:\ B53F312518C9388436E34D48DD454F2C29AFB3B12093B487C71E60B93712AAF6 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ 29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ 5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ 626C48322E9791D5FF72294049BDE91E73F8:\ C8B9BE64E82F970997915C3AAA37E51C1A579EAC6CD4468850FA73F23BF4B5F1 AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ 1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ 42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ 774BE89C1114DD531C011E53A34DC248A2F0E6:\ 3D8C612433F48DB7FB54B15976C9A236881C063856D49196CB1F511B89A05510 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ 246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ 47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ 94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ A7059ABE99182714983B9C9D44D7F5643596D4F3:\ ED206C5BDA53BCC418757E00856836439AC9E08A6E508686AFB5A46E6654170F 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ 374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ 6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ 63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ 5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ 4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ E96E6AAACD7861831357DD9C329F4056C2A1686622FD3F86193156E14D6B2E94 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ 575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ 7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ 591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ 9A601FDD743DD62BF8D34381BBADEE8F17D5E1B4B7CC0CABE53479A0AA1567A1 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ 37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ 3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ 9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ 24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ 46B054CAB7793E1A16CCA37CA85712838081FA3A334642C0E441842F7071C534 D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ 33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ 0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ 52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ 16188C138D46FCEE0B58456CF6EEE9214D405B280A14DD293403FDD1BF4F90E8 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ 7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ 5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ 806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ 20EA35A4B0101DAE67CC931DC3E5FE49BDF57D9C7363447AA91582356B0F24F2 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ 271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ 608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ 990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ 2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ 1F1BF037BBAACC00647465511091824888D04D56FF40B53AAE3E78280FB7497E C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ 56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ 8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ 50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ 1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ 9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ 2D9AD26CEF0B7DEC8436F19672CD1487FF65E6C5763778E90D4164EA2F0D74A1 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ 5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ 4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ 261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ 31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ FCD651FB9D79865F0BE6C8144FAD6750B534B4924A547102BDE67761B44A2C1E 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ 266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ 7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ 357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ 5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ 719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ 73C2F21B32CD6192A9547BF74A6BB7622E6FA6B044F92122758DDF485B21DDB4 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ 8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ 3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ 267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ 8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ 082E5D0692CF3D274897917ABC66A0E0688A5D4C87DA370009A4D3F91022B0A8 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ 1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ 4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ 3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ C88DD85BC74DFA17EB4A683018335CC71E73363CFE24E45690D25D98E969EB74 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ 994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ 37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ 7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ 9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ 2AA62C1184D50EDEFB26B3AA922749356FB0741D6E3D9BCBF555521ACB106DEE 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ 394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ 43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ 7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ E8:\ 0A27CAA8388E204CD880A7FACD901EE93D98E019CD246111D634EA25AFAD33F5 EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ 85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ 4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ 97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ 345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ 6427:\ FB6F77140837DF9E820106140FB80C6AA06688085BB05CC118B7131E5F4BCB20 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ 89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ 630012:\ FE039B7451F493B06607AF7F50116A7C9D5322BF18A942077CEFFFB6AA781073 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ 95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ 4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ 78DFB921:\ 685AD3988956726FB7F0669C8140D8119E5C3FA386C976172248554319DDE6D0 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ 4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ 91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ 9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ BB0D19F909:\ 6FD7CD6C507AB2978CFC6CB16FB5278517D5BC9E944CC12B53C2B1407C27DB76 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ 6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ 57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ 00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ 77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ 81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ 04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ BE6BF8082E8A:\ 48DECA46A39F2D84A8740169512CC3D99F6C229752D7C4741F14349E3D9F5970 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ 06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ 6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ 4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ 58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ E839A9D4608F03:\ 1E6E99CD27A58B5A84F68B573C2595106DA4301478C9F54FD95D1A4926FB1224 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ 10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ 2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ 2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ 8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ 8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ 5153592EA81C6FBF:\ 2D19BF4397B20FD9693D4167C334AA1F44898FB5456DD94F9CB3B21C8DEA28BE 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ 735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ 1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ 7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ 39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ 9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ 604F5035C46B8197D3:\ 1C089D1F7B04E3F871828E02560D59402356FE52E3332139BDAE63D7B82430DB E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ 94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ 7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ 60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ 7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ 6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ 07E3B953ACF99964B847:\ E9AA79C0065A30290B7DB60CF78252B4C9A65000DA256BC4BF46C9E6EC2D36DA D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ 32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ 7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ 8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ 07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ 4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ 6C90E8C4D100ACD9EED21E:\ E0D9BB2C3FA082F0931C3091FFF450A3B43EF40A1AB23B7CED5D3DBB35C8D090 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ 18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ 886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ 4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ E2DD603D9EA24DC7C5FD06BE:\ 6BFC745A0ECF2A0EC61B18DC3864171CB06F390397C8EF56BAA9FDB691EDA61F 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ 742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ 69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ 9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ 779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ A80012976F31FFDF305F0C9C5E:\ C04B36B064A0E7255F9D93726BEB8CEB6AF104AACF95E0B1D9FE6674E3E28500 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ 9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ 53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ 479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ 3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ B461A40645BF176601F1E760DE5F:\ D1BAB81690777D5953C7758304DBA49D869EEBE5614CCB7B43D29B206ABF86E0 D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ 5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ 8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ 1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ 86C226169FF257954EBDA81C0E5F99:\ 59F8C65D1A89437DFED8776DDFC679C2A7090EBAE7CEFDA8D5C5E7131726E61C 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ 431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ 40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ 0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ 2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ 83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ D3C356C914FA06B9A7CE24C7317A172D:\ FCC79031940D459B1AFFF94245872EC10F365E4191CFEB730073D8FD6542FAA6 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ 645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ 39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ 68F50D79F0C9C7314E750F7D02FAA58BFA:\ 2FFC21A7A45695B5112E00EDE09B4309D4332784B44DF8F7A318F399D419EF44 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ 4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ 717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ 4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ 9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ 39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ 7DF95B60FA8712A2271FCAF3911CE7B511B1:\ 07F623F572AD11B9F025D3700331F105ECBEA315D3ACFC93D00F064C1D2124F8 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ 261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ 0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ 61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ 37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ B87633654FD1D30A3C7F7FC08A5901ADE1DFE1AD121EAE77F6CA81CDAF0F28FA 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ 4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ 339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ 5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ 7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ B7F5CB9923AD97058EC067700CC746C127A61EE3:\ 3243CC1A40EB34682A5BB6731E6895B532A9FD119E5D132D969504F964B687DD 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ 70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ 495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ 5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ 00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ 7EF35A6D1831DA07BC5FEC817843308B0CCFD303F40B1F40DCC56D0F2281D74C 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ 6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ 6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ 1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ 0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ 2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ CD86A27F91AF52AE38271459E2D3531E6960981CC6A1FDB7B27D050FAA7A1911 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ 2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ 5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ 9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ CBD9AE4BCE3ABC5B01754388DED697F95ADB8FAD595B9CAD613EA5EEDC5F6F36 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ 8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ 90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ 6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ 0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ 6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ 6A9C06F5740755E87EA22671B99749C1E7E8B8261E6C514B0FB68F6FD593576F 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ 70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ 5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ 2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ 4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ 27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ F80CF26B72499FF551F99236CF91C2E8152D36BB6952CC7CFD1D8F415DA4F6BC B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ 0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ 0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ 8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ 547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ 758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ D012BF61D4A8587D0C891AA96C550539CDBBE77385075B214BF607B9096DE3FB 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ 38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ 5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ 3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ 8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ 5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ EBD2851FC04B38E57323CE3199854DBB56DA53771EA6AA36F92D4F9D410A5750 A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ 3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ 80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ 49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ 9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ 22C3FFDB2F4F12F5E7E7E1B440F793F807C82C6A1758AD385C119144F8AFDF4E A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ 0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ 639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ 877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ 1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ AACBAEDB29AC2298073C5A4CD93EC4911829379957544DAB0F0913B6B6AFCEF2 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ 9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ 10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ 8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ 88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ 0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ 2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ 04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ E16B44C16364E7A8A9747CA062EDA67C07688F5353DB8AC76B97E4B87A33271C 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ 623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ 15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ 817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ 5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ 89D35349D86B5FABBCFF385931532888F7DAB44B35E4522B196DBCC34FF5F912 [Skein-512(384)] :\ DD5AAF4589DC227BD1EB7BC68771F5BAEAA3586EF6C7680167A023EC8CE26980\ F06C4082C488B4AC9EF313F8CBE70808 CC:\ 00D5A235BE7BC36A9FD68227A593F106EE831F3F7558C96DA5B71AE7D0DB3084\ E43D6C57D9F202E8C69CC2C0D4333B20 41FB:\ BD9CF424D78ECEF97BF6350B8A3108B2564D1C5ACD225F1AAFAB38952E2D055C\ 63CBB2D4E2E3E1E0EECDC509D0376F64 1F877C:\ 772D0130AF7122EC74CCC8D3525C9DED5EB947E7986D404289A188903DAE603B\ CD602463C9E5B5B36DC35BC2EFA63269 C1ECFDFC:\ 4695DA47BFB7CA4B4E3A75A9D11F32D4E1D2B157E4CC6C99D2F8958576E689C1\ CD290FE681F93815DE0597C1955B8FB7 21F134AC57:\ E05E9F03E3B93B551C8B6831A90236CF52353B5823DD7B0ED4C5C5E561B9BB4C\ 1E89FB754C2A322E06F353D1279C41AC C6F50BB74E29:\ EDC71C49237BADF4BB2AF8B3C323FD1B97B9C36007D0BACCD576D86A489DCC8F\ 2D6057ED1367F11CE9608675510A800B 119713CC83EEEF:\ EA913BBDB422C1FEA6265B76D31595263C85CFFD649987A390937CACDD6DEB5A\ 60737442B0F65B026ED7E33F8BA8C984 4A4F202484512526:\ A1FDE8F1FD6173938BFE97FAC79CF039ED1706037A37728AF44A8DE9BD3B0104\ 527A41EF9BDF2DD6F9F47D6DFFB54F2E 1F66AB4185ED9B6375:\ 6B5B8FF4A1E0E17A5A56DE5E22BBCA3C2515097FDC9F37FE3BE7AC795E4DABA9\ 109D1D385089598ED66338432D403E2B EED7422227613B6F53C9:\ 55E9B42D26411536444796D4491F8F0AE584AD34944266DFEFCAA8017D187ABF\ 11FD7FF11F5213854D0BB8613976B3CF EAEED5CDFFD89DECE455F1:\ AEC708568481A72811A7433EA10D108776ECF04800817160A9A7F81444D018CC\ 343F59985EF697C5132E9E83FD093A8B 5BE43C90F22902E4FE8ED2D3:\ D4C81A25FBAC868A5948ADCB01E2080F1C4E05B78C168E4F4A86B8B2847BFEDF\ 81C0A15FDE4663B6D853496C18D96DCE A746273228122F381C3B46E4F1:\ FD050947149FCB0ACADDD62D54C8B1F1AE7C92402FE5D3628E9C729B389DDD2F\ 64D3773EA7FB3283A0B2779366BB1ACD 3C5871CD619C69A63B540EB5A625:\ 90F75B68A1C4DEF30110140532B6010FD20E31E73B789BCD83242CED91F55168\ 173C58E8F25E938E539E48CD8AADAE18 FA22874BCC068879E8EF11A69F0722:\ 9824CAE6430B1A48ACB966ACA678BC04E2DA5D1D8AE80693805723E2F0163B4C\ AAF711EC56F1A7F34ACF06B73D953663 52A608AB21CCDD8A4457A57EDE782176:\ B68EDDA2FF7CCCB2ABCFFB878C565F5628F0804992218305FDD64FB1973EED70\ 22A2A10983179761F2181B1C814C45AF 82E192E4043DDCD12ECF52969D0F807EED:\ 6B5D6A0E5A65EBAEECB1E355CD315E1F08FC2F661D49A5133816F20F8EDEF2E6\ 8FA2239062228A2C8B3F5EF1B93EE776 75683DCB556140C522543BB6E9098B21A21E:\ 21C60C9A2E785776F148BD8E022AAAD1E96CC4D504E29595AA1DEF00D6D0D64A\ 7206FF3A8538E9BED2465ED07239A7D4 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ 88C9F13E2287DCB77E130BDB79FBBD10CF57E2D7B1FB14C75827C38C07182DDB\ 44567261AAF221E2A030B0DF6A687E7B E26193989D06568FE688E75540AEA06747D9F851:\ 3DEE36F24D127B2E6C8F15C8A5D9BB63536536B0CFF7F8D9A6D4E2E76C1102E6\ E72BCE71DCF883F7E416FE68F0FD7FF2 D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ E443B8372B11BFB4CE30EDCC67AB71683B4D5CA4F03F8B2DBDB01874FFDABA9B\ FBA53BA02EB1D4A528E78403DE969C60 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ 8F6943635374867A09D3A48AB01693B912A5AA1922E0471F63C27A4B21CD813D\ A83A60373149DC3520F54C5C77137B61 A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ CA43C3340DABC7468B13C36F99CA7A74AD1F9F20E19B7D56836ABC487B556688\ 1EA55AA832A538B8CC4F5327CE0D92FE AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ 1FF2C4A8ED156BEA863C707E83B4761F9476A54C247D09EC1B80E500D816B6AF\ 123AD985846DE52A5748C3A3522C49AD AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ 02F0D9A142AE9E372399666F18BF475BD8F0FF295E40E017628CAFF59B5696DA\ 077A1FFFA5EE5F7F80655B77BFC86BD9 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ 53BA772B7269004E71B65D9B57186038F69936D583937846BCAA166307702058\ 1AE8C132083607B7B8780756403CDE0B FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ 3B1C7ADCAF40CF70ABDE54815A0B1ACA426D0C3F13E1BA202D79C8373867D108\ 52318A51F4D8EDF5BEA2CE6E47CEDCE9 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ B5A639D4D0254238E1642D5767E80580391A6AB2A423123DCFBF094F210776A8\ 9211E54810FEC520AA6F9F819ACB8FFB A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ 330666C8C85D5AC1E59EF7B72428C383530C0C2597AF6E6A6005138990577E52\ 856BBC7E153804234CBB7A2F96CB1A56 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ D159D7F40DDC09965E3D57EC61E5F6D34BA5B8F57CB4D986C4A25B64F4A58CDC\ 97FBABF386DD47ED8C381C336EBCA0A0 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ 2AF14104E4EC86798C83648E632CB6858B8E57669D6AB8DA032D2B93857638D0\ 65B50F5EFCC0332E806A6A2FACE8F021 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ A6B34FDA062D8FB9C9DD4D088EACB612F38C67E932F4C6A9C7BA5D3285BFB569\ 6E448821922B14DA012128E4D0D07038 DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ 46:\ 8CBF02F8C8E4A9A016D73F0F03ABECAE333454C407CBF4BD4F04D3B793EF8398\ 9661B28A93107DD1C4C7063C113BD7F4 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ B5A0:\ 2F6AF995CC2FE971791211C8C4320E88A17A519B4AFA8BB507BE3FB320FF5CD2\ 42817E3B7B05B3DCEB754AC27B17C776 B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ FBAD4E:\ 859ECDC28135742976F8ADE4448D36BF8DF2065FCC61249FA18DFD701ABDEED1\ 589BABEC4E2A172C0F284355C0DB5BCC 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ ED2C2492:\ BE285BF78BDCDEFD092E78B03F4CAFBB532B82CAED6FE80571BE4D08B499E02B\ 6298DD08AD1499534510B7FA68D999A8 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ 6B2EE4E542:\ 8258CE0AC0459B3674BFFC7649D914B6389F085339B68AFE019129EFD1590EF1\ 1E6221A2A1E3A43845FDC0D17DEE38E7 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ 2A1493D8F4FB:\ B937D1FB0DC3DB01F50E8403C0F4FB2BC3497BF6066D082D3F7F6F801046B3C9\ 3607C8394E8DD876122311CDC96BF322 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ 30A934467DA4B0:\ 083D3E568350FF19873B846811BD9DFCEE62AA33D7DC6D1974427FAFC9D8B098\ A1188047666EF3DFDD16A15E0B21A6B0 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ C0308E29446B8ED3:\ 814C38F1F0A4B150FD1B3FFCEDA4C82182AEE533BD740E00BE0DCAD7D2C593B7\ F0D668F200FD60ABAF73954B1159DCFF C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ 723B20F67BA610C2B7:\ 603B381E7A62AFECE40A85E880CA81074FF9813561D35599A75591219F081223\ F22B77BC2556A930E221900E46717A08 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ 0C834CE6EADC2BB86BF6:\ 97048BF08A3AA022FD8B7B27B3378C71EEBA5A53CE131371B0F2174FA7362313\ BC4E4611FADAB501B00B626FC0285410 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ 1540D29BA27AB8E309A4B7:\ A939E04321A4CD5C0CC8C9A6F3A0FA5BFE2F7E3F641780216C3D4F19498E4CC0\ 99BF4C7FF72D2DBE0B9DB0583B6FD87A 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ 32B58EBC38FC2A6B913596A8:\ EEF30A214C1A13BC7CC3DBA6B2F6F0F3EE9402F1FD2FF30F7E365132AC40B2D5\ 2D42B5DCDCFFC2E8DBEBF9A085DE6DE3 F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ 38467205F5DCFB34A2ACFE96C0:\ 5EA522484208E44E03899F34B7CE1407D7248B4449A5D1017A315261C15F8328\ FF91EB71437E5959816948B8FEFB8BCC CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ B06CF0F5A0EA15CA907EE1C27EBA:\ 8F369EA3FBF4EB7AC6B403AC2AAC0C1010BBAEDC3E3AE56A230DB5C8AB74E279\ A01DA2746945C9AD3D3C2EDA2F979B84 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ BCF84D0D4726364B9BF95AB251D9BB:\ E66948BB3F78F35702DA8B86CF00F8213C69F2C2D6AE53B5BE49A87C94B9CA96\ BE10E3ED70F7CAA1348233C8821ADE5B D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ C7F157298EABC4DCE7D89CE5162499F9:\ 48EFB81903ECFB45C8E8E6AB4EE613CC51553A3614BCA5728723DC425DF72119\ 761106AAB2BED22281F6329DCC4B76C0 BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ BEF788CDB5CF4606C9C1C7F61AED59F97D:\ 8CF73E9A7482F2F724CFC20122D53CE753E125AE10D45EA151CAA71E809C74BE\ 80BFEC538E033DAEF738E6AC4DB0BD28 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ 86E779CF053C77785AA9E692F821F14A7F51:\ E5A64162D97DCCD5AF0510FDF419148421D0C78AD034F84BD10A4459640BC2E0\ 84E8D79AC075C91B182B0B21DEE30F8E 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ 43304FBA401EFB2BDBD7ECE939102298651C86:\ 7477FE62A1179ECD8C1FE3E631D6F50B05C205479723BCF2FBFC4CCB9622D030\ 05209B726559E9B45CD3CFD84E063175 C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ 87D68D28CC3897452F6A22AA8573CCEBF245972A:\ 72445990CC993DE49DEAA95505141B85FEE3A91E3BE2B49C565FAF28F9B74077\ 03449AE0BCEC6F9A7C7CD9330DA2C8DF EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ 22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ 6FEDD863F915ED412DCF94982665D1804E2851048D680A2A16147790998F3B53\ 8C23CFA009E80F6633AC8F3A5EF2C07F 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ AB6AC800BC4DAE0AC3E068931CC247B911CC44CAC61893D5C3902BA244BFE42E\ F5A4CF56535F01A324F099F2592DA042 DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ 9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ A3053719509C08B2115E123182D7F539D3B27CE99C9E418508C231CE96D8C51E\ 51F83DFBBA64991BC23B9311B827BF6F EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ C199DD19BF41CE9553A579F12991CED14EC0484E6ACB402298584EF14167814B\ FA1BF146E8151C0FD0924864B7A651CE 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ 97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ 8497A79BFBDBC9C94799FAF66A73D627D04A788447217829E06D624A44E110B4\ 3EB578502D2F94039CBB5F844CF4B5DF 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ 2F23ECE869A3591573DAF89F82CA1699489B7205F8D0FC13C8238EB16808BFB3\ 393B42AB5269C23908D35493270582FB 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ 66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ 775822112196C6CC4D1A8AC4284087B3CF6EF8334929714D1DA233E15C815AC3\ E2C99311486DB75E046C0D72D98159CD 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ 4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ 9395D781970EB7ACADE92B142A840D11065E54238EA80EC618E567D3640A5F81\ 2DDBED2B4B406DC5CB2C4D02B78B39A9 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ 7328901A867F6942A36EF905C9D154737684A0A119322C1D5AF780CBC3C2FE14\ 99B7813D563CF5AC17DD200DF6C57618 C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ 30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ 8B2C2A7A93EC9783F67F1F8BA86C81A650C1218356072DDFBE0A6834B0029E48\ B1673D48B9E9D34C6164633F098305FB F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ 05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ 8683823D6C629A73AF3DFA73E0355260691CCEFC35F135CD320DD3D6A44D0F25\ E5B614EBE22F3D5E5A29827DD438EFDA E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ 1E9C6A6B67535E471198511F01D3873B37588D140ACCC3A06041CF0FA6896EF8\ 8FBAE115C225E13D07E49E8B521D8326 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ 00:\ 682DE91050385C47497C05D0AEBC9A6611D21EE9FDE7BF7393DE821662D6F41D\ A566715827D73133BBAF5DD10E7BB8AB FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ 37FC:\ 7CFC7B59B57F22182AB86CE7464FD43C10087940B15338B864554435915C29A4\ D56886ABB579C0031369E8A6D9782602 ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ 2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ 599BA5:\ 1171EF0A8BD1645EB6320AF04151333FDA4A961EEB1B9B544B84CF2D48C7FD1B\ 1458BFED6DF5337CD06EFF2F8927A427 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ 479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ 40706B05:\ 975FB226B9943E93814ECBA7C0FE0271FFAE444A3EE3635C319B9D348C065738\ EC2C0F203A7D2B582F65BDE3244F0DCE ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ 29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ 31D06C77A4:\ 8BF840C06597588DEE710B6FFA63DA53DBBD9E5674C1997870F6C990434BC837\ E486D21259E5AE7DF20ED6230F82F549 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ A259FC4FBD72:\ C7E1A46BD6641BF28161FF73FED29CA40C1737D2E55426CC6AFFA668C62B1003\ 12A9993CBF58AD1C67F8B45F2005B280 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ DBE5FE9694AD6D:\ 973C655510B5767CF9245DDCD991A35653061589E677A3A22420718BA9B31A64\ 74FB3BBBA6D9CC19069FFC0C13CB174D 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ 7EF57B91397AA8A7:\ 4F96FC1285F6CD408B14B1BC2969F0105BB8834EF0B993D5EF47FE018B932784\ 3920A0DFA9237750ECC6AD16A1C1932F BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ 7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ 44B78B2D48DE1A08AA:\ 14C74562DB319DE30671B7C2B74B84ACF67D0E7009D82C96BD23D868DF353161\ A5C38743A1D2B1F35FDC3D8A03137B18 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ B3A6C9FED24D70749604:\ E3482648C5F49C90AF744CBF74439C43DC28BCB956FB0165D3B1968018B5A1B4\ CDEC982464E3ED1F8571D2A9487D22BC BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ 8B033F77D384CA01593C1B:\ C5214A3074257511884A1E3BB06DE151C0BEE6C6FECB94282A8A4AFCFC8E1107\ D5619C80104C985275E1162BA8D64A1E 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ 013C23F1E9611D595EBAC37C:\ 129F42FA6E56C17F89301B300B907F0E28BD1B50742FEB4EF1027A571BB7011E\ 216A90468EDA7F5C0FC5352BFAAC285D 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ 9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ 4EC5A49FFDB59A1BD6A292AA0E:\ ED92AF2CBE613F76FBB29ABF8F539FD4E754341DC891E31690DAD02CDBF2D1C1\ 08AA97510DA91F9E931AB9DE9BCD1449 D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ 498E1F6C82C6CAE6FC14845B3C8A:\ 7592D415456664D9F5D1E2BA489DAC869B4A0C76929DD9AB3492BFC29843AC3B\ 63FFDF98B2F3D2B97C6F901F7C8BC22D 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ 88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ 5B01FECFC146BDB251B3BDAD556CD2:\ 2B41D4B92DCA870B714C17F6A2C171E2F7ED712DB17D2B804B0EF1DD811EFA05\ D5302400DAAC35B7D8A6C0B19312D640 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ AE9CD5CF0991878A311B549A6D6AF230:\ D6F3CFF75165E880FF89D66532C976857EDD33CCE338CC38C4A792C9AB769305\ EDE34F9AA2ED90BC80B8CE693D674746 E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ 105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ B50C7C681E773D109FF7491B5CC22296C5:\ C380F8A8BA9207D5C8985A47A2F4A47DA929EE9A59BBDAF0583F910D8F8B38DE\ FF8B7C33411A8CCA3A048EB14C116E7B E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ 190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ 2C7CA303269ED14014B2F3CF8B894EAC8554:\ 43878C46883783F66B667B82FBF04AEBCA2976F211CADD51CBEA2A89C0D02E23\ B0F0ECF89416F92687CC4F34998420A9 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ 1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ 9CA305733AAE6AAF6A9FBC8BE3EF738160472B427A7D45512BE95B28512844A6\ 2CC9E77C6485BD64ECAA70947742BA16 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ 8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ 37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ 15C963B78566DAF09DB081A03D46BF07F56A04BEC06EED0772022DE538FB97A2\ C3C74C0112C218426D200C89806DEEE7 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ 85EA51D49894E45BAA3DC707E224688C6408B68B11:\ ADFD0604E3E8C69761E5216A74972DF8524A80A4BFC44A9036685D1319DBAAA4\ 19B77643151AAA6354ACF0ACBBE8B804 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ 8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ 04E18D475920CE828B94E72241F24DB72546B352A0E4:\ F0E83C63AAB311880E90AAA11F813A7BDB33A54D9EF8300B89782720CB9F63D1\ 68BE37EB9AF76842102B83C1C3D2CFE5 B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ 05B693139D12AB6357BF8E86CC0651986B562E69FF1793FC917882058F65BC5F\ 7E29990855F4066F74194EB33C45D3C9 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ 578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ 44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ BD4AB805B0EF51C99A38D7312553D6A424C9FED2A012BCE569DA68D8464B828F\ 2B724550C1CC8E5818325D7595B87517 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ 4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ C41E37493A92C1B13775C345E8C0A910D08310FF38445D3556278F6DCB5282EC\ 4BDE63800C5302C497146A031214547B B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ 980F52FA262ECF7ABDC572AC637FA853E97E50C20746D706A4405F446BBFE585\ 1D94D2D55B176ACBF7F6C8A3062D9644 CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ 5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ 27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ 8A1948E4A7BF5A30C6C89215C78D7A3387F55E74E5C6B0A78D9C058E62BC2BE5\ E27F5511927290860403F2CE55C89896 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ C6D8729A614F63955D25E2647335679400DDD4B7A11DA5570D606B6E17649A3B\ 8007AD1D29C36142CDF05A35BDDEEEB6 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ 29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ 3817C40F6AD82A51DF2BA03F904224BE15609D19110591EBE004C87DB7D3CBAB\ B839F033A0602830F6DFBF8B739776D7 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ 650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ 177F858C375275BE09FA3C7E969B2718199992F43E1BF38559035F7C512132FE\ B977F58EA3CE5A04E4FEFBFD46DD44DA E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ 7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ 8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ 4D7D591B8FC1499A15D7CA4BB2D2ED66EFE8EDC62D4E4E0020ADA049C9645C5C\ 880977162C5C6BA8762E34135439EC46 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ 1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ 040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ 9321BC18EB42FD8D566238755E0F3F2E36DB0C2C445585BF7874F8F01EE19840\ DA5DE2399FAEF98760627E8C4DDCE5EC 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ 0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ 0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ 49:\ 7B3762B361A2031BD55AEC95F7F1D3AF6CDAA0C53543893B8AD5D8E4F173DC86\ D931AA2EE257EA9DB3FD723226851AF5 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ 0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ 2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ 5B52:\ 4B60819A230AC7B5E9E79FDE70508BF2301636A400A266A623FF3F5AB1527303\ 1A95B0D1C66711287C76445172F98224 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ 89CCC1:\ 5657BA563863831C7E760A4A913960D3B5A0B5F2ACB40BB0DABB3BCB71D3F5BB\ 261C3BC33A4B2F4B10066F88BB5C4824 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ 14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ 22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ 6DCBB4CE:\ 3D6479DF27738459A5953533BC80002CC160A14C44EB931F30C19D572DEE9ADC\ 551F47833CF9BA1B54FBE238A3684EAE A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ 7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ 881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ BADF45685F:\ 1AA0DC5B65B7BC36A42A872211BAB8C337A88608104F4B0D94BECD4642888EA7\ 8096AB61E10A8A2601F5C19E099143F5 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ 312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ 96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ 9B62C60A4771:\ 7DCD04C49C5775B2C5720B1D3C86237B8609240C442E82677F4BAFE95DF71E9B\ EA21EA038B8641049D10795E4592DBB7 F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ 9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ CA58D5DAB38ADB:\ 27D71344127B131779C522AC0732CB86924CA604F9D828B397A4BD8668620D7F\ 1A498C4647964514FFEBD65ED83E3FA4 E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ 21691E1069413848:\ F35AD05903827DE6880D6743789EAA2BC151290105E93555BDF2222F246F3453\ D25E78CA20AF97FC7BF49C05AE8691D5 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ B57D6D0C2EDC4E78D6:\ 6C590B5247D6B2DC4EAE1E6091260CC4CEA39609533D7EEAFA2E714A615F6995\ 4BA89AB1385F71F2067B347B3EAE18A7 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ 8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ CD19E781AF20454AC880:\ BA27E4B6235FBFA30C121828756AF482C9AA4AEDAF03FA71B28A79A9AB91065B\ 534A386C09BC8F82F5833F9C7F5A65CC 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ BF0FE3C32C17AA188A8683:\ C43E0FB71DCC91B15DCE61EE77F1AB80C35A4060160F0333717849D53678A2DB\ 2368650177E2499EBC3924173C709350 F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ 0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ 2E937F21C005F17411473041:\ E7D3CA73945E95DEF943819387EAE4D2E7A06ABF070743ACF98886E6E9C0D04C\ 7AA8E45023360DF8660FE2316E7D4C5E 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ 62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ 2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ 29F695815D866DA99DF3F79403:\ BB0416CE04F9E1C44338185FF508469E67628198CC623BA9D426EEEAFD1EA953\ FEA2ADD9AABA60B719A372585FA4A9CF 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ 84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ 3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ 1BB15B447589E86E8D76B1E9CED2:\ 9382974C4AB1F5DEE47B7BC4F46B9D3A9314ED25BE2D0E58613AC5DAD58F5AE4\ 25483B600E5EF80B97FC7AADA7AD94CD F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ 4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ 853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ AD3D7E886DEA4F005AE4AD05E5065F:\ A08D2AC21C648AD99DD8D6EB513E9C35B882E7EECDB0298D79698726C9AEF125\ 6D6E3C589D46AE2C37E1D181D8CE7FBC 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ 7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ 68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ EAABC35F5C2B0A0F2379231953322C4E:\ 34098ADF5B1AEA0505F05675EFE5D0087F21DCE090F9CF8462CBE90D7733012C\ E6B2473ED09FC76D20A88856F36702BB BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ 4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ 2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ 159388D5C3277E227286F65FF5E5B5AEC1:\ 4BC42095E61032311071028B4D0822F9A1D6458DED53BE8AFF09A3F8298D981B\ 3E160DED1AEE4E76132EC6ECE0ACA676 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ 407847DD0DA505AB1641C02DEA4F0D834986:\ 5E7FAEB80BD976475D5353B516AE7741172CFBD2E01BB791477952B9AB3FAB6A\ 8C6E9B465C519467EC7D74C72D5F444D B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ 33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ 99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ 7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ 3BCE4C5C10AF910C8F918D616F8448C1185C3FE5CAFC6FB65F78088114DBC73B\ F776B752369DCED810FA3C17BA6C9D04 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ 2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ 205AA1615DB44057DB991231D2CB42624574F545:\ 5CFF0ABBBA9A99444F35D7059E00426A54F00FD40700CAA11B9DAD24585B9CDE\ 8611E2D2362198679661B0C8BB32D51F DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ 2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ 157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ 7D267BC373B124004D87779694CF540376EF8F2B70FD2A1C42CFA2ABF1B31883\ 69FAC54388D49193CDC290C6A4EBB42C 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ 0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ 0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ 3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ 5C8EAD9B63BE6A53B2BB566F7F85922A0C34188CD423A00C2E8A7CBA853E5D10\ 99CD80F528ED566BB2E109B24C0A2705 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ 46176EBF044C4784467C700470D0C0B40C8A088C815816:\ 3A33C662B1627ED8BE5F663EF7D31339D77A417D7214D876375854C8B47A733A\ 121AFAF4105939CD85C758DC50A9C01B D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ 91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ 1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ 93790C9ED2B9CEDA2F0D084D36823AA0E65C0451266B212B6E1CBE1FD7170E7F\ 48AD9B40378E8AC6FADB5836A94D9358 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ 1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ 285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ 6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ 3D584E6ABFB76DC37E1970D1F6562624CF36C286D215E99C8B52C94A2413754B\ A6BA57E9F2B400DB32FCBF7897190427 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ 27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ 9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ 625F1B266FF16C3A6E578A5553160E4C988A9981A14A4E36658F96052BD6FEDB\ 9DBC82BDBD7AB8F9D15CB8A6D6C60529 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ 3A7C288A8DEF3863BD9794FEB6EB6088E654B583B7B47FCA43B0D11D5B141D4C\ 4D0196181FE7D715A17666A5C9F85746 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ 8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ 4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ 47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ 4A6C0BA558A8E6472D7ED43B3863119226D5E0B5E9F5FAD0EFCFB9725259782E\ AA01E664A9C6FC7E127232FC403F5BA8 A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ 2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ 3988419A32965476568BC28195C1308F7863CB90FBA3F4E25DD6B60A1828185F\ EE9493053C727268AA17F774409DEFF1 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ 5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ 4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ B7A68974A7B5A9444E9F1977EDA765DFC7CD6DC4D34B74107C0AA718713ED950\ 1CE0B6EF11BE8A40E6AC370B791AE955 A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ 07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ 6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ ACC04F6CD4D93DA8EB2EC1F225F538217401751585B47CCF268E743B138E3B9D\ F2F03D208A003A69579C4CBBEA7B5ADB 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ 29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ 98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ 9031196E98F4EBA461944E5CBDFF97FA210919DFDE60E4BDB8C62DFECADEEEDA\ A284F78276C1CA7D31ED87EACD798E90 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ 3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ E2:\ 404B437E1FBD49BC970B010DC86FCA3FE2ABDBD5F651921781BDC92BD7B2D02D\ C2D20FB5F913AA4CB3BFF6283DD1F1DE 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ 1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ 3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ 52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ 61EC:\ 375089B896A0A11A62A6B5144334E963DE8D5D2557E5B93E9A9A8ADBDF639FC4\ 0DD2966D09857E475D58A7F72CA257E9 E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ 9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ 2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ 609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ 9B5EDC:\ 55E79BAD42518ED80454272B5B9E6A61E4EE11C77297DF64C29120CB95BDEE52\ 18C081CD272BA6AF14A0BFA03DBB9F15 FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ 63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ 42D75D68:\ E306B55F3A8A22499E54F8C784C24AE0769458C4F42EF9A8F5FC209A7058DA28\ 8AE4DDA3639B15AA718F6784B2F179A6 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ 7815BF3C49:\ AAAC679BB72A7CBE019909BE598B1E82227A491A3CD4F1FBDAE51245C844769C\ C15F89DC2D353E8B9E0766064BD5DE20 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ 61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ 025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ 951CB2068CC6:\ C47DD79BC487DF4A1C459BC945543B7D17DB14DDC53F84D4EBE7A7A835422F65\ B7B500212E8F830565FA7AC78F2696AC B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ 93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ B0FED6A8052FBB:\ 419D6DB2DB67466999F9CE9736B5CA4E6C4351E02D7C3343233894FC65D438DF\ 1B212A0BF6CA935BB0660D24F89A6188 B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ 35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ 780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ 015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ 37674C6F8E380C04:\ A3ED4A09341F3D635442AC84B4E01A66E21D2253086F57150FEBB8805ADDE39B\ CE691E309CB8DF2F8D5148CBFC28AC1A 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ F22DA873C601016A0D:\ F741849B3C9A09212FE6D9090A63467058E1B2AAE77D8366195D780FC7BA359E\ 7732FAB032551494D889463A0FDDF5A8 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ 472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ 994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ 1373FB09A1A6E3C7158F:\ ADA5085E13200EB6B07BB5565A718888F3922DC71EE085560EE26263D21ECDAA\ 032E30A1B74B34908E818C6C9D8EFFB4 FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ 084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ 339612E830E9E7A9C29065:\ 69C5C00A53B66F7386552E4506E980C99EB4654AE21C3A92DB94E13D5EB5C5B8\ 48DC29DC5F19874F670A211EC5B07CAF 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ 5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ 8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ 377838973C1D943C22ED335E:\ 9F32B2C516A497DC2A12CE93545D8C86601EB7FE1231264F3D5B28FCC4C9E6D7\ 6A5AB5ED76BBCD28CDFF9DFA18864B5B 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ 725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ 798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ 8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ 2D0C9E7448DE3043AE22FDD229:\ 54645F0753C08007A1AFDDD5E59A59FDAB5B45E663C155BBEB2D7EAA97008867\ 52E155A2FCB734B7B92EC3D9CE8C7B4A 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ 5B6C338CBB8F6659D342A24368CF:\ C0469566E1C774CCB2C1C3FBD299C7D136F37D351D5EFE7428D4F213406B5C28\ 02D5B897A4A5FA6AFC49466893069F6D EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ 76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ F6954BA0801A1294CD8D7E66DFAFEC:\ F7DCB1025BDE3AF26DC11AFA59C3F2D56FC8FF46D7F5C61447592AA9F9A47C5E\ 0FA5904CBA15A83DC9A7F407EEB5DFAC 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ 055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ 256FB33D4260439CBA73A9479EE00C63:\ 07FE20E4EA9960F0D43BF93B76AE784E127D34E4E67F4DC677A5F11186A31329\ 10F988BF53810374702C631C8B511902 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ 911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ 5994C1DBB3B5C7871A11F5537011044C53:\ B679E7B3974A42A7E34D3E5E270A73595DE2EA1178AB9F539EC51624C89812E5\ 4B4BF7AA05B0BD6B2F52A100A10B245F CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ 2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ 586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ 4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ 4E53426CAA453F8DE1CBB57932B0B741D4C6:\ 237CA952F8AE90BAF62F8CD927DBFD2DC2A82787F25916E0A7D1EFDE1491D6FC\ B627D9E4D5D7DC4DE3AD36C04407A129 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ 868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ 83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ 9A900E561004D66F944C17AC3C1D238A14F678BBE5DF2EC63891F0ECEAA49268\ A852CE388334D9CC5179D97DF9DCCC55 EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ EBB3BCA2B586A767BC121E7AC63DE3ED29B9EFBFDC82A22D133BCC5DEEE7EF34\ BB81088620F09514D65E29D2FF82B3F4 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ 656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ 46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ 8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ 89D430452B2467223CF1254F8D1F7B4012711BAD255CF60B4817502D83011D2F\ 64E2D59C8DFCED1071B82C684F28B69E 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ 7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ 4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ 99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ FFF51AE665CE613D7113AD4562AC0F3783CF0F0F5F53174CD15F7FA2B330C622\ 519271831FEBBC21357922CA38C2ED44 D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ 66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ 67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ 4DDB8D8182B7712B1F5956F25FE22673729CA3EB7EFE77C173168B73FF7A0867\ 80366BBE4B6218E9C09B2D0956D0CD79 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ 1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ 48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ 15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ 0F7039A7F59D0FC589C303F54E5015626A0832A6CE41C49871761479282F87C0\ 32035367CB6D5205B0984EFE9705EA04 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ 7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ 66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ 5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ E6E8C29BDF2354D7087F0DFFAD3B100A13997A299F5A3C5F4A1B13996F575DCF\ 0552D8FE3DB6FF835CBFA6EA115ACAA1 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ 7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ 1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ 1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ C9C4913F7804EC328F3713B62C69A5716E401BBEA02B9D9FD8E99814CCF00F54\ 175F40DEE92515A9FCCCC59E2D4B7F3B 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ 9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ 0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ 45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ 2FF5E9203513AC6681360B1719B847A7A9E48590CFA0C76AD2F1D9E05417BA2E\ DD8459429AA4C6857F1B55E7F8D402EB 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ 1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ 6E5E1E478E688F2D7A9A2723C5B395D9924D42ADAC58458397BBACAF361BD1F8\ B812910413EFA8F1953D6C9363C9E779 CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ 60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ 0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ 713B07CD3D7BCC143FC0F5BD0C9CF749A34BCCBD2F073D38BE7AA65513CE6BA6\ 17854ECFCACDBE2C343163685B2813D3 F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ 10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ 568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ 46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ 3891B10051961C47CAEDD4355D1B3804FCB527F48B113BA7AE5A6738F8A5DEF0\ 0BD3739619D938A2DEA98E890C244F30 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ 8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ 4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ 01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ 46AD8864D8AE2DBF6049936A56A766C5FF7E08354E6059EC758BF0BC289957E2\ 6A21AD9DD98EBF35C7F41BBD3C9A82C3 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ 9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ 447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ E86B2AFD940F8D97B6B5014C350840336B97BDDF10242209BA6BD1CD4033D23A\ 9704F045AC313C558C725FEB30870370 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ 74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ 5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ CF:\ 73F02E63CB23E05A6267D1114CBAFED30E4FFBE315B70CEA1824167C82FC2F04\ 260669439E9DDB1FF7A4737B8279C204 FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ 5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ 71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ 1DC8:\ 449557E5DDA3121C1CD0DC77AB17F3CAC077AE32D287128BFFF24674266235AC\ 56A1D876BC6E4E42B32EEAD51D6ADFC8 E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ 54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ 009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ 2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ 99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ C25E88:\ 03793FDEC73FD0F461E74ACB6AE9858124FC92F17689E8987C4C7361091D6797\ 5F98EC2C0BF902218C144E4A83966E68 F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ 65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ 3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ C5C06729:\ 710D5E801FE13571B1FCBA8451B129737BDC775B677D8A0AF7DC3E293FD6D17E\ 87F77D9570DB5E7967D4061C71D8D576 CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ 68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ 6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ 551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ CFE0AF93EB:\ 2012C552935A60747AB15AECBEB64E4E32DEC26B0A51913525BCBEFA4E0D64A8\ 6EEE815A77F4BB3CC0C8724041C78DB9 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ 331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ 2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ 05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ F467BC75A9D1:\ 5F47B2BCC16C913C91703DE29DD5F81E1C292A36186D814FF2D118637178BD6A\ E099E7416744F402228EBF85C071FFFB 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ 513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ C6F4756017FFF5:\ 1B63D53002737F57F16FFF205D53E9932488BB5C6F8A48B99931E6C6DDEDB8D7\ 61A6AD6CF9D1D3A1282A20600C8832A1 C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ 798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ 9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ 45DBA58E6CB2C8EA:\ 8F4517FAD18DB33ADB334BBC933DFBE99EC9ECAB7B6D9F80BB32CD37B7597892\ A475EABB3534596D54F6CBD58ED507AD B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ 01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ 86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ 10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ E8419D48FDFBD744CE:\ B517B814751DE093AC8DCB321E3246298615C2C404A17AA34DE73926FC951B5F\ BB3FB720304EFC578AE2EF81B001BD0E A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ 7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ 6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ 1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ 4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ 359D5D1EEA105F28DCFB:\ 57913D673AC64F325EBAA5539EC66AB61ADE8C3F0252B9A7CD089FBB1E2E9EC6\ DEF236CFB755FC6CEDAF1002F6BEE085 E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ 2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ 6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ 8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ 7ADFB974EE205A9BF7B848:\ EC4CFD169357668A80FAF22036B63D1289DEA65345E247A75413EA328EC13E8B\ D0020933D2AE1AAD9BF9F856F0FF4BA0 B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ 7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ EC77F29D211BE89DE18B15F6:\ FD602E5885409F02EA942A427852D94A83FCCA96133EB3D6F67F769F06D6CF27\ 09D7D19A5C1210A556B5CC514F1741F1 DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ 4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ 49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ 9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ 50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ 63EFE793489C39B8FD29D104CE:\ 0E2C0624D62B87CFF5B3FA6760800FF3FA5E3A79C09CC1C80AAB652F7E3547E3\ A7FD8EE6DC85EB70EBF6DF47F5791386 BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ 02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ 711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ AE5B257BE36A7124E1060C170FFA:\ A6D4F149A6255987A672A732E53E78AF0DC1933360893DD367CD95C73ADA414C\ 8473A09AF6BC6C773FC360A604AD3B9C 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ 5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ 70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ 001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ 480AB79D4E6415B520F1C484D675B1:\ 7AFC3D203CD8238B168E486CD846415D5D7AD7C69AFD7B2766812675DF4719B1\ 38CE485B0A07F01C6BF84E405EA0ABC1 A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ 84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ 920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ D42956588B3B58CD948970D298776060:\ 3E02383EFB0F1EC429C5C563ACF40A534DE66D042F5A17F11964445A9288DDB3\ A357531E6A6991C19D874DE7CF79563B 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ 3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ 678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ 2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ 8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ A96CBDE5FBC953D9E576CD216AFC90323A:\ E2E74BFB3C690F88F946BCB0E0E97BE8EBC485E854027E60D31D7B3D03988A8D\ AACDB65C2B2A3CC79DD9598742E36E87 F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ 593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ 0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ 358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ 67B5AD93D874812A1DE6A7B93CD53AD97232:\ C086AE3DDF080E95A61C9312176959B20A64D830B17BB509D6ABF7B7C97B5602\ 404991D703DB6D574CBFA94DD1FF122E 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ 85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ 352BDD3740DD6A16792AE2D86F11641BB717C2:\ 7BBDD39B5016008599A57D1128284F26BFD3575018B2A817493B8CDC01F51EF4\ 32984ADA489C9F48A35DB9A1291EEAC7 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ 71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ 865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ 2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ 9ABA31EDB903B28FBFC33B7703CD996215A11238:\ 77CB1EFFAA608B26982023B9A791F586D2131EF3966AB952E54847B6F9367FA8\ F799D1D5EC4DA33E3402B8D9C7B5E7FF 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ 8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ 13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ 9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ 32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ E66A85F53AFE2FB7EA5F2B2A222E3E463BA83F9545260F0518478570B63C7710\ 333F8EDB0792A411E7F3BA24440D8D41 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ 3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ 7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ A412954A490D969DF9E152A37064D22E2ABAF362993C068E37706739B6FC29A3\ FED38AD0110AEF0406D0562B5458CA26 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ 2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ 41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ 1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ 6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ F766B4E8B3327BAB4B887EBBAD473F3EDBA9FEE3375AA042D70DB684013D7A6F\ 51A0DC146374DD972D7FD664F0E4D8A3 C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ 58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ 21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ 104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ 59AFBA40DFE9D873A41CDC96E8E028B7D38C8CF5D2E90B93AD7C623E70410E84\ AD0D9C548E82DE66C97D1456156ABA86 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ 4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ 76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ 69F93C7DEA9EE5AF121C27D3B73D9FB57798E6431BCACDE8E6D279315FBAC007\ 08C46BF8D9252608EE27F9C43A8C978B C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ 7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ 36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ AE8A5BF2BB1C4179172CFB37AEF17E7AB8D304AAF8C3DB77A0DEB65BE04B2262\ 7DBC75B1F4CBF0F6CF0478B9E811E90F 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ 8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ 7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ 57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ C1942E8E8072BC4999429683BB236A9D08B2014952F0912334C537F10D52A563\ 93183F803E66B2921F2E538FA5406D7D 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ 384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ 4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ 55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ 243664EC5E71B6FBAB9C8C23B62F2780844DB1E0640AA61D53CBB83E30F997E4\ 433765087A27B9566D043269D89F52FC C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ 4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ 761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ 8674C13392B0BDCA789DAAFAD155651B8B5F99CAB282B76B36C3D1F1B6ACF3C2\ 042EB12DE924D36382D110CC4B313B24 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ 0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ 475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ 6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ 6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ 5A2CFEA0B13290C9166A6A645DCD4F2A08E5A1352ECAC280A998FA93A53B1B80\ 1C6E4DA746A8DD0E1D3A1D47697DE15D 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ 635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ 822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ 1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ B15CEAF7F5BB6DB3A1F4AD4B7C9DD983276163857206DE4A0DE73AE0EFA34CE8\ 130AE93FD1EB961F7777D280FA0B9AD4 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ 1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ 698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ 47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ 8AFD293CA0145DBB8FE45D36E37D2655F771D1F442A9073A62AE834B4CCE97D7\ 12D315620075219A718E7F6454D0FF8E CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ 8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ 696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ 7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ 01:\ 92313C6E2958893505EFBA0F259243CC7804529D43A27D23B8218D4395D33BC2\ 7F4691FEF88298C94E818A8FFD245453 D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ 0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ 2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ 9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ 4D4B:\ EE3468A9CCCE38DBB19A5D21E280D0AA0C43E53C7D4A7D5765ADE99275C46884\ 112552E658E6D37D5BFE10A3B6C60CF8 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ 1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ 18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ 299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ 4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ A3BA86:\ BB2D96E98D8DBDBCBB584CEA235888DBAED952AFC6E5E7D8D7FF60F1FD4AE2DB\ 661E93923DDA830A4D5F90D116C4BE5B 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ 69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ 1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ 61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ 477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ FB9E4AB6:\ 7EAD0CC318B26BF7E3E379CBF6C083765EF42A7E576552FF2ED62C531350604B\ C6409B315724A995C57CFF6700502A05 FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ 31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ 59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ 7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ 91355C6280:\ 0E5F7BF77D166621132E5D791BCB2BA50B31555B2F41528749D101D375796439\ EE367189E9CF511B19B54B1AD694460F 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ 62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ 225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ 1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ 366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ AF1AE717238D:\ CB89BA090205A111F3B527A67DB45C3830EB48D8E83CBB84A2D3F7AD0E93E0CB\ 1DAD17F79AB53C33314657790123AA6F 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ 85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ 16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ 528F9AB49C79F2:\ 9A01097120368F6B07024C89DD59285E81C510D75EFF02882110831769614E29\ 5DD84ABE057C46A44F549F6041525862 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ 584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ 4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ 4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ 5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ EBDDC89186839B77:\ 5542830208F3703FF68A2B504D2BF48518300798BE4A4F1CFD233EACF1F82BB9\ F9FC59BB91A0D17A948D78B3D4E9B81B FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ 6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ C66F252F6E64EDC96B:\ 30AD3BAD371BF14AFC4F7C75E8FEB819A9FC2852A8053C7EB8C69455C4736E69\ 4540C2ECDE99EC46A81E94EEE6FDE011 B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ 5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ 252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ 25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ 232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ 5363892A2495DF8C1EEF:\ 5C3B4332ADE447BFBCD3328D81B849C124BD59CED92FD74DE0D77D9E4A5F2A23\ A6619234D88065596F5889B28EBDC54A C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ 272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ 414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ 49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ 199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ 5C6D1BE4BC79F08A1A0A46:\ 22C9B83B2BBCCF28325D124A76385D3EFBAAA69E2D9CC1694730C67E63B30875\ 14DCE2594BB3EF685B9EC4A5E3D922AE 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ 2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ 443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ 6EB6E4A80358ACC78647D043:\ 34AE91FE75C4D284F5C2E084011C37BAB10531399E8E4FCCD2E8AF85579BD5E4\ 6A12DB7BA50BF152B27C91AA50A1D510 EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ 01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ 90BF2C4062FD2AD58F906A2D0D:\ BBCAE5D76FF15ADD301BAFBF55D6550885BAB9660FD59B87F44DD0EE137C0DCF\ 0D216193C5BE3644D5EE397FC0286729 E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ 3EE46FB67422F814A68C4BE3E8C9:\ 2A0B9271E8ACDCF040480FF9E1EED1F4C90724B5A145FE275901F8CB1D000B69\ 93D9DA11DFC261F8F256E5076EC92E7C D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ 4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ 38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ 806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ 4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ A17E776C0D02856032A6CD10AD2838:\ E28211409BFC540E8E9E3CA4CC68C91788F275B9A6399E9F4BD1D1126E0DFFF7\ F82CF2E325E66D35619EB6B005069999 F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ 39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ 42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ 4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ 2ED1C78631FD23B4C3EB27C3FAEC8685:\ 10B1098955292ACEBC01688E912C40B0712AE72DC6696F292FD2004FC9D28279\ DE4D0DA7B8CB3EB4338B815229B163E3 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ 94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ 286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ 04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ 72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ CD90333A77BC4E1988A82ABF7C7CAF3291:\ A12C2F82AE2ABD6445311822AA9386809753FAAF883F0654F64601296EB2C38C\ 40533C7A48F939797A9D75093432A4F5 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ 29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ 5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ 626C48322E9791D5FF72294049BDE91E73F8:\ 4ED291FC99C64B3657D0647C5DA5526781EA625C1A1C5195CFA1EC8EE38691EC\ 605F96C9D7665AE5896292D4517204AD AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ 1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ 42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ 774BE89C1114DD531C011E53A34DC248A2F0E6:\ 5AEECE701B5CCB35F43DB72265DC692E09202368D9BAC6F0AC8D135DDA4B5ED1\ 66638F002A2EC3E1CDB43919CB5F62D2 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ 246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ 47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ 94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ A7059ABE99182714983B9C9D44D7F5643596D4F3:\ 2AB374BBA7A3E03EA741290F0B94D083722BF8C4694A9C0932671A6C691D15A1\ EF88656D974DD80B0B741A3BCEDD8A6E 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ 374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ 6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ 63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ 5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ 4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ 2DF2F57B9C85BFD93A25A62D8DEA8F319B29F4ED295016834BD62B82179BFFD5\ 4C3D753AFC9E7398636B9008B2235AFB 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ 575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ 7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ 591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ 51E6AEF326CB5FA7AB58FCB6B951D5AB9E97933B61F3D44C48A16C9E57CD0F8B\ 423F1FF71AF546C29CC94148444E85AD 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ 37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ 3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ 9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ 24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ C7C4A1CBCECC12325A90FE8FBBF879CEDF85973F2557FF371754F27A99B36D13\ 0A03E0C4B575E937A485C7F4D7AD09D1 D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ 33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ 0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ 52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ AE1EF5A3F3AD627EFD50EB91DF603654C5F2D90E0EDDACF5862E2253B84BC257\ 155606B3C6F6D11D954CCC4A9518FEC0 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ 7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ 5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ 806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ C720C461F5D48653A3A4889DD4C287BD7E115A9F91DD52610C52F2EA90903B52\ 800AD3D43533FF8AB69227C97645A514 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ 271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ 608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ 990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ 2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ 2E47EF41408C039D257BEDBF5087AC57FE59452A35D1A3E0C6F3A333B915D66F\ 844A045B7BDB85B4FC0D6A662C0BE470 C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ 56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ 8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ 50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ 1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ 9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ E94DA5AD788A730486EC70413ED54316941370DF04DF054395D5D798232397C0\ E980B25CA39251B22EB415BD9E272BCC 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ 5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ 4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ 261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ 31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ 9A2B5607EB55AC23AD0BA6CB4D753C591D1DB9D2663B4DBC9EF0EFAE8C6F02E3\ CA943FFC47B608BF803C09B2B062F6D8 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ 266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ 7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ 357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ 5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ 719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ 42CB01F43C6FFF1E37C3E5D4C6A4394AC47ED5E678B7A536CDF9AB2C3E4713B1\ 510249AD5F616C47D910AD8B8987FDCA 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ 8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ 3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ 267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ 8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ 875B2EF5981F303CAB294FBAA24CCADCF9DE2273483AA829317D83443860A443\ 1D39977DAD19C87FAD3C2432C5498739 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ 1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ 4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ 3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ 44B2BFBFB82D22C42ADFDB0830281B5F40BEFB129E2C92B2C74927E66C4AC085\ 2DCE0B25796E2D1E68CC86219E7B0A57 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ 994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ 37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ 7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ 9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ 37D9DA46B02E810E460DF8C37AF255A4540ACC1FB58A72F50E5CE4700BD1B1BC\ 4528B5AC7DF55443ADA26019A786FBE7 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ 394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ 43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ 7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ E8:\ 57B9549E03F9D7F65139161EA578D9DA731AD4DF962D57713AFE32CF2BDDAC9C\ 0567D070247106130580EE8A9E1B84C0 EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ 85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ 4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ 97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ 345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ 6427:\ 701ED3F52B4EACEE924E02C1FD928C54FB8454C7BEEA5800B7798FAD28F408D1\ 85681EDBBF38B0D54658ACEA65F24927 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ 89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ 630012:\ 92BF47026DBEBE055242BA865BC2EC0DF784378745E2B5F54456E8A4A9C6F2C3\ ACF2973E4DA7E31867DE47BC0A59292B 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ 95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ 4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ 78DFB921:\ 9C49D15BFA855335819861393AFC216F98AC0ECB3DB1EC6F1D86A20A70DDC3CD\ 3B3E1182E68AE9BA62CF87691516FA3B 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ 4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ 91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ 9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ BB0D19F909:\ FF8918DE7CEEC26488852BE360EC8EE167ABA8A9D8A9E006B19A15F606F2BBD0\ 5357ABB40C4CC286658120C0A704DEC1 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ 6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ 57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ 00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ 77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ 81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ 04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ BE6BF8082E8A:\ 76CB2FE2D260D939672E3301EDBF82871AFF34D9F59A38557F69CA2F61EDE7BA\ 6638F64972C13D46B74E0BB7AF7C1AD7 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ 06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ 6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ 4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ 58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ E839A9D4608F03:\ 28DCAA83570BC5CAE98144D991CC7999EE46EFAB844BE04E50DCCA9B39F27820\ BF49D967C28C6E47867581CC40A8013B 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ 10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ 2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ 2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ 8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ 8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ 5153592EA81C6FBF:\ 2D8F7012F5118011092FF7B08075D2463A1F0A1CDE808845904B9F8D8966D0C8\ 33CE78181F0EB4C03D2C8AAD865F6EB7 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ 735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ 1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ 7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ 39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ 9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ 604F5035C46B8197D3:\ 97A7DA85E03A49BB9C9C9AEEB015E5515DBBA53E0E562A4FE96A7A45199E429C\ B38D0062F63696AA12FF0DE87D30B330 E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ 94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ 7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ 60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ 7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ 6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ 07E3B953ACF99964B847:\ BF85BD95F5550F2B382352D05E73F3C41F12C1161DDE4EE6CBC0F9E8563B6D55\ F10C113AF3AD2ECB78E156210CA0A318 D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ 32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ 7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ 8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ 07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ 4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ 6C90E8C4D100ACD9EED21E:\ BD795815C94513891FBCEE251276C2648C9B39D6695CF193607B763DF49E98B1\ 59956E982366343C9BF415E3F32D1A55 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ 18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ 886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ 4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ E2DD603D9EA24DC7C5FD06BE:\ 650657A09AF30EBE4916DEF8BF50753907D66B5894D332D3CF62AE46D83C8353\ F06FD58CDC098FC4BB801F30F238EB7F 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ 742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ 69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ 9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ 779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ A80012976F31FFDF305F0C9C5E:\ 3946C579004179275E24A71A33B13ED39B9EF96476F07C71A20A2F55ECE4E3E8\ FB35E04786D784337DE2CAF88ED5A6A0 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ 9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ 53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ 479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ 3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ B461A40645BF176601F1E760DE5F:\ 24C91910D9895CE0E83D93F15D224D01F6354DBB38C1D8B3D19D1B1D51227845\ C78210F33768B7A9C68ADDC39B140E9E D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ 5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ 8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ 1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ 86C226169FF257954EBDA81C0E5F99:\ 1E30D91FDF847DEAB875ADF3A2390923FC9FFB94E3FC56412DED435799E81853\ 3951EB5A4831179BA4746BAC3C9C440E 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ 431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ 40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ 0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ 2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ 83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ D3C356C914FA06B9A7CE24C7317A172D:\ 140FF352245667FD29CA38A21DB3D3DD4BBE8CFFD3CA677F12482A559EFAF08E\ 8B0A9825B807206CBF6BD35FF6F88A3D 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ 645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ 39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ 68F50D79F0C9C7314E750F7D02FAA58BFA:\ 68B6338A2474B3976F21BA56B0716098D4736FF76EFD5EE9A3504BBAA8389F2C\ 346BFC26010B46F52F292D2836C16473 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ 4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ 717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ 4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ 9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ 39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ 7DF95B60FA8712A2271FCAF3911CE7B511B1:\ 499E08E111893FD76C97435E4C89C6EB5407E843510DB18ECC9EEBFF175DA621\ 20013880FF082847CAD39F8B52631BC8 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ 261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ 0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ 61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ 37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ 07EB2C3638FED3D91BAC7BE01C4F8D2B42E1871B11B3B4E769BFE259B34395CE\ D6BA570EEBB61C443E0904E4B471AA30 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ 4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ 339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ 5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ 7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ B7F5CB9923AD97058EC067700CC746C127A61EE3:\ 8B2409B8DFBCFD80F4F972C86C4C765F60F3904A62D818D85694CA70C2DE3D0C\ 0772C0058976BCC82332E51E352E055D 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ 70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ 495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ 5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ 00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ 9C7A50D34C41F15F82E9F39BEC09D5B921AD325F116DEAB57C74528DF0D3862E\ DE1F0C98657CB1EB1415675ECB2BED2F 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ 6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ 6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ 1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ 0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ 2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ D533DF7948B95AAB53706447F34C73D818A1CB76E06C74310C3A19EE965D903D\ 8FD0A569C946F7FE256A9465ED9D0ECE 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ 2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ 5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ 9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ 6EF98C22A7A692F5A12E3A2C00724439D191CDFE9F65877F4DBE7BCF82A66628\ 07F6FEFDBDFC21C005074169E095C2C7 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ 8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ 90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ 6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ 0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ 6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ 68B6CA904DE9A5C8CBB163AEDD7AA97F9BBBF7348E062D66EB1A289EC9583796\ 6937399D5F34CE0DB5FCF03BC7CB7DCD 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ 70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ 5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ 2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ 4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ 27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ 9299624AC4498D0CB3AB6CAA70877C0768DE74F29164DB203657ED25C11FE811\ 491DC51C79BB8B7E4BAF7944C1A2DEB6 B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ 0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ 0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ 8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ 547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ 758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ B9E53AD62D831A701687603DE34A414AF823F4B5E2203A44C0EE09EE12E943AF\ F5F7368090B7B07F4CB765212A8C83D3 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ 38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ 5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ 3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ 8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ 5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ EDDEE421E72E69DC28F10CB7587CBE390960623E6EC8B7F6AC4650D5FA48148D\ 3270EE90F7C5B232634811B78AB90216 A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ 3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ 80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ 49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ 9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ C60AC87DFB3B2ED2129CF3FDDCA95BCEECD088E726B7BDDCFC6DA875DFE1BFAA\ 6B148580F4F28965584B857E7534D39F A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ 0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ 639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ 877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ 1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ C4D228990D399E4841E24A69AFD6A8619E22FBA0694960F261F5322BCD1BE89C\ B7DC8DB635878D689D806D12E07852F6 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ 9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ 10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ 8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ 88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ 0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ 2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ 04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ 9DE565FD096433AF93D50065595AE778A2D1FA9A726B2193E67DD999D061F22B\ 33188B5361C673672CFE9AB60A40460E 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ 623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ 15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ 817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ 5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ 64D4446F97CDCDDE342BEFDDAC0B19BAA1D03FB28CD774685C49CD98AF388B5D\ F779F81B8249A00668A8E0FBA42876C5 [Skein-512(512)] :\ BC5B4C50925519C290CC634277AE3D6257212395CBA733BBAD37A4AF0FA06AF4\ 1FCA7903D06564FEA7A2D3730DBDB80C1F85562DFCC070334EA4D1D9E72CBA7A CC:\ 26D8382EBDC39072293DDCDDA6568B4ADD2449A05424A12DFBF11595228E9FBF\ 7C542F25EC0F7348B19AD23EF5E97D45E5CFF7BB9969BE332923F33BE53A6D09 41FB:\ 258F3CEEBD9C01271D75ABE73E90085390F54CD318B4D5FA71E8813A541DD96E\ 9DE5A119D053A913296929E263267A3710B3675AB99C42A3F67D96FBE6CA8451 1F877C:\ 72DDA5AB6840DBD44CB2CC8220C2E0FB5C435878E00EBBDACF2A5AD2784860BE\ CB731C821D19E28133320ACA0CC9E41AA9DBF1469F6388C4F74A900EA38A9F5C C1ECFDFC:\ AF443E00D6C8BA0A533F9FB284CC69EA9E17787F2B10FA0013BF86D60A4EC0F7\ E9785FB74DC97A779832FCEBC931F362B5DD5BB4B4A980D7609A7E0BEE0D6020 21F134AC57:\ C41A9AB3E5B6EDB0C2D05DCE88C16B2A787A514E7C6FA97DA8735462B25D3380\ 46153732D038F64852A451DC57426F1D5352028A0A19723C514C532DAE4ACA9A C6F50BB74E29:\ A8BFC5DAED08C05725E3ECB19FFB34AB8C4C09B6F2F518A6CB320B877BE8C3CE\ 349A100E5ED9F5AF0BEBCC3C07AC42E55C91EBE9EA3DAA88F5217E6696B167FF 119713CC83EEEF:\ 90E135F85CEAB5AC9314C4DC2AF88585D44A6E395B6BD81365BC2CFA9ECC3824\ 0453BCC543E7A787874B728FE57B6E343C1DB36027A0C87E9B47E803C8217FA4 4A4F202484512526:\ 981BEA36316696B7B171AC9DB6A4686A895A50C0ED1B8CAF1D7975F9A7AD27F9\ CC27F116892DA744BF9A63A354C3FA8F8C22D5FA9BAE936C616BF304DF185CBC 1F66AB4185ED9B6375:\ 893241922416DE44D3D59003765633D0E67C9D8EF9781F41CC5AA2660FB31FED\ EEB64324347AA6D071EBB14668D11837F130C46FB291289525CF50B251D08353 EED7422227613B6F53C9:\ 3F312715E82DFE72C02FA2A28FBF35A4D0B5D7C1945E58823157DFF5E49E621D\ A8E8BBAB4030E2D0510CF31BB1A425E8FBD388004D4A799F2D7685E422CDDC8A EAEED5CDFFD89DECE455F1:\ 70F487F0E5C35B8A9FA623F321296FE230F71B78814329A2B7713F123B00672F\ 1AC73184DB5E484CDB2AF46B9807383629730B8473F519925C3F7ABA799F8B44 5BE43C90F22902E4FE8ED2D3:\ DE15A598296A36B058F59DFA688C15F8A92433710345FD18AA3BB90A38AD9565\ 01ECFCA1B70B00EA0A567B915D4CF6446402AC1E8BF5FE621D2E7F6114094D9F A746273228122F381C3B46E4F1:\ C62E943AC8257354D221B1350648B38F0F6F3DCE21EBD6F67FE1B578015749E1\ E4BA26EEE57FF80013514A31A6ACA6DA770884945D1EEF0E2D1473E0D5AE3964 3C5871CD619C69A63B540EB5A625:\ 724FD538802B6A11BC9C856A55BB4EEC7AD88738C0614D026E24F4883D873AA3\ D8EC05CE38F68CB983DBF3770797F62CBD0F263B3C58F0B4C14A3E8691E2D6F9 FA22874BCC068879E8EF11A69F0722:\ DCF9470309678CB649F9AB976C5B68A4904C5A4FC1B270C68865F3F906CD5095\ C63890479B7BBC086354A8EEC19FA14C67328073A75D7274201E88A3E78104A0 52A608AB21CCDD8A4457A57EDE782176:\ CA2866302B25F886B6A8A82FE84A40DFA5496602E665D3DF0153134E3F6FAA37\ 526A160EC41540E357347252D99AD1EE29762C4663F282C153E63FD7E68D9F18 82E192E4043DDCD12ECF52969D0F807EED:\ 31B22976C33ECF524576854357717FAEA05D3A399A8C6EF29538969132F2D3FF\ 8F91EE7372E89C4429189F8C20FE7030D9A6E9D757192F4263719730832830D9 75683DCB556140C522543BB6E9098B21A21E:\ 456437D984258C4E35DD2557C5A76D4D160F20BAC68C527B1E0DB30F9556586E\ 46425639C7F95BDFAD6C212BF1575165A3658855DCBAE7084297F6B30FC0847E 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5:\ 76330B4267B5D26D2858B4740C317675EAC8603F525B1ADFDDCB4AE9E87B81CF\ 9226BDA0AD7A3043B3A6DE7E65D92972AA1A2DC894F3B4DF6D0080DAF42E48C1 E26193989D06568FE688E75540AEA06747D9F851:\ D48BCFB92AC2671E854C8D23218640BED8C096E05FEDB9505DB438806E6A487E\ D257B205E0DFEAFE0A7712D6B78E19B4A81B5FCF26CC2CF34A1010C26F416223 D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A:\ 50D4671D3737F716647EE911C947443FFB6AB86980BF480FED5EADA0AC43DB11\ BA812EA7C5135BED9EBD5E3ED64C2370ECFB4C01630C48A0157807E56B76C363 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F:\ 94D1E4F3569BF071C876584F64C7A9FF5ACDC7B6C00557A07221F29F16D5EA4A\ 5DAF3C427DE279EEB5C1F5B6C4C164709075D701879307421EF85A86DADD4A43 A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0:\ 5D8B12E9344FC266A237E91D919CD3A7079C7AA6B15198B44C73B5B77CC0191F\ 60234E0DD0D89086ED7E7DF86D0BCF3130321FCB340194942A990C2A3045C820 AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6:\ B1A228247E67BB27F5CB44E18D2AA0D8CD2F1AD5F21AD7D9B2F86CC736433CFD\ 46B954C009CFC1B42B87570E0C14F57708EDE98EA09312D66E4714D46AB0EE44 AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55:\ D36B86F247D80E3F475CDC115CF4659BBDCF560E8197641F1590B3554759E363\ 0D54AA33C8393E2BA1336C8450736DB04DAF38EF6C532A9A1189043A0CF8C83E 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15:\ 8813B67754B4DEA9B90036F8BB4FA9BEED36681250A2C1A91564C76EF6C1C917\ 38FF206C787DA82BFA79F280C2F1D9E086CA8ADA8198E379EC5637835A0B9FC6 FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843:\ D8F858496D6E56ED38418383C762FC1572EDE99AA48DAE2E557FB624CEEE7515\ E57FF3FE72EC98ECACE3B140F502D9C7A2B5891BB80EB5349B5A594470D3031C 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E:\ 1407A2AD0CC06EFA064AAE9E7D4186F7B3D991531691D0DC13B2C81A8687B034\ 67EE1F27D000FFE0D8E9FE0DCE85AD5779E0F827C97A5777D2EC0694EC6DDE44 A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04:\ 5366674ADB264EAAC4824109BC2F923817A2DF058FA3BCE6D91920CCB7E5A044\ 2BF3126688EDF444C1D6CC13AC950EE88A389726A53316E1DF6BCE7FF077AFEB 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C:\ E99A1AEFCC3582D6ACB3EC75FDA02D074DB5D015F84C945C994A92DD2E818711\ 309EFFB6F271A9774233BB9A630DF317DCFABE1EB9FE4FF6F14E8BDBB68D416B 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29:\ 8744C1A732AAC29AF53F55B887DCB340FADEF26CF853C2CEF6AC20E6F278E3DE\ B5AF9C78E6C0B59E2D791CABEB1DFB321104135E0F9F749E6786BE4F4B19AD9F 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10:\ 386223818A80AD962E3D79EDAEB76A7FAA6FFA2F464ABF247335DD75C763D6C1\ 213C0A695CB4DFA3B3E9D284CB4B9A2FC2A1113B3B6A072200614BC10886D44A DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE0\ 46:\ 7F18283782AED5776F2E28EDF83D067DB193260340FCFB08BA2EEF5C8147823F\ 07C00EBAFBB8447967392B17E2B4D6249FB6E454D45BFCB615A80CB503F269C6 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676\ B5A0:\ 50050698334A42BA1DD6AA5AD0EAF8CCCADA992F4A4B14E5229A3AD6A561DC15\ E06D26A899F3CF6977C1DFBB5815F23461ABC29A2A09FE5190DE5E2F63CACD3A B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5B\ FBAD4E:\ 211121CE41BDED281FC05F7426DAED575198C307AE107318A282A173B25CF641\ 31874216A71D5C4E5B66C9B78D8D266DAC1AA7773633D4CF5C41C521AF1A3191 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835\ ED2C2492:\ 55BCDC136A42E740C172545DFD8225C008D31BA2B9B5DE16C36A14D6932ADBA3\ 565549A3B3043C8C8EF7F4DB0BB655A9F7087EE7E0AB4201598AA4EA46F4D256 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C\ 6B2EE4E542:\ EE8B6A342667CB994D579CF80D5BE9D4F816FFFF03BA97B75C9B601FCA358DEA\ 4DA189D8BE7809C248D75600A19973684E2B2065752A31AF386F94E03CD28BD6 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E\ 2A1493D8F4FB:\ 8C84F238ABEFD36FADBBE91253434DDE7A6CF0A77EEABD2D5DFAECCA4442441B\ 498BE287BA65C0F76EAD4EAA1DF115A3A6A0D4DD0453246E486798587B31B140 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E\ 30A934467DA4B0:\ E0D4F5C59F616B29C683B9E6618887AE567DCA178D81E8BE0DD0A52C54D625AF\ 6D6CC9F86E1B0B7DF25B82F3D7CAC58C9875B474CDF9E9B4CB0D4573ECAD90CE 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3\ C0308E29446B8ED3:\ 69DCBDA2A00FD0B92EE7E5B4F36981BEB97E132C8F2E0D7B2B9CD455725E7980\ 0AB9864698B1C0845CCEEEA5E285B45CCE4B4264C0D1FEBE874534170F691094 C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46\ 723B20F67BA610C2B7:\ B99D4BDC59B2F4EB7EC578A6866A88DD1E848BB7D19D9447BAB656C143E7FDA9\ 12959A767E721882A66491299B96DB396F392A688B38DCB020805B8F87168790 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E603821027\ 0C834CE6EADC2BB86BF6:\ F5528D909E8F70C9329989EC9F7A1B5DFF6695467447418D70C63E16E7EEF184\ 064963C4E05B2A2A28D7C30A93E3F54FE63A4288B727D2F13495CBD9734CCD5E 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD2\ 1540D29BA27AB8E309A4B7:\ 90D7925A328822063A33DF2D74DB9692BD668FE06F2A4156404CE252F29B50CC\ 81AF12B49EEF25525FEC69EB010C3A127668AAB32494B6624104E748B2565519 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B\ 32B58EBC38FC2A6B913596A8:\ EBBF87270FA3DDCF816905B74AC0694E354DEE3952E6E27EFCAB42D74B15F3FE\ 49A2434416932A3942AAFB90C5622D608C86275741D35040E375B000DE899403 F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB\ 38467205F5DCFB34A2ACFE96C0:\ 73282C3DF72197FC83ADE5E4D263173D4B8FEF58749BCA410C48485DC19B8E6D\ 34D42BBABB5CC8964E3D8E8F9DB60356C9884495CE889BC90972091A065EE4E3 CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77\ B06CF0F5A0EA15CA907EE1C27EBA:\ 63DCE6FD63AE437494C6F68B3D9249322AB3BB6AB2B9EBD156F22434DD91C463\ D0D11C5484835BFE34252A0B3674914FD89C25E3EECC374CC20B7C0A397C649E 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730\ BCF84D0D4726364B9BF95AB251D9BB:\ B175A67928A446645732F22D10EE101EEA9AADD83BD2BEA38C9E25E1D1F4FF18\ 865578E3115303EEE7857B9D9DECC59AB66F42F2AA70EA8192FE9ABCED5EEB68 D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7\ C7F157298EABC4DCE7D89CE5162499F9:\ DE5D2A161B5FE2E087476CBF15F8DF9C35E4BE11E9A9EC01EDC3818B88C4998E\ B0B4D405E7F4C924DDB3B077410CA73D2E7CD3ED6D87AD126190E445CB97D323 BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8\ BEF788CDB5CF4606C9C1C7F61AED59F97D:\ EB994A487424E5EDB1EC536E9CB93AEDA329C983F484C7E4F1BEDD7CD1142B85\ 191A9829E9AC098313FEB9BFB9DC69F12B2FB348AD3903A170EE4567D13CE815 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D37\ 86E779CF053C77785AA9E692F821F14A7F51:\ 48A20D309E2F8F57C6EA2E0BA7CFAB190C1DA0E0E0AE1FCE67D1D9AAC18E81A1\ B7642A3714A355A0FAB20266D67E3170BD0F8D09F8382760AC4758279AC49CB6 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB4\ 43304FBA401EFB2BDBD7ECE939102298651C86:\ 0ED3A9ECAE74DA1FEF8D0A589487B0EC4427C7D6CE39860D13B26747195CD272\ DC093C40FC4B655406FFFBDEAE9311371FA2628EC9983B0B57AF62B285BB6C6D C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E7\ 87D68D28CC3897452F6A22AA8573CCEBF245972A:\ FCC42400748C3911AB68C19FFBB6C7849ACFE78B524285143F4C136154BC5164\ 76B57144462CF89EAF1ED18BA1C1E4C56F75EB688D686046B8EFE7E26373812E EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B\ 22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52:\ 55F603ADC026859C471A94E0C1B604A9FF080D0609EE3C0BF9484BB8FBBD7C8F\ 54F4B8EC470B77025C63BA5A02528B715562627268AC42F04B8143D26EEB05F5 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7F\ FD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33:\ 1129594301D1DF777FE7998448DAD08AD3A8E4FDA94C35AEADE6615AA1982A5C\ A07669C873A58E623C0C386DC72630A350B0FA5520E7CDA8D36BD506D5B24DBF DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C\ 9E880B96C574825582E8812A26E5A857FFC6579F63742F:\ 9F56190D40C0964F698C06D824A4C402AD47C95418C6FDF43ACEB9AD7D092F7F\ 62FF9D3F0625E15CDE1CE3E6118861449390B5AFE73B1865EC4F1F3FDBA89BF8 EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2\ E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF:\ C74B2D83470EDF076ACCBED486888CCBB98E6693F9BCB54210CDD181A834CFE9\ E848270D985F883232D682F05FD225BD283E90EABD8A493EC713408EBAF34AE3 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC254\ 97D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E:\ F1BFA1067FEB68DF42C69CF4944E2F57BF17291086ADBAD592CC0C80C4DC0A97\ D2A9B001BA57AEA4D81E892F54BBA9387FFBDF3A86250E81E5D12406E2ED57DE 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66C\ A376460E100415401FC2B8518C64502F187EA14BFC9503759705:\ C4915196AEC17B0CD50C64D214CD4D20CB7ADD653DB9C623B76363C8D14B8FEF\ E0B883B3F36C39C3F9E18958B0558F0D86FC6D4A52BAC59B74CB58A68D4C8D8B 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA831610\ 66DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A:\ EDDA51E38622C3DA0F007566F51F311AE06492C9D87F3190B0D74DC44348B1D2\ A8A6179AFB293C0205C3EDA1B5669CD951F477F885573A1C8C8D322BDD7ED5D2 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D1\ 4C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D:\ 66EC650CF34F084FE71FDF06FB3BF4BD17E1EBD545E878984125C31F862B939A\ 3AF25B37D17732C3DEA4C2A8845EF1C49935F0473AF0551AB54950A8B92980A7 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFE\ D51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D:\ 51FE1EFC5C659E5B7F94BBBF06078E119F4BBE8A40526F9A692AE970A58A0D24\ C8E67B94411109CE0445F425E24C94A52DF48338E3943952142A4DBA625F4BA0 C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB325\ 30C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D:\ A22E76813AD33D1CD84F1BC536FCE8CFEDA449E02A67D4B58F96C9689389EA40\ 688A785991B90420F4A60244FBBA85CF9677D519FE7ACE300199B0CACE944D46 F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E\ 05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA:\ AB7A725BD93AB805D89D81EB6766E46E1A0045E654B82B389E6B481EAA7D26FE\ 39A471CCF99B6E87EB8E2A9C0D7CADAD4B2CB401FFE5BD85DE8D0235E8B5BDFD E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61\ E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7:\ 2DF35398690D99075BC67BDE85D7CDF512DF9F05FFF16CFD1AEF3F7E641961E6\ 0DAF81FD8F9A625FE9149866FDC69F73C58AAE9F758AB5EA3011C67649E3F0B0 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652B\ DF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC\ 00:\ 342B05F8A6BA4899E48153C11A90D3635ACA67A5852E706ECF2EB425D41372A7\ E62BA8EFEA5A6D5C1A338B060C3299A134D1D9139E3D96F4566A6CF15582DE22 FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68\ B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE\ 37FC:\ 81119F5333D909808F37F4D9C00DD2C9B7F9B32608C6A517881155387A51141B\ FB945285F29FFCD79799B6E76265FD1940CCDEC9A591CBBBE19204374A533343 ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E332\ 2FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888\ 599BA5:\ F8225F85838F81B6114F30B69DDD4668D7BD8BA357D283B4DF178380D8AAA0B8\ F10B6E85AFB7356C206B43E4EF2E1B1EE0073A4BE042AF3F94C489902AE9C5AA 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B\ 479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D4\ 40706B05:\ 436067709B778CD3B60934649C8942D1930D74C36F8308686FB18B39E01DECFC\ C34EDB363D7EF2FD51353D571BE1019F119EE79A5DA61898927E6DB5BE909D69 ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E3\ 29C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB\ 31D06C77A4:\ DC4DCE2DBEC1A6E2BFC964C6F7D2A58F0A0718B0146BB3E0611D6D8B7269C357\ C508BF5F1A3723EC373A7B225D9B9941134B2F6D649EBF0E8E1B69E344072B62 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701\ EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760\ A259FC4FBD72:\ C382A4AC5F26F5C77BD8908AF7AC65C596BCCD16F08D74B5C9CFF3582A1B8B05\ C7AB4DC81C564A856E1F364FD2089DDEB5652C695A5D567177463DADF8F5872B 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFF\ C3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CD\ DBE5FE9694AD6D:\ 54BDAFE6E565E86C38D28F6C9A39B4152033F87206C50B6A78F9CE41501F5A7B\ 1DE3BAF6B1A41251F95A859F0106CE5B9226CA73BDFE39E947AED902B5038715 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801C\ E25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC323\ 7EF57B91397AA8A7:\ C326014CBAAD2173D04C15C8F33C864EFD5A9683A360DB013387C85B01277053\ 02DB83AFFA28790AEDB2EE9AB88DA895E2F4B0F50180444F13564903D853F989 BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA\ 7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C6\ 44B78B2D48DE1A08AA:\ 6560BBB2164B7A1D0B322618AABA50C12B331F82C2A2CFB5A3237ED9D51A19F7\ A0D4E6CCFE13C6C068B18AB38A3A635E2548F705CBA60176FD6F2D22F32C4791 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075\ DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1\ B3A6C9FED24D70749604:\ F9EE46172FB8F055AFD51FD591C3EB21083D21D6C5B6EE4061CA8A54BEDD5A75\ E4E086F962FD9D9AE62FCF9390AC55858AF2E94216A3426FEBB5ED17D148EA88 BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5\ A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D\ 8B033F77D384CA01593C1B:\ B1C25A6252AC357CECDCF955EF97DEFC6161E1B813EAEB502AE4CEDD0329EFF9\ 54A037FDB7C32D7F4B1BB93057A5503D617768E0A7FA6DE9C3876F43F2B36FC8 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9\ B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603\ 013C23F1E9611D595EBAC37C:\ 2CA0D306ED30D5B37F7AF61E7F2AE1E9485EBE90167D7C270572D57703823B7E\ 63EA55D90D4197A6FBB7A7A1FC383FCEFE9F7B291722F50F566D4D4EDEC36748 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F\ 9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE32\ 4EC5A49FFDB59A1BD6A292AA0E:\ D87CDC2DEB84E484322C08D2CD8C841B0E2E8A06510188C42724EBC7F92AC2F9\ 72849C963839FC20625FDDC74DDFE730BEB7F1AC22CFEB9C08083FFEC5F7C171 D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAA\ B725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4\ 498E1F6C82C6CAE6FC14845B3C8A:\ 6D7181F90BD05CE2CE59A4AB86253BD919F8155381E70B2885BED000C3171328\ 3390F147805E8556BF9C9CB6399236166C82CB8572B1A3146ADC4EE679AA3F17 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C5\ 88435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F\ 5B01FECFC146BDB251B3BDAD556CD2:\ FF5B17EE99E24C74058F479257CCE7A381DAF407CD967903C801647EA60EBF1F\ E910922788471BF1E0B609280AE7A7943966FF2836FDA6989057E04F07A46498 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1\ DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2\ AE9CD5CF0991878A311B549A6D6AF230:\ 06EF93E8D37636F73D67F4230160914ED05CD0CDBADE77BD69B32E02C6A419FC\ 220F6E71E1B269A76A1F7F4C4E3CB49C0E4C3CA3466C58C25E2930C71DD1BF0C E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36\ 105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615\ B50C7C681E773D109FF7491B5CC22296C5:\ F52A2BC9DC33EEACC30211F4B92E882AB8DD761394B1D09E22A91684319EEAB4\ FEAA71C24CFA11DA3ADD047672F19D47B48C90D50C9DBF5E2C0A50B995CF57AE E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB\ 190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA970\ 2C7CA303269ED14014B2F3CF8B894EAC8554:\ ED3D326E1E618D140BC3AC49DB60C96B4D04252DE2D44DE3B414D8F96C05A6E3\ 7C82B1DC515DF1CF784AADE0201259CAB249924776C7C4E0612240F30DDEFBDE 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983F\ ACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA2\ 1C7F8016B93BB9B9E078BDB9703D2B781B616E:\ A811AFFA9ECD8D88B51AB201F0FC33A137ED91F0953E819F9BACFA19BBACE506\ 44DFEA77823BB9BAE5D6FD79B81B0AC7F202A386CFF6EFF9E7731553645975B9 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF1\ 8F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC8774\ 37BE5C2436CBF300CE7AB6747934FCFC30AEAAF6:\ FC3AE8D1C50A634D96334E5A2371CEC832557B0C870CA70E08DFDE5922688008\ 6E2A38A483FD1CE68C2085F804FC0C29417203CB5223F69A6DF20292DF13721E 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903\ B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D327\ 85EA51D49894E45BAA3DC707E224688C6408B68B11:\ 507D99CF8498582388396E9DA2103F885EEE826349EBD8639B37B133877108AB\ B1C34AF892D1676F507EE40171DE00502A71AAE08E5222858BA4F330D2AA0393 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C4913\ 8E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB\ 04E18D475920CE828B94E72241F24DB72546B352A0E4:\ 29B639522730DB5E24FEEE90619BB57274871EF65FFC8C98B57CF6EEA0394A2B\ 7EAF3C177108E5DBDA22165C9C80BB0BA408F1E66603D0F9D48F22B3907E2122 B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64\ CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2F\ BC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C:\ AAC3A8FED5D9D887EDFDDC24477A9043CE1A66BC58324AB1539C5D8E82259332\ 77AC3F8F99E69233F12D8CBA7642A50C9D12D314027385D8D2B743C884B27D50 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F\ 578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD187\ 44C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D:\ 04B926518D363B85967CAB6A9CF36435EB6E06D987A023F50D8A6849219ED452\ 760A2997E7C7E4B9A4D2818B617CF81E7F406AEC7D0799939B6369390CF47D8C 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72\ F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C512518510\ 4F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD:\ C70C68FD238DBFB07C9CE17DEF173A1D5BD41B49DFF3D401FA096B421E449926\ C7AA366892301F2C17FB6EFF3C1C7AE8637AF2F4A739A748AECBE1463FF5F0D7 B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5\ C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3\ E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7:\ 21CF4A6B86445F9BD8AD570ABE6BBAB75F6ECFC3FA6C935BE968A7F6E8A00F15\ C4683300FD07DBD245250CDE363D9478CB8F73FA0443956F666BBAFAD7F05190 CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E0\ 5077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE87\ 27B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F:\ 2915D4D41FC7AD3EBBB2720E8D2789984F800E5EBAE0C9376D0197B95B81E064\ 120D9A040D2A7A6320B4CF06C6676E5923472B8FA5B9034A01AEFA48F41DB008 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019\ E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1\ A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523:\ 1DF71071B1815DCBD17C3B486FA0328D95D648DD58C9EDE85CD6AA0574E74D35\ 151CA6A984C8D46B0CC1B9310E22092627D8A831AB9551798963A6301420F9D0 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540\ FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE\ 29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26:\ B29A8B98E99E794B841D7525F4DBC88B52982642884B367F316AD2C611D1E3CF\ A5D0547BA9FA654A4A345AE7F2C39736959C217AA1A07DD8D6D0224F4BC6B385 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086\ 650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90F\ AE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374:\ 6233238EDDD88518DD42DB92974C53386350172A3EE9D84AC898BCFA6D8C148D\ D3EDEEABADB9A37D1FC95AB991F737131748CB969FB6F60C57826FB48CE90DF0 E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B\ 7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE198\ 8E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD:\ 7B13BD46E765B6BFCB652B4E8CF60ABC47CE6ADC26264017F906EAFD45FF7B5A\ ECE954205F6F74EB696DEDD0C8B24AB7B5D86F4E21F2AB5E82C42CCB3139BF6C 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D5908\ 1587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8\ 040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600:\ 11CE4D9928E218504F4823B98BD9C90EA4AADE88B34CDA898C3470E0F8277DB5\ 16A16E5A890860FD353DE84C81CBB2D78443A4338582B98D26B33D516ABEA998 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D1\ 0FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB\ 0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F\ 49:\ AF2A7EAB5EF18F204497D6B764937EE14EEE7A28C37DD9CB816E8F937530AEFC\ B8A225E3255518A4199270D4F5477E577B68FD0E7FE4B886E173A5B84106780B 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C\ 0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB7\ 2D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F62495\ 5B52:\ 58B2878C79A8CD7AFD1FF815204DC38B4B483E5E543C16C5E45B55EEEB037552\ FD50B08D43ABBA3AF6E25C49617AD8170C8FC0A5B9593C6A0CEE8C767ED032EB 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBAD\ B885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821\ C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B20\ 89CCC1:\ C2FA1BE8AED5582F8E39E922C3917A4E030C8FBE07CDCD1B8888E9590DD31649\ DE2B03DA03FD4F15825CCFF82DBD6D600C69B4872A843E2B121981BC65E0A20B 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B982\ 14B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F\ 22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E084\ 6DCBB4CE:\ 3B06E7D687E0F3C2F6A7645281F467D50853AFB2A87BC73408BA7951598BF486\ 9598681C05B941049C1B106256B412CA6107200858570032E68104318BC5341B A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B14\ 7A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB\ 881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2\ BADF45685F:\ 765637B71F0546AEB0394BB91FDB8FEF6DD85ADFDE6E06A321DA24033EE8E3B0\ 403646F863F97C6BB9CA5B8702C6BCC691DB182D38DB19BA2B8595776F5D775E 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E\ 312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE3940\ 96C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C\ 9B62C60A4771:\ 278351D6F90B051AC4804C8D85A30C56A242FDF1DF556773F7A1A67B6BDE8D6E\ 49625D70EC13C9FD974D36C782E24BDD70CABC84B4D7D7607719E6CCB88F5611 F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1\ A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA\ 9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6\ CA58D5DAB38ADB:\ 252C064C54A56F4C21888CA2F1B8CD3F56D46C7A8BD65CCF30674001FE58ECF5\ 2FC0F571B8FFEF4C8970A227F39F8E61CD2068DFAA79FF86CEE6032E020C1D0A E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486\ F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826D\ B923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A\ 21691E1069413848:\ 31CD4B1BC499BE3923D020290E49A9B24FC4A0A7B974AB0BF2447394E193854B\ 9C575D4F8DF12C96A9A1CE2E74B6BB0D731D26CCCD7044CE1D6D7580CE440A4D 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619\ D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207C\ FBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924E\ B57D6D0C2EDC4E78D6:\ A1EC50CC515D21489A34BD69C88F2C45EE97B0A39B9AAAC83D3B008FD856ECD5\ 661A78A46DC73D87145A3DE34D702E1E6F08B9B4E52E5A0042F4C71865448C74 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324\ CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA26\ 8CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20\ CD19E781AF20454AC880:\ C0F9653A4BC7526DFA97E4EDB6672B04864195BAE6FC0A1113A3B83DBD2C8855\ B576845F948302947E7EFD983F49AA802A21DFF605EC22465B47E92593B7699D 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666F\ F5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9\ A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FE\ BF0FE3C32C17AA188A8683:\ 6DFA000A05DB40B04F271AD4E92CDDB5283A69D0FDD6B6AAB44930082FA594D5\ D5F399256953CBBE58679D97BA976C25C766BB1E599BC0B53D3D2B16A7944BC5 F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440\ E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E0\ 0A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE0429\ 2E937F21C005F17411473041:\ 5F6DC10F5C7794D94999445A479B1DF6C18E418E0C746F7E7C5C2CD07CE7BAE3\ 723C9146375FD53C31D30B77BA8929ECB4F3F9826171471C5A0060874DBE9221 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D8967\ 62992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF61\ 2F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D\ 29F695815D866DA99DF3F79403:\ BE3AF3DBF048265E9A4D4CF2BE74FDAF4919FDDFC787DDE35724C50EED602480\ 59539FA0D291C7FA0782A8BC97FEDF4BC77B3359EB0A6A21A7CB1E157D261A6A 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF\ 84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D3\ 3109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C2\ 1BB15B447589E86E8D76B1E9CED2:\ ECAB693D40C8312BBD410A6242020071943AB43AA4229D0881A947C607DCB482\ 1A3FE66742E5DDF9AC5041DA9B1606906957C29CC487E36437BE176BBC4222C6 F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF\ 4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450\ 853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618A\ AD3D7E886DEA4F005AE4AD05E5065F:\ 059858C913729529293D386929071854485C703BF352A0FCA529779E1207CB50\ 5A8265868347322C303A08940202D386AA6E88753697D7476EF3A7A638DB71D9 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA\ 7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC2\ 68A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7\ EAABC35F5C2B0A0F2379231953322C4E:\ C742B9B057466C8A36DA533AC0B518D9C650A9FF6E58E9698FAC412D8F300373\ 61DEA5E178F0BC789778804B1976D8F8DC1A65B68212EC5A6F6EDB1A5DE88951 BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE1\ 4E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E6\ 2BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A\ 159388D5C3277E227286F65FF5E5B5AEC1:\ 7123CE99542416A1DB471CDC46CF2120C78DE65114E14D0E91E5FD8C323D58B6\ 6A7D78BE1030904AA1E4F157D9ADB333C01C02F84C0C49D91073178A9F677976 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488D\ A73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1B\ D168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65\ 407847DD0DA505AB1641C02DEA4F0D834986:\ B5DBA1E9D437D57D6D8F676A89760B1147454E9E492092CE192F5BDE015FA8C5\ 4361C3E651F76621332817E6B7B9081DA9818F07B3DAAC9C9E34B6F65F349ADC B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F\ 33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD47\ 99223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A\ 7630BE61CAABCA69280C399C1FB7A12D12AEFC:\ E69B0A4A096714DE5972E51831D6A0A47BF0DCF390325C283B1A78FBB0AED2A4\ 9C3D0EFEDC048985EB5B256D8BC6E1B19CD42ABA2BC18B16FF6B9CCDF45D15EF 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183F\ A201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C\ 2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3\ 205AA1615DB44057DB991231D2CB42624574F545:\ AD134BE6908CFB23FFB8920A7993F803B750695AD7195667B9BD2A09ACCCECA6\ 8B67DE2D3312C8FB04482F543BE20F4F1B216887F6221A452B1D93CE246AD384 DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2\ F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F\ 2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224\ 157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D:\ A6D9A83B9A6A258F012844ABB76B5A53B5B06E0E2A2802CBEB7B29074645B736\ A023FF8CC71627915FCACF734C8BBB6F68DD6FD0E76E73C7556DD5E8D8EEE6F6 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F312\ 0EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D2724\ 0BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D099\ 3BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7:\ 1CA44FFD7C894F103CFC3143C94FFCC6BF3B5C9E65BC6E5410D446ED5C72BD66\ 6197CF3EA58688BF06C4BFE3E73F9A3F8CAA5D6CD284E4A5E03E1313ED670B6E 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49\ FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6F\ DD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F\ 46176EBF044C4784467C700470D0C0B40C8A088C815816:\ 7652A71EE36CA1E3D99AD8868D2268BA933314E1F2D1ECE6E3DC599B9FDC4675\ 3C94BF2B3F76587B13582D5F75C29BDD2BB2FBB957AE5E4FD0F368E64E377D3F D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB19100946\ 91ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E65344\ 1187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67\ EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840:\ F6BF19E74ABEA64AE336BB1F425EC1D58F743BA700B56EE7A22DDFFDBED3FBAD\ E27FCF7B9A2797D2B374E769D632FB245A9E6457151E5D63012B9B0B292CEB93 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F2\ 1B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367\ 285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC0\ 6624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25:\ 1F7AB9A67B8664D588C3B798322FEE18ABC43F9C064B82C3394409096901E380\ 63024E638D1F4F4AC95A22D0B0165A3EFA5633A8ED301EB861F908AD91D2AF5F 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F\ 27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA1\ 9D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EA\ C6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940:\ 4F44285FAFBDA04FDDEA743B76C3C4DD3C9A0155060A666E3DF796A5322DCB9C\ 055971B5FD61323B8AE8A6B64680A7D71C5077AFEF83056B01F57F426CD17399 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1\ BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638\ DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2\ D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F:\ 1A088A13768FF64F5A63EF623E245BC68A0AC64A2B1FE9EAB756A051CC9CB877\ 3056736C20E4E51C17CC83C69DBC544BB4F095593D406066B16C15A53A8A22C7 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D6968\ 8F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C53156\ 4D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E9\ 47CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2:\ A7B7B719AA7C335B2C96890C1F40BE4FA63278C6396C9A244556D039AA16A862\ AABF60B417E95003DA542983C2730A8FBCB2D9BE81EEE58D33B488CEEA986005 A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67\ E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D\ 2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301F\ B4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E:\ 7CC4A1F7B43334E2BACC0C2DDA214A4302DB5021F176C23518CFEB5F9FFD8B14\ 9217C297A83AFFB0E18671FCC82094D14AC7C08EF17872CB3B4E4F380FBB75A0 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F\ 5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED5\ 4A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644\ D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065:\ C12761F00A8D1DAED752FBC278FF9FB6CC2366F07DB2F7A569EC4C4AA70571BB\ EE078FF0D306C2B9FF50F14F6480BCA6B9855F2A2B477F025ADEF29736DF8154 A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC2882\ 07944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC\ 6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82\ AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B:\ 40C3E38BCD69664A45C84A848C676CD489BC420ABB6140DBCD14AEB82F3A5266\ 4FD025F26B4DFB52C99B2D88F734DF113B3ED32884E272C0C68A2C18E2005E56 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C141\ 29BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CA\ E275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF281\ 98E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817:\ 832FA35E6AD63AB4C1AC025496B38891AB95986A7AE6DEDEDE9A528D3F0ECC93\ A8C5AA04863487C827A057ABEACAFE3CE411BD49FFFEA012F90C086A7E55825E 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD2\ 3431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CC\ A9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26\ B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4A\ E2:\ 591A7FBAF0B560A42C7525552AFDEAE41B380FD9701105976BD5701234F6EC7D\ 1F800B35744995CCDC79AEF4004C8704A4B3ECCD700FB68C40E4D40633A2BFCD 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C65\ 1CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A\ 3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D\ 52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC413\ 61EC:\ FD13F95A40175A4DABFED7C47B07599BDC6755B83C68CF391A6742E838E590DA\ 126D8F1D7D69A9AE69993F51AD5F17BC8C895063490ACA07339A281D9FFA6FDA E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C3903154\ 9CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B7\ 2DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA\ 609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B\ 9B5EDC:\ 0CD73D5E4DAFC2C8F1470CCF0D91EBED9772E5E2A125D79B135CD0A86771457C\ FC025D6ABF6DE194BCE518F47A5BC839F8288EB55286478B724D1A9AD6AEF7E9 FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960\ CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828\ B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A\ 63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB755\ 42D75D68:\ 0235C1C7D31EFEDAD8823F40A52516AA7145AEE88D4250B0C850D9F7DA31AFC2\ D7D500D81C69149D57AE2353A8D85D898E405528A7DE8001C42081FD76519839 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587A\ A1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825\ BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23\ E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA\ 7815BF3C49:\ AA46F3CF5B63B99CD18BC0530A2C07234897A8C46AE5B0D2CC86ECEDD79F2824\ 845E2B4A60B51C925F152643DA4B3824A1EF30BDC43D85F9B7E1F9A1F3C6AA15 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B3285\ 61531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383E\ B497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4\ 025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958\ 951CB2068CC6:\ 922642EEBA89CADADEDF8C38F1744C01726FDFB3B55AE4A5476B54254B7CD9A1\ 80725F3381A6454549338157565EBAC088B29738885B4F1FF8FC1EBAC7D56DA4 B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732\ BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E7\ 93F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215\ AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3\ B0FED6A8052FBB:\ 430921B199B2C4180C841EB09EF3CCDC7DC80793E43D94410CDA5B64A251422A\ D787F33075E0F6BB18E1F7E84B1A7E7386B7C65352AEA14BD67ADD03F09A004E B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F8\ 35D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622\ 780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD\ 015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB\ 37674C6F8E380C04:\ 173BF476E53B69168626AD53CB84FFFA6AE8E369499C25D38599C3B3FFED96B5\ 39A5471A31E5F4C0457603FA880B7509356931C166784AF0BDAC4F68684BCA29 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00\ DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31B\ D0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5\ F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3\ F22DA873C601016A0D:\ 1EA4BE40CB78E3C756EA962E4EEBA36C3469ECFFA40D892109FA888B5271855A\ E37BAA5BE9A0D907AD081D1644929CA0DD16B7A8BBD0C3D1B6C3515BD557608C 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBAC\ DC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270\ 472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E\ 994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F170\ 1373FB09A1A6E3C7158F:\ D57DD56F6F4D55D3DB07030F91F165086647BEDC07240C66203F6BD328F7FCF4\ 6459689568DB402EA6F29DA1646EF2576876090E656200B4489F408B55DCFC99 FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41\ ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA\ 084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943F\ B4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F\ 339612E830E9E7A9C29065:\ 8D75401D0C8F186789832ACF148F4FA1DA028BF0EFAABD51DACBC1678AFEA1AE\ BB4FC0EA546D176D83205A9B7CE9A249FAF88DBE51CF0F92DB4A104DF36DD82F 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7\ B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B8361056454\ 5642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA\ 8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60\ 377838973C1D943C22ED335E:\ AA91A3A6F5690587FE1EA55F02BE20945DC1EC839EA1486DA2707CDA5964E8F8\ BDCDEE1D521932675049442E1B8350FF6C2A20C24F302BE5C9D1BC8B03494050 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297\ 725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46\ 798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED\ 8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F\ 2D0C9E7448DE3043AE22FDD229:\ 31A4C95CE728866CFAF05DBC65ED97119CEC99A624B191AC5B1EB998914B7B29\ FC09F71FF2E01510E88F74D04BB58CD741D3EFBBE5F1166B5C9A2045DD84A9C5 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389EC\ C64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5C\ F441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63\ E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A\ 5B6C338CBB8F6659D342A24368CF:\ D1A28FA6FF25A8EB4239887C3D845EDDFAC6CBF1339FF91FE83663DA1A5E5A84\ 9F32D136973C38FE9C54230F970D19857D972A3EB86E2D64B2B302C0DEFA64FD EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF\ 76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335\ C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9\ E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24\ F6954BA0801A1294CD8D7E66DFAFEC:\ 9F022F46B468702350612A04A8E42E89452558FAE89FF2DC1AECD210F4C22120\ 4A51FA55012D22FF690C955D618B2819DD5D861EF59E17D41693B4FD2D70B981 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5F\ CAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080\ 055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBC\ EE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28\ 256FB33D4260439CBA73A9479EE00C63:\ 4F8707FF2D414F80A4DD66AB12A8EBF1564AC406A5872AA6857B8BBFA00DFF60\ 57FE75E53E0562D9243101F2094E68194789A202C5A47655A6D2DD1B426C5EC8 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72B\ D8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BB\ A552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8\ 911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A\ 5994C1DBB3B5C7871A11F5537011044C53:\ E8FE68B74A9922464E45AD08493E2E7462AFEC671C4B7425EE5E873BEA5339F5\ 9E009E26272291093223B3482FFEDC5ECFD2832A78569D7DE49B68C51813BCFE CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B\ 2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460\ 586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B1\ 4C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C01167\ 4E53426CAA453F8DE1CBB57932B0B741D4C6:\ 08B9D5DDC2F758631C065E553B0743308A1FB943937CB0AE15F75ECC07C40CF3\ F2D274D2C916FBFBEC1C262B07507532B8330497AB5E27FACAB58616647257F3 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E\ 868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA70\ 83872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5D\ C9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1\ C09FE6A1FA13EF3B96FAEAED6A2A1950A12153:\ B05977F9C735ADD58DCB98B1BB0340BABBC0392A2629639DF4FA2096072AE885\ 2219BD23163D9F68A523C88B57DE5C1FF0BFA548DE552BC9E1D1EEBB12E1B068 EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959\ BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DB\ E35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4E\ EBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733D\ CB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26:\ 20ADB45EE45E35CCC5570F3CAEEA09B1E921CB0DD22536A69CDF20D39B608F28\ DA161D17FEE70E0064886A5522EE26A1CF215F63802CD0478AE017F5F6DB4ED0 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4D\ F1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD\ 656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC5\ 46C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A0221\ 8595B3658E8B37382BD5048EAED5FD02C37944E73B:\ 18B458490EBF71727CE479BD7CD8F692CB93CBCDD104E371D4FCB12AA3EA2EFA\ 8FD779C58ECD1C321E2EDCF991A4AA4DBB8C35C8DE98B52D898AA0F6087A82EA 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C\ 7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5\ E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF80568900\ 4FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF2628814280\ 99C7FFF95B14C095EA130E0B9938A5E22FC52650F591:\ 15BCA0A37F93998CFFC0AA8A306E76B2376C7D03BFFC3F274BA8E53F726A4276\ 80C2AC88CB02D48708FC5026C8D656BB5863A96748FDD04C438CFF925863F7DC D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E\ 66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676\ B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A8150\ 67FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744\ F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48:\ A75FA73BE8F031538E968BF59DFD1565EDA3D35FD168C37BB9B2F289871FF775\ 8BC29A58357486CD875C59FD41F7B484ED7C2580D158176BA452805CBD9302B9 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660\ DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E720\ 1E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE\ 48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B25069\ 15BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717:\ 327F1487A412B861E53047F755B2D6FFBB119AC289A40E4B9861E47B2C2C0922\ 342A4005BD85AADB9C48CD899DB55E156F13C409034D88AA1FCAC59FDFBE06B8 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23\ C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D2715\ 7E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC\ 66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A\ 5503FA829F707272226621F7C488A7698C0D69AA561BE9F378:\ 74C782A54600C154B0336297058646F0EE85A531BF0C8D356F0FC96D90421D47\ 014FFF9F81EAEEA6DC90BA4860D6E14E1A42635B893CE64461A4D44CD92CD48F 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC2\ 7D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3\ BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F0\ 1200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F\ 1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA:\ 4603EA28DC3A5C1C8E083726202C51C1B763F7D09BBED5B8FBAB0EF0F816E27E\ 4E0675FE8B64C7DC356CB248C1214D40239FCDC1FB49B77B94F2A01A4B1F247D 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D807102\ 9810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F550284\ 0370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4\ AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC0\ 45B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597:\ 41BC57357D866202927DB08F16DCCFDFF89A16498316BDEF586D5D92757319BC\ 189386C763EA2961D10C2FD0068C1C2C73419C309547A21EA9854E11275A0E2E 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462\ D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB\ 1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3\ BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0\ B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2:\ 2C811EC09D88F5DEBBB908E06D7972F536E704E6CDCC389B1F54D7B34A727B40\ 2C0779E4D41CCEF9F4D9E3F93767DBE1462AB109604F95ACC89C418E8DD40C8E CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B44\ 60186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58\ A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1\ A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA\ 0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644:\ DEEECAC666AD939B3A8F1A00063B26FF8AECF97DDDFD0AFF77A63847CA7DB09E\ 279BD725E072B40BC2FF511C2A20146EB4B292FEA9F8AA2E4652F894121C2257 F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C3\ 10EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8\ AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2\ 568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B1\ 46C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F:\ 490F734EB6640C36498A1AF2F941A6791DBDD2B1FAAFDAAF6DB82AADEC20A650\ B750DCEA117A3F009AEF83CB4262348F97B3AE01098694BF857A4C78C19BA56C 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF6\ 8E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4\ C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C\ 4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D5\ 01C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1:\ AEEB225218FAAE867F637DC9E7134D8213A73CA5D91B5512D38C553D8329D797\ 0A590D4F864B371F94C5B3A1ED815D443CB24BF0D6932782E24DF80BA53FEEE2 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CB\ CA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57\ FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C\ 9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D\ 447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E:\ ED668AF5C6EF4115A4BEDFDBE8204BB379A65ED35B2F4EB5F26EF605B93BF3C0\ 046CD5C5C2F00BF8D8B99A07C86A489FA333057DDE1A3C41EBF77D2C88E11BEB 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E\ 74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD\ 5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05\ DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80\ A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019C\ CF:\ DA465F237A360DDD2CF8E75E60721481F082FFE4C17478F2D0EBF70865DE5743\ 0445C5940B1361FFF0D9EAD681A0B1F3600D05383BB25E53ED6F5E5595A87ADF FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446\ B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B8\ 5FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E\ 71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269\ EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F\ 1DC8:\ BE6FF2738AFB06EE4FE46C11629196106FF3D8D9FE9871688B4BA4E988527652\ F6BD6B4EBA4007CA3A6334998FDBC4D63CA5809104334095B23841AF69601209 E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA6\ 54A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E\ 009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A\ 2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A91987\ 99ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4\ C25E88:\ 0D4115FB73C9351F4884C23543283ED210451A04AC3B176E9AE5AFC5CCCEFEC8\ 4AF6D576C92C07451E76AB7E61EB6ABEC182D864DD50CB161F6F9E832F65D9BB F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A6\ 65E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489\ E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA7\ 3406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72\ BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3A\ C5C06729:\ 42B6A6A777578717590252D66A09839DDCCC8331BD8A795138A62B8CA5C71122\ 6713B68DA855233AA2D2AC0660C11F29F80F8DBF13335D0BE35301C1968F081D CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E\ 68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A\ 6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24\ F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D\ 551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240\ CFE0AF93EB:\ 3F40B9FB411C50279F73EC33332330C216580A5C3169D7188F6B1DE0892D8CC6\ E80C7BF1EEA707A71D267ED48A137961FC329A0A32050EE915706C235E487153 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7\ 331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC\ 2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3\ ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A\ 05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181A\ F467BC75A9D1:\ 5B1D609D50CE4FF4362EF96E32E0798385780C9365B5B1B465EEC5C0FE400167\ A2557F64806DDE296C3DEDDD4B18E5EB90BD1BB71AE2FDBD081D10003FD83960 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22\ EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286ED\ A20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750E\ AF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6\ 513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177A\ C6F4756017FFF5:\ DDD1A7F1D75AB14D1FC1DC6A3E865B688DB53DE4DAD80BE67A10AAA97CEF308C\ 8B57371946B200E795C9E74EF1DCBF43A24771ED0CF2A58F602BDDFF6BB88345 C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066\ E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DF\ C3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256\ 798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB67\ 9D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E84\ 45DBA58E6CB2C8EA:\ E3977556DA6A520E8A862DAC38AB14E67695D9AE3A55AA52AF9252FD8F36BEA1\ 09A6A7CF2DA9EA64721D471BD666F0BBDF96447B0B8D4C1F03DECB5BD418F7CA B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910\ C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D\ 01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A66\ 86B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D29\ 10B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92\ E8419D48FDFBD744CE:\ FC4662DB69023866D710713E2F634E0EC99B0288B7B1496FCF3C726AF175994D\ D5AD71E90C3C174EB598F998117655F07BB474910110985AE85D14420AF97B1F A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A\ 7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A\ 6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F6\ 1FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD\ 4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F\ 359D5D1EEA105F28DCFB:\ 6B14336AEA148FCF74C6EF17FA36264DCA5CC116AD6D6A9254E329248684BC7C\ CE81E4AD67D334D668805B9E6298B7C886CBB06C028FBA6A0B075B71A40455B0 E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C64\ 2BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF1\ 6B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283\ D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C\ 8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D8856\ 7ADFB974EE205A9BF7B848:\ 2BB8562945A3CEA1384A4C7E1471614B9FA6BC79BDAC7595B3CAC498F624D9D1\ CCBE08239AE30B7547C1BBA549371A85C8F7BBC7910FE55D7A5F92A6A39DA8E3 B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323B\ E75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024B\ D7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FA\ EBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F748\ 7743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588\ EC77F29D211BE89DE18B15F6:\ 19AF9ADD1D377D23E11E55EA8A39A79B5553809868F9AB79E177CCD912657CDD\ D7E02853CF25A315F22264C93136BED99A42B098397BCAF1DBBF876863F988DC DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F\ 4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD\ 49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D5\ 9DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE\ 50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF\ 63EFE793489C39B8FD29D104CE:\ 662E04B018416B89E6977558B11772DD7A7450FBAD3B47810E54C30F077A7D37\ 4AFA18753C39101B73DF363DADDCC5C2333CBC39AD73165A1A8EC0E8ECD26E37 BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28\ DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E20223\ 02EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0\ C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95\ 711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0C\ AE5B257BE36A7124E1060C170FFA:\ A9E7AD88B63FAE09049E4AEDBD23E5219CBF5DB4695EC3F2C1167C6A7970C9E2\ 31131EC76FB19657BB35445981CC085831390C9D756928B865C2156B072246F6 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028\ F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA\ 5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D\ 70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A\ 001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0\ 480AB79D4E6415B520F1C484D675B1:\ 76E5180B485838BE4EED6F329A25088EF8360475763145DA0868F813C7D16E2F\ BD2DAC307C6F94990687410B478679DC31C1A5AFB7A5F056B818B7340DD43E9C A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094\ CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E7\ 84BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8\ 920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9B\ E6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186AB\ D42956588B3B58CD948970D298776060:\ 913C9FD00D3ABF9F66DF204D7D2C08868640F4999EBAC116E300937D4CAAA63A\ 4AC736089E23E5255485387605418329069A0867370805F3B5372241D8C2933A 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F557271\ 3575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357\ 678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A6\ 2A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E2\ 8371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750\ A96CBDE5FBC953D9E576CD216AFC90323A:\ 847AAD7AA005EE45CA8D68953F2790BCFC51E52D7DB650D77CB8560D8A7C25F2\ 0F56959F965677645360F7CC86354ED79876F71D78FA2DE734BA28323A76E2E9 F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5\ DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C\ 593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E87879634716806\ 0A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86\ 358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A3\ 67B5AD93D874812A1DE6A7B93CD53AD97232:\ F5DD8A5B24B8F34F43D52F256EA4880AFE6EFB182D550D3A62D77670F1E84D97\ D6D88B2492777BC74D6065448DBDAE16B5ED054D86A29B82CAE61943C2112746 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6\ F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CB\ DF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE\ 85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106A\ D10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80\ 352BDD3740DD6A16792AE2D86F11641BB717C2:\ 6B7CDD664CFD5F4D13DB3A1CAF9F8847C72B8D73C8524AF2DED9A74C1C9B6844\ DD4C50D6D5CCAB6C0EDB18E7A30415F244AF371EA046C06ABD6B82653B79B717 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232\ F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC4\ 71ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8\ 865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB54768\ 2A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF90\ 9ABA31EDB903B28FBFC33B7703CD996215A11238:\ CA8C2C59A7CFE208F6642EDF1404E558773E5E7925793CB7E266CFC23DC58163\ 3FD197228BF4B5F6D6EEEC1788BE7F304D915E8E52A66C143B816591D4BE7058 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F\ 8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD\ 13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A7\ 9CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F3\ 32B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6\ D3389BDF5A45074C47BC7B20B0948407A66D855E2F:\ 777F0FA0DD1CA6AACE4C4B8AAED1205B843ACFE729892208E52444D865D4F0EA\ C297041A936CE940B64B770F43944AD990F31AB2E921E0E77C846A8CDCCD0DF4 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117\ D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C\ 3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E\ 7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086\ F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205\ C343AC09DECA86325373C3B76D9F32028FEA8EB32515:\ 9ADF9DD8AD75BA78D42C9E5A99F980EF4E3FFE0F96A606FB738A6EBB4030CEF4\ BCCA674E67689170CEF3B68A7F2B2CCA7092CFD7CEF62EAAA0905DD9EE46DF5D 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD\ 2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF\ 41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6\ D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B\ 1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B665\ 6D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE:\ 71DE400D939E8254D60533184A354622E9D5A5D05A601D554718AA73F8BECCDF\ 21ACD9265ED8652836F82AF9977217FDFA02713FF5558D661D02A39DF05A1ECB C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D\ 58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B9\ 21FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258\ 104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8\ A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2\ CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0:\ 052CAC93F83F78046B26E411E32185296F87879CC73B58F0C2B32A94582C3355\ A52B3CC65B680F1277F78B7792BF07BFEFBBF5060EEFB78807760B8DE9A0837C 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E69\ 4631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B7\ 76D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992C\ B7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936\ C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205\ C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79:\ 80CE5C83D94450857A0A513BEF37B4D0760469A66267B72EA264305DA3B36597\ 96CF01F0569397F4C8D3127DE708A2C0C2C6E3C0F53BB0C01D11CF6B68DA820C C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBC\ D8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2\ D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF\ 7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63\ D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F\ 36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04:\ 576E8CBC0C416DA1617867681C8C3210BF1B43B3FA125CF90176AC2EC48B0F62\ B23227A08AD8D79F447DE80546342D98D1370D5C806D1D42069C8A6E381DED0C 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CE\ BD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B89\ 8858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257\ BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D3\ 7E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C\ 57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8:\ BACFD238DCB9E69C42BB3B53B0F8D64FC6D163411D1C483421C28CC7B738D1F0\ F87D314C0FA7573648D27D05D38A1F7E658839EF398C8972E8FF3E8C91B5DC62 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48B\ FC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150\ 384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48\ B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA\ 4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B13\ 55889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485:\ 202C0B54FA9BBB1F22C23DBA786ACC1B658C3012C9FA8925CA8DF190B99B5940\ A961B9E70F044186CE45F1D65372D1B0E642A43FAF7D033DE5733403030143C6 C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA53559\ 4463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C\ 761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7F\ D7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EF\ B86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827\ A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F:\ 42493BFCF21054AD1CD1C92CF92EE60D23588AFC1E362A8241C9C13E23603757\ FC3FC0098B467876CBFDDFAEC0EC586BB3E7BADD1FD934917A073CFF153A828E 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A4\ 0C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC\ 475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373\ F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F\ 6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D1\ 6AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0:\ 3F7F95E06980F15CEDB62B4949479D673917591F07645CCB69BF6EF188463DAD\ 76FEE3C9F6BB87139153B178776653F9A42BE67978361456A5E36FF80079A4DF 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452A\ D4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9\ 635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0\ 822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9\ F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B\ 1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A:\ 47852B6535F9B21407D93ACDC448370C963E3B927EE561354611DA1A9863425C\ CAE5EF32C6D29FE2F46975D11F86099D2A9F785549348FF1554C5F9EF8FF1878 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6\ D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED4\ 1B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E\ 698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB2\ 47ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AF\ E46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132:\ AEFB3FB01D5A5566117841B70ED2ECA0CE6E4A7D453AE8A11D9E39DFAF25753B\ B53EF1D9C388AB6238975616B64DFDD88B3DF97397FD671930B4D28F33CB3931 CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5\ C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC\ 8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262\ DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99\ 696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE7\ 7E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF\ 01:\ D41356634CF634D78315C18351F0C132C854C768B2192A0475388414D46AE3A1\ 1BE790FF0D286030E58D2F8B7F0730EFAD51EED135F9F67764FD4E1D78FC4FC6 D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E890931\ 0AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D\ 2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7\ CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE8\ 9EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3\ E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA9\ 4D4B:\ 90E82FD6B8CAA4BBED1601832F022CD42EF5D2AA0C9C2646ACB1862A606C9BF6\ 5305CFBD8DC70DDCFAA0679BA6A374B9016895502C89966D42BBE538A941F40A 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106\ EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A\ 1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B0043\ 18210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10\ 299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C\ 4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3\ A3BA86:\ DF68A8A39DCCD310EA7489D178B84E8AFB5410011EFFDB4AE044A0BA1932A79C\ 1F8D20C20B7504AD1D76553D5AF3F18AB81FC095F98A97A95E61437B07B88204 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C426\ 69AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C79\ 1C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF\ 61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468A\ B784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416\ 477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5\ FB9E4AB6:\ E70450F1439D6CAFDBBD6934CE8163769B2C5055FE1D4EC196AB093B2229849B\ 3F58C8A74161FA0516C45AC406B1A73588CB6BA5DE24A9E792D35953C3F01780 FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE\ 31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C128\ 59CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053\ A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4\ CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA74045929\ 7B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC09\ 91355C6280:\ 5D4D81E795BE45C75C8F44D51A9F8762F0D0B6EDC49D1CBD14056876BCF10058\ D1B72C06C8790C10168F0F42B9C9C9829BC5224AB5E2031DE7464ECB74822CF4 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB6510\ 62B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C\ 225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADD\ A64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E60\ 1EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280\ 366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7\ AF1AE717238D:\ 5252EA0BF90D43E68D167411F3D171614C11B6830DDBA8AB20EA126F70AB89B1\ 20F4DB0BFC9E8A05D45B4DA7B884C7EEC51D4C079D021CEF9B02D8E856895573 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C665\ 85CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08\ D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4\ C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389\ A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F33\ 16670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030\ 528F9AB49C79F2:\ 8A38DA71A86A3F26A211D1D0662E13B5A3DFD0E9F719489B814D38ED16751477\ 91720ED349D754FA5A6B260F2736F66DB991C407664EB97FA6E936F08B9EF1F6 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24\ AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5\ 584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F83\ 4D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E\ 4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B4498\ 5AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937\ EBDDC89186839B77:\ 74F8AF73F27D644BB937EBC0F58B8884A5F8C5C8BE34D26CF7D0EBBFE724663E\ 121B36B64FD42B61132D424B185E4093E91E517EE7BD1E106D8F9E74B8057564 FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608\ E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7\ AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3E\ CB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711A\ B1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A0871\ 6DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360\ C66F252F6E64EDC96B:\ CFC4825ACA4ED0B0888647A6EBD37AC1EF1721806C35A462EFF091F14E3950A2\ 3E508F821E65EDC7FF8879E4D454E137429666342365CAC8087346D11356FFD2 B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA\ 5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782\ 252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4\ FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C79\ 25761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B\ 232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA\ 5363892A2495DF8C1EEF:\ BB3566825AD58FD9D5AABE8B1E6C53F7F8E176F401EC327AD1455C20FE40B9A0\ 1012748DF19885F1660CA77D3FCE3A8D8F017E49CDE3F36BCD7BE3C776148B40 C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1\ FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF\ 272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34\ 414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B3\ 49393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2\ 199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F\ 5C6D1BE4BC79F08A1A0A46:\ 859D25E201724C1CD4F961A2CFFA4D2D860C465C4941930D3C77B84F799C09A4\ A53EE1194F9404161EBA23C869589D65183C4FA96ECD12CC9FCFCEF059F0B4A8 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837\ A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C\ 2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804\ 443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251\ C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079\ D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD49\ 6EB6E4A80358ACC78647D043:\ 38EE279BE412ED11553578F7980EF4E17898ACDBD774F5C98F9CBCEBA75E394D\ BC49357E9463E2EBECBAE687D344F9059445716D3B3AC044E41537DB00E9C12E EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89B\ F3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782\ D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA214\ 01E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708\ E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4\ A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F2315\ 90BF2C4062FD2AD58F906A2D0D:\ 280F21678FD84E142CED7376105DF2B088144D246F1C4802D3AA550F7B04AFA2\ A226541255FAB2AD36B67D2CAE7AA42878464D3A4FE5945C820A1107073B8662 E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DE\ AF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68\ E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1\ EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9\ DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0\ EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE\ 3EE46FB67422F814A68C4BE3E8C9:\ 986651FDBDF3A65911FB73D5BB132DE19F1060549E76811E05DC80AFC8012F77\ FA965A7FFA380163EAFAD2D495FA2F07CE7D7A7D4A94EEB0505B64F7C429F849 D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984A\ C58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED5\ 4557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB4\ 38428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587\ 806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF451984\ 4DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55\ A17E776C0D02856032A6CD10AD2838:\ 53D548018056A72FE24AB630F7DC9C89DE4891D83260767A403CC2EA3F892145\ 8EC7EA45FBFBF38C4083A4AAE3BADB5F5D0422EB9E525B7B8B4CD5BE0ACB758D F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4A\ C2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B\ 39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD5\ 42DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB1545\ 4AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DA\ CF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E8\ 2ED1C78631FD23B4C3EB27C3FAEC8685:\ 4C84E9B4DC2F3C60BAE0C3C11A0FD6D992567DC45695E5C8DAAAF5955F6DC91B\ DA8A1581A93462370C29212D7157588417CCEA1F9AE8CAD47635D1F837871869 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A2\ 94D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0\ 286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26\ D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F88\ 04F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D\ 72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89E\ CD90333A77BC4E1988A82ABF7C7CAF3291:\ 140278E6BF4A3E62E5FFFE20034DCEDCF88AFD11FA9D3DFFA6EAC8BC1E82B8D2\ 2458E8623126E4DA646D1866218AA99140F110A1259A306132A4DD3292B5CADD 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2\ E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB\ 29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BF\ ABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111\ E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C\ 5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7\ 626C48322E9791D5FF72294049BDE91E73F8:\ 910CE76BE8C967718FD1E1EF7969E7A56F1354C06FABEDA892E07FBB659F9369\ 55E9AE9D75D5E3BBA81E8455B775BF4CEF2A4647E3C7C340F364A46F8857A72B AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB3\ 1F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA\ 42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021F\ A6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190\ DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896\ B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92\ 774BE89C1114DD531C011E53A34DC248A2F0E6:\ 8E120865B61ED74C25A3EA9805E286BFAAC7F75C37AB763C45E325E882E2B55D\ 7FE2776A62C9DA46915DC27881990560648CC6DAC1226442ADAC95C4AB8CBE3B 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799\ B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93\ CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16\ 246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C\ 47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F36\ 94F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4\ A7059ABE99182714983B9C9D44D7F5643596D4F3:\ DD073E6362674B8D090C505B14BC4B110C086A655264B2D0E917C3BD2F5E4330\ 5E4B034AFCBD7ABD991C38946FA601FE11AF342B29C36E180B27081C37384765 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4\ BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9\ 374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA1\ 6A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E7\ 63D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA\ 5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A4\ 4F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739:\ 2C1FF25C2128E3B59FC8CCC59D738523656A2A3A0C28F3BDA52C49243BAC3B42\ E26F8FC39DA0D864040DD08CA4F608ABAB45AFE38FC187882EB9BC3C46409D9A 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74\ 575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31B\ BAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56A\ E14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24\ AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB\ 7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B\ 591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C:\ 805746E78C228C7A99B1FBAE93BBF4C1F81DBF14C3EF7DBF70E9FA1FB5E611C5\ 328E0A374FB2CA67A95161D5BF3F2D6C12C8A90E1CD4AF6ABBD00E37775D524D 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7B\ D9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC7\ 37B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B0\ 3166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0\ A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B5\ 9293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC\ 24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE:\ C2E4138CF6D5DF8997649C4324E06451218F575730C6ADE1825067587022EA32\ 20A7F049C412F42FA5A73313956165525FD3D3A753DCDCCAE1D29524043F2BE4 D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0\ A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17F\ D4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B760\ 33798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDF\ CA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE1\ 0644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B\ 52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7:\ 7BB7AA3C574F6CF20740B77C4F349D405D815A949AB74EB4439638C9521694A4\ 48CEE4729A1B88C5C6230EE0A6388D1A7BA8E909A990145AEC951996462E62D7 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2A\ D52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E\ 7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE\ 5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30\ AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88\ B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3\ 806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E:\ 32761245645A67ADEF404906F3E29233A1C09B98785A38D6F02477F90D242C5B\ E71A4F9FE272E5A2C7AC644D245167A06D8162F01880DAD6684A8C7E27044A7D 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1\ 271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961B\ CB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E\ 608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75F\ D71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9\ 990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D\ 2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF:\ 72C59B8CAF93E65FF374BB129F7221B30DAE35205C3455D4D268657C6D27926C\ 940096D004737DAF4306F321C840E402D35BE5DAE71CF48FF64F424A3CECF62D C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E\ 56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A\ 8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F\ 50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D139\ 1A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522\ F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA3\ 9F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397:\ 77867FCE5437F2BBB52ACCB44140DF9D235023333031DDA334525DCC9178877F\ 96B0216D007F5E3718E55E233E43C146A6942FAC5D815A892EB53F4BFEFFE17B 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C2\ 5F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B\ 4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975\ DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A\ 261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57\ CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B\ 31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6:\ 37F2BF50D2E8757DAC08977B2882BAF7CD98E54FE12C57F9A5ADDC9EE5A77F8C\ DA29864F70179A4CF473CC505C1E25837443B94CE4FA817101BFDE224B5DF107 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D\ 266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C09386\ 7948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077\ B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1\ 357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC1\ 5B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D\ 719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487:\ ACB477957256D5E134873B0A4F804A2A492A72468EAEFE80F0DE23DD55862FB7\ CE5AEB58FE9E1FCEC12BFA7ED92D5E19D89075D11860315445250735811499E3 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C\ 8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B\ 3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306\ 267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FB\ A91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF3118\ 8B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3\ D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB:\ F5178B231491395B863F570B96268B27A403502CF228173A94989E13B78615E7\ A07087ED7422696C295A2D25B4C075ED5CBFB3765F67F60047014F4554DC5103 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597\ F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0\ C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240\ A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B9\ 1A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A24452\ 4EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A\ 3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D:\ 60A65939E7472F42AB9D9FEF54DA531C9576BF1F740E62E04FEABC96D67C744C\ 461A0EF4AB4C90BFB0C42F2A7724006218DA38D1BDF0DDEE536A11D2C0B2A6B7 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79\ 994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EA\ DF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C006\ 37E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C94989\ 7EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F1\ 9F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34A\ EF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78:\ B0B2699CD59779EE8903B952410B43E607DE0514FB5D9722233FA363F686E5C0\ F02F2F4866B850F3294B9172FBBC5D6BE0407FCDA88A70BF62634F1246B7B48B 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3C\ E6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735\ DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B\ 394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F3\ 43292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D\ 7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058\ A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627\ E8:\ FA3D438287356A9FF72904A3A7E4E143F3DEDF0104F8EA1A8851DBF401F5F767\ 511AB18C629AAB16B0FC7F42F96AF244CF797713F3A2936E78C435E01E09A599 EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787\ F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF7\ 85B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9\ C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA\ 4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F1\ 97447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E\ 345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA35\ 6427:\ 1527F8E417B736AADAECFD3331B56E0E2AD7DED6E621AAC34A5289C77D022837\ 0025D42D065F2141E8513C841EF6B7222D2B138F3B236500D92D782D30AA0C7F 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C1\ 89F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10\ DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42\ DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490\ BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568C\ F24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3\ DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C\ 630012:\ 4288CE417AC9BFBD79624FF3B6D372B27291BC41038F7D27658052ED9BFAC950\ 5593D7D7FF87620E43DDAFC9D3152DDE7BB572A035BA4AF6D6163DEDEF761981 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45\ F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1\ C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302\ A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8\ A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF8\ 95BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC931\ 4C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C60016066\ 78DFB921:\ 70EB09D44B47385081714872B8F37C5E10DBCB3173C752DEBAB0FE9E7FA2EA33\ 888696A85C30B3703B149A48BC08C9D0DC5C2D4CE2D50270B6BCFB38BDB2D738 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6\ A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F\ 4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEA\ BE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568\ DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F\ 91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF\ 9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7\ BB0D19F909:\ B8D59524A0B510ADF31C2BE3C28D9BBFDE3522425D7CC5E9985DB21ADEF17A39\ 2683D0D9865BEAE4FE52E59212C3DF4026DF0D507BFD31796BA235C34FDF6EB4 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F\ 6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A007\ 57F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A\ 00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF\ 77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD609\ 81150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C\ 04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECE\ BE6BF8082E8A:\ CAFC4468370B21BBB40D207D55FD79D4E753E4693075CCABBD8152DD2FC8BE77\ C81EF5ECAD93D0CF67FECF96D4CE401D1012A78FE5AF1575D430B4E98BDB0DAB 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E7\ 06F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B0\ 6CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B5\ 4BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423\ D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D\ 58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8\ FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422C\ E839A9D4608F03:\ DB9F9D60468D2ACA0E907666BFE59D44AEFAEFFEA0F9B5FAF3F54A10F33441E0\ A8775D618D1DC05E454B4469ACD393B1938381443EEF27F98CEA2AAF29FAA504 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E\ 10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B\ 2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567\ BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD4\ 2B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C\ 8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D0\ 8C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E0\ 5153592EA81C6FBF:\ FD298EE7689557CBB1D2DB73661D535F88EF035339DA8CDEF3031F6F9247453D\ FA9C620865B9102903CCD7675A69EC4123AE4841C97C69EC8673830010169776 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C\ 735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D7\ 1696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA0\ 7F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA52\ 39FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA5\ 9392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89\ F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172\ 604F5035C46B8197D3:\ 0DFAD082D280839A2D3D54080F44E2826D554A3382A024A8B8F89125864D27F5\ AC75F8CA3D80C1B725005687A33817EF54B53C596E2D300B6464EFDF25860BBC E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B\ 94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7\ DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC25\ 7026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD05\ 60EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E\ 7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA6\ 6B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E5\ 07E3B953ACF99964B847:\ 9B15DED0185F1529AE4C75B56060A13484BF6DB0B7113F8D440C5BCF91A9D95E\ 7ABD458D5D1D758A2019AA0A9A9CA18DA108314ED4269B7752F95D241C8DD95E D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E\ 32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B\ 7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D\ 8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C2\ 07A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77A\ C6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF6432\ 4DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E4\ 6C90E8C4D100ACD9EED21E:\ 9876B0FC3269B25129B2BEEDDE7D2F342E22351723BEDD3DCC5F225D8A480E0C\ 596C99A7FFA5780E0A40F09BB342AB9E87682F8A7AEC50BFF19947E00BF66E6B 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8\ AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E74315\ 18E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181\ A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3E\ E1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53\ 886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D3\ 4F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1\ E2DD603D9EA24DC7C5FD06BE:\ 612452D85CC2AF10F1AA9CED95EAA447C34A4A1236A27E8324037E9E9C7F983B\ 8BBBB2BC168DE5F86D161C940DA2C86008A59C77EAD4AA13630EBE882D73066B 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076\ 742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846F\ B84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB9\ 69A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3\ E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA95687\ 9A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215\ 779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66\ A80012976F31FFDF305F0C9C5E:\ 55C0F0C1D6FD781C85E85464BF3AFB4867CD46667E49D1C369BEABD3194F4D5C\ 237CB34027AF805A0B369459C6524E633625DBF72C5AB88292B08A59BB7633F3 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B\ 9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD849\ 53AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D\ 479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508\ B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CF\ DE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F\ 3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05B\ B461A40645BF176601F1E760DE5F:\ 7FF37874DD828FD1B4CEDE7E0AE6BAB8E366BB033B19892404B6546F2B7AC98E\ CD03E94FAC5BF810C3B86CD8EB2A3C2485A31BA7E34472DE14E406C0998C38B9 D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC05\ 5A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DE\ E820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DE\ F612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C\ 8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825\ EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B\ 1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C91731\ 86C226169FF257954EBDA81C0E5F99:\ F5C2E8E12ABC3765E9AE3682DB57E2F8B766F6ECC8D0BCD50B8E237E427A2AC1\ E66B7212DEF66A5561BA1347AEA507DA088F4DD0F9F887354E6BF6B7DC267933 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E\ 431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A02\ 40B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769\ A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F\ 0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B6325\ 2DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F5\ 83305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455F\ D3C356C914FA06B9A7CE24C7317A172D:\ 7F10AA2696AB43CE01E3658148B37EBE3C957345655F820F4D6176D2D0FB3665\ 61B25A185A845341986CBDDD1B1DC33D48F48EC7CAE99CBB016CA09595AE05CF 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502D\ E6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262\ D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0\ B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C\ 645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37\ F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F\ 39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF\ 68F50D79F0C9C7314E750F7D02FAA58BFA:\ 0D7CCD471A38BCE93CB11B673260F9691D4F1CB7663D44B51EB3BD7B0F1BC45E\ C4382CBDEF8D852424558615C554FE06405E3A1DFB88B97D8ACA74192C804328 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA94\ 4731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B\ 717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B9\ 4B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3E\ FFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D4\ 9BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E\ 39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A\ 7DF95B60FA8712A2271FCAF3911CE7B511B1:\ B17B646A2179D20B55E2763A189545896E861291E9321643DBEBFBFD7951CEE2\ E53283C2D9B54BA23B124C68098BC5229E31076198678AD124B8A8A56B848384 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFA\ C0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1\ C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714\ 261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F5\ 0B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC548\ 61F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB2\ 37520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252\ A53C49B7B02DFE54FDB2E90074B6CF310AC661:\ 51D322A34629629F2F9C6A9D53C7205E8C7421DA2E742C93E413E6985467885C\ 6DB5174472292C614A5833C8CE98FD222D8A924E98098282300E000F1977B1CB 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185\ C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB\ 4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E\ 339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E70\ 5CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0AC\ F106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C0\ 7A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608\ B7F5CB9923AD97058EC067700CC746C127A61EE3:\ AABA6FF7AB56A145141244BD68314072A96EF4C83D0F0CC883082F7158FBCD22\ D99C46308FD8472BFB4AFC92510EFFE673FCA3AC5906990130DB540ECC346E92 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF\ 70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E\ 495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8\ DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C\ 5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF\ 00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9\ F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2\ CAB025103B2D02C6FD71DA3A77F417D7932685888A:\ 0CE918B049A465F707B524F5CC1B0351682238078E8ACF52006931DAED402A5D\ 584F7E3E7695B0B03076C1A09EEA098BC9CDE640E318A0527CE36AC92D8331E4 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C2\ 6B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A5\ 6F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE9\ 1AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF\ 0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10\ B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD\ 2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87\ C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006:\ 6B4D98B9D0287C6983DF4E267BD638A9119B48E2F2E6CD010F98AECE27E12174\ C317CACCFB0BEE9B3993C8C844E00E781448A5FD5EBF8C01E5C7D1114742FC9B 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46A\ EA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812\ B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FE\ FF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D\ 2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C228\ 5D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256F\ C763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF0\ 9E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB:\ 43C69DEB892ACD8B887966B88903C24B87B5ABB38BAE41BDD843BD753A047618\ 97021382316FA657AEB17DDD9340CB81238708BDBE7EFBA88F1050F46AD2D6BB 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BA\ C2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F\ 8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E41308\ 90E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A61\ 6BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB\ 0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141\ CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F160\ 6BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399:\ 2037CEE5FC0E67A655AE13407E321619521C5F24409077BD06DB0EB41C7B1972\ D5DFB43D5C40713989ED4A493BCCCA49A3ECAD98DCDAE5B97419EA86A0268266 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E\ 70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D\ 5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CE\ E4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F031\ 2FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB\ 4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A\ 27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187\ CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B:\ AE52BA93BD7DF6982D7BCB158B323331D27EB4CC71429C675709B0EF257FD3BC\ C1B66B3877F83FD418EFF1EED019794F3A45299D865FBB3CF4EBBF814DE6F3DC B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDAD\ E59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE84\ 0CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2\ F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF\ 0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B98746\ 8E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB\ 547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0\ 758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B:\ 72B6C1EAAF98E4643EC3E6348988C7C5BA8AE0A4BB2EDC65409B7C4CBF37B3D6\ 096DE4967FC0D0B22B7E709531BF9F65EE0203BFD9925BBB2A8AAC509AD762B4 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BB\ C55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E\ 38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207E\ BF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A06\ 5C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED\ 3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE5\ 8C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE\ 5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1:\ 87C56BADCCB0D0FEABFBCED93088BD0BD06840BD194E4C665D5045BF221A0483\ 9F0BE03AA61F86AFF8C403CBE08FEDB76837A2C71CEA50620EC0C488C4003785 A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9E\ A746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912\ EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC\ 3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA\ 80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E\ 49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E\ 9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252E\ E12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB:\ 7228261B12052A13CA19EC70BA1D7497F03F2F7FC208A1FC499A01D2F9D1177C\ 9AE9BA46E6F418D6088E4DFA8D8D8A27EA99B4ABC4236967054CDC60ED603E1A A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264A\ A36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC3\ 0D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D\ 639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836\ B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108\ 877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF3\ 1B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECA\ D9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6:\ C37C08D3A8C35C1C6D645B1DFFD7FF4082EFC21700D4C029E796620168ABBFAF\ E8AF0F421417DD357855D8B131F49AA09795842D7D298845321BEE7700ECDA3C 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B6933598\ 9E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E5661\ 10B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E114\ 8C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A\ 88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B\ 0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A35\ 2E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE64680\ 04AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E:\ 657C140E3C895BDF7096AC866B2910D22B42ED6D038A39D3E50BB923EB0A70F1\ D06EBDF68A668CF91AEF5A204063A765782B1D6489ECE1885DE1BDA7BD581C55 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5\ 623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A\ 15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0\ A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764\ B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43\ C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D\ 817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E08\ 5172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1:\ 1704129D4CABEAD74C1AB7AC89D773DC50A88EE71937C25FC3DFA5F4FDF79169\ 5040755F15894E6A56380F713C23AA5ACAC8DA8CBA4F356FF18AE72AA5E78902 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D\ 21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DA\ BCE506E558720520D33352D119F699E784F9E548FF91BC35CA14704212870982\ 0D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C8\ 7E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1\ A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CE\ C6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2\ FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195:\ B2A35CF130E39CF82D85B5E4205934C0550293326354A0F9473890048F05AD76\ 369E17E86D5D3F841C211312155F0B46266D8FB0FB515F044BCEB32FFEBA2871 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A11\ 4E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B2\ 92D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02\ 539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332\ DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B\ 0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49\ F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C252\ 7AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04\ CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D\ 2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18:\ DC0CDEDBA4F46C081F84E8DB765CF6DA2570A0D5C638ABB74774FC6F8C9A2708\ F0AB027B0CAAEF047A2FEB08DB43DBA5D802F5541D58956F998013AC4E5C5897 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A69616526\ 76DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529\ C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC00\ 4691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C\ 0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8\ B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F\ 52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B46280\ 27A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718EC\ AE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8\ 720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710\ D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D\ 9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651:\ 48B10FA23344EFC936E3E1864F1F1BBE4AE7358CA39711A4A984C602D2E7DF08\ ABECFA33A4114260F50DB9DC2E72468E358A50CAC43659616E1F8954F160E581 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3\ 131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890\ 808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1\ AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135\ A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAA\ E17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4F\ DB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D510\ 71BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C\ 6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493C\ D136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C30\ 74E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E\ 4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E\ 6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6C\ E2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7:\ 0242B9AA3222A71FB829A0010B1FBA4F9A380E5DC57416CD57A26EC7FD7DC56D\ 514799600717F2B9AF909D076D16E8FD9F96A705169FEEF91D15EBD38A3A34CF 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD8\ 0F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB\ 2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB\ 0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5A\ A756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A\ 2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746D\ B6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E\ 8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3\ 284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C\ 584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9F\ AED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A\ 582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB\ 8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10\ E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107\ DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3\ C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD:\ 961A63783683371125E7D4FD6455E60678AFCD354CE2C0A4FB299DAFB3C4EC46\ F45F48A63FF8EC29D44B3B033C931122924D3C2C9683D5C576E2F0453653CEA7 D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024\ E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211\ D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C3\ 13D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D7\ 3D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D\ 682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058\ 321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B2\ 1E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D512\ 63B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978A\ E90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA\ 21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4\ 910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C\ 63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A9249\ 8D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089\ CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6E\ D83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A7\ 90910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA\ 43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C\ 4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC9\ 8D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBC\ B88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A89\ 6771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78F\ A3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824\ CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD564\ 9FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458\ A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8:\ F2240A89661FE49A693BDA8A34C8EB8C880F364D175EADCAA2863C669B1EB205\ CDC09CBBFD5ECA7B18FE1A807289B96945DC581D904D7982D0340E8F968D162B 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B\ 73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF\ 2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520\ A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD\ 574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8\ 298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB\ 6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB4\ 2610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61\ ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A898\ 8B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014\ BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B\ 07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC826709399\ 48FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02\ F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED66402361\ 6B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA\ 7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8\ A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F\ 469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E\ 6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F\ 40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34\ B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF\ 08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281\ 665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F\ 4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9\ 186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC62814\ 0996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE0\ 0D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA962838\ 1055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79\ CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4\ C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D5\ 99B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8\ D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED\ 1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACD\ B178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF2\ 14DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478\ DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48\ E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3B\ A36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385\ F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7\ A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4\ C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017\ C3A66CD4EB2DDB42EF85EA0CD65534:\ 8C0B44D668773C632A8B8316710F4B8E8948AB0DE82B9ADAAFF0A9FA901FE653\ 2FC4E6741539C83966D42D646B1FA50BB7CF6F7545BE39CB561562FA1A474B6B 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3\ EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D\ 6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA054187\ 70F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01\ C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08\ D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6\ 013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF044\ 5B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCF\ E87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E55\ 44E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D\ 8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80\ DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671A\ DEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8\ B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC728366\ 1D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615F\ B93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF19\ 9E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D2\ 9B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB\ 4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D\ 323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2C\ FBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF\ 8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AA\ CDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83ED\ F9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED092\ 53039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6\ EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE\ 11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADE\ D1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648\ EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107\ CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B96\ 5A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7\ B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E17\ 41553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E8\ 19C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48A\ BE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548\ 647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816\ AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430\ 142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE\ 40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C6\ 40909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E5\ 3E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB4665\ 2196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B\ 94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE\ 4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9\ CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D25\ 9C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE\ 561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7E\ F94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E\ 5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1\ C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6\ 303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A\ 2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1\ C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3D\ A8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6F\ E398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6\ F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C2\ 13171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD\ 46B568CE294C89:\ A634C648944329BDEF5DE4F48D2F8F1A1E3DCFF5F4CCBC2E4375D5B4D3686D62\ F570DA68C5707B596249BE56256511AE53A307F0F01B8707E80C1A32D9313074 F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD\ 9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81\ FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E904\ 49F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0\ D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6\ D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EA\ F977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B\ 32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0F\ A032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C\ 2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC01\ 03CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31\ B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F4412\ 0ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7\ 685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491\ B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF\ 2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C\ 3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF30\ 0251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736\ BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CA\ C2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B983\ 20B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B056\ 2B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1A\ F9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A46\ 3B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F\ 5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137F\ F9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BE\ D133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68D\ A188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE8\ 97B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030\ DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A74030017989\ 92F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54C\ F7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA698\ 3D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B5\ 2C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE\ 703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C\ 05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B0\ 4DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC0\ 99EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED\ 1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754\ 688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F958\ 1DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F9\ 4E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4\ 181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6\ FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169D\ C46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12\ C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB0\ 00057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D0\ 0A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4B\ A1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C\ 2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441E\ C8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A\ 537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8\ B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88\ DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656C\ C30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D7\ 2DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19\ C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B8\ 8DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8\ F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B85\ 5845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4\ ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F16467\ 8160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D629\ 4FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D1208\ 9CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0A\ D12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397\ B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA\ 727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE\ 9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E7\ 3EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A81\ 0FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1AB\ F6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E\ 854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07\ 813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215:\ 4726C1E176DB2823933F872FFFF0450EEB42E410A099A8A5DF5E28BC053A399D\ 0A188F60D04E106291AA06E8817442938B198C9064E324D6C6142B0B3F509FD2 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6\ A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6\ B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399\ DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB296\ 47F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE\ 7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B600\ 4DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FA\ DDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120\ D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE390308\ 0A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBD\ BEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A294\ 4384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E62\ 22A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D37\ 52889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0\ A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33D\ B8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4\ C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F\ 7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D\ 7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24\ 204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB229\ 07F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3\ C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD1\ 5C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130\ D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2\ D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D\ 56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572\ FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD5\ 6495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C\ 15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDE\ FD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041\ 259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A819498975\ 5D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A\ 317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC\ 5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3\ 504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E5\ 32A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999\ B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D77\ 85C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FAB\ AA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C215366\ 3B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2\ B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530C\ AB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2\ 281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD898\ 6EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B\ 82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77\ BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFE\ CDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BB\ BE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C2\ 8F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705C\ A27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2C\ ECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D1\ 0CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F\ 2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246B\ D04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD\ 1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F\ 265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB0989\ 5CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E\ 4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F\ 092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E90\ 0200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C\ 29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A1\ 3EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398EC\ F3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A\ 49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BF\ EA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480\ C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD4383503\ 3B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E26\ 26AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A\ 5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041C\ B3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB52231\ 91E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B24\ 42B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E\ 228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB\ 5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604\ FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE\ 25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914\ BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F\ 2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8\ AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42AB\ AD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3\ B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3\ 688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B46\ 7CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB3\ 3770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F0\ 7942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD\ 394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C79024581211\ 3204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA\ 8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B\ 09B7F42D193FB3E9C06329818251A2F7E6474462C95DED:\ 07DB4E0F124C3E6824F34A188D4CB1E2C0D8C02A7405D550E98C08E54B152361\ 1DF4FEF711DF5CB8EE73ED7809B3BB2A0D845287683F61CA3A11E109F7AD835F 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380\ D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8\ DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F7\ 6316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA37608\ 26D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E693\ 9C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9\ C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96\ C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108A\ F1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322\ B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE7\ 0057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DF\ CAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D0094\ 32DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181\ 221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083E\ A427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF00\ 36D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A595\ 2AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CF\ AE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF097\ 72D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A\ 83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1F\ C070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E\ 0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665E\ D1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA28998410\ 3F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1E\ CDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADE\ B9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C\ 6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121\ 210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8\ 889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3\ 123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB\ 71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2\ B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F62\ 1275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5\ EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E81\ 6D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A3187054\ 3D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B4403099898\ 57103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B\ 4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C\ 2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE\ 6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D88\ 0CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD2\ 31B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB3\ 97EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3A\ DFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FF\ DF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A2492\ 4A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC27\ 75833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0\ FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666\ DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F\ 40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5\ F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA7\ 80703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF9428\ 15C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEB\ A3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45\ B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F\ 5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C\ 16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5\ 278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D5\ 59D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E\ 97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956\ E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1\ E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106\ E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10\ ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E\ 806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA\ 01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD8\ 78C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D\ 29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB\ 31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FF\ E178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590\ 320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C\ 908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8\ 369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98\ 966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A6\ 5A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F94\ 76D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340\ 847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E\ 950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFE\ E744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D\ 30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C\ 89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427\ A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0\ EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E288\ 5EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB8\ 9B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABB\ F1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11\ 735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A8\ 64D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7\ FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA7\ 25473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697\ C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112F\ B2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA4\ 2F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715\ 180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED\ 9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7\ 120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C\ 07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE1\ 6318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884ED\ D768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E\ 4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B65246\ 7FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030C\ EBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4\ E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841\ BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF\ 57795DABAF40687B2CDA7A5014168F:\ 7A19EAC8B081B61CB51390E737406920414210BFE4E07BC3198651365193C543\ 5B5147F99602132DD0DEA9EDB10A6F93A9AF28AE0A10320D7ECE88B325FD9F5C 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D5075\ 2ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07C\ F488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A107\ 6D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3\ BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C40\ 5F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB03\ 78391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB1670\ 0EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F\ 273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC3\ 3B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60F\ A01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E\ 6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9C\ E264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA1414\ 1AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C3295\ 8A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA7547\ 0C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B\ 98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2\ BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7\ C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255\ 048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF\ 00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8\ EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0C\ FCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F\ 8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96\ E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94F\ E43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE8\ 4E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D3625\ 7C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C95\ 63844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000\ F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CE\ FFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986\ D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE9\ 54785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB7867\ 6E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FF\ A65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B2\ 3C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFF\ E6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C946\ 50C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3\ 742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D0\ 2BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE\ 79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFD\ C2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2\ E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C\ 59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C\ 4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91D\ F0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97\ B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073\ D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB50\ 7608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5\ E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E\ 5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B\ 0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159B\ AA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D\ 9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF\ 05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855\ CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC424\ 5A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E1\ 3B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E1484\ 3D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC\ 9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2\ CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F7\ 6242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B2\ 60F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C7369\ 6F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA8\ 1F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631\ E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2\ FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D352\ 1720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A\ 7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9\ F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EB\ A748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A\ 37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE\ 42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA1\ 5337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD\ 7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE7231992\ 24F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885\ A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F71\ 0BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96\ B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B301\ 3839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433\ B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FA\ F353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD\ 44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF\ 3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E\ 5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2\ B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A\ 1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054\ DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B\ 4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F\ 1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A3503\ 14B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA4\ 0FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C\ 78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5\ B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2\ BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF86\ 2EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377\ 131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7\ AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB04\ 8CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF\ 8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9\ 455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389F\ A745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32\ D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810\ E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615B\ DE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8\ EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA60\ 69369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6\ D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F\ 7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF17\ 39C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06\ EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A\ 1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4\ A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8\ 545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8\ D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B65\ 75A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364\ A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6\ BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D235197303\ 38D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312\ C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34\ 090FC9BC045271:\ B3A3DC375B5230EC57B052882F13500D61BDE3FCAFE65AC7EDFBBCAEE5DE7550\ E93FA9C4ADB6B44CA3A4EE9E817CF456D595252ACC898703E45213294831C47B [Tiger(16)] :3293AC630C13F0245F92BBB1766E1616 4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465\ 666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839:\ 48CEEB6308B87D46E95D656112CDF18D [Tiger(20,3)] :3293AC630C13F0245F92BBB1766E16167A4E5849 4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465\ 666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839:\ 48CEEB6308B87D46E95D656112CDF18D97915F97 # Tiger is Tiger(24,3) [Tiger] :3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3 616263:2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93 4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465\ 666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839:\ 48CEEB6308B87D46E95D656112CDF18D97915F9765658957 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6\ C6D6E6F707172737475767778797A303132333435363738392B2D:\ F71C8583902AFB879EDFE610F82C0D4786A3A534504486B5 4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465\ 666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839:\ 48CEEB6308B87D46E95D656112CDF18D97915F9765658957 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6\ C6D6E6F707172737475767778797A303132333435363738392B2D4142434445464748494A4B\ 4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767\ 778797A303132333435363738392B2D:\ C54034E5B43EB8005848A7E0AE6AAC76E4FF590AE715FD25 5469676572202D20412046617374204E657720486173682046756E6374696F6E\ 2C20627920526F737320416E646572736F6E20616E6420456C6920426968616D:\ 8A866829040A410C729AD23F5ADA711603B3CDD357E4C15E 5469676572202D20412046617374204E657720486173682046756E6374696F6E\ 2C20627920526F737320416E646572736F6E20616E6420456C6920426968616D\ 2C2070726F63656564696E6773206F66204661737420536F6674776172652045\ 6E6372797074696F6E20332C2043616D6272696467652E:\ CE55A6AFD591F5EBAC547FF84F89227F9331DAB0B611C889 5469676572202D20412046617374204E657720486173682046756E6374696F6E\ 2C20627920526F737320416E646572736F6E20616E6420456C6920426968616D\ 2C2070726F63656564696E6773206F66204661737420536F6674776172652045\ 6E6372797074696F6E20332C2043616D6272696467652C20313939362E:\ 631ABDD103EB9A3D245B6DFD4D77B257FC7439501D1568DD [Whirlpool] :19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A7\ 3E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3 61:8ACA2602792AEC6F11A67206531FB7D7F0DFF59413145E6973C45001D0087B42\ D11BC645413AEFF63A42391A39145A591A92200D560195E53B478584FDAE231A 616263:4E2448A4C6F486BB16B6562C73B4020BF3043E3A731BCE721AE1B303D97E6D4C\ 7181EEBDB6C57E277D0E34957114CBD6C797FC9D95D8B582D225292076D4EEF5 6D65737361676520646967657374:\ 378C84A4126E2DC6E56DCC7458377AAC838D00032230F53CE1F5700C0FFB4D3B\ 8421557659EF55C106B4B52AC5A4AAA692ED920052838F3362E86DBD37A8903E 6162636465666768696A6B6C6D6E6F707172737475767778797A:\ F1D754662636FFE92C82EBB9212A484A8D38631EAD4238F5442EE13B8054E41B\ 08BF2A9251C30B6A0B8AAE86177AB4A6F68F673E7207865D5D9819A3DBA4EB3B 4142434445464748494A4B4C4D4E4F505152535455565758595A616263646566\ 6768696A6B6C6D6E6F707172737475767778797A30313233343536373839:\ DC37E008CF9EE69BF11F00ED9ABA26901DD7C28CDEC066CC6AF42E40F82F3A1E\ 08EBA26629129D8FB7CB57211B9281A65517CC879D7B962142C65F5A7AF01467 313233343536373839303132333435363738393031323334353637383930\ 313233343536373839303132333435363738393031323334353637383930\ 3132333435363738393031323334353637383930:\ 466EF18BABB0154D25B9D38A6414F5C08784372BCCB204D6549C4AFADB601429\ 4D5BD8DF2A6C44E538CD047B2681A51A2C60481E88C5A20B2C2A80CF3A9A083B 6162636462636465636465666465666765666768666768696768696A68696A6B:\ 2A987EA40F917061F5D6F0A0E4644F488A7A5A52DEEE656207C562F988E95C69\ 16BDC8031BC5BE1B7B947639FE050B56939BAAA0ADFF9AE6745B7B181C3BE3FD [Parallel(Tiger(24))] :3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3 [Parallel(MD5,SHA-1)] :D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709 [Parallel(SHA-160,Tiger(24,3))] :DA39A3EE5E6B4B0D3255BFEF95601890AFD807093293AC630\ C13F0245F92BBB1766E16167A4E58492DDE73F3 [Parallel(SHA-1,RIPEMD-128,Tiger)] :DA39A3EE5E6B4B0D3255BFEF95601890AFD80709CDF26213A150DC3ECB610F18F6B38B46\ 3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3 # This is mostly just a tricky test for the lookup code, it's equivalent to # "Parallel(SHA-1,RIPEMD-128,Tiger,MD5,MD4)" [Parallel(SHA-1,Parallel(RIPEMD-128,Parallel(Tiger,MD5),MD4))] :DA39A3EE5E6B4B0D3255BFEF95601890AFD80709CDF26213A150DC3ECB610F18F6B38B463293\ AC630C13F0245F92BBB1766E16167A4E58492DDE73F3D41D8CD98F00B204E9800998ECF8427E\ 31D6CFE0D16AE931B73C59D7E0C089C0 [Parallel(MD5,SHA-1)] :D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709 # Lookup test: TLS.Digest.0 is an alias for Parallel(MD5,SHA-1) [TLS.Digest.0] :D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709 # A tricky one [Parallel(TLS.Digest.0,MD5)] :D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709\ D41D8CD98F00B204E9800998ECF8427E # MARKER: MACs # MAC format is input:mac:key [CBC-MAC(DES)] 37363534333231204E6F77206973207468652074696D6520666F7220:\ F1D30F6849312CA4:0123456789ABCDEF :0000000000000000:67C6697351FF4AEC 29:616FE88F809D55FE:CDBAABF2FBE3467C C254:AED0202A4D19E0E1:F81BE8E78D765A2E 63339F:69E2BBE362FFA373:C99A66320DB73158 A35A255D:99AF085AE0872883:051758E95ED4ABB2 CDC69BB454:346750C009F85AE7:110E827441213DDC 8770E93EA141:457FA6D39A704CDB:E1FC673E017E97EA DC6B968F385C2A:725FFF0F41477E42:ECB03BFB32AF3C54 EC18DB5C021AFE43:1D119FAEB0BB44C3:FBFAAA3AFB29D1E6 053C7C9475D8BE6189:E4DD5474534FE9DA:F95CBBA8990F95B1 EBF1B305EFF700E9A13A:BEE63E65CAEFA450:E5CA0BCBD0484764 BD1F231EA81C7B64C51473:495FF947F6665F45:5AC55E4B79633B70 6424119E09DCAAD4ACF21B10:53C806C8B69CF03C:AF3B33CDE3504847 155CBB6F2219BA9B7DF50BE11A:2CFD97F2BD38C7A0:1C7F23F829F8A41B 13B5CA4EE8983238E0794D3D34BC:A83C88744DF51267:5F4E77FACB6C05AC 86212BAA1A55A2BE70B5733B045CD3:112C46B74BD7D1EC:3694B3AFE2F0E49E 4F321549FD824EA90870D4B28A295448:F12831C24A551F5C:9A0ABCD50E18A844 AC5BF38E4CD72D9B0942E506C433AFCDA3:0AB4EC81A81F5C6C:847F2DADD47647DE 321CEC4AC430F62023856CFBB20704F4EC0B:B2D3297BE75E9505:B920BA86C33E05F1 ECD96733B79950A3E314D3D934F75EA0F210A8:0AA5F1B82E138AB3:F6059401BEB4BC44 78FA4969E623D01ADA696A7E4C7E5125B3488453:7143592230891CC9:3A94FB3199903257 44EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA:90E6F543EDA1AC82:54D835E8D4668264 98D9A8877565705A8A3F62802944DE7CA5894E5759D3:491310A9E2B8B18C:51ADAC869580EC17 E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83:\ 302E436ABB2B6193:B4692F3AFFAF2716 93AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8:\ 1ED636A10A187609:ED9612EC453902D8 E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC:\ 2A02740B45449296:7AA6F2B4A8CA99B2 C2372ACB08CF61C9C3805E6E0328DA4CD76A19EDD2D3994C798B:\ CEA8016EAE33A92B:0022569AD418D1FE E4D9CD45A391C601FFC92AD91501432FEE150287617C13629E69FC:\ E584507E7606DD42:7281CD7165A63EAB 49CF714BCE3A75A74F76EA7E64FF81EB61FDFEC39B67BF0DE98C7E4E:\ 5A09D5EF7B21251E:32BDF97C8C6AC75B A43C02F4B2ED7216ECF3014DF000108B67CF99505B179F8ED4980A6103:\ 3AA4E5750CA579D9:D1BCA70DBE9BBFAB 0ED59801D6E5F2D6F67D3EC5168E212E2DAF02C6B963C98A1F7097DE0C56:\ FAC262455D9691C6:891A2B211B01070D D8FD8B16C2A1A4E3CFD292D2984B3561D555D16C33DDC2BCF7EDDE13EFE520:\ 32127540A949B873:C7E2ABDDA44D8188 [CBC-MAC(AES-128)] # A test vector from InSiTo (taken from Bouncy Castle) 00000000000000000000000000000000:\ 66E94BD4EF8A2C3B884CFA59CA342B2E:\ 00000000000000000000000000000000: # Randomly generated :00000000000000000000000000000000:67C6697351FF4AEC29CDBAABF2FBE346 7C:A2F5C113EBEE0F124B649287C7F7986F:C254F81BE8E78D765A2E63339FC99A66 320D:5C787D4CDAF3B4D106A7AA09F41BCFCA:B73158A35A255D051758E95ED4ABB2CD C69BB4:B32F25C34E061A972C49E4B0A0678AA5:54110E827441213DDC8770E93EA141E1 FC673E01:B5D6A0E8F3202BFF37796DB5EB920B7E:7E97EADC6B968F385C2AECB03BFB32AF 3C54EC18DB:F3896484B179F90BE3B62DCE3F748C52:5C021AFE43FBFAAA3AFB29D1E6053C7C 9475D8BE6189:100D2CDA97B85428D785D9EECC8D51E2:F95CBBA8990F95B1EBF1B305EFF700E9 A13AE5CA0BCBD0:\ 92A7A024C4F6D8C82C53030545C23C10:484764BD1F231EA81C7B64C514735AC5 5E4B79633B706424:\ E235CFD4C307E2B3D44199E83E5D83C6:119E09DCAAD4ACF21B10AF3B33CDE350 4847155CBB6F2219BA:\ 2379D24A48EF60E46807E92C1A602AA6:9B7DF50BE11A1C7F23F829F8A41B13B5 CA4EE8983238E0794D3D:\ D6DA42CAE5C664F3C4D597CF6CE1DDD7:34BC5F4E77FACB6C05AC86212BAA1A55 A2BE70B5733B045CD33694:\ 93990491923BF761B3220C1E45ACD359:B3AFE2F0E49E4F321549FD824EA90870 D4B28A2954489A0ABCD50E18:\ 9B14531370EE1EFFCF5A3BBC2161D25C:A844AC5BF38E4CD72D9B0942E506C433 AFCDA3847F2DADD47647DE321C:\ EB597AD53F1B208B4FEB5C20D78545AB:EC4AC430F62023856CFBB20704F4EC0B B920BA86C33E05F1ECD96733B799:\ 91C3626B64EA3B16E15C2F9B32189C68:50A3E314D3D934F75EA0F210A8F60594 01BEB4BC4478FA4969E623D01ADA69:\ F6251F1A89FE388121DED78B8CA9FD7C:6A7E4C7E5125B34884533A94FB319990 325744EE9BBCE9E525CF08F5E9E25E53:\ E55A004723589CAA843140BA5AC52119:60AAD2B2D085FA54D835E8D466826498 D9A8877565705A8A3F62802944DE7CA589:\ 53A217151AA961BBF0C7AD4AFDCB9B5F:4E5759D351ADAC869580EC17E485F18C 0C66F17CC07CBB22FCE466DA610B63AF62BC:\ CE21D27F4D455511CD327D205853EE85:83B4692F3AFFAF271693AC071FB86D11 342D8DEF4F89D4B66335C1C7E4248367D8ED96:\ 4DC9B5ED541B7382F0FCC7CFAB5AAFE0:12EC453902D8E50AF89D7709D1A596C1 F41F95AA82CA6C49AE90CD1668BAAC7AA6F2B4A8:\ 2FB0B595042C8D7AD592583D7E6C76F7:CA99B2C2372ACB08CF61C9C3805E6E03 28DA4CD76A19EDD2D3994C798B0022569AD418D1FE:\ AC464531064DA66A2F8591AFAB2931D0:E4D9CD45A391C601FFC92AD91501432F D4A628D05B1663A1BABEA82646DE1005197A63C1EB5C:\ A16EADA7B6D32D01FE75759FB6DE2E1D:F466C626BC51E907F0BDAE188D092EF1 ABE8AF530FF6311FFB4B995F0C84BB00EA8226A7D30FAE:\ 7D980A5E6DA633CE4FED22E815A1C5AD:C3CC5CDB5A660A4B11F2FA6401F09621 ECE1BA4BED3F06ED298813D05B237F1EEFDBFA4941049452:\ 425497C221479FC5696D3078D062E725:F68FB7F87F4D196B2ED3B61B12BD083C 451B0CA13E8BBF2E67B977A8BD0CFBB49BB2AC1AFFC5862D98:\ 90029A6EE195A0665D02997A844BE499:3C48ABF950E73F6BF3E0AA7F9FD8E659 4F8E165B89CAF63B76113A3B9767D4D3AF7FCDFF660C6B59EC15:\ BCA39FFF3C95AB00DACF2B2A9A37C7FE:D88BEDBEE43C4DFB98D6C58E123C9F4C 7736B44B0A63CAD76330E3CE8ACFE3625AD0213F0C6E3AA444FF33:\ D55DC707BA4568B0642E3D70116308D1:563BD2A3B30957FE13BAC9EA1DF9CDEB 839CCEE6F69E0735AB756F4FB96F8210AA55B35D5E0A5C71C4255BE2:\ 295F3F2DC91B300874147AADBF2132FE:1E28CDA2C49C88BA3A8FF0E5045F35BD CEB7CD790C80D66A8A32DB4F573631765EFE18229AA0DDD52FCDBA332C:\ 049AE1796CE825B2ABB88AA1EBE8D7D2:EFF0FBA7BE74B33E4A1EC97DF918D430 494A8E4762B1E2028EB7315B7164876155820813F6BB5141D91ABED33292:\ AD921BBF28C028B76D9E1B4F92D36DCC:037BDD91C33F42A542D05C732BCDD8B3 2E2D3536402CF2916DCBAC2B9EDEBDA15A9A331DDA75C21C461E8F71EB6724:\ 952D487FE1B8A1F63B26B2027217AC14:1A945A50D4864266F30E121EACF0DB4E 4A76816750F6296C3C47FBAE3363D24DF72C9DCCB2E032A5EE44C39A349FE87F:\ ED1B41F593FF135A1E6DC7C85A2F1A2B:1569E6656010D19C57CC4A8A2F1DD727 4975F3FC5525A1436965DD9D04C61C192F037E8F134F2C6A1B76F54B93CC72DD41:\ 29326E91479F46720D9D1B067B10E617:65D9968A7AD9F3DFB790E37DADFCACB0 7A3CC3C9682DE5DE223072EFA24F300728C791A2A08482571465D4C1628171DCBD34:\ 440A055C9D93DE336B725E0FAE8BCB3D:A625628B0384BB75735DC4A464EC6BF5 8F0B7911638D76374FD8B8C0B575F55B9A57E69EDBA1134FFED8F362C45E575369D064:\ 345B392931218A9395F08BD1A45A9B43:CC5DDB04ACB3BC6D683262C3CCB9A96A 944A7EE34856D6AA1A34016E9ED1D26A2FAD6EDB612B48C95DAA8D29633694F88112DBC9:\ 2D49E335B07A2519287CDA50D482FC48:68B27482E675F08447C3EF76705D51D1 889A9BE544280FA85EA3A0DFB57BA91D2D1D9F14929098D953874FC3E5A1956D3B30537F58:\ 900A6FB8FD5661FF12B7F391279DB085:6227B605C796BA433FD7705C7684EE06 1DC859A4171D89B8B2F7F3E24A733AAC9AF0B162866BA5C5421521B89A10BFB7D8185BEF35E5:\ 096DCD92F3919145B298201BC3820612:A8E7DC9BC9260E03D2A9F4830B7AEEB0 4030C561E85F71A71649C07239F557E1DD337CA6\ 598BAA2B349EAE3F189CEF58CCB4BAB4142B5C:\ 2E8B2AF6CFF3FD6AF55898BC1374609D:2A751C9CAE11F38FEE260B957F963FAA CADD5809F5F4F84EC0AD0875C133D1EBA8ED8856\ FE7BE5EDA2F1822187C1CC529E245B931954E1D9:\ 351E0741D63B5CCED0131A483C3B89F0:01E94EC21D1FADC50C351C0BB101F853 F27A747A3B40CCD965276C7E7B4E577C37A63E54\ C5EC1AD22136DDD237D5252A4F9AA48ADA70633F97:\ 5F144222C4B8C33CA82A85CCC177A0AF:CFBD131D158F55BBCEA980BAC352DBF9 2FAE3104D35B536DFFDD486F4087061045192D5A\ A98215772C9531EFE80CE917BA1A1C8E756FFB744D43:\ 5FD061418DDE0BB0A8A3E6A4FD5BD2A8:E38DCBE99D1003CB6AAC4D7F23791454 69FC6052141B6C30A9E19FA455ECE8387AB32117\ C324E22DD030ACF3A9C04712BDA864D1C3D0016CB1A010:\ 73E376B5D0B9466453438B5CEFB27EEF:068DF83E07AB601E6E84019B55314748 DA0890EDC5385196FB229767D33777DAC47018CB\ 1B78EA8AFDEB25521C6D9AF6752AE33A6235D05D5767C42A:\ 03F54C4F6B9E5E214BE93289CB2F2D4B:9E3C0463AC1D2EC7951851920377E41F E47F1659A9F9930C2E636985CA2EB0686AB4CB16\ D1FADD67122FF916A6DE358A5D4BE30645761273D97CF9A3AA:\ 9FA99D925751C9613D3A8D42E3B604B0:A90B145DD72A2FD10796E3368FF9DC6D 2F66CA7A49D1BFBFE333985F2C3B09D5471D321E\ 4761EF4FF7D28587CC62F4FBC8BF75129035D173686AD394A5DC:\ BF0557B787C01A589BBD6EBB83F3A330:69ECFA9B0A41FDF990F4CC167B987870 # First 4 vectors for each key size come from a paper, they were # generated by Eisuke Kuroda and Yuki Ohira at Ibaraki University. The # rest were generated by me for the EAX specification. [CMAC(AES-128)] :BB1D6929E95937287FA37D129B756746:2B7E151628AED2A6ABF7158809CF4F3C 6BC1BEE22E409F96E93D7E117393172A:070A16B46B4D4144F79BDD9DD04A287C:\ 2B7E151628AED2A6ABF7158809CF4F3C 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411:\ DFA66747DE9AE63030CA32611497C827:2B7E151628AED2A6ABF7158809CF4F3C 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ 51F0BEBF7E3B9D92FC49741779363CFE:2B7E151628AED2A6ABF7158809CF4F3C # The rest were generated by me and are non-official 3B2E8F8C7838FDE9610CE6FCC10F854AEAAE3A2184832A:\ 6B642B7D118A78A160B7EA0E11789A99:8989DA29F037D54809D39E0F21BAD66B 9951105BBA18783C1AF2DC8F88A9B98C9E9C5502A1CEE559:\ 7C05D6851E344F0F725CE228A5E91F40:2903F5E3C9630579E3B7F9E97E141494 94D6C4C8EF018F83115A27B01218A7CE29A715FE32C90AAB84:\ 1C10A73B946DBFABCCBB21C93990AE5A:F7BC110047D58BB40C79BB46697AF357 DB170C579267ECDD54DFE24695B56459160530EB62EC7A9489A3:\ C27600E6310E45A698C5F5F8BEDFB6DF:1EC461A0D7D45DBB8F329D28FD1120BF 52ADDFA309053D90A9C807EBB9B85D28C8BD6F6463247B20726170:\ 03E0A715698908157EC2CF38A818092C:726F0F60469CA5B517BD4EE64FEC2198 B47B761A8FBA35F68E25B097A17191F2A9DB4D34162E1242BFEAED88:\ 97442B172B28A4C98BD1CB2A4D1634F3:FA51384A5B8B3BE1DD2C91D8ABC9E262 264D32E2A14653254743926ADB7CBB4DDF1C55DD0F24429DBC4BCF718E:\ A6945844614FB76BDC75BD488637E34D:5171636008FDF3CF658D980932B44394 BF685A96FE74FC30B14285B1479A1591D92CDAE6BBBE678A193D3AB7B360:\ 022D9710FC7641F76728136323870565:644A3F16490C8FE381CF5BD6B09E7525 415D0574EAAE71B878EC707F50A850A196CE448AB4274701CF27CD0EF5A2CC:\ C9CF027DBAF268A9B7304AA8E3F5BAF3:D151ED7EA3F4E6E3BD4DA7E0CC3FCED5 A39FA8261CD507B473C53E7B6BC2A859AF5A1E7E38F3938230A23470E7DAD48A:\ 79171CA85E8F2821B0889A259491CFDB:2DEEEDB2C4CEDED515493D0EB23F45A6 F688810E10DCFE4A64:61364AD45A2E15C8EE119CA8C36FBFA9:\ D5505FEB66C306AFB167E1B240682C1A C280CBC1:76EA6672EEE06EE1050365F4CB404D66:D1CB929113E995A13D9E0B5FF068CF2C F610:5AFE8C966695BE3B4FCEA22F5C27B059:A7A252D3AB457702263B837F48814AE4 3D5E:41246CF56814027408D33634109C9C9D:7B3ED445B003A4839266B017B7F8226D 741D:BB170239A6A86DC4906F8FA56222F883:25F10513DAC4792CBC0A76A1603E3CFE 2D225860EF0FF7FFFA2040C60077560E5AB737B9F9AA689C11B35480AEABBCDB\ CD143CBD2433BC1E54FDE454743B63CEF29A87EB44EF8756A2DBD651:\ D36509415886167C44D9208EF5DB4C5A:900EE360285E4273AFA3674BB76FFB57 DDE273DA5EE3F41B370A7C10B706FE82AB82E7813BA44162EA99514218C3A4F5\ A517CF03FBC41E32CE9A4385A141074CC3EECDFE930E607DA8B1C0C07464B61A\ 7C851D77493CA918D6EC9D772DA5C3F19391EF269F50A44701640876C8BE9044\ 43AD:DE5E5B64B403E3772CCB13E175C734FE:\ EDCBA48465D6B8BDBF274658EF587F72 85380139C424704AC24497634E9CBFCEE21E0F99CF3AC8F9C6AE2D6FDD091363\ 41149C05380C4FFA50E65D9E831D6C653B7BFE0BB5C6047C7431EB513AFEB47B\ 1250804B5DD045ADB6A34C39C0B89EFB349C06E9620A65D63C5028764EDCF261\ 2D72AC8A42F137F9948332543CD150706D5659D061BFA69D0FCE135EAB05BFD8\ 786B62BA5C99B3F11DE64559B795C924EC22F44DE19BEAF169FD4F14030EEC7B\ 794E35D5E8E9C6:\ 3015A6D16CDDF7E1E8C28521F4064A28:FB565C5DB38C2237869ED34CA10A055C 7B326530160FE8CFFB68704022DE43BBB54FCD83BF4C554774BAC625441C1DBF\ 4F82F06591D8348C40A4CD6282101D3860EBBB1F371166ABCB2DD00F49EDCF98\ 6FBFFD0197328DD7D65A39596B5791CB424CEA795D5024287DF438C7E1075F50\ C65D515D8FDF3465396DBEA4C44F6F069C597FF9AAA32227:\ 39F2933F156616549749CCAEBF682322:\ 0398D70C12CE6F7ED28828647FB18A56 [CMAC(AES-192)] :D17DDF46ADAACDE531CAC483DE7A9367:\ 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B 6BC1BEE22E409F96E93D7E117393172A:9E99A7BF31E710900662F65E617C5184:\ 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411:8A1DE5BE2EB31AAD089A82E6EE908B0E:\ 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ A1D5DF0EED790F794D77589659F39A11:\ 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B F4FF3C7E2F56F4:E1D41EC244EBC98373457A95685D0EFB:\ 76BF48A88F0F5531C4D1A14846742CE39B8D8827F863ABDA E2C0FFB463EF4B6EC114322FAFB8:D25D89E8CE9685D975C645FB2A19E50D:\ 970BD2C9C46E9B85E13949E13D39B466A8070F40570D1070 [CMAC(AES-256)] :028962F61B7BF89EFC6B551F4667D983:\ 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 6BC1BEE22E409F96E93D7E117393172A:28A7023F452E8F82BD4BF28D8C37C35C:\ 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411:AAF3D8F1DE5640C232F5B169B9C911E6:\ 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\ 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\ E1992190549F6ED5696A2C056C315410:\ 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 B664B2C219D625DC472EC765605E6D5822681C5E9FFD10645B:\ 3FC310BAF6F1A39FA25AE7DEA104EDA9:\ 19449A56180CB52462C37109EA1D329708F7C4FBC43B37E1B2C55E38F5551C0E 6540E334A0024EFCEB621E91B94AB6E5A6D4D085D986410B113A5B6E319B9D96\ DC80CA7C8319786E7B96FF34E0B6:\ DA97AE2997EB3E74B35C6A6FD5471F8C:\ F0D16D00B5CF601F1A5BE91422A5562C252C5C1DEBDF05B5BC328BF8505DF740 4DD7C1974501D1E454D23C509FE2265BC375CA:\ CB1C20084C5DACB3270F118633DB4F33:\ 420D2C372E496D403A9F520158FCCDA6D6BCE14E6EAD2B90918B919E5E8621A0 # SSL3-MAC vectors were posted by Thomas Pornin to sci.crypt [SSL3-MAC(MD5)] 00:A856430AF077AE2C328D9FFE4E56813A:0123456789ABCDEF0123456789ABCDEF 01:96279D16E7812EDDA2EC64DAC996348F:0123456789ABCDEF0123456789ABCDEF 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\ 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\ 0123456789ABCDEF0123456789ABCDEF:475006C7DC7A3F371352D948B4BE950E:\ 0123456789ABCDEF0123456789ABCDEF [SSL3-MAC(SHA-1)] 00:DD2BA1F4A721F22C8A9BA7350B5CD6838B225827:\ 0123456789ABCDEF0123456789ABCDEF01234567 01:CD6289A1FEC0BB104C271BE488343BA92328B073:\ 0123456789ABCDEF0123456789ABCDEF01234567 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\ 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\ 0123456789ABCDEF0123456789ABCDEF:98E523EADE38B3BF4EBF51D7EE814316C9EB3159:\ 0123456789ABCDEF0123456789ABCDEF01234567 # From the NIST submission package [HMAC(BMW-512)] 53616D706C65202331:\ 7017DB5D590A803ECDD0E87818083D657BB85636ED039BAAD3185D8CAB82E017\ 2D1957757D6E5E2F288D43E032635E8FC4B9FAA9FD445CB1161F7786D805529F:\ 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\ 202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F 53616D706C65202332:\ CEF9110B1F90A24080C8CE794FD922F8669A1A0A74299DB9789D9BD9CCC8BA7E\ 9438BD2383F14D3C9278FDB65C0A3FCFCBF2EB570C08588488F5F9AF428D8F67:\ 303132333435363738393A3B3C3D3E3F40414243 546865207375636365737366756C20766572696669636174696F6E206F662061\ 204D414320646F6573206E6F7420636F6D706C6574656C792067756172616E74\ 6565207468617420746865206163636F6D70616E79696E67206D657373616765\ 2069732061757468656E7469632E:\ 8519939233A4547258AFB322FAABDECFBE3F99B83CD0F760944B3F9B9FC0CD2D\ BBA98A069CC267CA80B53D9BA6D9E89C5A02173C661E5E715902D5F5B23FEA9F:\ 505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F\ 707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F\ 909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF\ B0B1B2B3505152535455565758595A5B5C5D5E5F606162636465666768696A6B\ 6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B\ 8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAAB\ ACADAEAFB0B1B2B3 546865207375636365737366756C20766572696669636174696F6E206F662061\ 204D414320646F6573206E6F7420636F6D706C6574656C792067756172616E74\ 6565207468617420746865206163636F6D70616E79696E67206D657373616765\ 2069732061757468656E7469633A2074686572652069732061206368616E6365\ 2074686174206120736F757263652077697468206E6F206B6E6F776C65646765\ 206F6620746865206B65792063616E2070726573656E74206120707572706F72\ 746564204D41432E:\ 44FCDF6C712B75BE3CA93EB2F98ECEAB23D7C5A3839C2D267CFE0A9A202E7375\ 6B8B30882D94725A82D2C705B5256154231EC14756CCF4A7132E911CA24C1AAB:\ 505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F\ 707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F\ 909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF\ B0B1B2B3 # From draft-ietf-tls-seedhas-00.txt [HMAC(HAS-160)] 4869205468657265:\ F5B44115A53F716B6F488DE1098EE7C251418623:\ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B 7768617420646F2079612077616E7420666F72206E6F7468696E673F:\ A74547C1EF0AA147C7428AB7E71664549BE2A412:\ 4A656665 DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:\ E4C91BC71782FA44A56BE1A34AAE167E8FFC9734:\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD\ CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:\ 14D1055DA875222053BF1180BBEF8892EBA3AC30:\ 0102030405060708090A0B0C0D0E0F10111213141516171819 # The RFC has this one wrong 546573742057697468205472756E636174696F6E:\ 124131A293F1FDF3D6B11E2B7F7A1F5B12E42D58:\ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C # The key is HAS-160(AA x 80): prehashed because Botan's HMAC accepts # a key of at most 512 bits 54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A\ 65204B6579202D2048617368204B6579204669727374:\ 63750D67AF40E3FDE33526545D300972A1527053:\ A766901C8630F7DB3A3FC2A9747A6E2593452BE7 [HMAC(MD2)] 50752120507521205075212050752120507521205075212050752120\ 50752120507521205075212050752120507521205075212050752120:\ 3CC6A661CC76DC9A617C967EA7E1CDC7:\ FFFB66FFC4F304CBF3B2A3E293D856FC3B30A9DF82DF3D17DDC300215A89CF23 43617264436170746F722053616B75726120346576657221205E5F5E:\ 93B02F8CA34C52F33A9BDCD75D3558E7:\ 93837AF03A1378796B2234EF3CA009AFEE599FE446EF7B3043BA273A5A4DD9 53616B757261204B696E6F6D6F746F:3F0EFFE820B7F02939656A3092F9E657:\ 17DB32EAA8FF99C81EC3C063915A122A51FD32D70C76DB07D788 [HMAC(MD5)] 4869205468657265:\ 9294727A3638BB1C13F48EF8158BFC9D:0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B 546573742057697468205472756E636174696F6E:\ 56461EF2342EDC00F9BAB995690EFD4C:0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C 54657374205573696E67204C6172676572205468616E20426C6F63\ 6B2D53697A65204B6579202D2048617368204B6579204669727374:\ 6B1AB7FE4BD7BF8F0B62E6CE61B9D0CD:8FB6AB01840023EC453ECDEC73DC1B66 54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B657\ 920616E64204C6172676572205468616E204F6E6520426C6F636B2D53697A652044617461:\ 6F630FAD67CDA0EE1FB1F562DB3AA53E:8FB6AB01840023EC453ECDEC73DC1B66 [HMAC(SHA-1)] 4869205468657265:B617318655057264E28BC0B6FB378C8EF146BE00:\ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B 546573742057697468205472756E636174696F6E:\ 4C1A03424B55E07FE7F27BE1D58BB9324A9A5A04:\ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C 54657374205573696E67204C6172676572205468616E20426C6F63\ 6B2D53697A65204B6579202D2048617368204B6579204669727374:\ AA4AE5E15272D00E95705637CE8A3B55ED402112:\ 4CA0EF38F1794B28A8F8EE110EE79D48CE13BE25 54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B657\ 920616E64204C6172676572205468616E204F6E6520426C6F636B2D53697A652044617461:\ E8E99D0F45237D786D6BBAA7965C7808BBFF1A91:\ 4CA0EF38F1794B28A8F8EE110EE79D48CE13BE25 CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD\ CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:\ 4C9007F4026250C6BC8414F9BF50C86C2D7235DA:\ 0102030405060708090A0B0C0D0E0F10111213141516171819 DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:\ 125D7342B9AC11CD91A39AF48AA17B4F63F175D3:\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA [HMAC(RIPEMD-128)] 4869205468657265:\ FBF61F9492AA4BBF81C172E84E0734DB:0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD\ CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:\ BDBBD7CF03E44B5AA60AF815BE4D2294:\ 0102030405060708090A0B0C0D0E0F10111213141516171819 DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:\ 09F0B2846D2F543DA363CBEC8D62A38D:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 546573742057697468205472756E636174696F6E:\ E79808F24B25FD031C155F0D551D9A3A:0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C [HMAC(RIPEMD-160)] 4869205468657265:24CB4BD67D20FC1A5D2ED7732DCC39377F0A5668:\ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:\ B0B105360DE759960AB4F35298E116E295D8E7C1:\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD\ CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD:\ D5CA862F4D21D5E610E18B4CF1BEB97A4365ECF4:\ 0102030405060708090A0B0C0D0E0F10111213141516171819 546573742057697468205472756E636174696F6E:\ 7619693978F91D90539AE786500FF3D8E0518E39:\ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C # From draft-ietf-ipsec-ciph-sha-256-01.txt [HMAC(SHA-256)] 616263:\ A21B1F5D4CF4F73A4DD939750F7A066A7F98CC131CB16A6692759021CFAB8181:\ 0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 7768617420646F2079612077616E7420666F72206E6F7468696E673F:\ 5BDCC146BF60754E6A042426089575C75A003F089D2739839DEC58B964EC3843:\ 4A656665 6162636462636465636465666465666765666768666768696768696A68696A6B\ 696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F70716162636462636465\ 636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D\ 6B6C6D6E6C6D6E6F6D6E6F706E6F7071:\ 470305FC7E40FE34D3EEB3E773D95AAB73ACF0FD060447A5EB4595BF33A9D1A3:\ 0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 4869205468657265:\ 198A607EB44BFBC69903A0F1CF2BBDC5BA0AA3F3D9AE3C1C7A3B1696A0B68CF7:\ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B 546573742057697468205472756E636174696F6E:\ 7546AF01841FC09B1AB9C3749A5F1C17D4F589668A587B2700A9C97C1193CF42:\ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C [X9.19-MAC] # The first three test vectors are from ANSI X9.19-1996, Annex I 31311C3931383237333634351C1C35383134333237361C1C3B31323334353637\ 3839303132333435363D3939313231303030303F1C30303031323530301C3937\ 38363533343132343837363932331C:C156F1B8CDBFB451:0123456789ABCDEF 35383134333237361C3B313233343536373839303132333435363D1C30303031\ 323530301C393738363533343132343837363932331C:\ AB4884061A159618:0123456789ABCDEF 31311C3931383237333634351C1C35383134333237361C1C3B31323334353637\ 3839303132333435363D3939313231303030303F1C30303031323530301C3937\ 38363533343132343837363932331C:C209CCB78EE1B606:\ 0123456789ABCDEFFEDCBA9876543210 # The following were sent by Darren Starsmore (he has access to a commercial # implementation of the X9.19 MAC) 3330303030323031393543555354303120202020552020202020202020202020\ 202020202020202054303253454154504152594742324C54535435534F414131\ 3939353032323731333339343430303030202020202020202020202020203330\ 30303031304139354558413030303030333144:\ DBE9EB0FA03838D2:4061610D85685DB0F4D9F1C8FE15A123 E7EF0EC901CCC8E5E44579A25AAE7FB82FA475ACD95F2DE313C5C2B7BCA63BA3\ 95496C9615347CFA7AF59CD4A31C8DD3C0027F9961AD7C75723E2C2EE467D279\ B13E10C6738CC0ED815DC125794EF8395177D2B2244E27978D53C571BB97EB6C\ D6FB324987F3360850F72DC9462502979DD449C1227158AFC41E217FB50CEB8B\ 071ED48E110A966102C42A48E92CDF860028482299A0D25EBEF3DD74FFC9FF06\ E7D494F8DE2A59E0EE8328D8AF075EAF30A6D1C947A3270596057995CE799BB5\ 4D2FAD2B5A060C48893420383C7FE76C25B8356C5C5D72F262EB88306423E5B1\ 5392DDAD98E9F521:83C4B075AF24AB7C:BB296726F91480CDC432AB3067536EAB 12916051C77047C9EFD1E3A43D0086D9899AA28818BCCC5D8B5A0A848682F898\ 1359E9DAC931A4B902875D3F87E318107DBB98967765F302BFFD8645807FDE93\ D8C76EA1F8125AFB99B83A209B5331190EC9AF852EA287EEA00D33208C11B364\ D92106D13360CCCC1807EDB45A1ECD68E77CED161E7404BE8137DE0E49927222\ B378F3E7D9C0B3F1C7A0A521BE7289A6EE76BC0DEAC0CB6BF7AA79403CEC62EF\ 6456D63D168A2FDD2AD4FEE947878F35FD4B42E70B0E5202B8CC43F4B8A5E31C\ FBBA5A114489EE6E5DEC57A473E6DA70311C573C2AAA3FE2:\ 31174049F029EB36:214B48AB97E144F1005831C8C97B8EF0 # MARKER: KDF Algorithms # Format: secret:output:salt:out_size [KDF1(SHA-1)] 61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A73\ 6F6964676A736F6964676A736F696A:\ A0D760447F105CE64DB99FF2FC92F961F24E7D9C::0 61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A73:\ A0D760447F105CE64DB99FF2FC92F961F24E7D9C:\ 6F6964676A736F6964676A736F696A:0 61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A:\ A0D760447F105CE64DB99FF2FC92F961F24E7D9C:\ 736F6964676A736F6964676A736F696A:0 617361736F67696A6F7367696A736F69676A736F6964676A6F696A6F73646769\ 6A736F6964676A736F6964676A736F696A0A:\ DBFEFA0EA12D352C4AE5B0AF17D061E0E2C469A8::0 617361736F67696A6F7367696A736F69676A736F6964676A6F696A6F73646769:\ DBFEFA0EA12D352C4AE5B0AF17D061E0E2C469A8:\ 6A736F6964676A736F6964676A736F696A0A:0 [KDF2(SHA-1)] FD7A43EA8A443C580C0DE618ECC013704505EFF8B5A4A9:79:BF0B2ECD1724A348211D8C0CA7:1 701F3480DFE95F57941F804B1B2413EF:FBEC:55A4E9DD5F4CA2EF82:2 BEEA23BF806E106D0C91F8E87095AB402C433C581088E1236FD20564A8F1AF67DCD2265C40:\ 78F8E7:36C94DC7C2353757E0778323B3DB333BBD57AA8F5C:3 5A6999A96594B0989B89CA72B5C0803043D4DE78709B490EB98610:\ 84C92008:5F0F820B69ECA512:4 C6E227F3F9BB5227BE37D6CE7433022D5F0DFFE18C5777EBAF396F1E40C4:\ F518EEE6F2:CC06A6F3F9A0AF4CC76D839D:5 CD6356CA771E3FCC4BB548B4E6EE4E3715EB7A4A806E4967B1:\ E72EC27D6A81:221DA543:6 B7FA7917A833B0C0364FAC414D92DA:8E54D1C86DA8A9:\ DC32AA175531CF88C8D55A51DA5CAFB314A92C2B52:7 8A14:A2FC623645F9AD29:65A907357B5CBADC5C5EFF7065AD:8 135FF7296DC87F5775B64F8CFF46D366C10A8A98712345CE58CD5839E9:\ 73036FBD1941C7955E:A439FC03312570F9A4C76E5B17FA:9 AD499722078DF83AEC1EC23A507B190740B0A6821F8C:\ A461A98B6BBBB0FDB0BD:3772601ACF052CD530D91EC7:10 CF99B7A985C223BE83F999D7:735BFCF26A4357F5642964:\ 055396C3E0EE8190DBE10212AE099FF0BC0A8D:11 B640D21A1FECF5E61D79E1E09C2393915D5790EF8080E7F6CC18:\ 6DB9BAE99803B2EB725FA8B3:5AE5506D6306:12 F69885268F3DF8488490419F49CD39A54D0D8C9A3861D375A8BE:\ 2A1EB238B7CB39422DE263E4FD:C1:13 DCF4DF1F6B5D71DF98ECFFE8A4B7C5E7234AFC10CC0C941D853BFC32487A:\ FCF8D9D4E43318EFC0056EBCD271:\ 7F246E5F44DABCB5B954A1B83D456F022C924D29A21935:14 BD2EDB4CCCB0ED3D01BA03D1A816425E40ACBC7F214126A6775AFE28B0B2646DE040B9ACF0:\ C669ECC95557FE8E49457576BDABD3:\ A7E9F261EDC30903056744B123C3D364E979:15 3185AFBCFC621B6F9FFCBB75C7E71A4161A0AA39278676:\ 687481BEF8354C8D48D8F5A5F3D9ED3D:80834249A9A4CFFCD655AB92:16 15723A13E56CA0FF5EE43D8A4BA8284B4A946D861F:\ 439082061EBAE065C434932D981603AE1B::17 92167440112E:3A5DC9AA1C872B4744515AC2702D6396FC2A:\ 45A9BEDED69163123D0348F5185F61ABFB1BF18D6AEA454F:18 208AA86616B4133903946BA8:A267CC65619C84EF5FE1744EC3A92A06B99399:\ CF08208B76D97F:19 04879F0DB43E33435D53F0DDDC72BEB957F04F2CA5E8FB38DC4F78:\ F46E2675B807CC42FC1DD4C84A5BEA3AC175B093:2B688B3F6C12:20 AAF175079CB9CD462EB2D4D62440EF18B22AEF1552CE5F04EF0158C177572D21:\ 5A3796C9045712759E6DE769E5049E5829408615DC:\ 48A228E55BF52B89A8FF5FCC3F4EE4F178D406CBA265CF9166:21 901BBA708DAE7365ADCCB7AE056729B5DD610226966B084A02D1E8:\ 8A397BBA8EA862DCD004897304B901784513754E9FF6:\ 3FCD4A2A5D65E4CDF29241573F:22 D20CD658:5C893F99FE81F1E955F2A7CFEC4F50B7CCC890BEAE4768:\ 17D7E5C9E3DB69B28EC9:23 B669EDEC3D9A78:1A4DD8282E8B4D7A739030FF60CD88C4D3C0E5C3A0DEB127:\ D072D0:24 349AD0D9BEA0D29C:678051858CED59674C06B60EE21D18ACD55C10B049B22F5CFF:\ D4C8D8DB185F7EBBEC046ADC49A26DAA172F81E3:25 B809759B369EF9B2F34A0254AAE645:\ 1C2C3C95529E4C8E5677F714E122A2E348810379B09689FA4B30:\ D3EF4B914359E78F253FFC8B9B6D711E257B94:26 20216E8DCC3AA461F9FEFA4BE06F3C63BB:\ A24D44F5194B4257B92CF85C8493B5BDA52515E18337280C45F005:\ AD13544336F28B8F1B2615BB9658:27 40923A6409592A370301A859F1E797:\ 4C8919843B73BAA06853E1C8D9D4B18518CD857A624BE3EBBD507BCF:\ C3D9FCE8C68AFD0F97D21AAE826ADC1EAB6F580F78B139B0B43B58:28 26541874BEBDA8DB76CCD60DE28E65E91CC5F128B9C56F6609185F108337A4A98B:\ B16B3FAD79618B39D2FB0983BDE7D3E8C17E2DBF2C2853CE8D92191696:\ BD1D497AC525F091FBFD7389635DA5284ECE:29 5D17A9CFD9994A1CC1F0AAC3C48F60C7DB:\ 1233A118E3B025AF2240F2AB14A61777A1347AE58033B2FFA313946631B3:\ FC56:30 32048974CBE67FE8B4E6C0D4E21035B2A657E7C5E3592A61A2:\ 5301147F08E1D473F82558F815498F7421D8C501056402F77A186779A6C5C8:\ D6ABF65542:31 F4E8338789D14BCD31EAE46199DB1A86AC76B8611809DF4D77279F53CB0F6DBF:\ 90C528975E02E3B5A9970B0074C02A691401A7BCAA94A8B731648A1732806D6D:\ F7A146807292:32 0DE2DADDC876B4B0322B3B995B43B580B4D5DF529F4E29606F825AFA72:\ 41163C646606A0B96EE1FA2783AAD072260670283870BB8A510A693D01F9C0A5D6:\ BECB7FA1A65C69:33 CF00B2A31485DCC4D6F9296D219F4831CE80A0043CA937F9712DCD1C0AF02BD9F0DD7C:\ EFEAF89E578CFC169570F08452C42157EFB9905D33DCD97DF29A4CD626F9DF539E3E:\ 046259C93952F2:34 EE67BFB3A6F4CD:\ 1D02C4CE8D6AF08F2A4E8660718EBF8031C640B7502BE5F1F2EE91CB35241952D63BB4:\ A85EEB10A12C6B8DE05642:35 BC02C1:\ 6D3B84710944B5A4448455C22D5CF21852123816A33269ECB29DBCB10616978FD5200FB6:\ E2E57EB395:36 85B2DFCEC6D020E7DD45933451363AF111346D52E1BA4B168D47BE178F:\ E43AC0F5353A0ED3C35C1EC0BEA6190C49A9F8925E510DB762441BBAF8B798686C1BE6D84C:\ CA79147C58E3422803290548BD3999F3738A04A8:37 6E757BDFE044D00A96AB79F3CEB27F96:\ 0A18BD32469D8FCA917A80C173C2E01B2C9E2AF978CDE34E5EFF933B563F3B26842778BAD326:\ :38 26E7CF534DAF8F9243C5CE3297D807D1C6B4F0CAB16AB5CED3C737:4A:8AD8F6:1 166C66F4B39A17A2:8AEC:81:2 8533C513D7D26ECD416DD3DC:030CAC:52474087F2:3 E876D64472865C8F4B7F:A83C863B:BA88B207:4 15AC949219878463A7B1A6599ED9:AA28AD4916:E79A373588F3:5 D288A4BBC027594788F81964C74F:5777F5478B70:06:6 84D3564BA0AA5A0DAC7AD62F88D9373B9DB280D026AF0AE5BCA633AE36C24ABA95A005:\ 934CEDC65FDE09:364A60:7 5977D030DF4051B9FB03167331C6B6366A0F8CEC71B69FFB1FDC9469B5:\ F09FE23B9C34EFC1:E734:8 26A51955CBF815122460E803F1B399F617A4AE1CEE:\ 17A5BFF10B516A752E:0E33D563:9 EFB7C556790493E3C15B513CCD250FEF4BA7878585B8E50E1009C56BB146B5A0:\ EC92ACB1367E34CF1361:FD7B:10 F2EAABA8E42ADCC55CD36A2C78DD0325E55C1B4E9C6BE9F77966BFBD623CD454267FFC0BA9:\ E0DC1C8E9071A644ADEE46:D8D005AB3A3123:11 01A8F53F2BBDFB05D41E9FCCDD85CFBD4BC0502C:\ 1C9D86C49E9F3DBFF9674A11:6E3EAC35BA:12 02414433D5734F:EDB45D5FA17F17147645DD8DC2:70:13 13EC731CB6C29FC4350FE0DE63FCBB5A6F3568E05250099715795D51C5AC10D89883F44E46:\ AA07990CEAAB482272FCB3A3AB46:93127BA3F25906:14 2BCB12D2E40A5BB81BE4297F9306:3F450384BEB9C9A478F46F051FF152:67:15 4DBF180733:0FDFEE8AF8D926763E28AB284C7B8040:54C4:16 BD3E9044AD45F1E710529172837597E7BCBC2C27505187:\ 0E4FD5D562490C5FFD0A37588344D86347::17 822816:21E8AEDC72151B03D2F9A3E7CD9CA6805FEE:C1:18 7FE688:6701CD19F736B12C067D58FBF0D024E695C18B:C9:19 1EC869F1476B8C7C537E8B1AC4411A10332A7DD06645C835EBBB3CEFD570A9:\ F04DCD7617D96283E463511A1A9313006EB6BD4E:F338:20 6C78966EAF4DB43ADC3865962F292CDC81:\ 9093D86736C445B12843AD189410984F8B912281A5:D4:21 D85C07E05DDA286A4A1B9191A929FBE1D19D:\ DCB8FF108AAE1B16901CABF9BAF0AFC4ED1B20A72312:\ 138399:22 597406:AE58662CFE38E861B289EF9E3146A37393C798BB7ABEE0:D5A5EEBC47:23 33460E:6A85B3C6A5A6D0E1734004B788FE84C744BBDDBE42C32ABC:F8A648C9B6E9:24 74BF53754034B0DC:BDCADDFCCA599DBB24A2789DEAD088EEA633E8A15A03B65291:89:25 F6B3A879AEE95C1604EF005F90D35EC4621F6BE5D52F65F1BF192FAD2D22C223D66B9C8454:\ 9FA401DABDDEFE3B64702DB7395950A357CA32A501E43CF6DFFE:F89A58E89B:26 5C90E327068324D80B780A10646E01F1C57D4F67E2BF9322:\ F95C1618F2F62B9EB4516E0AE68D38658183D30BF3B97B63BBAEB6:C13297:27 F88AEB2006224184F1231BF42D63D2BA69C88ACD47C27996232EB2FCF04647E8D03308D6:\ A7666ACE2515FBF42334F21F48510174CD8944A7397EE0F0BF38262C:\ 55495A:28 B98B0026B2D40DD0827B58090D2698140A9CBB3B13F5:\ ECE9B1E55CCF257F2C7BA2B39BA852DB81FE9B32DD08130CB6041CB349:\ C1AA:29 F8BEF20480916E2762A77D00:\ 1102796B06234073DC6913318D65010A4F4C9E95358DACB3CE0D08857B28:\ 1CE36F6EC8FE:30 80C9D5FD0C7BC1278F74975303D1F94600877754FCE3B8:\ CFE56E573F2933E1728B3367F4EDAA797BE7C843B89250B98C4EB3BAF2E4D7:\ EA8332DE20:31 2EDB67D2CC64BF4B62:\ 52E44DB4B04F9792243508B969FF730779CB2A1EDF764324D11C14235B055D30:\ 38D7ED2715EC6F:32 86D77225DB6E5EA176F5DAF433E4C2C804B24FB22F2747FC5D8978189842981F19:\ 02BF3A2F5009054AF526E277EF6AB436BD8B7A53A3E4C2671F1E34556239F97453::33 C73E664D445C0C60C59CEF54F10ACEAA456E6BFB:\ 4E984339A1FB20BD73894494B36CE8C1182BCB0D289BBAB3BBBD366B1DD061BB9E16:\ F8C579F9:34 0651E961BA3374DE7248CE52EFC948809C20B8:\ 36AEC134DF567B1FBF448D0C56C6B62E40A375BDC74A2D44E415BCD105B48317145D95:\ 43:35 BF5BB2:\ 6F7533ABD09546770D6E71769A645B0D3BFA6D578B7B9B182D25CF8F8B4394C2BBDCECAE:\ 159B4039D67403:36 64353C0E4D64C60C3F2FEBE1C6466E57FB28:\ 7B80CD69345CBA9E46186372DD6602F2CB55496364CEEA96823110E28CAA68BB200F56F37F:\ EF4AAB69:37 6FD4C3C0F38E5C7A6F83E99CD9BD:\ 02AEB40A3D4B66FBA540F9D4B20006F2046E0F3A029DEAB201FC692B79EB27CEF7E16069046A:\ DBB986:38 [SSL3-PRF] 6E60:D626B75AB8BD4F5B9458BDDA8589FD39:17FEBCA565786528F84A:16 66BEEC6EDE7FCDF50B76EBCD5C0FE0A472F2EA8B1E2BE2971E49CA:\ EB:5C461D77ACDB631ABAE2E7AFED5E9ABBBAA99B:1 1171D78F812512DEFBA258574E41F2832BB9B359EB0CA79E7669:\ 2C8B:73D677854D88F62417774A2A5645CCAE9C1AEF8E9D1B48:2 6162DEC990B2132C30C153F2B200:1B9430:2666F0B22E8E48DB1640:3 D3C0DD69C18F17D35C5296FE45F0:C7C19FCD:320C9EEC122C19AFB8E90F72:4 EE6A733EC671DA7477AE18916895A133CC92E23DBACEE2634846CAEF0B08:\ C264D9D0C9:B7F9722B37389C11:5 97D7F3D2AFB3198862F6FAC8B17CCEFB26:C1CB767626AC:\ D3583CD13AC119CAFBD44CAEA5AB:6 E87A9BBC656884A13295B8D4DD4645905846C249D2470ACD2BE5:\ 3DC5B6402F451C:542D044668EDC104A9266C2EC79EC37F72A0C6B7301EFDF267CF39:7 7463F0B9F822E17311E47680DC5B505811E9:FE4B1DA4EDA36820:02AB98439528C994:8 EE8999703E5D9C628AA404235F3C94C3A890B1:EF317D3E81DAEF0F89:161DEB5AB705BD15:9 AE531918E679D2D7B32C61BA31415484E9725B2905095819:18D5272345C1695BE38C:\ A162AC0F0AB41CB80735D1EDAEA3C562CF261C0067:10 8FE402D6ED0BD018A532FC063E7D81D97CDEA7:D61088CA1CE8944B17CD3E:\ BF7F091B6E0DDB90897B6BF80A4F:11 4279DB52505E7B505BBC26CE0FBF2F4353086C1363:4A84A8E829528393FF890129:\ 8710A8A12B2D18A27A50E5F32C37448A:12 B80B58DAB89B1C4D1335C48E479220E253B8EACFD64319544A:1450E50B7D86B76015930BA420:\ E9158BA5F6E25D013A37B9D65406E989CB77D05D97B2B04F9C7F26DF987A:13 965F1BC656F01C1C7F977419A5F99FB54FA34548C332EA79B5B0EE:\ CEE11A3A9A406FE9DA77FE6FB007:\ 3F6FF94F05596ACBAF5AE7CBD97E3FF3233992D988361E:14 657B5F618710AF88BF4F0328E7071D022D02EA5E:8EA957C330D55CC208326CEA06D25A:\ BD0A575481E823931F68BE84E31DE56B2D95F3ECE4F614CBFD31CE:15 33CE7917528009F2A1011CFCD494B80D4BBFD901:2FB1FDD16FCE41C9C563226A564D1647:\ 81851CC61D3E910E04D5EC38A465:16 40ED568CFC6C0A17866C67B7660C96BF9DA54C:321118AA031C5C9EFF145542B4426C3C71:\ A3502B96214854E5AF5720E8970D3F240AAB2E21319A88E901:17 12695F5B19541C8B0092418A72A7ED8482F35FCC4A82D4E1C5AE:\ 22BC94F745F6E247054DDA2C772E5D2D3EC4:\ 2CE5F4676C06D0CB61E91F7D751F0F:18 F36E535A1C2C6F6771:6004BBD20BB68E2F1FFC65977807EE25A3FBFE:\ 290BE26068D887AA6E86500E85C606:19 7C7EE43D46AE85D23F0D5264DBD410:0E1FE69316D67CF65D62196C25CC4F517664BD43:\ FC4A7F986331A012CBDAD765288C2CEC08AAD045:20 C580B05EC577F45434C13640AAB31B:937E22F90D1493317B0B068A44859036905540AF67:\ 6C9F5929EA435A86E117BD586B34F7E4F97794573C0B4C90:21 E275AEB758A949CBB11256E74412E1DA3743899F9007DD5D80A7:\ 69C2640797F38E87F1C870891164F0B31F1A3A02627A:\ 585B267A9E08EF4DBF48F6:22 DCF06E7AC257DA73CC6FC0A086B4:30CCF63491F642A55E45136E42FDD0355DB272502EA1B0:\ 16F0355230F105EB316F558512EC3B51871741:23 C4C38EC6A1EA975D0ECA535B0CC4D6D0:\ 3B50F91EDFDD96CBA8B6329616D4F5964CD8C961CB1D9332:\ E84EE4D9DC701DE04E250768F2DFB9B6A2:24 7B557AC16D60B74ECAA87641887E6467BAC107:\ CA148D27F3DC362B0F43C68312058C1CD9B92ECAC2CFDD601F:\ D7B9EB91BCDE1F6C144A0799:25 B23EFA7FAA11D0E597F00867992CB3B9DA93D607FAC0:\ 510297144BA4E0FB5C94749576F756AA36F51289CA463419DC06:\ DA5E3A17C6DDE81CC69A5AC11904D2E9E969D9F2D1731E842C:26 1A5063B374A5F7769AD59432CFFA6B:\ 3437D8B56E573E724B72DD08A5D144E86E646BD24EA0795BA2C3BD:\ FE0314911D4C07803C48A9EA86:27 870515C65F0AF7AAB10C365AF8AC535E1AA8997D139645A21F71FD23ABBB:\ 1895554BD0A1DE7F48FA8776D314EAE2B9E8D7E3CF2A418D17659DC1:\ AA33C0BFF91FC9F1C97BFD00D5F5AC2953C6D1EC43E5838887A2F984C5A53F:28 1BAE220F6AFEB0A2F51D44721A7A9B9C:\ 13720151D256DEBAAA668359A876A9A9788D540F509E90372952A91757:\ 11555530CBAECFF82C76147416A50831532A40BD29F15F1E0EA49129:29 BC55F2BAC14370BB5832575A233F1FCE32322E5B4CE1955153CAF3C84493DF:\ 972B190F7EC73DA7C5B8B38E9B6DCEE452AB0BC2220F37BEA3FAC596B2F6:\ 00E8D1BAA9142A646C5DBCC680FB:30 834CD382FBF84FF54CC8D3BCB778ACD7DDE8FE32ABA212ABB1:\ 6151C82D7384ED41264424827766B6A7279593C86DCBAC9A4D711009E30EC3:\ EE768F1AAF889EFB5B20F7536FECA037BF:31 E0BDEBC1D1EEDB393368D489:\ F3D8ED6D46280C3694F33D2D4A210248D657277DD78ACD3B34063D085657A58E:\ 5D2B46C7BB5258ABC13514995E518FD4D77BECB738D77909:32 [TLS-PRF] 6C81AF87ABD86BE83C37CE981F6BFE11BD53A8:A8:\ A6D455CB1B2929E43D63CCE55CE89D66F252549729C19C1511:1 6BB61D34AF2BCCF45A850850BCDE35E55A92BA:5E75:\ 510194C9C9F90D98452FB914F636D5E5297C:2 3CC54F5F3EF82C93CE60EB62DC9DF005280DD1:706F52:\ 7FC24D382379A9CD54D53458947CB28E298A1DCC5EB2556F71ACAC1B:3 BD3462DC587DFA992AE48BD7643B62A9971928:841D7339:\ 9F6FAFED1F241A1E40ADEAF2AD80:4 1235A061FA3867B8E51511D1E672CE141E2FA6:D856787D41:\ 1026B9224FC59706BEADAE58EBD161FD2EAC:5 63A22C3C7C5651103648F5CFC9764A7BDE821F:F13096FEED6E:\ 512FBF47D9DA2915:6 AA15082F10F25EC4F96DFFE9DC3D80BBA6361B:B637FCADE57896:\ 519B87DB85FBE92FB4070F3BEF6E3D97DF69B66061EB83B4A334E8EEDC0F8E:7 775B727CE679B8696171C7BE60FC2E3F4DE516:3431016193616501:\ 453C2549058B063C83E8B85E5CEF3570DF51B7D79B486F4F33:8 AB299AD69DC581F13D86562AE2BE8B08015FF8:A624CC363499B1EA64:5569FC:9 AE4947624D877916E5B01EDDAB8E4CDC817630:5B908EB5B2A7F115CF57:\ 7FDE51EFB4044017C95E3608F8FB6F:10 4F13EB6FBE1FA2FCD7B5B21C9F20980D1986A4:EE73EEE90E35AF2BC3575D:\ 514DBCE520AB34:11 41BC094049008CBAE99CAC0BA901D0B2DD15DF:BD859DAE2729A348774146B5:\ CB6C0544FF8CF74C71E910F2220D54C509DC442CB3:12 95751B37945DD9DE515B45927A229AAB40F7D0:FE310AF0913149D53718AC53E5:\ 75318F49A11F42A24AF48267411FDD0831:13 FC250F36E5C1365C3EAD122E63F90612DBBDA7:C0107D144E53227EDE5E677A35BE:\ 8A4B5AEA3AC0B2FF777D77B5EFB6E7D8AF:14 F6A8A67ACA60F25080100F3F5C928038936E57:A1FCD686295E3DE32C438A8FFD63CE:\ F8B663768421BA77861F1EBEBF4C8341DC01ED1F7D4B054B7C:15 77BF131D53997B1FB2ACE2137E26992B36BF3E:60D0A09FCFDE24AB73F62A7C9F594766:\ 859D1EE9A694865ECC1830C361D24485AC1026:16 39CF412177DD47B8E97A4D92D104138CD4E41C:F7D49D2C112F3EE64411F50B264AE15BB4:\ 9CD35F26E8A89C25410B3394A957B781BBD0D190DA:17 5C40AF252D0A4F445E638D954993BCB0673281:\ FDA100D44E2F839C21199A56ACAF57454C21:\ 2DFB810DC9ED5B291754144937E6052666D476D1F5F94C:18 2A8B07B082F2A4C95611B20685A4410E90B8D2:\ A5CCE186AFDB9C0EB664C719DD1A69C1BA6059:\ 320ADFA586F7EBF346646DE9:19 BCBD1EFDA490B9D541BA9DF50FE9A451DD0313:\ 2291E19459725562F106F63FE2F81E73BA23F04A:\ 255230A341E671BC31B1:20 B361B123993602D0BA62567BF9B81992DB108EAE:\ A71CB3E9C58E83414D69775CF7127E9C95AF10B7E2:\ 20878A3A703785DE37846086C097619E9823F7FCD2B7B3A9466FA6:21 8E7CC0EED8BFF691B370C08FE0DB32D06700B088:\ 25DA6B3027CBBCA4352EFB85D3FCB9060285BC39ECB8:\ 02F3B9155F5CFF08B9F47A2FDC701BA3F08BCDDF21292911D06FC0A5A99B:22 041CC7ED27C01A701A0F15269DA6CA6D806B10C3:\ E3B7F0D721C05663166B43A75F2997F9F029886FC069D0:\ 8E5F4FADE80AF92D495AF5A50C8E:23 A7421C0D96D2455E57408C2BF02E86DCEE71B060:\ 46948B1DD4C7977AA7241ABD74A88E7838E575DD34AA9B75:\ BD2623716653B538C885FA2ED4B0A2:24 56DAD2D1AF95F938E073D10A1A779F80BB0F76FE:\ 53B1169FA52AABC427D1C41501B612DF6D726F55DAD9D246E9:\ D1DA1DEF7BD5C327894B7A992AA7A694664470F642:25 4F2E4F77820A686894B90A0AFD0ABA772D0CC6B0:\ 30ED285AE596143BE7998901C2F35530D81CA4DD14E03D17DF2C:\ 062577E22854BAF0E68A51A27644FFB0:26 86173BD0F3C5E7052482B53BD8604E197112F3D8:\ BB3BD1CBFA7889441E930C4B5E8EC7AB00D9612E9D762D42427AD9:\ 12B4E5F24ADC8A:27 2B9CE8B0AB3041D6A1803BDD342E6537E40BE305:\ 88F8AFCB8109C7B359B18CCED73A1B09404CC9EABB23695BF353ED9E:\ 517D3D00850F48912B713E653CB4F38703B6A6:28 819CB722AA4475D8301A8E24DCD9D82DF2B081F4:\ 83FD6F33AD11819019E086F0683E26D59D57C9E5AF26C81738E44D47A3:\ 56872A31A10E8C:29 80F1F9B0D05F41C448E5306E41833918B9E688ED:\ 0C00B5F50565FDD5345C63773D5FCC8B3C8E412DFFF23B95490EFB4E53FA:\ 6175CDE230DF6691F4E8A36B265C53CAD736AD6F34F895D5C6633D66B5:30 0AE876A7BB96C24CEFA6ED53CEE7B0A41B8FF7B3:\ 881B99C3E43B1A42F096CF556D3143D5C5DBC4E984D26C5F3075BCB08B73DA::31 2212169D33FADC6FF94A3E5E0020587953CF1964:\ 1E1C646C2BFBDC62FA4C81F1D0781F5F269D3F45E5C33CAC8A2640226C8C5D16:\ FCD5C9637A21E43F3CFF6ECF65B6E2F97933779F101AD6:32 # From RFC 2631 [X9.42-PRF(KeyWrap.TripleDES)] 000102030405060708090A0B0C0D0E0F10111213:\ A09661392376F7044D9052A397883246B67F5F1EF63EB5FB::24 # Same as above, just numeric OID instead of name [X9.42-PRF(1.2.840.113549.1.9.16.3.6)] 000102030405060708090A0B0C0D0E0F10111213:\ A09661392376F7044D9052A397883246B67F5F1EF63EB5FB::24 [X9.42-PRF(KeyWrap.RC2)] 000102030405060708090A0B0C0D0E0F10111213:48950C46E0530075403CCE72889604E0:\ 0123456789ABCDEFFEDCBA98765432010123456789ABCDEFFEDCBA9876543201\ 0123456789ABCDEFFEDCBA98765432010123456789ABCDEFFEDCBA9876543201:16 # MARKER: PBKDF Algorithms # PBKDF format: passphrase:output:salt:out_len:iterations [OpenPGP-S2K(SHA-1)] 666F6F:0BEEC7B5EA3F0FDBC95D0DD47F3C5BC275DA8A335A8CAA4039FDBC02C01A649C::32:0 616263:A9993E364706816ABA3E25717850C26C9CD0D89DDD3742EC1A4D2A5B563A2B62::32:0 666F6F:DFFE49EEC99E3530FF75A794773E1F8429A46835925DAED4A27FA2957BBD29B5:\ 698619A932D101BE:32:0 666F6F:8051BB97BB42199330C9D52383D1B56532FF9BDFB180BD2BD61F24A25265639F:\ EFB0A8DDE02BAB42:32:65536 696C696B65706965:A32F874A4CF95DFAD8359302B395455C:2AE6E5831A717917:16:65536 666F6F626172:9B1D52CC0DA89C9D85B91EC84B6780FB:AD8FC3C853BBB225:16:65536 717765727479:67CACC2B4B6F1B76E620748C1E777070:3891D354B8C86161:16:0 4141414141414141414141414141414141414141414141414141414141414141\ 414141414141414141414141414141414141:080316AFB4E11D98120B29D1070CE749::16:0 696C6F766573616B757261:109D161363DF1E97322112F82169911A::16:0 [OpenPGP-S2K(MD5)] 666F6F626172:\ 3858F62230AC3C915F300C664312C63F26E4AEBF38BF1BB6AD49BA54BCACD9DB::32:0 616263646566:99C8FD9A0516337E7C0F71563D937B09B14F7E7B6CB53FB56B5B8137E189DA20:\ B89343B95A46FECE:32:65536 666F6F:CC364F2BC41FACAD36E0D45E581D61F707BA925C982BEF7E:\ 760566702FEE54C8:24:65536 [PBKDF1(MD2)] 71616C7A73656774:7C1991F3F38A09D70CF3B1ACADB70BC6:\ 40CF117C3865E0CF:16:1000 766E68617A6A66736978626F6D787175:677500EDA9F0C5E96E0A11F90FB9:\ 3A2484CE5D3E1B4D:14:1 66686565746E657162646D7171716E797977696F716A666C6F6976636371756A:\ 91A5B689156B441BF27DD2BDD276:\ 5D838B0F4FA22BFA2157F9083D87F8752E0495BB2113012761EF11B66E87C3CB:14:15 736E6279696E6A7075696B7176787867726C6B66:\ 49516935CC9F438BAFA30FF038FB:\ F22D341361B47E3390107BD973FDC0D3E0BC02A3:14:2 [PBKDF1(SHA-1)] 66746C6B6662786474626A62766C6C7662776977:\ 768B277DC970F912DBDD3EDAD48AD2F065D25D:\ 40AC5837560251C275AF5E30A6A3074E57CED38E:19:6 786E736F736D6B766867677A7370636E63706F63:\ 4D90E846A4B6AAA02AC548014A00E97E506B2AFB:\ 7008A9DC1B9A81470A2360275C19DAB77F716824:20:6 6F74696C71776C756B717473:\ 71ED1A995E693EFCD33155935E800037DA74EA28:\ CCFC44C09339040E55D3F7F76CA6EF838FDE928717241DEB9AC1A4EF45A27711:20:2001 6B7A6E657166666C6274767374686E6663746166:F345FB8FBD880206B650266661F6:\ 8108883FC04A01FEB10661651516425DAD1C93E0:14:10000 716B78686C7170656D7868796B6D7975636A626F:\ 2D54DFED0C7EF7D20B0945BA414A:\ BC8BC53D4604977C3ADB1D19C15E87B77A84C2F6:14:10000 [PBKDF2(SHA-1)] :\ 59B2B1143B4CB1059EC58D9722FB1C72471E0D85C6F7543BA5228526375B0127:\ 0001020304050607:32:10000 6A79756571677872736367676C707864796B6366:\ DF6D9D72872404BF73E708CF3B7D:\ 9B56E55328A4C97A250738F8DBA1B992E8A1B508:14:10000 61717271737A6E7A76767A67746B73616D6D676F:\ FA13F40AF1ADE2A30F2FFFD66FC8A659EF95E6388C1682FC0FE4D15A70109517\ A32942E39C371440:57487813CDD2220DFC485D932A2979EE8769EA8B:40:101 6C7465786D666579796C6D6C62727379696B6177:\ 027AFADD48F4BE8DCC4F:ED1F39A0A7F3889AAF7E60743B3BC1CC2C738E60:10:1000 6378676E7972636772766C6C796C6F6C736A706F:\ 7C0D009FC91B48CB6D19BAFBFCCFF3E2CCABFE725EAA234E56BDE1D551C132F2:\ 94AC88200743FB0F6AC51BE62166CBEF08D94C15:32:1 7871796668727865686965646C6865776E76626A:\ 4661301D3517CA4443A6A607B32B2A63F69996299DF75DB75F1E0B98DD0EB7D8:\ 24A1A50B17D63EE8394B69FC70887F4F94883D68:32:5 616E6461716B706A7761627663666E706E6A6B6C:\ 82FB44A521448D5AAC94B5158EAD1E4DCD7363081A747B9F7626752BDA2D:\ 9316C80801623CC2734AF74BEC42CF4DBAA3F6D5:30:100 687361767679766F636C6F79757A746C736E6975:\ F8EC2B0AC817896AC8189D787C6424ED24A6D881436687A4629802C0ECCE:\ 612CC61DF3CF2BDB36E10C4D8C9D73192BDDEE05:30:100 6561696D72627A70636F706275736171746B6D77:\ C9A0B2622F13916036E29E7462E206E8BA5B50CE9212752EB8EA2A4AA7B40A4CC1BF:\ 45248F9D0CEBCB86A18243E76C972A1F3B36772A:34:100 67777278707178756D7364736D626D6866686D666463766C63766E677A6B6967:\ 4C9DB7BA24955225D5B845F65EF24EF1B0C6E86F2E39C8DDAA4B8ABD26082D1F\ 350381FADEAEB560DC447AFC68A6B47E6EA1E7412F6CF7B2D82342FCCD11D3B4:\ A39B76C6EEC8374A11493AD08C246A3E40DFAE5064F4EE3489C273646178:64:1000 [PBKDF2(CMAC(Blowfish))] 7871796668727865686965646C6865776E76626A:\ 43734BADB91F5D89DB20B469CD2EF376CAABC226EE3952872050428EFB5E3026:\ 24A1A50B17D63EE8394B69FC70887F4F94883D68:32:5 # MARKER: Encoders/Decoders # Format is input:output # Kinda silly to hex encode base64 encoded ASCII, but... [Base64_Encode] 31:4D513D3D 235C91:49317952 4142634452313236:51554A6A524649784D6A593D 241BB300A3989A620659:4A42757A414B4F596D6D494757513D3D 6C6561737572652E:62475668633356795A53343D 6561737572652E:5A57467A64584A6C4C673D3D 61737572652E:59584E31636D5575 31323537374343666671333435337836:\ 4D5449314E7A644451325A6D63544D304E544E344E673D3D 60E8E5EBB1A5EAC95A01EC7F8796B2DCE471:\ 594F6A6C3637476C36736C614165782F68356179334F5278 31346D354F33313333372C31274D754E7354307050346231333A29:\ 4D5452744E55387A4D544D7A4E7977784A303131546E4E554D4842514E4749784D7A6F70 [Base64_Decode] 4D513D3D:31 49317952:235C91 51554A6A524649784D6A593D:4142634452313236 4A42757A414B4F596D6D494757513D3D:241BB300A3989A620659 4D5449314E7A644451325A6D63544D304E544E344E673D3D:\ 31323537374343666671333435337836 594F6A6C3637476C36736C614165782F68356179334F5278:\ 60E8E5EBB1A5EAC95A01EC7F8796B2DCE471 4D5452744E55387A4D544D7A4E7977784A303131546E4E554D4842514E4749784D7A6F70:\ 31346D354F33313333372C31274D754E7354307050346231333A29 # These are actually fairly dangerous, because bzip2 could change the # compression format somehow and still be compatible with old versions, but not # output this exact bitstring... [Bzip_Compression ] :425A683917724538509000000000 54484953204953204120425A49503220544553540A:\ 425A6839314159265359FDAED210000009DE0000104000100032604C1020\ 0021A4D1EA0FD2840D03401E19B4D4B254EE89F177245385090FDAED2100 # These are much safer [Bzip_Decompression ] 425A683917724538509000000000: 425A6839314159265359FDAED210000009DE0000104000100032604C1020\ 0021A4D1EA0FD2840D03401E19B4D4B254EE89F177245385090FDAED2100:\ 54484953204953204120425A49503220544553540A # The stream was flushed every 10 bytes 425A68393141592653598BB9F5F700000A7FFFC021D1CE7DF41018B66921CD80\ 681D23A08C880C91110BE808084F8353AA822820007439900068001A00000000\ 03201A6D2064D82870000D3201A34C469E9000001A6269A7A8623200D1A63D70\ DF4E435801FAA9C3CE54096593D38853A1E5A8DDD43585C763E592CF011C0D5A\ 956B48C7EC1D405F5B90DF441E168AA02C6D25E179EC44D02A2691295F38ACE1\ 201DE855B2B543D8944F805514C8D6971908389F4520A130AA848329C6BEDC53\ 3F8BB9229C284845DCFAFB80:\ 2328B92CB5578B4B87D7E07F7457E0DE93268B5FD5720F484558D057A600E9E6\ 3B9B5B5669179FCB2CA6415EDDD709223F201CF527E55C421BF916689C207E48\ 18BB3AE0AA29D3C31D12268FB51044A673816B218F49EF1B51AED3231CED7DE7\ 5FF5B532EB8B1BFB8CA2242AF9E9E226D4D629796B76749BD4EFB6B80E4EB7B3 # Two concatenated streams (same stream, doubled) 425A68393141592653592ED49B3D000011FF00001000204004100032604C1030\ 44200021A6A06431014D323131310BD3A516096617117C90B42C26B1292F659F\ 254753C2DF1772453850902ED49B3D425A68393141592653592ED49B3D000011\ FF00001000204004100032604C103044200021A6A06431014D323131310BD3A5\ 16096617117C90B42C26B1292F659F254753C2DF1772453850902ED49B3D:\ 54484953204953204120425A49503220544553540A0A41414141414141414141\ 414141414141414141414141414141414141410A0A0A426C61682C20626C6168\ 2C20626C61680A0A54484953204953204120425A49503220544553540A0A4141\ 4141414141414141414141414141414141414141414141414141410A0A0A426C\ 61682C20626C61682C20626C61680A0A # Two concatenated streams (different streams) 425A683931415926535980A46FE20000FB5F800010507FFFF07FFFDDE03FFFFF\ E040031CCC62B5D74143534134C9A9EA683D53D1A4F53269E8CA7A4F51A66A03\ 4343404553FF51A4D31354F328C286418464C020C8D007A9A19E9A9EA8F48034\ 1E89A64C8C43401A1A6834C234C25348200202646D29EA0D0001A3D460D4D016\ EAB324536379286DA9D72DCE3E1DACF47749AF69757E5E7F6589071D076F7FDE\ 9E3227D8EEAC7D2ADB6C98D82F0FE534F76F9B1D2A498B440E921B0B47D66809\ 2E6AB8DCA972C499399C923849148B4343D2AF95D2FEA63C00953DB38E47A94F\ 993CAC4B48E5459448C69A906B75779D00B5D25D02ECF3E955F77AF7D31CCACE\ A6D766C9BD447AA85AD393BAB5343CF7BED96AE2F1A72DF6FC512430CBD13371\ 1D442490439C3BDA77C95341F5EEB3269B62608CFAEDEB16968AE0E1C7753E1A\ 4B6DC7ACF5670E4B362858963DA8888EB483B82630B6442AE6C2460FBB95549B\ CCDAF8408C74F1BE7984FD643E90E35FBE0EDEC19C38B32699CEEC4AF1BB21D2\ B2E42DEB44718B63CACBA7C9520882C457A828469A102444386BD54E724C3AAB\ 6BF6DCF24C969154AC2D704AB4D123280D1C2646726A2F69EF8C10CB5412918C\ 80EF05771E58BE5827CFB59C95A9068FD0F6021BE2418A8977A09CD734FD5871\ 2F672E76F06F6C612C1C85C4E4E8F432886D8B46075B92428A02519CCDD2C0A0\ CBC1C1B28A3FAD08281080BA8981FD84B2C5138C44987953B3357F39E35DFAA2\ D0B582B90F136B2C6DBCC1E7C227C744A85B1672F818E332EFA32AA24B158F24\ 204A1D310B264CE35D24021852F03A6D6B24024046744FB7BCDA68835129EFCB\ 40A4350B66487BB3212310E5AE7330F85643470D99C0D04F9F2A922FA5028621\ F220B87E422B866CD7A13042D2B564316000ED9504B71D21329B02DB17839B94\ 70D6A6C45EDA5A96A26EC4EE0CED46CCBA3C532CCE19AD2F131AF59A74F56E28\ 41912A2AE079CC91BF7D3ADB3F3C8F733692EC3407388C79E31DD81C239356AE\ 1C673CC6768D429E376781B711EB2CF2D6E488D6419C145B574736BBE8578E25\ B2125659973504559442A7A2D7C37C244C7E6AA709631308D78C3FD285B08595\ D32154402DA6254F31403C4B32444507CA1C32A7FBAA86204E29D1DADC046970\ 87253D38C21131CF44661B046A59A1563495044FF8BB9229C2848405237F10\ 425A68393141592653598E46405D00011CDF8008D060EFF71CBFEFDFB0BFFFFF\ F05004A5AF5C689D74340EB4786A653654F530D4DA991EAA7A9FA8C6A9E126D3\ 534F2469EA6D320C5004553FD3234464D32A7A9B29B536A1900001A06800D01A\ A7869094F49E840DA80D0000000680007302626830993264C8C2609A69918980\ 218069A1009A9A9E22609A9B530A7A8F53D4CD400D1A347A81EA4DD64CF7FBEE\ A25B21C0CDA99F572545B2436738C98D46F76CD222194C4E3130CCA4C121330D\ 1BCBD8E1C17D5124E37CC31EC74364E6E0A7CBB3CDC38FBDB2CE3E54E744C337\ 86924DA1B840AC53FAC8D9A4AF92C2671A2FB4C097C22ABF7119FA4D758D60D3\ 5186FEE4CE23643BD62FE490BC123E9561F1D092729E9330CD7C8B612C4381A8\ CF061D2786C5D544421539BDCA41949E820E7E6B22B757534F25B5B56186B66A\ C0BE8CAD5C796BBB5624C4B7952CE7AD678D5B5D42CC8360AAD4812E371DCD9A\ 285A51A520F04181EAC5474D793B1CC9C908C25298E50E3456D8C155D94D8C0A\ 2951723DB9DE8F70FB65DBE79EA0FADD0B2BD0DB70935D6E603F1881803B808C\ 659C50F6B5E1292C6323799426F06C759AE61A00B375DFE43EA298E9AACE4F1A\ 48B3EECCD57EFF4BABDA432BCB9F7EB68B4925E7CF8A0EC53D60FA1485ED0BE7\ F1F4F927BEF419AC8593230DEEC1C823637C078F45E82C407A56CEC38FA30EF4\ 308D37020852624B3A29072212825D954810915F2508CA6515A03269515F46E9\ D1BEE330901B3BCB6A39B888AA21DDFD5640B417C1502CE17E8BFB683B5DE8D3\ C78A4A483203260399BB70136F9C127C0A8403EA9A0407E6F4BEB40BCCE0E379\ 1EF0407F4F9292C4F6D78BBD23B360E39447DCA5E52316108A05F81934A26509\ 0D155B7B3081560A412C1772603B649511C31986AC033342E5DC2CBB254E8D85\ 4D08D2550C0E62110F282C21C60B1D9D0A23515259DACAFA59BF5A9EF8DA354E\ 129B880F76A9C542BA8EA2F91A858645E969E0CCAF090083286CC714CE4234D5\ 1758A2301076C932813905A18856FE5D311C8D00D226931EEECBB5CD863A81EB\ BAD43476102E47614D8822503F274AF08D038BAF65B1E671E73A989FBFAE4106\ F2F0451EC29C8A1218189603C03E207370B0239861B99F6354F2E4B095C25C84\ 7DBBB98D08EA3A8C923515F541F30F07B4927DAA8313DF01D00DAEBE6228BB48\ F6851D2898F0B4040AD354213349D096B8AADB92B887533A32174C5BA7A3CB46\ F5A2FAC580C26A987508D9C4AE2EF2D5D04AD8F72A52A9DE470554B41F0D0030\ 48C1C3C962ED158409287B9560E8CA5CB3396DC43977DAE8A0025193798220B5\ AA8CF250B26463F59E40085714F16E29D2C35E027974D6834D12F82500C45977\ 51FAEF7B883482EE04A9F2194B6CA60391A6099E6899E0821E6BC2795B7D5808\ E043A30D9613F39BC26AAA3E81D3598248DBC3049389D7AB4C5A974502AAA402\ 47459D9C90CB9FF33C25051ABBD9C4D8754F70902C942E49BA94389C6C1A8E66\ D7519D75DFF9A3B11CFD6F8A365F0B87A9EEDB5262DC155922CC580855531CEC\ C80C8B46418C46520A44C8125A4484DCD26AB2A8862AB81672293CFA3186666A\ E52801C200D1E0BE39F11E5315409520A10A568AD8459029191AE9EDC5A93A88\ BA2E16A2EBF15847D58535A266376BBE082891ED6413F54D62093D71CB10F01F\ 932886265650E6066A7D9EAD0238EA014DC86BE01A6F9C07879BD33FC36F7000\ CCC5DC914E14242391901740:\ 4F70656E434C2C20612043727970746F6772617068696320436C617373204C69\ 627261727920696E20432B2B0A56657273696F6E20302E372E333A204A756E65\ 20382C20323030310A0A2A4E4F54452A3A204F70656E434C2069732063757272\ 656E746C7920696E206561726C7920626574612E20546875732C20796F757220\ 636F6D6D656E74732061626F7574204F70656E434C0A286D6F73742065737065\ 6369616C6C7920746865206170706C69636174696F6E20696E74657266616365\ 2920617265206E65656465642C20616E6420796F757220636F6D6D656E747320\ 63616E0A6861766520612064697265637420656666656374206F6E20686F7720\ 4F70656E434C206368616E67657320696E20746865206675747572652E0A0A4F\ 70656E434C2061696D7320746F206265206120706F727461626C652C20656173\ 7920746F20757365206C69627261727920666F7220706572666F726D696E6720\ 636F6D6D6F6E0A63727970746F67726170686963207461736B732E204F70656E\ 434C2063757272656E746C7920696E636C756465733A0A0A426C6F636B204369\ 70686572733A20426C6F77666973682C20434153543235362C2043415354352C\ 2043532D4369706865722C204445532C20444553582C20547269706C65444553\ 2C20474F53542C0A202020494445412C204C7562792D5261636B6F66662C204D\ 49535459312C205243322C205243352C205243362C2052696A6E6461656C2C20\ 53414645522D534B3132382C2053657270656E742C0A202020534841524B2C20\ 536B69706A61636B2C205371756172652C205445412C2054687265655761792C\ 2054776F666973682C20585445410A436970686572204D6F6465733A20434243\ 20772F2050616464696E672C204346422C204F46422C20616E6420436F756E74\ 65720A53747265616D20436970686572733A2049534141432C20415243342C20\ 5345414C0A486173682046756E6374696F6E733A20484156414C2C204D44322C\ 204D44342C204D44352C20524950452D4D443132382C20524950452D4D443136\ 302C205348412D312C20534841322D3235362C0A202020534841322D3531322C\ 2054696765720A4D4143733A20454D41432C20484D41432C204D44354D41430A\ 4D6973633A2041646C657233322C2043524332342C2043524333322C2052616E\ 64706F6F6C2C2058392E313720524E470A0A466F7220696E666F726D6174696F\ 6E206F6E206275696C64696E67204F70656E434C2C2072656164207468652073\ 656374696F6E20224275696C64696E6720746865204C6962726172792220696E\ 0A646F632F6F70656E636C2E70732E205265616420646F632F72656C6E6F7465\ 732E74787420666F72206E6F7465732072656C6174656420746F206973737565\ 7320737065636966696320746F0A746869732072656C656173652E2054686520\ 6C6963656E736520697320696E20646F632F6C6963656E73652E7478742E0A0A\ 436865636B20687474703A2F2F6F70656E636C2E736F75726365666F7267652E\ 6E657420666F72207570646174657320616E64206E65772076657273696F6E73\ 20286F722069662C20686F72726F720A6F6620686F72726F72732C20796F7520\ 66696E64206120627567292E20496620796F75206861766520616E7920717565\ 7374696F6E732C20636F6D6D656E74732C206F722072657175657374732C0A73\ 656E6420656D61696C2E0A0A4A61636B204C6C6F796420286C6C6F7964406163\ 6D2E6A68752E656475290A0A4D5553540A2D2D2D2D2D2D2D2D2D2D2D0A492074\ 68696E6B2074686520667470206C696E6B20696E206F70656E636C2E74657820\ 69732077726F6E670A0A427A6970325F4465636F6D7072657373207365676661\ 756C7473206F6E2062616420696E707574202D2069732074686174207573206F\ 7220746865206C6962726172793F0A0A53484F554C440A2D2D2D2D2D2D2D2D2D\ 2D2D0A546865207370656366696C652073686F756C6420666967757265206F75\ 74207768617420657874656E73696F6E73206172650A617661696C61626C6520\ 286261736564206F6E204F532920616E6420636F6D70696C65207468656D2069\ 6E2E0A0A73656371756575652E682073686F756C642070726F6261626C79206E\ 6F7420626520696E7374616C6C65642061732069742069732061207072697661\ 7465206865616465720A0A41646420612067656F6D65746963206D65616E2074\ 6F207468652062656E63686D61726B20636F64652C20666F7220636F6D706172\ 696E67206265747765656E0A646966666572656E742073797374656D7320286D\ 61796265206A75737420616E206F766572616C6C20617665726167653F292E0A\ 0A4D616B6520612073637269707420746F2068616E646C6520616C6C20746865\ 2072656C656173652073747566660A20286D616B652054475A2F54425A202872\ 6F6F74206F776E6572292C206D616B65206261645F6C69622E6469662C207369\ 676E20616C6C2C206D616B65205352504D2C0A2020207369676E20746861742C\ 20706F737369626C7920736F6D657468696E6720746F206D616B652052504D73\ 206F6E2061206C6F740A2020206F6620626F78656E20696E20706172656C6C65\ 6C2C20746F6F292E0A0A54657374206F6E2043796777696E20616E642042654F\ 53350A0A54727920746F2067657420612056432B2B2F4E4D414B4520706F7274\ 20676F696E670A0A4D6F7265206578616D706C657320286120676F6F64206372\ 7970746F206F6E6520657370656369616C6C792C206572726F7220636865636B\ 696E672C206D6163732C20616E64207468650A77686F6C65207363686D657265\ 292E20577269746520757020736F6D657468696E672073696D696C6961722069\ 6E204F70656E53534C2C20616E6420676574207468656D20746F20776F726B0A\ 746F6765746865722E0A0A7A6C69622F627A6970323A204D756C7469706C6520\ 73747265616D732E205741495421212120446F657320697420616C7265616479\ 3F3F213F213F0A627A6970323A2053686F756C6420737570706F727420666C75\ 7368696E672E0A0A5A6C69622F477A69702066696C74657273206E6F74206576\ 656E20696D706C656D656E7465640A0A416C6C6F6361746520616E64206D6C6F\ 636B206120706F6F6C206F66206D656D6F727920616E64207265706561647465\ 646C792070617373206974206F75742E20486F77206C617267653F0A616E6420\ 484F573F0A0A576861742063616E20626520646F6E6520626574746572207769\ 7468204F532F43505520646570656E64616E7420636F64653F0A20202074696D\ 6572732C20656E74726F707920736F757263652C206D6C6F636B2C2066696C65\ 68616E646C6520737570706F727420696E20506970652F657463200A0A444553\ 2049502F46500A0A506970652073686F756C6420737570706F72742027726561\ 6C2720616C7465726E617465206F75747075742073747566662C206E6F74206A\ 757374207468650A6861636B207573656420666F72204269744275636B657420\ 2D206D617962652E204973207468657265206120646563656E74207761792074\ 6F206A7573740A706C756720697420696E2C20696E73746561643F0A0A446F63\ 756D656E742074686520757365722D76697369626C65206D6F64756C65730A0A\ 52657772697465207468652070617273657220696E2076616C69646174652E63\ 707020286D6F726520666C65786962696C697479290A0A436F6E73747563746F\ 72732073686F756C64206F7074696F6E616C6C792074616B65206B6579732028\ 3F290A0A4D6F726520636865636B7320666F723A0A2020427A69703220286E6F\ 6E652121290A202043532D43697068657220284E4553534945290A2020534541\ 4C202849424D3F290A0A53686F756C6420757365207265706C6163652028666F\ 722048544D4C2062656E636861726B20616E6420696E0A76616C696461746529\ 2E205361646C7920697427732062726F6B656E20696E204B41490A0A4E657720\ 53796D20416C676F726974686D730A2D2D2D2D2D2D2D0A4D415243340A50616E\ 616D61203C2D2043616E2075736520696E2052616E64706F6F6C0A0A4D415942\ 452053484F554C440A2D2D2D2D2D2D2D2D2D2D2D2D0A46697820495341414320\ 6B6579207363686564756C653F20556E74696C20492073656520736F6D657468\ 696E672066696E616C20746865726520646F65736E2774207365656D206D7563\ 680A706F696E742E0A0A466978206F766572666C6F7720697373756573207769\ 74682075706461746520696E207468652068617368696E6720636F64652E2050\ 726574747920756E6C696B656C7920746F20657665720A61637475616C6C7920\ 68617070656E2074686F7567682E2E2E2075706461746528782C31293B207570\ 6461746528792C30784646464646464629200A446F6573206D616B65696E6720\ 706F736974696F6E207536346269742073746F7020746869733F0A0A [Zlib_Compression ] 416263416263414141626262436341626343666F6F6261720A0A666F6F206261\ 722062617A20717575780A0A48656C6C6F20576F726C64210A0A416972277320\ 224D6F6F6E20536166617269222069732061207265616C6C7920677265617420\ 43442E0A:\ 78DA15863B0E83400C057B9FE241932E77B0968226550A6A9B9F56B2B0628214\ 387D8C34A319D6911366552DF796C55D2588B2C8492F7C8EE347D4CF668EC1C3\ A686886B3C76B42FF70D6F59246A8BBA4310B3989D58B35F94EE497F70C02021 4141414141414141414141414141414141414141414141414141414141414141\ 414141414141414141410A:\ 78DA73742416700100F0260AB5 [Zlib_Decompression ] 78DA8DCAB10A83301405D0FD7DC5C5C5C90E82D08E199D5B704EF49604352979\ B1FAF9825FE0998F317789989FE781CF1E62ADA8DE5C38164E30AB0B8C0543CA\ B3E2D935AFB642504991485F144F386AC1F5738A61845DDCB62AFAFA4F78DA3C\ 3D444ECBD82A0278DA4BCBCF57484A2C02E22A85C2D2D20A85B4FC7C103FAD14\ 425628240171597E4E49517E1E17008A0710D3:\ 4141414141414141414141414141414141414141414141414141414141414141\ 414141414141414141410A0A4170686578205477696E2773202253656C656374\ 656420416D6269656E7420576F726B732038352D3932222069730A6F6E65206F\ 6620746865206265737420656C656374726F6E696320616C62756D7320492776\ 652068656172642E0A0A666F6F206261722062617A207175757820666F6F6261\ 72206675626172206675782062757820766F6C74726F6E0A 78DA734C4A76042247C7A4A4246710D3392D3F3F29B1880B006C380868:\ 416263416263414141626262436341626343666F6F6261720A 78DA0180007FFFDA2EE53C61F3EF2147C60D6F20A1B470782B538BF848E85E8C\ CDD05AAF9BB1A895B96FC5144435AAE4D7E7428FEFACADF543EDFFCCE1083414\ 8B043F0FD65ED45B19CCBDDA923C60A6492C98921798B4711F6A3EB4651157B5\ 213DEFF8ED8292154B6B8490C8B536F1D6925B3BCEF1C4334F10C0FE607D9DEB\ 5F0967F5AC1D07FF634251:\ DA2EE53C61F3EF2147C60D6F20A1B470782B538BF848E85E8CCDD05AAF9BB1A8\ 95B96FC5144435AAE4D7E7428FEFACADF543EDFFCCE10834148B043F0FD65ED4\ 5B19CCBDDA923C60A6492C98921798B4711F6A3EB4651157B5213DEFF8ED8292\ 154B6B8490C8B536F1D6925B3BCEF1C4334F10C0FE607D9DEB5F0967F5AC1D07 78DA73742416700100F0260AB5:\ 4141414141414141414141414141414141414141414141414141414141414141\ 414141414141414141410A # Same as the last one, doubled up 78DA73742416700100F0260AB578DA73742416700100F0260AB5:\ 4141414141414141414141414141414141414141414141414141414141414141\ 414141414141414141410A414141414141414141414141414141414141414141\ 4141414141414141414141414141414141414141410A 789C15863B0E83400C057B9FE241932E77B0968226550A6A9B9F56B2B0628214\ 387D8C34A319D6911366552DF796C55D2588B2C8492F7C8EE347D4CF668EC1C3\ A686886B3C76B42FF70D6F59246A8BBA4310B3989D58B35F94EE497F70C02021:\ 416263416263414141626262436341626343666F6F6261720A0A666F6F206261\ 722062617A20717575780A0A48656C6C6F20576F726C64210A0A416972277320\ 224D6F6F6E20536166617269222069732061207265616C6C7920677265617420\ 43442E0A # The stream was flushed every 1 byte 78DA0A06000000FFFFBA02000000FFFFE206000000FFFFDA00000000FFFF1202\ 000000FFFFFA01000000FFFF9200000000FFFF8A03000000FFFFF205000000FF\ FFAA03000000FFFF3A0E000000FFFF0A02000000FFFF6A02000000FFFF3A0D00\ 0000FFFF9A09000000FFFF5A09000000FFFF9203000000FFFFE202000000FFFF\ 5A04000000FFFF3A07000000FFFFE202000000FFFF3A06000000FFFFAA010000\ 00FFFFD205000000FFFFCA05000000FFFF3A0C000000FFFF3A0E000000FFFF2A\ 07000000FFFF7A07000000FFFF6A05000000FFFF3A0F000000FFFF7A0D000000\ FFFF5A09000000FFFF7207000000FFFF0A07000000FFFF7206000000FFFF5201\ 000000FFFF5204000000FFFFFA0F000000FFFFBA05000000FFFFE202000000FF\ FF5A0D000000FFFFDA02000000FFFF1206000000FFFF7205000000FFFF920000\ 0000FFFF1206000000FFFFAA04000000FFFFDA08000000FFFFEA04000000FFFF\ FA0D000000FFFF1206000000FFFFEA04000000FFFF6A02000000FFFF32070000\ 00FFFF2A02000000FFFFAA04000000FFFFFA06000000FFFFCA05000000FFFF7A\ 0F000000FFFF9A06000000FFFF5A03000000FFFF3A0F000000FFFF9A08000000\ FFFF7A09000000FFFF3201000000FFFF6A06000000FFFFFA01000000FFFFF202\ 000000FFFF9A09000000FFFFEA06000000FFFF9A07000000FFFFAA04000000FF\ FF4A00000000FFFF0A01000000FFFF3A07000000FFFFD204000000FFFF3A0700\ 0000FFFF3203000000FFFF3A08000000FFFFDA02000000FFFFDA05000000FFFF\ FA0C000000FFFF5A0C000000FFFF5200000000FFFF3A0F000000FFFFEA010000\ 00FFFF3207000000FFFF3201000000FFFF6203000000FFFF7201000000FFFFE2\ 04000000FFFFF204000000FFFFB205000000FFFF5A01000000FFFF6A00000000\ FFFFD201000000FFFF9200000000FFFFAA04000000FFFF8A03000000FFFFDA08\ 000000FFFF8A01000000FFFFDA0E000000FFFFE206000000FFFF6205000000FF\ FF9A0F000000FFFF4A05000000FFFF6A07000000FFFF5A0C000000FFFFB20000\ 0000FFFF0A04000000FFFFCA07000000FFFFDA0C000000FFFF1207000000FFFF\ 9A05000000FFFFDA0E000000FFFF9A0D000000FFFF7A01000000FFFFD2000000\ 00FFFFB202000000FFFFFA06000000FFFF5A00000000FFFFFA04000000FFFFD2\ 02000000FFFF3A0C000000FFFF6A01000000FFFF0A02000000FFFF7A0A000000\ FFFF0300D0883EB5:\ 53D40BB012F8185E4D7EC75282CB99A91E0AA2CE0AC67C2D6DC3C777EE85CFEB\ A94757432421FFDA0AABB41345181379B189FB138982377279F66DEF96ACCF91\ E93483F84A998B9E796054CE29CE36C1B4BAF3A320CF8C3734064409493DA880\ 2C18795EB15CB70B059F6587A338516FB3179AB79BE8283AF6A0F22AC38452E5 # The stream was flushed every 10 bytes 78DA0ABEC2BD41E887449C6F1D000000FFFF3A1ED4747AE64A39AE45E7000000\ 00FFFFE23A56A39B7BF878F9BB5600000000FFFF3AFF7AA57BB8B38AE2FF5B00\ 000000FFFFE25ABD45D85542B8726327000000FFFFFA2DDCD9645E54F92DF73D\ 000000FFFF9AB6E6FCC49726CD3FBC6602000000FFFFEA9E579910724EF39CD9\ 4100000000FFFFDAB2EBF36285F33DE6266C00000000FFFF72E1F4B45DD1A023\ 511907000000FFFFDA18B39D9B757E6AFB620B00000000FFFF0ACCDF2C3E6BFB\ EC171A5600000000FFFFFAB6E093D6E196A0A700000000FFFF0300D0883EB5:\ 53D40BB012F8185E4D7EC75282CB99A91E0AA2CE0AC67C2D6DC3C777EE85CFEB\ A94757432421FFDA0AABB41345181379B189FB138982377279F66DEF96ACCF91\ E93483F84A998B9E796054CE29CE36C1B4BAF3A320CF8C3734064409493DA880\ 2C18795EB15CB70B059F6587A338516FB3179AB79BE8283AF6A0F22AC38452E5 # The stream was flushed every 100 bytes 78DA0064009BFF53D40BB012F8185E4D7EC75282CB99A91E0AA2CE0AC67C2D6D\ C3C777EE85CFEBA94757432421FFDA0AABB41345181379B189FB138982377279\ F66DEF96ACCF91E93483F84A998B9E796054CE29CE36C1B4BAF3A320CF8C3734\ 064409493DA8802C18795E000000FFFFDA18B39D9B757E6AFB628BC0FCCDE2B3\ B6CF7EA161F56DC127ADC32D414F01000000FFFF0300D0883EB5:\ 53D40BB012F8185E4D7EC75282CB99A91E0AA2CE0AC67C2D6DC3C777EE85CFEB\ A94757432421FFDA0AABB41345181379B189FB138982377279F66DEF96ACCF91\ E93483F84A998B9E796054CE29CE36C1B4BAF3A320CF8C3734064409493DA880\ 2C18795EB15CB70B059F6587A338516FB3179AB79BE8283AF6A0F22AC38452E5 # MARKER: Random Number Generators [X9.31-RNG(AES-128)] 00000000000000000000000000000000:CF08AD39D7DA4FCDBE158347EE3752A3:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ 80000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BA 00000000000000000000000000000000:07BDFB5F94D0CB20F668161CE7E25E36:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ C0000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BB 00000000000000000000000000000000:81A997CAAA8EE7403D03A8F0AA6A588C:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ E0000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BC 00000000000000000000000000000000:B00B42011B37494912AA2DE456FE6284:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ F0000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BD 00000000000000000000000000000000:D42AA72455C3AE5AD634A5A4B3D577D2:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ F8000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BE 00000000000000000000000000000000:0D06CB87B99641C38A5411EC3D273E70:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FC000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BF 00000000000000000000000000000000:459E5E2D6976A5B34FD18926EE1E0BB7:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FE000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C0 00000000000000000000000000000000:53F2D091AD47E858555371AC9BE9F3DA:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FF000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C1 00000000000000000000000000000000:1A72444D745503F63B340E0F294726DC:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FF800000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C2 00000000000000000000000000000000:6FA57C78F09768AEA09ABB7DC5EA2944:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFC00000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C3 00000000000000000000000000000000:6E549FCCD3BE7B6B70B317BC04B5AB01:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFE00000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C4 00000000000000000000000000000000:7FF7C3F80E9A7C323B822FA436D6AA2F:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFF00000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C5 00000000000000000000000000000000:52FF54A163E97610EAF318E7EE7CEC7E:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFF80000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C6 00000000000000000000000000000000:4FF5C162147653F594105D480D9F24F7:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFC0000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C7 00000000000000000000000000000000:1F863D1EA9EA0E1D741D195249B6AF21:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFE0000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C8 00000000000000000000000000000000:A87313E2771F16B842DB27D3E55AB0B0:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFF0000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C9 00000000000000000000000000000000:A45BBF6E2ED76655119273112AFE1C6A:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFF8000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CA 00000000000000000000000000000000:E135FBD5BE6CB13B0A5A76696BCF46F6:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFC000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CB 00000000000000000000000000000000:5A0601F625C622CC97D6CAE9BA0AB6BB:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFE000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CC 00000000000000000000000000000000:A9662449F9AC50293766DEC60334B8F0:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFF000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CD 00000000000000000000000000000000:F80A41023F9E350E1D2F86DB10CBB329:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFF800000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CE 00000000000000000000000000000000:334EB3E404DE9F452C647C05EE09E3E6:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFC00000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CF 00000000000000000000000000000000:5B2C202C018A5E482D5035B18905BF46:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFE00000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D0 00000000000000000000000000000000:9E9E63D29CFB4757FDDEC2B35147D830:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFF00000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D1 00000000000000000000000000000000:EAAC43B87260BC73BFFDFABF5BCF94A9:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFF80000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D2 00000000000000000000000000000000:4B378D2FF53B5FF913AA2064D04285D5:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFC0000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D3 00000000000000000000000000000000:DBC25FE1203EA0E64F1D5C2E2F056F87:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFE0000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D4 00000000000000000000000000000000:D3C96C9C5905DC56A292A7A98AAC9234:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFF0000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D5 00000000000000000000000000000000:0A9223570A1288EB47595D6D18994353:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFF8000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D6 00000000000000000000000000000000:E43B8F94C2B557259920C10A51A38543:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFC000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D7 00000000000000000000000000000000:9B86C73D371FDAD1432065F9EB6BB6D2:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFE000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D8 00000000000000000000000000000000:13F949FF373A58947D8C6543FEB81F93:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFF000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D9 00000000000000000000000000000000:2F7D996CB269EDC9B7902FF6D061C302:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFF800000000000000000000000EB8DE39CF261EE2C7389B748F8B642DA 00000000000000000000000000000000:801AF9A32F49A1F3A43DBB22DB281DFC:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFC00000000000000000000000EB8DE39CF261EE2C7389B748F8B642DB 00000000000000000000000000000000:8914E2CE1F46B13624AB93FDE9104214:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFE00000000000000000000000EB8DE39CF261EE2C7389B748F8B642DC 00000000000000000000000000000000:C1D223A2A1785EF3CE6128333DD95347:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFF00000000000000000000000EB8DE39CF261EE2C7389B748F8B642DD 00000000000000000000000000000000:538FEEC081411A95767AA722BCFB8C0E:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFF80000000000000000000000EB8DE39CF261EE2C7389B748F8B642DE 00000000000000000000000000000000:0CCDCCA45FF772D0D02F53D823BB4C9E:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFC0000000000000000000000EB8DE39CF261EE2C7389B748F8B642DF 00000000000000000000000000000000:550B87DA4C940750ABB829E43522F4D7:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFE0000000000000000000000EB8DE39CF261EE2C7389B748F8B642E0 00000000000000000000000000000000:3E17DE96FFF84D276E8156ADC9E35007:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFF0000000000000000000000EB8DE39CF261EE2C7389B748F8B642E1 00000000000000000000000000000000:06F0855A2F6CE7DFF53F59A6994017AE:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFF8000000000000000000000EB8DE39CF261EE2C7389B748F8B642E2 00000000000000000000000000000000:741FA68C1FEF02AF6DFCE803379AF7B8:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFC000000000000000000000EB8DE39CF261EE2C7389B748F8B642E3 00000000000000000000000000000000:A7F64667398AECDEC34481265FE59235:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFE000000000000000000000EB8DE39CF261EE2C7389B748F8B642E4 00000000000000000000000000000000:F19F46D46822951708F4E194F4960A56:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFF000000000000000000000EB8DE39CF261EE2C7389B748F8B642E5 00000000000000000000000000000000:6E7AF2F730E9CF4CCA2E69D5067DDC76:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFF800000000000000000000EB8DE39CF261EE2C7389B748F8B642E6 00000000000000000000000000000000:CA15A95DFB686938D97D804298D094AA:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFC00000000000000000000EB8DE39CF261EE2C7389B748F8B642E7 00000000000000000000000000000000:F76DAEB0ED23167614294AC2F8E9EE9A:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFE00000000000000000000EB8DE39CF261EE2C7389B748F8B642E8 00000000000000000000000000000000:C66A4B38050953805598F4EAF203CDE4:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFF00000000000000000000EB8DE39CF261EE2C7389B748F8B642E9 00000000000000000000000000000000:76A726ED76276D5E7119AF0CCAED854A:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFF80000000000000000000EB8DE39CF261EE2C7389B748F8B642EA 00000000000000000000000000000000:EB8FE9FF9A053DD2F132B11F17F53D78:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFC0000000000000000000EB8DE39CF261EE2C7389B748F8B642EB 00000000000000000000000000000000:A6C5E4E13C36E80E1BBB046E6377D290:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFE0000000000000000000EB8DE39CF261EE2C7389B748F8B642EC 00000000000000000000000000000000:75B476973CF532F655B8BF80CB6AC2A3:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFF0000000000000000000EB8DE39CF261EE2C7389B748F8B642ED 00000000000000000000000000000000:3AC698CFC1EF3ED72C26CAF5347DF997:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFF8000000000000000000EB8DE39CF261EE2C7389B748F8B642EE 00000000000000000000000000000000:167ECAE8C6F793FEB00A69E3A9FAF332:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFC000000000000000000EB8DE39CF261EE2C7389B748F8B642EF 00000000000000000000000000000000:8F2906AF93A28FFFBFD83D5D7E6D7F72:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFE000000000000000000EB8DE39CF261EE2C7389B748F8B642F0 00000000000000000000000000000000:5BBA7C625C23F69354A61CCF2289A1B3:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFF000000000000000000EB8DE39CF261EE2C7389B748F8B642F1 00000000000000000000000000000000:0083A3EC21348F22B0039759AE762A2F:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFF800000000000000000EB8DE39CF261EE2C7389B748F8B642F2 00000000000000000000000000000000:5E2864DD971DB13227F06535D52C24AE:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFC00000000000000000EB8DE39CF261EE2C7389B748F8B642F3 00000000000000000000000000000000:D5792243D3B9BD5C7299151685192BBA:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFE00000000000000000EB8DE39CF261EE2C7389B748F8B642F4 00000000000000000000000000000000:7B26CD6C3468209850FDF7F67448FAB7:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFF00000000000000000EB8DE39CF261EE2C7389B748F8B642F5 00000000000000000000000000000000:717586F8B816B273A691D3379005301E:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFF80000000000000000EB8DE39CF261EE2C7389B748F8B642F6 00000000000000000000000000000000:33D8F8DDF2A5E97E9CB1C032735BEF21:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFC0000000000000000EB8DE39CF261EE2C7389B748F8B642F7 00000000000000000000000000000000:B277E4BA071293C54D84A29637273B04:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFE0000000000000000EB8DE39CF261EE2C7389B748F8B642F8 00000000000000000000000000000000:FBD6F5662D222FC9C55332A60F747879:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFF0000000000000000EB8DE39CF261EE2C7389B748F8B642F9 00000000000000000000000000000000:88FF65F58F6F4BF35DB846BB2132DEC6:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFF8000000000000000EB8DE39CF261EE2C7389B748F8B642FA 00000000000000000000000000000000:BE12ADEDECB8DCFF2723E1D5F0D9C753:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFC000000000000000EB8DE39CF261EE2C7389B748F8B642FB 00000000000000000000000000000000:5A368FCCC787680145BBFBDA64BE16C6:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFE000000000000000EB8DE39CF261EE2C7389B748F8B642FC 00000000000000000000000000000000:A804DC10C6223194AE4310D7C628DBAF:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFF000000000000000EB8DE39CF261EE2C7389B748F8B642FD 00000000000000000000000000000000:1DE5494C7B609ABD1406FB318B572DE7:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFF800000000000000EB8DE39CF261EE2C7389B748F8B642FE 00000000000000000000000000000000:78566AA937E9C90D764DFB1D5723140B:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFC00000000000000EB8DE39CF261EE2C7389B748F8B642FF 00000000000000000000000000000000:9F42A9F1512DA372008DF3D469B4AD04:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFE00000000000000EB8DE39CF261EE2C7389B748F8B64300 00000000000000000000000000000000:C80993A52AE00A74A64FAD42EC586FF5:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFF00000000000000EB8DE39CF261EE2C7389B748F8B64301 00000000000000000000000000000000:3AFC74E774FE9B27202B8596C5B1396E:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFF80000000000000EB8DE39CF261EE2C7389B748F8B64302 00000000000000000000000000000000:64829EB2B232687C9CE32F8A91274497:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFC0000000000000EB8DE39CF261EE2C7389B748F8B64303 00000000000000000000000000000000:E9795D38B5A1AAD7901C7765CF4F23B2:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFE0000000000000EB8DE39CF261EE2C7389B748F8B64304 00000000000000000000000000000000:28989B6F2458E95A32485C7050DB4155:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFF0000000000000EB8DE39CF261EE2C7389B748F8B64305 00000000000000000000000000000000:3DFFB7C3CDBB9C3B27A5CCCFDAFA9AAE:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFF8000000000000EB8DE39CF261EE2C7389B748F8B64306 00000000000000000000000000000000:4B42865DA59E224D8CD7587D8C4AD73E:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFC000000000000EB8DE39CF261EE2C7389B748F8B64307 00000000000000000000000000000000:19316BB7F4041A621BD659FBD34397D6:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFE000000000000EB8DE39CF261EE2C7389B748F8B64308 00000000000000000000000000000000:963835BE55A1E143D1F2F56BCA837BBE:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFF000000000000EB8DE39CF261EE2C7389B748F8B64309 00000000000000000000000000000000:2C614F8E813AF275902D7139B08C0998:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFF800000000000EB8DE39CF261EE2C7389B748F8B6430A 00000000000000000000000000000000:6B0F6D50554C31C8439ECEAC28B2C256:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFC00000000000EB8DE39CF261EE2C7389B748F8B6430B 00000000000000000000000000000000:B6D80EEEC39FBB091ADC6BB3BB5D5A67:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFE00000000000EB8DE39CF261EE2C7389B748F8B6430C 00000000000000000000000000000000:6C8D5E16792215E76E73FD4650A407DB:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFF00000000000EB8DE39CF261EE2C7389B748F8B6430D 00000000000000000000000000000000:AA6E5BE4C0C26EEC0161D364F0FF7DE3:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFF80000000000EB8DE39CF261EE2C7389B748F8B6430E 00000000000000000000000000000000:1CC202A40F8ED80D5559BB2B29E96A65:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFC0000000000EB8DE39CF261EE2C7389B748F8B6430F 00000000000000000000000000000000:0B4B9B6139443912D9492EE91A1769CB:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFE0000000000EB8DE39CF261EE2C7389B748F8B64310 00000000000000000000000000000000:C10EBF773A13A852500F2025AB965540:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFF0000000000EB8DE39CF261EE2C7389B748F8B64311 00000000000000000000000000000000:5221FDCFA12F36E4E893E902A54999E8:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFF8000000000EB8DE39CF261EE2C7389B748F8B64312 00000000000000000000000000000000:E9090364194100265EF53E91299865FB:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFC000000000EB8DE39CF261EE2C7389B748F8B64313 00000000000000000000000000000000:8CD5E4284B02C8B711DE7B234F6484F7:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFE000000000EB8DE39CF261EE2C7389B748F8B64314 00000000000000000000000000000000:76F5D704C6B17CF7397C58D3021C2FBC:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFF000000000EB8DE39CF261EE2C7389B748F8B64315 00000000000000000000000000000000:F157BFB5FBF1011BD22292D947D12986:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFF800000000EB8DE39CF261EE2C7389B748F8B64316 00000000000000000000000000000000:2D2BD62F2AD0EE7854072B7F6860FFCA:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFC00000000EB8DE39CF261EE2C7389B748F8B64317 00000000000000000000000000000000:3D96768C1F0796A39077BE1C70301FD4:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFE00000000EB8DE39CF261EE2C7389B748F8B64318 00000000000000000000000000000000:D5073B8CF890C43AEE43AE333D57D642:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFF00000000EB8DE39CF261EE2C7389B748F8B64319 00000000000000000000000000000000:D38ADEA6FE821453B9EB88D9CADAD3F4:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFF80000000EB8DE39CF261EE2C7389B748F8B6431A 00000000000000000000000000000000:F4F66618DBFED3C4B90AD93FAC1083F8:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFC0000000EB8DE39CF261EE2C7389B748F8B6431B 00000000000000000000000000000000:930AD1D86D3ECA7A0692766CD1E40490:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFE0000000EB8DE39CF261EE2C7389B748F8B6431C 00000000000000000000000000000000:63D8247A053BBE984B9840CFB7D90DD2:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFF0000000EB8DE39CF261EE2C7389B748F8B6431D 00000000000000000000000000000000:827D954277E357D0453BBC537C9AB221:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFF8000000EB8DE39CF261EE2C7389B748F8B6431E 00000000000000000000000000000000:9E2BDF167485A3AE004F0643E775CF42:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFC000000EB8DE39CF261EE2C7389B748F8B6431F 00000000000000000000000000000000:445A3F86B2FC284BB933CBC68649E4CC:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFE000000EB8DE39CF261EE2C7389B748F8B64320 00000000000000000000000000000000:F6AEADC9A5A8DF7A1664B4CD055E42B4:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFF000000EB8DE39CF261EE2C7389B748F8B64321 00000000000000000000000000000000:1B43269E05CD108EE91AAA0ECC1CA831:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFF800000EB8DE39CF261EE2C7389B748F8B64322 00000000000000000000000000000000:857EEB71AB8F12AE4051B825F6B7B686:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFC00000EB8DE39CF261EE2C7389B748F8B64323 00000000000000000000000000000000:C92EF523170FDEBA77CFA50D84742D68:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFE00000EB8DE39CF261EE2C7389B748F8B64324 00000000000000000000000000000000:DC8C52D3698E8356F9D0F77361D8F26E:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFF00000EB8DE39CF261EE2C7389B748F8B64325 00000000000000000000000000000000:86A95BA023CBE3E5A5911D5CA22C504E:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFF80000EB8DE39CF261EE2C7389B748F8B64326 00000000000000000000000000000000:6E9CACEB9D51D7D05E1FD06B1BE031C7:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFC0000EB8DE39CF261EE2C7389B748F8B64327 00000000000000000000000000000000:556ECC72A98D46912ADDD08FDE7BA0A3:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFE0000EB8DE39CF261EE2C7389B748F8B64328 00000000000000000000000000000000:3A404D891C30FBBA2EED516E81B82391:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EB8DE39CF261EE2C7389B748F8B64329 00000000000000000000000000000000:7BC825F8C9CB40A71E6B714171A77436:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFF8000EB8DE39CF261EE2C7389B748F8B6432A 00000000000000000000000000000000:EC8430466E19133B11D9B99DA3C614B8:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFC000EB8DE39CF261EE2C7389B748F8B6432B 00000000000000000000000000000000:DCB6690389626F5392FD37E486490649:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFE000EB8DE39CF261EE2C7389B748F8B6432C 00000000000000000000000000000000:73A591DF83E5F8E819BC63702471DD4A:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000EB8DE39CF261EE2C7389B748F8B6432D 00000000000000000000000000000000:76B3B1D6EB12BBD6C3F17E73E9E2EB30:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFF800EB8DE39CF261EE2C7389B748F8B6432E 00000000000000000000000000000000:FEC46BE2B11B2FA1C7D7A5CC3012F5DC:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00EB8DE39CF261EE2C7389B748F8B6432F 00000000000000000000000000000000:393389AC2C7FBA821920F6DC2193A4E0:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00EB8DE39CF261EE2C7389B748F8B64330 00000000000000000000000000000000:43D7D429B793F150173FCFEC35D9A4E8:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EB8DE39CF261EE2C7389B748F8B64331 00000000000000000000000000000000:8EAE659DF12B19C428CFC37E3432683D:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80EB8DE39CF261EE2C7389B748F8B64332 00000000000000000000000000000000:5080B7459858EA77FFC5AEAD88DEE1B5:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EB8DE39CF261EE2C7389B748F8B64333 00000000000000000000000000000000:ACBEEAFC7D2C5DCE6AC63452E07D6A95:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0EB8DE39CF261EE2C7389B748F8B64334 00000000000000000000000000000000:95407BD82770032D496FD3F54478A589:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0EB8DE39CF261EE2C7389B748F8B64335 00000000000000000000000000000000:F3B8D4093A4D2845A2C411C8EA1E9F12:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8EB8DE39CF261EE2C7389B748F8B64336 00000000000000000000000000000000:6B232AD852E9D6EB2CA54E8C9B5163C3:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCEB8DE39CF261EE2C7389B748F8B64337 00000000000000000000000000000000:C3CB4B5855323C13C8973982E9EA33E7:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEB8DE39CF261EE2C7389B748F8B64338 00000000000000000000000000000000:504D101AC84F9B4542C1B0264B947410:\ C592BF6A04D72BB1CBEAF590B7CCA6BC\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB8DE39CF261EE2C7389B748F8B64339 [X9.31-RNG(AES-192)] 00000000000000000000000000000000:765F8B450404187233E6F7C30A9C3033:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ 800000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C82 00000000000000000000000000000000:3636889C7E3720C3E0DCF399104597A4:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ C00000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C83 00000000000000000000000000000000:2845D5BCACD8C65B5B4B5A168E778DF7:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ E00000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C84 00000000000000000000000000000000:41CDAA700F6E179354AD61B7CBD5E272:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ F00000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C85 00000000000000000000000000000000:E08638EAEC7EA84B43AC7EB48296B94C:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ F80000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C86 00000000000000000000000000000000:A7AFADA8824F5B94EB20E31B30519A91:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FC0000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C87 00000000000000000000000000000000:F5CAB3443DA2C48B0C309FC64FB903C6:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FE0000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C88 00000000000000000000000000000000:6CCEBF22A49BB4921E4E30D0663F90DC:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FF0000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C89 00000000000000000000000000000000:D8CCE94DE9CFE74E3392418BCC843B14:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FF8000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8A 00000000000000000000000000000000:D56EEA4E0B3963E370E6145352F170F0:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFC000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8B 00000000000000000000000000000000:43894E0870AD99C2CF7116FF3F076AA3:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFE000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8C 00000000000000000000000000000000:0181C2495F3DDB5BBA9F52634A3CA1A1:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFF000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8D 00000000000000000000000000000000:AE97729D2D864B54619DCCA39F7C1E3E:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFF800000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8E 00000000000000000000000000000000:E7F674C418E2CF20CE7152BFD184428D:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFC00000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8F 00000000000000000000000000000000:DA0CCB4303614FE6F975AAC0A6B79C0C:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFE00000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C90 00000000000000000000000000000000:02AAAFF23E2D38885670604C1356CAFA:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFF00000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C91 00000000000000000000000000000000:649A70DFBEEBAFE24F102BB45302CA90:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFF80000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C92 00000000000000000000000000000000:2E2CE97AD3E20C8F5E676D453FC0573A:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFC0000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C93 00000000000000000000000000000000:147AA9D83747429EB9E642190331E140:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFE0000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C94 00000000000000000000000000000000:CA64870FDF1A3DFD3206EC3C39E37831:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFF0000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C95 00000000000000000000000000000000:9D91BBFA64EC181C0FEA5B620338C93F:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFF8000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C96 00000000000000000000000000000000:DBF7E2FFD26CC3DE9E58F06EA4AA108B:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFC000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C97 00000000000000000000000000000000:172248D875492388F40E465884809BEC:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFE000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C98 00000000000000000000000000000000:9CDDA74369BCE1E0545AC7BB33ED56C6:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFF000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C99 00000000000000000000000000000000:58F86FD5A8CE9F2DE1D7B036646C3CF0:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFF800000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9A 00000000000000000000000000000000:22B087E72247F42628C4EED66DAC2857:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFC00000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9B 00000000000000000000000000000000:2C5A29C655986B70CF4D824DA14CCC51:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFE00000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9C 00000000000000000000000000000000:166EA4679813A0BC390389EC305336FB:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFF00000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9D 00000000000000000000000000000000:BF11A059C4081554C66DA4BD62B20954:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFF80000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9E 00000000000000000000000000000000:566904C94E52FC620F980EDF352428CA:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFC0000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9F 00000000000000000000000000000000:DC3EFF7EAC7A8EBD840DF5F621A3449A:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFE0000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA0 00000000000000000000000000000000:EADDA03E98C5B8A6A28C92B7EBC7AC97:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFF0000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA1 00000000000000000000000000000000:99F41647A63D58E862E3AC10FC5AEE92:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFF8000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA2 00000000000000000000000000000000:B5D386B2184EDFD9726DA021B0F34142:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFC000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA3 00000000000000000000000000000000:FAAE880D0C2DADC2015C66BE8AD6BC1E:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFE000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA4 00000000000000000000000000000000:250DCFF45916E9F8FA2219F62A422B00:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFF000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA5 00000000000000000000000000000000:853BAB572DCE44B910DDE9D74D6EC4A9:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFF800000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA6 00000000000000000000000000000000:EBFC3DFD08EE68B825F47F63F47FFC2D:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFC00000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA7 00000000000000000000000000000000:6D25021AE6865BC70971485E1888CB35:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFE00000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA8 00000000000000000000000000000000:A1D2584BBE712619CABD295ADE48D132:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFF00000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA9 00000000000000000000000000000000:8EA62AAFD310009DE585FCA2542128C6:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFF80000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAA 00000000000000000000000000000000:5DBEEB2438CDC2E4B0727F537EB6BCEE:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFC0000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAB 00000000000000000000000000000000:81A884DD17A78D57BB00FC23B372A003:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFE0000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAC 00000000000000000000000000000000:22ECAAC6F2884CC9F2977C63A7F429AF:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFF0000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAD 00000000000000000000000000000000:35A2E0D7BE633C0E24C09E6F7EB681A5:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFF8000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAE 00000000000000000000000000000000:FAA2B324614E430AF7168D3BE22AB8F5:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFC000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAF 00000000000000000000000000000000:FEEB51786DA2CAD7C17EB084F16ED95C:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFE000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB0 00000000000000000000000000000000:60C5CC3D4FA90CAE8F800FE0EBC3BD7D:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFF000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB1 00000000000000000000000000000000:F4F4B400DE91585909EC6C772A616331:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFF800000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB2 00000000000000000000000000000000:10A1126BFCF62DE266240BEBC70345D4:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFC00000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB3 00000000000000000000000000000000:7E54A01950089CECD54EF526C2CA4D32:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFE00000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB4 00000000000000000000000000000000:878880E754C0835B28EE7ABBAC5483BE:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFF00000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB5 00000000000000000000000000000000:5818CF8CCCF36E2FD381F40E8E6B6C22:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFF80000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB6 00000000000000000000000000000000:5342E61C5CE89EFC82790297315BC6BE:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFC0000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB7 00000000000000000000000000000000:C1A6F265700B4B032B82A8DDECE58FA8:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFE0000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB8 00000000000000000000000000000000:4206F2CBF9FBBC6CF774642B552754A6:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFF0000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB9 00000000000000000000000000000000:0839EF91752B19D1B4D853BF27945C98:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFF8000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBA 00000000000000000000000000000000:3AA99E43E643F56D51EAE0DD94D53FAD:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFC000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBB 00000000000000000000000000000000:8A17C2B4992E26A7A0E709F05C3B81EC:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFE000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBC 00000000000000000000000000000000:9D14DA0A5F6D0E5F7B9FC38BBD598196:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFF000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBD 00000000000000000000000000000000:709CAED6B876ECE41FF7AE78C3892CAC:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFF800000000000000008159E43DB66ECF3EABE5A44E0D4C0CBE 00000000000000000000000000000000:5AD091FF7C2677F8E3DFB98F8E85E54A:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFC00000000000000008159E43DB66ECF3EABE5A44E0D4C0CBF 00000000000000000000000000000000:989D89F341AB464BE89E17B06467A8FD:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFE00000000000000008159E43DB66ECF3EABE5A44E0D4C0CC0 00000000000000000000000000000000:3257273E13063BCFB64C7A0B090B0A2D:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFF00000000000000008159E43DB66ECF3EABE5A44E0D4C0CC1 00000000000000000000000000000000:431D551090D4E840432CD0D8E7170666:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFF80000000000000008159E43DB66ECF3EABE5A44E0D4C0CC2 00000000000000000000000000000000:F3EBF6C275C41C7015BFEE14DE87F372:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFC0000000000000008159E43DB66ECF3EABE5A44E0D4C0CC3 00000000000000000000000000000000:13EE442069EC7B852034397B1F09EB3D:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFE0000000000000008159E43DB66ECF3EABE5A44E0D4C0CC4 00000000000000000000000000000000:ACFAA2C816C9ECAD0A19BA783BCAB411:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFF0000000000000008159E43DB66ECF3EABE5A44E0D4C0CC5 00000000000000000000000000000000:2AAEB898354B9E1358CA6DF57369C361:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFF8000000000000008159E43DB66ECF3EABE5A44E0D4C0CC6 00000000000000000000000000000000:52C35276866C0DA1277FC4952B732EEA:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFC000000000000008159E43DB66ECF3EABE5A44E0D4C0CC7 00000000000000000000000000000000:BAEEB093F380B5D887DC48B7DE672D33:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFE000000000000008159E43DB66ECF3EABE5A44E0D4C0CC8 00000000000000000000000000000000:D524C38205AD436D54199E0F8E04D8D9:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFF000000000000008159E43DB66ECF3EABE5A44E0D4C0CC9 00000000000000000000000000000000:A0D1315745F15F0DDC468DBDD9E56714:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFF800000000000008159E43DB66ECF3EABE5A44E0D4C0CCA 00000000000000000000000000000000:2776D4FFDFFB344EC55FC22FFE450A3C:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFC00000000000008159E43DB66ECF3EABE5A44E0D4C0CCB 00000000000000000000000000000000:BC0716E00000562CC8A9E2470F3D8B63:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFE00000000000008159E43DB66ECF3EABE5A44E0D4C0CCC 00000000000000000000000000000000:E29DD29D73D883CD8DAF74838BBEFC7C:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFF00000000000008159E43DB66ECF3EABE5A44E0D4C0CCD 00000000000000000000000000000000:84CBCBB352E2D3CB77E04C954280694E:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFF80000000000008159E43DB66ECF3EABE5A44E0D4C0CCE 00000000000000000000000000000000:558744FEBFFE7A0AE424D45921B87309:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFC0000000000008159E43DB66ECF3EABE5A44E0D4C0CCF 00000000000000000000000000000000:7FF9325EA7576D41B4A1B557533432FB:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFE0000000000008159E43DB66ECF3EABE5A44E0D4C0CD0 00000000000000000000000000000000:01CC9B4887AD0B270EC55F6527AB90A6:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFF0000000000008159E43DB66ECF3EABE5A44E0D4C0CD1 00000000000000000000000000000000:044176DA3370910AE0BCBDCF1D895CC0:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFF8000000000008159E43DB66ECF3EABE5A44E0D4C0CD2 00000000000000000000000000000000:BCA18B1630EAEC7CBDDF5C513A53D456:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFC000000000008159E43DB66ECF3EABE5A44E0D4C0CD3 00000000000000000000000000000000:19D1D3DA04BDAD8D710DD14A611F8F17:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFE000000000008159E43DB66ECF3EABE5A44E0D4C0CD4 00000000000000000000000000000000:615BC0AF497F862399EF275E649746F0:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFF000000000008159E43DB66ECF3EABE5A44E0D4C0CD5 00000000000000000000000000000000:58F46ACF8BB0D1B56EF0AD46D90DA340:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFF800000000008159E43DB66ECF3EABE5A44E0D4C0CD6 00000000000000000000000000000000:2F2DBE7F2123A2E66CD8DD478688A07E:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFC00000000008159E43DB66ECF3EABE5A44E0D4C0CD7 00000000000000000000000000000000:AA80B113C8E106723409B3F31969965A:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFE00000000008159E43DB66ECF3EABE5A44E0D4C0CD8 00000000000000000000000000000000:DFC761136BCB3B2E1E13E0291BA85972:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFF00000000008159E43DB66ECF3EABE5A44E0D4C0CD9 00000000000000000000000000000000:E0944C42C6EE12FAA28286B0ED4F5DC7:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFF80000000008159E43DB66ECF3EABE5A44E0D4C0CDA 00000000000000000000000000000000:DAF99970E52C6639188262C5DAD13123:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFC0000000008159E43DB66ECF3EABE5A44E0D4C0CDB 00000000000000000000000000000000:0E07202C26F31E74004015F6BC7E2100:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFE0000000008159E43DB66ECF3EABE5A44E0D4C0CDC 00000000000000000000000000000000:93DCAC92FB0DA5976DF8A75DBDC61C9B:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFF0000000008159E43DB66ECF3EABE5A44E0D4C0CDD 00000000000000000000000000000000:9370C5EC398DE376E319370A4C5F26E2:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFF8000000008159E43DB66ECF3EABE5A44E0D4C0CDE 00000000000000000000000000000000:83C03F2B1B64E72ED21D0A5F59FA7F8C:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFC000000008159E43DB66ECF3EABE5A44E0D4C0CDF 00000000000000000000000000000000:AA1159B23592ADECC168B2268952A92B:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFE000000008159E43DB66ECF3EABE5A44E0D4C0CE0 00000000000000000000000000000000:14EEE0E44CA217E45440EC84011D89A5:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFF000000008159E43DB66ECF3EABE5A44E0D4C0CE1 00000000000000000000000000000000:B2C88BBA8B055BA74622297E8BC8D95D:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFF800000008159E43DB66ECF3EABE5A44E0D4C0CE2 00000000000000000000000000000000:FADFBA23CC801A926A119F78B37A9307:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFC00000008159E43DB66ECF3EABE5A44E0D4C0CE3 00000000000000000000000000000000:4CB2D5484366D91C9243C4797DA983DD:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFE00000008159E43DB66ECF3EABE5A44E0D4C0CE4 00000000000000000000000000000000:367EF2BDC4163545C4C9011AE53755DE:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFF00000008159E43DB66ECF3EABE5A44E0D4C0CE5 00000000000000000000000000000000:51888B85AD78889BACEA726798C30C95:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFF80000008159E43DB66ECF3EABE5A44E0D4C0CE6 00000000000000000000000000000000:1D3CEC46E078E44BF11603DB2726D8F2:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFC0000008159E43DB66ECF3EABE5A44E0D4C0CE7 00000000000000000000000000000000:A369189A3667F44FFA8DA2E5E9425D6F:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFE0000008159E43DB66ECF3EABE5A44E0D4C0CE8 00000000000000000000000000000000:ED8C0F37154A57D27A9A11CAE3F3131E:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFF0000008159E43DB66ECF3EABE5A44E0D4C0CE9 00000000000000000000000000000000:8B04BF18036328006D9A7FC4C1BCF818:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFF8000008159E43DB66ECF3EABE5A44E0D4C0CEA 00000000000000000000000000000000:0E1E3F517E7502E4CC98A3A312692666:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFC000008159E43DB66ECF3EABE5A44E0D4C0CEB 00000000000000000000000000000000:306CA0902C2B572BB5E2CE0848D6280E:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFE000008159E43DB66ECF3EABE5A44E0D4C0CEC 00000000000000000000000000000000:8F8479252EF0C104D27B38C52F4F40EB:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFF000008159E43DB66ECF3EABE5A44E0D4C0CED 00000000000000000000000000000000:D5C6F739A2B316B8CAFBC39999C731CB:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFF800008159E43DB66ECF3EABE5A44E0D4C0CEE 00000000000000000000000000000000:5C153EA9F8580BE16B093EE1CF83529B:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFC00008159E43DB66ECF3EABE5A44E0D4C0CEF 00000000000000000000000000000000:13A3DF5F58736008E8101087B5B49563:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFE00008159E43DB66ECF3EABE5A44E0D4C0CF0 00000000000000000000000000000000:2CB0DC2125C33149703A9A86CB0FB7D2:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFF00008159E43DB66ECF3EABE5A44E0D4C0CF1 00000000000000000000000000000000:5453577F4F95E85D729DCFD84B297381:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFF80008159E43DB66ECF3EABE5A44E0D4C0CF2 00000000000000000000000000000000:588702C309F54A76467B8F587FE17096:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFC0008159E43DB66ECF3EABE5A44E0D4C0CF3 00000000000000000000000000000000:7779A89AD48BB3FD8BBFDC5BD8C9101E:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFE0008159E43DB66ECF3EABE5A44E0D4C0CF4 00000000000000000000000000000000:9EDB48F7416AE0BD9802172515AA3D80:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0008159E43DB66ECF3EABE5A44E0D4C0CF5 00000000000000000000000000000000:84AEA377BDDC54012F710254A435E1D1:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8008159E43DB66ECF3EABE5A44E0D4C0CF6 00000000000000000000000000000000:4BEE75DC775926F27373A958BF64A168:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC008159E43DB66ECF3EABE5A44E0D4C0CF7 00000000000000000000000000000000:76B563BA44BFF0D9CB460CD5E8D55C32:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE008159E43DB66ECF3EABE5A44E0D4C0CF8 00000000000000000000000000000000:0682EA4560113BE4D3F3E92256D2BAAC:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF008159E43DB66ECF3EABE5A44E0D4C0CF9 00000000000000000000000000000000:65D98A2BC1A84569FC553ED36C28FF45:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808159E43DB66ECF3EABE5A44E0D4C0CFA 00000000000000000000000000000000:0AABEB6CE77559F813C8257E57938C2C:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC08159E43DB66ECF3EABE5A44E0D4C0CFB 00000000000000000000000000000000:5ED815849F9F2480202FDAE7C05CC83B:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE08159E43DB66ECF3EABE5A44E0D4C0CFC 00000000000000000000000000000000:5F453DBC5FED77520B0AFB71DAE3C083:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08159E43DB66ECF3EABE5A44E0D4C0CFD 00000000000000000000000000000000:14CAA4D84D923CCDAD2CD1CCD0377833:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88159E43DB66ECF3EABE5A44E0D4C0CFE 00000000000000000000000000000000:573691CD8E310DC33A645582BA51DE9A:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8159E43DB66ECF3EABE5A44E0D4C0CFF 00000000000000000000000000000000:8B77DFB1C9BD1FBF4B379B159230A7A6:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8159E43DB66ECF3EABE5A44E0D4C0D00 00000000000000000000000000000000:CCAE97D6E56FBDA46C9B0DF5B6AF71C3:\ E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8159E43DB66ECF3EABE5A44E0D4C0D01 [X9.31-RNG(AES-256)] 00000000000000000000000000000000:6C5EE8D10201D608874E6AE8C8A2BA79:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ 8000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C2 00000000000000000000000000000000:3790A9D44DE68EF0800837B32E2ED032:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ C000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C3 00000000000000000000000000000000:72A1742C79E8B1D4F62E0669657F744D:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ E000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C4 00000000000000000000000000000000:9E5708E79B379B9D393C766CFD802C98:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ F000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C5 00000000000000000000000000000000:AF7A0A13DE0B16512986538D5FECDC7D:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ F800000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C6 00000000000000000000000000000000:D885CBF7B4E38B9FAC1C8EB625DDABCA:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FC00000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C7 00000000000000000000000000000000:7AEF038A328D1827D52DA4A36567C7BA:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FE00000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C8 00000000000000000000000000000000:14169D5DE6E79DEA20E261DA55DBA593:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FF00000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C9 00000000000000000000000000000000:DFE31312A96369CF41CAED493D4DFF4B:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FF80000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CA 00000000000000000000000000000000:BAFFD64502B19D26DCA93D09E43D8036:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFC0000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CB 00000000000000000000000000000000:8BDEF0F95AB8F3B5A591A78364B723C7:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFE0000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CC 00000000000000000000000000000000:38145A8F807E13CB05B2810E752BABDE:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFF0000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CD 00000000000000000000000000000000:98EA671222B7332AEA395F37A355B1CC:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFF8000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CE 00000000000000000000000000000000:20C8AB02049C9987A7B00B4498B2C6E3:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFC000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CF 00000000000000000000000000000000:67B8ACDE366BD5D064CB53C09EB0A95A:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFE000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D0 00000000000000000000000000000000:137721E4A673550141E2E3CF652A0819:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFF000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D1 00000000000000000000000000000000:29C0369E50A4B5494166E60E7E394149:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFF800000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D2 00000000000000000000000000000000:09FAA6F94FE3DAFE3E10A38D8B9ABDE4:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFC00000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D3 00000000000000000000000000000000:5F976E965ABC8C93D1C175AA750C16DC:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFE00000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D4 00000000000000000000000000000000:25C386A980D1E75632566AD290FE3333:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFF00000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D5 00000000000000000000000000000000:D0CB44688ADA0966204B3D53FA89D534:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFF80000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D6 00000000000000000000000000000000:D2D11DD6ABE3B30BAECAADE50A2E9642:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFC0000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D7 00000000000000000000000000000000:068451BECF49C9AD8BF47F176B154092:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFE0000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D8 00000000000000000000000000000000:A8B505B0B75D061A1111FF97EE70CB2D:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFF0000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D9 00000000000000000000000000000000:0479DBD05E14286F769AD495AE114D56:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFF8000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DA 00000000000000000000000000000000:9C62B0A336593C307F2144658DA20BA2:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFC000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DB 00000000000000000000000000000000:D68EFECC5CA3C1109769F14288202779:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFE000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DC 00000000000000000000000000000000:DE6A7F99826A4F60BD70A2839B269A39:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFF000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DD 00000000000000000000000000000000:F03D08EDF438E946E056B6D085C27B28:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFF800000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DE 00000000000000000000000000000000:4DB84EFD6F81DC4B70CAB3E365C70B21:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFC00000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DF 00000000000000000000000000000000:2D78FEC4CA1917B5070D4B5246D5CD11:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFE00000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E0 00000000000000000000000000000000:CE9228E22BD9E7A39FF05E194805F730:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFF00000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E1 00000000000000000000000000000000:D8912B41584C29C70874CBB947833B38:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFF80000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E2 00000000000000000000000000000000:83644C0D80557650F719DF1B28A0CB3F:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFC0000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E3 00000000000000000000000000000000:032A88989BB02C57501CC05D4D72E8A1:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFE0000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E4 00000000000000000000000000000000:7C3607B5F5193A51DF18A19CF4577795:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFF0000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E5 00000000000000000000000000000000:76B055658ADF07D15422895951F692E0:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFF8000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E6 00000000000000000000000000000000:7F87F363569F479DA806ABF988002705:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFC000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E7 00000000000000000000000000000000:9A830D8126A8D39BA023B4F545670618:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFE000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E8 00000000000000000000000000000000:7C0907F8FEBC6DCF1A4D83D420E5DC85:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFF000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E9 00000000000000000000000000000000:F84F6500F554CAF20FF785C28E70AA69:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFF800000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EA 00000000000000000000000000000000:876052A291745E5479FD0ADB65AB3CFD:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFC00000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EB 00000000000000000000000000000000:69F6A409470573A5DEB23744A9FE8C26:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFE00000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EC 00000000000000000000000000000000:455FF206B8BA6D99DDA0B0E645DD03A0:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFF00000000000000000000097B45F0EE0FB64AC3B8A1B9B750666ED 00000000000000000000000000000000:A82E4437632E216EA6E5F75AEB6DC148:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFF80000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EE 00000000000000000000000000000000:A7B1E69A85CC0E01CD2F59E7AFAF790F:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFC0000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EF 00000000000000000000000000000000:68FFCB667FCD6113A1B3E6F20ADBADFE:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFE0000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F0 00000000000000000000000000000000:CEE4E4C331CE6AF61D07617079420E4E:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFF0000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F1 00000000000000000000000000000000:E7CFD60A04AE3875F6E460FE73FC151E:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFF8000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F2 00000000000000000000000000000000:301E3DA5BD96188B3154AAC685EB8B6F:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFC000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F3 00000000000000000000000000000000:12588D677D871E4B042F16E98693167F:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFE000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F4 00000000000000000000000000000000:938DF998D725B8EF5363C99A82D447F8:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFF000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F5 00000000000000000000000000000000:6588A7E9B2D3F82BEACB086A24F05730:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFF800000000000000000097B45F0EE0FB64AC3B8A1B9B750666F6 00000000000000000000000000000000:CA0BBDDD004301639B1644A8CB9360B2:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFC00000000000000000097B45F0EE0FB64AC3B8A1B9B750666F7 00000000000000000000000000000000:35B609CE89EE33F267A4E875FA4128F3:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFE00000000000000000097B45F0EE0FB64AC3B8A1B9B750666F8 00000000000000000000000000000000:BAC817B7C3E5B617FFC977F23BBF755B:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFF00000000000000000097B45F0EE0FB64AC3B8A1B9B750666F9 00000000000000000000000000000000:46487C6F7B5EEDCDAB5BB08234EE4C76:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFF80000000000000000097B45F0EE0FB64AC3B8A1B9B750666FA 00000000000000000000000000000000:752D69F5FFAAB3D22A07B5E8CC02C7DA:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFC0000000000000000097B45F0EE0FB64AC3B8A1B9B750666FB 00000000000000000000000000000000:46688ED5C008A8431D25FECADCAC511E:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFE0000000000000000097B45F0EE0FB64AC3B8A1B9B750666FC 00000000000000000000000000000000:2A5BCBE76FE95C1274F4B9315D4286CE:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFF0000000000000000097B45F0EE0FB64AC3B8A1B9B750666FD 00000000000000000000000000000000:C9BD29164997EB53E05D41B4A5654AE8:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFF8000000000000000097B45F0EE0FB64AC3B8A1B9B750666FE 00000000000000000000000000000000:EB5C8D67F1B7A2183A0B196E8450B873:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFC000000000000000097B45F0EE0FB64AC3B8A1B9B750666FF 00000000000000000000000000000000:CD9231AF1BB1CA82226F5C5852BA17C2:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFE000000000000000097B45F0EE0FB64AC3B8A1B9B75066700 00000000000000000000000000000000:5C0DA74392E5BE679DBD40FC95EE03D4:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFF000000000000000097B45F0EE0FB64AC3B8A1B9B75066701 00000000000000000000000000000000:786D6BA1C0BA6FC1AF0F11EC5875A1F5:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFF800000000000000097B45F0EE0FB64AC3B8A1B9B75066702 00000000000000000000000000000000:1F251DD8210AAEDCB79D4152369CD76B:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFC00000000000000097B45F0EE0FB64AC3B8A1B9B75066703 00000000000000000000000000000000:1B291C0DBDB2075E9B9C709A15016ED7:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFE00000000000000097B45F0EE0FB64AC3B8A1B9B75066704 00000000000000000000000000000000:8465C72B7319CD4D0E35A05D49C5508D:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFF00000000000000097B45F0EE0FB64AC3B8A1B9B75066705 00000000000000000000000000000000:07F04A0749B6DE3B5C668729B28AFB54:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFF80000000000000097B45F0EE0FB64AC3B8A1B9B75066706 00000000000000000000000000000000:6C97CB048F5B4E7C32196C14E678A0E1:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFC0000000000000097B45F0EE0FB64AC3B8A1B9B75066707 00000000000000000000000000000000:BE029441D7AF7EE8CE7310F6F5006809:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFE0000000000000097B45F0EE0FB64AC3B8A1B9B75066708 00000000000000000000000000000000:31074BC8D063E87E2FF1F9E0EAA404D9:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFF0000000000000097B45F0EE0FB64AC3B8A1B9B75066709 00000000000000000000000000000000:37A677D029773FE867F07020F65F0246:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFF8000000000000097B45F0EE0FB64AC3B8A1B9B7506670A 00000000000000000000000000000000:89DF0BD0FA7D852EAC6B564AB8E6F3F3:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFC000000000000097B45F0EE0FB64AC3B8A1B9B7506670B 00000000000000000000000000000000:CA7747BEFE61CFA622F7A821116E43C2:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFE000000000000097B45F0EE0FB64AC3B8A1B9B7506670C 00000000000000000000000000000000:82D1BA96DF72AC93CD57E9234509FB08:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFF000000000000097B45F0EE0FB64AC3B8A1B9B7506670D 00000000000000000000000000000000:299ECF7AAFADB0F2B21812B8B2977470:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFF800000000000097B45F0EE0FB64AC3B8A1B9B7506670E 00000000000000000000000000000000:7A7A2015F797F943F75F70994F43E523:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFC00000000000097B45F0EE0FB64AC3B8A1B9B7506670F 00000000000000000000000000000000:88F208943716B38D25EC02E164357DBF:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFE00000000000097B45F0EE0FB64AC3B8A1B9B75066710 00000000000000000000000000000000:2420712BC5A2187E71436DF0C7D9E5D7:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFF00000000000097B45F0EE0FB64AC3B8A1B9B75066711 00000000000000000000000000000000:A95EC3F73418436AD057F861BBC1811C:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFF80000000000097B45F0EE0FB64AC3B8A1B9B75066712 00000000000000000000000000000000:713E1A0B1C56DD8D219921C8FEB462EF:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFC0000000000097B45F0EE0FB64AC3B8A1B9B75066713 00000000000000000000000000000000:B5AA2282CC8D2F0003A6492CDE8BD888:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFE0000000000097B45F0EE0FB64AC3B8A1B9B75066714 00000000000000000000000000000000:BD38241AF3C4E5CC844CED745CF65B7D:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFF0000000000097B45F0EE0FB64AC3B8A1B9B75066715 00000000000000000000000000000000:D6DF902987B9C3D5826BA71F1A5FA271:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFF8000000000097B45F0EE0FB64AC3B8A1B9B75066716 00000000000000000000000000000000:DCD0CA7E3C0422E4723AE53641DF1E47:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFC000000000097B45F0EE0FB64AC3B8A1B9B75066717 00000000000000000000000000000000:757E483E335672145C0C0C2097DACDA5:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFE000000000097B45F0EE0FB64AC3B8A1B9B75066718 00000000000000000000000000000000:3BAE296E2434A5331383085CC7704988:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFF000000000097B45F0EE0FB64AC3B8A1B9B75066719 00000000000000000000000000000000:F2CE3B5AA3DCCAF64722D1AE10DE005E:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFF800000000097B45F0EE0FB64AC3B8A1B9B7506671A 00000000000000000000000000000000:58DEC1DEF6FD5E09D814AE6F8641A219:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFC00000000097B45F0EE0FB64AC3B8A1B9B7506671B 00000000000000000000000000000000:2F28B31722EE508F8679234F458BDA26:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFE00000000097B45F0EE0FB64AC3B8A1B9B7506671C 00000000000000000000000000000000:B89DE1B9E3937F115EEE36CE1C1BDD74:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFF00000000097B45F0EE0FB64AC3B8A1B9B7506671D 00000000000000000000000000000000:B6B987E6C49B5BC452F97991838DDCEB:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFF80000000097B45F0EE0FB64AC3B8A1B9B7506671E 00000000000000000000000000000000:E363D02F055C097BF19CD491654FF798:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFC0000000097B45F0EE0FB64AC3B8A1B9B7506671F 00000000000000000000000000000000:654A5415175E6343672AE4C63D6643A2:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFE0000000097B45F0EE0FB64AC3B8A1B9B75066720 00000000000000000000000000000000:ED2313EFC077667BD26DB08F581F3C74:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFF0000000097B45F0EE0FB64AC3B8A1B9B75066721 00000000000000000000000000000000:FC6348FC174F45C96F5A3C78C13B220B:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFF8000000097B45F0EE0FB64AC3B8A1B9B75066722 00000000000000000000000000000000:65AEDCD56236E056217C94642BFEF8BC:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFC000000097B45F0EE0FB64AC3B8A1B9B75066723 00000000000000000000000000000000:920A3A154BD41CB775BA25C2EB3A6885:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFE000000097B45F0EE0FB64AC3B8A1B9B75066724 00000000000000000000000000000000:07953BBE0BE803D75E3B8A0EDBEF1D36:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFF000000097B45F0EE0FB64AC3B8A1B9B75066725 00000000000000000000000000000000:A0BCB7A68C7C29E13306E5BD11AD6746:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFF800000097B45F0EE0FB64AC3B8A1B9B75066726 00000000000000000000000000000000:6DEB2CEA2F4AC6AADB7D3A22A3DA0B65:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFC00000097B45F0EE0FB64AC3B8A1B9B75066727 00000000000000000000000000000000:9D70BC79E81D6279EDCBEFD2C0EF1C5D:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFE00000097B45F0EE0FB64AC3B8A1B9B75066728 00000000000000000000000000000000:AEF03890D852369F48651CF873E30710:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFF00000097B45F0EE0FB64AC3B8A1B9B75066729 00000000000000000000000000000000:F189987D9AA73395765EF29A72B8B058:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFF80000097B45F0EE0FB64AC3B8A1B9B7506672A 00000000000000000000000000000000:87F833C8D5200898FF3B6BDD0B869F94:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFC0000097B45F0EE0FB64AC3B8A1B9B7506672B 00000000000000000000000000000000:5A7B8BB4F19D6DAC3AB19C2F9E2C65DA:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFE0000097B45F0EE0FB64AC3B8A1B9B7506672C 00000000000000000000000000000000:CBDBA79302A31040BEB82623B832DF92:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFF0000097B45F0EE0FB64AC3B8A1B9B7506672D 00000000000000000000000000000000:38E92CC8333025DC803CE15A2628E34A:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFF8000097B45F0EE0FB64AC3B8A1B9B7506672E 00000000000000000000000000000000:FB033A85B5CD43564D80C0280D70B92F:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFC000097B45F0EE0FB64AC3B8A1B9B7506672F 00000000000000000000000000000000:21EC2A86B6A717DB2A3FC7F1DFF2ECEB:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFE000097B45F0EE0FB64AC3B8A1B9B75066730 00000000000000000000000000000000:7DDECD08BA8101F3CD61C42C33B987A7:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000097B45F0EE0FB64AC3B8A1B9B75066731 00000000000000000000000000000000:784E688C7D87FC3C9D31B2B45885DB6E:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFF800097B45F0EE0FB64AC3B8A1B9B75066732 00000000000000000000000000000000:08610008A6FF151C4DD5DE24D578A284:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFC00097B45F0EE0FB64AC3B8A1B9B75066733 00000000000000000000000000000000:91F83EC50CE5A5885659D15A3A50FF3E:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFE00097B45F0EE0FB64AC3B8A1B9B75066734 00000000000000000000000000000000:B4CE519B707EA0791AF63F4344207CB4:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00097B45F0EE0FB64AC3B8A1B9B75066735 00000000000000000000000000000000:94D92918083BF232F8D6580E6A0DEF10:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFF80097B45F0EE0FB64AC3B8A1B9B75066736 00000000000000000000000000000000:F62EE1B2DB6D84D57BEFC1C99C7F4B60:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0097B45F0EE0FB64AC3B8A1B9B75066737 00000000000000000000000000000000:5E4B8514D4CDFDD77796B3ED0E310AFE:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0097B45F0EE0FB64AC3B8A1B9B75066738 00000000000000000000000000000000:3175BBBFE5ED208D189E6B25ADEEB78B:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0097B45F0EE0FB64AC3B8A1B9B75066739 00000000000000000000000000000000:5AC67D25AA2BEFA746FCD6B3FF5BE1DA:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8097B45F0EE0FB64AC3B8A1B9B7506673A 00000000000000000000000000000000:6842AA6307CC06A719828A0039FFC800:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC097B45F0EE0FB64AC3B8A1B9B7506673B 00000000000000000000000000000000:664C66BDE4DEA06C4A79E2EC36DBA148:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE097B45F0EE0FB64AC3B8A1B9B7506673C 00000000000000000000000000000000:F14CE6B410049F5601E8426C4DBAB6F8:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF097B45F0EE0FB64AC3B8A1B9B7506673D 00000000000000000000000000000000:262051DCA403EFBABE2B6BD45C9952D5:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF897B45F0EE0FB64AC3B8A1B9B7506673E 00000000000000000000000000000000:4B4D035F1419C491D8FB486510EA97D8:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC97B45F0EE0FB64AC3B8A1B9B7506673F 00000000000000000000000000000000:152AF024DA001782BFEB875224F2622E:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE97B45F0EE0FB64AC3B8A1B9B75066740 00000000000000000000000000000000:8D7040135B3F89F28277A2527111CF36:\ A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97B45F0EE0FB64AC3B8A1B9B75066741 [X9.31-RNG(TripleDES)] # Two-key TDES 0000000000000000:667BC708CC798ABE:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ 8000000000000000F03E2147D5D7BC7F 0000000000000000:E721EE3C0A2D3886:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ C000000000000000F03E2147D5D7BC80 0000000000000000:CB0FA40E1752F8B4:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ E000000000000000F03E2147D5D7BC81 0000000000000000:DF0351A5B44144A8:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ F000000000000000F03E2147D5D7BC82 0000000000000000:2110E29B7345A88D:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ F800000000000000F03E2147D5D7BC83 0000000000000000:78B751774AF554FB:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FC00000000000000F03E2147D5D7BC84 0000000000000000:E6BC50D6F128D30B:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FE00000000000000F03E2147D5D7BC85 0000000000000000:6B7A3116248AE121:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FF00000000000000F03E2147D5D7BC86 0000000000000000:B9B973F5CFA262BD:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FF80000000000000F03E2147D5D7BC87 0000000000000000:CF0A02808E4416F5:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFC0000000000000F03E2147D5D7BC88 0000000000000000:57AAA1031665A0F6:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFE0000000000000F03E2147D5D7BC89 0000000000000000:C5DA694741C400B8:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFF0000000000000F03E2147D5D7BC8A 0000000000000000:827985C4BEED13AD:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFF8000000000000F03E2147D5D7BC8B 0000000000000000:4C959F98D557367B:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFC000000000000F03E2147D5D7BC8C 0000000000000000:FEB783CEC07F19E0:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFE000000000000F03E2147D5D7BC8D 0000000000000000:B2729B4BC2D30E9A:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFF000000000000F03E2147D5D7BC8E 0000000000000000:09F52DED6D12850F:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFF800000000000F03E2147D5D7BC8F 0000000000000000:84255B4BEA0AD20E:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFC00000000000F03E2147D5D7BC90 0000000000000000:D85EC40C40BCA823:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFE00000000000F03E2147D5D7BC91 0000000000000000:66E000E798487EDB:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFF00000000000F03E2147D5D7BC92 0000000000000000:DA51E314770DC073:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFF80000000000F03E2147D5D7BC93 0000000000000000:3C9876ABFCD744E1:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFC0000000000F03E2147D5D7BC94 0000000000000000:35C48069FB403A05:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFE0000000000F03E2147D5D7BC95 0000000000000000:167E7A420F8CE115:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFF0000000000F03E2147D5D7BC96 0000000000000000:3F5F4A0BA480A18B:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFF8000000000F03E2147D5D7BC97 0000000000000000:F8A5AB2EFFBE6588:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFC000000000F03E2147D5D7BC98 0000000000000000:49D255DCA42D2980:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFE000000000F03E2147D5D7BC99 0000000000000000:01FD7EA6AC37D847:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFF000000000F03E2147D5D7BC9A 0000000000000000:94A77C76071734A9:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFF800000000F03E2147D5D7BC9B 0000000000000000:BF7E82A8F9ACEE71:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFC00000000F03E2147D5D7BC9C 0000000000000000:F7CD2DB61C062B70:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFE00000000F03E2147D5D7BC9D 0000000000000000:5D5FC3205EA443CB:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFF00000000F03E2147D5D7BC9E 0000000000000000:177BA1ABE977A3BC:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFF80000000F03E2147D5D7BC9F 0000000000000000:A216FB8EBB474E43:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFC0000000F03E2147D5D7BCA0 0000000000000000:EC01B37568C1C8E6:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFE0000000F03E2147D5D7BCA1 0000000000000000:5C99E5EC34992209:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFF0000000F03E2147D5D7BCA2 0000000000000000:7CA695FA30B7274C:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFF8000000F03E2147D5D7BCA3 0000000000000000:C4FEE5C7491D331A:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFC000000F03E2147D5D7BCA4 0000000000000000:E478C7F21574449D:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFE000000F03E2147D5D7BCA5 0000000000000000:A11D4FBD732DFD01:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFF000000F03E2147D5D7BCA6 0000000000000000:2C44DD477C786C0D:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFF800000F03E2147D5D7BCA7 0000000000000000:850D5D9DA85BC0FF:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFC00000F03E2147D5D7BCA8 0000000000000000:A3A6DDB46772D1B1:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFE00000F03E2147D5D7BCA9 0000000000000000:97FF98957CF38B00:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFF00000F03E2147D5D7BCAA 0000000000000000:BC9E368D91CD2271:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFF80000F03E2147D5D7BCAB 0000000000000000:6B47A38A2BBDD3C8:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFC0000F03E2147D5D7BCAC 0000000000000000:123A41498F2F64E0:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFE0000F03E2147D5D7BCAD 0000000000000000:7362426810CB6EAF:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFF0000F03E2147D5D7BCAE 0000000000000000:42FB3B0EC5DBC02C:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFF8000F03E2147D5D7BCAF 0000000000000000:B7524AB40D565D49:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFC000F03E2147D5D7BCB0 0000000000000000:811C84CD8E223FB5:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFE000F03E2147D5D7BCB1 0000000000000000:16DDAFC9DBA1194D:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFF000F03E2147D5D7BCB2 0000000000000000:390B6AB9069DC5B4:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFF800F03E2147D5D7BCB3 0000000000000000:009F167DC8664555:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFC00F03E2147D5D7BCB4 0000000000000000:47645D90B39B319F:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFE00F03E2147D5D7BCB5 0000000000000000:D75CEC7FBA2064DF:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFF00F03E2147D5D7BCB6 0000000000000000:F59DDE3C02AD7C11:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFF80F03E2147D5D7BCB7 0000000000000000:35AC2155446CCE9F:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFFC0F03E2147D5D7BCB8 0000000000000000:1DFEBF13320F7758:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFFE0F03E2147D5D7BCB9 0000000000000000:017CA3327FC53831:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFFF0F03E2147D5D7BCBA 0000000000000000:999A450B6E2040B9:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFFF8F03E2147D5D7BCBB 0000000000000000:49C1CAAC8C229EDE:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFFFCF03E2147D5D7BCBC 0000000000000000:2C9D8D0F5D014F7B:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFFFEF03E2147D5D7BCBD 0000000000000000:16D7C77223C2FAED:\ E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76\ FFFFFFFFFFFFFFFFF03E2147D5D7BCBE # Three-key TDES 0000000000000000:4AACAD89C236FA2B:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ 80000000000000000167E25F4EBC7336 0000000000000000:A255A79AAB2211BA:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ C0000000000000000167E25F4EBC7337 0000000000000000:061EFE779DAB818D:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ E0000000000000000167E25F4EBC7338 0000000000000000:23214F0B19BF16B4:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ F0000000000000000167E25F4EBC7339 0000000000000000:52D38F9D53B530AF:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ F8000000000000000167E25F4EBC733A 0000000000000000:B9F4BA694FE9BC3E:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FC000000000000000167E25F4EBC733B 0000000000000000:2384398BBFBD3010:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FE000000000000000167E25F4EBC733C 0000000000000000:D33ECF451E367919:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FF000000000000000167E25F4EBC733D 0000000000000000:FAA94CA00765794C:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FF800000000000000167E25F4EBC733E 0000000000000000:14C1303AAEE1B314:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFC00000000000000167E25F4EBC733F 0000000000000000:DC3A4F07DC68AC93:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFE00000000000000167E25F4EBC7340 0000000000000000:A4872C92A093B379:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFF00000000000000167E25F4EBC7341 0000000000000000:3EE74CDFFBEED032:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFF80000000000000167E25F4EBC7342 0000000000000000:328FD9C77EDC78BA:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFC0000000000000167E25F4EBC7343 0000000000000000:A5D36BD81D93CB71:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFE0000000000000167E25F4EBC7344 0000000000000000:D0765A50A9CAE3ED:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFF0000000000000167E25F4EBC7345 0000000000000000:15F3441B4AC4F802:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFF8000000000000167E25F4EBC7346 0000000000000000:01463E8F161851C2:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFC000000000000167E25F4EBC7347 0000000000000000:312E7CB57F08CBC2:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFE000000000000167E25F4EBC7348 0000000000000000:D9688FEF358FE5DF:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFF000000000000167E25F4EBC7349 0000000000000000:30B34034C46E22B5:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFF800000000000167E25F4EBC734A 0000000000000000:A7CA7218CA7D5F9D:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFC00000000000167E25F4EBC734B 0000000000000000:CE41C7659B6BFDA3:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFE00000000000167E25F4EBC734C 0000000000000000:B8EED0C6DFB8B76B:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFF00000000000167E25F4EBC734D 0000000000000000:A0C514277C70278A:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFF80000000000167E25F4EBC734E 0000000000000000:7A8F57670E11D5D8:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFC0000000000167E25F4EBC734F 0000000000000000:35AF5134EC18E0FC:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFE0000000000167E25F4EBC7350 0000000000000000:3034436B0E8B1B4D:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFF0000000000167E25F4EBC7351 0000000000000000:B1DC17DE141AD9EC:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFF8000000000167E25F4EBC7352 0000000000000000:40D2868DCF3BDA80:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFC000000000167E25F4EBC7353 0000000000000000:D3F365825B585FF6:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFE000000000167E25F4EBC7354 0000000000000000:952046F8E93A268A:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFF000000000167E25F4EBC7355 0000000000000000:97D96E48A9216264:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFF800000000167E25F4EBC7356 0000000000000000:DBEE3AD97B87915C:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFC00000000167E25F4EBC7357 0000000000000000:94093248683E084F:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFE00000000167E25F4EBC7358 0000000000000000:3133C57CE22A28AB:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFF00000000167E25F4EBC7359 0000000000000000:B32CC354449589E1:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFF80000000167E25F4EBC735A 0000000000000000:979F03CF867FDA3C:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFC0000000167E25F4EBC735B 0000000000000000:6BFECB79437E62F4:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFE0000000167E25F4EBC735C 0000000000000000:BAFB5D5B9BE92EEC:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFF0000000167E25F4EBC735D 0000000000000000:D4FB2CAF0F114F42:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFF8000000167E25F4EBC735E 0000000000000000:3F910FDBC4C74698:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFC000000167E25F4EBC735F 0000000000000000:516D7E7739908FED:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFE000000167E25F4EBC7360 0000000000000000:50DE403CB1FB1733:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFF000000167E25F4EBC7361 0000000000000000:1A91443B2892FE8C:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFF800000167E25F4EBC7362 0000000000000000:F3A490F9FE853450:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFC00000167E25F4EBC7363 0000000000000000:B7F8398C9D32149C:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFE00000167E25F4EBC7364 0000000000000000:179C6729EBDE6A46:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFF00000167E25F4EBC7365 0000000000000000:34520C49E68D307B:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFF80000167E25F4EBC7366 0000000000000000:B6C2F4E4763DF833:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFC0000167E25F4EBC7367 0000000000000000:F911A2AB5E1F0E49:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFE0000167E25F4EBC7368 0000000000000000:307C3C11DF3EE8EA:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFF0000167E25F4EBC7369 0000000000000000:C26A5A02596BFE8D:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFF8000167E25F4EBC736A 0000000000000000:B44B68C5BE17352C:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFC000167E25F4EBC736B 0000000000000000:3779CEB11398375F:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFE000167E25F4EBC736C 0000000000000000:7A9EF507F43BD31C:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFF000167E25F4EBC736D 0000000000000000:85CD4D72D2664C70:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFF800167E25F4EBC736E 0000000000000000:9EB57EACAB2B38C8:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFFC00167E25F4EBC736F 0000000000000000:E521B274CC7EC06F:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFFE00167E25F4EBC7370 0000000000000000:50148A63F3D39097:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFFF00167E25F4EBC7371 0000000000000000:6DCE0D8E770CF809:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFFF80167E25F4EBC7372 0000000000000000:CAF9334B5A606C31:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFFFC0167E25F4EBC7373 0000000000000000:1088488A43D9ACAD:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFFFE0167E25F4EBC7374 0000000000000000:F922C4B2357E9034:\ 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E\ FFFFFFFFFFFFFFFF0167E25F4EBC7375 Botan-1.10.12/checks/validate.h0000664000175000017500000000142412654331322015767 0ustar jackjack00000000000000 #ifndef BOTAN_TEST_VALIDATE_H__ #define BOTAN_TEST_VALIDATE_H__ #include #include #include using Botan::RandomNumberGenerator; using Botan::u32bit; u32bit do_validation_tests(const std::string&, RandomNumberGenerator& rng, bool = true); u32bit do_bigint_tests(const std::string&, RandomNumberGenerator& rng); u32bit do_pk_validation_tests(const std::string&, RandomNumberGenerator&); void do_ec_tests(RandomNumberGenerator& rng); u32bit do_ecdsa_tests(RandomNumberGenerator& rng); u32bit do_ecdh_tests(RandomNumberGenerator& rng); u32bit do_cvc_tests(RandomNumberGenerator& rng); void do_x509_tests(RandomNumberGenerator&); #endif Botan-1.10.12/checks/x509.cpp0000664000175000017500000001551412654331322015243 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif #if defined(BOTAN_HAS_X509_CERTIFICATES) #include #include #include #include #endif using namespace Botan; #include #include #include "validate.h" #include "common.h" #if defined(BOTAN_HAS_X509_CERTIFICATES) && \ defined(BOTAN_HAS_RSA) && \ defined(BOTAN_HAS_DSA) namespace { u64bit key_id(const Public_Key* key) { Pipe pipe(new Hash_Filter("SHA-1", 8)); pipe.start_msg(); pipe.write(key->algo_name()); pipe.write(key->algorithm_identifier().parameters); pipe.write(key->x509_subject_public_key()); pipe.end_msg(); SecureVector output = pipe.read_all(); if(output.size() != 8) throw Internal_Error("Public_Key::key_id: Incorrect output size"); u64bit id = 0; for(u32bit j = 0; j != 8; ++j) id = (id << 8) | output[j]; return id; } /* Return some option sets */ X509_Cert_Options ca_opts() { X509_Cert_Options opts("Test CA/US/Botan Project/Testing"); opts.uri = "http://botan.randombit.net"; opts.dns = "botan.randombit.net"; opts.email = "testing@randombit.net"; opts.CA_key(1); return opts; } X509_Cert_Options req_opts1() { X509_Cert_Options opts("Test User 1/US/Botan Project/Testing"); opts.uri = "http://botan.randombit.net"; opts.dns = "botan.randombit.net"; opts.email = "testing@randombit.net"; return opts; } X509_Cert_Options req_opts2() { X509_Cert_Options opts("Test User 2/US/Botan Project/Testing"); opts.uri = "http://botan.randombit.net"; opts.dns = "botan.randombit.net"; opts.email = "testing@randombit.net"; opts.add_ex_constraint("PKIX.EmailProtection"); return opts; } u32bit check_against_copy(const Private_Key& orig, RandomNumberGenerator& rng) { Private_Key* copy_priv = PKCS8::copy_key(orig, rng); Public_Key* copy_pub = X509::copy_key(orig); const std::string passphrase= "I need work! -Mr. T"; DataSource_Memory enc_source(PKCS8::PEM_encode(orig, rng, passphrase)); Private_Key* copy_priv_enc = PKCS8::load_key(enc_source, rng, passphrase); u64bit orig_id = key_id(&orig); u64bit pub_id = key_id(copy_pub); u64bit priv_id = key_id(copy_priv); u64bit priv_enc_id = key_id(copy_priv_enc); delete copy_pub; delete copy_priv; delete copy_priv_enc; if(orig_id != pub_id || orig_id != priv_id || orig_id != priv_enc_id) { std::cout << "Failed copy check for " << orig.algo_name() << "\n"; return 1; } return 0; } } void do_x509_tests(RandomNumberGenerator& rng) { std::cout << "Testing X.509 CA/CRL/cert/cert request: " << std::flush; std::string hash_fn = "SHA-256"; /* Create the CA's key and self-signed cert */ std::cout << '.' << std::flush; RSA_PrivateKey ca_key(rng, 1024); std::cout << '.' << std::flush; X509_Certificate ca_cert = X509::create_self_signed_cert(ca_opts(), ca_key, hash_fn, rng); std::cout << '.' << std::flush; /* Create user #1's key and cert request */ std::cout << '.' << std::flush; DSA_PrivateKey user1_key(rng, DL_Group("dsa/jce/1024")); std::cout << '.' << std::flush; PKCS10_Request user1_req = X509::create_cert_req(req_opts1(), user1_key, "SHA-1", rng); /* Create user #2's key and cert request */ std::cout << '.' << std::flush; #if defined(BOTAN_HAS_ECDSA) EC_Group ecc_domain(OID("1.2.840.10045.3.1.7")); ECDSA_PrivateKey user2_key(rng, ecc_domain); #else RSA_PrivateKey user2_key(rng, 1024); #endif std::cout << '.' << std::flush; PKCS10_Request user2_req = X509::create_cert_req(req_opts2(), user2_key, hash_fn, rng); /* Create the CA object */ std::cout << '.' << std::flush; X509_CA ca(ca_cert, ca_key, hash_fn); std::cout << '.' << std::flush; /* Sign the requests to create the certs */ std::cout << '.' << std::flush; X509_Certificate user1_cert = ca.sign_request(user1_req, rng, X509_Time("2008-01-01"), X509_Time("2100-01-01")); std::cout << '.' << std::flush; X509_Certificate user2_cert = ca.sign_request(user2_req, rng, X509_Time("2008-01-01"), X509_Time("2100-01-01")); std::cout << '.' << std::flush; X509_CRL crl1 = ca.new_crl(rng); /* Verify the certs */ X509_Store store; store.add_cert(ca_cert, true); // second arg == true: trusted CA cert std::cout << '.' << std::flush; if(store.validate_cert(user1_cert) != VERIFIED) std::cout << "\nFAILED: User cert #1 did not validate" << std::endl; if(store.validate_cert(user2_cert) != VERIFIED) std::cout << "\nFAILED: User cert #2 did not validate" << std::endl; if(store.add_crl(crl1) != VERIFIED) std::cout << "\nFAILED: CRL #1 did not validate" << std::endl; std::vector revoked; revoked.push_back(CRL_Entry(user1_cert, CESSATION_OF_OPERATION)); revoked.push_back(user2_cert); X509_CRL crl2 = ca.update_crl(crl1, revoked, rng); if(store.add_crl(crl2) != VERIFIED) std::cout << "\nFAILED: CRL #2 did not validate" << std::endl; if(store.validate_cert(user1_cert) != CERT_IS_REVOKED) std::cout << "\nFAILED: User cert #1 was not revoked" << std::endl; if(store.validate_cert(user2_cert) != CERT_IS_REVOKED) std::cout << "\nFAILED: User cert #2 was not revoked" << std::endl; revoked.clear(); revoked.push_back(CRL_Entry(user1_cert, REMOVE_FROM_CRL)); X509_CRL crl3 = ca.update_crl(crl2, revoked, rng); if(store.add_crl(crl3) != VERIFIED) std::cout << "\nFAILED: CRL #3 did not validate" << std::endl; if(store.validate_cert(user1_cert) != VERIFIED) std::cout << "\nFAILED: User cert #1 was not un-revoked" << std::endl; check_against_copy(ca_key, rng); check_against_copy(user1_key, rng); check_against_copy(user2_key, rng); std::cout << std::endl; } #else void do_x509_tests(RandomNumberGenerator&) { std::cout << "Skipping Botan X.509 tests (disabled in build)\n"; } #endif Botan-1.10.12/configure.py0000775000175000017500000020113612654331322015125 0ustar jackjack00000000000000#!/usr/bin/env python """ Configuration program for botan (http://botan.randombit.net/) (C) 2009-2011 Jack Lloyd Distributed under the terms of the Botan license Tested with CPython 2.6, 2.7, 3.1 and PyPy 1.5 Python 2.5 works if you change the exception catching syntax: perl -pi -e 's/except (.*) as (.*):/except $1, $2:/g' configure.py Jython - Target detection does not work (use --os and --cpu) CPython 2.4 and earlier are not supported Has not been tested with IronPython """ import sys import os import os.path import platform import re import shlex import shutil import string import subprocess import logging import getpass import time import errno import optparse # Avoid useless botan_version.pyc (Python 2.6 or higher) if 'dont_write_bytecode' in sys.__dict__: sys.dont_write_bytecode = True import botan_version def flatten(l): return sum(l, []) def get_vc_revision(): try: mtn = subprocess.Popen(['mtn', 'automate', 'heads'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = mtn.communicate() if mtn.returncode != 0: logging.debug('Error getting rev from monotone - %d (%s)' % (mtn.returncode, stderr)) return 'unknown' rev = str(stdout).strip() logging.debug('Monotone reported revision %s' % (rev)) return 'mtn:' + rev except OSError as e: logging.debug('Error getting rev from monotone - %s' % (e[1])) return 'unknown' except Exception as e: logging.debug('Error getting rev from monotone - %s' % (e)) return 'unknown' class BuildConfigurationInformation(object): """ Version information """ version_major = botan_version.release_major version_minor = botan_version.release_minor version_patch = botan_version.release_patch version_so_rev = botan_version.release_so_abi_rev version_datestamp = botan_version.release_datestamp version_vc_rev = botan_version.release_vc_rev version_string = '%d.%d.%d' % (version_major, version_minor, version_patch) """ Constructor """ def __init__(self, options, modules): if self.version_vc_rev is None: self.version_vc_rev = get_vc_revision() self.build_dir = os.path.join(options.with_build_dir, 'build') self.checkobj_dir = os.path.join(self.build_dir, 'checks') self.libobj_dir = os.path.join(self.build_dir, 'lib') self.python_dir = os.path.join(options.src_dir, 'wrap', 'python') self.boost_python = options.boost_python self.doc_output_dir = os.path.join(self.build_dir, 'docs') self.pyobject_dir = os.path.join(self.build_dir, 'python') self.include_dir = os.path.join(self.build_dir, 'include') self.botan_include_dir = os.path.join(self.include_dir, 'botan') self.internal_include_dir = os.path.join(self.botan_include_dir, 'internal') self.sources = sorted(flatten([mod.sources() for mod in modules])) self.internal_headers = sorted(flatten([m.internal_headers() for m in modules])) if options.via_amalgamation: self.build_sources = ['botan_all.cpp'] self.build_internal_headers = [] else: self.build_sources = self.sources self.build_internal_headers = self.internal_headers self.public_headers = sorted(flatten([m.public_headers() for m in modules])) checks_dir = os.path.join(options.base_dir, 'checks') self.check_sources = sorted( [os.path.join(checks_dir, file) for file in os.listdir(checks_dir) if file.endswith('.cpp')]) self.python_sources = sorted( [os.path.join(self.python_dir, file) for file in os.listdir(self.python_dir) if file.endswith('.cpp')]) self.manual_dir = os.path.join(self. doc_output_dir, 'manual') def build_doc_commands(): yield '$(COPY) readme.txt %s' % (self.doc_output_dir) if options.with_sphinx: yield 'sphinx-build $(SPHINX_OPTS) -b html doc %s' % ( self.manual_dir) else: yield '$(COPY) doc/*.txt %s' % (self.manual_dir) if options.with_doxygen: yield 'doxygen %s/botan.doxy' % (self.build_dir) self.build_doc_commands = '\n'.join(['\t' + s for s in build_doc_commands()]) def build_dirs(): yield self.checkobj_dir yield self.libobj_dir yield self.botan_include_dir yield self.internal_include_dir yield os.path.join(self.doc_output_dir, 'manual') if options.with_doxygen: yield os.path.join(self.doc_output_dir, 'doxygen') if self.boost_python: yield self.pyobject_dir self.build_dirs = list(build_dirs()) def pkg_config_file(self): return 'botan-%d.%d.pc' % (self.version_major, self.version_minor) def config_shell_script(self): return 'botan-config-%d.%d' % (self.version_major, self.version_minor) def username(self): return getpass.getuser() def hostname(self): return platform.node() def timestamp(self): return time.ctime() """ Handle command line options """ def process_command_line(args): parser = optparse.OptionParser( formatter = optparse.IndentedHelpFormatter(max_help_position = 50), version = BuildConfigurationInformation.version_string) parser.add_option('--verbose', action='store_true', default=False, help='Show debug messages') parser.add_option('--quiet', action='store_true', default=False, help='Show only warnings and errors') target_group = optparse.OptionGroup(parser, 'Target options') target_group.add_option('--cpu', help='set the target processor type/model') target_group.add_option('--os', help='set the target operating system') target_group.add_option('--cc', dest='compiler', help='set the desired build compiler') target_group.add_option('--cc-bin', dest='compiler_binary', metavar='BINARY', help='set the name of the compiler binary') target_group.add_option('--with-endian', metavar='ORDER', default=None, help='override guess of CPU byte order') target_group.add_option('--with-unaligned-mem', dest='unaligned_mem', action='store_true', default=None, help='enable unaligned memory accesses') target_group.add_option('--without-unaligned-mem', dest='unaligned_mem', action='store_false', help=optparse.SUPPRESS_HELP) for isa_extn_name in ['SSE2', 'SSSE3', 'AltiVec', 'AES-NI', 'movbe']: isa_extn = isa_extn_name.lower() target_group.add_option('--enable-%s' % (isa_extn), help='enable use of %s' % (isa_extn_name), action='append_const', const=isa_extn, dest='enable_isa_extns') target_group.add_option('--disable-%s' % (isa_extn), help=optparse.SUPPRESS_HELP, action='append_const', const=isa_extn, dest='disable_isa_extns') build_group = optparse.OptionGroup(parser, 'Build options') build_group.add_option('--enable-shared', dest='build_shared_lib', action='store_true', default=True, help=optparse.SUPPRESS_HELP) build_group.add_option('--disable-shared', dest='build_shared_lib', action='store_false', help='disable building a shared library') build_group.add_option('--enable-asm', dest='asm_ok', action='store_true', default=True, help=optparse.SUPPRESS_HELP) build_group.add_option('--disable-asm', dest='asm_ok', action='store_false', help='disallow use of assembler') build_group.add_option('--enable-debug', dest='debug_build', action='store_true', default=False, help='enable debug build') build_group.add_option('--disable-debug', dest='debug_build', action='store_false', help=optparse.SUPPRESS_HELP) build_group.add_option('--no-optimizations', dest='no_optimizations', action='store_true', default=False, help=optparse.SUPPRESS_HELP) build_group.add_option('--gen-amalgamation', dest='gen_amalgamation', default=False, action='store_true', help='generate amalgamation files') build_group.add_option('--via-amalgamation', dest='via_amalgamation', default=False, action='store_true', help='build via amalgamation') build_group.add_option('--with-tr1-implementation', metavar='WHICH', dest='with_tr1', default=None, help='enable TR1 (choices: none, system, boost)') build_group.add_option('--with-build-dir', metavar='DIR', default='', help='setup the build in DIR') build_group.add_option('--makefile-style', metavar='STYLE', default=None, help='choose a makefile style (unix or nmake)') build_group.add_option('--with-local-config', dest='local_config', metavar='FILE', help='include the contents of FILE into build.h') build_group.add_option('--distribution-info', metavar='STRING', help='set distribution specific versioning', default='unspecified') build_group.add_option('--with-sphinx', action='store_true', default=None, help='Use Sphinx to generate HTML manual') build_group.add_option('--without-sphinx', action='store_false', dest='with_sphinx', help=optparse.SUPPRESS_HELP) build_group.add_option('--with-visibility', action='store_true', default=None, help=optparse.SUPPRESS_HELP) build_group.add_option('--without-visibility', action='store_false', dest='with_visibility', help=optparse.SUPPRESS_HELP) build_group.add_option('--with-doxygen', action='store_true', default=False, help='Use Doxygen to generate HTML API docs') build_group.add_option('--without-doxygen', action='store_false', dest='with_doxygen', help=optparse.SUPPRESS_HELP) build_group.add_option('--dumb-gcc', dest='dumb_gcc', action='store_true', default=False, help=optparse.SUPPRESS_HELP) build_group.add_option('--maintainer-mode', dest='maintainer_mode', action='store_true', default=False, help=optparse.SUPPRESS_HELP) build_group.add_option('--dirty-tree', dest='clean_build_tree', action='store_false', default=True, help=optparse.SUPPRESS_HELP) build_group.add_option('--link-method', default=None, help=optparse.SUPPRESS_HELP) wrapper_group = optparse.OptionGroup(parser, 'Wrapper options') wrapper_group.add_option('--with-boost-python', dest='boost_python', default=False, action='store_true', help='enable Boost.Python wrapper') wrapper_group.add_option('--without-boost-python', dest='boost_python', action='store_false', help=optparse.SUPPRESS_HELP) wrapper_group.add_option('--with-python-version', dest='python_version', metavar='N.M', default='.'.join(map(str, sys.version_info[0:2])), help='specify Python to build against (eg %default)') mods_group = optparse.OptionGroup(parser, 'Module selection') mods_group.add_option('--enable-modules', dest='enabled_modules', metavar='MODS', action='append', help='enable specific modules') mods_group.add_option('--disable-modules', dest='disabled_modules', metavar='MODS', action='append', help='disable specific modules') mods_group.add_option('--no-autoload', action='store_true', default=False, help='disable automatic loading') for lib in ['OpenSSL', 'GNU MP', 'Bzip2', 'Zlib']: mod = lib.lower().replace(' ', '') mods_group.add_option('--with-%s' % (mod), help='add support for using %s' % (lib), action='append_const', const=mod, dest='enabled_modules') mods_group.add_option('--without-%s' % (mod), help=optparse.SUPPRESS_HELP, action='append_const', const=mod, dest='disabled_modules') install_group = optparse.OptionGroup(parser, 'Installation options') install_group.add_option('--prefix', metavar='DIR', help='set the base install directory') install_group.add_option('--docdir', metavar='DIR', help='set the documentation install directory') install_group.add_option('--libdir', metavar='DIR', help='set the library install directory') install_group.add_option('--includedir', metavar='DIR', help='set the include file install directory') parser.add_option_group(target_group) parser.add_option_group(build_group) parser.add_option_group(mods_group) parser.add_option_group(wrapper_group) parser.add_option_group(install_group) # These exist only for autoconf compatability (requested by zw for mtn) compat_with_autoconf_options = [ 'bindir', 'datadir', 'datarootdir', 'dvidir', 'exec-prefix', 'htmldir', 'infodir', 'libexecdir', 'localedir', 'localstatedir', 'mandir', 'oldincludedir', 'pdfdir', 'psdir', 'sbindir', 'sharedstatedir', 'sysconfdir' ] for opt in compat_with_autoconf_options: parser.add_option('--' + opt, help=optparse.SUPPRESS_HELP) (options, args) = parser.parse_args(args) if args != []: raise Exception('Unhandled option(s): ' + ' '.join(args)) if options.with_endian != None and \ options.with_endian not in ['little', 'big']: raise Exception('Bad value to --with-endian "%s"' % ( options.with_endian)) def parse_multiple_enable(modules): if modules is None: return [] return sorted(set(flatten([s.split(',') for s in modules]))) options.enabled_modules = parse_multiple_enable(options.enabled_modules) options.disabled_modules = parse_multiple_enable(options.disabled_modules) options.enable_isa_extns = parse_multiple_enable(options.enable_isa_extns) options.disable_isa_extns = parse_multiple_enable(options.disable_isa_extns) def enabled_or_disabled_isa(isa): if isa in options.enable_isa_extns: return True if isa in options.disable_isa_extns: return True return False isa_deps = { 'ssse3': 'sse2', 'aes-ni': 'sse2' } if 'sse2' in options.disable_isa_extns: for isa in [k for (k,v) in isa_deps.items() if v == 'sse2']: # If explicitly enabled, allow it even if a dependency # violation; trust the user to know what they want if not enabled_or_disabled_isa(isa): options.disable_isa_extns.append(isa) for isa in options.enable_isa_extns: if isa in isa_deps: for dep in isa_deps.get(isa, '').split(','): if not enabled_or_disabled_isa(dep): options.enable_isa_extns.append(dep) return options """ Generic lexer function for info.txt and src/build-data files """ def lex_me_harder(infofile, to_obj, allowed_groups, name_val_pairs): # Format as a nameable Python variable def py_var(group): return group.replace(':', '_') class LexerError(Exception): def __init__(self, msg, line): self.msg = msg self.line = line def __str__(self): return '%s at %s:%d' % (self.msg, infofile, self.line) (dirname, basename) = os.path.split(infofile) to_obj.lives_in = dirname if basename == 'info.txt': (obj_dir,to_obj.basename) = os.path.split(dirname) if os.access(os.path.join(obj_dir, 'info.txt'), os.R_OK): to_obj.parent_module = os.path.basename(obj_dir) else: to_obj.parent_module = None else: to_obj.basename = basename.replace('.txt', '') lexer = shlex.shlex(open(infofile), infofile, posix=True) lexer.wordchars += '|:.<>/,-!+' # handle various funky chars in info.txt for group in allowed_groups: to_obj.__dict__[py_var(group)] = [] for (key,val) in name_val_pairs.items(): to_obj.__dict__[key] = val def lexed_tokens(): # Convert to an interator token = lexer.get_token() while token != None: yield token token = lexer.get_token() for token in lexed_tokens(): match = re.match('<(.*)>', token) # Check for a grouping if match is not None: group = match.group(1) if group not in allowed_groups: raise LexerError('Unknown group "%s"' % (group), lexer.lineno) end_marker = '' token = lexer.get_token() while token != end_marker: to_obj.__dict__[py_var(group)].append(token) token = lexer.get_token() if token is None: raise LexerError('Group "%s" not terminated' % (group), lexer.lineno) elif token in name_val_pairs.keys(): next_val = lexer.get_token() if type(to_obj.__dict__[token]) is list: to_obj.__dict__[token].append(next_val) else: to_obj.__dict__[token] = next_val else: # No match -> error raise LexerError('Bad token "%s"' % (token), lexer.lineno) """ Convert a lex'ed map (from build-data files) from a list to a dict """ def force_to_dict(l): return dict(zip(l[::3],l[2::3])) """ Represents the information about a particular module """ class ModuleInfo(object): def __init__(self, infofile): lex_me_harder(infofile, self, ['source', 'header:internal', 'header:public', 'requires', 'os', 'arch', 'cc', 'libs', 'comment', 'warning'], { 'load_on': 'auto', 'define': [], 'uses_tr1': 'false', 'need_isa': None, 'mp_bits': 0 }) def extract_files_matching(basedir, suffixes): for (dirpath, dirnames, filenames) in os.walk(basedir): if dirpath == basedir: for filename in filenames: if filename.startswith('.'): continue for suffix in suffixes: if filename.endswith(suffix): yield filename if self.source == []: self.source = list(extract_files_matching(self.lives_in, ['.cpp', '.S'])) if self.header_internal == [] and self.header_public == []: self.header_public = list(extract_files_matching(self.lives_in, ['.h'])) # Coerce to more useful types def convert_lib_list(l): result = {} for (targetlist, vallist) in zip(l[::3], l[2::3]): vals = vallist.split(',') for target in targetlist.split(','): result[target] = result.setdefault(target, []) + vals return result self.libs = convert_lib_list(self.libs) def add_dir_name(filename): if filename.count(':') == 0: return os.path.join(self.lives_in, filename) # modules can request to add files of the form # MODULE_NAME:FILE_NAME to add a file from another module # For these, assume other module is always in a # neighboring directory; this is true for all current uses return os.path.join(os.path.split(self.lives_in)[0], *filename.split(':')) self.source = [add_dir_name(s) for s in self.source] self.header_internal = [add_dir_name(s) for s in self.header_internal] self.header_public = [add_dir_name(s) for s in self.header_public] self.mp_bits = int(self.mp_bits) self.uses_tr1 = (True if self.uses_tr1 == 'yes' else False) if self.comment != []: self.comment = ' '.join(self.comment) else: self.comment = None if self.warning != []: self.warning = ' '.join(self.warning) else: self.warning = None def sources(self): return self.source def public_headers(self): return self.header_public def internal_headers(self): return self.header_internal def defines(self): return ['HAS_' + d for d in self.define] def compatible_cpu(self, archinfo, options): arch_name = archinfo.basename cpu_name = options.cpu if self.arch != []: if arch_name not in self.arch and cpu_name not in self.arch: return False if self.need_isa != None: if self.need_isa in options.disable_isa_extns: return False # explicitly disabled if self.need_isa in options.enable_isa_extns: return True # explicitly enabled # Default to whatever the CPU is supposed to support return self.need_isa in archinfo.isa_extensions_in(cpu_name) return True def compatible_os(self, os): return self.os == [] or os in self.os def compatible_compiler(self, cc): return self.cc == [] or cc in self.cc def tr1_ok(self, with_tr1): if self.uses_tr1: return with_tr1 in ['boost', 'system'] else: return True def dependencies(self): # utils is an implicit dep (contains types, etc) deps = self.requires + ['utils'] if self.parent_module != None: deps.append(self.parent_module) return deps """ Ensure that all dependencies of this module actually exist, warning about any that do not """ def dependencies_exist(self, modules): all_deps = [s.split('|') for s in self.dependencies()] for missing in [s for s in flatten(all_deps) if s not in modules]: logging.warn("Module '%s', dep of '%s', does not exist" % ( missing, self.basename)) def __cmp__(self, other): if self.basename < other.basename: return -1 if self.basename == other.basename: return 0 return 1 class ArchInfo(object): def __init__(self, infofile): lex_me_harder(infofile, self, ['aliases', 'submodels', 'submodel_aliases', 'isa_extn'], { 'endian': None, 'family': None, 'unaligned': 'no' }) def convert_isa_list(input): isa_info = {} for line in self.isa_extn: (isa,cpus) = line.split(':') for cpu in cpus.split(','): isa_info.setdefault(cpu, []).append(isa) return isa_info self.isa_extn = convert_isa_list(self.isa_extn) self.submodel_aliases = force_to_dict(self.submodel_aliases) self.unaligned_ok = (1 if self.unaligned == 'ok' else 0) """ Return ISA extensions specific to this CPU """ def isa_extensions_in(self, cpu_type): return sorted(self.isa_extn.get(cpu_type, []) + self.isa_extn.get('all', [])) """ Return a list of all submodels for this arch, ordered longest to shortest """ def all_submodels(self): return sorted([(k,k) for k in self.submodels] + [k for k in self.submodel_aliases.items()], key = lambda k: len(k[0]), reverse = True) """ Return CPU-specific defines for build.h """ def defines(self, options): def form_macro(cpu_name): return cpu_name.upper().replace('.', '').replace('-', '_') macros = ['TARGET_ARCH_IS_%s' % (form_macro(self.basename.upper()))] if self.basename != options.cpu: macros.append('TARGET_CPU_IS_%s' % (form_macro(options.cpu))) enabled_isas = set(self.isa_extensions_in(options.cpu) + options.enable_isa_extns) disabled_isas = set(options.disable_isa_extns) isa_extensions = sorted(enabled_isas - disabled_isas) for isa in isa_extensions: macros.append('TARGET_CPU_HAS_%s' % (form_macro(isa))) endian = options.with_endian or self.endian if endian != None: macros.append('TARGET_CPU_IS_%s_ENDIAN' % (endian.upper())) logging.info('Assuming CPU is %s endian' % (endian)) unaligned_ok = options.unaligned_mem if unaligned_ok is None: unaligned_ok = self.unaligned_ok if unaligned_ok: logging.info('Assuming unaligned memory access works') if self.family is not None: macros.append('TARGET_CPU_IS_%s_FAMILY' % (self.family.upper())) macros.append('TARGET_UNALIGNED_MEMORY_ACCESS_OK %d' % (unaligned_ok)) return macros class CompilerInfo(object): def __init__(self, infofile): lex_me_harder(infofile, self, ['so_link_flags', 'mach_opt', 'mach_abi_linking'], { 'binary_name': None, 'macro_name': None, 'compile_option': '-c ', 'output_to_option': '-o ', 'add_include_dir_option': '-I', 'add_lib_dir_option': '-L', 'add_lib_option': '-l', 'lib_opt_flags': '', 'check_opt_flags': '', 'debug_flags': '', 'no_debug_flags': '', 'shared_flags': '', 'lang_flags': '', 'warning_flags': '', 'maintainer_warning_flags': '', 'visibility_build_flags': '', 'visibility_attribute': '', 'ar_command': None, 'makefile_style': '', 'has_tr1': False, }) self.so_link_flags = force_to_dict(self.so_link_flags) self.mach_abi_linking = force_to_dict(self.mach_abi_linking) self.mach_opt_flags = {} while self.mach_opt != []: proc = self.mach_opt.pop(0) if self.mach_opt.pop(0) != '->': raise Exception('Parsing err in %s mach_opt' % (self.basename)) flags = self.mach_opt.pop(0) regex = '' if len(self.mach_opt) > 0 and \ (len(self.mach_opt) == 1 or self.mach_opt[1] != '->'): regex = self.mach_opt.pop(0) self.mach_opt_flags[proc] = (flags,regex) del self.mach_opt """ Return the shared library build flags, if any """ def gen_shared_flags(self, options): def flag_builder(): if options.build_shared_lib: yield self.shared_flags if options.with_visibility: yield self.visibility_build_flags return ' '.join(list(flag_builder())) def gen_visibility_attribute(self, options): if options.build_shared_lib and options.with_visibility: return self.visibility_attribute return '' """ Return the machine specific ABI flags """ def mach_abi_link_flags(self, osname, arch, submodel, debug_p): def all(): if debug_p: return 'all-debug' return 'all' abi_link = set() for what in [all(), osname, arch, submodel]: if self.mach_abi_linking.get(what) != None: abi_link.add(self.mach_abi_linking.get(what)) if len(abi_link) == 0: return '' return ' ' + ' '.join(abi_link) """ Return the flags for MACH_OPT """ def mach_opts(self, arch, submodel): def submodel_fixup(tup): return tup[0].replace('SUBMODEL', submodel.replace(tup[1], '')) if submodel == arch: return '' if submodel in self.mach_opt_flags: return submodel_fixup(self.mach_opt_flags[submodel]) if arch in self.mach_opt_flags: return submodel_fixup(self.mach_opt_flags[arch]) return '' """ Return the flags for LIB_OPT """ def library_opt_flags(self, options): def gen_flags(): if options.debug_build: yield self.debug_flags if not options.no_optimizations: yield self.lib_opt_flags if not options.debug_build: yield self.no_debug_flags return (' '.join(gen_flags())).strip() """ Return the command needed to link a shared object """ def so_link_command_for(self, osname): if osname in self.so_link_flags: return self.so_link_flags[osname] if 'default' in self.so_link_flags: return self.so_link_flags['default'] return '' """ Return defines for build.h """ def defines(self, with_tr1): def tr1_macro(): if with_tr1: if with_tr1 == 'boost': return ['USE_BOOST_TR1'] elif with_tr1 == 'system': return ['USE_STD_TR1'] elif self.has_tr1: return ['USE_STD_TR1'] return [] return ['BUILD_COMPILER_IS_' + self.macro_name] + tr1_macro() class OsInfo(object): def __init__(self, infofile): lex_me_harder(infofile, self, ['aliases', 'target_features'], { 'os_type': None, 'obj_suffix': 'o', 'so_suffix': 'so', 'static_suffix': 'a', 'ar_command': 'ar crs', 'ar_needs_ranlib': False, 'install_root': '/usr/local', 'header_dir': 'include', 'lib_dir': 'lib', 'doc_dir': 'share/doc', 'build_shared': 'yes', 'install_cmd_data': 'install -m 644', 'install_cmd_exec': 'install -m 755' }) self.ar_needs_ranlib = bool(self.ar_needs_ranlib) self.build_shared = (True if self.build_shared == 'yes' else False) def ranlib_command(self): return ('ranlib' if self.ar_needs_ranlib else 'true') def defines(self): return ['TARGET_OS_IS_%s' % (self.basename.upper())] + \ ['TARGET_OS_HAS_' + feat.upper() for feat in sorted(self.target_features)] def fixup_proc_name(proc): proc = proc.lower().replace(' ', '') for junk in ['(tm)', '(r)']: proc = proc.replace(junk, '') return proc def canon_processor(archinfo, proc): proc = fixup_proc_name(proc) # First, try to search for an exact match for ainfo in archinfo.values(): if ainfo.basename == proc or proc in ainfo.aliases: return (ainfo.basename, ainfo.basename) for (match,submodel) in ainfo.all_submodels(): if proc == submodel or proc == match: return (ainfo.basename, submodel) logging.debug('Could not find an exact match for CPU "%s"' % (proc)) # Now, try searching via regex match for ainfo in archinfo.values(): for (match,submodel) in ainfo.all_submodels(): if re.search(match, proc) != None: logging.debug('Possible match "%s" with "%s" (%s)' % ( proc, match, submodel)) return (ainfo.basename, submodel) logging.debug('Known CPU names: ' + ' '.join( sorted(flatten([[ainfo.basename] + \ ainfo.aliases + \ [x for (x,_) in ainfo.all_submodels()] for ainfo in archinfo.values()])))) raise Exception('Unknown or unidentifiable processor "%s"' % (proc)) def guess_processor(archinfo): base_proc = platform.machine() if base_proc == '': raise Exception('Could not determine target CPU; set with --cpu') full_proc = fixup_proc_name(platform.processor()) or base_proc for ainfo in archinfo.values(): if ainfo.basename == base_proc or base_proc in ainfo.aliases: for (match,submodel) in ainfo.all_submodels(): if re.search(match, full_proc) != None: return (ainfo.basename, submodel) return canon_processor(archinfo, ainfo.basename) # No matches, so just use the base proc type return canon_processor(archinfo, base_proc) """ Read a whole file into memory as a string """ def slurp_file(filename): if filename is None: return '' return ''.join(open(filename).readlines()) """ Perform template substitution """ def process_template(template_file, variables): class PercentSignTemplate(string.Template): delimiter = '%' try: template = PercentSignTemplate(slurp_file(template_file)) return template.substitute(variables) except KeyError as e: raise Exception('Unbound var %s in template %s' % (e, template_file)) """ Create the template variables needed to process the makefile, build.h, etc """ def create_template_vars(build_config, options, modules, cc, arch, osinfo): def make_cpp_macros(macros): return '\n'.join(['#define BOTAN_' + macro for macro in macros]) """ Figure out what external libraries are needed based on selected modules """ def link_to(): libs = set() for module in modules: for (osname,link_to) in module.libs.items(): if osname == 'all' or osname == osinfo.basename: libs |= set(link_to) else: match = re.match('^all!(.*)', osname) if match is not None: exceptions = match.group(1).split(',') if osinfo.basename not in exceptions: libs |= set(link_to) return sorted(libs) def objectfile_list(sources, obj_dir): for src in sources: (dir,file) = os.path.split(os.path.normpath(src)) if dir.startswith('src'): parts = dir.split(os.sep)[1:] if file == parts[-1] + '.cpp': name = '_'.join(dir.split(os.sep)[1:]) + '.cpp' else: name = '_'.join(dir.split(os.sep)[1:]) + '_' + file else: name = file for src_suffix in ['.cpp', '.S']: name = name.replace(src_suffix, '.' + osinfo.obj_suffix) yield os.path.join(obj_dir, name) def choose_mp_bits(): mp_bits = [mod.mp_bits for mod in modules if mod.mp_bits != 0] if mp_bits == []: return 32 # default # Check that settings are consistent across modules for mp_bit in mp_bits[1:]: if mp_bit != mp_bits[0]: raise Exception('Incompatible mp_bits settings found') return mp_bits[0] """ Form snippets of makefile for building each source file """ def build_commands(sources, obj_dir, flags): for (obj_file,src) in zip(objectfile_list(sources, obj_dir), sources): yield '%s: %s\n\t$(CXX) %s%s $(%s_FLAGS) %s$? %s$@\n' % ( obj_file, src, cc.add_include_dir_option, build_config.include_dir, flags, cc.compile_option, cc.output_to_option) def makefile_list(items): items = list(items) # force evaluation so we can slice it return (' '*16).join([item + ' \\\n' for item in items[:-1]] + [items[-1]]) def prefix_with_build_dir(path): if options.with_build_dir != None: return os.path.join(options.with_build_dir, path) return path def warning_flags(normal_flags, maintainer_flags, maintainer_mode): if maintainer_mode and maintainer_flags != '': return maintainer_flags return normal_flags return { 'version_major': build_config.version_major, 'version_minor': build_config.version_minor, 'version_patch': build_config.version_patch, 'version_vc_rev': build_config.version_vc_rev, 'so_abi_rev': build_config.version_so_rev, 'version': build_config.version_string, 'distribution_info': options.distribution_info, 'version_datestamp': build_config.version_datestamp, 'timestamp': build_config.timestamp(), 'user': build_config.username(), 'hostname': build_config.hostname(), 'command_line': ' '.join(sys.argv), 'local_config': slurp_file(options.local_config), 'makefile_style': options.makefile_style or cc.makefile_style, 'makefile_path': prefix_with_build_dir('Makefile'), 'prefix': options.prefix or osinfo.install_root, 'libdir': options.libdir or osinfo.lib_dir, 'includedir': options.includedir or osinfo.header_dir, 'docdir': options.docdir or osinfo.doc_dir, 'build_dir': build_config.build_dir, 'doc_output_dir': build_config.doc_output_dir, 'build_doc_commands': build_config.build_doc_commands, 'python_dir': build_config.python_dir, 'os': options.os, 'arch': options.arch, 'submodel': options.cpu, 'mp_bits': choose_mp_bits(), 'cc': (options.compiler_binary or cc.binary_name) + cc.mach_abi_link_flags(options.os, options.arch, options.cpu, options.debug_build), 'lib_opt': cc.library_opt_flags(options), 'mach_opt': cc.mach_opts(options.arch, options.cpu), 'check_opt': '' if options.no_optimizations else cc.check_opt_flags, 'lang_flags': cc.lang_flags + options.extra_flags, 'warn_flags': warning_flags(cc.warning_flags, cc.maintainer_warning_flags, options.maintainer_mode), 'shared_flags': cc.gen_shared_flags(options), 'visibility_attribute': cc.gen_visibility_attribute(options), 'so_link': cc.so_link_command_for(osinfo.basename), 'link_to': ' '.join([cc.add_lib_option + lib for lib in link_to()]), 'module_defines': make_cpp_macros(sorted(flatten([m.defines() for m in modules]))), 'target_os_defines': make_cpp_macros(osinfo.defines()), 'target_compiler_defines': make_cpp_macros( cc.defines(options.with_tr1)), 'target_cpu_defines': make_cpp_macros(arch.defines(options)), 'include_files': makefile_list(build_config.public_headers), 'lib_objs': makefile_list( objectfile_list(build_config.build_sources, build_config.libobj_dir)), 'check_objs': makefile_list( objectfile_list(build_config.check_sources, build_config.checkobj_dir)), 'lib_build_cmds': '\n'.join( build_commands(build_config.build_sources, build_config.libobj_dir, 'LIB')), 'check_build_cmds': '\n'.join( build_commands(build_config.check_sources, build_config.checkobj_dir, 'CHECK')), 'python_obj_dir': build_config.pyobject_dir, 'python_objs': makefile_list( objectfile_list(build_config.python_sources, build_config.pyobject_dir)), 'python_build_cmds': '\n'.join( build_commands(build_config.python_sources, build_config.pyobject_dir, 'PYTHON')), 'ar_command': cc.ar_command or osinfo.ar_command, 'ranlib_command': osinfo.ranlib_command(), 'install_cmd_exec': osinfo.install_cmd_exec, 'install_cmd_data': osinfo.install_cmd_data, 'check_prefix': prefix_with_build_dir(''), 'lib_prefix': prefix_with_build_dir(''), 'static_suffix': osinfo.static_suffix, 'so_suffix': osinfo.so_suffix, 'botan_config': prefix_with_build_dir( os.path.join(build_config.build_dir, build_config.config_shell_script())), 'botan_pkgconfig': prefix_with_build_dir( os.path.join(build_config.build_dir, build_config.pkg_config_file())), 'mod_list': '\n'.join(sorted([m.basename for m in modules])), 'python_version': options.python_version } """ Determine which modules to load based on options, target, etc """ def choose_modules_to_use(modules, archinfo, options): for mod in modules.values(): mod.dependencies_exist(modules) to_load = [] maybe_dep = [] not_using_because = {} def cannot_use_because(mod, reason): not_using_because.setdefault(reason, []).append(mod) for modname in options.enabled_modules: if modname not in modules: logging.warning("Unknown enabled module %s" % (modname)) for modname in options.disabled_modules: if modname not in modules: logging.warning("Unknown disabled module %s" % (modname)) for (modname, module) in modules.items(): if modname in options.disabled_modules: cannot_use_because(modname, 'disabled by user') elif modname in options.enabled_modules: to_load.append(modname) # trust the user elif not module.compatible_os(options.os): cannot_use_because(modname, 'incompatible OS') elif not module.compatible_compiler(options.compiler): cannot_use_because(modname, 'incompatible compiler') elif not module.compatible_cpu(archinfo, options): cannot_use_because(modname, 'incompatible CPU') elif not module.tr1_ok(options.with_tr1): cannot_use_because(modname, 'missing TR1') else: if module.load_on == 'never': cannot_use_because(modname, 'disabled as buggy') elif module.load_on == 'request': cannot_use_because(modname, 'by request only') elif module.load_on == 'dep': maybe_dep.append(modname) elif module.load_on == 'always': to_load.append(modname) elif module.load_on == 'asm_ok': if options.asm_ok: if options.no_autoload: maybe_dep.append(modname) else: to_load.append(modname) else: cannot_use_because(modname, 'uses assembly and --disable-asm set') elif module.load_on == 'auto': if options.no_autoload: maybe_dep.append(modname) else: to_load.append(modname) else: logging.warning('Unknown load_on %s in %s' % ( module.load_on, modname)) dependency_failure = True while dependency_failure: dependency_failure = False for modname in to_load: for deplist in [s.split('|') for s in modules[modname].dependencies()]: dep_met = False for mod in deplist: if dep_met is True: break if mod in to_load: dep_met = True elif mod in maybe_dep: maybe_dep.remove(mod) to_load.append(mod) dep_met = True if dep_met == False: dependency_failure = True if modname in to_load: to_load.remove(modname) if modname in maybe_dep: maybe_dep.remove(modname) cannot_use_because(modname, 'dependency failure') for not_a_dep in maybe_dep: cannot_use_because(not_a_dep, 'loaded only if needed by dependency') for reason in sorted(not_using_because.keys()): disabled_mods = sorted(set([mod for mod in not_using_because[reason]])) if disabled_mods != []: logging.info('Skipping, %s - %s' % ( reason, ' '.join(disabled_mods))) for mod in sorted(to_load): if mod.startswith('mp_'): logging.info('Using MP module ' + mod) if mod.startswith('simd_') and mod != 'simd_engine': logging.info('Using SIMD module ' + mod) if modules[mod].comment: logging.info('%s: %s' % (mod, modules[mod].comment)) if modules[mod].warning: logging.warning('%s: %s' % (mod, modules[mod].warning)) logging.debug('Loading modules %s', ' '.join(sorted(to_load))) return [modules[mod] for mod in to_load] """ Load the info files about modules, targets, etc """ def load_info_files(options): def find_files_named(desired_name, in_path): for (dirpath, dirnames, filenames) in os.walk(in_path): if desired_name in filenames: yield os.path.join(dirpath, desired_name) modules = dict([(mod.basename, mod) for mod in [ModuleInfo(info) for info in find_files_named('info.txt', options.src_dir)]]) def list_files_in_build_data(subdir): for (dirpath, dirnames, filenames) in \ os.walk(os.path.join(options.build_data, subdir)): for filename in filenames: if filename.endswith('.txt'): yield os.path.join(dirpath, filename) def form_name(filepath): return os.path.basename(filepath).replace('.txt', '') archinfo = dict([(form_name(info), ArchInfo(info)) for info in list_files_in_build_data('arch')]) osinfo = dict([(form_name(info), OsInfo(info)) for info in list_files_in_build_data('os')]) ccinfo = dict([(form_name(info), CompilerInfo(info)) for info in list_files_in_build_data('cc')]) def info_file_load_report(type, num): if num > 0: logging.debug('Loaded %d %s info files' % (num, type)) else: logging.warning('Failed to load any %s info files' % (type)) info_file_load_report('CPU', len(archinfo)); info_file_load_report('OS', len(osinfo)) info_file_load_report('compiler', len(ccinfo)) return (modules, archinfo, ccinfo, osinfo) """ Perform the filesystem operations needed to setup the build """ def setup_build(build_config, options, template_vars): """ Choose the link method based on system availablity and user request """ def choose_link_method(req_method): def useable_methods(): if 'symlink' in os.__dict__: yield 'symlink' if 'link' in os.__dict__: yield 'hardlink' yield 'copy' for method in useable_methods(): if req_method is None or req_method == method: return method logging.info('Could not use requested link method %s' % (req_method)) return 'copy' """ Copy or link the file, depending on what the platform offers """ def portable_symlink(filename, target_dir, method): if not os.access(filename, os.R_OK): logging.warning('Missing file %s' % (filename)) return if method == 'symlink': def count_dirs(dir, accum = 0): if dir in ['', '/', os.path.curdir]: return accum (dir,basename) = os.path.split(dir) return accum + 1 + count_dirs(dir) dirs_up = count_dirs(target_dir) source = os.path.join(os.path.join(*[os.path.pardir]*dirs_up), filename) target = os.path.join(target_dir, os.path.basename(filename)) os.symlink(source, target) elif method == 'hardlink': os.link(filename, os.path.join(target_dir, os.path.basename(filename))) elif method == 'copy': shutil.copy(filename, target_dir) else: raise Exception('Unknown link method %s' % (method)) def choose_makefile_template(style): if style == 'nmake': return 'nmake.in' elif style == 'unix': return ('unix_shr.in' if options.build_shared_lib else 'unix.in') else: raise Exception('Unknown makefile style "%s"' % (style)) # First delete the build tree, if existing try: if options.clean_build_tree: shutil.rmtree(build_config.build_dir) except OSError as e: if e.errno != errno.ENOENT: logging.error('Problem while removing build dir: %s' % (e)) for dir in build_config.build_dirs: try: os.makedirs(dir) except OSError as e: if e.errno != errno.EEXIST: logging.error('Error while creating "%s": %s' % (dir, e)) makefile_template = os.path.join( options.makefile_dir, choose_makefile_template(template_vars['makefile_style'])) logging.debug('Using makefile template %s' % (makefile_template)) templates_to_proc = { makefile_template: template_vars['makefile_path'] } def templates_to_use(): yield (options.build_data, 'buildh.in', 'build.h') yield (options.build_data, 'botan.doxy.in', 'botan.doxy') if options.os != 'windows': yield (options.build_data, 'botan.pc.in', build_config.pkg_config_file()) yield (options.build_data, 'botan-config.in', build_config.config_shell_script()) if options.os == 'windows': yield (options.build_data, 'innosetup.in', 'botan.iss') if options.boost_python: yield (options.makefile_dir, 'python.in', 'Makefile.python') for (template_dir, template, sink) in templates_to_use(): source = os.path.join(template_dir, template) if template_dir == options.build_data: sink = os.path.join(build_config.build_dir, sink) templates_to_proc[source] = sink for (template, sink) in templates_to_proc.items(): try: f = open(sink, 'w') f.write(process_template(template, template_vars)) finally: f.close() link_method = choose_link_method(options.link_method) logging.info('Using %s to link files into build directory' % (link_method)) def link_headers(header_list, type, dir): logging.debug('Linking %d %s header files in %s' % ( len(header_list), type, dir)) for header_file in header_list: try: portable_symlink(header_file, dir, link_method) except OSError as e: if e.errno != errno.EEXIST: logging.error('Error linking %s into %s: %s' % ( header_file, dir, e)) link_headers(build_config.public_headers, 'public', build_config.botan_include_dir) link_headers(build_config.build_internal_headers, 'internal', build_config.internal_include_dir) """ Generate Amalgamation """ def generate_amalgamation(build_config): def ending_with_suffix(suffix): def predicate(val): return val.endswith(suffix) return predicate def strip_header_goop(header_name, contents): header_guard = re.compile('^#define BOTAN_.*_H__$') while len(contents) > 0: if header_guard.match(contents[0]): contents = contents[1:] break contents = contents[1:] if len(contents) == 0: raise Exception("No header guard found in " + header_name) while contents[0] == '\n': contents = contents[1:] while contents[-1] == '\n': contents = contents[0:-1] if contents[-1] == '#endif\n': contents = contents[0:-1] return contents botan_include = re.compile('#include $') std_include = re.compile('#include <([^/\.]+)>$') class Amalgamation_Generator: def __init__(self, input_list): self.included_already = set() self.all_std_includes = set() self.file_contents = {} for f in sorted(input_list): contents = strip_header_goop(f, open(f).readlines()) self.file_contents[os.path.basename(f)] = contents self.contents = '' for name in self.file_contents: self.contents += ''.join(list(self.header_contents(name))) self.header_includes = '' for std_header in self.all_std_includes: self.header_includes += '#include <%s>\n' % (std_header) self.header_includes += '\n' def header_contents(self, name): name = name.replace('internal/', '') if name in self.included_already: return self.included_already.add(name) if name not in self.file_contents: return for line in self.file_contents[name]: match = botan_include.search(line) if match: for c in self.header_contents(match.group(1)): yield c else: match = std_include.search(line) if match and match.group(1) != 'functional': self.all_std_includes.add(match.group(1)) else: yield line amalg_basename = 'botan_all' header_name = '%s.h' % (amalg_basename) botan_h = open(header_name, 'w') pub_header_amalag = Amalgamation_Generator(build_config.public_headers) amalg_header = """/* * Botan %s Amalgamation * (C) 1999-2011 Jack Lloyd and others * * Distributed under the terms of the Botan license */ """ % (build_config.version_string) botan_h.write(amalg_header) botan_h.write(""" #ifndef BOTAN_AMALGAMATION_H__ #define BOTAN_AMALGAMATION_H__ """) botan_h.write(pub_header_amalag.header_includes) botan_h.write(pub_header_amalag.contents) botan_h.write("\n#endif\n") internal_header_amalag = Amalgamation_Generator( [s for s in build_config.internal_headers if s.find('asm_macr_') == -1]) botan_cpp = open('%s.cpp' % (amalg_basename), 'w') botan_cpp.write(amalg_header) botan_cpp.write('\n#include "%s"\n' % (header_name)) botan_cpp.write(internal_header_amalag.header_includes) botan_cpp.write(internal_header_amalag.contents) for src in build_config.sources: if src.endswith('.S'): continue contents = open(src).readlines() for line in contents: if botan_include.search(line): continue else: botan_cpp.write(line) """ Test for the existence of a program """ def have_program(program): def exe_test(path, program): exe_file = os.path.join(path, program) if os.path.exists(exe_file) and os.access(exe_file, os.X_OK): logging.debug('Found program %s in %s' % (program, path)) return True else: return False exe_suffixes = ['', '.exe'] for path in os.environ['PATH'].split(os.pathsep): for suffix in exe_suffixes: if exe_test(path, program + suffix): return True return False """ Main driver """ def main(argv = None): if argv is None: argv = sys.argv logging.basicConfig(stream = sys.stdout, format = '%(levelname) 7s: %(message)s') options = process_command_line(argv[1:]) def log_level(): if options.verbose: return logging.DEBUG if options.quiet: return logging.WARNING return logging.INFO logging.getLogger().setLevel(log_level()) logging.debug('%s invoked with options "%s"' % ( argv[0], ' '.join(argv[1:]))) logging.debug('Platform: OS="%s" machine="%s" proc="%s"' % ( platform.system(), platform.machine(), platform.processor())) if options.os == "java": raise Exception("Jython detected: need --os and --cpu to set target") options.base_dir = os.path.dirname(argv[0]) options.src_dir = os.path.join(options.base_dir, 'src') options.build_data = os.path.join(options.src_dir, 'build-data') options.makefile_dir = os.path.join(options.build_data, 'makefile') (modules, archinfo, ccinfo, osinfo) = load_info_files(options) if options.compiler is None: if options.os == 'windows': if have_program('g++') and not have_program('cl'): options.compiler = 'gcc' else: options.compiler = 'msvc' else: options.compiler = 'gcc' logging.info('Guessing to use compiler %s (use --cc to set)' % ( options.compiler)) if options.os is None: options.os = platform.system().lower() if re.match('^cygwin_.*', options.os): logging.debug("Converting '%s' to 'cygwin'", options.os) options.os = 'cygwin' if options.os == 'windows' and options.compiler == 'gcc': logging.warning('Detected GCC on Windows; use --os=cygwin or --os=mingw?') logging.info('Guessing target OS is %s (use --os to set)' % (options.os)) if options.compiler not in ccinfo: raise Exception('Unknown compiler "%s"; available options: %s' % ( options.compiler, ' '.join(sorted(ccinfo.keys())))) if options.os not in osinfo: def find_canonical_os_name(os): for (name, info) in osinfo.items(): if os in info.aliases: return name return os # not found options.os = find_canonical_os_name(options.os) if options.os not in osinfo: raise Exception('Unknown OS "%s"; available options: %s' % ( options.os, ' '.join(sorted(osinfo.keys())))) if options.cpu is None: (options.arch, options.cpu) = guess_processor(archinfo) logging.info('Guessing target processor is a %s/%s (use --cpu to set)' % ( options.arch, options.cpu)) else: cpu_from_user = options.cpu (options.arch, options.cpu) = canon_processor(archinfo, options.cpu) logging.info('Canonicalizized --cpu=%s to %s/%s' % ( cpu_from_user, options.arch, options.cpu)) logging.info('Target is %s-%s-%s-%s' % ( options.compiler, options.os, options.arch, options.cpu)) cc = ccinfo[options.compiler] # Kind of a hack... options.extra_flags = '' if options.compiler == 'gcc': def get_gcc_version(gcc_bin): try: gcc_proc = subprocess.Popen( gcc_bin.split(' ') + ['-dumpversion'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = gcc_proc.communicate() if gcc_proc.returncode != 0: logging.warning("GCC returned non-zero result %s" % (stderr)) return None gcc_version = stdout.strip() logging.info('Detected gcc version %s' % (gcc_version)) return [int(v) for v in gcc_version.split('.')] except OSError: logging.warning('Could not execute %s for version check' % (gcc_bin)) return None def is_64bit_arch(arch): if arch.endswith('64') or arch in ['alpha', 's390x']: return True return False gcc_version = get_gcc_version(options.compiler_binary or cc.binary_name) def gcc_version_matches(matches): for match in matches.items(): if gcc_version[0] != match[0]: continue for minor in match[1]: if minor == gcc_version[1]: return True return False if gcc_version: if not is_64bit_arch(options.arch) and not options.dumb_gcc: if gcc_version_matches({ 4 : [0, 1, 2, 3, 4], 3 : [3, 4], 2 : [95] }): options.dumb_gcc = True if options.with_tr1 == None and \ gcc_version_matches({ 4 : [0], 3 : [0,1,2,3,4], 2 : [95] }): logging.info('Disabling TR1 support for this gcc, too old') options.with_tr1 = 'none' if options.with_visibility == None and \ gcc_version_matches({ 3 : [0,1,2,3,4], 2 : [95] }): logging.info('Disabling DSO visibility support for this gcc, too old') options.with_visibility = False if options.dumb_gcc is True: logging.info('Setting -fpermissive to work around gcc bug') options.extra_flags = ' -fpermissive' if options.with_visibility is None: options.with_visibility = True if options.with_tr1 == None: if cc.has_tr1: logging.info('Assuming %s has TR1 (use --with-tr1=none to disable)' % ( options.compiler)) options.with_tr1 = 'system' else: options.with_tr1 = 'none' if options.with_sphinx is None: if have_program('sphinx-build'): logging.info('Found sphinx-build, will use it ' + '(use --without-sphinx to disable)') options.with_sphinx = True if options.via_amalgamation: options.gen_amalgamation = True if options.gen_amalgamation: if options.asm_ok: logging.info('Disabling assembly code, cannot use in amalgamation') options.asm_ok = False modules_to_use = choose_modules_to_use(modules, archinfo[options.arch], options) if not osinfo[options.os].build_shared: if options.build_shared_lib: logging.info('Disabling shared lib on %s' % (options.os)) options.build_shared_lib = False build_config = BuildConfigurationInformation(options, modules_to_use) build_config.public_headers.append( os.path.join(build_config.build_dir, 'build.h')) template_vars = create_template_vars(build_config, options, modules_to_use, cc, archinfo[options.arch], osinfo[options.os]) # Performs the I/O setup_build(build_config, options, template_vars) if options.gen_amalgamation: generate_amalgamation(build_config) logging.info('Botan %s build setup is complete' % ( build_config.version_string)) if __name__ == '__main__': try: main() except Exception as e: logging.error(str(e)) import traceback logging.debug(traceback.format_exc()) sys.exit(1) sys.exit(0) Botan-1.10.12/doc/_templates/layout.html0000664000175000017500000000027012654331322017670 0ustar jackjack00000000000000{% extends "!layout.html" %} {% block header %}

{{ shorttitle|e }}

{% endblock %} Botan-1.10.12/doc/algos.txt0000664000175000017500000000627112654331322015205 0ustar jackjack00000000000000 .. _algo_list: Algorithms ======================================== Supported Algorithms ---------------------------------------- Botan provides a number of different cryptographic algorithms and primitives, including: * Public key cryptography * Encryption algorithms RSA, ElGamal, DLIES (padding schemes OAEP, PKCS #1 v1.5) * Signature algorithms RSA, DSA, ECDSA, GOST 34.10-2001, Nyberg-Rueppel, Rabin-Williams (padding schemes PSS, PKCS #1 v1.5, X9.31) * Key agreement techniques Diffie-Hellman and ECDH * Hash functions * NIST hashes: SHA-1, SHA-224, SHA-256, SHA-384, and SHA-512 * RIPE hashes: RIPEMD-160 and RIPEMD-128 * SHA-3 candidates Skein-512, Keccak, and Blue Midnight Wish-512 * Other common hash functions Whirlpool and Tiger * National standard hashes HAS-160 and GOST 34.11 * Obsolete or insecure hashes MD5, MD4, MD2 * Non-cryptographic checksums Adler32, CRC24, CRC32 * Block ciphers * AES (Rijndael) and AES candidates Serpent, Twofish, MARS, CAST-256, RC6 * DES, and variants 3DES and DESX * National/telecom block ciphers SEED, KASUMI, MISTY1, GOST 28147, Skipjack * Other block ciphers including Blowfish, CAST-128, IDEA, Noekeon, TEA, XTEA, RC2, RC5, SAFER-SK, and Square * Block cipher constructions Luby-Rackoff and Lion * Block cipher modes ECB, CBC, CBC/CTS, CFB, OFB, CTR, XTS and authenticated cipher mode EAX * Stream ciphers ARC4, Salsa20/XSalsa20, Turing, and WiderWake4+1 * Authentication codes HMAC, CMAC (aka OMAC1), CBC-MAC, ANSI X9.19 DES-MAC, and the protocol-specific SSLv3 authentication code * Public Key Infrastructure * X.509 certificates (including generating new self-signed and CA certs) and CRLs * Certificate path validation * PKCS #10 certificate requests (creation and certificate issue) * Other cryptographic utility functions including * Key derivation functions for passwords: PBKDF1 (PKCS #5 v1.5), PBKDF2 (PKCS #5 v2.0), OpenPGP S2K (RFC 2440) * General key derivation functions KDF1 and KDF2 from IEEE 1363 * PRFs from ANSI X9.42, SSL v3.0, TLS v1.0 Recommended Algorithms --------------------------------- This section is by no means the last word on selecting which algorithms to use. However, botan includes a sometimes bewildering array of possible algorithms, and unless you're familiar with the latest developments in the field, it can be hard to know what is secure and what is not. The following attributes of the algorithms were evaluated when making this list: security, standardization, patent status, support by other implementations, and efficiency (in roughly that order). It is intended as a set of simple guidelines for developers, and nothing more. It's entirely possible that there are algorithms that will turn out to be more secure than the ones listed, but the algorithms listed here are (currently) thought to be safe. * Block ciphers: AES or Serpent in CBC, CTR, or XTS mode * Hash functions: SHA-256, SHA-512 * MACs: HMAC with any recommended hash function * Public Key Encryption: RSA with "EME1(SHA-256)" * Public Key Signatures: RSA with EMSA4 and any recommended hash, or DSA or ECDSA with "EMSA1(SHA-256)" * Key Agreement: Diffie-Hellman or ECDH, with "KDF2(SHA-256)" Botan-1.10.12/doc/bigint.txt0000664000175000017500000001005212654331322015344 0ustar jackjack00000000000000BigInt ======================================== ``BigInt`` is Botan's implementation of a multiple-precision integer. Thanks to C++'s operator overloading features, using ``BigInt`` is often quite similar to using a native integer type. The number of functions related to ``BigInt`` is quite large. You can find most of them in ``botan/bigint.h`` and ``botan/numthry.h``. .. note:: If you can, always use expressions of the form ``a += b`` over ``a = a + b``. The difference can be *very* substantial, because the first form prevents at least one needless memory allocation, and possibly as many as three. This will be less of an issue once the library adopts use of C++0x's rvalue references. Encoding Functions ---------------------------------------- These transform the normal representation of a ``BigInt`` into some other form, such as a decimal string: .. cpp:function:: SecureVector BigInt::encode(const BigInt& n, Encoding enc = Binary) This function encodes the BigInt n into a memory vector. ``Encoding`` is an enum that has values ``Binary``, ``Octal``, ``Decimal``, and ``Hexadecimal``. .. cpp:function:: BigInt BigInt::decode(const MemoryRegion& vec, Encoding enc) Decode the integer from ``vec`` using the encoding specified. These functions are static member functions, so they would be called like this:: BigInt n1 = ...; // some number SecureVector n1_encoded = BigInt::encode(n1); BigInt n2 = BigInt::decode(n1_encoded); assert(n1 == n2); There are also C++-style I/O operators defined for use with ``BigInt``. The input operator understands negative numbers, hexadecimal numbers (marked with a leading "0x"), and octal numbers (marked with a leading '0'). The '-' must come before the "0x" or '0' marker. The output operator will never adorn the output; for example, when printing a hexadecimal number, there will not be a leading "0x" (though a leading '-' will be printed if the number is negative). If you want such things, you'll have to do them yourself. ``BigInt`` has constructors that can create a ``BigInt`` from an unsigned integer or a string. You can also decode an array (a ``byte`` pointer plus a length) into a ``BigInt`` using a constructor. Number Theory ---------------------------------------- Number theoretic functions available include: .. cpp:function:: BigInt gcd(BigInt x, BigInt y) Returns the greatest common divisor of x and y .. cpp:function:: BigInt lcm(BigInt x, BigInt y) Returns an integer z which is the smallest integer such that z % x == 0 and z % y == 0 .. cpp:function:: BigInt inverse_mod(BigInt x, BigInt m) Returns the modular inverse of x modulo m, that is, an integer y such that (x*y) % m == 1. If no such y exists, returns zero. .. cpp:function:: BigInt power_mod(BigInt b, BigInt x, BigInt m) Returns b to the xth power modulo m. If you are doing many exponentiations with a single fixed modulus, it is faster to use a ``Power_Mod`` implementation. .. cpp:function:: BigInt ressol(BigInt x, BigInt p) Returns the square root modulo a prime, that is, returns a number y such that (y*y) % p == x. Returns -1 if no such integer exists. .. cpp:function:: bool quick_check_prime(BigInt n, RandomNumberGenerator& rng) .. cpp:function:: bool check_prime(BigInt n, RandomNumberGenerator& rng) .. cpp:function:: bool verify_prime(BigInt n, RandomNumberGenerator& rng) Three variations on primality testing. All take an integer to test along with a random number generator, and return true if the integer seems like it might be prime; there is a chance that this function will return true even with a composite number. The probability decreases with the amount of work performed, so it is much less likely that ``verify_prime`` will return a false positive than ``check_prime`` will. .. cpp:function BigInt random_prime(RandomNumberGenerator& rng, \ size_t bits, BigInt coprime = 1, size_t equiv = 1, size_t equiv_mod = 2) Return a random prime number of ``bits`` bits long that is relatively prime to ``coprime``, and equivalent to ``equiv`` modulo ``equiv_mod``. Botan-1.10.12/doc/build_log.txt0000664000175000017500000005736312654331322016050 0ustar jackjack00000000000000 Build Log ======================================== To report build results (successful or not), email the `development list `_ your results and relevant system information (OS versions, compiler name and version, CPU architecture and other hardware information, configuration settings). Debian reports the build results for 1.8 on `a number of platforms `_. =========== ======= =================== ======================== ============================ ======== Date Version OS CPU Compiler Results =========== ======= =================== ======================== ============================ ======== 2011-05-09 1.9.17 Debian 6.0 Intel Atom D510 GCC 4.4.5 OK 2010-05-09 1.9.17 Gentoo 10.0 PowerPC G5 GCC 4.4.5 OK 2011-05-02 1.9.17 FreeBSD 8.2 x86-64 GCC 4.2.1 OK 2011-04-25 1.9.16 Gentoo 10.0 Intel Core i7-860 Clang 2.9 Miscompiles SSE2 IDEA 2011-04-23 1.9.16 Gentoo 10.0 Intel Core i7-860 Sun C++ 5.10 OK 2011-04-22 1.9.16 Gentoo 10.0 Intel Core i7-860 Intel C++ 11.1 OK 2011-04-15 1.9.16 Haiku R1-alpha2 x86 GCC 4.3.3 OK 2011-04-15 1.9.16 Haiku R1-alpha2 x86 GCC 2.95.3 Can't compile 2011-04-15 1.9.16 Windows 7 x86-64 Visual C++ 16.00.30319.01 OK 2011-04-15 1.9.16 QNX 6.4.1 i386 GCC 4.3.3 OK 2011-03-29 1.9.15 Gentoo 10.0 Intel Core i5-520M GCC 4.5.2 OK 2011-03-21 1.9.15 Ark Linux x86-64 GCC 4.6.0-pre OK 2011-03-21 1.9.15 Ark Linux x86-32 GCC 4.6.0-pre OK 2011-03-21 1.9.15 Ark Linux ARM GCC 4.6.0-pre OK 2011-03-18 1.9.14 Debian 6.0 Intel Atom D510 GCC 4.4.5 OK 2011-03-01 1.9.14 OpenBSD 4.6 UltraSPARC IIIi GCC 4.2.4 OK 2011-03-01 1.9.14 OpenBSD 4.7 i386 GCC 4.2.4 OK 2011-03-01 1.9.14 Debian 6.0 Intel Madison IA-64 GCC 4.4.5 OK 2011-03-01 1.9.14 Ubuntu 9.10 ARM Cortex-A8 GCC 4.4.1 OK 2011-03-01 1.9.14 Debian 5.0 PowerPC G5/970 GCC 4.3.2 OK 2011-03-01 1.9.14 Windows 7 x64 Intel Core i5-520M Visual C++ 15.00.30729.01 OK (32/64) 2011-03-01 1.9.14 Gentoo 10.0 Intel Core i7-860 Open64 4.2.1 OK 2011-03-01 1.9.14 Gentoo 10.0 Intel Core i7-860 Sun C++ 5.10 OK 2011-03-01 1.9.14 Gentoo 10.0 Intel Core i7-860 Intel C++ 11.1 OK 2011-03-01 1.9.14 Gentoo 10.0 Intel Core i7-860 GCC 4.5.2 OK 2011-02-14 1.9.13 NetBSD 5.1 Intel Xeon P4 GNU GCC 4.1.3 OK 2011-01-14 1.9.12 FreeBSD 8.1 x86-64 Clang 2.9 OK 2010-11-29 1.9.11 Windows 7 x64 Intel Core i5-520M Visual C++ 15.00.30729.01 OK (32/64) 2010-11-29 1.9.11 Gentoo 10.0 Intel Core i7-860 GNU GCC 4.1.2, 4.4.5, 4.5.1 OK 2010-11-29 1.9.11 Debian 5.0 PowerPC G5/970 GCC 4.3.2 OK 2010-11-29 1.9.11 Gentoo 10.0 Intel Core i7-860 Intel C++ 11.1 OK 2010-11-29 1.9.11 Gentoo 10.0 Intel Core i7-860 Clang 2.8 Miscompiles SSE2 IDEA 2010-11-29 1.9.11 Debian 5.0 (32 bit) UltraSPARC T1 Niagra GCC 4.3.2 OK 2010-09-07 1.9.11 Gentoo 10.0 Intel Core i7-860 Sun C++ 5.10 OK 2010-08-12 1.9.10 Debian 5.0 Xeon X5450 Harpertown GCC 4.3.2 OK 2010-08-12 1.9.10 Ubuntu 9.04 Intel Atom N270 GCC 4.3.3 OK 2010-08-12 1.9.10 Debian 5.0 Intel Prescott GCC 4.3.2 OK 2010-08-08 1.9.10 Gentoo 10.0 Intel Core i7-860 GCC 3.4.6 OK 2010-08-08 1.9.10 Gentoo 10.0 Intel Core i7-860 GCC 4.1.2 OK 2010-08-08 1.9.10 Gentoo 10.0 Intel Core i7-860 GCC 4.3.5 OK 2010-08-08 1.9.10 Gentoo 10.0 Intel Core i7-860 GCC 4.4.4 OK 2010-08-08 1.9.10 Gentoo 10.0 Intel Core i7-860 GCC 4.5.1 OK 2010-08-08 1.9.10 Gentoo 10.0 Intel Core i7-860 Clang SVN Miscompiles Turing 2010-07-27 1.9.9 Debian 5.0 AMD Magny-Cours GCC 4.3.2, 4.5.0 OK 2010-06-16 1.9.8 Gentoo 10.0 Intel Core2 Q6600 Intel C++ 11.1 OK 2010-06-16 1.9.8 Debian 5.0 (32 bit) UltraSPARC T1 Niagra GCC 4.3.2 OK 2010-06-16 1.9.8 Debian 5.0 Intel Madison IA-64 GCC 4.3.2 OK 2010-06-16 1.9.8 Gentoo 10.0 IBM POWER5+ GCC 4.1.2, 4.2.4, 4.3.2 OK 2010-06-16 1.9.8 OpenBSD 4.6 UltraSPARC IIIi GCC 3.3.5, 4.2.4 OK 2010-06-16 1.9.8 FreeBSD 8.0 AMD Opteron 252 GCC 4.2.1 OK 2010-06-16 1.9.8 gNewSense MIPS Loongson-2 (64) GCC 4.3.2 OK 2010-06-16 1.9.8 Ubuntu 9.10 ARM Cortex-A8 GCC 4.4.1 OK 2010-06-11 1.9.8 Gentoo 10.0 Intel Core2 Q6600 GCC 3.4.6, 4.1.2 OK 2010-06-11 1.9.8 Windows 7 x64 Intel Core i5-520M Visual C++ 15.00.30729.01 OK (32 and 64 bit) 2010-06-11 1.9.8 Gentoo 10.0 Intel Core i5-520M GCC 4.5.0 OK 2010-06-01 1.9.8 OpenBSD 4.7 i386 GCC 3.3.5 OK 2010-05-03 1.9.7 Windows 7 x64 Intel Core i5-520M Visual C++ 15.00.30729.01 OK 2010-04-27 1.9.7 Gentoo 10.0 PPC 970FX (G5) GCC 4.3.4 OK 2010-04-27 1.9.7 Gentoo 10.0 Intel Core2 Q6600 GCC 4.4.3, 4.5.0 OK 2010-03-18 1.9.4 Gentoo 10.0 Intel Core2 Q6600 GCC 4.4.3 OK 2010-03-18 1.9.4 Debian 5.0 UltraSPARC II (64) GCC 4.3.2 OK 2010-03-18 1.9.4 Gentoo 10.0 PowerPC G5 GCC 4.3.4 OK 2010-03-18 1.9.4 Gentoo 10.0 IBM POWER5+ GCC 4.3.2 OK 2010-03-15 1.9.4 Windows XP x86 Visual C++ 15.00.30729.01 OK 2010-03-10 1.9.4 FreeBSD 8.0 AMD Opteron 252 GCC 4.2.1 OK, but missing includes 2009-12-29 1.9.4 Debian 4.0 PowerPC G4 7455 GCC 4.1.2 OK 2009-12-23 1.9.4 Debian 5.0 Xeon X5450 Harpertown GCC 4.3.2 OK 2009-11-13 1.9.3 Debian 5.0 UltraSPARC II GCC 4.3.2 OK 2009-11-10 1.9.2 Debian 4.0 PowerPC G4 GCC 4.1.2 OK 2009-11-03 1.9.2 Debian Linux 4.0 AMD Opteron 8354 GCC 4.4.1 OK 2009-10-27 1.9.2 Debian Linux 5.0 Xeon X5450 Harpertown GCC 4.3.2 OK 2009-10-23 1.9.1 Gentoo Linux Intel Core2 Q6600 GCC 4.4.1, Intel C++ 11.1 OK 2009-10-23 1.9.1 Gentoo Linux AMD Opteron 2212 GCC 4.3.4 OK 2009-09-24 1.9.0 Debian 4.0 AMD Opteron 8354 GCC 4.1.2, 4.4.1 OK 2010-07-01 1.8.9 OpenSUSE 10.3 Intel Core2 GCC 4.2.1 OK 2010-06-22 1.8.9 Slackware 13.1 Intel E5400 (64) GCC 4.4.4 OK 2010-06-22 1.8.9 Slackware 13.1 Pentium-M (32) GCC 4.4.4 OK 2010-06-16 1.8.9 Debian 5.0 (32 bit) UltraSPARC T1 Niagra GCC 4.3.2 (GCC TR1) Crashes in GF(p) tests 2010-03-18 1.8.8 Debian 5.0 UltraSPARC II (64) GCC 4.3.2 OK 2008-10-23 1.8.7 Gentoo 2008.0 PPC 970FX (G5) GCC 4.3.4 OK 2009-10-07 1.8.7 Debian GNU/Hurd 0.3 i686 GCC 4.3.4 OK 2009-09-08 1.8.7 Gentoo 2008.0 Intel Core2 Q6600 GCC 4.4.1 OK 2009-09-04 1.8.6 Gentoo 2008.0 PPC 970FX (G5) GCC 4.3.4 OK 2009-08-13 1.8.6 Gentoo 2008.0 Intel Core2 Q6600 GCC 4.3.3 OK 2009-08-13 1.8.6 Windows XP x86 Visual C++ 15.00.30729.01 OK (no TR1) 2009-08-03 1.8.5 openSuSE 10.3 x86 GCC 4.2.1 OK 2009-08-03 1.8.5 Gentoo 2008.0 Intel Core2 Q6600 Open64 4.2.1 BAD: Miscompiles several ciphers 2009-07-31 1.8.5 Solaris 11 x86 Sun C++ 5.9 OK, but minor build problems 2009-07-30 1.8.5 Gentoo 2006.1 UltraSPARC IIe (32) GCC 3.4.6 OK (no TR1) 2009-07-25 1.8.5 Debian 4.0 AMD Opteron 2212 GCC 4.1.2 OK 2009-07-23 1.8.5 Gentoo 2008.0 Marvel Feroceon 88FR131 GCC 4.1.2 OK 2009-07-23 1.8.5 Debian 5.0 Intel Xscale 80219 GCC 4.3.2 OK 2009-07-23 1.8.5 Debian 5.0 UltraSPARC II (64) GCC 4.3.2 OK 2009-07-23 1.8.5 Debian 5.0 UltraSPARC II (32) GCC 4.3.2 BAD: bus error in GF(p) 2009-07-23 1.8.5 Debian 5.0 UltraSPARC II (32) GCC 4.1.3 BAD: miscompiles BigInt code 2009-07-23 1.8.5 Debian 4.0 PowerPC G4 GCC 4.1.2 OK 2009-07-23 1.8.5 Debian 4.0 PowerPC G5 GCC 4.1.2 OK 2009-07-23 1.8.5 Debian 5.0 Intel Madison IA-64 GCC 4.1.3, 4.3.2 OK 2009-07-23 1.8.5 Debian 5.0 HP-PA PA8600 GCC 4.3.2 OK 2009-07-23 1.8.5 Mandriva 2008.1 MIPS Loongson-2 (32) GCC 4.2.3 OK 2009-07-23 1.8.5 gNewSense MIPS Loongson-2 (64) GCC 4.3.2 OK 2009-07-21 1.8.5 Windows XP x86 Visual C++ 15.00.30729.01 OK (no TR1) 2009-07-21 1.8.5 Gentoo 2008.0 Intel Core2 Q6600 GCC 4.1.2, 4.3.3 OK 2009-07-21 1.8.5 Gentoo 2008.0 Intel Core2 Q6600 Intel C++ 10.1 20080801 OK 2009-07-21 1.8.5 Gentoo 2008.0 AMD Opteron 2212 GCC 4.3.3 OK 2009-07-21 1.8.5 Ubuntu 8.04 Intel Xeon X5492 GCC 4.2.4 OK 2009-07-21 1.8.5 MacOS X 10.5.6 Intel Core 2 Duo T5600 GCC 4.0.1 OK 2009-07-21 1.8.5 Solaris 10 AMD Opteron GCC 3.4.3 OK (no TR1) 2008-07-11 1.8.3 Fedora 11 Intel Pentium E5200 GCC 4.4.0 OK 2008-07-10 1.8.3 Gentoo 2008.0 PPC 970FX (G5) GCC 4.3.1 OK 2008-07-10 1.8.3 Gentoo 2008.0 IBM POWER5+ GCC 4.2.2 OK 2009-07-10 1.8.3 Gentoo 2008.0 AMD Opteron 2212 GCC 4.3.3 OK 2009-07-10 1.8.3 Ubuntu 8.04 Intel Xeon X5492 GCC 4.2.4 OK 2009-07-10 1.8.3 MacOS X 10.5.6 Intel Core 2 Duo T5600 GCC 4.0.1 OK 2009-07-10 1.8.3 Debian 5.0.1 Intel Core 2 Duo T5600 GCC 4.3.2 OK 2009-07-10 1.8.3 Fedora 10 Intel Core 2 Duo T5600 GCC 4.3.2 OK 2009-07-10 1.8.3 Solaris 10 AMD Opteron GCC 3.4.3 OK (no TR1) 2009-07-09 1.8.3 Gentoo 2008.0 Intel Core2 Q6600 Intel C++ 10.1 20080801 OK 2009-07-02 1.8.3 Gentoo 2008.0 Intel Core2 Q6600 GCC 4.3.3 OK 2009-07-02 1.8.3 FreeBSD 7.0 x86-64 GCC 4.2.1 OK 2009-07-02 1.8.3 Windows XP x86 Visual C++ 15.00.30729.01 OK (no TR1) 2008-12-27 1.8.0 Ubuntu 8.04 Pentium 4-M GCC 4.2.3 OK 2008-12-14 1.8.0 FreeBSD 7.0 x86-64 GCC 4.2.1 OK 2008-12-10 1.8.0 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.1.2, 4.2.4, 4.3.2 OK 2008-12-05 1.7.24 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.1.2, 4.2.4, 4.3.2 OK 2008-12-04 1.7.24 Gentoo 2007.0 Intel Core2 Q6600 Intel 10.1-20080801 OK 2008-12-03 1.7.24 Solaris 10 x86 GCC 3.4.3 OK (small patch needed, fixed in 1.8.0) 2008-11-24 1.7.23 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.1.2 OK 2008-11-24 1.7.23 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.2.4 OK 2008-11-24 1.7.23 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.3.2 OK 2008-11-24 1.7.23 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.4-20081017 OK 2008-11-24 1.7.23 Gentoo 2007.0 Intel Core2 Q6600 (32) GCC 4.1.2, 4.2.4 OK 2008-11-24 1.7.23 Gentoo 2007.0 Intel Core2 Q6600 (32) GCC 4.3.2 OK (with Boost 1.35 TR1) 2008-11-24 1.7.23 Gentoo 2007.0 Intel Core2 Q6600 (32) GCC 4.3.2 Crashes (with libstdc++ TR1) 2008-11-24 1.7.23 Gentoo 2007.0 Intel Core2 Q6600 Intel C++ 9.1-20061101 OK 2008-11-24 1.7.23 Gentoo 2007.0 Intel Core2 Q6600 Intel C++ 10.1-20080801 OK 2008-11-24 1.7.23 Fedora 8 STI Cell PPU GCC 4.1.2 OK 2008-11-24 1.7.23 Fedora 8 STI Cell PPU IBM XLC for Cell 0.9 45 minute link. Miscompiles DES 2008-11-24 1.7.23 Gentoo 2007.0 IBM POWER5+ GCC 4.1.2, 4.2.2, 4.3.1 OK 2008-11-24 1.7.23 Gentoo 2007.0 AMD Opteron 2212 GCC 3.3.6, 4.1.2, 4.3.2 OK (no TR1 with 3.3.6) 2008-11-24 1.7.23 Windows XP x86 Visual C++ 15.00.30729.01 OK (no TR1) 2008-11-09 1.7.20 Gentoo 2007.0 IBM POWER5+ GCC 4.1.2 OK 2008-11-09 1.7.20 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.3.2 OK 2008-11-09 1.7.20 Windows XP x86 Visual C++ 15.00.30729.01 OK 2008-11-06 1.7.19 Gentoo 2007.0 IBM POWER5+ GCC 4.1.2 OK 2008-11-06 1.7.19 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.1.2, 4.3.1 OK 2008-11-06 1.7.19 Gentoo 2007.0 Intel Core2 Q6600 Intel C++ 9.1-20061101 OK 2008-11-06 1.7.19 Gentoo 2007.0 Intel Core2 Q6600 Intel C++ 10.1-20080801 OK 2008-11-06 1.7.19 Windows XP x86 Visual C++ 15.00.30729.01 OK 2008-11-03 1.7.19 FreeBSD 7.0 x86-64 GCC 4.2.1 OK 2008-10-24 1.7.18 Gentoo 2007.0 IBM POWER5+ GCC 4.2.2, 4.3.1 OK 2008-10-24 1.7.18 Fedora 8 STI Cell PPU GCC 4.1.2 OK 2008-10-22 1.7.18 Windows XP Pentium 4-M GCC 3.4.5 (MinGW) OK 2008-10-22 1.7.18 Windows XP Pentium 4-M Visual C++ 15.00.30729.01 OK 2008-10-22 1.7.18 Gentoo 2007.0 IBM POWER5+ GCC 4.1.2 OK 2008-10-22 1.7.18 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.1.2, 4.2.4, 4.3.2 OK 2008-10-22 1.7.18 Gentoo 2007.0 Intel Core2 Q6600 Intel C++ 9.1-20061101 OK 2008-10-22 1.7.18 Gentoo 2007.0 Intel Core2 Q6600 Intel C++ 10.1-20080801 OK 2008-10-07 1.7.15 Gentoo 2007.0 IBM POWER5+ GCC 4.1.2 OK 2008-10-07 1.7.15 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.3.1 OK 2008-09-30 1.7.14 Gentoo 2007.0 PPC 970FX (G5) GCC 4.3.1 OK 2008-09-30 1.7.14 Gentoo 2007.0 IBM POWER5+ GCC 4.1.2 OK 2008-09-30 1.7.14 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.3.1 OK 2008-09-30 1.7.14 Gentoo 2007.0 Intel Core2 Q6600 Intel C++ 10.1.018 OK 2008-09-30 1.7.14 Windows XP Pentium 4-M Visual C++ 15.00.30729.01 OK 2008-09-30 1.7.14 Windows XP Pentium 4-M GCC 3.4.5 (MinGW) OK 2008-09-18 1.7.12 Gentoo 2007.0 IBM POWER5+ GCC 4.1.2, 4.2.2 OK 2008-09-18 1.7.12 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.2.4, 4.3.1 OK 2008-09-18 1.7.12 Gentoo 2007.0 Intel Core2 Q6600 Intel C++ 10.1.018 OK 2008-09-18 1.7.12 Windows XP Pentium 4-M Visual C++ 15.00.30729.01 OK 2008-09-18 1.7.12 Windows XP Pentium 4-M GCC 3.4.5 (MinGW) OK 2008-09-16 1.7.12 Fedora 7 STI Cell PPU GCC 4.1.2 OK 2008-09-16 1.7.11 MacOS X 10.4 (32) Intel Core2 GCC 4.0.1 OK 2008-09-11 1.7.11 Gentoo 2007.0 Intel Core2 Q6600 GCC 4.3.1 OK 2008-09-11 1.7.11 Windows XP Pentium 4-M Visual C++ 15.00.30729.01 OK 2008-09-08 1.7.9 Gentoo 2007.0 Intel Core2 Q6600 Intel C++ 10.1.018 OK 2008-08-28 1.7.9 Gentoo 2007.0 IBM POWER5+ GCC 4.1.2 OK 2008-08-28 1.7.9 Gentoo 2007.0 IBM POWER5+ GCC 4.2.2 OK 2008-08-28 1.7.9 Gentoo 2007.0 IBM POWER5+ GCC 4.3.1 OK 2008-08-28 1.7.9 Gentoo STI Cell PPU GCC 4.1.2 OK 2008-08-27 1.7.9 Gentoo Intel Core2 Q6600 GCC 4.1.2 OK 2008-08-27 1.7.9 Gentoo Intel Core2 Q6600 GCC 4.2.4 OK 2008-08-27 1.7.9 Gentoo Intel Core2 Q6600 GCC 4.3.1 OK 2008-08-27 1.7.9 Gentoo Intel Core2 Q6600 GCC 4.4-20080822 OK 2008-08-27 1.7.9 Gentoo Intel Core2 Q6600 Intel C++ 9.1-20061101 OK 2008-08-27 1.7.9 Gentoo Intel Core2 Q6600 Intel C++ 10.1-20080602 OK 2008-08-27 1.7.9 Windows XP Pentium 4-M Visual C++ 2008 OK 2008-08-27 1.7.9 Windows XP Pentium 4-M GCC 3.4.5 (MinGW) OK 2008-08-18 1.7.8 Ubuntu 8.04 Pentium 4-M GCC 4.2.3 OK 2008-08-18 1.7.8 Windows XP Pentium 4-M Visual C++ 2008 OK 2008-08-18 1.7.8 Windows XP Pentium 4-M GCC 3.4.5 (MinGW) OK 2008-07-18 1.7.8 Gentoo IBM POWER5+ GCC 4.1.2 OK 2008-07-15 1.7.8 Gentoo Intel Core2 Q6600 GCC 4.3.1 OK 2008-07-06 1.7.7 Gentoo Intel Core2 Q6600 PGI 7.2 Miscompiles TEA, Turing, BigInt 2008-06-28 1.7.7 Gentoo Pentium 4-M GCC 4.1.2 OK 2008-06-28 1.7.7 Gentoo Intel Core2 Q6600 GCC 4.1.2, 4.2.4, 4.3.1 OK 2008-06-28 1.7.7 Gentoo Intel Core2 Q6600 Intel C++ 10.1 OK 2008-06-28 1.7.7 Gentoo IBM POWER5+ GCC 4.1.2, 4.2.2 OK 2008-06-25 1.7.6 Gentoo IBM POWER5+ GCC 4.1.2, 4.2.2 OK 2008-06-09 1.7.6 Gentoo PPC 970FX (G5) GCC 4.1.2 OK 2008-05-14 1.7.6 Gentoo Intel Core2 Q6600 Intel C++ 9.1 Builds, but link problems 2008-05-14 1.7.6 Gentoo Intel Core2 Q6600 GCC 4.2.3 OK 2008-04-21 1.7.5 Gentoo STI Cell PPU GCC 4.1.2 OK 2008-04-14 1.7.5 Debian Pentium 4 GCC 4.1.2 OK 2008-04-13 1.7.5 Gentoo 2006.1 UltraSPARC II (32) GCC 3.4.6 OK 2008-04-12 1.7.5 RHEL3 Pentium 4 Xeon GCC 3.2.3 OK 2008-04-12 1.7.5 Gentoo Intel Core2 Q6600 Intel C++ 10.1 OK 2008-04-12 1.7.5 Gentoo AMD Opteron 2212 GCC 4.1.2 OK 2008-04-12 1.7.5 Gentoo Intel Core2 Q6600 GCC 4.2.3 OK 2008-09-16 1.6.5 MacOS X 10.4 Intel Core2 (32) GCC 4.0.1 OK 2008-08-28 1.6.5 Gentoo 2007.0 IBM POWER5+ GCC 4.1.2, 4.2.2, 4.3.1 OK 2008-08-27 1.6.5 Gentoo Intel Core2 Q6600 GCC 4.3.1, 4.4-20080822 OK 2008-08-18 1.6.4 Windows XP Pentium 4-M Visual C++ 2008 OK 2008-07-02 1.6.4 Solaris 10 x86-64 Sun Forte 12 OK =========== ======= =================== ======================== ============================ ======== Botan-1.10.12/doc/building.txt0000664000175000017500000004463712654331322015705 0ustar jackjack00000000000000 Building The Library ================================= This document describes how to build Botan on Unix/POSIX and MS Windows systems. The POSIX oriented descriptions should apply to most common Unix systems (including MacOS X), along with POSIX-ish systems like BeOS, QNX, and Plan 9. Currently, systems other than Windows and POSIX (such as VMS, MacOS 9, OS/390, OS/400, ...) are not supported by the build system, primarily due to lack of access. Please contact the maintainer if you would like to build Botan on such a system. Botan's build is controlled by configure.py, which is a `Python `_ script. Python 2.5 or later is required. For the impatient, this works for most systems:: $ ./configure.py [--prefix=/some/directory] $ make $ make check $ make install Or using ``nmake``, if you're compiling on Windows with Visual C++. On platforms that do not understand the '#!' convention for beginning script files, or that have Python installed in an unusual spot, you might need to prefix the ``configure.py`` command with ``python`` or ``/path/to/python``:: $ python ./configure.py [arguments] Configuring the Build --------------------------------- The first step is to run ``configure.py``, which is a Python script that creates various directories, config files, and a Makefile for building everything. The script requires at least Python 2.5; any later version of Python 2.x should also work. Python 3.1 will also work but requires an extra step; see :ref:`configure_with_python3` for details. The script will attempt to guess what kind of system you are trying to compile for (and will print messages telling you what it guessed). You can override this process by passing the options ``--cc``, ``--os``, and ``--cpu``. You can pass basically anything reasonable with ``--cpu``: the script knows about a large number of different architectures, their sub-models, and common aliases for them. You should only select the 64-bit version of a CPU (such as "sparc64" or "mips64") if your operating system knows how to handle 64-bit object code - a 32-bit kernel on a 64-bit CPU will generally not like 64-bit code. By default the script tries to figure out what will work on your system, and use that. It will print a display at the end showing which algorithms have and have not been enabled. For instance on one system we might see lines like:: INFO: Skipping, by request only - bzip2 gnump openssl qt_mutex zlib INFO: Skipping, incompatible CPU - aes_intel aes_ssse3 asm_x86_64 mp_asm64 mp_x86_64 sha1_x86_64 INFO: Skipping, incompatible OS - beos_stats cryptoapi_rng win32_crit_section win32_stats INFO: Skipping, incompatible compiler - mp_msvc64 mp_x86_32_msvc The ones that are skipped because they are 'by request only' have to be explicitly asked for, because they rely on third party libraries which your system might not have or that you might not want the resulting binary to depend on. For instance to enable zlib support, add ``--with-zlib`` to your invocation of ``configure.py``. You can control which algorithms and modules are built using the options ``--enable-modules=MODS`` and ``--disable-modules=MODS``, for instance ``--enable-modules=zlib`` and ``--disable-modules=rc5,idea``. Modules not listed on the command line will simply be loaded if needed or if configured to load by default. If you use ``--no-autoload``, only the most core modules will be included; you can then explicitly enable things that you want to use with ``--enable-modules``. This is useful for creating a minimal build targeting to a specific application, especially in conjunction with the amalgamation option; see :ref:`amalgamation`. For instance:: $ ./configure.py --no-autoload --enable-modules=rsa,ecdsa,eme1,emsa1,emsa4 will set up a build that only includes RSA, ECDSA, and some padding modes, along with their dependencies. A small subset of core features, including AES, SHA-2, HMAC, and the multiple precision integer library, are always loaded. The script tries to guess what kind of makefile to generate, and it almost always guesses correctly (basically, Visual C++ uses NMAKE with Windows commands, and everything else uses Unix make with POSIX commands). Just in case, you can override it with ``--make-style=somestyle``. The styles Botan currently knows about are 'unix' (normal Unix makefiles), and 'nmake', the make variant commonly used by Windows compilers. To add a new variant (eg, a build script for VMS), you will need to create a new template file in ``src/build-data/makefile``. On Unix ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The basic build procedure on Unix and Unix-like systems is:: $ ./configure.py [--enable-modules=] [--cc=CC] $ make # You may need to set your LD_LIBRARY_PATH or equivalent for ./check to run $ make check # optional, but a good idea $ make install On Unix systems the script will default to using GCC; use ``--cc`` if you want something else. For instance use ``--cc=icc`` for Intel C++ and ``--cc=clang`` for Clang. The ``make install`` target has a default directory in which it will install Botan (typically ``/usr/local``). You can override this by using the ``--prefix`` argument to ``configure.py``, like so: ``./configure.py --prefix=/opt `` On some systems shared libraries might not be immediately visible to the runtime linker. For example, on Linux you may have to edit ``/etc/ld.so.conf`` and run ``ldconfig`` (as root) in order for new shared libraries to be picked up by the linker. An alternative is to set your ``LD_LIBRARY_PATH`` shell variable to include the directory that the Botan libraries were installed into. On Mac OS X ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In general the Unix instructions above should apply, however OS X does not support ``LD_LIBRARY_PATH``. Thomas Keller suggests instead running ``install_name_tool`` between building and running the self-test program:: $ VERSION=1.10.0 # or whatever the current version is $ install_name_tool -change $(otool -X -D libbotan-$VERSION.dylib) \ $PWD/libbotan-$VERSION.dylib check Building Universal Binaries &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& To build a universal binary for OS X, some simple modifications are required. First, create a CPU type for the target universalbinary, one that doesn't specify any special handlers. This is done by creating an empty file in src/build-data/arch:: $ touch src/build-data/arch/universalbinary.txt and then adding a special target for it in gcc, by adding the line:: universalbinary -> "-force_cpusubtype_ALL -mmacosx-version-min=10.4 -arch i386 -arch ppc" in the section marked `` in `src/build-data/cc/gcc.txt`. Then configure with:: $ ./configure.py --cpu=universalbinary [other options here] On MS Windows ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you don't want to deal with building botan on Windows, check the website; commonly prebuilt Windows binaries with installers are available, especially for stable versions. You need to have a copy of Python installed, and have both Python and your chosen compiler in your path. Open a command shell (or the SDK shell), and run:: > python configure.py --cc=msvc (or --cc=gcc for MinGW) [--cpu=CPU] > nmake > nmake check # optional, but recommended > nmake install For Win95 pre OSR2, the ``cryptoapi_rng`` module will not work, because CryptoAPI didn't exist. And all versions of NT4 lack the ToolHelp32 interface, which is how ``win32_stats`` does its slow polls, so a version of the library built with that module will not load under NT4. Later versions of Windows support both methods, so this shouldn't be much of an issue anymore. By default the install target will be ``C:\botan``; you can modify this with the ``--prefix`` option. When building your applications, all you have to do is tell the compiler to look for both include files and library files in ``C:\botan``, and it will find both. Or you can move them to a place where they will be in the default compiler search paths (consult your documentation and/or local expert for details). Other Build-Related Tasks ---------------------------------------- .. _building_docs: Building The Documentation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are two documentation options available, Sphinx and Doxygen. Sphinx will be used if ``sphinx-build`` is detected in the PATH, or if ``--with-sphinx`` is used at configure time. Doxygen is only enabled if ``--with-doxygen`` is used. Both are generated by the makefile target ``docs``. .. _amalgamation: The Amalgamation Build ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can also configure Botan to be built using only a single source file; this is quite convenient if you plan to embed the library into another application. To do so, run ``configure.py`` with whatever arguments you would ordinarily use, along with the option ``--gen-amalgamation``. This will create two (rather large) files, ``botan_all.h`` and ``botan_all.cpp``. Whenever you would have included a botan header, you can then include ``botan_all.h``, and include ``botan_all.cpp`` along with the rest of the source files in your build. If you want to be able to easily switch between amalgamated and non-amalgamated versions (for instance to take advantage of prepackaged versions of botan on operating systems that support it), you can instead ignore ``botan_all.h`` and use the headers from ``build/include`` as normal. You can also build the library as normal but using the amalgamation instead of the individual source files using ``--via-amalgamation``. This is essentially a very simple form of link time optimization; because the entire library source is visible to the compiler, it has more opportunities for interprocedural optimizations. Modules Relying on Third Party Libraries ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are a fairly large number of modules included with Botan. Some of these are extremely useful, while others are only necessary in very unusual circumstances. Most are loaded (or not) automatically as necessary, but some require external libraries are thus must be enabled at build time; these include: - ``--with-bzip2`` enables the filters providing bzip2 compression and decompression. Requires the bzip2 development libraries to be installed. - ``--with-zlib`` enables the filters providing zlib compression and decompression. Requires the zlib development libraries to be installed. - ``--with-gnump`` adds an alternative engine for public key cryptography that uses the GNU MP library. GNU MP 4.1 or later is required. - ``--with-openssl`` adds an engine that uses OpenSSL for some public key operations and ciphers/hashes. OpenSSL 0.9.7 or later is required. Note that OpenSSL's versions are not always faster than the versions built into botan. Multiple Builds ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It may be useful to run multiple builds with different configurations. Specify ``--build-dir=`` to set up a build environment in a different directory. .. _configure_with_python3: Configuring the Build With Python 3.1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The versions of Python beginning with 3 are (intentionally) incompatible with the (currently more common) 2.x series. If you want to use Python 3.1 to set up the build, you'll have to use the ``2to3`` program (included in the Python distribution) on the script; this will convert the script to the Python 3.x dialect:: $ python ./configure.py File "configure.py", line 860 except KeyError, e: ^ SyntaxError: invalid syntax $ # incompatible python version, let's fix it $ 2to3 -w configure.py [...] RefactoringTool: Files that were modified: RefactoringTool: configure.py $ python ./configure.py [...] Setting Distribution Info ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The build allows you to set some information about what distribution this build of the library comes from. It is particularly relevant to people packaging the library for wider distribution, to signify what distribution this build is from. Applications can test this value by checking the string value of the macro ``BOTAN_DISTRIBUTION_INFO``. It can be set using the ``--distribution-info`` flag to ``configure.py``, and otherwise defaults to "unspecified". For instance, a `Gentoo `_ ebuild might set it with ``--distribution-info="Gentoo ${PVR}"`` where ``${PVR}`` is an ebuild variable automatically set to a combination of the library and ebuild versions. Local Configuration Settings ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You may want to do something peculiar with the configuration; to support this there is a flag to ``configure.py`` called ``--with-local-config=``. The contents of the file are inserted into ``build/build.h`` which is (indirectly) included into every Botan header and source file. Configuration Parameters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are some configuration parameters which you may want to tweak before building the library. These can be found in ``config.h``. This file is overwritten every time the configure script is run (and does not exist until after you run the script for the first time). Also included in ``build/build.h`` are macros which let applications check which features are included in the current version of the library. All of them begin with ``BOTAN_HAS_``. For example, if ``BOTAN_HAS_BLOWFISH`` is defined, then an application can include ```` and use the Blowfish class. ``BOTAN_MP_WORD_BITS``: This macro controls the size of the words used for calculations with the MPI implementation in Botan. You can choose 8, 16, 32, or 64. Normally this defaults to either 32 or 64, depending on the processor. Unless you are building for a 8 or 16-bit CPU, this isn't worth messing with. ``BOTAN_VECTOR_OVER_ALLOCATE``: The memory container ``SecureVector`` will over-allocate requests by this amount (in elements). In several areas of the library, we grow a vector fairly often. By over-allocating by a small amount, we don't have to do allocations as often (which is good, because the allocators can be quite slow). If you *really* want to reduce memory usage, set it to 0. Otherwise, the default should be perfectly fine. ``BOTAN_DEFAULT_BUFFER_SIZE``: This constant is used as the size of buffers throughout Botan. A good rule of thumb would be to use the page size of your machine. The default should be fine for most purposes. Building Applications ---------------------------------------- Unix ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Botan usually links in several different system libraries (such as ``librt`` and ``libz``), depending on which modules are configured at compile time. In many environments, particularly ones using static libraries, an application has to link against the same libraries as Botan for the linking step to succeed. But how does it figure out what libraries it *is* linked against? The answer is to ask the ``botan-config`` script. This basically solves the same problem all the other ``*-config`` scripts solve, and in basically the same manner. There are 4 options: ``--prefix[=DIR]``: If no argument, print the prefix where Botan is installed (such as ``/opt`` or ``/usr/local``). If an argument is specified, other options given with the same command will execute as if Botan as actually installed at ``DIR`` and not where it really is; or at least where ``botan-config`` thinks it really is. I should mention that it ``--version``: Print the Botan version number. ``--cflags``: Print options that should be passed to the compiler whenever a C++ file is compiled. Typically this is used for setting include paths. ``--libs``: Print options for which libraries to link to (this includes ``-lbotan``). Your ``Makefile`` can run ``botan-config`` and get the options necessary for getting your application to compile and link, regardless of whatever crazy libraries Botan might be linked against. Botan also by default installs a file for ``pkg-config``, namespaced by the major and minor versions. So it can be used, for instance, as:: $ pkg-config botan-1.10 --modversion 1.10.0 $ pkg-config botan-1.10 --cflags -I/usr/local/include $ pkg-config botan-1.10 --libs -L/usr/local/lib -lbotan -lm -lbz2 -lpthread -lrt MS Windows ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ No special help exists for building applications on Windows. However, given that typically Windows software is distributed as binaries, this is less of a problem - only the developer needs to worry about it. As long as they can remember where they installed Botan, they just have to set the appropriate flags in their Makefile/project file. Language Wrappers ---------------------------------------- Building the Python wrappers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The Python wrappers for Botan use Boost.Python, so you must have Boost installed. To build the wrappers, pass the flag ``--with-boost-python`` to ``configure.py``. This will create a second makefile, ``Makefile.python``, with instructions for building the Python module. After building the library, execute:: $ make -f Makefile.python to build the module. Currently only Unix systems are supported, and the Makefile assumes that the version of Python you want to build against is the same one you used to run ``configure.py``. To install the module, use the ``install`` target. See :doc:`Python Bindings ` for more information about the binding. Building the Perl XS wrappers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To build the Perl XS wrappers, change your directory to ``src/wrap/perl-xs`` and run ``perl Makefile.PL``, then run ``make`` to build the module and ``make test`` to run the test suite:: $ perl Makefile.PL Checking if your kit is complete... Looks good Writing Makefile for Botan $ make cp Botan.pm blib/lib/Botan.pm AutoSplitting blib/lib/Botan.pm (blib/lib/auto/Botan) /usr/bin/perl5.8.8 /usr/lib64/perl5/5.8.8/ExtUtils/xsubpp [...] g++ -c -Wno-write-strings -fexceptions -g [...] Running Mkbootstrap for Botan () chmod 644 Botan.bs rm -f blib/arch/auto/Botan/Botan.so g++ -shared Botan.o -o blib/arch/auto/Botan/Botan.so \ -lbotan -lbz2 -lpthread -lrt -lz \ chmod 755 blib/arch/auto/Botan/Botan.so cp Botan.bs blib/arch/auto/Botan/Botan.bs chmod 644 blib/arch/auto/Botan/Botan.bs Manifying blib/man3/Botan.3pm $ make test PERL_DL_NONLAZY=1 /usr/bin/perl5.8.8 [...] t/base64......ok t/filt........ok t/hex.........ok t/oid.........ok t/pipe........ok t/x509cert....ok All tests successful. Files=6, Tests=83, 0 wallclock secs ( 0.08 cusr + 0.02 csys = 0.10 CPU) Botan-1.10.12/doc/conf.py0000664000175000017500000001720012654331322014630 0ustar jackjack00000000000000# -*- coding: utf-8 -*- # # botan documentation build configuration file, created by # sphinx-quickstart on Sun Apr 3 11:41:06 2011. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os sys.path.insert(0, os.pardir) # Avoid useless botan_version.pyc (Python 2.6 or higher) if 'dont_write_bytecode' in sys.__dict__: sys.dont_write_bytecode = True import botan_version # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. needs_sphinx = '1.0' """ Assert that we are running under Sphinx 1.0.7 or later. Earlier versions have bugs in the C++ domain that cause crashes. And needs_sphinx only allows us to assert needing a particular major/minor version. """ def check_sphinx_version(): import sphinx version = map(int, sphinx.__version__.split('.')) if version[0] == 1 and version[1] == 0 and version[2] < 7: # Exit rather than throwing to avoid a confusing backtrace print "This Sphinx is too old - upgrade to at least 1.0.7" import sys sys.exit(1) check_sphinx_version() # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.txt' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'contents' # General information about the project. project = u'botan' copyright = u'2000-2011, Jack Lloyd' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '%d.%d' % (botan_version.release_major, botan_version.release_minor) # The full version, including alpha/beta/rc tags. release = '%d.%d.%d' % (botan_version.release_major, botan_version.release_minor, botan_version.release_patch) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. today_fmt = '%Y-%m-%d' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = False # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False highlight_language = 'cpp' # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'agogo' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = { 'linkcolor': 'blue', 'headerlinkcolor': 'blue', 'headercolor1': 'darkblue', 'headercolor2': 'darkblue', 'textalign': 'left' } # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". html_title = 'Botan' # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'botandoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('contents', 'botan.tex', u'botan Reference Manual', u'Jack Lloyd', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. latex_show_pagerefs = False # If true, show URL addresses after external links. latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True Botan-1.10.12/doc/contents.txt0000664000175000017500000000067112654331322015733 0ustar jackjack00000000000000 Contents ================================= .. toctree:: :maxdepth: 2 index reading building firststep filters pubkey x509 ssl bigint lowlevel secmem kdf pbkdf passhash rng fpe python .. toctree:: :hidden: log license credits faq users support download pgpkey algos build_log Indices and tables ================== * :ref:`genindex` * :ref:`search` Botan-1.10.12/doc/credits.txt0000664000175000017500000000366112654331322015535 0ustar jackjack00000000000000 Credits ======================================== This is at least a partial credits-file of people that have contributed to botan. It is sorted by name and formatted to allow easy grepping and beautification by scripts. The fields are name (N), email (E), web-address (W), PGP key ID and fingerprint (P), description (D), and snail-mail address (S). :: N: Charles Brockman W: http://www.securitygenetics.com/ D: documentation editing S: Oregon, USA N: Martin Doering E: doering@cdc.informatik.tu-darmstadt.de D: GF(p) arithmetic N: Olivier de Gaalon D: SQLite encryption codec (src/wrap/sqlite) N: Matthew Gregan D: Binary file I/O support, allocator fixes N: Hany Greiss D: Windows porting N: Manuel Hartl E: hartl@flexsecure.de W: http://www.flexsecure.de/ D: ECDSA, ECDH N: Yves Jerschow E: yves.jerschow@uni-duesseldorf.de D: Optimizations for memory load/store and HMAC D: Support for IPv4 addresses in X.509 alternative names S: Germany N: Matt Johnston D: Allocator fixes and optimizations, decompressor fixes N: Peter J. Jones E: pjones@pmade.org D: Bzip2 compression module S: Colorado, USA N: Justin Karneges D: Qt support modules (mutexes and types), X.509 API design N: Jack Lloyd E: lloyd@randombit.net W: http://www.randombit.net/ P: 3F69 2E64 6D92 3BBE E7AE 9258 5C0F 96E8 4EC1 6D6B D: Original designer/author, maintainer 2001-current S: Vermont, USA N: Joel Low D: DLL symbol visibility and Windows DLL support in general N: Christoph Ludwig E: ludwig@fh-worms.de D: GP(p) arithmetic N: Vaclav Ovsik E: vaclav.ovsik@i.cz D: Perl XS module (src/wrap/perl-xs) N: Luca Piccarreta E: luca.piccarreta@gmail.com D: x86/amd64 assembler, BigInt optimizations, Win32 mutex module S: Italy N: Falko Strenzke E: strenzke@flexsecure.de W: http://www.flexsecure.de/ D: GF(p) arithmetic, CVC, Shanks-Tonelli algorithm S: Darmstadt, Germany Botan-1.10.12/doc/download.txt0000664000175000017500000000647412654331322015714 0ustar jackjack00000000000000 Getting The Latest Sources ======================================== All releases are signed with a :doc:`PGP key `. Unsure which release you want? Check the :ref:`FAQ `. .. only:: not website .. note:: If you are viewing this documentation offline, a more recent release `may be available `_ Current Stable Release (1.10) ---------------------------------------- The current stable release is `1.10.3 `_ which was released on 2012-07-10. Sources: `1.10.3 tar/gz `_ (`1.10.3 tar/gz sig `_), `1.10.3 tar/bzip `_ (`1.10.3 tar/bzip sig `_) .. Windows binary installer for use with Visual C++ 2010: `1.10.1 x86-32 installer `_ `1.10.1 x86-64 installer `_ Previous Stable Release (1.8) ---------------------------------------- The previous stable release is `1.8.13 `_ which was released on 2011-07-02. Sources: `1.8.13 tar/gz `_ (`1.8.13 tar/gz sig `_), `1.8.13 tar/bzip `_ (`1.8.13 tar/bzip sig `_) .. Windows binary installer for use with Visual C++ 2008: `1.8.13 x86-32 installer `_ `1.8.13 x86-64 installer `_ Accessing Version Control ---------------------------------------- Botan's development occurs using a distributed version control system called `Monotone `_. The main branch of development occurs on the branch named ``net.randombit.botan``; this is probably the branch you want (for 1.8, use ``net.randombit.botan.1_8`` instead). To download that branch and set up a new workspace, run:: $ mtn db init --db=botan.mtn $ mtn pull --db=botan.mtn randombit.net 'net.randombit.botan' [...] $ mtn checkout --db=botan.mtn --branch=net.randombit.botan [...] By default the ``checkout`` command will place the workspace in a directory with the same name as the branch you are checking out. If you want a different directory name, just include it after the ``--branch`` option (you can also rename this directory at any time). If this is the first time you've connected to the server, Monotone will print:: mtn: first time connecting to server randombit.net mtn: I'll assume it's really them, but you might want to double-check mtn: their key's fingerprint: 8c0b868f2247215c63c96983b1c8ca0f0f0cfd9a The fingerprint shown above was the correct one as of September 21, 2010. To pull further changes, from anywhere in the workspace run these commands:: $ mtn pull [...] $ mtn update [summary of changes] The ``mtn update`` command will give you a summary of which files changed; to view the full changelog, run ``mtn log``. Botan-1.10.12/doc/examples/GNUmakefile0000664000175000017500000000053512654331322017224 0ustar jackjack00000000000000 BOTAN_CONFIG = botan-config CXX = g++ CFLAGS = -O2 -ansi -W -Wall -I../../build/include LIBS = -L../.. -lbotan-1.10 SRCS=$(wildcard *.cpp) PROGS=$(patsubst %.cpp,%,$(SRCS)) all: $(PROGS) clean: @rm -f $(PROGS) %: %.cpp $(CXX) $(CFLAGS) $? $(LIBS) -o $@ eax_test: eax_test.cpp $(CXX) $(CFLAGS) $? $(LIBS) -lboost_regex -o $@ Botan-1.10.12/doc/examples/asn1.cpp0000664000175000017500000002051412654331322016517 0ustar jackjack00000000000000#include #include #include #include #include #include #include #include using namespace Botan; #include #include // Set this if your terminal understands UTF-8; otherwise output is in Latin-1 #define UTF8_TERMINAL 1 /* What level the outermost layer of stuff is at. Probably 0 or 1; asn1parse uses 0 as the outermost, while 1 makes more sense to me. 2+ doesn't make much sense at all. */ #define INITIAL_LEVEL 0 void decode(BER_Decoder&, size_t); void emit(const std::string&, size_t, size_t, const std::string& = ""); std::string type_name(ASN1_Tag); int main(int argc, char* argv[]) { if(argc != 2) { printf("Usage: %s \n", argv[0]); return 1; } LibraryInitializer init; try { DataSource_Stream in(argv[1]); if(!PEM_Code::matches(in)) { BER_Decoder decoder(in); decode(decoder, INITIAL_LEVEL); } else { std::string label; // ignored BER_Decoder decoder(PEM_Code::decode(in, label)); decode(decoder, INITIAL_LEVEL); } } catch(std::exception& e) { printf("%s\n", e.what()); return 1; } return 0; } void decode(BER_Decoder& decoder, size_t level) { BER_Object obj = decoder.get_next_object(); while(obj.type_tag != NO_OBJECT) { const ASN1_Tag type_tag = obj.type_tag; const ASN1_Tag class_tag = obj.class_tag; const size_t length = obj.value.size(); /* hack to insert the tag+length back in front of the stuff now that we've gotten the type info */ DER_Encoder encoder; encoder.add_object(type_tag, class_tag, obj.value, obj.value.size()); SecureVector bits = encoder.get_contents(); BER_Decoder data(bits); if(class_tag & CONSTRUCTED) { BER_Decoder cons_info(obj.value); if(type_tag == SEQUENCE) { emit("SEQUENCE", level, length); decode(cons_info, level+1); } else if(type_tag == SET) { emit("SET", level, length); decode(cons_info, level+1); } else { std::string name; if((class_tag & APPLICATION) || (class_tag & CONTEXT_SPECIFIC) || (class_tag & PRIVATE)) { name = "cons [" + to_string(type_tag) + "]"; if(class_tag & APPLICATION) name += " appl"; if(class_tag & CONTEXT_SPECIFIC) name += " context"; if(class_tag & PRIVATE) name += " private"; } else name = type_name(type_tag) + " (cons)"; emit(name, level, length); decode(cons_info, level+1); } } else if(class_tag == APPLICATION || class_tag == CONTEXT_SPECIFIC || class_tag == PRIVATE) { bool not_text = false; for(size_t i = 0; i != bits.size(); ++i) if(!isgraph(bits[i]) && !isspace(bits[i])) not_text = true; Pipe pipe(((not_text) ? new Hex_Encoder : 0)); pipe.process_msg(bits); emit("[" + to_string(type_tag) + "]", level, length, pipe.read_all_as_string()); } else if(type_tag == OBJECT_ID) { OID oid; data.decode(oid); std::string out = OIDS::lookup(oid); if(out != oid.as_string()) out += " [" + oid.as_string() + "]"; emit(type_name(type_tag), level, length, out); } else if(type_tag == INTEGER) { BigInt number; data.decode(number); SecureVector rep; /* If it's small, it's probably a number, not a hash */ if(number.bits() <= 16) rep = BigInt::encode(number, BigInt::Decimal); else rep = BigInt::encode(number, BigInt::Hexadecimal); std::string str; for(size_t i = 0; i != rep.size(); ++i) str += (char)rep[i]; emit(type_name(type_tag), level, length, str); } else if(type_tag == BOOLEAN) { bool boolean; data.decode(boolean); emit(type_name(type_tag), level, length, (boolean ? "true" : "false")); } else if(type_tag == NULL_TAG) { emit(type_name(type_tag), level, length); } else if(type_tag == OCTET_STRING) { SecureVector bits; data.decode(bits, type_tag); bool not_text = false; for(size_t i = 0; i != bits.size(); ++i) if(!isgraph(bits[i]) && !isspace(bits[i])) not_text = true; Pipe pipe(((not_text) ? new Hex_Encoder : 0)); pipe.process_msg(bits); emit(type_name(type_tag), level, length, pipe.read_all_as_string()); } else if(type_tag == BIT_STRING) { SecureVector bits; data.decode(bits, type_tag); std::vector bit_set; for(size_t i = 0; i != bits.size(); ++i) for(size_t j = 0; j != 8; ++j) bit_set.push_back((bool)((bits[bits.size()-i-1] >> (7-j)) & 1)); std::string bit_str; for(size_t i = 0; i != bit_set.size(); ++i) { bool the_bit = bit_set[bit_set.size()-i-1]; if(!the_bit && bit_str.size() == 0) continue; bit_str += (the_bit ? "1" : "0"); } emit(type_name(type_tag), level, length, bit_str); } else if(type_tag == PRINTABLE_STRING || type_tag == NUMERIC_STRING || type_tag == IA5_STRING || type_tag == T61_STRING || type_tag == VISIBLE_STRING || type_tag == UTF8_STRING || type_tag == BMP_STRING) { ASN1_String str; data.decode(str); if(UTF8_TERMINAL) emit(type_name(type_tag), level, length, Charset::transcode(str.iso_8859(), LATIN1_CHARSET, UTF8_CHARSET)); else emit(type_name(type_tag), level, length, str.iso_8859()); } else if(type_tag == UTC_TIME || type_tag == GENERALIZED_TIME) { X509_Time time; data.decode(time); emit(type_name(type_tag), level, length, time.readable_string()); } else fprintf(stderr, "Unknown tag: class=%02X, type=%02X\n", class_tag, type_tag); obj = decoder.get_next_object(); } } void emit(const std::string& type, size_t level, size_t length, const std::string& value) { const size_t LIMIT = 128; const size_t BIN_LIMIT = 64; int written = 0; written += printf(" d=%2d, l=%4d: ", (int)level, (int)length); for(size_t i = INITIAL_LEVEL; i != level; ++i) written += printf(" "); written += printf("%s ", type.c_str()); bool should_skip = false; if(value.length() > LIMIT) should_skip = true; if((type == "OCTET STRING" || type == "BIT STRING") && value.length() > BIN_LIMIT) should_skip = true; if(value != "" && !should_skip) { if(written % 2 == 0) printf(" "); while(written < 50) written += printf(" "); printf(":%s\n", value.c_str()); } else printf("\n"); } std::string type_name(ASN1_Tag type) { if(type == PRINTABLE_STRING) return "PRINTABLE STRING"; if(type == NUMERIC_STRING) return "NUMERIC STRING"; if(type == IA5_STRING) return "IA5 STRING"; if(type == T61_STRING) return "T61 STRING"; if(type == UTF8_STRING) return "UTF8 STRING"; if(type == VISIBLE_STRING) return "VISIBLE STRING"; if(type == BMP_STRING) return "BMP STRING"; if(type == UTC_TIME) return "UTC TIME"; if(type == GENERALIZED_TIME) return "GENERALIZED TIME"; if(type == OCTET_STRING) return "OCTET STRING"; if(type == BIT_STRING) return "BIT STRING"; if(type == INTEGER) return "INTEGER"; if(type == NULL_TAG) return "NULL"; if(type == OBJECT_ID) return "OBJECT"; if(type == BOOLEAN) return "BOOLEAN"; return "(UNKNOWN)"; } Botan-1.10.12/doc/examples/base64.cpp0000664000175000017500000000375512654331322016751 0ustar jackjack00000000000000/* * Encode/decode base64 strings * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include int main(int argc, char* argv[]) { if(argc < 2) { std::cout << "Usage: " << argv[0] << " [-w] [-c n] [-e|-d] files...\n" " -e : Encode input to base64 strings (default) \n" " -d : Decode base64 input\n" " -w : Wrap lines\n" " -c n: Wrap lines at column n, default 78\n"; return 1; } Botan::LibraryInitializer init; int column = 78; bool wrap = false; bool encoding = true; std::vector files; for(int j = 1; argv[j] != 0; j++) { std::string this_arg = argv[j]; if(this_arg == "-w") wrap = true; else if(this_arg == "-e"); else if(this_arg == "-d") encoding = false; else if(this_arg == "-c") { if(argv[j+1]) { column = atoi(argv[j+1]); j++; } else { std::cout << "No argument for -c option" << std::endl; return 1; } } else files.push_back(argv[j]); } for(unsigned int j = 0; j != files.size(); j++) { std::istream* stream; if(files[j] == "-") stream = &std::cin; else stream = new std::ifstream(files[j].c_str()); if(!*stream) { std::cout << "ERROR, couldn't open " << files[j] << std::endl; continue; } Botan::Pipe pipe((encoding) ? ((Botan::Filter*)new Botan::Base64_Encoder(wrap, column)) : ((Botan::Filter*)new Botan::Base64_Decoder)); pipe.start_msg(); *stream >> pipe; pipe.end_msg(); pipe.set_default_msg(j); std::cout << pipe; if(files[j] != "-") delete stream; } return 0; } Botan-1.10.12/doc/examples/bcrypt.cpp0000664000175000017500000000146512654331322017164 0ustar jackjack00000000000000#include #include #include using namespace Botan; int main(int argc, char* argv[]) { if(argc != 2 && argc != 3) { std::cout << "Usage: " << argv[0] << " password\n" << " " << argv[0] << " password passhash\n"; return 1; } LibraryInitializer init; if(argc == 2) { AutoSeeded_RNG rng; std::cout << generate_bcrypt(argv[1], rng, 12) << "\n"; } else if(argc == 3) { if(strlen(argv[2]) != 60) { std::cout << "Note: hash " << argv[2] << " has wrong length and cannot be valid\n"; } const bool ok = check_bcrypt(argv[1], argv[2]); std::cout << "Password is " << (ok ? "valid" : "NOT valid") << "\n"; } return 0; } Botan-1.10.12/doc/examples/bench.cpp0000664000175000017500000000351012654331322016731 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include using namespace Botan; #include namespace { const std::string algos[] = { "AES-128", "AES-192", "AES-256", "Blowfish", "CAST-128", "CAST-256", "DES", "DESX", "TripleDES", "GOST", "IDEA", "KASUMI", "Lion(SHA-256,Turing,8192)", "Luby-Rackoff(SHA-512)", "MARS", "MISTY1", "Noekeon", "RC2", "RC5(12)", "RC5(16)", "RC6", "SAFER-SK(10)", "SEED", "Serpent", "Skipjack", "Square", "TEA", "Twofish", "XTEA", "Adler32", "CRC32", "GOST-34.11", "HAS-160", "MD2", "MD4", "MD5", "RIPEMD-128", "RIPEMD-160", "SHA-160", "SHA-256", "SHA-384", "SHA-512", "Skein-512", "Tiger", "Whirlpool", "CMAC(AES-128)", "HMAC(SHA-1)", "X9.19-MAC", "", }; void benchmark_algo(const std::string& algo, RandomNumberGenerator& rng) { u32bit milliseconds = 1000; Algorithm_Factory& af = global_state().algorithm_factory(); std::map speeds = algorithm_benchmark(algo, af, rng, milliseconds, 16); std::cout << algo << ":"; for(std::map::const_iterator i = speeds.begin(); i != speeds.end(); ++i) { std::cout << " " << i->second << " [" << i->first << "]"; } std::cout << "\n"; } } int main(int argc, char* argv[]) { LibraryInitializer init; AutoSeeded_RNG rng; if(argc == 1) // no args, benchmark everything { for(u32bit i = 0; algos[i] != ""; ++i) benchmark_algo(algos[i], rng); } else { for(int i = 1; argv[i]; ++i) benchmark_algo(argv[i], rng); } } Botan-1.10.12/doc/examples/benchmark.cpp0000664000175000017500000000177012654331322017612 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include int main(int argc, char* argv[]) { if(argc <= 2) { std::cout << "Usage: " << argv[0] << " seconds ...\n"; return 1; } Botan::LibraryInitializer init; Botan::AutoSeeded_RNG rng; Botan::Algorithm_Factory& af = Botan::global_state().algorithm_factory(); double ms = 1000 * std::atof(argv[1]); for(size_t i = 2; argv[i]; ++i) { std::string algo = argv[i]; std::map results = algorithm_benchmark(algo, af, rng, ms, 16); std::cout << algo << ":\n"; for(std::map::iterator r = results.begin(); r != results.end(); ++r) { std::cout << " " << r->first << ": " << r->second << " MiB/s\n"; } std::cout << "\n"; } } Botan-1.10.12/doc/examples/bzip.cpp0000664000175000017500000000630112654331322016617 0ustar jackjack00000000000000/* * Bzip2 Compression/Decompression * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include /* * If Bzip2 isn't included, we know nothing works at compile time, but * we wait to fail at runtime. Otherwise I would get 2-3 mails a month * about how this was failing to compile (even with an informative * #error message explaining the situation) because bzip2 wasn't * included in the build. */ #if defined(BOTAN_HAS_COMPRESSOR_BZIP2) #include #endif const std::string SUFFIX = ".bz2"; int main(int argc, char* argv[]) { if(argc < 2) { std::cout << "Usage: " << argv[0] << " [-s] [-d] [-1...9] " << std::endl; return 1; } Botan::LibraryInitializer init; std::vector files; bool decompress = false, small = false; int level = 9; for(int j = 1; argv[j] != 0; j++) { if(std::strcmp(argv[j], "-d") == 0) { decompress = true; continue; } if(std::strcmp(argv[j], "-s") == 0) { small = true; continue; } if(std::strcmp(argv[j], "-1") == 0) { level = 1; continue; } if(std::strcmp(argv[j], "-2") == 0) { level = 2; continue; } if(std::strcmp(argv[j], "-3") == 0) { level = 3; continue; } if(std::strcmp(argv[j], "-4") == 0) { level = 4; continue; } if(std::strcmp(argv[j], "-5") == 0) { level = 5; continue; } if(std::strcmp(argv[j], "-6") == 0) { level = 6; continue; } if(std::strcmp(argv[j], "-7") == 0) { level = 7; continue; } if(std::strcmp(argv[j], "-8") == 0) { level = 8; continue; } if(std::strcmp(argv[j], "-9") == 0) { level = 9; continue; } files.push_back(argv[j]); } try { Botan::Filter* bzip = 0; #ifdef BOTAN_HAS_COMPRESSOR_BZIP2 if(decompress) bzip = new Botan::Bzip_Decompression(small); else bzip = new Botan::Bzip_Compression(level); #endif if(!bzip) { std::cout << "Sorry, support for bzip2 not compiled into Botan\n"; return 1; } Botan::Pipe pipe(bzip); for(unsigned int j = 0; j != files.size(); j++) { std::string infile = files[j], outfile = files[j]; if(!decompress) outfile = outfile += SUFFIX; else outfile = outfile.replace(outfile.find(SUFFIX), SUFFIX.length(), ""); std::ifstream in(infile.c_str(), std::ios::binary); std::ofstream out(outfile.c_str(), std::ios::binary); if(!in) { std::cout << "ERROR: could not read " << infile << std::endl; continue; } if(!out) { std::cout << "ERROR: could not write " << outfile << std::endl; continue; } pipe.start_msg(); in >> pipe; pipe.end_msg(); pipe.set_default_msg(j); out << pipe; in.close(); out.close(); } } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; return 1; } return 0; } Botan-1.10.12/doc/examples/ca.cpp0000664000175000017500000000274512654331322016246 0ustar jackjack00000000000000#include #include #include using namespace Botan; #include #include int main(int argc, char* argv[]) { if(argc != 5) { std::cout << "Usage: " << argv[0] << " " << " " << std::endl; return 1; } Botan::LibraryInitializer init; try { const std::string arg_passphrase = argv[1]; const std::string arg_ca_cert = argv[2]; const std::string arg_ca_key = argv[3]; const std::string arg_req_file = argv[4]; AutoSeeded_RNG rng; X509_Certificate ca_cert(arg_ca_cert); std::auto_ptr privkey( PKCS8::load_key(arg_ca_key, rng, arg_passphrase) ); X509_CA ca(ca_cert, *privkey, "SHA-256"); // got a request PKCS10_Request req(arg_req_file); // you would insert checks here, and perhaps modify the request // (this example should be extended to show how) // now sign the request X509_Time start_time(system_time()); X509_Time end_time(system_time() + 365 * 60 * 60 * 24); X509_Certificate new_cert = ca.sign_request(req, rng, start_time, end_time); // send the new cert back to the requestor std::cout << new_cert.PEM_encode(); } catch(std::exception& e) { std::cout << e.what() << std::endl; return 1; } return 0; } Botan-1.10.12/doc/examples/cert_verify.cpp0000664000175000017500000000124512654331322020176 0ustar jackjack00000000000000/* * Simple example of a certificate validation * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include using namespace Botan; int main() { LibraryInitializer init; X509_Certificate ca_cert("ca_cert.pem"); X509_Certificate subject_cert("http_cert.pem"); X509_Store cert_store; cert_store.add_cert(ca_cert, /*trusted=*/true); X509_Code code = cert_store.validate_cert(subject_cert); if(code == VERIFIED) printf("Cert validated\n"); else printf("Cert did not validate, code = %d\n", code); return 0; } Botan-1.10.12/doc/examples/checksum.cpp0000664000175000017500000000150712654331322017460 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include using namespace Botan; int main(int argc, char* argv[]) { if(argc != 2) { std::cout << "Usage: " << argv[0] << " filename\n"; return 1; } Botan::LibraryInitializer init; Pipe pipe(new Fork( new Chain(new Hash_Filter("CRC24"), new Hex_Encoder), new Chain(new Hash_Filter("CRC32"), new Hex_Encoder), new Chain(new Hash_Filter("Adler32"), new Hex_Encoder) )); DataSource_Stream in(argv[1]); pipe.process_msg(in); std::cout << pipe.read_all_as_string(0) << "\n"; std::cout << pipe.read_all_as_string(1) << "\n"; std::cout << pipe.read_all_as_string(2) << "\n"; } Botan-1.10.12/doc/examples/cpuid.cpp0000664000175000017500000000225012654331322016756 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include using namespace Botan; namespace { void print_if_feature(const std::string& feature_name, bool exists) { std::cout << (exists ? '+' : '-') << " " << feature_name << "\n"; } void print_header(const std::string& descr) { std::cout << "\n" << descr << "\n-----\n"; } } int main() { CPUID::initialize(); std::cout << "Cache line size = " << CPUID::cache_line_size() << "\n"; print_header("SIMD instruction sets"); print_if_feature("SSE2", CPUID::has_sse2()); print_if_feature("SSSE3", CPUID::has_ssse3()); print_if_feature("SSE4.1", CPUID::has_sse41()); print_if_feature("SSE4.2", CPUID::has_sse42()); print_if_feature("AVX", CPUID::has_avx()); print_if_feature("AltiVec", CPUID::has_altivec()); print_header("Other extensions"); print_if_feature("RDTSC", CPUID::has_rdtsc()); print_if_feature("PCMUL", CPUID::has_pcmuludq()); print_if_feature("AES-NI", CPUID::has_aes_ni()); print_if_feature("RDRND", CPUID::has_rdrand()); print_if_feature("MOVBE", CPUID::has_movbe()); } Botan-1.10.12/doc/examples/cryptobox.cpp0000664000175000017500000000227512654331322017712 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include using namespace Botan; int main(int argc, char* argv[]) { LibraryInitializer init; AutoSeeded_RNG rng; if(argc != 3) { std::cout << "Usage: cryptobox pass filename\n"; return 1; } std::string pass = argv[1]; std::string filename = argv[2]; std::ifstream input(filename.c_str(), std::ios::binary); std::vector file_contents; while(input.good()) { byte filebuf[4096] = { 0 }; input.read((char*)filebuf, sizeof(filebuf)); size_t got = input.gcount(); file_contents.insert(file_contents.end(), filebuf, filebuf+got); } std::string ciphertext = CryptoBox::encrypt(&file_contents[0], file_contents.size(), pass, rng); std::cout << ciphertext; /* std::cout << CryptoBox::decrypt((const byte*)&ciphertext[0], ciphertext.length(), pass); */ } Botan-1.10.12/doc/examples/decrypt.cpp0000664000175000017500000001063312654331322017330 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ /* Decrypt files encrypted with the 'encrypt' example application. I'm being lazy and writing the output to stdout rather than stripping off the ".enc" suffix and writing it there. So all diagnostics go to stderr so there is no confusion. */ #include #include #include #include #include #include #include #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) #include #endif using namespace Botan; SecureVector b64_decode(const std::string&); int main(int argc, char* argv[]) { if(argc < 2) { std::cout << "Usage: " << argv[0] << " [-p passphrase] file\n" << " -p : Use this passphrase to decrypt\n"; return 1; } Botan::LibraryInitializer init; std::string filename, passphrase; for(int j = 1; argv[j] != 0; j++) { if(std::strcmp(argv[j], "-p") == 0) { if(argv[j+1]) { passphrase = argv[j+1]; j++; } else { std::cout << "No argument for -p option" << std::endl; return 1; } } else { if(filename != "") { std::cout << "You can only specify one file at a time\n"; return 1; } filename = argv[j]; } } if(passphrase == "") { std::cout << "You have to specify a passphrase!" << std::endl; return 1; } std::ifstream in(filename.c_str()); if(!in) { std::cout << "ERROR: couldn't open " << filename << std::endl; return 1; } std::string algo; try { std::string header, salt_str, mac_str; std::getline(in, header); std::getline(in, algo); std::getline(in, salt_str); std::getline(in, mac_str); if(header != "-------- ENCRYPTED FILE --------") { std::cout << "ERROR: File is missing the usual header" << std::endl; return 1; } const BlockCipher* cipher_proto = global_state().algorithm_factory().prototype_block_cipher(algo); if(!cipher_proto) { std::cout << "Don't know about the block cipher \"" << algo << "\"\n"; return 1; } const u32bit key_len = cipher_proto->maximum_keylength(); const u32bit iv_len = cipher_proto->block_size(); std::auto_ptr pbkdf(get_pbkdf("PBKDF2(SHA-1)")); const u32bit PBKDF2_ITERATIONS = 8192; SecureVector salt = b64_decode(salt_str); SymmetricKey bc_key = pbkdf->derive_key(key_len, "BLK" + passphrase, &salt[0], salt.size(), PBKDF2_ITERATIONS); InitializationVector iv = pbkdf->derive_key(iv_len, "IVL" + passphrase, &salt[0], salt.size(), PBKDF2_ITERATIONS); SymmetricKey mac_key = pbkdf->derive_key(16, "MAC" + passphrase, &salt[0], salt.size(), PBKDF2_ITERATIONS); Pipe pipe(new Base64_Decoder, get_cipher(algo + "/CBC", bc_key, iv, DECRYPTION), #ifdef BOTAN_HAS_COMPRESSOR_ZLIB new Zlib_Decompression, #endif new Fork( 0, new Chain(new MAC_Filter("HMAC(SHA-1)", mac_key), new Base64_Encoder) ) ); pipe.start_msg(); in >> pipe; pipe.end_msg(); std::string our_mac = pipe.read_all_as_string(1); if(our_mac != mac_str) std::cout << "WARNING: MAC in message failed to verify\n"; std::cout << pipe.read_all_as_string(0); } catch(Algorithm_Not_Found) { std::cout << "Don't know about the block cipher \"" << algo << "\"\n"; return 1; } catch(Decoding_Error) { std::cout << "Bad passphrase or corrupt file\n"; return 1; } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; return 1; } return 0; } SecureVector b64_decode(const std::string& in) { Pipe pipe(new Base64_Decoder); pipe.process_msg(in); return pipe.read_all(); } Botan-1.10.12/doc/examples/dh.cpp0000664000175000017500000000346112654331322016252 0ustar jackjack00000000000000#include #include #include using namespace Botan; #include #include int main() { try { LibraryInitializer init; AutoSeeded_RNG rng; // Alice and Bob agree on a DH domain to use DL_Group shared_domain("modp/ietf/2048"); // Alice creates a DH key DH_PrivateKey private_a(rng, shared_domain); // Bob creates a key with a matching group DH_PrivateKey private_b(rng, shared_domain); // Alice sends to Bob her public key and a session parameter MemoryVector public_a = private_a.public_value(); const std::string session_param = "Alice and Bob's shared session parameter"; // Bob sends his public key to Alice MemoryVector public_b = private_b.public_value(); // Now Alice performs the key agreement operation PK_Key_Agreement ka_alice(private_a, "KDF2(SHA-256)"); SymmetricKey alice_key = ka_alice.derive_key(32, public_b, session_param); // Bob does the same: PK_Key_Agreement ka_bob(private_b, "KDF2(SHA-256)"); SymmetricKey bob_key = ka_bob.derive_key(32, public_a, session_param); if(alice_key == bob_key) { std::cout << "The two keys matched, everything worked\n"; std::cout << "The shared key was: " << alice_key.as_string() << "\n"; } else { std::cout << "The two keys didn't match! Hmmm...\n"; std::cout << "Alice's key was: " << alice_key.as_string() << "\n"; std::cout << "Bob's key was: " << bob_key.as_string() << "\n"; } // Now use the shared key for encryption or MACing or whatever } catch(std::exception& e) { std::cout << e.what() << std::endl; return 1; } return 0; } Botan-1.10.12/doc/examples/dsa_kgen.cpp0000664000175000017500000000203512654331322017426 0ustar jackjack00000000000000#include #include #include #include #include #include using namespace Botan; #include int main(int argc, char* argv[]) { try { if(argc != 1 && argc != 2) { std::cout << "Usage: " << argv[0] << " [passphrase]" << std::endl; return 1; } std::ofstream priv("dsapriv.pem"); std::ofstream pub("dsapub.pem"); if(!priv || !pub) { std::cout << "Couldn't write output files" << std::endl; return 1; } Botan::LibraryInitializer init; AutoSeeded_RNG rng; DL_Group group(rng, DL_Group::DSA_Kosherizer, 2048, 256); DSA_PrivateKey key(rng, group); pub << X509::PEM_encode(key); if(argc == 1) priv << PKCS8::PEM_encode(key); else priv << PKCS8::PEM_encode(key, rng, argv[1]); } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; } return 0; } Botan-1.10.12/doc/examples/dsa_sign.cpp0000664000175000017500000000325012654331322017442 0ustar jackjack00000000000000#include #include #include #include #include #include #include #include #include using namespace Botan; const std::string SUFFIX = ".sig"; int main(int argc, char* argv[]) { if(argc != 4) { std::cout << "Usage: " << argv[0] << " keyfile messagefile passphrase" << std::endl; return 1; } Botan::LibraryInitializer init; try { std::string passphrase(argv[3]); std::ifstream message(argv[2], std::ios::binary); if(!message) { std::cout << "Couldn't read the message file." << std::endl; return 1; } std::string outfile = argv[2] + SUFFIX; std::ofstream sigfile(outfile.c_str()); if(!sigfile) { std::cout << "Couldn't write the signature to " << outfile << std::endl; return 1; } AutoSeeded_RNG rng; std::auto_ptr key( PKCS8::load_key(argv[1], rng, passphrase) ); DSA_PrivateKey* dsakey = dynamic_cast(key.get()); if(!dsakey) { std::cout << "The loaded key is not a DSA key!\n"; return 1; } PK_Signer signer(*dsakey, "EMSA1(SHA-1)"); DataSource_Stream in(message); byte buf[4096] = { 0 }; while(size_t got = in.read(buf, sizeof(buf))) signer.update(buf, got); sigfile << base64_encode(signer.signature(rng)) << "\n"; } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; } return 0; } Botan-1.10.12/doc/examples/dsa_ver.cpp0000664000175000017500000000351212654331322017277 0ustar jackjack00000000000000#include #include #include #include #include #include #include #include #include using namespace Botan; namespace { SecureVector b64_decode(const std::string& in) { Pipe pipe(new Base64_Decoder); pipe.process_msg(in); return pipe.read_all(); } } int main(int argc, char* argv[]) { if(argc != 4) { std::cout << "Usage: " << argv[0] << " keyfile messagefile sigfile" << std::endl; return 1; } try { Botan::LibraryInitializer init; std::ifstream message(argv[2], std::ios::binary); if(!message) { std::cout << "Couldn't read the message file." << std::endl; return 1; } std::ifstream sigfile(argv[3]); if(!sigfile) { std::cout << "Couldn't read the signature file." << std::endl; return 1; } std::string sigstr; getline(sigfile, sigstr); std::auto_ptr key(X509::load_key(argv[1])); DSA_PublicKey* dsakey = dynamic_cast(key.get()); if(!dsakey) { std::cout << "The loaded key is not a DSA key!\n"; return 1; } SecureVector sig = b64_decode(sigstr); PK_Verifier ver(*dsakey, "EMSA1(SHA-1)"); DataSource_Stream in(message); byte buf[4096] = { 0 }; while(size_t got = in.read(buf, sizeof(buf))) ver.update(buf, got); const bool ok = ver.check_signature(sig); if(ok) std::cout << "Signature verified\n"; else std::cout << "Signature did NOT verify\n"; } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; return 1; } return 0; } Botan-1.10.12/doc/examples/eax.vec0000664000175000017500000005637712654331322016445 0ustar jackjack00000000000000EAX Test Vectors. Uses the 00010203...NN-1 pattern for header/nonce/plaintext/key. The outputs are of the form ciphertext,tag for a given NN. The key for step N>1 is the tag of the previous step repeated sufficiently. EAX-aes (16 byte key) 0: , 9AD07E7DBFF301F505DE596B9615DFFF 1: 47, 57C4AC75A42D05260AFA093ACD4499ED 2: C4E2, 26C5AB00325306772E6F6E4C8093F3D2 3: 16177B, 852260F91F27898D4FC176E311F6E1D1 4: F09F68BE, 700766CA231643B5D60C3B91B1B700C1 5: 8472705EDF, AC4C3359326EEA4CF71FC03E0E0292F2 6: 14C25EB5FD0D, 8DBD749CA79CCF11C1B370F8C975858C 7: F6A37F60670A85, AFBD1D5921557187504ADE61014C9622 8: 1AACFEAE8FBAD833, 82F477325D6F76BB81940AE25F9801C2 9: 069414324EC293697C, B980E21C09CA129B69E9032D980A9DC5 10: D8174DE9A2FC92B7DA9C, 1E42CC58BA2C8BFD83806444EA29DB61 11: 2C087DEA30F8B7EE510990, 83DB400A080C4D43CAA6EC3F1085A923 12: F36B93C272A703D3422C6A11, 1370C3AF2F3392916364BBBCC2C62EC1 13: A0F33477BAE2E28E6747AA3193, B626DC719528CAC65DB0EF94E35422CE 14: FCF5193506052E8BFA095C1A5205, F5BD02E0B3C91CC7D6FAAA8A9A76CE6A 15: 3797D7F8599B8EEAB39C56241880DC, 0B70003E77146B903F06EF294FECD517 16: C4BAD0E0356FFD369110C048D45D81BE, DE7C2B1D83BE2CC8EA402ABE1038BB79 17: AF5C358BD31CDCAC2F0EA5252F1C3BE1E4, 2D700986F93B22DFE6695C2A243B4E42 18: 7DEF9056FBDAF491D7206B26B19DEF617AA1, E71A7D00BE972D85C77931D7591B2151 19: 6E9B2C0A90BF9D38A6EA3B5D2B9B2D97F938EB, 5B483D7F15C39602C2918181E57DA341 20: 7C5F68DEE9BBA3B04F11D5FC7C9C7FE6E8B5025C, 0AE6A12D37A9C10BB1A494E16705DC05 21: AF0A886BF673BC72045FC074F06A0176C96105E2E6, 06B2DC9A2868C23F86D710E01E37E07B 22: 5F228A986DFE4301EDBAF07A02E114F1B30932995CD1, 74EBF68627C78B1FD024A59B56B2A8FA 23: 911322F60555118CBECD8DD82F186AC19514316E8D48BA, B6A8BAF2F175CD0C71B63B1EF37E185E 24: E7F52730CFB808EFDB376A5D5DF31A7EF8292DC5FC37E9BC, BA2AD158A2D2E5CE01296402B592E1DB 25: B3F8D7CA47D8D86E94D670AFBAFA3B8D9E186C97DC029D4705, 709D2D2B9975D4729C19D4EAC430E65E 26: 7178FEC027AFADDC2C03518E75CF34D207CAC2EB1537A0DBA520, A315F034CE5E66601444402520F55DE2 27: FC230B2B8522F53459D0B968421469BBA7E683ACB0190393B2870F, 48679A78E470E175CF3D3E9B46CEDFCE 28: 35A641127C78C721ECDC50866C21637FDC9515E41CE60F09015EA713, 0062987222F6412B7AAF8A9ABF6FBF98 29: 3D42D6C113421743C08A6F682CFA0E517D5531BB66241C02EC4DCC26F7, B1AAFE11FA2D6E0C870177DDD7F98FF0 30: DAD065B4669B7C59C8392D8E7BD7E64BC01CEFFF27E335B25A328D356F0E, 8973B9B9ECF26DAB58CCF0787EE928E5 31: EBE626F9E241FD233D9781C359430C982667AA26921B62E98FAEC502C01B0B, 2AC0D7052A2CDCCE8E26FEA7595198AA 32: 64D842B66796A797C2B4C6905742FDF2148FFC445E192F9E03B53810C082F788, 9778B345EC12D222DCC6DBABD2651750 EAX-blowfish (8 byte key) 0: , D8C4C23A6AC0B7B7 1: 2A, 5E0E4BDDB60772FB 2: 7695, 7581B16CCC9C45F1 3: EB14C8, 6223A121CFA216C7 4: 5A5C809C, 4A47658796337D6A 5: 8BC2041181, E1FBA8DBA00571FC 6: 89C666F015FA, 2B4A76A0E699FCFE 7: 86C1FA92484AF6, 31B3B738A261D6F5 8: D1F401C145C9328B, 4C4A045EB489F59C 9: 70C9C7753698324A73, AB298B5B20567EB4 10: A50D9D88DC101B6DC8D2, 529DFCBFD13B8E6C 11: 7CC2885C2BE79C44F28FF2, 566255022B40C81C 12: 6902D58347C29250EE07981C, 34619AF18E14C690 13: AB6C3C4AD3EC45143392B642DA, E6D2DD323DA175BB 14: 7065B28BA8AB67B2FB7B6D5E3FAF, AEDCAA54F4B0772F 15: CBBA14A74AD4ADC0EF036EDAE42D51, F2BFFA4D81BAC034 16: 60A315193F58144F5701D547C79FEEED, 912FDBDB05467DF5 EAX-xtea (16 byte key) 0: , 86881D824E3BC561 1: EE, 4C3505F04611D9C2 2: 80C8, 6A3428BEEAD60738 3: BF88E7, 04F1E99E9F5906C2 4: E06574B7, 33B0153AAEF9776F 5: 42D950AF63, 4A0F415640322FDF 6: C30F6AD46EC9, 9646FE909D2B95CB 7: A0049FCA856A14, A0257289C6BBF278 8: 2814B0C1358440E0, C4B0A2354925E887 9: BF4F062B52C1E489CF, B56442A3CA57A041 10: 63DF433956831B8780FC, ADF9ED0B46DCA19E 11: C317FD079817F50E0E8A16, 2EA0EC993FC603AE 12: 2BD12FDDD81EB11660346D2A, FBC6F69125BBA88D 13: 85D356536FE2843C6BBE60EDBC, BB2FEFD04F230E79 14: 22493009DB01B4746F4927A8C4FB, 64CC08471D93C9AC 15: C0F3C0DB08DC93FBA725D1E02DE084, 77B762213DDCCFFE 16: 568B66D3112556BD98FF9339E9C002E5, C8355F508219FE0C EAX-rc5 (8 byte key) 0: , 169C7954341EF44D 1: 22, DABFDA9A0B0BA067 2: 2E54, 6A3D6D9AA5877C5A 3: 2A6ECF, 2A34A3AF5DE8919E 4: 9CC5F84F, D3F673EDAF75E3B5 5: FF5611756C, CC647FAAC8D49BF1 6: 74C939BEB31C, C335999CCFE8F5FA 7: 7976B6F7709B5F, 2A7969C5FD063A88 8: 421EEC5022276174, 2C9BFB1EAC3C54A2 9: 6A4761CD266B1C0ECB, 3EA3CCEBC85FAC4E 10: 7C09201098E764239A2E, 8043ABA9BF4D5AEE 11: 8CE26277562F646DE33C88, D72AED48895E3B40 12: 52150F44D37D121560DA87F6, 58E865E22B485906 13: BA0A73B45F93ECFBFC3AB3D8D0, 683D52FA47FB1A52 14: 96546CBE01054AD24CC95DB54724, D80D0D530E5D1DDE 15: 61E654BB18CD26FC36C09F874DC2C7, C65884CB9D9FEC1E 16: 1D77B8BF02CDEAB4A707C07628826D5B, F18D1730C3D64701 EAX-rc6 (16 byte key) 0: , 1DF8B0B92A3F0C951C425AF4830E63FD 1: 1A, 8A2959EBBE90180999994DEB7036DB85 2: 435D, 7EF00CB57DB7B4155DB530D75CE6B025 3: 08A6CF, 2ED6AF0F2D5BAB05F623D389480A01F2 4: A86E54D3, FC69547C8BD922A5BF2F7B26C4D20F98 5: ED0822E439, 0007A3C6DEFC6C912C0E5B853B520368 6: 7BEFC7FD4054, D32C43A4D1086D57C5BCFAEE04EBC600 7: 5235E58E79287C, A27E9C781327C0FC7C55410EB0C828A9 8: CEB5EE99BE521F4D, 547F46383987F2A3582A81A3BCF9B280 9: 0358B063D5F99C3770, C0A73730512CDA6AD49599775D59EDA1 10: 434B9AEE07DFADD0A332, 499BD88881E558E09A8E822BE27D2496 11: D47849E650F350BB622D74, 638E37A84E7FAAF8F5D77F1B061773DC 12: 814592F568284085E79A024B, 9EB1405E8422FE50BC0D88D837A2C650 13: 6F2B55EC91B591082053AF692E, C48F91EF01AA43A1EE3B36D233DDD48B 14: 506CBDD2901838EE2F178B6953DA, 03778957F536509BFCA577B23A18F726 15: 446EE435D3D1848B51BB8C5F7BE4A1, 1129EAEAADE534940546D43242A4C839 16: FB9D2B150C42465B1685D8F069CC06DB, 41E2940F5DC63CB4E2FBEC25ED8A31E6 17: 9684F683260107BE8FEBBEE1D3EEDAA7BD, BAE7C116F7FF96631F4ACEE95C65CEF3 18: 5082B1FE48CD3AB58F63C2DCFDD4069AC736, 19AC7B8EE315CBB7131A283851B32266 19: 8C72AE495B6F003A3C784D144E84E88885F78E, FA4CEC023740A8D670E351FBCF62C1CB 20: 815D6361C7AE34C9D796ADF9C71ABC46AEF88BC9, 9A1F7288C61A6623B9A82748137ED7CC 21: 904A853E2E96BD2B85AAB3F5DFB900E9B3642EE667, 9AA90DBDD461CAD20495DCFBCB513DD2 22: 79D738A462F727B3D3C529ED999B6FDCCD991D1C5A4D, BF0987BEDDE650D73CAE7D380FED3431 23: B2DEFDB7D503A84E83155A04B8DE8C8DBB68C2FC475007, B7CE900CF43CD518024123C76F6DA328 24: 9E723E15439E12F6C46DF8A309AE1E97B6FD18436259CFB0, DF8B6E1E23512CC4CF5FF531A1908F69 25: A7F0AD03CEBCC9202718AA164886E1026975306A664C5AC7A9, 4A771BF8B9A4325705C85E5499FD98E9 26: A53A92AD1C6835F28E04EF591E783D36F3D76E489B31B87BEB7A, AA263B52A6E6A043DE4D7029D4DC73F5 27: 79BE3C38291A7F77E932C8A9DEAC08DE6442EA9B3895B101A14E7B, 33B84DE06342E675E019CD0237292ED0 28: FA108123C5A69571CFDFE8C3D00535121FDE3096DDC0D700F8F26A5A, 764025D7CA1A3F2C54D28956423B0C77 29: 36EC2D67FD977BD2B73DB6D8EB756B3EADA13690E1B6DFC12A4781B34B, 4BC6B38DE3B02283D92F4DF19A5C48C5 30: 96D3243C945905C9732B5927E46F00886D511463B38C86002FC26B65AB8C, 5B5511CDEC35687AB8425AB22D58B4F1 31: 9CF83B87BEA3374AF7722E999863E3DABB858B0383383EAC7757F5B80FD44B, 1E0CBC961940FDA93B73A92DACFD67F3 32: CE3BC3C9FA5EF4AFE5272B3EDD24B1B003FED2C2E501528CFF44D3FABFF52CB4, DC94FDDC78AAB2B7CAA1E1EF149AC355 EAX-safer+ (16 byte key) 0: , B120C7B37450C46189712E4DFD1F0C44 1: CA, 82BA1869C5FF1EF2A4F6ADC1E7DC1F1D 2: DD20, 6BD5601B16C9943A84AC1F99A176E6D1 3: C1C09F, 0911DC63AA414C004E2BD825BECDC93B 4: 27E43F59, BD858F084B082F76814DC385E1FB20D1 5: 2A9A92F246, 5ADC4A32491934AC0BD00FCE686B26F1 6: 52C78C0CD6F4, F35886F46C03EDCA10B3D01CF07B1E0A 7: 23E0D3CED3795F, FE33D96FC98B78A30C0A412C60E93992 8: CD3FC9961559F239, 9982364A61609FC41068260267231EE9 9: 6EA46CB7AD7505C1BC, BB15053EF0F78B9091B3064118F3E9BF 10: 05D9BA230A56CCA0703A, 1338E68E3DC992B6EB2685C668E75869 11: 7AAD6049DFDCA6771AE42B, 35267E431051E1812495615324C4CBE6 12: 8695091532B83B23C296F620, 7B2EEA861E9A91E6B6A911E10FC3FDD1 13: D909DA4BC7372ACAEA78E6A0EE, EA6C1CD16180DF0B07F4E204A4B4FACB 14: 7DEC8443600D0563AEFE87A2064F, DA454728069B3B409889664783588189 15: C042FE656742CD2FE5D9C212D18C6C, 5929E4AECC2CA047BAE948E7023FE4D0 16: 0B84D3CF59EEF7319633F4A397D47CF8, 31F892FFDB7535DF5D9143456E404163 17: 8C9E57AAFA7969B142742B63AB73286600, C418231C44F96660DDBA8C26B3BB3681 18: E9EED66D370A3A6A39C7E0E570D96F807EAC, A4AFE8D1D3C31B956A3BDBD043E7A665 19: 1A5D47992DA5597D1449B4C8DD47B7404C7657, F3ECEE5182014FC3365FDBC4C33CC06A 20: E7C7945FD1AFD3F5DCE666D8A5A2E8A3C11A7A5F, 86D78B2FBA7597B8806BED505B52BDF6 21: 9E2165B47B29CBC4ACD50660E011D691F061209969, E9B1E860BD02085177E1A94E1EE6F3F0 22: 48EA2945C8DD3FE09407BAC8973A861DB15B788C8FFD, 502926712EDB1B3DD13806052C6C75D7 23: F37D46B35B60819EA52B00457D79155C04B55972D0DFA9, BB2B7D210BF0570F422640BF81F39B9E 24: 12E85C0C78227205CC682360C79E35BF58EC6551CF8FE2D0, 042990D7A58D458C570A15DD375DB4E7 25: 4F6C15109DE980DD14A7F4C27F48671E4787C53A564232F427, B097A5990D8067DD89C21473150C070F 26: AAC472E49DB101B564A8A01E2C80C0C6AE9065D332C2DE79FAB6, ACDD587A7DB86542E195DF73AF1C1CBC 27: B9912CE18019C31692A1F7E11D9CCB20297ACCB9DC62C47C01D2C2, B0ACBF028CA5B15E0035D2EB8CA916BE 28: B4F2B1FE14A1ECDC9C8EA1A0120395E6ED1E69D3FC85DD0F3F90F350, 9A561EBC769369B95B9CB74FC6AC27D3 29: 3FE397C8AD02689B7437A37861F0907AF1F6014A293B46419348771C5A, 6B7BEB9BD5018FECD71BE5081C7C2544 30: 5019089142199F7207E1B7731B8B247A18A685B231499DF12A73F5D67D37, 307E93446777005BA1B088F178A0DB6E 31: EAE8F9F02F8DB3D70B78B08CFB0949D99F1A86C958A8E3823736BCEAB86BE1, 6C94F48591C18BF9C450515B73379973 32: B9C795F7A87305B4AD36DBA10B3B1C70B329D29E49C8C6A932D96A74334AEE4A, D18E6E233FEFD6E5C7148BDC1504299C EAX-twofish (16 byte key) 0: , DB0C02CB069E3773296D3BD4A87A381B 1: 99, 7D21D19E9C440F68E99F1F2EA2668694 2: 0696, EA590EC417C88E23FD23917F9ECFB0C6 3: B9B082, 82D4C9B68DDB02C906496413E13A2D68 4: D6B29D74, 5BCE5CA4F662E883BF7FCAAE5FB2CE01 5: A59C9CB009, CBFB04226D1029A7EC9D64A48A6729BE 6: F4924FE3E355, 3D85B3900DECA0528C815F1447A1F209 7: 679C88D52FB519, 931C7A863C3701D8015FDBD8696C6C30 8: 26DA41C0D115375E, 7627E23E791A4DCB0FA5ED71B1ED2288 9: 8FEC6EB7016AD2B178, F65ED0286A724F0CB2EA317D5022B0D8 10: B5F22415B1334133C531, 87C4F3A8991BBB85984BC4D3305A5CF1 11: 23E1D0ED2E820AFE7DA2FE, 100499F1093FAB2ECF73B643594E98E3 12: 79519ABA91F46B8DAD6D5335, FBDCD1FCDB20AB99135F28A714C6992F 13: 5968D0B4198A0AAD3D0395018F, 781F22E2DA98F83398FCF911B2010057 14: 4E55B14432B601E3EF2EF567CB15, 8BF6E53D7657E56EA3DA1BFD9C9EC06E 15: 6ED89651CE19B3DD1EE5C8780B5015, 131CFD657D32D4E1B35140ADDCA0E13A 16: 2295A968B4D072D12757756247554850, F35FAC95C2AA4155450EAAA6E2E789B5 17: F9B2AA2AA502EA79BBA0C5EAD932B8E1EE, 0ED81AA40B9BF39A9AAEDDDB7A04BEA6 18: 385055F1C1C26C0472A504B4CD225DCA55FE, 24831680B56368231AC54227D737F582 19: 771529585C741A3F8B1C973709892F255A99EE, 2A132B4BF96FD5109DB04459103F5E84 20: E7A2197D9FAA8AB8B303B5EC71AE34AD5EC5DD66, CCAB6518371EC8E0A9E9EE4F7CA5878B 21: 279E54F755EAC6B57375B9EC4406E43DB3139D740C, 7B6F26F2C0ECC9F2DF4EDD7513E6E0B7 22: 27816AA94CBA2BF98E49E595AF5B3FAD12BF1D6F1AC6, D04876C5492D275F15C834E3CF794F0E 23: B5658DC148855F68B282211D879F688F3C142FE555CF81, 4539CDA8A65DB9047AAD76B421B81120 24: 72F0BD4F939C2C9B4FA734DCB0AE4FB9BD342BC8459ED2FE, CEA8469BC0457EBF3418C1114288C904 25: 70568245E6E6BD5D11AD0C74030D7AE08BA05057DEA0FBF4AD, 71554FDE6B87477A51EE4499D78783D2 26: 8702D35BE07D7ADF70684046CC6C72FBBBF821E0BBCCBC973601, 33CC6FBFDA15E306919E0C3BB2E22BB6 27: 0BA23F4A6174165D4A8BA80B7C875340B0F8B2A6967D34E106BC22, 00E6679496714236EECEC84B9AF3072E 28: B9E25ABA84C6BD95B5149E7616FE2E1D6FAACEAAD77A636C60279176, 8D8AD0B9D4C709E1DA370EE01611482A 29: 74759711F6D542581F9F83498FB616638D092732BA07109BF4B5BE045C, 71A40DC777BD09F75362F7B20E0B7576 30: ADBF7E98926484BA2C7F6CD7CD9734FC19265F68AF3BFCAEB025F6296E37, 8DF15B5F69B67F7DABE44E3666B55047 31: 2DC26D449379997D110309B2A0DC2760FCE8CADB4B14ED580F86C70F69C9BA, EFCB60EB2B25737E256BC76700B198EF 32: 2B1890EB9FC0B8293E45D42D2126F4072754AA54E220C853C5F20FBA86BE0795, 1A1B15BBC287372FB9AF035FB124B6A1 EAX-safer-k64 (8 byte key) 0: , 9065118C8F6F7842 1: A1, 1926B3F5112C33BA 2: 2E9A, 5FA6078A0AA7B7C8 3: 56FCE2, 984E385F9441FEC8 4: C33ACE8A, 24AC1CBBCCD0D00A 5: 24307E196B, DD2D52EFCA571B68 6: 31471EAA5155, EB41C2B36FAAA774 7: 03D397F6CFFF62, 7DFBC8485C8B169B 8: 8FA39E282C21B5B2, 2C7EC769966B36D7 9: FEA5402D9A8BE34946, A058E165B5FFB556 10: 6CDEF76554CA845193F0, FED516001FFE039A 11: DC50D19E98463543D94820, 8F9CCF32394498A1 12: 42D8DC34F1974FB4EB2535D7, 77F648526BCBB5AF 13: B75F1299EF6211A6318F6A8EAA, C5086AEA1BE7640B 14: 1E28D68373330829DD1FFC5D083E, 33EDA06A7B5929A2 15: 85529CF87C4706751B0D47CC89CEA6, D031905D6141CBED 16: FE5CB61BAF93B30ED3C296EE85F51864, CC484888F0ABD922 EAX-safer-sk64 (8 byte key) 0: , 5254AB3079CDCB78 1: 75, 798DCF14FEF8F4D1 2: 0300, D5FCA75DAC97849C 3: 520F98, 10E357957CE20898 4: 80E2764D, 5C7F46656C6A46EA 5: C48960CDAA, 3CCF44BD41F01CA8 6: E0E60BD9AA2C, EBB493983FCEE79D 7: D13D8804906A1B, 6EDDCA919978F0B6 8: B7AE14C37A343BFB, 2369E38A9B686747 9: 5DE326BBCC7D0D35E9, 041E5EE8568E941C 10: 13494F5B0635BA3D6E53, EAEEA8AFA55141DD 11: A9BB35B14C831FDA0D83F7, 4002A696F1363987 12: E242043A1C355409819FABFC, 63A085B8886C5FDC 13: 204598B889272C6FE694BDBB4D, 194A1530138EFECE 14: EE3F39E0823A82615679C664DEBF, 1EFF8134C8BEFB3A 15: 8579D87FD3B5E2780BC229665F1D1B, A832CD3E1C1C2289 16: 74D7290D72DA67C4A9EAD434AE3A0A85, 96BAA615A5253CB5 EAX-safer-k128 (16 byte key) 0: , 7E32E3F943777EE7 1: D1, BA00336F561731A7 2: F6D7, 8E3862846CD1F482 3: 5323B5, BD1B8C27B061969B 4: A3EC3416, 170BBB9CE17D1D62 5: 0C74D66716, 7BD024B890C5CE01 6: 6158A630EB37, B5C5BD0652ACB712 7: 17F2D0E019947D, F9FF81E2638EC21C 8: 68E135CC154509C8, AA9EAEF8426886AA 9: EDB1ABE0B486749C21, 355C99E4651C0400 10: DB0C30E9367A72E8F5B2, 631B5671B8A1DB9A 11: D4E5453D9A4C9DB5170FCE, 75A2DF0042E14D82 12: 3F429CC9A550CBDA44107AA7, 2C2977EA13FEBD45 13: A7CA22A97C2361171B415E7083, BFE81185F31727A8 14: 170F79D8B0E3F77299C44208C5B1, D5ED9F9459DF9C22 15: 2E24312D2AE5D5F09D5410900A4BBA, 2FC865CA96EA5A7E 16: 8F3C49A316BA27067FF2C6D99EC8C846, 9D840F40CDB62E4B EAX-safer-sk128 (16 byte key) 0: , 22D90A75BBA5F298 1: 3F, 98C31AB2DE61DE82 2: 584D, F4701D4A1A09928C 3: B9DEAD, 6E221A98505153DA 4: 06D4A6EB, 0E57C51B96BA13B6 5: 7B58B441CA, E28CCF271F5D0A29 6: 7950E0D1EC24, 2ACDDE6E38180C07 7: 65A4F4E098D7C6, 7DC1C9E9602BACF2 8: FEBE4E72BAA0848F, C4607EA3F138BAD9 9: 9B7BD6D6D655985AA3, 8B2C58A9530EA6AC 10: 60C92F925D1478470203, 51E6F5F6DC996F84 11: 7B40769370E651F64AA654, 74F1F8A8D3F4B9AF 12: 7215832C2FB9C54DF7A9C686, 9BF9AEF14F9151D1 13: AD0F9C79008572AB8AE2466EFF, F375D0583D921B69 14: C05076E2C330A0D25D7CEC80597F, 843C12F84B00A8E0 15: D18F0563AB0278140B0CD9A9B07B34, 262B1688E16A171E 16: 650747091F5C532EE37D2D78EE1EC605, 1BAC36144F9A0E8D EAX-rc2 (8 byte key) 0: , D6CC8632EEE0F46B 1: 4C, EA19572CB8970CB4 2: 5537, 3EDD3253F6D0C1A8 3: 206FA6, 20FA88F03F240D31 4: 17EE8B40, 702E8194F1FCBFDE 5: 2A89287136, 31C5534786E15FB3 6: 3A6AEDC7066B, 3C663A4081E1D243 7: 8BC5203947A644, 6AAC806C92BFBD6E 8: 2E0274BBE14D21A3, CEB0E0CB73C3664C 9: 9C4B292B0CF17E3A29, F23CD535559023EC 10: 8E322734308F85662877, 46363D7EFC322821 11: C413C405767FF5F98E3667, E7BA35D8F3678E7E 12: D77806B7A218098B1569EADC, BA67C306E5C0181B 13: 4BE5EF74F9E9799A4D636FEA9F, 4C511C44ADBA4030 14: 7E19969170C2C8D8AEBA8C7FBC2C, 54CC6D466A2DF6DA 15: 2EF1CEDC1DD3403CF440FC5561BE33, 61C6FB277E93701F 16: DE052719153EBACE9D7B19F52AC4282F, 4AC2A96F2FA8634C EAX-des (8 byte key) 0: , 44048B7F240B6F5F 1: 0A, 37009B7D4E09953A 2: 03BA, BFD2FD7758961728 3: 37EE10, 16A6AF96DE888A19 4: 07F44290, 100CA84AA0EDAA1D 5: 389EF0023B, 9614FB800A533268 6: 3F4DBA8AA01C, EFA6B55B7ED5E40F 7: 8C7B837896EAE7, C113CE8F664CE3D4 8: 7011D993D8EDB0C7, B4C370A919F60497 9: 0DEB30A31351B13D7B, 00ABC82DC5F3A1AF 10: 8D3897B2CBE323D6EE1C, 7A2D15627CA1441B 11: DBC002C817DEBFB419F94B, D8EB87F86D6ACDEF 12: 17048E2976FA85AA849E9A80, 229FCD1C9D1E3B9C 13: 30B989EF646544885A478AC198, C1B7EB4F799105C8 14: 5C2E12A7F118A08D6FD585F9C839, C358679FEE6FE7D7 15: 8D1A1E888BBB8648E638C4E74E11B8, 685E006C441448B8 16: 93AE906B8BE4EAC8ED6D8F48F04A7AFF, 71DD7AF752FE28FB EAX-3des (24 byte key) 0: , 8914311BB990B725 1: D8, 2094EDC5D03E54B1 2: FEE5, 781CFB0EBE3895CA 3: DECF5E, 59918E8A5C4B459B 4: BD583AAD, 2013BEEBEEA795A1 5: 2BC01C6C78, 0B1134DBBEAB5D3F 6: 4D5EAF01A895, AB4D17516ECBA50A 7: AF229F90614480, D3113C0A9D133CD4 8: BCA6F375DF4568E0, 8E9EAEC8E77786BC 9: 575F34219E6DD8DB4C, B40C75139E5D1860 10: A199B8AC433B615EC96F, 774AF803698ADE3D 11: 718A2975DD9A872A68AE10, 3B9460F849CBA7FB 12: AB38E148180F6E2FFBB96F91, E3EE3B8FC50DADBC 13: EB10E0233507459D4A6C29EE80, 8D90B46BB1EAB27E 14: EB48559C320DFB056C37458E19B5, 9315F0C4AF8500EB 15: 9E8C73EADA105749B5D8D97392EDC3, 2E749EE66C1E6A16 16: 600FA4149AF252C87B828C780AEFF8BC, 33D7D11DCDC19936 EAX-cast5 (8 byte key) 0: , 382FB8F7E9F69FDC 1: 99, 20DA959849B3F7AB 2: C54B, D05547C6AFA3484A 3: 579836, AAA92B2321FC50C5 4: FEB7AE55, 639EDF01C4FB965D 5: EA8A6023FA, 01274B3ED5CE102C 6: B7C4E995121F, 712BFE27CAFF6DDE 7: F44236660B0004, FAC51D1DF8EC7093 8: 01CD7E3D0BF29E8A, 049C47A45D868D0B 9: DAB170493DFD6E0365, 6F3AEDD9A3ECF4FD 10: 82C9EEC4803D9CD11FA8, 32683C0A9128C6EA 11: 324AC59E87B244ECE0F32F, F6B095AAB49353CF 12: DBDDAB11D02C9CA5843C406E, EA728FC46DDD3B04 13: D67376C2A4AD92E7DD80E39303, CAF72B7E7C237EB3 14: F2B9BBEF08036C2982C6DDD06918, 70A29D780C22752C 15: 96E3D9141F8EBF520540C2BC9A9C23, CEFC86A1CD48203D 16: 70CABBA983179106AE7FCD5F1F31D5C3, BF7F9168F4F82F56 EAX-noekeon (16 byte key) 0: , 556805EEA595CFB9A30FAD196103D7FD 1: F5, 0A7DAEDFB656526CEF4DDBA8087A227A 2: 7B8C, 249895D79962D5B4D18FE07366281B72 3: ACFF15, DCC489D24832EB106F576AE6B6EB957A 4: 08ADE7DB, 0D3215999E9960EDAB29B78744C7F139 5: 66139213F6, 505E1E7141D043E903C26EE0959EEECD 6: 078B79F880A8, 35B7EB326A55E50332866EEDB682EC20 7: 2809E34D9667D4, FFDEC555F68524A09A6ABACA372077D9 8: 93D267DE1EC635D3, 4FF3561990A56E4B374618722EF850FF 9: F377A4D93FF32F4A51, 91D4070423A90FC54D305169C03F49ED 10: 6244B717E082993EB7A1, 2E3A8A354AFA9473667ED7FDD46BE9FC 11: E917559625D25E6E5F2EDA, 19295C37A70314CC9A1D11FDE8D23C92 12: 1E6DF2EE112A893AB14DFA92, 12C4A89D4CD65F8116A03A135AFD3701 13: 47B18CD762E011770E203CF605, 434909A97E118B20D3AEDC79AFE33A9E 14: 72D9A1A7DA6F33D5E0B927F9F32C, 779C23714FCAA2B2321EC7FB5B03E222 15: DA8B830FFCB3DB274807F780D33240, EDC2F1C8A401F328A53392597730B007 16: B53DD2BB840AD933D36A7B5FFDCCFBBB, 4EC0E6D1F916BF633869239B672B37A1 17: 42936BB9A936C30408660855F4F47F3314, F0DAA6DDA15585E1697ABBB4790B15B5 18: 00372E47F5BA016F1B2A1E680B76AB02052A, CDBF3D241BF7FF96D3DFBEDDB872E901 19: 8AA236B0C8BEF6F67A97C2DF90628F6E5838FF, 731DCD61F7F26004C03519F9500EA824 20: 55338647812FC9D86CBDDCED7120268A4D43F8BA, 0E61B3C835CAD95FD49FEF002C014E72 21: 435820B28E52154B47A04D5E635D8FE37FA47FC985, F6A96DCE4917E8D7C610923627E80970 22: 0D30C15B6FEB4A48B14DD15D41A4B25D442AA677B25C, 28E15CCB74AE992C68BDDC8D87802050 23: D9D701F9AD6B0E13D2CDDA15A5194E7CE8BD2C02137391, 2DB9A15884E9C996C3D6B5BDA44B9598 24: E2390AC5CE10CCFBC72106A52C7F180CB477E3C193CBACA8, 22D3F7DCD6947EA4E78DF57A8E1A9A59 25: ADEFB7D9500658D34996AF6BE6336CD78891064EA1DB8E9785, F239D67D039A15C620A7CD4BE4796B3F 26: 89964C90ABF54A6DF9F13C3681E70C702D80A17BE79F8160F30E, 6336F729ECE1ED7368669D75B7E2DCBA 27: 576B2813CECDA4F905BD5D58349EF070FF41B7EB6BB2B01B061B0B, 125324CBF2ACF1011A44A99A11EC8AFC 28: 430B957481748519A60494F0B5F698F34B1A8235B00AC0D1F0A4442E, 1E80A7FCEBBB8E1E12D6831906154485 29: E781BFE5FCDE0BFC056CC86C4A0B9DD3B815BE8CA678204CF47289B5B5, 190D5AAA9EC1CB4CC86FACE53BF1201B 30: 78BFAC07A9B7B2AE9329BF9F9BF18A1A49DD9587001EFCA00E9AD9752764, 4FB5ECBEEB0995C150EBC66508FA19C1 31: 7D6C20694109DE21F7955855A8FF832347518DD496C2A114DF142C68ACDEAA, B25D4BB34056DC091A7A3950D46C32EC 32: 3E1E4395DEC1AFEA9212B95F37E679B6E2D14DF23C5DE49018C2C8038CC4AD45, 9A6DE7BD41A21918AD504490EF4E581D EAX-skipjack (10 byte key) 0: , 85F74B6AFFB10ACD 1: 3F, 604DF8BDD98A0B3F 2: EA87, 792374FE07588BF9 3: 0169CA, 489AB8AF69DA3306 4: A7AC3EB1, 428DAF508E24B583 5: AA9028D5B3, C0A44EDA71FB2C86 6: DA97BA88A061, DA2EC34077F42585 7: 7E25FAA41CEBC8, 36D4987551E06D5B 8: F662DA6C9001CBFE, B7DEF76680C316A9 9: 6D3F73EC716E1DA897, 5F0F83BAE4D3513B 10: 2A300F585BEE9C889743, F4756C24DEB72A9C 11: 80518B010DD77C82D19106, 50FF5CAA365F4A70 12: 6E579A2173C861B6F37B4CD3, 81E3E5ABBA8F0292 13: 5B04829880A72C38871C7021F3, 6B26F463708A3294 14: 934177878E9A9A9FB4DEB3895922, EBC1C32F0A2A3E96 15: 07AF486D1C458AAB2DBF13C3243FAD, 87288E41A9E64089 16: 84059283DF9A2A8563E7AF69235F26DF, 351652A0DBCE9D6E EAX-anubis (16 byte key) 0: , 8E20F19D9BA22ABA09FB86FDE6B9EF38 1: 3B, F4201E546A9160F989191942EC8FD1D3 2: 9F38, 4E3CEAE3E1CB954E021A10E814B71732 3: 4F4769, 3E8F35A6A5B11200E9F1AA38590066CD 4: AB41F5FC, EC4C97A8892AAF5433106D4AC8A49843 5: 414F95D61B, BF831E34D1E3FECB973A8C730ECA2E6D 6: 4798322F06D1, 005BBC30BFEDBE6463536C4F80D1A071 7: F256B6CD1BF4F5, 468A28F0661884B846B191B530C8D064 8: 90906F27A633ADDE, 6D9200A37A7F6A456CB103673184C2E5 9: 16CD3C17C9B4EAB135, 6D716E23D7B35109F55B036EDFA7742E 10: 7AD1C22F1F06298DFB25, B076990F8193543C8F3185D3792BCE56 11: 0476F2ABCD057FE6FEE39D, BB2876DB18C00038FADBBD9B264ACC3C 12: B69EDE336407DBC2EE735857, AB63E5906116A8BE22C52B5DA31B1839 13: C3864C1354065A56470669E602, C72BFD3A0BC73BFF051C9AB2F0DFED93 14: 296D8F183A59020D33890420DD7B, C9D90B9EB42C32EDCF6223587D1598A6 15: 256ED8E9D982616680559979BDF2E9, 179FE4E7BA7E966050D35900317E9916 16: D4ED8F30FF9C0470D75B3B16750A3AE4, 5D50F05BB270A292DFF9F67A3BA84675 17: 40CDEB6388274143CA3C4F6020BD9A4875, B27C7DFB1BFBB3FCCEE0171852C7924E 18: 54EF262EC1801D505C7629D038654EBA0594, 9D2060FCD0A2C577511C7752ADE60BBE 19: F39EE54A37F16DD38B624D7AB8F0D9CBD4B981, BC056C7D2C09D813703CDD63C1C69F44 20: F4E7AD474FCA153ABD670E43081ED09EB2C4CC1A, F244BD4D630272F0D98FCA04226C04F1 21: 039ECC36A0A16273E7246CA1FF19D213AC87B53F29, 3056DB6916C925DF220B6C9980EE141A 22: 7DE1DCDEF01447CA2FE83375A48DD84E4A7CB7C01992, 79AFEA4816EAF8DAC8A5E93960F1594F 23: A886C4B914BF0983003272F226F9B2197EF2DC05ACDDE0, B59D85A0FDA5FA4422F7203C055B97A9 24: 00B3E1E91448E250AAFB695C0643A6577AB453EFECFABF53, 4A7EFF1CBC1AB535122A017203616D85 25: 85E972E774D66D0531E40B8FE9E264A77B50FA883AB0943080, B18E164BF89B7E7AB0DC256DFEC7C72F 26: 004849E39334969B392CB0CF3FDEFB3D792DCBBC15F8328C7EDC, 3C51295711F5F878DE8F0B2B5A26A227 27: A0BAD6C2264AB1578993BA49E59D4598822FFED20A57D88F756FF1, 2EB9D525697A419A10DB2A84AEEA5FBC 28: C34DD806EAB5AD823D78BCA78A7709A705FC94ECC521A367D76C9588, 3C57580C7903039D645C06DBAF07B477 29: C447EC77512938CF7862388C32AF22ACE6B5E4CBAA998BE4F5CBC4D215, 43425D09B7ACFD90371C08953946A955 30: 2C16993AAE624CBA4CDAF34FE3D368559E6BE548292B281439866375013B, 3B7360C3FA8FB1C15D19F567153CB46C 31: 538E5DFAF14854A786851E4165F2E01CDDA963E318FCE4FB58E31A6B5CFC33, 2F8EA13B7A6873FE556CA535ABA0968B 32: 5E29CDB7D9695A110043E9C260104BDF020A3A2A139D4112E918AB584BDD7EDA, 9133213AA7BCF062D2BD37F866683D3F EAX-khazad (16 byte key) 0: , 75968E54452F6781 1: 95, ADAF5949F09B5A22 2: 6B8F, A06B201947424A11 3: 5BE668, 3251416625DF347A 4: 5A92E82B, 33E25772427D9786 5: 62F9F2ABCC, DE714F5F5D17D6D0 6: 0E3CD825BD8D, A7991C8CB8975ED9 7: 4AD0D999503AAD, 53A827D7886F7227 8: BB08E6FAED1DAEE8, 91A118749B7AB9F3 9: 16E30CB12E20D18495, F8F8B8C1280158F9 10: 616DBCC6346959D89E4A, 506BF35A70297D53 11: F86B022D4B28FDB1F0B7D3, EA42220C805FD759 12: 9B8A3D9CDBADD9BBCCCD2B28, BB478D3CE9A229C9 13: CDC4AB4EF2D5B46E87827241F0, 658EDB9497A91823 14: 1A113D96B21B4AEBDB13E34C381A, 63AD0C4084AC84B0 15: 14DA751E5AF7E01F35B3CE74EE1ACF, 3C76AB64E1724DCE 16: A13BBC7E408D2C550634CBC64690B8FE, 3D4BBC0C76536730 Botan-1.10.12/doc/examples/eax_test.cpp0000664000175000017500000001324712654331322017476 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include using namespace Botan; namespace { unsigned from_string(const std::string& s) { std::istringstream stream(s); unsigned n; stream >> n; return n; } std::string seq(unsigned n) { std::string s; for(unsigned i = 0; i != n; ++i) { unsigned char b = (i & 0xFF); const char bin2hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; s += bin2hex[(b >> 4)]; s += bin2hex[(b & 0x0f)]; } return s; } void eax_test(const std::string& algo, const std::string& key_str, const std::string& nonce_str, const std::string& header_str, const std::string& tag_str, const std::string& plaintext_str, const std::string& ciphertext) { /* printf("EAX(algo=%s key=%s nonce=%s header=%s tag=%s pt=%s ct=%s)\n", algo.c_str(), key_str.c_str(), nonce_str.c_str(), header_str.c_str(), tag_str.c_str(), plaintext_str.c_str(), ciphertext.c_str()); */ SymmetricKey key(key_str); InitializationVector iv(nonce_str); EAX_Encryption* enc; Pipe pipe(new Hex_Decoder, enc = new EAX_Encryption(get_block_cipher(algo)), new Hex_Encoder); enc->set_key(key); enc->set_iv(iv); OctetString header(header_str); enc->set_header(header.begin(), header.length()); pipe.start_msg(); pipe.write(plaintext_str); pipe.end_msg(); std::string out = pipe.read_all_as_string(); if(out != ciphertext + tag_str) { printf("BAD enc %s '%s' != '%s%s'\n", algo.c_str(), out.c_str(), ciphertext.c_str(), tag_str.c_str()); } else printf("OK enc %s\n", algo.c_str()); try { EAX_Decryption* dec; Pipe pipe2(new Hex_Decoder, dec = new EAX_Decryption(get_block_cipher(algo)), new Hex_Encoder); dec->set_key(key); dec->set_iv(iv); dec->set_header(header.begin(), header.length()); pipe2.start_msg(); pipe2.write(ciphertext); pipe2.write(tag_str); pipe2.end_msg(); std::string out2 = pipe2.read_all_as_string(); if(out2 != plaintext_str) { printf("BAD decrypt %s '%s'\n", algo.c_str(), out2.c_str()); } else printf("OK decrypt %s\n", algo.c_str()); } catch(std::exception& e) { printf("%s\n", e.what()); } } std::pair translate_algo(const std::string& in) { if(in == "aes (16 byte key)") return std::make_pair("AES-128", 16); if(in == "blowfish (8 byte key)") return std::make_pair("Blowfish", 8); if(in == "rc2 (8 byte key)") return std::make_pair("RC2", 8); if(in == "rc5 (8 byte key)") return std::make_pair("RC5", 8); if(in == "rc6 (16 byte key)") return std::make_pair("RC6", 16); if(in == "safer-sk128 (16 byte key)") return std::make_pair("SAFER-SK(10)", 16); if(in == "twofish (16 byte key)") return std::make_pair("Twofish", 16); if(in == "des (8 byte key)") return std::make_pair("DES", 8); if(in == "3des (24 byte key)") return std::make_pair("TripleDES", 24); // These 3 are disabled due to differences in base algorithm. #if 0 // XTEA: LTC uses little endian, Botan (and Crypto++) use big-endian // I swapped to LE in XTEA and the vectors did match if(in == "xtea (16 byte key)") return std::make_pair("XTEA", 16); // Skipjack: LTC uses big-endian, Botan (and Crypto++) use // little-endian I am not sure if that was the full difference // though, was unable to replicate LTC's EAX vectors with Skipjack if(in == "skipjack (10 byte key)") return std::make_pair("Skipjack", 10); // Noekeon: unknown cause, though LTC's lone test vector does not // match Botan if(in == "noekeon (16 byte key)") return std::make_pair("Noekeon", 16); #endif return std::make_pair("", 0); } std::string rep(const std::string& s_in, unsigned n) { std::string s_out; for(unsigned i = 0; i != n; ++i) s_out += s_in[i % s_in.size()]; return s_out; } void run_tests(std::istream& in) { std::string algo; std::string key; while(in.good()) { std::string line; std::getline(in, line); if(line == "") continue; if(line.size() > 5 && line.substr(0, 4) == "EAX-") { std::pair name_and_keylen = translate_algo(line.substr(4)); algo = name_and_keylen.first; key = seq(name_and_keylen.second); } else if(algo != "") { boost::regex vec_regex("^([ 0-9]{3}): (.*), (.*)$"); boost::smatch what; if(boost::regex_match(line, what, vec_regex, boost::match_extra)) { unsigned n = from_string(what[1]); std::string ciphertext = what[2]; std::string tag = what[3]; std::string plaintext = seq(n); std::string header = seq(n); std::string nonce = seq(n); eax_test(algo, key, nonce, header, tag, plaintext, ciphertext); key = rep(tag, key.size()); // repeat as needed } } } } } int main() { std::ifstream in("eax.vec"); Botan::LibraryInitializer init; if(!in) { std::cerr << "Couldn't read input file\n"; return 1; } run_tests(in); } Botan-1.10.12/doc/examples/ecdsa.cpp0000664000175000017500000000237512654331322016741 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include using namespace Botan; int main() { Botan::LibraryInitializer init; try { AutoSeeded_RNG rng; EC_Domain_Params params("secp160r1"); ECDSA_PrivateKey ecdsa(rng, params); ECDSA_PublicKey ecdsa_pub = ecdsa; /* std::cout << params.get_curve().get_p() << "\n"; std::cout << params.get_order() << "\n"; std::cout << X509::PEM_encode(ecdsa); std::cout << PKCS8::PEM_encode(ecdsa); */ PK_Signer signer(ecdsa, "EMSA1(SHA-256)"); const char* message = "Hello World"; signer.update((const byte*)message, strlen(message)); SecureVector sig = signer.signature(rng); std::cout << sig.size() << "\n"; PK_Verifier verifier(ecdsa_pub, "EMSA1(SHA-256)"); verifier.update((const byte*)message, strlen(message)); bool ok = verifier.check_signature(sig); if(ok) std::cout << "Signature valid\n"; else std::cout << "Bad signature\n"; } catch(std::exception& e) { std::cout << e.what() << "\n"; } } Botan-1.10.12/doc/examples/encrypt.cpp0000664000175000017500000001240512654331322017341 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ /* Encrypt a file using a block cipher in CBC mode. Compresses the plaintext with Zlib, MACs with HMAC(SHA-1). Stores the block cipher used in the file, so you don't have to specify it when decrypting. What a real application would do (and what this example should do), is test for the presence of the Zlib module, and use it only if it's available. Then add some marker to the stream so the other side knows whether or not the plaintext was compressed. Bonus points for supporting multiple compression schemes. Another flaw is that is stores the entire ciphertext in memory, so if the file you're encrypting is 1 Gb... you better have a lot of RAM. */ #include #include #include #include #include #include #include #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) #include #endif using namespace Botan; std::string b64_encode(const SecureVector&); int main(int argc, char* argv[]) { if(argc < 2) { std::cout << "Usage: " << argv[0] << " [-c algo] -p passphrase file\n" " -p : Use this passphrase to encrypt\n" " -c : Encrypt with block cipher 'algo' (default 3DES)\n"; return 1; } Botan::LibraryInitializer init; std::string algo = "TripleDES"; std::string filename, passphrase; // Holy hell, argument processing is a PITA for(int j = 1; argv[j] != 0; j++) { if(std::strcmp(argv[j], "-c") == 0) { if(argv[j+1]) { algo = argv[j+1]; j++; } else { std::cout << "No argument for -c option" << std::endl; return 1; } } else if(std::strcmp(argv[j], "-p") == 0) { if(argv[j+1]) { passphrase = argv[j+1]; j++; } else { std::cout << "No argument for -p option" << std::endl; return 1; } } else { if(filename != "") { std::cout << "You can only specify one file at a time\n"; return 1; } filename = argv[j]; } } if(passphrase == "") { std::cout << "You have to specify a passphrase!" << std::endl; return 1; } std::ifstream in(filename.c_str(), std::ios::binary); if(!in) { std::cout << "ERROR: couldn't open " << filename << std::endl; return 1; } std::string outfile = filename + ".enc"; std::ofstream out(outfile.c_str()); if(!out) { std::cout << "ERROR: couldn't open " << outfile << std::endl; return 1; } try { const BlockCipher* cipher_proto = global_state().algorithm_factory().prototype_block_cipher(algo); if(!cipher_proto) { std::cout << "Don't know about the block cipher \"" << algo << "\"\n"; return 1; } const u32bit key_len = cipher_proto->maximum_keylength(); const u32bit iv_len = cipher_proto->block_size(); AutoSeeded_RNG rng; std::auto_ptr pbkdf(get_pbkdf("PBKDF2(SHA-1)")); SecureVector salt(8); rng.randomize(&salt[0], salt.size()); const u32bit PBKDF2_ITERATIONS = 8192; SymmetricKey bc_key = pbkdf->derive_key(key_len, "BLK" + passphrase, &salt[0], salt.size(), PBKDF2_ITERATIONS); InitializationVector iv = pbkdf->derive_key(iv_len, "IVL" + passphrase, &salt[0], salt.size(), PBKDF2_ITERATIONS); SymmetricKey mac_key = pbkdf->derive_key(16, "MAC" + passphrase, &salt[0], salt.size(), PBKDF2_ITERATIONS); // Just to be all fancy we even write a (simple) header. out << "-------- ENCRYPTED FILE --------" << std::endl; out << algo << std::endl; out << b64_encode(salt) << std::endl; Pipe pipe(new Fork( new Chain(new MAC_Filter("HMAC(SHA-1)", mac_key), new Base64_Encoder ), new Chain( #ifdef BOTAN_HAS_COMPRESSOR_ZLIB new Zlib_Compression, #endif get_cipher(algo + "/CBC", bc_key, iv, ENCRYPTION), new Base64_Encoder(true) ) ) ); pipe.start_msg(); in >> pipe; pipe.end_msg(); out << pipe.read_all_as_string(0) << std::endl; out << pipe.read_all_as_string(1); } catch(Algorithm_Not_Found) { std::cout << "Don't know about the block cipher \"" << algo << "\"\n"; return 1; } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; return 1; } return 0; } std::string b64_encode(const SecureVector& in) { Pipe pipe(new Base64_Encoder); pipe.process_msg(in); return pipe.read_all_as_string(); } Botan-1.10.12/doc/examples/encrypt2.cpp0000664000175000017500000000323012654331322017417 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include using namespace Botan; int main() { Botan::LibraryInitializer init; AutoSeeded_RNG rng; std::string passphrase = "secret"; std::ifstream infile("readme.txt"); std::ofstream outfile("readme.txt.enc"); PKCS5_PBKDF2 pbkdf2(new HMAC(new SHA_160)); const u32bit PBKDF2_ITERATIONS = 8192; SecureVector salt(8); rng.randomize(&salt[0], salt.size()); SecureVector master_key = pbkdf2.derive_key(48, passphrase, &salt[0], salt.size(), PBKDF2_ITERATIONS).bits_of(); KDF* kdf = get_kdf("KDF2(SHA-1)"); SymmetricKey key = kdf->derive_key(20, master_key, "cipher key"); SymmetricKey mac_key = kdf->derive_key(20, master_key, "hmac key"); InitializationVector iv = kdf->derive_key(8, master_key, "cipher iv"); Pipe pipe(new Fork( new Chain( get_cipher("Blowfish/CBC/PKCS7", key, iv, ENCRYPTION), new Base64_Encoder, new DataSink_Stream(outfile) ), new Chain( new MAC_Filter("HMAC(SHA-1)", mac_key), new Hex_Encoder) ) ); outfile.write((const char*)salt.begin(), salt.size()); pipe.start_msg(); infile >> pipe; pipe.end_msg(); SecureVector hmac = pipe.read_all(1); outfile.write((const char*)hmac.begin(), hmac.size()); } Botan-1.10.12/doc/examples/factor.cpp0000664000175000017500000000574712654331322017146 0ustar jackjack00000000000000/* * (C) 2009-2010 Jack Lloyd * * Distributed under the terms of the Botan license * * Factor integers using a combination of trial division by small * primes, and Pollard's Rho algorithm */ #include #include #include using namespace Botan; #include #include #include namespace { /* * Pollard's Rho algorithm, as described in the MIT algorithms book. We * use (x^2+x) mod n instead of (x*2-1) mod n as the random function, * it _seems_ to lead to faster factorization for the values I tried. */ BigInt rho(const BigInt& n, RandomNumberGenerator& rng) { BigInt x = BigInt::random_integer(rng, 0, n-1); BigInt y = x; BigInt d = 0; Modular_Reducer mod_n(n); u32bit i = 1, k = 2; while(true) { i++; if(i == 0) // overflow, bail out break; x = mod_n.multiply((x + 1), x); d = gcd(y - x, n); if(d != 1 && d != n) return d; if(i == k) { y = x; k = 2*k; } } return 0; } // Remove (and return) any small (< 2^16) factors std::vector remove_small_factors(BigInt& n) { std::vector factors; while(n.is_even()) { factors.push_back(2); n /= 2; } for(u32bit j = 0; j != PRIME_TABLE_SIZE; j++) { if(n < PRIMES[j]) break; BigInt x = gcd(n, PRIMES[j]); if(x != 1) { n /= x; u32bit occurs = 0; while(x != 1) { x /= PRIMES[j]; occurs++; } for(u32bit k = 0; k != occurs; k++) factors.push_back(PRIMES[j]); } } return factors; } std::vector factorize(const BigInt& n_in, RandomNumberGenerator& rng) { BigInt n = n_in; std::vector factors = remove_small_factors(n); while(n != 1) { if(check_prime(n, rng)) { factors.push_back(n); break; } BigInt a_factor = 0; while(a_factor == 0) a_factor = rho(n, rng); std::vector rho_factored = factorize(a_factor, rng); for(u32bit j = 0; j != rho_factored.size(); j++) factors.push_back(rho_factored[j]); n /= a_factor; } return factors; } } int main(int argc, char* argv[]) { if(argc != 2) { std::cerr << "Usage: " << argv[0] << " integer\n"; return 1; } Botan::LibraryInitializer init; try { BigInt n(argv[1]); AutoSeeded_RNG rng; std::vector factors = factorize(n, rng); std::sort(factors.begin(), factors.end()); std::cout << n << ": "; std::copy(factors.begin(), factors.end(), std::ostream_iterator(std::cout, " ")); std::cout << "\n"; } catch(std::exception& e) { std::cout << e.what() << std::endl; return 1; } return 0; } Botan-1.10.12/doc/examples/fpe.cpp0000664000175000017500000000577512654331322016443 0ustar jackjack00000000000000#include #include #include using namespace Botan; #include #include namespace { byte luhn_checksum(u64bit cc_number) { byte sum = 0; bool alt = false; while(cc_number) { byte digit = cc_number % 10; if(alt) { digit *= 2; if(digit > 9) digit -= 9; } sum += digit; cc_number /= 10; alt = !alt; } return (sum % 10); } bool luhn_check(u64bit cc_number) { return (luhn_checksum(cc_number) == 0); } u64bit cc_rank(u64bit cc_number) { // Remove Luhn checksum return cc_number / 10; } u64bit cc_derank(u64bit cc_number) { for(u32bit i = 0; i != 10; ++i) if(luhn_check(cc_number * 10 + i)) return (cc_number * 10 + i); return 0; } /* * Use the SHA-1 hash of the account name or ID as a tweak */ SecureVector sha1(const std::string& acct_name) { SHA_160 hash; hash.update(acct_name); return hash.final(); } u64bit encrypt_cc_number(u64bit cc_number, const SymmetricKey& key, const std::string& acct_name) { BigInt n = 1000000000000000; u64bit cc_ranked = cc_rank(cc_number); BigInt c = FPE::fe1_encrypt(n, cc_ranked, key, sha1(acct_name)); if(c.bits() > 50) throw std::runtime_error("FPE produced a number too large"); u64bit enc_cc = 0; for(u32bit i = 0; i != 7; ++i) enc_cc = (enc_cc << 8) | c.byte_at(6-i); return cc_derank(enc_cc); } u64bit decrypt_cc_number(u64bit enc_cc, const SymmetricKey& key, const std::string& acct_name) { BigInt n = 1000000000000000; u64bit cc_ranked = cc_rank(enc_cc); BigInt c = FPE::fe1_decrypt(n, cc_ranked, key, sha1(acct_name)); if(c.bits() > 50) throw std::runtime_error("FPE produced a number too large"); u64bit dec_cc = 0; for(u32bit i = 0; i != 7; ++i) dec_cc = (dec_cc << 8) | c.byte_at(6-i); return cc_derank(dec_cc); } } int main(int argc, char* argv[]) { LibraryInitializer init; if(argc != 4) { std::cout << "Usage: " << argv[0] << " cc-number acct-name passwd\n"; return 1; } u64bit cc_number = atoll(argv[1]); std::string acct_name = argv[2]; std::string passwd = argv[3]; std::cout << "Input was: " << cc_number << ' ' << luhn_check(cc_number) << '\n'; /* * In practice something like PBKDF2 with a salt and high iteration * count would be a good idea. */ SymmetricKey key = sha1(passwd); u64bit enc_cc = encrypt_cc_number(cc_number, key, acct_name); std::cout << "Encrypted: " << enc_cc << ' ' << luhn_check(enc_cc) << '\n'; u64bit dec_cc = decrypt_cc_number(enc_cc, key, acct_name); std::cout << "Decrypted: " << dec_cc << ' ' << luhn_check(dec_cc) << '\n'; if(dec_cc != cc_number) std::cout << "Something went wrong :( Bad CC checksum?\n"; } Botan-1.10.12/doc/examples/gen_certs.cpp0000664000175000017500000000674312654331322017636 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ /* * Generate a root CA plus httpd, dovecot, and postfix certs/keys * */ #include #include #include #include #include using namespace Botan; #include #include namespace { void fill_commoninfo(X509_Cert_Options& opts) { opts.country = "US"; opts.organization = "randombit.net"; opts.email = "admin@randombit.net"; opts.locality = "Vermont"; } X509_Certificate make_ca_cert(RandomNumberGenerator& rng, const Private_Key& priv_key, const X509_Time& now, const X509_Time& later) { X509_Cert_Options opts; fill_commoninfo(opts); opts.common_name = "randombit.net CA"; opts.start = now; opts.end = later; opts.CA_key(); return X509::create_self_signed_cert(opts, priv_key, "SHA-256", rng); } PKCS10_Request make_server_cert_req(const Private_Key& key, const std::string& hostname, RandomNumberGenerator& rng) { X509_Cert_Options opts; opts.common_name = hostname; fill_commoninfo(opts); opts.add_ex_constraint("PKIX.ServerAuth"); return X509::create_cert_req(opts, key, "SHA-1", rng); } void save_pair(const std::string& name, const std::string& password, const X509_Certificate& cert, const Private_Key& key, RandomNumberGenerator& rng) { std::string cert_fsname = name + "_cert.pem"; std::string key_fsname = name + "_key.pem"; std::ofstream cert_out(cert_fsname.c_str()); cert_out << cert.PEM_encode() << "\n"; cert_out.close(); std::ofstream key_out(key_fsname.c_str()); if(password != "") key_out << PKCS8::PEM_encode(key, rng, password); else key_out << PKCS8::PEM_encode(key); key_out.close(); } } int main() { const u32bit seconds_in_a_year = 31556926; const u32bit current_time = system_time(); X509_Time now = X509_Time(current_time); X509_Time later = X509_Time(current_time + 4*seconds_in_a_year); LibraryInitializer init; AutoSeeded_RNG rng; RSA_PrivateKey ca_key(rng, 2048); X509_Certificate ca_cert = make_ca_cert(rng, ca_key, now, later); const std::string ca_password = "sekrit"; save_pair("ca", ca_password, ca_cert, ca_key, rng); X509_CA ca(ca_cert, ca_key, "SHA-256"); RSA_PrivateKey httpd_key(rng, 1536); X509_Certificate httpd_cert = ca.sign_request( make_server_cert_req(httpd_key, "www.randombit.net", rng), rng, now, later); save_pair("httpd", "", httpd_cert, httpd_key, rng); RSA_PrivateKey bugzilla_key(rng, 1536); X509_Certificate bugzilla_cert = ca.sign_request( make_server_cert_req(bugzilla_key, "bugs.randombit.net", rng), rng, now, later); save_pair("bugzilla", "", bugzilla_cert, bugzilla_key, rng); RSA_PrivateKey postfix_key(rng, 1536); X509_Certificate postfix_cert = ca.sign_request( make_server_cert_req(postfix_key, "mail.randombit.net", rng), rng, now, later); save_pair("postfix", "", postfix_cert, postfix_key, rng); RSA_PrivateKey dovecot_key(rng, 1536); X509_Certificate dovecot_cert = ca.sign_request( make_server_cert_req(dovecot_key, "imap.randombit.net", rng), rng, now, later); save_pair("dovecot", "", dovecot_cert, dovecot_key, rng); } Botan-1.10.12/doc/examples/hash.cpp0000664000175000017500000000255312654331322016603 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include int main(int argc, char* argv[]) { if(argc < 3) { std::cout << "Usage: " << argv[0] << " digest " << std::endl; return 1; } Botan::LibraryInitializer init; std::string hash = argv[1]; /* a couple of special cases, kind of a crock */ if(hash == "sha1") hash = "SHA-1"; if(hash == "md5") hash = "MD5"; try { if(!Botan::have_hash(hash)) { std::cout << "Unknown hash \"" << argv[1] << "\"" << std::endl; return 1; } Botan::Pipe pipe(new Botan::Hash_Filter(hash), new Botan::Hex_Encoder); int skipped = 0; for(int j = 2; argv[j] != 0; j++) { std::ifstream file(argv[j], std::ios::binary); if(!file) { std::cout << "ERROR: could not open " << argv[j] << std::endl; skipped++; continue; } pipe.start_msg(); file >> pipe; pipe.end_msg(); pipe.set_default_msg(j-2-skipped); std::cout << pipe << " " << argv[j] << std::endl; } } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; } return 0; } Botan-1.10.12/doc/examples/hash_fd.cpp0000664000175000017500000000332412654331322017251 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ /* This is just like the normal hash application, but uses the Unix I/O system calls instead of C++ iostreams. Previously, this version was much faster and smaller, but GCC 3.1's libstdc++ seems to have been improved enough that the difference is now fairly minimal. Nicely enough, doing the change required changing only about 3 lines of code. */ #include #include #if !defined(BOTAN_HAS_PIPE_UNIXFD_IO) #error "You didn't compile the pipe_unixfd module into Botan" #endif #include #include int main(int argc, char* argv[]) { if(argc < 3) { std::cout << "Usage: " << argv[0] << " digest " << std::endl; return 1; } Botan::LibraryInitializer init; try { Botan::Pipe pipe(new Botan::Hash_Filter(argv[1]), new Botan::Hex_Encoder); int skipped = 0; for(int j = 2; argv[j] != 0; j++) { int file = open(argv[j], O_RDONLY); if(file == -1) { std::cout << "ERROR: could not open " << argv[j] << std::endl; skipped++; continue; } pipe.start_msg(); file >> pipe; pipe.end_msg(); close(file); pipe.set_default_msg(j-2-skipped); std::cout << pipe << " " << argv[j] << std::endl; } } catch(Botan::Algorithm_Not_Found) { std::cout << "Don't know about the hash function \"" << argv[1] << "\"" << std::endl; } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; } return 0; } Botan-1.10.12/doc/examples/hash_quickly.cpp0000664000175000017500000000471112654331322020342 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ /* Try to find the fastest SHA-1 implementation and use it to hash files. In most programs this isn't worth the bother and overhead. However with large amount of input, it is worth it. On tests on a Core2 system with the SHA-1 SSE2 code enabled, over a few hundred Mb or so the overhead paid for itself. Of course you could also just do this once and save it as an application config, which is probably the smart thing to do. */ #include #include #include #include #include #include #include #include namespace { void set_fastest_implementation(const std::string& algo, Botan::RandomNumberGenerator& rng, double ms = 30) { Botan::Algorithm_Factory& af = Botan::global_state().algorithm_factory(); std::map results = Botan::algorithm_benchmark(algo, af, rng, ms, 16); std::string fastest_provider = ""; double best_res = 0; for(std::map::iterator r = results.begin(); r != results.end(); ++r) { std::cout << r->first << " @ " << r->second << " MiB/sec\n"; if(fastest_provider == "" || r->second > best_res) { fastest_provider = r->first; best_res = r->second; } } std::cout << "Using " << fastest_provider << "\n"; af.set_preferred_provider(algo, fastest_provider); } } int main(int argc, char* argv[]) { if(argc <= 1) { std::cout << "Usage: " << argv[0] << " ...\n"; return 1; } Botan::LibraryInitializer init; Botan::AutoSeeded_RNG rng; const std::string hash = "SHA-1"; set_fastest_implementation(hash, rng); // Here we intentionally use the 'old style' lookup interface // which will also respect the provider settings. Or can use: // global_state().algorithm_factory().make_hash_function(hash) Botan::Pipe pipe( new Botan::Hash_Filter(Botan::get_hash(hash)), new Botan::Hex_Encoder ); for(size_t i = 1; argv[i]; ++i) { std::ifstream in(argv[i], std::ios::binary); if(!in) continue; pipe.start_msg(); in >> pipe; pipe.end_msg(); std::cout << argv[i] << " = " << pipe.read_all_as_string(Botan::Pipe::LAST_MESSAGE) << "\n"; } } Botan-1.10.12/doc/examples/hasher.cpp0000664000175000017500000000256012654331322017130 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include int main(int argc, char* argv[]) { if(argc < 2) { std::cout << "Usage: " << argv[0] << " " << std::endl; return 1; } Botan::LibraryInitializer init; const int COUNT = 3; std::string name[COUNT] = { "MD5", "SHA-1", "RIPEMD-160" }; for(int j = 1; argv[j] != 0; j++) { Botan::Filter* hash[COUNT] = { new Botan::Chain(new Botan::Hash_Filter(name[0]), new Botan::Hex_Encoder), new Botan::Chain(new Botan::Hash_Filter(name[1]), new Botan::Hex_Encoder), new Botan::Chain(new Botan::Hash_Filter(name[2]), new Botan::Hex_Encoder) }; Botan::Pipe pipe(new Botan::Fork(hash, COUNT)); std::ifstream file(argv[j], std::ios::binary); if(!file) { std::cout << "ERROR: could not open " << argv[j] << std::endl; continue; } pipe.start_msg(); file >> pipe; pipe.end_msg(); file.close(); for(int k = 0; k != COUNT; k++) { pipe.set_default_msg(k); std::cout << name[k] << "(" << argv[j] << ") = " << pipe << std::endl; } } return 0; } Botan-1.10.12/doc/examples/hasher2.cpp0000664000175000017500000000361012654331322017207 0ustar jackjack00000000000000/* * (C) 2001 Jack Lloyd * * Distributed under the terms of the Botan license */ /* Identical to hasher.cpp, but uses Pipe in a different way. Note this tends to be much less efficient than hasher.cpp, because it does three passes over the file. For a small file, it doesn't really matter. But for a large file, or for something you can't re-read easily (socket, stdin, ...) this is a bad idea. */ #include #include #include #include int main(int argc, char* argv[]) { if(argc < 2) { std::cout << "Usage: " << argv[0] << " " << std::endl; return 1; } Botan::LibraryInitializer init; const int COUNT = 3; std::string name[COUNT] = { "MD5", "SHA-1", "RIPEMD-160" }; Botan::Pipe pipe; int skipped = 0; for(int j = 1; argv[j] != 0; j++) { Botan::Filter* hash[COUNT] = { new Botan::Hash_Filter(name[0]), new Botan::Hash_Filter(name[1]), new Botan::Hash_Filter(name[2]), }; std::ifstream file(argv[j], std::ios::binary); if(!file) { std::cout << "ERROR: could not open " << argv[j] << std::endl; skipped++; continue; } for(int k = 0; k != COUNT; k++) { pipe.reset(); pipe.append(hash[k]); pipe.append(new Botan::Hex_Encoder); pipe.start_msg(); // trickiness: the >> op reads until EOF, but seekg won't work // unless we're in the "good" state (which EOF is not). file.clear(); file.seekg(0, std::ios::beg); file >> pipe; pipe.end_msg(); } file.close(); for(int k = 0; k != COUNT; k++) { std::string out = pipe.read_all_as_string(COUNT*(j-1-skipped) + k); std::cout << name[k] << "(" << argv[j] << ") = " << out << std::endl; } } return 0; } Botan-1.10.12/doc/examples/keywrap.cpp0000664000175000017500000000142612654331322017340 0ustar jackjack00000000000000/* * NIST keywrap example * (C) 2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include int main() { using namespace Botan; LibraryInitializer init; AutoSeeded_RNG rng; // The key to encrypt SymmetricKey key(rng, 24); // The key encryption key SymmetricKey kek(rng, 32); std::cout << "Original: " << key.as_string() << "\n"; Algorithm_Factory& af = global_state().algorithm_factory(); SecureVector enc = rfc3394_keywrap(key.bits_of(), kek, af); std::cout << "Encrypted: " << hex_encode(enc) << "\n"; SecureVector dec = rfc3394_keyunwrap(enc, kek, af); std::cout << "Decrypted: " << hex_encode(dec) << "\n"; } Botan-1.10.12/doc/examples/make_prime.cpp0000664000175000017500000000330312654331322017763 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include using namespace Botan; #include #include #include #include int main() { Botan::LibraryInitializer init; AutoSeeded_RNG rng; std::set primes; std::map bit_count; int not_new = 0; while(primes.size() < 10000) { u32bit start_cnt = primes.size(); u32bit bits = 18; if(rng.next_byte() % 128 == 0) bits -= rng.next_byte() % (bits-2); bit_count[bits]++; //std::cout << "random_prime(" << bits << ")\n"; BigInt p = random_prime(rng, bits); if(p.bits() != bits) { std::cout << "Asked for " << bits << " got " << p << " " << p.bits() << " bits\n"; return 1; } primes.insert(random_prime(rng, bits)); if(primes.size() != start_cnt) std::cout << primes.size() << "\n"; else not_new++; //std::cout << "miss: " << not_new << "\n"; if(not_new % 100000 == 0) { for(std::map::iterator i = bit_count.begin(); i != bit_count.end(); ++i) std::cout << "bit_count[" << i->first << "] = " << i->second << "\n"; std::copy(primes.begin(), primes.end(), std::ostream_iterator(std::cout, " ")); } } std::cout << "Generated all? primes\n"; /* for(u32bit j = 0; j != PRIME_TABLE_SIZE; ++j) { if(primes.count(PRIMES[j]) != 1) std::cout << "Missing " << PRIMES[j] << "\n"; } */ } Botan-1.10.12/doc/examples/new_engine.cpp0000664000175000017500000000526412654331322020000 0ustar jackjack00000000000000/* * Adding an application specific engine * (C) 2004,2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include using namespace Botan; class XOR_Cipher : public StreamCipher { public: void clear() throw() { mask.clear(); mask_pos = 0; } // what we want to call this cipher std::string name() const { return "XOR"; } // return a new object of this type StreamCipher* clone() const { return new XOR_Cipher; } Key_Length_Specification key_spec() const { return Key_Length_Specification(1, 32); } XOR_Cipher() : mask_pos(0) {} private: void cipher(const byte in[], byte out[], size_t length) { for(size_t j = 0; j != length; j++) { out[j] = in[j] ^ mask[mask_pos]; mask_pos = (mask_pos + 1) % mask.size(); } } void key_schedule(const byte key[], size_t length) { mask.resize(length); copy_mem(&mask[0], key, length); } SecureVector mask; u32bit mask_pos; }; class Application_Engine : public Engine { public: std::string provider_name() const { return "application"; } StreamCipher* find_stream_cipher(const SCAN_Name& request, Algorithm_Factory&) const { if(request.algo_name() == "XOR") return new XOR_Cipher; return 0; } }; #include #include #include int main() { Botan::LibraryInitializer init; global_state().algorithm_factory().add_engine( new Application_Engine); // a hex key value SymmetricKey key("010203040506070809101112AAFF"); /* Since stream ciphers are typically additive, the encryption and decryption ops are the same, so this isn't terribly interesting. If this where a block cipher you would have to add a cipher mode and padding method, such as "/CBC/PKCS7". */ Pipe enc(get_cipher("XOR", key, ENCRYPTION), new Hex_Encoder); Pipe dec(new Hex_Decoder, get_cipher("XOR", key, DECRYPTION)); // I think the pigeons are actually asleep at midnight... std::string secret = "The pigeon flys at midnight."; std::cout << "The secret message is '" << secret << "'" << std::endl; enc.process_msg(secret); std::string cipher = enc.read_all_as_string(); std::cout << "The encrypted secret message is " << cipher << std::endl; dec.process_msg(cipher); secret = dec.read_all_as_string(); std::cout << "The decrypted secret message is '" << secret << "'" << std::endl; return 0; } Botan-1.10.12/doc/examples/package.cpp0000664000175000017500000000260312654331322017247 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include using namespace Botan; namespace { std::vector slurp_file(const std::string& filename) { std::ifstream in(filename.c_str(), std::ios::binary); std::vector out; byte buf[4096] = { 0 }; while(in.good()) { in.read((char*)buf, sizeof(buf)); ssize_t got = in.gcount(); out.insert(out.end(), buf, buf+got); } return out; } } int main(int argc, char* argv[]) { if(argc != 2) { std::cout << "Usage: " << argv[0] << " filename\n"; return 1; } LibraryInitializer init; AutoSeeded_RNG rng; BlockCipher* cipher = new Serpent; std::vector input = slurp_file(argv[1]); std::vector output(input.size() + cipher->block_size()); aont_package(rng, new Serpent, &input[0], input.size(), &output[0]); std::vector unpackage_output(output.size() - cipher->block_size()); aont_unpackage(new Serpent, &output[0], output.size(), &unpackage_output[0]); if(unpackage_output == input) std::cout << "Package/unpackage worked\n"; else std::cout << "Something went wrong :(\n"; } Botan-1.10.12/doc/examples/passhash.cpp0000664000175000017500000000200712654331322017464 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include int main(int argc, char* argv[]) { if(argc != 2 && argc != 3) { std::cerr << "Usage: " << argv[0] << " password\n"; std::cerr << "Usage: " << argv[0] << " password hash\n"; return 1; } Botan::LibraryInitializer init; try { if(argc == 2) { Botan::AutoSeeded_RNG rng; std::cout << "H('" << argv[1] << "') = " << Botan::generate_passhash9(argv[1], rng) << '\n'; } else { bool ok = Botan::check_passhash9(argv[1], argv[2]); if(ok) std::cout << "Password and hash match\n"; else std::cout << "Password and hash do not match\n"; } } catch(std::exception& e) { std::cerr << e.what() << '\n'; return 1; } return 0; } Botan-1.10.12/doc/examples/pkcs10.cpp0000664000175000017500000000215612654331322016760 0ustar jackjack00000000000000#include #include #include #include #include using namespace Botan; #include #include #include int main(int argc, char* argv[]) { if(argc != 6) { std::cout << "Usage: " << argv[0] << " passphrase name country_code organization email" << std::endl; return 1; } Botan::LibraryInitializer init; try { AutoSeeded_RNG rng; RSA_PrivateKey priv_key(rng, 1024); std::ofstream key_file("private.pem"); key_file << PKCS8::PEM_encode(priv_key, rng, argv[1]); X509_Cert_Options opts; opts.common_name = argv[2]; opts.country = argv[3]; opts.organization = argv[4]; opts.email = argv[5]; PKCS10_Request req = X509::create_cert_req(opts, priv_key, "SHA-256", rng); std::ofstream req_file("req.pem"); req_file << req.PEM_encode(); } catch(std::exception& e) { std::cout << e.what() << std::endl; return 1; } return 0; } Botan-1.10.12/doc/examples/pqg_gen.cpp0000664000175000017500000000540312654331322017275 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #include using namespace Botan; bool check(RandomNumberGenerator& rng, std::map); int main() { try { Botan::LibraryInitializer init("use_engines"); AutoSeeded_RNG rng; std::ifstream in("PQGGen.rsp"); if(!in) throw std::runtime_error("Can't open response file"); std::map inputs; while(in.good()) { std::string line; std::getline(in, line); if(line == "" || line[0] == '[' || line[0] == '#') continue; std::vector name_and_val = split_on(line, '='); if(name_and_val.size() != 2) throw std::runtime_error("Unexpected input: " + line); name_and_val[0].erase(name_and_val[0].size()-1); name_and_val[1].erase(0, 1); std::string name = name_and_val[0], value = name_and_val[1]; inputs[name] = value; if(name == "H") { bool result = check(rng, inputs); std::cout << "." << std::flush; if(result == false) { std::cout << " Check failed\n"; std::map::const_iterator i; for(i = inputs.begin(); i != inputs.end(); i++) std::cout << i->first << " = " << i->second << "\n"; std::cout << "\n"; } inputs.clear(); } } } catch(std::exception& e) { std::cout << e.what() << std::endl; return 1; } return 0; } bool check(RandomNumberGenerator& rng, std::map inputs) { BigInt p("0x"+inputs["P"]), q("0x"+inputs["Q"]), g("0x"+inputs["G"]), h("0x"+inputs["H"]); if(h < 1 || h >= p-1) return false; //u32bit c = to_u32bit(inputs["c"]); Pipe pipe(new Hex_Decoder); pipe.process_msg(inputs["Seed"]); SecureVector seed = pipe.read_all(); BigInt our_p, our_q; u32bit qbits = (p.bits() <= 1024) ? 160 : 256; Algorithm_Factory& af = global_state().algorithm_factory(); bool found = generate_dsa_primes(rng, af, our_p, our_q, p.bits(), qbits, seed); if(!found) /* bad seed */ return false; if(our_p != p) return false; if(our_q != q) return false; BigInt our_g = power_mod(h, (p-1)/q, p); if(our_g != g) return false; return true; } Botan-1.10.12/doc/examples/python/cipher.py0000775000175000017500000000175312654331322020325 0ustar jackjack00000000000000#!/usr/bin/python import botan import sys def encrypt(input, passphrase): rng = botan.RandomNumberGenerator() # Use as both EAX IV and PBKDF2 salt salt = rng.gen_random(10) iterations = 10000 output_size = 16 key = botan.pbkdf2(passphrase, salt, iterations, output_size, "SHA-1") encryptor = botan.Cipher("AES-128/EAX", "encrypt", key) ciphertext = encryptor.cipher(input, salt) return (ciphertext, salt) def decrypt(input, salt, passphrase): iterations = 10000 output_size = 16 key = botan.pbkdf2(passphrase, salt, iterations, output_size, "SHA-1") decryptor = botan.Cipher("AES-128/EAX", "decrypt", key) return decryptor.cipher(input, salt) def main(args = None): if args is None: args = sys.argv passphrase = args[1] input = ''.join(open(args[2]).readlines()) (ciphertext, salt) = encrypt(input, passphrase) print decrypt(ciphertext, salt, passphrase) if __name__ == '__main__': sys.exit(main()) Botan-1.10.12/doc/examples/python/cryptobox.py0000775000175000017500000000136712654331322021105 0ustar jackjack00000000000000#!/usr/bin/python import sys import botan def main(args = None): if args is None: args = sys.argv if len(args) != 3: raise Exception("Usage: "); password = args[1] input = ''.join(open(args[2]).readlines()) rng = botan.RandomNumberGenerator() ciphertext = botan.cryptobox_encrypt(input, password, rng) print ciphertext plaintext = '' try: plaintext = botan.cryptobox_decrypt(ciphertext, password + 'FAIL') except Exception, e: print "Good news: bad password caused exception: " print e plaintext = botan.cryptobox_decrypt(ciphertext, password) print "Original input was: " print plaintext if __name__ == '__main__': sys.exit(main()) Botan-1.10.12/doc/examples/python/nisttest.py0000775000175000017500000000356612654331322020734 0ustar jackjack00000000000000#!/usr/bin/python import sys, os, botan from os.path import join; def validate(ca_certs, certs, crls, ee_certs): store = botan.X509_Store() for cert in certs: if cert not in ee_certs: store.add_cert(botan.X509_Certificate(cert), cert in ca_certs) for crl in crls: r = store.add_crl(botan.X509_CRL(crl)) if r != botan.verify_result.verified: return r for ee in ee_certs: r = store.validate(botan.X509_Certificate(ee)) if r != botan.verify_result.verified: return r return botan.verify_result.verified def run_test(files, rootdir, testname, expected): crls = [join(rootdir,x) for x in files if x.endswith(".crl")] certs = [join(rootdir,x) for x in files if x.endswith(".crt")] end_entity = [x for x in certs if x.find("end.crt") != -1] ca_certs = [x for x in certs if x.find("root.crt") != -1] print "%s..." % testname, result = validate(ca_certs, certs, crls, end_entity) result = repr(result).replace('botan._botan.verify_result.', '') if result != expected: print "FAILED: got %s, expected %s" % (result, expected) else: print "passed" def main(): def load_results(file): results = {} for line in open(file, 'r'): line = line[0:line.find('#')].strip() if line: test,result = line.split(' ') results[test] = result return results results = load_results('results.vec') for root, dirs, files in os.walk('../../checks/nist_tests/tests'): if files: thistest = root[root.rfind('/')+1:] if thistest in results: run_test(files, root, thistest, results[thistest]) else: print "%s... skipping - no expected result set" % thistest if __name__ == "__main__": sys.exit(main()) Botan-1.10.12/doc/examples/python/results.vec0000664000175000017500000000303012654331322020664 0ustar jackjack00000000000000# This is the file of expected results for nisttest.py test01 verified test02 signature_error test03 signature_error test04 verified test05 cert_not_yet_valid test06 cert_not_yet_valid test07 verified test08 cert_not_yet_valid test09 cert_has_expired test10 cert_has_expired test11 cert_has_expired test12 verified test13 cert_issuer_not_found test14 cert_issuer_not_found test15 verified test16 verified test17 verified test18 verified # changed; should be no_revocation_data_available, but I don't want to # force people to use CRLs test19 verified test20 cert_is_revoked test21 cert_is_revoked test22 ca_cert_not_for_cert_issuer test23 ca_cert_not_for_cert_issuer test24 verified test25 ca_cert_not_for_cert_issuer test26 verified test27 verified test28 ca_cert_not_for_cert_issuer test29 ca_cert_not_for_cert_issuer test30 verified test31 ca_cert_not_for_crl_issuer test32 ca_cert_not_for_crl_issuer test33 verified test54 cert_chain_too_long test55 cert_chain_too_long test56 verified test57 verified test58 cert_chain_too_long test59 cert_chain_too_long test60 cert_chain_too_long test61 cert_chain_too_long test62 verified test63 verified test64 signature_error # changed; I have no idea why this test is supposed to fail test65 verified test66 crl_issuer_not_found # changed; one of the CRLs has an unknown creator, so we fail # prior to getting to the end-entity check test67 crl_issuer_not_found test68 cert_is_revoked test69 cert_is_revoked test70 cert_is_revoked test71 cert_is_revoked test72 crl_has_expired test73 crl_has_expired test74 verified Botan-1.10.12/doc/examples/python/rng_test.py0000775000175000017500000000060012654331322020666 0ustar jackjack00000000000000#!/usr/bin/python import botan rng = botan.RandomNumberGenerator() print "name", rng.name() rng.add_entropy("blah") print "random 16", rng.gen_random(16).encode("hex") print "random 32", rng.gen_random(32).encode("base64"), rng.reseed() for i in range(0, 10): print rng.gen_random_byte(), print rng.add_entropy("blah") print "random 16", rng.gen_random(16).encode("hex") Botan-1.10.12/doc/examples/python/rsa.py0000775000175000017500000000210512654331322017630 0ustar jackjack00000000000000#!/usr/bin/python import botan def make_into_c_array(ber): output = 'static unsigned char key_data[%d] = {\n\t' % (len(ber)) for (idx,c) in zip(range(len(ber)), ber): if idx != 0 and idx % 8 == 0: output += "\n\t" output += "0x%s, " % (c.encode('hex')) output += "\n};\n" return output rng = botan.RandomNumberGenerator() rsa_priv = botan.RSA_PrivateKey(768, rng) print rsa_priv.to_string() print int(rsa_priv.get_N()) print int(rsa_priv.get_E()) rsa_pub = botan.RSA_PublicKey(rsa_priv) print make_into_c_array(rsa_pub.to_ber()) #print make_into_c_array(rsa_priv.to_ber()) key = rng.gen_random(20) ciphertext = rsa_pub.encrypt(key, 'EME1(SHA-1)', rng) print ciphertext.encode('hex') plaintext = rsa_priv.decrypt(ciphertext, 'EME1(SHA-1)') print plaintext == key signature = rsa_priv.sign(key, 'EMSA4(SHA-256)', rng) print rsa_pub.verify(key, signature, 'EMSA4(SHA-256)') # Corrupt the signature, make sure it doesn't verify signature = signature.replace(signature[0], '0') print rsa_pub.verify(key, signature, 'EMSA4(SHA-256)') Botan-1.10.12/doc/examples/read_ssh.cpp0000664000175000017500000000467612654331322017460 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ /* * Example of reading SSH2 format public keys (see RFC 4716) */ #include #include #include #include #include #include using namespace Botan; namespace { u32bit read_u32bit(Pipe& pipe) { byte out[4] = { 0 }; pipe.read(out, 4); u32bit len = load_be(out, 0); if(len > 10000) throw Decoding_Error("Huge size in read_u32bit, something went wrong"); return len; } std::string read_string(Pipe& pipe) { u32bit len = read_u32bit(pipe); std::string out(len, 'X'); pipe.read(reinterpret_cast(&out[0]), len); return out; } BigInt read_bigint(Pipe& pipe) { u32bit len = read_u32bit(pipe); SecureVector buf(len); pipe.read(&buf[0], len); return BigInt::decode(buf); } Public_Key* read_ssh_pubkey(const std::string& file) { std::ifstream in(file.c_str()); const std::string ssh_header = "---- BEGIN SSH2 PUBLIC KEY ----"; const std::string ssh_trailer = "---- END SSH2 PUBLIC KEY ----"; std::string hex_bits; std::string line; std::getline(in, line); if(line != ssh_header) return 0; while(in.good()) { std::getline(in, line); if(line.find("Comment: ") == 0) { while(line[line.size()-1] == '\\') std::getline(in, line); std::getline(in, line); } if(line == ssh_trailer) break; hex_bits += line; } Pipe pipe(new Base64_Decoder); pipe.process_msg(hex_bits); std::string key_type = read_string(pipe); if(key_type != "ssh-rsa" && key_type != "ssh-dss") return 0; if(key_type == "ssh-rsa") { BigInt e = read_bigint(pipe); BigInt n = read_bigint(pipe); return new RSA_PublicKey(n, e); } else if(key_type == "ssh-dss") { BigInt p = read_bigint(pipe); BigInt q = read_bigint(pipe); BigInt g = read_bigint(pipe); BigInt y = read_bigint(pipe); return new DSA_PublicKey(DL_Group(p, q, g), y); } return 0; } } #include #include int main() { LibraryInitializer init; Public_Key* key = read_ssh_pubkey("dsa.ssh"); if(key == 0) { std::cout << "Failed\n"; return 1; } std::cout << X509::PEM_encode(*key); delete key; return 0; } Botan-1.10.12/doc/examples/rng_test.cpp0000664000175000017500000000554512654331322017511 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include using namespace Botan; namespace { class Fixed_Output_RNG : public RandomNumberGenerator { public: bool is_seeded() const { return !buf.empty(); } byte random() { if(buf.empty()) throw std::runtime_error("Out of bytes"); byte out = buf.front(); buf.pop_front(); return out; } void randomize(byte out[], size_t len) throw() { for(size_t j = 0; j != len; j++) out[j] = random(); } std::string name() const { return "Fixed_Output_RNG"; } void reseed(size_t) {} void clear() throw() {} void add_entropy(const byte in[], size_t len) { buf.insert(buf.end(), in, in + len); } void add_entropy_source(EntropySource* es) { delete es; } Fixed_Output_RNG() {} private: std::deque buf; }; void x931_tests(std::vector > vecs, const std::string& cipher) { for(size_t j = 0; j != vecs.size(); ++j) { const std::string result = vecs[j].first; const std::string input = vecs[j].second; ANSI_X931_RNG prng(get_block_cipher(cipher), new Fixed_Output_RNG); SecureVector x = hex_decode(input); prng.add_entropy(x.begin(), x.size()); SecureVector output(result.size() / 2); prng.randomize(output, output.size()); if(hex_decode(result) != output) std::cout << "FAIL"; else std::cout << "PASS"; std::cout << " Seed " << input << " " << "Got " << hex_encode(output) << " " << "Exp " << result << "\n"; } } std::vector > read_file(const std::string& fsname) { std::ifstream in(fsname.c_str()); std::vector > out; while(in.good()) { std::string line; std::getline(in, line); if(line == "") break; std::vector l = split_on(line, ':'); if(l.size() != 2) throw std::runtime_error("Bad line " + line); out.push_back(std::make_pair(l[0], l[1])); } return out; } } int main() { Botan::LibraryInitializer init; x931_tests(read_file("ANSI931_AES128VST.txt.vst"), "AES-128"); x931_tests(read_file("ANSI931_AES192VST.txt.vst"), "AES-192"); x931_tests(read_file("ANSI931_AES256VST.txt.vst"), "AES-256"); x931_tests(read_file("ANSI931_TDES2VST.txt.vst"), "TripleDES"); x931_tests(read_file("ANSI931_TDES3VST.txt.vst"), "TripleDES"); } Botan-1.10.12/doc/examples/row_encryptor.cpp0000664000175000017500000001105512654331322020571 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include using namespace Botan; /* * Encrypt and decrypt small rows */ class Row_Encryptor { public: Row_Encryptor(const std::string& passphrase, RandomNumberGenerator& rng); Row_Encryptor(const std::string& passphrase, const MemoryRegion& salt); std::string encrypt(const std::string& input, const MemoryRegion& salt); std::string decrypt(const std::string& input, const MemoryRegion& salt); SecureVector get_pbkdf_salt() const { return pbkdf_salt; } private: void init(const std::string& passphrase); Row_Encryptor(const Row_Encryptor&) {} Row_Encryptor& operator=(const Row_Encryptor&) { return (*this); } SecureVector pbkdf_salt; Pipe enc_pipe, dec_pipe; EAX_Encryption* eax_enc; // owned by enc_pipe EAX_Decryption* eax_dec; // owned by dec_pipe; }; Row_Encryptor::Row_Encryptor(const std::string& passphrase, RandomNumberGenerator& rng) { pbkdf_salt.resize(10); // 80 bits rng.randomize(&pbkdf_salt[0], pbkdf_salt.size()); init(passphrase); } Row_Encryptor::Row_Encryptor(const std::string& passphrase, const MemoryRegion& salt) { pbkdf_salt = salt; init(passphrase); } void Row_Encryptor::init(const std::string& passphrase) { std::auto_ptr pbkdf(get_pbkdf("PBKDF2(SHA-160)")); SecureVector key = pbkdf->derive_key(32, passphrase, &pbkdf_salt[0], pbkdf_salt.size(), 10000).bits_of(); /* Save pointers to the EAX objects so we can change the IV as needed */ Algorithm_Factory& af = global_state().algorithm_factory(); const BlockCipher* proto = af.prototype_block_cipher("Serpent"); if(!proto) throw std::runtime_error("Could not get a Serpent proto object"); enc_pipe.append(eax_enc = new EAX_Encryption(proto->clone())); dec_pipe.append(eax_dec = new EAX_Decryption(proto->clone())); eax_enc->set_key(key); eax_dec->set_key(key); } std::string Row_Encryptor::encrypt(const std::string& input, const MemoryRegion& salt) { eax_enc->set_iv(salt); enc_pipe.process_msg(input); return enc_pipe.read_all_as_string(Pipe::LAST_MESSAGE); } std::string Row_Encryptor::decrypt(const std::string& input, const MemoryRegion& salt) { eax_dec->set_iv(salt); dec_pipe.process_msg(input); return dec_pipe.read_all_as_string(Pipe::LAST_MESSAGE); } /* * Test code follows: */ int main() { Botan::LibraryInitializer init; AutoSeeded_RNG rng; const std::string secret_passphrase = "secret passphrase"; Row_Encryptor encryptor("secret passphrase", rng); std::vector original_inputs; for(u32bit i = 0; i != 50000; ++i) { std::ostringstream out; u32bit output_bytes = rng.next_byte(); for(u32bit j = 0; j != output_bytes; ++j) out << std::hex << (int)rng.next_byte(); original_inputs.push_back(out.str()); } std::vector encrypted_values; MemoryVector salt(4); // keep out of loop to avoid excessive dynamic allocation for(u32bit i = 0; i != original_inputs.size(); ++i) { std::string input = original_inputs[i]; for(u32bit j = 0; j != 4; ++j) salt[j] = (i >> 8) & 0xFF; encrypted_values.push_back(encryptor.encrypt(input, salt)); } for(u32bit i = 0; i != encrypted_values.size(); ++i) { std::string ciphertext = encrypted_values[i]; // NOTE: same salt value as previous loop (index value) for(u32bit j = 0; j != 4; ++j) salt[j] = (i >> 8) & 0xFF; std::string output = encryptor.decrypt(ciphertext, salt); if(output != original_inputs[i]) std::cout << "BOOM " << i << "\n"; } Row_Encryptor test_pbkdf_salt_copy(secret_passphrase, encryptor.get_pbkdf_salt()); zeroise(salt); std::string test = test_pbkdf_salt_copy.decrypt(encrypted_values[0], salt); if(test != original_inputs[0]) std::cout << "PBKDF salt copy failed to decrypt properly\n"; return 0; } Botan-1.10.12/doc/examples/rsa_dec.cpp0000664000175000017500000000660312654331322017260 0ustar jackjack00000000000000/* * (C) 2002-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ /* Decrypt an encrypted RSA private key. Then use that key to decrypt a message. This program can decrypt messages generated by rsa_enc, and uses the same key format as that generated by rsa_kgen. */ #include #include #include #include #include #include #include using namespace Botan; SecureVector b64_decode(const std::string&); SymmetricKey derive_key(const std::string&, const SymmetricKey&, u32bit); const std::string SUFFIX = ".enc"; int main(int argc, char* argv[]) { if(argc != 4) { std::cout << "Usage: " << argv[0] << " keyfile messagefile passphrase" << std::endl; return 1; } Botan::LibraryInitializer init; try { AutoSeeded_RNG rng; std::auto_ptr key( PKCS8::load_key(argv[1], rng, argv[3])); RSA_PrivateKey* rsakey = dynamic_cast(key.get()); if(!rsakey) { std::cout << "The loaded key is not a RSA key!\n"; return 1; } std::ifstream message(argv[2]); if(!message) { std::cout << "Couldn't read the message file." << std::endl; return 1; } std::string outfile(argv[2]); outfile = outfile.replace(outfile.find(SUFFIX), SUFFIX.length(), ""); std::ofstream plaintext(outfile.c_str(), std::ios::binary); if(!plaintext) { std::cout << "Couldn't write the plaintext to " << outfile << std::endl; return 1; } std::string enc_masterkey_str; std::getline(message, enc_masterkey_str); std::string mac_str; std::getline(message, mac_str); SecureVector enc_masterkey = b64_decode(enc_masterkey_str); PK_Decryptor_EME decryptor(*rsakey, "EME1(SHA-1)"); SecureVector masterkey = decryptor.decrypt(enc_masterkey); SymmetricKey cast_key = derive_key("CAST", masterkey, 16); InitializationVector iv = derive_key("IV", masterkey, 8); SymmetricKey mac_key = derive_key("MAC", masterkey, 16); Pipe pipe(new Base64_Decoder, get_cipher("CAST-128/CBC/PKCS7", cast_key, iv, DECRYPTION), new Fork( 0, new Chain( new MAC_Filter("HMAC(SHA-1)", mac_key, 12), new Base64_Encoder ) ) ); pipe.start_msg(); message >> pipe; pipe.end_msg(); std::string our_mac = pipe.read_all_as_string(1); if(our_mac != mac_str) std::cout << "WARNING: MAC in message failed to verify\n"; plaintext << pipe.read_all_as_string(0); } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; return 1; } return 0; } SecureVector b64_decode(const std::string& in) { Pipe pipe(new Base64_Decoder); pipe.process_msg(in); return pipe.read_all(); } SymmetricKey derive_key(const std::string& param, const SymmetricKey& masterkey, u32bit outputlength) { std::auto_ptr kdf(get_kdf("KDF2(SHA-1)")); return kdf->derive_key(outputlength, masterkey.bits_of(), param); } Botan-1.10.12/doc/examples/rsa_enc.cpp0000664000175000017500000001125512654331322017271 0ustar jackjack00000000000000/* * (C) 2002 Jack Lloyd * * Distributed under the terms of the Botan license */ /* Grab an RSA public key from the file given as an argument, grab a message from another file, and encrypt the message. Algorithms used: RSA with EME1(SHA-1) padding to encrypt the master key CAST-128 in CBC mode with PKCS#7 padding to encrypt the message. HMAC with SHA-1 is used to authenticate the message The keys+IV used are derived from the master key (the thing that's encrypted with RSA) using KDF2(SHA-1). The 3 outputs of KDF2 are parameterized by P, where P is "CAST", "IV" or "MAC", in order to make each key/IV unique. The format is: 1) First line is the master key, encrypted with the recipients public key using EME1(SHA-1), and then base64 encoded. 2) Second line is the first 96 bits (12 bytes) of the HMAC(SHA-1) of the _plaintext_ 3) Following lines are base64 encoded ciphertext (CAST-128 as described), each broken after ~72 characters. */ #include #include #include #include #include #include #include using namespace Botan; std::string b64_encode(const SecureVector&); SymmetricKey derive_key(const std::string&, const SymmetricKey&, u32bit); int main(int argc, char* argv[]) { if(argc != 3) { std::cout << "Usage: " << argv[0] << " keyfile messagefile" << std::endl; return 1; } std::ifstream message(argv[2], std::ios::binary); if(!message) { std::cout << "Couldn't read the message file." << std::endl; return 1; } Botan::LibraryInitializer init; std::string output_name(argv[2]); output_name += ".enc"; std::ofstream ciphertext(output_name.c_str()); if(!ciphertext) { std::cout << "Couldn't write the ciphertext to " << output_name << std::endl; return 1; } try { std::auto_ptr key(X509::load_key(argv[1])); RSA_PublicKey* rsakey = dynamic_cast(key.get()); if(!rsakey) { std::cout << "The loaded key is not a RSA key!\n"; return 1; } AutoSeeded_RNG rng; PK_Encryptor_EME encryptor(*rsakey, "EME1(SHA-1)"); /* Generate the master key (the other keys are derived from this) Basically, make the key as large as can be encrypted by this key, up to a limit of 256 bits. For 512 bit keys, the master key will be >160 bits. A >600 bit key will use the full 256 bit master key. In theory, this is not enough, because we derive 16+16+8=40 bytes of secrets (if you include the IV) using the master key, so they are not statistically indepedent. Practically speaking I don't think this is a problem. */ SymmetricKey masterkey(rng, std::min(32, encryptor.maximum_input_size())); SymmetricKey cast_key = derive_key("CAST", masterkey, 16); SymmetricKey mac_key = derive_key("MAC", masterkey, 16); SymmetricKey iv = derive_key("IV", masterkey, 8); SecureVector encrypted_key = encryptor.encrypt(masterkey.bits_of(), rng); ciphertext << b64_encode(encrypted_key) << std::endl; Pipe pipe(new Fork( new Chain( get_cipher("CAST-128/CBC/PKCS7", cast_key, iv, ENCRYPTION), new Base64_Encoder(true) // true == do linebreaking ), new Chain( new MAC_Filter("HMAC(SHA-1)", mac_key, 12), new Base64_Encoder ) ) ); pipe.start_msg(); message >> pipe; pipe.end_msg(); /* Write the MAC as the second line. That way we can pull it off right from the start, and feed the rest of the file right into a pipe on the decrypting end. */ ciphertext << pipe.read_all_as_string(1) << std::endl; ciphertext << pipe.read_all_as_string(0); } catch(std::exception& e) { std::cout << "Exception: " << e.what() << std::endl; } return 0; } std::string b64_encode(const SecureVector& in) { Pipe pipe(new Base64_Encoder); pipe.process_msg(in); return pipe.read_all_as_string(); } SymmetricKey derive_key(const std::string& param, const SymmetricKey& masterkey, u32bit outputlength) { std::auto_ptr kdf(get_kdf("KDF2(SHA-1)")); return kdf->derive_key(outputlength, masterkey.bits_of(), param); } Botan-1.10.12/doc/examples/rsa_kgen.cpp0000664000175000017500000000222212654331322017442 0ustar jackjack00000000000000#include #include #include #include #include #include #include using namespace Botan; int main(int argc, char* argv[]) { if(argc != 2 && argc != 3) { std::cout << "Usage: " << argv[0] << " bitsize [passphrase]" << std::endl; return 1; } const size_t bits = std::atoi(argv[1]); if(bits < 1024 || bits > 16384) { std::cout << "Invalid argument for bitsize" << std::endl; return 1; } try { Botan::LibraryInitializer init; std::ofstream pub("rsapub.pem"); std::ofstream priv("rsapriv.pem"); if(!priv || !pub) { std::cout << "Couldn't write output files" << std::endl; return 1; } AutoSeeded_RNG rng; RSA_PrivateKey key(rng, bits); pub << X509::PEM_encode(key); if(argc == 2) priv << PKCS8::PEM_encode(key); else priv << PKCS8::PEM_encode(key, rng, argv[2]); } catch(std::exception& e) { std::cout << "Exception caught: " << e.what() << std::endl; } return 0; } Botan-1.10.12/doc/examples/rsa_manykey.cpp0000664000175000017500000000132612654331322020177 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ /* Generate a whole sequence of keys (for benchmarking) */ #include #include #include #include #include #include #include #include using namespace Botan; int main() { Botan::LibraryInitializer init; AutoSeeded_RNG rng; for(u32bit j = 512; j <= 8192; j += 256) { std::cout << j << "..."; RSA_PrivateKey key(rng, j); std::ofstream priv(("rsa/" + to_string(j) + ".pem").c_str()); priv << PKCS8::PEM_encode(key); priv.close(); std::cout << " done" << std::endl; } return 0; } Botan-1.10.12/doc/examples/self_sig.cpp0000664000175000017500000000274212654331322017453 0ustar jackjack00000000000000#include #include #include #include using namespace Botan; #include #include #include int main(int argc, char* argv[]) { if(argc != 7) { std::cout << "Usage: " << argv[0] << " passphrase [CA|user] name country_code organization email" << std::endl; return 1; } Botan::LibraryInitializer init; std::string CA_flag = argv[2]; bool do_CA = false; if(CA_flag == "CA") do_CA = true; else if(CA_flag == "user") do_CA = false; else { std::cout << "Bad flag for CA/user switch: " << CA_flag << std::endl; return 1; } try { AutoSeeded_RNG rng; RSA_PrivateKey key(rng, 2048); std::ofstream priv_key("private.pem"); priv_key << PKCS8::PEM_encode(key, rng, argv[1]); X509_Cert_Options opts; opts.common_name = argv[3]; opts.country = argv[4]; opts.organization = argv[5]; opts.email = argv[6]; /* Fill in other values of opts here */ //opts.xmpp = "lloyd@randombit.net"; if(do_CA) opts.CA_key(); X509_Certificate cert = X509::create_self_signed_cert(opts, key, "SHA-256", rng); std::ofstream cert_file("cert.pem"); cert_file << cert.PEM_encode(); } catch(std::exception& e) { std::cout << "Exception: " << e.what() << std::endl; return 1; } return 0; } Botan-1.10.12/doc/examples/sig_gen.cpp0000664000175000017500000000430012654331322017263 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include using namespace Botan; bool check(std::map); int main() { try { Botan::LibraryInitializer init; std::ifstream in("SigGen.rsp"); if(!in) throw Exception("Can't open response file"); std::map inputs; while(in.good()) { std::string line; std::getline(in, line); if(line == "" || line[0] == '[' || line[0] == '#') continue; std::vector name_and_val = split_on(line, '='); if(name_and_val.size() != 2) throw Decoding_Error("Unexpected input: " + line); name_and_val[0].erase(name_and_val[0].size()-1); name_and_val[1].erase(0, 1); std::string name = name_and_val[0], value = name_and_val[1]; inputs[name] = value; if(name == "S") { bool result = check(inputs); if(result == false) { std::cout << " Check failed\n"; std::map::const_iterator i; for(i = inputs.begin(); i != inputs.end(); i++) std::cout << i->first << " = " << i->second << "\n"; } inputs["Msg"] = inputs["R"] = inputs["S"] = ""; } } } catch(std::exception& e) { std::cout << e.what() << std::endl; return 1; } return 0; } bool check(std::map inputs) { BigInt p("0x"+inputs["P"]), q("0x"+inputs["Q"]), g("0x"+inputs["G"]), y("0x"+inputs["Y"]); DSA_PublicKey key(DL_Group(p, q, g), y); Pipe pipe(new Hex_Decoder); pipe.process_msg(inputs["Msg"]); pipe.start_msg(); pipe.write(inputs["R"]); pipe.write(inputs["S"] ); pipe.end_msg(); PK_Verifier verifier(key, "EMSA1(SHA-1)"); return verifier.verify_message(pipe.read_all(0), pipe.read_all(1)); } Botan-1.10.12/doc/examples/socket.h0000664000175000017500000001335012654331322016612 0ustar jackjack00000000000000/* * Unix Socket * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef SOCKET_WRAPPER_H__ #define SOCKET_WRAPPER_H__ #include #if defined(_MSC_VER) #define SOCKET_IS_WINSOCK 1 #endif #if !defined(SOCKET_IS_WINSOCK) #define SOCKET_IS_WINSOCK 0 #endif #if SOCKET_IS_WINSOCK #include typedef SOCKET socket_t; const socket_t invalid_socket = INVALID_SOCKET; #define socket_error_code WSAGetLastError() typedef int ssize_t; class SocketInitializer { public: SocketInitializer() { WSADATA wsadata; WSAStartup(MAKEWORD(2, 2), &wsadata); } ~SocketInitializer() { WSACleanup(); } }; #else #include #include #include #include #include #include #include typedef int socket_t; const socket_t invalid_socket = -1; #define socket_error_code errno #define closesocket close class SocketInitializer {}; #endif #if !defined(MSG_NOSIGNAL) #define MSG_NOSIGNAL 0 #endif #include class Socket { public: size_t read(unsigned char[], size_t); void write(const unsigned char[], size_t); std::string peer_id() const { return peer; } void close() { if(sockfd != invalid_socket) { if(::closesocket(sockfd) != 0) throw std::runtime_error("Socket::close failed"); sockfd = invalid_socket; } } Socket(socket_t fd, const std::string& peer_id = "") : peer(peer_id), sockfd(fd) { } Socket(const std::string&, unsigned short); ~Socket() { close(); } private: std::string peer; socket_t sockfd; }; class Server_Socket { public: /** * Accept a new connection */ Socket* accept() { socket_t retval = ::accept(sockfd, 0, 0); if(retval == invalid_socket) throw std::runtime_error("Server_Socket: accept failed"); return new Socket(retval); } void close() { if(sockfd != invalid_socket) { if(::closesocket(sockfd) != 0) throw std::runtime_error("Server_Socket::close failed"); sockfd = invalid_socket; } } Server_Socket(unsigned short); ~Server_Socket() { close(); } private: socket_t sockfd; }; /** * Unix Socket Constructor */ Socket::Socket(const std::string& host, unsigned short port) : peer(host) { sockfd = invalid_socket; hostent* host_addr = ::gethostbyname(host.c_str()); if(host_addr == 0) throw std::runtime_error("Socket: gethostbyname failed for " + host); if(host_addr->h_addrtype != AF_INET) // FIXME throw std::runtime_error("Socket: " + host + " has IPv6 address"); socket_t fd = ::socket(PF_INET, SOCK_STREAM, 0); if(fd == invalid_socket) throw std::runtime_error("Socket: Unable to acquire socket"); sockaddr_in socket_info; ::memset(&socket_info, 0, sizeof(socket_info)); socket_info.sin_family = AF_INET; socket_info.sin_port = htons(port); ::memcpy(&socket_info.sin_addr, host_addr->h_addr, host_addr->h_length); socket_info.sin_addr = *(struct in_addr*)host_addr->h_addr; // FIXME if(::connect(fd, (sockaddr*)&socket_info, sizeof(struct sockaddr)) != 0) { ::closesocket(fd); throw std::runtime_error("Socket: connect failed"); } sockfd = fd; } /** * Read from a Unix socket */ size_t Socket::read(unsigned char buf[], size_t length) { if(sockfd == invalid_socket) throw std::runtime_error("Socket::read: Socket not connected"); size_t got = 0; while(length) { ssize_t this_time = ::recv(sockfd, (char*)buf + got, length, MSG_NOSIGNAL); if(this_time == 0) break; if(this_time == -1) { if(socket_error_code == EINTR) this_time = 0; else throw std::runtime_error("Socket::read: Socket read failed"); } got += this_time; length -= this_time; } return got; } /** * Write to a Unix socket */ void Socket::write(const unsigned char buf[], size_t length) { if(sockfd == invalid_socket) throw std::runtime_error("Socket::write: Socket not connected"); size_t offset = 0; while(length) { ssize_t sent = ::send(sockfd, (const char*)buf + offset, length, MSG_NOSIGNAL); if(sent == -1) { if(socket_error_code == EINTR) sent = 0; else throw std::runtime_error("Socket::write: Socket write failed"); } offset += sent; length -= sent; } } /** * Unix Server Socket Constructor */ Server_Socket::Server_Socket(unsigned short port) { sockfd = invalid_socket; socket_t fd = ::socket(PF_INET, SOCK_STREAM, 0); if(fd == invalid_socket) throw std::runtime_error("Server_Socket: Unable to acquire socket"); sockaddr_in socket_info; ::memset(&socket_info, 0, sizeof(socket_info)); socket_info.sin_family = AF_INET; socket_info.sin_port = htons(port); // FIXME: support limiting listeners socket_info.sin_addr.s_addr = INADDR_ANY; if(::bind(fd, (sockaddr*)&socket_info, sizeof(struct sockaddr)) != 0) { ::closesocket(fd); throw std::runtime_error("Server_Socket: bind failed"); } if(::listen(fd, 100) != 0) // FIXME: totally arbitrary { ::closesocket(fd); throw std::runtime_error("Server_Socket: listen failed"); } sockfd = fd; } #endif Botan-1.10.12/doc/examples/stack.cpp0000664000175000017500000000454012654331322016763 0ustar jackjack00000000000000/* * (C) 2002 Jack Lloyd * * Distributed under the terms of the Botan license */ /* An Botan example application showing how to use the pop and prepend functions of Pipe. Based on the md5 example. It's output should always be identical to such. */ #include #include #include int main(int argc, char* argv[]) { if(argc < 2) { std::cout << "Usage: " << argv[0] << " " << std::endl; return 1; } Botan::LibraryInitializer init; // this is a pretty vacuous example, but it's useful as a test Botan::Pipe pipe; // CPS == Current Pipe Status, ie what Filters are set up pipe.prepend(new Botan::Hash_Filter("MD5")); // CPS: MD5 pipe.prepend(new Botan::Hash_Filter("RIPEMD-160")); // CPS: RIPEMD-160 | MD5 pipe.prepend(new Botan::Chain( new Botan::Hash_Filter("RIPEMD-160"), new Botan::Hash_Filter("RIPEMD-160"))); // CPS: (RIPEMD-160 | RIPEMD-160) | RIPEMD-160 | MD5 pipe.pop(); // will pop everything inside the Chain as well as Chain itself // CPS: RIPEMD-160 | MD5 pipe.pop(); // will get rid of the RIPEMD-160 Hash_Filter // CPS: MD5 pipe.prepend(new Botan::Hash_Filter("SHA-1")); // CPS: SHA-1 | MD5 pipe.append(new Botan::Hex_Encoder); // CPS: SHA-1 | MD5 | Hex_Encoder pipe.prepend(new Botan::Hash_Filter("SHA-1")); // CPS: SHA-1 | SHA-1 | MD5 | Hex_Encoder pipe.pop(); // Get rid of the Hash_Filter(SHA-1) pipe.pop(); // Get rid of the other Hash_Filter(SHA-1) // CPS: MD5 | Hex_Encoder // The Hex_Encoder is safe because it is at the end of the Pipe, // and pop() pulls off the Filter that is at the start. pipe.prepend(new Botan::Hash_Filter("RIPEMD-160")); // CPS: RIPEMD-160 | MD5 | Hex_Encoder pipe.pop(); // Get rid of that last prepended Hash_Filter(RIPEMD-160) // CPS: MD5 | Hex_Encoder int skipped = 0; for(int j = 1; argv[j] != 0; j++) { std::ifstream file(argv[j], std::ios::binary); if(!file) { std::cout << "ERROR: could not open " << argv[j] << std::endl; skipped++; continue; } pipe.start_msg(); file >> pipe; pipe.end_msg(); file.close(); pipe.set_default_msg(j-1-skipped); std::cout << pipe << " " << argv[j] << std::endl; } return 0; } Botan-1.10.12/doc/examples/tls_client.cpp0000664000175000017500000000403512654331322020015 0ustar jackjack00000000000000#include #include #include "socket.h" using namespace Botan; #include #include #include #include class Client_TLS_Policy : public TLS_Policy { public: bool check_cert(const std::vector& certs) const { for(size_t i = 0; i != certs.size(); ++i) { std::cout << certs[i].to_string(); } std::cout << "Warning: not checking cert signatures\n"; return true; } }; int main(int argc, char* argv[]) { if(argc != 2 && argc != 3) { printf("Usage: %s host [port]\n", argv[0]); return 1; } try { LibraryInitializer botan_init; std::string host = argv[1]; u32bit port = argc == 3 ? Botan::to_u32bit(argv[2]) : 443; printf("Connecting to %s:%d...\n", host.c_str(), port); SocketInitializer socket_init; Socket sock(argv[1], port); AutoSeeded_RNG rng; Client_TLS_Policy policy; TLS_Client tls(std::tr1::bind(&Socket::read, std::tr1::ref(sock), _1, _2), std::tr1::bind(&Socket::write, std::tr1::ref(sock), _1, _2), policy, rng); printf("Handshake extablished...\n"); #if 0 std::string http_command = "GET / HTTP/1.1\r\n" "Server: " + host + ':' + to_string(port) + "\r\n\r\n"; #else std::string http_command = "GET / HTTP/1.0\r\n\r\n"; #endif tls.write((const Botan::byte*)http_command.c_str(), http_command.length()); size_t total_got = 0; while(true) { if(tls.is_closed()) break; Botan::byte buf[128+1] = { 0 }; size_t got = tls.read(buf, sizeof(buf)-1); printf("%s", buf); fflush(0); total_got += got; } printf("\nRetrieved %d bytes total\n", total_got); } catch(std::exception& e) { printf("%s\n", e.what()); return 1; } return 0; } Botan-1.10.12/doc/examples/tls_server.cpp0000664000175000017500000000460612654331322020051 0ustar jackjack00000000000000#include #include #include #include #include #include "socket.h" using namespace Botan; #include #include #include #include class Server_TLS_Policy : public TLS_Policy { public: bool check_cert(const std::vector& certs) const { for(size_t i = 0; i != certs.size(); ++i) { std::cout << certs[i].to_string(); } std::cout << "Warning: not checking cert signatures\n"; return true; } }; int main(int argc, char* argv[]) { int port = 4433; if(argc == 2) port = to_u32bit(argv[1]); try { LibraryInitializer botan_init; SocketInitializer socket_init; AutoSeeded_RNG rng; //RSA_PrivateKey key(rng, 1024); DSA_PrivateKey key(rng, DL_Group("dsa/jce/1024")); X509_Cert_Options options( "localhost/US/Syn Ack Labs/Mathematical Munitions Dept"); X509_Certificate cert = X509::create_self_signed_cert(options, key, "SHA-1", rng); Server_Socket listener(port); Server_TLS_Policy policy; while(true) { try { printf("Listening for new connection on port %d\n", port); Socket* sock = listener.accept(); printf("Got new connection\n"); TLS_Server tls( std::tr1::bind(&Socket::read, std::tr1::ref(sock), _1, _2), std::tr1::bind(&Socket::write, std::tr1::ref(sock), _1, _2), policy, rng, cert, key); std::string hostname = tls.requested_hostname(); if(hostname != "") printf("Client requested host '%s'\n", hostname.c_str()); printf("Writing some text\n"); char msg[] = "Foo\nBar\nBaz\nQuux\n"; tls.write((const Botan::byte*)msg, strlen(msg)); printf("Now trying a read...\n"); char buf[1024] = { 0 }; u32bit got = tls.read((Botan::byte*)buf, sizeof(buf)-1); printf("%d: '%s'\n", got, buf); tls.close(); } catch(std::exception& e) { printf("%s\n", e.what()); } } } catch(std::exception& e) { printf("%s\n", e.what()); return 1; } return 0; } Botan-1.10.12/doc/examples/toolbox.cpp0000664000175000017500000001271512654331322017347 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #if defined(BOTAN_HAS_COMPRESSOR_BZIP2) #include #endif #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) #include #endif #include #include using namespace Botan; #include "../../checks/getopt.h" class Encoder_Decoder { public: Encoder_Decoder(const std::string& command, bool decode, const std::vector& args) : type(command), args(args), decode(decode) { } void run(std::istream& in, std::ostream& out) { Filter* filt = decode ? decoder(type) : encoder(type); DataSource_Stream src(in); Pipe pipe(filt, new DataSink_Stream(out)); pipe.process_msg(src); } Filter* encoder(const std::string& type) const { if(type == "hex") return new Hex_Encoder; if(type == "base64") return new Base64_Encoder; #if defined(BOTAN_HAS_COMPRESSOR_BZIP2) if(type == "bzip2") return new Bzip_Compression; #endif #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) if(type == "zlib") return new Zlib_Compression; #endif return 0; } Filter* decoder(const std::string& type) const { if(type == "hex") return new Hex_Decoder; if(type == "base64") return new Base64_Decoder; #if defined(BOTAN_HAS_COMPRESSOR_BZIP2) if(type == "bzip2") return new Bzip_Decompression; #endif #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) if(type == "zlib") return new Zlib_Decompression; #endif return 0; } private: std::string type; std::vector args; bool decode; }; void run_command(const std::string& command, const std::vector& arguments, const OptionParser& opts) { if(command == "hex" || command == "base64" || command == "bzip2" || command == "zlib") { bool decode = opts.is_set("decode"); std::string output = opts.value_or_else("output", "-"); std::string input = opts.value_or_else("input", "-"); Encoder_Decoder enc_dec(command, decode, arguments); try { if(output == "-") { if(input == "-") enc_dec.run(std::cin, std::cout); else { std::ifstream in(input.c_str()); enc_dec.run(in, std::cout); } } else // output != "-" { std::ofstream out(output.c_str()); if(input == "-") enc_dec.run(std::cin, out); else { std::ifstream in(input.c_str()); enc_dec.run(in, out); } } } catch(Botan::Stream_IO_Error& e) { std::cout << "I/O failure - " << e.what() << '\n'; } } else if(command == "hash" || command == "sha1" || command == "md5") { std::string hash; if(command == "md5") hash = "MD5"; if(command == "sha1") hash = "SHA-160"; else hash = opts.value_or_else("hash", "SHA-160"); // sha1 is default Pipe pipe(new Hash_Filter(get_hash(hash)), new Hex_Encoder(false, 0, Hex_Encoder::Lowercase)); for(size_t i = 0; i != arguments.size(); ++i) { std::string file_name = arguments[i]; u32bit previously = pipe.message_count(); if(file_name == "-") { pipe.start_msg(); std::cin >> pipe; pipe.end_msg(); } else { std::ifstream in(file_name.c_str()); if(in) { pipe.start_msg(); in >> pipe; pipe.end_msg(); } else std::cerr << "Could not read " << file_name << '\n'; } if(pipe.message_count() > previously) std::cout << pipe.read_all_as_string(Pipe::LAST_MESSAGE) << " " << file_name << '\n'; } } else { std::cerr << "Command " << command << " not known\n"; } } int main(int argc, char* argv[]) { LibraryInitializer init; OptionParser opts("help|version|seconds=|" "input=|output=|decode|" "hash=|key="); try { opts.parse(argv); } catch(std::runtime_error& e) { std::cout << "Command line problem: " << e.what() << '\n'; return 2; } if(opts.is_set("version") || argc <= 1) { std::cerr << "Botan Toolbox v" << version_string() << '\n'; std::cerr << "Commands: hash hex base64 "; #if defined(BOTAN_HAS_COMPRESSOR_BZIP2) std::cerr << "bzip2 "; #endif #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) std::cerr << "zlib "; #endif std::cerr << "\n"; return 0; } if(opts.is_set("help")) { std::vector what = opts.leftovers(); for(size_t i = 0; i != what.size(); ++i) std::cerr << what[i] << "? Never heard of it\n"; return 0; } std::vector args = opts.leftovers(); if(args.size() == 0) return 0; std::string command = args[0]; args.erase(args.begin()); run_command(command, args, opts); return 0; } Botan-1.10.12/doc/examples/tss.cpp0000664000175000017500000000150012654331322016460 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace { void print(const Botan::SecureVector& r) { for(Botan::u32bit i = 0; i != r.size(); ++i) printf("%02X", r[i]); printf("\n"); } } int main() { using namespace Botan; LibraryInitializer init; AutoSeeded_RNG rng; byte id[16]; for(int i = 0; i != 16; ++i) id[i] = i; const byte S2[] = { 0xDE, 0xAD, 0xCA, 0xFE, 0xBA, 0xBE, 0xBE, 0xEF }; std::vector shares = RTSS_Share::split(4, 6, S2, sizeof(S2), id, rng); for(size_t i = 0; i != shares.size(); ++i) std::cout << i << " = " << shares[i].to_string() << "\n"; print(RTSS_Share::reconstruct(shares)); } Botan-1.10.12/doc/faq.txt0000664000175000017500000002174012654331322014645 0ustar jackjack00000000000000 Frequently Asked Questions ======================================== What is this thing? ---------------------------------------- Botan is a library written in C++ which provides a fairly high level and C++-ish interface to a number of different crypto algorithms. In addition to the bare algorithms there is also support for number of standards and de-facto standards like X.509v3 certificates, and various useful constructs like format-preserving encryption, all or nothing transforms, and secret splitting. .. _devel_vs_stable: Which release should I use? ---------------------------------------- The library is normally released along two different trees, termed stable and development. The stable tree is a branch off the main line, and typically only sees bug fixes; almost all new development occurs in the unstable/development releases. The primary issue is not stability of the program (bugs of course do occur, and are more likely to occur in code that is more in flux), but rather stability of API and ABI. In particular, you should not expect any level of ABI stability between releases on the development branch, and API changes may be made without notice. Feel free to send comments on API changes, or API problems, to the list. If you don't want to have to worry about tracking a moving target, and just want something that works, you'll probably prefer using the stable releases. If you want to get the latest features, the development releases are the obvious choice. If you want to ship a binary that is usable out of the box on a Linux distro that ships botan, you'll probably want to match versions with that distro; as of this writing most ship with 1.8. If you're building an application that will embed botan into it (without relying on a shared library), you want to use an amalgamation build, which basically turns botan into a single header and a single source file which you can easily include in your existing application build. In this case you can pick which ever tree you prefer. The self-test program can't locate the library ----------------------------------------------- Are you sure either the current working directory ('.') or the directory botan is building into are in the dynamic library path? On many Unix systems this is controlled by the ``LD_LIBRARY_PATH`` variable. You can add the currently directory to the list of directories to search with this Bourne shell command:: $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. If you install the library into a well known location like ``/usr/local/lib``, then probably no particular ``LD_LIBRARY_PATH`` needs to be set. My program aborts with any message ---------------------------------------- Does your main function wrap all code inside a try/catch block? If an exception is thrown and is not caught, many C++ runtimes simply crash the process without providing any sort of diagnostic. Is the library thread-safe? ---------------------------------------- Yes, botan is thread safe. However, because mutual exclusion depends on OS specific code, you must load a module to help. POSIX threads and Win32 critical sections are both supported out of the box, other thread libraries are very easy to add. To enable thread safe operation, include "thread_safe" in the string you pass to ``Botan::LibraryInitializer`` constructor. If for whatever reason a working mutex implementation cannot be found, LibraryInitializer will throw an exception rather than continue operating in a bad state. How do I load this key generated by OpenSSL into botan? -------------------------------------------------------- The encrypted key format used by the ``openssl`` command line tool is undocumented and apparently specific to OpenSSL. The easiest approach is to convert it to the (standard) PKCS #8 format, using:: openssl pkcs8 -topk8 -in my_key.pem Add ``-nocrypt`` to the command line if you want the resulting PKCS #8 file to be unencrypted, otherwise it will ask you for a new password to use. For unencrypted keys, you can also manually decode the parameters using the existing PEM and BER support; see `this post `_ to the dev list for an example. Is botan FIPS 140 certified? ---------------------------------------- No version of botan has been certified under FIPS 140. This is unlikely to happen unless/until an organization is willing to fund and shepherd the validation process, which typically requires several months and many thousands of dollars. Is this thing safe to use? ---------------------------------------- The primary author/maintainer (Jack Lloyd) has 5+ years of experience reviewing code for security flaws, and has additionally performed several FIPS 140 validations of hardware and software crypto implementations. However the library has never undergone an *impartial* third-party security review, and thus it is entirely possible/probable that a number of exploitable flaws remain in the source. (If your company is interested in handling such a review, please contact the maintainers). There has been one known security flaw. Between versions 0.7.8 (released Feb 2002) and 1.3.7 (released Dec 2003), the ``es_unix`` module, which runs Unix programs to gather entropy for seeding a random number generator, ran programs by invoking the ``popen`` library function with commands with no leading directory names. This means setuid or setgid programs that used this entropy source could be tricked into executing arbitrary programs via manipulation of the PATH variable. Later versions will only search through specific (presumed safe) directories like ``/usr/bin``; the list of directories to search can be controlled by the application. Is botan vulnerable to timing attacks? ---------------------------------------- Botan's public key implementations do make some attempt to defend against timing attacks; random blinding is used to protect all RSA, Rabin-Williams, ElGamal, and Diffie-Hellman private key operations. Public key algorithms implemented using the Chinese Remainder Theorem (RSA and Rabin-Williams) are subject to a catastrophic failure: if a computational error (either induced by an attacker or merely accidental) occurs during the private key operation, the private key can be revealed. Other, more subtle, fault attacks are possible against other schemes. For this reason, private key operations are checked for consistency with the public key - if the results are not consistent, then an exception is thrown indicating an error has occurred rather than release information that might compromise the key. AES implementations are usually quite vulnerable to timing attacks. The table based implementation of AES included in botan uses small tables in the first and last rounds which makes such attacks somewhat more difficult. Alternate implementations of AES using SSSE3 and AES-NI instruction sets are also included, and run in constant time, but of course require a processor that supports these instruction sets. I think I've found a security flaw. What should I do? ------------------------------------------------------------ You can do any combination of: * Contact the current lead maintainer personally; currently `Jack Lloyd `_ (`personal PGP key `_) * Email the `development list `_ * File a bug in `Bugzilla `_ Does botan support SSL/TLS, SSH, S/MIME, OpenPGP... ------------------------------------------------------------ Support for SSL/TLS is included in version 1.9.4 and later. Currently SSLv3 and TLS 1.0 and 1.1 are supported. `NetSieben SSH `_ is an open source SSHv2 implementation that uses botan. A preliminary and very incomplete implementation of CMS (the crypto layer underlying S/MIME) is included in ``src/cms``, but it needs a lot of love and attention before being truly useful. There is currently no support for OpenPGP. Will it work on my platform XYZ?? ---------------------------------------- The most common stumbling block is a compiler that is buggy or can't handle modern C++ (specifically, C++98). Check out the :doc:`build log ` for a sense of which platforms are actively being tested. I'm not feeling this, what can I use instead? ------------------------------------------------------------ * `Crypto++ `_ is another C++ crypto library. Its API is more heavily based on templates and in general has a very different design philosophy from botan - so if you feel botan's API is not a good match, you may well like Crypto++. * `OpenSSL `_ is written in C and mostly targeted to being an SSL/TLS implementation but there is a lot of other stuff in there as well. * `XySSL `_ is a C library providing a very small footprint crypto library and SSL implementation. * `Adam Shostack `_ maintains a (somewhat out of date) list of open source crypto libraries. Botan-1.10.12/doc/filters.txt0000664000175000017500000007753312654331322015561 0ustar jackjack00000000000000 Information Flow: Pipes and Filters ======================================== Many common uses of cryptography involve processing one or more streams of data. Botan provides services that make setting up data flows through various operations, such as compression, encryption, and base64 encoding. Each of these operations is implemented in what are called *filters* in Botan. A set of filters are created and placed into a *pipe*, and information "flows" through the pipe until it reaches the end, where the output is collected for retrieval. If you're familiar with the Unix shell environment, this design will sound quite familiar. Here is an example that uses a pipe to base64 encode some strings:: Pipe pipe(new Base64_Encoder); // pipe owns the pointer pipe.start_msg(); pipe.write("message 1"); pipe.end_msg(); // flushes buffers, increments message number // process_msg(x) is start_msg() && write(x) && end_msg() pipe.process_msg("message2"); std::string m1 = pipe.read_all_as_string(0); // "message1" std::string m2 = pipe.read_all_as_string(1); // "message2" Bytestreams in the pipe are grouped into messages; blocks of data that are processed in an identical fashion (ie, with the same sequence of filter operations). Messages are delimited by calls to ``start_msg`` and ``end_msg``. Each message in a pipe has its own identifier, which currently is an integer that increments up from zero. The ``Base64_Encoder`` was allocated using ``new``; but where was it deallocated? When a filter object is passed to a ``Pipe``, the pipe takes ownership of the object, and will deallocate it when it is no longer needed. There are two different ways to make use of messages. One is to send several messages through a ``Pipe`` without changing the ``Pipe`` configuration, so you end up with a sequence of messages; one use of this would be to send a sequence of identically encrypted UDP packets, for example (note that the *data* need not be identical; it is just that each is encrypted, encoded, signed, etc in an identical fashion). Another is to change the filters that are used in the ``Pipe`` between each message, by adding or removing filters; functions that let you do this are documented in the Pipe API section. Botan has about 40 filters that perform different operations on data. Here's code that uses one of them to encrypt a string with AES:: AutoSeeded_RNG rng, SymmetricKey key(rng, 16); // a random 128-bit key InitializationVector iv(rng, 16); // a random 128-bit IV // The algorithm we want is specified by a string Pipe pipe(get_cipher("AES-128/CBC", key, iv, ENCRYPTION)); pipe.process_msg("secrets"); pipe.process_msg("more secrets"); MemoryVector c1 = pipe.read_all(0); byte c2[4096] = { 0 }; size_t got_out = pipe.read(c2, sizeof(c2), 1); // use c2[0...got_out] Note the use of ``AutoSeeded_RNG``, which is a random number generator. If you want to, you can explicitly set up the random number generators and entropy sources you want to, however for 99% of cases ``AutoSeeded_RNG`` is preferable. ``Pipe`` also has convenience methods for dealing with ``std::iostream``. Here is an example of those, using the ``Bzip_Compression`` filter (included as a module; if you have bzlib available, check the build instructions for how to enable it) to compress a file:: std::ifstream in("data.bin", std::ios::binary) std::ofstream out("data.bin.bz2", std::ios::binary) Pipe pipe(new Bzip_Compression); pipe.start_msg(); in >> pipe; pipe.end_msg(); out << pipe; However there is a hitch to the code above; the complete contents of the compressed data will be held in memory until the entire message has been compressed, at which time the statement ``out << pipe`` is executed, and the data is freed as it is read from the pipe and written to the file. But if the file is very large, we might not have enough physical memory (or even enough virtual memory!) for that to be practical. So instead of storing the compressed data in the pipe for reading it out later, we divert it directly to the file:: std::ifstream in("data.bin", std::ios::binary) std::ofstream out("data.bin.bz2", std::ios::binary) Pipe pipe(new Bzip_Compression, new DataSink_Stream(out)); pipe.start_msg(); in >> pipe; pipe.end_msg(); This is the first code we've seen so far that uses more than one filter in a pipe. The output of the compressor is sent to the ``DataSink_Stream``. Anything written to a ``DataSink_Stream`` is written to a file; the filter produces no output. As soon as the compression algorithm finishes up a block of data, it will send it along to the sink filter, which will immediately write it to the stream; if you were to call ``pipe.read_all()`` after ``pipe.end_msg()``, you'd get an empty vector out. This is particularly useful for cases where you are processing a large amount of data, as it means you don't have to store everything in memory at once. Here's an example using two computational filters:: AutoSeeded_RNG rng, SymmetricKey key(rng, 32); InitializationVector iv(rng, 16); Pipe encryptor(get_cipher("AES/CBC/PKCS7", key, iv, ENCRYPTION), new Base64_Encoder); encryptor.start_msg(); file >> encryptor; encryptor.end_msg(); // flush buffers, complete computations std::cout << encryptor; You can read from a pipe while you are still writing to it, which allows you to bound the amount of memory that is in use at any one time. A common idiom for this is:: pipe.start_msg(); SecureBuffer buffer; while(infile.good()) { infile.read((char*)&buffer[0], buffer.size()); const size_t got_from_infile = infile.gcount(); pipe.write(buffer, got_from_infile); if(infile.eof()) pipe.end_msg(); while(pipe.remaining() > 0) { const size_t buffered = pipe.read(buffer, buffer.size()); outfile.write((const char*)&buffer[0], buffered); } } if(infile.bad() || (infile.fail() && !infile.eof())) throw Some_Exception(); Fork --------------------------------- It is common that you might receive some data and want to perform more than one operation on it (ie, encrypt it with Serpent and calculate the SHA-256 hash of the plaintext at the same time). That's where ``Fork`` comes in. ``Fork`` is a filter that takes input and passes it on to *one or more* filters that are attached to it. ``Fork`` changes the nature of the pipe system completely: instead of being a linked list, it becomes a tree or acyclic graph. Each filter in the fork is given its own output buffer, and thus its own message. For example, if you had previously written two messages into a pipe, then you start a new one with a fork that has three paths of filter's inside it, you add three new messages to the pipe. The data you put into the pipe is duplicated and sent into each set of filter and the eventual output is placed into a dedicated message slot in the pipe. Messages in the pipe are allocated in a depth-first manner. This is only interesting if you are using more than one fork in a single pipe. As an example, consider the following:: Pipe pipe(new Fork( new Fork( new Base64_Encoder, new Fork( NULL, new Base64_Encoder ) ), new Hex_Encoder ) ); In this case, message 0 will be the output of the first ``Base64_Encoder``, message 1 will be a copy of the input (see below for how fork interprets NULL pointers), message 2 will be the output of the second ``Base64_Encoder``, and message 3 will be the output of the ``Hex_Encoder``. This results in message numbers being allocated in a top to bottom fashion, when looked at on the screen. However, note that there could be potential for bugs if this is not anticipated. For example, if your code is passed a filter, and you assume it is a "normal" one that only uses one message, your message offsets would be wrong, leading to some confusion during output. If Fork's first argument is a null pointer, but a later argument is not, then Fork will feed a copy of its input directly through. Here's a case where that is useful:: // have std::string ciphertext, auth_code, key, iv, mac_key; Pipe pipe(new Base64_Decoder, get_cipher("AES-128", key, iv, DECRYPTION), new Fork( 0, // this message gets ciphertext new MAC_Filter("HMAC(SHA-1)", mac_key) ) ); pipe.process_msg(ciphertext); std::string plaintext = pipe.read_all_as_string(0); SecureVector mac = pipe.read_all(1); if(mac != auth_code) error(); Here we wanted to not only decrypt the message, but send the decrypted text through an additional computation, in order to compute the authentication code. Any filters that are attached to the pipe after the fork are implicitly attached onto the first branch created by the fork. For example, let's say you created this pipe:: Pipe pipe(new Fork(new Hash_Filter("SHA-256"), new Hash_Filter("SHA-512")), new Hex_Encoder); And then called ``start_msg``, inserted some data, then ``end_msg``. Then ``pipe`` would contain two messages. The first one (message number 0) would contain the SHA-256 sum of the input in hex encoded form, and the other would contain the SHA-512 sum of the input in raw binary. In many situations you'll want to perform a sequence of operations on multiple branches of the fork; in which case, use the filter described in :ref:`chain`. .. _chain: Chain --------------------------------- A ``Chain`` filter creates a chain of filters and encapsulates them inside a single filter (itself). This allows a sequence of filters to become a single filter, to be passed into or out of a function, or to a ``Fork`` constructor. You can call ``Chain``'s constructor with up to four ``Filter`` pointers (they will be added in order), or with an array of filter pointers and a ``size_t`` that tells ``Chain`` how many filters are in the array (again, they will be attached in order). Here's the example from the last section, using chain instead of relying on the implicit passthrough the other version used:: Pipe pipe(new Fork( new Chain(new Hash_Filter("SHA-256"), new Hex_Encoder), new Hash_Filter("SHA-512") ) ); Sources and Sinks ---------------------------------------- Data Sources ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A ``DataSource`` is a simple abstraction for a thing that stores bytes. This type is used heavily in the areas of the API related to ASN.1 encoding/decoding. The following types are ``DataSource``: ``Pipe``, ``SecureQueue``, and a couple of special purpose ones: ``DataSource_Memory`` and ``DataSource_Stream``. You can create a ``DataSource_Memory`` with an array of bytes and a length field. The object will make a copy of the data, so you don't have to worry about keeping that memory allocated. This is mostly for internal use, but if it comes in handy, feel free to use it. A ``DataSource_Stream`` is probably more useful than the memory based one. Its constructors take either a ``std::istream`` or a ``std::string``. If it's a stream, the data source will use the ``istream`` to satisfy read requests (this is particularly useful to use with ``std::cin``). If the string version is used, it will attempt to open up a file with that name and read from it. Data Sinks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A ``DataSink`` (in ``data_snk.h``) is a ``Filter`` that takes arbitrary amounts of input, and produces no output. This means it's doing something with the data outside the realm of what ``Filter``/``Pipe`` can handle, for example, writing it to a file (which is what the ``DataSink_Stream`` does). There is no need for ``DataSink``s that write to a ``std::string`` or memory buffer, because ``Pipe`` can handle that by itself. Here's a quick example of using a ``DataSink``, which encrypts ``in.txt`` and sends the output to ``out.txt``. There is no explicit output operation; the writing of ``out.txt`` is implicit:: DataSource_Stream in("in.txt"); Pipe pipe(get_cipher("AES-128/CTR-BE", key, iv), new DataSink_Stream("out.txt")); pipe.process_msg(in); A real advantage of this is that even if "in.txt" is large, only as much memory is needed for internal I/O buffers will be used. The Pipe API --------------------------------- Initializing Pipe ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By default, ``Pipe`` will do nothing at all; any input placed into the ``Pipe`` will be read back unchanged. Obviously, this has limited utility, and presumably you want to use one or more filters to somehow process the data. First, you can choose a set of filters to initialize the ``Pipe`` via the constructor. You can pass it either a set of up to four filter pointers, or a pre-defined array and a length:: Pipe pipe1(new Filter1(/*args*/), new Filter2(/*args*/), new Filter3(/*args*/), new Filter4(/*args*/)); Pipe pipe2(new Filter1(/*args*/), new Filter2(/*args*/)); Filter* filters[5] = { new Filter1(/*args*/), new Filter2(/*args*/), new Filter3(/*args*/), new Filter4(/*args*/), new Filter5(/*args*/) /* more if desired... */ }; Pipe pipe3(filters, 5); This is by far the most common way to initialize a ``Pipe``. However, occasionally a more flexible initialization strategy is necessary; this is supported by 4 member functions. These functions may only be used while the pipe in question is not in use; that is, either before calling ``start_msg``, or after ``end_msg`` has been called (and no new calls to ``start_msg`` have been made yet). .. cpp:function:: void Pipe::prepend(Filter* filter) Calling ``prepend`` will put the passed filter first in the list of transformations. For example, if you prepend a filter implementing encryption, and the pipe already had a filter that hex encoded the input, then the next message processed would be first encrypted, and *then* hex encoded. .. cpp:function:: void Pipe::append(Filter* filter) Like ``prepend``, but places the filter at the end of the message flow. This doesn't always do what you expect if there is a fork. .. cpp:function:: void Pipe::pop() Removes the first filter in the flow. .. cpp:function:: void Pipe::reset() Removes all the filters that the pipe currently holds - it is reset to an empty/no-op state. Any data that is being retained by the pipe is retained after a ``reset``, and ``reset`` does not affect message numbers (discussed later). Giving Data to a Pipe ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Input to a ``Pipe`` is delimited into messages, which can be read from independently (ie, you can read 5 bytes from one message, and then all of another message, without either read affecting any other messages). .. cpp:function:: void Pipe::start_msg() Starts a new message; if a message was already running, an exception is thrown. After this function returns, you can call ``write``. .. cpp:function:: void Pipe::write(const byte* input, size_t length) .. cpp:function:: void Pipe::write(const MemoryRegion& input) .. cpp:function:: void Pipe::write(const std::string& input) .. cpp:function:: void Pipe::write(DataSource& input) .. cpp:function:: void Pipe::write(byte input) All versions of ``write`` write the input into the filter sequence. If a message is not currently active, an exception is thrown. .. cpp:function:: void Pipe::end_msg() End the currently active message Sometimes, you may want to do only a single write per message. In this case, you can use the ``process_msg`` series of functions, which start a message, write their argument into the pipe, and then end the message. In this case you would not make any explicit calls to ``start_msg``/``end_msg``. Pipes can also be used with the ``>>`` operator, and will accept a ``std::istream``, or on Unix systems with the ``fd_unix`` module, a Unix file descriptor. In either case, the entire contents of the file will be read into the pipe. Getting Output from a Pipe ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Retrieving the processed data from a pipe is a bit more complicated, for various reasons. The pipe will separate each message into a separate buffer, and you have to retrieve data from each message independently. Each of the reader functions has a final parameter that specifies what message to read from. If this parameter is set to ``Pipe::DEFAULT_MESSAGE``, it will read the current default message (``DEFAULT_MESSAGE`` is also the default value of this parameter). Functions in ``Pipe`` related to reading include: .. cpp:function:: size_t Pipe::read(byte* out, size_t len) Reads up to ``len`` bytes into ``out``, and returns the number of bytes actually read. .. cpp:function:: size_t Pipe::peek(byte* out, size_t len) Acts exactly like `read`, except the data is not actually read; the next read will return the same data. .. cpp:function:: SecureVector Pipe::read_all() Reads the entire message into a buffer and returns it .. cpp:function:: std::string Pipe::read_all_as_string() Like ``read_all``, but it returns the data as a ``std::string``. No encoding is done; if the message contains raw binary, so will the string. .. cpp:function:: size_t Pipe::remaining() Returns how many bytes are left in the message .. cpp:function:: Pipe::message_id Pipe::default_msg() Returns the current default message number .. cpp:function:: Pipe::message_id Pipe::message_count() Returns the total number of messages currently in the pipe .. cpp:function:: Pipe::set_default_msg(Pipe::message_id msgno) Sets the default message number (which must be a valid message number for that pipe). The ability to set the default message number is particularly important in the case of using the file output operations (``<<`` with a ``std::ostream`` or Unix file descriptor), because there is no way to specify the message explicitly when using the output operator. Pipe I/O for Unix File Descriptors ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This is a minor feature, but it comes in handy sometimes. In all installations of the library, Botan's ``Pipe`` object overloads the ``<<`` and ``>>`` operators for C++ iostream objects, which is usually more than sufficient for doing I/O. However, there are cases where the iostream hierarchy does not map well to local 'file types', so there is also the ability to do I/O directly with Unix file descriptors. This is most useful when you want to read from or write to something like a TCP or Unix-domain socket, or a pipe, since for simple file access it's usually easier to just use C++'s file streams. If ``BOTAN_EXT_PIPE_UNIXFD_IO`` is defined, then you can use the overloaded I/O operators with Unix file descriptors. For an example of this, check out the ``hash_fd`` example, included in the Botan distribution. Filter Catalog --------------------------------- This section documents most of the useful filters included in the library. Keyed Filters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A few sections ago, it was mentioned that ``Pipe`` can process multiple messages, treating each of them the same. Well, that was a bit of a lie. There are some algorithms (in particular, block ciphers not in ECB mode, and all stream ciphers) that change their state as data is put through them. Naturally, you might well want to reset the keys or (in the case of block cipher modes) IVs used by such filters, so multiple messages can be processed using completely different keys, or new IVs, or new keys and IVs, or whatever. And in fact, even for a MAC or an ECB block cipher, you might well want to change the key used from message to message. Enter ``Keyed_Filter``, which acts as an abstract interface for any filter that is uses keys: block cipher modes, stream ciphers, MACs, and so on. It has two functions, ``set_key`` and ``set_iv``. Calling ``set_key`` will set (or reset) the key used by the algorithm. Setting the IV only makes sense in certain algorithms -- a call to ``set_iv`` on an object that doesn't support IVs will cause an exception. You must call ``set_key`` *before* calling ``set_iv``. Here's a example:: Keyed_Filter *aes, *hmac; Pipe pipe(new Base64_Decoder, // Note the assignments to the cast and hmac variables aes = get_cipher("AES-128/CBC", aes_key, iv), new Fork( 0, // Read the section 'Fork' to understand this new Chain( hmac = new MAC_Filter("HMAC(SHA-1)", mac_key, 12), new Base64_Encoder ) ) ); pipe.start_msg(); // use pipe for a while, decrypt some stuff, derive new keys and IVs pipe.end_msg(); aes->set_key(aes_key2); aes->set_iv(iv2); hmac->set_key(mac_key2); pipe.start_msg(); // use pipe for some other things pipe.end_msg(); There are some requirements to using ``Keyed_Filter`` that you must follow. If you call ``set_key`` or ``set_iv`` on a filter that is owned by a ``Pipe``, you must do so while the ``Pipe`` is "unlocked". This refers to the times when no messages are being processed by ``Pipe`` -- either before ``Pipe``'s ``start_msg`` is called, or after ``end_msg`` is called (and no new call to ``start_msg`` has happened yet). Doing otherwise will result in undefined behavior, probably silently getting invalid output. And remember: if you're resetting both values, reset the key *first*. Cipher Filters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Getting a hold of a ``Filter`` implementing a cipher is very easy. Make sure you're including the header ``lookup.h``, and then call ``get_cipher``. You will pass the return value directly into a ``Pipe``. There are a couple different functions which do varying levels of initialization: .. cpp:function:: Keyed_Filter* get_cipher(std::string cipher_spec, \ SymmetricKey key, InitializationVector iv, Cipher_Dir dir) .. cpp:function:: Keyed_Filter* get_cipher(std::string cipher_spec, \ SymmetricKey key, Cipher_Dir dir) The version that doesn't take an IV is useful for things that don't use them, like block ciphers in ECB mode, or most stream ciphers. If you specify a cipher spec that does want a IV, and you use the version that doesn't take one, an exception will be thrown. The ``dir`` argument can be either ``ENCRYPTION`` or ``DECRYPTION``. The cipher_spec is a string that specifies what cipher is to be used. The general syntax for "cipher_spec" is "STREAM_CIPHER", "BLOCK_CIPHER/MODE", or "BLOCK_CIPHER/MODE/PADDING". In the case of stream ciphers, no mode is necessary, so just the name is sufficient. A block cipher requires a mode of some sort, which can be "ECB", "CBC", "CFB(n)", "OFB", "CTR-BE", or "EAX(n)". The argument to CFB mode is how many bits of feedback should be used. If you just use "CFB" with no argument, it will default to using a feedback equal to the block size of the cipher. EAX mode also takes an optional bit argument, which tells EAX how large a tag size to use~--~generally this is the size of the block size of the cipher, which is the default if you don't specify any argument. In the case of the ECB and CBC modes, a padding method can also be specified. If it is not supplied, ECB defaults to not padding, and CBC defaults to using PKCS #5/#7 compatible padding. The padding methods currently available are "NoPadding", "PKCS7", "OneAndZeros", and "CTS". CTS padding is currently only available for CBC mode, but the others can also be used in ECB mode. Some example "cipher_spec arguments are: "AES-128/CBC", "Blowfish/CTR-BE", "Serpent/XTS", and "AES-256/EAX". "CTR-BE" refers to counter mode where the counter is incremented as if it were a big-endian encoded integer. This is compatible with most other implementations, but it is possible some will use the incompatible little endian convention. This version would be denoted as "CTR-LE" if it were supported. "EAX" is a new cipher mode designed by Wagner, Rogaway, and Bellare. It is an authenticated cipher mode (that is, no separate authentication is needed), has provable security, and is free from patent entanglements. It runs about half as fast as most of the other cipher modes (like CBC, OFB, or CTR), which is not bad considering you don't need to use an authentication code. Hashes and MACs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Hash functions and MACs don't need anything special when it comes to filters. Both just take their input and produce no output until ``end_msg`` is called, at which time they complete the hash or MAC and send that as output. These filters take a string naming the type to be used. If for some reason you name something that doesn't exist, an exception will be thrown. .. cpp:function:: Hash_Filter::Hash_Filter(std::string hash, size_t outlen = 0) This constructor creates a filter that hashes its input with ``hash``. When ``end_msg`` is called on the owning pipe, the hash is completed and the digest is sent on to the next filter in the pipeline. The parameter ``outlen`` specifies how many bytes of the hash output will be passed along to the next filter when ``end_msg`` is called. By default, it will pass the entire hash. Examples of names for ``Hash_Filter`` are "SHA-1" and "Whirlpool". .. cpp:function:: MAC_Filter::MAC_Filter(std::string mac, SymmetricKey key, size_t outlen = 0) This constructor takes a name for a mac, such as "HMAC(SHA-1)" or "CMAC(AES-128)", along with a key to use. The optional ``outlen`` works the same as in ``Hash_Filter``. PK Filters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are four classes in this category, ``PK_Encryptor_Filter``, ``PK_Decryptor_Filter``, ``PK_Signer_Filter``, and ``PK_Verifier_Filter``. Each takes a pointer to an object of the appropriate type (``PK_Encryptor``, ``PK_Decryptor``, etc) that is deleted by the destructor. These classes are found in ``pk_filts.h``. Three of these, for encryption, decryption, and signing are much the same in terms of dataflow - ach of them buffers its input until the end of the message is marked with a call to the ``end_msg`` function. Then they encrypt, decrypt, or sign the entire input as a single blob and send the output (the ciphertext, the plaintext, or the signature) into the next filter. Signature verification works a little differently, because it needs to know what the signature is in order to check it. You can either pass this in along with the constructor, or call the function ``set_signature`` -- with this second method, you need to keep a pointer to the filter around so you can send it this command. In either case, after ``end_msg`` is called, it will try to verify the signature (if the signature has not been set by either method, an exception will be thrown here). It will then send a single byte onto the next filter -- a 1 or a 0, which specifies whether the signature verified or not (respectively). For more information about PK algorithms (including creating the appropriate objects to pass to the constructors), see :doc:`pubkey`. Encoders ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Often you want your data to be in some form of text (for sending over channels that aren't 8-bit clean, printing it, etc). The filters ``Hex_Encoder`` and ``Base64_Encoder`` will convert arbitrary binary data into hex or base64 formats. Not surprisingly, you can use ``Hex_Decoder`` and ``Base64_Decoder`` to convert it back into its original form. Both of the encoders can take a few options about how the data should be formatted (all of which have defaults). The first is a ``bool`` which says if the encoder should insert line breaks. This defaults to false. Line breaks don't matter either way to the decoder, but it makes the output a bit more appealing to the human eye, and a few transport mechanisms (notably some email systems) limit the maximum line length. The second encoder option is an integer specifying how long such lines will be (obviously this will be ignored if line-breaking isn't being used). The default tends to be in the range of 60-80 characters, but is not specified. If you want a specific value, set it. Otherwise the default should be fine. Lastly, ``Hex_Encoder`` takes an argument of type ``Case``, which can be ``Uppercase`` or ``Lowercase`` (default is ``Uppercase``). This specifies what case the characters A-F should be output as. The base64 encoder has no such option, because it uses both upper and lower case letters for its output. You can find the declarations for these types in ``hex_filt.h`` and ``b64_filt.h``. Compressors ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are two compression algorithms supported by Botan, zlib and bzip2. Only lossless compression algorithms are currently supported by Botan, because they tend to be the most useful for cryptography. However, it is very reasonable to consider supporting something like GSM speech encoding (which is lossy), for use in encrypted voice applications. You should always compress *before* you encrypt, because encryption seeks to hide the redundancy that compression is supposed to try to find and remove. To test for Bzip2, check to see if ``BOTAN_HAS_COMPRESSOR_BZIP2`` is defined. If so, you can include ``botan/bzip2.h``, which will declare a pair of ``Filter`` objects: ``Bzip2_Compression`` and ``Bzip2_Decompression``. You should be prepared to take an exception when using the decompressing filter, for if the input is not valid bzip2 data, that is what you will receive. You can specify the desired level of compression to ``Bzip2_Compression``'s constructor as an integer between 1 and 9, 1 meaning worst compression, and 9 meaning the best. The default is to use 9, since small values take the same amount of time, just use a little less memory. Zlib compression works much like Bzip2 compression. The only differences in this case are that the macro is ``BOTAN_HAS_COMPRESSOR_ZLIB``, the header you need to include is called ``botan/zlib.h`` (remember that you shouldn't just ``#include ``, or you'll get the regular zlib API, which is not what you want). The Botan classes for zlib compression/decompression are called ``Zlib_Compression`` and ``Zlib_Decompression``. Like Bzip2, a ``Zlib_Decompression`` object will throw an exception if invalid (in the sense of not being in the Zlib format) data is passed into it. While the zlib compression library uses the same compression algorithm as the gzip and zip programs, the format is different. The zlib format is defined in RFC 1950. Writing New Filters --------------------------------- The system of filters and pipes was designed in an attempt to make it as simple as possible to write new filter types. There are four functions that need to be implemented by a class deriving from ``Filter``: .. cpp:function:: void Filter::write(const byte* input, size_t length) This function is what is called when a filter receives input for it to process. The filter is not required to process the data right away; many filters buffer their input before producing any output. A filter will usually have ``write`` called many times during its lifetime. .. cpp:function:: void Filter::send(byte* output, size_t length) Eventually, a filter will want to produce some output to send along to the next filter in the pipeline. It does so by calling ``send`` with whatever it wants to send along to the next filter. There is also a version of ``send`` taking a single byte argument, as a convenience. .. cpp:function:: void Filter::start_msg() Implementing this function is optional. Implement it if your filter would like to do some processing or setup at the start of each message, such as allocating a data structure. .. cpp:function:: void Filter::end_msg() Implementing this function is optional. It is called when it has been requested that filters finish up their computations. The filter should finish up with whatever computation it is working on (for example, a compressing filter would flush the compressor and ``send`` the final block), and empty any buffers in preparation for processing a fresh new set of input. Additionally, if necessary, filters can define a constructor that takes any needed arguments, and a destructor to deal with deallocating memory, closing files, etc. Botan-1.10.12/doc/firststep.txt0000664000175000017500000001040712654331322016117 0ustar jackjack00000000000000 Getting Started ======================================== All declarations in the library are contained within the namespace ``Botan``, so you need to either prefix types with ``Botan::`` or add a ``using`` declaration in your code. All examples will assume a ``using`` declaration. All library headers are included like so:: #include Initializing the Library ---------------------------------------- There is a set of core services that the library needs access to while it is performing requests. To ensure these are set up, you must create an object of type .. cpp:class:: LibraryInitializer prior to making any other library calls. Typically this will be named something like ``init`` or ``botan_init``. The object lifetime must exceed that of all other Botan objects your application creates; for this reason the best place to create the ``LibraryInitializer`` is at the start of your ``main`` function, since this guarantees that it will be created first and destroyed last (via standard C++ RAII rules). The initializer does things like setting up the memory allocation system and algorithm lookup tables, finding out if there is a high resolution timer available to use, and similar such matters. With no arguments, the library is initialized with various default settings. So (unless you are writing threaded code; see below), all you need is:: Botan::LibraryInitializer init; at the start of your ``main``. The constructor takes an optional string that specifies arguments. Currently the only possible argument is "thread_safe", which must have an boolean argument (for instance "thread_safe=false" or "thread_safe=true"). If "thread_safe" is specified as true the library will attempt to register a mutex type to properly guard access to shared resources. However these locks do not protect individual Botan objects: explicit locking must be used if you wish to share a single object between threads. If you do not create a ``LibraryInitializer`` object, all library operations will fail, because it will be unable to do basic things like allocate memory or get random bits. You should never create more than one ``LibraryInitializer``. Pitfalls ---------------------------------------- There are a few things to watch out for to prevent problems when using the library. Never allocate any kind of Botan object globally. The problem with doing this is that the constructor for such an object will be called before the library is initialized. Many Botan objects will, in their constructor, make one or more calls into the library global state object. Access to this object is checked, so an exception should be thrown (rather than a memory access violation or undetected uninitialized object access). A rough equivalent that will work is to keep a global pointer to the object, initializing it after creating your ``LibraryInitializer``. Merely making the ``LibraryInitializer`` also global will probably not help, because C++ does not make very strong guarantees about the order that such objects will be created. The same rule applies for making sure the destructors of all your Botan objects are called before the ``LibraryInitializer`` is destroyed. This implies you can't have static variables that are Botan objects inside functions or classes; in many C++ runtimes, these objects will be destroyed after main has returned. The memory object classes (``MemoryRegion``, ``MemoryVector``, ``SecureVector``) are extremely primitive, and meant only for secure storage of potentially sensitive data like keys. They do not meet the requirements for an STL container object and you should not try to use them with STL algorithms. For a general-purpose container, use ``std::vector``. Use a ``try``/``catch`` block inside your ``main`` function, and catch any ``std::exception`` throws (remember to catch by reference, as ``std::exception::what`` is polymorphic):: int main() { try { LibraryInitializer init; // ... } catch(std::exception& e) { std::cerr << e.what() << "\n"; } } This is not strictly required, but if you don't, and Botan throws an exception, the runtime will call ``std::terminate``, which usually calls ``abort`` or something like it, leaving you (or worse, a user of your application) wondering what went wrong. Botan-1.10.12/doc/fpe.txt0000664000175000017500000000511112654331322014642 0ustar jackjack00000000000000 Format Preserving Encryption ======================================== .. versionadded:: 1.9.17 Format preserving encryption (FPE) refers to a set of techniques for encrypting data such that the ciphertext has the same format as the plaintext. For instance, you can use FPE to encrypt credit card numbers with valid checksums such that the ciphertext is also an credit card number with a valid checksum, or similiarly for bank account numbers, US Social Security numbers, or even more general mappings like English words onto other English words. The scheme currently implemented in botan is called FE1, and described in the paper `Format Preserving Encryption `_ by Mihir Bellare, Thomas Ristenpart, Phillip Rogaway, and Till Stegers. FPE is an area of ongoing standardization and it is likely that other schemes will be included in the future. To use FE1, use these functions, from ``fpe_fe1.h``: .. cpp:function:: BigInt FPE::fe1_encrypt(const BigInt& n, const BigInt& X, \ const SymmetricKey& key, const MemoryRegion& tweak) Encrypts the value *X* modulo the value *n* using the *key* and *tweak* specified. Returns an integer less than *n*. The *tweak* is a value that does not need to be secret that parameterizes the encryption function. For instance, if you were encrypting a database column with a single key, you could use a per-row-unique integer index value as the tweak. To encrypt an arbitrary value using FE1, you need to use a ranking method. Basically, the idea is to assign an integer to every value you might encrypt. For instance, a 16 digit credit card number consists of a 15 digit code plus a 1 digit checksum. So to encrypt a credit card number, you first remove the checksum, encrypt the 15 digit value modulo 10\ :sup:`15`, and then calculate what the checksum is for the new (ciphertext) number. .. cpp:function:: BigInt FPE::fe1_decrypt(const BigInt& n, const BigInt& X, \ const SymmetricKey& key, const MemoryRegion& tweak) Decrypts an FE1 ciphertext produced by :cpp:func:`fe1_encrypt`; the *n*, *key* and *tweak* should be the same as that provided to the encryption function. Returns the plaintext. Note that there is not any implicit authentication or checking of data, so if you provide an incorrect key or tweak the result is simply a random integer. This example encrypts a credit card number with a valid `Luhn checksum `_ to another number with the same format, including a correct checksum. .. literalinclude:: examples/fpe.cpp Botan-1.10.12/doc/indent.el0000664000175000017500000000264512654331322015143 0ustar jackjack00000000000000; This Emacs Lips code defines the indentation style used in Botan. If doesn't ; get everything perfectly correct, but it's pretty close. Copy this code into ; your .emacs file, or use M-x eval-buffer. Make sure to also set ; indent-tabs-mode to nil so spaces are inserted instead. ; ; This style is basically Whitesmiths style with 3 space indents (the Emacs ; "whitesmith" style seems more like a weird Whitesmiths/Allman mutant style). ; ; To activate using this style, open the file you want to edit and run this: ; M-x c-set-style and then enter "botan". (setq botan-style '( (c-basic-offset . 3) (c-comment-only-line-offset . 0) (c-offsets-alist (c . 0) (comment-intro . 0) (statement-block-intro . 0) (statement-cont . +) (substatement . +) (substatement-open . +) (block-open . +) (block-close . 0) (defun-open . +) (defun-close . 0) (defun-block-intro . 0) (func-decl-cont . +) (class-open . +) (class-close . +) (inclass . +) (access-label . -) (inline-open . +) (inline-close . 0) (extern-lang-open . 0) (extern-lang-close . 0) (inextern-lang . 0) (statement-case-open +) (namespace-open . 0) (namespace-close . 0) (innamespace . 0) (label . 0) ) )) (add-hook 'c++-mode-common-hook (function (lambda () (c-add-style "botan" botan-style nil)))) Botan-1.10.12/doc/index.txt0000664000175000017500000000657512654331322015216 0ustar jackjack00000000000000 Welcome ======================================== Botan is a :doc:`BSD-licensed ` crypto library for C++. It provides applications with most any :doc:`cryptographic algorithm ` you might be looking for, along with :doc:`SSL/TLS `, :doc:`X.509 certificates and CRLs `, a :doc:`pipeline-style message processing system `, and a wide variety of other features. A third party open source implementation of `SSHv2 `_ that uses botan is also available. In addition to C++ you can use botan from :doc:`Python ` or Perl, though the current bindings only wrap portions of the library. See the :doc:`faq` for a list of common questions and answers. .. only:: html and website See :doc:`download` for information about getting the latest version. The core of botan is written in C++98 with no dependencies besides the STL and the rest of the ISO standard library, but the library also includes optional modules which make further assumptions about their environment, providing features such as compression (using zlib or bzip2), entropy gathering, and secure memory allocation. Assembly implementations of key algorithms like SHA-1 and multiple precision integer routines for x86 and x86-64 processors are also included. It runs on most common operating systems and can be used with a number of different commercial and open source compilers. The :doc:`build log ` contains information about recently tested targets. It is already included in most major package distributions, including \ `Fedora `_, `EPEL `_ (for RHEL/CentOS), `Debian `_, `Ubuntu `_, `Gentoo `_, `Arch Linux `_, `Slackbuild `_, `FreeBSD `_, `NetBSD `_, `Cygwin `_, `MacPorts `_, `OpenPKG `_, and `T2 SDE `_ and has more than a few :doc:`known users `. It was started as a personal project by `Jack Lloyd `_,who continues to be the maintainer and release manager. Since the first release in 2001, a number of :doc:`individuals and organizations ` have contributed bug fixes and new features. Check out the :doc:`release notes ` and `news archive `_ for more project history. If you need help or have questions, send a mail to the `development mailing list `_. "Philosophical" bug reports, announcements of programs using the library, and related topics are also welcome. :doc:`Commercial support options ` are also available. If you find what you believe to be a bug, please file a ticket in `Bugzilla `_. A useful reference while reading this manual is the `Doxygen documentation `_. Botan-1.10.12/doc/kdf.txt0000664000175000017500000000240212654331322014634 0ustar jackjack00000000000000 .. _key_derivation_function: Key Derivation Functions ======================================== Key derivation functions are used to turn some amount of shared secret material into uniform random keys suitable for use with symmetric algorithms. An example of an input which is useful for a KDF is a shared secret created using Diffie-Hellman key agreement. .. cpp:class:: KDF .. cpp:function:: SecureVector derive_key( \ size_t key_len, const MemoryRegion& secret, \ const std::string& salt = "") const .. cpp:function:: SecureVector derive_key( \ size_t key_len, const MemoryRegion& secret, \ const MemoryRegion& salt) const .. cpp:function:: SecureVector derive_key( \ size_t key_len, const MemoryRegion& secret, \ const byte* salt, size_t salt_len) const .. cpp:function:: SecureVector derive_key( \ size_t key_len, const byte* secret, size_t secret_len, \ const std::string& salt) const All variations on the same theme. Deterministically creates a uniform random value from *secret* and *salt*. Typically *salt* is a lable or identifier, such as a session id. You can create a :cpp:class:`KDF` using .. cpp:function:: KDF* get_kdf(const std::string& algo_spec) Botan-1.10.12/doc/license.txt0000664000175000017500000000400412654331322015512 0ustar jackjack00000000000000 .. _license: .. highlight:: none License ======================================== Botan (http://botan.randombit.net/) is distributed under these terms:: Copyright (C) 1999-2011 Jack Lloyd 2001 Peter J Jones 2004-2007 Justin Karneges 2004 Vaclav Ovsik 2005 Matthew Gregan 2005-2006 Matt Johnston 2006 Luca Piccarreta 2007 Yves Jerschow 2007-2008 FlexSecure GmbH 2007-2008 Technische Universitat Darmstadt 2007-2008 Falko Strenzke 2007-2008 Martin Doering 2007 Manuel Hartl 2007 Christoph Ludwig 2007 Patrick Sona 2010 Olivier de Gaalon All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) 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. Botan-1.10.12/doc/log.txt0000664000175000017500000027203612654331322014665 0ustar jackjack00000000000000 .. _relnotes: Release Notes ======================================== Series 1.10 ---------------------------------------- Version 1.10.12, 2016-02-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * In 1.10.11, the check in PointGFp intended to check the affine y argument actually checked the affine x again. Reported by Remi Gacogne The CVE-2016-2195 overflow is not exploitable in 1.10.11 due to an additional check in the multiplication function itself which was also added in that release, so there are no security implications from the missed check. However to avoid confusion the change was pushed in a new release immediately. The 1.10.11 release notes incorrectly identified CVE-2016-2195 as CVE-2016-2915 Version 1.10.11, 2016-02-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Resolve heap overflow in ECC point decoding. CVE-2016-2195 * Resolve infinite loop in modular square root algorithm. CVE-2016-2194 * Correct BigInt::to_u32bit to not fail on integers of exactly 32 bits. GH #239 Version 1.10.10, 2015-08-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * SECURITY: The BER decoder would crash due to reading from offset 0 of an empty vector if it encountered a BIT STRING which did not contain any data at all. As the type requires a 1 byte field this is not valid BER but could occur in malformed data. Found with afl. * SECURITY: The BER decoder would allocate a fairly arbitrary amount of memory in a length field, even if there was no chance the read request would succeed. This might cause the process to run out of memory or invoke the OOM killer. Found with afl. * Due to an ABI incompatible (though not API incompatible) change in this release, the version number of the shared object has been increased. * The default TLS policy no longer allows RC4. * Fix a signed integer overflow in Blue Midnight Wish that may cause incorrect computations or undefined behavior. Version 1.10.9, 2014-12-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed EAX tag verification to run in constant time * The default TLS policy now disables SSLv3. * A crash could occur when reading from a blocking random device if the device initially indicated that entropy was available but a concurrent process drained the entropy pool before the read was initiated. * Fix decoding indefinite length BER constructs that contain a context sensitive tag of zero. Github pull 26 from Janusz Chorko. * The `botan-config` script previously tried to guess its prefix from the location of the binary. However this was error prone, and now the script assumes the final installation prefix matches the value set during the build. Github issue 29. Version 1.10.8, 2014-04-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a bug in primality testing introduced in 1.8.3 which caused only a single random base, rather than a sequence of random bases, to be used in the Miller-Rabin test. This increased the probability that a non-prime would be accepted, for instance a 1024 bit number would be incorrectly classed as prime with probability around 2^-40. Reported by Jeff Marrison. * The key length limit on HMAC has been raised to 512 bytes, allowing the use of very long passphrases with PBKDF2. Version 1.10.7, 2013-12-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * OAEP had two bugs, one of which allowed it to be used even if the key was too small, and the other of which would cause a crash during decryption if the EME data was too large for the associated key. Version 1.10.6, 2013-11-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The device reading entropy source now attempts to read from all available devices. Previously it would break out early if a partial read from a blocking source occured, not continuing to read from a non-blocking device. This would cause the library to fall back on slower and less reliable techniques for collecting PRNG seed material. Reported by Rickard Bellgrim. * HMAC_RNG (the default PRNG implementation) now automatically reseeds itself periodically. Previously reseeds only occured on explicit application request. * Fix an encoding error in EC_Group when encoding using EC_DOMPAR_ENC_OID. Reported by fxdupont on github. * In EMSA2 and Randpool, avoid calling name() on objects after deleting them if the provided algorithm objects are not suitable for use. Found by Clang analyzer, reported by Jeffrey Walton. * If X509_Store was copied, the u32bit containing how long to cache validation results was not initialized, potentially causing results to be cached for significant amounts of time. This could allow a certificate to be considered valid after its issuing CA's cert expired. Expiration of the end-entity cert is always checked, and reading a CRL always causes the status to be reset, so this issue does not affect revocation. Found by Coverity scanner. * Avoid off by one causing a potentially unterminated string to be passed to the connect system call if the library was configured to use a very long path name for the EGD socket. Found by Coverity Scanner. * In PK_Encryptor_EME, PK_Decryptor_EME, PK_Verifier, and PK_Key_Agreement, avoid dereferencing an unitialized pointer if no engine supported operations on the key object given. Found by Coverity scanner. * Avoid leaking a file descriptor in the /dev/random and EGD entropy sources if stdin (file descriptor 0) was closed. Found by Coverity scanner. * Avoid a potentially undefined operation in the bit rotation operations. Not known to have caused problems under any existing compiler, but might have caused problems in the future. Caught by Clang sanitizer, reported by Jeffrey Walton. * Increase default hash iterations from 10000 to 50000 in PBES1 and PBES2 * Add a fix for mips64el builds from Brad Smith. Version 1.10.5, 2013-03-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * A potential crash in the AES-NI implementation of the AES-192 key schedule (caused by misaligned loads) has been fixed. * A previously conditional operation in Montgomery multiplication and squaring is now always performed, removing a possible timing channel. * Use correct flags for creating a shared library on OS X under Clang. * Fix a compile time incompatability with Visual C++ 2012 Version 1.10.4, 2013-01-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Avoid a conditional operation in the power mod implementations on if a nibble of the exponent was zero or not. This may help protect against certain forms of side channel attacks. * The SRP6 code was checking for invalid values as specified in RFC 5054, specifically values equal to zero mod p. However SRP would accept negative A/B values, or ones larger than p, neither of which should occur in a normal run of the protocol. These values are now rejected. Credits to Timothy Prepscius for pointing out these values are not normally used and probably signal something fishy. * The return value of version_string is now a compile time constant string, so version information can be more easily extracted from binaries. Version 1.10.3, 2012-07-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * A change in 1.10.2 accidentally broke ABI compatibility with 1.10.1 and earlier versions, causing programs compiled against 1.10.1 to crash if linked with 1.10.2 at runtime. * Recent versions of OpenSSL include extra information in ECC private keys, the presence of which caused an exception when such a key was loaded by botan. The decoding of ECC private keys has been changed to ignore these fields if they are set. Version 1.10.2, 2012-06-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * To protect clients against renegotiation attacks, the TLS client now sends the renegotiation extension SCSV. * TLS renegotiation is completely disabled in this release. All hello requests, and all client hellos after the initial negotiation, are ignored. * Fix bugs in TLS affecting DSA servers. * Pipe::reset no longer requires that message processing be completed, a requirement that caused problems when a Filter's end_msg call threw an exception, after which point the Pipe object was no longer usable. * Add support for the rdrand instruction introduced in Intel's Ivy Bridge processors. * CPUID::has_rdrand was checking the wrong cpuid bit, and would false positive on AMD Bulldozer processors. * Add the Camellia block cipher * An implementation of SRP-6a compatible with the specification in RFC 5054 is now available in srp6.h * The exception catching syntax of configure.py has been changed to the Python 3.x syntax. This syntax also works with Python 2.6 and 2.7, but not with any earlier Python 2 release. A simple search and replace will allow running it under Python 2.5:: perl -pi -e 's/except (.*) as (.*):/except $1, $2:/g' configure.py * If clock_gettime is available on the system, poll all available clock types in the hres_timer poll. * Add AltiVec detection for IBM POWER7 processors. * Add AltiVec detection for OpenBSD, contributed by Brad Smith (PR 162) * Add Google's Native Client as an compile target * The Qt mutex wrapper was broken and would not compile with any recent version of Qt. It has been removed. * If targetting GCC on a Windows system, configure.py will warn that likely you wanted to configure for either MinGW or Cygwin, not the generic Windows target which is oriented to Win32 plus the Visual C++ runtime. * Fixed a compilation problem of the dynamic loader hooks under MinGW GCC * Don't set a soname on OpenBSD, as it doesn't support it (PR 158) * Fix a configure.py incompatability with the subprocess module included in Python 3.1 (PR 157) * A bug in configure.py would cause it to interpret `--cpu=s390x` as `s390`. This may have affected other CPUs as well. Now configure.py searches for an exact match, and only if no exact match is found will it search for substring matches. Version 1.10.1, 2011-07-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * A race condition in `Algorithm_Factory` could cause crashes in multithreaded code. See `this thread on botan-devel `_ for details and workarounds. * The return value of ``name`` has changed for GOST 28147-89 and Skein-512. GOST's ``name`` now includes the name of the sbox, and Skein's includes the personalization string (if nonempty). This allows an object to be properly roundtripped, which is necessary to fix the race condition described above. * A new distribution script is now included, as ``src/build-data/scripts/dist.py`` * The ``build.h`` header now includes, if available, an identifier of the source revision that was used. This identifier is also included in the result of ``version_string``. Version 1.10.0, 2011-06-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Detection for the rdrand instruction being added to upcoming Intel Ivy Bridge processors has been added. * A template specialization of std::swap was added for the memory container types. Series 1.9 ---------------------------------------- Version 1.9.18, 2011-06-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fourth release candidate for 1.10.0 * The GOST 34.10 verification operation was not ensuring that s and r were both greater than zero. This could potentially have meant it would have accepted an invalid all-zero signature as valid for any message. Due to how ECC points are internally represented it instead resulted in an exception being thrown. * A simple multiexponentation algorithm is now used in ECDSA and GOST-34.10 signature verification, leading to 20 to 25% improvements in ECDSA and 25% to 40% improvements in GOST-34.10 verification performance. * The internal representation of elliptic curve points has been modified to use Montgomery representation exclusively, resulting in reduced memory usage and a 10 to 20% performance improvement for ECDSA and ECDH. * In OAEP decoding, scan for the delimiter bytes using a loop that is written without conditionals so as to help avoid timing analysis. Unfortunately GCC at least is 'smart' enough to compile it to jumps anyway. * The SSE2 implementation of IDEA did not work correctly when compiled by Clang, because the trick it used to emulate a 16 bit unsigned compare in SSE (which doesn't contain one natively) relied on signed overflow working in the 'usual' way. A different method that doesn't rely on signed overflow is now used. * Add support for compiling SSL using Visual C++ 2010's TR1 implementation. * Fix a bug under Visual C++ 2010 which would cause ``hex_encode`` to crash if given a zero-sized input to encode. * A new build option ``--via-amalgamation`` will first generate the single-file amalgamation, then build the library from that single file. This option requires a lot of memory and does not parallelize, but the resulting library is smaller and may be faster. * On Unix, the library and header paths have been changed to allow parallel installation of different versions of the library. Headers are installed into ``/include/botan-1.9/botan``, libraries are named ``libbotan-1.9``, and ``botan-config`` is now namespaced (so in this release ``botan-config-1.9``). All of these embedded versions will be 1.10 in the upcoming stable release. * The soname system has been modified. In this release the library soname is ``libbotan-1.9.so.0``, with the full library being named ``libbotan-1.9.so.0.18``. The ``0`` is the ABI version, and will be incremented whenever a breaking ABI change is made. * TR1 support is not longer automatically assumed under older versions of GCC * Functions for base64 decoding that work standalone (without needing to use a pipe) have been added to ``base64.h`` * The function ``BigInt::to_u32bit`` was inadvertently removed in 1.9.11 and has been added back. * The function ``BigInt::get_substring`` did not work correctly with a *length* argument of 32. * The implementation of ``FD_ZERO`` on Solaris uses ``memset`` and assumes the caller included ``string.h`` on its behalf. Do so to fix compilation in the ``dev_random`` and ``unix_procs`` entropy sources. Patch from Jeremy C. Reed. * Add two different configuration targets for Atom, since some are 32-bit and some are 64-bit. The 'atom' target now refers to the 64-bit implementations, use 'atom32' to target the 32-bit processors. * The (incomplete) support for CMS and card verifiable certificates are disabled by default; add ``--enable-modules=cms`` or ``--enable-modules=cvc`` during configuration to turn them back on. Version 1.9.17, 2011-04-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Third release candidate for 1.10.0 * The format preserving encryption method currently available was presented in the header ``fpe.h`` and the functions ``fpe_encrypt`` and ``fpe_decrypt``. These were renamed as it is likely that other FPE schemes will be included in the future. The header is now ``fpe_fe1.h``, and the functions are named ``fe1_encrypt`` and ``fe1_decrypt``. See :doc:`fpe` for more information. * New options to ``configure.py`` control what tools are used for documentation generation. The ``--with-sphinx`` option enables using Sphinx to convert ReST into HTML; otherwise the ReST sources are installed directly. If ``--with-doxygen`` is used, Doxygen will run as well. Documentation generation can be triggered via the ``docs`` target in the makefile; it will also be installed by the install target on Unix. * A bug in 1.9.16 effectively disabled support for runtime CPU feature detection on x86 under GCC in that release. * A mostly internal change, all references to "ia32" and "amd64" have been changed to the vendor neutral and probably easier to understand "x86-32" and "x86-64". For instance, the "mp_amd64" module has been renamed "mp_x86_64", and the macro indicating x86-32 has changed from ``BOTAN_TARGET_ARCH_IS_IA32`` to ``BOTAN_TARGET_ARCH_IS_X86_32``. The classes calling assembly have also been renamed. * Similiarly to the above change, the AES implemenations using the AES-NI instruction set have been renamed from AES_XXX_Intel to AES_XXX_NI. * Systems that are identified as `sun4u` will default to compiling for 32-bit SPARCv9 code rather than 64-bit. This matches the still common convention for 32-bit SPARC userspaces. If you want 64-bit code on such as system, use ``--cpu=sparc64``. * Some minor fixes for compiling botan under the BeOS clone/continuation `Haiku `_. * Further updates to the documentation Version 1.9.16, 2011-04-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Second release candidate for 1.10.0 * The documentation, previously written in LaTeX, is now in reStructuredText suitable for processing by `Sphinx `_, which can generate nicely formatted HTML and PDFs. The documentation has also been greatly updated and expanded. * The class ``EC_Domain_Params`` has been renamed ``EC_Group``, with a typedef for backwards compatability. * ``EC_Group``'s string constructor didn't understand the standard names like "secp160r1", forcing use of the OIDs. * Two constructors for ECDSA private keys, the one that creates a new random key, and the one that provides a preset private key as a ``BigInt``, have been merged. This matches the existing interface for DSA and DH keys. If you previously used the version taking a ``BigInt`` private key, you'll have to additionally pass in a ``RandomNumberGenerator`` object starting in this release. * It is now possible to create ECDH keys with a preset ``BigInt`` private key; previously no method for this was available. * The overload of ``generate_passhash9`` that takes an explicit algorithm identifier has been merged with the one that does not. The algorithm identifier code has been moved from the second parameter to the fourth. See :ref:`passhash9` for details. * Change shared library versioning to match the normal Unix conventions. Instead of ``libbotan-X.Y.Z.so``, the shared lib is named ``libbotan-X.Y.so.Z``; this allows the runtime linker to do its runtime linky magic. It can be safely presumed that any change in the major or minor version indicates ABI incompatability. * Remove the socket wrapper code; it was not actually used by anything in the library, only in the examples, and you can use whatever kind of (blocking) socket interface you like with the SSL/TLS code. It's available as socket.h in the examples directory if you want to use it. * Disable the by-default 'strong' checking of private keys that are loaded from storage. You can always request key material sanity checking using Private_Key::check_key. * Bring back removed functions ``min_keylength_of``, ``max_keylength_of``, ``keylength_multiple_of`` in ``lookup.h`` to avoid breaking applications written against 1.8 Version 1.9.15, 2011-03-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * First release candidate for 1.10.0 * Modify how message expansion is done in SHA-256 and SHA-512. Instead of expanding the entire message at the start, compute them in the minimum number of registers. Values are computed 15 rounds before they are needed. On a Core i7-860, GCC 4.5.2, went from 143 to 157 MiB/s in SHA-256, and 211 to 256 MiB/s in SHA-512. * Pipe will delete empty output queues as soon as they are no longer needed, even if earlier messages still have data unread. However an (empty) entry in a deque of pointers will remain until all prior messages are completely emptied. * Avoid reading the SPARC ``%tick`` register on OpenBSD as unlike Linux the kernel will not trap and emulate it for us, causing a illegal instruction crash. * Improve detection and autoconfiguration for ARM processors. Version 1.9.14, 2011-03-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add support for bcrypt, OpenBSD's password hashing scheme. It is described in :ref:`bcrypt`. * Add support for NIST's AES key wrapping algorithm, as described in :rfc:`3394`. It is available by including ``rfc3394.h``. * Fix an infinite loop in zlib filters introduced in 1.9.11 (PR 142) Version 1.9.13, 2011-02-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Update Keccak to the round 3 variant * Fix ordering in GOST 34.10 signatures to match DNSSEC specifications * Use ``size_t`` instead of ``u32bit`` for small integers in DER/BER codecs * Add new build option ``--distribution-info`` * Fix problems in the amalgamation build * Fix building under Clang 2.9 and Sun Studio 12 Version 1.9.12, 2010-12-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add the Keccak hash function * Fix compilation problems in Python wrappers * Fix compilation problem in OpenSSL engine * Update SQLite3 database encryption codec Version 1.9.11, 2010-11-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Many SSL/TLS APIs have changed. This API is still unstable. * The SSL interface requires TR1 (uses std::tr1::function) * Fix SSL handshake failures when using RC4 ciphersuites * Fix a number of CRL encoding and decoding bugs * Counter mode now always encrypts 256 blocks in parallel * Code where u32bit was used to represent a length now uses size_t * Use small tables in the first round of AES * Removed AES class: app must choose AES-128, AES-192, or AES-256 * Add hex encoding/decoding functions that can be used without a Pipe * Add base64 encoding functions that can be used without a Pipe * Add to_string function to X509_Certificate * Add support for dynamic engine loading on Windows * Replace BlockCipher::BLOCK_SIZE attribute with function block_size() * Replace HashFunction::HASH_BLOCK_SIZE attribute with hash_block_size() * Changed semantics of MemoryRegion::resize and clear to match STL * Removed MemoryRegion::append, replaced by push_back and operator+= * Move PBKDF lookup to engine system * The IDEA key schedule has been changed to run in constant time * Avoid a possible timing vulnerability in Montgomery reduction * Add Algorithm and Key_Length_Specification classes * Switch default PKCS #8 encryption algorithm from AES-128 to AES-256 * Update Skein-512 to match the v1.3 specification * Allow using PBKDF2 with empty passphrases * Add compile-time deprecation warnings for GCC, Clang, and MSVC * Support use of HMAC(SHA-256) and CMAC(Blowfish) in passhash9 * Improve support for Intel Atom processors * Fix compilation problems under Sun Studio and Clang Version 1.9.10, 2010-08-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add a constant time AES implementation using SSSE3 * Add support for loading new Engines at runtime * Use GCC byteswap intrinsics where possible * Drop support for building with Python 2.4 * Fix benchmarking of block ciphers in ECB mode * Consolidate the two x86 assembly engines * Rename S2K to PBKDF Version 1.9.9, 2010-06-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add new X509::BER_encode and PKCS8::BER_encode * Give all Filter objects a name() function * Add Keyed_Filter::valid_iv_length * Increase default iteration counts for private key encryption * Fix compilation of mp_asm64 on 64-bit MIPS with GCC 4.4 and later * Fix compilation under Apple's GCC 4.2 * Expand and update the Doxygen documentation Version 1.9.8, 2010-06-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add support for wide multiplications on 64-bit Windows * Use constant time multiplication in IDEA * Avoid possible timing attack against OAEP decoding * Removed FORK-256; rarely used and it has been broken * Rename ``--use-boost-python`` to ``--with-boost-python`` * Skip building shared libraries on MinGW/Cygwin * Fix creation of 512 and 768 bit DL groups using the DSA kosherizer * Fix compilation on GCC versions before 4.3 (missing cpuid.h) * Fix compilation under the Clang compiler Version 1.9.7, 2010-04-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * TLS: Support reading SSLv2 client hellos * TLS: Add support for SEED ciphersuites (RFC 4162) * Add Comb4P hash combiner function * Fix checking of EMSA_Raw signatures with leading 0 bytes Version 1.9.6, 2010-04-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * TLS: Add support for TLS v1.1 * TLS: Support server name indicator extension * TLS: Fix server handshake * TLS: Fix server using DSA certificates * TLS: Avoid timing channel between CBC padding check and MAC verification Version 1.9.5, 2010-03-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Numerous ECC optimizations * Fix GOST 34.10-2001 X.509 key loading * Allow PK_Signer's fault protection checks to be toggled off * Avoid using pool-based locking allocator if we can't mlock * Remove all runtime options * New BER_Decoder::{decode_and_check, decode_octet_string_bigint} * Remove SecureBuffer in favor of SecureVector length parameter * HMAC_RNG: Perform a poll along with user-supplied entropy * Fix crash in MemoryRegion if Allocator::get failed * Fix small compilation problem on FreeBSD Version 1.9.4, 2010-03-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add the Ajisai SSLv3/TLSv1.0 implementation * Add GOST 34.10-2001 public key signature scheme * Add SIMD implementation of Noekeon * Add SSE2 implementation of IDEA * Extend Salsa20 to support longer IVs (XSalsa20) * Perform XTS encryption and decryption in parallel where possible * Perform CBC decryption in parallel where possible * Add SQLite3 db encryption codec, contributed by Olivier de Gaalon * Add a block cipher cascade construction * Add support for password hashing for authentication (passhash9.h) * Add support for Win32 high resolution system timers * Major refactoring and API changes in the public key code * Use consistency checking (anti-fault attack) for all signature schemes * Changed S2K interface: derive_key now takes salt, iteration count * Remove dependency on TR1 for ECC and CVC code * Renamed ECKAEG to its more usual name, ECDH * Fix crash in GMP_Engine if library is shutdown and reinitialized * Fix an invalid memory read in MD4 * Fix Visual C++ static builds * Remove Timer class entirely * Switch default PKCS #8 encryption algorithm from 3DES to AES-128 * New option --gen-amalgamation for creating a SQLite-style amalgamation * Many headers are now explicitly internal-use-only and are not installed * Greatly improve the Win32 installer * Several fixes for Visual C++ debug builds Version 1.9.3, 2009-11-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add new AES implementation using Intel's AES instruction intrinsics * Add an implementation of format preserving encryption * Allow use of any hash function in X.509 certificate creation * Optimizations for MARS, Skipjack, and AES * Set macros for available SIMD instructions in build.h * Add support for using InnoSetup to package Windows builds * By default build a DLL on Windows Version 1.9.2, 2009-11-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add SIMD version of XTEA * Support both SSE2 and AltiVec SIMD for Serpent and XTEA * Optimizations for SHA-1 and SHA-2 * Add AltiVec runtime detection * Fix x86 CPU identification with Intel C++ and Visual C++ Version 1.9.1, 2009-10-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Better support for Python and Perl wrappers * Add an implementation of Blue Midnight Wish (Round 2 tweak version) * Modify Skein-512 to match the tweaked 1.2 specification * Add threshold secret sharing (draft-mcgrew-tss-02) * Add runtime cpu feature detection for x86/x86-64 * Add code for general runtime self testing for hashes, MACs, and ciphers * Optimize XTEA; twice as fast as before on Core2 and Opteron * Convert CTR_BE and OFB from filters to stream ciphers * New parsing code for SCAN algorithm names * Enable SSE2 optimizations under Visual C++ * Remove all use of C++ exception specifications * Add support for GNU/Hurd and Clang/LLVM Version 1.9.0, 2009-09-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add support for parallel invocation of block ciphers where possible * Add SSE2 implementation of Serpent * Add Rivest's package transform (an all or nothing transform) * Minor speedups to the Turing key schedule * Fix processing multiple messages in XTS mode * Add --no-autoload option to configure.py, for minimized builds * The previously used configure.pl script is no longer supported Series 1.8 ---------------------------------------- Version 1.8.13, 2011-07-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * A race condition in `Algorithm_Factory` could cause crashes in multithreaded code. See `this thread on botan-devel `_ for details and workarounds. Version 1.8.12, 2011-06-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * If EMSA3(Raw) was used for more than one signature, it would produce incorrect output. * Fix the --enable-debug option to configure.py * Improve OS detection on Cygwin * Fix compilation under Sun Studio 12 on Solaris * Fix a memory leak in the constructors of DataSource_Stream and DataSink_Stream which would occur if opening the file failed. PR 144 Version 1.8.11, 2010-11-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a number of CRL encoding and decoding bugs * When building a debug library under VC++, use the debug runtime * Fix compilation under Sun Studio on Linux and Solaris * Add several functions for compatability with 1.9 * In the examples, read most input files as binary * The Perl build script has been removed in this release Version 1.8.10, 2010-08-31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Switch default PKCS #8 encryption algorithm from 3DES to AES-256 * Increase default hash iterations from 2048 to 10000 in PBES1 and PBES2 * Use small tables in the first round of AES * Add PBKDF typedef and get_pbkdf for better compatability with 1.9 * Add version of S2K::derive_key taking salt and iteration count * Enable the /proc-walking entropy source on NetBSD * Fix the doxygen makefile target Version 1.8.9, 2010-06-16 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Use constant time multiplication in IDEA * Avoid possible timing attack against OAEP decoding * Add new X509::BER_encode and PKCS8::BER_encode * Enable DLL builds under Windows * Add Win32 installer support * Add support for the Clang compiler * Fix problem in semcem.h preventing build under Clang or GCC 3.4 * Fix bug that prevented creation of DSA groups under 1024 bits * Fix crash in GMP_Engine if library is shutdown and reinitialized * Work around problem with recent binutils in x86-64 SHA-1 * The Perl build script is no longer supported and refuses to run by default Version 1.8.8, 2009-11-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Alter Skein-512 to match the tweaked 1.2 specification * Fix use of inline asm for access to x86 bswap function * Allow building the library without AES enabled * Add 'powerpc64' alias to ppc64 arch for Gentoo ebuild Version 1.8.7, 2009-09-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix processing multiple messages in XTS mode * Add --no-autoload option to configure.py, for minimized builds Version 1.8.6, 2009-08-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add Cryptobox, a set of simple password-based encryption routines * Only read world-readable files when walking /proc for entropy * Fix building with TR1 disabled * Fix x86 bswap support for Visual C++ * Fixes for compilation under Sun C++ * Add support for Dragonfly BSD (contributed by Patrick Georgi) * Add support for the Open64 C++ compiler * Build fixes for MIPS systems running Linux * Minor changes to license, now equivalent to the FreeBSD/NetBSD license Version 1.8.5, 2009-07-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Change configure.py to work on stock Python 2.4 * Avoid a crash in Skein_512::add_data processing a zero-length input * Small build fixes for SPARC, ARM, and HP-PA processors * The test suite now returns an error code from main() if any tests failed Version 1.8.4, 2009-07-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a bug in nonce generation in the Miller-Rabin test Version 1.8.3, 2009-07-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add a new Python configuration script * Add the Skein-512 SHA-3 candidate hash function * Add the XTS block cipher mode from IEEE P1619 * Fix random_prime when generating a prime of less than 7 bits * Improve handling of low-entropy situations during PRNG seeding * Change random device polling to prefer /dev/urandom over /dev/random * Use an input insensitive implementation of same_mem instead of memcmp * Correct DataSource::discard_next to return the number of discarded bytes * Provide a default value for AutoSeeded_RNG::reseed * Fix Gentoo bug 272242 Version 1.8.2, 2009-04-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Make entropy polling more flexible and in most cases faster * GOST 28147 now supports multiple sbox parameters * Added the GOST 34.11 hash function * Fix botan-config problems on MacOS X Version 1.8.1, 2009-01-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Avoid a valgrind warning in es_unix.cpp on 32-bit Linux * Fix memory leak in PKCS8 load_key and encrypt_key * Relicense api.tex from CC-By-SA 2.5 to BSD * Fix botan-config on MacOS X, Solaris Version 1.8.0, 2008-12-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix compilation on Solaris with GCC Series 1.7 ---------------------------------------- Version 1.7.24, 2008-12-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a compatibility problem with SHA-512/EMSA3 signature padding * Fix bug preventing EGD/PRNGD entropy poller from working * Fix integer overflow in Pooling_Allocator::get_more_core (bug id #27) * Add EMSA3_Raw, a variant of EMSA3 called CKM_RSA_PKCS in PKCS #11 * Add support for SHA-224 in EMSA2 and EMSA3 PK signature padding schemes * Add many more test vectors for RSA with EMSA2, EMSA3, and EMSA4 * Wrap private structs in SSE2 SHA-1 code in anonymous namespace * Change configure.pl's CPU autodetection output to be more consistent * Disable using OpenSSL's AES due to crashes of unknown cause * Fix warning in /proc walking entropy poller * Fix compilation with IBM XLC for Cell 0.9-200709 Version 1.7.23, 2008-11-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Change to use TR1 (thus enabling ECDSA) with GCC and ICC * Optimize almost all hash functions, especially MD4 and Tiger * Add configure.pl options --{with,without}-{bzip2,zlib,openssl,gnump} * Change Timer to be pure virtual, and add ANSI_Clock_Timer * Cache socket descriptors in the EGD entropy source * Avoid bogging down startup in /proc walking entropy source * Remove Buffered_EntropySource helper class * Add a Default_Benchmark_Timer typedef in benchmark.h * Add examples using benchmark.h and Algorithm_Factory * Add ECC tests from InSiTo * Minor documentation updates Version 1.7.22, 2008-11-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add provider preferences to Algorithm_Factory * Fix memory leaks in PBE_PKCS5v20 and get_pbe introduced in 1.7.21 * Optimize AES encryption and decryption (about 10% faster) * Enable SSE2 optimized SHA-1 implementation on Intel Prescott CPUs * Fix nanoseconds overflow in benchmark code * Remove Engine::add_engine Version 1.7.21, 2008-11-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Make algorithm lookup much more configuable * Add facilities for runtime performance testing of algorithms * Drop use of entropy estimation in the PRNGs * Increase intervals between HMAC_RNG automatic reseeding * Drop InitializerOptions class, all options but thread safety Version 1.7.20, 2008-11-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Namespace pkg-config file by major and minor versions * Cache device descriptors in Device_EntropySource * Split base.h into {block_cipher,stream_cipher,mac,hash}.h * Removed get_mgf function from lookup.h Version 1.7.19, 2008-11-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add HMAC_RNG, based on a design by Hugo Krawczyk * Optimized the Turing stream cipher (about 20% faster on x86-64) * Modify Randpool's reseeding algorithm to poll more sources * Add a new AutoSeeded_RNG in auto_rng.h * OpenPGP_S2K changed to take hash object instead of name * Add automatic identification for Intel's Prescott processors Version 1.7.18, 2008-10-22 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add Doxygen comments from InSiTo * Add ECDSA and ECKAEG benchmarks * Add configure.pl switch --with-tr1-implementation * Fix configure.pl's --with-endian and --with-unaligned-mem options * Added support for pkg-config * Optimize byteswap with x86 inline asm for Visual C++ by Yves Jerschow * Use const references to avoid copying overhead in CurveGFp, GFpModulus Version 1.7.17, 2008-10-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add missing ECDSA object identifiers * Fix error in x86 and x86-64 assembler affecting GF(p) math * Remove Boost dependency from GF(p) math * Modify botan-config to not print -L/usr/lib or -L/usr/local/lib * Add BOTAN_DLL macro to over 30 classes missing it * Rename the two SHA-2 base classes for consistency Version 1.7.16, 2008-10-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add several missing pieces needed for ECDSA and ECKAEG * Add Card Verifiable Certificates from InSiTo * Add SHA-224 from InSiTo * Add BSI variant of EMSA1 from InSiTo * Add GF(p) and ECDSA tests from InSiTo * Split ECDSA and ECKAEG into distinct modules * Allow OpenSSL and GNU MP engines to be built with public key algos disabled * Rename sha256.h to sha2_32.h and sha_64.h to sha2_64.h Version 1.7.15, 2008-10-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add GF(p) arithmetic from InSiTo * Add ECDSA and ECKAEG implementations from InSiTo * Minimize internal dependencies, allowing for smaller build configurations * Add new User Manual and Architecture Guide from FlexSecure GmbH * Alter configure.pl options for better autotools compatibility * Update build instructions for recent changes to configure.pl * Fix CPU detection using /proc/cpuinfo Version 1.7.14, 2008-09-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Split library into parts allowing modular builds * Add (very preliminary) CMS support to the main library * Some constructors now require object pointers instead of names * Support multiple implementations of the same algorithm * Build support for Pentium-M processors, from Derek Scherger * Build support for MinGW/MSYS, from Zbigniew Zagorski * Use inline assembly for bswap on 32-bit x86 Version 1.7.13, 2008-09-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add SSLv3 MAC, SSLv3 PRF, and TLS v1.0 PRF from Ajisai * Allow all examples to compile even if compression not enabled * Make CMAC's polynomial doubling operation a public class method * Use the -m64 flag when compiling with Sun Forte on x86-64 * Clean up and slightly optimize CMAC::final_result Version 1.7.12, 2008-09-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add x86 assembly for Visual Studio C++, by Luca Piccarreta * Add a Perl XS module, by Vaclav Ovsik * Add SWIG-based wrapper for Botan * Add SSE2 implementation of SHA-1, by Dean Gaudet * Remove the BigInt::sig_words cache due to bugs * Combined the 4 Blowfish sboxes, suggested by Yves Jerschow * Changed BigInt::grow_by and BigInt::grow_to to be non-const * Add private assignment operators to classes that don't support assignment * Benchmark RSA encryption and signatures * Added test programs for random_prime and ressol * Add high resolution timers for IA-64, HP-PA, S390x * Reduce use of the RNG during benchmarks * Fix builds on STI Cell PPU * Add support for IBM's XLC compiler * Add IETF 8192 bit MODP group Version 1.7.11, 2008-09-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the Salsa20 stream cipher * Optimized Montgomery reduction, Karatsuba squaring * Added 16x16->32 word Comba multiplication and squaring * Use a much larger Karatsuba cutoff point * Remove bigint_mul_add_words * Inlined several BigInt functions * Add useful information to the generated build.h * Rename alg_{ia32,amd64} modules to asm_{ia32,amd64} * Fix the Windows build Version 1.7.10, 2008-09-05 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Public key benchmarks run using a selection of random keys * New benchmark timer options are clock_gettime, gettimeofday, times, clock * Including reinterpret_cast optimization for xor_buf in default header * Split byte swapping and word rotation functions into distinct headers * Add IETF modp 6144 group and 2048 and 3072 bit DSS groups * Optimizes BigInt right shift * Add aliases in DL_Group::Format enum * BigInt now caches the significant word count Version 1.7.9, 2008-08-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Make clear() in most algorithm base classes a pure virtual * Add noexec stack marker for GNU linker in assembly code * Avoid string operations in ressol * Compilation fixes for MinGW and Visual Studio C++ 2008 * Some autoconfiguration fixes for Windows Version 1.7.8, 2008-07-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the block cipher Noekeon * Remove global deref_alias function * X509_Store takes timeout options as constructor arguments * Add Shanks-Tonelli algorithm, contributed by FlexSecure GmbH * Extend random_prime() for generating primes of any bit length * Remove Config class * Allow adding new entropy via base RNG interface * Reseeding a X9.31 PRNG also reseeds the underlying PRNG Version 1.7.7, 2008-06-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Remove the global PRNG object * The PK filter objects were removed * Add a test suite for the ANSI X9.31 PRNG * Much cleaner and (mostly) thread-safe reimplementation of es_ftw * Remove both default arguments to ANSI_X931_RNG's constructor * Remove the randomizing version of OctetString::change * Make the cipher and MAC to use in Randpool configurable * Move RandomNumberGenerator declaration to rng.h * RSA_PrivateKey will not generate keys smaller than 1024 bits * Fix an error decoding BER UNIVERSAL types with special taggings Version 1.7.6, 2008-05-05 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Initial support for Windows DLLs, from Joel Low * Reset the position pointer when a new block is generated in X9.32 PRNG * Timer objects are now treated as entropy sources * Moved several ASN.1-related enums from enums.h to an appropriate header * Removed the AEP module, due to inability to test * Removed Global_RNG and rng.h * Removed system_clock * Removed Library_State::UI and the pulse callback logic Version 1.7.5, 2008-04-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The API of X509_CA::sign_request was altered to avoid race conditions * New type Pipe::message_id to represent the Pipe message number * Remove the Named_Mutex_Holder for a small performance gain * Removed several unused or rarely used functions from Config * Ignore spaces inside of a decimal string in BigInt::decode * Allow using a std::istream to initialize a DataSource_Stream object * Fix compilation problem in zlib compression module * The chunk sized used by Pooling_Allocator is now a compile time setting * The size of random blinding factors is now a compile time setting * The install target no longer tries to set a particular owner/group Version 1.7.4, 2008-03-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Use unaligned memory read/writes on systems that allow it, for performance * Assembly for x86-64 for accessing the bswap instruction * Use larger buffers in ARC4 and WiderWAKE for significant throughput increase * Unroll loops in SHA-160 for a few percent increase in performance * Fix compilation with GCC 3.2 in es_ftw and es_unix * Build fix for NetBSD systems * Prevent es_dev from being built except on Unix systems Version 1.7.3, 2008-01-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * New invocation syntax for configure.pl with several new options * Support for IPv4 addresses in a subject alternative name * New fast poll for the generic Unix entropy source (es_unix) * The es_file entropy source has been replaced by the es_dev module * The malloc allocator does not inherit from Pooling_Allocator anymore * The path that es_unix will search in are now fully user-configurable * Truncate X9.42 PRF output rather than allow counter overflow * PowerPC is now assumed to be big-endian Version 1.7.2, 2007-10-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Initialize the global library state lazily * Add plain CBC-MAC for backwards compatibility with old systems * Clean up some of the self test code * Throw a sensible exception if a DL_Group is not found * Truncate KDF2 output rather than allowing counter overflow * Add newly assigned OIDs for SHA-2 and DSA with SHA-224/256 * Fix a Visual Studio compilation problem in x509stat.cpp Version 1.7.1, 2007-07-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a race condition in the algorithm object cache * HMAC key schedule optimization * The build header sets a macro defining endianness, if known * New word load/store abstraction allowing further optimization * Modify most of the library to avoid use the C-style casts * Use higher resolution timers in symmetric benchmarks Version 1.7.0, 2007-05-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * DSA parameter generation now follows FIPS 186-3 * Added OIDs for Rabin-Williams and Nyberg-Rueppel * Somewhat better support for out of tree builds * Minor optimizations for RC2 and Tiger * Documentation updates * Update the todo list Series 1.6 ---------------------------------------- Version 1.6.5, 2008-08-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add noexec stack marker for GNU linker in assembly code * Fix autoconfiguration problem on x86 with GCC 4.2 and 4.3 Version 1.6.4, 2008-03-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a compilation problem with Visual Studio C++ 2003 Version 1.6.3, 2007-07-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a race condition in the algorithm lookup cache * Fix problems building the memory pool on some versions of Visual C++ Version 1.6.2, 2007-03-24 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix autodection on Athlon64s running Linux * Fix builds on QNX and compilers using STLport * Remove a call to abort() that crept into production Version 1.6.1, 2007-01-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix some base64 decoder bugs * Add a new option to base64 encoding, to always append a newline * Fix some build problems under Visual Studio with debug enabled * Fix a bug in BER_Decoder that was triggered under some compilers Version 1.6.0, 2006-12-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Minor cleanups versus 1.5.13 Series 1.5 ---------------------------------------- Version 1.5.13, 2006-12-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Compilation fixes for the bzip2, zlib, and GNU MP modules * Better support for Intel C++ and EKOpath C++ on x86-64 Version 1.5.12, 2006-10-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Cleanups in the initialization routines * Add some x86-64 assembly for multiply-add * Fix problems generating very small (below 384 bit) RSA keys * Support out of tree builds * Bring some of the documentation up to date * More improvements to the Python bindings Version 1.5.11, 2006-09-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Removed the Algorithm base class * Various cleanups in the public key inheritance hierarchy * Major overhaul of the configure/build setup * Added x86 assembler implementations of Serpent and low-level MPI code * Optimizations for the SHA-1 x86 assembler * Various improvements to the Python wrappers * Work around a Visual Studio compiler bug Version 1.5.10, 2006-08-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add x86 assembler versions of MD4, MD5, and SHA-1 * Expand InitializerOptions' language to support on/off switches * Fix definition of OID 2.5.4.8; was accidentally changed in 1.5.9 * Fix possible resource leaks in the mmap allocator * Slightly optimized buffering in MDx_HashFunction * Initialization failures are dealt with somewhat better * Add an example implementing Pollard's Rho algorithm * Better option handling in the test/benchmark tool * Expand the xor_ciph example to support longer keys * Some updates to the documentation Version 1.5.9, 2006-07-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed bitrot in the AEP engine * Fix support for marking certificate/CRL extensions as critical * Significant cleanups in the library state / initialization code * LibraryInitializer takes an explicit InitializerOptions object * Make Mutex_Factory an abstract class, add Default_Mutex_Factory * Change configuration access to using global_state() * Add support for global named mutexes throughout the library * Add some STL wrappers for the delete operator * Change how certificates are created to be more flexible and general Version 1.5.8, 2006-06-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Many internal cleanups to the X.509 cert/CRL code * Allow for application code to support new X.509 extensions * Change the return type of X509_Certificate::{subject,issuer}_info * Allow for alternate character set handling mechanisms * Fix a bug that was slowing squaring performance somewhat * Fix a very hard to hit overflow bug in the C version of word3_muladd * Minor cleanups to the assembler modules * Disable es_unix module on FreeBSD due to build problem on FreeBSD 6.1 * Support for GCC 2.95.x has been dropped in this release Version 1.5.7, 2006-05-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Further, major changes to the BER/DER coding system * Updated the Qt mutex module to use Mutex_Factory * Moved the library global state object into an anonymous namespace * Drop the Visual C++ x86 assembly module due to bugs Version 1.5.6, 2006-03-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The low-level DER/BER coding system was redesigned and rewritten * Portions of the certificate code were cleaned up internally * Use macros to substantially clean up the GCC assembly code * Added 32-bit x86 assembly for Visual C++ (by Luca Piccarreta) * Avoid a couple of spurious warnings under Visual C++ * Some slight cleanups in X509_PublicKey::key_id Version 1.5.5, 2006-02-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a potential infinite loop in the memory pool code (Matt Johnston) * Made Pooling_Allocator::Memory_Block an actual class of sorts * Some small optimizations to the division and modulo computations * Cleaned up the implementation of some of the BigInt operators * Reduced use of dynamic memory allocation in low-level BigInt functions * A few simplifications in the Randpool mixing function * Removed power(), as it was not particularly useful (or fast) * Fixed some annoying bugs in the benchmark code * Added a real credits file Version 1.5.4, 2006-01-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Integrated x86 and amd64 assembly code, contributed by Luca Piccarreta * Fixed a memory access off-by-one in the Karatsuba code * Changed Pooling_Allocator's free list search to a log(N) algorithm * Merged ModularReducer with its only subclass, Barrett_Reducer * Fixed sign-handling bugs in some of the division and modulo code * Renamed the module description files to modinfo.txt * Further cleanups in the initialization code * Removed BigInt::add and BigInt::sub * Merged all the division-related functions into just divide() * Modified the functions to allow for better optimizations * Made the number of bits polled from an EntropySource user configurable * Avoid including in * Fixed some build problems with Sun Forte * Removed some dead code from bigint_modop * Fix the definition of same_mem Version 1.5.3, 2006-01-24 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Many optimizations in the low-level multiple precision integer code * Added hooks for assembly implementations of the MPI code * Support for the X.509 issuer alternative name extension in new certs * Fixed a bug in the decompression modules; found and patched by Matt Johnston * New Windows mutex module (mux_win32), by Luca Piccarreta * Changed the Windows timer module to use QueryPerformanceCounter * mem_pool.cpp was using std::set iterators instead of std::multiset ones * Fixed a bug in X509_CA preventing users from disabling particular extensions * Fixed the mp_asm64 module, which was entirely broken in 1.5.2 * Fixed some module build problems on FreeBSD and Tru64 Version 1.5.2, 2006-01-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed an off-by-one memory read in MISTY1::key() * Fixed a nasty memory leak in Output_Buffers::retire() * Reimplemented the memory allocator from scratch * Improved memory caching in Montgomery exponentiation * Optimizations for multiple precision addition and subtraction * Fixed a build problem in the hardware timer module on 64-bit PowerPC * Changed default Karatsuba cutoff to 12 words (was 14) * Removed MemoryRegion::bits(), which was unused and incorrect * Changed maximum HMAC keylength to 1024 bits * Various minor Makefile and build system changes * Avoid using std::min in to bypass Windows libc macro pollution * Switched checks/clock.cpp back to using clock() by default * Enabled the symmetric algorithm tests, which were accidentally off in 1.5.1 * Removed the Default_Mutex's unused clone() member function Version 1.5.1, 2006-01-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Implemented Montgomery exponentiation * Implemented generalized Karatsuba multiplication and squaring * Implemented Comba squaring for 4, 6, and 8 word inputs * Added new Modular_Exponentiator and Power_Mod classes * Removed FixedBase_Exp and FixedExponent_Exp * Fixed a performance regression in get_allocator introduced in 1.5.0 * Engines can now offer S2K algorithms and block cipher padding methods * Merged the remaining global 'algolist' code into Default_Engine * The low-level MPI code is linked as C again * Replaced BigInt's get_nibble with the more general get_substring * Some documentation updates Version 1.5.0, 2006-01-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Moved all global/shared library state into a single object * Mutex objects are created through mutex factories instead of a global * Removed ::get_mutex(), ::initialize_mutex(), and Mutex::clone() * Removed the RNG_Quality enum entirely * There is now only a single global-use PRNG * Removed the no_aliases and no_oids options for LibraryInitializer * Removed the deprecated algorithms SEAL, ISAAC, and HAVAL * Change es_ftw to use unbuffered I/O Series 1.4 ---------------------------------------- Version 1.4.12, 2006-01-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed an off-by-one memory read in MISTY1::key() * Fixed a nasty memory leak in Output_Buffers::retire() * Changed maximum HMAC keylength to 1024 bits * Fixed a build problem in the hardware timer module on 64-bit PowerPC Version 1.4.11, 2005-12-31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Changed Whirlpool diffusion matrix to match updated algorithm spec * Fixed several engine module build errors introduced in 1.4.10 * Fixed two build problems in es_capi; reported by Matthew Gregan * Added a constructor to DataSource_Memory taking a std::string * Placing the same Filter in multiple Pipes triggers an exception * The configure script accepts --docdir and --libdir * Merged doc/rngs.txt into the main API document * Thanks to Joel Low for several bug reports on early tarballs of 1.4.11 Version 1.4.10, 2005-12-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added an implementation of KASUMI, the block cipher used in 3G phones * Refactored Pipe; output queues are now managed by a distinct class * Made certain Filter facilities only available to subclasses of Fanout_Filter * There is no longer any overhead in Pipe for a message that has been read out * It is now possible to generate RSA keys as small as 128 bits * Changed some of the core classes to derive from Algorithm as a virtual base * Changed Randpool to use HMAC instead of a plain hash as the mixing function * Fixed a bug in the allocators; found and fixed by Matthew Gregan * Enabled the use of binary file I/O, when requested by the application * The OpenSSL engine's block cipher code was missing some deallocation calls * Disabled the es_ftw module on NetBSD, due to header problems there * Fixed a problem preventing tm_hard from building on MacOS X on PowerPC * Some cleanups for the modules that use inline assembler * config.h is now stored in build/ instead of build/include/botan/ * The header util.h was split into bit_ops.h, parsing.h, and util.h * Cleaned up some redundant include directives Version 1.4.9, 2005-11-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the IBM-created AES candidate algorithm MARS * Added the South Korean block cipher SEED * Added the stream cipher Turing * Added the new hash function FORK-256 * Deprecated the ISAAC stream cipher * Twofish and RC6 are significantly faster with GCC * Much better support for 64-bit PowerPC * Added support for high-resolution PowerPC timers * Fixed a bug in the configure script causing problems on FreeBSD * Changed ANSI X9.31 to support arbitrary block ciphers * Make the configure script a bit less noisy * Added more test vectors for some algorithms, including all the AES finalists * Various cosmetic source code cleanups Version 1.4.8, 2005-10-16 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Resolved a bad performance problem in the allocators; fix by Matt Johnston * Worked around a Visual Studio 2003 compilation problem introduced in 1.4.7 * Renamed OMAC to CMAC to match the official NIST naming * Added single byte versions of update() to PK_Signer and PK_Verifier * Removed the unused reverse_bits and reverse_bytes functions Version 1.4.7, 2005-09-25 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed major performance problems with recent versions of GNU C++ * Added an implementation of the X9.31 PRNG * Removed the X9.17 and FIPS 186-2 PRNG algorithms * Changed defaults to use X9.31 PRNGs as global PRNG objects * Documentation updates to reflect the PRNG changes * Some cleanups related to the engine code * Removed two useless headers, base_eng.h and secalloc.h * Removed PK_Verifier::valid_signature * Fixed configure/build system bugs affecting MacOS X builds * Added support for the EKOPath x86-64 compiler * Added missing destructor for BlockCipherModePaddingMethod * Fix some build problems with Visual C++ 2005 beta * Fix some build problems with Visual C++ 2003 Workshop Version 1.4.6, 2005-03-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix an error in the shutdown code introduced in 1.4.5 * Setting base/pkcs8_tries to 0 disables the builtin fail-out * Support for XMPP identifiers in X.509 certificates * Duplicate entries in X.509 DNs are removed * More fixes for Borland C++, from Friedemann Kleint * Add a workaround for buggy iostreams Version 1.4.5, 2005-02-26 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add support for AES encryption of private keys * Minor fixes for PBES2 parameter decoding * Internal cleanups for global state variables * GCC 3.x version detection was broken in non-English locales * Work around a Sun Forte bug affecting mem_pool.h * Several fixes for Borland C++ 5.5, from Friedemann Kleint * Removed inclusion of init.h into base.h * Fixed a major bug in reading from certificate stores * Cleaned up a couple of mutex leaks * Removed some left-over debugging code * Removed SSL3_MAC, SSL3_PRF, and TLS_PRF Version 1.4.4, 2004-12-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Further tweaks to the pooling allocator * Modified EMSA3 to support SSL/TLS signatures * Changes to support Qt/QCA, from Justin Karneges * Moved mux_qt module code into mod_qt * Fixes for HP-UX from Mike Desjardins Version 1.4.3, 2004-11-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Split up SecureAllocator into Allocator and Pooling_Allocator * Memory locking allocators are more likely to be used * Fixed the placement of includes in some modules * Fixed broken installation procedure * Fixes in configure script to support alternate install programs * Modules can specify the minimum version they support Version 1.4.2, 2004-10-31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a major CRL handling bug * Cipher and hash operations can be offloaded to engines * Added support for cipher and hash offload in OpenSSL engine * Improvements for 64-bit CPUs without a widening multiply instruction * Support for SHA2-* and Whirlpool with EMSA2 * Fixed a long-standing build problem with conflicting include files * Fixed some examples that hadn't been updated for 1.4.x * Portability fixes for Solaris, BSD, HP-UX, and others * Lots of fixes and cleanups in the configure script * Updated the Gentoo ebuild file Version 1.4.1, 2004-10-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed major errors in the X.509 and PKCS #8 copy_key functions * Added a LAST_MESSAGE meta-message number for Pipe * Added new aliases (3DES and DES-EDE) for Triple-DES * Added some new functions to PK_Verifier * Cleaned up the KDF interface * Disabled tm_posix on BSD due to header issues * Fixed a build problem on PowerPC with GNU C++ pre-3.4 Version 1.4.0, 2004-06-26 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the FIPS 186 RNG back * Added copy_key functions for X.509 public keys and PKCS #8 private keys * Fixed PKCS #1 signatures with RIPEMD-128 * Moved some code around to avoid warnings with Sun ONE compiler * Fixed a bug in botan-config affecting OpenBSD * Fixed some build problems on Tru64, HP-UX * Fixed compile problems with Intel C++, Compaq C++ Series 1.3 ---------------------------------------- Version 1.3.14, 2004-06-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added support for AEP's AEP1000/AEP2000 crypto cards * Added a Mutex module using Qt, from Justin Karneges * Added support for engine loading in LibraryInitializer * Tweaked SecureAllocator, giving 20% better performance under heavy load * Added timer and memory locking modules for Win32 (tm_win32, ml_win32) * Renamed PK_Engine to Engine_Core * Improved the Karatsuba cutoff points * Fixes for compiling with GCC 3.4 and Sun C++ 5.5 * Fixes for Linux/s390, OpenBSD, and Solaris * Added support for Linux/s390x * The configure script was totally broken for 'generic' OS * Removed Montgomery reduction due to bugs * Removed an unused header, pkcs8alg.h * check --validate returns an error code if any tests failed * Removed duplicate entry in Unix command list for es_unix * Moved the Cert_Usage enumeration into X509_Store * Added new timing methods for PK benchmarks, clock_gettime and RDTSC * Fixed a few minor bugs in the configure script * Removed some deprecated functions from x509cert.h and pkcs10.h * Removed the 'minimal' module, has to be updated for Engine support * Changed MP_WORD_BITS macro to BOTAN_MP_WORD_BITS to clean up namespace * Documentation updates Version 1.3.13, 2004-05-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major fixes for Cygwin builds * Minor MacOS X install fixes * The configure script is a little better at picking the right modules * Removed ml_unix from the 'unix' module set for Cygwin compatibility * Fixed a stupid compile problem in pkcs10.h Version 1.3.12, 2004-05-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added ability to remove old entries from CRLs * Swapped the first two arguments of X509_CA::update_crl() * Added an < operator for MemoryRegion, so it can be used as a std::map key * Changed X.509 searching by DNS name from substring to full string compares * Renamed a few X509_Certificate and PKCS10_Request member functions * Fixed a problem when decoding some PKCS #10 requests * Hex_Decoder would not check inputs, reported by Vaclav Ovsik * Changed default CRL expire time from 30 days to 7 days * X509_CRL's default PEM header is now "X509 CRL", for OpenSSL compatibility * Corrected errors in the API doc, fixes from Ken Perano * More documentation about the Pipe/Filter code Version 1.3.11, 2004-04-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed two show-stopping bugs in PKCS10_Request * Added some sanity checks in Pipe/Filter * The DNS and URI entries would get swapped in subjectAlternativeNames * MAC_Filter is now willing to not take a key at creation time * Setting the expiration times of certs and CRLs is more flexible * Fixed problems building on AIX with GCC * Fixed some problems in the tutorial pointed out by Dominik Vogt * Documentation updates Version 1.3.10, 2004-03-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added support for OpenPGP's ASCII armor format * Cleaned up the RNG system; seeding is much more flexible * Added simple autoconfiguration abilities to configure.pl * Fixed a GCC 2.95.x compile problem * Updated the example configuration file * Documentation updates Version 1.3.9, 2004-03-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added an engine using OpenSSL (requires 0.9.7 or later) * X509_Certificate would lose email addresses stored in the DN * Fixed a missing initialization in a BigInt constructor * Fixed several Visual C++ compile problems * Fixed some BeOS build problems * Fixed the WiderWake benchmark Version 1.3.8, 2003-12-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Internal changes to PK algorithms to divide data and algorithms * DSA/DH/NR/ElGamal constructors accept taking just the private key again * ElGamal keys now support being imported/exported as ASN.1 objects * Much more consistent and complete error checking in PK algorithms * Support for arbitrary backends (engines) for PK operations * Added Montgomery reductions * Added an engine that uses GNU MP (requires 4.1 or later) * Removed the obsolete mp_gmp module * Moved several initialization/shutdown functions to init.h * Major refactoring of the memory containers * New non-locking container, MemoryVector * Fixed 64-bit problems in BigInt::set_bit/clear_bit * Renamed PK_Key::check_params() to check_key() * Some incompatible changes to OctetString * Added version checking macros in version.h * Removed the fips140 module pending rewrite * Added some functions and hooks to help GUIs * Moved more shared code into MDx_HashFunction * Added a policy hook for specifying the encoding of X.509 strings Version 1.3.7, 2003-12-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a big security problem in es_unix * Fixed several stability problems in es_unix * Expanded the list of programs es_unix will try to use * SecureAllocator now only preallocates blocks in special cases * Added a special case in Global_RNG::seed for forcing a full poll * Removed the FIPS 186 RNG added in 1.3.5 pending further testing * Configure updates for PowerPC CPUs * Removed the (never tested) VAX support * Added support for S/390 Linux Version 1.3.6, 2003-12-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added a new module 'minimal', which disables most algorithms * SecureAllocator allocates a few blocks at startup * A few minor MPI cleanups * RPM spec file cleanups and fixes Version 1.3.5, 2003-11-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major improvements in ASN.1 string handling * Added partial support for ASN.1 UTF8 STRINGs and BMP STRINGs * Added partial support for the X.509v3 certificate policies extension * Centralized the handling of character set information * Added FIPS 140-2 startup self tests * Added a module (fips140) for doing extra FIPS 140-2 tests * Added FIPS 186-2 RNG * Improved ASN.1 BIT STRING handling * Removed a memory leak in PKCS10_Request * The encoding of DirectoryString now follows PKIX guidelines * Fixed some of the character set dependencies * Fixed a DER encoding error for tags greater than 30 * The BER decoder can now handle tags larger than 30 * Fixed tm_hard.cpp to recognize SPARC on more systems * Workarounds for a GCC 2.95.x bug in x509find.cpp * RPM changed to install into /usr instead of /usr/local * Added support for QNX Version 1.3.4, 2003-11-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added a module that does certain MPI operations using GNU MP * Added the X9.42 Diffie-Hellman PRF * The Zlib and Bzip2 objects now use custom allocators * Added member functions for directly hashing/MACing SecureVectors * Minor optimizations to the MPI addition and subtraction algorithms * Some cleanups in the low-level MPI code * Created separate AES-{128,192,256} objects Version 1.3.3, 2003-11-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The library can now be repeatedly initialized and shutdown without crashing * Fixed an off-by-one error in the CTS code * Fixed an error in the EMSA4 verification code * Fixed a memory leak in mutex.cpp (pointed out by James Widener) * Fixed a memory leak in Pthread_Mutex * Fixed several memory leaks in the testing code * Bulletproofed the EMSA/EME/KDF/MGF retrieval functions * Minor cleanups in SecureAllocator * Removed a needless mutex guarding the (stateless) global timer * Fixed a piece of bash-specific code in botan-config * X.509 objects report more information about decoding errors * Cleaned up some of the exception handling * Updated the example config file with new OIDSs * Moved the build instructions into a separate document, building.tex Version 1.3.2, 2003-11-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a bug preventing DSA signatures from verifying on X.509 objects * Made the X509_Store search routines more efficient and flexible * Added a function to X509_PublicKey to do easy public/private key matching * Added support for decoding indefinite length BER data * Changed Pipe's peek() to take an offset * Removed Filter::set_owns in favor of the new incr_owns function * Removed BigInt::zero() and BigInt::one() * Renamed the PEM related options from base/pem_* to pem/* * Added an option to specify the line width when encoding PEM * Removed the "rng/safe_longterm" option; it's always on now * Changed the cipher used for RNG super-encryption from ARC4 to WiderWake4+1 * Cleaned up the base64/hex encoders and decoders * Added an ASN.1/BER decoder as an example * AES had its internals marked 'public' in previous versions * Changed the value of the ASN.1 NO_OBJECT enum * Various new hacks in the configure script * Removed the already nominal support for SunOS Version 1.3.1, 2003-11-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Generalized a few pieces of the DER encoder * PKCS8::load_key would fail if handed an unencrypted key * Added a failsafe so PKCS #8 key decoding can't go into an infinite loop Version 1.3.0, 2003-11-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major redesign of the PKCS #8 private key import/export system * Added a small amount of UI interface code for getting passphrases * Added heuristics that tell if a key, cert, etc is stored as PEM or BER * Removed CS-Cipher, SHARK, ThreeWay, MD5-MAC, and EMAC * Removed certain deprecated constructors of RSA, DSA, DH, RW, NR * Made PEM decoding more forgiving of extra text before the header Series 1.2 ---------------------------------------- Version 1.2.8, 2003-11-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Merged several important bug fixes from 1.3.x Version 1.2.7, 2003-10-31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added support for reading configuration files * Added constructors so NR and RW keys can be imported easily * Fixed mp_asm64, which was completely broken in 1.2.6 * Removed tm_hw_ia32 module; replaced by tm_hard * Added support for loading certain oddly formed RSA certificates * Fixed spelling of NON_REPUDIATION enum * Renamed the option default_to_ca to v1_assume_ca * Fixed a minor bug in X.509 certificate generation * Fixed a latent bug in the OID lookup code * Updated the RPM spec file * Added to the tutorial Version 1.2.6, 2003-07-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major performance increase for PK algorithms on most 64-bit systems * Cleanups in the low-level MPI code to support asm implementations * Fixed build problems with some versions of Compaq's C++ compiler * Removed useless constructors for NR public and private keys * Removed support for the patch_file directive in module files * Removed several deprecated functions Version 1.2.5, 2003-06-22 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a tricky and long-standing memory leak in Pipe * Major cleanups and fixes in the memory allocation system * Removed alloc_mlock, which has been superseded by the ml_unix module * Removed a denial of service vulnerability in X509_Store * Fixed compilation problems with VS .NET 2003 and Codewarrior 8 * Added another variant of PKCS8::load_key, taking a memory buffer * Fixed various minor/obscure bugs which occurred when MP_WORD_BITS != 32 * BigInt::operator%=(word) was a no-op if the input was a power of 2 * Fixed portability problems in BigInt::to_u32bit * Fixed major bugs in SSL3-MAC * Cleaned up some messes in the PK algorithms * Cleanups and extensions for OMAC and EAX * Made changes to the entropy estimation function * Added a 'beos' module set for use on BeOS * Officially deprecated a few X509:: and PKCS8:: functions * Moved the contents of primes.h to numthry.h * Moved the contents of x509opt.h to x509self.h * Removed the (empty) desx.h header * Documentation updates Version 1.2.4, 2003-05-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a bug in EMSA1 affecting NR signature verification * Fixed a few latent bugs in BigInt related to word size * Removed an unused function, mp_add2_nc, from the MPI implementation * Reorganized the core MPI files Version 1.2.3, 2003-05-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a bug that prevented DSA/NR key generation * Fixed a bug that prevented importing some root CA certs * Fixed a bug in the BER decoder when handing optional bit or byte strings * Fixed the encoding of authorityKeyIdentifier in X509_CA * Added a sanity check in PBKDF2 for zero length passphrases * Added versions of X509::load_key and PKCS8::load_key that take a file name * X509_CA generates 128 bit serial numbers now * Added tests to check PK key generation * Added a simplistic X.509 CA example * Cleaned up some of the examples Version 1.2.2, 2003-05-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add checks to prevent any BigInt bugs from revealing an RSA or RW key * Changed the interface of Global_RNG::seed * Major improvements for the es_unix module * Added another Win32 entropy source, es_win32 * The Win32 CryptoAPI entropy source can now poll multiple providers * Improved the BeOS entropy source * Renamed pipe_unixfd module to fd_unix * Fixed a file descriptor leak in the EGD module * Fixed a few locking bugs Version 1.2.1, 2003-05-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added ANSI X9.23 compatible CBC padding * Added an entropy source using Win32 CryptoAPI * Removed the Pipe I/O operators taking a FILE* * Moved the BigInt encoding/decoding functions into the BigInt class * Integrated several fixes for VC++ 7 (from Hany Greiss) * Fixed the configure.pl script for Windows builds Version 1.2.0, 2003-04-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Tweaked the Karatsuba cut-off points * Increased the allowed keylength of HMAC and Blowfish * Removed the 'mpi_ia32' module, pending rewrite * Workaround a GCC 2.95.x bug in eme1.cpp Series 1.1 ---------------------------------------- Version 1.1.13, 2003-04-22 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added OMAC * Added EAX authenticated cipher mode * Diffie-Hellman would not do blinding in some cases * Optimized the OFB and CTR modes * Corrected Skipjack's word ordering, as per NIST clarification * Support for all subject/issuer attribute types required by RFC 3280 * The removeFromCRL CRL reason code is now handled correctly * Increased the flexibility of the allocators * Renamed Rijndael to AES, created aes.h, deleted rijndael.h * Removed support for the 'no_timer' LibraryInitializer option * Removed 'es_pthr' module, pending further testing * Cleaned up get_ciph.cpp Version 1.1.12, 2003-04-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a ASN.1 string encoding bug * Fixed a pair of X509_DN encoding problems * Base64_Decoder and Hex_Decoder can now validate input * Removed support for the LibraryInitializer option 'egd_path' * Added tests for DSA X.509 and PKCS #8 key formats * Removed a long deprecated feature of DH_PrivateKey's constructor * Updated the RPM .spec file * Major documentation updates Version 1.1.11, 2003-04-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added PKCS #10 certificate requests * Changed X509_Store searching interface to be more flexible * Added a generic Certificate_Store interface * Added a function for generating self-signed X.509 certs * Cleanups and changes to X509_CA * New examples for PKCS #10 and self-signed certificates * Some documentation updates Version 1.1.10, 2003-04-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * X509_CA can now generate new X.509 CRLs * Added blinding for RSA, RW, DH, and ElGamal to prevent timing attacks * More certificate and CRL extensions/attributes are supported * Better DN handling in X.509 certificates/CRLs * Added a DataSink hierarchy (suggested by Jim Darby) * Consolidated SecureAllocator and ManagedAllocator * Many cleanups and generalizations * Added a (slow) pthreads based EntropySource * Fixed some threading bugs Version 1.1.9, 2003-02-25 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added support for using X.509v2 CRLs * Fixed several bugs in the path validation algorithm * Certificates can be verified for a particular usage * Algorithm for comparing distinguished names now follows X.509 * Cleaned up the code for the es_beos, es_ftw, es_unix modules * Documentation updates Version 1.1.8, 2003-01-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixes for the certificate path validation algorithm in X509_Store * Fixed a bug affecting X509_Certificate::is_ca_cert() * Added a general configuration interface for policy issues * Cleanups and API changes in the X.509 CA, cert, and store code * Made various options available for X509_CA users * Changed X509_Time's interface to work around time_t problems * Fixed a theoretical weakness in Randpool's entropy mixing function * Fixed problems compiling with GCC 2.95.3 and GCC 2.96 * Fixed a configure bug (reported by Jon Wilson) affecting MinGW Version 1.1.7, 2003-01-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed an obscure but dangerous bug in SecureVector::swap * Consolidated SHA-384 and SHA-512 to save code space * Added SSL3-MAC and SSL3-PRF * Documentation updates, including a new tutorial Version 1.1.6, 2002-12-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Initial support for X.509v3 certificates and CAs * Major redesign/rewrite of the ASN.1 encoding/decoding code * Added handling for DSA/NR signatures encoded as DER SEQUENCEs * Documented the generic cipher lookup interface * Added an (untested) entropy source for BeOS * Various cleanups and bug fixes Version 1.1.5, 2002-11-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the discrete logarithm integrated encryption system (DLIES) * Various optimizations for BigInt * Added support for assembler optimizations in modules * Added BigInt x86 optimizations module (mpi_ia32) Version 1.1.4, 2002-11-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Speedup of 15-30% for PK algorithms * Implemented the PBES2 encryption scheme * Fixed a potential bug in decoding RSA and RW private keys * Changed the DL_Group class interface to handle different formats better * Added support for PKCS #3 encoded DH parameters * X9.42 DH parameters use a PEM label of 'X942 DH PARAMETERS' * Added key pair consistency checking * Fixed a compatibility problem with gcc 2.96 (pointed out by Hany Greiss) * A botan-config script is generated at configure time * Documentation updates Version 1.1.3, 2002-11-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added a generic public/private key loading interface * Fixed a small encoding bug in RSA, RW, and DH * Changed the PK encryption/decryption interface classes * ECB supports using padding methods * Added a function-based interface for library initialization * Added support for RIPEMD-128 and Tiger PKCS#1 v1.5 signatures * The cipher mode benchmarks now use 128-bit AES instead of DES * Removed some obsolete typedefs * Removed OpenCL support (opencl.h, the OPENCL_* macros, etc) * Added tests for PKCS #8 encoding/decoding * Added more tests for ECB and CBC Version 1.1.2, 2002-10-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Support for PKCS #8 encoded RSA, DSA, and DH private keys * Support for Diffie-Hellman X.509 public keys * Major reorganization of how X.509 keys are handled * Added PKCS #5 v2.0's PBES1 encryption scheme * Added a generic cipher lookup interface * Added the WiderWake4+1 stream cipher * Added support for sync-able stream ciphers * Added a 'paranoia level' option for the LibraryInitializer * More security for RNG output meant for long term keys * Added documentation for some of the new 1.1.x features * CFB's feedback argument is now specified in bits * Renamed CTR class to CTR_BE * Updated the RSA and DSA examples to use X.509 and PKCS #8 key formats Version 1.1.1, 2002-10-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the Korean hash function HAS-160 * Partial support for RSA and DSA X.509 public keys * Added a mostly functional BER encoder/decoder * Added support for non-deterministic MAC functions * Initial support for PEM encoding/decoding * Internal cleanups in the PK algorithms * Several new convenience functions in Pipe * Fixed two nasty bugs in Pipe * Messed with the entropy sources for es_unix * Discrete logarithm groups are checked for safety more closely now * For compatibility with GnuPG, ElGamal now supports DSA-style groups Version 1.1.0, 2002-09-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added entropy estimation to the RNGs * Improved the overall design of both Randpool and ANSI_X917_RNG * Added a separate RNG for nonce generation * Added window exponentiation support in power_mod * Added a get_s2k function and the PKCS #5 S2K algorithms * Added the TLSv1 PRF * Replaced BlockCipherModeIV typedef with InitializationVector class * Renamed PK_Key_Agreement_Scheme to PK_Key_Agreement * Renamed SHA1 -> SHA_160 and SHA2_x -> SHA_x * Added support for RIPEMD-160 PKCS#1 v1.5 signatures * Changed the key agreement scheme interface * Changed the S2K and KDF interfaces * Better SCAN compatibility for HAVAL, Tiger, MISTY1, SEAL, RC5, SAFER-SK * Added support for variable-pass Tiger * Major speedup for Rabin-Williams key generation Series 1.0 ---------------------------------------- Version 1.0.2, 2003-01-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed an obscure SEGFAULT causing bug in Pipe * Fixed an obscure but dangerous bug in SecureVector::swap Version 1.0.1, 2002-09-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a minor bug in Randpool::random() * Added some new aliases and typedefs for 1.1.x compatibility * The 4096-bit RSA benchmark key was decimal instead of hex * EMAC was returning an incorrect name Version 1.0.0, 2002-08-26 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Octal I/O of BigInt is now supported * Fixed portability problems in the es_egd module * Generalized IV handling in the block cipher modes * Added Karatsuba multiplication and k-ary exponentiation * Fixed a problem in the multiplication routines Series 0.9 ---------------------------------------- Version 0.9.2, 2002-08-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * DH_PrivateKey::public_value() was returning the wrong value * Various BigInt optimizations * The filters.h header now includes hex.h and base64.h * Moved Counter mode to ctr.h * Fixed a couple minor problems with VC++ 7 * Fixed problems with the RPM spec file Version 0.9.1, 2002-08-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Grand rename from OpenCL to Botan * Major optimizations for the PK algorithms * Added ElGamal encryption * Added Whirlpool * Tweaked memory allocation parameters * Improved the method of seeding the global RNG * Moved pkcs1.h to eme_pkcs.h * Added more test vectors for some algorithms * Fixed error reporting in the BigInt tests * Removed Default_Timer, it was pointless * Added some new example applications * Removed some old examples that weren't that interesting * Documented the compression modules Version 0.9.0, 2002-08-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * EMSA4 supports variable salt size * PK_* can take a string naming the encoding method to use * Started writing some internals documentation Series 0.8 ---------------------------------------- Version 0.8.7, 2002-07-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed bugs in EME1 and EMSA4 * Fixed a potential crash at shutdown * Cipher modes returned an ill-formed name * Removed various deprecated types and headers * Cleaned up the Pipe interface a bit * Minor additions to the documentation * First stab at a Visual C++ makefile (doc/Makefile.vc7) Version 0.8.6, 2002-07-25 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added EMSA4 (aka PSS) * Brought the manual up to date; many corrections and additions * Added a parallel hash function construction * Lookup supports all available algorithms now * Lazy initialization of the lookup tables * Made more discrete logarithm groups available through get_dl_group() * StreamCipher_Filter supports seeking (if the underlying cipher does) * Minor optimization for GCD calculations * Renamed SAFER_SK128 to SAFER_SK * Removed many previously deprecated functions * Some now-obsolete functions, headers, and types have been deprecated * Fixed some bugs in DSA prime generation * DL_Group had a constructor for DSA-style prime gen but it wasn't defined * Reversed the ordering of the two arguments to SEAL's constructor * Fixed a threading problem in the PK algorithms * Fixed a minor memory leak in lookup.cpp * Fixed pk_types.h (it was broken in 0.8.5) * Made validation tests more verbose * Updated the check and example applications Version 0.8.5, 2002-07-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major changes to constructors for DL-based cryptosystems (DSA, NR, DH) * Added a DL_Group class * Reworking of the pubkey internals * Support in lookup for aliases and PK algorithms * Renamed CAST5 to CAST_128 and CAST256 to CAST_256 * Added EMSA1 * Reorganization of header files * LibraryInitializer will install new allocator types if requested * Fixed a bug in Diffie-Hellman key generation * Did a workaround in pipe.cpp for GCC 2.95.x on Linux * Removed some debugging code from init.cpp that made FTW ES useless * Better checking for invalid arguments in the PK algorithms * Reduced Base64 and Hex default line length (if line breaking is used) * Fixes for HP's aCC compiler * Cleanups in BigInt Version 0.8.4, 2002-07-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added Nyberg-Rueppel signatures * Added Diffie-Hellman key exchange (kex interface is subject to change) * Added KDF2 * Enhancements to the lookup API * Many things formerly taking pointers to algorithms now take names * Speedups for prime generation * LibraryInitializer has support for seeding the global RNG * Reduced SAFER-SK128 memory consumption * Reversed the ordering of public and private key values in DSA constructor * Fixed serious bugs in MemoryMapping_Allocator * Fixed memory leak in Lion * FTW_EntropySource was not closing the files it read * Fixed line breaking problem in Hex_Encoder Version 0.8.3, 2002-06-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added DSA and Rabin-Williams signature schemes * Added EMSA3 * Added PKCS#1 v1.5 encryption padding * Added Filters for PK algorithms * Added a Keyed_Filter class * LibraryInitializer processes arguments now * Major revamp of the PK interface classes * Changed almost all of the Filters for non-template operation * Changed HMAC, Lion, Luby-Rackoff to non-template classes * Some fairly minor BigInt optimizations * Added simple benchmarking for PK algorithms * Added hooks for fixed base and fixed exponent modular exponentiation * Added some examples for using RSA * Numerous bugfixes and cleanups * Documentation updates Version 0.8.2, 2002-05-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added an (experimental) algorithm lookup interface * Added code for directly testing BigInt * Added SHA2-384 * Optimized SHA2-512 * Major optimization for Adler32 (thanks to Dan Nicolaescu) * Various minor optimizations in BigInt and related areas * Fixed two bugs in X9.19 MAC, both reported by Darren Starsmore * Fixed a bug in BufferingFilter * Made a few fixes for MacOS X * Added a workaround in configure.pl for GCC 2.95.x * Better support for PowerPC, ARM, and Alpha * Some more cleanups Version 0.8.1, 2002-05-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major code cleanup (check doc/deprecated.txt) * Various bugs fixed, including several portability problems * Renamed MessageAuthCode to MessageAuthenticationCode * A replacement for X917 is in x917_rng.h * Changed EMAC to non-template class * Added ANSI X9.19 compatible CBC-MAC * TripleDES now supports 128 bit keys Version 0.8.0, 2002-04-24 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Merged BigInt: many bugfixes and optimizations since alpha2 * Added RSA (rsa.h) * Added EMSA2 (emsa2.h) * Lots of new interface code for public key algorithms (pk_base.h, pubkey.h) * Changed some interfaces, including SymmetricKey, to support the global rng * Fixed a serious bug in ManagedAllocator * Renamed RIPEMD128 to RIPEMD_128 and RIPEMD160 to RIPEMD_160 * Removed some deprecated stuff * Added a global random number generator (rng.h) * Added clone functions to most of the basic algorithms * Added a library initializer class (init.h) * Version macros in version.h * Moved the base classes from opencl.h to base.h * Renamed the bzip2 module to comp_bzip2 and zlib to comp_zlib * Documentation updates for the new stuff (still incomplete) * Many new deprecated things: check doc/deprecated.txt Series 0.7 ---------------------------------------- Version 0.7.10, 2002-04-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added EGD_EntropySource module (es_egd) * Added a file tree walking EntropySource (es_ftw) * Added MemoryLocking_Allocator module (alloc_mlock) * Renamed the pthr_mux, unix_rnd, and mmap_mem modules * Changed timer mechanism; the clock method can be switched on the fly. * Renamed MmapDisk_Allocator to MemoryMapping_Allocator * Renamed ent_file.h to es_file.h (ent_file.h is around, but deprecated) * Fixed several bugs in MemoryMapping_Allocator * Added more default sources for Unix_EntropySource * Changed SecureBuffer to use same allocation methods as SecureVector * Added bigint_divcore into mp_core to support BigInt alpha2 release * Removed some Pipe functions deprecated since 0.7.8 * Some fixes for the configure program Version 0.7.9, 2002-03-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Memory allocation substantially revamped * Added memory allocation method based on mmap(2) in the mmap_mem module * Added ECB and CTS block cipher modes (ecb.h, cts.h) * Added a Mutex interface (mutex.h) * Added module pthr_mux, implementing the Mutex interface * Added Threaded Filter interface (thr_filt.h) * All algorithms can now by keyed with SymmetricKey objects * More testing occurs with --validate (expected failures) * Fixed two bugs reported by Hany Greiss, in Luby-Rackoff and RC6 * Fixed a buffering bug in Bzip_Decompress and Zlib_Decompress * Made X917 safer (and about 1/3 as fast) * Documentation updates Version 0.7.8, 2002-02-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * More capabilities for Pipe, inspired by SysV STREAMS, including peeking, better buffering, and stack ops. NOT BACKWARDS COMPATIBLE: SEE DOCUMENTATION * Added a BufferingFilter class * Added popen() based EntropySource for generic Unix systems (unix_rnd) * Moved 'devrand' module into main distribution (ent_file.h), renamed to File_EntropySource, and changed interface somewhat. * Made Randpool somewhat more conservative and also 25% faster * Minor fixes and updates for the configure script * Added some tweaks for memory allocation * Documentation updates for the new Pipe interface * Fixed various minor bugs * Added a couple of new example programs (stack and hasher2) Version 0.7.7, 2001-11-24 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Filter::send now works in the constructor of a Filter subclass * You may now have to include explicitly in some code * Added preliminary PK infrastructure classes in pubkey.h and pkbase.h * Enhancements to SecureVector (append, destroy functions) * New infrastructure for secure memory allocation * Added IEEE P1363 primitives MGF1, EME1, KDF1 * Rijndael optimizations and cleanups * Changed CipherMode to BlockCipherMode(B*) * Fixed a nasty bug in pipe_unixfd * Added portions of the BigInt code into the main library * Support for VAX, SH, POWER, PowerPC-64, Intel C++ Version 0.7.6, 2001-10-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed several serious bugs in SecureVector created in 0.7.5 * Square optimizations * Fixed shared objects on MacOS X and HP-UX * Fixed static libs for KCC 4.0; works with KCC 3.4g as well * Full support for Athlon and K6 processors using GCC * Added a table of prime numbers < 2**16 (primes.h) * Some minor documentation updates Version 0.7.5, 2001-08-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Split checksum.h into adler32.h, crc24.h, and crc32.h * Split modes.h into cbc.h, cfb.h, and ofb.h * CBC_wPadding* has been replaced by CBC_Encryption and CBC_Decryption * Added OneAndZeros and NoPadding methods for CBC * Added Lion, a very fast block cipher construction * Added an S2K base class (s2k.h) and an OpenPGP_S2K class (pgp_s2k.h) * Basic types (ciphers, hashes, etc) know their names now (call name()) * Changed the EntropySource type somewhat * Big speed-ups for ISAAC, Adler32, CRC24, and CRC32 * Optimized CAST-256, DES, SAFER-SK, Serpent, SEAL, MD2, and RIPEMD-160 * Some semantics of SecureVector have changed slightly * The mlock module has been removed for the time being * Added string handling functions for hashes and MACs * Various non-user-visible cleanups * Shared library soname is now set to the full version number Version 0.7.4, 2001-07-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * New modules: Zlib, gettimeofday and x86 RTC timers, Unix I/O for Pipe * Fixed a vast number of errors in the config script/makefile/specfile * Pipe now has a stdio(3) interface as well as C++ iostreams * ARC4 supports skipping the first N bytes of the cipher stream (ala MARK4) * Bzip2 supports decompressing multiple concatenated streams, and flushing * Added a simple 'overall average' score to the benchmarks * Fixed a small bug in the POSIX timer module * Removed a very-unlikely-to-occur bug in most of the hash functions * filtbase.h now includes , not * Minor documentation updates Version 0.7.3, 2001-06-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix build problems on Solaris/SPARC * Fix build problems with Perl versions < 5.6 * Fixed some stupid code that broke on a few compilers * Added string handling functions to Pipe * MISTY1 optimizations Version 0.7.2, 2001-06-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Build system supports modules * Added modules for mlock, a /dev/random EntropySource, POSIX1.b timers * Added Bzip2 compression filter, contributed by Peter Jones * GNU make no longer required (tested with 4.4BSD pmake and Solaris make) * Fixed minor bug in several of the hash functions * Various other minor fixes and changes * Updates to the documentation Version 0.7.1, 2001-05-16 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Rewrote configure script: more consistent and complete * Made it easier to find out parameters of types at run time (opencl.h) * New functions for finding the version being used (version.h) * New SymmetricKey interface for Filters (symkey.h) * InvalidKeyLength now records what the invalid key length was * Optimized DES, CS-Cipher, MISTY1, Skipjack, XTEA * Changed GOST to use correct S-box ordering (incompatible change) * Benchmark code was almost totally rewritten * Many more entries in the test vector file * Fixed minor and idiotic bug in check.cpp Version 0.7.0, 2001-03-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * First public release Botan-1.10.12/doc/lowlevel.txt0000664000175000017500000002117112654331322015725 0ustar jackjack00000000000000 The Low-Level Interface ================================= Botan has two different interfaces. The one documented in this section is meant more for implementing higher-level types (see the section on filters, earlier in this manual) than for use by applications. Using it safely requires a solid knowledge of encryption techniques and best practices, so unless you know, for example, what CBC mode and nonces are, and why PKCS #1 padding is important, you should avoid this interface in favor of something working at a higher level. Basic Algorithm Abilities --------------------------------- There are a small handful of functions implemented by most of Botan's algorithm objects. Among these are: .. cpp:function:: std::string Algorithm::name() Returns a human-readable string of the name of this algorithm. Examples of names returned are "AES-128" and "HMAC(SHA-512)". You can turn names back into algorithm objects using the functions in ``lookup.h``. .. cpp:function:: void Algorithm::clear() Clear out the algorithm's internal state. A block cipher object will "forget" its key, a hash function will "forget" any data put into it, etc. The object will look and behave as it did when you initially allocated it. .. cpp:function:: T* Algorithm::clone() This function is central to Botan's name-based interface. The ``clone`` has many different return types, such as ``BlockCipher``\* and ``HashFunction``\*, depending on what kind of object it is called on. Note that unlike Java's clone, this returns a new object in a "pristine" state; that is, operations done on the initial object before calling ``clone`` do not affect the initial state of the new clone. Cloned objects can (and should) be deallocated with the C++ ``delete`` operator. Keys and IVs --------------------------------- Both symmetric keys and initialization values can be considered byte (or octet) strings. These are represented by .. cpp:class:: OctetString Also known as ``SymmetricKey`` and ``InitializationVector``, when you want to express intent. .. cpp:function:: OctetString(RandomNumberGenerator& rng, size_t length) This constructor creates a new random key *length* bytes long using the random number generator. .. cpp:function:: OctetString(std::string str) The argument *str* is assumed to be a hex string; it is converted to binary and stored. Whitespace is ignored. .. cpp:function:: OctetString(const byte* input, size_t length) This constructor copies its input. .. cpp:function:: as_string() const Returns the hex representation of the key or IV Symmetrically Keyed Algorithms --------------------------------- Block ciphers, stream ciphers, and MACs are all keyed operations; to be useful, they have to be set to use a particular key, which is a randomly chosen string of bits of a specified length. The length required by any particular algorithm may vary, depending on both the algorithm specification and the implementation. You can query any botan object to find out what key length(s) it supports. To make this similarity in terms of keying explicit, all algorithms of those types are derived from the :cpp:class`SymmetricAlgorithm` base. This type provides functions for setting the key, and querying restrictions on the size of the key. .. cpp:class:: SymmetricAlgorithm .. cpp:function:: void set_key(const byte* key, size_t length) .. cpp:function:: void set_key(const SymmetricKey& key) This sets the key to the value specified. Most algorithms only accept keys of certain lengths. If you attempt to call ``set_key`` with a key length that is not supported, the exception ``Invalid_Key_Length`` will be thrown. In all cases, ``set_key`` must be called on an object before any data processing (encryption, decryption, etc) is done by that object. If this is not done, the results are undefined. .. cpp:function:: bool valid_keylength(size_t length) const This function returns true if and only if *length* is a valid keylength for the algorithm. .. cpp:function:: size_t minimum_keylength() const Return the smallest key length (in bytes) that is acceptible for the algorithm. .. cpp:function:: size_t maximum_keylength() const Return the largest key length (in bytes) that is acceptible for the algorithm Block Ciphers --------------------------------- All block ciphers classes in botan are subclasses of .. cpp:class:: BlockCipher Which subclasses the :cpp:class:`SymmetricAlgorithm` interface. .. cpp:function:: size_t block_size() const Returns the block size of the cipher in bytes .. cpp:function:: void encrypt_n(const byte* in, \ byte* out, size_t n) const Encrypt *n* blocks of data, taking the input from the array *in* and placing the ciphertext into *out*. The two pointers may be identical, but should not overlap ranges. .. cpp:function:: void encrypt(const byte* in, byte* out) const Encrypt a single block, taking the input from *in* and placing it in *out*. Acts like :cpp:func:`encrypt_n`\ (in, out, 1). .. cpp:function:: void encrypt(byte* block) const Identical to :cpp:func:`encrypt`\ (block, block) .. cpp:function:: void decrypt_n(const byte* in, byte out, size_t n) const Decrypt *n* blocks of data, taking the input from *in* and placing the plaintext in *out*. The two pointers may be identical, but should not overlap ranges. .. cpp:function:: void decrypt(const byte* in, byte* out) const Decrypt a single block, taking the input from *in* and placing it in *out*. Acts like :cpp:func:`decrypt_n`\ (in, out, 1). .. cpp:function:: void decrypt(byte* block) const Identical to :cpp:func:`decrypt`\ (block, block) Stream Ciphers --------------------------------- Stream ciphers are somewhat different from block ciphers, in that encrypting data results in changing the internal state of the cipher. Also, you may encrypt any length of data in one go (in byte amounts). .. cpp:function:: void StreamCipher::encrypt(const byte* in, byte* out, size_t length) .. cpp:function:: void StreamCipher::encrypt(byte* data, size_t length) Stream ciphers implement the ``SymmetricAlgorithm`` interface. Hash Functions / Message Authentication Codes ---------------------------------------------- Hash functions take their input without producing any output, only producing anything when all input has already taken place. MACs are very similar, but are additionally keyed. Both of these are derived from the base class ``BufferedComputation``, which has the following functions. .. cpp:function:: size_t BufferedComputation::output_length() Return the size of the output of this function. .. cpp:function:: void BufferedComputation::update(const byte* input, size_t length) .. cpp:function:: void BufferedComputation::update(byte input) .. cpp:function:: void BufferedComputation::update(const std::string& input) Updates the hash/mac calculation with *input*. .. cpp:function:: void BufferedComputation::final(byte* out) .. cpp:function:: SecureVector BufferedComputation::final() Complete the hash/MAC calculation and place the result into ``out``. For the argument taking an array, exactly ``output_length`` bytes will be written. After you call ``final``, the hash function is reset to its initial state, so it may be reused immediately. The second method of using final is to call it with no arguments at all, as shown in the second prototype. It will return the hash/mac value in a memory buffer. There is also a pair of functions called ``process``. They are a combination of a single ``update``, and ``final``. Both versions return the final value, rather than placing it an array. Calling ``process`` with a single byte value isn't available, mostly because it would rarely be useful. A MAC can be viewed (in most cases) as a keyed hash function, so classes that are derived from ``MessageAuthenticationCode`` have ``update`` and ``final`` classes just like a ``HashFunction`` (and like a ``HashFunction``, after ``final`` is called, it can be used to make a new MAC right away; the key is kept around). A MAC has the ``SymmetricAlgorithm`` interface in addition to the ``BufferedComputation`` interface. Checksums ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Checksums are very similar to hash functions, and in fact share the same interface. But there are some significant differences, the major ones being that the output size is very small (usually in the range of 2 to 4 bytes), and is not cryptographically secure. But for their intended purpose (error checking), they perform very well. Some examples of checksums included in Botan are the Adler32 and CRC32 checksums. Botan-1.10.12/doc/passhash.txt0000664000175000017500000001165412654331322015713 0ustar jackjack00000000000000 Password Hashing ======================================== Storing passwords for user authentication purposes in plaintext is the simplest but least secure method; when an attacker compromises the database in which the passwords are stored, they immediately gain access to all of them. Often passwords are reused among multiple services or machines, meaning once a password to a single service is known an attacker has a substantial head start on attacking other machines. The general approach is to store, instead of the password, the output of a one way function of the password. Upon receiving an authentication request, the authenticator can recompute the one way function and compare the value just computed with the one that was stored. If they match, then the authentication request succeeds. But when an attacker gains access to the database, they only have the output of the one way function, not the original password. Common hash functions such as SHA-256 are one way, but used alone they have problems for this purpose. What an attacker can do, upon gaining access to such a stored password database, is hash common dictionary words and other possible passwords, storing them in a list. Then he can search through his list; if a stored hash and an entry in his list match, then he has found the password. Even worse, this can happen *offline*: an attacker can begin hashing common passwords days, months, or years before ever gaining access to the database. In addition, if two users choose the same password, the one way function output will be the same for both of them, which will be visible upon inspection of the database. There are two solutions to these problems: salting and iteration. Salting refers to including, along with the password, a randomly chosen value which perturbs the one way function. Salting can reduce the effectivness of offline dictionary generation (because for each potential password, an attacker would have to compute the one way function output for all possible salts - with a large enough salt, this can make the problem quite difficult). It also prevents the same password from producing the same output, as long as the salts do not collide. With a large salt (say 80 to 128 bits) this will be quite unlikely. Iteration refers to the general technique of forcing multiple one way function evaluations when computing the output, to slow down the operation. For instance if hashing a single password requires running SHA-256 100,000 times instead of just once, that will slow down user authentication by a factor of 100,000, but user authentication happens quite rarely, and usually there are more expensive operations that need to occur anyway (network and database I/O, etc). On the other hand, an attacker who is attempting to break a database full of stolen password hashes will be seriously inconvenienced by a factor of 100,000 slowdown; they will be able to only test at a rate of .0001% of what they would without iterations (or, equivalently, will require 100,000 times as many zombie botnet hosts). Botan provides two techniques for password hashing, bcrypt and passhash9. .. _bcrypt: Bcrypt Password Hashing ---------------------------------------- Bcrypt is a password hashing scheme originally designed for use in OpenBSD, but numerous other implementations exist. It is made available by including ``bcrypt.h``. Bcrypt provides outputs that look like this:: "$2a$12$7KIYdyv8Bp32WAvc.7YvI.wvRlyVn0HP/EhPmmOyMQA4YKxINO0p2" .. cpp:function:: std::string generate_bcrypt(const std::string& password, \ RandomNumberGenerator& rng, u16bit work_factor = 10) Takes the password to hash, a rng, and a work factor. Higher values increase the amount of time the algorithm runs, increasing the cost of cracking attempts. The resulting hash is returned as a string. .. cpp:function:: bool check_bcrypt(const std::string& password, \ const std::string& hash) Takes a password and a bcrypt output and returns true if the password is the same as the one that was used to generate the bcrypt hash. Here is an example of using bcrypt: .. literalinclude:: examples/bcrypt.cpp .. _passhash9: Passhash9 ---------------------------------------- Botan also provides a password hashing technique called passhash9, in ``passhash9.h``, which is based on PBKDF2. Its outputs look like:: "$9$AAAKxwMGNPSdPkOKJS07Xutm3+1Cr3ytmbnkjO6LjHzCMcMQXvcT" .. cpp:function:: std::string generate_passhash9(const std::string& password, \ RandomNumberGenerator& rng, u16bit work_factor = 10, byte alg_id = 0) Functions much like ``generate_bcrypt``. The last parameter, ``alg_id``, specifies which PRF to use. Currently defined values are ======= ============== Value PRF algorithm ======= ============== 0 HMAC(SHA-1) 1 HMAC(SHA-256) 2 CMAC(Blowfish) ======= ============== .. cpp:function:: bool check_passhash9(const std::string& password, \ const std::string& hash) Functions much like ``check_bcrypt`` Botan-1.10.12/doc/pbkdf.txt0000664000175000017500000000633412654331322015166 0ustar jackjack00000000000000 .. _pbkdf: PBKDF Algorithms ======================================== There are various procedures for turning a passphrase into a arbitrary length key for use with a symmetric cipher. A general interface for such algorithms is presented in ``pbkdf.h``. The main function is ``derive_key``, which takes a passphrase, a salt, an iteration count, and the desired length of the output key, and returns a key of that length, deterministically produced from the passphrase and salt. If an algorithm can't produce a key of that size, it will throw an exception (most notably, PKCS #5's PBKDF1 can only produce strings between 1 and $n$ bytes, where $n$ is the output size of the underlying hash function). The purpose of the iteration count is to make the algorithm take longer to compute the final key (reducing the speed of brute-force attacks of various kinds). Most standards recommend an iteration count of at least 10000. Currently defined PBKDF algorithms are "PBKDF1(digest)", "PBKDF2(digest)", and "OpenPGP-S2K(digest)"; you can retrieve any of these using the ``get_pbkdf``, found in ``lookup.h``. As of this writing, "PBKDF2(SHA-256)" with 10000 iterations and a 16 byte salt is recommend for new applications. .. cpp:function:: OctetString PBKDF::derive_key( \ size_t output_len, const std::string& passphrase, \ const byte* salt, size_t salt_len, \ size_t iterations) const Computes a key from *passphrase* and the *salt* (of length *salt_len* bytes) using an algorithm-specific interpretation of *iterations*, producing a key of length *output_len*. Use an iteration count of at least 10000. The salt should be randomly chosen by a good random number generator (see :ref:`random_number_generators` for how), or at the very least unique to this usage of the passphrase. If you call this function again with the same parameters, you will get the same key. :: PBKDF* pbkdf = get_pbkdf("PBKDF2(SHA-256)"); AutoSeeded_RNG rng; SecureVector salt = rng.random_vec(16); OctetString aes256_key = pbkdf->derive_key(32, "password", &salt[0], salt.size(), 10000); OpenPGP S2K ---------------------------------------- There are some oddities about OpenPGP's S2K algorithms that are documented here. For one thing, it uses the iteration count in a strange manner; instead of specifying how many times to iterate the hash, it tells how many *bytes* should be hashed in total (including the salt). So the exact iteration count will depend on the size of the salt (which is fixed at 8 bytes by the OpenPGP standard, though the implementation will allow any salt size) and the size of the passphrase. To get what OpenPGP calls "Simple S2K", set iterations to 0, and do not specify a salt. To get "Salted S2K", again leave the iteration count at 0, but give an 8-byte salt. "Salted and Iterated S2K" requires an 8-byte salt and some iteration count (this should be significantly larger than the size of the longest passphrase that might reasonably be used; somewhere from 1024 to 65536 would probably be about right). Using both a reasonably sized salt and a large iteration count is highly recommended to prevent password guessing attempts. Botan-1.10.12/doc/pgpkey.txt0000664000175000017500000000410112654331322015365 0ustar jackjack00000000000000 PGP Code Signing Key ======================================== .. highlight:: none The following PGP key is used to sign all releases:: pub 2048R/EFBADFBC 2004-10-30 Key fingerprint = 621D AF64 11E1 851C 4CF9 A2E1 6211 EBF1 EFBA DFBC uid Botan Distribution Key -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.17 (GNU/Linux) mQELBEGD1j0BCADHxPJkPcjJE+4Dlisx2hVc0Dj6JI1MSLrkM8R+2bOhVUSferxP T1EMPhfrAdOHTAloyvRThJztnZsNKqfLL49GGcBLdEGAVNks1pG37Teze5Lx1XIu zJFrozL2sqBy5C6nHpFgd1tcD68Rah2wp0u2cR9owXf1IqKdEfuo661+MTv7wTB1 4hKV75nB7ZO6676SEZRILYM+7RJwKAKEmEPJc6hEf94VXn9ecNzaTlHgYkjhz9db LOd3od9XvuUw+LMR1dwBqMxbvR90MiXjbedDEkbArcZB9YOAIvEX/lC3qaW4XJt4 iwHWl/YVZEfALcvQywe2CDrH5hO794wd9MpBAAYptBZCb3RhbiBEaXN0cmlidXRp b24gS2V5iQEqBBMBAgAUAhsDAh4BAheABQJKfFpnBBUKCQgACgkQYhHr8e+637xk PQf/aOi78XenwwvFrwXOVIVTdZIf8rK1zJksf26h09UD8uVV6z5iiTcpn86+eN9p 6Ar8IH3tD+JuFnPSwZ/r9MNC2XZwenYo4Gb14jqM6/9hBe328vmeM4Y1G7bD4HrL kgV5WEyokqm3zbp3FBLr3Vh68TAC5JB9aHevra+cCA2u3vBNI3YUM5z4TdO150P3 J00whkqImQEUni8bgxvllBLFM+uhucsX3HZWkoDEpotbg8yd0bqMkiPEyMr1OnJq eDVDMrB5wnyLgLFfRAAw3mopM0C1PNOAHr/BIYiaDHX2OwnOfep8rMDoRVf2Ge0D DBgsJJ6LduQHLeg403SHWL2F6YkCHAQTAQIABgUCQYPWUgAKCRBcD5boTsFta+r9 EACWVis7YcaGkKKgRB/5ox8rM36XVhMXdh/hnnGHt5rapbbRRkRHRcWU8WIcFO1A 59+TfwNNd8gN1MEt/5aX5KHWVKHBDexJgIxm6Dm1pisYHf/dnYQPM18hmqqwNlKY 97hFkPpHd7enrtc/SvGbQhhLXYlpwBrdMl76e9xJLnnrRQksxegGPo8cr+C9HTs1 Lwa8zzBxyBwYBYX+0moDkDShEhuXx6mEOXrGvQanJuIvpoIwGH+62E65MbJGlwWp w/MAtm2jFhBIhGV0bqJCFp9zIgdNgfskBaPr0oilbuJQZqP0Iqe/6CCt4XkS51yW ZqxjLAFpEpvDec4PGw3witKf/koGon9X8C035+nEjLBrWy18Q91vw2USyLI+mm9d iMAS8pY2gomfxBO2VwYHJryZykjCYQkccRA1tHteRj4gqTObo0Ak47y5MnplTWwi 40oP7K2cfhCRBmMioxmYES4xsHEupfRBo3xr1Jq9q0t688WTT1NXHPMPoueF9mKZ Cf2pa9aHsqBmWTm3sCaNQKGubCDBEUmJUyndmSatJyYM7NVYoUp6EfqMACFuTNdB sjKMh7aWVikQpbJDfA1BIU3lZeqgjgrghVAWkEOBfhG0IVZj+RVCJpsqoTJ8asY2 VreArSCyr/VnLEnfuH/QpgvCiCbepo3E34DJt4SaAOO2ZohGBBARAgAGBQJMGVc1 AAoJEKY/LL36AvvMgsoAn2G7kXd09BF7ffk1Sfh174SVrvM9AKC7+R7x0+yV3SCd JkkUOo3xR5cOxw== =1QuR -----END PGP PUBLIC KEY BLOCK----- Botan-1.10.12/doc/pubkey.txt0000664000175000017500000005510112654331322015373 0ustar jackjack00000000000000 Public Key Cryptography ================================= Public key cryptography (also called assymmetric cryptography) is a collection of techniques allowing for encryption, signatures, and key agreement. Key Objects ---------------------------------------- Public and private keys are represented by classes ``Public_Key`` and it's subclass ``Private_Key``. The use of inheritence here means that a ``Private_Key`` can be converted into a reference to a public key. None of the functions on ``Public_Key`` and ``Private_Key`` itself are particularly useful for users of the library, because 'bare' public key operations are *very insecure*. The only purpose of these functions is to provide a clean interface that higher level operations can be built on. So really the only thing you need to know is that when a function takes a reference to a ``Public_Key``, it can take any public key or private key, and similiarly for ``Private_Key``. Types of ``Public_Key`` include ``RSA_PublicKey``, ``DSA_PublicKey``, ``ECDSA_PublicKey``, ``DH_PublicKey``, ``ECDH_PublicKey``, ``RW_PublicKey``, ``NR_PublicKey``,, and ``GOST_3410_PublicKey``. There are cooresponding ``Private_Key`` classes for each of these algorithms. .. _creating_new_private_keys: Creating New Private Keys ---------------------------------------- Creating a new private key requires two things: a source of random numbers (see :ref:`random_number_generators`) and some algorithm specific parameters that define the *security level* of the resulting key. For instance, the security level of an RSA key is (at least in part) defined by the length of the public key modulus in bits. So to create a new RSA private key, you would call .. cpp:function:: RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng, size_t bits) A constructor that creates a new random RSA private key with a modulus of length *bits*. Algorithms based on the discrete-logarithm problem uses what is called a *group*; a group can safely be used with many keys, and for some operations, like key agreement, the two keys *must* use the same group. There are currently two kinds of discrete logarithm groups supported in botan: the integers modulo a prime, represented by :ref:`dl_group`, and elliptic curves in GF(p), represented by :ref:`ec_group`. A rough generalization is that the larger the group is, the more secure the algorithm is, but coorespondingly the slower the operations will be. Given a ``DL_Group``, you can create new DSA, Diffie-Hellman, and Nyberg-Rueppel key pairs with .. cpp:function:: DSA_PrivateKey::DSA_PrivateKey(RandomNumberGenerator& rng, \ const DL_Group& group, const BigInt& x = 0) .. cpp:function:: DH_PrivateKey::DH_PrivateKey(RandomNumberGenerator& rng, \ const DL_Group& group, const BigInt& x = 0) .. cpp:function:: NR_PrivateKey::NR_PrivateKey(RandomNumberGenerator& rng, \ const DL_Group& group, const BigInt& x = 0) .. cpp:function:: ElGamal_PrivateKey::ElGamal_PrivateKey(RandomNumberGenerator& rng, \ const DL_Group& group, const BigInt& x = 0) The optional *x* parameter to each of these contructors is a private key value. This allows you to create keys where the private key is formed by some special technique; for instance you can use the hash of a password (see :ref:`pbkdf` for how to do that) as a private key value. Normally, you would leave the value as zero, letting the class generate a new random key. Finally, given an ``EC_Group`` object, you can create a new ECDSA, ECDH, or GOST 34.10-2001 private key with .. cpp:function:: ECDSA_PrivateKey::ECDSA_PrivateKey(RandomNumberGenerator& rng, \ const EC_Group& domain, const BigInt& x = 0) .. cpp:function:: ECDH_PrivateKey::ECDH_PrivateKey(RandomNumberGenerator& rng, \ const EC_Group& domain, const BigInt& x = 0) .. cpp:function:: GOST_3410_PrivateKey::GOST_3410_PrivateKey(RandomNumberGenerator& rng, \ const EC_Group& domain, const BigInt& x = 0) Generating RSA keys ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This example will generate an RSA key of a specified bitlength, and put it into a pair of key files. One is the public key in X.509 format (PEM encoded), the private key is in PKCS #8 format (also PEM encoded), either encrypted or unencrypted depending on if a password was given. .. literalinclude:: examples/rsa_kgen.cpp Generate DSA keys ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This example generates a 2048 bit DSA key .. literalinclude:: examples/dsa_kgen.cpp .. _serializing_private_keys: Serializing Private Keys Using PKCS #8 ---------------------------------------- The standard format for serializing a private key is PKCS #8, the operations for which are defined in ``pkcs8.h``. It supports both unencrypted and encrypted storage. .. cpp:function:: SecureVector PKCS8::BER_encode(const Private_Key& key, \ RandomNumberGenerator& rng, const std::string& password, const std::string& pbe_algo = "") Takes any private key object, serializes it, encrypts it using *password*, and returns a binary structure representing the private key. The final (optional) argument, *pbe_algo*, specifies a particular password based encryption (or PBE) algorithm. If you don't specify a PBE, a sensible default will be used. .. cpp:function:: std::string PKCS8::PEM_encode(const Private_Key& key, \ RandomNumberGenerator& rng, const std::string& pass, const std::string& pbe_algo = "") This formats the key in the same manner as ``BER_encode``, but additionally encodes it into a text format with identifying headers. Using PEM encoding is *highly* recommended for many reasons, including compatibility with other software, for transmission over 8-bit unclean channels, because it can be identified by a human without special tools, and because it sometimes allows more sane behavior of tools that process the data. Unencrypted serialization is also supported. .. warning:: In most situations, using unecrypted private key storage is a bad idea, because anyone can come along and grab the private key without having to know any passwords or other secrets. Unless you have very particular security requirements, always use the versions that encrypt the key based on a passphrase, described above. .. cpp:function:: SecureVector PKCS8::BER_encode(const Private_Key& key) Serializes the private key and returns the result. .. cpp:function:: std::string PKCS8::PEM_encode(const Private_Key& key) Serializes the private key, base64 encodes it, and returns the result. Last but not least, there are some functions that will load (and decrypt, if necessary) a PKCS #8 private key: .. cpp:function:: Private_Key* PKCS8::load_key(DataSource& in, \ RandomNumberGenerator& rng, const User_Interface& ui) .. cpp:function:: Private_Key* PKCS8::load_key(DataSource& in, \ RandomNumberGenerator& rng, std::string passphrase = "") .. cpp:function:: Private_Key* PKCS8::load_key(const std::string& filename, \ RandomNumberGenerator& rng, const User_Interface& ui) .. cpp:function:: Private_Key* PKCS8::load_key(const std::string& filename, \ RandomNumberGenerator& rng, const std::string& passphrase = "") These functions will return an object allocated key object based on the data from whatever source it is using (assuming, of course, the source is in fact storing a representation of a private key, and the decryption was sucessful). The encoding used (PEM or BER) need not be specified; the format will be detected automatically. The key is allocated with ``new``, and should be released with ``delete`` when you are done with it. The first takes a generic ``DataSource`` that you have to create - the other is a simple wrapper functions that take either a filename or a memory buffer and create the appropriate ``DataSource``. The versions taking a ``std::string`` attempt to decrypt using the password given (if the key is encrypted; if it is not, the passphase value will be ignored). If the passphrase does not decrypt the key, an exception will be thrown. The ones taking a ``User_Interface`` provide a simple callback interface which makes handling incorrect passphrases and such a bit simpler. A ``User_Interface`` has very little to do with talking to users; it's just a way to glue together Botan and whatever user interface you happen to be using. .. note:: In a future version, it is likely that ``User_Interface`` will be replaced by a simple callback using ``std::function``. To use ``User_Interface``, derive a subclass and implement: .. cpp:function:: std::string User_Interface::get_passphrase(const std::string& what, \ const std::string& source, UI_Result& result) const The ``what`` argument specifies what the passphrase is needed for (for example, PKCS #8 key loading passes ``what`` as "PKCS #8 private key"). This lets you provide the user with some indication of *why* your application is asking for a passphrase; feel free to pass the string through ``gettext(3)`` or moral equivalent for i18n purposes. Similarly, ``source`` specifies where the data in question came from, if available (for example, a file name). If the source is not available for whatever reason, then ``source`` will be an empty string; be sure to account for this possibility. The function returns the passphrase as the return value, and a status code in ``result`` (either ``OK`` or ``CANCEL_ACTION``). If ``CANCEL_ACTION`` is returned in ``result``, then the return value will be ignored, and the caller will take whatever action is necessary (typically, throwing an exception stating that the passphrase couldn't be determined). In the specific case of PKCS #8 key decryption, a ``Decoding_Error`` exception will be thrown; your UI should assume this can happen, and provide appropriate error handling (such as putting up a dialog box informing the user of the situation, and canceling the operation in progress). .. _serializing_public_keys: Serializing Public Keys ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To import and export public keys, use: .. cpp:function:: MemoryVector X509::BER_encode(const Public_Key& key) .. cpp:function:: std::string X509::PEM_encode(const Public_Key& key) .. cpp:function:: Public_Key* X509::load_key(DataSource& in) .. cpp:function:: Public_Key* X509::load_key(const SecureVector& buffer) .. cpp:function:: Public_Key* X509::load_key(const std::string& filename) These functions operate in the same way as the ones described in :ref:`serializing_private_keys`, except that no encryption option is availabe. .. _dl_group: DL_Group ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As described in :ref:`creating_new_private_keys`, a discrete logarithm group can be shared among many keys, even keys created by users who do not trust each other. However, it is necessary to trust the entity who created the group; that is why organization like NIST use algorithms which generate groups in a deterministic way such that creating a bogus group would require breaking some trusted cryptographic primitive like SHA-2. Instantiating a ``DL_Group`` simply requires calling .. cpp:function:: DL_Group::DL_Group(const std::string& name) The *name* parameter is a specially formatted string that consists of three things, the type of the group ("modp" or "dsa"), the creator of the group, and the size of the group in bits, all delimited by '/' characters. Currently all "modp" groups included in botan are ones defined by the Internet Engineering Task Force, so the provider is "ietf", and the strings look like "modp/ietf/N" where N can be any of 768, 1024, 1536, 2048, 3072, 4096, 6144, or 8192. This group type is used for Diffie-Hellman and ElGamal algorithms. The other type, "dsa" is used for DSA and Nyberg-Rueppel keys. They can also be used with Diffie-Hellman and ElGamal, but this is less common. The currently available groups are "dsa/jce/N" for N in 512, 768, or 1024, and "dsa/botan/N" with N being 2048 or 3072. The "jce" groups are the standard DSA groups used in the Java Cryptography Extensions, while the "botan" groups were randomly generated using the FIPS 186-3 algorithm by the library maintainers. You can generate a new random group using .. cpp:function:: DL_Group::DL_Group(RandomNumberGenerator& rng, \ PrimeType type, size_t pbits, size_t qbits = 0) The *type* can be either ``Strong``, ``Prime_Subgroup``, or ``DSA_Kosherizer``. *pbits* specifies the size of the prime in bits. If the *type* is ``Prime_Subgroup`` or ``DSA_Kosherizer``, then *qbits* specifies the size of the subgroup. You can serialize a ``DL_Group`` using .. cpp:function:: SecureVector DL_Group::DER_Encode(Format format) or .. cpp:function:: std::string DL_Group::PEM_encode(Format format) where *format* is any of * ``ANSI_X9_42`` (or ``DH_PARAMETERS``) for modp groups * ``ANSI_X9_57`` (or ``DSA_PARAMETERS``) for DSA-style groups * ``PKCS_3`` is an older format for modp groups; it should only be used for backwards compatability. You can reload a serialized group using .. cpp:function:: void DL_Group::BER_decode(DataSource& source, Format format) .. cpp:function:: void DL_Group::PEM_decode(DataSource& source) .. _ec_group: EC_Group ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ An ``EC_Group`` is initialized by passing the name of the group to be used to the constructor. These groups have semi-standardized names like "secp256r1" and "brainpool512r1". Key Checking --------------------------------- Most public key algorithms have limitations or restrictions on their parameters. For example RSA requires an odd exponent, and algorithms based on the discrete logarithm problem need a generator $> 1$. Each public key type has a function .. cpp:function:: bool Public_Key::check_key(RandomNumberGenerator& rng, bool strong) This function performs a number of algorithm-specific tests that the key seems to be mathematically valid and consistent, and returns true if all of the tests pass. It does not have anything to do with the validity of the key for any particular use, nor does it have anything to do with certificates that link a key (which, after all, is just some numbers) with a user or other entity. If *strong* is ``true``, then it does "strong" checking, which includes expensive operations like primality checking. Encryption --------------------------------- Safe public key encryption requires the use of a padding scheme which hides the underlying mathematical properties of the algorithm. Additionally, they will add randomness, so encrypting the same plaintext twice produces two different ciphertexts. The primary interface for encryption is .. cpp:class:: PK_Encryptor .. cpp:function:: SecureVector encrypt( \ const byte* in, size_t length, RandomNumberGenerator& rng) const .. cpp:function:: SecureVector encrypt( \ const MemoryRegion& in, RandomNumberGenerator& rng) const These encrypt a message, returning the ciphertext. .. cpp:function:: size_t maximum_input_size() const Returns the maximum size of the message that can be processed, in bytes. If you call :cpp:func:`PK_Encryptor::encrypt` with a value larger than this the operation will fail with an exception. :cpp:class:`PK_Encryptor` is only an interface - to actually encrypt you have to create an implementation, of which there are currently two available in the library, :cpp:class:`PK_Encryptor_EME` and :cpp:class:`DLIES_Encryptor`. DLIES is a standard method (from IEEE 1363) that uses a key agreement technique such as DH or ECDH to perform message encryption. Normally, public key encryption is done using algorithms which support it directly, such as RSA or ElGamal; these use the EME class: .. cpp:class:: PK_Encryptor_EME .. cpp:function:: PK_Encryptor_EME(const Public_Key& key, std::string eme) With *key* being the key you want to encrypt messages to. The padding method to use is specified in *eme*. The recommended values for *eme* is "EME1(SHA-1)" or "EME1(SHA-256)". If you need compatability with protocols using the PKCS #1 v1.5 standard, you can also use "EME-PKCS1-v1_5". .. cpp:class:: DLIES_Encryptor Available in the header ``dlies.h`` .. cpp:function:: DLIES_Encryptor(const PK_Key_Agreement_Key& key, \ KDF* kdf, MessageAuthenticationCode* mac, size_t mac_key_len = 20) Where *kdf* is a key derivation function (see :ref:`key_derivation_function`) and *mac* is a MessageAuthenticationCode. The decryption classes are named ``PK_Decryptor``, ``PK_Decryptor_EME``, and ``DLIES_Decryptor``. They are created in the exact same way, except they take the private key, and the processing function is named ``decrypt``. Signatures --------------------------------- Signature generation is performed using .. cpp:class:: PK_Signer .. cpp:function:: PK_Signer(const Private_Key& key, \ const std::string& emsa, \ Signature_Format format = IEEE_1363) Constructs a new signer object for the private key *key* using the signature format *emsa*. The key must support signature operations. In the current version of the library, this includes RSA, DSA, ECDSA, GOST 34.10-2001, Nyberg-Rueppel, and Rabin-Williams. Other signature schemes may be supported in the future. Currently available values for *emsa* include EMSA1, EMSA2, EMSA3, EMSA4, and Raw. All of them, except Raw, take a parameter naming a message digest function to hash the message with. The Raw encoding signs the input directly; if the message is too big, the signing operation will fail. Raw is not useful except in very specialized applications. Examples are "EMSA1(SHA-1)" and "EMSA4(SHA-256)". For RSA, use EMSA4 (also called PSS) unless you need compatability with software that uses the older PKCS #1 v1.5 standard, in which case use EMSA3 (also called "EMSA-PKCS1-v1_5"). For DSA, ECDSA, GOST 34.10-2001, and Nyberg-Rueppel, you should use EMSA1. The *format* defaults to ``IEEE_1363`` which is the only available format for RSA. For DSA and ECDSA, you can also use ``DER_SEQUENCE``, which will format the signature as an ASN.1 SEQUENCE value. .. cpp:function:: void update(const byte* in, size_t length) .. cpp:function:: void update(const MemoryRegion& in) .. cpp:function:: void update(byte in) These add more data to be included in the signature computation. Typically, the input will be provided directly to a hash function. .. cpp:function:: SecureVector signature(RandomNumberGenerator& rng) Creates the signature and returns it .. cpp:function:: SecureVector sign_message( \ const byte* in, size_t length, RandomNumberGenerator& rng) .. cpp:function:: SecureVector sign_message( \ const MemoryRegion& in, RandomNumberGenerator& rng) These functions are equivalent to calling :cpp:func:`PK_Signer::update` and then :cpp:func:`PK_Signer::signature`. Any data previously provided using ``update`` will be included. Signatures are verified using .. cpp:class:: PK_Verifier .. cpp:function:: PK_Verifier(const Public_Key& pub_key, \ const std::string& emsa, Signature_Format format = IEEE_1363) Construct a new verifier for signatures assicated with public key *pub_key*. The *emsa* and *format* should be the same as that used by the signer. .. cpp:function:: void update(const byte* in, size_t length) .. cpp:function:: void update(const MemoryRegion& in) .. cpp:function:: void update(byte in) Add further message data that is purportedly assocated with the signature that will be checked. .. cpp:function:: bool check_signature(const byte* sig, size_t length) .. cpp:function:: bool check_signature(const MemoryRegion& sig) Check to see if *sig* is a valid signature for the message data that was written in. Return true if so. This function clears the internal message state, so after this call you can call :cpp:func:`PK_Verifier::update` to start verifying another message. .. cpp:function:: bool verify_message(const byte* msg, size_t msg_length, \ const byte* sig, size_t sig_length) .. cpp:function:: bool verify_message(const MemoryRegion& msg, \ const MemoryRegion& sig) These are equivalent to calling :cpp:func:`PK_Verifier::update` on *msg* and then calling :cpp:func:`PK_Verifier::check_signature` on *sig*. Here is an example of DSA signature generation .. literalinclude:: examples/dsa_sign.cpp Here is an example that verifies DSA signatures .. literalinclude:: examples/dsa_ver.cpp Key Agreement --------------------------------- You can get a hold of a ``PK_Key_Agreement_Scheme`` object by calling ``get_pk_kas`` with a key that is of a type that supports key agreement (such as a Diffie-Hellman key stored in a ``DH_PrivateKey`` object), and the name of a key derivation function. This can be "Raw", meaning the output of the primitive itself is returned as the key, or "KDF1(hash)" or "KDF2(hash)" where "hash" is any string you happen to like (hopefully you like strings like "SHA-256" or "RIPEMD-160"), or "X9.42-PRF(keywrap)", which uses the PRF specified in ANSI X9.42. It takes the name or OID of the key wrap algorithm that will be used to encrypt a content encryption key. How key agreement works is that you trade public values with some other party, and then each of you runs a computation with the other's value and your key (this should return the same result to both parties). This computation can be called by using ``derive_key`` with either a byte array/length pair, or a ``SecureVector`` than holds the public value of the other party. The last argument to either call is a number that specifies how long a key you want. Depending on the KDF you're using, you *might not* get back a key of the size you requested. In particular "Raw" will return a number about the size of the Diffie-Hellman modulus, and KDF1 can only return a key that is the same size as the output of the hash. KDF2, on the other hand, will always give you a key exactly as long as you request, regardless of the underlying hash used with it. The key returned is a ``SymmetricKey``, ready to pass to a block cipher, MAC, or other symmetric algorithm. The public value that should be used can be obtained by calling ``public_data``, which exists for any key that is associated with a key agreement algorithm. It returns a ``SecureVector``. "KDF2(SHA-256)" is by far the preferred algorithm for key derivation in new applications. The X9.42 algorithm may be useful in some circumstances, but unless you need X9.42 compatibility, KDF2 is easier to use. An example of using Diffie-Hellman: .. literalinclude:: examples/dh.cpp Botan-1.10.12/doc/python.txt0000664000175000017500000000047112654331322015415 0ustar jackjack00000000000000 Python Binding ======================================== .. highlight:: python .. note:: The Python binding should be considered alpha software, and the interfaces may change in the future. Botan includes a binding for Python, implemented using Boost.Python. .. literalinclude:: examples/python/rsa.py Botan-1.10.12/doc/reading.txt0000664000175000017500000000151712654331322015507 0ustar jackjack00000000000000 Recommended Reading ======================================== It's a very good idea if you have some knowledge of cryptography *before* trying to use the library. This is an area where it is very easy to make mistakes, and where things are often subtle and/or counterintuitive. Obviously the library tries to provide things at a high level precisely to minimize the number of ways things can go wrong, but naive use will almost certainly not result in a secure system. Especially recommended are: - *Cryptography Engineering* Niels Ferguson, Bruce Schneier, and Tadayoshi Kohno - *Security Engineering -- A Guide to Building Dependable Distributed Systems* Ross Anderson - *Handbook of Applied Cryptography* Alfred J. Menezes, Paul C. Van Oorschot, and Scott A. Vanstone (`available online `_) Botan-1.10.12/doc/rng.txt0000664000175000017500000001362212654331322014664 0ustar jackjack00000000000000.. _random_number_generators: Random Number Generators ======================================== The random number generators provided in Botan are meant for creating keys, IVs, padding, nonces, and anything else that requires 'random' data. It is important to remember that the output of these classes will vary, even if they are supplied with the same seed (ie, two ``Randpool`` objects with similar initial states will not produce the same output, because the value of high resolution timers is added to the state at various points). To create a random number generator, instantiate a ``AutoSeeded_RNG`` object. This object will handle choosing the right algorithms from the set of enabled ones and doing seeding using OS specific routines. The main service a RandomNumberGenerator provides is, of course, random numbers: .. cpp:function:: byte RandomNumberGenerator::random() Generates a single random byte and returns it .. cpp:function:: void RandomNumberGenerator::randomize(byte* data, size_t length) Places *length* bytes into the array pointed to by *data* To ensure good quality output, a PRNG needs to be seeded with truly random data. Normally this is done for you. However it may happen that your application has access to data that is potentially unpredictable to an attacker. If so, use .. cpp:function:: void RandomNumberGenerator::add_entropy(const byte* data, \ size_t length) which incorporates the data into the current randomness state. Don't worry about filtering the data or doing any kind of cryptographic preprocessing (such as hashing); the RNG objects in botan are designed such that you can feed them any arbitrary non-random or even maliciously chosen data - as long as at some point some of the seed data was good the output will be secure. Implementation Notes ---------------------------------------- Randpool ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``Randpool`` is the primary PRNG within Botan. In recent versions all uses of it have been wrapped by an implementation of the X9.31 PRNG (see below). If for some reason you should have cause to create a PRNG instead of using the "global" one owned by the library, it would be wise to consider the same on the grounds of general caution; while ``Randpool`` is designed with known attacks and PRNG weaknesses in mind, it is not an standard/official PRNG. The remainder of this section is a (fairly technical, though high-level) description of the algorithms used in this PRNG. Unless you have a specific interest in this subject, the rest of this section might prove somewhat uninteresting. ``Randpool`` has an internal state called pool, which is 512 bytes long. This is where entropy is mixed into and extracted from. There is also a small output buffer (called buffer), which holds the data which has already been generated but has just not been output yet. It is based around a MAC and a block cipher (which are currently HMAC(SHA-256) and AES-256). Where a specific size is mentioned, it should be taken as a multiple of the cipher's block size. For example, if a 256-bit block cipher were used instead of AES, all the sizes internally would double. Every time some new output is needed, we compute the MAC of a counter and a high resolution timer. The resulting MAC is XORed into the output buffer (wrapping as needed), and the output buffer is then encrypted with AES, producing 16 bytes of output. After 8 blocks (or 128 bytes) have been produced, we mix the pool. To do this, we first rekey both the MAC and the cipher; the new MAC key is the MAC of the current pool under the old MAC key, while the new cipher key is the MAC of the current pool under the just-chosen MAC key. We then encrypt the entire pool in CBC mode, using the current (unused) output buffer as the IV. We then generate a new output buffer, using the mechanism described in the previous paragraph. To add randomness to the PRNG, we compute the MAC of the input and XOR the output into the start of the pool. Then we remix the pool and produce a new output buffer. The initial MAC operation should make it very hard for chosen inputs to harm the security of ``Randpool``, and as HMAC should be able to hold roughly 256 bits of state, it is unlikely that we are wasting much input entropy (or, if we are, it doesn't matter, because we have a very abundant supply). ANSI X9.31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``ANSI_X931_PRNG`` is the standard issue X9.31 Appendix A.2.4 PRNG, though using AES-256 instead of 3DES as the block cipher. This PRNG implementation has been checked against official X9.31 test vectors. Internally, the PRNG holds a pointer to another PRNG (typically Randpool). This internal PRNG generates the key and seed used by the X9.31 algorithm, as well as the date/time vectors. Each time an X9.31 PRNG object receives entropy, it passes it along to the PRNG it is holding, and then pulls out some random bits to generate a new key and seed. This PRNG considers itself seeded as soon as the internal PRNG is seeded. Entropy Sources --------------------------------- An ``EntropySource`` is an abstract representation of some method of gather "real" entropy. This tends to be very system dependent. The *only* way you should use an ``EntropySource`` is to pass it to a PRNG that will extract entropy from it -- never use the output directly for any kind of key or nonce generation! ``EntropySource`` has a pair of functions for getting entropy from some external source, called ``fast_poll`` and ``slow_poll``. These pass a buffer of bytes to be written; the functions then return how many bytes of entropy were gathered. Note for writers of ``EntropySource`` subclasses: it isn't necessary to use any kind of cryptographic hash on your output. The data produced by an EntropySource is only used by an application after it has been hashed by the ``RandomNumberGenerator`` that asked for the entropy, thus any hashing you do will be wasteful of both CPU cycles and entropy. Botan-1.10.12/doc/secmem.txt0000664000175000017500000001021312654331322015340 0ustar jackjack00000000000000 Secure Memory Containers ======================================== A major concern with mixing modern multiuser OSes and cryptographic code is that at any time the code (including secret keys) could be swapped to disk, where it can later be read by an attacker. Botan stores almost everything (and especially anything sensitive) in memory buffers that a) clear out their contents when their destructors are called, and b) have easy plugins for various memory locking functions, such as the ``mlock`` call on many Unix systems. Two of the allocation method used ("malloc" and "mmap") don't require any extra privileges on Unix, but locking memory does. At startup, each allocator type will attempt to allocate a few blocks (typically totaling 128k), so if you want, you can run your application ``setuid`` ``root``, and then drop privileges immediately after creating your ``LibraryInitializer``. If you end up using more than what's been allocated, some of your sensitive data might end up being swappable, but that beats running as ``root`` all the time. These classes should also be used within your own code for storing sensitive data. They are only meant for primitive data types (int, long, etc): if you want a container of higher level Botan objects, you can just use a ``std::vector``, since these objects know how to clear themselves when they are destroyed. You cannot, however, have a ``std::vector`` (or any other container) of ``Pipe`` objects or filters, because these types have pointers to other filters, and implementing copy constructors for these types would be both hard and quite expensive (vectors of pointers to such objects is fine, though). These types are not described in any great detail: for more information, consult the definitive sources~--~the header files ``secmem.h`` and ``allocate.h``. ``SecureBuffer`` is a simple array type, whose size is specified at compile time. It will automatically convert to a pointer of the appropriate type, and has a number of useful functions, including ``clear()``, and ``size_t`` ``size()``, which returns the length of the array. It is a template that takes as parameters a type, and a constant integer which is how long the array is (for example: ``SecureBuffer key;``). ``SecureVector`` is a variable length array. Its size can be increased or decreased as need be, and it has a wide variety of functions useful for copying data into its buffer. Like ``SecureBuffer``, it implements ``clear`` and ``size``. Allocators ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The containers described above get their memory from allocators. As a user of the library, you can add new allocator methods at run time for containers, including the ones used internally by the library, to use. The interface to this is in ``allocate.h``. Code needing to allocate or deallocate memory calls ``get_allocator``, which returns a pointer to an allocator object. This pointer should not be freed: the caller does not own the allocator (it is shared among multiple allocatore users, and uses a mutex to serialize access internally if necessary). It is possible to call ``get_allocator`` with a specific name to request a particular type of allocator, otherwise, a default allocator type is returned. At start time, the only allocator known is a ``Default_Allocator``, which just allocates memory using ``malloc``, and zeroizes it when the memory is released. It is known by the name "malloc". If you ask for another type of allocator ("locking" and "mmap" are currently used), and it is not available, some other allocator will be returned. You can add in a new allocator type using ``add_allocator_type``. This function takes a string and a pointer to an allocator. The string gives this allocator type a name to which it can be referred when one is requesting it with ``get_allocator``. If an error occurs (such as the name being already registered), this function returns false. It will return true if the allocator was successfully registered. If you ask it to, ``LibraryInitializer`` will do this for you. Finally, you can set the default allocator type that will be returned using the policy setting "default_alloc" to the name of any previously registered allocator. Botan-1.10.12/doc/ssl.txt0000664000175000017500000000306312654331322014675 0ustar jackjack00000000000000 .. _ssl_api: SSL and TLS ======================================== .. versionadded:: 1.9.4 Botan supports both client and server implementations of the SSL/TLS protocols, including SSL v3, TLS v1.0, and TLS v1.1. The insecure and obsolete SSL v2 is not supported. The implementation uses ``std::tr1::function``, so it may not have been compiled into the version you are using; you can test for the feature macro ``BOTAN_HAS_SSL_TLS`` to check. TLS Clients ---------------------------------------- .. cpp:class:: TLS_Client .. cpp:function:: TLS_Client( \ std::tr1::function input_fn, \ std::tr1::function output_fn, \ const TLS_Policy& policy, RandomNumberGenerator& rng) Creates a TLS client. It will call *input_fn* to read bytes from the network and call *output_fn* when bytes need to be written to the network. .. cpp:function:: size_t read(byte* buf, size_t buf_len) Reads up to *buf_len* bytes from the open connection into *buf*, returning the number of bytes actually written. .. cpp:function:: void write(const byte* buf, size_t buf_len) Writes *buf_len* bytes in *buf* to the remote side .. cpp:function:: void close() Closes the connection .. cpp:function:: std::vector peer_cert_chain() Returns the certificate chain of the server A simple TLS client example: .. literalinclude:: examples/tls_client.cpp TLS Servers ---------------------------------------- A simple TLS server .. literalinclude:: examples/tls_server.cpp Botan-1.10.12/doc/support.txt0000664000175000017500000000154612654331322015614 0ustar jackjack00000000000000 Commercial Support Options ======================================== Commercial support is currently available for Botan from a couple of sources. If you provide services related to Botan, email the development list and your information can be added here. * `FlexSecure GmbH `_ offers support for both Botan and `InSiTo `_ libraries. Developers from FlexSecure have done extensive work with Botan in the past, and many new features to Botan have been implemented and contributed by them. More information at http://www.flexsecure.eu/insito/support.html * `Jack Lloyd `_ can provide services relating to Botan including performance analysis of application code using Botan, review of cryptographic use and designs for security flaws, and implementing new features. Botan-1.10.12/doc/users.txt0000664000175000017500000001041312654331322015232 0ustar jackjack00000000000000 Known Users ======================================== This is a list of some of the known users of botan. If you'd like to be added to the list, email the development list. Open Source Software ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * `SoftHSM `_ an open sourced software PKCS #11 implementation, which is used as part of the `OpenDNSSEC `_ project. * `Qt Creator `_, an IDE for building Qt applications. * `NetSieben's `_ SSH library provides SSHv2 client connections for C++ applications, using botan for the crypto. (GPL or commercial) * `InSiTo `_ is a library for ePassports based on botan which was commissioned by the German Federal Office for Information Security. * `QCA `_, the Qt Cryptographic Architecture (part of KDE4) uses parts of botan as an `embedded crypto provider `_. * `TCHead `_ is a utility for analyzing TrueCrypt volume headers. * `Octopod `_ is a file sharing system. * `Silverlock `_ is a GPL password management tool for Windows, OS X, and Linux.

* `Monotone `_, a free distributed version control system, uses botan for RSA authentication, content hashing, and message authentication. * `Publimark `_ is a tool for hiding messages in an audio file. * `KeySafe `_, a password application for GNOME * `SuSE `_ uses botan as part of a test suite for the GCC optimizer. * `Openbench `_, an open source benchmark suite, uses botan as a component. * `VNCcrack `_ is a password cracker for the VNC authentication/response protocol. Commercial Software ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * `Hulu Desktop `_ uses botan on Windows `(ref) `_. * `Hitman Pro `_ is a malware scanner for Windows. * `Flying Lab Software `_, a Seattle based game developer, uses botan as a part of their user authentication process. * `CryptoTE `_ is a text editor with integrated strong cryptography. * `TextEgg `_ is an encrypted document editor. * `Seagate `_ uses botan for the drive encryption in the Maxtor OneTouch III Mini Edition hard drive. * `Aegeus Technology Ltd `_ used botan in a research implementation of SPKI. * `E.V.E. Paradox `_, a suite of games for Windows. Research Projects ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * `A Unified Approach to Intra-Domain Security `_ describes a system by researches from Oak Ridge National Lab and Indiana University that uses botan to secure ARP and DHCP. * `CLL: A Cryptographic Link Layer for Local Area Networks `_ describes a network encryption system using botan. (One of the coauthors, Yves Jerschow, also contributed a number of optimizations to the library). * The system described in `Enabling Intrusion Detection in IPsec Protected IPv6 Networks Through Secret-key Sharing `_ * `An experimental tamper detection system `_ designed by researchers from the University of Delaware and the US Army Research Laboratory. * A prototype implementation of a telephony signal security system, described in `Prototyping and evaluation of TCAPsec `_ by Kang Chung and Mathilda Gustafsson. Botan-1.10.12/doc/x509.txt0000664000175000017500000006151312654331322014605 0ustar jackjack00000000000000 .. _x509_certificates: Certificate Handling ================================= A certificate is a binding between some identifying information (called a *subject*) and a public key. This binding is asserted by a signature on the certificate, which is placed there by some authority (the *issuer*) that at least claims that it knows the subject named in the certificate really "owns" the private key corresponding to the public key in the certificate. The major certificate format in use today is X.509v3, designed by ISO and further hacked on by dozens (hundreds?) of other organizations. When working with certificates, the main class to remember is ``X509_Certificate``. You can read an object of this type, but you can't create one on the fly; a CA object is necessary for making a new certificate. So for the most part, you only have to worry about reading them in, verifying the signatures, and getting the bits of data in them (most commonly the public key, and the information about the user of that key). An X.509v3 certificate can contain a literally infinite number of items related to all kinds of things. Botan doesn't support a lot of them, because nobody uses them and they're an impossible mess to work with. This section only documents the most commonly used ones of the ones that are supported; for the rest, read ``x509cert.h`` and ``asn1_obj.h`` (which has the definitions of various common ASN.1 constructs used in X.509). So what's in an X.509 certificate? ----------------------------------- Obviously, you want to be able to get the public key. This is achieved by calling the member function ``subject_public_key``, which will return a ``Public_Key``\*. As to what to do with this, read about ``load_key`` in :ref:`serializing_public_keys`. In the general case, this could be any kind of public key, though 99% of the time it will be an RSA key. However, Diffie-Hellman, DSA, and ECDSA keys are also supported, so be careful about how you treat this. It is also a wise idea to examine the value returned by ``constraints``, to see what uses the public key is approved for. The second major piece of information you'll want is the name/email/etc of the person to whom this certificate is assigned. Here is where things get a little nasty. X.509v3 has two (well, mostly just two...) different places where you can stick information about the user: the *subject* field, and in an extension called *subjectAlternativeName*. The *subject* field is supposed to only included the following information: country, organization, an organizational sub-unit name, and a so-called common name. The common name is usually the name of the person, or it could be a title associated with a position of some sort in the organization. It may also include fields for state/province and locality. What a locality is, nobody knows, but it's usually given as a city name. Botan doesn't currently support any of the Unicode variants used in ASN.1 (UTF-8, UCS-2, and UCS-4), any of which could be used for the fields in the DN. This could be problematic, particularly in Asia and other areas where non-ASCII characters are needed for most names. The UTF-8 and UCS-2 string types *are* accepted (in fact, UTF-8 is used when encoding much of the time), but if any of the characters included in the string are not in ISO 8859-1 (ie 0 ... 255), an exception will get thrown. Currently the ``ASN1_String`` type holds its data as ISO 8859-1 internally (regardless of local character set); this would have to be changed to hold UCS-2 or UCS-4 in order to support Unicode (also, many interfaces in the X.509 code would have to accept or return a ``std::wstring`` instead of a ``std::string``). Like the distinguished names, subject alternative names can contain a lot of things that Botan will flat out ignore (most of which you would likely never want to use). However, there are three very useful pieces of information that this extension might hold: an email address (mailbox@example.com), a DNS name (somehost.example.com), or a URI (http://www.example.com). So, how to get the information? Call ``subject_info`` with the name of the piece of information you want, and it will return a ``std::string`` that is either empty (signifying that the certificate doesn't have this information), or has the information requested. There are several names for each possible item, but the most easily readable ones are: "Name", "Country", "Organization", "Organizational Unit", "Locality", "State", "RFC822", "URI", and "DNS". These values are returned as a ``std::string``. You can also get information about the issuer of the certificate in the same way, using ``issuer_info``. X.509v3 Extensions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ X.509v3 specifies a large number of possible extensions. Botan supports some, but by no means all of them. This section lists which ones are supported, and notes areas where there may be problems with the handling. - Key Usage and Extended Key Usage: No problems known. - Basic Constraints: No problems known. The default for a v1/v2 certificate is assume it's a CA if and only if the option "x509/default_to_ca" is set. A v3 certificate is marked as a CA if (and only if) the basic constraints extension is present and set for a CA cert. - Subject Alternative Names: Only the "rfc822Name", "dNSName", and "uniformResourceIdentifier" fields will be stored; all others are ignored. - Issuer Alternative Names: Same restrictions as the Subject Alternative Names extension. New certificates generated by Botan never include the issuer alternative name. - Authority Key Identifier: Only the version using KeyIdentifier is supported. If the GeneralNames version is used and the extension is critical, an exception is thrown. If both the KeyIdentifier and GeneralNames versions are present, then the KeyIdentifier will be used, and the GeneralNames ignored. - Subject Key Identifier: No problems known. Revocation Lists ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It will occasionally happen that a certificate must be revoked before its expiration date. Examples of this happening include the private key being compromised, or the user to which it has been assigned leaving an organization. Certificate revocation lists are an answer to this problem (though online certificate validation techniques are starting to become somewhat more popular). Every once in a while the CA will release a new CRL, listing all certificates that have been revoked. Also included is various pieces of information like what time a particular certificate was revoked, and for what reason. In most systems, it is wise to support some form of certificate revocation, and CRLs handle this easily. For most users, processing a CRL is quite easy. All you have to do is call the constructor, which will take a filename (or a ``DataSource&``). The CRLs can either be in raw BER/DER, or in PEM format; the constructor will figure out which format without any extra information. For example:: X509_CRL crl1("crl1.der"); DataSource_Stream in("crl2.pem"); X509_CRL crl2(in); After that, pass the ``X509_CRL`` object to a ``X509_Store`` object with .. cpp:function:: X509_Code X509_Store::add_crl(const X509_CRL& crl) and all future verifications will take into account the certificates listed, assuming ``add_crl`` returns ``VERIFIED``. If it doesn't return ``VERIFIED``, then the return value is an error code signifying that the CRL could not be processed due to some problem (which could be something like the issuing certificate could not being found, an invalid signature, or the CRL having some format problem). For more about the ``X509_Store`` API, read :ref:`x509_store`. Reading Certificates --------------------------------- ``X509_Certificate`` has two constructors, each of which takes a source of data; a filename to read, and a ``DataSource&``:: X509_Certificate cert1("cert1.pem"); /* This file contains two certificates, concatenated */ DataSource_Stream in("certs2_and_3.pem"); X509_Certificate cert2(in); // read the first cert X509_Certificate cert3(in); // read the second cert .. _x509_store: Storing and Using Certificates --------------------------------- If you read a certificate, you probably want to verify the signature on it. However, consider that to do so, we may have to verify the signature on the certificate that we used to verify the first certificate, and on and on until we hit the top of the certificate tree somewhere. It would be a might huge pain to have to handle all of that manually in every application, so there is something that does it for you: ``X509_Store``. The basic operations are: put certificates and CRLs into it, search for certificates, and attempt to verify certificates. That's about it. In the future, there will be support for online retrieval of certificates and CRLs (eg with the HTTP cert-store interface currently under consideration by PKIX). Adding Certificates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can add new certificates to a certificate store using any of these functions: .. cpp:function:: void X509_Store::add_cert(const X509_Certificate& cert, \ bool trusted = false) .. cpp:function:: void X509_Store::add_cert(DataSource& source) .. cpp:function:: void X509_Store::add_trusted_certs(DataSource& source) The versions that take a ``DataSource&`` will add all the certificates that it can find in that source. All of them add the cert(s) to the store. The "trusted" certificates are the ones that you are willing to trust for certification purposes. For example, say your application is working with certificates that are owned by employees of some company, and all of their certificates are signed by the company CA, whose certificate is in turned signed by a commercial root CA. What you would then do is include the certificate of the commercial CA with your application, and read it in as a trusted certificate. From there, you could verify the company CA's certificate, and then use that to verify the end user's certificates. Only self-signed certificates may be considered trusted. Adding CRLs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. cpp:function:: X509_Code X509_Store::add_crl(const X509_CRL& crl) This will process the CRL and mark the revoked certificates. This will also work if a revoked certificate is added to the store sometime after the CRL is processed. The function can return an error code (listed later), or will return ``VERIFIED`` if everything completed successfully. Storing Certificates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can output a set of certificates by calling ``PEM_encode``, which will return a ``std::string`` containing each of the certificates in the store, PEM encoded and concatenated. This simple format can easily be read by both Botan and other libraries/applications. Certificate Stores ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ An object of type ``Certificate_Store`` is a generalized interface to an external source for certificates (and CRLs). Examples of such a store would be one that looked up the certificates in a SQL database, or by contacting a CGI script running on a HTTP server. There are currently three mechanisms for looking up a certificate, and one for retrieving CRLs. By default, most of these mechanisms will return an empty ``std::vector`` of ``X509_Certificate``. This storage mechanism is *only* queried when doing certificate validation: it allows you to distribute only the root key with an application, and let some online method handle getting all the other certificates that are needed to validate an end entity certificate. In particular, the search routines will not attempt to access the external database. The three certificate lookup methods are ``by_SKID`` (Subject Key Identifier), ``by_name`` (the CommonName DN entry), and ``by_email`` (stored in either the distinguished name, or in a subjectAlternativeName extension). The name and email versions take a ``std::string``, while the SKID version takes a ``SecureVector`` containing the subject key identifier in raw binary. You can choose not to implement ``by_name`` or ``by_email``, but ``by_SKID`` is mandatory to implement, and, currently, is the only version that is used by ``X509_Store``. Finally, there is a method for finding CRLs, called ``get_crls_for``, that takes an ``X509_Certificate`` object, and returns a ``std::vector`` of ``X509_CRL``. While normally there will be only one CRL, the use of the vector makes it easy to return no CRLs (eg, if the certificate store doesn't support retrieving them), or return multiple ones (for example, if the certificate store can't determine precisely which key was used to sign the certificate). Implementing the function is optional, and by default will return no CRLs. If it is available, it will be used by ``X509_CRL``. As for using such a store, you have to tell ``X509_Store`` about it with .. cpp:function:: void X509_Store::add_new_certstore(Certificate_Store* new_store) The store object will be owned by (and deleted by) ``X509_Store``, so make sure to allocate it with ``new``. Verifying Certificates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Verifying a certificate requires that we build up a chain of trust, starting from the root (usually a commercial CA), down through some number of intermediate CAs, and finally reaching the actual certificate in question. Thus, to verify, we actually have to have all those certificates on hand (or at the very least, know where we can get the ones we need). The class which handles both storing certificates, and verifying them, is .. cpp:class:: X509_Store .. cpp:type:: Cert_Usage Can be any of: * ``ANY`` (any usage is OK) * ``CRL_SIGNING`` * ``TLS_SERVER`` (for SSL/TLS server authentication) * ``TLS_CLIENT`` (for SSL/TLS client authentication) * ``CODE_SIGNING`` * ``EMAIL_PROTECTION`` (usually this means S/MIME) * ``TIME_STAMPING`` (in theory any time stamp application, usually IETF PKIX's Time Stamp Protocol) .. cpp:function:: X509_Code validate_cert(const X509_Certificate& cert, \ Cert_Usage usage = ANY) Return ``VERIFIED`` if the certificate can safely be considered valid for the usage(s) described by *usage*, and an error code if it is not. First, how does :cpp:class`X509_Store::validate_cert` know if a certificate is valid? A certificate is valid if both of the following hold: a) the signature in the certificate can be verified using the public key in the issuer's certificate, and b) the issuer's certificate is a valid CA certificate. Note that this definition is recursive. We get out of this by "bottoming out" when we reach a certificate that we consider trusted. In general this will either be a commercial root CA, or an organization or application specific CA. There are a few other restrictions (validity periods, key usage restrictions, etc), but the above summarizes the major points of the validation algorithm. In theory, Botan implements the certificate path validation algorithm given in RFC 2459, but in practice it does not (yet), because we don't support the X.509v3 policy or name constraint extensions. The default ``ANY`` does not mean valid for any use, it means "is valid for some usage". This is usually what you want; requiring that a random certificate support a particular usage will likely result in a lot of failures, unless your application is very careful to always issue certificates with the proper extensions, and you never use certificates generated by other apps. Return values for ``validate_cert`` (and ``add_crl``) include: * VERIFIED: The certificate is valid for the specified use. * INVALID_USAGE: The certificate cannot be used for the specified use. * CANNOT_ESTABLISH_TRUST: The root certificate was not marked as trusted. * CERT_CHAIN_TOO_LONG: The certificate chain exceeded the length allowed by a basicConstraints extension. * SIGNATURE_ERROR: An invalid signature was found * POLICY_ERROR: Some problem with the certificate policies was found. * CERT_FORMAT_ERROR: Some format problem was found in a certificate. * CERT_ISSUER_NOT_FOUND: The issuer of a certificate could not be found. * CERT_NOT_YET_VALID: The certificate is not yet valid. * CERT_HAS_EXPIRED: The certificate has expired. * CERT_IS_REVOKED: The certificate has been revoked. * CRL_FORMAT_ERROR: Some format problem was found in a CRL. * CRL_ISSUER_NOT_FOUND: The issuer of a CRL could not be found. * CRL_NOT_YET_VALID: The CRL is not yet valid. * CRL_HAS_EXPIRED: The CRL has expired. * CA_CERT_CANNOT_SIGN: The CA certificate found does not have an contain a public key that allows signature verification. * CA_CERT_NOT_FOR_CERT_ISSUER: The CA cert found is not allowed to issue certificates. * CA_CERT_NOT_FOR_CRL_ISSUER: The CA cert found is not allowed to issue CRLs. * UNKNOWN_X509_ERROR: Some other error occurred. Certificate Authorities --------------------------------- Setting up a CA for X.509 certificates is perhaps the easiest thing to do related to X.509. A CA is represented by the type ``X509_CA``, which can be found in ``x509_ca.h``. A CA always needs its own certificate, which can either be a self-signed certificate (see below on how to create one) or one issued by another CA (see the section on PKCS #10 requests). Creating a CA object is done by the following constructor: .. cpp:function:: X509_CA::X509_CA(const X509_Certificate& cert, \ const Private_Key& key) The private key is the private key corresponding to the public key in the CA's certificate. Requests for new certificates are supplied to a CA in the form on PKCS #10 certificate requests (called a ``PKCS10_Request`` object in Botan). These are decoded in a similar manner to certificates/CRLs/etc. A request is vetted by humans (who somehow verify that the name in the request corresponds to the name of the entity who requested it), and then signed by a CA key, generating a new certificate: .. cpp:function:: X509_Certificate \ X509_CA::sign_request(const PKCS10_Request& req) const Here's an example: .. literalinclude examples/ca.cpp Generating CRLs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As mentioned previously, the ability to process CRLs is highly important in many PKI systems. In fact, according to strict X.509 rules, you must not validate any certificate if the appropriate CRLs are not available (though hardly any systems are that strict). In any case, a CA should have a valid CRL available at all times. Of course, you might be wondering what to do if no certificates have been revoked. Never fear; empty CRLs, which revoke nothing at all, can be issued. To generate a new, empty CRL, just call .. cpp:function:: X509_CRL X509_CA::new_crl(u32bit seconds_to_expiration = 0) This function will return a new, empty CRL. The ``seconds_to_expiration`` parameter is the number of seconds before the CRL expires. If it is set to the (default) value of zero, then a reasonable default (currently 7 days) will be used. On the other hand, you may have issued a CRL before. In that case, you will want to issue a new CRL that contains all previously revoked certificates, along with any new ones. This is done by calling .. cpp:function:: X509_CRL X509_CA::update_crl(const X509_CRL& old_crl, \ std::vector new_revoked, size_t seconds_to_expiration = 0) Where ``X509_CRL`` is the last CRL this CA issued, and ``new_revoked`` is a list of any newly revoked certificates. The function returns a new ``X509_CRL`` to make available for clients. The ``CRL_Entry`` type is a structure that contains, at a minimum, the serial number of the revoked certificate. As serial numbers are never repeated, the pairing of an issuer and a serial number (should) distinctly identify any certificate. In this case, we represent the serial number as a ``SecureVector`` called ``serial``. There are two additional (optional) values, an enumeration called ``CRL_Code`` that specifies the reason for revocation (``reason``), and an object that represents the time that the certificate became invalid (if this information is known). If you wish to remove an old entry from the CRL, insert a new entry for the same cert, with a ``reason`` code of ``DELETE_CRL_ENTRY``. For example, if a revoked certificate has expired 'normally', there is no reason to continue to explicitly revoke it, since clients will reject the cert as expired in any case. Self-Signed Certificates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Generating a new self-signed certificate can often be useful, for example when setting up a new root CA, or for use in email applications. The library provides a utility function for this: .. cpp:function:: X509_Certificate create_self_signed_cert( \ const X509_Cert_Options& opts, const Private_Key& key) Where *key* is the private key you wish to use (the public key, used in the certificate itself, is extracted from the private key), and *opts* is an structure that has various bits of information that will be used in creating the certificate (this structure, and its use, is discussed below). An example: .. literalinclude:: examples/self_sig.cpp Creating PKCS #10 Requests ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Also in ``x509self.h``, there is a function for generating new PKCS #10 certificate requests: .. cpp:function:: PKCS10_Request create_cert_req( \ const X509_Cert_Options& opts, const Private_Key& key) This function acts quite similarly to :cpp:func:`create_self_signed_cert`, except it instead returns a PKCS #10 certificate request. After creating it, one would typically transmit it to a CA, who signs it and returns a freshly minted X.509 certificate. An example: .. literalinclude:: examples/pkcs10.cpp Certificate Options ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ What is this ``X509_Cert_Options`` thing we've been passing around? It's a class representing a bunch of information that will end up being stored into the certificate. This information comes in 3 major flavors: information about the subject (CA or end-user), the validity period of the certificate, and restrictions on the usage of the certificate. First and foremost is a number of ``std::string`` members, which contains various bits of information about the user: ``common_name``, ``serial_number``, ``country``, ``organization``, ``org_unit``, ``locality``, ``state``, ``email``, ``dns_name``, and ``uri``. As many of these as possible should be filled it (especially an email address), though the only required ones are ``common_name`` and ``country``. There is another value that is only useful when creating a PKCS #10 request, which is called ``challenge``. This is a challenge password, which you can later use to request certificate revocation (*if* the CA supports doing revocations in this manner). Then there is the validity period; these are set with ``not_before`` and ``not_after``. Both of these functions also take a ``std::string``, which specifies when the certificate should start being valid, and when it should stop being valid. If you don't set the starting validity period, it will automatically choose the current time. If you don't set the ending time, it will choose the starting time plus a default time period. The arguments to these functions specify the time in the following format: "2002/11/27 1:50:14". The time is in 24-hour format, and the date is encoded as year/month/day. The date must be specified, but you can omit the time or trailing parts of it, for example "2002/11/27 1:50" or "2002/11/27". Lastly, you can set constraints on a key. The one you're mostly likely to want to use is to create (or request) a CA certificate, which can be done by calling the member function ``CA_key``. This should only be used when needed. Other constraints can be set by calling the member functions ``add_constraints`` and ``add_ex_constraints``. The first takes a ``Key_Constraints`` value, and replaces any previously set value. If no value is set, then the certificate key is marked as being valid for any usage. You can set it to any of the following (for more than one usage, OR them together): ``DIGITAL_SIGNATURE``, ``NON_REPUDIATION``, ``KEY_ENCIPHERMENT``, ``DATA_ENCIPHERMENT``, ``KEY_AGREEMENT``, ``KEY_CERT_SIGN``, ``CRL_SIGN``, ``ENCIPHER_ONLY``, ``DECIPHER_ONLY``. Many of these have quite special semantics, so you should either consult the appropriate standards document (such as RFC 3280), or just not call ``add_constraints``, in which case the appropriate values will be chosen for you. The second function, ``add_ex_constraints``, allows you to specify an OID that has some meaning with regards to restricting the key to particular usages. You can, if you wish, specify any OID you like, but there is a set of standard ones that other applications will be able to understand. These are the ones specified by the PKIX standard, and are named "PKIX.ServerAuth" (for TLS server authentication), "PKIX.ClientAuth" (for TLS client authentication), "PKIX.CodeSigning", "PKIX.EmailProtection" (most likely for use with S/MIME), "PKIX.IPsecUser", "PKIX.IPsecTunnel", "PKIX.IPsecEndSystem", and "PKIX.TimeStamping". You can call "add_ex_constraints" any number of times - each new OID will be added to the list to include in the certificate. Botan-1.10.12/readme.txt0000664000175000017500000000106112654331322014560 0ustar jackjack00000000000000 Botan is a C++ library for performing a wide variety of cryptographic operations. It is released under the 2 clause BSD license; see doc/license.rst for the specifics. You can file bugs in Bugzilla (http://bugs.randombit.net/) or by sending a report to the botan-devel mailing list. More information about the mailing list is at http://lists.randombit.net/mailman/listinfo/botan-devel/ You can find documentation online at http://botan.randombit.net/ as well as in the doc directory in the distribution. Several examples can be found in doc/examples as well. Botan-1.10.12/src/algo_base/algo_base.h0000664000175000017500000000130112654331322017347 0ustar jackjack00000000000000/* * Algorithm Base Class * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ALGO_BASE_CLASS_H__ #define BOTAN_ALGO_BASE_CLASS_H__ #include #include namespace Botan { /** * This class represents an algorithm of some kind */ class BOTAN_DLL Algorithm { public: /** * Zeroize internal state */ virtual void clear() = 0; /** * @return name of this algorithm */ virtual std::string name() const = 0; Algorithm() {} virtual ~Algorithm() {} private: Algorithm(const Algorithm&) {} Algorithm& operator=(const Algorithm&) { return (*this); } }; } #endif Botan-1.10.12/src/algo_base/buf_comp.h0000664000175000017500000000756612654331322017250 0ustar jackjack00000000000000/* * Buffered Computation * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BUFFERED_COMPUTATION_H__ #define BOTAN_BUFFERED_COMPUTATION_H__ #include #include namespace Botan { /** * This class represents any kind of computation which uses an internal * state, such as hash functions or MACs */ class BOTAN_DLL Buffered_Computation { public: /** * @return length of the output of this function in bytes */ virtual size_t output_length() const = 0; /** * Add new input to process. * @param in the input to process as a byte array * @param length of param in in bytes */ void update(const byte in[], size_t length) { add_data(in, length); } /** * Add new input to process. * @param in the input to process as a MemoryRegion */ void update(const MemoryRegion& in) { add_data(&in[0], in.size()); } /** * Add an integer in big-endian order * @param in the value */ template void update_be(const T in) { for(size_t i = 0; i != sizeof(T); ++i) { byte b = get_byte(i, in); add_data(&b, 1); } } /** * Add new input to process. * @param str the input to process as a std::string. Will be interpreted * as a byte array based on * the strings encoding. */ void update(const std::string& str) { add_data(reinterpret_cast(str.data()), str.size()); } /** * Process a single byte. * @param in the byte to process */ void update(byte in) { add_data(&in, 1); } /** * Complete the computation and retrieve the * final result. * @param out The byte array to be filled with the result. * Must be of length output_length() */ void final(byte out[]) { final_result(out); } /** * Complete the computation and retrieve the * final result. * @return SecureVector holding the result */ SecureVector final() { SecureVector output(output_length()); final_result(&output[0]); return output; } /** * Update and finalize computation. Does the same as calling update() * and final() consecutively. * @param in the input to process as a byte array * @param length the length of the byte array * @result the result of the call to final() */ SecureVector process(const byte in[], size_t length) { add_data(in, length); return final(); } /** * Update and finalize computation. Does the same as calling update() * and final() consecutively. * @param in the input to process * @result the result of the call to final() */ SecureVector process(const MemoryRegion& in) { add_data(&in[0], in.size()); return final(); } /** * Update and finalize computation. Does the same as calling update() * and final() consecutively. * @param in the input to process as a string * @result the result of the call to final() */ SecureVector process(const std::string& in) { update(in); return final(); } virtual ~Buffered_Computation() {} private: /** * Add more data to the computation * @param input is an input buffer * @param length is the length of input in bytes */ virtual void add_data(const byte input[], size_t length) = 0; /** * Write the final output to out * @param out is an output buffer of output_length() */ virtual void final_result(byte out[]) = 0; }; } #endif Botan-1.10.12/src/algo_base/info.txt0000664000175000017500000000005512654331322016763 0ustar jackjack00000000000000 alloc filters hex rng Botan-1.10.12/src/algo_base/key_spec.h0000664000175000017500000000373212654331322017247 0ustar jackjack00000000000000/* * Symmetric Key Length Specification * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_KEY_LEN_SPECIFICATION_H__ #define BOTAN_KEY_LEN_SPECIFICATION_H__ #include namespace Botan { /** * Represents the length requirements on an algorithm key */ class BOTAN_DLL Key_Length_Specification { public: /** * Constructor for fixed length keys * @param keylen the supported key length */ Key_Length_Specification(size_t keylen) : min_keylen(keylen), max_keylen(keylen), keylen_mod(1) { } /** * Constructor for variable length keys * @param min_k the smallest supported key length * @param max_k the largest supported key length * @param k_mod the number of bytes the key must be a multiple of */ Key_Length_Specification(size_t min_k, size_t max_k, size_t k_mod = 1) : min_keylen(min_k), max_keylen(max_k ? max_k : min_k), keylen_mod(k_mod) { } /** * @param length is a key length in bytes * @return true iff this length is a valid length for this algo */ bool valid_keylength(size_t length) const { return ((length >= min_keylen) && (length <= max_keylen) && (length % keylen_mod == 0)); } /** * @return minimum key length in bytes */ size_t minimum_keylength() const { return min_keylen; } /** * @return maximum key length in bytes */ size_t maximum_keylength() const { return max_keylen; } /** * @return key length multiple in bytes */ size_t keylength_multiple() const { return keylen_mod; } private: size_t min_keylen, max_keylen, keylen_mod; }; } #endif Botan-1.10.12/src/algo_base/sym_algo.h0000664000175000017500000000425012654331322017253 0ustar jackjack00000000000000/* * Symmetric Algorithm Base Class * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SYMMETRIC_ALGORITHM_H__ #define BOTAN_SYMMETRIC_ALGORITHM_H__ #include #include #include #include #include namespace Botan { /** * This class represents a symmetric algorithm object. */ class BOTAN_DLL SymmetricAlgorithm : public Algorithm { public: /** * @return object describing limits on key size */ virtual Key_Length_Specification key_spec() const = 0; /** * @return minimum allowed key length */ size_t maximum_keylength() const { return key_spec().maximum_keylength(); } /** * @return maxmium allowed key length */ size_t minimum_keylength() const { return key_spec().minimum_keylength(); } /** * Check whether a given key length is valid for this algorithm. * @param length the key length to be checked. * @return true if the key length is valid. */ bool valid_keylength(size_t length) const { return key_spec().valid_keylength(length); } /** * Set the symmetric key of this object. * @param key the SymmetricKey to be set. */ void set_key(const SymmetricKey& key) { set_key(key.begin(), key.length()); } /** * Set the symmetric key of this object. * @param key the to be set as a byte array. * @param length in bytes of key param */ void set_key(const byte key[], size_t length) { if(!valid_keylength(length)) throw Invalid_Key_Length(name(), length); key_schedule(key, length); } private: /** * Run the key schedule * @param key the key * @param length of key */ virtual void key_schedule(const byte key[], size_t length) = 0; }; /** * The two possible directions for cipher filters, determining whether they * actually perform encryption or decryption. */ enum Cipher_Dir { ENCRYPTION, DECRYPTION }; } #endif Botan-1.10.12/src/algo_base/symkey.cpp0000664000175000017500000000746612654331322017331 0ustar jackjack00000000000000/* * OctetString * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { /* * Create an OctetString from RNG output */ OctetString::OctetString(RandomNumberGenerator& rng, size_t length) { bits = rng.random_vec(length); } /* * Create an OctetString from a hex string */ void OctetString::change(const std::string& hex_string) { bits.resize(1 + hex_string.length() / 2); bits.resize(hex_decode(&bits[0], hex_string)); } /* * Create an OctetString from a byte string */ void OctetString::change(const byte in[], size_t n) { bits.resize(n); bits.copy(in, n); } /* * Set the parity of each key byte to odd */ void OctetString::set_odd_parity() { const byte ODD_PARITY[256] = { 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x07, 0x07, 0x08, 0x08, 0x0B, 0x0B, 0x0D, 0x0D, 0x0E, 0x0E, 0x10, 0x10, 0x13, 0x13, 0x15, 0x15, 0x16, 0x16, 0x19, 0x19, 0x1A, 0x1A, 0x1C, 0x1C, 0x1F, 0x1F, 0x20, 0x20, 0x23, 0x23, 0x25, 0x25, 0x26, 0x26, 0x29, 0x29, 0x2A, 0x2A, 0x2C, 0x2C, 0x2F, 0x2F, 0x31, 0x31, 0x32, 0x32, 0x34, 0x34, 0x37, 0x37, 0x38, 0x38, 0x3B, 0x3B, 0x3D, 0x3D, 0x3E, 0x3E, 0x40, 0x40, 0x43, 0x43, 0x45, 0x45, 0x46, 0x46, 0x49, 0x49, 0x4A, 0x4A, 0x4C, 0x4C, 0x4F, 0x4F, 0x51, 0x51, 0x52, 0x52, 0x54, 0x54, 0x57, 0x57, 0x58, 0x58, 0x5B, 0x5B, 0x5D, 0x5D, 0x5E, 0x5E, 0x61, 0x61, 0x62, 0x62, 0x64, 0x64, 0x67, 0x67, 0x68, 0x68, 0x6B, 0x6B, 0x6D, 0x6D, 0x6E, 0x6E, 0x70, 0x70, 0x73, 0x73, 0x75, 0x75, 0x76, 0x76, 0x79, 0x79, 0x7A, 0x7A, 0x7C, 0x7C, 0x7F, 0x7F, 0x80, 0x80, 0x83, 0x83, 0x85, 0x85, 0x86, 0x86, 0x89, 0x89, 0x8A, 0x8A, 0x8C, 0x8C, 0x8F, 0x8F, 0x91, 0x91, 0x92, 0x92, 0x94, 0x94, 0x97, 0x97, 0x98, 0x98, 0x9B, 0x9B, 0x9D, 0x9D, 0x9E, 0x9E, 0xA1, 0xA1, 0xA2, 0xA2, 0xA4, 0xA4, 0xA7, 0xA7, 0xA8, 0xA8, 0xAB, 0xAB, 0xAD, 0xAD, 0xAE, 0xAE, 0xB0, 0xB0, 0xB3, 0xB3, 0xB5, 0xB5, 0xB6, 0xB6, 0xB9, 0xB9, 0xBA, 0xBA, 0xBC, 0xBC, 0xBF, 0xBF, 0xC1, 0xC1, 0xC2, 0xC2, 0xC4, 0xC4, 0xC7, 0xC7, 0xC8, 0xC8, 0xCB, 0xCB, 0xCD, 0xCD, 0xCE, 0xCE, 0xD0, 0xD0, 0xD3, 0xD3, 0xD5, 0xD5, 0xD6, 0xD6, 0xD9, 0xD9, 0xDA, 0xDA, 0xDC, 0xDC, 0xDF, 0xDF, 0xE0, 0xE0, 0xE3, 0xE3, 0xE5, 0xE5, 0xE6, 0xE6, 0xE9, 0xE9, 0xEA, 0xEA, 0xEC, 0xEC, 0xEF, 0xEF, 0xF1, 0xF1, 0xF2, 0xF2, 0xF4, 0xF4, 0xF7, 0xF7, 0xF8, 0xF8, 0xFB, 0xFB, 0xFD, 0xFD, 0xFE, 0xFE }; for(size_t j = 0; j != bits.size(); ++j) bits[j] = ODD_PARITY[bits[j]]; } /* * Hex encode an OctetString */ std::string OctetString::as_string() const { return hex_encode(&bits[0], bits.size()); } /* * XOR Operation for OctetStrings */ OctetString& OctetString::operator^=(const OctetString& k) { if(&k == this) { zeroise(bits); return (*this); } xor_buf(&bits[0], k.begin(), std::min(length(), k.length())); return (*this); } /* * Equality Operation for OctetStrings */ bool operator==(const OctetString& s1, const OctetString& s2) { return (s1.bits_of() == s2.bits_of()); } /* * Unequality Operation for OctetStrings */ bool operator!=(const OctetString& s1, const OctetString& s2) { return !(s1 == s2); } /* * Append Operation for OctetStrings */ OctetString operator+(const OctetString& k1, const OctetString& k2) { SecureVector out; out += k1.bits_of(); out += k2.bits_of(); return OctetString(out); } /* * XOR Operation for OctetStrings */ OctetString operator^(const OctetString& k1, const OctetString& k2) { SecureVector ret(std::max(k1.length(), k2.length())); ret.copy(k1.begin(), k1.length()); xor_buf(ret, k2.begin(), k2.length()); return OctetString(ret); } } Botan-1.10.12/src/algo_base/symkey.h0000664000175000017500000000672412654331322016772 0ustar jackjack00000000000000/* * OctetString * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SYMKEY_H__ #define BOTAN_SYMKEY_H__ #include #include namespace Botan { /** * Octet String */ class BOTAN_DLL OctetString { public: /** * @return size of this octet string in bytes */ size_t length() const { return bits.size(); } /** * @return this object as a SecureVector */ SecureVector bits_of() const { return bits; } /** * @return start of this string */ const byte* begin() const { return &bits[0]; } /** * @return end of this string */ const byte* end() const { return &bits[bits.size()]; } /** * @return this encoded as hex */ std::string as_string() const; /** * XOR the contents of another octet string into this one * @param other octet string * @return reference to this */ OctetString& operator^=(const OctetString& other); /** * Force to have odd parity */ void set_odd_parity(); /** * Change the contents of this octet string * @param hex_string a hex encoded bytestring */ void change(const std::string& hex_string); /** * Change the contents of this octet string * @param in the input * @param length of in in bytes */ void change(const byte in[], size_t length); /** * Change the contents of this octet string * @param in the input */ void change(const MemoryRegion& in) { bits = in; } /** * Create a new random OctetString * @param rng is a random number generator * @param len is the desired length in bytes */ OctetString(class RandomNumberGenerator& rng, size_t len); /** * Create a new OctetString * @param str is a hex encoded string */ OctetString(const std::string& str = "") { change(str); } /** * Create a new OctetString * @param in is an array * @param len is the length of in in bytes */ OctetString(const byte in[], size_t len) { change(in, len); } /** * Create a new OctetString * @param in a bytestring */ OctetString(const MemoryRegion& in) { change(in); } private: SecureVector bits; }; /** * Compare two strings * @param x an octet string * @param y an octet string * @return if x is equal to y */ BOTAN_DLL bool operator==(const OctetString& x, const OctetString& y); /** * Compare two strings * @param x an octet string * @param y an octet string * @return if x is not equal to y */ BOTAN_DLL bool operator!=(const OctetString& x, const OctetString& y); /** * Concatenate two strings * @param x an octet string * @param y an octet string * @return x concatenated with y */ BOTAN_DLL OctetString operator+(const OctetString& x, const OctetString& y); /** * XOR two strings * @param x an octet string * @param y an octet string * @return x XORed with y */ BOTAN_DLL OctetString operator^(const OctetString& x, const OctetString& y); /** * Alternate name for octet string showing intent to use as a key */ typedef OctetString SymmetricKey; /** * Alternate name for octet string showing intent to use as an IV */ typedef OctetString InitializationVector; } #endif Botan-1.10.12/src/algo_factory/algo_cache.h0000664000175000017500000001446312654331322020252 0ustar jackjack00000000000000/* * An algorithm cache (used by Algorithm_Factory) * (C) 2008-2009,2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ALGORITHM_CACHE_TEMPLATE_H__ #define BOTAN_ALGORITHM_CACHE_TEMPLATE_H__ #include #include #include #include #include namespace Botan { /** * @param prov_name a provider name * @return weight for this provider */ size_t static_provider_weight(const std::string& prov_name); /** * Algorithm_Cache (used by Algorithm_Factory) */ template class Algorithm_Cache { public: /** * @param algo_spec names the requested algorithm * @param pref_provider suggests a preferred provider * @return prototype object, or NULL */ const T* get(const std::string& algo_spec, const std::string& pref_provider); /** * Add a new algorithm implementation to the cache * @param algo the algorithm prototype object * @param requested_name how this name will be requested * @param provider_name is the name of the provider of this prototype */ void add(T* algo, const std::string& requested_name, const std::string& provider_name); /** * Set the preferred provider * @param algo_spec names the algorithm * @param provider names the preferred provider */ void set_preferred_provider(const std::string& algo_spec, const std::string& provider); /** * Return the list of providers of this algorithm * @param algo_name names the algorithm * @return list of providers of this algorithm */ std::vector providers_of(const std::string& algo_name); /** * Clear the cache */ void clear_cache(); /** * Constructor * @param m a mutex to serialize internal access */ Algorithm_Cache(Mutex* m) : mutex(m) {} ~Algorithm_Cache() { clear_cache(); delete mutex; } private: typedef typename std::map >::iterator algorithms_iterator; typedef typename std::map::iterator provider_iterator; algorithms_iterator find_algorithm(const std::string& algo_spec); Mutex* mutex; std::map aliases; std::map pref_providers; std::map > algorithms; }; /* * Look for an algorithm implementation in the cache, also checking aliases * Assumes object lock is held */ template typename Algorithm_Cache::algorithms_iterator Algorithm_Cache::find_algorithm(const std::string& algo_spec) { algorithms_iterator algo = algorithms.find(algo_spec); // Not found? Check if a known alias if(algo == algorithms.end()) { std::map::const_iterator alias = aliases.find(algo_spec); if(alias != aliases.end()) algo = algorithms.find(alias->second); } return algo; } /* * Look for an algorithm implementation by a particular provider */ template const T* Algorithm_Cache::get(const std::string& algo_spec, const std::string& requested_provider) { Mutex_Holder lock(mutex); algorithms_iterator algo = find_algorithm(algo_spec); if(algo == algorithms.end()) // algo not found at all (no providers) return 0; // If a provider is requested specifically, return it or fail entirely if(requested_provider != "") { provider_iterator prov = algo->second.find(requested_provider); if(prov != algo->second.end()) return prov->second; return 0; } const T* prototype = 0; std::string prototype_provider; size_t prototype_prov_weight = 0; const std::string pref_provider = search_map(pref_providers, algo_spec); for(provider_iterator i = algo->second.begin(); i != algo->second.end(); ++i) { const std::string prov_name = i->first; const size_t prov_weight = static_provider_weight(prov_name); // preferred prov exists, return immediately if(prov_name == pref_provider) return i->second; if(prototype == 0 || prov_weight > prototype_prov_weight) { prototype = i->second; prototype_provider = i->first; prototype_prov_weight = prov_weight; } } return prototype; } /* * Add an implementation to the cache */ template void Algorithm_Cache::add(T* algo, const std::string& requested_name, const std::string& provider) { if(!algo) return; Mutex_Holder lock(mutex); if(algo->name() != requested_name && aliases.find(requested_name) == aliases.end()) { aliases[requested_name] = algo->name(); } if(!algorithms[algo->name()][provider]) algorithms[algo->name()][provider] = algo; else delete algo; } /* * Find the providers of this algo (if any) */ template std::vector Algorithm_Cache::providers_of(const std::string& algo_name) { Mutex_Holder lock(mutex); std::vector providers; algorithms_iterator algo = find_algorithm(algo_name); if(algo != algorithms.end()) { provider_iterator provider = algo->second.begin(); while(provider != algo->second.end()) { providers.push_back(provider->first); ++provider; } } return providers; } /* * Set the preferred provider for an algorithm */ template void Algorithm_Cache::set_preferred_provider(const std::string& algo_spec, const std::string& provider) { Mutex_Holder lock(mutex); pref_providers[algo_spec] = provider; } /* * Clear out the cache */ template void Algorithm_Cache::clear_cache() { algorithms_iterator algo = algorithms.begin(); while(algo != algorithms.end()) { provider_iterator provider = algo->second.begin(); while(provider != algo->second.end()) { delete provider->second; ++provider; } ++algo; } algorithms.clear(); } } #endif Botan-1.10.12/src/algo_factory/algo_factory.cpp0000664000175000017500000002426212654331322021207 0ustar jackjack00000000000000/* * Algorithm Factory * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace { /* * Template functions for the factory prototype/search algorithm */ template T* engine_get_algo(Engine*, const SCAN_Name&, Algorithm_Factory&) { return 0; } template<> BlockCipher* engine_get_algo(Engine* engine, const SCAN_Name& request, Algorithm_Factory& af) { return engine->find_block_cipher(request, af); } template<> StreamCipher* engine_get_algo(Engine* engine, const SCAN_Name& request, Algorithm_Factory& af) { return engine->find_stream_cipher(request, af); } template<> HashFunction* engine_get_algo(Engine* engine, const SCAN_Name& request, Algorithm_Factory& af) { return engine->find_hash(request, af); } template<> MessageAuthenticationCode* engine_get_algo(Engine* engine, const SCAN_Name& request, Algorithm_Factory& af) { return engine->find_mac(request, af); } template<> PBKDF* engine_get_algo(Engine* engine, const SCAN_Name& request, Algorithm_Factory& af) { return engine->find_pbkdf(request, af); } template const T* factory_prototype(const std::string& algo_spec, const std::string& provider, const std::vector& engines, Algorithm_Factory& af, Algorithm_Cache* cache) { if(const T* cache_hit = cache->get(algo_spec, provider)) return cache_hit; SCAN_Name scan_name(algo_spec); if(scan_name.cipher_mode() != "") return 0; for(size_t i = 0; i != engines.size(); ++i) { if(provider == "" || engines[i]->provider_name() == provider) { if(T* impl = engine_get_algo(engines[i], scan_name, af)) cache->add(impl, algo_spec, engines[i]->provider_name()); } } return cache->get(algo_spec, provider); } } /* * Setup caches */ Algorithm_Factory::Algorithm_Factory(Mutex_Factory& mf) { block_cipher_cache = new Algorithm_Cache(mf.make()); stream_cipher_cache = new Algorithm_Cache(mf.make()); hash_cache = new Algorithm_Cache(mf.make()); mac_cache = new Algorithm_Cache(mf.make()); pbkdf_cache = new Algorithm_Cache(mf.make()); } /* * Delete all engines */ Algorithm_Factory::~Algorithm_Factory() { delete block_cipher_cache; delete stream_cipher_cache; delete hash_cache; delete mac_cache; delete pbkdf_cache; std::for_each(engines.begin(), engines.end(), del_fun()); } void Algorithm_Factory::clear_caches() { block_cipher_cache->clear_cache(); stream_cipher_cache->clear_cache(); hash_cache->clear_cache(); mac_cache->clear_cache(); pbkdf_cache->clear_cache(); } void Algorithm_Factory::add_engine(Engine* engine) { clear_caches(); engines.push_back(engine); } /* * Set the preferred provider for an algorithm */ void Algorithm_Factory::set_preferred_provider(const std::string& algo_spec, const std::string& provider) { if(prototype_block_cipher(algo_spec)) block_cipher_cache->set_preferred_provider(algo_spec, provider); else if(prototype_stream_cipher(algo_spec)) stream_cipher_cache->set_preferred_provider(algo_spec, provider); else if(prototype_hash_function(algo_spec)) hash_cache->set_preferred_provider(algo_spec, provider); else if(prototype_mac(algo_spec)) mac_cache->set_preferred_provider(algo_spec, provider); else if(prototype_pbkdf(algo_spec)) pbkdf_cache->set_preferred_provider(algo_spec, provider); } /* * Get an engine out of the list */ Engine* Algorithm_Factory::get_engine_n(size_t n) const { if(n >= engines.size()) return 0; return engines[n]; } /* * Return the possible providers of a request * Note: assumes you don't have different types by the same name */ std::vector Algorithm_Factory::providers_of(const std::string& algo_spec) { /* The checks with if(prototype_X(algo_spec)) have the effect of forcing a full search, since otherwise there might not be any providers at all in the cache. */ if(prototype_block_cipher(algo_spec)) return block_cipher_cache->providers_of(algo_spec); else if(prototype_stream_cipher(algo_spec)) return stream_cipher_cache->providers_of(algo_spec); else if(prototype_hash_function(algo_spec)) return hash_cache->providers_of(algo_spec); else if(prototype_mac(algo_spec)) return mac_cache->providers_of(algo_spec); else if(prototype_pbkdf(algo_spec)) return pbkdf_cache->providers_of(algo_spec); else return std::vector(); } /* * Return the prototypical block cipher corresponding to this request */ const BlockCipher* Algorithm_Factory::prototype_block_cipher(const std::string& algo_spec, const std::string& provider) { return factory_prototype(algo_spec, provider, engines, *this, block_cipher_cache); } /* * Return the prototypical stream cipher corresponding to this request */ const StreamCipher* Algorithm_Factory::prototype_stream_cipher(const std::string& algo_spec, const std::string& provider) { return factory_prototype(algo_spec, provider, engines, *this, stream_cipher_cache); } /* * Return the prototypical object corresponding to this request (if found) */ const HashFunction* Algorithm_Factory::prototype_hash_function(const std::string& algo_spec, const std::string& provider) { return factory_prototype(algo_spec, provider, engines, *this, hash_cache); } /* * Return the prototypical object corresponding to this request */ const MessageAuthenticationCode* Algorithm_Factory::prototype_mac(const std::string& algo_spec, const std::string& provider) { return factory_prototype(algo_spec, provider, engines, *this, mac_cache); } /* * Return the prototypical object corresponding to this request */ const PBKDF* Algorithm_Factory::prototype_pbkdf(const std::string& algo_spec, const std::string& provider) { return factory_prototype(algo_spec, provider, engines, *this, pbkdf_cache); } /* * Return a new block cipher corresponding to this request */ BlockCipher* Algorithm_Factory::make_block_cipher(const std::string& algo_spec, const std::string& provider) { if(const BlockCipher* proto = prototype_block_cipher(algo_spec, provider)) return proto->clone(); throw Algorithm_Not_Found(algo_spec); } /* * Return a new stream cipher corresponding to this request */ StreamCipher* Algorithm_Factory::make_stream_cipher(const std::string& algo_spec, const std::string& provider) { if(const StreamCipher* proto = prototype_stream_cipher(algo_spec, provider)) return proto->clone(); throw Algorithm_Not_Found(algo_spec); } /* * Return a new object corresponding to this request */ HashFunction* Algorithm_Factory::make_hash_function(const std::string& algo_spec, const std::string& provider) { if(const HashFunction* proto = prototype_hash_function(algo_spec, provider)) return proto->clone(); throw Algorithm_Not_Found(algo_spec); } /* * Return a new object corresponding to this request */ MessageAuthenticationCode* Algorithm_Factory::make_mac(const std::string& algo_spec, const std::string& provider) { if(const MessageAuthenticationCode* proto = prototype_mac(algo_spec, provider)) return proto->clone(); throw Algorithm_Not_Found(algo_spec); } /* * Return a new object corresponding to this request */ PBKDF* Algorithm_Factory::make_pbkdf(const std::string& algo_spec, const std::string& provider) { if(const PBKDF* proto = prototype_pbkdf(algo_spec, provider)) return proto->clone(); throw Algorithm_Not_Found(algo_spec); } /* * Add a new block cipher */ void Algorithm_Factory::add_block_cipher(BlockCipher* block_cipher, const std::string& provider) { block_cipher_cache->add(block_cipher, block_cipher->name(), provider); } /* * Add a new stream cipher */ void Algorithm_Factory::add_stream_cipher(StreamCipher* stream_cipher, const std::string& provider) { stream_cipher_cache->add(stream_cipher, stream_cipher->name(), provider); } /* * Add a new hash */ void Algorithm_Factory::add_hash_function(HashFunction* hash, const std::string& provider) { hash_cache->add(hash, hash->name(), provider); } /* * Add a new mac */ void Algorithm_Factory::add_mac(MessageAuthenticationCode* mac, const std::string& provider) { mac_cache->add(mac, mac->name(), provider); } /* * Add a new PBKDF */ void Algorithm_Factory::add_pbkdf(PBKDF* pbkdf, const std::string& provider) { pbkdf_cache->add(pbkdf, pbkdf->name(), provider); } } Botan-1.10.12/src/algo_factory/algo_factory.h0000664000175000017500000001560012654331322020650 0ustar jackjack00000000000000/* * Algorithm Factory * (C) 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ALGORITHM_FACTORY_H__ #define BOTAN_ALGORITHM_FACTORY_H__ #include #include #include namespace Botan { /** * Forward declarations (don't need full definitions here) */ class BlockCipher; class StreamCipher; class HashFunction; class MessageAuthenticationCode; class PBKDF; template class Algorithm_Cache; class Engine; class Mutex_Factory; /** * Algorithm Factory */ class BOTAN_DLL Algorithm_Factory { public: /** * Constructor * @param mf a mutex factory */ Algorithm_Factory(Mutex_Factory& mf); /** * Destructor */ ~Algorithm_Factory(); /** * @param engine to add (Algorithm_Factory takes ownership) */ void add_engine(Engine* engine); /** * Clear out any cached objects */ void clear_caches(); /** * @param algo_spec the algorithm we are querying * @returns list of providers of this algorithm */ std::vector providers_of(const std::string& algo_spec); /** * @param algo_spec the algorithm we are setting a provider for * @param provider the provider we would like to use */ void set_preferred_provider(const std::string& algo_spec, const std::string& provider); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to const prototype object, ready to clone(), or NULL */ const BlockCipher* prototype_block_cipher(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to freshly created instance of the request algorithm */ BlockCipher* make_block_cipher(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo the algorithm to add * @param provider the provider of this algorithm */ void add_block_cipher(BlockCipher* algo, const std::string& provider); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to const prototype object, ready to clone(), or NULL */ const StreamCipher* prototype_stream_cipher(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to freshly created instance of the request algorithm */ StreamCipher* make_stream_cipher(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo the algorithm to add * @param provider the provider of this algorithm */ void add_stream_cipher(StreamCipher* algo, const std::string& provider); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to const prototype object, ready to clone(), or NULL */ const HashFunction* prototype_hash_function(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to freshly created instance of the request algorithm */ HashFunction* make_hash_function(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo the algorithm to add * @param provider the provider of this algorithm */ void add_hash_function(HashFunction* algo, const std::string& provider); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to const prototype object, ready to clone(), or NULL */ const MessageAuthenticationCode* prototype_mac(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to freshly created instance of the request algorithm */ MessageAuthenticationCode* make_mac(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo the algorithm to add * @param provider the provider of this algorithm */ void add_mac(MessageAuthenticationCode* algo, const std::string& provider); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to const prototype object, ready to clone(), or NULL */ const PBKDF* prototype_pbkdf(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo_spec the algorithm we want * @param provider the provider we would like to use * @returns pointer to freshly created instance of the request algorithm */ PBKDF* make_pbkdf(const std::string& algo_spec, const std::string& provider = ""); /** * @param algo the algorithm to add * @param provider the provider of this algorithm */ void add_pbkdf(PBKDF* algo, const std::string& provider); /** * An iterator for the engines in this factory * @deprecated Avoid in new code */ class BOTAN_DLL Engine_Iterator { public: /** * @return next engine in the sequence */ Engine* next() { return af.get_engine_n(n++); } /** * @param a an algorithm factory */ Engine_Iterator(const Algorithm_Factory& a) : af(a) { n = 0; } private: const Algorithm_Factory& af; size_t n; }; friend class Engine_Iterator; private: Algorithm_Factory(const Algorithm_Factory&) {} Algorithm_Factory& operator=(const Algorithm_Factory&) { return (*this); } Engine* get_engine_n(size_t n) const; std::vector engines; Algorithm_Cache* block_cipher_cache; Algorithm_Cache* stream_cipher_cache; Algorithm_Cache* hash_cache; Algorithm_Cache* mac_cache; Algorithm_Cache* pbkdf_cache; }; } #endif Botan-1.10.12/src/algo_factory/info.txt0000664000175000017500000000037312654331322017523 0ustar jackjack00000000000000load_on auto define ALGORITHM_FACTORY algo_factory.h algo_cache.h algo_factory.cpp prov_weight.cpp block engine hash mac mutex stream Botan-1.10.12/src/algo_factory/prov_weight.cpp0000664000175000017500000000132012654331322021061 0ustar jackjack00000000000000/* * Default provider weights for Algorithm_Cache * (C) 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /** * Return a static provider weighing */ size_t static_provider_weight(const std::string& prov_name) { /* * Prefer asm over C++, but prefer anything over OpenSSL or GNU MP; to use * them, set the provider explicitly for the algorithms you want */ if(prov_name == "aes_isa") return 9; if(prov_name == "simd") return 8; if(prov_name == "asm") return 7; if(prov_name == "core") return 5; if(prov_name == "openssl") return 2; if(prov_name == "gmp") return 1; return 0; // other/unknown } } Botan-1.10.12/src/alloc/alloc_mmap/info.txt0000664000175000017500000000041412654331322020244 0ustar jackjack00000000000000define ALLOC_MMAP mmap_mem.cpp mmap_mem.h linux freebsd dragonfly openbsd netbsd solaris qnx darwin tru64 # Only without -ansi, otherwise can't get mkstemp #cygwin mem_pool Botan-1.10.12/src/alloc/alloc_mmap/mmap_mem.cpp0000664000175000017500000000662412654331322021055 0ustar jackjack00000000000000/* * Memory Mapping Allocator * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #ifndef MAP_FAILED #define MAP_FAILED -1 #endif namespace Botan { namespace { /* * MemoryMapping_Allocator Exception */ class BOTAN_DLL MemoryMapping_Failed : public Exception { public: MemoryMapping_Failed(const std::string& msg) : Exception("MemoryMapping_Allocator: " + msg) {} }; } /* * Memory Map a File into Memory */ void* MemoryMapping_Allocator::alloc_block(size_t n) { class TemporaryFile { public: int get_fd() const { return fd; } TemporaryFile(const std::string& base) { const std::string mkstemp_template = base + "XXXXXX"; std::vector filepath(mkstemp_template.begin(), mkstemp_template.end()); filepath.push_back(0); // add terminating NULL mode_t old_umask = ::umask(077); fd = ::mkstemp(&filepath[0]); ::umask(old_umask); if(fd == -1) throw MemoryMapping_Failed("Temporary file allocation failed"); if(::unlink(&filepath[0]) != 0) throw MemoryMapping_Failed("Could not unlink temporary file"); } ~TemporaryFile() { /* * We can safely close here, because post-mmap the file * will continue to exist until the mmap is unmapped from * our address space upon deallocation (or process exit). */ if(fd != -1 && ::close(fd) == -1) throw MemoryMapping_Failed("Could not close file"); } private: int fd; }; TemporaryFile file("/tmp/botan_"); if(file.get_fd() == -1) throw MemoryMapping_Failed("Could not create file"); std::vector zeros(4096); size_t remaining = n; while(remaining) { const size_t write_try = std::min(zeros.size(), remaining); ssize_t wrote_got = ::write(file.get_fd(), &zeros[0], write_try); if(wrote_got == -1 && errno != EINTR) throw MemoryMapping_Failed("Could not write to file"); remaining -= wrote_got; } #ifndef MAP_NOSYNC #define MAP_NOSYNC 0 #endif void* ptr = ::mmap(0, n, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_NOSYNC, file.get_fd(), 0); if(ptr == static_cast(MAP_FAILED)) throw MemoryMapping_Failed("Could not map file"); return ptr; } /* * Remove a Memory Mapping */ void MemoryMapping_Allocator::dealloc_block(void* ptr, size_t n) { if(ptr == 0) return; const byte PATTERNS[] = { 0x00, 0xF5, 0x5A, 0xAF, 0x00 }; // The char* casts are for Solaris, args are void* on most other systems for(size_t i = 0; i != sizeof(PATTERNS); ++i) { std::memset(ptr, PATTERNS[i], n); if(::msync(static_cast(ptr), n, MS_SYNC)) throw MemoryMapping_Failed("Sync operation failed"); } if(::munmap(static_cast(ptr), n)) throw MemoryMapping_Failed("Could not unmap file"); } } Botan-1.10.12/src/alloc/alloc_mmap/mmap_mem.h0000664000175000017500000000152112654331322020511 0ustar jackjack00000000000000/* * Memory Mapping Allocator * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MMAP_ALLOCATOR_H__ #define BOTAN_MMAP_ALLOCATOR_H__ #include namespace Botan { /** * Allocator that uses memory maps backed by disk. We zeroize the map * upon deallocation. If swap occurs, the VM will swap to the shared * file backing rather than to a swap device, which means we know where * it is and can zap it later. */ class MemoryMapping_Allocator : public Pooling_Allocator { public: /** * @param mutex used for internal locking */ MemoryMapping_Allocator(Mutex* mutex) : Pooling_Allocator(mutex) {} std::string type() const { return "mmap"; } private: void* alloc_block(size_t); void dealloc_block(void*, size_t); }; } #endif Botan-1.10.12/src/alloc/allocate.h0000664000175000017500000000256012654331322016405 0ustar jackjack00000000000000/* * Allocator * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ALLOCATOR_H__ #define BOTAN_ALLOCATOR_H__ #include #include namespace Botan { /** * Allocator Interface */ class BOTAN_DLL Allocator { public: /** * Acquire a pointer to an allocator * @param locking is true if the allocator should attempt to * secure the memory (eg for using to store keys) * @return pointer to an allocator; ownership remains with library, * so do not delete */ static Allocator* get(bool locking); /** * Allocate a block of memory * @param n how many bytes to allocate * @return pointer to n bytes of memory */ virtual void* allocate(size_t n) = 0; /** * Deallocate memory allocated with allocate() * @param ptr the pointer returned by allocate() * @param n the size of the block pointed to by ptr */ virtual void deallocate(void* ptr, size_t n) = 0; /** * @return name of this allocator type */ virtual std::string type() const = 0; /** * Initialize the allocator */ virtual void init() {} /** * Shutdown the allocator */ virtual void destroy() {} virtual ~Allocator() {} }; } #endif Botan-1.10.12/src/alloc/info.txt0000664000175000017500000000006512654331322016142 0ustar jackjack00000000000000 allocate.h secmem.h Botan-1.10.12/src/alloc/mem_pool/info.txt0000664000175000017500000000016012654331322017745 0ustar jackjack00000000000000 mem_pool.cpp mem_pool.h mutex Botan-1.10.12/src/alloc/mem_pool/mem_pool.cpp0000664000175000017500000001244212654331322020572 0ustar jackjack00000000000000/* * Pooling Allocator * (C) 1999-2008 Jack Lloyd * 2005 Matthew Gregan * 2005-2006 Matt Johnston * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * Memory_Block Constructor */ Pooling_Allocator::Memory_Block::Memory_Block(void* buf) { buffer = static_cast(buf); bitmap = 0; buffer_end = buffer + (BLOCK_SIZE * BITMAP_SIZE); } /* * See if ptr is contained by this block */ bool Pooling_Allocator::Memory_Block::contains(void* ptr, size_t length) const { return ((buffer <= ptr) && (buffer_end >= static_cast(ptr) + length * BLOCK_SIZE)); } /* * Allocate some memory, if possible */ byte* Pooling_Allocator::Memory_Block::alloc(size_t n) { if(n == 0 || n > BITMAP_SIZE) return 0; if(n == BITMAP_SIZE) { if(bitmap) return 0; else { bitmap = ~bitmap; return buffer; } } bitmap_type mask = (static_cast(1) << n) - 1; size_t offset = 0; while(bitmap & mask) { mask <<= 1; ++offset; if((bitmap & mask) == 0) break; if(mask >> 63) break; } if(bitmap & mask) return 0; bitmap |= mask; return buffer + offset * BLOCK_SIZE; } /* * Mark this memory as free, if we own it */ void Pooling_Allocator::Memory_Block::free(void* ptr, size_t blocks) { clear_mem(static_cast(ptr), blocks * BLOCK_SIZE); const size_t offset = (static_cast(ptr) - buffer) / BLOCK_SIZE; if(offset == 0 && blocks == BITMAP_SIZE) bitmap = ~bitmap; else { for(size_t j = 0; j != blocks; ++j) bitmap &= ~(static_cast(1) << (j+offset)); } } /* * Pooling_Allocator Constructor */ Pooling_Allocator::Pooling_Allocator(Mutex* m) : mutex(m) { last_used = blocks.begin(); } /* * Pooling_Allocator Destructor */ Pooling_Allocator::~Pooling_Allocator() { delete mutex; if(blocks.size()) throw Invalid_State("Pooling_Allocator: Never released memory"); } /* * Free all remaining memory */ void Pooling_Allocator::destroy() { Mutex_Holder lock(mutex); blocks.clear(); for(size_t j = 0; j != allocated.size(); ++j) dealloc_block(allocated[j].first, allocated[j].second); allocated.clear(); } /* * Allocation */ void* Pooling_Allocator::allocate(size_t n) { const size_t BITMAP_SIZE = Memory_Block::bitmap_size(); const size_t BLOCK_SIZE = Memory_Block::block_size(); Mutex_Holder lock(mutex); if(n <= BITMAP_SIZE * BLOCK_SIZE) { const size_t block_no = round_up(n, BLOCK_SIZE) / BLOCK_SIZE; byte* mem = allocate_blocks(block_no); if(mem) return mem; get_more_core(BOTAN_MEM_POOL_CHUNK_SIZE); mem = allocate_blocks(block_no); if(mem) return mem; throw Memory_Exhaustion(); } void* new_buf = alloc_block(n); if(new_buf) return new_buf; throw Memory_Exhaustion(); } /* * Deallocation */ void Pooling_Allocator::deallocate(void* ptr, size_t n) { const size_t BITMAP_SIZE = Memory_Block::bitmap_size(); const size_t BLOCK_SIZE = Memory_Block::block_size(); if(ptr == 0 || n == 0) return; Mutex_Holder lock(mutex); if(n > BITMAP_SIZE * BLOCK_SIZE) dealloc_block(ptr, n); else { const size_t block_no = round_up(n, BLOCK_SIZE) / BLOCK_SIZE; std::vector::iterator i = std::lower_bound(blocks.begin(), blocks.end(), Memory_Block(ptr)); if(i == blocks.end() || !i->contains(ptr, block_no)) throw Invalid_State("Pointer released to the wrong allocator"); i->free(ptr, block_no); } } /* * Try to get some memory from an existing block */ byte* Pooling_Allocator::allocate_blocks(size_t n) { if(blocks.empty()) return 0; std::vector::iterator i = last_used; do { byte* mem = i->alloc(n); if(mem) { last_used = i; return mem; } ++i; if(i == blocks.end()) i = blocks.begin(); } while(i != last_used); return 0; } /* * Allocate more memory for the pool */ void Pooling_Allocator::get_more_core(size_t in_bytes) { const size_t BITMAP_SIZE = Memory_Block::bitmap_size(); const size_t BLOCK_SIZE = Memory_Block::block_size(); const size_t TOTAL_BLOCK_SIZE = BLOCK_SIZE * BITMAP_SIZE; // upper bound on allocation is 1 MiB in_bytes = std::min(in_bytes, 1024 * 1024); const size_t in_blocks = round_up(in_bytes, BLOCK_SIZE) / TOTAL_BLOCK_SIZE; const size_t to_allocate = in_blocks * TOTAL_BLOCK_SIZE; void* ptr = alloc_block(to_allocate); if(ptr == 0) throw Memory_Exhaustion(); allocated.push_back(std::make_pair(ptr, to_allocate)); for(size_t j = 0; j != in_blocks; ++j) { byte* byte_ptr = static_cast(ptr); blocks.push_back(Memory_Block(byte_ptr + j * TOTAL_BLOCK_SIZE)); } std::sort(blocks.begin(), blocks.end()); last_used = std::lower_bound(blocks.begin(), blocks.end(), Memory_Block(ptr)); } } Botan-1.10.12/src/alloc/mem_pool/mem_pool.h0000664000175000017500000000346612654331322020245 0ustar jackjack00000000000000/* * Pooling Allocator * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_POOLING_ALLOCATOR_H__ #define BOTAN_POOLING_ALLOCATOR_H__ #include #include #include #include #include namespace Botan { /** * Pooling Allocator */ class Pooling_Allocator : public Allocator { public: void* allocate(size_t); void deallocate(void*, size_t); void destroy(); /** * @param mutex used for internal locking */ Pooling_Allocator(Mutex* mutex); ~Pooling_Allocator(); private: void get_more_core(size_t); byte* allocate_blocks(size_t); virtual void* alloc_block(size_t) = 0; virtual void dealloc_block(void*, size_t) = 0; class Memory_Block { public: Memory_Block(void*); static size_t bitmap_size() { return BITMAP_SIZE; } static size_t block_size() { return BLOCK_SIZE; } bool contains(void*, size_t) const; byte* alloc(size_t); void free(void*, size_t); bool operator<(const Memory_Block& other) const { if(buffer < other.buffer && other.buffer < buffer_end) return false; return (buffer < other.buffer); } private: typedef u64bit bitmap_type; static const size_t BITMAP_SIZE = 8 * sizeof(bitmap_type); static const size_t BLOCK_SIZE = 64; bitmap_type bitmap; byte* buffer, *buffer_end; }; std::vector blocks; std::vector::iterator last_used; std::vector > allocated; Mutex* mutex; }; } #endif Botan-1.10.12/src/alloc/secmem.h0000664000175000017500000002624712654331322016102 0ustar jackjack00000000000000/* * Secure Memory Buffers * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SECURE_MEMORY_BUFFERS_H__ #define BOTAN_SECURE_MEMORY_BUFFERS_H__ #include #include #include namespace Botan { /** * This class represents variable length memory buffers. */ template class MemoryRegion { public: /** * Find out the size of the buffer, i.e. how many objects of type T it * contains. * @return size of the buffer */ size_t size() const { return used; } /** * Find out whether this buffer is empty. * @return true if the buffer is empty, false otherwise */ bool empty() const { return (used == 0); } /** * Get a pointer to the first element in the buffer. * @return pointer to the first element in the buffer */ operator T* () { return buf; } /** * Get a constant pointer to the first element in the buffer. * @return constant pointer to the first element in the buffer */ operator const T* () const { return buf; } /** * Get a pointer to the first element in the buffer. * @return pointer to the first element in the buffer */ T* begin() { return buf; } /** * Get a constant pointer to the first element in the buffer. * @return constant pointer to the first element in the buffer */ const T* begin() const { return buf; } /** * Get a pointer to one past the last element in the buffer. * @return pointer to one past the last element in the buffer */ T* end() { return (buf + size()); } /** * Get a const pointer to one past the last element in the buffer. * @return const pointer to one past the last element in the buffer */ const T* end() const { return (buf + size()); } /** * Check two buffers for equality. * @return true iff the content of both buffers is byte-wise equal */ bool operator==(const MemoryRegion& other) const { return (size() == other.size() && same_mem(buf, other.buf, size())); } /** * Compare two buffers * @return true iff this is ordered before other */ bool operator<(const MemoryRegion& other) const; /** * Check two buffers for inequality. * @return false if the content of both buffers is byte-wise equal, true * otherwise. */ bool operator!=(const MemoryRegion& other) const { return (!(*this == other)); } /** * Copy the contents of another buffer into this buffer. * The former contents of *this are discarded. * @param other the buffer to copy the contents from. * @return reference to *this */ MemoryRegion& operator=(const MemoryRegion& other) { if(this != &other) { this->resize(other.size()); this->copy(&other[0], other.size()); } return (*this); } /** * Copy the contents of an array of objects of type T into this buffer. * The former contents of *this are discarded. * The length of *this must be at least n, otherwise memory errors occur. * @param in the array to copy the contents from * @param n the length of in */ void copy(const T in[], size_t n) { copy_mem(buf, in, std::min(n, size())); } /** * Copy the contents of an array of objects of type T into this buffer. * The former contents of *this are discarded. * The length of *this must be at least n, otherwise memory errors occur. * @param off the offset position inside this buffer to start inserting * the copied bytes * @param in the array to copy the contents from * @param n the length of in */ void copy(size_t off, const T in[], size_t n) { copy_mem(buf + off, in, std::min(n, size() - off)); } /** * Append a single element. * @param x the element to append */ void push_back(T x) { resize(size() + 1); buf[size()-1] = x; } /** * Reset this buffer to an empty buffer with size zero. */ void clear() { resize(0); } /** * Inserts or erases elements at the end such that the size * becomes n, leaving elements in the range 0...n unmodified if * set or otherwise zero-initialized * @param n length of the new buffer */ void resize(size_t n); /** * Swap this buffer with another object. */ void swap(MemoryRegion& other); ~MemoryRegion() { deallocate(buf, allocated); } protected: MemoryRegion() : buf(0), used(0), allocated(0), alloc(0) {} /** * Copy constructor * @param other the other region to copy */ MemoryRegion(const MemoryRegion& other) : buf(0), used(0), allocated(0), alloc(other.alloc) { resize(other.size()); copy(&other[0], other.size()); } /** * @param locking should we use a locking allocator * @param length the initial length to use */ void init(bool locking, size_t length = 0) { alloc = Allocator::get(locking); resize(length); } private: T* allocate(size_t n) { return static_cast(alloc->allocate(sizeof(T)*n)); } void deallocate(T* p, size_t n) { if(alloc && p && n) alloc->deallocate(p, sizeof(T)*n); } T* buf; size_t used; size_t allocated; Allocator* alloc; }; /* * Change the size of the buffer */ template void MemoryRegion::resize(size_t n) { if(n <= allocated) { size_t zap = std::min(used, n); clear_mem(buf + zap, allocated - zap); used = n; } else { T* new_buf = allocate(n); copy_mem(new_buf, buf, used); deallocate(buf, allocated); buf = new_buf; allocated = used = n; } } /* * Compare this buffer with another one */ template bool MemoryRegion::operator<(const MemoryRegion& other) const { const size_t min_size = std::min(size(), other.size()); // This should probably be rewritten to run in constant time for(size_t i = 0; i != min_size; ++i) { if(buf[i] < other[i]) return true; if(buf[i] > other[i]) return false; } // First min_size bytes are equal, shorter is first return (size() < other.size()); } /* * Swap this buffer with another one */ template void MemoryRegion::swap(MemoryRegion& x) { std::swap(buf, x.buf); std::swap(used, x.used); std::swap(allocated, x.allocated); std::swap(alloc, x.alloc); } /** * This class represents variable length buffers that do not * make use of memory locking. */ template class MemoryVector : public MemoryRegion { public: /** * Copy the contents of another buffer into this buffer. * @param in the buffer to copy the contents from * @return reference to *this */ MemoryVector& operator=(const MemoryRegion& in) { if(this != &in) { this->resize(in.size()); this->copy(&in[0], in.size()); } return (*this); } /** * Create a buffer of the specified length. * @param n the length of the buffer to create. */ MemoryVector(size_t n = 0) { this->init(false, n); } /** * Create a buffer with the specified contents. * @param in the array containing the data to be initially copied * into the newly created buffer * @param n the size of the arry in */ MemoryVector(const T in[], size_t n) { this->init(false); this->resize(n); this->copy(in, n); } /** * Copy constructor. */ MemoryVector(const MemoryRegion& in) { this->init(false); this->resize(in.size()); this->copy(&in[0], in.size()); } }; /** * This class represents variable length buffers using the operating * systems capability to lock memory, i.e. keeping it from being * swapped out to disk. In this way, a security hole allowing attackers * to find swapped out secret keys is closed. */ template class SecureVector : public MemoryRegion { public: /** * Copy the contents of another buffer into this buffer. * @param other the buffer to copy the contents from * @return reference to *this */ SecureVector& operator=(const MemoryRegion& other) { if(this != &other) { this->resize(other.size()); this->copy(&other[0], other.size()); } return (*this); } /** * Create a buffer of the specified length. * @param n the length of the buffer to create. */ SecureVector(size_t n = 0) { this->init(true, n); } /** * Create a buffer with the specified contents. * @param in the array containing the data to be initially copied * into the newly created buffer * @param n the size of the array in */ SecureVector(const T in[], size_t n) { this->init(true); this->resize(n); this->copy(&in[0], n); } /** * Create a buffer with contents specified contents. * @param in the buffer holding the contents that will be * copied into the newly created buffer. */ SecureVector(const MemoryRegion& in) { this->init(true); this->resize(in.size()); this->copy(&in[0], in.size()); } }; template MemoryRegion& operator+=(MemoryRegion& out, const MemoryRegion& in) { const size_t copy_offset = out.size(); out.resize(out.size() + in.size()); copy_mem(&out[copy_offset], &in[0], in.size()); return out; } template MemoryRegion& operator+=(MemoryRegion& out, T in) { out.push_back(in); return out; } template MemoryRegion& operator+=(MemoryRegion& out, const std::pair& in) { const size_t copy_offset = out.size(); out.resize(out.size() + in.second); copy_mem(&out[copy_offset], in.first, in.second); return out; } template MemoryRegion& operator+=(MemoryRegion& out, const std::pair& in) { const size_t copy_offset = out.size(); out.resize(out.size() + in.second); copy_mem(&out[copy_offset], in.first, in.second); return out; } /** * Zeroise the values; length remains unchanged * @param vec the vector to zeroise */ template void zeroise(MemoryRegion& vec) { clear_mem(&vec[0], vec.size()); } } namespace std { template inline void swap(Botan::MemoryRegion& x, Botan::MemoryRegion& y) { x.swap(y); } } #endif Botan-1.10.12/src/alloc/system_alloc/defalloc.cpp0000664000175000017500000000312112654331322021415 0ustar jackjack00000000000000/* * Basic Allocators * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace { /* * Perform Memory Allocation */ void* do_malloc(size_t n, bool do_lock) { void* ptr = std::malloc(n); if(!ptr) return 0; if(do_lock) lock_mem(ptr, n); std::memset(ptr, 0, n); return ptr; } /* * Perform Memory Deallocation */ void do_free(void* ptr, size_t n, bool do_lock) { if(!ptr) return; std::memset(ptr, 0, n); if(do_lock) unlock_mem(ptr, n); std::free(ptr); } } /* * Malloc_Allocator's Allocation */ void* Malloc_Allocator::allocate(size_t n) { void* ptr = do_malloc(n, false); if(!ptr) throw Memory_Exhaustion(); return ptr; } /* * Malloc_Allocator's Deallocation */ void Malloc_Allocator::deallocate(void* ptr, size_t n) { do_free(ptr, n, false); } /* * Locking_Allocator's Allocation */ void* Locking_Allocator::alloc_block(size_t n) { return do_malloc(n, true); } /* * Locking_Allocator's Deallocation */ void Locking_Allocator::dealloc_block(void* ptr, size_t n) { do_free(ptr, n, true); } /* * Get an allocator */ Allocator* Allocator::get(bool locking) { std::string type = ""; if(!locking) type = "malloc"; Allocator* alloc = global_state().get_allocator(type); if(alloc) return alloc; throw Internal_Error("Couldn't find an allocator to use in get_allocator"); } } Botan-1.10.12/src/alloc/system_alloc/defalloc.h0000664000175000017500000000151512654331322021067 0ustar jackjack00000000000000/* * Basic Allocators * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BASIC_ALLOC_H__ #define BOTAN_BASIC_ALLOC_H__ #include namespace Botan { /** * Allocator using malloc */ class Malloc_Allocator : public Allocator { public: void* allocate(size_t); void deallocate(void*, size_t); std::string type() const { return "malloc"; } }; /** * Allocator using malloc plus locking */ class Locking_Allocator : public Pooling_Allocator { public: /** * @param mutex used for internal locking */ Locking_Allocator(Mutex* mutex) : Pooling_Allocator(mutex) {} std::string type() const { return "locking"; } private: void* alloc_block(size_t); void dealloc_block(void*, size_t); }; } #endif Botan-1.10.12/src/alloc/system_alloc/info.txt0000664000175000017500000000017412654331322020641 0ustar jackjack00000000000000 defalloc.cpp defalloc.h libstate mem_pool Botan-1.10.12/src/asn1/alg_id.cpp0000664000175000017500000000437212654331322016146 0ustar jackjack00000000000000/* * Algorithm Identifier * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Create an AlgorithmIdentifier */ AlgorithmIdentifier::AlgorithmIdentifier(const OID& alg_id, const MemoryRegion& param) { oid = alg_id; parameters = param; } /* * Create an AlgorithmIdentifier */ AlgorithmIdentifier::AlgorithmIdentifier(const std::string& alg_id, const MemoryRegion& param) { oid = OIDS::lookup(alg_id); parameters = param; } /* * Create an AlgorithmIdentifier */ AlgorithmIdentifier::AlgorithmIdentifier(const OID& alg_id, Encoding_Option option) { const byte DER_NULL[] = { 0x05, 0x00 }; oid = alg_id; if(option == USE_NULL_PARAM) { parameters += std::pair( DER_NULL, sizeof(DER_NULL)); } } /* * Create an AlgorithmIdentifier */ AlgorithmIdentifier::AlgorithmIdentifier(const std::string& alg_id, Encoding_Option option) { const byte DER_NULL[] = { 0x05, 0x00 }; oid = OIDS::lookup(alg_id); if(option == USE_NULL_PARAM) { parameters += std::pair( DER_NULL, sizeof(DER_NULL)); } } /* * Compare two AlgorithmIdentifiers */ bool operator==(const AlgorithmIdentifier& a1, const AlgorithmIdentifier& a2) { if(a1.oid != a2.oid) return false; if(a1.parameters != a2.parameters) return false; return true; } /* * Compare two AlgorithmIdentifiers */ bool operator!=(const AlgorithmIdentifier& a1, const AlgorithmIdentifier& a2) { return !(a1 == a2); } /* * DER encode an AlgorithmIdentifier */ void AlgorithmIdentifier::encode_into(DER_Encoder& codec) const { codec.start_cons(SEQUENCE) .encode(oid) .raw_bytes(parameters) .end_cons(); } /* * Decode a BER encoded AlgorithmIdentifier */ void AlgorithmIdentifier::decode_from(BER_Decoder& codec) { codec.start_cons(SEQUENCE) .decode(oid) .raw_bytes(parameters) .end_cons(); } } Botan-1.10.12/src/asn1/alg_id.h0000664000175000017500000000216412654331322015610 0ustar jackjack00000000000000/* * Algorithm Identifier * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ALGORITHM_IDENTIFIER_H__ #define BOTAN_ALGORITHM_IDENTIFIER_H__ #include #include #include namespace Botan { /** * Algorithm Identifier */ class BOTAN_DLL AlgorithmIdentifier : public ASN1_Object { public: enum Encoding_Option { USE_NULL_PARAM }; void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); AlgorithmIdentifier() {} AlgorithmIdentifier(const OID&, Encoding_Option); AlgorithmIdentifier(const std::string&, Encoding_Option); AlgorithmIdentifier(const OID&, const MemoryRegion&); AlgorithmIdentifier(const std::string&, const MemoryRegion&); OID oid; SecureVector parameters; }; /* * Comparison Operations */ bool BOTAN_DLL operator==(const AlgorithmIdentifier&, const AlgorithmIdentifier&); bool BOTAN_DLL operator!=(const AlgorithmIdentifier&, const AlgorithmIdentifier&); } #endif Botan-1.10.12/src/asn1/asn1_alt.cpp0000664000175000017500000001470512654331322016432 0ustar jackjack00000000000000/* * AlternativeName * (C) 1999-2007 Jack Lloyd * 2007 Yves Jerschow * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include namespace Botan { namespace { /* * Check if type is a known ASN.1 string type */ bool is_string_type(ASN1_Tag tag) { return (tag == NUMERIC_STRING || tag == PRINTABLE_STRING || tag == VISIBLE_STRING || tag == T61_STRING || tag == IA5_STRING || tag == UTF8_STRING || tag == BMP_STRING); } } /* * Create an AlternativeName */ AlternativeName::AlternativeName(const std::string& email_addr, const std::string& uri, const std::string& dns, const std::string& ip) { add_attribute("RFC822", email_addr); add_attribute("DNS", dns); add_attribute("URI", uri); add_attribute("IP", ip); } /* * Add an attribute to an alternative name */ void AlternativeName::add_attribute(const std::string& type, const std::string& str) { if(type == "" || str == "") return; typedef std::multimap::iterator iter; std::pair range = alt_info.equal_range(type); for(iter j = range.first; j != range.second; ++j) if(j->second == str) return; multimap_insert(alt_info, type, str); } /* * Add an OtherName field */ void AlternativeName::add_othername(const OID& oid, const std::string& value, ASN1_Tag type) { if(value == "") return; multimap_insert(othernames, oid, ASN1_String(value, type)); } /* * Get the attributes of this alternative name */ std::multimap AlternativeName::get_attributes() const { return alt_info; } /* * Get the otherNames */ std::multimap AlternativeName::get_othernames() const { return othernames; } /* * Return all of the alternative names */ std::multimap AlternativeName::contents() const { std::multimap names; typedef std::multimap::const_iterator rdn_iter; for(rdn_iter j = alt_info.begin(); j != alt_info.end(); ++j) multimap_insert(names, j->first, j->second); typedef std::multimap::const_iterator on_iter; for(on_iter j = othernames.begin(); j != othernames.end(); ++j) multimap_insert(names, OIDS::lookup(j->first), j->second.value()); return names; } /* * Return if this object has anything useful */ bool AlternativeName::has_items() const { return (alt_info.size() > 0 || othernames.size() > 0); } namespace { /* * DER encode an AlternativeName entry */ void encode_entries(DER_Encoder& encoder, const std::multimap& attr, const std::string& type, ASN1_Tag tagging) { typedef std::multimap::const_iterator iter; std::pair range = attr.equal_range(type); for(iter j = range.first; j != range.second; ++j) { if(type == "RFC822" || type == "DNS" || type == "URI") { ASN1_String asn1_string(j->second, IA5_STRING); encoder.add_object(tagging, CONTEXT_SPECIFIC, asn1_string.iso_8859()); } else if(type == "IP") { const u32bit ip = string_to_ipv4(j->second); byte ip_buf[4] = { 0 }; store_be(ip, ip_buf); encoder.add_object(tagging, CONTEXT_SPECIFIC, ip_buf, 4); } } } } /* * DER encode an AlternativeName extension */ void AlternativeName::encode_into(DER_Encoder& der) const { der.start_cons(SEQUENCE); encode_entries(der, alt_info, "RFC822", ASN1_Tag(1)); encode_entries(der, alt_info, "DNS", ASN1_Tag(2)); encode_entries(der, alt_info, "URI", ASN1_Tag(6)); encode_entries(der, alt_info, "IP", ASN1_Tag(7)); std::multimap::const_iterator i; for(i = othernames.begin(); i != othernames.end(); ++i) { der.start_explicit(0) .encode(i->first) .start_explicit(0) .encode(i->second) .end_explicit() .end_explicit(); } der.end_cons(); } /* * Decode a BER encoded AlternativeName */ void AlternativeName::decode_from(BER_Decoder& source) { BER_Decoder names = source.start_cons(SEQUENCE); while(names.more_items()) { BER_Object obj = names.get_next_object(); if((obj.class_tag != CONTEXT_SPECIFIC) && (obj.class_tag != (CONTEXT_SPECIFIC | CONSTRUCTED))) continue; const ASN1_Tag tag = obj.type_tag; if(tag == 0) { BER_Decoder othername(obj.value); OID oid; othername.decode(oid); if(othername.more_items()) { BER_Object othername_value_outer = othername.get_next_object(); othername.verify_end(); if(othername_value_outer.type_tag != ASN1_Tag(0) || othername_value_outer.class_tag != (CONTEXT_SPECIFIC | CONSTRUCTED) ) throw Decoding_Error("Invalid tags on otherName value"); BER_Decoder othername_value_inner(othername_value_outer.value); BER_Object value = othername_value_inner.get_next_object(); othername_value_inner.verify_end(); const ASN1_Tag value_type = value.type_tag; if(is_string_type(value_type) && value.class_tag == UNIVERSAL) add_othername(oid, ASN1::to_string(value), value_type); } } else if(tag == 1 || tag == 2 || tag == 6) { const std::string value = Charset::transcode(ASN1::to_string(obj), LATIN1_CHARSET, LOCAL_CHARSET); if(tag == 1) add_attribute("RFC822", value); if(tag == 2) add_attribute("DNS", value); if(tag == 6) add_attribute("URI", value); } else if(tag == 7) { if(obj.value.size() == 4) { const u32bit ip = load_be(&obj.value[0], 0); add_attribute("IP", ipv4_to_string(ip)); } } } } } Botan-1.10.12/src/asn1/asn1_att.cpp0000664000175000017500000000206012654331322016431 0ustar jackjack00000000000000/* * Attribute * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Create an Attribute */ Attribute::Attribute(const OID& attr_oid, const MemoryRegion& attr_value) { oid = attr_oid; parameters = attr_value; } /* * Create an Attribute */ Attribute::Attribute(const std::string& attr_oid, const MemoryRegion& attr_value) { oid = OIDS::lookup(attr_oid); parameters = attr_value; } /* * DER encode a Attribute */ void Attribute::encode_into(DER_Encoder& codec) const { codec.start_cons(SEQUENCE) .encode(oid) .start_cons(SET) .raw_bytes(parameters) .end_cons() .end_cons(); } /* * Decode a BER encoded Attribute */ void Attribute::decode_from(BER_Decoder& codec) { codec.start_cons(SEQUENCE) .decode(oid) .start_cons(SET) .raw_bytes(parameters) .end_cons() .end_cons(); } } Botan-1.10.12/src/asn1/asn1_int.cpp0000664000175000017500000000271612654331322016443 0ustar jackjack00000000000000/* * ASN.1 Internals * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * BER Decoding Exceptions */ BER_Decoding_Error::BER_Decoding_Error(const std::string& str) : Decoding_Error("BER: " + str) {} BER_Bad_Tag::BER_Bad_Tag(const std::string& str, ASN1_Tag tag) : BER_Decoding_Error(str + ": " + to_string(tag)) {} BER_Bad_Tag::BER_Bad_Tag(const std::string& str, ASN1_Tag tag1, ASN1_Tag tag2) : BER_Decoding_Error(str + ": " + to_string(tag1) + "/" + to_string(tag2)) {} namespace ASN1 { /* * Put some arbitrary bytes into a SEQUENCE */ SecureVector put_in_sequence(const MemoryRegion& contents) { return DER_Encoder() .start_cons(SEQUENCE) .raw_bytes(contents) .end_cons() .get_contents(); } /* * Convert a BER object into a string object */ std::string to_string(const BER_Object& obj) { return std::string(reinterpret_cast(&obj.value[0]), obj.value.size()); } /* * Do heuristic tests for BER data */ bool maybe_BER(DataSource& source) { byte first_byte; if(!source.peek_byte(first_byte)) throw Stream_IO_Error("ASN1::maybe_BER: Source was empty"); if(first_byte == (SEQUENCE | CONSTRUCTED)) return true; return false; } } } Botan-1.10.12/src/asn1/asn1_int.h0000664000175000017500000000463412654331322016111 0ustar jackjack00000000000000/* * ASN.1 Internals * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ASN1_H__ #define BOTAN_ASN1_H__ #include #include namespace Botan { /** * ASN.1 Type and Class Tags */ enum ASN1_Tag { UNIVERSAL = 0x00, APPLICATION = 0x40, CONTEXT_SPECIFIC = 0x80, PRIVATE = 0xC0, CONSTRUCTED = 0x20, EOC = 0x00, BOOLEAN = 0x01, INTEGER = 0x02, BIT_STRING = 0x03, OCTET_STRING = 0x04, NULL_TAG = 0x05, OBJECT_ID = 0x06, ENUMERATED = 0x0A, SEQUENCE = 0x10, SET = 0x11, UTF8_STRING = 0x0C, NUMERIC_STRING = 0x12, PRINTABLE_STRING = 0x13, T61_STRING = 0x14, IA5_STRING = 0x16, VISIBLE_STRING = 0x1A, BMP_STRING = 0x1E, UTC_TIME = 0x17, GENERALIZED_TIME = 0x18, NO_OBJECT = 0xFF00, DIRECTORY_STRING = 0xFF01 }; /** * Basic ASN.1 Object Interface */ class BOTAN_DLL ASN1_Object { public: /** * Encode whatever this object is into to * @param to the DER_Encoder that will be written to */ virtual void encode_into(class DER_Encoder& to) const = 0; /** * Decode whatever this object is from from * @param from the BER_Decoder that will be read from */ virtual void decode_from(class BER_Decoder& from) = 0; virtual ~ASN1_Object() {} }; /** * BER Encoded Object */ class BOTAN_DLL BER_Object { public: void assert_is_a(ASN1_Tag, ASN1_Tag); ASN1_Tag type_tag, class_tag; SecureVector value; }; /* * ASN.1 Utility Functions */ class DataSource; namespace ASN1 { SecureVector put_in_sequence(const MemoryRegion& val); std::string to_string(const BER_Object& obj); /** * Heuristics tests; is this object possibly BER? * @param src a data source that will be peeked at but not modified */ bool maybe_BER(DataSource& src); } /** * General BER Decoding Error Exception */ struct BOTAN_DLL BER_Decoding_Error : public Decoding_Error { BER_Decoding_Error(const std::string&); }; /** * Exception For Incorrect BER Taggings */ struct BOTAN_DLL BER_Bad_Tag : public BER_Decoding_Error { BER_Bad_Tag(const std::string& msg, ASN1_Tag tag); BER_Bad_Tag(const std::string& msg, ASN1_Tag tag1, ASN1_Tag tag2); }; } #endif Botan-1.10.12/src/asn1/asn1_obj.h0000664000175000017500000000513112654331322016062 0ustar jackjack00000000000000/* * Common ASN.1 Objects * (C) 1999-2007 Jack Lloyd * 2007 Yves Jerschow * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ASN1_OBJ_H__ #define BOTAN_ASN1_OBJ_H__ #include #include #include #include #include #include namespace Botan { /** * Attribute */ class BOTAN_DLL Attribute : public ASN1_Object { public: void encode_into(class DER_Encoder& to) const; void decode_from(class BER_Decoder& from); OID oid; MemoryVector parameters; Attribute() {} Attribute(const OID&, const MemoryRegion&); Attribute(const std::string&, const MemoryRegion&); }; /** * X.509 Time */ class BOTAN_DLL X509_Time : public ASN1_Object { public: void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); std::string as_string() const; std::string readable_string() const; bool time_is_set() const; s32bit cmp(const X509_Time&) const; void set_to(const std::string&); void set_to(const std::string&, ASN1_Tag); X509_Time(u64bit); X509_Time(const std::string& = ""); X509_Time(const std::string&, ASN1_Tag); private: bool passes_sanity_check() const; u32bit year, month, day, hour, minute, second; ASN1_Tag tag; }; /** * Alternative Name */ class BOTAN_DLL AlternativeName : public ASN1_Object { public: void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); std::multimap contents() const; void add_attribute(const std::string&, const std::string&); std::multimap get_attributes() const; void add_othername(const OID&, const std::string&, ASN1_Tag); std::multimap get_othernames() const; bool has_items() const; AlternativeName(const std::string& = "", const std::string& = "", const std::string& = "", const std::string& = ""); private: std::multimap alt_info; std::multimap othernames; }; /* * Comparison Operations */ bool BOTAN_DLL operator==(const X509_Time&, const X509_Time&); bool BOTAN_DLL operator!=(const X509_Time&, const X509_Time&); bool BOTAN_DLL operator<=(const X509_Time&, const X509_Time&); bool BOTAN_DLL operator>=(const X509_Time&, const X509_Time&); bool BOTAN_DLL operator<(const X509_Time&, const X509_Time&); bool BOTAN_DLL operator>(const X509_Time&, const X509_Time&); } #endif Botan-1.10.12/src/asn1/asn1_oid.cpp0000664000175000017500000000715412654331322016425 0ustar jackjack00000000000000/* * ASN.1 OID * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * ASN.1 OID Constructor */ OID::OID(const std::string& oid_str) { if(oid_str != "") { try { id = parse_asn1_oid(oid_str); } catch(...) { throw Invalid_OID(oid_str); } if(id.size() < 2 || id[0] > 2) throw Invalid_OID(oid_str); if((id[0] == 0 || id[0] == 1) && id[1] > 39) throw Invalid_OID(oid_str); } } /* * Clear the current OID */ void OID::clear() { id.clear(); } /* * Return this OID as a string */ std::string OID::as_string() const { std::string oid_str; for(size_t i = 0; i != id.size(); ++i) { oid_str += to_string(id[i]); if(i != id.size() - 1) oid_str += '.'; } return oid_str; } /* * OID equality comparison */ bool OID::operator==(const OID& oid) const { if(id.size() != oid.id.size()) return false; for(size_t i = 0; i != id.size(); ++i) if(id[i] != oid.id[i]) return false; return true; } /* * Append another component to the OID */ OID& OID::operator+=(u32bit component) { id.push_back(component); return (*this); } /* * Append another component to the OID */ OID operator+(const OID& oid, u32bit component) { OID new_oid(oid); new_oid += component; return new_oid; } /* * OID inequality comparison */ bool operator!=(const OID& a, const OID& b) { return !(a == b); } /* * Compare two OIDs */ bool operator<(const OID& a, const OID& b) { std::vector oid1 = a.get_id(); std::vector oid2 = b.get_id(); if(oid1.size() < oid2.size()) return true; if(oid1.size() > oid2.size()) return false; for(size_t i = 0; i != oid1.size(); ++i) { if(oid1[i] < oid2[i]) return true; if(oid1[i] > oid2[i]) return false; } return false; } /* * DER encode an OBJECT IDENTIFIER */ void OID::encode_into(DER_Encoder& der) const { if(id.size() < 2) throw Invalid_Argument("OID::encode_into: OID is invalid"); MemoryVector encoding; encoding.push_back(40 * id[0] + id[1]); for(size_t i = 2; i != id.size(); ++i) { if(id[i] == 0) encoding.push_back(0); else { size_t blocks = high_bit(id[i]) + 6; blocks = (blocks - (blocks % 7)) / 7; for(size_t j = 0; j != blocks - 1; ++j) encoding.push_back(0x80 | ((id[i] >> 7*(blocks-j-1)) & 0x7F)); encoding.push_back(id[i] & 0x7F); } } der.add_object(OBJECT_ID, UNIVERSAL, encoding); } /* * Decode a BER encoded OBJECT IDENTIFIER */ void OID::decode_from(BER_Decoder& decoder) { BER_Object obj = decoder.get_next_object(); if(obj.type_tag != OBJECT_ID || obj.class_tag != UNIVERSAL) throw BER_Bad_Tag("Error decoding OID, unknown tag", obj.type_tag, obj.class_tag); if(obj.value.size() < 2) throw BER_Decoding_Error("OID encoding is too short"); clear(); id.push_back(obj.value[0] / 40); id.push_back(obj.value[0] % 40); size_t i = 0; while(i != obj.value.size() - 1) { u32bit component = 0; while(i != obj.value.size() - 1) { ++i; component = (component << 7) + (obj.value[i] & 0x7F); if(!(obj.value[i] & 0x80)) break; } id.push_back(component); } } } Botan-1.10.12/src/asn1/asn1_oid.h0000664000175000017500000000411012654331322016057 0ustar jackjack00000000000000/* * ASN.1 OID * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ASN1_OID_H__ #define BOTAN_ASN1_OID_H__ #include #include #include namespace Botan { /** * This class represents ASN.1 object identifiers. */ class BOTAN_DLL OID : public ASN1_Object { public: void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); /** * Find out whether this OID is empty * @return true is no OID value is set */ bool is_empty() const { return id.size() == 0; } /** * Get this OID as list (vector) of its components. * @return vector representing this OID */ std::vector get_id() const { return id; } /** * Get this OID as a string * @return string representing this OID */ std::string as_string() const; /** * Compare two OIDs. * @return true if they are equal, false otherwise */ bool operator==(const OID&) const; /** * Reset this instance to an empty OID. */ void clear(); /** * Add a component to this OID. * @param new_comp the new component to add to the end of this OID * @return reference to *this */ OID& operator+=(u32bit new_comp); /** * Construct an OID from a string. * @param str a string in the form "a.b.c" etc., where a,b,c are numbers */ OID(const std::string& str = ""); private: std::vector id; }; /** * Append another component onto the OID. * @param oid the OID to add the new component to * @param new_comp the new component to add */ OID operator+(const OID& oid, u32bit new_comp); /** * Compare two OIDs. * @param a the first OID * @param b the second OID * @return true if a is not equal to b */ bool operator!=(const OID& a, const OID& b); /** * Compare two OIDs. * @param a the first OID * @param b the second OID * @return true if a is lexicographically smaller than b */ bool operator<(const OID& a, const OID& b); } #endif Botan-1.10.12/src/asn1/asn1_str.cpp0000664000175000017500000001057312654331322016461 0ustar jackjack00000000000000/* * Simple ASN.1 String Types * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace { /* * Choose an encoding for the string */ ASN1_Tag choose_encoding(const std::string& str, const std::string& type) { static const byte IS_PRINTABLE[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; for(size_t i = 0; i != str.size(); ++i) { if(!IS_PRINTABLE[static_cast(str[i])]) { if(type == "utf8") return UTF8_STRING; if(type == "latin1") return T61_STRING; throw Invalid_Argument("choose_encoding: Bad string type " + type); } } return PRINTABLE_STRING; } } /* * Create an ASN1_String */ ASN1_String::ASN1_String(const std::string& str, ASN1_Tag t) : tag(t) { iso_8859_str = Charset::transcode(str, LOCAL_CHARSET, LATIN1_CHARSET); if(tag == DIRECTORY_STRING) tag = choose_encoding(iso_8859_str, "latin1"); if(tag != NUMERIC_STRING && tag != PRINTABLE_STRING && tag != VISIBLE_STRING && tag != T61_STRING && tag != IA5_STRING && tag != UTF8_STRING && tag != BMP_STRING) throw Invalid_Argument("ASN1_String: Unknown string type " + to_string(tag)); } /* * Create an ASN1_String */ ASN1_String::ASN1_String(const std::string& str) { iso_8859_str = Charset::transcode(str, LOCAL_CHARSET, LATIN1_CHARSET); tag = choose_encoding(iso_8859_str, "latin1"); } /* * Return this string in ISO 8859-1 encoding */ std::string ASN1_String::iso_8859() const { return iso_8859_str; } /* * Return this string in local encoding */ std::string ASN1_String::value() const { return Charset::transcode(iso_8859_str, LATIN1_CHARSET, LOCAL_CHARSET); } /* * Return the type of this string object */ ASN1_Tag ASN1_String::tagging() const { return tag; } /* * DER encode an ASN1_String */ void ASN1_String::encode_into(DER_Encoder& encoder) const { std::string value = iso_8859(); if(tagging() == UTF8_STRING) value = Charset::transcode(value, LATIN1_CHARSET, UTF8_CHARSET); encoder.add_object(tagging(), UNIVERSAL, value); } /* * Decode a BER encoded ASN1_String */ void ASN1_String::decode_from(BER_Decoder& source) { BER_Object obj = source.get_next_object(); Character_Set charset_is; if(obj.type_tag == BMP_STRING) charset_is = UCS2_CHARSET; else if(obj.type_tag == UTF8_STRING) charset_is = UTF8_CHARSET; else charset_is = LATIN1_CHARSET; *this = ASN1_String( Charset::transcode(ASN1::to_string(obj), charset_is, LOCAL_CHARSET), obj.type_tag); } } Botan-1.10.12/src/asn1/asn1_str.h0000664000175000017500000000124412654331322016121 0ustar jackjack00000000000000/* * ASN.1 string type * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ASN1_STRING_H__ #define BOTAN_ASN1_STRING_H__ #include namespace Botan { /** * Simple String */ class BOTAN_DLL ASN1_String : public ASN1_Object { public: void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); std::string value() const; std::string iso_8859() const; ASN1_Tag tagging() const; ASN1_String(const std::string& = ""); ASN1_String(const std::string&, ASN1_Tag); private: std::string iso_8859_str; ASN1_Tag tag; }; } #endif Botan-1.10.12/src/asn1/asn1_tm.cpp0000664000175000017500000001666112654331322016275 0ustar jackjack00000000000000/* * X.509 Time Types * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { /* * Create an X509_Time */ X509_Time::X509_Time(const std::string& time_str) { set_to(time_str); } /* * Create an X509_Time */ X509_Time::X509_Time(u64bit timer) { calendar_point cal = calendar_value(timer); year = cal.year; month = cal.month; day = cal.day; hour = cal.hour; minute = cal.minutes; second = cal.seconds; tag = (year >= 2050) ? GENERALIZED_TIME : UTC_TIME; } /* * Create an X509_Time */ X509_Time::X509_Time(const std::string& t_spec, ASN1_Tag t) : tag(t) { set_to(t_spec, tag); } /* * Set the time with a human readable string */ void X509_Time::set_to(const std::string& time_str) { if(time_str == "") { year = month = day = hour = minute = second = 0; tag = NO_OBJECT; return; } std::vector params; std::string current; for(size_t j = 0; j != time_str.size(); ++j) { if(Charset::is_digit(time_str[j])) current += time_str[j]; else { if(current != "") params.push_back(current); current.clear(); } } if(current != "") params.push_back(current); if(params.size() < 3 || params.size() > 6) throw Invalid_Argument("Invalid time specification " + time_str); year = to_u32bit(params[0]); month = to_u32bit(params[1]); day = to_u32bit(params[2]); hour = (params.size() >= 4) ? to_u32bit(params[3]) : 0; minute = (params.size() >= 5) ? to_u32bit(params[4]) : 0; second = (params.size() == 6) ? to_u32bit(params[5]) : 0; tag = (year >= 2050) ? GENERALIZED_TIME : UTC_TIME; if(!passes_sanity_check()) throw Invalid_Argument("Invalid time specification " + time_str); } /* * Set the time with an ISO time format string */ void X509_Time::set_to(const std::string& t_spec, ASN1_Tag spec_tag) { if(spec_tag != GENERALIZED_TIME && spec_tag != UTC_TIME) throw Invalid_Argument("X509_Time: Invalid tag " + to_string(spec_tag)); if(spec_tag == GENERALIZED_TIME && t_spec.size() != 13 && t_spec.size() != 15) throw Invalid_Argument("Invalid GeneralizedTime: " + t_spec); if(spec_tag == UTC_TIME && t_spec.size() != 11 && t_spec.size() != 13) throw Invalid_Argument("Invalid UTCTime: " + t_spec); if(t_spec[t_spec.size()-1] != 'Z') throw Invalid_Argument("Invalid time encoding: " + t_spec); const size_t YEAR_SIZE = (spec_tag == UTC_TIME) ? 2 : 4; std::vector params; std::string current; for(size_t j = 0; j != YEAR_SIZE; ++j) current += t_spec[j]; params.push_back(current); current.clear(); for(size_t j = YEAR_SIZE; j != t_spec.size() - 1; ++j) { current += t_spec[j]; if(current.size() == 2) { params.push_back(current); current.clear(); } } year = to_u32bit(params[0]); month = to_u32bit(params[1]); day = to_u32bit(params[2]); hour = to_u32bit(params[3]); minute = to_u32bit(params[4]); second = (params.size() == 6) ? to_u32bit(params[5]) : 0; tag = spec_tag; if(spec_tag == UTC_TIME) { if(year >= 50) year += 1900; else year += 2000; } if(!passes_sanity_check()) throw Invalid_Argument("Invalid time specification " + t_spec); } /* * DER encode a X509_Time */ void X509_Time::encode_into(DER_Encoder& der) const { if(tag != GENERALIZED_TIME && tag != UTC_TIME) throw Invalid_Argument("X509_Time: Bad encoding tag"); der.add_object(tag, UNIVERSAL, Charset::transcode(as_string(), LOCAL_CHARSET, LATIN1_CHARSET)); } /* * Decode a BER encoded X509_Time */ void X509_Time::decode_from(BER_Decoder& source) { BER_Object ber_time = source.get_next_object(); set_to(Charset::transcode(ASN1::to_string(ber_time), LATIN1_CHARSET, LOCAL_CHARSET), ber_time.type_tag); } /* * Return a string representation of the time */ std::string X509_Time::as_string() const { if(time_is_set() == false) throw Invalid_State("X509_Time::as_string: No time set"); std::string asn1rep; if(tag == GENERALIZED_TIME) asn1rep = to_string(year, 4); else if(tag == UTC_TIME) { if(year < 1950 || year >= 2050) throw Encoding_Error("X509_Time: The time " + readable_string() + " cannot be encoded as a UTCTime"); u32bit asn1year = (year >= 2000) ? (year - 2000) : (year - 1900); asn1rep = to_string(asn1year, 2); } else throw Invalid_Argument("X509_Time: Invalid tag " + to_string(tag)); asn1rep += to_string(month, 2) + to_string(day, 2); asn1rep += to_string(hour, 2) + to_string(minute, 2) + to_string(second, 2); asn1rep += "Z"; return asn1rep; } /* * Return if the time has been set somehow */ bool X509_Time::time_is_set() const { return (year != 0); } /* * Return a human readable string representation */ std::string X509_Time::readable_string() const { if(time_is_set() == false) throw Invalid_State("X509_Time::readable_string: No time set"); std::string readable; readable += to_string(year, 4) + "/"; readable += to_string(month ) + "/"; readable += to_string(day ) + " "; readable += to_string(hour ) + ":"; readable += to_string(minute, 2) + ":"; readable += to_string(second, 2) + " UTC"; return readable; } /* * Do a general sanity check on the time */ bool X509_Time::passes_sanity_check() const { if(year < 1950 || year > 2100) return false; if(month == 0 || month > 12) return false; if(day == 0 || day > 31) return false; if(hour >= 24 || minute > 60 || second > 60) return false; return true; } /* * Compare this time against another */ s32bit X509_Time::cmp(const X509_Time& other) const { if(time_is_set() == false) throw Invalid_State("X509_Time::cmp: No time set"); const s32bit EARLIER = -1, LATER = 1, SAME_TIME = 0; if(year < other.year) return EARLIER; if(year > other.year) return LATER; if(month < other.month) return EARLIER; if(month > other.month) return LATER; if(day < other.day) return EARLIER; if(day > other.day) return LATER; if(hour < other.hour) return EARLIER; if(hour > other.hour) return LATER; if(minute < other.minute) return EARLIER; if(minute > other.minute) return LATER; if(second < other.second) return EARLIER; if(second > other.second) return LATER; return SAME_TIME; } /* * Compare two X509_Times for in various ways */ bool operator==(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) == 0); } bool operator!=(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) != 0); } bool operator<=(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) <= 0); } bool operator>=(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) >= 0); } bool operator<(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) < 0); } bool operator>(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) > 0); } } Botan-1.10.12/src/asn1/ber_dec.cpp0000664000175000017500000002526412654331322016315 0ustar jackjack00000000000000/* * BER Decoder * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * BER decode an ASN.1 type tag */ size_t decode_tag(DataSource* ber, ASN1_Tag& type_tag, ASN1_Tag& class_tag) { byte b; if(!ber->read_byte(b)) { class_tag = type_tag = NO_OBJECT; return 0; } if((b & 0x1F) != 0x1F) { type_tag = ASN1_Tag(b & 0x1F); class_tag = ASN1_Tag(b & 0xE0); return 1; } size_t tag_bytes = 1; class_tag = ASN1_Tag(b & 0xE0); size_t tag_buf = 0; while(true) { if(!ber->read_byte(b)) throw BER_Decoding_Error("Long-form tag truncated"); if(tag_buf & 0xFF000000) throw BER_Decoding_Error("Long-form tag overflowed 32 bits"); ++tag_bytes; tag_buf = (tag_buf << 7) | (b & 0x7F); if((b & 0x80) == 0) break; } type_tag = ASN1_Tag(tag_buf); return tag_bytes; } /* * Find the EOC marker */ size_t find_eoc(DataSource*); /* * BER decode an ASN.1 length field */ size_t decode_length(DataSource* ber, size_t& field_size) { byte b; if(!ber->read_byte(b)) throw BER_Decoding_Error("Length field not found"); field_size = 1; if((b & 0x80) == 0) return b; field_size += (b & 0x7F); if(field_size == 1) return find_eoc(ber); if(field_size > 5) throw BER_Decoding_Error("Length field is too large"); size_t length = 0; for(size_t i = 0; i != field_size - 1; ++i) { if(get_byte(0, length) != 0) throw BER_Decoding_Error("Field length overflow"); if(!ber->read_byte(b)) throw BER_Decoding_Error("Corrupted length field"); length = (length << 8) | b; } return length; } /* * BER decode an ASN.1 length field */ size_t decode_length(DataSource* ber) { size_t dummy; return decode_length(ber, dummy); } /* * Find the EOC marker */ size_t find_eoc(DataSource* ber) { SecureVector buffer(DEFAULT_BUFFERSIZE), data; while(true) { const size_t got = ber->peek(&buffer[0], buffer.size(), data.size()); if(got == 0) break; data += std::make_pair(&buffer[0], got); } DataSource_Memory source(data); data.clear(); size_t length = 0; while(true) { ASN1_Tag type_tag, class_tag; size_t tag_size = decode_tag(&source, type_tag, class_tag); if(type_tag == NO_OBJECT) break; size_t length_size = 0; size_t item_size = decode_length(&source, length_size); source.discard_next(item_size); length += item_size + length_size + tag_size; if(type_tag == EOC && class_tag == UNIVERSAL) break; } return length; } } /* * Check a type invariant on BER data */ void BER_Object::assert_is_a(ASN1_Tag type_tag, ASN1_Tag class_tag) { if(this->type_tag != type_tag || this->class_tag != class_tag) throw BER_Decoding_Error("Tag mismatch when decoding"); } /* * Check if more objects are there */ bool BER_Decoder::more_items() const { if(source->end_of_data() && (pushed.type_tag == NO_OBJECT)) return false; return true; } /* * Verify that no bytes remain in the source */ BER_Decoder& BER_Decoder::verify_end() { if(!source->end_of_data() || (pushed.type_tag != NO_OBJECT)) throw Invalid_State("BER_Decoder::verify_end called, but data remains"); return (*this); } /* * Save all the bytes remaining in the source */ BER_Decoder& BER_Decoder::raw_bytes(MemoryRegion& out) { out.clear(); byte buf; while(source->read_byte(buf)) out.push_back(buf); return (*this); } /* * Discard all the bytes remaining in the source */ BER_Decoder& BER_Decoder::discard_remaining() { byte buf; while(source->read_byte(buf)) ; return (*this); } /* * Return the BER encoding of the next object */ BER_Object BER_Decoder::get_next_object() { BER_Object next; if(pushed.type_tag != NO_OBJECT) { next = pushed; pushed.class_tag = pushed.type_tag = NO_OBJECT; return next; } decode_tag(source, next.type_tag, next.class_tag); if(next.type_tag == NO_OBJECT) return next; const size_t length = decode_length(source); if(!source->check_available(length)) throw BER_Decoding_Error("Value truncated"); next.value.resize(length); if(source->read(&next.value[0], length) != length) throw BER_Decoding_Error("Value truncated"); if(next.type_tag == EOC && next.class_tag == UNIVERSAL) return get_next_object(); return next; } /* * Push a object back into the stream */ void BER_Decoder::push_back(const BER_Object& obj) { if(pushed.type_tag != NO_OBJECT) throw Invalid_State("BER_Decoder: Only one push back is allowed"); pushed = obj; } /* * Begin decoding a CONSTRUCTED type */ BER_Decoder BER_Decoder::start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag) { BER_Object obj = get_next_object(); obj.assert_is_a(type_tag, ASN1_Tag(class_tag | CONSTRUCTED)); BER_Decoder result(&obj.value[0], obj.value.size()); result.parent = this; return result; } /* * Finish decoding a CONSTRUCTED type */ BER_Decoder& BER_Decoder::end_cons() { if(!parent) throw Invalid_State("BER_Decoder::end_cons called with NULL parent"); if(!source->end_of_data()) throw Decoding_Error("BER_Decoder::end_cons called with data left"); return (*parent); } /* * BER_Decoder Constructor */ BER_Decoder::BER_Decoder(DataSource& src) { source = &src; owns = false; pushed.type_tag = pushed.class_tag = NO_OBJECT; parent = 0; } /* * BER_Decoder Constructor */ BER_Decoder::BER_Decoder(const byte data[], size_t length) { source = new DataSource_Memory(data, length); owns = true; pushed.type_tag = pushed.class_tag = NO_OBJECT; parent = 0; } /* * BER_Decoder Constructor */ BER_Decoder::BER_Decoder(const MemoryRegion& data) { source = new DataSource_Memory(data); owns = true; pushed.type_tag = pushed.class_tag = NO_OBJECT; parent = 0; } /* * BER_Decoder Copy Constructor */ BER_Decoder::BER_Decoder(const BER_Decoder& other) { source = other.source; owns = false; if(other.owns) { other.owns = false; owns = true; } pushed.type_tag = pushed.class_tag = NO_OBJECT; parent = other.parent; } /* * BER_Decoder Destructor */ BER_Decoder::~BER_Decoder() { if(owns) delete source; source = 0; } /* * Request for an object to decode itself */ BER_Decoder& BER_Decoder::decode(ASN1_Object& obj) { obj.decode_from(*this); return (*this); } /* * Decode a BER encoded NULL */ BER_Decoder& BER_Decoder::decode_null() { BER_Object obj = get_next_object(); obj.assert_is_a(NULL_TAG, UNIVERSAL); if(obj.value.size()) throw BER_Decoding_Error("NULL object had nonzero size"); return (*this); } /* * Decode a BER encoded BOOLEAN */ BER_Decoder& BER_Decoder::decode(bool& out) { return decode(out, BOOLEAN, UNIVERSAL); } /* * Decode a small BER encoded INTEGER */ BER_Decoder& BER_Decoder::decode(size_t& out) { return decode(out, INTEGER, UNIVERSAL); } /* * Decode a BER encoded INTEGER */ BER_Decoder& BER_Decoder::decode(BigInt& out) { return decode(out, INTEGER, UNIVERSAL); } BER_Decoder& BER_Decoder::decode_octet_string_bigint(BigInt& out) { SecureVector out_vec; decode(out_vec, OCTET_STRING); out = BigInt::decode(&out_vec[0], out_vec.size()); return (*this); } /* * Decode a BER encoded BOOLEAN */ BER_Decoder& BER_Decoder::decode(bool& out, ASN1_Tag type_tag, ASN1_Tag class_tag) { BER_Object obj = get_next_object(); obj.assert_is_a(type_tag, class_tag); if(obj.value.size() != 1) throw BER_Decoding_Error("BER boolean value had invalid size"); out = (obj.value[0]) ? true : false; return (*this); } /* * Decode a small BER encoded INTEGER */ BER_Decoder& BER_Decoder::decode(size_t& out, ASN1_Tag type_tag, ASN1_Tag class_tag) { BigInt integer; decode(integer, type_tag, class_tag); if(integer.bits() > 32) throw BER_Decoding_Error("Decoded integer value larger than expected"); out = 0; for(size_t i = 0; i != 4; ++i) out = (out << 8) | integer.byte_at(3-i); return (*this); } /* * Decode a BER encoded INTEGER */ BER_Decoder& BER_Decoder::decode(BigInt& out, ASN1_Tag type_tag, ASN1_Tag class_tag) { BER_Object obj = get_next_object(); obj.assert_is_a(type_tag, class_tag); if(obj.value.empty()) out = 0; else { const bool negative = (obj.value[0] & 0x80) ? true : false; if(negative) { for(size_t i = obj.value.size(); i > 0; --i) if(obj.value[i-1]--) break; for(size_t i = 0; i != obj.value.size(); ++i) obj.value[i] = ~obj.value[i]; } out = BigInt(&obj.value[0], obj.value.size()); if(negative) out.flip_sign(); } return (*this); } /* * BER decode a BIT STRING or OCTET STRING */ BER_Decoder& BER_Decoder::decode(MemoryRegion& out, ASN1_Tag real_type) { return decode(out, real_type, real_type, UNIVERSAL); } /* * BER decode a BIT STRING or OCTET STRING */ BER_Decoder& BER_Decoder::decode(MemoryRegion& buffer, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag) { if(real_type != OCTET_STRING && real_type != BIT_STRING) throw BER_Bad_Tag("Bad tag for {BIT,OCTET} STRING", real_type); BER_Object obj = get_next_object(); obj.assert_is_a(type_tag, class_tag); if(real_type == OCTET_STRING) buffer = obj.value; else { if(obj.value.empty()) throw BER_Decoding_Error("Invalid BIT STRING"); if(obj.value[0] >= 8) throw BER_Decoding_Error("Bad number of unused bits in BIT STRING"); buffer.resize(obj.value.size() - 1); copy_mem(&buffer[0], &obj.value[1], obj.value.size() - 1); } return (*this); } /* * Decode an OPTIONAL string type */ BER_Decoder& BER_Decoder::decode_optional_string(MemoryRegion& out, ASN1_Tag real_type, u16bit type_no) { BER_Object obj = get_next_object(); ASN1_Tag type_tag = static_cast(type_no); out.clear(); push_back(obj); if(obj.type_tag == type_tag && obj.class_tag == CONTEXT_SPECIFIC) decode(out, real_type, type_tag, CONTEXT_SPECIFIC); return (*this); } } Botan-1.10.12/src/asn1/ber_dec.h0000664000175000017500000000702312654331322015753 0ustar jackjack00000000000000/* * BER Decoder * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BER_DECODER_H__ #define BOTAN_BER_DECODER_H__ #include #include namespace Botan { /** * BER Decoding Object */ class BOTAN_DLL BER_Decoder { public: BER_Object get_next_object(); void push_back(const BER_Object&); bool more_items() const; BER_Decoder& verify_end(); BER_Decoder& discard_remaining(); BER_Decoder start_cons(ASN1_Tag, ASN1_Tag = UNIVERSAL); BER_Decoder& end_cons(); BER_Decoder& raw_bytes(MemoryRegion&); BER_Decoder& decode_null(); BER_Decoder& decode(bool&); BER_Decoder& decode(size_t&); BER_Decoder& decode(class BigInt&); BER_Decoder& decode(MemoryRegion&, ASN1_Tag); BER_Decoder& decode(bool&, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); BER_Decoder& decode(size_t&, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); BER_Decoder& decode(class BigInt&, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); BER_Decoder& decode(MemoryRegion&, ASN1_Tag, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC); BER_Decoder& decode(class ASN1_Object&); BER_Decoder& decode_octet_string_bigint(class BigInt&); template BER_Decoder& decode_optional(T& out, ASN1_Tag type_tag, ASN1_Tag class_tag, const T& default_value = T()); template BER_Decoder& decode_list(std::vector& out, bool clear_out = true); template BER_Decoder& decode_and_check(const T& expected, const std::string& error_msg) { T actual; decode(actual); if(actual != expected) throw Decoding_Error(error_msg); return (*this); } BER_Decoder& decode_optional_string(MemoryRegion&, ASN1_Tag, u16bit); BER_Decoder(DataSource&); BER_Decoder(const byte[], size_t); BER_Decoder(const MemoryRegion&); BER_Decoder(const BER_Decoder&); ~BER_Decoder(); private: BER_Decoder& operator=(const BER_Decoder&) { return (*this); } BER_Decoder* parent; DataSource* source; BER_Object pushed; mutable bool owns; }; /* * Decode an OPTIONAL or DEFAULT element */ template BER_Decoder& BER_Decoder::decode_optional(T& out, ASN1_Tag type_tag, ASN1_Tag class_tag, const T& default_value) { BER_Object obj = get_next_object(); if(obj.type_tag == type_tag && obj.class_tag == class_tag) { if(class_tag & CONSTRUCTED) BER_Decoder(obj.value).decode(out).verify_end(); else { push_back(obj); decode(out, type_tag, class_tag); } } else { out = default_value; push_back(obj); } return (*this); } /* * Decode a list of homogenously typed values */ template BER_Decoder& BER_Decoder::decode_list(std::vector& vec, bool clear_it) { if(clear_it) vec.clear(); while(more_items()) { T value; decode(value); vec.push_back(value); } return (*this); } } #endif Botan-1.10.12/src/asn1/der_enc.cpp0000664000175000017500000002223412654331322016323 0ustar jackjack00000000000000/* * DER Encoder * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { /* * DER encode an ASN.1 type tag */ SecureVector encode_tag(ASN1_Tag type_tag, ASN1_Tag class_tag) { if((class_tag | 0xE0) != 0xE0) throw Encoding_Error("DER_Encoder: Invalid class tag " + to_string(class_tag)); SecureVector encoded_tag; if(type_tag <= 30) encoded_tag.push_back(static_cast(type_tag | class_tag)); else { size_t blocks = high_bit(type_tag) + 6; blocks = (blocks - (blocks % 7)) / 7; encoded_tag.push_back(class_tag | 0x1F); for(size_t i = 0; i != blocks - 1; ++i) encoded_tag.push_back(0x80 | ((type_tag >> 7*(blocks-i-1)) & 0x7F)); encoded_tag.push_back(type_tag & 0x7F); } return encoded_tag; } /* * DER encode an ASN.1 length field */ SecureVector encode_length(size_t length) { SecureVector encoded_length; if(length <= 127) encoded_length.push_back(static_cast(length)); else { const size_t top_byte = significant_bytes(length); encoded_length.push_back(static_cast(0x80 | top_byte)); for(size_t i = sizeof(length) - top_byte; i != sizeof(length); ++i) encoded_length.push_back(get_byte(i, length)); } return encoded_length; } } /* * Return the encoded SEQUENCE/SET */ SecureVector DER_Encoder::DER_Sequence::get_contents() { const ASN1_Tag real_class_tag = ASN1_Tag(class_tag | CONSTRUCTED); if(type_tag == SET) { std::sort(set_contents.begin(), set_contents.end()); for(size_t i = 0; i != set_contents.size(); ++i) contents += set_contents[i]; set_contents.clear(); } SecureVector result; result += encode_tag(type_tag, real_class_tag); result += encode_length(contents.size()); result += contents; contents.clear(); return result; } /* * Add an encoded value to the SEQUENCE/SET */ void DER_Encoder::DER_Sequence::add_bytes(const byte data[], size_t length) { if(type_tag == SET) set_contents.push_back(SecureVector(data, length)); else contents += std::make_pair(data, length); } /* * Return the type and class taggings */ ASN1_Tag DER_Encoder::DER_Sequence::tag_of() const { return ASN1_Tag(type_tag | class_tag); } /* * DER_Sequence Constructor */ DER_Encoder::DER_Sequence::DER_Sequence(ASN1_Tag t1, ASN1_Tag t2) : type_tag(t1), class_tag(t2) { } /* * Return the encoded contents */ SecureVector DER_Encoder::get_contents() { if(subsequences.size() != 0) throw Invalid_State("DER_Encoder: Sequence hasn't been marked done"); SecureVector output; std::swap(output, contents); return output; } /* * Start a new ASN.1 SEQUENCE/SET/EXPLICIT */ DER_Encoder& DER_Encoder::start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag) { subsequences.push_back(DER_Sequence(type_tag, class_tag)); return (*this); } /* * Finish the current ASN.1 SEQUENCE/SET/EXPLICIT */ DER_Encoder& DER_Encoder::end_cons() { if(subsequences.empty()) throw Invalid_State("DER_Encoder::end_cons: No such sequence"); SecureVector seq = subsequences[subsequences.size()-1].get_contents(); subsequences.pop_back(); raw_bytes(seq); return (*this); } /* * Start a new ASN.1 EXPLICIT encoding */ DER_Encoder& DER_Encoder::start_explicit(u16bit type_no) { ASN1_Tag type_tag = static_cast(type_no); if(type_tag == SET) throw Internal_Error("DER_Encoder.start_explicit(SET); cannot perform"); return start_cons(type_tag, CONTEXT_SPECIFIC); } /* * Finish the current ASN.1 EXPLICIT encoding */ DER_Encoder& DER_Encoder::end_explicit() { return end_cons(); } /* * Write raw bytes into the stream */ DER_Encoder& DER_Encoder::raw_bytes(const MemoryRegion& val) { return raw_bytes(&val[0], val.size()); } /* * Write raw bytes into the stream */ DER_Encoder& DER_Encoder::raw_bytes(const byte bytes[], size_t length) { if(subsequences.size()) subsequences[subsequences.size()-1].add_bytes(bytes, length); else contents += std::make_pair(bytes, length); return (*this); } /* * Encode a NULL object */ DER_Encoder& DER_Encoder::encode_null() { return add_object(NULL_TAG, UNIVERSAL, 0, 0); } /* * DER encode a BOOLEAN */ DER_Encoder& DER_Encoder::encode(bool is_true) { return encode(is_true, BOOLEAN, UNIVERSAL); } /* * DER encode a small INTEGER */ DER_Encoder& DER_Encoder::encode(size_t n) { return encode(BigInt(n), INTEGER, UNIVERSAL); } /* * DER encode a small INTEGER */ DER_Encoder& DER_Encoder::encode(const BigInt& n) { return encode(n, INTEGER, UNIVERSAL); } /* * DER encode an OCTET STRING or BIT STRING */ DER_Encoder& DER_Encoder::encode(const MemoryRegion& bytes, ASN1_Tag real_type) { return encode(&bytes[0], bytes.size(), real_type, real_type, UNIVERSAL); } /* * Encode this object */ DER_Encoder& DER_Encoder::encode(const byte bytes[], size_t length, ASN1_Tag real_type) { return encode(bytes, length, real_type, real_type, UNIVERSAL); } /* * DER encode a BOOLEAN */ DER_Encoder& DER_Encoder::encode(bool is_true, ASN1_Tag type_tag, ASN1_Tag class_tag) { byte val = is_true ? 0xFF : 0x00; return add_object(type_tag, class_tag, &val, 1); } /* * DER encode a small INTEGER */ DER_Encoder& DER_Encoder::encode(size_t n, ASN1_Tag type_tag, ASN1_Tag class_tag) { return encode(BigInt(n), type_tag, class_tag); } /* * DER encode an INTEGER */ DER_Encoder& DER_Encoder::encode(const BigInt& n, ASN1_Tag type_tag, ASN1_Tag class_tag) { if(n == 0) return add_object(type_tag, class_tag, 0); bool extra_zero = (n.bits() % 8 == 0); SecureVector contents(extra_zero + n.bytes()); BigInt::encode(&contents[extra_zero], n); if(n < 0) { for(size_t i = 0; i != contents.size(); ++i) contents[i] = ~contents[i]; for(size_t i = contents.size(); i > 0; --i) if(++contents[i-1]) break; } return add_object(type_tag, class_tag, contents); } /* * DER encode an OCTET STRING or BIT STRING */ DER_Encoder& DER_Encoder::encode(const MemoryRegion& bytes, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag) { return encode(&bytes[0], bytes.size(), real_type, type_tag, class_tag); } /* * DER encode an OCTET STRING or BIT STRING */ DER_Encoder& DER_Encoder::encode(const byte bytes[], size_t length, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag) { if(real_type != OCTET_STRING && real_type != BIT_STRING) throw Invalid_Argument("DER_Encoder: Invalid tag for byte/bit string"); if(real_type == BIT_STRING) { SecureVector encoded; encoded.push_back(0); encoded += std::make_pair(bytes, length); return add_object(type_tag, class_tag, encoded); } else return add_object(type_tag, class_tag, bytes, length); } /* * Conditionally write some values to the stream */ DER_Encoder& DER_Encoder::encode_if(bool cond, DER_Encoder& codec) { if(cond) return raw_bytes(codec.get_contents()); return (*this); } /* * Request for an object to encode itself */ DER_Encoder& DER_Encoder::encode(const ASN1_Object& obj) { obj.encode_into(*this); return (*this); } /* * Write the encoding of the byte(s) */ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const byte rep[], size_t length) { SecureVector buffer; buffer += encode_tag(type_tag, class_tag); buffer += encode_length(length); buffer += std::make_pair(rep, length); return raw_bytes(buffer); } /* * Write the encoding of the byte(s) */ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const MemoryRegion& rep_buf) { const byte* rep = &rep_buf[0]; const size_t rep_len = rep_buf.size(); return add_object(type_tag, class_tag, rep, rep_len); } /* * Write the encoding of the byte(s) */ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const std::string& rep_str) { const byte* rep = reinterpret_cast(rep_str.data()); const size_t rep_len = rep_str.size(); return add_object(type_tag, class_tag, rep, rep_len); } /* * Write the encoding of the byte */ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, byte rep) { return add_object(type_tag, class_tag, &rep, 1); } } Botan-1.10.12/src/asn1/der_enc.h0000664000175000017500000000662712654331322016000 0ustar jackjack00000000000000/* * DER Encoder * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DER_ENCODER_H__ #define BOTAN_DER_ENCODER_H__ #include #include namespace Botan { class BigInt; class ASN1_Object; /** * General DER Encoding Object */ class BOTAN_DLL DER_Encoder { public: SecureVector get_contents(); DER_Encoder& start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag = UNIVERSAL); DER_Encoder& end_cons(); DER_Encoder& start_explicit(u16bit type_tag); DER_Encoder& end_explicit(); DER_Encoder& raw_bytes(const byte val[], size_t len); DER_Encoder& raw_bytes(const MemoryRegion& val); DER_Encoder& encode_null(); DER_Encoder& encode(bool b); DER_Encoder& encode(size_t s); DER_Encoder& encode(const BigInt& n); DER_Encoder& encode(const MemoryRegion& v, ASN1_Tag real_type); DER_Encoder& encode(const byte val[], size_t len, ASN1_Tag real_type); DER_Encoder& encode(bool b, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); DER_Encoder& encode(size_t s, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); DER_Encoder& encode(const BigInt& n, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); DER_Encoder& encode(const MemoryRegion& v, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); DER_Encoder& encode(const byte v[], size_t len, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); template DER_Encoder& encode_optional(const T& value, const T& default_value) { if(value != default_value) encode(value); return (*this); } template DER_Encoder& encode_list(const std::vector& values) { for(size_t i = 0; i != values.size(); ++i) encode(values[i]); return (*this); } DER_Encoder& encode(const ASN1_Object& obj); DER_Encoder& encode_if(bool pred, DER_Encoder& enc); DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const byte rep[], size_t length); DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const MemoryRegion& rep); DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const std::string& str); DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, byte val); private: class DER_Sequence { public: ASN1_Tag tag_of() const; SecureVector get_contents(); void add_bytes(const byte[], size_t); DER_Sequence(ASN1_Tag, ASN1_Tag); private: ASN1_Tag type_tag, class_tag; SecureVector contents; std::vector< SecureVector > set_contents; }; SecureVector contents; std::vector subsequences; }; } #endif Botan-1.10.12/src/asn1/info.txt0000664000175000017500000000052712654331322015715 0ustar jackjack00000000000000define ASN1 load_on auto alg_id.cpp asn1_alt.cpp asn1_att.cpp asn1_int.cpp asn1_oid.cpp asn1_str.cpp asn1_tm.cpp ber_dec.cpp der_enc.cpp x509_dn.cpp alg_id.h asn1_int.h asn1_obj.h asn1_oid.h asn1_str.h ber_dec.h der_enc.h x509_dn.h alloc bigint filters oid_lookup Botan-1.10.12/src/asn1/x509_dn.cpp0000664000175000017500000001654612654331322016123 0ustar jackjack00000000000000/* * X509_DN * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { /* * Create an empty X509_DN */ X509_DN::X509_DN() { } /* * Create an X509_DN */ X509_DN::X509_DN(const std::multimap& args) { std::multimap::const_iterator j; for(j = args.begin(); j != args.end(); ++j) add_attribute(j->first, j->second); } /* * Create an X509_DN */ X509_DN::X509_DN(const std::multimap& args) { std::multimap::const_iterator j; for(j = args.begin(); j != args.end(); ++j) add_attribute(OIDS::lookup(j->first), j->second); } /* * Add an attribute to a X509_DN */ void X509_DN::add_attribute(const std::string& type, const std::string& str) { OID oid = OIDS::lookup(type); add_attribute(oid, str); } /* * Add an attribute to a X509_DN */ void X509_DN::add_attribute(const OID& oid, const std::string& str) { if(str == "") return; typedef std::multimap::iterator rdn_iter; std::pair range = dn_info.equal_range(oid); for(rdn_iter j = range.first; j != range.second; ++j) if(j->second.value() == str) return; multimap_insert(dn_info, oid, ASN1_String(str)); dn_bits.clear(); } /* * Get the attributes of this X509_DN */ std::multimap X509_DN::get_attributes() const { typedef std::multimap::const_iterator rdn_iter; std::multimap retval; for(rdn_iter j = dn_info.begin(); j != dn_info.end(); ++j) multimap_insert(retval, j->first, j->second.value()); return retval; } /* * Get the contents of this X.500 Name */ std::multimap X509_DN::contents() const { typedef std::multimap::const_iterator rdn_iter; std::multimap retval; for(rdn_iter j = dn_info.begin(); j != dn_info.end(); ++j) multimap_insert(retval, OIDS::lookup(j->first), j->second.value()); return retval; } /* * Get a single attribute type */ std::vector X509_DN::get_attribute(const std::string& attr) const { typedef std::multimap::const_iterator rdn_iter; const OID oid = OIDS::lookup(deref_info_field(attr)); std::pair range = dn_info.equal_range(oid); std::vector values; for(rdn_iter j = range.first; j != range.second; ++j) values.push_back(j->second.value()); return values; } /* * Return the BER encoded data, if any */ MemoryVector X509_DN::get_bits() const { return dn_bits; } /* * Deref aliases in a subject/issuer info request */ std::string X509_DN::deref_info_field(const std::string& info) { if(info == "Name" || info == "CommonName") return "X520.CommonName"; if(info == "SerialNumber") return "X520.SerialNumber"; if(info == "Country") return "X520.Country"; if(info == "Organization") return "X520.Organization"; if(info == "Organizational Unit" || info == "OrgUnit") return "X520.OrganizationalUnit"; if(info == "Locality") return "X520.Locality"; if(info == "State" || info == "Province") return "X520.State"; if(info == "Email") return "RFC822"; return info; } /* * Compare two X509_DNs for equality */ bool operator==(const X509_DN& dn1, const X509_DN& dn2) { typedef std::multimap::const_iterator rdn_iter; std::multimap attr1 = dn1.get_attributes(); std::multimap attr2 = dn2.get_attributes(); if(attr1.size() != attr2.size()) return false; rdn_iter p1 = attr1.begin(); rdn_iter p2 = attr2.begin(); while(true) { if(p1 == attr1.end() && p2 == attr2.end()) break; if(p1 == attr1.end()) return false; if(p2 == attr2.end()) return false; if(p1->first != p2->first) return false; if(!x500_name_cmp(p1->second, p2->second)) return false; ++p1; ++p2; } return true; } /* * Compare two X509_DNs for inequality */ bool operator!=(const X509_DN& dn1, const X509_DN& dn2) { return !(dn1 == dn2); } /* * Compare two X509_DNs */ bool operator<(const X509_DN& dn1, const X509_DN& dn2) { typedef std::multimap::const_iterator rdn_iter; std::multimap attr1 = dn1.get_attributes(); std::multimap attr2 = dn2.get_attributes(); if(attr1.size() < attr2.size()) return true; if(attr1.size() > attr2.size()) return false; for(rdn_iter p1 = attr1.begin(); p1 != attr1.end(); ++p1) { std::multimap::const_iterator p2; p2 = attr2.find(p1->first); if(p2 == attr2.end()) return false; if(p1->second > p2->second) return false; if(p1->second < p2->second) return true; } return false; } namespace { /* * DER encode a RelativeDistinguishedName */ void do_ava(DER_Encoder& encoder, const std::multimap& dn_info, ASN1_Tag string_type, const std::string& oid_str, bool must_exist = false) { typedef std::multimap::const_iterator rdn_iter; const OID oid = OIDS::lookup(oid_str); const bool exists = (dn_info.find(oid) != dn_info.end()); if(!exists && must_exist) throw Encoding_Error("X509_DN: No entry for " + oid_str); if(!exists) return; std::pair range = dn_info.equal_range(oid); for(rdn_iter j = range.first; j != range.second; ++j) { encoder.start_cons(SET) .start_cons(SEQUENCE) .encode(oid) .encode(ASN1_String(j->second, string_type)) .end_cons() .end_cons(); } } } /* * DER encode a DistinguishedName */ void X509_DN::encode_into(DER_Encoder& der) const { std::multimap dn_info = get_attributes(); der.start_cons(SEQUENCE); if(!dn_bits.empty()) der.raw_bytes(dn_bits); else { do_ava(der, dn_info, PRINTABLE_STRING, "X520.Country"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.State"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.Locality"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.Organization"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.OrganizationalUnit"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.CommonName"); do_ava(der, dn_info, PRINTABLE_STRING, "X520.SerialNumber"); } der.end_cons(); } /* * Decode a BER encoded DistinguishedName */ void X509_DN::decode_from(BER_Decoder& source) { MemoryVector bits; source.start_cons(SEQUENCE) .raw_bytes(bits) .end_cons(); BER_Decoder sequence(bits); while(sequence.more_items()) { BER_Decoder rdn = sequence.start_cons(SET); while(rdn.more_items()) { OID oid; ASN1_String str; rdn.start_cons(SEQUENCE) .decode(oid) .decode(str) .verify_end() .end_cons(); add_attribute(oid, str.value()); } } dn_bits = bits; } } Botan-1.10.12/src/asn1/x509_dn.h0000664000175000017500000000245512654331322015562 0ustar jackjack00000000000000/* * X.509 Distinguished Name * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X509_DN_H__ #define BOTAN_X509_DN_H__ #include #include #include #include namespace Botan { /** * Distinguished Name */ class BOTAN_DLL X509_DN : public ASN1_Object { public: void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); std::multimap get_attributes() const; std::vector get_attribute(const std::string&) const; std::multimap contents() const; void add_attribute(const std::string&, const std::string&); void add_attribute(const OID&, const std::string&); static std::string deref_info_field(const std::string&); MemoryVector get_bits() const; X509_DN(); X509_DN(const std::multimap&); X509_DN(const std::multimap&); private: std::multimap dn_info; MemoryVector dn_bits; }; bool BOTAN_DLL operator==(const X509_DN&, const X509_DN&); bool BOTAN_DLL operator!=(const X509_DN&, const X509_DN&); bool BOTAN_DLL operator<(const X509_DN&, const X509_DN&); } #endif Botan-1.10.12/src/benchmark/benchmark.cpp0000664000175000017500000001233512654331322017747 0ustar jackjack00000000000000/* * Runtime benchmarking * (C) 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include namespace Botan { namespace { /** * Benchmark Buffered_Computation (hash or MAC) */ std::pair bench_buf_comp(Buffered_Computation* buf_comp, u64bit nanoseconds_max, const byte buf[], size_t buf_len) { u64bit reps = 0; u64bit nanoseconds_used = 0; while(nanoseconds_used < nanoseconds_max) { const u64bit start = get_nanoseconds_clock(); buf_comp->update(buf, buf_len); nanoseconds_used += get_nanoseconds_clock() - start; ++reps; } return std::make_pair(reps * buf_len, nanoseconds_used); } /** * Benchmark block cipher */ std::pair bench_block_cipher(BlockCipher* block_cipher, u64bit nanoseconds_max, byte buf[], size_t buf_len) { const size_t in_blocks = buf_len / block_cipher->block_size(); u64bit reps = 0; u64bit nanoseconds_used = 0; block_cipher->set_key(buf, block_cipher->maximum_keylength()); while(nanoseconds_used < nanoseconds_max) { const u64bit start = get_nanoseconds_clock(); block_cipher->encrypt_n(buf, buf, in_blocks); nanoseconds_used += get_nanoseconds_clock() - start; ++reps; } return std::make_pair(reps * in_blocks * block_cipher->block_size(), nanoseconds_used); } /** * Benchmark stream */ std::pair bench_stream_cipher(StreamCipher* stream_cipher, u64bit nanoseconds_max, byte buf[], size_t buf_len) { u64bit reps = 0; u64bit nanoseconds_used = 0; stream_cipher->set_key(buf, stream_cipher->maximum_keylength()); while(nanoseconds_used < nanoseconds_max) { const u64bit start = get_nanoseconds_clock(); stream_cipher->cipher1(buf, buf_len); nanoseconds_used += get_nanoseconds_clock() - start; ++reps; } return std::make_pair(reps * buf_len, nanoseconds_used); } /** * Benchmark hash */ std::pair bench_hash(HashFunction* hash, u64bit nanoseconds_max, const byte buf[], size_t buf_len) { return bench_buf_comp(hash, nanoseconds_max, buf, buf_len); } /** * Benchmark MAC */ std::pair bench_mac(MessageAuthenticationCode* mac, u64bit nanoseconds_max, const byte buf[], size_t buf_len) { mac->set_key(buf, mac->maximum_keylength()); return bench_buf_comp(mac, nanoseconds_max, buf, buf_len); } } std::map algorithm_benchmark(const std::string& name, Algorithm_Factory& af, RandomNumberGenerator& rng, u32bit milliseconds, size_t buf_size) { std::vector providers = af.providers_of(name); std::map all_results; if(providers.empty()) // no providers, nothing to do return all_results; const u64bit ns_per_provider = (static_cast(milliseconds) * 1000 * 1000) / providers.size(); std::vector buf(buf_size * 1024); rng.randomize(&buf[0], buf.size()); for(size_t i = 0; i != providers.size(); ++i) { const std::string provider = providers[i]; std::pair results(0, 0); if(const BlockCipher* proto = af.prototype_block_cipher(name, provider)) { std::auto_ptr block_cipher(proto->clone()); results = bench_block_cipher(block_cipher.get(), ns_per_provider, &buf[0], buf.size()); } else if(const StreamCipher* proto = af.prototype_stream_cipher(name, provider)) { std::auto_ptr stream_cipher(proto->clone()); results = bench_stream_cipher(stream_cipher.get(), ns_per_provider, &buf[0], buf.size()); } else if(const HashFunction* proto = af.prototype_hash_function(name, provider)) { std::auto_ptr hash(proto->clone()); results = bench_hash(hash.get(), ns_per_provider, &buf[0], buf.size()); } else if(const MessageAuthenticationCode* proto = af.prototype_mac(name, provider)) { std::auto_ptr mac(proto->clone()); results = bench_mac(mac.get(), ns_per_provider, &buf[0], buf.size()); } if(results.first && results.second) { /* 953.67 == 1000 * 1000 * 1000 / 1024 / 1024 - the conversion factor from bytes per nanosecond to mebibytes per second. */ double speed = (953.67 * results.first) / results.second; all_results[provider] = speed; } } return all_results; } } Botan-1.10.12/src/benchmark/benchmark.h0000664000175000017500000000174212654331322017414 0ustar jackjack00000000000000/* * Runtime benchmarking * (C) 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RUNTIME_BENCHMARK_H__ #define BOTAN_RUNTIME_BENCHMARK_H__ #include #include #include #include namespace Botan { /** * Algorithm benchmark * @param name the name of the algorithm to test (cipher, hash, or MAC) * @param af the algorithm factory used to create objects * @param rng the rng to use to generate random inputs * @param milliseconds total time for the benchmark to run * @param buf_size size of buffer to benchmark against, in KiB * @return results a map from provider to speed in mebibytes per second */ std::map BOTAN_DLL algorithm_benchmark(const std::string& name, Algorithm_Factory& af, RandomNumberGenerator& rng, u32bit milliseconds, size_t buf_size); } #endif Botan-1.10.12/src/benchmark/info.txt0000664000175000017500000000014512654331322017001 0ustar jackjack00000000000000define RUNTIME_BENCHMARKING algo_factory block algo_base hash mac rng stream Botan-1.10.12/src/block/aes/aes.cpp0000664000175000017500000011757112654331322016505 0ustar jackjack00000000000000/* * AES * (C) 1999-2010 Jack Lloyd * * Based on the public domain reference implemenation * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { const byte SE[256] = { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 }; const byte SD[256] = { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D }; const u32bit TE[1024] = { 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, 0xDE6F6FB1, 0x91C5C554, 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A, 0x8FCACA45, 0x1F82829D, 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B, 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, 0xE4727296, 0x9BC0C05B, 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F, 0x6834345C, 0x51A5A5F4, 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F, 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, 0x0A05050F, 0x2F9A9AB5, 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F, 0x1209091B, 0x1D83839E, 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB, 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, 0x5E2F2F71, 0x13848497, 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED, 0xD46A6ABE, 0x8DCBCB46, 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A, 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, 0x66333355, 0x11858594, 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3, 0xA25151F3, 0x5DA3A3FE, 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504, 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, 0xFDF3F30E, 0xBFD2D26D, 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739, 0x93C4C457, 0x55A7A7F2, 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395, 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, 0x3B9090AB, 0x0B888883, 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76, 0xDBE0E03B, 0x64323256, 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4, 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, 0xD3E4E437, 0xF279798B, 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0, 0xD86C6CB4, 0xAC5656FA, 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818, 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, 0x73B4B4C7, 0x97C6C651, 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85, 0xE0707090, 0x7C3E3E42, 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12, 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, 0x3A1D1D27, 0x279E9EB9, 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7, 0x2D9B9BB6, 0x3C1E1E22, 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A, 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, 0x844242C6, 0xD06868B8, 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A, 0xA5C66363, 0x84F87C7C, 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5, 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, 0xE64DABAB, 0x9AEC7676, 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0, 0xEC41ADAD, 0x67B3D4D4, 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0, 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, 0x02F5F7F7, 0x4F83CCCC, 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515, 0x0C080404, 0x5295C7C7, 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A, 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, 0xCD7FB2B2, 0x9FEA7575, 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0, 0xF6A45252, 0x4D763B3B, 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484, 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, 0xC879B1B1, 0xEDB65B5B, 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF, 0x6BBBD0D0, 0x2AC5EFEF, 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585, 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, 0xBA259F9F, 0xE34BA8A8, 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5, 0xDF63BCBC, 0xC177B6B6, 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2, 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, 0xCC884444, 0x392E1717, 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373, 0xA0C06060, 0x98198181, 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888, 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, 0x1D160B0B, 0x76ADDBDB, 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C, 0x5D9FC2C2, 0x6EBDD3D3, 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979, 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, 0xD29C4E4E, 0xE049A9A9, 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808, 0xD56FBABA, 0x88F07878, 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6, 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, 0x860D8B8B, 0x850F8A8A, 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E, 0xA3C26161, 0x5F6A3535, 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E, 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, 0x89078E8E, 0xA7339494, 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF, 0x8F038C8C, 0xF859A1A1, 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868, 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, 0xD66DBBBB, 0x3A2C1616, 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5, 0x30506030, 0x01030201, 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76, 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, 0x47C98E47, 0xF00BFBF0, 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0, 0xB7C275B7, 0xFD1CE1FD, 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC, 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, 0x31536231, 0x153F2A15, 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A, 0x07090E07, 0x12362412, 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75, 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, 0x5AEEB45A, 0xA0FB5BA0, 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384, 0x53F5A653, 0xD168B9D1, 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B, 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, 0x58E8B058, 0xCF4A85CF, 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185, 0x45CF8A45, 0xF910E9F9, 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8, 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, 0x38487038, 0xF504F1F5, 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2, 0xCD4C81CD, 0x0C14180C, 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17, 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, 0x192B3219, 0x7395E673, 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88, 0x46CA8C46, 0xEE29C7EE, 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB, 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, 0x246C4824, 0x5CE4B85C, 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279, 0xE732D5E7, 0xC8438BC8, 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9, 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, 0xAEE947AE, 0x08181008, 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6, 0xE823CBE8, 0xDD7CA1DD, 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A, 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, 0xF601F7F6, 0x0E121C0E, 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E, 0xE138D9E1, 0xF813EBF8, 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394, 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, 0x28785028, 0xDF7AA5DF, 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068, 0x41C38241, 0x99B02999, 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16, 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C }; const u32bit TD[1024] = { 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, 0x1F9D45F1, 0xACFA58AB, 0x4BE30393, 0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F, 0xDEB15A49, 0x25BA1B67, 0x45EA0E98, 0x5DFEC0E1, 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6, 0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, 0x49E06929, 0x8EC9C844, 0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4, 0x63DF4A18, 0xE51A3182, 0x97513360, 0x62537F45, 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94, 0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, 0xE31F8F57, 0x6655AB2A, 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C, 0x8ACF1C2B, 0xA779B492, 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A, 0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, 0x5E719F06, 0xBD6E1051, 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF, 0x1998FB24, 0xD6BDE997, 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB, 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, 0x09808683, 0x322BED48, 0x1E1170AC, 0x6C5A724E, 0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A, 0x0C0A67B1, 0x9357E70F, 0xB4EE96D2, 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16, 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, 0xF28BC7AD, 0x2DB6A8B9, 0x141EA9C8, 0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34, 0x8B432976, 0xCB23C6DC, 0xB6EDFC68, 0xB8E4F163, 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120, 0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, 0x0D8652EC, 0x77C1E3D0, 0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF, 0x87494EC7, 0xD938D1C1, 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4, 0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, 0x2E39F75E, 0x82C3AFF5, 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B, 0xCD267809, 0x6E5918F4, 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6, 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, 0xC6A59430, 0x35A266C0, 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F, 0x764DD68D, 0x43EFB04D, 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F, 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, 0xB3671D5A, 0x92DBD252, 0xE9105633, 0x6DD64713, 0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C, 0x9CD2DF59, 0x55F2733F, 0x1814CE79, 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86, 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, 0xBCE2250C, 0x283C498B, 0xFF0D9541, 0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742, 0x5051F4A7, 0x537E4165, 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303, 0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, 0x80263544, 0x8FB562A3, 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9, 0xE7038F5F, 0x9515929C, 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8, 0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, 0xB6BEE14F, 0x17F088AD, 0x66C920AC, 0xB47DCE3A, 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B, 0x58704868, 0x198F45FD, 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB, 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, 0xF2302887, 0xB223BFA5, 0xBA02036A, 0x5CED1682, 0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE, 0x9D342E53, 0xA0A2F355, 0x32058AE1, 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10, 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, 0x0571C45D, 0x6F0406D4, 0xFF605015, 0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE, 0x47A17C0A, 0xE97C420F, 0xC9F8841E, 0x00000000, 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72, 0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, 0xD19B5B54, 0x3A24362E, 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A, 0x0AE293BA, 0xE5C0A02A, 0x433C22E0, 0x1D121B17, 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9, 0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, 0xC544663B, 0x345BFB7E, 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611, 0x7D854A24, 0xF8D2BB3D, 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3, 0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, 0xD8567D2C, 0xEF223390, 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF, 0xE42C3A9D, 0x0D507892, 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF, 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, 0x3BC8AC99, 0xA710187D, 0x6EE89C63, 0x7BDB3BBB, 0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8, 0xD9BAE79B, 0xCE4A6F36, 0xD4EA9F09, 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266, 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, 0xF741ECDA, 0x0E7FCD50, 0x2F1791F6, 0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551, 0x049D5EEA, 0x5D018C35, 0x73FA8774, 0x2EFB0B41, 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647, 0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, 0xEDE11CE5, 0x3C7A47B1, 0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB, 0x81CAAFF3, 0x3EB968C4, 0x2C382434, 0x5FC2A340, 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95, 0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, 0x74486C5C, 0x42D0B857, 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3, 0xFA552030, 0x6DF6AD76, 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562, 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, 0x7502C32F, 0xF012814C, 0x97A38D46, 0xF9C66BD3, 0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9, 0x896A75C2, 0x7978F48E, 0x3E6B9958, 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE, 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, 0xAE84BB6B, 0xA01CFE81, 0x2B94F908, 0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655, 0x2807B2EB, 0xC2032FB5, 0x7B9A86C5, 0x08A5D337, 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16, 0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, 0x621FD134, 0xFE8AC4A6, 0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E, 0x8AF93E21, 0x063D96DD, 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050, 0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, 0x5B38E719, 0xEEDB79C8, 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A, 0xFFFBFD0E, 0x38560F85, 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436, 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, 0xC54F80C0, 0x20A261DC, 0x4B695A77, 0x1A161C12, 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E, 0x198557F1, 0x074CAF75, 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB, 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, 0xDCCAD731, 0x85104263, 0x22401397, 0x112084C6, 0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1, 0x166C2BB3, 0xB999A970, 0x48FA1194, 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233, 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, 0xDE28A57A, 0x8E26DAB7, 0xBFA43FAD, 0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3, 0x80BE9F5D, 0x937C69D0, 0x2DA96FD5, 0x12B3CF25, 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B, 0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, 0xCF0821BC, 0xE8E6EF15, 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2, 0xBC37744E, 0xCAA6FC82, 0xD0B0E090, 0xD81533A7, 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791, 0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, 0x1FB8C12C, 0x517F4665, 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6, 0x618C9AD7, 0x0C7A37A1, 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47, 0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, 0x6F14DF3D, 0xDB867844, 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D, 0x017139A8, 0xB3DE080C, 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8, 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 }; /* * AES Encryption */ void aes_encrypt_n(const byte in[], byte out[], size_t blocks, const MemoryRegion& EK, const MemoryRegion& ME) { const size_t BLOCK_SIZE = 16; const u32bit* TE0 = TE; const u32bit* TE1 = TE + 256; const u32bit* TE2 = TE + 512; const u32bit* TE3 = TE + 768; for(size_t i = 0; i != blocks; ++i) { u32bit T0 = load_be(in, 0) ^ EK[0]; u32bit T1 = load_be(in, 1) ^ EK[1]; u32bit T2 = load_be(in, 2) ^ EK[2]; u32bit T3 = load_be(in, 3) ^ EK[3]; /* Use only the first 256 entries of the TE table and do the * rotations directly in the code. This reduces the number of * cache lines potentially used in the first round from 64 to 16 * (assuming a typical 64 byte cache line), which makes timing * attacks a little harder; the first round is particularly * vulnerable. */ u32bit B0 = TE[get_byte(0, T0)] ^ rotate_right(TE[get_byte(1, T1)], 8) ^ rotate_right(TE[get_byte(2, T2)], 16) ^ rotate_right(TE[get_byte(3, T3)], 24) ^ EK[4]; u32bit B1 = TE[get_byte(0, T1)] ^ rotate_right(TE[get_byte(1, T2)], 8) ^ rotate_right(TE[get_byte(2, T3)], 16) ^ rotate_right(TE[get_byte(3, T0)], 24) ^ EK[5]; u32bit B2 = TE[get_byte(0, T2)] ^ rotate_right(TE[get_byte(1, T3)], 8) ^ rotate_right(TE[get_byte(2, T0)], 16) ^ rotate_right(TE[get_byte(3, T1)], 24) ^ EK[6]; u32bit B3 = TE[get_byte(0, T3)] ^ rotate_right(TE[get_byte(1, T0)], 8) ^ rotate_right(TE[get_byte(2, T1)], 16) ^ rotate_right(TE[get_byte(3, T2)], 24) ^ EK[7]; for(size_t r = 2*4; r < EK.size(); r += 2*4) { T0 = TE0[get_byte(0, B0)] ^ TE1[get_byte(1, B1)] ^ TE2[get_byte(2, B2)] ^ TE3[get_byte(3, B3)] ^ EK[r]; T1 = TE0[get_byte(0, B1)] ^ TE1[get_byte(1, B2)] ^ TE2[get_byte(2, B3)] ^ TE3[get_byte(3, B0)] ^ EK[r+1]; T2 = TE0[get_byte(0, B2)] ^ TE1[get_byte(1, B3)] ^ TE2[get_byte(2, B0)] ^ TE3[get_byte(3, B1)] ^ EK[r+2]; T3 = TE0[get_byte(0, B3)] ^ TE1[get_byte(1, B0)] ^ TE2[get_byte(2, B1)] ^ TE3[get_byte(3, B2)] ^ EK[r+3]; B0 = TE0[get_byte(0, T0)] ^ TE1[get_byte(1, T1)] ^ TE2[get_byte(2, T2)] ^ TE3[get_byte(3, T3)] ^ EK[r+4]; B1 = TE0[get_byte(0, T1)] ^ TE1[get_byte(1, T2)] ^ TE2[get_byte(2, T3)] ^ TE3[get_byte(3, T0)] ^ EK[r+5]; B2 = TE0[get_byte(0, T2)] ^ TE1[get_byte(1, T3)] ^ TE2[get_byte(2, T0)] ^ TE3[get_byte(3, T1)] ^ EK[r+6]; B3 = TE0[get_byte(0, T3)] ^ TE1[get_byte(1, T0)] ^ TE2[get_byte(2, T1)] ^ TE3[get_byte(3, T2)] ^ EK[r+7]; } /* Joseph Bonneau and Ilya Mironov's paper "Cache-Collision Timing Attacks Against AES" describes an attack that can recover AES keys with as few as 2**13 samples. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.88.4753 They recommend using a byte-wide table, which still allows an attack but increases the samples required from 2**13 to 2**25: """In addition to OpenSSL v. 0.9.8.(a), which was used in our experiments, the AES implementations of Crypto++ 5.2.1 and LibTomCrypt 1.09 use the original Rijndael C implementation with very few changes and are highly vulnerable. The AES implementations in libgcrypt v. 1.2.2 and Botan v. 1.4.2 are also vulnerable, but use a smaller byte-wide final table which lessens the effectiveness of the attacks.""" */ out[ 0] = SE[get_byte(0, B0)] ^ ME[0]; out[ 1] = SE[get_byte(1, B1)] ^ ME[1]; out[ 2] = SE[get_byte(2, B2)] ^ ME[2]; out[ 3] = SE[get_byte(3, B3)] ^ ME[3]; out[ 4] = SE[get_byte(0, B1)] ^ ME[4]; out[ 5] = SE[get_byte(1, B2)] ^ ME[5]; out[ 6] = SE[get_byte(2, B3)] ^ ME[6]; out[ 7] = SE[get_byte(3, B0)] ^ ME[7]; out[ 8] = SE[get_byte(0, B2)] ^ ME[8]; out[ 9] = SE[get_byte(1, B3)] ^ ME[9]; out[10] = SE[get_byte(2, B0)] ^ ME[10]; out[11] = SE[get_byte(3, B1)] ^ ME[11]; out[12] = SE[get_byte(0, B3)] ^ ME[12]; out[13] = SE[get_byte(1, B0)] ^ ME[13]; out[14] = SE[get_byte(2, B1)] ^ ME[14]; out[15] = SE[get_byte(3, B2)] ^ ME[15]; in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * AES Decryption */ void aes_decrypt_n(const byte in[], byte out[], size_t blocks, const MemoryRegion& DK, const MemoryRegion& MD) { const size_t BLOCK_SIZE = 16; const u32bit* TD0 = TD; const u32bit* TD1 = TD + 256; const u32bit* TD2 = TD + 512; const u32bit* TD3 = TD + 768; for(size_t i = 0; i != blocks; ++i) { u32bit T0 = load_be(in, 0) ^ DK[0]; u32bit T1 = load_be(in, 1) ^ DK[1]; u32bit T2 = load_be(in, 2) ^ DK[2]; u32bit T3 = load_be(in, 3) ^ DK[3]; u32bit B0 = TD[get_byte(0, T0)] ^ rotate_right(TD[get_byte(1, T3)], 8) ^ rotate_right(TD[get_byte(2, T2)], 16) ^ rotate_right(TD[get_byte(3, T1)], 24) ^ DK[4]; u32bit B1 = TD[get_byte(0, T1)] ^ rotate_right(TD[get_byte(1, T0)], 8) ^ rotate_right(TD[get_byte(2, T3)], 16) ^ rotate_right(TD[get_byte(3, T2)], 24) ^ DK[5]; u32bit B2 = TD[get_byte(0, T2)] ^ rotate_right(TD[get_byte(1, T1)], 8) ^ rotate_right(TD[get_byte(2, T0)], 16) ^ rotate_right(TD[get_byte(3, T3)], 24) ^ DK[6]; u32bit B3 = TD[get_byte(0, T3)] ^ rotate_right(TD[get_byte(1, T2)], 8) ^ rotate_right(TD[get_byte(2, T1)], 16) ^ rotate_right(TD[get_byte(3, T0)], 24) ^ DK[7]; for(size_t r = 2*4; r < DK.size(); r += 2*4) { T0 = TD0[get_byte(0, B0)] ^ TD1[get_byte(1, B3)] ^ TD2[get_byte(2, B2)] ^ TD3[get_byte(3, B1)] ^ DK[r]; T1 = TD0[get_byte(0, B1)] ^ TD1[get_byte(1, B0)] ^ TD2[get_byte(2, B3)] ^ TD3[get_byte(3, B2)] ^ DK[r+1]; T2 = TD0[get_byte(0, B2)] ^ TD1[get_byte(1, B1)] ^ TD2[get_byte(2, B0)] ^ TD3[get_byte(3, B3)] ^ DK[r+2]; T3 = TD0[get_byte(0, B3)] ^ TD1[get_byte(1, B2)] ^ TD2[get_byte(2, B1)] ^ TD3[get_byte(3, B0)] ^ DK[r+3]; B0 = TD0[get_byte(0, T0)] ^ TD1[get_byte(1, T3)] ^ TD2[get_byte(2, T2)] ^ TD3[get_byte(3, T1)] ^ DK[r+4]; B1 = TD0[get_byte(0, T1)] ^ TD1[get_byte(1, T0)] ^ TD2[get_byte(2, T3)] ^ TD3[get_byte(3, T2)] ^ DK[r+5]; B2 = TD0[get_byte(0, T2)] ^ TD1[get_byte(1, T1)] ^ TD2[get_byte(2, T0)] ^ TD3[get_byte(3, T3)] ^ DK[r+6]; B3 = TD0[get_byte(0, T3)] ^ TD1[get_byte(1, T2)] ^ TD2[get_byte(2, T1)] ^ TD3[get_byte(3, T0)] ^ DK[r+7]; } out[ 0] = SD[get_byte(0, B0)] ^ MD[0]; out[ 1] = SD[get_byte(1, B3)] ^ MD[1]; out[ 2] = SD[get_byte(2, B2)] ^ MD[2]; out[ 3] = SD[get_byte(3, B1)] ^ MD[3]; out[ 4] = SD[get_byte(0, B1)] ^ MD[4]; out[ 5] = SD[get_byte(1, B0)] ^ MD[5]; out[ 6] = SD[get_byte(2, B3)] ^ MD[6]; out[ 7] = SD[get_byte(3, B2)] ^ MD[7]; out[ 8] = SD[get_byte(0, B2)] ^ MD[8]; out[ 9] = SD[get_byte(1, B1)] ^ MD[9]; out[10] = SD[get_byte(2, B0)] ^ MD[10]; out[11] = SD[get_byte(3, B3)] ^ MD[11]; out[12] = SD[get_byte(0, B3)] ^ MD[12]; out[13] = SD[get_byte(1, B2)] ^ MD[13]; out[14] = SD[get_byte(2, B1)] ^ MD[14]; out[15] = SD[get_byte(3, B0)] ^ MD[15]; in += BLOCK_SIZE; out += BLOCK_SIZE; } } void aes_key_schedule(const byte key[], size_t length, MemoryRegion& EK, MemoryRegion& DK, MemoryRegion& ME, MemoryRegion& MD) { static const u32bit RC[10] = { 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000 }; const size_t rounds = (length / 4) + 6; SecureVector XEK(length + 32), XDK(length + 32); const size_t X = length / 4; BOTAN_ASSERT(X == 4 || X == 6 || X == 8, "Known AES key size"); for(size_t i = 0; i != X; ++i) XEK[i] = load_be(key, i); for(size_t i = X; i < 4*(rounds+1); i += X) { XEK[i] = XEK[i-X] ^ RC[(i-X)/X] ^ make_u32bit(SE[get_byte(1, XEK[i-1])], SE[get_byte(2, XEK[i-1])], SE[get_byte(3, XEK[i-1])], SE[get_byte(0, XEK[i-1])]); for(size_t j = 1; j != X; ++j) { XEK[i+j] = XEK[i+j-X]; if(X == 8 && j == 4) XEK[i+j] ^= make_u32bit(SE[get_byte(0, XEK[i+j-1])], SE[get_byte(1, XEK[i+j-1])], SE[get_byte(2, XEK[i+j-1])], SE[get_byte(3, XEK[i+j-1])]); else XEK[i+j] ^= XEK[i+j-1]; } } for(size_t i = 0; i != 4*(rounds+1); i += 4) { XDK[i ] = XEK[4*rounds-i ]; XDK[i+1] = XEK[4*rounds-i+1]; XDK[i+2] = XEK[4*rounds-i+2]; XDK[i+3] = XEK[4*rounds-i+3]; } for(size_t i = 4; i != length + 24; ++i) XDK[i] = TD[SE[get_byte(0, XDK[i])] + 0] ^ TD[SE[get_byte(1, XDK[i])] + 256] ^ TD[SE[get_byte(2, XDK[i])] + 512] ^ TD[SE[get_byte(3, XDK[i])] + 768]; for(size_t i = 0; i != 4; ++i) { store_be(XEK[i+4*rounds], &ME[4*i]); store_be(XEK[i], &MD[4*i]); } EK.resize(length + 24); DK.resize(length + 24); copy_mem(&EK[0], &XEK[0], EK.size()); copy_mem(&DK[0], &XDK[0], DK.size()); } } void AES_128::encrypt_n(const byte in[], byte out[], size_t blocks) const { aes_encrypt_n(in, out, blocks, EK, ME); } void AES_128::decrypt_n(const byte in[], byte out[], size_t blocks) const { aes_decrypt_n(in, out, blocks, DK, MD); } void AES_128::key_schedule(const byte key[], size_t length) { aes_key_schedule(key, length, EK, DK, ME, MD); } void AES_128::clear() { zeroise(EK); zeroise(DK); zeroise(ME); zeroise(MD); } void AES_192::encrypt_n(const byte in[], byte out[], size_t blocks) const { aes_encrypt_n(in, out, blocks, EK, ME); } void AES_192::decrypt_n(const byte in[], byte out[], size_t blocks) const { aes_decrypt_n(in, out, blocks, DK, MD); } void AES_192::key_schedule(const byte key[], size_t length) { aes_key_schedule(key, length, EK, DK, ME, MD); } void AES_192::clear() { zeroise(EK); zeroise(DK); zeroise(ME); zeroise(MD); } void AES_256::encrypt_n(const byte in[], byte out[], size_t blocks) const { aes_encrypt_n(in, out, blocks, EK, ME); } void AES_256::decrypt_n(const byte in[], byte out[], size_t blocks) const { aes_decrypt_n(in, out, blocks, DK, MD); } void AES_256::key_schedule(const byte key[], size_t length) { aes_key_schedule(key, length, EK, DK, ME, MD); } void AES_256::clear() { zeroise(EK); zeroise(DK); zeroise(ME); zeroise(MD); } } Botan-1.10.12/src/block/aes/aes.h0000664000175000017500000000360512654331322016142 0ustar jackjack00000000000000/* * AES * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_AES_H__ #define BOTAN_AES_H__ #include namespace Botan { /** * AES-128 */ class BOTAN_DLL AES_128 : public Block_Cipher_Fixed_Params<16, 16> { public: AES_128() : EK(40), DK(40), ME(16), MD(16) {} void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "AES-128"; } BlockCipher* clone() const { return new AES_128; } private: void key_schedule(const byte key[], size_t length); SecureVector EK, DK; SecureVector ME, MD; }; /** * AES-192 */ class BOTAN_DLL AES_192 : public Block_Cipher_Fixed_Params<16, 24> { public: AES_192() : EK(48), DK(48), ME(16), MD(16) {} void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "AES-192"; } BlockCipher* clone() const { return new AES_192; } private: void key_schedule(const byte key[], size_t length); SecureVector EK, DK; SecureVector ME, MD; }; /** * AES-256 */ class BOTAN_DLL AES_256 : public Block_Cipher_Fixed_Params<16, 32> { public: AES_256() : EK(56), DK(56), ME(16), MD(16) {} void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "AES-256"; } BlockCipher* clone() const { return new AES_256; } private: void key_schedule(const byte key[], size_t length); SecureVector EK, DK; SecureVector ME, MD; }; } #endif Botan-1.10.12/src/block/aes/info.txt0000664000175000017500000000001312654331322016703 0ustar jackjack00000000000000define AES Botan-1.10.12/src/block/aes_ni/aes_ni.cpp0000664000175000017500000005713112654331322017654 0ustar jackjack00000000000000/* * AES using AES-NI instructions * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { __m128i aes_128_key_expansion(__m128i key, __m128i key_with_rcon) { key_with_rcon = _mm_shuffle_epi32(key_with_rcon, _MM_SHUFFLE(3,3,3,3)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); return _mm_xor_si128(key, key_with_rcon); } void aes_192_key_expansion(__m128i* K1, __m128i* K2, __m128i key2_with_rcon, u32bit out[], bool last) { __m128i key1 = *K1; __m128i key2 = *K2; key2_with_rcon = _mm_shuffle_epi32(key2_with_rcon, _MM_SHUFFLE(1,1,1,1)); key1 = _mm_xor_si128(key1, _mm_slli_si128(key1, 4)); key1 = _mm_xor_si128(key1, _mm_slli_si128(key1, 4)); key1 = _mm_xor_si128(key1, _mm_slli_si128(key1, 4)); key1 = _mm_xor_si128(key1, key2_with_rcon); *K1 = key1; _mm_storeu_si128((__m128i*)out, key1); if(last) return; key2 = _mm_xor_si128(key2, _mm_slli_si128(key2, 4)); key2 = _mm_xor_si128(key2, _mm_shuffle_epi32(key1, _MM_SHUFFLE(3,3,3,3))); *K2 = key2; out[4] = _mm_cvtsi128_si32(key2); out[5] = _mm_cvtsi128_si32(_mm_srli_si128(key2, 4)); } /* * The second half of the AES-256 key expansion (other half same as AES-128) */ __m128i aes_256_key_expansion(__m128i key, __m128i key2) { __m128i key_with_rcon = _mm_aeskeygenassist_si128(key2, 0x00); key_with_rcon = _mm_shuffle_epi32(key_with_rcon, _MM_SHUFFLE(2,2,2,2)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); return _mm_xor_si128(key, key_with_rcon); } } #define AES_ENC_4_ROUNDS(K) \ do \ { \ B0 = _mm_aesenc_si128(B0, K); \ B1 = _mm_aesenc_si128(B1, K); \ B2 = _mm_aesenc_si128(B2, K); \ B3 = _mm_aesenc_si128(B3, K); \ } while(0) #define AES_ENC_4_LAST_ROUNDS(K) \ do \ { \ B0 = _mm_aesenclast_si128(B0, K); \ B1 = _mm_aesenclast_si128(B1, K); \ B2 = _mm_aesenclast_si128(B2, K); \ B3 = _mm_aesenclast_si128(B3, K); \ } while(0) #define AES_DEC_4_ROUNDS(K) \ do \ { \ B0 = _mm_aesdec_si128(B0, K); \ B1 = _mm_aesdec_si128(B1, K); \ B2 = _mm_aesdec_si128(B2, K); \ B3 = _mm_aesdec_si128(B3, K); \ } while(0) #define AES_DEC_4_LAST_ROUNDS(K) \ do \ { \ B0 = _mm_aesdeclast_si128(B0, K); \ B1 = _mm_aesdeclast_si128(B1, K); \ B2 = _mm_aesdeclast_si128(B2, K); \ B3 = _mm_aesdeclast_si128(B3, K); \ } while(0) /* * AES-128 Encryption */ void AES_128_NI::encrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = (const __m128i*)in; __m128i* out_mm = (__m128i*)out; const __m128i* key_mm = (const __m128i*)&EK[0]; __m128i K0 = _mm_loadu_si128(key_mm); __m128i K1 = _mm_loadu_si128(key_mm + 1); __m128i K2 = _mm_loadu_si128(key_mm + 2); __m128i K3 = _mm_loadu_si128(key_mm + 3); __m128i K4 = _mm_loadu_si128(key_mm + 4); __m128i K5 = _mm_loadu_si128(key_mm + 5); __m128i K6 = _mm_loadu_si128(key_mm + 6); __m128i K7 = _mm_loadu_si128(key_mm + 7); __m128i K8 = _mm_loadu_si128(key_mm + 8); __m128i K9 = _mm_loadu_si128(key_mm + 9); __m128i K10 = _mm_loadu_si128(key_mm + 10); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_ENC_4_ROUNDS(K1); AES_ENC_4_ROUNDS(K2); AES_ENC_4_ROUNDS(K3); AES_ENC_4_ROUNDS(K4); AES_ENC_4_ROUNDS(K5); AES_ENC_4_ROUNDS(K6); AES_ENC_4_ROUNDS(K7); AES_ENC_4_ROUNDS(K8); AES_ENC_4_ROUNDS(K9); AES_ENC_4_LAST_ROUNDS(K10); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesenc_si128(B, K1); B = _mm_aesenc_si128(B, K2); B = _mm_aesenc_si128(B, K3); B = _mm_aesenc_si128(B, K4); B = _mm_aesenc_si128(B, K5); B = _mm_aesenc_si128(B, K6); B = _mm_aesenc_si128(B, K7); B = _mm_aesenc_si128(B, K8); B = _mm_aesenc_si128(B, K9); B = _mm_aesenclast_si128(B, K10); _mm_storeu_si128(out_mm + i, B); } } /* * AES-128 Decryption */ void AES_128_NI::decrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = (const __m128i*)in; __m128i* out_mm = (__m128i*)out; const __m128i* key_mm = (const __m128i*)&DK[0]; __m128i K0 = _mm_loadu_si128(key_mm); __m128i K1 = _mm_loadu_si128(key_mm + 1); __m128i K2 = _mm_loadu_si128(key_mm + 2); __m128i K3 = _mm_loadu_si128(key_mm + 3); __m128i K4 = _mm_loadu_si128(key_mm + 4); __m128i K5 = _mm_loadu_si128(key_mm + 5); __m128i K6 = _mm_loadu_si128(key_mm + 6); __m128i K7 = _mm_loadu_si128(key_mm + 7); __m128i K8 = _mm_loadu_si128(key_mm + 8); __m128i K9 = _mm_loadu_si128(key_mm + 9); __m128i K10 = _mm_loadu_si128(key_mm + 10); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_DEC_4_ROUNDS(K1); AES_DEC_4_ROUNDS(K2); AES_DEC_4_ROUNDS(K3); AES_DEC_4_ROUNDS(K4); AES_DEC_4_ROUNDS(K5); AES_DEC_4_ROUNDS(K6); AES_DEC_4_ROUNDS(K7); AES_DEC_4_ROUNDS(K8); AES_DEC_4_ROUNDS(K9); AES_DEC_4_LAST_ROUNDS(K10); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesdec_si128(B, K1); B = _mm_aesdec_si128(B, K2); B = _mm_aesdec_si128(B, K3); B = _mm_aesdec_si128(B, K4); B = _mm_aesdec_si128(B, K5); B = _mm_aesdec_si128(B, K6); B = _mm_aesdec_si128(B, K7); B = _mm_aesdec_si128(B, K8); B = _mm_aesdec_si128(B, K9); B = _mm_aesdeclast_si128(B, K10); _mm_storeu_si128(out_mm + i, B); } } /* * AES-128 Key Schedule */ void AES_128_NI::key_schedule(const byte key[], size_t) { #define AES_128_key_exp(K, RCON) \ aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON)) __m128i K0 = _mm_loadu_si128((const __m128i*)(key)); __m128i K1 = AES_128_key_exp(K0, 0x01); __m128i K2 = AES_128_key_exp(K1, 0x02); __m128i K3 = AES_128_key_exp(K2, 0x04); __m128i K4 = AES_128_key_exp(K3, 0x08); __m128i K5 = AES_128_key_exp(K4, 0x10); __m128i K6 = AES_128_key_exp(K5, 0x20); __m128i K7 = AES_128_key_exp(K6, 0x40); __m128i K8 = AES_128_key_exp(K7, 0x80); __m128i K9 = AES_128_key_exp(K8, 0x1B); __m128i K10 = AES_128_key_exp(K9, 0x36); __m128i* EK_mm = (__m128i*)&EK[0]; _mm_storeu_si128(EK_mm , K0); _mm_storeu_si128(EK_mm + 1, K1); _mm_storeu_si128(EK_mm + 2, K2); _mm_storeu_si128(EK_mm + 3, K3); _mm_storeu_si128(EK_mm + 4, K4); _mm_storeu_si128(EK_mm + 5, K5); _mm_storeu_si128(EK_mm + 6, K6); _mm_storeu_si128(EK_mm + 7, K7); _mm_storeu_si128(EK_mm + 8, K8); _mm_storeu_si128(EK_mm + 9, K9); _mm_storeu_si128(EK_mm + 10, K10); // Now generate decryption keys __m128i* DK_mm = (__m128i*)&DK[0]; _mm_storeu_si128(DK_mm , K10); _mm_storeu_si128(DK_mm + 1, _mm_aesimc_si128(K9)); _mm_storeu_si128(DK_mm + 2, _mm_aesimc_si128(K8)); _mm_storeu_si128(DK_mm + 3, _mm_aesimc_si128(K7)); _mm_storeu_si128(DK_mm + 4, _mm_aesimc_si128(K6)); _mm_storeu_si128(DK_mm + 5, _mm_aesimc_si128(K5)); _mm_storeu_si128(DK_mm + 6, _mm_aesimc_si128(K4)); _mm_storeu_si128(DK_mm + 7, _mm_aesimc_si128(K3)); _mm_storeu_si128(DK_mm + 8, _mm_aesimc_si128(K2)); _mm_storeu_si128(DK_mm + 9, _mm_aesimc_si128(K1)); _mm_storeu_si128(DK_mm + 10, K0); } /* * Clear memory of sensitive data */ void AES_128_NI::clear() { zeroise(EK); zeroise(DK); } /* * AES-192 Encryption */ void AES_192_NI::encrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = (const __m128i*)in; __m128i* out_mm = (__m128i*)out; const __m128i* key_mm = (const __m128i*)&EK[0]; __m128i K0 = _mm_loadu_si128(key_mm); __m128i K1 = _mm_loadu_si128(key_mm + 1); __m128i K2 = _mm_loadu_si128(key_mm + 2); __m128i K3 = _mm_loadu_si128(key_mm + 3); __m128i K4 = _mm_loadu_si128(key_mm + 4); __m128i K5 = _mm_loadu_si128(key_mm + 5); __m128i K6 = _mm_loadu_si128(key_mm + 6); __m128i K7 = _mm_loadu_si128(key_mm + 7); __m128i K8 = _mm_loadu_si128(key_mm + 8); __m128i K9 = _mm_loadu_si128(key_mm + 9); __m128i K10 = _mm_loadu_si128(key_mm + 10); __m128i K11 = _mm_loadu_si128(key_mm + 11); __m128i K12 = _mm_loadu_si128(key_mm + 12); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_ENC_4_ROUNDS(K1); AES_ENC_4_ROUNDS(K2); AES_ENC_4_ROUNDS(K3); AES_ENC_4_ROUNDS(K4); AES_ENC_4_ROUNDS(K5); AES_ENC_4_ROUNDS(K6); AES_ENC_4_ROUNDS(K7); AES_ENC_4_ROUNDS(K8); AES_ENC_4_ROUNDS(K9); AES_ENC_4_ROUNDS(K10); AES_ENC_4_ROUNDS(K11); AES_ENC_4_LAST_ROUNDS(K12); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesenc_si128(B, K1); B = _mm_aesenc_si128(B, K2); B = _mm_aesenc_si128(B, K3); B = _mm_aesenc_si128(B, K4); B = _mm_aesenc_si128(B, K5); B = _mm_aesenc_si128(B, K6); B = _mm_aesenc_si128(B, K7); B = _mm_aesenc_si128(B, K8); B = _mm_aesenc_si128(B, K9); B = _mm_aesenc_si128(B, K10); B = _mm_aesenc_si128(B, K11); B = _mm_aesenclast_si128(B, K12); _mm_storeu_si128(out_mm + i, B); } } /* * AES-192 Decryption */ void AES_192_NI::decrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = (const __m128i*)in; __m128i* out_mm = (__m128i*)out; const __m128i* key_mm = (const __m128i*)&DK[0]; __m128i K0 = _mm_loadu_si128(key_mm); __m128i K1 = _mm_loadu_si128(key_mm + 1); __m128i K2 = _mm_loadu_si128(key_mm + 2); __m128i K3 = _mm_loadu_si128(key_mm + 3); __m128i K4 = _mm_loadu_si128(key_mm + 4); __m128i K5 = _mm_loadu_si128(key_mm + 5); __m128i K6 = _mm_loadu_si128(key_mm + 6); __m128i K7 = _mm_loadu_si128(key_mm + 7); __m128i K8 = _mm_loadu_si128(key_mm + 8); __m128i K9 = _mm_loadu_si128(key_mm + 9); __m128i K10 = _mm_loadu_si128(key_mm + 10); __m128i K11 = _mm_loadu_si128(key_mm + 11); __m128i K12 = _mm_loadu_si128(key_mm + 12); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_DEC_4_ROUNDS(K1); AES_DEC_4_ROUNDS(K2); AES_DEC_4_ROUNDS(K3); AES_DEC_4_ROUNDS(K4); AES_DEC_4_ROUNDS(K5); AES_DEC_4_ROUNDS(K6); AES_DEC_4_ROUNDS(K7); AES_DEC_4_ROUNDS(K8); AES_DEC_4_ROUNDS(K9); AES_DEC_4_ROUNDS(K10); AES_DEC_4_ROUNDS(K11); AES_DEC_4_LAST_ROUNDS(K12); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesdec_si128(B, K1); B = _mm_aesdec_si128(B, K2); B = _mm_aesdec_si128(B, K3); B = _mm_aesdec_si128(B, K4); B = _mm_aesdec_si128(B, K5); B = _mm_aesdec_si128(B, K6); B = _mm_aesdec_si128(B, K7); B = _mm_aesdec_si128(B, K8); B = _mm_aesdec_si128(B, K9); B = _mm_aesdec_si128(B, K10); B = _mm_aesdec_si128(B, K11); B = _mm_aesdeclast_si128(B, K12); _mm_storeu_si128(out_mm + i, B); } } /* * AES-192 Key Schedule */ void AES_192_NI::key_schedule(const byte key[], size_t) { __m128i K0 = _mm_loadu_si128((const __m128i*)(key)); __m128i K1 = _mm_loadu_si128((const __m128i*)(key + 8)); K1 = _mm_srli_si128(K1, 8); load_le(&EK[0], key, 6); #define AES_192_key_exp(RCON, EK_OFF) \ aes_192_key_expansion(&K0, &K1, \ _mm_aeskeygenassist_si128(K1, RCON), \ EK + EK_OFF, EK_OFF == 48) AES_192_key_exp(0x01, 6); AES_192_key_exp(0x02, 12); AES_192_key_exp(0x04, 18); AES_192_key_exp(0x08, 24); AES_192_key_exp(0x10, 30); AES_192_key_exp(0x20, 36); AES_192_key_exp(0x40, 42); AES_192_key_exp(0x80, 48); // Now generate decryption keys const __m128i* EK_mm = (const __m128i*)&EK[0]; __m128i* DK_mm = (__m128i*)&DK[0]; _mm_storeu_si128(DK_mm , _mm_loadu_si128(EK_mm + 12)); _mm_storeu_si128(DK_mm + 1, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 11))); _mm_storeu_si128(DK_mm + 2, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 10))); _mm_storeu_si128(DK_mm + 3, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 9))); _mm_storeu_si128(DK_mm + 4, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 8))); _mm_storeu_si128(DK_mm + 5, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 7))); _mm_storeu_si128(DK_mm + 6, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 6))); _mm_storeu_si128(DK_mm + 7, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 5))); _mm_storeu_si128(DK_mm + 8, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 4))); _mm_storeu_si128(DK_mm + 9, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 3))); _mm_storeu_si128(DK_mm + 10, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 2))); _mm_storeu_si128(DK_mm + 11, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 1))); _mm_storeu_si128(DK_mm + 12, _mm_loadu_si128(EK_mm + 0)); } /* * Clear memory of sensitive data */ void AES_192_NI::clear() { zeroise(EK); zeroise(DK); } /* * AES-256 Encryption */ void AES_256_NI::encrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = (const __m128i*)in; __m128i* out_mm = (__m128i*)out; const __m128i* key_mm = (const __m128i*)&EK[0]; __m128i K0 = _mm_loadu_si128(key_mm); __m128i K1 = _mm_loadu_si128(key_mm + 1); __m128i K2 = _mm_loadu_si128(key_mm + 2); __m128i K3 = _mm_loadu_si128(key_mm + 3); __m128i K4 = _mm_loadu_si128(key_mm + 4); __m128i K5 = _mm_loadu_si128(key_mm + 5); __m128i K6 = _mm_loadu_si128(key_mm + 6); __m128i K7 = _mm_loadu_si128(key_mm + 7); __m128i K8 = _mm_loadu_si128(key_mm + 8); __m128i K9 = _mm_loadu_si128(key_mm + 9); __m128i K10 = _mm_loadu_si128(key_mm + 10); __m128i K11 = _mm_loadu_si128(key_mm + 11); __m128i K12 = _mm_loadu_si128(key_mm + 12); __m128i K13 = _mm_loadu_si128(key_mm + 13); __m128i K14 = _mm_loadu_si128(key_mm + 14); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_ENC_4_ROUNDS(K1); AES_ENC_4_ROUNDS(K2); AES_ENC_4_ROUNDS(K3); AES_ENC_4_ROUNDS(K4); AES_ENC_4_ROUNDS(K5); AES_ENC_4_ROUNDS(K6); AES_ENC_4_ROUNDS(K7); AES_ENC_4_ROUNDS(K8); AES_ENC_4_ROUNDS(K9); AES_ENC_4_ROUNDS(K10); AES_ENC_4_ROUNDS(K11); AES_ENC_4_ROUNDS(K12); AES_ENC_4_ROUNDS(K13); AES_ENC_4_LAST_ROUNDS(K14); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesenc_si128(B, K1); B = _mm_aesenc_si128(B, K2); B = _mm_aesenc_si128(B, K3); B = _mm_aesenc_si128(B, K4); B = _mm_aesenc_si128(B, K5); B = _mm_aesenc_si128(B, K6); B = _mm_aesenc_si128(B, K7); B = _mm_aesenc_si128(B, K8); B = _mm_aesenc_si128(B, K9); B = _mm_aesenc_si128(B, K10); B = _mm_aesenc_si128(B, K11); B = _mm_aesenc_si128(B, K12); B = _mm_aesenc_si128(B, K13); B = _mm_aesenclast_si128(B, K14); _mm_storeu_si128(out_mm + i, B); } } /* * AES-256 Decryption */ void AES_256_NI::decrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = (const __m128i*)in; __m128i* out_mm = (__m128i*)out; const __m128i* key_mm = (const __m128i*)&DK[0]; __m128i K0 = _mm_loadu_si128(key_mm); __m128i K1 = _mm_loadu_si128(key_mm + 1); __m128i K2 = _mm_loadu_si128(key_mm + 2); __m128i K3 = _mm_loadu_si128(key_mm + 3); __m128i K4 = _mm_loadu_si128(key_mm + 4); __m128i K5 = _mm_loadu_si128(key_mm + 5); __m128i K6 = _mm_loadu_si128(key_mm + 6); __m128i K7 = _mm_loadu_si128(key_mm + 7); __m128i K8 = _mm_loadu_si128(key_mm + 8); __m128i K9 = _mm_loadu_si128(key_mm + 9); __m128i K10 = _mm_loadu_si128(key_mm + 10); __m128i K11 = _mm_loadu_si128(key_mm + 11); __m128i K12 = _mm_loadu_si128(key_mm + 12); __m128i K13 = _mm_loadu_si128(key_mm + 13); __m128i K14 = _mm_loadu_si128(key_mm + 14); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_DEC_4_ROUNDS(K1); AES_DEC_4_ROUNDS(K2); AES_DEC_4_ROUNDS(K3); AES_DEC_4_ROUNDS(K4); AES_DEC_4_ROUNDS(K5); AES_DEC_4_ROUNDS(K6); AES_DEC_4_ROUNDS(K7); AES_DEC_4_ROUNDS(K8); AES_DEC_4_ROUNDS(K9); AES_DEC_4_ROUNDS(K10); AES_DEC_4_ROUNDS(K11); AES_DEC_4_ROUNDS(K12); AES_DEC_4_ROUNDS(K13); AES_DEC_4_LAST_ROUNDS(K14); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesdec_si128(B, K1); B = _mm_aesdec_si128(B, K2); B = _mm_aesdec_si128(B, K3); B = _mm_aesdec_si128(B, K4); B = _mm_aesdec_si128(B, K5); B = _mm_aesdec_si128(B, K6); B = _mm_aesdec_si128(B, K7); B = _mm_aesdec_si128(B, K8); B = _mm_aesdec_si128(B, K9); B = _mm_aesdec_si128(B, K10); B = _mm_aesdec_si128(B, K11); B = _mm_aesdec_si128(B, K12); B = _mm_aesdec_si128(B, K13); B = _mm_aesdeclast_si128(B, K14); _mm_storeu_si128(out_mm + i, B); } } /* * AES-256 Key Schedule */ void AES_256_NI::key_schedule(const byte key[], size_t) { __m128i K0 = _mm_loadu_si128((const __m128i*)(key)); __m128i K1 = _mm_loadu_si128((const __m128i*)(key + 16)); __m128i K2 = aes_128_key_expansion(K0, _mm_aeskeygenassist_si128(K1, 0x01)); __m128i K3 = aes_256_key_expansion(K1, K2); __m128i K4 = aes_128_key_expansion(K2, _mm_aeskeygenassist_si128(K3, 0x02)); __m128i K5 = aes_256_key_expansion(K3, K4); __m128i K6 = aes_128_key_expansion(K4, _mm_aeskeygenassist_si128(K5, 0x04)); __m128i K7 = aes_256_key_expansion(K5, K6); __m128i K8 = aes_128_key_expansion(K6, _mm_aeskeygenassist_si128(K7, 0x08)); __m128i K9 = aes_256_key_expansion(K7, K8); __m128i K10 = aes_128_key_expansion(K8, _mm_aeskeygenassist_si128(K9, 0x10)); __m128i K11 = aes_256_key_expansion(K9, K10); __m128i K12 = aes_128_key_expansion(K10, _mm_aeskeygenassist_si128(K11, 0x20)); __m128i K13 = aes_256_key_expansion(K11, K12); __m128i K14 = aes_128_key_expansion(K12, _mm_aeskeygenassist_si128(K13, 0x40)); __m128i* EK_mm = (__m128i*)&EK[0]; _mm_storeu_si128(EK_mm , K0); _mm_storeu_si128(EK_mm + 1, K1); _mm_storeu_si128(EK_mm + 2, K2); _mm_storeu_si128(EK_mm + 3, K3); _mm_storeu_si128(EK_mm + 4, K4); _mm_storeu_si128(EK_mm + 5, K5); _mm_storeu_si128(EK_mm + 6, K6); _mm_storeu_si128(EK_mm + 7, K7); _mm_storeu_si128(EK_mm + 8, K8); _mm_storeu_si128(EK_mm + 9, K9); _mm_storeu_si128(EK_mm + 10, K10); _mm_storeu_si128(EK_mm + 11, K11); _mm_storeu_si128(EK_mm + 12, K12); _mm_storeu_si128(EK_mm + 13, K13); _mm_storeu_si128(EK_mm + 14, K14); // Now generate decryption keys __m128i* DK_mm = (__m128i*)&DK[0]; _mm_storeu_si128(DK_mm , K14); _mm_storeu_si128(DK_mm + 1, _mm_aesimc_si128(K13)); _mm_storeu_si128(DK_mm + 2, _mm_aesimc_si128(K12)); _mm_storeu_si128(DK_mm + 3, _mm_aesimc_si128(K11)); _mm_storeu_si128(DK_mm + 4, _mm_aesimc_si128(K10)); _mm_storeu_si128(DK_mm + 5, _mm_aesimc_si128(K9)); _mm_storeu_si128(DK_mm + 6, _mm_aesimc_si128(K8)); _mm_storeu_si128(DK_mm + 7, _mm_aesimc_si128(K7)); _mm_storeu_si128(DK_mm + 8, _mm_aesimc_si128(K6)); _mm_storeu_si128(DK_mm + 9, _mm_aesimc_si128(K5)); _mm_storeu_si128(DK_mm + 10, _mm_aesimc_si128(K4)); _mm_storeu_si128(DK_mm + 11, _mm_aesimc_si128(K3)); _mm_storeu_si128(DK_mm + 12, _mm_aesimc_si128(K2)); _mm_storeu_si128(DK_mm + 13, _mm_aesimc_si128(K1)); _mm_storeu_si128(DK_mm + 14, K0); } /* * Clear memory of sensitive data */ void AES_256_NI::clear() { zeroise(EK); zeroise(DK); } } Botan-1.10.12/src/block/aes_ni/aes_ni.h0000664000175000017500000000367612654331322017326 0ustar jackjack00000000000000/* * AES using AES-NI instructions * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_AES_NI_H__ #define BOTAN_AES_NI_H__ #include namespace Botan { /** * AES-128 using AES-NI */ class BOTAN_DLL AES_128_NI : public Block_Cipher_Fixed_Params<16, 16> { public: size_t parallelism() const { return 4; } void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "AES-128"; } BlockCipher* clone() const { return new AES_128_NI; } AES_128_NI() : EK(44), DK(44) { } private: void key_schedule(const byte[], size_t); SecureVector EK, DK; }; /** * AES-192 using AES-NI */ class BOTAN_DLL AES_192_NI : public Block_Cipher_Fixed_Params<16, 24> { public: size_t parallelism() const { return 4; } void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "AES-192"; } BlockCipher* clone() const { return new AES_192_NI; } AES_192_NI() : EK(52), DK(52) { } private: void key_schedule(const byte[], size_t); SecureVector EK, DK; }; /** * AES-256 using AES-NI */ class BOTAN_DLL AES_256_NI : public Block_Cipher_Fixed_Params<16, 32> { public: size_t parallelism() const { return 4; } void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "AES-256"; } BlockCipher* clone() const { return new AES_256_NI; } AES_256_NI() : EK(60), DK(60) { } private: void key_schedule(const byte[], size_t); SecureVector EK, DK; }; } #endif Botan-1.10.12/src/block/aes_ni/info.txt0000664000175000017500000000012112654331322017371 0ustar jackjack00000000000000define AES_NI load_on auto need_isa aes-ni aes_isa_eng Botan-1.10.12/src/block/aes_ssse3/aes_ssse3.cpp0000664000175000017500000004457712654331322020752 0ustar jackjack00000000000000/* * AES using SSSE3 * (C) 2010 Jack Lloyd * * This is more or less a direct translation of public domain x86-64 * assembly written by Mike Hamburg, described in "Accelerating AES * with Vector Permute Instructions" (CHES 2009). His original code is * available at http://crypto.stanford.edu/vpaes/ * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { const __m128i low_nibs = _mm_set1_epi8(0x0F); const __m128i k_ipt1 = _mm_set_epi32( 0xCABAE090, 0x52227808, 0xC2B2E898, 0x5A2A7000); const __m128i k_ipt2 = _mm_set_epi32( 0xCD80B1FC, 0xB0FDCC81, 0x4C01307D, 0x317C4D00); const __m128i k_inv1 = _mm_set_epi32( 0x04070309, 0x0A0B0C02, 0x0E05060F, 0x0D080180); const __m128i k_inv2 = _mm_set_epi32( 0x030D0E0C, 0x02050809, 0x01040A06, 0x0F0B0780); const __m128i sb1u = _mm_set_epi32( 0xA5DF7A6E, 0x142AF544, 0xB19BE18F, 0xCB503E00); const __m128i sb1t = _mm_set_epi32( 0x3BF7CCC1, 0x0D2ED9EF, 0x3618D415, 0xFAE22300); const __m128i mc_forward[4] = { _mm_set_epi32(0x0C0F0E0D, 0x080B0A09, 0x04070605, 0x00030201), _mm_set_epi32(0x00030201, 0x0C0F0E0D, 0x080B0A09, 0x04070605), _mm_set_epi32(0x04070605, 0x00030201, 0x0C0F0E0D, 0x080B0A09), _mm_set_epi32(0x080B0A09, 0x04070605, 0x00030201, 0x0C0F0E0D) }; const __m128i sr[4] = { _mm_set_epi32(0x0F0E0D0C, 0x0B0A0908, 0x07060504, 0x03020100), _mm_set_epi32(0x0B06010C, 0x07020D08, 0x030E0904, 0x0F0A0500), _mm_set_epi32(0x070E050C, 0x030A0108, 0x0F060D04, 0x0B020900), _mm_set_epi32(0x0306090C, 0x0F020508, 0x0B0E0104, 0x070A0D00), }; #define mm_xor3(x, y, z) _mm_xor_si128(x, _mm_xor_si128(y, z)) __m128i aes_schedule_transform(__m128i input, __m128i table_1, __m128i table_2) { __m128i i_1 = _mm_and_si128(low_nibs, input); __m128i i_2 = _mm_srli_epi32(_mm_andnot_si128(low_nibs, input), 4); input = _mm_and_si128(low_nibs, input); return _mm_xor_si128( _mm_shuffle_epi8(table_1, i_1), _mm_shuffle_epi8(table_2, i_2)); } __m128i aes_schedule_mangle(__m128i k, byte round_no) { __m128i t = _mm_shuffle_epi8(_mm_xor_si128(k, _mm_set1_epi8(0x5B)), mc_forward[0]); __m128i t2 = t; t = _mm_shuffle_epi8(t, mc_forward[0]); t2 = mm_xor3(t2, t, _mm_shuffle_epi8(t, mc_forward[0])); return _mm_shuffle_epi8(t2, sr[round_no % 4]); } __m128i aes_schedule_192_smear(__m128i x, __m128i y) { return mm_xor3(y, _mm_shuffle_epi32(x, 0xFE), _mm_shuffle_epi32(y, 0x80)); } __m128i aes_schedule_mangle_dec(__m128i k, byte round_no) { const __m128i dsk[8] = { _mm_set_epi32(0x4AED9334, 0x82255BFC, 0xB6116FC8, 0x7ED9A700), _mm_set_epi32(0x8BB89FAC, 0xE9DAFDCE, 0x45765162, 0x27143300), _mm_set_epi32(0x4622EE8A, 0xADC90561, 0x27438FEB, 0xCCA86400), _mm_set_epi32(0x73AEE13C, 0xBD602FF2, 0x815C13CE, 0x4F92DD00), _mm_set_epi32(0xF83F3EF9, 0xFA3D3CFB, 0x03C4C502, 0x01C6C700), _mm_set_epi32(0xA5526A9D, 0x7384BC4B, 0xEE1921D6, 0x38CFF700), _mm_set_epi32(0xA080D3F3, 0x10306343, 0xE3C390B0, 0x53732000), _mm_set_epi32(0x2F45AEC4, 0x8CE60D67, 0xA0CA214B, 0x036982E8) }; __m128i t = aes_schedule_transform(k, dsk[0], dsk[1]); __m128i output = _mm_shuffle_epi8(t, mc_forward[0]); t = aes_schedule_transform(t, dsk[2], dsk[3]); output = _mm_shuffle_epi8(_mm_xor_si128(t, output), mc_forward[0]); t = aes_schedule_transform(t, dsk[4], dsk[5]); output = _mm_shuffle_epi8(_mm_xor_si128(t, output), mc_forward[0]); t = aes_schedule_transform(t, dsk[6], dsk[7]); output = _mm_shuffle_epi8(_mm_xor_si128(t, output), mc_forward[0]); return _mm_shuffle_epi8(output, sr[round_no % 4]); } __m128i aes_schedule_mangle_last(__m128i k, byte round_no) { const __m128i out_tr1 = _mm_set_epi32( 0xF7974121, 0xDEBE6808, 0xFF9F4929, 0xD6B66000); const __m128i out_tr2 = _mm_set_epi32( 0xE10D5DB1, 0xB05C0CE0, 0x01EDBD51, 0x50BCEC00); k = _mm_shuffle_epi8(k, sr[round_no % 4]); k = _mm_xor_si128(k, _mm_set1_epi8(0x5B)); return aes_schedule_transform(k, out_tr1, out_tr2); } __m128i aes_schedule_mangle_last_dec(__m128i k) { const __m128i deskew1 = _mm_set_epi32( 0x1DFEB95A, 0x5DBEF91A, 0x07E4A340, 0x47A4E300); const __m128i deskew2 = _mm_set_epi32( 0x2841C2AB, 0xF49D1E77, 0x5F36B5DC, 0x83EA6900); k = _mm_xor_si128(k, _mm_set1_epi8(0x5B)); return aes_schedule_transform(k, deskew1, deskew2); } __m128i aes_schedule_round(__m128i* rcon, __m128i input1, __m128i input2) { if(rcon) { input2 = _mm_xor_si128(_mm_alignr_epi8(_mm_setzero_si128(), *rcon, 15), input2); *rcon = _mm_alignr_epi8(*rcon, *rcon, 15); // next rcon input1 = _mm_shuffle_epi32(input1, 0xFF); // rotate input1 = _mm_alignr_epi8(input1, input1, 1); } __m128i smeared = _mm_xor_si128(input2, _mm_slli_si128(input2, 4)); smeared = mm_xor3(smeared, _mm_slli_si128(smeared, 8), _mm_set1_epi8(0x5B)); __m128i t = _mm_srli_epi32(_mm_andnot_si128(low_nibs, input1), 4); input1 = _mm_and_si128(low_nibs, input1); __m128i t2 = _mm_shuffle_epi8(k_inv2, input1); input1 = _mm_xor_si128(input1, t); __m128i t3 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, t)); __m128i t4 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, input1)); __m128i t5 = _mm_xor_si128(input1, _mm_shuffle_epi8(k_inv1, t3)); __m128i t6 = _mm_xor_si128(t, _mm_shuffle_epi8(k_inv1, t4)); return mm_xor3(_mm_shuffle_epi8(sb1u, t5), _mm_shuffle_epi8(sb1t, t6), smeared); } __m128i aes_ssse3_encrypt(__m128i B, const __m128i* keys, size_t rounds) { const __m128i sb2u = _mm_set_epi32( 0x5EB7E955, 0xBC982FCD, 0xE27A93C6, 0x0B712400); const __m128i sb2t = _mm_set_epi32( 0xC2A163C8, 0xAB82234A, 0x69EB8840, 0x0AE12900); const __m128i sbou = _mm_set_epi32( 0x15AABF7A, 0xC502A878, 0xD0D26D17, 0x6FBDC700); const __m128i sbot = _mm_set_epi32( 0x8E1E90D1, 0x412B35FA, 0xCFE474A5, 0x5FBB6A00); const __m128i mc_backward[4] = { _mm_set_epi32(0x0E0D0C0F, 0x0A09080B, 0x06050407, 0x02010003), _mm_set_epi32(0x0A09080B, 0x06050407, 0x02010003, 0x0E0D0C0F), _mm_set_epi32(0x06050407, 0x02010003, 0x0E0D0C0F, 0x0A09080B), _mm_set_epi32(0x02010003, 0x0E0D0C0F, 0x0A09080B, 0x06050407), }; B = mm_xor3(_mm_shuffle_epi8(k_ipt1, _mm_and_si128(low_nibs, B)), _mm_shuffle_epi8(k_ipt2, _mm_srli_epi32( _mm_andnot_si128(low_nibs, B), 4)), _mm_loadu_si128(keys)); for(size_t r = 1; ; ++r) { const __m128i K = _mm_loadu_si128(keys + r); __m128i t = _mm_srli_epi32(_mm_andnot_si128(low_nibs, B), 4); B = _mm_and_si128(low_nibs, B); __m128i t2 = _mm_shuffle_epi8(k_inv2, B); B = _mm_xor_si128(B, t); __m128i t3 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, t)); __m128i t4 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, B)); __m128i t5 = _mm_xor_si128(B, _mm_shuffle_epi8(k_inv1, t3)); __m128i t6 = _mm_xor_si128(t, _mm_shuffle_epi8(k_inv1, t4)); if(r == rounds) { B = _mm_shuffle_epi8( mm_xor3(_mm_shuffle_epi8(sbou, t5), _mm_shuffle_epi8(sbot, t6), K), sr[r % 4]); return B; } __m128i t7 = mm_xor3(_mm_shuffle_epi8(sb1t, t6), _mm_shuffle_epi8(sb1u, t5), K); __m128i t8 = mm_xor3(_mm_shuffle_epi8(sb2t, t6), _mm_shuffle_epi8(sb2u, t5), _mm_shuffle_epi8(t7, mc_forward[r % 4])); B = mm_xor3(_mm_shuffle_epi8(t8, mc_forward[r % 4]), _mm_shuffle_epi8(t7, mc_backward[r % 4]), t8); } } __m128i aes_ssse3_decrypt(__m128i B, const __m128i* keys, size_t rounds) { const __m128i k_dipt1 = _mm_set_epi32( 0x154A411E, 0x114E451A, 0x0F505B04, 0x0B545F00); const __m128i k_dipt2 = _mm_set_epi32( 0x12771772, 0xF491F194, 0x86E383E6, 0x60056500); const __m128i sb9u = _mm_set_epi32( 0xCAD51F50, 0x4F994CC9, 0x851C0353, 0x9A86D600); const __m128i sb9t = _mm_set_epi32( 0x725E2C9E, 0xB2FBA565, 0xC03B1789, 0xECD74900); const __m128i sbeu = _mm_set_epi32( 0x22426004, 0x64B4F6B0, 0x46F29296, 0x26D4D000); const __m128i sbet = _mm_set_epi32( 0x9467F36B, 0x98593E32, 0x0C55A6CD, 0xFFAAC100); const __m128i sbdu = _mm_set_epi32( 0xF56E9B13, 0x882A4439, 0x7D57CCDF, 0xE6B1A200); const __m128i sbdt = _mm_set_epi32( 0x2931180D, 0x15DEEFD3, 0x3CE2FAF7, 0x24C6CB00); const __m128i sbbu = _mm_set_epi32( 0x602646F6, 0xB0F2D404, 0xD0226492, 0x96B44200); const __m128i sbbt = _mm_set_epi32( 0xF3FF0C3E, 0x3255AA6B, 0xC19498A6, 0xCD596700); __m128i mc = mc_forward[3]; __m128i t = _mm_shuffle_epi8(k_dipt2, _mm_srli_epi32( _mm_andnot_si128(low_nibs, B), 4)); B = mm_xor3(t, _mm_loadu_si128(keys), _mm_shuffle_epi8(k_dipt1, _mm_and_si128(B, low_nibs))); for(size_t r = 1; ; ++r) { const __m128i K = _mm_loadu_si128(keys + r); t = _mm_srli_epi32(_mm_andnot_si128(low_nibs, B), 4); B = _mm_and_si128(low_nibs, B); __m128i t2 = _mm_shuffle_epi8(k_inv2, B); B = _mm_xor_si128(B, t); __m128i t3 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, t)); __m128i t4 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, B)); __m128i t5 = _mm_xor_si128(B, _mm_shuffle_epi8(k_inv1, t3)); __m128i t6 = _mm_xor_si128(t, _mm_shuffle_epi8(k_inv1, t4)); if(r == rounds) { const __m128i sbou = _mm_set_epi32( 0xC7AA6DB9, 0xD4943E2D, 0x1387EA53, 0x7EF94000); const __m128i sbot = _mm_set_epi32( 0xCA4B8159, 0xD8C58E9C, 0x12D7560F, 0x93441D00); __m128i x = _mm_shuffle_epi8(sbou, t5); __m128i y = _mm_shuffle_epi8(sbot, t6); x = _mm_xor_si128(x, K); x = _mm_xor_si128(x, y); const u32bit which_sr = ((((rounds - 1) << 4) ^ 48) & 48) / 16; return _mm_shuffle_epi8(x, sr[which_sr]); } __m128i t8 = _mm_xor_si128(_mm_shuffle_epi8(sb9t, t6), _mm_xor_si128(_mm_shuffle_epi8(sb9u, t5), K)); __m128i t9 = mm_xor3(_mm_shuffle_epi8(t8, mc), _mm_shuffle_epi8(sbdu, t5), _mm_shuffle_epi8(sbdt, t6)); __m128i t12 = _mm_xor_si128( _mm_xor_si128( _mm_shuffle_epi8(t9, mc), _mm_shuffle_epi8(sbbu, t5)), _mm_shuffle_epi8(sbbt, t6)); B = _mm_xor_si128(_mm_xor_si128(_mm_shuffle_epi8(t12, mc), _mm_shuffle_epi8(sbeu, t5)), _mm_shuffle_epi8(sbet, t6)); mc = _mm_alignr_epi8(mc, mc, 12); } } } /* * AES-128 Encryption */ void AES_128_SSSE3::encrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(&EK[0]); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_encrypt(B, keys, 10)); } } /* * AES-128 Decryption */ void AES_128_SSSE3::decrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(&DK[0]); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_decrypt(B, keys, 10)); } } /* * AES-128 Key Schedule */ void AES_128_SSSE3::key_schedule(const byte keyb[], size_t) { __m128i rcon = _mm_set_epi32(0x702A9808, 0x4D7C7D81, 0x1F8391B9, 0xAF9DEEB6); __m128i key = _mm_loadu_si128(reinterpret_cast(keyb)); __m128i* EK_mm = reinterpret_cast<__m128i*>(&EK[0]); __m128i* DK_mm = reinterpret_cast<__m128i*>(&DK[0]); _mm_storeu_si128(DK_mm + 10, _mm_shuffle_epi8(key, sr[2])); key = aes_schedule_transform(key, k_ipt1, k_ipt2); _mm_storeu_si128(EK_mm, key); for(size_t i = 1; i != 10; ++i) { key = aes_schedule_round(&rcon, key, key); _mm_storeu_si128(EK_mm + i, aes_schedule_mangle(key, (12-i) % 4)); _mm_storeu_si128(DK_mm + (10-i), aes_schedule_mangle_dec(key, (10-i) % 4)); } key = aes_schedule_round(&rcon, key, key); _mm_storeu_si128(EK_mm + 10, aes_schedule_mangle_last(key, 2)); _mm_storeu_si128(DK_mm, aes_schedule_mangle_last_dec(key)); } /* * AES-192 Encryption */ void AES_192_SSSE3::encrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(&EK[0]); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_encrypt(B, keys, 12)); } } /* * AES-192 Decryption */ void AES_192_SSSE3::decrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(&DK[0]); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_decrypt(B, keys, 12)); } } /* * AES-192 Key Schedule */ void AES_192_SSSE3::key_schedule(const byte keyb[], size_t) { __m128i rcon = _mm_set_epi32(0x702A9808, 0x4D7C7D81, 0x1F8391B9, 0xAF9DEEB6); __m128i* EK_mm = reinterpret_cast<__m128i*>(&EK[0]); __m128i* DK_mm = reinterpret_cast<__m128i*>(&DK[0]); __m128i key1 = _mm_loadu_si128(reinterpret_cast(keyb)); __m128i key2 = _mm_loadu_si128(reinterpret_cast((keyb + 8))); _mm_storeu_si128(DK_mm + 12, _mm_shuffle_epi8(key1, sr[0])); key1 = aes_schedule_transform(key1, k_ipt1, k_ipt2); key2 = aes_schedule_transform(key2, k_ipt1, k_ipt2); _mm_storeu_si128(EK_mm + 0, key1); // key2 with 8 high bytes masked off __m128i t = _mm_slli_si128(_mm_srli_si128(key2, 8), 8); for(size_t i = 0; i != 4; ++i) { key2 = aes_schedule_round(&rcon, key2, key1); _mm_storeu_si128(EK_mm + 3*i+1, aes_schedule_mangle(_mm_alignr_epi8(key2, t, 8), (i+3)%4)); _mm_storeu_si128(DK_mm + 11-3*i, aes_schedule_mangle_dec(_mm_alignr_epi8(key2, t, 8), (i+3)%4)); t = aes_schedule_192_smear(key2, t); _mm_storeu_si128(EK_mm + 3*i+2, aes_schedule_mangle(t, (i+2)%4)); _mm_storeu_si128(DK_mm + 10-3*i, aes_schedule_mangle_dec(t, (i+2)%4)); key2 = aes_schedule_round(&rcon, t, key2); if(i == 3) { _mm_storeu_si128(EK_mm + 3*i+3, aes_schedule_mangle_last(key2, (i+1)%4)); _mm_storeu_si128(DK_mm + 9-3*i, aes_schedule_mangle_last_dec(key2)); } else { _mm_storeu_si128(EK_mm + 3*i+3, aes_schedule_mangle(key2, (i+1)%4)); _mm_storeu_si128(DK_mm + 9-3*i, aes_schedule_mangle_dec(key2, (i+1)%4)); } key1 = key2; key2 = aes_schedule_192_smear(key2, _mm_slli_si128(_mm_srli_si128(t, 8), 8)); t = _mm_slli_si128(_mm_srli_si128(key2, 8), 8); } } /* * AES-256 Encryption */ void AES_256_SSSE3::encrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(&EK[0]); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_encrypt(B, keys, 14)); } } /* * AES-256 Decryption */ void AES_256_SSSE3::decrypt_n(const byte in[], byte out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(&DK[0]); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_decrypt(B, keys, 14)); } } /* * AES-256 Key Schedule */ void AES_256_SSSE3::key_schedule(const byte keyb[], size_t) { __m128i rcon = _mm_set_epi32(0x702A9808, 0x4D7C7D81, 0x1F8391B9, 0xAF9DEEB6); __m128i* EK_mm = reinterpret_cast<__m128i*>(&EK[0]); __m128i* DK_mm = reinterpret_cast<__m128i*>(&DK[0]); __m128i key1 = _mm_loadu_si128(reinterpret_cast(keyb)); __m128i key2 = _mm_loadu_si128(reinterpret_cast((keyb + 16))); _mm_storeu_si128(DK_mm + 14, _mm_shuffle_epi8(key1, sr[2])); key1 = aes_schedule_transform(key1, k_ipt1, k_ipt2); key2 = aes_schedule_transform(key2, k_ipt1, k_ipt2); _mm_storeu_si128(EK_mm + 0, key1); _mm_storeu_si128(EK_mm + 1, aes_schedule_mangle(key2, 3)); _mm_storeu_si128(DK_mm + 13, aes_schedule_mangle_dec(key2, 1)); for(size_t i = 2; i != 14; i += 2) { __m128i k_t = key2; key1 = key2 = aes_schedule_round(&rcon, key2, key1); _mm_storeu_si128(EK_mm + i, aes_schedule_mangle(key2, i % 4)); _mm_storeu_si128(DK_mm + (14-i), aes_schedule_mangle_dec(key2, (i+2) % 4)); key2 = aes_schedule_round(NULL, _mm_shuffle_epi32(key2, 0xFF), k_t); _mm_storeu_si128(EK_mm + i + 1, aes_schedule_mangle(key2, (i - 1) % 4)); _mm_storeu_si128(DK_mm + (13-i), aes_schedule_mangle_dec(key2, (i+1) % 4)); } key2 = aes_schedule_round(&rcon, key2, key1); _mm_storeu_si128(EK_mm + 14, aes_schedule_mangle_last(key2, 2)); _mm_storeu_si128(DK_mm + 0, aes_schedule_mangle_last_dec(key2)); } } Botan-1.10.12/src/block/aes_ssse3/aes_ssse3.h0000664000175000017500000000362212654331322020401 0ustar jackjack00000000000000/* * AES using SSSE3 * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_AES_SSSE3_H__ #define BOTAN_AES_SSSE3_H__ #include namespace Botan { /** * AES-128 using SSSE3 */ class BOTAN_DLL AES_128_SSSE3 : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); zeroise(DK); } std::string name() const { return "AES-128"; } BlockCipher* clone() const { return new AES_128_SSSE3; } AES_128_SSSE3() : EK(44), DK(44) {} private: void key_schedule(const byte[], size_t); SecureVector EK, DK; }; /** * AES-192 using SSSE3 */ class BOTAN_DLL AES_192_SSSE3 : public Block_Cipher_Fixed_Params<16, 24> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); zeroise(DK); } std::string name() const { return "AES-192"; } BlockCipher* clone() const { return new AES_192_SSSE3; } AES_192_SSSE3() : EK(52), DK(52) {} private: void key_schedule(const byte[], size_t); SecureVector EK, DK; }; /** * AES-256 using SSSE3 */ class BOTAN_DLL AES_256_SSSE3 : public Block_Cipher_Fixed_Params<16, 32> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); zeroise(DK); } std::string name() const { return "AES-256"; } BlockCipher* clone() const { return new AES_256_SSSE3; } AES_256_SSSE3() : EK(60), DK(60) {} private: void key_schedule(const byte[], size_t); SecureVector EK, DK; }; } #endif Botan-1.10.12/src/block/aes_ssse3/info.txt0000664000175000017500000000026512654331322020034 0ustar jackjack00000000000000define AES_SSSE3 load_on auto need_isa ssse3 simd_engine # Intel C++ can't deal with syntax for defining constants :( gcc clang msvc sunstudio Botan-1.10.12/src/block/block_cipher.h0000664000175000017500000000640012654331322017242 0ustar jackjack00000000000000/* * Block Cipher Base Class * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BLOCK_CIPHER_H__ #define BOTAN_BLOCK_CIPHER_H__ #include namespace Botan { /** * This class represents a block cipher object. */ class BOTAN_DLL BlockCipher : public SymmetricAlgorithm { public: /** * @return block size of this algorithm */ virtual size_t block_size() const = 0; /** * @return native parallelism of this cipher in blocks */ virtual size_t parallelism() const { return 1; } /** * @return prefererred parallelism of this cipher in bytes */ size_t parallel_bytes() const { return parallelism() * block_size() * BOTAN_BLOCK_CIPHER_PAR_MULT; } /** * Encrypt a block. * @param in The plaintext block to be encrypted as a byte array. * Must be of length block_size(). * @param out The byte array designated to hold the encrypted block. * Must be of length block_size(). */ void encrypt(const byte in[], byte out[]) const { encrypt_n(in, out, 1); } /** * Decrypt a block. * @param in The ciphertext block to be decypted as a byte array. * Must be of length block_size(). * @param out The byte array designated to hold the decrypted block. * Must be of length block_size(). */ void decrypt(const byte in[], byte out[]) const { decrypt_n(in, out, 1); } /** * Encrypt a block. * @param block the plaintext block to be encrypted * Must be of length block_size(). Will hold the result when the function * has finished. */ void encrypt(byte block[]) const { encrypt_n(block, block, 1); } /** * Decrypt a block. * @param block the ciphertext block to be decrypted * Must be of length block_size(). Will hold the result when the function * has finished. */ void decrypt(byte block[]) const { decrypt_n(block, block, 1); } /** * Encrypt one or more blocks * @param in the input buffer (multiple of block_size()) * @param out the output buffer (same size as in) * @param blocks the number of blocks to process */ virtual void encrypt_n(const byte in[], byte out[], size_t blocks) const = 0; /** * Decrypt one or more blocks * @param in the input buffer (multiple of block_size()) * @param out the output buffer (same size as in) * @param blocks the number of blocks to process */ virtual void decrypt_n(const byte in[], byte out[], size_t blocks) const = 0; /** * Get a new object representing the same algorithm as *this */ virtual BlockCipher* clone() const = 0; }; /** * Represents a block cipher with a single fixed block size */ template class Block_Cipher_Fixed_Params : public BlockCipher { public: enum { BLOCK_SIZE = BS }; size_t block_size() const { return BS; } Key_Length_Specification key_spec() const { return Key_Length_Specification(KMIN, KMAX, KMOD); } }; } #endif Botan-1.10.12/src/block/blowfish/blfs_tab.cpp0000664000175000017500000003174512654331322020554 0ustar jackjack00000000000000/* * S-Box and P-Box Tables for Blowfish * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { const u32bit Blowfish::P_INIT[18] = { 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B }; const u32bit Blowfish::S_INIT[1024] = { 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A, 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7, 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0, 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 }; } Botan-1.10.12/src/block/blowfish/blowfish.cpp0000664000175000017500000001071312654331322020605 0ustar jackjack00000000000000/* * Blowfish * (C) 1999-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Blowfish Encryption */ void Blowfish::encrypt_n(const byte in[], byte out[], size_t blocks) const { const u32bit* S1 = &S[0]; const u32bit* S2 = &S[256]; const u32bit* S3 = &S[512]; const u32bit* S4 = &S[768]; for(size_t i = 0; i != blocks; ++i) { u32bit L = load_be(in, 0); u32bit R = load_be(in, 1); for(size_t j = 0; j != 16; j += 2) { L ^= P[j]; R ^= ((S1[get_byte(0, L)] + S2[get_byte(1, L)]) ^ S3[get_byte(2, L)]) + S4[get_byte(3, L)]; R ^= P[j+1]; L ^= ((S1[get_byte(0, R)] + S2[get_byte(1, R)]) ^ S3[get_byte(2, R)]) + S4[get_byte(3, R)]; } L ^= P[16]; R ^= P[17]; store_be(out, R, L); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Blowfish Decryption */ void Blowfish::decrypt_n(const byte in[], byte out[], size_t blocks) const { const u32bit* S1 = &S[0]; const u32bit* S2 = &S[256]; const u32bit* S3 = &S[512]; const u32bit* S4 = &S[768]; for(size_t i = 0; i != blocks; ++i) { u32bit L = load_be(in, 0); u32bit R = load_be(in, 1); for(size_t j = 17; j != 1; j -= 2) { L ^= P[j]; R ^= ((S1[get_byte(0, L)] + S2[get_byte(1, L)]) ^ S3[get_byte(2, L)]) + S4[get_byte(3, L)]; R ^= P[j-1]; L ^= ((S1[get_byte(0, R)] + S2[get_byte(1, R)]) ^ S3[get_byte(2, R)]) + S4[get_byte(3, R)]; } L ^= P[1]; R ^= P[0]; store_be(out, R, L); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Blowfish Key Schedule */ void Blowfish::key_schedule(const byte key[], size_t length) { clear(); const byte null_salt[16] = { 0 }; key_expansion(key, length, null_salt); } void Blowfish::key_expansion(const byte key[], size_t length, const byte salt[16]) { for(size_t i = 0, j = 0; i != 18; ++i, j += 4) P[i] ^= make_u32bit(key[(j ) % length], key[(j+1) % length], key[(j+2) % length], key[(j+3) % length]); u32bit L = 0, R = 0; generate_sbox(P, L, R, salt, 0); generate_sbox(S, L, R, salt, 2); } /* * Modified key schedule used for bcrypt password hashing */ void Blowfish::eks_key_schedule(const byte key[], size_t length, const byte salt[16], size_t workfactor) { if(length == 0 || length >= 56) throw Invalid_Key_Length("EKSBlowfish", length); if(workfactor == 0) throw std::invalid_argument("Bcrypt work factor must be at least 1"); /* * On a 2.8 GHz Core-i7, workfactor == 18 takes about 25 seconds to * hash a password. This seems like a reasonable upper bound for the * time being. */ if(workfactor > 18) throw std::invalid_argument("Requested Bcrypt work factor too large"); clear(); const byte null_salt[16] = { 0 }; key_expansion(key, length, salt); const size_t rounds = 1 << workfactor; for(size_t r = 0; r != rounds; ++r) { key_expansion(key, length, null_salt); key_expansion(salt, 16, null_salt); } } /* * Generate one of the Sboxes */ void Blowfish::generate_sbox(MemoryRegion& box, u32bit& L, u32bit& R, const byte salt[16], size_t salt_off) const { const u32bit* S1 = &S[0]; const u32bit* S2 = &S[256]; const u32bit* S3 = &S[512]; const u32bit* S4 = &S[768]; for(size_t i = 0; i != box.size(); i += 2) { L ^= load_be(salt, (i + salt_off) % 4); R ^= load_be(salt, (i + salt_off + 1) % 4); for(size_t j = 0; j != 16; j += 2) { L ^= P[j]; R ^= ((S1[get_byte(0, L)] + S2[get_byte(1, L)]) ^ S3[get_byte(2, L)]) + S4[get_byte(3, L)]; R ^= P[j+1]; L ^= ((S1[get_byte(0, R)] + S2[get_byte(1, R)]) ^ S3[get_byte(2, R)]) + S4[get_byte(3, R)]; } u32bit T = R; R = L ^ P[16]; L = T ^ P[17]; box[i] = L; box[i+1] = R; } } /* * Clear memory of sensitive data */ void Blowfish::clear() { std::copy(P_INIT, P_INIT + 18, P.begin()); std::copy(S_INIT, S_INIT + 1024, S.begin()); } } Botan-1.10.12/src/block/blowfish/blowfish.h0000664000175000017500000000260312654331322020251 0ustar jackjack00000000000000/* * Blowfish * (C) 1999-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BLOWFISH_H__ #define BOTAN_BLOWFISH_H__ #include namespace Botan { /** * Blowfish */ class BOTAN_DLL Blowfish : public Block_Cipher_Fixed_Params<8, 1, 56> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; /** * Modified EKSBlowfish key schedule, used for bcrypt password hashing */ void eks_key_schedule(const byte key[], size_t key_length, const byte salt[16], size_t workfactor); void clear(); std::string name() const { return "Blowfish"; } BlockCipher* clone() const { return new Blowfish; } Blowfish() : S(1024), P(18) {} private: void key_schedule(const byte key[], size_t length); void key_expansion(const byte key[], size_t key_length, const byte salt[16]); void generate_sbox(MemoryRegion& box, u32bit& L, u32bit& R, const byte salt[16], size_t salt_off) const; static const u32bit P_INIT[18]; static const u32bit S_INIT[1024]; SecureVector S; SecureVector P; }; } #endif Botan-1.10.12/src/block/blowfish/info.txt0000664000175000017500000000002012654331322017746 0ustar jackjack00000000000000define BLOWFISH Botan-1.10.12/src/block/camellia/camellia.cpp0000664000175000017500000002506412654331322020476 0ustar jackjack00000000000000/* * Camellia * (C) 2012 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace Camellia_F { namespace { /* * We use the slow byte-wise version of F in the first and last rounds * to help protect against timing attacks */ u64bit F_SLOW(u64bit v, u64bit K) { static const byte SBOX[256] = { 0x70, 0x82, 0x2C, 0xEC, 0xB3, 0x27, 0xC0, 0xE5, 0xE4, 0x85, 0x57, 0x35, 0xEA, 0x0C, 0xAE, 0x41, 0x23, 0xEF, 0x6B, 0x93, 0x45, 0x19, 0xA5, 0x21, 0xED, 0x0E, 0x4F, 0x4E, 0x1D, 0x65, 0x92, 0xBD, 0x86, 0xB8, 0xAF, 0x8F, 0x7C, 0xEB, 0x1F, 0xCE, 0x3E, 0x30, 0xDC, 0x5F, 0x5E, 0xC5, 0x0B, 0x1A, 0xA6, 0xE1, 0x39, 0xCA, 0xD5, 0x47, 0x5D, 0x3D, 0xD9, 0x01, 0x5A, 0xD6, 0x51, 0x56, 0x6C, 0x4D, 0x8B, 0x0D, 0x9A, 0x66, 0xFB, 0xCC, 0xB0, 0x2D, 0x74, 0x12, 0x2B, 0x20, 0xF0, 0xB1, 0x84, 0x99, 0xDF, 0x4C, 0xCB, 0xC2, 0x34, 0x7E, 0x76, 0x05, 0x6D, 0xB7, 0xA9, 0x31, 0xD1, 0x17, 0x04, 0xD7, 0x14, 0x58, 0x3A, 0x61, 0xDE, 0x1B, 0x11, 0x1C, 0x32, 0x0F, 0x9C, 0x16, 0x53, 0x18, 0xF2, 0x22, 0xFE, 0x44, 0xCF, 0xB2, 0xC3, 0xB5, 0x7A, 0x91, 0x24, 0x08, 0xE8, 0xA8, 0x60, 0xFC, 0x69, 0x50, 0xAA, 0xD0, 0xA0, 0x7D, 0xA1, 0x89, 0x62, 0x97, 0x54, 0x5B, 0x1E, 0x95, 0xE0, 0xFF, 0x64, 0xD2, 0x10, 0xC4, 0x00, 0x48, 0xA3, 0xF7, 0x75, 0xDB, 0x8A, 0x03, 0xE6, 0xDA, 0x09, 0x3F, 0xDD, 0x94, 0x87, 0x5C, 0x83, 0x02, 0xCD, 0x4A, 0x90, 0x33, 0x73, 0x67, 0xF6, 0xF3, 0x9D, 0x7F, 0xBF, 0xE2, 0x52, 0x9B, 0xD8, 0x26, 0xC8, 0x37, 0xC6, 0x3B, 0x81, 0x96, 0x6F, 0x4B, 0x13, 0xBE, 0x63, 0x2E, 0xE9, 0x79, 0xA7, 0x8C, 0x9F, 0x6E, 0xBC, 0x8E, 0x29, 0xF5, 0xF9, 0xB6, 0x2F, 0xFD, 0xB4, 0x59, 0x78, 0x98, 0x06, 0x6A, 0xE7, 0x46, 0x71, 0xBA, 0xD4, 0x25, 0xAB, 0x42, 0x88, 0xA2, 0x8D, 0xFA, 0x72, 0x07, 0xB9, 0x55, 0xF8, 0xEE, 0xAC, 0x0A, 0x36, 0x49, 0x2A, 0x68, 0x3C, 0x38, 0xF1, 0xA4, 0x40, 0x28, 0xD3, 0x7B, 0xBB, 0xC9, 0x43, 0xC1, 0x15, 0xE3, 0xAD, 0xF4, 0x77, 0xC7, 0x80, 0x9E }; const u64bit x = v ^ K; const byte t1 = SBOX[get_byte(0, x)]; const byte t2 = rotate_left(SBOX[get_byte(1, x)], 1); const byte t3 = rotate_left(SBOX[get_byte(2, x)], 7); const byte t4 = SBOX[rotate_left(get_byte(3, x), 1)]; const byte t5 = rotate_left(SBOX[get_byte(4, x)], 1); const byte t6 = rotate_left(SBOX[get_byte(5, x)], 7); const byte t7 = SBOX[rotate_left(get_byte(6, x), 1)]; const byte t8 = SBOX[get_byte(7, x)]; const byte y1 = t1 ^ t3 ^ t4 ^ t6 ^ t7 ^ t8; const byte y2 = t1 ^ t2 ^ t4 ^ t5 ^ t7 ^ t8; const byte y3 = t1 ^ t2 ^ t3 ^ t5 ^ t6 ^ t8; const byte y4 = t2 ^ t3 ^ t4 ^ t5 ^ t6 ^ t7; const byte y5 = t1 ^ t2 ^ t6 ^ t7 ^ t8; const byte y6 = t2 ^ t3 ^ t5 ^ t7 ^ t8; const byte y7 = t3 ^ t4 ^ t5 ^ t6 ^ t8; const byte y8 = t1 ^ t4 ^ t5 ^ t6 ^ t7; return make_u64bit(y1, y2, y3, y4, y5, y6, y7, y8); } inline u64bit F(u64bit v, u64bit K) { const u64bit x = v ^ K; return Camellia_SBOX1[get_byte(0, x)] ^ Camellia_SBOX2[get_byte(1, x)] ^ Camellia_SBOX3[get_byte(2, x)] ^ Camellia_SBOX4[get_byte(3, x)] ^ Camellia_SBOX5[get_byte(4, x)] ^ Camellia_SBOX6[get_byte(5, x)] ^ Camellia_SBOX7[get_byte(6, x)] ^ Camellia_SBOX8[get_byte(7, x)]; } inline u64bit FL(u64bit v, u64bit K) { u32bit x1 = (v >> 32); u32bit x2 = (v & 0xFFFFFFFF); const u32bit k1 = (K >> 32); const u32bit k2 = (K & 0xFFFFFFFF); x2 ^= rotate_left(x1 & k1, 1); x1 ^= (x2 | k2); return ((static_cast(x1) << 32) | x2); } inline u64bit FLINV(u64bit v, u64bit K) { u32bit x1 = (v >> 32); u32bit x2 = (v & 0xFFFFFFFF); const u32bit k1 = (K >> 32); const u32bit k2 = (K & 0xFFFFFFFF); x1 ^= (x2 | k2); x2 ^= rotate_left(x1 & k1, 1); return ((static_cast(x1) << 32) | x2); } /* * Camellia Encryption */ void encrypt(const byte in[], byte out[], size_t blocks, const SecureVector& SK, const size_t rounds) { for(size_t i = 0; i != blocks; ++i) { u64bit D1 = load_be(in, 0); u64bit D2 = load_be(in, 1); const u64bit* K = &SK[0]; D1 ^= *K++; D2 ^= *K++; D2 ^= F_SLOW(D1, *K++); D1 ^= F_SLOW(D2, *K++); for(size_t r = 1; r != rounds - 1; ++r) { if(r % 3 == 0) { D1 = FL (D1, *K++); D2 = FLINV(D2, *K++); } D2 ^= F(D1, *K++); D1 ^= F(D2, *K++); } D2 ^= F_SLOW(D1, *K++); D1 ^= F_SLOW(D2, *K++); D2 ^= *K++; D1 ^= *K++; store_be(out, D2, D1); in += 16; out += 16; } } /* * Camellia Decryption */ void decrypt(const byte in[], byte out[], size_t blocks, const SecureVector& SK, const size_t rounds) { for(size_t i = 0; i != blocks; ++i) { u64bit D1 = load_be(in, 0); u64bit D2 = load_be(in, 1); const u64bit* K = &SK[SK.size()-1]; D2 ^= *K--; D1 ^= *K--; D2 ^= F_SLOW(D1, *K--); D1 ^= F_SLOW(D2, *K--); for(size_t r = 1; r != rounds - 1; ++r) { if(r % 3 == 0) { D1 = FL (D1, *K--); D2 = FLINV(D2, *K--); } D2 ^= F(D1, *K--); D1 ^= F(D2, *K--); } D2 ^= F_SLOW(D1, *K--); D1 ^= F_SLOW(D2, *K--); D1 ^= *K--; D2 ^= *K; store_be(out, D2, D1); in += 16; out += 16; } } u64bit left_rot_hi(u64bit h, u64bit l, size_t shift) { return (h << shift) | ((l >> (64-shift))); } u64bit left_rot_lo(u64bit h, u64bit l, size_t shift) { return (h >> (64-shift)) | (l << shift); } /* * Camellia Key Schedule */ void key_schedule(SecureVector& SK, const byte key[], size_t length) { const u64bit Sigma1 = 0xA09E667F3BCC908B; const u64bit Sigma2 = 0xB67AE8584CAA73B2; const u64bit Sigma3 = 0xC6EF372FE94F82BE; const u64bit Sigma4 = 0x54FF53A5F1D36F1C; const u64bit Sigma5 = 0x10E527FADE682D1D; const u64bit Sigma6 = 0xB05688C2B3E6C1FD; const u64bit KL_H = load_be(key, 0); const u64bit KL_L = load_be(key, 1); const u64bit KR_H = (length >= 24) ? load_be(key, 2) : 0; const u64bit KR_L = (length == 32) ? load_be(key, 3) : ((length == 24) ? ~KR_H : 0); u64bit D1 = KL_H ^ KR_H; u64bit D2 = KL_L ^ KR_L; D2 ^= F(D1, Sigma1); D1 ^= F(D2, Sigma2); D1 ^= KL_H; D2 ^= KL_L; D2 ^= F(D1, Sigma3); D1 ^= F(D2, Sigma4); const u64bit KA_H = D1; const u64bit KA_L = D2; D1 = KA_H ^ KR_H; D2 = KA_L ^ KR_L; D2 ^= F(D1, Sigma5); D1 ^= F(D2, Sigma6); const u64bit KB_H = D1; const u64bit KB_L = D2; if(length == 16) { SK.resize(26); SK[ 0] = KL_H; SK[ 1] = KL_L; SK[ 2] = KA_H; SK[ 3] = KA_L; SK[ 4] = left_rot_hi(KL_H, KL_L, 15); SK[ 5] = left_rot_lo(KL_H, KL_L, 15); SK[ 6] = left_rot_hi(KA_H, KA_L, 15); SK[ 7] = left_rot_lo(KA_H, KA_L, 15); SK[ 8] = left_rot_hi(KA_H, KA_L, 30); SK[ 9] = left_rot_lo(KA_H, KA_L, 30); SK[10] = left_rot_hi(KL_H, KL_L, 45); SK[11] = left_rot_lo(KL_H, KL_L, 45); SK[12] = left_rot_hi(KA_H, KA_L, 45); SK[13] = left_rot_lo(KL_H, KL_L, 60); SK[14] = left_rot_hi(KA_H, KA_L, 60); SK[15] = left_rot_lo(KA_H, KA_L, 60); SK[16] = left_rot_lo(KL_H, KL_L, 77-64); SK[17] = left_rot_hi(KL_H, KL_L, 77-64); SK[18] = left_rot_lo(KL_H, KL_L, 94-64); SK[19] = left_rot_hi(KL_H, KL_L, 94-64); SK[20] = left_rot_lo(KA_H, KA_L, 94-64); SK[21] = left_rot_hi(KA_H, KA_L, 94-64); SK[22] = left_rot_lo(KL_H, KL_L, 111-64); SK[23] = left_rot_hi(KL_H, KL_L, 111-64); SK[24] = left_rot_lo(KA_H, KA_L, 111-64); SK[25] = left_rot_hi(KA_H, KA_L, 111-64); } else { SK.resize(34); SK[ 0] = KL_H; SK[ 1] = KL_L; SK[ 2] = KB_H; SK[ 3] = KB_L; SK[ 4] = left_rot_hi(KR_H, KR_L, 15); SK[ 5] = left_rot_lo(KR_H, KR_L, 15); SK[ 6] = left_rot_hi(KA_H, KA_L, 15); SK[ 7] = left_rot_lo(KA_H, KA_L, 15); SK[ 8] = left_rot_hi(KR_H, KR_L, 30); SK[ 9] = left_rot_lo(KR_H, KR_L, 30); SK[10] = left_rot_hi(KB_H, KB_L, 30); SK[11] = left_rot_lo(KB_H, KB_L, 30); SK[12] = left_rot_hi(KL_H, KL_L, 45); SK[13] = left_rot_lo(KL_H, KL_L, 45); SK[14] = left_rot_hi(KA_H, KA_L, 45); SK[15] = left_rot_lo(KA_H, KA_L, 45); SK[16] = left_rot_hi(KL_H, KL_L, 60); SK[17] = left_rot_lo(KL_H, KL_L, 60); SK[18] = left_rot_hi(KR_H, KR_L, 60); SK[19] = left_rot_lo(KR_H, KR_L, 60); SK[20] = left_rot_hi(KB_H, KB_L, 60); SK[21] = left_rot_lo(KB_H, KB_L, 60); SK[22] = left_rot_lo(KL_H, KL_L, 77-64); SK[23] = left_rot_hi(KL_H, KL_L, 77-64); SK[24] = left_rot_lo(KA_H, KA_L, 77-64); SK[25] = left_rot_hi(KA_H, KA_L, 77-64); SK[26] = left_rot_lo(KR_H, KR_L, 94-64); SK[27] = left_rot_hi(KR_H, KR_L, 94-64); SK[28] = left_rot_lo(KA_H, KA_L, 94-64); SK[29] = left_rot_hi(KA_H, KA_L, 94-64); SK[30] = left_rot_lo(KL_H, KL_L, 111-64); SK[31] = left_rot_hi(KL_H, KL_L, 111-64); SK[32] = left_rot_lo(KB_H, KB_L, 111-64); SK[33] = left_rot_hi(KB_H, KB_L, 111-64); } } } } void Camellia_128::encrypt_n(const byte in[], byte out[], size_t blocks) const { Camellia_F::encrypt(in, out, blocks, SK, 9); } void Camellia_192::encrypt_n(const byte in[], byte out[], size_t blocks) const { Camellia_F::encrypt(in, out, blocks, SK, 12); } void Camellia_256::encrypt_n(const byte in[], byte out[], size_t blocks) const { Camellia_F::encrypt(in, out, blocks, SK, 12); } void Camellia_128::decrypt_n(const byte in[], byte out[], size_t blocks) const { Camellia_F::decrypt(in, out, blocks, SK, 9); } void Camellia_192::decrypt_n(const byte in[], byte out[], size_t blocks) const { Camellia_F::decrypt(in, out, blocks, SK, 12); } void Camellia_256::decrypt_n(const byte in[], byte out[], size_t blocks) const { Camellia_F::decrypt(in, out, blocks, SK, 12); } void Camellia_128::key_schedule(const byte key[], size_t length) { Camellia_F::key_schedule(SK, key, length); } void Camellia_192::key_schedule(const byte key[], size_t length) { Camellia_F::key_schedule(SK, key, length); } void Camellia_256::key_schedule(const byte key[], size_t length) { Camellia_F::key_schedule(SK, key, length); } } Botan-1.10.12/src/block/camellia/camellia.h0000664000175000017500000000334712654331322020143 0ustar jackjack00000000000000/* * Camellia * (C) 2012 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CAMELLIA_H__ #define BOTAN_CAMELLIA_H__ #include namespace Botan { /** * Camellia-128 */ class BOTAN_DLL Camellia_128 : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { SK.clear(); } std::string name() const { return "Camellia-128"; } BlockCipher* clone() const { return new Camellia_128; } private: void key_schedule(const byte key[], size_t length); SecureVector SK; }; /** * Camellia-192 */ class BOTAN_DLL Camellia_192 : public Block_Cipher_Fixed_Params<16, 24> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { SK.clear(); } std::string name() const { return "Camellia-192"; } BlockCipher* clone() const { return new Camellia_192; } private: void key_schedule(const byte key[], size_t length); SecureVector SK; }; /** * Camellia-256 */ class BOTAN_DLL Camellia_256 : public Block_Cipher_Fixed_Params<16, 32> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { SK.clear(); } std::string name() const { return "Camellia-256"; } BlockCipher* clone() const { return new Camellia_256; } private: void key_schedule(const byte key[], size_t length); SecureVector SK; }; } #endif Botan-1.10.12/src/block/camellia/camellia_sbox.h0000664000175000017500000012104112654331322021166 0ustar jackjack00000000000000/* * Camellia SBox Tables * (C) 2012 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CAMELLIA_SBOX_H__ #define BOTAN_CAMELLIA_SBOX_H__ #include namespace Botan { const u64bit Camellia_SBOX1[256] = { 0x7070700070000070, 0x8282820082000082, 0x2C2C2C002C00002C, 0xECECEC00EC0000EC, 0xB3B3B300B30000B3, 0x2727270027000027, 0xC0C0C000C00000C0, 0xE5E5E500E50000E5, 0xE4E4E400E40000E4, 0x8585850085000085, 0x5757570057000057, 0x3535350035000035, 0xEAEAEA00EA0000EA, 0x0C0C0C000C00000C, 0xAEAEAE00AE0000AE, 0x4141410041000041, 0x2323230023000023, 0xEFEFEF00EF0000EF, 0x6B6B6B006B00006B, 0x9393930093000093, 0x4545450045000045, 0x1919190019000019, 0xA5A5A500A50000A5, 0x2121210021000021, 0xEDEDED00ED0000ED, 0x0E0E0E000E00000E, 0x4F4F4F004F00004F, 0x4E4E4E004E00004E, 0x1D1D1D001D00001D, 0x6565650065000065, 0x9292920092000092, 0xBDBDBD00BD0000BD, 0x8686860086000086, 0xB8B8B800B80000B8, 0xAFAFAF00AF0000AF, 0x8F8F8F008F00008F, 0x7C7C7C007C00007C, 0xEBEBEB00EB0000EB, 0x1F1F1F001F00001F, 0xCECECE00CE0000CE, 0x3E3E3E003E00003E, 0x3030300030000030, 0xDCDCDC00DC0000DC, 0x5F5F5F005F00005F, 0x5E5E5E005E00005E, 0xC5C5C500C50000C5, 0x0B0B0B000B00000B, 0x1A1A1A001A00001A, 0xA6A6A600A60000A6, 0xE1E1E100E10000E1, 0x3939390039000039, 0xCACACA00CA0000CA, 0xD5D5D500D50000D5, 0x4747470047000047, 0x5D5D5D005D00005D, 0x3D3D3D003D00003D, 0xD9D9D900D90000D9, 0x0101010001000001, 0x5A5A5A005A00005A, 0xD6D6D600D60000D6, 0x5151510051000051, 0x5656560056000056, 0x6C6C6C006C00006C, 0x4D4D4D004D00004D, 0x8B8B8B008B00008B, 0x0D0D0D000D00000D, 0x9A9A9A009A00009A, 0x6666660066000066, 0xFBFBFB00FB0000FB, 0xCCCCCC00CC0000CC, 0xB0B0B000B00000B0, 0x2D2D2D002D00002D, 0x7474740074000074, 0x1212120012000012, 0x2B2B2B002B00002B, 0x2020200020000020, 0xF0F0F000F00000F0, 0xB1B1B100B10000B1, 0x8484840084000084, 0x9999990099000099, 0xDFDFDF00DF0000DF, 0x4C4C4C004C00004C, 0xCBCBCB00CB0000CB, 0xC2C2C200C20000C2, 0x3434340034000034, 0x7E7E7E007E00007E, 0x7676760076000076, 0x0505050005000005, 0x6D6D6D006D00006D, 0xB7B7B700B70000B7, 0xA9A9A900A90000A9, 0x3131310031000031, 0xD1D1D100D10000D1, 0x1717170017000017, 0x0404040004000004, 0xD7D7D700D70000D7, 0x1414140014000014, 0x5858580058000058, 0x3A3A3A003A00003A, 0x6161610061000061, 0xDEDEDE00DE0000DE, 0x1B1B1B001B00001B, 0x1111110011000011, 0x1C1C1C001C00001C, 0x3232320032000032, 0x0F0F0F000F00000F, 0x9C9C9C009C00009C, 0x1616160016000016, 0x5353530053000053, 0x1818180018000018, 0xF2F2F200F20000F2, 0x2222220022000022, 0xFEFEFE00FE0000FE, 0x4444440044000044, 0xCFCFCF00CF0000CF, 0xB2B2B200B20000B2, 0xC3C3C300C30000C3, 0xB5B5B500B50000B5, 0x7A7A7A007A00007A, 0x9191910091000091, 0x2424240024000024, 0x0808080008000008, 0xE8E8E800E80000E8, 0xA8A8A800A80000A8, 0x6060600060000060, 0xFCFCFC00FC0000FC, 0x6969690069000069, 0x5050500050000050, 0xAAAAAA00AA0000AA, 0xD0D0D000D00000D0, 0xA0A0A000A00000A0, 0x7D7D7D007D00007D, 0xA1A1A100A10000A1, 0x8989890089000089, 0x6262620062000062, 0x9797970097000097, 0x5454540054000054, 0x5B5B5B005B00005B, 0x1E1E1E001E00001E, 0x9595950095000095, 0xE0E0E000E00000E0, 0xFFFFFF00FF0000FF, 0x6464640064000064, 0xD2D2D200D20000D2, 0x1010100010000010, 0xC4C4C400C40000C4, 0x0000000000000000, 0x4848480048000048, 0xA3A3A300A30000A3, 0xF7F7F700F70000F7, 0x7575750075000075, 0xDBDBDB00DB0000DB, 0x8A8A8A008A00008A, 0x0303030003000003, 0xE6E6E600E60000E6, 0xDADADA00DA0000DA, 0x0909090009000009, 0x3F3F3F003F00003F, 0xDDDDDD00DD0000DD, 0x9494940094000094, 0x8787870087000087, 0x5C5C5C005C00005C, 0x8383830083000083, 0x0202020002000002, 0xCDCDCD00CD0000CD, 0x4A4A4A004A00004A, 0x9090900090000090, 0x3333330033000033, 0x7373730073000073, 0x6767670067000067, 0xF6F6F600F60000F6, 0xF3F3F300F30000F3, 0x9D9D9D009D00009D, 0x7F7F7F007F00007F, 0xBFBFBF00BF0000BF, 0xE2E2E200E20000E2, 0x5252520052000052, 0x9B9B9B009B00009B, 0xD8D8D800D80000D8, 0x2626260026000026, 0xC8C8C800C80000C8, 0x3737370037000037, 0xC6C6C600C60000C6, 0x3B3B3B003B00003B, 0x8181810081000081, 0x9696960096000096, 0x6F6F6F006F00006F, 0x4B4B4B004B00004B, 0x1313130013000013, 0xBEBEBE00BE0000BE, 0x6363630063000063, 0x2E2E2E002E00002E, 0xE9E9E900E90000E9, 0x7979790079000079, 0xA7A7A700A70000A7, 0x8C8C8C008C00008C, 0x9F9F9F009F00009F, 0x6E6E6E006E00006E, 0xBCBCBC00BC0000BC, 0x8E8E8E008E00008E, 0x2929290029000029, 0xF5F5F500F50000F5, 0xF9F9F900F90000F9, 0xB6B6B600B60000B6, 0x2F2F2F002F00002F, 0xFDFDFD00FD0000FD, 0xB4B4B400B40000B4, 0x5959590059000059, 0x7878780078000078, 0x9898980098000098, 0x0606060006000006, 0x6A6A6A006A00006A, 0xE7E7E700E70000E7, 0x4646460046000046, 0x7171710071000071, 0xBABABA00BA0000BA, 0xD4D4D400D40000D4, 0x2525250025000025, 0xABABAB00AB0000AB, 0x4242420042000042, 0x8888880088000088, 0xA2A2A200A20000A2, 0x8D8D8D008D00008D, 0xFAFAFA00FA0000FA, 0x7272720072000072, 0x0707070007000007, 0xB9B9B900B90000B9, 0x5555550055000055, 0xF8F8F800F80000F8, 0xEEEEEE00EE0000EE, 0xACACAC00AC0000AC, 0x0A0A0A000A00000A, 0x3636360036000036, 0x4949490049000049, 0x2A2A2A002A00002A, 0x6868680068000068, 0x3C3C3C003C00003C, 0x3838380038000038, 0xF1F1F100F10000F1, 0xA4A4A400A40000A4, 0x4040400040000040, 0x2828280028000028, 0xD3D3D300D30000D3, 0x7B7B7B007B00007B, 0xBBBBBB00BB0000BB, 0xC9C9C900C90000C9, 0x4343430043000043, 0xC1C1C100C10000C1, 0x1515150015000015, 0xE3E3E300E30000E3, 0xADADAD00AD0000AD, 0xF4F4F400F40000F4, 0x7777770077000077, 0xC7C7C700C70000C7, 0x8080800080000080, 0x9E9E9E009E00009E }; const u64bit Camellia_SBOX2[256] = { 0x00E0E0E0E0E00000, 0x0005050505050000, 0x0058585858580000, 0x00D9D9D9D9D90000, 0x0067676767670000, 0x004E4E4E4E4E0000, 0x0081818181810000, 0x00CBCBCBCBCB0000, 0x00C9C9C9C9C90000, 0x000B0B0B0B0B0000, 0x00AEAEAEAEAE0000, 0x006A6A6A6A6A0000, 0x00D5D5D5D5D50000, 0x0018181818180000, 0x005D5D5D5D5D0000, 0x0082828282820000, 0x0046464646460000, 0x00DFDFDFDFDF0000, 0x00D6D6D6D6D60000, 0x0027272727270000, 0x008A8A8A8A8A0000, 0x0032323232320000, 0x004B4B4B4B4B0000, 0x0042424242420000, 0x00DBDBDBDBDB0000, 0x001C1C1C1C1C0000, 0x009E9E9E9E9E0000, 0x009C9C9C9C9C0000, 0x003A3A3A3A3A0000, 0x00CACACACACA0000, 0x0025252525250000, 0x007B7B7B7B7B0000, 0x000D0D0D0D0D0000, 0x0071717171710000, 0x005F5F5F5F5F0000, 0x001F1F1F1F1F0000, 0x00F8F8F8F8F80000, 0x00D7D7D7D7D70000, 0x003E3E3E3E3E0000, 0x009D9D9D9D9D0000, 0x007C7C7C7C7C0000, 0x0060606060600000, 0x00B9B9B9B9B90000, 0x00BEBEBEBEBE0000, 0x00BCBCBCBCBC0000, 0x008B8B8B8B8B0000, 0x0016161616160000, 0x0034343434340000, 0x004D4D4D4D4D0000, 0x00C3C3C3C3C30000, 0x0072727272720000, 0x0095959595950000, 0x00ABABABABAB0000, 0x008E8E8E8E8E0000, 0x00BABABABABA0000, 0x007A7A7A7A7A0000, 0x00B3B3B3B3B30000, 0x0002020202020000, 0x00B4B4B4B4B40000, 0x00ADADADADAD0000, 0x00A2A2A2A2A20000, 0x00ACACACACAC0000, 0x00D8D8D8D8D80000, 0x009A9A9A9A9A0000, 0x0017171717170000, 0x001A1A1A1A1A0000, 0x0035353535350000, 0x00CCCCCCCCCC0000, 0x00F7F7F7F7F70000, 0x0099999999990000, 0x0061616161610000, 0x005A5A5A5A5A0000, 0x00E8E8E8E8E80000, 0x0024242424240000, 0x0056565656560000, 0x0040404040400000, 0x00E1E1E1E1E10000, 0x0063636363630000, 0x0009090909090000, 0x0033333333330000, 0x00BFBFBFBFBF0000, 0x0098989898980000, 0x0097979797970000, 0x0085858585850000, 0x0068686868680000, 0x00FCFCFCFCFC0000, 0x00ECECECECEC0000, 0x000A0A0A0A0A0000, 0x00DADADADADA0000, 0x006F6F6F6F6F0000, 0x0053535353530000, 0x0062626262620000, 0x00A3A3A3A3A30000, 0x002E2E2E2E2E0000, 0x0008080808080000, 0x00AFAFAFAFAF0000, 0x0028282828280000, 0x00B0B0B0B0B00000, 0x0074747474740000, 0x00C2C2C2C2C20000, 0x00BDBDBDBDBD0000, 0x0036363636360000, 0x0022222222220000, 0x0038383838380000, 0x0064646464640000, 0x001E1E1E1E1E0000, 0x0039393939390000, 0x002C2C2C2C2C0000, 0x00A6A6A6A6A60000, 0x0030303030300000, 0x00E5E5E5E5E50000, 0x0044444444440000, 0x00FDFDFDFDFD0000, 0x0088888888880000, 0x009F9F9F9F9F0000, 0x0065656565650000, 0x0087878787870000, 0x006B6B6B6B6B0000, 0x00F4F4F4F4F40000, 0x0023232323230000, 0x0048484848480000, 0x0010101010100000, 0x00D1D1D1D1D10000, 0x0051515151510000, 0x00C0C0C0C0C00000, 0x00F9F9F9F9F90000, 0x00D2D2D2D2D20000, 0x00A0A0A0A0A00000, 0x0055555555550000, 0x00A1A1A1A1A10000, 0x0041414141410000, 0x00FAFAFAFAFA0000, 0x0043434343430000, 0x0013131313130000, 0x00C4C4C4C4C40000, 0x002F2F2F2F2F0000, 0x00A8A8A8A8A80000, 0x00B6B6B6B6B60000, 0x003C3C3C3C3C0000, 0x002B2B2B2B2B0000, 0x00C1C1C1C1C10000, 0x00FFFFFFFFFF0000, 0x00C8C8C8C8C80000, 0x00A5A5A5A5A50000, 0x0020202020200000, 0x0089898989890000, 0x0000000000000000, 0x0090909090900000, 0x0047474747470000, 0x00EFEFEFEFEF0000, 0x00EAEAEAEAEA0000, 0x00B7B7B7B7B70000, 0x0015151515150000, 0x0006060606060000, 0x00CDCDCDCDCD0000, 0x00B5B5B5B5B50000, 0x0012121212120000, 0x007E7E7E7E7E0000, 0x00BBBBBBBBBB0000, 0x0029292929290000, 0x000F0F0F0F0F0000, 0x00B8B8B8B8B80000, 0x0007070707070000, 0x0004040404040000, 0x009B9B9B9B9B0000, 0x0094949494940000, 0x0021212121210000, 0x0066666666660000, 0x00E6E6E6E6E60000, 0x00CECECECECE0000, 0x00EDEDEDEDED0000, 0x00E7E7E7E7E70000, 0x003B3B3B3B3B0000, 0x00FEFEFEFEFE0000, 0x007F7F7F7F7F0000, 0x00C5C5C5C5C50000, 0x00A4A4A4A4A40000, 0x0037373737370000, 0x00B1B1B1B1B10000, 0x004C4C4C4C4C0000, 0x0091919191910000, 0x006E6E6E6E6E0000, 0x008D8D8D8D8D0000, 0x0076767676760000, 0x0003030303030000, 0x002D2D2D2D2D0000, 0x00DEDEDEDEDE0000, 0x0096969696960000, 0x0026262626260000, 0x007D7D7D7D7D0000, 0x00C6C6C6C6C60000, 0x005C5C5C5C5C0000, 0x00D3D3D3D3D30000, 0x00F2F2F2F2F20000, 0x004F4F4F4F4F0000, 0x0019191919190000, 0x003F3F3F3F3F0000, 0x00DCDCDCDCDC0000, 0x0079797979790000, 0x001D1D1D1D1D0000, 0x0052525252520000, 0x00EBEBEBEBEB0000, 0x00F3F3F3F3F30000, 0x006D6D6D6D6D0000, 0x005E5E5E5E5E0000, 0x00FBFBFBFBFB0000, 0x0069696969690000, 0x00B2B2B2B2B20000, 0x00F0F0F0F0F00000, 0x0031313131310000, 0x000C0C0C0C0C0000, 0x00D4D4D4D4D40000, 0x00CFCFCFCFCF0000, 0x008C8C8C8C8C0000, 0x00E2E2E2E2E20000, 0x0075757575750000, 0x00A9A9A9A9A90000, 0x004A4A4A4A4A0000, 0x0057575757570000, 0x0084848484840000, 0x0011111111110000, 0x0045454545450000, 0x001B1B1B1B1B0000, 0x00F5F5F5F5F50000, 0x00E4E4E4E4E40000, 0x000E0E0E0E0E0000, 0x0073737373730000, 0x00AAAAAAAAAA0000, 0x00F1F1F1F1F10000, 0x00DDDDDDDDDD0000, 0x0059595959590000, 0x0014141414140000, 0x006C6C6C6C6C0000, 0x0092929292920000, 0x0054545454540000, 0x00D0D0D0D0D00000, 0x0078787878780000, 0x0070707070700000, 0x00E3E3E3E3E30000, 0x0049494949490000, 0x0080808080800000, 0x0050505050500000, 0x00A7A7A7A7A70000, 0x00F6F6F6F6F60000, 0x0077777777770000, 0x0093939393930000, 0x0086868686860000, 0x0083838383830000, 0x002A2A2A2A2A0000, 0x00C7C7C7C7C70000, 0x005B5B5B5B5B0000, 0x00E9E9E9E9E90000, 0x00EEEEEEEEEE0000, 0x008F8F8F8F8F0000, 0x0001010101010000, 0x003D3D3D3D3D0000 }; const u64bit Camellia_SBOX3[256] = { 0x3800383800383800, 0x4100414100414100, 0x1600161600161600, 0x7600767600767600, 0xD900D9D900D9D900, 0x9300939300939300, 0x6000606000606000, 0xF200F2F200F2F200, 0x7200727200727200, 0xC200C2C200C2C200, 0xAB00ABAB00ABAB00, 0x9A009A9A009A9A00, 0x7500757500757500, 0x0600060600060600, 0x5700575700575700, 0xA000A0A000A0A000, 0x9100919100919100, 0xF700F7F700F7F700, 0xB500B5B500B5B500, 0xC900C9C900C9C900, 0xA200A2A200A2A200, 0x8C008C8C008C8C00, 0xD200D2D200D2D200, 0x9000909000909000, 0xF600F6F600F6F600, 0x0700070700070700, 0xA700A7A700A7A700, 0x2700272700272700, 0x8E008E8E008E8E00, 0xB200B2B200B2B200, 0x4900494900494900, 0xDE00DEDE00DEDE00, 0x4300434300434300, 0x5C005C5C005C5C00, 0xD700D7D700D7D700, 0xC700C7C700C7C700, 0x3E003E3E003E3E00, 0xF500F5F500F5F500, 0x8F008F8F008F8F00, 0x6700676700676700, 0x1F001F1F001F1F00, 0x1800181800181800, 0x6E006E6E006E6E00, 0xAF00AFAF00AFAF00, 0x2F002F2F002F2F00, 0xE200E2E200E2E200, 0x8500858500858500, 0x0D000D0D000D0D00, 0x5300535300535300, 0xF000F0F000F0F000, 0x9C009C9C009C9C00, 0x6500656500656500, 0xEA00EAEA00EAEA00, 0xA300A3A300A3A300, 0xAE00AEAE00AEAE00, 0x9E009E9E009E9E00, 0xEC00ECEC00ECEC00, 0x8000808000808000, 0x2D002D2D002D2D00, 0x6B006B6B006B6B00, 0xA800A8A800A8A800, 0x2B002B2B002B2B00, 0x3600363600363600, 0xA600A6A600A6A600, 0xC500C5C500C5C500, 0x8600868600868600, 0x4D004D4D004D4D00, 0x3300333300333300, 0xFD00FDFD00FDFD00, 0x6600666600666600, 0x5800585800585800, 0x9600969600969600, 0x3A003A3A003A3A00, 0x0900090900090900, 0x9500959500959500, 0x1000101000101000, 0x7800787800787800, 0xD800D8D800D8D800, 0x4200424200424200, 0xCC00CCCC00CCCC00, 0xEF00EFEF00EFEF00, 0x2600262600262600, 0xE500E5E500E5E500, 0x6100616100616100, 0x1A001A1A001A1A00, 0x3F003F3F003F3F00, 0x3B003B3B003B3B00, 0x8200828200828200, 0xB600B6B600B6B600, 0xDB00DBDB00DBDB00, 0xD400D4D400D4D400, 0x9800989800989800, 0xE800E8E800E8E800, 0x8B008B8B008B8B00, 0x0200020200020200, 0xEB00EBEB00EBEB00, 0x0A000A0A000A0A00, 0x2C002C2C002C2C00, 0x1D001D1D001D1D00, 0xB000B0B000B0B000, 0x6F006F6F006F6F00, 0x8D008D8D008D8D00, 0x8800888800888800, 0x0E000E0E000E0E00, 0x1900191900191900, 0x8700878700878700, 0x4E004E4E004E4E00, 0x0B000B0B000B0B00, 0xA900A9A900A9A900, 0x0C000C0C000C0C00, 0x7900797900797900, 0x1100111100111100, 0x7F007F7F007F7F00, 0x2200222200222200, 0xE700E7E700E7E700, 0x5900595900595900, 0xE100E1E100E1E100, 0xDA00DADA00DADA00, 0x3D003D3D003D3D00, 0xC800C8C800C8C800, 0x1200121200121200, 0x0400040400040400, 0x7400747400747400, 0x5400545400545400, 0x3000303000303000, 0x7E007E7E007E7E00, 0xB400B4B400B4B400, 0x2800282800282800, 0x5500555500555500, 0x6800686800686800, 0x5000505000505000, 0xBE00BEBE00BEBE00, 0xD000D0D000D0D000, 0xC400C4C400C4C400, 0x3100313100313100, 0xCB00CBCB00CBCB00, 0x2A002A2A002A2A00, 0xAD00ADAD00ADAD00, 0x0F000F0F000F0F00, 0xCA00CACA00CACA00, 0x7000707000707000, 0xFF00FFFF00FFFF00, 0x3200323200323200, 0x6900696900696900, 0x0800080800080800, 0x6200626200626200, 0x0000000000000000, 0x2400242400242400, 0xD100D1D100D1D100, 0xFB00FBFB00FBFB00, 0xBA00BABA00BABA00, 0xED00EDED00EDED00, 0x4500454500454500, 0x8100818100818100, 0x7300737300737300, 0x6D006D6D006D6D00, 0x8400848400848400, 0x9F009F9F009F9F00, 0xEE00EEEE00EEEE00, 0x4A004A4A004A4A00, 0xC300C3C300C3C300, 0x2E002E2E002E2E00, 0xC100C1C100C1C100, 0x0100010100010100, 0xE600E6E600E6E600, 0x2500252500252500, 0x4800484800484800, 0x9900999900999900, 0xB900B9B900B9B900, 0xB300B3B300B3B300, 0x7B007B7B007B7B00, 0xF900F9F900F9F900, 0xCE00CECE00CECE00, 0xBF00BFBF00BFBF00, 0xDF00DFDF00DFDF00, 0x7100717100717100, 0x2900292900292900, 0xCD00CDCD00CDCD00, 0x6C006C6C006C6C00, 0x1300131300131300, 0x6400646400646400, 0x9B009B9B009B9B00, 0x6300636300636300, 0x9D009D9D009D9D00, 0xC000C0C000C0C000, 0x4B004B4B004B4B00, 0xB700B7B700B7B700, 0xA500A5A500A5A500, 0x8900898900898900, 0x5F005F5F005F5F00, 0xB100B1B100B1B100, 0x1700171700171700, 0xF400F4F400F4F400, 0xBC00BCBC00BCBC00, 0xD300D3D300D3D300, 0x4600464600464600, 0xCF00CFCF00CFCF00, 0x3700373700373700, 0x5E005E5E005E5E00, 0x4700474700474700, 0x9400949400949400, 0xFA00FAFA00FAFA00, 0xFC00FCFC00FCFC00, 0x5B005B5B005B5B00, 0x9700979700979700, 0xFE00FEFE00FEFE00, 0x5A005A5A005A5A00, 0xAC00ACAC00ACAC00, 0x3C003C3C003C3C00, 0x4C004C4C004C4C00, 0x0300030300030300, 0x3500353500353500, 0xF300F3F300F3F300, 0x2300232300232300, 0xB800B8B800B8B800, 0x5D005D5D005D5D00, 0x6A006A6A006A6A00, 0x9200929200929200, 0xD500D5D500D5D500, 0x2100212100212100, 0x4400444400444400, 0x5100515100515100, 0xC600C6C600C6C600, 0x7D007D7D007D7D00, 0x3900393900393900, 0x8300838300838300, 0xDC00DCDC00DCDC00, 0xAA00AAAA00AAAA00, 0x7C007C7C007C7C00, 0x7700777700777700, 0x5600565600565600, 0x0500050500050500, 0x1B001B1B001B1B00, 0xA400A4A400A4A400, 0x1500151500151500, 0x3400343400343400, 0x1E001E1E001E1E00, 0x1C001C1C001C1C00, 0xF800F8F800F8F800, 0x5200525200525200, 0x2000202000202000, 0x1400141400141400, 0xE900E9E900E9E900, 0xBD00BDBD00BDBD00, 0xDD00DDDD00DDDD00, 0xE400E4E400E4E400, 0xA100A1A100A1A100, 0xE000E0E000E0E000, 0x8A008A8A008A8A00, 0xF100F1F100F1F100, 0xD600D6D600D6D600, 0x7A007A7A007A7A00, 0xBB00BBBB00BBBB00, 0xE300E3E300E3E300, 0x4000404000404000, 0x4F004F4F004F4F00 }; const u64bit Camellia_SBOX4[256] = { 0x7070007000007070, 0x2C2C002C00002C2C, 0xB3B300B30000B3B3, 0xC0C000C00000C0C0, 0xE4E400E40000E4E4, 0x5757005700005757, 0xEAEA00EA0000EAEA, 0xAEAE00AE0000AEAE, 0x2323002300002323, 0x6B6B006B00006B6B, 0x4545004500004545, 0xA5A500A50000A5A5, 0xEDED00ED0000EDED, 0x4F4F004F00004F4F, 0x1D1D001D00001D1D, 0x9292009200009292, 0x8686008600008686, 0xAFAF00AF0000AFAF, 0x7C7C007C00007C7C, 0x1F1F001F00001F1F, 0x3E3E003E00003E3E, 0xDCDC00DC0000DCDC, 0x5E5E005E00005E5E, 0x0B0B000B00000B0B, 0xA6A600A60000A6A6, 0x3939003900003939, 0xD5D500D50000D5D5, 0x5D5D005D00005D5D, 0xD9D900D90000D9D9, 0x5A5A005A00005A5A, 0x5151005100005151, 0x6C6C006C00006C6C, 0x8B8B008B00008B8B, 0x9A9A009A00009A9A, 0xFBFB00FB0000FBFB, 0xB0B000B00000B0B0, 0x7474007400007474, 0x2B2B002B00002B2B, 0xF0F000F00000F0F0, 0x8484008400008484, 0xDFDF00DF0000DFDF, 0xCBCB00CB0000CBCB, 0x3434003400003434, 0x7676007600007676, 0x6D6D006D00006D6D, 0xA9A900A90000A9A9, 0xD1D100D10000D1D1, 0x0404000400000404, 0x1414001400001414, 0x3A3A003A00003A3A, 0xDEDE00DE0000DEDE, 0x1111001100001111, 0x3232003200003232, 0x9C9C009C00009C9C, 0x5353005300005353, 0xF2F200F20000F2F2, 0xFEFE00FE0000FEFE, 0xCFCF00CF0000CFCF, 0xC3C300C30000C3C3, 0x7A7A007A00007A7A, 0x2424002400002424, 0xE8E800E80000E8E8, 0x6060006000006060, 0x6969006900006969, 0xAAAA00AA0000AAAA, 0xA0A000A00000A0A0, 0xA1A100A10000A1A1, 0x6262006200006262, 0x5454005400005454, 0x1E1E001E00001E1E, 0xE0E000E00000E0E0, 0x6464006400006464, 0x1010001000001010, 0x0000000000000000, 0xA3A300A30000A3A3, 0x7575007500007575, 0x8A8A008A00008A8A, 0xE6E600E60000E6E6, 0x0909000900000909, 0xDDDD00DD0000DDDD, 0x8787008700008787, 0x8383008300008383, 0xCDCD00CD0000CDCD, 0x9090009000009090, 0x7373007300007373, 0xF6F600F60000F6F6, 0x9D9D009D00009D9D, 0xBFBF00BF0000BFBF, 0x5252005200005252, 0xD8D800D80000D8D8, 0xC8C800C80000C8C8, 0xC6C600C60000C6C6, 0x8181008100008181, 0x6F6F006F00006F6F, 0x1313001300001313, 0x6363006300006363, 0xE9E900E90000E9E9, 0xA7A700A70000A7A7, 0x9F9F009F00009F9F, 0xBCBC00BC0000BCBC, 0x2929002900002929, 0xF9F900F90000F9F9, 0x2F2F002F00002F2F, 0xB4B400B40000B4B4, 0x7878007800007878, 0x0606000600000606, 0xE7E700E70000E7E7, 0x7171007100007171, 0xD4D400D40000D4D4, 0xABAB00AB0000ABAB, 0x8888008800008888, 0x8D8D008D00008D8D, 0x7272007200007272, 0xB9B900B90000B9B9, 0xF8F800F80000F8F8, 0xACAC00AC0000ACAC, 0x3636003600003636, 0x2A2A002A00002A2A, 0x3C3C003C00003C3C, 0xF1F100F10000F1F1, 0x4040004000004040, 0xD3D300D30000D3D3, 0xBBBB00BB0000BBBB, 0x4343004300004343, 0x1515001500001515, 0xADAD00AD0000ADAD, 0x7777007700007777, 0x8080008000008080, 0x8282008200008282, 0xECEC00EC0000ECEC, 0x2727002700002727, 0xE5E500E50000E5E5, 0x8585008500008585, 0x3535003500003535, 0x0C0C000C00000C0C, 0x4141004100004141, 0xEFEF00EF0000EFEF, 0x9393009300009393, 0x1919001900001919, 0x2121002100002121, 0x0E0E000E00000E0E, 0x4E4E004E00004E4E, 0x6565006500006565, 0xBDBD00BD0000BDBD, 0xB8B800B80000B8B8, 0x8F8F008F00008F8F, 0xEBEB00EB0000EBEB, 0xCECE00CE0000CECE, 0x3030003000003030, 0x5F5F005F00005F5F, 0xC5C500C50000C5C5, 0x1A1A001A00001A1A, 0xE1E100E10000E1E1, 0xCACA00CA0000CACA, 0x4747004700004747, 0x3D3D003D00003D3D, 0x0101000100000101, 0xD6D600D60000D6D6, 0x5656005600005656, 0x4D4D004D00004D4D, 0x0D0D000D00000D0D, 0x6666006600006666, 0xCCCC00CC0000CCCC, 0x2D2D002D00002D2D, 0x1212001200001212, 0x2020002000002020, 0xB1B100B10000B1B1, 0x9999009900009999, 0x4C4C004C00004C4C, 0xC2C200C20000C2C2, 0x7E7E007E00007E7E, 0x0505000500000505, 0xB7B700B70000B7B7, 0x3131003100003131, 0x1717001700001717, 0xD7D700D70000D7D7, 0x5858005800005858, 0x6161006100006161, 0x1B1B001B00001B1B, 0x1C1C001C00001C1C, 0x0F0F000F00000F0F, 0x1616001600001616, 0x1818001800001818, 0x2222002200002222, 0x4444004400004444, 0xB2B200B20000B2B2, 0xB5B500B50000B5B5, 0x9191009100009191, 0x0808000800000808, 0xA8A800A80000A8A8, 0xFCFC00FC0000FCFC, 0x5050005000005050, 0xD0D000D00000D0D0, 0x7D7D007D00007D7D, 0x8989008900008989, 0x9797009700009797, 0x5B5B005B00005B5B, 0x9595009500009595, 0xFFFF00FF0000FFFF, 0xD2D200D20000D2D2, 0xC4C400C40000C4C4, 0x4848004800004848, 0xF7F700F70000F7F7, 0xDBDB00DB0000DBDB, 0x0303000300000303, 0xDADA00DA0000DADA, 0x3F3F003F00003F3F, 0x9494009400009494, 0x5C5C005C00005C5C, 0x0202000200000202, 0x4A4A004A00004A4A, 0x3333003300003333, 0x6767006700006767, 0xF3F300F30000F3F3, 0x7F7F007F00007F7F, 0xE2E200E20000E2E2, 0x9B9B009B00009B9B, 0x2626002600002626, 0x3737003700003737, 0x3B3B003B00003B3B, 0x9696009600009696, 0x4B4B004B00004B4B, 0xBEBE00BE0000BEBE, 0x2E2E002E00002E2E, 0x7979007900007979, 0x8C8C008C00008C8C, 0x6E6E006E00006E6E, 0x8E8E008E00008E8E, 0xF5F500F50000F5F5, 0xB6B600B60000B6B6, 0xFDFD00FD0000FDFD, 0x5959005900005959, 0x9898009800009898, 0x6A6A006A00006A6A, 0x4646004600004646, 0xBABA00BA0000BABA, 0x2525002500002525, 0x4242004200004242, 0xA2A200A20000A2A2, 0xFAFA00FA0000FAFA, 0x0707000700000707, 0x5555005500005555, 0xEEEE00EE0000EEEE, 0x0A0A000A00000A0A, 0x4949004900004949, 0x6868006800006868, 0x3838003800003838, 0xA4A400A40000A4A4, 0x2828002800002828, 0x7B7B007B00007B7B, 0xC9C900C90000C9C9, 0xC1C100C10000C1C1, 0xE3E300E30000E3E3, 0xF4F400F40000F4F4, 0xC7C700C70000C7C7, 0x9E9E009E00009E9E }; const u64bit Camellia_SBOX5[256] = { 0x00E0E0E000E0E0E0, 0x0005050500050505, 0x0058585800585858, 0x00D9D9D900D9D9D9, 0x0067676700676767, 0x004E4E4E004E4E4E, 0x0081818100818181, 0x00CBCBCB00CBCBCB, 0x00C9C9C900C9C9C9, 0x000B0B0B000B0B0B, 0x00AEAEAE00AEAEAE, 0x006A6A6A006A6A6A, 0x00D5D5D500D5D5D5, 0x0018181800181818, 0x005D5D5D005D5D5D, 0x0082828200828282, 0x0046464600464646, 0x00DFDFDF00DFDFDF, 0x00D6D6D600D6D6D6, 0x0027272700272727, 0x008A8A8A008A8A8A, 0x0032323200323232, 0x004B4B4B004B4B4B, 0x0042424200424242, 0x00DBDBDB00DBDBDB, 0x001C1C1C001C1C1C, 0x009E9E9E009E9E9E, 0x009C9C9C009C9C9C, 0x003A3A3A003A3A3A, 0x00CACACA00CACACA, 0x0025252500252525, 0x007B7B7B007B7B7B, 0x000D0D0D000D0D0D, 0x0071717100717171, 0x005F5F5F005F5F5F, 0x001F1F1F001F1F1F, 0x00F8F8F800F8F8F8, 0x00D7D7D700D7D7D7, 0x003E3E3E003E3E3E, 0x009D9D9D009D9D9D, 0x007C7C7C007C7C7C, 0x0060606000606060, 0x00B9B9B900B9B9B9, 0x00BEBEBE00BEBEBE, 0x00BCBCBC00BCBCBC, 0x008B8B8B008B8B8B, 0x0016161600161616, 0x0034343400343434, 0x004D4D4D004D4D4D, 0x00C3C3C300C3C3C3, 0x0072727200727272, 0x0095959500959595, 0x00ABABAB00ABABAB, 0x008E8E8E008E8E8E, 0x00BABABA00BABABA, 0x007A7A7A007A7A7A, 0x00B3B3B300B3B3B3, 0x0002020200020202, 0x00B4B4B400B4B4B4, 0x00ADADAD00ADADAD, 0x00A2A2A200A2A2A2, 0x00ACACAC00ACACAC, 0x00D8D8D800D8D8D8, 0x009A9A9A009A9A9A, 0x0017171700171717, 0x001A1A1A001A1A1A, 0x0035353500353535, 0x00CCCCCC00CCCCCC, 0x00F7F7F700F7F7F7, 0x0099999900999999, 0x0061616100616161, 0x005A5A5A005A5A5A, 0x00E8E8E800E8E8E8, 0x0024242400242424, 0x0056565600565656, 0x0040404000404040, 0x00E1E1E100E1E1E1, 0x0063636300636363, 0x0009090900090909, 0x0033333300333333, 0x00BFBFBF00BFBFBF, 0x0098989800989898, 0x0097979700979797, 0x0085858500858585, 0x0068686800686868, 0x00FCFCFC00FCFCFC, 0x00ECECEC00ECECEC, 0x000A0A0A000A0A0A, 0x00DADADA00DADADA, 0x006F6F6F006F6F6F, 0x0053535300535353, 0x0062626200626262, 0x00A3A3A300A3A3A3, 0x002E2E2E002E2E2E, 0x0008080800080808, 0x00AFAFAF00AFAFAF, 0x0028282800282828, 0x00B0B0B000B0B0B0, 0x0074747400747474, 0x00C2C2C200C2C2C2, 0x00BDBDBD00BDBDBD, 0x0036363600363636, 0x0022222200222222, 0x0038383800383838, 0x0064646400646464, 0x001E1E1E001E1E1E, 0x0039393900393939, 0x002C2C2C002C2C2C, 0x00A6A6A600A6A6A6, 0x0030303000303030, 0x00E5E5E500E5E5E5, 0x0044444400444444, 0x00FDFDFD00FDFDFD, 0x0088888800888888, 0x009F9F9F009F9F9F, 0x0065656500656565, 0x0087878700878787, 0x006B6B6B006B6B6B, 0x00F4F4F400F4F4F4, 0x0023232300232323, 0x0048484800484848, 0x0010101000101010, 0x00D1D1D100D1D1D1, 0x0051515100515151, 0x00C0C0C000C0C0C0, 0x00F9F9F900F9F9F9, 0x00D2D2D200D2D2D2, 0x00A0A0A000A0A0A0, 0x0055555500555555, 0x00A1A1A100A1A1A1, 0x0041414100414141, 0x00FAFAFA00FAFAFA, 0x0043434300434343, 0x0013131300131313, 0x00C4C4C400C4C4C4, 0x002F2F2F002F2F2F, 0x00A8A8A800A8A8A8, 0x00B6B6B600B6B6B6, 0x003C3C3C003C3C3C, 0x002B2B2B002B2B2B, 0x00C1C1C100C1C1C1, 0x00FFFFFF00FFFFFF, 0x00C8C8C800C8C8C8, 0x00A5A5A500A5A5A5, 0x0020202000202020, 0x0089898900898989, 0x0000000000000000, 0x0090909000909090, 0x0047474700474747, 0x00EFEFEF00EFEFEF, 0x00EAEAEA00EAEAEA, 0x00B7B7B700B7B7B7, 0x0015151500151515, 0x0006060600060606, 0x00CDCDCD00CDCDCD, 0x00B5B5B500B5B5B5, 0x0012121200121212, 0x007E7E7E007E7E7E, 0x00BBBBBB00BBBBBB, 0x0029292900292929, 0x000F0F0F000F0F0F, 0x00B8B8B800B8B8B8, 0x0007070700070707, 0x0004040400040404, 0x009B9B9B009B9B9B, 0x0094949400949494, 0x0021212100212121, 0x0066666600666666, 0x00E6E6E600E6E6E6, 0x00CECECE00CECECE, 0x00EDEDED00EDEDED, 0x00E7E7E700E7E7E7, 0x003B3B3B003B3B3B, 0x00FEFEFE00FEFEFE, 0x007F7F7F007F7F7F, 0x00C5C5C500C5C5C5, 0x00A4A4A400A4A4A4, 0x0037373700373737, 0x00B1B1B100B1B1B1, 0x004C4C4C004C4C4C, 0x0091919100919191, 0x006E6E6E006E6E6E, 0x008D8D8D008D8D8D, 0x0076767600767676, 0x0003030300030303, 0x002D2D2D002D2D2D, 0x00DEDEDE00DEDEDE, 0x0096969600969696, 0x0026262600262626, 0x007D7D7D007D7D7D, 0x00C6C6C600C6C6C6, 0x005C5C5C005C5C5C, 0x00D3D3D300D3D3D3, 0x00F2F2F200F2F2F2, 0x004F4F4F004F4F4F, 0x0019191900191919, 0x003F3F3F003F3F3F, 0x00DCDCDC00DCDCDC, 0x0079797900797979, 0x001D1D1D001D1D1D, 0x0052525200525252, 0x00EBEBEB00EBEBEB, 0x00F3F3F300F3F3F3, 0x006D6D6D006D6D6D, 0x005E5E5E005E5E5E, 0x00FBFBFB00FBFBFB, 0x0069696900696969, 0x00B2B2B200B2B2B2, 0x00F0F0F000F0F0F0, 0x0031313100313131, 0x000C0C0C000C0C0C, 0x00D4D4D400D4D4D4, 0x00CFCFCF00CFCFCF, 0x008C8C8C008C8C8C, 0x00E2E2E200E2E2E2, 0x0075757500757575, 0x00A9A9A900A9A9A9, 0x004A4A4A004A4A4A, 0x0057575700575757, 0x0084848400848484, 0x0011111100111111, 0x0045454500454545, 0x001B1B1B001B1B1B, 0x00F5F5F500F5F5F5, 0x00E4E4E400E4E4E4, 0x000E0E0E000E0E0E, 0x0073737300737373, 0x00AAAAAA00AAAAAA, 0x00F1F1F100F1F1F1, 0x00DDDDDD00DDDDDD, 0x0059595900595959, 0x0014141400141414, 0x006C6C6C006C6C6C, 0x0092929200929292, 0x0054545400545454, 0x00D0D0D000D0D0D0, 0x0078787800787878, 0x0070707000707070, 0x00E3E3E300E3E3E3, 0x0049494900494949, 0x0080808000808080, 0x0050505000505050, 0x00A7A7A700A7A7A7, 0x00F6F6F600F6F6F6, 0x0077777700777777, 0x0093939300939393, 0x0086868600868686, 0x0083838300838383, 0x002A2A2A002A2A2A, 0x00C7C7C700C7C7C7, 0x005B5B5B005B5B5B, 0x00E9E9E900E9E9E9, 0x00EEEEEE00EEEEEE, 0x008F8F8F008F8F8F, 0x0001010100010101, 0x003D3D3D003D3D3D }; const u64bit Camellia_SBOX6[256] = { 0x3800383838003838, 0x4100414141004141, 0x1600161616001616, 0x7600767676007676, 0xD900D9D9D900D9D9, 0x9300939393009393, 0x6000606060006060, 0xF200F2F2F200F2F2, 0x7200727272007272, 0xC200C2C2C200C2C2, 0xAB00ABABAB00ABAB, 0x9A009A9A9A009A9A, 0x7500757575007575, 0x0600060606000606, 0x5700575757005757, 0xA000A0A0A000A0A0, 0x9100919191009191, 0xF700F7F7F700F7F7, 0xB500B5B5B500B5B5, 0xC900C9C9C900C9C9, 0xA200A2A2A200A2A2, 0x8C008C8C8C008C8C, 0xD200D2D2D200D2D2, 0x9000909090009090, 0xF600F6F6F600F6F6, 0x0700070707000707, 0xA700A7A7A700A7A7, 0x2700272727002727, 0x8E008E8E8E008E8E, 0xB200B2B2B200B2B2, 0x4900494949004949, 0xDE00DEDEDE00DEDE, 0x4300434343004343, 0x5C005C5C5C005C5C, 0xD700D7D7D700D7D7, 0xC700C7C7C700C7C7, 0x3E003E3E3E003E3E, 0xF500F5F5F500F5F5, 0x8F008F8F8F008F8F, 0x6700676767006767, 0x1F001F1F1F001F1F, 0x1800181818001818, 0x6E006E6E6E006E6E, 0xAF00AFAFAF00AFAF, 0x2F002F2F2F002F2F, 0xE200E2E2E200E2E2, 0x8500858585008585, 0x0D000D0D0D000D0D, 0x5300535353005353, 0xF000F0F0F000F0F0, 0x9C009C9C9C009C9C, 0x6500656565006565, 0xEA00EAEAEA00EAEA, 0xA300A3A3A300A3A3, 0xAE00AEAEAE00AEAE, 0x9E009E9E9E009E9E, 0xEC00ECECEC00ECEC, 0x8000808080008080, 0x2D002D2D2D002D2D, 0x6B006B6B6B006B6B, 0xA800A8A8A800A8A8, 0x2B002B2B2B002B2B, 0x3600363636003636, 0xA600A6A6A600A6A6, 0xC500C5C5C500C5C5, 0x8600868686008686, 0x4D004D4D4D004D4D, 0x3300333333003333, 0xFD00FDFDFD00FDFD, 0x6600666666006666, 0x5800585858005858, 0x9600969696009696, 0x3A003A3A3A003A3A, 0x0900090909000909, 0x9500959595009595, 0x1000101010001010, 0x7800787878007878, 0xD800D8D8D800D8D8, 0x4200424242004242, 0xCC00CCCCCC00CCCC, 0xEF00EFEFEF00EFEF, 0x2600262626002626, 0xE500E5E5E500E5E5, 0x6100616161006161, 0x1A001A1A1A001A1A, 0x3F003F3F3F003F3F, 0x3B003B3B3B003B3B, 0x8200828282008282, 0xB600B6B6B600B6B6, 0xDB00DBDBDB00DBDB, 0xD400D4D4D400D4D4, 0x9800989898009898, 0xE800E8E8E800E8E8, 0x8B008B8B8B008B8B, 0x0200020202000202, 0xEB00EBEBEB00EBEB, 0x0A000A0A0A000A0A, 0x2C002C2C2C002C2C, 0x1D001D1D1D001D1D, 0xB000B0B0B000B0B0, 0x6F006F6F6F006F6F, 0x8D008D8D8D008D8D, 0x8800888888008888, 0x0E000E0E0E000E0E, 0x1900191919001919, 0x8700878787008787, 0x4E004E4E4E004E4E, 0x0B000B0B0B000B0B, 0xA900A9A9A900A9A9, 0x0C000C0C0C000C0C, 0x7900797979007979, 0x1100111111001111, 0x7F007F7F7F007F7F, 0x2200222222002222, 0xE700E7E7E700E7E7, 0x5900595959005959, 0xE100E1E1E100E1E1, 0xDA00DADADA00DADA, 0x3D003D3D3D003D3D, 0xC800C8C8C800C8C8, 0x1200121212001212, 0x0400040404000404, 0x7400747474007474, 0x5400545454005454, 0x3000303030003030, 0x7E007E7E7E007E7E, 0xB400B4B4B400B4B4, 0x2800282828002828, 0x5500555555005555, 0x6800686868006868, 0x5000505050005050, 0xBE00BEBEBE00BEBE, 0xD000D0D0D000D0D0, 0xC400C4C4C400C4C4, 0x3100313131003131, 0xCB00CBCBCB00CBCB, 0x2A002A2A2A002A2A, 0xAD00ADADAD00ADAD, 0x0F000F0F0F000F0F, 0xCA00CACACA00CACA, 0x7000707070007070, 0xFF00FFFFFF00FFFF, 0x3200323232003232, 0x6900696969006969, 0x0800080808000808, 0x6200626262006262, 0x0000000000000000, 0x2400242424002424, 0xD100D1D1D100D1D1, 0xFB00FBFBFB00FBFB, 0xBA00BABABA00BABA, 0xED00EDEDED00EDED, 0x4500454545004545, 0x8100818181008181, 0x7300737373007373, 0x6D006D6D6D006D6D, 0x8400848484008484, 0x9F009F9F9F009F9F, 0xEE00EEEEEE00EEEE, 0x4A004A4A4A004A4A, 0xC300C3C3C300C3C3, 0x2E002E2E2E002E2E, 0xC100C1C1C100C1C1, 0x0100010101000101, 0xE600E6E6E600E6E6, 0x2500252525002525, 0x4800484848004848, 0x9900999999009999, 0xB900B9B9B900B9B9, 0xB300B3B3B300B3B3, 0x7B007B7B7B007B7B, 0xF900F9F9F900F9F9, 0xCE00CECECE00CECE, 0xBF00BFBFBF00BFBF, 0xDF00DFDFDF00DFDF, 0x7100717171007171, 0x2900292929002929, 0xCD00CDCDCD00CDCD, 0x6C006C6C6C006C6C, 0x1300131313001313, 0x6400646464006464, 0x9B009B9B9B009B9B, 0x6300636363006363, 0x9D009D9D9D009D9D, 0xC000C0C0C000C0C0, 0x4B004B4B4B004B4B, 0xB700B7B7B700B7B7, 0xA500A5A5A500A5A5, 0x8900898989008989, 0x5F005F5F5F005F5F, 0xB100B1B1B100B1B1, 0x1700171717001717, 0xF400F4F4F400F4F4, 0xBC00BCBCBC00BCBC, 0xD300D3D3D300D3D3, 0x4600464646004646, 0xCF00CFCFCF00CFCF, 0x3700373737003737, 0x5E005E5E5E005E5E, 0x4700474747004747, 0x9400949494009494, 0xFA00FAFAFA00FAFA, 0xFC00FCFCFC00FCFC, 0x5B005B5B5B005B5B, 0x9700979797009797, 0xFE00FEFEFE00FEFE, 0x5A005A5A5A005A5A, 0xAC00ACACAC00ACAC, 0x3C003C3C3C003C3C, 0x4C004C4C4C004C4C, 0x0300030303000303, 0x3500353535003535, 0xF300F3F3F300F3F3, 0x2300232323002323, 0xB800B8B8B800B8B8, 0x5D005D5D5D005D5D, 0x6A006A6A6A006A6A, 0x9200929292009292, 0xD500D5D5D500D5D5, 0x2100212121002121, 0x4400444444004444, 0x5100515151005151, 0xC600C6C6C600C6C6, 0x7D007D7D7D007D7D, 0x3900393939003939, 0x8300838383008383, 0xDC00DCDCDC00DCDC, 0xAA00AAAAAA00AAAA, 0x7C007C7C7C007C7C, 0x7700777777007777, 0x5600565656005656, 0x0500050505000505, 0x1B001B1B1B001B1B, 0xA400A4A4A400A4A4, 0x1500151515001515, 0x3400343434003434, 0x1E001E1E1E001E1E, 0x1C001C1C1C001C1C, 0xF800F8F8F800F8F8, 0x5200525252005252, 0x2000202020002020, 0x1400141414001414, 0xE900E9E9E900E9E9, 0xBD00BDBDBD00BDBD, 0xDD00DDDDDD00DDDD, 0xE400E4E4E400E4E4, 0xA100A1A1A100A1A1, 0xE000E0E0E000E0E0, 0x8A008A8A8A008A8A, 0xF100F1F1F100F1F1, 0xD600D6D6D600D6D6, 0x7A007A7A7A007A7A, 0xBB00BBBBBB00BBBB, 0xE300E3E3E300E3E3, 0x4000404040004040, 0x4F004F4F4F004F4F }; const u64bit Camellia_SBOX7[256] = { 0x7070007070700070, 0x2C2C002C2C2C002C, 0xB3B300B3B3B300B3, 0xC0C000C0C0C000C0, 0xE4E400E4E4E400E4, 0x5757005757570057, 0xEAEA00EAEAEA00EA, 0xAEAE00AEAEAE00AE, 0x2323002323230023, 0x6B6B006B6B6B006B, 0x4545004545450045, 0xA5A500A5A5A500A5, 0xEDED00EDEDED00ED, 0x4F4F004F4F4F004F, 0x1D1D001D1D1D001D, 0x9292009292920092, 0x8686008686860086, 0xAFAF00AFAFAF00AF, 0x7C7C007C7C7C007C, 0x1F1F001F1F1F001F, 0x3E3E003E3E3E003E, 0xDCDC00DCDCDC00DC, 0x5E5E005E5E5E005E, 0x0B0B000B0B0B000B, 0xA6A600A6A6A600A6, 0x3939003939390039, 0xD5D500D5D5D500D5, 0x5D5D005D5D5D005D, 0xD9D900D9D9D900D9, 0x5A5A005A5A5A005A, 0x5151005151510051, 0x6C6C006C6C6C006C, 0x8B8B008B8B8B008B, 0x9A9A009A9A9A009A, 0xFBFB00FBFBFB00FB, 0xB0B000B0B0B000B0, 0x7474007474740074, 0x2B2B002B2B2B002B, 0xF0F000F0F0F000F0, 0x8484008484840084, 0xDFDF00DFDFDF00DF, 0xCBCB00CBCBCB00CB, 0x3434003434340034, 0x7676007676760076, 0x6D6D006D6D6D006D, 0xA9A900A9A9A900A9, 0xD1D100D1D1D100D1, 0x0404000404040004, 0x1414001414140014, 0x3A3A003A3A3A003A, 0xDEDE00DEDEDE00DE, 0x1111001111110011, 0x3232003232320032, 0x9C9C009C9C9C009C, 0x5353005353530053, 0xF2F200F2F2F200F2, 0xFEFE00FEFEFE00FE, 0xCFCF00CFCFCF00CF, 0xC3C300C3C3C300C3, 0x7A7A007A7A7A007A, 0x2424002424240024, 0xE8E800E8E8E800E8, 0x6060006060600060, 0x6969006969690069, 0xAAAA00AAAAAA00AA, 0xA0A000A0A0A000A0, 0xA1A100A1A1A100A1, 0x6262006262620062, 0x5454005454540054, 0x1E1E001E1E1E001E, 0xE0E000E0E0E000E0, 0x6464006464640064, 0x1010001010100010, 0x0000000000000000, 0xA3A300A3A3A300A3, 0x7575007575750075, 0x8A8A008A8A8A008A, 0xE6E600E6E6E600E6, 0x0909000909090009, 0xDDDD00DDDDDD00DD, 0x8787008787870087, 0x8383008383830083, 0xCDCD00CDCDCD00CD, 0x9090009090900090, 0x7373007373730073, 0xF6F600F6F6F600F6, 0x9D9D009D9D9D009D, 0xBFBF00BFBFBF00BF, 0x5252005252520052, 0xD8D800D8D8D800D8, 0xC8C800C8C8C800C8, 0xC6C600C6C6C600C6, 0x8181008181810081, 0x6F6F006F6F6F006F, 0x1313001313130013, 0x6363006363630063, 0xE9E900E9E9E900E9, 0xA7A700A7A7A700A7, 0x9F9F009F9F9F009F, 0xBCBC00BCBCBC00BC, 0x2929002929290029, 0xF9F900F9F9F900F9, 0x2F2F002F2F2F002F, 0xB4B400B4B4B400B4, 0x7878007878780078, 0x0606000606060006, 0xE7E700E7E7E700E7, 0x7171007171710071, 0xD4D400D4D4D400D4, 0xABAB00ABABAB00AB, 0x8888008888880088, 0x8D8D008D8D8D008D, 0x7272007272720072, 0xB9B900B9B9B900B9, 0xF8F800F8F8F800F8, 0xACAC00ACACAC00AC, 0x3636003636360036, 0x2A2A002A2A2A002A, 0x3C3C003C3C3C003C, 0xF1F100F1F1F100F1, 0x4040004040400040, 0xD3D300D3D3D300D3, 0xBBBB00BBBBBB00BB, 0x4343004343430043, 0x1515001515150015, 0xADAD00ADADAD00AD, 0x7777007777770077, 0x8080008080800080, 0x8282008282820082, 0xECEC00ECECEC00EC, 0x2727002727270027, 0xE5E500E5E5E500E5, 0x8585008585850085, 0x3535003535350035, 0x0C0C000C0C0C000C, 0x4141004141410041, 0xEFEF00EFEFEF00EF, 0x9393009393930093, 0x1919001919190019, 0x2121002121210021, 0x0E0E000E0E0E000E, 0x4E4E004E4E4E004E, 0x6565006565650065, 0xBDBD00BDBDBD00BD, 0xB8B800B8B8B800B8, 0x8F8F008F8F8F008F, 0xEBEB00EBEBEB00EB, 0xCECE00CECECE00CE, 0x3030003030300030, 0x5F5F005F5F5F005F, 0xC5C500C5C5C500C5, 0x1A1A001A1A1A001A, 0xE1E100E1E1E100E1, 0xCACA00CACACA00CA, 0x4747004747470047, 0x3D3D003D3D3D003D, 0x0101000101010001, 0xD6D600D6D6D600D6, 0x5656005656560056, 0x4D4D004D4D4D004D, 0x0D0D000D0D0D000D, 0x6666006666660066, 0xCCCC00CCCCCC00CC, 0x2D2D002D2D2D002D, 0x1212001212120012, 0x2020002020200020, 0xB1B100B1B1B100B1, 0x9999009999990099, 0x4C4C004C4C4C004C, 0xC2C200C2C2C200C2, 0x7E7E007E7E7E007E, 0x0505000505050005, 0xB7B700B7B7B700B7, 0x3131003131310031, 0x1717001717170017, 0xD7D700D7D7D700D7, 0x5858005858580058, 0x6161006161610061, 0x1B1B001B1B1B001B, 0x1C1C001C1C1C001C, 0x0F0F000F0F0F000F, 0x1616001616160016, 0x1818001818180018, 0x2222002222220022, 0x4444004444440044, 0xB2B200B2B2B200B2, 0xB5B500B5B5B500B5, 0x9191009191910091, 0x0808000808080008, 0xA8A800A8A8A800A8, 0xFCFC00FCFCFC00FC, 0x5050005050500050, 0xD0D000D0D0D000D0, 0x7D7D007D7D7D007D, 0x8989008989890089, 0x9797009797970097, 0x5B5B005B5B5B005B, 0x9595009595950095, 0xFFFF00FFFFFF00FF, 0xD2D200D2D2D200D2, 0xC4C400C4C4C400C4, 0x4848004848480048, 0xF7F700F7F7F700F7, 0xDBDB00DBDBDB00DB, 0x0303000303030003, 0xDADA00DADADA00DA, 0x3F3F003F3F3F003F, 0x9494009494940094, 0x5C5C005C5C5C005C, 0x0202000202020002, 0x4A4A004A4A4A004A, 0x3333003333330033, 0x6767006767670067, 0xF3F300F3F3F300F3, 0x7F7F007F7F7F007F, 0xE2E200E2E2E200E2, 0x9B9B009B9B9B009B, 0x2626002626260026, 0x3737003737370037, 0x3B3B003B3B3B003B, 0x9696009696960096, 0x4B4B004B4B4B004B, 0xBEBE00BEBEBE00BE, 0x2E2E002E2E2E002E, 0x7979007979790079, 0x8C8C008C8C8C008C, 0x6E6E006E6E6E006E, 0x8E8E008E8E8E008E, 0xF5F500F5F5F500F5, 0xB6B600B6B6B600B6, 0xFDFD00FDFDFD00FD, 0x5959005959590059, 0x9898009898980098, 0x6A6A006A6A6A006A, 0x4646004646460046, 0xBABA00BABABA00BA, 0x2525002525250025, 0x4242004242420042, 0xA2A200A2A2A200A2, 0xFAFA00FAFAFA00FA, 0x0707000707070007, 0x5555005555550055, 0xEEEE00EEEEEE00EE, 0x0A0A000A0A0A000A, 0x4949004949490049, 0x6868006868680068, 0x3838003838380038, 0xA4A400A4A4A400A4, 0x2828002828280028, 0x7B7B007B7B7B007B, 0xC9C900C9C9C900C9, 0xC1C100C1C1C100C1, 0xE3E300E3E3E300E3, 0xF4F400F4F4F400F4, 0xC7C700C7C7C700C7, 0x9E9E009E9E9E009E }; const u64bit Camellia_SBOX8[256] = { 0x7070700070707000, 0x8282820082828200, 0x2C2C2C002C2C2C00, 0xECECEC00ECECEC00, 0xB3B3B300B3B3B300, 0x2727270027272700, 0xC0C0C000C0C0C000, 0xE5E5E500E5E5E500, 0xE4E4E400E4E4E400, 0x8585850085858500, 0x5757570057575700, 0x3535350035353500, 0xEAEAEA00EAEAEA00, 0x0C0C0C000C0C0C00, 0xAEAEAE00AEAEAE00, 0x4141410041414100, 0x2323230023232300, 0xEFEFEF00EFEFEF00, 0x6B6B6B006B6B6B00, 0x9393930093939300, 0x4545450045454500, 0x1919190019191900, 0xA5A5A500A5A5A500, 0x2121210021212100, 0xEDEDED00EDEDED00, 0x0E0E0E000E0E0E00, 0x4F4F4F004F4F4F00, 0x4E4E4E004E4E4E00, 0x1D1D1D001D1D1D00, 0x6565650065656500, 0x9292920092929200, 0xBDBDBD00BDBDBD00, 0x8686860086868600, 0xB8B8B800B8B8B800, 0xAFAFAF00AFAFAF00, 0x8F8F8F008F8F8F00, 0x7C7C7C007C7C7C00, 0xEBEBEB00EBEBEB00, 0x1F1F1F001F1F1F00, 0xCECECE00CECECE00, 0x3E3E3E003E3E3E00, 0x3030300030303000, 0xDCDCDC00DCDCDC00, 0x5F5F5F005F5F5F00, 0x5E5E5E005E5E5E00, 0xC5C5C500C5C5C500, 0x0B0B0B000B0B0B00, 0x1A1A1A001A1A1A00, 0xA6A6A600A6A6A600, 0xE1E1E100E1E1E100, 0x3939390039393900, 0xCACACA00CACACA00, 0xD5D5D500D5D5D500, 0x4747470047474700, 0x5D5D5D005D5D5D00, 0x3D3D3D003D3D3D00, 0xD9D9D900D9D9D900, 0x0101010001010100, 0x5A5A5A005A5A5A00, 0xD6D6D600D6D6D600, 0x5151510051515100, 0x5656560056565600, 0x6C6C6C006C6C6C00, 0x4D4D4D004D4D4D00, 0x8B8B8B008B8B8B00, 0x0D0D0D000D0D0D00, 0x9A9A9A009A9A9A00, 0x6666660066666600, 0xFBFBFB00FBFBFB00, 0xCCCCCC00CCCCCC00, 0xB0B0B000B0B0B000, 0x2D2D2D002D2D2D00, 0x7474740074747400, 0x1212120012121200, 0x2B2B2B002B2B2B00, 0x2020200020202000, 0xF0F0F000F0F0F000, 0xB1B1B100B1B1B100, 0x8484840084848400, 0x9999990099999900, 0xDFDFDF00DFDFDF00, 0x4C4C4C004C4C4C00, 0xCBCBCB00CBCBCB00, 0xC2C2C200C2C2C200, 0x3434340034343400, 0x7E7E7E007E7E7E00, 0x7676760076767600, 0x0505050005050500, 0x6D6D6D006D6D6D00, 0xB7B7B700B7B7B700, 0xA9A9A900A9A9A900, 0x3131310031313100, 0xD1D1D100D1D1D100, 0x1717170017171700, 0x0404040004040400, 0xD7D7D700D7D7D700, 0x1414140014141400, 0x5858580058585800, 0x3A3A3A003A3A3A00, 0x6161610061616100, 0xDEDEDE00DEDEDE00, 0x1B1B1B001B1B1B00, 0x1111110011111100, 0x1C1C1C001C1C1C00, 0x3232320032323200, 0x0F0F0F000F0F0F00, 0x9C9C9C009C9C9C00, 0x1616160016161600, 0x5353530053535300, 0x1818180018181800, 0xF2F2F200F2F2F200, 0x2222220022222200, 0xFEFEFE00FEFEFE00, 0x4444440044444400, 0xCFCFCF00CFCFCF00, 0xB2B2B200B2B2B200, 0xC3C3C300C3C3C300, 0xB5B5B500B5B5B500, 0x7A7A7A007A7A7A00, 0x9191910091919100, 0x2424240024242400, 0x0808080008080800, 0xE8E8E800E8E8E800, 0xA8A8A800A8A8A800, 0x6060600060606000, 0xFCFCFC00FCFCFC00, 0x6969690069696900, 0x5050500050505000, 0xAAAAAA00AAAAAA00, 0xD0D0D000D0D0D000, 0xA0A0A000A0A0A000, 0x7D7D7D007D7D7D00, 0xA1A1A100A1A1A100, 0x8989890089898900, 0x6262620062626200, 0x9797970097979700, 0x5454540054545400, 0x5B5B5B005B5B5B00, 0x1E1E1E001E1E1E00, 0x9595950095959500, 0xE0E0E000E0E0E000, 0xFFFFFF00FFFFFF00, 0x6464640064646400, 0xD2D2D200D2D2D200, 0x1010100010101000, 0xC4C4C400C4C4C400, 0x0000000000000000, 0x4848480048484800, 0xA3A3A300A3A3A300, 0xF7F7F700F7F7F700, 0x7575750075757500, 0xDBDBDB00DBDBDB00, 0x8A8A8A008A8A8A00, 0x0303030003030300, 0xE6E6E600E6E6E600, 0xDADADA00DADADA00, 0x0909090009090900, 0x3F3F3F003F3F3F00, 0xDDDDDD00DDDDDD00, 0x9494940094949400, 0x8787870087878700, 0x5C5C5C005C5C5C00, 0x8383830083838300, 0x0202020002020200, 0xCDCDCD00CDCDCD00, 0x4A4A4A004A4A4A00, 0x9090900090909000, 0x3333330033333300, 0x7373730073737300, 0x6767670067676700, 0xF6F6F600F6F6F600, 0xF3F3F300F3F3F300, 0x9D9D9D009D9D9D00, 0x7F7F7F007F7F7F00, 0xBFBFBF00BFBFBF00, 0xE2E2E200E2E2E200, 0x5252520052525200, 0x9B9B9B009B9B9B00, 0xD8D8D800D8D8D800, 0x2626260026262600, 0xC8C8C800C8C8C800, 0x3737370037373700, 0xC6C6C600C6C6C600, 0x3B3B3B003B3B3B00, 0x8181810081818100, 0x9696960096969600, 0x6F6F6F006F6F6F00, 0x4B4B4B004B4B4B00, 0x1313130013131300, 0xBEBEBE00BEBEBE00, 0x6363630063636300, 0x2E2E2E002E2E2E00, 0xE9E9E900E9E9E900, 0x7979790079797900, 0xA7A7A700A7A7A700, 0x8C8C8C008C8C8C00, 0x9F9F9F009F9F9F00, 0x6E6E6E006E6E6E00, 0xBCBCBC00BCBCBC00, 0x8E8E8E008E8E8E00, 0x2929290029292900, 0xF5F5F500F5F5F500, 0xF9F9F900F9F9F900, 0xB6B6B600B6B6B600, 0x2F2F2F002F2F2F00, 0xFDFDFD00FDFDFD00, 0xB4B4B400B4B4B400, 0x5959590059595900, 0x7878780078787800, 0x9898980098989800, 0x0606060006060600, 0x6A6A6A006A6A6A00, 0xE7E7E700E7E7E700, 0x4646460046464600, 0x7171710071717100, 0xBABABA00BABABA00, 0xD4D4D400D4D4D400, 0x2525250025252500, 0xABABAB00ABABAB00, 0x4242420042424200, 0x8888880088888800, 0xA2A2A200A2A2A200, 0x8D8D8D008D8D8D00, 0xFAFAFA00FAFAFA00, 0x7272720072727200, 0x0707070007070700, 0xB9B9B900B9B9B900, 0x5555550055555500, 0xF8F8F800F8F8F800, 0xEEEEEE00EEEEEE00, 0xACACAC00ACACAC00, 0x0A0A0A000A0A0A00, 0x3636360036363600, 0x4949490049494900, 0x2A2A2A002A2A2A00, 0x6868680068686800, 0x3C3C3C003C3C3C00, 0x3838380038383800, 0xF1F1F100F1F1F100, 0xA4A4A400A4A4A400, 0x4040400040404000, 0x2828280028282800, 0xD3D3D300D3D3D300, 0x7B7B7B007B7B7B00, 0xBBBBBB00BBBBBB00, 0xC9C9C900C9C9C900, 0x4343430043434300, 0xC1C1C100C1C1C100, 0x1515150015151500, 0xE3E3E300E3E3E300, 0xADADAD00ADADAD00, 0xF4F4F400F4F4F400, 0x7777770077777700, 0xC7C7C700C7C7C700, 0x8080800080808000, 0x9E9E9E009E9E9E00 }; } #endif Botan-1.10.12/src/block/camellia/info.txt0000664000175000017500000000016312654331322017710 0ustar jackjack00000000000000define CAMELLIA camellia_sbox.h camellia.h Botan-1.10.12/src/block/cascade/cascade.cpp0000664000175000017500000000424112654331322020120 0ustar jackjack00000000000000/* * Block Cipher Cascade * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { void Cascade_Cipher::encrypt_n(const byte in[], byte out[], size_t blocks) const { size_t c1_blocks = blocks * (block_size() / cipher1->block_size()); size_t c2_blocks = blocks * (block_size() / cipher2->block_size()); cipher1->encrypt_n(in, out, c1_blocks); cipher2->encrypt_n(out, out, c2_blocks); } void Cascade_Cipher::decrypt_n(const byte in[], byte out[], size_t blocks) const { size_t c1_blocks = blocks * (block_size() / cipher1->block_size()); size_t c2_blocks = blocks * (block_size() / cipher2->block_size()); cipher2->decrypt_n(in, out, c2_blocks); cipher1->decrypt_n(out, out, c1_blocks); } void Cascade_Cipher::key_schedule(const byte key[], size_t) { const byte* key2 = key + cipher1->maximum_keylength(); cipher1->set_key(key , cipher1->maximum_keylength()); cipher2->set_key(key2, cipher2->maximum_keylength()); } void Cascade_Cipher::clear() { cipher1->clear(); cipher2->clear(); } std::string Cascade_Cipher::name() const { return "Cascade(" + cipher1->name() + "," + cipher2->name() + ")"; } BlockCipher* Cascade_Cipher::clone() const { return new Cascade_Cipher(cipher1->clone(), cipher2->clone()); } namespace { size_t euclids_algorithm(size_t a, size_t b) { while(b != 0) // gcd { size_t t = b; b = a % b; a = t; } return a; } size_t block_size_for_cascade(size_t bs, size_t bs2) { if(bs == bs2) return bs; size_t gcd = euclids_algorithm(bs, bs2); return (bs * bs2) / gcd; } } Cascade_Cipher::Cascade_Cipher(BlockCipher* c1, BlockCipher* c2) : cipher1(c1), cipher2(c2) { block = block_size_for_cascade(c1->block_size(), c2->block_size()); if(block_size() % c1->block_size() || block_size() % c2->block_size()) throw Internal_Error("Failure in " + name() + " constructor"); } Cascade_Cipher::~Cascade_Cipher() { delete cipher1; delete cipher2; } } Botan-1.10.12/src/block/cascade/cascade.h0000664000175000017500000000225612654331322017571 0ustar jackjack00000000000000/* * Block Cipher Cascade * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CASCADE_H__ #define BOTAN_CASCADE_H__ #include namespace Botan { /** * Block Cipher Cascade */ class BOTAN_DLL Cascade_Cipher : public BlockCipher { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; size_t block_size() const { return block; } Key_Length_Specification key_spec() const { return Key_Length_Specification(cipher1->maximum_keylength() + cipher2->maximum_keylength()); } void clear(); std::string name() const; BlockCipher* clone() const; /** * Create a cascade of two block ciphers * @param cipher1 the first cipher * @param cipher2 the second cipher */ Cascade_Cipher(BlockCipher* cipher1, BlockCipher* cipher2); ~Cascade_Cipher(); private: void key_schedule(const byte[], size_t); size_t block; BlockCipher* cipher1; BlockCipher* cipher2; }; } #endif Botan-1.10.12/src/block/cascade/info.txt0000664000175000017500000000013312654331322017521 0ustar jackjack00000000000000define CASCADE cascade.h cascade.cpp Botan-1.10.12/src/block/cast/cast128.cpp0000664000175000017500000001326312654331322017275 0ustar jackjack00000000000000/* * CAST-128 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * CAST-128 Round Type 1 */ inline void R1(u32bit& L, u32bit R, u32bit MK, u32bit RK) { u32bit T = rotate_left(MK + R, RK); L ^= (CAST_SBOX1[get_byte(0, T)] ^ CAST_SBOX2[get_byte(1, T)]) - CAST_SBOX3[get_byte(2, T)] + CAST_SBOX4[get_byte(3, T)]; } /* * CAST-128 Round Type 2 */ inline void R2(u32bit& L, u32bit R, u32bit MK, u32bit RK) { u32bit T = rotate_left(MK ^ R, RK); L ^= (CAST_SBOX1[get_byte(0, T)] - CAST_SBOX2[get_byte(1, T)] + CAST_SBOX3[get_byte(2, T)]) ^ CAST_SBOX4[get_byte(3, T)]; } /* * CAST-128 Round Type 3 */ inline void R3(u32bit& L, u32bit R, u32bit MK, u32bit RK) { u32bit T = rotate_left(MK - R, RK); L ^= ((CAST_SBOX1[get_byte(0, T)] + CAST_SBOX2[get_byte(1, T)]) ^ CAST_SBOX3[get_byte(2, T)]) - CAST_SBOX4[get_byte(3, T)]; } } /* * CAST-128 Encryption */ void CAST_128::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit L = load_be(in, 0); u32bit R = load_be(in, 1); R1(L, R, MK[ 0], RK[ 0]); R2(R, L, MK[ 1], RK[ 1]); R3(L, R, MK[ 2], RK[ 2]); R1(R, L, MK[ 3], RK[ 3]); R2(L, R, MK[ 4], RK[ 4]); R3(R, L, MK[ 5], RK[ 5]); R1(L, R, MK[ 6], RK[ 6]); R2(R, L, MK[ 7], RK[ 7]); R3(L, R, MK[ 8], RK[ 8]); R1(R, L, MK[ 9], RK[ 9]); R2(L, R, MK[10], RK[10]); R3(R, L, MK[11], RK[11]); R1(L, R, MK[12], RK[12]); R2(R, L, MK[13], RK[13]); R3(L, R, MK[14], RK[14]); R1(R, L, MK[15], RK[15]); store_be(out, R, L); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * CAST-128 Decryption */ void CAST_128::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit L = load_be(in, 0); u32bit R = load_be(in, 1); R1(L, R, MK[15], RK[15]); R3(R, L, MK[14], RK[14]); R2(L, R, MK[13], RK[13]); R1(R, L, MK[12], RK[12]); R3(L, R, MK[11], RK[11]); R2(R, L, MK[10], RK[10]); R1(L, R, MK[ 9], RK[ 9]); R3(R, L, MK[ 8], RK[ 8]); R2(L, R, MK[ 7], RK[ 7]); R1(R, L, MK[ 6], RK[ 6]); R3(L, R, MK[ 5], RK[ 5]); R2(R, L, MK[ 4], RK[ 4]); R1(L, R, MK[ 3], RK[ 3]); R3(R, L, MK[ 2], RK[ 2]); R2(L, R, MK[ 1], RK[ 1]); R1(R, L, MK[ 0], RK[ 0]); store_be(out, R, L); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * CAST-128 Key Schedule */ void CAST_128::key_schedule(const byte key[], size_t length) { clear(); SecureVector X(4); for(size_t j = 0; j != length; ++j) X[j/4] = (X[j/4] << 8) + key[j]; cast_ks(MK, X); cast_ks(RK, X); for(size_t j = 0; j != 16; ++j) RK[j] %= 32; } /* * S-Box Based Key Expansion */ void CAST_128::cast_ks(MemoryRegion& K, MemoryRegion& X) { class ByteReader { public: byte operator()(size_t i) { return (X[i/4] >> (8*(3 - (i%4)))); } ByteReader(const u32bit* x) : X(x) {} private: const u32bit* X; }; SecureVector Z(4); ByteReader x(&X[0]), z(&Z[0]); Z[0] = X[0] ^ S5[x(13)] ^ S6[x(15)] ^ S7[x(12)] ^ S8[x(14)] ^ S7[x( 8)]; Z[1] = X[2] ^ S5[z( 0)] ^ S6[z( 2)] ^ S7[z( 1)] ^ S8[z( 3)] ^ S8[x(10)]; Z[2] = X[3] ^ S5[z( 7)] ^ S6[z( 6)] ^ S7[z( 5)] ^ S8[z( 4)] ^ S5[x( 9)]; Z[3] = X[1] ^ S5[z(10)] ^ S6[z( 9)] ^ S7[z(11)] ^ S8[z( 8)] ^ S6[x(11)]; K[ 0] = S5[z( 8)] ^ S6[z( 9)] ^ S7[z( 7)] ^ S8[z( 6)] ^ S5[z( 2)]; K[ 1] = S5[z(10)] ^ S6[z(11)] ^ S7[z( 5)] ^ S8[z( 4)] ^ S6[z( 6)]; K[ 2] = S5[z(12)] ^ S6[z(13)] ^ S7[z( 3)] ^ S8[z( 2)] ^ S7[z( 9)]; K[ 3] = S5[z(14)] ^ S6[z(15)] ^ S7[z( 1)] ^ S8[z( 0)] ^ S8[z(12)]; X[0] = Z[2] ^ S5[z( 5)] ^ S6[z( 7)] ^ S7[z( 4)] ^ S8[z( 6)] ^ S7[z( 0)]; X[1] = Z[0] ^ S5[x( 0)] ^ S6[x( 2)] ^ S7[x( 1)] ^ S8[x( 3)] ^ S8[z( 2)]; X[2] = Z[1] ^ S5[x( 7)] ^ S6[x( 6)] ^ S7[x( 5)] ^ S8[x( 4)] ^ S5[z( 1)]; X[3] = Z[3] ^ S5[x(10)] ^ S6[x( 9)] ^ S7[x(11)] ^ S8[x( 8)] ^ S6[z( 3)]; K[ 4] = S5[x( 3)] ^ S6[x( 2)] ^ S7[x(12)] ^ S8[x(13)] ^ S5[x( 8)]; K[ 5] = S5[x( 1)] ^ S6[x( 0)] ^ S7[x(14)] ^ S8[x(15)] ^ S6[x(13)]; K[ 6] = S5[x( 7)] ^ S6[x( 6)] ^ S7[x( 8)] ^ S8[x( 9)] ^ S7[x( 3)]; K[ 7] = S5[x( 5)] ^ S6[x( 4)] ^ S7[x(10)] ^ S8[x(11)] ^ S8[x( 7)]; Z[0] = X[0] ^ S5[x(13)] ^ S6[x(15)] ^ S7[x(12)] ^ S8[x(14)] ^ S7[x( 8)]; Z[1] = X[2] ^ S5[z( 0)] ^ S6[z( 2)] ^ S7[z( 1)] ^ S8[z( 3)] ^ S8[x(10)]; Z[2] = X[3] ^ S5[z( 7)] ^ S6[z( 6)] ^ S7[z( 5)] ^ S8[z( 4)] ^ S5[x( 9)]; Z[3] = X[1] ^ S5[z(10)] ^ S6[z( 9)] ^ S7[z(11)] ^ S8[z( 8)] ^ S6[x(11)]; K[ 8] = S5[z( 3)] ^ S6[z( 2)] ^ S7[z(12)] ^ S8[z(13)] ^ S5[z( 9)]; K[ 9] = S5[z( 1)] ^ S6[z( 0)] ^ S7[z(14)] ^ S8[z(15)] ^ S6[z(12)]; K[10] = S5[z( 7)] ^ S6[z( 6)] ^ S7[z( 8)] ^ S8[z( 9)] ^ S7[z( 2)]; K[11] = S5[z( 5)] ^ S6[z( 4)] ^ S7[z(10)] ^ S8[z(11)] ^ S8[z( 6)]; X[0] = Z[2] ^ S5[z( 5)] ^ S6[z( 7)] ^ S7[z( 4)] ^ S8[z( 6)] ^ S7[z( 0)]; X[1] = Z[0] ^ S5[x( 0)] ^ S6[x( 2)] ^ S7[x( 1)] ^ S8[x( 3)] ^ S8[z( 2)]; X[2] = Z[1] ^ S5[x( 7)] ^ S6[x( 6)] ^ S7[x( 5)] ^ S8[x( 4)] ^ S5[z( 1)]; X[3] = Z[3] ^ S5[x(10)] ^ S6[x( 9)] ^ S7[x(11)] ^ S8[x( 8)] ^ S6[z( 3)]; K[12] = S5[x( 8)] ^ S6[x( 9)] ^ S7[x( 7)] ^ S8[x( 6)] ^ S5[x( 3)]; K[13] = S5[x(10)] ^ S6[x(11)] ^ S7[x( 5)] ^ S8[x( 4)] ^ S6[x( 7)]; K[14] = S5[x(12)] ^ S6[x(13)] ^ S7[x( 3)] ^ S8[x( 2)] ^ S7[x( 8)]; K[15] = S5[x(14)] ^ S6[x(15)] ^ S7[x( 1)] ^ S8[x( 0)] ^ S8[x(13)]; } } Botan-1.10.12/src/block/cast/cast128.h0000664000175000017500000000221612654331322016736 0ustar jackjack00000000000000/* * CAST-128 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CAST128_H__ #define BOTAN_CAST128_H__ #include namespace Botan { /** * CAST-128 */ class BOTAN_DLL CAST_128 : public Block_Cipher_Fixed_Params<8, 11, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(MK); zeroise(RK); } std::string name() const { return "CAST-128"; } BlockCipher* clone() const { return new CAST_128; } CAST_128() : MK(16), RK(16) {} private: void key_schedule(const byte[], size_t); static void cast_ks(MemoryRegion& ks, MemoryRegion& user_key); static const u32bit S5[256]; static const u32bit S6[256]; static const u32bit S7[256]; static const u32bit S8[256]; SecureVector MK, RK; }; extern const u32bit CAST_SBOX1[256]; extern const u32bit CAST_SBOX2[256]; extern const u32bit CAST_SBOX3[256]; extern const u32bit CAST_SBOX4[256]; } #endif Botan-1.10.12/src/block/cast/cast256.cpp0000664000175000017500000001501112654331322017270 0ustar jackjack00000000000000/* * CAST-256 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * CAST-256 Round Type 1 */ void round1(u32bit& out, u32bit in, u32bit mask, u32bit rot) { u32bit temp = rotate_left(mask + in, rot); out ^= (CAST_SBOX1[get_byte(0, temp)] ^ CAST_SBOX2[get_byte(1, temp)]) - CAST_SBOX3[get_byte(2, temp)] + CAST_SBOX4[get_byte(3, temp)]; } /* * CAST-256 Round Type 2 */ void round2(u32bit& out, u32bit in, u32bit mask, u32bit rot) { u32bit temp = rotate_left(mask ^ in, rot); out ^= (CAST_SBOX1[get_byte(0, temp)] - CAST_SBOX2[get_byte(1, temp)] + CAST_SBOX3[get_byte(2, temp)]) ^ CAST_SBOX4[get_byte(3, temp)]; } /* * CAST-256 Round Type 3 */ void round3(u32bit& out, u32bit in, u32bit mask, u32bit rot) { u32bit temp = rotate_left(mask - in, rot); out ^= ((CAST_SBOX1[get_byte(0, temp)] + CAST_SBOX2[get_byte(1, temp)]) ^ CAST_SBOX3[get_byte(2, temp)]) - CAST_SBOX4[get_byte(3, temp)]; } } /* * CAST-256 Encryption */ void CAST_256::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A = load_be(in, 0); u32bit B = load_be(in, 1); u32bit C = load_be(in, 2); u32bit D = load_be(in, 3); round1(C, D, MK[ 0], RK[ 0]); round2(B, C, MK[ 1], RK[ 1]); round3(A, B, MK[ 2], RK[ 2]); round1(D, A, MK[ 3], RK[ 3]); round1(C, D, MK[ 4], RK[ 4]); round2(B, C, MK[ 5], RK[ 5]); round3(A, B, MK[ 6], RK[ 6]); round1(D, A, MK[ 7], RK[ 7]); round1(C, D, MK[ 8], RK[ 8]); round2(B, C, MK[ 9], RK[ 9]); round3(A, B, MK[10], RK[10]); round1(D, A, MK[11], RK[11]); round1(C, D, MK[12], RK[12]); round2(B, C, MK[13], RK[13]); round3(A, B, MK[14], RK[14]); round1(D, A, MK[15], RK[15]); round1(C, D, MK[16], RK[16]); round2(B, C, MK[17], RK[17]); round3(A, B, MK[18], RK[18]); round1(D, A, MK[19], RK[19]); round1(C, D, MK[20], RK[20]); round2(B, C, MK[21], RK[21]); round3(A, B, MK[22], RK[22]); round1(D, A, MK[23], RK[23]); round1(D, A, MK[27], RK[27]); round3(A, B, MK[26], RK[26]); round2(B, C, MK[25], RK[25]); round1(C, D, MK[24], RK[24]); round1(D, A, MK[31], RK[31]); round3(A, B, MK[30], RK[30]); round2(B, C, MK[29], RK[29]); round1(C, D, MK[28], RK[28]); round1(D, A, MK[35], RK[35]); round3(A, B, MK[34], RK[34]); round2(B, C, MK[33], RK[33]); round1(C, D, MK[32], RK[32]); round1(D, A, MK[39], RK[39]); round3(A, B, MK[38], RK[38]); round2(B, C, MK[37], RK[37]); round1(C, D, MK[36], RK[36]); round1(D, A, MK[43], RK[43]); round3(A, B, MK[42], RK[42]); round2(B, C, MK[41], RK[41]); round1(C, D, MK[40], RK[40]); round1(D, A, MK[47], RK[47]); round3(A, B, MK[46], RK[46]); round2(B, C, MK[45], RK[45]); round1(C, D, MK[44], RK[44]); store_be(out, A, B, C, D); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * CAST-256 Decryption */ void CAST_256::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A = load_be(in, 0); u32bit B = load_be(in, 1); u32bit C = load_be(in, 2); u32bit D = load_be(in, 3); round1(C, D, MK[44], RK[44]); round2(B, C, MK[45], RK[45]); round3(A, B, MK[46], RK[46]); round1(D, A, MK[47], RK[47]); round1(C, D, MK[40], RK[40]); round2(B, C, MK[41], RK[41]); round3(A, B, MK[42], RK[42]); round1(D, A, MK[43], RK[43]); round1(C, D, MK[36], RK[36]); round2(B, C, MK[37], RK[37]); round3(A, B, MK[38], RK[38]); round1(D, A, MK[39], RK[39]); round1(C, D, MK[32], RK[32]); round2(B, C, MK[33], RK[33]); round3(A, B, MK[34], RK[34]); round1(D, A, MK[35], RK[35]); round1(C, D, MK[28], RK[28]); round2(B, C, MK[29], RK[29]); round3(A, B, MK[30], RK[30]); round1(D, A, MK[31], RK[31]); round1(C, D, MK[24], RK[24]); round2(B, C, MK[25], RK[25]); round3(A, B, MK[26], RK[26]); round1(D, A, MK[27], RK[27]); round1(D, A, MK[23], RK[23]); round3(A, B, MK[22], RK[22]); round2(B, C, MK[21], RK[21]); round1(C, D, MK[20], RK[20]); round1(D, A, MK[19], RK[19]); round3(A, B, MK[18], RK[18]); round2(B, C, MK[17], RK[17]); round1(C, D, MK[16], RK[16]); round1(D, A, MK[15], RK[15]); round3(A, B, MK[14], RK[14]); round2(B, C, MK[13], RK[13]); round1(C, D, MK[12], RK[12]); round1(D, A, MK[11], RK[11]); round3(A, B, MK[10], RK[10]); round2(B, C, MK[ 9], RK[ 9]); round1(C, D, MK[ 8], RK[ 8]); round1(D, A, MK[ 7], RK[ 7]); round3(A, B, MK[ 6], RK[ 6]); round2(B, C, MK[ 5], RK[ 5]); round1(C, D, MK[ 4], RK[ 4]); round1(D, A, MK[ 3], RK[ 3]); round3(A, B, MK[ 2], RK[ 2]); round2(B, C, MK[ 1], RK[ 1]); round1(C, D, MK[ 0], RK[ 0]); store_be(out, A, B, C, D); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * CAST-256 Key Schedule */ void CAST_256::key_schedule(const byte key[], size_t length) { SecureVector K(8); for(size_t j = 0; j != length; ++j) K[j/4] = (K[j/4] << 8) + key[j]; u32bit A = K[0], B = K[1], C = K[2], D = K[3], E = K[4], F = K[5], G = K[6], H = K[7]; for(size_t j = 0; j != 48; j += 4) { round1(G, H, KEY_MASK[4*j+ 0], KEY_ROT[(4*j+ 0) % 32]); round2(F, G, KEY_MASK[4*j+ 1], KEY_ROT[(4*j+ 1) % 32]); round3(E, F, KEY_MASK[4*j+ 2], KEY_ROT[(4*j+ 2) % 32]); round1(D, E, KEY_MASK[4*j+ 3], KEY_ROT[(4*j+ 3) % 32]); round2(C, D, KEY_MASK[4*j+ 4], KEY_ROT[(4*j+ 4) % 32]); round3(B, C, KEY_MASK[4*j+ 5], KEY_ROT[(4*j+ 5) % 32]); round1(A, B, KEY_MASK[4*j+ 6], KEY_ROT[(4*j+ 6) % 32]); round2(H, A, KEY_MASK[4*j+ 7], KEY_ROT[(4*j+ 7) % 32]); round1(G, H, KEY_MASK[4*j+ 8], KEY_ROT[(4*j+ 8) % 32]); round2(F, G, KEY_MASK[4*j+ 9], KEY_ROT[(4*j+ 9) % 32]); round3(E, F, KEY_MASK[4*j+10], KEY_ROT[(4*j+10) % 32]); round1(D, E, KEY_MASK[4*j+11], KEY_ROT[(4*j+11) % 32]); round2(C, D, KEY_MASK[4*j+12], KEY_ROT[(4*j+12) % 32]); round3(B, C, KEY_MASK[4*j+13], KEY_ROT[(4*j+13) % 32]); round1(A, B, KEY_MASK[4*j+14], KEY_ROT[(4*j+14) % 32]); round2(H, A, KEY_MASK[4*j+15], KEY_ROT[(4*j+15) % 32]); RK[j ] = (A % 32); RK[j+1] = (C % 32); RK[j+2] = (E % 32); RK[j+3] = (G % 32); MK[j ] = H; MK[j+1] = F; MK[j+2] = D; MK[j+3] = B; } } } Botan-1.10.12/src/block/cast/cast256.h0000664000175000017500000000177612654331322016752 0ustar jackjack00000000000000/* * CAST-256 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CAST256_H__ #define BOTAN_CAST256_H__ #include namespace Botan { /** * CAST-256 */ class BOTAN_DLL CAST_256 : public Block_Cipher_Fixed_Params<16, 4, 32, 4> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(MK); zeroise(RK); } std::string name() const { return "CAST-256"; } BlockCipher* clone() const { return new CAST_256; } CAST_256() : MK(48), RK(48) {} private: void key_schedule(const byte[], size_t); static const u32bit KEY_MASK[192]; static const byte KEY_ROT[32]; SecureVector MK; SecureVector RK; }; extern const u32bit CAST_SBOX1[256]; extern const u32bit CAST_SBOX2[256]; extern const u32bit CAST_SBOX3[256]; extern const u32bit CAST_SBOX4[256]; } #endif Botan-1.10.12/src/block/cast/cast_tab.cpp0000664000175000017500000007017112654331322017671 0ustar jackjack00000000000000/* * S-Box Tables for CAST-128 and CAST-256 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { const u32bit CAST_SBOX1[256] = { 0x30FB40D4, 0x9FA0FF0B, 0x6BECCD2F, 0x3F258C7A, 0x1E213F2F, 0x9C004DD3, 0x6003E540, 0xCF9FC949, 0xBFD4AF27, 0x88BBBDB5, 0xE2034090, 0x98D09675, 0x6E63A0E0, 0x15C361D2, 0xC2E7661D, 0x22D4FF8E, 0x28683B6F, 0xC07FD059, 0xFF2379C8, 0x775F50E2, 0x43C340D3, 0xDF2F8656, 0x887CA41A, 0xA2D2BD2D, 0xA1C9E0D6, 0x346C4819, 0x61B76D87, 0x22540F2F, 0x2ABE32E1, 0xAA54166B, 0x22568E3A, 0xA2D341D0, 0x66DB40C8, 0xA784392F, 0x004DFF2F, 0x2DB9D2DE, 0x97943FAC, 0x4A97C1D8, 0x527644B7, 0xB5F437A7, 0xB82CBAEF, 0xD751D159, 0x6FF7F0ED, 0x5A097A1F, 0x827B68D0, 0x90ECF52E, 0x22B0C054, 0xBC8E5935, 0x4B6D2F7F, 0x50BB64A2, 0xD2664910, 0xBEE5812D, 0xB7332290, 0xE93B159F, 0xB48EE411, 0x4BFF345D, 0xFD45C240, 0xAD31973F, 0xC4F6D02E, 0x55FC8165, 0xD5B1CAAD, 0xA1AC2DAE, 0xA2D4B76D, 0xC19B0C50, 0x882240F2, 0x0C6E4F38, 0xA4E4BFD7, 0x4F5BA272, 0x564C1D2F, 0xC59C5319, 0xB949E354, 0xB04669FE, 0xB1B6AB8A, 0xC71358DD, 0x6385C545, 0x110F935D, 0x57538AD5, 0x6A390493, 0xE63D37E0, 0x2A54F6B3, 0x3A787D5F, 0x6276A0B5, 0x19A6FCDF, 0x7A42206A, 0x29F9D4D5, 0xF61B1891, 0xBB72275E, 0xAA508167, 0x38901091, 0xC6B505EB, 0x84C7CB8C, 0x2AD75A0F, 0x874A1427, 0xA2D1936B, 0x2AD286AF, 0xAA56D291, 0xD7894360, 0x425C750D, 0x93B39E26, 0x187184C9, 0x6C00B32D, 0x73E2BB14, 0xA0BEBC3C, 0x54623779, 0x64459EAB, 0x3F328B82, 0x7718CF82, 0x59A2CEA6, 0x04EE002E, 0x89FE78E6, 0x3FAB0950, 0x325FF6C2, 0x81383F05, 0x6963C5C8, 0x76CB5AD6, 0xD49974C9, 0xCA180DCF, 0x380782D5, 0xC7FA5CF6, 0x8AC31511, 0x35E79E13, 0x47DA91D0, 0xF40F9086, 0xA7E2419E, 0x31366241, 0x051EF495, 0xAA573B04, 0x4A805D8D, 0x548300D0, 0x00322A3C, 0xBF64CDDF, 0xBA57A68E, 0x75C6372B, 0x50AFD341, 0xA7C13275, 0x915A0BF5, 0x6B54BFAB, 0x2B0B1426, 0xAB4CC9D7, 0x449CCD82, 0xF7FBF265, 0xAB85C5F3, 0x1B55DB94, 0xAAD4E324, 0xCFA4BD3F, 0x2DEAA3E2, 0x9E204D02, 0xC8BD25AC, 0xEADF55B3, 0xD5BD9E98, 0xE31231B2, 0x2AD5AD6C, 0x954329DE, 0xADBE4528, 0xD8710F69, 0xAA51C90F, 0xAA786BF6, 0x22513F1E, 0xAA51A79B, 0x2AD344CC, 0x7B5A41F0, 0xD37CFBAD, 0x1B069505, 0x41ECE491, 0xB4C332E6, 0x032268D4, 0xC9600ACC, 0xCE387E6D, 0xBF6BB16C, 0x6A70FB78, 0x0D03D9C9, 0xD4DF39DE, 0xE01063DA, 0x4736F464, 0x5AD328D8, 0xB347CC96, 0x75BB0FC3, 0x98511BFB, 0x4FFBCC35, 0xB58BCF6A, 0xE11F0ABC, 0xBFC5FE4A, 0xA70AEC10, 0xAC39570A, 0x3F04442F, 0x6188B153, 0xE0397A2E, 0x5727CB79, 0x9CEB418F, 0x1CACD68D, 0x2AD37C96, 0x0175CB9D, 0xC69DFF09, 0xC75B65F0, 0xD9DB40D8, 0xEC0E7779, 0x4744EAD4, 0xB11C3274, 0xDD24CB9E, 0x7E1C54BD, 0xF01144F9, 0xD2240EB1, 0x9675B3FD, 0xA3AC3755, 0xD47C27AF, 0x51C85F4D, 0x56907596, 0xA5BB15E6, 0x580304F0, 0xCA042CF1, 0x011A37EA, 0x8DBFAADB, 0x35BA3E4A, 0x3526FFA0, 0xC37B4D09, 0xBC306ED9, 0x98A52666, 0x5648F725, 0xFF5E569D, 0x0CED63D0, 0x7C63B2CF, 0x700B45E1, 0xD5EA50F1, 0x85A92872, 0xAF1FBDA7, 0xD4234870, 0xA7870BF3, 0x2D3B4D79, 0x42E04198, 0x0CD0EDE7, 0x26470DB8, 0xF881814C, 0x474D6AD7, 0x7C0C5E5C, 0xD1231959, 0x381B7298, 0xF5D2F4DB, 0xAB838653, 0x6E2F1E23, 0x83719C9E, 0xBD91E046, 0x9A56456E, 0xDC39200C, 0x20C8C571, 0x962BDA1C, 0xE1E696FF, 0xB141AB08, 0x7CCA89B9, 0x1A69E783, 0x02CC4843, 0xA2F7C579, 0x429EF47D, 0x427B169C, 0x5AC9F049, 0xDD8F0F00, 0x5C8165BF }; const u32bit CAST_SBOX2[256] = { 0x1F201094, 0xEF0BA75B, 0x69E3CF7E, 0x393F4380, 0xFE61CF7A, 0xEEC5207A, 0x55889C94, 0x72FC0651, 0xADA7EF79, 0x4E1D7235, 0xD55A63CE, 0xDE0436BA, 0x99C430EF, 0x5F0C0794, 0x18DCDB7D, 0xA1D6EFF3, 0xA0B52F7B, 0x59E83605, 0xEE15B094, 0xE9FFD909, 0xDC440086, 0xEF944459, 0xBA83CCB3, 0xE0C3CDFB, 0xD1DA4181, 0x3B092AB1, 0xF997F1C1, 0xA5E6CF7B, 0x01420DDB, 0xE4E7EF5B, 0x25A1FF41, 0xE180F806, 0x1FC41080, 0x179BEE7A, 0xD37AC6A9, 0xFE5830A4, 0x98DE8B7F, 0x77E83F4E, 0x79929269, 0x24FA9F7B, 0xE113C85B, 0xACC40083, 0xD7503525, 0xF7EA615F, 0x62143154, 0x0D554B63, 0x5D681121, 0xC866C359, 0x3D63CF73, 0xCEE234C0, 0xD4D87E87, 0x5C672B21, 0x071F6181, 0x39F7627F, 0x361E3084, 0xE4EB573B, 0x602F64A4, 0xD63ACD9C, 0x1BBC4635, 0x9E81032D, 0x2701F50C, 0x99847AB4, 0xA0E3DF79, 0xBA6CF38C, 0x10843094, 0x2537A95E, 0xF46F6FFE, 0xA1FF3B1F, 0x208CFB6A, 0x8F458C74, 0xD9E0A227, 0x4EC73A34, 0xFC884F69, 0x3E4DE8DF, 0xEF0E0088, 0x3559648D, 0x8A45388C, 0x1D804366, 0x721D9BFD, 0xA58684BB, 0xE8256333, 0x844E8212, 0x128D8098, 0xFED33FB4, 0xCE280AE1, 0x27E19BA5, 0xD5A6C252, 0xE49754BD, 0xC5D655DD, 0xEB667064, 0x77840B4D, 0xA1B6A801, 0x84DB26A9, 0xE0B56714, 0x21F043B7, 0xE5D05860, 0x54F03084, 0x066FF472, 0xA31AA153, 0xDADC4755, 0xB5625DBF, 0x68561BE6, 0x83CA6B94, 0x2D6ED23B, 0xECCF01DB, 0xA6D3D0BA, 0xB6803D5C, 0xAF77A709, 0x33B4A34C, 0x397BC8D6, 0x5EE22B95, 0x5F0E5304, 0x81ED6F61, 0x20E74364, 0xB45E1378, 0xDE18639B, 0x881CA122, 0xB96726D1, 0x8049A7E8, 0x22B7DA7B, 0x5E552D25, 0x5272D237, 0x79D2951C, 0xC60D894C, 0x488CB402, 0x1BA4FE5B, 0xA4B09F6B, 0x1CA815CF, 0xA20C3005, 0x8871DF63, 0xB9DE2FCB, 0x0CC6C9E9, 0x0BEEFF53, 0xE3214517, 0xB4542835, 0x9F63293C, 0xEE41E729, 0x6E1D2D7C, 0x50045286, 0x1E6685F3, 0xF33401C6, 0x30A22C95, 0x31A70850, 0x60930F13, 0x73F98417, 0xA1269859, 0xEC645C44, 0x52C877A9, 0xCDFF33A6, 0xA02B1741, 0x7CBAD9A2, 0x2180036F, 0x50D99C08, 0xCB3F4861, 0xC26BD765, 0x64A3F6AB, 0x80342676, 0x25A75E7B, 0xE4E6D1FC, 0x20C710E6, 0xCDF0B680, 0x17844D3B, 0x31EEF84D, 0x7E0824E4, 0x2CCB49EB, 0x846A3BAE, 0x8FF77888, 0xEE5D60F6, 0x7AF75673, 0x2FDD5CDB, 0xA11631C1, 0x30F66F43, 0xB3FAEC54, 0x157FD7FA, 0xEF8579CC, 0xD152DE58, 0xDB2FFD5E, 0x8F32CE19, 0x306AF97A, 0x02F03EF8, 0x99319AD5, 0xC242FA0F, 0xA7E3EBB0, 0xC68E4906, 0xB8DA230C, 0x80823028, 0xDCDEF3C8, 0xD35FB171, 0x088A1BC8, 0xBEC0C560, 0x61A3C9E8, 0xBCA8F54D, 0xC72FEFFA, 0x22822E99, 0x82C570B4, 0xD8D94E89, 0x8B1C34BC, 0x301E16E6, 0x273BE979, 0xB0FFEAA6, 0x61D9B8C6, 0x00B24869, 0xB7FFCE3F, 0x08DC283B, 0x43DAF65A, 0xF7E19798, 0x7619B72F, 0x8F1C9BA4, 0xDC8637A0, 0x16A7D3B1, 0x9FC393B7, 0xA7136EEB, 0xC6BCC63E, 0x1A513742, 0xEF6828BC, 0x520365D6, 0x2D6A77AB, 0x3527ED4B, 0x821FD216, 0x095C6E2E, 0xDB92F2FB, 0x5EEA29CB, 0x145892F5, 0x91584F7F, 0x5483697B, 0x2667A8CC, 0x85196048, 0x8C4BACEA, 0x833860D4, 0x0D23E0F9, 0x6C387E8A, 0x0AE6D249, 0xB284600C, 0xD835731D, 0xDCB1C647, 0xAC4C56EA, 0x3EBD81B3, 0x230EABB0, 0x6438BC87, 0xF0B5B1FA, 0x8F5EA2B3, 0xFC184642, 0x0A036B7A, 0x4FB089BD, 0x649DA589, 0xA345415E, 0x5C038323, 0x3E5D3BB9, 0x43D79572, 0x7E6DD07C, 0x06DFDF1E, 0x6C6CC4EF, 0x7160A539, 0x73BFBE70, 0x83877605, 0x4523ECF1 }; const u32bit CAST_SBOX3[256] = { 0x8DEFC240, 0x25FA5D9F, 0xEB903DBF, 0xE810C907, 0x47607FFF, 0x369FE44B, 0x8C1FC644, 0xAECECA90, 0xBEB1F9BF, 0xEEFBCAEA, 0xE8CF1950, 0x51DF07AE, 0x920E8806, 0xF0AD0548, 0xE13C8D83, 0x927010D5, 0x11107D9F, 0x07647DB9, 0xB2E3E4D4, 0x3D4F285E, 0xB9AFA820, 0xFADE82E0, 0xA067268B, 0x8272792E, 0x553FB2C0, 0x489AE22B, 0xD4EF9794, 0x125E3FBC, 0x21FFFCEE, 0x825B1BFD, 0x9255C5ED, 0x1257A240, 0x4E1A8302, 0xBAE07FFF, 0x528246E7, 0x8E57140E, 0x3373F7BF, 0x8C9F8188, 0xA6FC4EE8, 0xC982B5A5, 0xA8C01DB7, 0x579FC264, 0x67094F31, 0xF2BD3F5F, 0x40FFF7C1, 0x1FB78DFC, 0x8E6BD2C1, 0x437BE59B, 0x99B03DBF, 0xB5DBC64B, 0x638DC0E6, 0x55819D99, 0xA197C81C, 0x4A012D6E, 0xC5884A28, 0xCCC36F71, 0xB843C213, 0x6C0743F1, 0x8309893C, 0x0FEDDD5F, 0x2F7FE850, 0xD7C07F7E, 0x02507FBF, 0x5AFB9A04, 0xA747D2D0, 0x1651192E, 0xAF70BF3E, 0x58C31380, 0x5F98302E, 0x727CC3C4, 0x0A0FB402, 0x0F7FEF82, 0x8C96FDAD, 0x5D2C2AAE, 0x8EE99A49, 0x50DA88B8, 0x8427F4A0, 0x1EAC5790, 0x796FB449, 0x8252DC15, 0xEFBD7D9B, 0xA672597D, 0xADA840D8, 0x45F54504, 0xFA5D7403, 0xE83EC305, 0x4F91751A, 0x925669C2, 0x23EFE941, 0xA903F12E, 0x60270DF2, 0x0276E4B6, 0x94FD6574, 0x927985B2, 0x8276DBCB, 0x02778176, 0xF8AF918D, 0x4E48F79E, 0x8F616DDF, 0xE29D840E, 0x842F7D83, 0x340CE5C8, 0x96BBB682, 0x93B4B148, 0xEF303CAB, 0x984FAF28, 0x779FAF9B, 0x92DC560D, 0x224D1E20, 0x8437AA88, 0x7D29DC96, 0x2756D3DC, 0x8B907CEE, 0xB51FD240, 0xE7C07CE3, 0xE566B4A1, 0xC3E9615E, 0x3CF8209D, 0x6094D1E3, 0xCD9CA341, 0x5C76460E, 0x00EA983B, 0xD4D67881, 0xFD47572C, 0xF76CEDD9, 0xBDA8229C, 0x127DADAA, 0x438A074E, 0x1F97C090, 0x081BDB8A, 0x93A07EBE, 0xB938CA15, 0x97B03CFF, 0x3DC2C0F8, 0x8D1AB2EC, 0x64380E51, 0x68CC7BFB, 0xD90F2788, 0x12490181, 0x5DE5FFD4, 0xDD7EF86A, 0x76A2E214, 0xB9A40368, 0x925D958F, 0x4B39FFFA, 0xBA39AEE9, 0xA4FFD30B, 0xFAF7933B, 0x6D498623, 0x193CBCFA, 0x27627545, 0x825CF47A, 0x61BD8BA0, 0xD11E42D1, 0xCEAD04F4, 0x127EA392, 0x10428DB7, 0x8272A972, 0x9270C4A8, 0x127DE50B, 0x285BA1C8, 0x3C62F44F, 0x35C0EAA5, 0xE805D231, 0x428929FB, 0xB4FCDF82, 0x4FB66A53, 0x0E7DC15B, 0x1F081FAB, 0x108618AE, 0xFCFD086D, 0xF9FF2889, 0x694BCC11, 0x236A5CAE, 0x12DECA4D, 0x2C3F8CC5, 0xD2D02DFE, 0xF8EF5896, 0xE4CF52DA, 0x95155B67, 0x494A488C, 0xB9B6A80C, 0x5C8F82BC, 0x89D36B45, 0x3A609437, 0xEC00C9A9, 0x44715253, 0x0A874B49, 0xD773BC40, 0x7C34671C, 0x02717EF6, 0x4FEB5536, 0xA2D02FFF, 0xD2BF60C4, 0xD43F03C0, 0x50B4EF6D, 0x07478CD1, 0x006E1888, 0xA2E53F55, 0xB9E6D4BC, 0xA2048016, 0x97573833, 0xD7207D67, 0xDE0F8F3D, 0x72F87B33, 0xABCC4F33, 0x7688C55D, 0x7B00A6B0, 0x947B0001, 0x570075D2, 0xF9BB88F8, 0x8942019E, 0x4264A5FF, 0x856302E0, 0x72DBD92B, 0xEE971B69, 0x6EA22FDE, 0x5F08AE2B, 0xAF7A616D, 0xE5C98767, 0xCF1FEBD2, 0x61EFC8C2, 0xF1AC2571, 0xCC8239C2, 0x67214CB8, 0xB1E583D1, 0xB7DC3E62, 0x7F10BDCE, 0xF90A5C38, 0x0FF0443D, 0x606E6DC6, 0x60543A49, 0x5727C148, 0x2BE98A1D, 0x8AB41738, 0x20E1BE24, 0xAF96DA0F, 0x68458425, 0x99833BE5, 0x600D457D, 0x282F9350, 0x8334B362, 0xD91D1120, 0x2B6D8DA0, 0x642B1E31, 0x9C305A00, 0x52BCE688, 0x1B03588A, 0xF7BAEFD5, 0x4142ED9C, 0xA4315C11, 0x83323EC5, 0xDFEF4636, 0xA133C501, 0xE9D3531C, 0xEE353783 }; const u32bit CAST_SBOX4[256] = { 0x9DB30420, 0x1FB6E9DE, 0xA7BE7BEF, 0xD273A298, 0x4A4F7BDB, 0x64AD8C57, 0x85510443, 0xFA020ED1, 0x7E287AFF, 0xE60FB663, 0x095F35A1, 0x79EBF120, 0xFD059D43, 0x6497B7B1, 0xF3641F63, 0x241E4ADF, 0x28147F5F, 0x4FA2B8CD, 0xC9430040, 0x0CC32220, 0xFDD30B30, 0xC0A5374F, 0x1D2D00D9, 0x24147B15, 0xEE4D111A, 0x0FCA5167, 0x71FF904C, 0x2D195FFE, 0x1A05645F, 0x0C13FEFE, 0x081B08CA, 0x05170121, 0x80530100, 0xE83E5EFE, 0xAC9AF4F8, 0x7FE72701, 0xD2B8EE5F, 0x06DF4261, 0xBB9E9B8A, 0x7293EA25, 0xCE84FFDF, 0xF5718801, 0x3DD64B04, 0xA26F263B, 0x7ED48400, 0x547EEBE6, 0x446D4CA0, 0x6CF3D6F5, 0x2649ABDF, 0xAEA0C7F5, 0x36338CC1, 0x503F7E93, 0xD3772061, 0x11B638E1, 0x72500E03, 0xF80EB2BB, 0xABE0502E, 0xEC8D77DE, 0x57971E81, 0xE14F6746, 0xC9335400, 0x6920318F, 0x081DBB99, 0xFFC304A5, 0x4D351805, 0x7F3D5CE3, 0xA6C866C6, 0x5D5BCCA9, 0xDAEC6FEA, 0x9F926F91, 0x9F46222F, 0x3991467D, 0xA5BF6D8E, 0x1143C44F, 0x43958302, 0xD0214EEB, 0x022083B8, 0x3FB6180C, 0x18F8931E, 0x281658E6, 0x26486E3E, 0x8BD78A70, 0x7477E4C1, 0xB506E07C, 0xF32D0A25, 0x79098B02, 0xE4EABB81, 0x28123B23, 0x69DEAD38, 0x1574CA16, 0xDF871B62, 0x211C40B7, 0xA51A9EF9, 0x0014377B, 0x041E8AC8, 0x09114003, 0xBD59E4D2, 0xE3D156D5, 0x4FE876D5, 0x2F91A340, 0x557BE8DE, 0x00EAE4A7, 0x0CE5C2EC, 0x4DB4BBA6, 0xE756BDFF, 0xDD3369AC, 0xEC17B035, 0x06572327, 0x99AFC8B0, 0x56C8C391, 0x6B65811C, 0x5E146119, 0x6E85CB75, 0xBE07C002, 0xC2325577, 0x893FF4EC, 0x5BBFC92D, 0xD0EC3B25, 0xB7801AB7, 0x8D6D3B24, 0x20C763EF, 0xC366A5FC, 0x9C382880, 0x0ACE3205, 0xAAC9548A, 0xECA1D7C7, 0x041AFA32, 0x1D16625A, 0x6701902C, 0x9B757A54, 0x31D477F7, 0x9126B031, 0x36CC6FDB, 0xC70B8B46, 0xD9E66A48, 0x56E55A79, 0x026A4CEB, 0x52437EFF, 0x2F8F76B4, 0x0DF980A5, 0x8674CDE3, 0xEDDA04EB, 0x17A9BE04, 0x2C18F4DF, 0xB7747F9D, 0xAB2AF7B4, 0xEFC34D20, 0x2E096B7C, 0x1741A254, 0xE5B6A035, 0x213D42F6, 0x2C1C7C26, 0x61C2F50F, 0x6552DAF9, 0xD2C231F8, 0x25130F69, 0xD8167FA2, 0x0418F2C8, 0x001A96A6, 0x0D1526AB, 0x63315C21, 0x5E0A72EC, 0x49BAFEFD, 0x187908D9, 0x8D0DBD86, 0x311170A7, 0x3E9B640C, 0xCC3E10D7, 0xD5CAD3B6, 0x0CAEC388, 0xF73001E1, 0x6C728AFF, 0x71EAE2A1, 0x1F9AF36E, 0xCFCBD12F, 0xC1DE8417, 0xAC07BE6B, 0xCB44A1D8, 0x8B9B0F56, 0x013988C3, 0xB1C52FCA, 0xB4BE31CD, 0xD8782806, 0x12A3A4E2, 0x6F7DE532, 0x58FD7EB6, 0xD01EE900, 0x24ADFFC2, 0xF4990FC5, 0x9711AAC5, 0x001D7B95, 0x82E5E7D2, 0x109873F6, 0x00613096, 0xC32D9521, 0xADA121FF, 0x29908415, 0x7FBB977F, 0xAF9EB3DB, 0x29C9ED2A, 0x5CE2A465, 0xA730F32C, 0xD0AA3FE8, 0x8A5CC091, 0xD49E2CE7, 0x0CE454A9, 0xD60ACD86, 0x015F1919, 0x77079103, 0xDEA03AF6, 0x78A8565E, 0xDEE356DF, 0x21F05CBE, 0x8B75E387, 0xB3C50651, 0xB8A5C3EF, 0xD8EEB6D2, 0xE523BE77, 0xC2154529, 0x2F69EFDF, 0xAFE67AFB, 0xF470C4B2, 0xF3E0EB5B, 0xD6CC9876, 0x39E4460C, 0x1FDA8538, 0x1987832F, 0xCA007367, 0xA99144F8, 0x296B299E, 0x492FC295, 0x9266BEAB, 0xB5676E69, 0x9BD3DDDA, 0xDF7E052F, 0xDB25701C, 0x1B5E51EE, 0xF65324E6, 0x6AFCE36C, 0x0316CC04, 0x8644213E, 0xB7DC59D0, 0x7965291F, 0xCCD6FD43, 0x41823979, 0x932BCDF6, 0xB657C34D, 0x4EDFD282, 0x7AE5290C, 0x3CB9536B, 0x851E20FE, 0x9833557E, 0x13ECF0B0, 0xD3FFB372, 0x3F85C5C1, 0x0AEF7ED2 }; const u32bit CAST_128::S5[256] = { 0x7EC90C04, 0x2C6E74B9, 0x9B0E66DF, 0xA6337911, 0xB86A7FFF, 0x1DD358F5, 0x44DD9D44, 0x1731167F, 0x08FBF1FA, 0xE7F511CC, 0xD2051B00, 0x735ABA00, 0x2AB722D8, 0x386381CB, 0xACF6243A, 0x69BEFD7A, 0xE6A2E77F, 0xF0C720CD, 0xC4494816, 0xCCF5C180, 0x38851640, 0x15B0A848, 0xE68B18CB, 0x4CAADEFF, 0x5F480A01, 0x0412B2AA, 0x259814FC, 0x41D0EFE2, 0x4E40B48D, 0x248EB6FB, 0x8DBA1CFE, 0x41A99B02, 0x1A550A04, 0xBA8F65CB, 0x7251F4E7, 0x95A51725, 0xC106ECD7, 0x97A5980A, 0xC539B9AA, 0x4D79FE6A, 0xF2F3F763, 0x68AF8040, 0xED0C9E56, 0x11B4958B, 0xE1EB5A88, 0x8709E6B0, 0xD7E07156, 0x4E29FEA7, 0x6366E52D, 0x02D1C000, 0xC4AC8E05, 0x9377F571, 0x0C05372A, 0x578535F2, 0x2261BE02, 0xD642A0C9, 0xDF13A280, 0x74B55BD2, 0x682199C0, 0xD421E5EC, 0x53FB3CE8, 0xC8ADEDB3, 0x28A87FC9, 0x3D959981, 0x5C1FF900, 0xFE38D399, 0x0C4EFF0B, 0x062407EA, 0xAA2F4FB1, 0x4FB96976, 0x90C79505, 0xB0A8A774, 0xEF55A1FF, 0xE59CA2C2, 0xA6B62D27, 0xE66A4263, 0xDF65001F, 0x0EC50966, 0xDFDD55BC, 0x29DE0655, 0x911E739A, 0x17AF8975, 0x32C7911C, 0x89F89468, 0x0D01E980, 0x524755F4, 0x03B63CC9, 0x0CC844B2, 0xBCF3F0AA, 0x87AC36E9, 0xE53A7426, 0x01B3D82B, 0x1A9E7449, 0x64EE2D7E, 0xCDDBB1DA, 0x01C94910, 0xB868BF80, 0x0D26F3FD, 0x9342EDE7, 0x04A5C284, 0x636737B6, 0x50F5B616, 0xF24766E3, 0x8ECA36C1, 0x136E05DB, 0xFEF18391, 0xFB887A37, 0xD6E7F7D4, 0xC7FB7DC9, 0x3063FCDF, 0xB6F589DE, 0xEC2941DA, 0x26E46695, 0xB7566419, 0xF654EFC5, 0xD08D58B7, 0x48925401, 0xC1BACB7F, 0xE5FF550F, 0xB6083049, 0x5BB5D0E8, 0x87D72E5A, 0xAB6A6EE1, 0x223A66CE, 0xC62BF3CD, 0x9E0885F9, 0x68CB3E47, 0x086C010F, 0xA21DE820, 0xD18B69DE, 0xF3F65777, 0xFA02C3F6, 0x407EDAC3, 0xCBB3D550, 0x1793084D, 0xB0D70EBA, 0x0AB378D5, 0xD951FB0C, 0xDED7DA56, 0x4124BBE4, 0x94CA0B56, 0x0F5755D1, 0xE0E1E56E, 0x6184B5BE, 0x580A249F, 0x94F74BC0, 0xE327888E, 0x9F7B5561, 0xC3DC0280, 0x05687715, 0x646C6BD7, 0x44904DB3, 0x66B4F0A3, 0xC0F1648A, 0x697ED5AF, 0x49E92FF6, 0x309E374F, 0x2CB6356A, 0x85808573, 0x4991F840, 0x76F0AE02, 0x083BE84D, 0x28421C9A, 0x44489406, 0x736E4CB8, 0xC1092910, 0x8BC95FC6, 0x7D869CF4, 0x134F616F, 0x2E77118D, 0xB31B2BE1, 0xAA90B472, 0x3CA5D717, 0x7D161BBA, 0x9CAD9010, 0xAF462BA2, 0x9FE459D2, 0x45D34559, 0xD9F2DA13, 0xDBC65487, 0xF3E4F94E, 0x176D486F, 0x097C13EA, 0x631DA5C7, 0x445F7382, 0x175683F4, 0xCDC66A97, 0x70BE0288, 0xB3CDCF72, 0x6E5DD2F3, 0x20936079, 0x459B80A5, 0xBE60E2DB, 0xA9C23101, 0xEBA5315C, 0x224E42F2, 0x1C5C1572, 0xF6721B2C, 0x1AD2FFF3, 0x8C25404E, 0x324ED72F, 0x4067B7FD, 0x0523138E, 0x5CA3BC78, 0xDC0FD66E, 0x75922283, 0x784D6B17, 0x58EBB16E, 0x44094F85, 0x3F481D87, 0xFCFEAE7B, 0x77B5FF76, 0x8C2302BF, 0xAAF47556, 0x5F46B02A, 0x2B092801, 0x3D38F5F7, 0x0CA81F36, 0x52AF4A8A, 0x66D5E7C0, 0xDF3B0874, 0x95055110, 0x1B5AD7A8, 0xF61ED5AD, 0x6CF6E479, 0x20758184, 0xD0CEFA65, 0x88F7BE58, 0x4A046826, 0x0FF6F8F3, 0xA09C7F70, 0x5346ABA0, 0x5CE96C28, 0xE176EDA3, 0x6BAC307F, 0x376829D2, 0x85360FA9, 0x17E3FE2A, 0x24B79767, 0xF5A96B20, 0xD6CD2595, 0x68FF1EBF, 0x7555442C, 0xF19F06BE, 0xF9E0659A, 0xEEB9491D, 0x34010718, 0xBB30CAB8, 0xE822FE15, 0x88570983, 0x750E6249, 0xDA627E55, 0x5E76FFA8, 0xB1534546, 0x6D47DE08, 0xEFE9E7D4 }; const u32bit CAST_128::S6[256] = { 0xF6FA8F9D, 0x2CAC6CE1, 0x4CA34867, 0xE2337F7C, 0x95DB08E7, 0x016843B4, 0xECED5CBC, 0x325553AC, 0xBF9F0960, 0xDFA1E2ED, 0x83F0579D, 0x63ED86B9, 0x1AB6A6B8, 0xDE5EBE39, 0xF38FF732, 0x8989B138, 0x33F14961, 0xC01937BD, 0xF506C6DA, 0xE4625E7E, 0xA308EA99, 0x4E23E33C, 0x79CBD7CC, 0x48A14367, 0xA3149619, 0xFEC94BD5, 0xA114174A, 0xEAA01866, 0xA084DB2D, 0x09A8486F, 0xA888614A, 0x2900AF98, 0x01665991, 0xE1992863, 0xC8F30C60, 0x2E78EF3C, 0xD0D51932, 0xCF0FEC14, 0xF7CA07D2, 0xD0A82072, 0xFD41197E, 0x9305A6B0, 0xE86BE3DA, 0x74BED3CD, 0x372DA53C, 0x4C7F4448, 0xDAB5D440, 0x6DBA0EC3, 0x083919A7, 0x9FBAEED9, 0x49DBCFB0, 0x4E670C53, 0x5C3D9C01, 0x64BDB941, 0x2C0E636A, 0xBA7DD9CD, 0xEA6F7388, 0xE70BC762, 0x35F29ADB, 0x5C4CDD8D, 0xF0D48D8C, 0xB88153E2, 0x08A19866, 0x1AE2EAC8, 0x284CAF89, 0xAA928223, 0x9334BE53, 0x3B3A21BF, 0x16434BE3, 0x9AEA3906, 0xEFE8C36E, 0xF890CDD9, 0x80226DAE, 0xC340A4A3, 0xDF7E9C09, 0xA694A807, 0x5B7C5ECC, 0x221DB3A6, 0x9A69A02F, 0x68818A54, 0xCEB2296F, 0x53C0843A, 0xFE893655, 0x25BFE68A, 0xB4628ABC, 0xCF222EBF, 0x25AC6F48, 0xA9A99387, 0x53BDDB65, 0xE76FFBE7, 0xE967FD78, 0x0BA93563, 0x8E342BC1, 0xE8A11BE9, 0x4980740D, 0xC8087DFC, 0x8DE4BF99, 0xA11101A0, 0x7FD37975, 0xDA5A26C0, 0xE81F994F, 0x9528CD89, 0xFD339FED, 0xB87834BF, 0x5F04456D, 0x22258698, 0xC9C4C83B, 0x2DC156BE, 0x4F628DAA, 0x57F55EC5, 0xE2220ABE, 0xD2916EBF, 0x4EC75B95, 0x24F2C3C0, 0x42D15D99, 0xCD0D7FA0, 0x7B6E27FF, 0xA8DC8AF0, 0x7345C106, 0xF41E232F, 0x35162386, 0xE6EA8926, 0x3333B094, 0x157EC6F2, 0x372B74AF, 0x692573E4, 0xE9A9D848, 0xF3160289, 0x3A62EF1D, 0xA787E238, 0xF3A5F676, 0x74364853, 0x20951063, 0x4576698D, 0xB6FAD407, 0x592AF950, 0x36F73523, 0x4CFB6E87, 0x7DA4CEC0, 0x6C152DAA, 0xCB0396A8, 0xC50DFE5D, 0xFCD707AB, 0x0921C42F, 0x89DFF0BB, 0x5FE2BE78, 0x448F4F33, 0x754613C9, 0x2B05D08D, 0x48B9D585, 0xDC049441, 0xC8098F9B, 0x7DEDE786, 0xC39A3373, 0x42410005, 0x6A091751, 0x0EF3C8A6, 0x890072D6, 0x28207682, 0xA9A9F7BE, 0xBF32679D, 0xD45B5B75, 0xB353FD00, 0xCBB0E358, 0x830F220A, 0x1F8FB214, 0xD372CF08, 0xCC3C4A13, 0x8CF63166, 0x061C87BE, 0x88C98F88, 0x6062E397, 0x47CF8E7A, 0xB6C85283, 0x3CC2ACFB, 0x3FC06976, 0x4E8F0252, 0x64D8314D, 0xDA3870E3, 0x1E665459, 0xC10908F0, 0x513021A5, 0x6C5B68B7, 0x822F8AA0, 0x3007CD3E, 0x74719EEF, 0xDC872681, 0x073340D4, 0x7E432FD9, 0x0C5EC241, 0x8809286C, 0xF592D891, 0x08A930F6, 0x957EF305, 0xB7FBFFBD, 0xC266E96F, 0x6FE4AC98, 0xB173ECC0, 0xBC60B42A, 0x953498DA, 0xFBA1AE12, 0x2D4BD736, 0x0F25FAAB, 0xA4F3FCEB, 0xE2969123, 0x257F0C3D, 0x9348AF49, 0x361400BC, 0xE8816F4A, 0x3814F200, 0xA3F94043, 0x9C7A54C2, 0xBC704F57, 0xDA41E7F9, 0xC25AD33A, 0x54F4A084, 0xB17F5505, 0x59357CBE, 0xEDBD15C8, 0x7F97C5AB, 0xBA5AC7B5, 0xB6F6DEAF, 0x3A479C3A, 0x5302DA25, 0x653D7E6A, 0x54268D49, 0x51A477EA, 0x5017D55B, 0xD7D25D88, 0x44136C76, 0x0404A8C8, 0xB8E5A121, 0xB81A928A, 0x60ED5869, 0x97C55B96, 0xEAEC991B, 0x29935913, 0x01FDB7F1, 0x088E8DFA, 0x9AB6F6F5, 0x3B4CBF9F, 0x4A5DE3AB, 0xE6051D35, 0xA0E1D855, 0xD36B4CF1, 0xF544EDEB, 0xB0E93524, 0xBEBB8FBD, 0xA2D762CF, 0x49C92F54, 0x38B5F331, 0x7128A454, 0x48392905, 0xA65B1DB8, 0x851C97BD, 0xD675CF2F }; const u32bit CAST_128::S7[256] = { 0x85E04019, 0x332BF567, 0x662DBFFF, 0xCFC65693, 0x2A8D7F6F, 0xAB9BC912, 0xDE6008A1, 0x2028DA1F, 0x0227BCE7, 0x4D642916, 0x18FAC300, 0x50F18B82, 0x2CB2CB11, 0xB232E75C, 0x4B3695F2, 0xB28707DE, 0xA05FBCF6, 0xCD4181E9, 0xE150210C, 0xE24EF1BD, 0xB168C381, 0xFDE4E789, 0x5C79B0D8, 0x1E8BFD43, 0x4D495001, 0x38BE4341, 0x913CEE1D, 0x92A79C3F, 0x089766BE, 0xBAEEADF4, 0x1286BECF, 0xB6EACB19, 0x2660C200, 0x7565BDE4, 0x64241F7A, 0x8248DCA9, 0xC3B3AD66, 0x28136086, 0x0BD8DFA8, 0x356D1CF2, 0x107789BE, 0xB3B2E9CE, 0x0502AA8F, 0x0BC0351E, 0x166BF52A, 0xEB12FF82, 0xE3486911, 0xD34D7516, 0x4E7B3AFF, 0x5F43671B, 0x9CF6E037, 0x4981AC83, 0x334266CE, 0x8C9341B7, 0xD0D854C0, 0xCB3A6C88, 0x47BC2829, 0x4725BA37, 0xA66AD22B, 0x7AD61F1E, 0x0C5CBAFA, 0x4437F107, 0xB6E79962, 0x42D2D816, 0x0A961288, 0xE1A5C06E, 0x13749E67, 0x72FC081A, 0xB1D139F7, 0xF9583745, 0xCF19DF58, 0xBEC3F756, 0xC06EBA30, 0x07211B24, 0x45C28829, 0xC95E317F, 0xBC8EC511, 0x38BC46E9, 0xC6E6FA14, 0xBAE8584A, 0xAD4EBC46, 0x468F508B, 0x7829435F, 0xF124183B, 0x821DBA9F, 0xAFF60FF4, 0xEA2C4E6D, 0x16E39264, 0x92544A8B, 0x009B4FC3, 0xABA68CED, 0x9AC96F78, 0x06A5B79A, 0xB2856E6E, 0x1AEC3CA9, 0xBE838688, 0x0E0804E9, 0x55F1BE56, 0xE7E5363B, 0xB3A1F25D, 0xF7DEBB85, 0x61FE033C, 0x16746233, 0x3C034C28, 0xDA6D0C74, 0x79AAC56C, 0x3CE4E1AD, 0x51F0C802, 0x98F8F35A, 0x1626A49F, 0xEED82B29, 0x1D382FE3, 0x0C4FB99A, 0xBB325778, 0x3EC6D97B, 0x6E77A6A9, 0xCB658B5C, 0xD45230C7, 0x2BD1408B, 0x60C03EB7, 0xB9068D78, 0xA33754F4, 0xF430C87D, 0xC8A71302, 0xB96D8C32, 0xEBD4E7BE, 0xBE8B9D2D, 0x7979FB06, 0xE7225308, 0x8B75CF77, 0x11EF8DA4, 0xE083C858, 0x8D6B786F, 0x5A6317A6, 0xFA5CF7A0, 0x5DDA0033, 0xF28EBFB0, 0xF5B9C310, 0xA0EAC280, 0x08B9767A, 0xA3D9D2B0, 0x79D34217, 0x021A718D, 0x9AC6336A, 0x2711FD60, 0x438050E3, 0x069908A8, 0x3D7FEDC4, 0x826D2BEF, 0x4EEB8476, 0x488DCF25, 0x36C9D566, 0x28E74E41, 0xC2610ACA, 0x3D49A9CF, 0xBAE3B9DF, 0xB65F8DE6, 0x92AEAF64, 0x3AC7D5E6, 0x9EA80509, 0xF22B017D, 0xA4173F70, 0xDD1E16C3, 0x15E0D7F9, 0x50B1B887, 0x2B9F4FD5, 0x625ABA82, 0x6A017962, 0x2EC01B9C, 0x15488AA9, 0xD716E740, 0x40055A2C, 0x93D29A22, 0xE32DBF9A, 0x058745B9, 0x3453DC1E, 0xD699296E, 0x496CFF6F, 0x1C9F4986, 0xDFE2ED07, 0xB87242D1, 0x19DE7EAE, 0x053E561A, 0x15AD6F8C, 0x66626C1C, 0x7154C24C, 0xEA082B2A, 0x93EB2939, 0x17DCB0F0, 0x58D4F2AE, 0x9EA294FB, 0x52CF564C, 0x9883FE66, 0x2EC40581, 0x763953C3, 0x01D6692E, 0xD3A0C108, 0xA1E7160E, 0xE4F2DFA6, 0x693ED285, 0x74904698, 0x4C2B0EDD, 0x4F757656, 0x5D393378, 0xA132234F, 0x3D321C5D, 0xC3F5E194, 0x4B269301, 0xC79F022F, 0x3C997E7E, 0x5E4F9504, 0x3FFAFBBD, 0x76F7AD0E, 0x296693F4, 0x3D1FCE6F, 0xC61E45BE, 0xD3B5AB34, 0xF72BF9B7, 0x1B0434C0, 0x4E72B567, 0x5592A33D, 0xB5229301, 0xCFD2A87F, 0x60AEB767, 0x1814386B, 0x30BCC33D, 0x38A0C07D, 0xFD1606F2, 0xC363519B, 0x589DD390, 0x5479F8E6, 0x1CB8D647, 0x97FD61A9, 0xEA7759F4, 0x2D57539D, 0x569A58CF, 0xE84E63AD, 0x462E1B78, 0x6580F87E, 0xF3817914, 0x91DA55F4, 0x40A230F3, 0xD1988F35, 0xB6E318D2, 0x3FFA50BC, 0x3D40F021, 0xC3C0BDAE, 0x4958C24C, 0x518F36B2, 0x84B1D370, 0x0FEDCE83, 0x878DDADA, 0xF2A279C7, 0x94E01BE8, 0x90716F4B, 0x954B8AA3 }; const u32bit CAST_128::S8[256] = { 0xE216300D, 0xBBDDFFFC, 0xA7EBDABD, 0x35648095, 0x7789F8B7, 0xE6C1121B, 0x0E241600, 0x052CE8B5, 0x11A9CFB0, 0xE5952F11, 0xECE7990A, 0x9386D174, 0x2A42931C, 0x76E38111, 0xB12DEF3A, 0x37DDDDFC, 0xDE9ADEB1, 0x0A0CC32C, 0xBE197029, 0x84A00940, 0xBB243A0F, 0xB4D137CF, 0xB44E79F0, 0x049EEDFD, 0x0B15A15D, 0x480D3168, 0x8BBBDE5A, 0x669DED42, 0xC7ECE831, 0x3F8F95E7, 0x72DF191B, 0x7580330D, 0x94074251, 0x5C7DCDFA, 0xABBE6D63, 0xAA402164, 0xB301D40A, 0x02E7D1CA, 0x53571DAE, 0x7A3182A2, 0x12A8DDEC, 0xFDAA335D, 0x176F43E8, 0x71FB46D4, 0x38129022, 0xCE949AD4, 0xB84769AD, 0x965BD862, 0x82F3D055, 0x66FB9767, 0x15B80B4E, 0x1D5B47A0, 0x4CFDE06F, 0xC28EC4B8, 0x57E8726E, 0x647A78FC, 0x99865D44, 0x608BD593, 0x6C200E03, 0x39DC5FF6, 0x5D0B00A3, 0xAE63AFF2, 0x7E8BD632, 0x70108C0C, 0xBBD35049, 0x2998DF04, 0x980CF42A, 0x9B6DF491, 0x9E7EDD53, 0x06918548, 0x58CB7E07, 0x3B74EF2E, 0x522FFFB1, 0xD24708CC, 0x1C7E27CD, 0xA4EB215B, 0x3CF1D2E2, 0x19B47A38, 0x424F7618, 0x35856039, 0x9D17DEE7, 0x27EB35E6, 0xC9AFF67B, 0x36BAF5B8, 0x09C467CD, 0xC18910B1, 0xE11DBF7B, 0x06CD1AF8, 0x7170C608, 0x2D5E3354, 0xD4DE495A, 0x64C6D006, 0xBCC0C62C, 0x3DD00DB3, 0x708F8F34, 0x77D51B42, 0x264F620F, 0x24B8D2BF, 0x15C1B79E, 0x46A52564, 0xF8D7E54E, 0x3E378160, 0x7895CDA5, 0x859C15A5, 0xE6459788, 0xC37BC75F, 0xDB07BA0C, 0x0676A3AB, 0x7F229B1E, 0x31842E7B, 0x24259FD7, 0xF8BEF472, 0x835FFCB8, 0x6DF4C1F2, 0x96F5B195, 0xFD0AF0FC, 0xB0FE134C, 0xE2506D3D, 0x4F9B12EA, 0xF215F225, 0xA223736F, 0x9FB4C428, 0x25D04979, 0x34C713F8, 0xC4618187, 0xEA7A6E98, 0x7CD16EFC, 0x1436876C, 0xF1544107, 0xBEDEEE14, 0x56E9AF27, 0xA04AA441, 0x3CF7C899, 0x92ECBAE6, 0xDD67016D, 0x151682EB, 0xA842EEDF, 0xFDBA60B4, 0xF1907B75, 0x20E3030F, 0x24D8C29E, 0xE139673B, 0xEFA63FB8, 0x71873054, 0xB6F2CF3B, 0x9F326442, 0xCB15A4CC, 0xB01A4504, 0xF1E47D8D, 0x844A1BE5, 0xBAE7DFDC, 0x42CBDA70, 0xCD7DAE0A, 0x57E85B7A, 0xD53F5AF6, 0x20CF4D8C, 0xCEA4D428, 0x79D130A4, 0x3486EBFB, 0x33D3CDDC, 0x77853B53, 0x37EFFCB5, 0xC5068778, 0xE580B3E6, 0x4E68B8F4, 0xC5C8B37E, 0x0D809EA2, 0x398FEB7C, 0x132A4F94, 0x43B7950E, 0x2FEE7D1C, 0x223613BD, 0xDD06CAA2, 0x37DF932B, 0xC4248289, 0xACF3EBC3, 0x5715F6B7, 0xEF3478DD, 0xF267616F, 0xC148CBE4, 0x9052815E, 0x5E410FAB, 0xB48A2465, 0x2EDA7FA4, 0xE87B40E4, 0xE98EA084, 0x5889E9E1, 0xEFD390FC, 0xDD07D35B, 0xDB485694, 0x38D7E5B2, 0x57720101, 0x730EDEBC, 0x5B643113, 0x94917E4F, 0x503C2FBA, 0x646F1282, 0x7523D24A, 0xE0779695, 0xF9C17A8F, 0x7A5B2121, 0xD187B896, 0x29263A4D, 0xBA510CDF, 0x81F47C9F, 0xAD1163ED, 0xEA7B5965, 0x1A00726E, 0x11403092, 0x00DA6D77, 0x4A0CDD61, 0xAD1F4603, 0x605BDFB0, 0x9EEDC364, 0x22EBE6A8, 0xCEE7D28A, 0xA0E736A0, 0x5564A6B9, 0x10853209, 0xC7EB8F37, 0x2DE705CA, 0x8951570F, 0xDF09822B, 0xBD691A6C, 0xAA12E4F2, 0x87451C0F, 0xE0F6A27A, 0x3ADA4819, 0x4CF1764F, 0x0D771C2B, 0x67CDB156, 0x350D8384, 0x5938FA0F, 0x42399EF3, 0x36997B07, 0x0E84093D, 0x4AA93E61, 0x8360D87B, 0x1FA98B0C, 0x1149382C, 0xE97625A5, 0x0614D1B7, 0x0E25244B, 0x0C768347, 0x589E8D82, 0x0D2059D1, 0xA466BB1E, 0xF8DA0A82, 0x04F19130, 0xBA6E4EC0, 0x99265164, 0x1EE7230D, 0x50B2AD80, 0xEAEE6801, 0x8DB2A283, 0xEA8BF59E }; const u32bit CAST_256::KEY_MASK[192] = { 0x5A827999, 0xC95C653A, 0x383650DB, 0xA7103C7C, 0x15EA281D, 0x84C413BE, 0xF39DFF5F, 0x6277EB00, 0xD151D6A1, 0x402BC242, 0xAF05ADE3, 0x1DDF9984, 0x8CB98525, 0xFB9370C6, 0x6A6D5C67, 0xD9474808, 0x482133A9, 0xB6FB1F4A, 0x25D50AEB, 0x94AEF68C, 0x0388E22D, 0x7262CDCE, 0xE13CB96F, 0x5016A510, 0xBEF090B1, 0x2DCA7C52, 0x9CA467F3, 0x0B7E5394, 0x7A583F35, 0xE9322AD6, 0x580C1677, 0xC6E60218, 0x35BFEDB9, 0xA499D95A, 0x1373C4FB, 0x824DB09C, 0xF1279C3D, 0x600187DE, 0xCEDB737F, 0x3DB55F20, 0xAC8F4AC1, 0x1B693662, 0x8A432203, 0xF91D0DA4, 0x67F6F945, 0xD6D0E4E6, 0x45AAD087, 0xB484BC28, 0x235EA7C9, 0x9238936A, 0x01127F0B, 0x6FEC6AAC, 0xDEC6564D, 0x4DA041EE, 0xBC7A2D8F, 0x2B541930, 0x9A2E04D1, 0x0907F072, 0x77E1DC13, 0xE6BBC7B4, 0x5595B355, 0xC46F9EF6, 0x33498A97, 0xA2237638, 0x10FD61D9, 0x7FD74D7A, 0xEEB1391B, 0x5D8B24BC, 0xCC65105D, 0x3B3EFBFE, 0xAA18E79F, 0x18F2D340, 0x87CCBEE1, 0xF6A6AA82, 0x65809623, 0xD45A81C4, 0x43346D65, 0xB20E5906, 0x20E844A7, 0x8FC23048, 0xFE9C1BE9, 0x6D76078A, 0xDC4FF32B, 0x4B29DECC, 0xBA03CA6D, 0x28DDB60E, 0x97B7A1AF, 0x06918D50, 0x756B78F1, 0xE4456492, 0x531F5033, 0xC1F93BD4, 0x30D32775, 0x9FAD1316, 0x0E86FEB7, 0x7D60EA58, 0xEC3AD5F9, 0x5B14C19A, 0xC9EEAD3B, 0x38C898DC, 0xA7A2847D, 0x167C701E, 0x85565BBF, 0xF4304760, 0x630A3301, 0xD1E41EA2, 0x40BE0A43, 0xAF97F5E4, 0x1E71E185, 0x8D4BCD26, 0xFC25B8C7, 0x6AFFA468, 0xD9D99009, 0x48B37BAA, 0xB78D674B, 0x266752EC, 0x95413E8D, 0x041B2A2E, 0x72F515CF, 0xE1CF0170, 0x50A8ED11, 0xBF82D8B2, 0x2E5CC453, 0x9D36AFF4, 0x0C109B95, 0x7AEA8736, 0xE9C472D7, 0x589E5E78, 0xC7784A19, 0x365235BA, 0xA52C215B, 0x14060CFC, 0x82DFF89D, 0xF1B9E43E, 0x6093CFDF, 0xCF6DBB80, 0x3E47A721, 0xAD2192C2, 0x1BFB7E63, 0x8AD56A04, 0xF9AF55A5, 0x68894146, 0xD7632CE7, 0x463D1888, 0xB5170429, 0x23F0EFCA, 0x92CADB6B, 0x01A4C70C, 0x707EB2AD, 0xDF589E4E, 0x4E3289EF, 0xBD0C7590, 0x2BE66131, 0x9AC04CD2, 0x099A3873, 0x78742414, 0xE74E0FB5, 0x5627FB56, 0xC501E6F7, 0x33DBD298, 0xA2B5BE39, 0x118FA9DA, 0x8069957B, 0xEF43811C, 0x5E1D6CBD, 0xCCF7585E, 0x3BD143FF, 0xAAAB2FA0, 0x19851B41, 0x885F06E2, 0xF738F283, 0x6612DE24, 0xD4ECC9C5, 0x43C6B566, 0xB2A0A107, 0x217A8CA8, 0x90547849, 0xFF2E63EA, 0x6E084F8B, 0xDCE23B2C, 0x4BBC26CD, 0xBA96126E, 0x296FFE0F, 0x9849E9B0, 0x0723D551, 0x75FDC0F2, 0xE4D7AC93, 0x53B19834, 0xC28B83D5, 0x31656F76, 0xA03F5B17, 0x0F1946B8 }; const byte CAST_256::KEY_ROT[32] = { 0x13, 0x04, 0x15, 0x06, 0x17, 0x08, 0x19, 0x0A, 0x1B, 0x0C, 0x1D, 0x0E, 0x1F, 0x10, 0x01, 0x12, 0x03, 0x14, 0x05, 0x16, 0x07, 0x18, 0x09, 0x1A, 0x0B, 0x1C, 0x0D, 0x1E, 0x0F, 0x00, 0x11, 0x02 }; } Botan-1.10.12/src/block/cast/info.txt0000664000175000017500000000001412654331322017066 0ustar jackjack00000000000000define CAST Botan-1.10.12/src/block/des/des.cpp0000664000175000017500000002516312654331322016506 0ustar jackjack00000000000000/* * DES * (C) 1999-2008 Jack Lloyd * * Based on a public domain implemenation by Phil Karn (who in turn * credited Richard Outerbridge and Jim Gillogly) * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * DES Key Schedule */ void des_key_schedule(u32bit round_key[32], const byte key[8]) { static const byte ROT[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; u32bit C = ((key[7] & 0x80) << 20) | ((key[6] & 0x80) << 19) | ((key[5] & 0x80) << 18) | ((key[4] & 0x80) << 17) | ((key[3] & 0x80) << 16) | ((key[2] & 0x80) << 15) | ((key[1] & 0x80) << 14) | ((key[0] & 0x80) << 13) | ((key[7] & 0x40) << 13) | ((key[6] & 0x40) << 12) | ((key[5] & 0x40) << 11) | ((key[4] & 0x40) << 10) | ((key[3] & 0x40) << 9) | ((key[2] & 0x40) << 8) | ((key[1] & 0x40) << 7) | ((key[0] & 0x40) << 6) | ((key[7] & 0x20) << 6) | ((key[6] & 0x20) << 5) | ((key[5] & 0x20) << 4) | ((key[4] & 0x20) << 3) | ((key[3] & 0x20) << 2) | ((key[2] & 0x20) << 1) | ((key[1] & 0x20) ) | ((key[0] & 0x20) >> 1) | ((key[7] & 0x10) >> 1) | ((key[6] & 0x10) >> 2) | ((key[5] & 0x10) >> 3) | ((key[4] & 0x10) >> 4); u32bit D = ((key[7] & 0x02) << 26) | ((key[6] & 0x02) << 25) | ((key[5] & 0x02) << 24) | ((key[4] & 0x02) << 23) | ((key[3] & 0x02) << 22) | ((key[2] & 0x02) << 21) | ((key[1] & 0x02) << 20) | ((key[0] & 0x02) << 19) | ((key[7] & 0x04) << 17) | ((key[6] & 0x04) << 16) | ((key[5] & 0x04) << 15) | ((key[4] & 0x04) << 14) | ((key[3] & 0x04) << 13) | ((key[2] & 0x04) << 12) | ((key[1] & 0x04) << 11) | ((key[0] & 0x04) << 10) | ((key[7] & 0x08) << 8) | ((key[6] & 0x08) << 7) | ((key[5] & 0x08) << 6) | ((key[4] & 0x08) << 5) | ((key[3] & 0x08) << 4) | ((key[2] & 0x08) << 3) | ((key[1] & 0x08) << 2) | ((key[0] & 0x08) << 1) | ((key[3] & 0x10) >> 1) | ((key[2] & 0x10) >> 2) | ((key[1] & 0x10) >> 3) | ((key[0] & 0x10) >> 4); for(size_t i = 0; i != 16; ++i) { C = ((C << ROT[i]) | (C >> (28-ROT[i]))) & 0x0FFFFFFF; D = ((D << ROT[i]) | (D >> (28-ROT[i]))) & 0x0FFFFFFF; round_key[2*i ] = ((C & 0x00000010) << 22) | ((C & 0x00000800) << 17) | ((C & 0x00000020) << 16) | ((C & 0x00004004) << 15) | ((C & 0x00000200) << 11) | ((C & 0x00020000) << 10) | ((C & 0x01000000) >> 6) | ((C & 0x00100000) >> 4) | ((C & 0x00010000) << 3) | ((C & 0x08000000) >> 2) | ((C & 0x00800000) << 1) | ((D & 0x00000010) << 8) | ((D & 0x00000002) << 7) | ((D & 0x00000001) << 2) | ((D & 0x00000200) ) | ((D & 0x00008000) >> 2) | ((D & 0x00000088) >> 3) | ((D & 0x00001000) >> 7) | ((D & 0x00080000) >> 9) | ((D & 0x02020000) >> 14) | ((D & 0x00400000) >> 21); round_key[2*i+1] = ((C & 0x00000001) << 28) | ((C & 0x00000082) << 18) | ((C & 0x00002000) << 14) | ((C & 0x00000100) << 10) | ((C & 0x00001000) << 9) | ((C & 0x00040000) << 6) | ((C & 0x02400000) << 4) | ((C & 0x00008000) << 2) | ((C & 0x00200000) >> 1) | ((C & 0x04000000) >> 10) | ((D & 0x00000020) << 6) | ((D & 0x00000100) ) | ((D & 0x00000800) >> 1) | ((D & 0x00000040) >> 3) | ((D & 0x00010000) >> 4) | ((D & 0x00000400) >> 5) | ((D & 0x00004000) >> 10) | ((D & 0x04000000) >> 13) | ((D & 0x00800000) >> 14) | ((D & 0x00100000) >> 18) | ((D & 0x01000000) >> 24) | ((D & 0x08000000) >> 26); } } /* * DES Encryption */ void des_encrypt(u32bit& L, u32bit& R, const u32bit round_key[32]) { for(size_t i = 0; i != 16; i += 2) { u32bit T0, T1; T0 = rotate_right(R, 4) ^ round_key[2*i]; T1 = R ^ round_key[2*i + 1]; L ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; T0 = rotate_right(L, 4) ^ round_key[2*i + 2]; T1 = L ^ round_key[2*i + 3]; R ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; } } /* * DES Decryption */ void des_decrypt(u32bit& L, u32bit& R, const u32bit round_key[32]) { for(size_t i = 16; i != 0; i -= 2) { u32bit T0, T1; T0 = rotate_right(R, 4) ^ round_key[2*i - 2]; T1 = R ^ round_key[2*i - 1]; L ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; T0 = rotate_right(L, 4) ^ round_key[2*i - 4]; T1 = L ^ round_key[2*i - 3]; R ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; } } } /* * DES Encryption */ void DES::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u64bit T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); u32bit L = static_cast(T >> 32); u32bit R = static_cast(T); des_encrypt(L, R, &round_key[0]); T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); T = rotate_left(T, 32); store_be(T, out); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * DES Decryption */ void DES::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u64bit T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); u32bit L = static_cast(T >> 32); u32bit R = static_cast(T); des_decrypt(L, R, &round_key[0]); T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); T = rotate_left(T, 32); store_be(T, out); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * DES Key Schedule */ void DES::key_schedule(const byte key[], size_t) { des_key_schedule(&round_key[0], key); } /* * TripleDES Encryption */ void TripleDES::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u64bit T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); u32bit L = static_cast(T >> 32); u32bit R = static_cast(T); des_encrypt(L, R, &round_key[0]); des_decrypt(R, L, &round_key[32]); des_encrypt(L, R, &round_key[64]); T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); T = rotate_left(T, 32); store_be(T, out); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * TripleDES Decryption */ void TripleDES::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u64bit T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); u32bit L = static_cast(T >> 32); u32bit R = static_cast(T); des_decrypt(L, R, &round_key[64]); des_encrypt(R, L, &round_key[32]); des_decrypt(L, R, &round_key[0]); T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); T = rotate_left(T, 32); store_be(T, out); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * TripleDES Key Schedule */ void TripleDES::key_schedule(const byte key[], size_t length) { des_key_schedule(&round_key[0], key); des_key_schedule(&round_key[32], key + 8); if(length == 24) des_key_schedule(&round_key[64], key + 16); else copy_mem(&round_key[64], &round_key[0], 32); } } Botan-1.10.12/src/block/des/des.h0000664000175000017500000000331212654331322016143 0ustar jackjack00000000000000/* * DES * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DES_H__ #define BOTAN_DES_H__ #include namespace Botan { /** * DES */ class BOTAN_DLL DES : public Block_Cipher_Fixed_Params<8, 8> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(round_key); } std::string name() const { return "DES"; } BlockCipher* clone() const { return new DES; } DES() : round_key(32) {} private: void key_schedule(const byte[], size_t); SecureVector round_key; }; /** * Triple DES */ class BOTAN_DLL TripleDES : public Block_Cipher_Fixed_Params<8, 16, 24, 8> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(round_key); } std::string name() const { return "TripleDES"; } BlockCipher* clone() const { return new TripleDES; } TripleDES() : round_key(96) {} private: void key_schedule(const byte[], size_t); SecureVector round_key; }; /* * DES Tables */ extern const u32bit DES_SPBOX1[256]; extern const u32bit DES_SPBOX2[256]; extern const u32bit DES_SPBOX3[256]; extern const u32bit DES_SPBOX4[256]; extern const u32bit DES_SPBOX5[256]; extern const u32bit DES_SPBOX6[256]; extern const u32bit DES_SPBOX7[256]; extern const u32bit DES_SPBOX8[256]; extern const u64bit DES_IPTAB1[256]; extern const u64bit DES_IPTAB2[256]; extern const u64bit DES_FPTAB1[256]; extern const u64bit DES_FPTAB2[256]; } #endif Botan-1.10.12/src/block/des/des_tab.cpp0000664000175000017500000013314612654331322017335 0ustar jackjack00000000000000/* * Substitution/Permutation Tables for DES * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { const u32bit DES_SPBOX1[256] = { 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004, 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004, 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004, 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004 }; const u32bit DES_SPBOX2[256] = { 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000, 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000, 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000, 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000 }; const u32bit DES_SPBOX3[256] = { 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200, 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200, 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200, 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200 }; const u32bit DES_SPBOX4[256] = { 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080 }; const u32bit DES_SPBOX5[256] = { 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100, 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100, 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100, 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100 }; const u32bit DES_SPBOX6[256] = { 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010, 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010, 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010, 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010 }; const u32bit DES_SPBOX7[256] = { 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002, 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002, 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002, 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002 }; const u32bit DES_SPBOX8[256] = { 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000, 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000, 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000, 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000 }; const u64bit DES_IPTAB1[256] = { 0x0000000000000000, 0x0000000200000000, 0x0000000000000002, 0x0000000200000002, 0x0000020000000000, 0x0000020200000000, 0x0000020000000002, 0x0000020200000002, 0x0000000000000200, 0x0000000200000200, 0x0000000000000202, 0x0000000200000202, 0x0000020000000200, 0x0000020200000200, 0x0000020000000202, 0x0000020200000202, 0x0002000000000000, 0x0002000200000000, 0x0002000000000002, 0x0002000200000002, 0x0002020000000000, 0x0002020200000000, 0x0002020000000002, 0x0002020200000002, 0x0002000000000200, 0x0002000200000200, 0x0002000000000202, 0x0002000200000202, 0x0002020000000200, 0x0002020200000200, 0x0002020000000202, 0x0002020200000202, 0x0000000000020000, 0x0000000200020000, 0x0000000000020002, 0x0000000200020002, 0x0000020000020000, 0x0000020200020000, 0x0000020000020002, 0x0000020200020002, 0x0000000000020200, 0x0000000200020200, 0x0000000000020202, 0x0000000200020202, 0x0000020000020200, 0x0000020200020200, 0x0000020000020202, 0x0000020200020202, 0x0002000000020000, 0x0002000200020000, 0x0002000000020002, 0x0002000200020002, 0x0002020000020000, 0x0002020200020000, 0x0002020000020002, 0x0002020200020002, 0x0002000000020200, 0x0002000200020200, 0x0002000000020202, 0x0002000200020202, 0x0002020000020200, 0x0002020200020200, 0x0002020000020202, 0x0002020200020202, 0x0200000000000000, 0x0200000200000000, 0x0200000000000002, 0x0200000200000002, 0x0200020000000000, 0x0200020200000000, 0x0200020000000002, 0x0200020200000002, 0x0200000000000200, 0x0200000200000200, 0x0200000000000202, 0x0200000200000202, 0x0200020000000200, 0x0200020200000200, 0x0200020000000202, 0x0200020200000202, 0x0202000000000000, 0x0202000200000000, 0x0202000000000002, 0x0202000200000002, 0x0202020000000000, 0x0202020200000000, 0x0202020000000002, 0x0202020200000002, 0x0202000000000200, 0x0202000200000200, 0x0202000000000202, 0x0202000200000202, 0x0202020000000200, 0x0202020200000200, 0x0202020000000202, 0x0202020200000202, 0x0200000000020000, 0x0200000200020000, 0x0200000000020002, 0x0200000200020002, 0x0200020000020000, 0x0200020200020000, 0x0200020000020002, 0x0200020200020002, 0x0200000000020200, 0x0200000200020200, 0x0200000000020202, 0x0200000200020202, 0x0200020000020200, 0x0200020200020200, 0x0200020000020202, 0x0200020200020202, 0x0202000000020000, 0x0202000200020000, 0x0202000000020002, 0x0202000200020002, 0x0202020000020000, 0x0202020200020000, 0x0202020000020002, 0x0202020200020002, 0x0202000000020200, 0x0202000200020200, 0x0202000000020202, 0x0202000200020202, 0x0202020000020200, 0x0202020200020200, 0x0202020000020202, 0x0202020200020202, 0x0000000002000000, 0x0000000202000000, 0x0000000002000002, 0x0000000202000002, 0x0000020002000000, 0x0000020202000000, 0x0000020002000002, 0x0000020202000002, 0x0000000002000200, 0x0000000202000200, 0x0000000002000202, 0x0000000202000202, 0x0000020002000200, 0x0000020202000200, 0x0000020002000202, 0x0000020202000202, 0x0002000002000000, 0x0002000202000000, 0x0002000002000002, 0x0002000202000002, 0x0002020002000000, 0x0002020202000000, 0x0002020002000002, 0x0002020202000002, 0x0002000002000200, 0x0002000202000200, 0x0002000002000202, 0x0002000202000202, 0x0002020002000200, 0x0002020202000200, 0x0002020002000202, 0x0002020202000202, 0x0000000002020000, 0x0000000202020000, 0x0000000002020002, 0x0000000202020002, 0x0000020002020000, 0x0000020202020000, 0x0000020002020002, 0x0000020202020002, 0x0000000002020200, 0x0000000202020200, 0x0000000002020202, 0x0000000202020202, 0x0000020002020200, 0x0000020202020200, 0x0000020002020202, 0x0000020202020202, 0x0002000002020000, 0x0002000202020000, 0x0002000002020002, 0x0002000202020002, 0x0002020002020000, 0x0002020202020000, 0x0002020002020002, 0x0002020202020002, 0x0002000002020200, 0x0002000202020200, 0x0002000002020202, 0x0002000202020202, 0x0002020002020200, 0x0002020202020200, 0x0002020002020202, 0x0002020202020202, 0x0200000002000000, 0x0200000202000000, 0x0200000002000002, 0x0200000202000002, 0x0200020002000000, 0x0200020202000000, 0x0200020002000002, 0x0200020202000002, 0x0200000002000200, 0x0200000202000200, 0x0200000002000202, 0x0200000202000202, 0x0200020002000200, 0x0200020202000200, 0x0200020002000202, 0x0200020202000202, 0x0202000002000000, 0x0202000202000000, 0x0202000002000002, 0x0202000202000002, 0x0202020002000000, 0x0202020202000000, 0x0202020002000002, 0x0202020202000002, 0x0202000002000200, 0x0202000202000200, 0x0202000002000202, 0x0202000202000202, 0x0202020002000200, 0x0202020202000200, 0x0202020002000202, 0x0202020202000202, 0x0200000002020000, 0x0200000202020000, 0x0200000002020002, 0x0200000202020002, 0x0200020002020000, 0x0200020202020000, 0x0200020002020002, 0x0200020202020002, 0x0200000002020200, 0x0200000202020200, 0x0200000002020202, 0x0200000202020202, 0x0200020002020200, 0x0200020202020200, 0x0200020002020202, 0x0200020202020202, 0x0202000002020000, 0x0202000202020000, 0x0202000002020002, 0x0202000202020002, 0x0202020002020000, 0x0202020202020000, 0x0202020002020002, 0x0202020202020002, 0x0202000002020200, 0x0202000202020200, 0x0202000002020202, 0x0202000202020202, 0x0202020002020200, 0x0202020202020200, 0x0202020002020202, 0x0202020202020202 }; const u64bit DES_IPTAB2[256] = { 0x0000000000000000, 0x0000010000000000, 0x0000000000000100, 0x0000010000000100, 0x0001000000000000, 0x0001010000000000, 0x0001000000000100, 0x0001010000000100, 0x0000000000010000, 0x0000010000010000, 0x0000000000010100, 0x0000010000010100, 0x0001000000010000, 0x0001010000010000, 0x0001000000010100, 0x0001010000010100, 0x0100000000000000, 0x0100010000000000, 0x0100000000000100, 0x0100010000000100, 0x0101000000000000, 0x0101010000000000, 0x0101000000000100, 0x0101010000000100, 0x0100000000010000, 0x0100010000010000, 0x0100000000010100, 0x0100010000010100, 0x0101000000010000, 0x0101010000010000, 0x0101000000010100, 0x0101010000010100, 0x0000000001000000, 0x0000010001000000, 0x0000000001000100, 0x0000010001000100, 0x0001000001000000, 0x0001010001000000, 0x0001000001000100, 0x0001010001000100, 0x0000000001010000, 0x0000010001010000, 0x0000000001010100, 0x0000010001010100, 0x0001000001010000, 0x0001010001010000, 0x0001000001010100, 0x0001010001010100, 0x0100000001000000, 0x0100010001000000, 0x0100000001000100, 0x0100010001000100, 0x0101000001000000, 0x0101010001000000, 0x0101000001000100, 0x0101010001000100, 0x0100000001010000, 0x0100010001010000, 0x0100000001010100, 0x0100010001010100, 0x0101000001010000, 0x0101010001010000, 0x0101000001010100, 0x0101010001010100, 0x0000000100000000, 0x0000010100000000, 0x0000000100000100, 0x0000010100000100, 0x0001000100000000, 0x0001010100000000, 0x0001000100000100, 0x0001010100000100, 0x0000000100010000, 0x0000010100010000, 0x0000000100010100, 0x0000010100010100, 0x0001000100010000, 0x0001010100010000, 0x0001000100010100, 0x0001010100010100, 0x0100000100000000, 0x0100010100000000, 0x0100000100000100, 0x0100010100000100, 0x0101000100000000, 0x0101010100000000, 0x0101000100000100, 0x0101010100000100, 0x0100000100010000, 0x0100010100010000, 0x0100000100010100, 0x0100010100010100, 0x0101000100010000, 0x0101010100010000, 0x0101000100010100, 0x0101010100010100, 0x0000000101000000, 0x0000010101000000, 0x0000000101000100, 0x0000010101000100, 0x0001000101000000, 0x0001010101000000, 0x0001000101000100, 0x0001010101000100, 0x0000000101010000, 0x0000010101010000, 0x0000000101010100, 0x0000010101010100, 0x0001000101010000, 0x0001010101010000, 0x0001000101010100, 0x0001010101010100, 0x0100000101000000, 0x0100010101000000, 0x0100000101000100, 0x0100010101000100, 0x0101000101000000, 0x0101010101000000, 0x0101000101000100, 0x0101010101000100, 0x0100000101010000, 0x0100010101010000, 0x0100000101010100, 0x0100010101010100, 0x0101000101010000, 0x0101010101010000, 0x0101000101010100, 0x0101010101010100, 0x0000000000000001, 0x0000010000000001, 0x0000000000000101, 0x0000010000000101, 0x0001000000000001, 0x0001010000000001, 0x0001000000000101, 0x0001010000000101, 0x0000000000010001, 0x0000010000010001, 0x0000000000010101, 0x0000010000010101, 0x0001000000010001, 0x0001010000010001, 0x0001000000010101, 0x0001010000010101, 0x0100000000000001, 0x0100010000000001, 0x0100000000000101, 0x0100010000000101, 0x0101000000000001, 0x0101010000000001, 0x0101000000000101, 0x0101010000000101, 0x0100000000010001, 0x0100010000010001, 0x0100000000010101, 0x0100010000010101, 0x0101000000010001, 0x0101010000010001, 0x0101000000010101, 0x0101010000010101, 0x0000000001000001, 0x0000010001000001, 0x0000000001000101, 0x0000010001000101, 0x0001000001000001, 0x0001010001000001, 0x0001000001000101, 0x0001010001000101, 0x0000000001010001, 0x0000010001010001, 0x0000000001010101, 0x0000010001010101, 0x0001000001010001, 0x0001010001010001, 0x0001000001010101, 0x0001010001010101, 0x0100000001000001, 0x0100010001000001, 0x0100000001000101, 0x0100010001000101, 0x0101000001000001, 0x0101010001000001, 0x0101000001000101, 0x0101010001000101, 0x0100000001010001, 0x0100010001010001, 0x0100000001010101, 0x0100010001010101, 0x0101000001010001, 0x0101010001010001, 0x0101000001010101, 0x0101010001010101, 0x0000000100000001, 0x0000010100000001, 0x0000000100000101, 0x0000010100000101, 0x0001000100000001, 0x0001010100000001, 0x0001000100000101, 0x0001010100000101, 0x0000000100010001, 0x0000010100010001, 0x0000000100010101, 0x0000010100010101, 0x0001000100010001, 0x0001010100010001, 0x0001000100010101, 0x0001010100010101, 0x0100000100000001, 0x0100010100000001, 0x0100000100000101, 0x0100010100000101, 0x0101000100000001, 0x0101010100000001, 0x0101000100000101, 0x0101010100000101, 0x0100000100010001, 0x0100010100010001, 0x0100000100010101, 0x0100010100010101, 0x0101000100010001, 0x0101010100010001, 0x0101000100010101, 0x0101010100010101, 0x0000000101000001, 0x0000010101000001, 0x0000000101000101, 0x0000010101000101, 0x0001000101000001, 0x0001010101000001, 0x0001000101000101, 0x0001010101000101, 0x0000000101010001, 0x0000010101010001, 0x0000000101010101, 0x0000010101010101, 0x0001000101010001, 0x0001010101010001, 0x0001000101010101, 0x0001010101010101, 0x0100000101000001, 0x0100010101000001, 0x0100000101000101, 0x0100010101000101, 0x0101000101000001, 0x0101010101000001, 0x0101000101000101, 0x0101010101000101, 0x0100000101010001, 0x0100010101010001, 0x0100000101010101, 0x0100010101010101, 0x0101000101010001, 0x0101010101010001, 0x0101000101010101, 0x0101010101010101 }; const u64bit DES_FPTAB1[256] = { 0x0000000000000000, 0x0000000100000000, 0x0000000004000000, 0x0000000104000000, 0x0000000000040000, 0x0000000100040000, 0x0000000004040000, 0x0000000104040000, 0x0000000000000400, 0x0000000100000400, 0x0000000004000400, 0x0000000104000400, 0x0000000000040400, 0x0000000100040400, 0x0000000004040400, 0x0000000104040400, 0x0000000000000004, 0x0000000100000004, 0x0000000004000004, 0x0000000104000004, 0x0000000000040004, 0x0000000100040004, 0x0000000004040004, 0x0000000104040004, 0x0000000000000404, 0x0000000100000404, 0x0000000004000404, 0x0000000104000404, 0x0000000000040404, 0x0000000100040404, 0x0000000004040404, 0x0000000104040404, 0x0400000000000000, 0x0400000100000000, 0x0400000004000000, 0x0400000104000000, 0x0400000000040000, 0x0400000100040000, 0x0400000004040000, 0x0400000104040000, 0x0400000000000400, 0x0400000100000400, 0x0400000004000400, 0x0400000104000400, 0x0400000000040400, 0x0400000100040400, 0x0400000004040400, 0x0400000104040400, 0x0400000000000004, 0x0400000100000004, 0x0400000004000004, 0x0400000104000004, 0x0400000000040004, 0x0400000100040004, 0x0400000004040004, 0x0400000104040004, 0x0400000000000404, 0x0400000100000404, 0x0400000004000404, 0x0400000104000404, 0x0400000000040404, 0x0400000100040404, 0x0400000004040404, 0x0400000104040404, 0x0004000000000000, 0x0004000100000000, 0x0004000004000000, 0x0004000104000000, 0x0004000000040000, 0x0004000100040000, 0x0004000004040000, 0x0004000104040000, 0x0004000000000400, 0x0004000100000400, 0x0004000004000400, 0x0004000104000400, 0x0004000000040400, 0x0004000100040400, 0x0004000004040400, 0x0004000104040400, 0x0004000000000004, 0x0004000100000004, 0x0004000004000004, 0x0004000104000004, 0x0004000000040004, 0x0004000100040004, 0x0004000004040004, 0x0004000104040004, 0x0004000000000404, 0x0004000100000404, 0x0004000004000404, 0x0004000104000404, 0x0004000000040404, 0x0004000100040404, 0x0004000004040404, 0x0004000104040404, 0x0404000000000000, 0x0404000100000000, 0x0404000004000000, 0x0404000104000000, 0x0404000000040000, 0x0404000100040000, 0x0404000004040000, 0x0404000104040000, 0x0404000000000400, 0x0404000100000400, 0x0404000004000400, 0x0404000104000400, 0x0404000000040400, 0x0404000100040400, 0x0404000004040400, 0x0404000104040400, 0x0404000000000004, 0x0404000100000004, 0x0404000004000004, 0x0404000104000004, 0x0404000000040004, 0x0404000100040004, 0x0404000004040004, 0x0404000104040004, 0x0404000000000404, 0x0404000100000404, 0x0404000004000404, 0x0404000104000404, 0x0404000000040404, 0x0404000100040404, 0x0404000004040404, 0x0404000104040404, 0x0000040000000000, 0x0000040100000000, 0x0000040004000000, 0x0000040104000000, 0x0000040000040000, 0x0000040100040000, 0x0000040004040000, 0x0000040104040000, 0x0000040000000400, 0x0000040100000400, 0x0000040004000400, 0x0000040104000400, 0x0000040000040400, 0x0000040100040400, 0x0000040004040400, 0x0000040104040400, 0x0000040000000004, 0x0000040100000004, 0x0000040004000004, 0x0000040104000004, 0x0000040000040004, 0x0000040100040004, 0x0000040004040004, 0x0000040104040004, 0x0000040000000404, 0x0000040100000404, 0x0000040004000404, 0x0000040104000404, 0x0000040000040404, 0x0000040100040404, 0x0000040004040404, 0x0000040104040404, 0x0400040000000000, 0x0400040100000000, 0x0400040004000000, 0x0400040104000000, 0x0400040000040000, 0x0400040100040000, 0x0400040004040000, 0x0400040104040000, 0x0400040000000400, 0x0400040100000400, 0x0400040004000400, 0x0400040104000400, 0x0400040000040400, 0x0400040100040400, 0x0400040004040400, 0x0400040104040400, 0x0400040000000004, 0x0400040100000004, 0x0400040004000004, 0x0400040104000004, 0x0400040000040004, 0x0400040100040004, 0x0400040004040004, 0x0400040104040004, 0x0400040000000404, 0x0400040100000404, 0x0400040004000404, 0x0400040104000404, 0x0400040000040404, 0x0400040100040404, 0x0400040004040404, 0x0400040104040404, 0x0004040000000000, 0x0004040100000000, 0x0004040004000000, 0x0004040104000000, 0x0004040000040000, 0x0004040100040000, 0x0004040004040000, 0x0004040104040000, 0x0004040000000400, 0x0004040100000400, 0x0004040004000400, 0x0004040104000400, 0x0004040000040400, 0x0004040100040400, 0x0004040004040400, 0x0004040104040400, 0x0004040000000004, 0x0004040100000004, 0x0004040004000004, 0x0004040104000004, 0x0004040000040004, 0x0004040100040004, 0x0004040004040004, 0x0004040104040004, 0x0004040000000404, 0x0004040100000404, 0x0004040004000404, 0x0004040104000404, 0x0004040000040404, 0x0004040100040404, 0x0004040004040404, 0x0004040104040404, 0x0404040000000000, 0x0404040100000000, 0x0404040004000000, 0x0404040104000000, 0x0404040000040000, 0x0404040100040000, 0x0404040004040000, 0x0404040104040000, 0x0404040000000400, 0x0404040100000400, 0x0404040004000400, 0x0404040104000400, 0x0404040000040400, 0x0404040100040400, 0x0404040004040400, 0x0404040104040400, 0x0404040000000004, 0x0404040100000004, 0x0404040004000004, 0x0404040104000004, 0x0404040000040004, 0x0404040100040004, 0x0404040004040004, 0x0404040104040004, 0x0404040000000404, 0x0404040100000404, 0x0404040004000404, 0x0404040104000404, 0x0404040000040404, 0x0404040100040404, 0x0404040004040404, 0x0404040104040404 }; const u64bit DES_FPTAB2[256] = { 0x0000000000000000, 0x0000004000000000, 0x0000000001000000, 0x0000004001000000, 0x0000000000010000, 0x0000004000010000, 0x0000000001010000, 0x0000004001010000, 0x0000000000000100, 0x0000004000000100, 0x0000000001000100, 0x0000004001000100, 0x0000000000010100, 0x0000004000010100, 0x0000000001010100, 0x0000004001010100, 0x0000000000000001, 0x0000004000000001, 0x0000000001000001, 0x0000004001000001, 0x0000000000010001, 0x0000004000010001, 0x0000000001010001, 0x0000004001010001, 0x0000000000000101, 0x0000004000000101, 0x0000000001000101, 0x0000004001000101, 0x0000000000010101, 0x0000004000010101, 0x0000000001010101, 0x0000004001010101, 0x0100000000000000, 0x0100004000000000, 0x0100000001000000, 0x0100004001000000, 0x0100000000010000, 0x0100004000010000, 0x0100000001010000, 0x0100004001010000, 0x0100000000000100, 0x0100004000000100, 0x0100000001000100, 0x0100004001000100, 0x0100000000010100, 0x0100004000010100, 0x0100000001010100, 0x0100004001010100, 0x0100000000000001, 0x0100004000000001, 0x0100000001000001, 0x0100004001000001, 0x0100000000010001, 0x0100004000010001, 0x0100000001010001, 0x0100004001010001, 0x0100000000000101, 0x0100004000000101, 0x0100000001000101, 0x0100004001000101, 0x0100000000010101, 0x0100004000010101, 0x0100000001010101, 0x0100004001010101, 0x0001000000000000, 0x0001004000000000, 0x0001000001000000, 0x0001004001000000, 0x0001000000010000, 0x0001004000010000, 0x0001000001010000, 0x0001004001010000, 0x0001000000000100, 0x0001004000000100, 0x0001000001000100, 0x0001004001000100, 0x0001000000010100, 0x0001004000010100, 0x0001000001010100, 0x0001004001010100, 0x0001000000000001, 0x0001004000000001, 0x0001000001000001, 0x0001004001000001, 0x0001000000010001, 0x0001004000010001, 0x0001000001010001, 0x0001004001010001, 0x0001000000000101, 0x0001004000000101, 0x0001000001000101, 0x0001004001000101, 0x0001000000010101, 0x0001004000010101, 0x0001000001010101, 0x0001004001010101, 0x0101000000000000, 0x0101004000000000, 0x0101000001000000, 0x0101004001000000, 0x0101000000010000, 0x0101004000010000, 0x0101000001010000, 0x0101004001010000, 0x0101000000000100, 0x0101004000000100, 0x0101000001000100, 0x0101004001000100, 0x0101000000010100, 0x0101004000010100, 0x0101000001010100, 0x0101004001010100, 0x0101000000000001, 0x0101004000000001, 0x0101000001000001, 0x0101004001000001, 0x0101000000010001, 0x0101004000010001, 0x0101000001010001, 0x0101004001010001, 0x0101000000000101, 0x0101004000000101, 0x0101000001000101, 0x0101004001000101, 0x0101000000010101, 0x0101004000010101, 0x0101000001010101, 0x0101004001010101, 0x0000010000000000, 0x0000014000000000, 0x0000010001000000, 0x0000014001000000, 0x0000010000010000, 0x0000014000010000, 0x0000010001010000, 0x0000014001010000, 0x0000010000000100, 0x0000014000000100, 0x0000010001000100, 0x0000014001000100, 0x0000010000010100, 0x0000014000010100, 0x0000010001010100, 0x0000014001010100, 0x0000010000000001, 0x0000014000000001, 0x0000010001000001, 0x0000014001000001, 0x0000010000010001, 0x0000014000010001, 0x0000010001010001, 0x0000014001010001, 0x0000010000000101, 0x0000014000000101, 0x0000010001000101, 0x0000014001000101, 0x0000010000010101, 0x0000014000010101, 0x0000010001010101, 0x0000014001010101, 0x0100010000000000, 0x0100014000000000, 0x0100010001000000, 0x0100014001000000, 0x0100010000010000, 0x0100014000010000, 0x0100010001010000, 0x0100014001010000, 0x0100010000000100, 0x0100014000000100, 0x0100010001000100, 0x0100014001000100, 0x0100010000010100, 0x0100014000010100, 0x0100010001010100, 0x0100014001010100, 0x0100010000000001, 0x0100014000000001, 0x0100010001000001, 0x0100014001000001, 0x0100010000010001, 0x0100014000010001, 0x0100010001010001, 0x0100014001010001, 0x0100010000000101, 0x0100014000000101, 0x0100010001000101, 0x0100014001000101, 0x0100010000010101, 0x0100014000010101, 0x0100010001010101, 0x0100014001010101, 0x0001010000000000, 0x0001014000000000, 0x0001010001000000, 0x0001014001000000, 0x0001010000010000, 0x0001014000010000, 0x0001010001010000, 0x0001014001010000, 0x0001010000000100, 0x0001014000000100, 0x0001010001000100, 0x0001014001000100, 0x0001010000010100, 0x0001014000010100, 0x0001010001010100, 0x0001014001010100, 0x0001010000000001, 0x0001014000000001, 0x0001010001000001, 0x0001014001000001, 0x0001010000010001, 0x0001014000010001, 0x0001010001010001, 0x0001014001010001, 0x0001010000000101, 0x0001014000000101, 0x0001010001000101, 0x0001014001000101, 0x0001010000010101, 0x0001014000010101, 0x0001010001010101, 0x0001014001010101, 0x0101010000000000, 0x0101014000000000, 0x0101010001000000, 0x0101014001000000, 0x0101010000010000, 0x0101014000010000, 0x0101010001010000, 0x0101014001010000, 0x0101010000000100, 0x0101014000000100, 0x0101010001000100, 0x0101014001000100, 0x0101010000010100, 0x0101014000010100, 0x0101010001010100, 0x0101014001010100, 0x0101010000000001, 0x0101014000000001, 0x0101010001000001, 0x0101014001000001, 0x0101010000010001, 0x0101014000010001, 0x0101010001010001, 0x0101014001010001, 0x0101010000000101, 0x0101014000000101, 0x0101010001000101, 0x0101014001000101, 0x0101010000010101, 0x0101014000010101, 0x0101010001010101, 0x0101014001010101 }; } Botan-1.10.12/src/block/des/desx.cpp0000664000175000017500000000171512654331322016673 0ustar jackjack00000000000000/* * DES * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * DESX Encryption */ void DESX::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { xor_buf(out, in, &K1[0], BLOCK_SIZE); des.encrypt(out); xor_buf(out, &K2[0], BLOCK_SIZE); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * DESX Decryption */ void DESX::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { xor_buf(out, in, &K2[0], BLOCK_SIZE); des.decrypt(out); xor_buf(out, &K1[0], BLOCK_SIZE); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * DESX Key Schedule */ void DESX::key_schedule(const byte key[], size_t) { K1.copy(key, 8); des.set_key(key + 8, 8); K2.copy(key + 16, 8); } } Botan-1.10.12/src/block/des/desx.h0000664000175000017500000000135012654331322016333 0ustar jackjack00000000000000/* * DESX * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DESX_H__ #define BOTAN_DESX_H__ #include namespace Botan { /** * DESX */ class BOTAN_DLL DESX : public Block_Cipher_Fixed_Params<8, 24> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { des.clear(); zeroise(K1); zeroise(K2); } std::string name() const { return "DESX"; } BlockCipher* clone() const { return new DESX; } DESX() : K1(8), K2(8) {} private: void key_schedule(const byte[], size_t); SecureVector K1, K2; DES des; }; } #endif Botan-1.10.12/src/block/des/info.txt0000664000175000017500000000001312654331322016706 0ustar jackjack00000000000000define DES Botan-1.10.12/src/block/gost_28147/gost_28147.cpp0000664000175000017500000001156512654331322020423 0ustar jackjack00000000000000/* * GOST 28147-89 * (C) 1999-2009,2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { byte GOST_28147_89_Params::sbox_entry(size_t row, size_t col) const { byte x = sboxes[4 * col + (row / 2)]; return (row % 2 == 0) ? (x >> 4) : (x & 0x0F); } GOST_28147_89_Params::GOST_28147_89_Params(const std::string& n) : name(n) { // Encoded in the packed fromat from RFC 4357 // GostR3411_94_TestParamSet (OID 1.2.643.2.2.31.0) static const byte GOST_R_3411_TEST_PARAMS[64] = { 0x4E, 0x57, 0x64, 0xD1, 0xAB, 0x8D, 0xCB, 0xBF, 0x94, 0x1A, 0x7A, 0x4D, 0x2C, 0xD1, 0x10, 0x10, 0xD6, 0xA0, 0x57, 0x35, 0x8D, 0x38, 0xF2, 0xF7, 0x0F, 0x49, 0xD1, 0x5A, 0xEA, 0x2F, 0x8D, 0x94, 0x62, 0xEE, 0x43, 0x09, 0xB3, 0xF4, 0xA6, 0xA2, 0x18, 0xC6, 0x98, 0xE3, 0xC1, 0x7C, 0xE5, 0x7E, 0x70, 0x6B, 0x09, 0x66, 0xF7, 0x02, 0x3C, 0x8B, 0x55, 0x95, 0xBF, 0x28, 0x39, 0xB3, 0x2E, 0xCC }; // GostR3411-94-CryptoProParamSet (OID 1.2.643.2.2.31.1) static const byte GOST_R_3411_CRYPTOPRO_PARAMS[64] = { 0xA5, 0x74, 0x77, 0xD1, 0x4F, 0xFA, 0x66, 0xE3, 0x54, 0xC7, 0x42, 0x4A, 0x60, 0xEC, 0xB4, 0x19, 0x82, 0x90, 0x9D, 0x75, 0x1D, 0x4F, 0xC9, 0x0B, 0x3B, 0x12, 0x2F, 0x54, 0x79, 0x08, 0xA0, 0xAF, 0xD1, 0x3E, 0x1A, 0x38, 0xC7, 0xB1, 0x81, 0xC6, 0xE6, 0x56, 0x05, 0x87, 0x03, 0x25, 0xEB, 0xFE, 0x9C, 0x6D, 0xF8, 0x6D, 0x2E, 0xAB, 0xDE, 0x20, 0xBA, 0x89, 0x3C, 0x92, 0xF8, 0xD3, 0x53, 0xBC }; if(name == "R3411_94_TestParam") sboxes = GOST_R_3411_TEST_PARAMS; else if(name == "R3411_CryptoPro") sboxes = GOST_R_3411_CRYPTOPRO_PARAMS; else throw Invalid_Argument("GOST_28147_89_Params: Unknown " + name); } /* * GOST Constructor */ GOST_28147_89::GOST_28147_89(const GOST_28147_89_Params& param) : SBOX(1024), EK(8) { // Convert the parallel 4x4 sboxes into larger word-based sboxes for(size_t i = 0; i != 4; ++i) for(size_t j = 0; j != 256; ++j) { const u32bit T = (param.sbox_entry(2*i , j % 16)) | (param.sbox_entry(2*i+1, j / 16) << 4); SBOX[256*i+j] = rotate_left(T, (11+8*i) % 32); } } std::string GOST_28147_89::name() const { /* 'Guess' the right name for the sbox on the basis of the values. This would need to be updated if support for other sbox parameters is added. Preferably, we would just store the string value in the constructor, but can't break binary compat. */ std::string sbox_name = ""; if(SBOX[0] == 0x00072000) sbox_name = "R3411_94_TestParam"; else if(SBOX[0] == 0x0002D000) sbox_name = "R3411_CryptoPro"; else throw Internal_Error("GOST-28147 unrecognized sbox value"); return "GOST-28147-89(" + sbox_name + ")"; } /* * Two rounds of GOST */ #define GOST_2ROUND(N1, N2, R1, R2) \ do { \ u32bit T0 = N1 + EK[R1]; \ N2 ^= SBOX[get_byte(3, T0)] | \ SBOX[get_byte(2, T0)+256] | \ SBOX[get_byte(1, T0)+512] | \ SBOX[get_byte(0, T0)+768]; \ \ u32bit T1 = N2 + EK[R2]; \ N1 ^= SBOX[get_byte(3, T1)] | \ SBOX[get_byte(2, T1)+256] | \ SBOX[get_byte(1, T1)+512] | \ SBOX[get_byte(0, T1)+768]; \ } while(0) /* * GOST Encryption */ void GOST_28147_89::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit N1 = load_le(in, 0); u32bit N2 = load_le(in, 1); for(size_t j = 0; j != 3; ++j) { GOST_2ROUND(N1, N2, 0, 1); GOST_2ROUND(N1, N2, 2, 3); GOST_2ROUND(N1, N2, 4, 5); GOST_2ROUND(N1, N2, 6, 7); } GOST_2ROUND(N1, N2, 7, 6); GOST_2ROUND(N1, N2, 5, 4); GOST_2ROUND(N1, N2, 3, 2); GOST_2ROUND(N1, N2, 1, 0); store_le(out, N2, N1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * GOST Decryption */ void GOST_28147_89::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit N1 = load_le(in, 0); u32bit N2 = load_le(in, 1); GOST_2ROUND(N1, N2, 0, 1); GOST_2ROUND(N1, N2, 2, 3); GOST_2ROUND(N1, N2, 4, 5); GOST_2ROUND(N1, N2, 6, 7); for(size_t j = 0; j != 3; ++j) { GOST_2ROUND(N1, N2, 7, 6); GOST_2ROUND(N1, N2, 5, 4); GOST_2ROUND(N1, N2, 3, 2); GOST_2ROUND(N1, N2, 1, 0); } store_le(out, N2, N1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * GOST Key Schedule */ void GOST_28147_89::key_schedule(const byte key[], size_t) { for(size_t i = 0; i != 8; ++i) EK[i] = load_le(key, i); } } Botan-1.10.12/src/block/gost_28147/gost_28147.h0000664000175000017500000000367112654331322020067 0ustar jackjack00000000000000/* * GOST 28147-89 * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_GOST_28147_89_H__ #define BOTAN_GOST_28147_89_H__ #include namespace Botan { /** * The GOST 28147-89 block cipher uses a set of 4 bit Sboxes, however * the standard does not actually define these Sboxes; they are * considered a local configuration issue. Several different sets are * used. */ class BOTAN_DLL GOST_28147_89_Params { public: /** * @param row the row * @param col the column * @return sbox entry at this row/column */ byte sbox_entry(size_t row, size_t col) const; /** * @return name of this parameter set */ std::string param_name() const { return name; } /** * Default GOST parameters are the ones given in GOST R 34.11 for * testing purposes; these sboxes are also used by Crypto++, and, * at least according to Wikipedia, the Central Bank of Russian * Federation * @param name of the parameter set */ GOST_28147_89_Params(const std::string& name = "R3411_94_TestParam"); private: const byte* sboxes; std::string name; }; /** * GOST 28147-89 */ class BOTAN_DLL GOST_28147_89 : public Block_Cipher_Fixed_Params<8, 32> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); } std::string name() const; BlockCipher* clone() const { return new GOST_28147_89(SBOX); } /** * @param params the sbox parameters to use */ GOST_28147_89(const GOST_28147_89_Params& params); private: GOST_28147_89(const SecureVector& other_SBOX) : SBOX(other_SBOX), EK(8) {} void key_schedule(const byte[], size_t); SecureVector SBOX; SecureVector EK; }; } #endif Botan-1.10.12/src/block/gost_28147/info.txt0000664000175000017500000000002512654331322017657 0ustar jackjack00000000000000define GOST_28147_89 Botan-1.10.12/src/block/idea/idea.cpp0000664000175000017500000000637012654331322016763 0ustar jackjack00000000000000/* * IDEA * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { /* * Multiplication modulo 65537 */ inline u16bit mul(u16bit x, u16bit y) { const u32bit P = static_cast(x) * y; // P ? 0xFFFF : 0 const u16bit P_mask = !P - 1; const u32bit P_hi = P >> 16; const u32bit P_lo = P & 0xFFFF; const u16bit r_1 = (P_lo - P_hi) + (P_lo < P_hi); const u16bit r_2 = 1 - x - y; return (r_1 & P_mask) | (r_2 & ~P_mask); } /* * Find multiplicative inverses modulo 65537 * * 65537 is prime; thus Fermat's little theorem tells us that * x^65537 == x modulo 65537, which means * x^(65537-2) == x^-1 modulo 65537 since * x^(65537-2) * x == 1 mod 65537 * * Do the exponentiation with a basic square and multiply: all bits are * of exponent are 1 so we always multiply */ u16bit mul_inv(u16bit x) { u16bit y = x; for(size_t i = 0; i != 15; ++i) { y = mul(y, y); // square y = mul(y, x); } return y; } /** * IDEA is involutional, depending only on the key schedule */ void idea_op(const byte in[], byte out[], size_t blocks, const u16bit K[52]) { const size_t BLOCK_SIZE = 8; for(size_t i = 0; i != blocks; ++i) { u16bit X1 = load_be(in, 0); u16bit X2 = load_be(in, 1); u16bit X3 = load_be(in, 2); u16bit X4 = load_be(in, 3); for(size_t j = 0; j != 8; ++j) { X1 = mul(X1, K[6*j+0]); X2 += K[6*j+1]; X3 += K[6*j+2]; X4 = mul(X4, K[6*j+3]); u16bit T0 = X3; X3 = mul(X3 ^ X1, K[6*j+4]); u16bit T1 = X2; X2 = mul((X2 ^ X4) + X3, K[6*j+5]); X3 += X2; X1 ^= X2; X4 ^= X3; X2 ^= T0; X3 ^= T1; } X1 = mul(X1, K[48]); X2 += K[50]; X3 += K[49]; X4 = mul(X4, K[51]); store_be(out, X1, X3, X2, X4); in += BLOCK_SIZE; out += BLOCK_SIZE; } } } /* * IDEA Encryption */ void IDEA::encrypt_n(const byte in[], byte out[], size_t blocks) const { idea_op(in, out, blocks, &EK[0]); } /* * IDEA Decryption */ void IDEA::decrypt_n(const byte in[], byte out[], size_t blocks) const { idea_op(in, out, blocks, &DK[0]); } /* * IDEA Key Schedule */ void IDEA::key_schedule(const byte key[], size_t) { for(size_t i = 0; i != 8; ++i) EK[i] = load_be(key, i); for(size_t i = 1, j = 8, offset = 0; j != 52; i %= 8, ++i, ++j) { EK[i+7+offset] = static_cast((EK[(i % 8) + offset] << 9) | (EK[((i+1) % 8) + offset] >> 7)); offset += (i == 8) ? 8 : 0; } DK[51] = mul_inv(EK[3]); DK[50] = -EK[2]; DK[49] = -EK[1]; DK[48] = mul_inv(EK[0]); for(size_t i = 1, j = 4, counter = 47; i != 8; ++i, j += 6) { DK[counter--] = EK[j+1]; DK[counter--] = EK[j]; DK[counter--] = mul_inv(EK[j+5]); DK[counter--] = -EK[j+3]; DK[counter--] = -EK[j+4]; DK[counter--] = mul_inv(EK[j+2]); } DK[5] = EK[47]; DK[4] = EK[46]; DK[3] = mul_inv(EK[51]); DK[2] = -EK[50]; DK[1] = -EK[49]; DK[0] = mul_inv(EK[48]); } } Botan-1.10.12/src/block/idea/idea.h0000664000175000017500000000177312654331322016432 0ustar jackjack00000000000000/* * IDEA * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_IDEA_H__ #define BOTAN_IDEA_H__ #include namespace Botan { /** * IDEA */ class BOTAN_DLL IDEA : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); zeroise(DK); } std::string name() const { return "IDEA"; } BlockCipher* clone() const { return new IDEA; } IDEA() : EK(52), DK(52) {} protected: /** * @return const reference to encryption subkeys */ const SecureVector& get_EK() const { return EK; } /** * @return const reference to decryption subkeys */ const SecureVector& get_DK() const { return DK; } private: void key_schedule(const byte[], size_t); SecureVector EK, DK; }; } #endif Botan-1.10.12/src/block/idea/info.txt0000664000175000017500000000001412654331322017036 0ustar jackjack00000000000000define IDEA Botan-1.10.12/src/block/idea_sse2/idea_sse2.cpp0000664000175000017500000001511712654331322020652 0ustar jackjack00000000000000/* * IDEA in SSE2 * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { inline __m128i mul(__m128i X, u16bit K_16) { const __m128i zeros = _mm_set1_epi16(0); const __m128i ones = _mm_set1_epi16(1); const __m128i K = _mm_set1_epi16(K_16); const __m128i X_is_zero = _mm_cmpeq_epi16(X, zeros); const __m128i K_is_zero = _mm_cmpeq_epi16(K, zeros); const __m128i mul_lo = _mm_mullo_epi16(X, K); const __m128i mul_hi = _mm_mulhi_epu16(X, K); __m128i T = _mm_sub_epi16(mul_lo, mul_hi); // Unsigned compare; cmp = 1 if mul_lo < mul_hi else 0 const __m128i subs = _mm_subs_epu16(mul_hi, mul_lo); const __m128i cmp = _mm_min_epu8( _mm_or_si128(subs, _mm_srli_epi16(subs, 8)), ones); T = _mm_add_epi16(T, cmp); /* Selection: if X[i] is zero then assign 1-K if K is zero then assign 1-X[i] Could if() off value of K_16 for the second, but this gives a constant time implementation which is a nice bonus. */ T = _mm_or_si128( _mm_andnot_si128(X_is_zero, T), _mm_and_si128(_mm_sub_epi16(ones, K), X_is_zero)); T = _mm_or_si128( _mm_andnot_si128(K_is_zero, T), _mm_and_si128(_mm_sub_epi16(ones, X), K_is_zero)); return T; } /* * 4x8 matrix transpose * * FIXME: why do I need the extra set of unpack_epi32 here? Inverse in * transpose_out doesn't need it. Something with the shuffle? Removing * that extra unpack could easily save 3-4 cycles per block, and would * also help a lot with register pressure on 32-bit x86 */ void transpose_in(__m128i& B0, __m128i& B1, __m128i& B2, __m128i& B3) { __m128i T0 = _mm_unpackhi_epi32(B0, B1); __m128i T1 = _mm_unpacklo_epi32(B0, B1); __m128i T2 = _mm_unpackhi_epi32(B2, B3); __m128i T3 = _mm_unpacklo_epi32(B2, B3); __m128i T4 = _mm_unpacklo_epi32(T0, T1); __m128i T5 = _mm_unpackhi_epi32(T0, T1); __m128i T6 = _mm_unpacklo_epi32(T2, T3); __m128i T7 = _mm_unpackhi_epi32(T2, T3); T0 = _mm_shufflehi_epi16(T4, _MM_SHUFFLE(1, 3, 0, 2)); T1 = _mm_shufflehi_epi16(T5, _MM_SHUFFLE(1, 3, 0, 2)); T2 = _mm_shufflehi_epi16(T6, _MM_SHUFFLE(1, 3, 0, 2)); T3 = _mm_shufflehi_epi16(T7, _MM_SHUFFLE(1, 3, 0, 2)); T0 = _mm_shufflelo_epi16(T0, _MM_SHUFFLE(1, 3, 0, 2)); T1 = _mm_shufflelo_epi16(T1, _MM_SHUFFLE(1, 3, 0, 2)); T2 = _mm_shufflelo_epi16(T2, _MM_SHUFFLE(1, 3, 0, 2)); T3 = _mm_shufflelo_epi16(T3, _MM_SHUFFLE(1, 3, 0, 2)); T0 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3, 1, 2, 0)); T1 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(3, 1, 2, 0)); T2 = _mm_shuffle_epi32(T2, _MM_SHUFFLE(3, 1, 2, 0)); T3 = _mm_shuffle_epi32(T3, _MM_SHUFFLE(3, 1, 2, 0)); B0 = _mm_unpacklo_epi64(T0, T2); B1 = _mm_unpackhi_epi64(T0, T2); B2 = _mm_unpacklo_epi64(T1, T3); B3 = _mm_unpackhi_epi64(T1, T3); } /* * 4x8 matrix transpose (reverse) */ void transpose_out(__m128i& B0, __m128i& B1, __m128i& B2, __m128i& B3) { __m128i T0 = _mm_unpacklo_epi64(B0, B1); __m128i T1 = _mm_unpacklo_epi64(B2, B3); __m128i T2 = _mm_unpackhi_epi64(B0, B1); __m128i T3 = _mm_unpackhi_epi64(B2, B3); T0 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3, 1, 2, 0)); T1 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(3, 1, 2, 0)); T2 = _mm_shuffle_epi32(T2, _MM_SHUFFLE(3, 1, 2, 0)); T3 = _mm_shuffle_epi32(T3, _MM_SHUFFLE(3, 1, 2, 0)); T0 = _mm_shufflehi_epi16(T0, _MM_SHUFFLE(3, 1, 2, 0)); T1 = _mm_shufflehi_epi16(T1, _MM_SHUFFLE(3, 1, 2, 0)); T2 = _mm_shufflehi_epi16(T2, _MM_SHUFFLE(3, 1, 2, 0)); T3 = _mm_shufflehi_epi16(T3, _MM_SHUFFLE(3, 1, 2, 0)); T0 = _mm_shufflelo_epi16(T0, _MM_SHUFFLE(3, 1, 2, 0)); T1 = _mm_shufflelo_epi16(T1, _MM_SHUFFLE(3, 1, 2, 0)); T2 = _mm_shufflelo_epi16(T2, _MM_SHUFFLE(3, 1, 2, 0)); T3 = _mm_shufflelo_epi16(T3, _MM_SHUFFLE(3, 1, 2, 0)); B0 = _mm_unpacklo_epi32(T0, T1); B1 = _mm_unpackhi_epi32(T0, T1); B2 = _mm_unpacklo_epi32(T2, T3); B3 = _mm_unpackhi_epi32(T2, T3); } /* * IDEA encryption/decryption in SSE2 */ void idea_op_8(const byte in[64], byte out[64], const u16bit EK[52]) { const __m128i* in_mm = reinterpret_cast(in); __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); transpose_in(B0, B1, B2, B3); // byte swap B0 = _mm_or_si128(_mm_slli_epi16(B0, 8), _mm_srli_epi16(B0, 8)); B1 = _mm_or_si128(_mm_slli_epi16(B1, 8), _mm_srli_epi16(B1, 8)); B2 = _mm_or_si128(_mm_slli_epi16(B2, 8), _mm_srli_epi16(B2, 8)); B3 = _mm_or_si128(_mm_slli_epi16(B3, 8), _mm_srli_epi16(B3, 8)); for(size_t i = 0; i != 8; ++i) { B0 = mul(B0, EK[6*i+0]); B1 = _mm_add_epi16(B1, _mm_set1_epi16(EK[6*i+1])); B2 = _mm_add_epi16(B2, _mm_set1_epi16(EK[6*i+2])); B3 = mul(B3, EK[6*i+3]); __m128i T0 = B2; B2 = _mm_xor_si128(B2, B0); B2 = mul(B2, EK[6*i+4]); __m128i T1 = B1; B1 = _mm_xor_si128(B1, B3); B1 = _mm_add_epi16(B1, B2); B1 = mul(B1, EK[6*i+5]); B2 = _mm_add_epi16(B2, B1); B0 = _mm_xor_si128(B0, B1); B1 = _mm_xor_si128(B1, T0); B3 = _mm_xor_si128(B3, B2); B2 = _mm_xor_si128(B2, T1); } B0 = mul(B0, EK[48]); B1 = _mm_add_epi16(B1, _mm_set1_epi16(EK[50])); B2 = _mm_add_epi16(B2, _mm_set1_epi16(EK[49])); B3 = mul(B3, EK[51]); // byte swap B0 = _mm_or_si128(_mm_slli_epi16(B0, 8), _mm_srli_epi16(B0, 8)); B1 = _mm_or_si128(_mm_slli_epi16(B1, 8), _mm_srli_epi16(B1, 8)); B2 = _mm_or_si128(_mm_slli_epi16(B2, 8), _mm_srli_epi16(B2, 8)); B3 = _mm_or_si128(_mm_slli_epi16(B3, 8), _mm_srli_epi16(B3, 8)); transpose_out(B0, B2, B1, B3); __m128i* out_mm = reinterpret_cast<__m128i*>(out); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B2); _mm_storeu_si128(out_mm + 2, B1); _mm_storeu_si128(out_mm + 3, B3); } } /* * IDEA Encryption */ void IDEA_SSE2::encrypt_n(const byte in[], byte out[], size_t blocks) const { const u16bit* KS = &this->get_EK()[0]; while(blocks >= 8) { idea_op_8(in, out, KS); in += 8 * BLOCK_SIZE; out += 8 * BLOCK_SIZE; blocks -= 8; } if(blocks) IDEA::encrypt_n(in, out, blocks); } /* * IDEA Decryption */ void IDEA_SSE2::decrypt_n(const byte in[], byte out[], size_t blocks) const { const u16bit* KS = &this->get_DK()[0]; while(blocks >= 8) { idea_op_8(in, out, KS); in += 8 * BLOCK_SIZE; out += 8 * BLOCK_SIZE; blocks -= 8; } if(blocks) IDEA::decrypt_n(in, out, blocks); } } Botan-1.10.12/src/block/idea_sse2/idea_sse2.h0000664000175000017500000000104112654331322020306 0ustar jackjack00000000000000/* * IDEA in SSE2 * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_IDEA_SSE2_H__ #define BOTAN_IDEA_SSE2_H__ #include namespace Botan { /** * IDEA in SSE2 */ class BOTAN_DLL IDEA_SSE2 : public IDEA { public: size_t parallelism() const { return 8; } void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; BlockCipher* clone() const { return new IDEA_SSE2; } }; } #endif Botan-1.10.12/src/block/idea_sse2/info.txt0000664000175000017500000000007512654331322020001 0ustar jackjack00000000000000define IDEA_SSE2 need_isa sse2 idea Botan-1.10.12/src/block/info.txt0000664000175000017500000000006612654331322016143 0ustar jackjack00000000000000define BLOCK_CIPHER algo_base Botan-1.10.12/src/block/kasumi/info.txt0000664000175000017500000000001612654331322017427 0ustar jackjack00000000000000define KASUMI Botan-1.10.12/src/block/kasumi/kasumi.cpp0000664000175000017500000002057512654331322017744 0ustar jackjack00000000000000/* * KASUMI * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * KASUMI S-Boxes */ const byte KASUMI_SBOX_S7[128] = { 0x36, 0x32, 0x3E, 0x38, 0x16, 0x22, 0x5E, 0x60, 0x26, 0x06, 0x3F, 0x5D, 0x02, 0x12, 0x7B, 0x21, 0x37, 0x71, 0x27, 0x72, 0x15, 0x43, 0x41, 0x0C, 0x2F, 0x49, 0x2E, 0x1B, 0x19, 0x6F, 0x7C, 0x51, 0x35, 0x09, 0x79, 0x4F, 0x34, 0x3C, 0x3A, 0x30, 0x65, 0x7F, 0x28, 0x78, 0x68, 0x46, 0x47, 0x2B, 0x14, 0x7A, 0x48, 0x3D, 0x17, 0x6D, 0x0D, 0x64, 0x4D, 0x01, 0x10, 0x07, 0x52, 0x0A, 0x69, 0x62, 0x75, 0x74, 0x4C, 0x0B, 0x59, 0x6A, 0x00, 0x7D, 0x76, 0x63, 0x56, 0x45, 0x1E, 0x39, 0x7E, 0x57, 0x70, 0x33, 0x11, 0x05, 0x5F, 0x0E, 0x5A, 0x54, 0x5B, 0x08, 0x23, 0x67, 0x20, 0x61, 0x1C, 0x42, 0x66, 0x1F, 0x1A, 0x2D, 0x4B, 0x04, 0x55, 0x5C, 0x25, 0x4A, 0x50, 0x31, 0x44, 0x1D, 0x73, 0x2C, 0x40, 0x6B, 0x6C, 0x18, 0x6E, 0x53, 0x24, 0x4E, 0x2A, 0x13, 0x0F, 0x29, 0x58, 0x77, 0x3B, 0x03 }; const u16bit KASUMI_SBOX_S9[512] = { 0x00A7, 0x00EF, 0x00A1, 0x017B, 0x0187, 0x014E, 0x0009, 0x0152, 0x0026, 0x00E2, 0x0030, 0x0166, 0x01C4, 0x0181, 0x005A, 0x018D, 0x00B7, 0x00FD, 0x0093, 0x014B, 0x019F, 0x0154, 0x0033, 0x016A, 0x0132, 0x01F4, 0x0106, 0x0052, 0x00D8, 0x009F, 0x0164, 0x00B1, 0x00AF, 0x00F1, 0x01E9, 0x0025, 0x00CE, 0x0011, 0x0000, 0x014D, 0x002C, 0x00FE, 0x017A, 0x003A, 0x008F, 0x00DC, 0x0051, 0x0190, 0x005F, 0x0003, 0x013B, 0x00F5, 0x0036, 0x00EB, 0x00DA, 0x0195, 0x01D8, 0x0108, 0x00AC, 0x01EE, 0x0173, 0x0122, 0x018F, 0x004C, 0x00A5, 0x00C5, 0x018B, 0x0079, 0x0101, 0x01E0, 0x01A7, 0x00D4, 0x00F0, 0x001C, 0x01CE, 0x00B0, 0x0196, 0x01FB, 0x0120, 0x00DF, 0x01F5, 0x0197, 0x00F9, 0x0109, 0x0059, 0x00BA, 0x00DD, 0x01AC, 0x00A4, 0x004A, 0x01B8, 0x00C4, 0x01CA, 0x01A5, 0x015E, 0x00A3, 0x00E8, 0x009E, 0x0086, 0x0162, 0x000D, 0x00FA, 0x01EB, 0x008E, 0x00BF, 0x0045, 0x00C1, 0x01A9, 0x0098, 0x00E3, 0x016E, 0x0087, 0x0158, 0x012C, 0x0114, 0x00F2, 0x01B5, 0x0140, 0x0071, 0x0116, 0x000B, 0x00F3, 0x0057, 0x013D, 0x0024, 0x005D, 0x01F0, 0x001B, 0x01E7, 0x01BE, 0x01E2, 0x0029, 0x0044, 0x009C, 0x01C9, 0x0083, 0x0146, 0x0193, 0x0153, 0x0014, 0x0027, 0x0073, 0x01BA, 0x007C, 0x01DB, 0x0180, 0x01FC, 0x0035, 0x0070, 0x00AA, 0x01DF, 0x0097, 0x007E, 0x00A9, 0x0049, 0x010C, 0x0117, 0x0141, 0x00A8, 0x016C, 0x016B, 0x0124, 0x002E, 0x01F3, 0x0189, 0x0147, 0x0144, 0x0018, 0x01C8, 0x010B, 0x009D, 0x01CC, 0x01E8, 0x01AA, 0x0135, 0x00E5, 0x01B7, 0x01FA, 0x00D0, 0x010F, 0x015D, 0x0191, 0x01B2, 0x00EC, 0x0010, 0x00D1, 0x0167, 0x0034, 0x0038, 0x0078, 0x00C7, 0x0115, 0x01D1, 0x01A0, 0x00FC, 0x011F, 0x00F6, 0x0006, 0x0053, 0x0131, 0x01A4, 0x0159, 0x0099, 0x01F6, 0x0041, 0x003D, 0x00F4, 0x011A, 0x00AD, 0x00DE, 0x01A2, 0x0043, 0x0182, 0x0170, 0x0105, 0x0065, 0x01DC, 0x0123, 0x00C3, 0x01AE, 0x0031, 0x004F, 0x00A6, 0x014A, 0x0118, 0x017F, 0x0175, 0x0080, 0x017E, 0x0198, 0x009B, 0x01EF, 0x016F, 0x0184, 0x0112, 0x006B, 0x01CB, 0x01A1, 0x003E, 0x01C6, 0x0084, 0x00E1, 0x00CB, 0x013C, 0x00EA, 0x000E, 0x012D, 0x005B, 0x01F7, 0x011E, 0x01A8, 0x00D3, 0x015B, 0x0133, 0x008C, 0x0176, 0x0023, 0x0067, 0x007D, 0x01AB, 0x0013, 0x00D6, 0x01C5, 0x0092, 0x01F2, 0x013A, 0x01BC, 0x00E6, 0x0100, 0x0149, 0x00C6, 0x011D, 0x0032, 0x0074, 0x004E, 0x019A, 0x000A, 0x00CD, 0x01FE, 0x00AB, 0x00E7, 0x002D, 0x008B, 0x01D3, 0x001D, 0x0056, 0x01F9, 0x0020, 0x0048, 0x001A, 0x0156, 0x0096, 0x0139, 0x01EA, 0x01AF, 0x00EE, 0x019B, 0x0145, 0x0095, 0x01D9, 0x0028, 0x0077, 0x00AE, 0x0163, 0x00B9, 0x00E9, 0x0185, 0x0047, 0x01C0, 0x0111, 0x0174, 0x0037, 0x006E, 0x00B2, 0x0142, 0x000C, 0x01D5, 0x0188, 0x0171, 0x00BE, 0x0001, 0x006D, 0x0177, 0x0089, 0x00B5, 0x0058, 0x004B, 0x0134, 0x0104, 0x01E4, 0x0062, 0x0110, 0x0172, 0x0113, 0x019C, 0x006F, 0x0150, 0x013E, 0x0004, 0x01F8, 0x01EC, 0x0103, 0x0130, 0x004D, 0x0151, 0x01B3, 0x0015, 0x0165, 0x012F, 0x014C, 0x01E3, 0x0012, 0x002F, 0x0055, 0x0019, 0x01F1, 0x01DA, 0x0121, 0x0064, 0x010D, 0x0128, 0x01DE, 0x010E, 0x006A, 0x001F, 0x0068, 0x01B1, 0x0054, 0x019E, 0x01E6, 0x018A, 0x0060, 0x0063, 0x009A, 0x01FF, 0x0094, 0x019D, 0x0169, 0x0199, 0x00FF, 0x00A2, 0x00D7, 0x012E, 0x00C9, 0x010A, 0x015F, 0x0157, 0x0090, 0x01B9, 0x016D, 0x006C, 0x012A, 0x00FB, 0x0022, 0x00B6, 0x01FD, 0x008A, 0x00D2, 0x014F, 0x0085, 0x0137, 0x0160, 0x0148, 0x008D, 0x018C, 0x015A, 0x007B, 0x013F, 0x01C2, 0x0119, 0x01AD, 0x00E4, 0x01BB, 0x01E1, 0x005C, 0x0194, 0x01E5, 0x01A6, 0x00F8, 0x0129, 0x0017, 0x00D5, 0x0082, 0x01D2, 0x0016, 0x00D9, 0x011B, 0x0046, 0x0126, 0x0168, 0x01A3, 0x007F, 0x0138, 0x0179, 0x0007, 0x01D4, 0x00C2, 0x0002, 0x0075, 0x0127, 0x01CF, 0x0102, 0x00E0, 0x01BF, 0x00F7, 0x00BB, 0x0050, 0x018E, 0x011C, 0x0161, 0x0069, 0x0186, 0x012B, 0x01D7, 0x01D6, 0x00B8, 0x0039, 0x00C8, 0x015C, 0x003F, 0x00CC, 0x00BC, 0x0021, 0x01C3, 0x0061, 0x001E, 0x0136, 0x00DB, 0x005E, 0x00A0, 0x0081, 0x01ED, 0x0040, 0x00B3, 0x0107, 0x0066, 0x00BD, 0x00CF, 0x0072, 0x0192, 0x01B6, 0x01DD, 0x0183, 0x007A, 0x00C0, 0x002A, 0x017D, 0x0005, 0x0091, 0x0076, 0x00B4, 0x01C1, 0x0125, 0x0143, 0x0088, 0x017C, 0x002B, 0x0042, 0x003C, 0x01C7, 0x0155, 0x01BD, 0x00CA, 0x01B0, 0x0008, 0x00ED, 0x000F, 0x0178, 0x01B4, 0x01D0, 0x003B, 0x01CD }; /* * KASUMI FI Function */ u16bit FI(u16bit I, u16bit K) { u16bit D9 = (I >> 7); byte D7 = (I & 0x7F); D9 = KASUMI_SBOX_S9[D9] ^ D7; D7 = KASUMI_SBOX_S7[D7] ^ (D9 & 0x7F); D7 ^= (K >> 9); D9 = KASUMI_SBOX_S9[D9 ^ (K & 0x1FF)] ^ D7; D7 = KASUMI_SBOX_S7[D7] ^ (D9 & 0x7F); return (D7 << 9) | D9; } } /* * KASUMI Encryption */ void KASUMI::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u16bit B0 = load_be(in, 0); u16bit B1 = load_be(in, 1); u16bit B2 = load_be(in, 2); u16bit B3 = load_be(in, 3); for(size_t j = 0; j != 8; j += 2) { const u16bit* K = &EK[8*j]; u16bit R = B1 ^ (rotate_left(B0, 1) & K[0]); u16bit L = B0 ^ (rotate_left(R, 1) | K[1]); L = FI(L ^ K[ 2], K[ 3]) ^ R; R = FI(R ^ K[ 4], K[ 5]) ^ L; L = FI(L ^ K[ 6], K[ 7]) ^ R; R = B2 ^= R; L = B3 ^= L; R = FI(R ^ K[10], K[11]) ^ L; L = FI(L ^ K[12], K[13]) ^ R; R = FI(R ^ K[14], K[15]) ^ L; R ^= (rotate_left(L, 1) & K[8]); L ^= (rotate_left(R, 1) | K[9]); B0 ^= L; B1 ^= R; } store_be(out, B0, B1, B2, B3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * KASUMI Decryption */ void KASUMI::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u16bit B0 = load_be(in, 0); u16bit B1 = load_be(in, 1); u16bit B2 = load_be(in, 2); u16bit B3 = load_be(in, 3); for(size_t j = 0; j != 8; j += 2) { const u16bit* K = &EK[8*(6-j)]; u16bit L = B2, R = B3; L = FI(L ^ K[10], K[11]) ^ R; R = FI(R ^ K[12], K[13]) ^ L; L = FI(L ^ K[14], K[15]) ^ R; L ^= (rotate_left(R, 1) & K[8]); R ^= (rotate_left(L, 1) | K[9]); R = B0 ^= R; L = B1 ^= L; L ^= (rotate_left(R, 1) & K[0]); R ^= (rotate_left(L, 1) | K[1]); R = FI(R ^ K[2], K[3]) ^ L; L = FI(L ^ K[4], K[5]) ^ R; R = FI(R ^ K[6], K[7]) ^ L; B2 ^= L; B3 ^= R; } store_be(out, B0, B1, B2, B3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * KASUMI Key Schedule */ void KASUMI::key_schedule(const byte key[], size_t) { static const u16bit RC[] = { 0x0123, 0x4567, 0x89AB, 0xCDEF, 0xFEDC, 0xBA98, 0x7654, 0x3210 }; SecureVector K(16); for(size_t i = 0; i != 8; ++i) { K[i] = load_be(key, i); K[i+8] = K[i] ^ RC[i]; } for(size_t i = 0; i != 8; ++i) { EK[8*i ] = rotate_left(K[(i+0) % 8 ], 2); EK[8*i+1] = rotate_left(K[(i+2) % 8 + 8], 1); EK[8*i+2] = rotate_left(K[(i+1) % 8 ], 5); EK[8*i+3] = K[(i+4) % 8 + 8]; EK[8*i+4] = rotate_left(K[(i+5) % 8 ], 8); EK[8*i+5] = K[(i+3) % 8 + 8]; EK[8*i+6] = rotate_left(K[(i+6) % 8 ], 13); EK[8*i+7] = K[(i+7) % 8 + 8]; } } } Botan-1.10.12/src/block/kasumi/kasumi.h0000664000175000017500000000137012654331322017401 0ustar jackjack00000000000000/* * KASUMI * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_KASUMI_H__ #define BOTAN_KASUMI_H__ #include namespace Botan { /** * KASUMI, the block cipher used in 3G telephony */ class BOTAN_DLL KASUMI : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); } std::string name() const { return "KASUMI"; } BlockCipher* clone() const { return new KASUMI; } KASUMI() : EK(64) {} private: void key_schedule(const byte[], size_t); SecureVector EK; }; } #endif Botan-1.10.12/src/block/lion/info.txt0000664000175000017500000000006012654331322017076 0ustar jackjack00000000000000define LION hash stream Botan-1.10.12/src/block/lion/lion.cpp0000664000175000017500000000554012654331322017057 0ustar jackjack00000000000000/* * Lion * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Lion Encryption */ void Lion::encrypt_n(const byte in[], byte out[], size_t blocks) const { SecureVector buffer_vec(LEFT_SIZE); byte* buffer = &buffer_vec[0]; for(size_t i = 0; i != blocks; ++i) { xor_buf(buffer, in, &key1[0], LEFT_SIZE); cipher->set_key(buffer, LEFT_SIZE); cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE); hash->update(out + LEFT_SIZE, RIGHT_SIZE); hash->final(buffer); xor_buf(out, in, buffer, LEFT_SIZE); xor_buf(buffer, out, &key2[0], LEFT_SIZE); cipher->set_key(buffer, LEFT_SIZE); cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Lion Decryption */ void Lion::decrypt_n(const byte in[], byte out[], size_t blocks) const { SecureVector buffer_vec(LEFT_SIZE); byte* buffer = &buffer_vec[0]; for(size_t i = 0; i != blocks; ++i) { xor_buf(buffer, in, &key2[0], LEFT_SIZE); cipher->set_key(buffer, LEFT_SIZE); cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE); hash->update(out + LEFT_SIZE, RIGHT_SIZE); hash->final(buffer); xor_buf(out, in, buffer, LEFT_SIZE); xor_buf(buffer, out, &key1[0], LEFT_SIZE); cipher->set_key(buffer, LEFT_SIZE); cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Lion Key Schedule */ void Lion::key_schedule(const byte key[], size_t length) { clear(); key1.copy(key, length / 2); key2.copy(key + length / 2, length / 2); } /* * Return the name of this type */ std::string Lion::name() const { return "Lion(" + hash->name() + "," + cipher->name() + "," + to_string(BLOCK_SIZE) + ")"; } /* * Return a clone of this object */ BlockCipher* Lion::clone() const { return new Lion(hash->clone(), cipher->clone(), BLOCK_SIZE); } /* * Clear memory of sensitive data */ void Lion::clear() { hash->clear(); cipher->clear(); zeroise(key1); zeroise(key2); } /* * Lion Constructor */ Lion::Lion(HashFunction* hash_in, StreamCipher* sc_in, size_t block_len) : BLOCK_SIZE(std::max(2*hash_in->output_length() + 1, block_len)), LEFT_SIZE(hash_in->output_length()), RIGHT_SIZE(BLOCK_SIZE - LEFT_SIZE), hash(hash_in), cipher(sc_in) { if(2*LEFT_SIZE + 1 > BLOCK_SIZE) throw Invalid_Argument(name() + ": Chosen block size is too small"); if(!cipher->valid_keylength(LEFT_SIZE)) throw Invalid_Argument(name() + ": This stream/hash combo is invalid"); key1.resize(LEFT_SIZE); key2.resize(LEFT_SIZE); } } Botan-1.10.12/src/block/lion/lion.h0000664000175000017500000000310312654331322016515 0ustar jackjack00000000000000/* * Lion * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_LION_H__ #define BOTAN_LION_H__ #include #include #include namespace Botan { /** * Lion is a block cipher construction designed by Ross Anderson and * Eli Biham, described in "Two Practical and Provably Secure Block * Ciphers: BEAR and LION". It has a variable block size and is * designed to encrypt very large blocks (up to a megabyte) * http://www.cl.cam.ac.uk/~rja14/Papers/bear-lion.pdf */ class BOTAN_DLL Lion : public BlockCipher { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; size_t block_size() const { return BLOCK_SIZE; } Key_Length_Specification key_spec() const { return Key_Length_Specification(2, 2*hash->output_length(), 2); } void clear(); std::string name() const; BlockCipher* clone() const; /** * @param hash the hash to use internally * @param cipher the stream cipher to use internally * @param block_size the size of the block to use */ Lion(HashFunction* hash, StreamCipher* cipher, size_t block_size); ~Lion() { delete hash; delete cipher; } private: void key_schedule(const byte[], size_t); const size_t BLOCK_SIZE, LEFT_SIZE, RIGHT_SIZE; HashFunction* hash; StreamCipher* cipher; SecureVector key1, key2; }; } #endif Botan-1.10.12/src/block/lubyrack/info.txt0000664000175000017500000000006112654331322017752 0ustar jackjack00000000000000define LUBY_RACKOFF hash Botan-1.10.12/src/block/lubyrack/lubyrack.cpp0000664000175000017500000000506212654331322020604 0ustar jackjack00000000000000/* * Luby-Rackoff * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Luby-Rackoff Encryption */ void LubyRackoff::encrypt_n(const byte in[], byte out[], size_t blocks) const { const size_t len = hash->output_length(); SecureVector buffer_vec(len); byte* buffer = &buffer_vec[0]; for(size_t i = 0; i != blocks; ++i) { hash->update(K1); hash->update(in, len); hash->final(buffer); xor_buf(out + len, in + len, buffer, len); hash->update(K2); hash->update(out + len, len); hash->final(buffer); xor_buf(out, in, buffer, len); hash->update(K1); hash->update(out, len); hash->final(buffer); xor_buf(out + len, buffer, len); hash->update(K2); hash->update(out + len, len); hash->final(buffer); xor_buf(out, buffer, len); in += 2 * len; out += 2 * len; } } /* * Luby-Rackoff Decryption */ void LubyRackoff::decrypt_n(const byte in[], byte out[], size_t blocks) const { const size_t len = hash->output_length(); SecureVector buffer_vec(len); byte* buffer = &buffer_vec[0]; for(size_t i = 0; i != blocks; ++i) { hash->update(K2); hash->update(in + len, len); hash->final(buffer); xor_buf(out, in, buffer, len); hash->update(K1); hash->update(out, len); hash->final(buffer); xor_buf(out + len, in + len, buffer, len); hash->update(K2); hash->update(out + len, len); hash->final(buffer); xor_buf(out, buffer, len); hash->update(K1); hash->update(out, len); hash->final(buffer); xor_buf(out + len, buffer, len); in += 2 * len; out += 2 * len; } } /* * Luby-Rackoff Key Schedule */ void LubyRackoff::key_schedule(const byte key[], size_t length) { K1.resize(length / 2); K2.resize(length / 2); copy_mem(&K1[0], key , length / 2); copy_mem(&K2[0], key + length / 2, length / 2); } /* * Clear memory of sensitive data */ void LubyRackoff::clear() { zeroise(K1); zeroise(K2); hash->clear(); } /* * Return a clone of this object */ BlockCipher* LubyRackoff::clone() const { return new LubyRackoff(hash->clone()); } /* * Return the name of this type */ std::string LubyRackoff::name() const { return "Luby-Rackoff(" + hash->name() + ")"; } /* * Luby-Rackoff Constructor */ LubyRackoff::LubyRackoff(HashFunction* h) : hash(h) { } } Botan-1.10.12/src/block/lubyrack/lubyrack.h0000664000175000017500000000206112654331322020245 0ustar jackjack00000000000000/* * Luby-Rackoff * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_LUBY_RACKOFF_H__ #define BOTAN_LUBY_RACKOFF_H__ #include #include namespace Botan { /** * Luby-Rackoff block cipher construction */ class BOTAN_DLL LubyRackoff : public BlockCipher { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; size_t block_size() const { return 2 * hash->output_length(); } Key_Length_Specification key_spec() const { return Key_Length_Specification(2, 32, 2); } void clear(); std::string name() const; BlockCipher* clone() const; /** * @param hash function to use to form the block cipher */ LubyRackoff(HashFunction* hash); ~LubyRackoff() { delete hash; } private: void key_schedule(const byte[], size_t); HashFunction* hash; SecureVector K1, K2; }; } #endif Botan-1.10.12/src/block/mars/info.txt0000664000175000017500000000001412654331322017076 0ustar jackjack00000000000000define MARS Botan-1.10.12/src/block/mars/mars.cpp0000664000175000017500000003540512654331322017064 0ustar jackjack00000000000000/* * MARS * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /** * The MARS sbox */ const u32bit SBOX[512] = { 0x09D0C479, 0x28C8FFE0, 0x84AA6C39, 0x9DAD7287, 0x7DFF9BE3, 0xD4268361, 0xC96DA1D4, 0x7974CC93, 0x85D0582E, 0x2A4B5705, 0x1CA16A62, 0xC3BD279D, 0x0F1F25E5, 0x5160372F, 0xC695C1FB, 0x4D7FF1E4, 0xAE5F6BF4, 0x0D72EE46, 0xFF23DE8A, 0xB1CF8E83, 0xF14902E2, 0x3E981E42, 0x8BF53EB6, 0x7F4BF8AC, 0x83631F83, 0x25970205, 0x76AFE784, 0x3A7931D4, 0x4F846450, 0x5C64C3F6, 0x210A5F18, 0xC6986A26, 0x28F4E826, 0x3A60A81C, 0xD340A664, 0x7EA820C4, 0x526687C5, 0x7EDDD12B, 0x32A11D1D, 0x9C9EF086, 0x80F6E831, 0xAB6F04AD, 0x56FB9B53, 0x8B2E095C, 0xB68556AE, 0xD2250B0D, 0x294A7721, 0xE21FB253, 0xAE136749, 0xE82AAE86, 0x93365104, 0x99404A66, 0x78A784DC, 0xB69BA84B, 0x04046793, 0x23DB5C1E, 0x46CAE1D6, 0x2FE28134, 0x5A223942, 0x1863CD5B, 0xC190C6E3, 0x07DFB846, 0x6EB88816, 0x2D0DCC4A, 0xA4CCAE59, 0x3798670D, 0xCBFA9493, 0x4F481D45, 0xEAFC8CA8, 0xDB1129D6, 0xB0449E20, 0x0F5407FB, 0x6167D9A8, 0xD1F45763, 0x4DAA96C3, 0x3BEC5958, 0xABABA014, 0xB6CCD201, 0x38D6279F, 0x02682215, 0x8F376CD5, 0x092C237E, 0xBFC56593, 0x32889D2C, 0x854B3E95, 0x05BB9B43, 0x7DCD5DCD, 0xA02E926C, 0xFAE527E5, 0x36A1C330, 0x3412E1AE, 0xF257F462, 0x3C4F1D71, 0x30A2E809, 0x68E5F551, 0x9C61BA44, 0x5DED0AB8, 0x75CE09C8, 0x9654F93E, 0x698C0CCA, 0x243CB3E4, 0x2B062B97, 0x0F3B8D9E, 0x00E050DF, 0xFC5D6166, 0xE35F9288, 0xC079550D, 0x0591AEE8, 0x8E531E74, 0x75FE3578, 0x2F6D829A, 0xF60B21AE, 0x95E8EB8D, 0x6699486B, 0x901D7D9B, 0xFD6D6E31, 0x1090ACEF, 0xE0670DD8, 0xDAB2E692, 0xCD6D4365, 0xE5393514, 0x3AF345F0, 0x6241FC4D, 0x460DA3A3, 0x7BCF3729, 0x8BF1D1E0, 0x14AAC070, 0x1587ED55, 0x3AFD7D3E, 0xD2F29E01, 0x29A9D1F6, 0xEFB10C53, 0xCF3B870F, 0xB414935C, 0x664465ED, 0x024ACAC7, 0x59A744C1, 0x1D2936A7, 0xDC580AA6, 0xCF574CA8, 0x040A7A10, 0x6CD81807, 0x8A98BE4C, 0xACCEA063, 0xC33E92B5, 0xD1E0E03D, 0xB322517E, 0x2092BD13, 0x386B2C4A, 0x52E8DD58, 0x58656DFB, 0x50820371, 0x41811896, 0xE337EF7E, 0xD39FB119, 0xC97F0DF6, 0x68FEA01B, 0xA150A6E5, 0x55258962, 0xEB6FF41B, 0xD7C9CD7A, 0xA619CD9E, 0xBCF09576, 0x2672C073, 0xF003FB3C, 0x4AB7A50B, 0x1484126A, 0x487BA9B1, 0xA64FC9C6, 0xF6957D49, 0x38B06A75, 0xDD805FCD, 0x63D094CF, 0xF51C999E, 0x1AA4D343, 0xB8495294, 0xCE9F8E99, 0xBFFCD770, 0xC7C275CC, 0x378453A7, 0x7B21BE33, 0x397F41BD, 0x4E94D131, 0x92CC1F98, 0x5915EA51, 0x99F861B7, 0xC9980A88, 0x1D74FD5F, 0xB0A495F8, 0x614DEED0, 0xB5778EEA, 0x5941792D, 0xFA90C1F8, 0x33F824B4, 0xC4965372, 0x3FF6D550, 0x4CA5FEC0, 0x8630E964, 0x5B3FBBD6, 0x7DA26A48, 0xB203231A, 0x04297514, 0x2D639306, 0x2EB13149, 0x16A45272, 0x532459A0, 0x8E5F4872, 0xF966C7D9, 0x07128DC0, 0x0D44DB62, 0xAFC8D52D, 0x06316131, 0xD838E7CE, 0x1BC41D00, 0x3A2E8C0F, 0xEA83837E, 0xB984737D, 0x13BA4891, 0xC4F8B949, 0xA6D6ACB3, 0xA215CDCE, 0x8359838B, 0x6BD1AA31, 0xF579DD52, 0x21B93F93, 0xF5176781, 0x187DFDDE, 0xE94AEB76, 0x2B38FD54, 0x431DE1DA, 0xAB394825, 0x9AD3048F, 0xDFEA32AA, 0x659473E3, 0x623F7863, 0xF3346C59, 0xAB3AB685, 0x3346A90B, 0x6B56443E, 0xC6DE01F8, 0x8D421FC0, 0x9B0ED10C, 0x88F1A1E9, 0x54C1F029, 0x7DEAD57B, 0x8D7BA426, 0x4CF5178A, 0x551A7CCA, 0x1A9A5F08, 0xFCD651B9, 0x25605182, 0xE11FC6C3, 0xB6FD9676, 0x337B3027, 0xB7C8EB14, 0x9E5FD030, 0x6B57E354, 0xAD913CF7, 0x7E16688D, 0x58872A69, 0x2C2FC7DF, 0xE389CCC6, 0x30738DF1, 0x0824A734, 0xE1797A8B, 0xA4A8D57B, 0x5B5D193B, 0xC8A8309B, 0x73F9A978, 0x73398D32, 0x0F59573E, 0xE9DF2B03, 0xE8A5B6C8, 0x848D0704, 0x98DF93C2, 0x720A1DC3, 0x684F259A, 0x943BA848, 0xA6370152, 0x863B5EA3, 0xD17B978B, 0x6D9B58EF, 0x0A700DD4, 0xA73D36BF, 0x8E6A0829, 0x8695BC14, 0xE35B3447, 0x933AC568, 0x8894B022, 0x2F511C27, 0xDDFBCC3C, 0x006662B6, 0x117C83FE, 0x4E12B414, 0xC2BCA766, 0x3A2FEC10, 0xF4562420, 0x55792E2A, 0x46F5D857, 0xCEDA25CE, 0xC3601D3B, 0x6C00AB46, 0xEFAC9C28, 0xB3C35047, 0x611DFEE3, 0x257C3207, 0xFDD58482, 0x3B14D84F, 0x23BECB64, 0xA075F3A3, 0x088F8EAD, 0x07ADF158, 0x7796943C, 0xFACABF3D, 0xC09730CD, 0xF7679969, 0xDA44E9ED, 0x2C854C12, 0x35935FA3, 0x2F057D9F, 0x690624F8, 0x1CB0BAFD, 0x7B0DBDC6, 0x810F23BB, 0xFA929A1A, 0x6D969A17, 0x6742979B, 0x74AC7D05, 0x010E65C4, 0x86A3D963, 0xF907B5A0, 0xD0042BD3, 0x158D7D03, 0x287A8255, 0xBBA8366F, 0x096EDC33, 0x21916A7B, 0x77B56B86, 0x951622F9, 0xA6C5E650, 0x8CEA17D1, 0xCD8C62BC, 0xA3D63433, 0x358A68FD, 0x0F9B9D3C, 0xD6AA295B, 0xFE33384A, 0xC000738E, 0xCD67EB2F, 0xE2EB6DC2, 0x97338B02, 0x06C9F246, 0x419CF1AD, 0x2B83C045, 0x3723F18A, 0xCB5B3089, 0x160BEAD7, 0x5D494656, 0x35F8A74B, 0x1E4E6C9E, 0x000399BD, 0x67466880, 0xB4174831, 0xACF423B2, 0xCA815AB3, 0x5A6395E7, 0x302A67C5, 0x8BDB446B, 0x108F8FA4, 0x10223EDA, 0x92B8B48B, 0x7F38D0EE, 0xAB2701D4, 0x0262D415, 0xAF224A30, 0xB3D88ABA, 0xF8B2C3AF, 0xDAF7EF70, 0xCC97D3B7, 0xE9614B6C, 0x2BAEBFF4, 0x70F687CF, 0x386C9156, 0xCE092EE5, 0x01E87DA6, 0x6CE91E6A, 0xBB7BCC84, 0xC7922C20, 0x9D3B71FD, 0x060E41C6, 0xD7590F15, 0x4E03BB47, 0x183C198E, 0x63EEB240, 0x2DDBF49A, 0x6D5CBA54, 0x923750AF, 0xF9E14236, 0x7838162B, 0x59726C72, 0x81B66760, 0xBB2926C1, 0x48A0CE0D, 0xA6C0496D, 0xAD43507B, 0x718D496A, 0x9DF057AF, 0x44B1BDE6, 0x054356DC, 0xDE7CED35, 0xD51A138B, 0x62088CC9, 0x35830311, 0xC96EFCA2, 0x686F86EC, 0x8E77CB68, 0x63E1D6B8, 0xC80F9778, 0x79C491FD, 0x1B4C67F2, 0x72698D7D, 0x5E368C31, 0xF7D95E2E, 0xA1D3493F, 0xDCD9433E, 0x896F1552, 0x4BC4CA7A, 0xA6D1BAF4, 0xA5A96DCC, 0x0BEF8B46, 0xA169FDA7, 0x74DF40B7, 0x4E208804, 0x9A756607, 0x038E87C8, 0x20211E44, 0x8B7AD4BF, 0xC6403F35, 0x1848E36D, 0x80BDB038, 0x1E62891C, 0x643D2107, 0xBF04D6F8, 0x21092C8C, 0xF644F389, 0x0778404E, 0x7B78ADB8, 0xA2C52D53, 0x42157ABE, 0xA2253E2E, 0x7BF3F4AE, 0x80F594F9, 0x953194E7, 0x77EB92ED, 0xB3816930, 0xDA8D9336, 0xBF447469, 0xF26D9483, 0xEE6FAED5, 0x71371235, 0xDE425F73, 0xB4E59F43, 0x7DBE2D4E, 0x2D37B185, 0x49DC9A63, 0x98C39D98, 0x1301C9A2, 0x389B1BBF, 0x0C18588D, 0xA421C1BA, 0x7AA3865C, 0x71E08558, 0x3C5CFCAA, 0x7D239CA4, 0x0297D9DD, 0xD7DC2830, 0x4B37802B, 0x7428AB54, 0xAEEE0347, 0x4B3FBB85, 0x692F2F08, 0x134E578E, 0x36D9E0BF, 0xAE8B5FCF, 0xEDB93ECF, 0x2B27248E, 0x170EB1EF, 0x7DC57FD6, 0x1E760F16, 0xB1136601, 0x864E1B9B, 0xD7EA7319, 0x3AB871BD, 0xCFA4D76F, 0xE31BD782, 0x0DBEB469, 0xABB96061, 0x5370F85D, 0xFFB07E37, 0xDA30D0FB, 0xEBC977B6, 0x0B98B40F, 0x3A4D0FE6, 0xDF4FC26B, 0x159CF22A, 0xC298D6E2, 0x2B78EF6A, 0x61A94AC0, 0xAB561187, 0x14EEA0F0, 0xDF0D4164, 0x19AF70EE }; /* * MARS Encryption Round */ inline void encrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D, u32bit EK1, u32bit EK2) { const u32bit X = A + EK1; A = rotate_left(A, 13); u32bit Y = A * EK2; u32bit Z = SBOX[X % 512]; Y = rotate_left(Y, 5); Z ^= Y; C += rotate_left(X, Y % 32); Y = rotate_left(Y, 5); Z ^= Y; D ^= Y; B += rotate_left(Z, Y % 32); } /* * MARS Decryption Round */ inline void decrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D, u32bit EK1, u32bit EK2) { u32bit Y = A * EK1; A = rotate_right(A, 13); const u32bit X = A + EK2; u32bit Z = SBOX[X % 512]; Y = rotate_left(Y, 5); Z ^= Y; C -= rotate_left(X, Y % 32); Y = rotate_left(Y, 5); Z ^= Y; D ^= Y; B -= rotate_left(Z, Y % 32); } /* * MARS Forward Mixing Operation */ void forward_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D) { for(size_t j = 0; j != 2; ++j) { B ^= SBOX[get_byte(3, A)]; B += SBOX[get_byte(2, A) + 256]; C += SBOX[get_byte(1, A)]; D ^= SBOX[get_byte(0, A) + 256]; A = rotate_right(A, 24) + D; C ^= SBOX[get_byte(3, B)]; C += SBOX[get_byte(2, B) + 256]; D += SBOX[get_byte(1, B)]; A ^= SBOX[get_byte(0, B) + 256]; B = rotate_right(B, 24) + C; D ^= SBOX[get_byte(3, C)]; D += SBOX[get_byte(2, C) + 256]; A += SBOX[get_byte(1, C)]; B ^= SBOX[get_byte(0, C) + 256]; C = rotate_right(C, 24); A ^= SBOX[get_byte(3, D)]; A += SBOX[get_byte(2, D) + 256]; B += SBOX[get_byte(1, D)]; C ^= SBOX[get_byte(0, D) + 256]; D = rotate_right(D, 24); } } /* * MARS Reverse Mixing Operation */ void reverse_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D) { for(size_t j = 0; j != 2; ++j) { B ^= SBOX[get_byte(3, A) + 256]; C -= SBOX[get_byte(0, A)]; D -= SBOX[get_byte(1, A) + 256]; D ^= SBOX[get_byte(2, A)]; A = rotate_left(A, 24); C ^= SBOX[get_byte(3, B) + 256]; D -= SBOX[get_byte(0, B)]; A -= SBOX[get_byte(1, B) + 256]; A ^= SBOX[get_byte(2, B)]; C -= (B = rotate_left(B, 24)); D ^= SBOX[get_byte(3, C) + 256]; A -= SBOX[get_byte(0, C)]; B -= SBOX[get_byte(1, C) + 256]; B ^= SBOX[get_byte(2, C)]; C = rotate_left(C, 24); D -= A; A ^= SBOX[get_byte(3, D) + 256]; B -= SBOX[get_byte(0, D)]; C -= SBOX[get_byte(1, D) + 256]; C ^= SBOX[get_byte(2, D)]; D = rotate_left(D, 24); } } /* * Generate a mask for runs of bits */ u32bit gen_mask(u32bit input) { u32bit mask = 0; for(u32bit j = 2; j != 31; ++j) { const u32bit region = (input >> (j-1)) & 0x07; if(region == 0x00 || region == 0x07) { const u32bit low = (j < 9) ? 0 : (j - 9); const u32bit high = (j < 23) ? j : 23; for(u32bit k = low; k != high; ++k) { const u32bit value = (input >> k) & 0x3FF; if(value == 0 || value == 0x3FF) { mask |= 1 << j; break; } } } } return mask; } } /* * MARS Encryption */ void MARS::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A = load_le(in, 0) + EK[0]; u32bit B = load_le(in, 1) + EK[1]; u32bit C = load_le(in, 2) + EK[2]; u32bit D = load_le(in, 3) + EK[3]; forward_mix(A, B, C, D); encrypt_round(A, B, C, D, EK[ 4], EK[ 5]); encrypt_round(B, C, D, A, EK[ 6], EK[ 7]); encrypt_round(C, D, A, B, EK[ 8], EK[ 9]); encrypt_round(D, A, B, C, EK[10], EK[11]); encrypt_round(A, B, C, D, EK[12], EK[13]); encrypt_round(B, C, D, A, EK[14], EK[15]); encrypt_round(C, D, A, B, EK[16], EK[17]); encrypt_round(D, A, B, C, EK[18], EK[19]); encrypt_round(A, D, C, B, EK[20], EK[21]); encrypt_round(B, A, D, C, EK[22], EK[23]); encrypt_round(C, B, A, D, EK[24], EK[25]); encrypt_round(D, C, B, A, EK[26], EK[27]); encrypt_round(A, D, C, B, EK[28], EK[29]); encrypt_round(B, A, D, C, EK[30], EK[31]); encrypt_round(C, B, A, D, EK[32], EK[33]); encrypt_round(D, C, B, A, EK[34], EK[35]); reverse_mix(A, B, C, D); A -= EK[36]; B -= EK[37]; C -= EK[38]; D -= EK[39]; store_le(out, A, B, C, D); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * MARS Decryption */ void MARS::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A = load_le(in, 3) + EK[39]; u32bit B = load_le(in, 2) + EK[38]; u32bit C = load_le(in, 1) + EK[37]; u32bit D = load_le(in, 0) + EK[36]; forward_mix(A, B, C, D); decrypt_round(A, B, C, D, EK[35], EK[34]); decrypt_round(B, C, D, A, EK[33], EK[32]); decrypt_round(C, D, A, B, EK[31], EK[30]); decrypt_round(D, A, B, C, EK[29], EK[28]); decrypt_round(A, B, C, D, EK[27], EK[26]); decrypt_round(B, C, D, A, EK[25], EK[24]); decrypt_round(C, D, A, B, EK[23], EK[22]); decrypt_round(D, A, B, C, EK[21], EK[20]); decrypt_round(A, D, C, B, EK[19], EK[18]); decrypt_round(B, A, D, C, EK[17], EK[16]); decrypt_round(C, B, A, D, EK[15], EK[14]); decrypt_round(D, C, B, A, EK[13], EK[12]); decrypt_round(A, D, C, B, EK[11], EK[10]); decrypt_round(B, A, D, C, EK[ 9], EK[ 8]); decrypt_round(C, B, A, D, EK[ 7], EK[ 6]); decrypt_round(D, C, B, A, EK[ 5], EK[ 4]); reverse_mix(A, B, C, D); A -= EK[3]; B -= EK[2]; C -= EK[1]; D -= EK[0]; store_le(out, D, C, B, A); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * MARS Key Schedule */ void MARS::key_schedule(const byte key[], size_t length) { SecureVector T(15); for(size_t i = 0; i != length / 4; ++i) T[i] = load_le(key, i); T[length / 4] = static_cast(length) / 4; for(u32bit i = 0; i != 4; ++i) { T[ 0] ^= rotate_left(T[ 8] ^ T[13], 3) ^ (i ); T[ 1] ^= rotate_left(T[ 9] ^ T[14], 3) ^ (i + 4); T[ 2] ^= rotate_left(T[10] ^ T[ 0], 3) ^ (i + 8); T[ 3] ^= rotate_left(T[11] ^ T[ 1], 3) ^ (i + 12); T[ 4] ^= rotate_left(T[12] ^ T[ 2], 3) ^ (i + 16); T[ 5] ^= rotate_left(T[13] ^ T[ 3], 3) ^ (i + 20); T[ 6] ^= rotate_left(T[14] ^ T[ 4], 3) ^ (i + 24); T[ 7] ^= rotate_left(T[ 0] ^ T[ 5], 3) ^ (i + 28); T[ 8] ^= rotate_left(T[ 1] ^ T[ 6], 3) ^ (i + 32); T[ 9] ^= rotate_left(T[ 2] ^ T[ 7], 3) ^ (i + 36); T[10] ^= rotate_left(T[ 3] ^ T[ 8], 3) ^ (i + 40); T[11] ^= rotate_left(T[ 4] ^ T[ 9], 3) ^ (i + 44); T[12] ^= rotate_left(T[ 5] ^ T[10], 3) ^ (i + 48); T[13] ^= rotate_left(T[ 6] ^ T[11], 3) ^ (i + 52); T[14] ^= rotate_left(T[ 7] ^ T[12], 3) ^ (i + 56); for(size_t j = 0; j != 4; ++j) { T[ 0] = rotate_left(T[ 0] + SBOX[T[14] % 512], 9); T[ 1] = rotate_left(T[ 1] + SBOX[T[ 0] % 512], 9); T[ 2] = rotate_left(T[ 2] + SBOX[T[ 1] % 512], 9); T[ 3] = rotate_left(T[ 3] + SBOX[T[ 2] % 512], 9); T[ 4] = rotate_left(T[ 4] + SBOX[T[ 3] % 512], 9); T[ 5] = rotate_left(T[ 5] + SBOX[T[ 4] % 512], 9); T[ 6] = rotate_left(T[ 6] + SBOX[T[ 5] % 512], 9); T[ 7] = rotate_left(T[ 7] + SBOX[T[ 6] % 512], 9); T[ 8] = rotate_left(T[ 8] + SBOX[T[ 7] % 512], 9); T[ 9] = rotate_left(T[ 9] + SBOX[T[ 8] % 512], 9); T[10] = rotate_left(T[10] + SBOX[T[ 9] % 512], 9); T[11] = rotate_left(T[11] + SBOX[T[10] % 512], 9); T[12] = rotate_left(T[12] + SBOX[T[11] % 512], 9); T[13] = rotate_left(T[13] + SBOX[T[12] % 512], 9); T[14] = rotate_left(T[14] + SBOX[T[13] % 512], 9); } EK[10*i + 0] = T[ 0]; EK[10*i + 1] = T[ 4]; EK[10*i + 2] = T[ 8]; EK[10*i + 3] = T[12]; EK[10*i + 4] = T[ 1]; EK[10*i + 5] = T[ 5]; EK[10*i + 6] = T[ 9]; EK[10*i + 7] = T[13]; EK[10*i + 8] = T[ 2]; EK[10*i + 9] = T[ 6]; } for(size_t i = 5; i != 37; i += 2) { const u32bit key3 = EK[i] & 3; EK[i] |= 3; EK[i] ^= rotate_left(SBOX[265 + key3], EK[i-1] % 32) & gen_mask(EK[i]); } } } Botan-1.10.12/src/block/mars/mars.h0000664000175000017500000000134212654331322016522 0ustar jackjack00000000000000/* * MARS * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MARS_H__ #define BOTAN_MARS_H__ #include namespace Botan { /** * MARS, IBM's candidate for AES */ class BOTAN_DLL MARS : public Block_Cipher_Fixed_Params<16, 16, 32, 4> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); } std::string name() const { return "MARS"; } BlockCipher* clone() const { return new MARS; } MARS() : EK(40) {} private: void key_schedule(const byte[], size_t); SecureVector EK; }; } #endif Botan-1.10.12/src/block/misty1/info.txt0000664000175000017500000000001612654331322017364 0ustar jackjack00000000000000define MISTY1 Botan-1.10.12/src/block/misty1/misty1.cpp0000664000175000017500000002402112654331322017624 0ustar jackjack00000000000000/* * MISTY1 * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { static const byte MISTY1_SBOX_S7[128] = { 0x1B, 0x32, 0x33, 0x5A, 0x3B, 0x10, 0x17, 0x54, 0x5B, 0x1A, 0x72, 0x73, 0x6B, 0x2C, 0x66, 0x49, 0x1F, 0x24, 0x13, 0x6C, 0x37, 0x2E, 0x3F, 0x4A, 0x5D, 0x0F, 0x40, 0x56, 0x25, 0x51, 0x1C, 0x04, 0x0B, 0x46, 0x20, 0x0D, 0x7B, 0x35, 0x44, 0x42, 0x2B, 0x1E, 0x41, 0x14, 0x4B, 0x79, 0x15, 0x6F, 0x0E, 0x55, 0x09, 0x36, 0x74, 0x0C, 0x67, 0x53, 0x28, 0x0A, 0x7E, 0x38, 0x02, 0x07, 0x60, 0x29, 0x19, 0x12, 0x65, 0x2F, 0x30, 0x39, 0x08, 0x68, 0x5F, 0x78, 0x2A, 0x4C, 0x64, 0x45, 0x75, 0x3D, 0x59, 0x48, 0x03, 0x57, 0x7C, 0x4F, 0x62, 0x3C, 0x1D, 0x21, 0x5E, 0x27, 0x6A, 0x70, 0x4D, 0x3A, 0x01, 0x6D, 0x6E, 0x63, 0x18, 0x77, 0x23, 0x05, 0x26, 0x76, 0x00, 0x31, 0x2D, 0x7A, 0x7F, 0x61, 0x50, 0x22, 0x11, 0x06, 0x47, 0x16, 0x52, 0x4E, 0x71, 0x3E, 0x69, 0x43, 0x34, 0x5C, 0x58, 0x7D }; static const u16bit MISTY1_SBOX_S9[512] = { 0x01C3, 0x00CB, 0x0153, 0x019F, 0x01E3, 0x00E9, 0x00FB, 0x0035, 0x0181, 0x00B9, 0x0117, 0x01EB, 0x0133, 0x0009, 0x002D, 0x00D3, 0x00C7, 0x014A, 0x0037, 0x007E, 0x00EB, 0x0164, 0x0193, 0x01D8, 0x00A3, 0x011E, 0x0055, 0x002C, 0x001D, 0x01A2, 0x0163, 0x0118, 0x014B, 0x0152, 0x01D2, 0x000F, 0x002B, 0x0030, 0x013A, 0x00E5, 0x0111, 0x0138, 0x018E, 0x0063, 0x00E3, 0x00C8, 0x01F4, 0x001B, 0x0001, 0x009D, 0x00F8, 0x01A0, 0x016D, 0x01F3, 0x001C, 0x0146, 0x007D, 0x00D1, 0x0082, 0x01EA, 0x0183, 0x012D, 0x00F4, 0x019E, 0x01D3, 0x00DD, 0x01E2, 0x0128, 0x01E0, 0x00EC, 0x0059, 0x0091, 0x0011, 0x012F, 0x0026, 0x00DC, 0x00B0, 0x018C, 0x010F, 0x01F7, 0x00E7, 0x016C, 0x00B6, 0x00F9, 0x00D8, 0x0151, 0x0101, 0x014C, 0x0103, 0x00B8, 0x0154, 0x012B, 0x01AE, 0x0017, 0x0071, 0x000C, 0x0047, 0x0058, 0x007F, 0x01A4, 0x0134, 0x0129, 0x0084, 0x015D, 0x019D, 0x01B2, 0x01A3, 0x0048, 0x007C, 0x0051, 0x01CA, 0x0023, 0x013D, 0x01A7, 0x0165, 0x003B, 0x0042, 0x00DA, 0x0192, 0x00CE, 0x00C1, 0x006B, 0x009F, 0x01F1, 0x012C, 0x0184, 0x00FA, 0x0196, 0x01E1, 0x0169, 0x017D, 0x0031, 0x0180, 0x010A, 0x0094, 0x01DA, 0x0186, 0x013E, 0x011C, 0x0060, 0x0175, 0x01CF, 0x0067, 0x0119, 0x0065, 0x0068, 0x0099, 0x0150, 0x0008, 0x0007, 0x017C, 0x00B7, 0x0024, 0x0019, 0x00DE, 0x0127, 0x00DB, 0x00E4, 0x01A9, 0x0052, 0x0109, 0x0090, 0x019C, 0x01C1, 0x0028, 0x01B3, 0x0135, 0x016A, 0x0176, 0x00DF, 0x01E5, 0x0188, 0x00C5, 0x016E, 0x01DE, 0x01B1, 0x00C3, 0x01DF, 0x0036, 0x00EE, 0x01EE, 0x00F0, 0x0093, 0x0049, 0x009A, 0x01B6, 0x0069, 0x0081, 0x0125, 0x000B, 0x005E, 0x00B4, 0x0149, 0x01C7, 0x0174, 0x003E, 0x013B, 0x01B7, 0x008E, 0x01C6, 0x00AE, 0x0010, 0x0095, 0x01EF, 0x004E, 0x00F2, 0x01FD, 0x0085, 0x00FD, 0x00F6, 0x00A0, 0x016F, 0x0083, 0x008A, 0x0156, 0x009B, 0x013C, 0x0107, 0x0167, 0x0098, 0x01D0, 0x01E9, 0x0003, 0x01FE, 0x00BD, 0x0122, 0x0089, 0x00D2, 0x018F, 0x0012, 0x0033, 0x006A, 0x0142, 0x00ED, 0x0170, 0x011B, 0x00E2, 0x014F, 0x0158, 0x0131, 0x0147, 0x005D, 0x0113, 0x01CD, 0x0079, 0x0161, 0x01A5, 0x0179, 0x009E, 0x01B4, 0x00CC, 0x0022, 0x0132, 0x001A, 0x00E8, 0x0004, 0x0187, 0x01ED, 0x0197, 0x0039, 0x01BF, 0x01D7, 0x0027, 0x018B, 0x00C6, 0x009C, 0x00D0, 0x014E, 0x006C, 0x0034, 0x01F2, 0x006E, 0x00CA, 0x0025, 0x00BA, 0x0191, 0x00FE, 0x0013, 0x0106, 0x002F, 0x01AD, 0x0172, 0x01DB, 0x00C0, 0x010B, 0x01D6, 0x00F5, 0x01EC, 0x010D, 0x0076, 0x0114, 0x01AB, 0x0075, 0x010C, 0x01E4, 0x0159, 0x0054, 0x011F, 0x004B, 0x00C4, 0x01BE, 0x00F7, 0x0029, 0x00A4, 0x000E, 0x01F0, 0x0077, 0x004D, 0x017A, 0x0086, 0x008B, 0x00B3, 0x0171, 0x00BF, 0x010E, 0x0104, 0x0097, 0x015B, 0x0160, 0x0168, 0x00D7, 0x00BB, 0x0066, 0x01CE, 0x00FC, 0x0092, 0x01C5, 0x006F, 0x0016, 0x004A, 0x00A1, 0x0139, 0x00AF, 0x00F1, 0x0190, 0x000A, 0x01AA, 0x0143, 0x017B, 0x0056, 0x018D, 0x0166, 0x00D4, 0x01FB, 0x014D, 0x0194, 0x019A, 0x0087, 0x01F8, 0x0123, 0x00A7, 0x01B8, 0x0141, 0x003C, 0x01F9, 0x0140, 0x002A, 0x0155, 0x011A, 0x01A1, 0x0198, 0x00D5, 0x0126, 0x01AF, 0x0061, 0x012E, 0x0157, 0x01DC, 0x0072, 0x018A, 0x00AA, 0x0096, 0x0115, 0x00EF, 0x0045, 0x007B, 0x008D, 0x0145, 0x0053, 0x005F, 0x0178, 0x00B2, 0x002E, 0x0020, 0x01D5, 0x003F, 0x01C9, 0x01E7, 0x01AC, 0x0044, 0x0038, 0x0014, 0x00B1, 0x016B, 0x00AB, 0x00B5, 0x005A, 0x0182, 0x01C8, 0x01D4, 0x0018, 0x0177, 0x0064, 0x00CF, 0x006D, 0x0100, 0x0199, 0x0130, 0x015A, 0x0005, 0x0120, 0x01BB, 0x01BD, 0x00E0, 0x004F, 0x00D6, 0x013F, 0x01C4, 0x012A, 0x0015, 0x0006, 0x00FF, 0x019B, 0x00A6, 0x0043, 0x0088, 0x0050, 0x015F, 0x01E8, 0x0121, 0x0073, 0x017E, 0x00BC, 0x00C2, 0x00C9, 0x0173, 0x0189, 0x01F5, 0x0074, 0x01CC, 0x01E6, 0x01A8, 0x0195, 0x001F, 0x0041, 0x000D, 0x01BA, 0x0032, 0x003D, 0x01D1, 0x0080, 0x00A8, 0x0057, 0x01B9, 0x0162, 0x0148, 0x00D9, 0x0105, 0x0062, 0x007A, 0x0021, 0x01FF, 0x0112, 0x0108, 0x01C0, 0x00A9, 0x011D, 0x01B0, 0x01A6, 0x00CD, 0x00F3, 0x005C, 0x0102, 0x005B, 0x01D9, 0x0144, 0x01F6, 0x00AD, 0x00A5, 0x003A, 0x01CB, 0x0136, 0x017F, 0x0046, 0x00E1, 0x001E, 0x01DD, 0x00E6, 0x0137, 0x01FA, 0x0185, 0x008C, 0x008F, 0x0040, 0x01B5, 0x00BE, 0x0078, 0x0000, 0x00AC, 0x0110, 0x015E, 0x0124, 0x0002, 0x01BC, 0x00A2, 0x00EA, 0x0070, 0x01FC, 0x0116, 0x015C, 0x004C, 0x01C2 }; /* * MISTY1 FI Function */ u16bit FI(u16bit input, u16bit key7, u16bit key9) { u16bit D9 = input >> 7, D7 = input & 0x7F; D9 = MISTY1_SBOX_S9[D9] ^ D7; D7 = (MISTY1_SBOX_S7[D7] ^ key7 ^ D9) & 0x7F; D9 = MISTY1_SBOX_S9[D9 ^ key9] ^ D7; return static_cast((D7 << 9) | D9); } } /* * MISTY1 Encryption */ void MISTY1::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u16bit B0 = load_be(in, 0); u16bit B1 = load_be(in, 1); u16bit B2 = load_be(in, 2); u16bit B3 = load_be(in, 3); for(size_t j = 0; j != 12; j += 3) { const u16bit* RK = &EK[8 * j]; B1 ^= B0 & RK[0]; B0 ^= B1 | RK[1]; B3 ^= B2 & RK[2]; B2 ^= B3 | RK[3]; u32bit T0, T1; T0 = FI(B0 ^ RK[ 4], RK[ 5], RK[ 6]) ^ B1; T1 = FI(B1 ^ RK[ 7], RK[ 8], RK[ 9]) ^ T0; T0 = FI(T0 ^ RK[10], RK[11], RK[12]) ^ T1; B2 ^= T1 ^ RK[13]; B3 ^= T0; T0 = FI(B2 ^ RK[14], RK[15], RK[16]) ^ B3; T1 = FI(B3 ^ RK[17], RK[18], RK[19]) ^ T0; T0 = FI(T0 ^ RK[20], RK[21], RK[22]) ^ T1; B0 ^= T1 ^ RK[23]; B1 ^= T0; } B1 ^= B0 & EK[96]; B0 ^= B1 | EK[97]; B3 ^= B2 & EK[98]; B2 ^= B3 | EK[99]; store_be(out, B2, B3, B0, B1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * MISTY1 Decryption */ void MISTY1::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u16bit B0 = load_be(in, 2); u16bit B1 = load_be(in, 3); u16bit B2 = load_be(in, 0); u16bit B3 = load_be(in, 1); for(size_t j = 0; j != 12; j += 3) { const u16bit* RK = &DK[8 * j]; B2 ^= B3 | RK[0]; B3 ^= B2 & RK[1]; B0 ^= B1 | RK[2]; B1 ^= B0 & RK[3]; u32bit T0, T1; T0 = FI(B2 ^ RK[ 4], RK[ 5], RK[ 6]) ^ B3; T1 = FI(B3 ^ RK[ 7], RK[ 8], RK[ 9]) ^ T0; T0 = FI(T0 ^ RK[10], RK[11], RK[12]) ^ T1; B0 ^= T1 ^ RK[13]; B1 ^= T0; T0 = FI(B0 ^ RK[14], RK[15], RK[16]) ^ B1; T1 = FI(B1 ^ RK[17], RK[18], RK[19]) ^ T0; T0 = FI(T0 ^ RK[20], RK[21], RK[22]) ^ T1; B2 ^= T1 ^ RK[23]; B3 ^= T0; } B2 ^= B3 | DK[96]; B3 ^= B2 & DK[97]; B0 ^= B1 | DK[98]; B1 ^= B0 & DK[99]; store_be(out, B0, B1, B2, B3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * MISTY1 Key Schedule */ void MISTY1::key_schedule(const byte key[], size_t length) { SecureVector KS(32); for(size_t i = 0; i != length / 2; ++i) KS[i] = load_be(key, i); for(size_t i = 0; i != 8; ++i) { KS[i+ 8] = FI(KS[i], KS[(i+1) % 8] >> 9, KS[(i+1) % 8] & 0x1FF); KS[i+16] = KS[i+8] >> 9; KS[i+24] = KS[i+8] & 0x1FF; } /* * Precomputed indexes for the orderings of the subkeys (MISTY1 reuses * values) */ static const byte EK_ORDER[100] = { 0x00, 0x0E, 0x0A, 0x04, 0x00, 0x15, 0x1D, 0x02, 0x11, 0x19, 0x07, 0x13, 0x1B, 0x04, 0x01, 0x16, 0x1E, 0x03, 0x12, 0x1A, 0x00, 0x14, 0x1C, 0x05, 0x01, 0x0F, 0x0B, 0x05, 0x02, 0x17, 0x1F, 0x04, 0x13, 0x1B, 0x01, 0x15, 0x1D, 0x06, 0x03, 0x10, 0x18, 0x05, 0x14, 0x1C, 0x02, 0x16, 0x1E, 0x07, 0x02, 0x08, 0x0C, 0x06, 0x04, 0x11, 0x19, 0x06, 0x15, 0x1D, 0x03, 0x17, 0x1F, 0x00, 0x05, 0x12, 0x1A, 0x07, 0x16, 0x1E, 0x04, 0x10, 0x18, 0x01, 0x03, 0x09, 0x0D, 0x07, 0x06, 0x13, 0x1B, 0x00, 0x17, 0x1F, 0x05, 0x11, 0x19, 0x02, 0x07, 0x14, 0x1C, 0x01, 0x10, 0x18, 0x06, 0x12, 0x1A, 0x03, 0x04, 0x0A, 0x0E, 0x00 }; static const byte DK_ORDER[100] = { 0x00, 0x0E, 0x0A, 0x04, 0x07, 0x14, 0x1C, 0x01, 0x10, 0x18, 0x06, 0x12, 0x1A, 0x03, 0x06, 0x13, 0x1B, 0x00, 0x17, 0x1F, 0x05, 0x11, 0x19, 0x02, 0x07, 0x0D, 0x09, 0x03, 0x05, 0x12, 0x1A, 0x07, 0x16, 0x1E, 0x04, 0x10, 0x18, 0x01, 0x04, 0x11, 0x19, 0x06, 0x15, 0x1D, 0x03, 0x17, 0x1F, 0x00, 0x06, 0x0C, 0x08, 0x02, 0x03, 0x10, 0x18, 0x05, 0x14, 0x1C, 0x02, 0x16, 0x1E, 0x07, 0x02, 0x17, 0x1F, 0x04, 0x13, 0x1B, 0x01, 0x15, 0x1D, 0x06, 0x05, 0x0B, 0x0F, 0x01, 0x01, 0x16, 0x1E, 0x03, 0x12, 0x1A, 0x00, 0x14, 0x1C, 0x05, 0x00, 0x15, 0x1D, 0x02, 0x11, 0x19, 0x07, 0x13, 0x1B, 0x04, 0x04, 0x0A, 0x0E, 0x00 }; for(size_t i = 0; i != 100; ++i) { EK[i] = KS[EK_ORDER[i]]; DK[i] = KS[DK_ORDER[i]]; } } /* * MISTY1 Constructor */ MISTY1::MISTY1(size_t rounds) : EK(100), DK(100) { if(rounds != 8) throw Invalid_Argument("MISTY1: Invalid number of rounds: " + to_string(rounds)); } } Botan-1.10.12/src/block/misty1/misty1.h0000664000175000017500000000153112654331322017272 0ustar jackjack00000000000000/* * MISTY1 * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MISTY1_H__ #define BOTAN_MISTY1_H__ #include namespace Botan { /** * MISTY1 */ class BOTAN_DLL MISTY1 : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); zeroise(DK); } std::string name() const { return "MISTY1"; } BlockCipher* clone() const { return new MISTY1; } /** * @param rounds the number of rounds. Must be 8 with the current * implementation */ MISTY1(size_t rounds = 8); private: void key_schedule(const byte[], size_t); SecureVector EK, DK; }; } #endif Botan-1.10.12/src/block/noekeon/info.txt0000664000175000017500000000001712654331322017575 0ustar jackjack00000000000000define NOEKEON Botan-1.10.12/src/block/noekeon/noekeon.cpp0000664000175000017500000000750212654331322020251 0ustar jackjack00000000000000/* * Noekeon * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * Noekeon's Theta Operation */ inline void theta(u32bit& A0, u32bit& A1, u32bit& A2, u32bit& A3, const u32bit EK[4]) { u32bit T = A0 ^ A2; T ^= rotate_left(T, 8) ^ rotate_right(T, 8); A1 ^= T; A3 ^= T; A0 ^= EK[0]; A1 ^= EK[1]; A2 ^= EK[2]; A3 ^= EK[3]; T = A1 ^ A3; T ^= rotate_left(T, 8) ^ rotate_right(T, 8); A0 ^= T; A2 ^= T; } /* * Theta With Null Key */ inline void theta(u32bit& A0, u32bit& A1, u32bit& A2, u32bit& A3) { u32bit T = A0 ^ A2; T ^= rotate_left(T, 8) ^ rotate_right(T, 8); A1 ^= T; A3 ^= T; T = A1 ^ A3; T ^= rotate_left(T, 8) ^ rotate_right(T, 8); A0 ^= T; A2 ^= T; } /* * Noekeon's Gamma S-Box Layer */ inline void gamma(u32bit& A0, u32bit& A1, u32bit& A2, u32bit& A3) { A1 ^= ~A3 & ~A2; A0 ^= A2 & A1; u32bit T = A3; A3 = A0; A0 = T; A2 ^= A0 ^ A1 ^ A3; A1 ^= ~A3 & ~A2; A0 ^= A2 & A1; } } /* * Noekeon Round Constants */ const byte Noekeon::RC[] = { 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A, 0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A, 0xD4 }; /* * Noekeon Encryption */ void Noekeon::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A0 = load_be(in, 0); u32bit A1 = load_be(in, 1); u32bit A2 = load_be(in, 2); u32bit A3 = load_be(in, 3); for(size_t j = 0; j != 16; ++j) { A0 ^= RC[j]; theta(A0, A1, A2, A3, &EK[0]); A1 = rotate_left(A1, 1); A2 = rotate_left(A2, 5); A3 = rotate_left(A3, 2); gamma(A0, A1, A2, A3); A1 = rotate_right(A1, 1); A2 = rotate_right(A2, 5); A3 = rotate_right(A3, 2); } A0 ^= RC[16]; theta(A0, A1, A2, A3, &EK[0]); store_be(out, A0, A1, A2, A3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Noekeon Encryption */ void Noekeon::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A0 = load_be(in, 0); u32bit A1 = load_be(in, 1); u32bit A2 = load_be(in, 2); u32bit A3 = load_be(in, 3); for(size_t j = 16; j != 0; --j) { theta(A0, A1, A2, A3, &DK[0]); A0 ^= RC[j]; A1 = rotate_left(A1, 1); A2 = rotate_left(A2, 5); A3 = rotate_left(A3, 2); gamma(A0, A1, A2, A3); A1 = rotate_right(A1, 1); A2 = rotate_right(A2, 5); A3 = rotate_right(A3, 2); } theta(A0, A1, A2, A3, &DK[0]); A0 ^= RC[0]; store_be(out, A0, A1, A2, A3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Noekeon Key Schedule */ void Noekeon::key_schedule(const byte key[], size_t) { u32bit A0 = load_be(key, 0); u32bit A1 = load_be(key, 1); u32bit A2 = load_be(key, 2); u32bit A3 = load_be(key, 3); for(size_t i = 0; i != 16; ++i) { A0 ^= RC[i]; theta(A0, A1, A2, A3); A1 = rotate_left(A1, 1); A2 = rotate_left(A2, 5); A3 = rotate_left(A3, 2); gamma(A0, A1, A2, A3); A1 = rotate_right(A1, 1); A2 = rotate_right(A2, 5); A3 = rotate_right(A3, 2); } A0 ^= RC[16]; DK[0] = A0; DK[1] = A1; DK[2] = A2; DK[3] = A3; theta(A0, A1, A2, A3); EK[0] = A0; EK[1] = A1; EK[2] = A2; EK[3] = A3; } /* * Clear memory of sensitive data */ void Noekeon::clear() { zeroise(EK); zeroise(DK); } } Botan-1.10.12/src/block/noekeon/noekeon.h0000664000175000017500000000211512654331322017711 0ustar jackjack00000000000000/* * Noekeon * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_NOEKEON_H__ #define BOTAN_NOEKEON_H__ #include namespace Botan { /** * Noekeon */ class BOTAN_DLL Noekeon : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "Noekeon"; } BlockCipher* clone() const { return new Noekeon; } Noekeon() : EK(4), DK(4) {} protected: /** * The Noekeon round constants */ static const byte RC[17]; /** * @return const reference to encryption subkeys */ const SecureVector& get_EK() const { return EK; } /** * @return const reference to decryption subkeys */ const SecureVector& get_DK() const { return DK; } private: void key_schedule(const byte[], size_t); SecureVector EK, DK; }; } #endif Botan-1.10.12/src/block/noekeon_simd/info.txt0000664000175000017500000000010512654331322020607 0ustar jackjack00000000000000define NOEKEON_SIMD noekeon simd simd_engine Botan-1.10.12/src/block/noekeon_simd/noekeon_simd.cpp0000664000175000017500000001242612654331322022302 0ustar jackjack00000000000000/* * Noekeon in SIMD * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Noekeon's Theta Operation */ #define NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3) \ do { \ SIMD_32 T = A0 ^ A2; \ SIMD_32 T_l8 = T; \ SIMD_32 T_r8 = T; \ T_l8.rotate_left(8); \ T_r8.rotate_right(8); \ T ^= T_l8; \ T ^= T_r8; \ A1 ^= T; \ A3 ^= T; \ \ A0 ^= K0; \ A1 ^= K1; \ A2 ^= K2; \ A3 ^= K3; \ \ T = A1 ^ A3; \ T_l8 = T; \ T_r8 = T; \ T_l8.rotate_left(8); \ T_r8.rotate_right(8); \ T ^= T_l8; \ T ^= T_r8; \ A0 ^= T; \ A2 ^= T; \ } while(0) /* * Noekeon's Gamma S-Box Layer */ #define NOK_SIMD_GAMMA(A0, A1, A2, A3) \ do \ { \ A1 ^= A3.andc(~A2); \ A0 ^= A2 & A1; \ \ SIMD_32 T = A3; \ A3 = A0; \ A0 = T; \ \ A2 ^= A0 ^ A1 ^ A3; \ \ A1 ^= A3.andc(~A2); \ A0 ^= A2 & A1; \ } while(0) /* * Noekeon Encryption */ void Noekeon_SIMD::encrypt_n(const byte in[], byte out[], size_t blocks) const { const SecureVector& EK = this->get_EK(); SIMD_32 K0 = SIMD_32(EK[0]); SIMD_32 K1 = SIMD_32(EK[1]); SIMD_32 K2 = SIMD_32(EK[2]); SIMD_32 K3 = SIMD_32(EK[3]); while(blocks >= 4) { SIMD_32 A0 = SIMD_32::load_be(in ); SIMD_32 A1 = SIMD_32::load_be(in + 16); SIMD_32 A2 = SIMD_32::load_be(in + 32); SIMD_32 A3 = SIMD_32::load_be(in + 48); SIMD_32::transpose(A0, A1, A2, A3); for(size_t i = 0; i != 16; ++i) { A0 ^= SIMD_32(RC[i]); NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3); A1.rotate_left(1); A2.rotate_left(5); A3.rotate_left(2); NOK_SIMD_GAMMA(A0, A1, A2, A3); A1.rotate_right(1); A2.rotate_right(5); A3.rotate_right(2); } A0 ^= SIMD_32(RC[16]); NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3); SIMD_32::transpose(A0, A1, A2, A3); A0.store_be(out); A1.store_be(out + 16); A2.store_be(out + 32); A3.store_be(out + 48); in += 64; out += 64; blocks -= 4; } if(blocks) Noekeon::encrypt_n(in, out, blocks); } /* * Noekeon Encryption */ void Noekeon_SIMD::decrypt_n(const byte in[], byte out[], size_t blocks) const { const SecureVector& DK = this->get_DK(); SIMD_32 K0 = SIMD_32(DK[0]); SIMD_32 K1 = SIMD_32(DK[1]); SIMD_32 K2 = SIMD_32(DK[2]); SIMD_32 K3 = SIMD_32(DK[3]); while(blocks >= 4) { SIMD_32 A0 = SIMD_32::load_be(in ); SIMD_32 A1 = SIMD_32::load_be(in + 16); SIMD_32 A2 = SIMD_32::load_be(in + 32); SIMD_32 A3 = SIMD_32::load_be(in + 48); SIMD_32::transpose(A0, A1, A2, A3); for(size_t i = 0; i != 16; ++i) { NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3); A0 ^= SIMD_32(RC[16-i]); A1.rotate_left(1); A2.rotate_left(5); A3.rotate_left(2); NOK_SIMD_GAMMA(A0, A1, A2, A3); A1.rotate_right(1); A2.rotate_right(5); A3.rotate_right(2); } NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3); A0 ^= SIMD_32(RC[0]); SIMD_32::transpose(A0, A1, A2, A3); A0.store_be(out); A1.store_be(out + 16); A2.store_be(out + 32); A3.store_be(out + 48); in += 64; out += 64; blocks -= 4; } if(blocks) Noekeon::decrypt_n(in, out, blocks); } } Botan-1.10.12/src/block/noekeon_simd/noekeon_simd.h0000664000175000017500000000112612654331322021742 0ustar jackjack00000000000000/* * Noekeon in SIMD * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_NOEKEON_SIMD_H__ #define BOTAN_NOEKEON_SIMD_H__ #include namespace Botan { /** * Noekeon implementation using SIMD operations */ class BOTAN_DLL Noekeon_SIMD : public Noekeon { public: size_t parallelism() const { return 4; } void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; BlockCipher* clone() const { return new Noekeon_SIMD; } }; } #endif Botan-1.10.12/src/block/rc2/info.txt0000664000175000017500000000001312654331322016621 0ustar jackjack00000000000000define RC2 Botan-1.10.12/src/block/rc2/rc2.cpp0000664000175000017500000001413712654331322016333 0ustar jackjack00000000000000/* * RC2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * RC2 Encryption */ void RC2::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u16bit R0 = load_le(in, 0); u16bit R1 = load_le(in, 1); u16bit R2 = load_le(in, 2); u16bit R3 = load_le(in, 3); for(size_t j = 0; j != 16; ++j) { R0 += (R1 & ~R3) + (R2 & R3) + K[4*j]; R0 = rotate_left(R0, 1); R1 += (R2 & ~R0) + (R3 & R0) + K[4*j + 1]; R1 = rotate_left(R1, 2); R2 += (R3 & ~R1) + (R0 & R1) + K[4*j + 2]; R2 = rotate_left(R2, 3); R3 += (R0 & ~R2) + (R1 & R2) + K[4*j + 3]; R3 = rotate_left(R3, 5); if(j == 4 || j == 10) { R0 += K[R3 % 64]; R1 += K[R0 % 64]; R2 += K[R1 % 64]; R3 += K[R2 % 64]; } } store_le(out, R0, R1, R2, R3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * RC2 Decryption */ void RC2::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u16bit R0 = load_le(in, 0); u16bit R1 = load_le(in, 1); u16bit R2 = load_le(in, 2); u16bit R3 = load_le(in, 3); for(size_t j = 0; j != 16; ++j) { R3 = rotate_right(R3, 5); R3 -= (R0 & ~R2) + (R1 & R2) + K[63 - (4*j + 0)]; R2 = rotate_right(R2, 3); R2 -= (R3 & ~R1) + (R0 & R1) + K[63 - (4*j + 1)]; R1 = rotate_right(R1, 2); R1 -= (R2 & ~R0) + (R3 & R0) + K[63 - (4*j + 2)]; R0 = rotate_right(R0, 1); R0 -= (R1 & ~R3) + (R2 & R3) + K[63 - (4*j + 3)]; if(j == 4 || j == 10) { R3 -= K[R2 % 64]; R2 -= K[R1 % 64]; R1 -= K[R0 % 64]; R0 -= K[R3 % 64]; } } store_le(out, R0, R1, R2, R3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * RC2 Key Schedule */ void RC2::key_schedule(const byte key[], size_t length) { static const byte TABLE[256] = { 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD }; SecureVector L(128); L.copy(key, length); for(size_t i = length; i != 128; ++i) L[i] = TABLE[(L[i-1] + L[i-length]) % 256]; L[128-length] = TABLE[L[128-length]]; for(s32bit i = 127-length; i >= 0; --i) L[i] = TABLE[L[i+1] ^ L[i+length]]; load_le(&K[0], &L[0], 64); } /* * Return the code of the effective key bits */ byte RC2::EKB_code(size_t ekb) { const byte EKB[256] = { 0xBD, 0x56, 0xEA, 0xF2, 0xA2, 0xF1, 0xAC, 0x2A, 0xB0, 0x93, 0xD1, 0x9C, 0x1B, 0x33, 0xFD, 0xD0, 0x30, 0x04, 0xB6, 0xDC, 0x7D, 0xDF, 0x32, 0x4B, 0xF7, 0xCB, 0x45, 0x9B, 0x31, 0xBB, 0x21, 0x5A, 0x41, 0x9F, 0xE1, 0xD9, 0x4A, 0x4D, 0x9E, 0xDA, 0xA0, 0x68, 0x2C, 0xC3, 0x27, 0x5F, 0x80, 0x36, 0x3E, 0xEE, 0xFB, 0x95, 0x1A, 0xFE, 0xCE, 0xA8, 0x34, 0xA9, 0x13, 0xF0, 0xA6, 0x3F, 0xD8, 0x0C, 0x78, 0x24, 0xAF, 0x23, 0x52, 0xC1, 0x67, 0x17, 0xF5, 0x66, 0x90, 0xE7, 0xE8, 0x07, 0xB8, 0x60, 0x48, 0xE6, 0x1E, 0x53, 0xF3, 0x92, 0xA4, 0x72, 0x8C, 0x08, 0x15, 0x6E, 0x86, 0x00, 0x84, 0xFA, 0xF4, 0x7F, 0x8A, 0x42, 0x19, 0xF6, 0xDB, 0xCD, 0x14, 0x8D, 0x50, 0x12, 0xBA, 0x3C, 0x06, 0x4E, 0xEC, 0xB3, 0x35, 0x11, 0xA1, 0x88, 0x8E, 0x2B, 0x94, 0x99, 0xB7, 0x71, 0x74, 0xD3, 0xE4, 0xBF, 0x3A, 0xDE, 0x96, 0x0E, 0xBC, 0x0A, 0xED, 0x77, 0xFC, 0x37, 0x6B, 0x03, 0x79, 0x89, 0x62, 0xC6, 0xD7, 0xC0, 0xD2, 0x7C, 0x6A, 0x8B, 0x22, 0xA3, 0x5B, 0x05, 0x5D, 0x02, 0x75, 0xD5, 0x61, 0xE3, 0x18, 0x8F, 0x55, 0x51, 0xAD, 0x1F, 0x0B, 0x5E, 0x85, 0xE5, 0xC2, 0x57, 0x63, 0xCA, 0x3D, 0x6C, 0xB4, 0xC5, 0xCC, 0x70, 0xB2, 0x91, 0x59, 0x0D, 0x47, 0x20, 0xC8, 0x4F, 0x58, 0xE0, 0x01, 0xE2, 0x16, 0x38, 0xC4, 0x6F, 0x3B, 0x0F, 0x65, 0x46, 0xBE, 0x7E, 0x2D, 0x7B, 0x82, 0xF9, 0x40, 0xB5, 0x1D, 0x73, 0xF8, 0xEB, 0x26, 0xC7, 0x87, 0x97, 0x25, 0x54, 0xB1, 0x28, 0xAA, 0x98, 0x9D, 0xA5, 0x64, 0x6D, 0x7A, 0xD4, 0x10, 0x81, 0x44, 0xEF, 0x49, 0xD6, 0xAE, 0x2E, 0xDD, 0x76, 0x5C, 0x2F, 0xA7, 0x1C, 0xC9, 0x09, 0x69, 0x9A, 0x83, 0xCF, 0x29, 0x39, 0xB9, 0xE9, 0x4C, 0xFF, 0x43, 0xAB }; if(ekb < 256) return EKB[ekb]; else throw Encoding_Error("RC2::EKB_code: EKB is too large"); } } Botan-1.10.12/src/block/rc2/rc2.h0000664000175000017500000000154012654331322015772 0ustar jackjack00000000000000/* * RC2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RC2_H__ #define BOTAN_RC2_H__ #include namespace Botan { /** * RC2 */ class BOTAN_DLL RC2 : public Block_Cipher_Fixed_Params<8, 1, 32> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; /** * Return the code of the effective key bits * @param bits key length * @return EKB code */ static byte EKB_code(size_t bits); void clear() { zeroise(K); } std::string name() const { return "RC2"; } BlockCipher* clone() const { return new RC2; } RC2() : K(64) {} private: void key_schedule(const byte[], size_t); SecureVector K; }; } #endif Botan-1.10.12/src/block/rc5/info.txt0000664000175000017500000000001312654331322016624 0ustar jackjack00000000000000define RC5 Botan-1.10.12/src/block/rc5/rc5.cpp0000664000175000017500000000602012654331322016331 0ustar jackjack00000000000000/* * RC5 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * RC5 Encryption */ void RC5::encrypt_n(const byte in[], byte out[], size_t blocks) const { const size_t rounds = (S.size() - 2) / 2; for(size_t i = 0; i != blocks; ++i) { u32bit A = load_le(in, 0); u32bit B = load_le(in, 1); A += S[0]; B += S[1]; for(size_t j = 0; j != rounds; j += 4) { A = rotate_left(A ^ B, B % 32) + S[2*j+2]; B = rotate_left(B ^ A, A % 32) + S[2*j+3]; A = rotate_left(A ^ B, B % 32) + S[2*j+4]; B = rotate_left(B ^ A, A % 32) + S[2*j+5]; A = rotate_left(A ^ B, B % 32) + S[2*j+6]; B = rotate_left(B ^ A, A % 32) + S[2*j+7]; A = rotate_left(A ^ B, B % 32) + S[2*j+8]; B = rotate_left(B ^ A, A % 32) + S[2*j+9]; } store_le(out, A, B); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * RC5 Decryption */ void RC5::decrypt_n(const byte in[], byte out[], size_t blocks) const { const size_t rounds = (S.size() - 2) / 2; for(size_t i = 0; i != blocks; ++i) { u32bit A = load_le(in, 0); u32bit B = load_le(in, 1); for(size_t j = rounds; j != 0; j -= 4) { B = rotate_right(B - S[2*j+1], A % 32) ^ A; A = rotate_right(A - S[2*j ], B % 32) ^ B; B = rotate_right(B - S[2*j-1], A % 32) ^ A; A = rotate_right(A - S[2*j-2], B % 32) ^ B; B = rotate_right(B - S[2*j-3], A % 32) ^ A; A = rotate_right(A - S[2*j-4], B % 32) ^ B; B = rotate_right(B - S[2*j-5], A % 32) ^ A; A = rotate_right(A - S[2*j-6], B % 32) ^ B; } B -= S[1]; A -= S[0]; store_le(out, A, B); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * RC5 Key Schedule */ void RC5::key_schedule(const byte key[], size_t length) { const size_t WORD_KEYLENGTH = (((length - 1) / 4) + 1); const size_t MIX_ROUNDS = 3 * std::max(WORD_KEYLENGTH, S.size()); S[0] = 0xB7E15163; for(size_t i = 1; i != S.size(); ++i) S[i] = S[i-1] + 0x9E3779B9; SecureVector K(8); for(s32bit i = length-1; i >= 0; --i) K[i/4] = (K[i/4] << 8) + key[i]; u32bit A = 0, B = 0; for(size_t i = 0; i != MIX_ROUNDS; ++i) { A = rotate_left(S[i % S.size()] + A + B, 3); B = rotate_left(K[i % WORD_KEYLENGTH] + A + B, (A + B) % 32); S[i % S.size()] = A; K[i % WORD_KEYLENGTH] = B; } } /* * Return the name of this type */ std::string RC5::name() const { return "RC5(" + to_string(get_rounds()) + ")"; } /* * RC5 Constructor */ RC5::RC5(size_t rounds) { if(rounds < 8 || rounds > 32 || (rounds % 4 != 0)) throw Invalid_Argument("RC5: Invalid number of rounds " + to_string(rounds)); S.resize(2*rounds + 2); } } Botan-1.10.12/src/block/rc5/rc5.h0000664000175000017500000000157112654331322016004 0ustar jackjack00000000000000/* * RC5 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RC5_H__ #define BOTAN_RC5_H__ #include namespace Botan { /** * RC5 */ class BOTAN_DLL RC5 : public Block_Cipher_Fixed_Params<8, 1, 32> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(S); } std::string name() const; BlockCipher* clone() const { return new RC5(get_rounds()); } /** * @param rounds the number of RC5 rounds to run. Must be between * 8 and 32 and a multiple of 4. */ RC5(size_t rounds); private: size_t get_rounds() const { return (S.size() - 2) / 2; } void key_schedule(const byte[], size_t); SecureVector S; }; } #endif Botan-1.10.12/src/block/rc6/info.txt0000664000175000017500000000001312654331322016625 0ustar jackjack00000000000000define RC6 Botan-1.10.12/src/block/rc6/rc6.cpp0000664000175000017500000000677412654331322016353 0ustar jackjack00000000000000/* * RC6 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * RC6 Encryption */ void RC6::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A = load_le(in, 0); u32bit B = load_le(in, 1); u32bit C = load_le(in, 2); u32bit D = load_le(in, 3); B += S[0]; D += S[1]; for(size_t j = 0; j != 20; j += 4) { u32bit T1, T2; T1 = rotate_left(B*(2*B+1), 5); T2 = rotate_left(D*(2*D+1), 5); A = rotate_left(A ^ T1, T2 % 32) + S[2*j+2]; C = rotate_left(C ^ T2, T1 % 32) + S[2*j+3]; T1 = rotate_left(C*(2*C+1), 5); T2 = rotate_left(A*(2*A+1), 5); B = rotate_left(B ^ T1, T2 % 32) + S[2*j+4]; D = rotate_left(D ^ T2, T1 % 32) + S[2*j+5]; T1 = rotate_left(D*(2*D+1), 5); T2 = rotate_left(B*(2*B+1), 5); C = rotate_left(C ^ T1, T2 % 32) + S[2*j+6]; A = rotate_left(A ^ T2, T1 % 32) + S[2*j+7]; T1 = rotate_left(A*(2*A+1), 5); T2 = rotate_left(C*(2*C+1), 5); D = rotate_left(D ^ T1, T2 % 32) + S[2*j+8]; B = rotate_left(B ^ T2, T1 % 32) + S[2*j+9]; } A += S[42]; C += S[43]; store_le(out, A, B, C, D); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * RC6 Decryption */ void RC6::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A = load_le(in, 0); u32bit B = load_le(in, 1); u32bit C = load_le(in, 2); u32bit D = load_le(in, 3); C -= S[43]; A -= S[42]; for(size_t j = 0; j != 20; j += 4) { u32bit T1, T2; T1 = rotate_left(A*(2*A+1), 5); T2 = rotate_left(C*(2*C+1), 5); B = rotate_right(B - S[41 - 2*j], T1 % 32) ^ T2; D = rotate_right(D - S[40 - 2*j], T2 % 32) ^ T1; T1 = rotate_left(D*(2*D+1), 5); T2 = rotate_left(B*(2*B+1), 5); A = rotate_right(A - S[39 - 2*j], T1 % 32) ^ T2; C = rotate_right(C - S[38 - 2*j], T2 % 32) ^ T1; T1 = rotate_left(C*(2*C+1), 5); T2 = rotate_left(A*(2*A+1), 5); D = rotate_right(D - S[37 - 2*j], T1 % 32) ^ T2; B = rotate_right(B - S[36 - 2*j], T2 % 32) ^ T1; T1 = rotate_left(B*(2*B+1), 5); T2 = rotate_left(D*(2*D+1), 5); C = rotate_right(C - S[35 - 2*j], T1 % 32) ^ T2; A = rotate_right(A - S[34 - 2*j], T2 % 32) ^ T1; } D -= S[1]; B -= S[0]; store_le(out, A, B, C, D); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * RC6 Key Schedule */ void RC6::key_schedule(const byte key[], size_t length) { const size_t WORD_KEYLENGTH = (((length - 1) / 4) + 1); const size_t MIX_ROUNDS = 3 * std::max(WORD_KEYLENGTH, S.size()); S[0] = 0xB7E15163; for(size_t i = 1; i != S.size(); ++i) S[i] = S[i-1] + 0x9E3779B9; SecureVector K(8); for(s32bit i = length-1; i >= 0; --i) K[i/4] = (K[i/4] << 8) + key[i]; u32bit A = 0, B = 0; for(size_t i = 0; i != MIX_ROUNDS; ++i) { A = rotate_left(S[i % S.size()] + A + B, 3); B = rotate_left(K[i % WORD_KEYLENGTH] + A + B, (A + B) % 32); S[i % S.size()] = A; K[i % WORD_KEYLENGTH] = B; } } } Botan-1.10.12/src/block/rc6/rc6.h0000664000175000017500000000132612654331322016004 0ustar jackjack00000000000000/* * RC6 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RC6_H__ #define BOTAN_RC6_H__ #include namespace Botan { /** * RC6, Ron Rivest's AES candidate */ class BOTAN_DLL RC6 : public Block_Cipher_Fixed_Params<16, 1, 32> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(S); } std::string name() const { return "RC6"; } BlockCipher* clone() const { return new RC6; } RC6() : S(44) {} private: void key_schedule(const byte[], size_t); SecureVector S; }; } #endif Botan-1.10.12/src/block/safer/info.txt0000664000175000017500000000001512654331322017235 0ustar jackjack00000000000000define SAFER Botan-1.10.12/src/block/safer/safer_sk.cpp0000664000175000017500000002653012654331322020054 0ustar jackjack00000000000000/* * SAFER-SK * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { const byte EXP[256] = { 0x01, 0x2D, 0xE2, 0x93, 0xBE, 0x45, 0x15, 0xAE, 0x78, 0x03, 0x87, 0xA4, 0xB8, 0x38, 0xCF, 0x3F, 0x08, 0x67, 0x09, 0x94, 0xEB, 0x26, 0xA8, 0x6B, 0xBD, 0x18, 0x34, 0x1B, 0xBB, 0xBF, 0x72, 0xF7, 0x40, 0x35, 0x48, 0x9C, 0x51, 0x2F, 0x3B, 0x55, 0xE3, 0xC0, 0x9F, 0xD8, 0xD3, 0xF3, 0x8D, 0xB1, 0xFF, 0xA7, 0x3E, 0xDC, 0x86, 0x77, 0xD7, 0xA6, 0x11, 0xFB, 0xF4, 0xBA, 0x92, 0x91, 0x64, 0x83, 0xF1, 0x33, 0xEF, 0xDA, 0x2C, 0xB5, 0xB2, 0x2B, 0x88, 0xD1, 0x99, 0xCB, 0x8C, 0x84, 0x1D, 0x14, 0x81, 0x97, 0x71, 0xCA, 0x5F, 0xA3, 0x8B, 0x57, 0x3C, 0x82, 0xC4, 0x52, 0x5C, 0x1C, 0xE8, 0xA0, 0x04, 0xB4, 0x85, 0x4A, 0xF6, 0x13, 0x54, 0xB6, 0xDF, 0x0C, 0x1A, 0x8E, 0xDE, 0xE0, 0x39, 0xFC, 0x20, 0x9B, 0x24, 0x4E, 0xA9, 0x98, 0x9E, 0xAB, 0xF2, 0x60, 0xD0, 0x6C, 0xEA, 0xFA, 0xC7, 0xD9, 0x00, 0xD4, 0x1F, 0x6E, 0x43, 0xBC, 0xEC, 0x53, 0x89, 0xFE, 0x7A, 0x5D, 0x49, 0xC9, 0x32, 0xC2, 0xF9, 0x9A, 0xF8, 0x6D, 0x16, 0xDB, 0x59, 0x96, 0x44, 0xE9, 0xCD, 0xE6, 0x46, 0x42, 0x8F, 0x0A, 0xC1, 0xCC, 0xB9, 0x65, 0xB0, 0xD2, 0xC6, 0xAC, 0x1E, 0x41, 0x62, 0x29, 0x2E, 0x0E, 0x74, 0x50, 0x02, 0x5A, 0xC3, 0x25, 0x7B, 0x8A, 0x2A, 0x5B, 0xF0, 0x06, 0x0D, 0x47, 0x6F, 0x70, 0x9D, 0x7E, 0x10, 0xCE, 0x12, 0x27, 0xD5, 0x4C, 0x4F, 0xD6, 0x79, 0x30, 0x68, 0x36, 0x75, 0x7D, 0xE4, 0xED, 0x80, 0x6A, 0x90, 0x37, 0xA2, 0x5E, 0x76, 0xAA, 0xC5, 0x7F, 0x3D, 0xAF, 0xA5, 0xE5, 0x19, 0x61, 0xFD, 0x4D, 0x7C, 0xB7, 0x0B, 0xEE, 0xAD, 0x4B, 0x22, 0xF5, 0xE7, 0x73, 0x23, 0x21, 0xC8, 0x05, 0xE1, 0x66, 0xDD, 0xB3, 0x58, 0x69, 0x63, 0x56, 0x0F, 0xA1, 0x31, 0x95, 0x17, 0x07, 0x3A, 0x28 }; const byte LOG[512] = { 0x80, 0x00, 0xB0, 0x09, 0x60, 0xEF, 0xB9, 0xFD, 0x10, 0x12, 0x9F, 0xE4, 0x69, 0xBA, 0xAD, 0xF8, 0xC0, 0x38, 0xC2, 0x65, 0x4F, 0x06, 0x94, 0xFC, 0x19, 0xDE, 0x6A, 0x1B, 0x5D, 0x4E, 0xA8, 0x82, 0x70, 0xED, 0xE8, 0xEC, 0x72, 0xB3, 0x15, 0xC3, 0xFF, 0xAB, 0xB6, 0x47, 0x44, 0x01, 0xAC, 0x25, 0xC9, 0xFA, 0x8E, 0x41, 0x1A, 0x21, 0xCB, 0xD3, 0x0D, 0x6E, 0xFE, 0x26, 0x58, 0xDA, 0x32, 0x0F, 0x20, 0xA9, 0x9D, 0x84, 0x98, 0x05, 0x9C, 0xBB, 0x22, 0x8C, 0x63, 0xE7, 0xC5, 0xE1, 0x73, 0xC6, 0xAF, 0x24, 0x5B, 0x87, 0x66, 0x27, 0xF7, 0x57, 0xF4, 0x96, 0xB1, 0xB7, 0x5C, 0x8B, 0xD5, 0x54, 0x79, 0xDF, 0xAA, 0xF6, 0x3E, 0xA3, 0xF1, 0x11, 0xCA, 0xF5, 0xD1, 0x17, 0x7B, 0x93, 0x83, 0xBC, 0xBD, 0x52, 0x1E, 0xEB, 0xAE, 0xCC, 0xD6, 0x35, 0x08, 0xC8, 0x8A, 0xB4, 0xE2, 0xCD, 0xBF, 0xD9, 0xD0, 0x50, 0x59, 0x3F, 0x4D, 0x62, 0x34, 0x0A, 0x48, 0x88, 0xB5, 0x56, 0x4C, 0x2E, 0x6B, 0x9E, 0xD2, 0x3D, 0x3C, 0x03, 0x13, 0xFB, 0x97, 0x51, 0x75, 0x4A, 0x91, 0x71, 0x23, 0xBE, 0x76, 0x2A, 0x5F, 0xF9, 0xD4, 0x55, 0x0B, 0xDC, 0x37, 0x31, 0x16, 0x74, 0xD7, 0x77, 0xA7, 0xE6, 0x07, 0xDB, 0xA4, 0x2F, 0x46, 0xF3, 0x61, 0x45, 0x67, 0xE3, 0x0C, 0xA2, 0x3B, 0x1C, 0x85, 0x18, 0x04, 0x1D, 0x29, 0xA0, 0x8F, 0xB2, 0x5A, 0xD8, 0xA6, 0x7E, 0xEE, 0x8D, 0x53, 0x4B, 0xA1, 0x9A, 0xC1, 0x0E, 0x7A, 0x49, 0xA5, 0x2C, 0x81, 0xC4, 0xC7, 0x36, 0x2B, 0x7F, 0x43, 0x95, 0x33, 0xF2, 0x6C, 0x68, 0x6D, 0xF0, 0x02, 0x28, 0xCE, 0xDD, 0x9B, 0xEA, 0x5E, 0x99, 0x7C, 0x14, 0x86, 0xCF, 0xE5, 0x42, 0xB8, 0x40, 0x78, 0x2D, 0x3A, 0xE9, 0x64, 0x1F, 0x92, 0x90, 0x7D, 0x39, 0x6F, 0xE0, 0x89, 0x30, 0x80, 0x00, 0xB0, 0x09, 0x60, 0xEF, 0xB9, 0xFD, 0x10, 0x12, 0x9F, 0xE4, 0x69, 0xBA, 0xAD, 0xF8, 0xC0, 0x38, 0xC2, 0x65, 0x4F, 0x06, 0x94, 0xFC, 0x19, 0xDE, 0x6A, 0x1B, 0x5D, 0x4E, 0xA8, 0x82, 0x70, 0xED, 0xE8, 0xEC, 0x72, 0xB3, 0x15, 0xC3, 0xFF, 0xAB, 0xB6, 0x47, 0x44, 0x01, 0xAC, 0x25, 0xC9, 0xFA, 0x8E, 0x41, 0x1A, 0x21, 0xCB, 0xD3, 0x0D, 0x6E, 0xFE, 0x26, 0x58, 0xDA, 0x32, 0x0F, 0x20, 0xA9, 0x9D, 0x84, 0x98, 0x05, 0x9C, 0xBB, 0x22, 0x8C, 0x63, 0xE7, 0xC5, 0xE1, 0x73, 0xC6, 0xAF, 0x24, 0x5B, 0x87, 0x66, 0x27, 0xF7, 0x57, 0xF4, 0x96, 0xB1, 0xB7, 0x5C, 0x8B, 0xD5, 0x54, 0x79, 0xDF, 0xAA, 0xF6, 0x3E, 0xA3, 0xF1, 0x11, 0xCA, 0xF5, 0xD1, 0x17, 0x7B, 0x93, 0x83, 0xBC, 0xBD, 0x52, 0x1E, 0xEB, 0xAE, 0xCC, 0xD6, 0x35, 0x08, 0xC8, 0x8A, 0xB4, 0xE2, 0xCD, 0xBF, 0xD9, 0xD0, 0x50, 0x59, 0x3F, 0x4D, 0x62, 0x34, 0x0A, 0x48, 0x88, 0xB5, 0x56, 0x4C, 0x2E, 0x6B, 0x9E, 0xD2, 0x3D, 0x3C, 0x03, 0x13, 0xFB, 0x97, 0x51, 0x75, 0x4A, 0x91, 0x71, 0x23, 0xBE, 0x76, 0x2A, 0x5F, 0xF9, 0xD4, 0x55, 0x0B, 0xDC, 0x37, 0x31, 0x16, 0x74, 0xD7, 0x77, 0xA7, 0xE6, 0x07, 0xDB, 0xA4, 0x2F, 0x46, 0xF3, 0x61, 0x45, 0x67, 0xE3, 0x0C, 0xA2, 0x3B, 0x1C, 0x85, 0x18, 0x04, 0x1D, 0x29, 0xA0, 0x8F, 0xB2, 0x5A, 0xD8, 0xA6, 0x7E, 0xEE, 0x8D, 0x53, 0x4B, 0xA1, 0x9A, 0xC1, 0x0E, 0x7A, 0x49, 0xA5, 0x2C, 0x81, 0xC4, 0xC7, 0x36, 0x2B, 0x7F, 0x43, 0x95, 0x33, 0xF2, 0x6C, 0x68, 0x6D, 0xF0, 0x02, 0x28, 0xCE, 0xDD, 0x9B, 0xEA, 0x5E, 0x99, 0x7C, 0x14, 0x86, 0xCF, 0xE5, 0x42, 0xB8, 0x40, 0x78, 0x2D, 0x3A, 0xE9, 0x64, 0x1F, 0x92, 0x90, 0x7D, 0x39, 0x6F, 0xE0, 0x89, 0x30 }; } /* * SAFER-SK Encryption */ void SAFER_SK::encrypt_n(const byte in[], byte out[], size_t blocks) const { const size_t rounds = get_rounds(); for(size_t i = 0; i != blocks; ++i) { byte A = in[0], B = in[1], C = in[2], D = in[3], E = in[4], F = in[5], G = in[6], H = in[7], X, Y; for(size_t j = 0; j != 16*rounds; j += 16) { A = EXP[A ^ EK[j ]]; B = LOG[B + EK[j+1]]; C = LOG[C + EK[j+2]]; D = EXP[D ^ EK[j+3]]; E = EXP[E ^ EK[j+4]]; F = LOG[F + EK[j+5]]; G = LOG[G + EK[j+6]]; H = EXP[H ^ EK[j+7]]; A += EK[j+ 8]; B ^= EK[j+ 9]; C ^= EK[j+10]; D += EK[j+11]; E += EK[j+12]; F ^= EK[j+13]; G ^= EK[j+14]; H += EK[j+15]; B += A; D += C; F += E; H += G; A += B; C += D; E += F; G += H; C += A; G += E; D += B; H += F; A += C; E += G; B += D; F += H; H += D; Y = D + H; D = B + F; X = B + D; B = A + E; A += B; F = C + G; E = C + F; C = X; G = Y; } out[0] = A ^ EK[16*rounds+0]; out[1] = B + EK[16*rounds+1]; out[2] = C + EK[16*rounds+2]; out[3] = D ^ EK[16*rounds+3]; out[4] = E ^ EK[16*rounds+4]; out[5] = F + EK[16*rounds+5]; out[6] = G + EK[16*rounds+6]; out[7] = H ^ EK[16*rounds+7]; in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * SAFER-SK Decryption */ void SAFER_SK::decrypt_n(const byte in[], byte out[], size_t blocks) const { const size_t rounds = get_rounds(); for(size_t i = 0; i != blocks; ++i) { byte A = in[0], B = in[1], C = in[2], D = in[3], E = in[4], F = in[5], G = in[6], H = in[7]; A ^= EK[16*rounds+0]; B -= EK[16*rounds+1]; C -= EK[16*rounds+2]; D ^= EK[16*rounds+3]; E ^= EK[16*rounds+4]; F -= EK[16*rounds+5]; G -= EK[16*rounds+6]; H ^= EK[16*rounds+7]; for(s32bit j = 16*(rounds-1); j >= 0; j -= 16) { byte T = E; E = B; B = C; C = T; T = F; F = D; D = G; G = T; A -= E; B -= F; C -= G; D -= H; E -= A; F -= B; G -= C; H -= D; A -= C; E -= G; B -= D; F -= H; C -= A; G -= E; D -= B; H -= F; A -= B; C -= D; E -= F; G -= H; B -= A; D -= C; F -= E; H -= G; A = LOG[A - EK[j+8 ] + 256]; B = EXP[B ^ EK[j+9 ]]; C = EXP[C ^ EK[j+10]]; D = LOG[D - EK[j+11] + 256]; E = LOG[E - EK[j+12] + 256]; F = EXP[F ^ EK[j+13]]; G = EXP[G ^ EK[j+14]]; H = LOG[H - EK[j+15] + 256]; A ^= EK[j+0]; B -= EK[j+1]; C -= EK[j+2]; D ^= EK[j+3]; E ^= EK[j+4]; F -= EK[j+5]; G -= EK[j+6]; H ^= EK[j+7]; } out[0] = A; out[1] = B; out[2] = C; out[3] = D; out[4] = E; out[5] = F; out[6] = G; out[7] = H; in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * SAFER-SK Key Schedule */ void SAFER_SK::key_schedule(const byte key[], size_t) { const byte BIAS[208] = { 0x16, 0x73, 0x3B, 0x1E, 0x8E, 0x70, 0xBD, 0x86, 0x47, 0x7E, 0x24, 0x56, 0xF1, 0x77, 0x88, 0x46, 0xB1, 0xBA, 0xA3, 0xB7, 0x10, 0x0A, 0xC5, 0x37, 0xC9, 0x5A, 0x28, 0xAC, 0x64, 0xA5, 0xEC, 0xAB, 0xC6, 0x67, 0x95, 0x58, 0x0D, 0xF8, 0x9A, 0xF6, 0x66, 0xDC, 0x05, 0x3D, 0xD3, 0x8A, 0xC3, 0xD8, 0x6A, 0xE9, 0x36, 0x49, 0x43, 0xBF, 0xEB, 0xD4, 0x9B, 0x68, 0xA0, 0x65, 0x5D, 0x57, 0x92, 0x1F, 0x71, 0x5C, 0xBB, 0x22, 0xC1, 0xBE, 0x7B, 0xBC, 0x63, 0x94, 0x5F, 0x2A, 0x61, 0xB8, 0x34, 0x32, 0xFD, 0xFB, 0x17, 0x40, 0xE6, 0x51, 0x1D, 0x41, 0x8F, 0x29, 0xDD, 0x04, 0x80, 0xDE, 0xE7, 0x31, 0x7F, 0x01, 0xA2, 0xF7, 0x39, 0xDA, 0x6F, 0x23, 0xFE, 0x3A, 0xD0, 0x1C, 0xD1, 0x30, 0x3E, 0x12, 0xCD, 0x0F, 0xE0, 0xA8, 0xAF, 0x82, 0x59, 0x2C, 0x7D, 0xAD, 0xB2, 0xEF, 0xC2, 0x87, 0xCE, 0x75, 0x13, 0x02, 0x90, 0x4F, 0x2E, 0x72, 0x33, 0x85, 0x8D, 0xCF, 0xA9, 0x81, 0xE2, 0xC4, 0x27, 0x2F, 0x7A, 0x9F, 0x52, 0xE1, 0x15, 0x38, 0x2B, 0xFC, 0x42, 0xC7, 0x08, 0xE4, 0x09, 0x55, 0x5E, 0x8C, 0x76, 0x60, 0xFF, 0xDF, 0xD7, 0x98, 0xFA, 0x0B, 0x00, 0x1A, 0xF9, 0xA6, 0xB9, 0xE8, 0x9E, 0x62, 0xD9, 0x91, 0x50, 0xD2, 0xEE, 0x18, 0xB4, 0x07, 0xEA, 0x5B, 0xA4, 0xC8, 0x0E, 0xCB, 0x48, 0x69, 0x4E, 0x9C, 0x35, 0x79, 0x45, 0x4D, 0x54, 0xE5, 0x3C, 0x0C, 0x4A, 0x8B, 0x3F, 0xCC, 0xA7, 0xDB }; const byte KEY_INDEX[208] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01, 0x02, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x06, 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; SecureVector KB(18); for(size_t i = 0; i != 8; ++i) { KB[ 8] ^= KB[i] = rotate_left(key[i], 5); KB[17] ^= KB[i+9] = EK[i] = key[i+8]; } for(size_t i = 0; i != get_rounds(); ++i) { for(size_t j = 0; j != 18; ++j) KB[j] = rotate_left(KB[j], 6); for(size_t j = 0; j != 16; ++j) EK[16*i+j+8] = KB[KEY_INDEX[16*i+j]] + BIAS[16*i+j]; } } /* * Return the name of this type */ std::string SAFER_SK::name() const { return "SAFER-SK(" + to_string(get_rounds()) + ")"; } /* * Return a clone of this object */ BlockCipher* SAFER_SK::clone() const { return new SAFER_SK(get_rounds()); } /* * SAFER-SK Constructor */ SAFER_SK::SAFER_SK(size_t rounds) { if(rounds > 13 || rounds == 0) throw Invalid_Argument(name() + ": Invalid number of rounds"); EK.resize(16 * rounds + 8); } } Botan-1.10.12/src/block/safer/safer_sk.h0000664000175000017500000000153412654331322017516 0ustar jackjack00000000000000/* * SAFER-SK * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SAFER_SK_H__ #define BOTAN_SAFER_SK_H__ #include namespace Botan { /** * SAFER-SK */ class BOTAN_DLL SAFER_SK : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); } std::string name() const; BlockCipher* clone() const; /** * @param rounds the number of rounds to use - must be between 1 * and 13 */ SAFER_SK(size_t rounds); private: size_t get_rounds() const { return (EK.size() - 8) / 16; } void key_schedule(const byte[], size_t); SecureVector EK; }; } #endif Botan-1.10.12/src/block/seed/info.txt0000664000175000017500000000001412654331322017054 0ustar jackjack00000000000000define SEED Botan-1.10.12/src/block/seed/seed.cpp0000664000175000017500000000567312654331322017024 0ustar jackjack00000000000000/* * SEED * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * SEED G Function */ u32bit SEED::G_FUNC::operator()(u32bit X) const { return (S0[get_byte(3, X)] ^ S1[get_byte(2, X)] ^ S2[get_byte(1, X)] ^ S3[get_byte(0, X)]); } /* * SEED Encryption */ void SEED::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit B0 = load_be(in, 0); u32bit B1 = load_be(in, 1); u32bit B2 = load_be(in, 2); u32bit B3 = load_be(in, 3); G_FUNC G; for(size_t j = 0; j != 16; j += 2) { u32bit T0, T1; T0 = B2 ^ K[2*j]; T1 = G(B2 ^ B3 ^ K[2*j+1]); T0 = G(T1 + T0); T1 = G(T1 + T0); B1 ^= T1; B0 ^= T0 + T1; T0 = B0 ^ K[2*j+2]; T1 = G(B0 ^ B1 ^ K[2*j+3]); T0 = G(T1 + T0); T1 = G(T1 + T0); B3 ^= T1; B2 ^= T0 + T1; } store_be(out, B2, B3, B0, B1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * SEED Decryption */ void SEED::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit B0 = load_be(in, 0); u32bit B1 = load_be(in, 1); u32bit B2 = load_be(in, 2); u32bit B3 = load_be(in, 3); G_FUNC G; for(size_t j = 0; j != 16; j += 2) { u32bit T0, T1; T0 = B2 ^ K[30-2*j]; T1 = G(B2 ^ B3 ^ K[31-2*j]); T0 = G(T1 + T0); T1 = G(T1 + T0); B1 ^= T1; B0 ^= T0 + T1; T0 = B0 ^ K[28-2*j]; T1 = G(B0 ^ B1 ^ K[29-2*j]); T0 = G(T1 + T0); T1 = G(T1 + T0); B3 ^= T1; B2 ^= T0 + T1; } store_be(out, B2, B3, B0, B1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * SEED Key Schedule */ void SEED::key_schedule(const byte key[], size_t) { const u32bit RC[16] = { 0x9E3779B9, 0x3C6EF373, 0x78DDE6E6, 0xF1BBCDCC, 0xE3779B99, 0xC6EF3733, 0x8DDE6E67, 0x1BBCDCCF, 0x3779B99E, 0x6EF3733C, 0xDDE6E678, 0xBBCDCCF1, 0x779B99E3, 0xEF3733C6, 0xDE6E678D, 0xBCDCCF1B }; SecureVector WK(4); for(size_t i = 0; i != 4; ++i) WK[i] = load_be(key, i); G_FUNC G; for(size_t i = 0; i != 16; i += 2) { K[2*i ] = G(WK[0] + WK[2] - RC[i]); K[2*i+1] = G(WK[1] - WK[3] + RC[i]) ^ K[2*i]; byte T = get_byte(3, WK[0]); WK[0] = (WK[0] >> 8) | (get_byte(3, WK[1]) << 24); WK[1] = (WK[1] >> 8) | (T << 24); K[2*i+2] = G(WK[0] + WK[2] - RC[i+1]); K[2*i+3] = G(WK[1] - WK[3] + RC[i+1]) ^ K[2*i+2]; T = get_byte(0, WK[3]); WK[3] = (WK[3] << 8) | get_byte(0, WK[2]); WK[2] = (WK[2] << 8) | T; } } } Botan-1.10.12/src/block/seed/seed.h0000664000175000017500000000162512654331322016462 0ustar jackjack00000000000000/* * SEED * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SEED_H__ #define BOTAN_SEED_H__ #include namespace Botan { /** * SEED, a Korean block cipher */ class BOTAN_DLL SEED : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(K); } std::string name() const { return "SEED"; } BlockCipher* clone() const { return new SEED; } SEED() : K(32) {} private: void key_schedule(const byte[], size_t); class G_FUNC { public: u32bit operator()(u32bit) const; private: static const u32bit S0[256], S1[256], S2[256], S3[256]; }; SecureVector K; }; } #endif Botan-1.10.12/src/block/seed/seed_tab.cpp0000664000175000017500000003151112654331322017640 0ustar jackjack00000000000000/* * S-Box Tables for SEED * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { const u32bit SEED::G_FUNC::S0[256] = { 0x2989A1A8, 0x05858184, 0x16C6D2D4, 0x13C3D3D0, 0x14445054, 0x1D0D111C, 0x2C8CA0AC, 0x25052124, 0x1D4D515C, 0x03434340, 0x18081018, 0x1E0E121C, 0x11415150, 0x3CCCF0FC, 0x0ACAC2C8, 0x23436360, 0x28082028, 0x04444044, 0x20002020, 0x1D8D919C, 0x20C0E0E0, 0x22C2E2E0, 0x08C8C0C8, 0x17071314, 0x2585A1A4, 0x0F8F838C, 0x03030300, 0x3B4B7378, 0x3B8BB3B8, 0x13031310, 0x12C2D2D0, 0x2ECEE2EC, 0x30407070, 0x0C8C808C, 0x3F0F333C, 0x2888A0A8, 0x32023230, 0x1DCDD1DC, 0x36C6F2F4, 0x34447074, 0x2CCCE0EC, 0x15859194, 0x0B0B0308, 0x17475354, 0x1C4C505C, 0x1B4B5358, 0x3D8DB1BC, 0x01010100, 0x24042024, 0x1C0C101C, 0x33437370, 0x18889098, 0x10001010, 0x0CCCC0CC, 0x32C2F2F0, 0x19C9D1D8, 0x2C0C202C, 0x27C7E3E4, 0x32427270, 0x03838380, 0x1B8B9398, 0x11C1D1D0, 0x06868284, 0x09C9C1C8, 0x20406060, 0x10405050, 0x2383A3A0, 0x2BCBE3E8, 0x0D0D010C, 0x3686B2B4, 0x1E8E929C, 0x0F4F434C, 0x3787B3B4, 0x1A4A5258, 0x06C6C2C4, 0x38487078, 0x2686A2A4, 0x12021210, 0x2F8FA3AC, 0x15C5D1D4, 0x21416160, 0x03C3C3C0, 0x3484B0B4, 0x01414140, 0x12425250, 0x3D4D717C, 0x0D8D818C, 0x08080008, 0x1F0F131C, 0x19899198, 0x00000000, 0x19091118, 0x04040004, 0x13435350, 0x37C7F3F4, 0x21C1E1E0, 0x3DCDF1FC, 0x36467274, 0x2F0F232C, 0x27072324, 0x3080B0B0, 0x0B8B8388, 0x0E0E020C, 0x2B8BA3A8, 0x2282A2A0, 0x2E4E626C, 0x13839390, 0x0D4D414C, 0x29496168, 0x3C4C707C, 0x09090108, 0x0A0A0208, 0x3F8FB3BC, 0x2FCFE3EC, 0x33C3F3F0, 0x05C5C1C4, 0x07878384, 0x14041014, 0x3ECEF2FC, 0x24446064, 0x1ECED2DC, 0x2E0E222C, 0x0B4B4348, 0x1A0A1218, 0x06060204, 0x21012120, 0x2B4B6368, 0x26466264, 0x02020200, 0x35C5F1F4, 0x12829290, 0x0A8A8288, 0x0C0C000C, 0x3383B3B0, 0x3E4E727C, 0x10C0D0D0, 0x3A4A7278, 0x07474344, 0x16869294, 0x25C5E1E4, 0x26062224, 0x00808080, 0x2D8DA1AC, 0x1FCFD3DC, 0x2181A1A0, 0x30003030, 0x37073334, 0x2E8EA2AC, 0x36063234, 0x15051114, 0x22022220, 0x38083038, 0x34C4F0F4, 0x2787A3A4, 0x05454144, 0x0C4C404C, 0x01818180, 0x29C9E1E8, 0x04848084, 0x17879394, 0x35053134, 0x0BCBC3C8, 0x0ECEC2CC, 0x3C0C303C, 0x31417170, 0x11011110, 0x07C7C3C4, 0x09898188, 0x35457174, 0x3BCBF3F8, 0x1ACAD2D8, 0x38C8F0F8, 0x14849094, 0x19495158, 0x02828280, 0x04C4C0C4, 0x3FCFF3FC, 0x09494148, 0x39093138, 0x27476364, 0x00C0C0C0, 0x0FCFC3CC, 0x17C7D3D4, 0x3888B0B8, 0x0F0F030C, 0x0E8E828C, 0x02424240, 0x23032320, 0x11819190, 0x2C4C606C, 0x1BCBD3D8, 0x2484A0A4, 0x34043034, 0x31C1F1F0, 0x08484048, 0x02C2C2C0, 0x2F4F636C, 0x3D0D313C, 0x2D0D212C, 0x00404040, 0x3E8EB2BC, 0x3E0E323C, 0x3C8CB0BC, 0x01C1C1C0, 0x2A8AA2A8, 0x3A8AB2B8, 0x0E4E424C, 0x15455154, 0x3B0B3338, 0x1CCCD0DC, 0x28486068, 0x3F4F737C, 0x1C8C909C, 0x18C8D0D8, 0x0A4A4248, 0x16465254, 0x37477374, 0x2080A0A0, 0x2DCDE1EC, 0x06464244, 0x3585B1B4, 0x2B0B2328, 0x25456164, 0x3ACAF2F8, 0x23C3E3E0, 0x3989B1B8, 0x3181B1B0, 0x1F8F939C, 0x1E4E525C, 0x39C9F1F8, 0x26C6E2E4, 0x3282B2B0, 0x31013130, 0x2ACAE2E8, 0x2D4D616C, 0x1F4F535C, 0x24C4E0E4, 0x30C0F0F0, 0x0DCDC1CC, 0x08888088, 0x16061214, 0x3A0A3238, 0x18485058, 0x14C4D0D4, 0x22426260, 0x29092128, 0x07070304, 0x33033330, 0x28C8E0E8, 0x1B0B1318, 0x05050104, 0x39497178, 0x10809090, 0x2A4A6268, 0x2A0A2228, 0x1A8A9298 }; const u32bit SEED::G_FUNC::S1[256] = { 0x38380830, 0xE828C8E0, 0x2C2D0D21, 0xA42686A2, 0xCC0FCFC3, 0xDC1ECED2, 0xB03383B3, 0xB83888B0, 0xAC2F8FA3, 0x60204060, 0x54154551, 0xC407C7C3, 0x44044440, 0x6C2F4F63, 0x682B4B63, 0x581B4B53, 0xC003C3C3, 0x60224262, 0x30330333, 0xB43585B1, 0x28290921, 0xA02080A0, 0xE022C2E2, 0xA42787A3, 0xD013C3D3, 0x90118191, 0x10110111, 0x04060602, 0x1C1C0C10, 0xBC3C8CB0, 0x34360632, 0x480B4B43, 0xEC2FCFE3, 0x88088880, 0x6C2C4C60, 0xA82888A0, 0x14170713, 0xC404C4C0, 0x14160612, 0xF434C4F0, 0xC002C2C2, 0x44054541, 0xE021C1E1, 0xD416C6D2, 0x3C3F0F33, 0x3C3D0D31, 0x8C0E8E82, 0x98188890, 0x28280820, 0x4C0E4E42, 0xF436C6F2, 0x3C3E0E32, 0xA42585A1, 0xF839C9F1, 0x0C0D0D01, 0xDC1FCFD3, 0xD818C8D0, 0x282B0B23, 0x64264662, 0x783A4A72, 0x24270723, 0x2C2F0F23, 0xF031C1F1, 0x70324272, 0x40024242, 0xD414C4D0, 0x40014141, 0xC000C0C0, 0x70334373, 0x64274763, 0xAC2C8CA0, 0x880B8B83, 0xF437C7F3, 0xAC2D8DA1, 0x80008080, 0x1C1F0F13, 0xC80ACAC2, 0x2C2C0C20, 0xA82A8AA2, 0x34340430, 0xD012C2D2, 0x080B0B03, 0xEC2ECEE2, 0xE829C9E1, 0x5C1D4D51, 0x94148490, 0x18180810, 0xF838C8F0, 0x54174753, 0xAC2E8EA2, 0x08080800, 0xC405C5C1, 0x10130313, 0xCC0DCDC1, 0x84068682, 0xB83989B1, 0xFC3FCFF3, 0x7C3D4D71, 0xC001C1C1, 0x30310131, 0xF435C5F1, 0x880A8A82, 0x682A4A62, 0xB03181B1, 0xD011C1D1, 0x20200020, 0xD417C7D3, 0x00020202, 0x20220222, 0x04040400, 0x68284860, 0x70314171, 0x04070703, 0xD81BCBD3, 0x9C1D8D91, 0x98198991, 0x60214161, 0xBC3E8EB2, 0xE426C6E2, 0x58194951, 0xDC1DCDD1, 0x50114151, 0x90108090, 0xDC1CCCD0, 0x981A8A92, 0xA02383A3, 0xA82B8BA3, 0xD010C0D0, 0x80018181, 0x0C0F0F03, 0x44074743, 0x181A0A12, 0xE023C3E3, 0xEC2CCCE0, 0x8C0D8D81, 0xBC3F8FB3, 0x94168692, 0x783B4B73, 0x5C1C4C50, 0xA02282A2, 0xA02181A1, 0x60234363, 0x20230323, 0x4C0D4D41, 0xC808C8C0, 0x9C1E8E92, 0x9C1C8C90, 0x383A0A32, 0x0C0C0C00, 0x2C2E0E22, 0xB83A8AB2, 0x6C2E4E62, 0x9C1F8F93, 0x581A4A52, 0xF032C2F2, 0x90128292, 0xF033C3F3, 0x48094941, 0x78384870, 0xCC0CCCC0, 0x14150511, 0xF83BCBF3, 0x70304070, 0x74354571, 0x7C3F4F73, 0x34350531, 0x10100010, 0x00030303, 0x64244460, 0x6C2D4D61, 0xC406C6C2, 0x74344470, 0xD415C5D1, 0xB43484B0, 0xE82ACAE2, 0x08090901, 0x74364672, 0x18190911, 0xFC3ECEF2, 0x40004040, 0x10120212, 0xE020C0E0, 0xBC3D8DB1, 0x04050501, 0xF83ACAF2, 0x00010101, 0xF030C0F0, 0x282A0A22, 0x5C1E4E52, 0xA82989A1, 0x54164652, 0x40034343, 0x84058581, 0x14140410, 0x88098981, 0x981B8B93, 0xB03080B0, 0xE425C5E1, 0x48084840, 0x78394971, 0x94178793, 0xFC3CCCF0, 0x1C1E0E12, 0x80028282, 0x20210121, 0x8C0C8C80, 0x181B0B13, 0x5C1F4F53, 0x74374773, 0x54144450, 0xB03282B2, 0x1C1D0D11, 0x24250521, 0x4C0F4F43, 0x00000000, 0x44064642, 0xEC2DCDE1, 0x58184850, 0x50124252, 0xE82BCBE3, 0x7C3E4E72, 0xD81ACAD2, 0xC809C9C1, 0xFC3DCDF1, 0x30300030, 0x94158591, 0x64254561, 0x3C3C0C30, 0xB43686B2, 0xE424C4E0, 0xB83B8BB3, 0x7C3C4C70, 0x0C0E0E02, 0x50104050, 0x38390931, 0x24260622, 0x30320232, 0x84048480, 0x68294961, 0x90138393, 0x34370733, 0xE427C7E3, 0x24240420, 0xA42484A0, 0xC80BCBC3, 0x50134353, 0x080A0A02, 0x84078783, 0xD819C9D1, 0x4C0C4C40, 0x80038383, 0x8C0F8F83, 0xCC0ECEC2, 0x383B0B33, 0x480A4A42, 0xB43787B3 }; const u32bit SEED::G_FUNC::S2[256] = { 0xA1A82989, 0x81840585, 0xD2D416C6, 0xD3D013C3, 0x50541444, 0x111C1D0D, 0xA0AC2C8C, 0x21242505, 0x515C1D4D, 0x43400343, 0x10181808, 0x121C1E0E, 0x51501141, 0xF0FC3CCC, 0xC2C80ACA, 0x63602343, 0x20282808, 0x40440444, 0x20202000, 0x919C1D8D, 0xE0E020C0, 0xE2E022C2, 0xC0C808C8, 0x13141707, 0xA1A42585, 0x838C0F8F, 0x03000303, 0x73783B4B, 0xB3B83B8B, 0x13101303, 0xD2D012C2, 0xE2EC2ECE, 0x70703040, 0x808C0C8C, 0x333C3F0F, 0xA0A82888, 0x32303202, 0xD1DC1DCD, 0xF2F436C6, 0x70743444, 0xE0EC2CCC, 0x91941585, 0x03080B0B, 0x53541747, 0x505C1C4C, 0x53581B4B, 0xB1BC3D8D, 0x01000101, 0x20242404, 0x101C1C0C, 0x73703343, 0x90981888, 0x10101000, 0xC0CC0CCC, 0xF2F032C2, 0xD1D819C9, 0x202C2C0C, 0xE3E427C7, 0x72703242, 0x83800383, 0x93981B8B, 0xD1D011C1, 0x82840686, 0xC1C809C9, 0x60602040, 0x50501040, 0xA3A02383, 0xE3E82BCB, 0x010C0D0D, 0xB2B43686, 0x929C1E8E, 0x434C0F4F, 0xB3B43787, 0x52581A4A, 0xC2C406C6, 0x70783848, 0xA2A42686, 0x12101202, 0xA3AC2F8F, 0xD1D415C5, 0x61602141, 0xC3C003C3, 0xB0B43484, 0x41400141, 0x52501242, 0x717C3D4D, 0x818C0D8D, 0x00080808, 0x131C1F0F, 0x91981989, 0x00000000, 0x11181909, 0x00040404, 0x53501343, 0xF3F437C7, 0xE1E021C1, 0xF1FC3DCD, 0x72743646, 0x232C2F0F, 0x23242707, 0xB0B03080, 0x83880B8B, 0x020C0E0E, 0xA3A82B8B, 0xA2A02282, 0x626C2E4E, 0x93901383, 0x414C0D4D, 0x61682949, 0x707C3C4C, 0x01080909, 0x02080A0A, 0xB3BC3F8F, 0xE3EC2FCF, 0xF3F033C3, 0xC1C405C5, 0x83840787, 0x10141404, 0xF2FC3ECE, 0x60642444, 0xD2DC1ECE, 0x222C2E0E, 0x43480B4B, 0x12181A0A, 0x02040606, 0x21202101, 0x63682B4B, 0x62642646, 0x02000202, 0xF1F435C5, 0x92901282, 0x82880A8A, 0x000C0C0C, 0xB3B03383, 0x727C3E4E, 0xD0D010C0, 0x72783A4A, 0x43440747, 0x92941686, 0xE1E425C5, 0x22242606, 0x80800080, 0xA1AC2D8D, 0xD3DC1FCF, 0xA1A02181, 0x30303000, 0x33343707, 0xA2AC2E8E, 0x32343606, 0x11141505, 0x22202202, 0x30383808, 0xF0F434C4, 0xA3A42787, 0x41440545, 0x404C0C4C, 0x81800181, 0xE1E829C9, 0x80840484, 0x93941787, 0x31343505, 0xC3C80BCB, 0xC2CC0ECE, 0x303C3C0C, 0x71703141, 0x11101101, 0xC3C407C7, 0x81880989, 0x71743545, 0xF3F83BCB, 0xD2D81ACA, 0xF0F838C8, 0x90941484, 0x51581949, 0x82800282, 0xC0C404C4, 0xF3FC3FCF, 0x41480949, 0x31383909, 0x63642747, 0xC0C000C0, 0xC3CC0FCF, 0xD3D417C7, 0xB0B83888, 0x030C0F0F, 0x828C0E8E, 0x42400242, 0x23202303, 0x91901181, 0x606C2C4C, 0xD3D81BCB, 0xA0A42484, 0x30343404, 0xF1F031C1, 0x40480848, 0xC2C002C2, 0x636C2F4F, 0x313C3D0D, 0x212C2D0D, 0x40400040, 0xB2BC3E8E, 0x323C3E0E, 0xB0BC3C8C, 0xC1C001C1, 0xA2A82A8A, 0xB2B83A8A, 0x424C0E4E, 0x51541545, 0x33383B0B, 0xD0DC1CCC, 0x60682848, 0x737C3F4F, 0x909C1C8C, 0xD0D818C8, 0x42480A4A, 0x52541646, 0x73743747, 0xA0A02080, 0xE1EC2DCD, 0x42440646, 0xB1B43585, 0x23282B0B, 0x61642545, 0xF2F83ACA, 0xE3E023C3, 0xB1B83989, 0xB1B03181, 0x939C1F8F, 0x525C1E4E, 0xF1F839C9, 0xE2E426C6, 0xB2B03282, 0x31303101, 0xE2E82ACA, 0x616C2D4D, 0x535C1F4F, 0xE0E424C4, 0xF0F030C0, 0xC1CC0DCD, 0x80880888, 0x12141606, 0x32383A0A, 0x50581848, 0xD0D414C4, 0x62602242, 0x21282909, 0x03040707, 0x33303303, 0xE0E828C8, 0x13181B0B, 0x01040505, 0x71783949, 0x90901080, 0x62682A4A, 0x22282A0A, 0x92981A8A }; const u32bit SEED::G_FUNC::S3[256] = { 0x08303838, 0xC8E0E828, 0x0D212C2D, 0x86A2A426, 0xCFC3CC0F, 0xCED2DC1E, 0x83B3B033, 0x88B0B838, 0x8FA3AC2F, 0x40606020, 0x45515415, 0xC7C3C407, 0x44404404, 0x4F636C2F, 0x4B63682B, 0x4B53581B, 0xC3C3C003, 0x42626022, 0x03333033, 0x85B1B435, 0x09212829, 0x80A0A020, 0xC2E2E022, 0x87A3A427, 0xC3D3D013, 0x81919011, 0x01111011, 0x06020406, 0x0C101C1C, 0x8CB0BC3C, 0x06323436, 0x4B43480B, 0xCFE3EC2F, 0x88808808, 0x4C606C2C, 0x88A0A828, 0x07131417, 0xC4C0C404, 0x06121416, 0xC4F0F434, 0xC2C2C002, 0x45414405, 0xC1E1E021, 0xC6D2D416, 0x0F333C3F, 0x0D313C3D, 0x8E828C0E, 0x88909818, 0x08202828, 0x4E424C0E, 0xC6F2F436, 0x0E323C3E, 0x85A1A425, 0xC9F1F839, 0x0D010C0D, 0xCFD3DC1F, 0xC8D0D818, 0x0B23282B, 0x46626426, 0x4A72783A, 0x07232427, 0x0F232C2F, 0xC1F1F031, 0x42727032, 0x42424002, 0xC4D0D414, 0x41414001, 0xC0C0C000, 0x43737033, 0x47636427, 0x8CA0AC2C, 0x8B83880B, 0xC7F3F437, 0x8DA1AC2D, 0x80808000, 0x0F131C1F, 0xCAC2C80A, 0x0C202C2C, 0x8AA2A82A, 0x04303434, 0xC2D2D012, 0x0B03080B, 0xCEE2EC2E, 0xC9E1E829, 0x4D515C1D, 0x84909414, 0x08101818, 0xC8F0F838, 0x47535417, 0x8EA2AC2E, 0x08000808, 0xC5C1C405, 0x03131013, 0xCDC1CC0D, 0x86828406, 0x89B1B839, 0xCFF3FC3F, 0x4D717C3D, 0xC1C1C001, 0x01313031, 0xC5F1F435, 0x8A82880A, 0x4A62682A, 0x81B1B031, 0xC1D1D011, 0x00202020, 0xC7D3D417, 0x02020002, 0x02222022, 0x04000404, 0x48606828, 0x41717031, 0x07030407, 0xCBD3D81B, 0x8D919C1D, 0x89919819, 0x41616021, 0x8EB2BC3E, 0xC6E2E426, 0x49515819, 0xCDD1DC1D, 0x41515011, 0x80909010, 0xCCD0DC1C, 0x8A92981A, 0x83A3A023, 0x8BA3A82B, 0xC0D0D010, 0x81818001, 0x0F030C0F, 0x47434407, 0x0A12181A, 0xC3E3E023, 0xCCE0EC2C, 0x8D818C0D, 0x8FB3BC3F, 0x86929416, 0x4B73783B, 0x4C505C1C, 0x82A2A022, 0x81A1A021, 0x43636023, 0x03232023, 0x4D414C0D, 0xC8C0C808, 0x8E929C1E, 0x8C909C1C, 0x0A32383A, 0x0C000C0C, 0x0E222C2E, 0x8AB2B83A, 0x4E626C2E, 0x8F939C1F, 0x4A52581A, 0xC2F2F032, 0x82929012, 0xC3F3F033, 0x49414809, 0x48707838, 0xCCC0CC0C, 0x05111415, 0xCBF3F83B, 0x40707030, 0x45717435, 0x4F737C3F, 0x05313435, 0x00101010, 0x03030003, 0x44606424, 0x4D616C2D, 0xC6C2C406, 0x44707434, 0xC5D1D415, 0x84B0B434, 0xCAE2E82A, 0x09010809, 0x46727436, 0x09111819, 0xCEF2FC3E, 0x40404000, 0x02121012, 0xC0E0E020, 0x8DB1BC3D, 0x05010405, 0xCAF2F83A, 0x01010001, 0xC0F0F030, 0x0A22282A, 0x4E525C1E, 0x89A1A829, 0x46525416, 0x43434003, 0x85818405, 0x04101414, 0x89818809, 0x8B93981B, 0x80B0B030, 0xC5E1E425, 0x48404808, 0x49717839, 0x87939417, 0xCCF0FC3C, 0x0E121C1E, 0x82828002, 0x01212021, 0x8C808C0C, 0x0B13181B, 0x4F535C1F, 0x47737437, 0x44505414, 0x82B2B032, 0x0D111C1D, 0x05212425, 0x4F434C0F, 0x00000000, 0x46424406, 0xCDE1EC2D, 0x48505818, 0x42525012, 0xCBE3E82B, 0x4E727C3E, 0xCAD2D81A, 0xC9C1C809, 0xCDF1FC3D, 0x00303030, 0x85919415, 0x45616425, 0x0C303C3C, 0x86B2B436, 0xC4E0E424, 0x8BB3B83B, 0x4C707C3C, 0x0E020C0E, 0x40505010, 0x09313839, 0x06222426, 0x02323032, 0x84808404, 0x49616829, 0x83939013, 0x07333437, 0xC7E3E427, 0x04202424, 0x84A0A424, 0xCBC3C80B, 0x43535013, 0x0A02080A, 0x87838407, 0xC9D1D819, 0x4C404C0C, 0x83838003, 0x8F838C0F, 0xCEC2CC0E, 0x0B33383B, 0x4A42480A, 0x87B3B437 }; } Botan-1.10.12/src/block/serpent/info.txt0000664000175000017500000000001712654331322017617 0ustar jackjack00000000000000define SERPENT Botan-1.10.12/src/block/serpent/serpent.cpp0000664000175000017500000003571512654331322020324 0ustar jackjack00000000000000/* * Serpent * (C) 1999-2007 Jack Lloyd * * The sbox expressions used here were discovered by Dag Arne Osvik and * are described in his paper "Speeding Up Serpent". * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * Serpent Encryption S-Box 1 */ inline void SBoxE1(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T3 ^= T0; T4 = T1; T1 &= T3; T4 ^= T2; T1 ^= T0; T0 |= T3; T0 ^= T4; T4 ^= T3; T3 ^= T2; T2 |= T1; T2 ^= T4; T4 = ~T4; T4 |= T1; T1 ^= T3; T1 ^= T4; T3 |= T0; T1 ^= T3; T4 ^= T3; B0 = T1; B1 = T4; B2 = T2; B3 = T0; } /* * Serpent Encryption S-Box 2 */ inline void SBoxE2(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T0 = ~T0; T2 = ~T2; T4 = T0; T0 &= T1; T2 ^= T0; T0 |= T3; T3 ^= T2; T1 ^= T0; T0 ^= T4; T4 |= T1; T1 ^= T3; T2 |= T0; T2 &= T4; T0 ^= T1; T1 &= T2; T1 ^= T0; T0 &= T2; T0 ^= T4; B0 = T2; B1 = T0; B2 = T3; B3 = T1; } /* * Serpent Encryption S-Box 3 */ inline void SBoxE3(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T4 = T0; T0 &= T2; T0 ^= T3; T2 ^= T1; T2 ^= T0; T3 |= T4; T3 ^= T1; T4 ^= T2; T1 = T3; T3 |= T4; T3 ^= T0; T0 &= T1; T4 ^= T0; T1 ^= T3; T1 ^= T4; T4 = ~T4; B0 = T2; B1 = T3; B2 = T1; B3 = T4; } /* * Serpent Encryption S-Box 4 */ inline void SBoxE4(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T4 = T0; T0 |= T3; T3 ^= T1; T1 &= T4; T4 ^= T2; T2 ^= T3; T3 &= T0; T4 |= T1; T3 ^= T4; T0 ^= T1; T4 &= T0; T1 ^= T3; T4 ^= T2; T1 |= T0; T1 ^= T2; T0 ^= T3; T2 = T1; T1 |= T3; T1 ^= T0; B0 = T1; B1 = T2; B2 = T3; B3 = T4; } /* * Serpent Encryption S-Box 5 */ inline void SBoxE5(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T1 ^= T3; T3 = ~T3; T2 ^= T3; T3 ^= T0; T4 = T1; T1 &= T3; T1 ^= T2; T4 ^= T3; T0 ^= T4; T2 &= T4; T2 ^= T0; T0 &= T1; T3 ^= T0; T4 |= T1; T4 ^= T0; T0 |= T3; T0 ^= T2; T2 &= T3; T0 = ~T0; T4 ^= T2; B0 = T1; B1 = T4; B2 = T0; B3 = T3; } /* * Serpent Encryption S-Box 6 */ inline void SBoxE6(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T0 ^= T1; T1 ^= T3; T3 = ~T3; T4 = T1; T1 &= T0; T2 ^= T3; T1 ^= T2; T2 |= T4; T4 ^= T3; T3 &= T1; T3 ^= T0; T4 ^= T1; T4 ^= T2; T2 ^= T0; T0 &= T3; T2 = ~T2; T0 ^= T4; T4 |= T3; T2 ^= T4; B0 = T1; B1 = T3; B2 = T0; B3 = T2; } /* * Serpent Encryption S-Box 7 */ inline void SBoxE7(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T2 = ~T2; T4 = T3; T3 &= T0; T0 ^= T4; T3 ^= T2; T2 |= T4; T1 ^= T3; T2 ^= T0; T0 |= T1; T2 ^= T1; T4 ^= T0; T0 |= T3; T0 ^= T2; T4 ^= T3; T4 ^= T0; T3 = ~T3; T2 &= T4; T2 ^= T3; B0 = T0; B1 = T1; B2 = T4; B3 = T2; } /* * Serpent Encryption S-Box 8 */ inline void SBoxE8(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T4 = T1; T1 |= T2; T1 ^= T3; T4 ^= T2; T2 ^= T1; T3 |= T4; T3 &= T0; T4 ^= T2; T3 ^= T1; T1 |= T4; T1 ^= T0; T0 |= T4; T0 ^= T2; T1 ^= T4; T2 ^= T1; T1 &= T0; T1 ^= T4; T2 = ~T2; T2 |= T0; T4 ^= T2; B0 = T4; B1 = T3; B2 = T1; B3 = T0; } /* * Serpent Decryption S-Box 1 */ inline void SBoxD1(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T2 = ~T2; T4 = T1; T1 |= T0; T4 = ~T4; T1 ^= T2; T2 |= T4; T1 ^= T3; T0 ^= T4; T2 ^= T0; T0 &= T3; T4 ^= T0; T0 |= T1; T0 ^= T2; T3 ^= T4; T2 ^= T1; T3 ^= T0; T3 ^= T1; T2 &= T3; T4 ^= T2; B0 = T0; B1 = T4; B2 = T1; B3 = T3; } /* * Serpent Decryption S-Box 2 */ inline void SBoxD2(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T4 = T1; T1 ^= T3; T3 &= T1; T4 ^= T2; T3 ^= T0; T0 |= T1; T2 ^= T3; T0 ^= T4; T0 |= T2; T1 ^= T3; T0 ^= T1; T1 |= T3; T1 ^= T0; T4 = ~T4; T4 ^= T1; T1 |= T0; T1 ^= T0; T1 |= T4; T3 ^= T1; B0 = T4; B1 = T0; B2 = T3; B3 = T2; } /* * Serpent Decryption S-Box 3 */ inline void SBoxD3(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T2 ^= T3; T3 ^= T0; T4 = T3; T3 &= T2; T3 ^= T1; T1 |= T2; T1 ^= T4; T4 &= T3; T2 ^= T3; T4 &= T0; T4 ^= T2; T2 &= T1; T2 |= T0; T3 = ~T3; T2 ^= T3; T0 ^= T3; T0 &= T1; T3 ^= T4; T3 ^= T0; B0 = T1; B1 = T4; B2 = T2; B3 = T3; } /* * Serpent Decryption S-Box 4 */ inline void SBoxD4(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T4 = T2; T2 ^= T1; T0 ^= T2; T4 &= T2; T4 ^= T0; T0 &= T1; T1 ^= T3; T3 |= T4; T2 ^= T3; T0 ^= T3; T1 ^= T4; T3 &= T2; T3 ^= T1; T1 ^= T0; T1 |= T2; T0 ^= T3; T1 ^= T4; T0 ^= T1; B0 = T2; B1 = T1; B2 = T3; B3 = T0; } /* * Serpent Decryption S-Box 5 */ inline void SBoxD5(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T4 = T2; T2 &= T3; T2 ^= T1; T1 |= T3; T1 &= T0; T4 ^= T2; T4 ^= T1; T1 &= T2; T0 = ~T0; T3 ^= T4; T1 ^= T3; T3 &= T0; T3 ^= T2; T0 ^= T1; T2 &= T0; T3 ^= T0; T2 ^= T4; T2 |= T3; T3 ^= T0; T2 ^= T1; B0 = T0; B1 = T3; B2 = T2; B3 = T4; } /* * Serpent Decryption S-Box 6 */ inline void SBoxD6(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T1 = ~T1; T4 = T3; T2 ^= T1; T3 |= T0; T3 ^= T2; T2 |= T1; T2 &= T0; T4 ^= T3; T2 ^= T4; T4 |= T0; T4 ^= T1; T1 &= T2; T1 ^= T3; T4 ^= T2; T3 &= T4; T4 ^= T1; T3 ^= T4; T4 = ~T4; T3 ^= T0; B0 = T1; B1 = T4; B2 = T3; B3 = T2; } /* * Serpent Decryption S-Box 7 */ inline void SBoxD7(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T0 ^= T2; T4 = T2; T2 &= T0; T4 ^= T3; T2 = ~T2; T3 ^= T1; T2 ^= T3; T4 |= T0; T0 ^= T2; T3 ^= T4; T4 ^= T1; T1 &= T3; T1 ^= T0; T0 ^= T3; T0 |= T2; T3 ^= T1; T4 ^= T0; B0 = T1; B1 = T2; B2 = T4; B3 = T3; } /* * Serpent Decryption S-Box 8 */ inline void SBoxD8(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { u32bit T0 = B0, T1 = B1, T2 = B2, T3 = B3, T4; T4 = T2; T2 ^= T0; T0 &= T3; T4 |= T3; T2 = ~T2; T3 ^= T1; T1 |= T0; T0 ^= T2; T2 &= T4; T3 &= T4; T1 ^= T2; T2 ^= T0; T0 |= T2; T4 ^= T1; T0 ^= T3; T3 ^= T4; T4 |= T0; T3 ^= T2; T4 ^= T2; B0 = T3; B1 = T0; B2 = T1; B3 = T4; } /* * Serpent's Linear Transformation */ inline void transform(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { B0 = rotate_left(B0, 13); B2 = rotate_left(B2, 3); B1 ^= B0 ^ B2; B3 ^= B2 ^ (B0 << 3); B1 = rotate_left(B1, 1); B3 = rotate_left(B3, 7); B0 ^= B1 ^ B3; B2 ^= B3 ^ (B1 << 7); B0 = rotate_left(B0, 5); B2 = rotate_left(B2, 22); } /* * Serpent's Inverse Linear Transformation */ inline void i_transform(u32bit& B0, u32bit& B1, u32bit& B2, u32bit& B3) { B2 = rotate_right(B2, 22); B0 = rotate_right(B0, 5); B2 ^= B3 ^ (B1 << 7); B0 ^= B1 ^ B3; B3 = rotate_right(B3, 7); B1 = rotate_right(B1, 1); B3 ^= B2 ^ (B0 << 3); B1 ^= B0 ^ B2; B2 = rotate_right(B2, 3); B0 = rotate_right(B0, 13); } } /* * XOR a key block with a data block */ #define key_xor(round, B0, B1, B2, B3) \ B0 ^= round_key[4*round ]; \ B1 ^= round_key[4*round+1]; \ B2 ^= round_key[4*round+2]; \ B3 ^= round_key[4*round+3]; /* * Serpent Encryption */ void Serpent::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit B0 = load_le(in, 0); u32bit B1 = load_le(in, 1); u32bit B2 = load_le(in, 2); u32bit B3 = load_le(in, 3); key_xor( 0,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); key_xor(32,B0,B1,B2,B3); store_le(out, B0, B1, B2, B3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Serpent Decryption */ void Serpent::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit B0 = load_le(in, 0); u32bit B1 = load_le(in, 1); u32bit B2 = load_le(in, 2); u32bit B3 = load_le(in, 3); key_xor(32,B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 0,B0,B1,B2,B3); store_le(out, B0, B1, B2, B3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } #undef key_xor #undef transform #undef i_transform /* * Serpent Key Schedule */ void Serpent::key_schedule(const byte key[], size_t length) { const u32bit PHI = 0x9E3779B9; SecureVector W(140); for(size_t i = 0; i != length / 4; ++i) W[i] = load_le(key, i); W[length / 4] |= u32bit(1) << ((length%4)*8); for(size_t i = 8; i != 140; ++i) { u32bit wi = W[i-8] ^ W[i-5] ^ W[i-3] ^ W[i-1] ^ PHI ^ u32bit(i-8); W[i] = rotate_left(wi, 11); } SBoxE4(W[ 8],W[ 9],W[ 10],W[ 11]); SBoxE3(W[ 12],W[ 13],W[ 14],W[ 15]); SBoxE2(W[ 16],W[ 17],W[ 18],W[ 19]); SBoxE1(W[ 20],W[ 21],W[ 22],W[ 23]); SBoxE8(W[ 24],W[ 25],W[ 26],W[ 27]); SBoxE7(W[ 28],W[ 29],W[ 30],W[ 31]); SBoxE6(W[ 32],W[ 33],W[ 34],W[ 35]); SBoxE5(W[ 36],W[ 37],W[ 38],W[ 39]); SBoxE4(W[ 40],W[ 41],W[ 42],W[ 43]); SBoxE3(W[ 44],W[ 45],W[ 46],W[ 47]); SBoxE2(W[ 48],W[ 49],W[ 50],W[ 51]); SBoxE1(W[ 52],W[ 53],W[ 54],W[ 55]); SBoxE8(W[ 56],W[ 57],W[ 58],W[ 59]); SBoxE7(W[ 60],W[ 61],W[ 62],W[ 63]); SBoxE6(W[ 64],W[ 65],W[ 66],W[ 67]); SBoxE5(W[ 68],W[ 69],W[ 70],W[ 71]); SBoxE4(W[ 72],W[ 73],W[ 74],W[ 75]); SBoxE3(W[ 76],W[ 77],W[ 78],W[ 79]); SBoxE2(W[ 80],W[ 81],W[ 82],W[ 83]); SBoxE1(W[ 84],W[ 85],W[ 86],W[ 87]); SBoxE8(W[ 88],W[ 89],W[ 90],W[ 91]); SBoxE7(W[ 92],W[ 93],W[ 94],W[ 95]); SBoxE6(W[ 96],W[ 97],W[ 98],W[ 99]); SBoxE5(W[100],W[101],W[102],W[103]); SBoxE4(W[104],W[105],W[106],W[107]); SBoxE3(W[108],W[109],W[110],W[111]); SBoxE2(W[112],W[113],W[114],W[115]); SBoxE1(W[116],W[117],W[118],W[119]); SBoxE8(W[120],W[121],W[122],W[123]); SBoxE7(W[124],W[125],W[126],W[127]); SBoxE6(W[128],W[129],W[130],W[131]); SBoxE5(W[132],W[133],W[134],W[135]); SBoxE4(W[136],W[137],W[138],W[139]); round_key.copy(&W[8], 132); } } Botan-1.10.12/src/block/serpent/serpent.h0000664000175000017500000000235512654331322017763 0ustar jackjack00000000000000/* * Serpent * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SERPENT_H__ #define BOTAN_SERPENT_H__ #include namespace Botan { /** * Serpent, an AES finalist */ class BOTAN_DLL Serpent : public Block_Cipher_Fixed_Params<16, 16, 32, 8> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(round_key); } std::string name() const { return "Serpent"; } BlockCipher* clone() const { return new Serpent; } Serpent() : round_key(132) {} protected: /** * For use by subclasses using SIMD, asm, etc * @return const reference to the key schedule */ const SecureVector& get_round_keys() const { return round_key; } /** * For use by subclasses that implement the key schedule * @param ks is the new key schedule value to set */ void set_round_keys(const u32bit ks[132]) { copy_mem(&round_key[0], ks, 132); } private: void key_schedule(const byte key[], size_t length); SecureVector round_key; }; } #endif Botan-1.10.12/src/block/serpent_simd/info.txt0000664000175000017500000000022512654331322020634 0ustar jackjack00000000000000define SERPENT_SIMD serpent simd simd_engine serp_simd.cpp serp_simd.h Botan-1.10.12/src/block/serpent_simd/serp_simd.cpp0000664000175000017500000007132212654331322021637 0ustar jackjack00000000000000/* * Serpent (SIMD) * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { #define SBoxE1(B0, B1, B2, B3) \ do { \ B3 ^= B0; \ SIMD_32 B4 = B1; \ B1 &= B3; \ B4 ^= B2; \ B1 ^= B0; \ B0 |= B3; \ B0 ^= B4; \ B4 ^= B3; \ B3 ^= B2; \ B2 |= B1; \ B2 ^= B4; \ B4 = ~B4; \ B4 |= B1; \ B1 ^= B3; \ B1 ^= B4; \ B3 |= B0; \ B1 ^= B3; \ B4 ^= B3; \ B3 = B0; \ B0 = B1; \ B1 = B4; \ } while(0); #define SBoxE2(B0, B1, B2, B3) \ do { \ B0 = ~B0; \ B2 = ~B2; \ SIMD_32 B4 = B0; \ B0 &= B1; \ B2 ^= B0; \ B0 |= B3; \ B3 ^= B2; \ B1 ^= B0; \ B0 ^= B4; \ B4 |= B1; \ B1 ^= B3; \ B2 |= B0; \ B2 &= B4; \ B0 ^= B1; \ B1 &= B2; \ B1 ^= B0; \ B0 &= B2; \ B4 ^= B0; \ B0 = B2; \ B2 = B3; \ B3 = B1; \ B1 = B4; \ } while(0); #define SBoxE3(B0, B1, B2, B3) \ do { \ SIMD_32 B4 = B0; \ B0 &= B2; \ B0 ^= B3; \ B2 ^= B1; \ B2 ^= B0; \ B3 |= B4; \ B3 ^= B1; \ B4 ^= B2; \ B1 = B3; \ B3 |= B4; \ B3 ^= B0; \ B0 &= B1; \ B4 ^= B0; \ B1 ^= B3; \ B1 ^= B4; \ B0 = B2; \ B2 = B1; \ B1 = B3; \ B3 = ~B4; \ } while(0); #define SBoxE4(B0, B1, B2, B3) \ do { \ SIMD_32 B4 = B0; \ B0 |= B3; \ B3 ^= B1; \ B1 &= B4; \ B4 ^= B2; \ B2 ^= B3; \ B3 &= B0; \ B4 |= B1; \ B3 ^= B4; \ B0 ^= B1; \ B4 &= B0; \ B1 ^= B3; \ B4 ^= B2; \ B1 |= B0; \ B1 ^= B2; \ B0 ^= B3; \ B2 = B1; \ B1 |= B3; \ B0 ^= B1; \ B1 = B2; \ B2 = B3; \ B3 = B4; \ } while(0); #define SBoxE5(B0, B1, B2, B3) \ do { \ B1 ^= B3; \ B3 = ~B3; \ B2 ^= B3; \ B3 ^= B0; \ SIMD_32 B4 = B1; \ B1 &= B3; \ B1 ^= B2; \ B4 ^= B3; \ B0 ^= B4; \ B2 &= B4; \ B2 ^= B0; \ B0 &= B1; \ B3 ^= B0; \ B4 |= B1; \ B4 ^= B0; \ B0 |= B3; \ B0 ^= B2; \ B2 &= B3; \ B0 = ~B0; \ B4 ^= B2; \ B2 = B0; \ B0 = B1; \ B1 = B4; \ } while(0); #define SBoxE6(B0, B1, B2, B3) \ do { \ B0 ^= B1; \ B1 ^= B3; \ B3 = ~B3; \ SIMD_32 B4 = B1; \ B1 &= B0; \ B2 ^= B3; \ B1 ^= B2; \ B2 |= B4; \ B4 ^= B3; \ B3 &= B1; \ B3 ^= B0; \ B4 ^= B1; \ B4 ^= B2; \ B2 ^= B0; \ B0 &= B3; \ B2 = ~B2; \ B0 ^= B4; \ B4 |= B3; \ B4 ^= B2; \ B2 = B0; \ B0 = B1; \ B1 = B3; \ B3 = B4; \ } while(0); #define SBoxE7(B0, B1, B2, B3) \ do { \ B2 = ~B2; \ SIMD_32 B4 = B3; \ B3 &= B0; \ B0 ^= B4; \ B3 ^= B2; \ B2 |= B4; \ B1 ^= B3; \ B2 ^= B0; \ B0 |= B1; \ B2 ^= B1; \ B4 ^= B0; \ B0 |= B3; \ B0 ^= B2; \ B4 ^= B3; \ B4 ^= B0; \ B3 = ~B3; \ B2 &= B4; \ B3 ^= B2; \ B2 = B4; \ } while(0); #define SBoxE8(B0, B1, B2, B3) \ do { \ SIMD_32 B4 = B1; \ B1 |= B2; \ B1 ^= B3; \ B4 ^= B2; \ B2 ^= B1; \ B3 |= B4; \ B3 &= B0; \ B4 ^= B2; \ B3 ^= B1; \ B1 |= B4; \ B1 ^= B0; \ B0 |= B4; \ B0 ^= B2; \ B1 ^= B4; \ B2 ^= B1; \ B1 &= B0; \ B1 ^= B4; \ B2 = ~B2; \ B2 |= B0; \ B4 ^= B2; \ B2 = B1; \ B1 = B3; \ B3 = B0; \ B0 = B4; \ } while(0); #define SBoxD1(B0, B1, B2, B3) \ do { \ B2 = ~B2; \ SIMD_32 B4 = B1; \ B1 |= B0; \ B4 = ~B4; \ B1 ^= B2; \ B2 |= B4; \ B1 ^= B3; \ B0 ^= B4; \ B2 ^= B0; \ B0 &= B3; \ B4 ^= B0; \ B0 |= B1; \ B0 ^= B2; \ B3 ^= B4; \ B2 ^= B1; \ B3 ^= B0; \ B3 ^= B1; \ B2 &= B3; \ B4 ^= B2; \ B2 = B1; \ B1 = B4; \ } while(0); #define SBoxD2(B0, B1, B2, B3) \ do { \ SIMD_32 B4 = B1; \ B1 ^= B3; \ B3 &= B1; \ B4 ^= B2; \ B3 ^= B0; \ B0 |= B1; \ B2 ^= B3; \ B0 ^= B4; \ B0 |= B2; \ B1 ^= B3; \ B0 ^= B1; \ B1 |= B3; \ B1 ^= B0; \ B4 = ~B4; \ B4 ^= B1; \ B1 |= B0; \ B1 ^= B0; \ B1 |= B4; \ B3 ^= B1; \ B1 = B0; \ B0 = B4; \ B4 = B2; \ B2 = B3; \ B3 = B4; \ } while(0); #define SBoxD3(B0, B1, B2, B3) \ do { \ B2 ^= B3; \ B3 ^= B0; \ SIMD_32 B4 = B3; \ B3 &= B2; \ B3 ^= B1; \ B1 |= B2; \ B1 ^= B4; \ B4 &= B3; \ B2 ^= B3; \ B4 &= B0; \ B4 ^= B2; \ B2 &= B1; \ B2 |= B0; \ B3 = ~B3; \ B2 ^= B3; \ B0 ^= B3; \ B0 &= B1; \ B3 ^= B4; \ B3 ^= B0; \ B0 = B1; \ B1 = B4; \ } while(0); #define SBoxD4(B0, B1, B2, B3) \ do { \ SIMD_32 B4 = B2; \ B2 ^= B1; \ B0 ^= B2; \ B4 &= B2; \ B4 ^= B0; \ B0 &= B1; \ B1 ^= B3; \ B3 |= B4; \ B2 ^= B3; \ B0 ^= B3; \ B1 ^= B4; \ B3 &= B2; \ B3 ^= B1; \ B1 ^= B0; \ B1 |= B2; \ B0 ^= B3; \ B1 ^= B4; \ B0 ^= B1; \ B4 = B0; \ B0 = B2; \ B2 = B3; \ B3 = B4; \ } while(0); #define SBoxD5(B0, B1, B2, B3) \ do { \ SIMD_32 B4 = B2; \ B2 &= B3; \ B2 ^= B1; \ B1 |= B3; \ B1 &= B0; \ B4 ^= B2; \ B4 ^= B1; \ B1 &= B2; \ B0 = ~B0; \ B3 ^= B4; \ B1 ^= B3; \ B3 &= B0; \ B3 ^= B2; \ B0 ^= B1; \ B2 &= B0; \ B3 ^= B0; \ B2 ^= B4; \ B2 |= B3; \ B3 ^= B0; \ B2 ^= B1; \ B1 = B3; \ B3 = B4; \ } while(0); #define SBoxD6(B0, B1, B2, B3) \ do { \ B1 = ~B1; \ SIMD_32 B4 = B3; \ B2 ^= B1; \ B3 |= B0; \ B3 ^= B2; \ B2 |= B1; \ B2 &= B0; \ B4 ^= B3; \ B2 ^= B4; \ B4 |= B0; \ B4 ^= B1; \ B1 &= B2; \ B1 ^= B3; \ B4 ^= B2; \ B3 &= B4; \ B4 ^= B1; \ B3 ^= B4; \ B4 = ~B4; \ B3 ^= B0; \ B0 = B1; \ B1 = B4; \ B4 = B3; \ B3 = B2; \ B2 = B4; \ } while(0); #define SBoxD7(B0, B1, B2, B3) \ do { \ B0 ^= B2; \ SIMD_32 B4 = B2; \ B2 &= B0; \ B4 ^= B3; \ B2 = ~B2; \ B3 ^= B1; \ B2 ^= B3; \ B4 |= B0; \ B0 ^= B2; \ B3 ^= B4; \ B4 ^= B1; \ B1 &= B3; \ B1 ^= B0; \ B0 ^= B3; \ B0 |= B2; \ B3 ^= B1; \ B4 ^= B0; \ B0 = B1; \ B1 = B2; \ B2 = B4; \ } while(0); #define SBoxD8(B0, B1, B2, B3) \ do { \ SIMD_32 B4 = B2; \ B2 ^= B0; \ B0 &= B3; \ B4 |= B3; \ B2 = ~B2; \ B3 ^= B1; \ B1 |= B0; \ B0 ^= B2; \ B2 &= B4; \ B3 &= B4; \ B1 ^= B2; \ B2 ^= B0; \ B0 |= B2; \ B4 ^= B1; \ B0 ^= B3; \ B3 ^= B4; \ B4 |= B0; \ B3 ^= B2; \ B4 ^= B2; \ B2 = B1; \ B1 = B0; \ B0 = B3; \ B3 = B4; \ } while(0); #define key_xor(round, B0, B1, B2, B3) \ do { \ B0 ^= SIMD_32(keys[4*round ]); \ B1 ^= SIMD_32(keys[4*round+1]); \ B2 ^= SIMD_32(keys[4*round+2]); \ B3 ^= SIMD_32(keys[4*round+3]); \ } while(0); /* * Serpent's linear transformations */ #define transform(B0, B1, B2, B3) \ do { \ B0.rotate_left(13); \ B2.rotate_left(3); \ B1 ^= B0 ^ B2; \ B3 ^= B2 ^ (B0 << 3); \ B1.rotate_left(1); \ B3.rotate_left(7); \ B0 ^= B1 ^ B3; \ B2 ^= B3 ^ (B1 << 7); \ B0.rotate_left(5); \ B2.rotate_left(22); \ } while(0); #define i_transform(B0, B1, B2, B3) \ do { \ B2.rotate_right(22); \ B0.rotate_right(5); \ B2 ^= B3 ^ (B1 << 7); \ B0 ^= B1 ^ B3; \ B3.rotate_right(7); \ B1.rotate_right(1); \ B3 ^= B2 ^ (B0 << 3); \ B1 ^= B0 ^ B2; \ B2.rotate_right(3); \ B0.rotate_right(13); \ } while(0); /* * SIMD Serpent Encryption of 4 blocks in parallel */ void serpent_encrypt_4(const byte in[64], byte out[64], const u32bit keys[132]) { SIMD_32 B0 = SIMD_32::load_le(in); SIMD_32 B1 = SIMD_32::load_le(in + 16); SIMD_32 B2 = SIMD_32::load_le(in + 32); SIMD_32 B3 = SIMD_32::load_le(in + 48); SIMD_32::transpose(B0, B1, B2, B3); key_xor( 0,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); key_xor(32,B0,B1,B2,B3); SIMD_32::transpose(B0, B1, B2, B3); B0.store_le(out); B1.store_le(out + 16); B2.store_le(out + 32); B3.store_le(out + 48); } /* * SIMD Serpent Decryption of 4 blocks in parallel */ void serpent_decrypt_4(const byte in[64], byte out[64], const u32bit keys[132]) { SIMD_32 B0 = SIMD_32::load_le(in); SIMD_32 B1 = SIMD_32::load_le(in + 16); SIMD_32 B2 = SIMD_32::load_le(in + 32); SIMD_32 B3 = SIMD_32::load_le(in + 48); SIMD_32::transpose(B0, B1, B2, B3); key_xor(32,B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 0,B0,B1,B2,B3); SIMD_32::transpose(B0, B1, B2, B3); B0.store_le(out); B1.store_le(out + 16); B2.store_le(out + 32); B3.store_le(out + 48); } } #undef key_xor #undef transform #undef i_transform #undef SBoxE1 #undef SBoxE2 #undef SBoxE3 #undef SBoxE4 #undef SBoxE5 #undef SBoxE6 #undef SBoxE7 #undef SBoxE8 #undef SBoxD1 #undef SBoxD2 #undef SBoxD3 #undef SBoxD4 #undef SBoxD5 #undef SBoxD6 #undef SBoxD7 #undef SBoxD8 /* * Serpent Encryption */ void Serpent_SIMD::encrypt_n(const byte in[], byte out[], size_t blocks) const { const u32bit* KS = &(this->get_round_keys()[0]); while(blocks >= 4) { serpent_encrypt_4(in, out, KS); in += 4 * BLOCK_SIZE; out += 4 * BLOCK_SIZE; blocks -= 4; } if(blocks) Serpent::encrypt_n(in, out, blocks); } /* * Serpent Decryption */ void Serpent_SIMD::decrypt_n(const byte in[], byte out[], size_t blocks) const { const u32bit* KS = &(this->get_round_keys()[0]); while(blocks >= 4) { serpent_decrypt_4(in, out, KS); in += 4 * BLOCK_SIZE; out += 4 * BLOCK_SIZE; blocks -= 4; } if(blocks) Serpent::decrypt_n(in, out, blocks); } } Botan-1.10.12/src/block/serpent_simd/serp_simd.h0000664000175000017500000000111212654331322021272 0ustar jackjack00000000000000/* * Serpent (SIMD) * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SERPENT_SIMD_H__ #define BOTAN_SERPENT_SIMD_H__ #include namespace Botan { /** * Serpent implementation using SIMD */ class BOTAN_DLL Serpent_SIMD : public Serpent { public: size_t parallelism() const { return 4; } void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; BlockCipher* clone() const { return new Serpent_SIMD; } }; } #endif Botan-1.10.12/src/block/serpent_x86_32/info.txt0000664000175000017500000000015012654331322020626 0ustar jackjack00000000000000define SERPENT_X86_32 load_on asm_ok x86_32 asm_x86_32 serpent Botan-1.10.12/src/block/serpent_x86_32/serp_x86_32.cpp0000664000175000017500000000362512654331322021632 0ustar jackjack00000000000000/* * Serpent in x86-32 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { extern "C" { /** * Entry point for Serpent encryption in x86 asm * @param in the input block * @param out the output block * @param ks the key schedule */ void botan_serpent_x86_32_encrypt(const byte in[16], byte out[16], const u32bit ks[132]); /** * Entry point for Serpent decryption in x86 asm * @param in the input block * @param out the output block * @param ks the key schedule */ void botan_serpent_x86_32_decrypt(const byte in[16], byte out[16], const u32bit ks[132]); /** * Entry point for Serpent key schedule in x86 asm * @param ks holds the initial working key (padded), and is set to the final key schedule */ void botan_serpent_x86_32_key_schedule(u32bit ks[140]); } /* * Serpent Encryption */ void Serpent_X86_32::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { botan_serpent_x86_32_encrypt(in, out, this->get_round_keys()); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Serpent Decryption */ void Serpent_X86_32::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { botan_serpent_x86_32_decrypt(in, out, this->get_round_keys()); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Serpent Key Schedule */ void Serpent_X86_32::key_schedule(const byte key[], size_t length) { SecureVector W(140); for(size_t i = 0; i != length / 4; ++i) W[i] = load_le(key, i); W[length / 4] |= u32bit(1) << ((length%4)*8); botan_serpent_x86_32_key_schedule(W); this->set_round_keys(W + 8); } } Botan-1.10.12/src/block/serpent_x86_32/serp_x86_32.h0000664000175000017500000000116112654331322021270 0ustar jackjack00000000000000/* * Serpent in x86-32 asm * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SERPENT_X86_32_H__ #define BOTAN_SERPENT_X86_32_H__ #include namespace Botan { /** * Serpent implementation in x86-32 assembly */ class BOTAN_DLL Serpent_X86_32 : public Serpent { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; BlockCipher* clone() const { return new Serpent_X86_32; } private: void key_schedule(const byte[], size_t); }; } #endif Botan-1.10.12/src/block/serpent_x86_32/serp_x86_32_imp.S0000664000175000017500000005324212654331322022117 0ustar jackjack00000000000000/* * Serpent in x86-32 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include START_LISTING(serp_x86_32.S) #define SBOX_E1(A, B, C, D, T) \ XOR(D, A) ; \ ASSIGN(T, B) ; \ AND(B, D) ; \ XOR(T, C) ; \ XOR(B, A) ; \ OR(A, D) ; \ XOR(A, T) ; \ XOR(T, D) ; \ XOR(D, C) ; \ OR(C, B) ; \ XOR(C, T) ; \ NOT(T) ; \ OR(T, B) ; \ XOR(B, D) ; \ XOR(B, T) ; \ OR(D, A) ; \ XOR(B, D) ; \ XOR(T, D) ; \ ASSIGN(D, A) ; \ ASSIGN(A, B) ; \ ASSIGN(B, T) ; #define SBOX_E2(A, B, C, D, T) \ NOT(A) ; \ NOT(C) ; \ ASSIGN(T, A) ; \ AND(A, B) ; \ XOR(C, A) ; \ OR(A, D) ; \ XOR(D, C) ; \ XOR(B, A) ; \ XOR(A, T) ; \ OR(T, B) ; \ XOR(B, D) ; \ OR(C, A) ; \ AND(C, T) ; \ XOR(A, B) ; \ AND(B, C) ; \ XOR(B, A) ; \ AND(A, C) ; \ XOR(T, A) ; \ ASSIGN(A, C) ; \ ASSIGN(C, D) ; \ ASSIGN(D, B) ; \ ASSIGN(B, T) ; #define SBOX_E3(A, B, C, D, T) \ ASSIGN(T, A) ; \ AND(A, C) ; \ XOR(A, D) ; \ XOR(C, B) ; \ XOR(C, A) ; \ OR(D, T) ; \ XOR(D, B) ; \ XOR(T, C) ; \ ASSIGN(B, D) ; \ OR(D, T) ; \ XOR(D, A) ; \ AND(A, B) ; \ XOR(T, A) ; \ XOR(B, D) ; \ XOR(B, T) ; \ NOT(T) ; \ ASSIGN(A, C) ; \ ASSIGN(C, B) ; \ ASSIGN(B, D) ; \ ASSIGN(D, T) ; #define SBOX_E4(A, B, C, D, T) \ ASSIGN(T, A) ; \ OR(A, D) ; \ XOR(D, B) ; \ AND(B, T) ; \ XOR(T, C) ; \ XOR(C, D) ; \ AND(D, A) ; \ OR(T, B) ; \ XOR(D, T) ; \ XOR(A, B) ; \ AND(T, A) ; \ XOR(B, D) ; \ XOR(T, C) ; \ OR(B, A) ; \ XOR(B, C) ; \ XOR(A, D) ; \ ASSIGN(C, B) ; \ OR(B, D) ; \ XOR(B, A) ; \ ASSIGN(A, B) ; \ ASSIGN(B, C) ; \ ASSIGN(C, D) ; \ ASSIGN(D, T) ; #define SBOX_E5(A, B, C, D, T) \ XOR(B, D) ; \ NOT(D) ; \ XOR(C, D) ; \ XOR(D, A) ; \ ASSIGN(T, B) ; \ AND(B, D) ; \ XOR(B, C) ; \ XOR(T, D) ; \ XOR(A, T) ; \ AND(C, T) ; \ XOR(C, A) ; \ AND(A, B) ; \ XOR(D, A) ; \ OR(T, B) ; \ XOR(T, A) ; \ OR(A, D) ; \ XOR(A, C) ; \ AND(C, D) ; \ NOT(A) ; \ XOR(T, C) ; \ ASSIGN(C, A) ; \ ASSIGN(A, B) ; \ ASSIGN(B, T) ; #define SBOX_E6(A, B, C, D, T) \ XOR(A, B) ; \ XOR(B, D) ; \ NOT(D) ; \ ASSIGN(T, B) ; \ AND(B, A) ; \ XOR(C, D) ; \ XOR(B, C) ; \ OR(C, T) ; \ XOR(T, D) ; \ AND(D, B) ; \ XOR(D, A) ; \ XOR(T, B) ; \ XOR(T, C) ; \ XOR(C, A) ; \ AND(A, D) ; \ NOT(C) ; \ XOR(A, T) ; \ OR(T, D) ; \ XOR(T, C) ; \ ASSIGN(C, A) ; \ ASSIGN(A, B) ; \ ASSIGN(B, D) ; \ ASSIGN(D, T) ; #define SBOX_E7(A, B, C, D, T) \ NOT(C) ; \ ASSIGN(T, D) ; \ AND(D, A) ; \ XOR(A, T) ; \ XOR(D, C) ; \ OR(C, T) ; \ XOR(B, D) ; \ XOR(C, A) ; \ OR(A, B) ; \ XOR(C, B) ; \ XOR(T, A) ; \ OR(A, D) ; \ XOR(A, C) ; \ XOR(T, D) ; \ XOR(T, A) ; \ NOT(D) ; \ AND(C, T) ; \ XOR(C, D) ; \ ASSIGN(D, C) ; \ ASSIGN(C, T) ; #define SBOX_E8(A, B, C, D, T) \ ASSIGN(T, B) ; \ OR(B, C) ; \ XOR(B, D) ; \ XOR(T, C) ; \ XOR(C, B) ; \ OR(D, T) ; \ AND(D, A) ; \ XOR(T, C) ; \ XOR(D, B) ; \ OR(B, T) ; \ XOR(B, A) ; \ OR(A, T) ; \ XOR(A, C) ; \ XOR(B, T) ; \ XOR(C, B) ; \ AND(B, A) ; \ XOR(B, T) ; \ NOT(C) ; \ OR(C, A) ; \ XOR(T, C) ; \ ASSIGN(C, B) ; \ ASSIGN(B, D) ; \ ASSIGN(D, A) ; \ ASSIGN(A, T) ; #define SBOX_D1(A, B, C, D, T) \ NOT(C) ; \ ASSIGN(T, B) ; \ OR(B, A) ; \ NOT(T) ; \ XOR(B, C) ; \ OR(C, T) ; \ XOR(B, D) ; \ XOR(A, T) ; \ XOR(C, A) ; \ AND(A, D) ; \ XOR(T, A) ; \ OR(A, B) ; \ XOR(A, C) ; \ XOR(D, T) ; \ XOR(C, B) ; \ XOR(D, A) ; \ XOR(D, B) ; \ AND(C, D) ; \ XOR(T, C) ; \ ASSIGN(C, B) ; \ ASSIGN(B, T) ; #define SBOX_D2(A, B, C, D, T) \ ASSIGN(T, B) ; \ XOR(B, D) ; \ AND(D, B) ; \ XOR(T, C) ; \ XOR(D, A) ; \ OR(A, B) ; \ XOR(C, D) ; \ XOR(A, T) ; \ OR(A, C) ; \ XOR(B, D) ; \ XOR(A, B) ; \ OR(B, D) ; \ XOR(B, A) ; \ NOT(T) ; \ XOR(T, B) ; \ OR(B, A) ; \ XOR(B, A) ; \ OR(B, T) ; \ XOR(D, B) ; \ ASSIGN(B, A) ; \ ASSIGN(A, T) ; \ ASSIGN(T, D) ; \ ASSIGN(D, C) ; \ ASSIGN(C, T) ; #define SBOX_D3(A, B, C, D, T) \ XOR(C, D) ; \ XOR(D, A) ; \ ASSIGN(T, D) ; \ AND(D, C) ; \ XOR(D, B) ; \ OR(B, C) ; \ XOR(B, T) ; \ AND(T, D) ; \ XOR(C, D) ; \ AND(T, A) ; \ XOR(T, C) ; \ AND(C, B) ; \ OR(C, A) ; \ NOT(D) ; \ XOR(C, D) ; \ XOR(A, D) ; \ AND(A, B) ; \ XOR(D, T) ; \ XOR(D, A) ; \ ASSIGN(A, B) ; \ ASSIGN(B, T) ; #define SBOX_D4(A, B, C, D, T) \ ASSIGN(T, C) ; \ XOR(C, B) ; \ XOR(A, C) ; \ AND(T, C) ; \ XOR(T, A) ; \ AND(A, B) ; \ XOR(B, D) ; \ OR(D, T) ; \ XOR(C, D) ; \ XOR(A, D) ; \ XOR(B, T) ; \ AND(D, C) ; \ XOR(D, B) ; \ XOR(B, A) ; \ OR(B, C) ; \ XOR(A, D) ; \ XOR(B, T) ; \ XOR(A, B) ; \ ASSIGN(T, A) ; \ ASSIGN(A, C) ; \ ASSIGN(C, D) ; \ ASSIGN(D, T) ; #define SBOX_D5(A, B, C, D, T) \ ASSIGN(T, C) ; \ AND(C, D) ; \ XOR(C, B) ; \ OR(B, D) ; \ AND(B, A) ; \ XOR(T, C) ; \ XOR(T, B) ; \ AND(B, C) ; \ NOT(A) ; \ XOR(D, T) ; \ XOR(B, D) ; \ AND(D, A) ; \ XOR(D, C) ; \ XOR(A, B) ; \ AND(C, A) ; \ XOR(D, A) ; \ XOR(C, T) ; \ OR(C, D) ; \ XOR(D, A) ; \ XOR(C, B) ; \ ASSIGN(B, D) ; \ ASSIGN(D, T) ; #define SBOX_D6(A, B, C, D, T) \ NOT(B) ; \ ASSIGN(T, D) ; \ XOR(C, B) ; \ OR(D, A) ; \ XOR(D, C) ; \ OR(C, B) ; \ AND(C, A) ; \ XOR(T, D) ; \ XOR(C, T) ; \ OR(T, A) ; \ XOR(T, B) ; \ AND(B, C) ; \ XOR(B, D) ; \ XOR(T, C) ; \ AND(D, T) ; \ XOR(T, B) ; \ XOR(D, T) ; \ NOT(T) ; \ XOR(D, A) ; \ ASSIGN(A, B) ; \ ASSIGN(B, T) ; \ ASSIGN(T, D) ; \ ASSIGN(D, C) ; \ ASSIGN(C, T) ; #define SBOX_D7(A, B, C, D, T) \ XOR(A, C) ; \ ASSIGN(T, C) ; \ AND(C, A) ; \ XOR(T, D) ; \ NOT(C) ; \ XOR(D, B) ; \ XOR(C, D) ; \ OR(T, A) ; \ XOR(A, C) ; \ XOR(D, T) ; \ XOR(T, B) ; \ AND(B, D) ; \ XOR(B, A) ; \ XOR(A, D) ; \ OR(A, C) ; \ XOR(D, B) ; \ XOR(T, A) ; \ ASSIGN(A, B) ; \ ASSIGN(B, C) ; \ ASSIGN(C, T) ; #define SBOX_D8(A, B, C, D, T) \ ASSIGN(T, C) ; \ XOR(C, A) ; \ AND(A, D) ; \ OR(T, D) ; \ NOT(C) ; \ XOR(D, B) ; \ OR(B, A) ; \ XOR(A, C) ; \ AND(C, T) ; \ AND(D, T) ; \ XOR(B, C) ; \ XOR(C, A) ; \ OR(A, C) ; \ XOR(T, B) ; \ XOR(A, D) ; \ XOR(D, T) ; \ OR(T, A) ; \ XOR(D, C) ; \ XOR(T, C) ; \ ASSIGN(C, B) ; \ ASSIGN(B, A) ; \ ASSIGN(A, D) ; \ ASSIGN(D, T) ; #define TRANSFORM(A, B, C, D, T) \ ROTL_IMM(A, 13) ; \ ROTL_IMM(C, 3) ; \ SHL2_3(T, A) ; \ XOR(B, A) ; \ XOR(D, C) ; \ XOR(B, C) ; \ XOR(D, T) ; \ ROTL_IMM(B, 1) ; \ ROTL_IMM(D, 7) ; \ ASSIGN(T, B) ; \ SHL_IMM(T, 7) ; \ XOR(A, B) ; \ XOR(C, D) ; \ XOR(A, D) ; \ XOR(C, T) ; \ ROTL_IMM(A, 5) ; \ ROTL_IMM(C, 22) ; #define I_TRANSFORM(A, B, C, D, T) \ ROTR_IMM(C, 22) ; \ ROTR_IMM(A, 5) ; \ ASSIGN(T, B) ; \ SHL_IMM(T, 7) ; \ XOR(A, B) ; \ XOR(C, D) ; \ XOR(A, D) ; \ XOR(C, T) ; \ ROTR_IMM(D, 7) ; \ ROTR_IMM(B, 1) ; \ SHL2_3(T, A) ; \ XOR(B, C) ; \ XOR(D, C) ; \ XOR(B, A) ; \ XOR(D, T) ; \ ROTR_IMM(C, 3) ; \ ROTR_IMM(A, 13) ; #define KEY_XOR(A, B, C, D, N) \ XOR(A, ARRAY4(EDI, (4*N ))) ; \ XOR(B, ARRAY4(EDI, (4*N+1))) ; \ XOR(C, ARRAY4(EDI, (4*N+2))) ; \ XOR(D, ARRAY4(EDI, (4*N+3))) ; /* * Serpent Encryption */ START_FUNCTION(botan_serpent_x86_32_encrypt) SPILL_REGS() #define PUSHED 4 ASSIGN(EBP, ARG(1)) /* input block */ ASSIGN(EAX, ARRAY4(EBP, 0)) ASSIGN(EBX, ARRAY4(EBP, 1)) ASSIGN(ECX, ARRAY4(EBP, 2)) ASSIGN(EDX, ARRAY4(EBP, 3)) ASSIGN(EDI, ARG(3)) /* round keys */ ZEROIZE(EBP) #define E_ROUND(A, B, C, D, T, N, SBOX) \ KEY_XOR(A, B, C, D, N) \ SBOX(A, B, C, D, T) \ TRANSFORM(A, B, C, D, T) E_ROUND(EAX, EBX, ECX, EDX, EBP, 0, SBOX_E1) E_ROUND(EAX, EBX, ECX, EDX, EBP, 1, SBOX_E2) E_ROUND(EAX, EBX, ECX, EDX, EBP, 2, SBOX_E3) E_ROUND(EAX, EBX, ECX, EDX, EBP, 3, SBOX_E4) E_ROUND(EAX, EBX, ECX, EDX, EBP, 4, SBOX_E5) E_ROUND(EAX, EBX, ECX, EDX, EBP, 5, SBOX_E6) E_ROUND(EAX, EBX, ECX, EDX, EBP, 6, SBOX_E7) E_ROUND(EAX, EBX, ECX, EDX, EBP, 7, SBOX_E8) E_ROUND(EAX, EBX, ECX, EDX, EBP, 8, SBOX_E1) E_ROUND(EAX, EBX, ECX, EDX, EBP, 9, SBOX_E2) E_ROUND(EAX, EBX, ECX, EDX, EBP, 10, SBOX_E3) E_ROUND(EAX, EBX, ECX, EDX, EBP, 11, SBOX_E4) E_ROUND(EAX, EBX, ECX, EDX, EBP, 12, SBOX_E5) E_ROUND(EAX, EBX, ECX, EDX, EBP, 13, SBOX_E6) E_ROUND(EAX, EBX, ECX, EDX, EBP, 14, SBOX_E7) E_ROUND(EAX, EBX, ECX, EDX, EBP, 15, SBOX_E8) E_ROUND(EAX, EBX, ECX, EDX, EBP, 16, SBOX_E1) E_ROUND(EAX, EBX, ECX, EDX, EBP, 17, SBOX_E2) E_ROUND(EAX, EBX, ECX, EDX, EBP, 18, SBOX_E3) E_ROUND(EAX, EBX, ECX, EDX, EBP, 19, SBOX_E4) E_ROUND(EAX, EBX, ECX, EDX, EBP, 20, SBOX_E5) E_ROUND(EAX, EBX, ECX, EDX, EBP, 21, SBOX_E6) E_ROUND(EAX, EBX, ECX, EDX, EBP, 22, SBOX_E7) E_ROUND(EAX, EBX, ECX, EDX, EBP, 23, SBOX_E8) E_ROUND(EAX, EBX, ECX, EDX, EBP, 24, SBOX_E1) E_ROUND(EAX, EBX, ECX, EDX, EBP, 25, SBOX_E2) E_ROUND(EAX, EBX, ECX, EDX, EBP, 26, SBOX_E3) E_ROUND(EAX, EBX, ECX, EDX, EBP, 27, SBOX_E4) E_ROUND(EAX, EBX, ECX, EDX, EBP, 28, SBOX_E5) E_ROUND(EAX, EBX, ECX, EDX, EBP, 29, SBOX_E6) E_ROUND(EAX, EBX, ECX, EDX, EBP, 30, SBOX_E7) KEY_XOR(EAX, EBX, ECX, EDX, 31) SBOX_E8(EAX, EBX, ECX, EDX, EBP) KEY_XOR(EAX, EBX, ECX, EDX, 32) ASSIGN(EBP, ARG(2)) /* output block */ ASSIGN(ARRAY4(EBP, 0), EAX) ASSIGN(ARRAY4(EBP, 1), EBX) ASSIGN(ARRAY4(EBP, 2), ECX) ASSIGN(ARRAY4(EBP, 3), EDX) RESTORE_REGS() #undef PUSHED END_FUNCTION(botan_serpent_x86_32_encrypt) /* * Serpent Decryption */ START_FUNCTION(botan_serpent_x86_32_decrypt) SPILL_REGS() #define PUSHED 4 ASSIGN(EBP, ARG(1)) /* input block */ ASSIGN(EAX, ARRAY4(EBP, 0)) ASSIGN(EBX, ARRAY4(EBP, 1)) ASSIGN(ECX, ARRAY4(EBP, 2)) ASSIGN(EDX, ARRAY4(EBP, 3)) ASSIGN(EDI, ARG(3)) /* round keys */ ZEROIZE(EBP) #define D_ROUND(A, B, C, D, T, N, SBOX) \ I_TRANSFORM(A, B, C, D, T) \ SBOX(A, B, C, D, T) \ KEY_XOR(A, B, C, D, N) \ KEY_XOR(EAX, EBX, ECX, EDX, 32) SBOX_D8(EAX, EBX, ECX, EDX, EBP) KEY_XOR(EAX, EBX, ECX, EDX, 31) D_ROUND(EAX, EBX, ECX, EDX, EBP, 30, SBOX_D7) D_ROUND(EAX, EBX, ECX, EDX, EBP, 29, SBOX_D6) D_ROUND(EAX, EBX, ECX, EDX, EBP, 28, SBOX_D5) D_ROUND(EAX, EBX, ECX, EDX, EBP, 27, SBOX_D4) D_ROUND(EAX, EBX, ECX, EDX, EBP, 26, SBOX_D3) D_ROUND(EAX, EBX, ECX, EDX, EBP, 25, SBOX_D2) D_ROUND(EAX, EBX, ECX, EDX, EBP, 24, SBOX_D1) D_ROUND(EAX, EBX, ECX, EDX, EBP, 23, SBOX_D8) D_ROUND(EAX, EBX, ECX, EDX, EBP, 22, SBOX_D7) D_ROUND(EAX, EBX, ECX, EDX, EBP, 21, SBOX_D6) D_ROUND(EAX, EBX, ECX, EDX, EBP, 20, SBOX_D5) D_ROUND(EAX, EBX, ECX, EDX, EBP, 19, SBOX_D4) D_ROUND(EAX, EBX, ECX, EDX, EBP, 18, SBOX_D3) D_ROUND(EAX, EBX, ECX, EDX, EBP, 17, SBOX_D2) D_ROUND(EAX, EBX, ECX, EDX, EBP, 16, SBOX_D1) D_ROUND(EAX, EBX, ECX, EDX, EBP, 15, SBOX_D8) D_ROUND(EAX, EBX, ECX, EDX, EBP, 14, SBOX_D7) D_ROUND(EAX, EBX, ECX, EDX, EBP, 13, SBOX_D6) D_ROUND(EAX, EBX, ECX, EDX, EBP, 12, SBOX_D5) D_ROUND(EAX, EBX, ECX, EDX, EBP, 11, SBOX_D4) D_ROUND(EAX, EBX, ECX, EDX, EBP, 10, SBOX_D3) D_ROUND(EAX, EBX, ECX, EDX, EBP, 9, SBOX_D2) D_ROUND(EAX, EBX, ECX, EDX, EBP, 8, SBOX_D1) D_ROUND(EAX, EBX, ECX, EDX, EBP, 7, SBOX_D8) D_ROUND(EAX, EBX, ECX, EDX, EBP, 6, SBOX_D7) D_ROUND(EAX, EBX, ECX, EDX, EBP, 5, SBOX_D6) D_ROUND(EAX, EBX, ECX, EDX, EBP, 4, SBOX_D5) D_ROUND(EAX, EBX, ECX, EDX, EBP, 3, SBOX_D4) D_ROUND(EAX, EBX, ECX, EDX, EBP, 2, SBOX_D3) D_ROUND(EAX, EBX, ECX, EDX, EBP, 1, SBOX_D2) D_ROUND(EAX, EBX, ECX, EDX, EBP, 0, SBOX_D1) ASSIGN(EBP, ARG(2)) /* output block */ ASSIGN(ARRAY4(EBP, 0), EAX) ASSIGN(ARRAY4(EBP, 1), EBX) ASSIGN(ARRAY4(EBP, 2), ECX) ASSIGN(ARRAY4(EBP, 3), EDX) RESTORE_REGS() #undef PUSHED END_FUNCTION(botan_serpent_x86_32_decrypt) /* * Serpent Key Schedule */ START_FUNCTION(botan_serpent_x86_32_key_schedule) SPILL_REGS() #define PUSHED 4 ASSIGN(EDI, ARG(1)) /* round keys */ ASSIGN(ESI, IMM(8)) ADD_IMM(EDI, 32) START_LOOP(.L_SERP_EXPANSION) ASSIGN(EAX, ARRAY4(EDI, -1)) ASSIGN(EBX, ARRAY4(EDI, -3)) ASSIGN(ECX, ARRAY4(EDI, -5)) ASSIGN(EDX, ARRAY4(EDI, -8)) ASSIGN(EBP, ESI) SUB_IMM(EBP, 8) XOR(EBP, IMM(0x9E3779B9)) XOR(EAX, EBX) XOR(ECX, EDX) XOR(EAX, EBP) XOR(EAX, ECX) ROTL_IMM(EAX, 11) ASSIGN(ARRAY4(EDI, 0), EAX) ADD_IMM(ESI, 1) ADD_IMM(EDI, 4) LOOP_UNTIL_EQ(ESI, 140, .L_SERP_EXPANSION) ASSIGN(EDI, ARG(1)) /* round keys */ #define LOAD_AND_SBOX(MSG, SBOX) \ ASSIGN(EAX, ARRAY4(EDI, (4*MSG+ 8))) ; \ ASSIGN(EBX, ARRAY4(EDI, (4*MSG+ 9))) ; \ ASSIGN(ECX, ARRAY4(EDI, (4*MSG+10))) ; \ ASSIGN(EDX, ARRAY4(EDI, (4*MSG+11))) ; \ SBOX(EAX, EBX, ECX, EDX, EBP) ; \ ASSIGN(ARRAY4(EDI, (4*MSG+ 8)), EAX) ; \ ASSIGN(ARRAY4(EDI, (4*MSG+ 9)), EBX) ; \ ASSIGN(ARRAY4(EDI, (4*MSG+10)), ECX) ; \ ASSIGN(ARRAY4(EDI, (4*MSG+11)), EDX) LOAD_AND_SBOX( 0, SBOX_E4) LOAD_AND_SBOX( 1, SBOX_E3) LOAD_AND_SBOX( 2, SBOX_E2) LOAD_AND_SBOX( 3, SBOX_E1) LOAD_AND_SBOX( 4, SBOX_E8) LOAD_AND_SBOX( 5, SBOX_E7) LOAD_AND_SBOX( 6, SBOX_E6) LOAD_AND_SBOX( 7, SBOX_E5) LOAD_AND_SBOX( 8, SBOX_E4) LOAD_AND_SBOX( 9, SBOX_E3) LOAD_AND_SBOX(10, SBOX_E2) LOAD_AND_SBOX(11, SBOX_E1) LOAD_AND_SBOX(12, SBOX_E8) LOAD_AND_SBOX(13, SBOX_E7) LOAD_AND_SBOX(14, SBOX_E6) LOAD_AND_SBOX(15, SBOX_E5) LOAD_AND_SBOX(16, SBOX_E4) LOAD_AND_SBOX(17, SBOX_E3) LOAD_AND_SBOX(18, SBOX_E2) LOAD_AND_SBOX(19, SBOX_E1) LOAD_AND_SBOX(20, SBOX_E8) LOAD_AND_SBOX(21, SBOX_E7) LOAD_AND_SBOX(22, SBOX_E6) LOAD_AND_SBOX(23, SBOX_E5) LOAD_AND_SBOX(24, SBOX_E4) LOAD_AND_SBOX(25, SBOX_E3) LOAD_AND_SBOX(26, SBOX_E2) LOAD_AND_SBOX(27, SBOX_E1) LOAD_AND_SBOX(28, SBOX_E8) LOAD_AND_SBOX(29, SBOX_E7) LOAD_AND_SBOX(30, SBOX_E6) LOAD_AND_SBOX(31, SBOX_E5) LOAD_AND_SBOX(32, SBOX_E4) RESTORE_REGS() #undef PUSHED END_FUNCTION(botan_serpent_x86_32_key_schedule) Botan-1.10.12/src/block/skipjack/info.txt0000664000175000017500000000002012654331322017730 0ustar jackjack00000000000000define SKIPJACK Botan-1.10.12/src/block/skipjack/skipjack.cpp0000664000175000017500000001505512654331322020555 0ustar jackjack00000000000000/* * Skipjack * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { /* * Skipjack Stepping Rule 'A' */ void step_A(u16bit& W1, u16bit& W4, size_t round, const byte FTAB[]) { byte G1 = get_byte(0, W1), G2 = get_byte(1, W1), G3; G3 = FTAB[((4*round-4)%10)*256 + G2] ^ G1; G1 = FTAB[((4*round-3)%10)*256 + G3] ^ G2; G2 = FTAB[((4*round-2)%10)*256 + G1] ^ G3; G3 = FTAB[((4*round-1)%10)*256 + G2] ^ G1; W1 = make_u16bit(G2, G3); W4 ^= W1 ^ round; } /* * Skipjack Stepping Rule 'B' */ void step_B(u16bit& W1, u16bit& W2, size_t round, const byte FTAB[]) { W2 ^= W1 ^ round; byte G1 = get_byte(0, W1), G2 = get_byte(1, W1), G3; G3 = FTAB[((4*round-4)%10)*256 + G2] ^ G1; G1 = FTAB[((4*round-3)%10)*256 + G3] ^ G2; G2 = FTAB[((4*round-2)%10)*256 + G1] ^ G3; G3 = FTAB[((4*round-1)%10)*256 + G2] ^ G1; W1 = make_u16bit(G2, G3); } /* * Skipjack Invserse Stepping Rule 'A' */ void step_Ai(u16bit& W1, u16bit& W2, size_t round, const byte FTAB[]) { W1 ^= W2 ^ round; byte G1 = get_byte(1, W2), G2 = get_byte(0, W2), G3; G3 = FTAB[((4 * round - 1) % 10)*256 + G2] ^ G1; G1 = FTAB[((4 * round - 2) % 10)*256 + G3] ^ G2; G2 = FTAB[((4 * round - 3) % 10)*256 + G1] ^ G3; G3 = FTAB[((4 * round - 4) % 10)*256 + G2] ^ G1; W2 = make_u16bit(G3, G2); } /* * Skipjack Invserse Stepping Rule 'B' */ void step_Bi(u16bit& W2, u16bit& W3, size_t round, const byte FTAB[]) { byte G1 = get_byte(1, W2), G2 = get_byte(0, W2), G3; G3 = FTAB[((4 * round - 1) % 10)*256 + G2] ^ G1; G1 = FTAB[((4 * round - 2) % 10)*256 + G3] ^ G2; G2 = FTAB[((4 * round - 3) % 10)*256 + G1] ^ G3; G3 = FTAB[((4 * round - 4) % 10)*256 + G2] ^ G1; W2 = make_u16bit(G3, G2); W3 ^= W2 ^ round; } } /* * Skipjack Encryption */ void Skipjack::encrypt_n(const byte in[], byte out[], size_t blocks) const { const byte* ftab = &FTAB[0]; for(size_t i = 0; i != blocks; ++i) { u16bit W1 = load_le(in, 3); u16bit W2 = load_le(in, 2); u16bit W3 = load_le(in, 1); u16bit W4 = load_le(in, 0); step_A(W1, W4, 1, ftab); step_A(W4, W3, 2, ftab); step_A(W3, W2, 3, ftab); step_A(W2, W1, 4, ftab); step_A(W1, W4, 5, ftab); step_A(W4, W3, 6, ftab); step_A(W3, W2, 7, ftab); step_A(W2, W1, 8, ftab); step_B(W1, W2, 9, ftab); step_B(W4, W1, 10, ftab); step_B(W3, W4, 11, ftab); step_B(W2, W3, 12, ftab); step_B(W1, W2, 13, ftab); step_B(W4, W1, 14, ftab); step_B(W3, W4, 15, ftab); step_B(W2, W3, 16, ftab); step_A(W1, W4, 17, ftab); step_A(W4, W3, 18, ftab); step_A(W3, W2, 19, ftab); step_A(W2, W1, 20, ftab); step_A(W1, W4, 21, ftab); step_A(W4, W3, 22, ftab); step_A(W3, W2, 23, ftab); step_A(W2, W1, 24, ftab); step_B(W1, W2, 25, ftab); step_B(W4, W1, 26, ftab); step_B(W3, W4, 27, ftab); step_B(W2, W3, 28, ftab); step_B(W1, W2, 29, ftab); step_B(W4, W1, 30, ftab); step_B(W3, W4, 31, ftab); step_B(W2, W3, 32, ftab); store_le(out, W4, W3, W2, W1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Skipjack Decryption */ void Skipjack::decrypt_n(const byte in[], byte out[], size_t blocks) const { const byte* ftab = &FTAB[0]; for(size_t i = 0; i != blocks; ++i) { u16bit W1 = load_le(in, 3); u16bit W2 = load_le(in, 2); u16bit W3 = load_le(in, 1); u16bit W4 = load_le(in, 0); step_Bi(W2, W3, 32, ftab); step_Bi(W3, W4, 31, ftab); step_Bi(W4, W1, 30, ftab); step_Bi(W1, W2, 29, ftab); step_Bi(W2, W3, 28, ftab); step_Bi(W3, W4, 27, ftab); step_Bi(W4, W1, 26, ftab); step_Bi(W1, W2, 25, ftab); step_Ai(W1, W2, 24, ftab); step_Ai(W2, W3, 23, ftab); step_Ai(W3, W4, 22, ftab); step_Ai(W4, W1, 21, ftab); step_Ai(W1, W2, 20, ftab); step_Ai(W2, W3, 19, ftab); step_Ai(W3, W4, 18, ftab); step_Ai(W4, W1, 17, ftab); step_Bi(W2, W3, 16, ftab); step_Bi(W3, W4, 15, ftab); step_Bi(W4, W1, 14, ftab); step_Bi(W1, W2, 13, ftab); step_Bi(W2, W3, 12, ftab); step_Bi(W3, W4, 11, ftab); step_Bi(W4, W1, 10, ftab); step_Bi(W1, W2, 9, ftab); step_Ai(W1, W2, 8, ftab); step_Ai(W2, W3, 7, ftab); step_Ai(W3, W4, 6, ftab); step_Ai(W4, W1, 5, ftab); step_Ai(W1, W2, 4, ftab); step_Ai(W2, W3, 3, ftab); step_Ai(W3, W4, 2, ftab); step_Ai(W4, W1, 1, ftab); store_le(out, W4, W3, W2, W1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Skipjack Key Schedule */ void Skipjack::key_schedule(const byte key[], size_t) { static const byte F[256] = { 0xA3, 0xD7, 0x09, 0x83, 0xF8, 0x48, 0xF6, 0xF4, 0xB3, 0x21, 0x15, 0x78, 0x99, 0xB1, 0xAF, 0xF9, 0xE7, 0x2D, 0x4D, 0x8A, 0xCE, 0x4C, 0xCA, 0x2E, 0x52, 0x95, 0xD9, 0x1E, 0x4E, 0x38, 0x44, 0x28, 0x0A, 0xDF, 0x02, 0xA0, 0x17, 0xF1, 0x60, 0x68, 0x12, 0xB7, 0x7A, 0xC3, 0xE9, 0xFA, 0x3D, 0x53, 0x96, 0x84, 0x6B, 0xBA, 0xF2, 0x63, 0x9A, 0x19, 0x7C, 0xAE, 0xE5, 0xF5, 0xF7, 0x16, 0x6A, 0xA2, 0x39, 0xB6, 0x7B, 0x0F, 0xC1, 0x93, 0x81, 0x1B, 0xEE, 0xB4, 0x1A, 0xEA, 0xD0, 0x91, 0x2F, 0xB8, 0x55, 0xB9, 0xDA, 0x85, 0x3F, 0x41, 0xBF, 0xE0, 0x5A, 0x58, 0x80, 0x5F, 0x66, 0x0B, 0xD8, 0x90, 0x35, 0xD5, 0xC0, 0xA7, 0x33, 0x06, 0x65, 0x69, 0x45, 0x00, 0x94, 0x56, 0x6D, 0x98, 0x9B, 0x76, 0x97, 0xFC, 0xB2, 0xC2, 0xB0, 0xFE, 0xDB, 0x20, 0xE1, 0xEB, 0xD6, 0xE4, 0xDD, 0x47, 0x4A, 0x1D, 0x42, 0xED, 0x9E, 0x6E, 0x49, 0x3C, 0xCD, 0x43, 0x27, 0xD2, 0x07, 0xD4, 0xDE, 0xC7, 0x67, 0x18, 0x89, 0xCB, 0x30, 0x1F, 0x8D, 0xC6, 0x8F, 0xAA, 0xC8, 0x74, 0xDC, 0xC9, 0x5D, 0x5C, 0x31, 0xA4, 0x70, 0x88, 0x61, 0x2C, 0x9F, 0x0D, 0x2B, 0x87, 0x50, 0x82, 0x54, 0x64, 0x26, 0x7D, 0x03, 0x40, 0x34, 0x4B, 0x1C, 0x73, 0xD1, 0xC4, 0xFD, 0x3B, 0xCC, 0xFB, 0x7F, 0xAB, 0xE6, 0x3E, 0x5B, 0xA5, 0xAD, 0x04, 0x23, 0x9C, 0x14, 0x51, 0x22, 0xF0, 0x29, 0x79, 0x71, 0x7E, 0xFF, 0x8C, 0x0E, 0xE2, 0x0C, 0xEF, 0xBC, 0x72, 0x75, 0x6F, 0x37, 0xA1, 0xEC, 0xD3, 0x8E, 0x62, 0x8B, 0x86, 0x10, 0xE8, 0x08, 0x77, 0x11, 0xBE, 0x92, 0x4F, 0x24, 0xC5, 0x32, 0x36, 0x9D, 0xCF, 0xF3, 0xA6, 0xBB, 0xAC, 0x5E, 0x6C, 0xA9, 0x13, 0x57, 0x25, 0xB5, 0xE3, 0xBD, 0xA8, 0x3A, 0x01, 0x05, 0x59, 0x2A, 0x46 }; for(size_t i = 0; i != 10; ++i) for(size_t j = 0; j != 256; ++j) FTAB[256*i+j] = F[j ^ key[9-i]]; } /* * Clear memory of sensitive data */ void Skipjack::clear() { zeroise(FTAB); } } Botan-1.10.12/src/block/skipjack/skipjack.h0000664000175000017500000000137512654331322020222 0ustar jackjack00000000000000/* * Skipjack * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SKIPJACK_H__ #define BOTAN_SKIPJACK_H__ #include namespace Botan { /** * Skipjack, a NSA designed cipher used in Fortezza */ class BOTAN_DLL Skipjack : public Block_Cipher_Fixed_Params<8, 10> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "Skipjack"; } BlockCipher* clone() const { return new Skipjack; } Skipjack() : FTAB(2560) {} private: void key_schedule(const byte[], size_t); SecureVector FTAB; }; } #endif Botan-1.10.12/src/block/square/info.txt0000664000175000017500000000001612654331322017436 0ustar jackjack00000000000000define SQUARE Botan-1.10.12/src/block/square/sqr_tab.cpp0000664000175000017500000007513412654331322020116 0ustar jackjack00000000000000/* * S-Box and Diffusion Tables for Square * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { const byte Square::SE[256] = { 0xB1, 0xCE, 0xC3, 0x95, 0x5A, 0xAD, 0xE7, 0x02, 0x4D, 0x44, 0xFB, 0x91, 0x0C, 0x87, 0xA1, 0x50, 0xCB, 0x67, 0x54, 0xDD, 0x46, 0x8F, 0xE1, 0x4E, 0xF0, 0xFD, 0xFC, 0xEB, 0xF9, 0xC4, 0x1A, 0x6E, 0x5E, 0xF5, 0xCC, 0x8D, 0x1C, 0x56, 0x43, 0xFE, 0x07, 0x61, 0xF8, 0x75, 0x59, 0xFF, 0x03, 0x22, 0x8A, 0xD1, 0x13, 0xEE, 0x88, 0x00, 0x0E, 0x34, 0x15, 0x80, 0x94, 0xE3, 0xED, 0xB5, 0x53, 0x23, 0x4B, 0x47, 0x17, 0xA7, 0x90, 0x35, 0xAB, 0xD8, 0xB8, 0xDF, 0x4F, 0x57, 0x9A, 0x92, 0xDB, 0x1B, 0x3C, 0xC8, 0x99, 0x04, 0x8E, 0xE0, 0xD7, 0x7D, 0x85, 0xBB, 0x40, 0x2C, 0x3A, 0x45, 0xF1, 0x42, 0x65, 0x20, 0x41, 0x18, 0x72, 0x25, 0x93, 0x70, 0x36, 0x05, 0xF2, 0x0B, 0xA3, 0x79, 0xEC, 0x08, 0x27, 0x31, 0x32, 0xB6, 0x7C, 0xB0, 0x0A, 0x73, 0x5B, 0x7B, 0xB7, 0x81, 0xD2, 0x0D, 0x6A, 0x26, 0x9E, 0x58, 0x9C, 0x83, 0x74, 0xB3, 0xAC, 0x30, 0x7A, 0x69, 0x77, 0x0F, 0xAE, 0x21, 0xDE, 0xD0, 0x2E, 0x97, 0x10, 0xA4, 0x98, 0xA8, 0xD4, 0x68, 0x2D, 0x62, 0x29, 0x6D, 0x16, 0x49, 0x76, 0xC7, 0xE8, 0xC1, 0x96, 0x37, 0xE5, 0xCA, 0xF4, 0xE9, 0x63, 0x12, 0xC2, 0xA6, 0x14, 0xBC, 0xD3, 0x28, 0xAF, 0x2F, 0xE6, 0x24, 0x52, 0xC6, 0xA0, 0x09, 0xBD, 0x8C, 0xCF, 0x5D, 0x11, 0x5F, 0x01, 0xC5, 0x9F, 0x3D, 0xA2, 0x9B, 0xC9, 0x3B, 0xBE, 0x51, 0x19, 0x1F, 0x3F, 0x5C, 0xB2, 0xEF, 0x4A, 0xCD, 0xBF, 0xBA, 0x6F, 0x64, 0xD9, 0xF3, 0x3E, 0xB4, 0xAA, 0xDC, 0xD5, 0x06, 0xC0, 0x7E, 0xF6, 0x66, 0x6C, 0x84, 0x71, 0x38, 0xB9, 0x1D, 0x7F, 0x9D, 0x48, 0x8B, 0x2A, 0xDA, 0xA5, 0x33, 0x82, 0x39, 0xD6, 0x78, 0x86, 0xFA, 0xE4, 0x2B, 0xA9, 0x1E, 0x89, 0x60, 0x6B, 0xEA, 0x55, 0x4C, 0xF7, 0xE2 }; const byte Square::SD[256] = { 0x35, 0xBE, 0x07, 0x2E, 0x53, 0x69, 0xDB, 0x28, 0x6F, 0xB7, 0x76, 0x6B, 0x0C, 0x7D, 0x36, 0x8B, 0x92, 0xBC, 0xA9, 0x32, 0xAC, 0x38, 0x9C, 0x42, 0x63, 0xC8, 0x1E, 0x4F, 0x24, 0xE5, 0xF7, 0xC9, 0x61, 0x8D, 0x2F, 0x3F, 0xB3, 0x65, 0x7F, 0x70, 0xAF, 0x9A, 0xEA, 0xF5, 0x5B, 0x98, 0x90, 0xB1, 0x87, 0x71, 0x72, 0xED, 0x37, 0x45, 0x68, 0xA3, 0xE3, 0xEF, 0x5C, 0xC5, 0x50, 0xC1, 0xD6, 0xCA, 0x5A, 0x62, 0x5F, 0x26, 0x09, 0x5D, 0x14, 0x41, 0xE8, 0x9D, 0xCE, 0x40, 0xFD, 0x08, 0x17, 0x4A, 0x0F, 0xC7, 0xB4, 0x3E, 0x12, 0xFC, 0x25, 0x4B, 0x81, 0x2C, 0x04, 0x78, 0xCB, 0xBB, 0x20, 0xBD, 0xF9, 0x29, 0x99, 0xA8, 0xD3, 0x60, 0xDF, 0x11, 0x97, 0x89, 0x7E, 0xFA, 0xE0, 0x9B, 0x1F, 0xD2, 0x67, 0xE2, 0x64, 0x77, 0x84, 0x2B, 0x9E, 0x8A, 0xF1, 0x6D, 0x88, 0x79, 0x74, 0x57, 0xDD, 0xE6, 0x39, 0x7B, 0xEE, 0x83, 0xE1, 0x58, 0xF2, 0x0D, 0x34, 0xF8, 0x30, 0xE9, 0xB9, 0x23, 0x54, 0x15, 0x44, 0x0B, 0x4D, 0x66, 0x3A, 0x03, 0xA2, 0x91, 0x94, 0x52, 0x4C, 0xC3, 0x82, 0xE7, 0x80, 0xC0, 0xB6, 0x0E, 0xC2, 0x6C, 0x93, 0xEC, 0xAB, 0x43, 0x95, 0xF6, 0xD8, 0x46, 0x86, 0x05, 0x8C, 0xB0, 0x75, 0x00, 0xCC, 0x85, 0xD7, 0x3D, 0x73, 0x7A, 0x48, 0xE4, 0xD1, 0x59, 0xAD, 0xB8, 0xC6, 0xD0, 0xDC, 0xA1, 0xAA, 0x02, 0x1D, 0xBF, 0xB5, 0x9F, 0x51, 0xC4, 0xA5, 0x10, 0x22, 0xCF, 0x01, 0xBA, 0x8F, 0x31, 0x7C, 0xAE, 0x96, 0xDA, 0xF0, 0x56, 0x47, 0xD4, 0xEB, 0x4E, 0xD9, 0x13, 0x8E, 0x49, 0x55, 0x16, 0xFF, 0x3B, 0xF4, 0xA4, 0xB2, 0x06, 0xA0, 0xA7, 0xFB, 0x1B, 0x6E, 0x3C, 0x33, 0xCD, 0x18, 0x5E, 0x6A, 0xD5, 0xA6, 0x21, 0xDE, 0xFE, 0x2A, 0x1C, 0xF3, 0x0A, 0x1A, 0x19, 0x27, 0x2D }; const byte Square::Log[256] = { 0x00, 0x00, 0x01, 0x86, 0x02, 0x0D, 0x87, 0x4C, 0x03, 0xD2, 0x0E, 0xAE, 0x88, 0x22, 0x4D, 0x93, 0x04, 0x1A, 0xD3, 0xCB, 0x0F, 0x98, 0xAF, 0xA8, 0x89, 0xF0, 0x23, 0x59, 0x4E, 0x35, 0x94, 0x09, 0x05, 0x8F, 0x1B, 0x6E, 0xD4, 0x39, 0xCC, 0xBB, 0x10, 0x68, 0x99, 0x77, 0xB0, 0xDF, 0xA9, 0x72, 0x8A, 0xFA, 0xF1, 0xA0, 0x24, 0x52, 0x5A, 0x60, 0x4F, 0x2F, 0x36, 0xDC, 0x95, 0x32, 0x0A, 0x1F, 0x06, 0xA5, 0x90, 0x49, 0x1C, 0x5D, 0x6F, 0xB8, 0xD5, 0xC1, 0x3A, 0xB5, 0xCD, 0x63, 0xBC, 0x3D, 0x11, 0x44, 0x69, 0x81, 0x9A, 0x27, 0x78, 0xC4, 0xB1, 0xE6, 0xE0, 0xEA, 0xAA, 0x55, 0x73, 0xD8, 0x8B, 0xF6, 0xFB, 0x16, 0xF2, 0xF4, 0xA1, 0x40, 0x25, 0x42, 0x53, 0xE4, 0x5B, 0xA3, 0x61, 0xBF, 0x50, 0xF8, 0x30, 0x2D, 0x37, 0x8D, 0xDD, 0x66, 0x96, 0x18, 0x33, 0xEE, 0x0B, 0xFD, 0x20, 0xD0, 0x07, 0x57, 0xA6, 0xC9, 0x91, 0xAC, 0x4A, 0x84, 0x1D, 0xDA, 0x5E, 0x9E, 0x70, 0x75, 0xB9, 0x6C, 0xD6, 0xE8, 0xC2, 0x7F, 0x3B, 0xB3, 0xB6, 0x47, 0xCE, 0xEC, 0x64, 0x2B, 0xBD, 0xE2, 0x3E, 0x14, 0x12, 0x29, 0x45, 0x7D, 0x6A, 0x9C, 0x82, 0xC7, 0x9B, 0xC6, 0x28, 0x7C, 0x79, 0x7A, 0xC5, 0x7B, 0xB2, 0x46, 0xE7, 0x7E, 0xE1, 0x13, 0xEB, 0x2A, 0xAB, 0x83, 0x56, 0xC8, 0x74, 0x6B, 0xD9, 0x9D, 0x8C, 0x65, 0xF7, 0x2C, 0xFC, 0xCF, 0x17, 0xED, 0xF3, 0x3F, 0xF5, 0x15, 0xA2, 0xBE, 0x41, 0xE3, 0x26, 0xC3, 0x43, 0x80, 0x54, 0xD7, 0xE5, 0xE9, 0x5C, 0xB7, 0xA4, 0x48, 0x62, 0x3C, 0xC0, 0xB4, 0x51, 0x5F, 0xF9, 0x9F, 0x31, 0x1E, 0x2E, 0xDB, 0x38, 0xBA, 0x8E, 0x6D, 0xDE, 0x71, 0x67, 0x76, 0x97, 0xA7, 0x19, 0xCA, 0x34, 0x08, 0xEF, 0x58, 0x0C, 0x4B, 0xFE, 0x85, 0x21, 0x92, 0xD1, 0xAD }; const byte Square::ALog[255] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF5, 0x1F, 0x3E, 0x7C, 0xF8, 0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0xB5, 0x9F, 0xCB, 0x63, 0xC6, 0x79, 0xF2, 0x11, 0x22, 0x44, 0x88, 0xE5, 0x3F, 0x7E, 0xFC, 0x0D, 0x1A, 0x34, 0x68, 0xD0, 0x55, 0xAA, 0xA1, 0xB7, 0x9B, 0xC3, 0x73, 0xE6, 0x39, 0x72, 0xE4, 0x3D, 0x7A, 0xF4, 0x1D, 0x3A, 0x74, 0xE8, 0x25, 0x4A, 0x94, 0xDD, 0x4F, 0x9E, 0xC9, 0x67, 0xCE, 0x69, 0xD2, 0x51, 0xA2, 0xB1, 0x97, 0xDB, 0x43, 0x86, 0xF9, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x35, 0x6A, 0xD4, 0x5D, 0xBA, 0x81, 0xF7, 0x1B, 0x36, 0x6C, 0xD8, 0x45, 0x8A, 0xE1, 0x37, 0x6E, 0xDC, 0x4D, 0x9A, 0xC1, 0x77, 0xEE, 0x29, 0x52, 0xA4, 0xBD, 0x8F, 0xEB, 0x23, 0x46, 0x8C, 0xED, 0x2F, 0x5E, 0xBC, 0x8D, 0xEF, 0x2B, 0x56, 0xAC, 0xAD, 0xAF, 0xAB, 0xA3, 0xB3, 0x93, 0xD3, 0x53, 0xA6, 0xB9, 0x87, 0xFB, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x75, 0xEA, 0x21, 0x42, 0x84, 0xFD, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0x15, 0x2A, 0x54, 0xA8, 0xA5, 0xBF, 0x8B, 0xE3, 0x33, 0x66, 0xCC, 0x6D, 0xDA, 0x41, 0x82, 0xF1, 0x17, 0x2E, 0x5C, 0xB8, 0x85, 0xFF, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x95, 0xDF, 0x4B, 0x96, 0xD9, 0x47, 0x8E, 0xE9, 0x27, 0x4E, 0x9C, 0xCD, 0x6F, 0xDE, 0x49, 0x92, 0xD1, 0x57, 0xAE, 0xA9, 0xA7, 0xBB, 0x83, 0xF3, 0x13, 0x26, 0x4C, 0x98, 0xC5, 0x7F, 0xFE, 0x09, 0x12, 0x24, 0x48, 0x90, 0xD5, 0x5F, 0xBE, 0x89, 0xE7, 0x3B, 0x76, 0xEC, 0x2D, 0x5A, 0xB4, 0x9D, 0xCF, 0x6B, 0xD6, 0x59, 0xB2, 0x91, 0xD7, 0x5B, 0xB6, 0x99, 0xC7, 0x7B, 0xF6, 0x19, 0x32, 0x64, 0xC8, 0x65, 0xCA, 0x61, 0xC2, 0x71, 0xE2, 0x31, 0x62, 0xC4, 0x7D, 0xFA }; const u32bit Square::TE0[256] = { 0x97B1B126, 0x69CECEA7, 0x73C3C3B0, 0xDF95954A, 0xB45A5AEE, 0xAFADAD02, 0x3BE7E7DC, 0x04020206, 0x9A4D4DD7, 0x884444CC, 0x03FBFBF8, 0xD7919146, 0x180C0C14, 0xFB87877C, 0xB7A1A116, 0xA05050F0, 0x63CBCBA8, 0xCE6767A9, 0xA85454FC, 0x4FDDDD92, 0x8C4646CA, 0xEB8F8F64, 0x37E1E1D6, 0x9C4E4ED2, 0x15F0F0E5, 0x0FFDFDF2, 0x0DFCFCF1, 0x23EBEBC8, 0x07F9F9FE, 0x7DC4C4B9, 0x341A1A2E, 0xDC6E6EB2, 0xBC5E5EE2, 0x1FF5F5EA, 0x6DCCCCA1, 0xEF8D8D62, 0x381C1C24, 0xAC5656FA, 0x864343C5, 0x09FEFEF7, 0x0E070709, 0xC26161A3, 0x05F8F8FD, 0xEA75759F, 0xB25959EB, 0x0BFFFFF4, 0x06030305, 0x44222266, 0xE18A8A6B, 0x57D1D186, 0x26131335, 0x29EEEEC7, 0xE588886D, 0x00000000, 0x1C0E0E12, 0x6834345C, 0x2A15153F, 0xF5808075, 0xDD949449, 0x33E3E3D0, 0x2FEDEDC2, 0x9FB5B52A, 0xA65353F5, 0x46232365, 0x964B4BDD, 0x8E4747C9, 0x2E171739, 0xBBA7A71C, 0xD5909045, 0x6A35355F, 0xA3ABAB08, 0x45D8D89D, 0x85B8B83D, 0x4BDFDF94, 0x9E4F4FD1, 0xAE5757F9, 0xC19A9A5B, 0xD1929243, 0x43DBDB98, 0x361B1B2D, 0x783C3C44, 0x65C8C8AD, 0xC799995E, 0x0804040C, 0xE98E8E67, 0x35E0E0D5, 0x5BD7D78C, 0xFA7D7D87, 0xFF85857A, 0x83BBBB38, 0x804040C0, 0x582C2C74, 0x743A3A4E, 0x8A4545CF, 0x17F1F1E6, 0x844242C6, 0xCA6565AF, 0x40202060, 0x824141C3, 0x30181828, 0xE4727296, 0x4A25256F, 0xD3939340, 0xE0707090, 0x6C36365A, 0x0A05050F, 0x11F2F2E3, 0x160B0B1D, 0xB3A3A310, 0xF279798B, 0x2DECECC1, 0x10080818, 0x4E272769, 0x62313153, 0x64323256, 0x99B6B62F, 0xF87C7C84, 0x95B0B025, 0x140A0A1E, 0xE6737395, 0xB65B5BED, 0xF67B7B8D, 0x9BB7B72C, 0xF7818176, 0x51D2D283, 0x1A0D0D17, 0xD46A6ABE, 0x4C26266A, 0xC99E9E57, 0xB05858E8, 0xCD9C9C51, 0xF3838370, 0xE874749C, 0x93B3B320, 0xADACAC01, 0x60303050, 0xF47A7A8E, 0xD26969BB, 0xEE777799, 0x1E0F0F11, 0xA9AEAE07, 0x42212163, 0x49DEDE97, 0x55D0D085, 0x5C2E2E72, 0xDB97974C, 0x20101030, 0xBDA4A419, 0xC598985D, 0xA5A8A80D, 0x5DD4D489, 0xD06868B8, 0x5A2D2D77, 0xC46262A6, 0x5229297B, 0xDA6D6DB7, 0x2C16163A, 0x924949DB, 0xEC76769A, 0x7BC7C7BC, 0x25E8E8CD, 0x77C1C1B6, 0xD996964F, 0x6E373759, 0x3FE5E5DA, 0x61CACAAB, 0x1DF4F4E9, 0x27E9E9CE, 0xC66363A5, 0x24121236, 0x71C2C2B3, 0xB9A6A61F, 0x2814143C, 0x8DBCBC31, 0x53D3D380, 0x50282878, 0xABAFAF04, 0x5E2F2F71, 0x39E6E6DF, 0x4824246C, 0xA45252F6, 0x79C6C6BF, 0xB5A0A015, 0x1209091B, 0x8FBDBD32, 0xED8C8C61, 0x6BCFCFA4, 0xBA5D5DE7, 0x22111133, 0xBE5F5FE1, 0x02010103, 0x7FC5C5BA, 0xCB9F9F54, 0x7A3D3D47, 0xB1A2A213, 0xC39B9B58, 0x67C9C9AE, 0x763B3B4D, 0x89BEBE37, 0xA25151F3, 0x3219192B, 0x3E1F1F21, 0x7E3F3F41, 0xB85C5CE4, 0x91B2B223, 0x2BEFEFC4, 0x944A4ADE, 0x6FCDCDA2, 0x8BBFBF34, 0x81BABA3B, 0xDE6F6FB1, 0xC86464AC, 0x47D9D99E, 0x13F3F3E0, 0x7C3E3E42, 0x9DB4B429, 0xA1AAAA0B, 0x4DDCDC91, 0x5FD5D58A, 0x0C06060A, 0x75C0C0B5, 0xFC7E7E82, 0x19F6F6EF, 0xCC6666AA, 0xD86C6CB4, 0xFD848479, 0xE2717193, 0x70383848, 0x87B9B93E, 0x3A1D1D27, 0xFE7F7F81, 0xCF9D9D52, 0x904848D8, 0xE38B8B68, 0x542A2A7E, 0x41DADA9B, 0xBFA5A51A, 0x66333355, 0xF1828273, 0x7239394B, 0x59D6D68F, 0xF0787888, 0xF986867F, 0x01FAFAFB, 0x3DE4E4D9, 0x562B2B7D, 0xA7A9A90E, 0x3C1E1E22, 0xE789896E, 0xC06060A0, 0xD66B6BBD, 0x21EAEACB, 0xAA5555FF, 0x984C4CD4, 0x1BF7F7EC, 0x31E2E2D3 }; const u32bit Square::TE1[256] = { 0x2697B1B1, 0xA769CECE, 0xB073C3C3, 0x4ADF9595, 0xEEB45A5A, 0x02AFADAD, 0xDC3BE7E7, 0x06040202, 0xD79A4D4D, 0xCC884444, 0xF803FBFB, 0x46D79191, 0x14180C0C, 0x7CFB8787, 0x16B7A1A1, 0xF0A05050, 0xA863CBCB, 0xA9CE6767, 0xFCA85454, 0x924FDDDD, 0xCA8C4646, 0x64EB8F8F, 0xD637E1E1, 0xD29C4E4E, 0xE515F0F0, 0xF20FFDFD, 0xF10DFCFC, 0xC823EBEB, 0xFE07F9F9, 0xB97DC4C4, 0x2E341A1A, 0xB2DC6E6E, 0xE2BC5E5E, 0xEA1FF5F5, 0xA16DCCCC, 0x62EF8D8D, 0x24381C1C, 0xFAAC5656, 0xC5864343, 0xF709FEFE, 0x090E0707, 0xA3C26161, 0xFD05F8F8, 0x9FEA7575, 0xEBB25959, 0xF40BFFFF, 0x05060303, 0x66442222, 0x6BE18A8A, 0x8657D1D1, 0x35261313, 0xC729EEEE, 0x6DE58888, 0x00000000, 0x121C0E0E, 0x5C683434, 0x3F2A1515, 0x75F58080, 0x49DD9494, 0xD033E3E3, 0xC22FEDED, 0x2A9FB5B5, 0xF5A65353, 0x65462323, 0xDD964B4B, 0xC98E4747, 0x392E1717, 0x1CBBA7A7, 0x45D59090, 0x5F6A3535, 0x08A3ABAB, 0x9D45D8D8, 0x3D85B8B8, 0x944BDFDF, 0xD19E4F4F, 0xF9AE5757, 0x5BC19A9A, 0x43D19292, 0x9843DBDB, 0x2D361B1B, 0x44783C3C, 0xAD65C8C8, 0x5EC79999, 0x0C080404, 0x67E98E8E, 0xD535E0E0, 0x8C5BD7D7, 0x87FA7D7D, 0x7AFF8585, 0x3883BBBB, 0xC0804040, 0x74582C2C, 0x4E743A3A, 0xCF8A4545, 0xE617F1F1, 0xC6844242, 0xAFCA6565, 0x60402020, 0xC3824141, 0x28301818, 0x96E47272, 0x6F4A2525, 0x40D39393, 0x90E07070, 0x5A6C3636, 0x0F0A0505, 0xE311F2F2, 0x1D160B0B, 0x10B3A3A3, 0x8BF27979, 0xC12DECEC, 0x18100808, 0x694E2727, 0x53623131, 0x56643232, 0x2F99B6B6, 0x84F87C7C, 0x2595B0B0, 0x1E140A0A, 0x95E67373, 0xEDB65B5B, 0x8DF67B7B, 0x2C9BB7B7, 0x76F78181, 0x8351D2D2, 0x171A0D0D, 0xBED46A6A, 0x6A4C2626, 0x57C99E9E, 0xE8B05858, 0x51CD9C9C, 0x70F38383, 0x9CE87474, 0x2093B3B3, 0x01ADACAC, 0x50603030, 0x8EF47A7A, 0xBBD26969, 0x99EE7777, 0x111E0F0F, 0x07A9AEAE, 0x63422121, 0x9749DEDE, 0x8555D0D0, 0x725C2E2E, 0x4CDB9797, 0x30201010, 0x19BDA4A4, 0x5DC59898, 0x0DA5A8A8, 0x895DD4D4, 0xB8D06868, 0x775A2D2D, 0xA6C46262, 0x7B522929, 0xB7DA6D6D, 0x3A2C1616, 0xDB924949, 0x9AEC7676, 0xBC7BC7C7, 0xCD25E8E8, 0xB677C1C1, 0x4FD99696, 0x596E3737, 0xDA3FE5E5, 0xAB61CACA, 0xE91DF4F4, 0xCE27E9E9, 0xA5C66363, 0x36241212, 0xB371C2C2, 0x1FB9A6A6, 0x3C281414, 0x318DBCBC, 0x8053D3D3, 0x78502828, 0x04ABAFAF, 0x715E2F2F, 0xDF39E6E6, 0x6C482424, 0xF6A45252, 0xBF79C6C6, 0x15B5A0A0, 0x1B120909, 0x328FBDBD, 0x61ED8C8C, 0xA46BCFCF, 0xE7BA5D5D, 0x33221111, 0xE1BE5F5F, 0x03020101, 0xBA7FC5C5, 0x54CB9F9F, 0x477A3D3D, 0x13B1A2A2, 0x58C39B9B, 0xAE67C9C9, 0x4D763B3B, 0x3789BEBE, 0xF3A25151, 0x2B321919, 0x213E1F1F, 0x417E3F3F, 0xE4B85C5C, 0x2391B2B2, 0xC42BEFEF, 0xDE944A4A, 0xA26FCDCD, 0x348BBFBF, 0x3B81BABA, 0xB1DE6F6F, 0xACC86464, 0x9E47D9D9, 0xE013F3F3, 0x427C3E3E, 0x299DB4B4, 0x0BA1AAAA, 0x914DDCDC, 0x8A5FD5D5, 0x0A0C0606, 0xB575C0C0, 0x82FC7E7E, 0xEF19F6F6, 0xAACC6666, 0xB4D86C6C, 0x79FD8484, 0x93E27171, 0x48703838, 0x3E87B9B9, 0x273A1D1D, 0x81FE7F7F, 0x52CF9D9D, 0xD8904848, 0x68E38B8B, 0x7E542A2A, 0x9B41DADA, 0x1ABFA5A5, 0x55663333, 0x73F18282, 0x4B723939, 0x8F59D6D6, 0x88F07878, 0x7FF98686, 0xFB01FAFA, 0xD93DE4E4, 0x7D562B2B, 0x0EA7A9A9, 0x223C1E1E, 0x6EE78989, 0xA0C06060, 0xBDD66B6B, 0xCB21EAEA, 0xFFAA5555, 0xD4984C4C, 0xEC1BF7F7, 0xD331E2E2 }; const u32bit Square::TE2[256] = { 0xB12697B1, 0xCEA769CE, 0xC3B073C3, 0x954ADF95, 0x5AEEB45A, 0xAD02AFAD, 0xE7DC3BE7, 0x02060402, 0x4DD79A4D, 0x44CC8844, 0xFBF803FB, 0x9146D791, 0x0C14180C, 0x877CFB87, 0xA116B7A1, 0x50F0A050, 0xCBA863CB, 0x67A9CE67, 0x54FCA854, 0xDD924FDD, 0x46CA8C46, 0x8F64EB8F, 0xE1D637E1, 0x4ED29C4E, 0xF0E515F0, 0xFDF20FFD, 0xFCF10DFC, 0xEBC823EB, 0xF9FE07F9, 0xC4B97DC4, 0x1A2E341A, 0x6EB2DC6E, 0x5EE2BC5E, 0xF5EA1FF5, 0xCCA16DCC, 0x8D62EF8D, 0x1C24381C, 0x56FAAC56, 0x43C58643, 0xFEF709FE, 0x07090E07, 0x61A3C261, 0xF8FD05F8, 0x759FEA75, 0x59EBB259, 0xFFF40BFF, 0x03050603, 0x22664422, 0x8A6BE18A, 0xD18657D1, 0x13352613, 0xEEC729EE, 0x886DE588, 0x00000000, 0x0E121C0E, 0x345C6834, 0x153F2A15, 0x8075F580, 0x9449DD94, 0xE3D033E3, 0xEDC22FED, 0xB52A9FB5, 0x53F5A653, 0x23654623, 0x4BDD964B, 0x47C98E47, 0x17392E17, 0xA71CBBA7, 0x9045D590, 0x355F6A35, 0xAB08A3AB, 0xD89D45D8, 0xB83D85B8, 0xDF944BDF, 0x4FD19E4F, 0x57F9AE57, 0x9A5BC19A, 0x9243D192, 0xDB9843DB, 0x1B2D361B, 0x3C44783C, 0xC8AD65C8, 0x995EC799, 0x040C0804, 0x8E67E98E, 0xE0D535E0, 0xD78C5BD7, 0x7D87FA7D, 0x857AFF85, 0xBB3883BB, 0x40C08040, 0x2C74582C, 0x3A4E743A, 0x45CF8A45, 0xF1E617F1, 0x42C68442, 0x65AFCA65, 0x20604020, 0x41C38241, 0x18283018, 0x7296E472, 0x256F4A25, 0x9340D393, 0x7090E070, 0x365A6C36, 0x050F0A05, 0xF2E311F2, 0x0B1D160B, 0xA310B3A3, 0x798BF279, 0xECC12DEC, 0x08181008, 0x27694E27, 0x31536231, 0x32566432, 0xB62F99B6, 0x7C84F87C, 0xB02595B0, 0x0A1E140A, 0x7395E673, 0x5BEDB65B, 0x7B8DF67B, 0xB72C9BB7, 0x8176F781, 0xD28351D2, 0x0D171A0D, 0x6ABED46A, 0x266A4C26, 0x9E57C99E, 0x58E8B058, 0x9C51CD9C, 0x8370F383, 0x749CE874, 0xB32093B3, 0xAC01ADAC, 0x30506030, 0x7A8EF47A, 0x69BBD269, 0x7799EE77, 0x0F111E0F, 0xAE07A9AE, 0x21634221, 0xDE9749DE, 0xD08555D0, 0x2E725C2E, 0x974CDB97, 0x10302010, 0xA419BDA4, 0x985DC598, 0xA80DA5A8, 0xD4895DD4, 0x68B8D068, 0x2D775A2D, 0x62A6C462, 0x297B5229, 0x6DB7DA6D, 0x163A2C16, 0x49DB9249, 0x769AEC76, 0xC7BC7BC7, 0xE8CD25E8, 0xC1B677C1, 0x964FD996, 0x37596E37, 0xE5DA3FE5, 0xCAAB61CA, 0xF4E91DF4, 0xE9CE27E9, 0x63A5C663, 0x12362412, 0xC2B371C2, 0xA61FB9A6, 0x143C2814, 0xBC318DBC, 0xD38053D3, 0x28785028, 0xAF04ABAF, 0x2F715E2F, 0xE6DF39E6, 0x246C4824, 0x52F6A452, 0xC6BF79C6, 0xA015B5A0, 0x091B1209, 0xBD328FBD, 0x8C61ED8C, 0xCFA46BCF, 0x5DE7BA5D, 0x11332211, 0x5FE1BE5F, 0x01030201, 0xC5BA7FC5, 0x9F54CB9F, 0x3D477A3D, 0xA213B1A2, 0x9B58C39B, 0xC9AE67C9, 0x3B4D763B, 0xBE3789BE, 0x51F3A251, 0x192B3219, 0x1F213E1F, 0x3F417E3F, 0x5CE4B85C, 0xB22391B2, 0xEFC42BEF, 0x4ADE944A, 0xCDA26FCD, 0xBF348BBF, 0xBA3B81BA, 0x6FB1DE6F, 0x64ACC864, 0xD99E47D9, 0xF3E013F3, 0x3E427C3E, 0xB4299DB4, 0xAA0BA1AA, 0xDC914DDC, 0xD58A5FD5, 0x060A0C06, 0xC0B575C0, 0x7E82FC7E, 0xF6EF19F6, 0x66AACC66, 0x6CB4D86C, 0x8479FD84, 0x7193E271, 0x38487038, 0xB93E87B9, 0x1D273A1D, 0x7F81FE7F, 0x9D52CF9D, 0x48D89048, 0x8B68E38B, 0x2A7E542A, 0xDA9B41DA, 0xA51ABFA5, 0x33556633, 0x8273F182, 0x394B7239, 0xD68F59D6, 0x7888F078, 0x867FF986, 0xFAFB01FA, 0xE4D93DE4, 0x2B7D562B, 0xA90EA7A9, 0x1E223C1E, 0x896EE789, 0x60A0C060, 0x6BBDD66B, 0xEACB21EA, 0x55FFAA55, 0x4CD4984C, 0xF7EC1BF7, 0xE2D331E2 }; const u32bit Square::TE3[256] = { 0xB1B12697, 0xCECEA769, 0xC3C3B073, 0x95954ADF, 0x5A5AEEB4, 0xADAD02AF, 0xE7E7DC3B, 0x02020604, 0x4D4DD79A, 0x4444CC88, 0xFBFBF803, 0x919146D7, 0x0C0C1418, 0x87877CFB, 0xA1A116B7, 0x5050F0A0, 0xCBCBA863, 0x6767A9CE, 0x5454FCA8, 0xDDDD924F, 0x4646CA8C, 0x8F8F64EB, 0xE1E1D637, 0x4E4ED29C, 0xF0F0E515, 0xFDFDF20F, 0xFCFCF10D, 0xEBEBC823, 0xF9F9FE07, 0xC4C4B97D, 0x1A1A2E34, 0x6E6EB2DC, 0x5E5EE2BC, 0xF5F5EA1F, 0xCCCCA16D, 0x8D8D62EF, 0x1C1C2438, 0x5656FAAC, 0x4343C586, 0xFEFEF709, 0x0707090E, 0x6161A3C2, 0xF8F8FD05, 0x75759FEA, 0x5959EBB2, 0xFFFFF40B, 0x03030506, 0x22226644, 0x8A8A6BE1, 0xD1D18657, 0x13133526, 0xEEEEC729, 0x88886DE5, 0x00000000, 0x0E0E121C, 0x34345C68, 0x15153F2A, 0x808075F5, 0x949449DD, 0xE3E3D033, 0xEDEDC22F, 0xB5B52A9F, 0x5353F5A6, 0x23236546, 0x4B4BDD96, 0x4747C98E, 0x1717392E, 0xA7A71CBB, 0x909045D5, 0x35355F6A, 0xABAB08A3, 0xD8D89D45, 0xB8B83D85, 0xDFDF944B, 0x4F4FD19E, 0x5757F9AE, 0x9A9A5BC1, 0x929243D1, 0xDBDB9843, 0x1B1B2D36, 0x3C3C4478, 0xC8C8AD65, 0x99995EC7, 0x04040C08, 0x8E8E67E9, 0xE0E0D535, 0xD7D78C5B, 0x7D7D87FA, 0x85857AFF, 0xBBBB3883, 0x4040C080, 0x2C2C7458, 0x3A3A4E74, 0x4545CF8A, 0xF1F1E617, 0x4242C684, 0x6565AFCA, 0x20206040, 0x4141C382, 0x18182830, 0x727296E4, 0x25256F4A, 0x939340D3, 0x707090E0, 0x36365A6C, 0x05050F0A, 0xF2F2E311, 0x0B0B1D16, 0xA3A310B3, 0x79798BF2, 0xECECC12D, 0x08081810, 0x2727694E, 0x31315362, 0x32325664, 0xB6B62F99, 0x7C7C84F8, 0xB0B02595, 0x0A0A1E14, 0x737395E6, 0x5B5BEDB6, 0x7B7B8DF6, 0xB7B72C9B, 0x818176F7, 0xD2D28351, 0x0D0D171A, 0x6A6ABED4, 0x26266A4C, 0x9E9E57C9, 0x5858E8B0, 0x9C9C51CD, 0x838370F3, 0x74749CE8, 0xB3B32093, 0xACAC01AD, 0x30305060, 0x7A7A8EF4, 0x6969BBD2, 0x777799EE, 0x0F0F111E, 0xAEAE07A9, 0x21216342, 0xDEDE9749, 0xD0D08555, 0x2E2E725C, 0x97974CDB, 0x10103020, 0xA4A419BD, 0x98985DC5, 0xA8A80DA5, 0xD4D4895D, 0x6868B8D0, 0x2D2D775A, 0x6262A6C4, 0x29297B52, 0x6D6DB7DA, 0x16163A2C, 0x4949DB92, 0x76769AEC, 0xC7C7BC7B, 0xE8E8CD25, 0xC1C1B677, 0x96964FD9, 0x3737596E, 0xE5E5DA3F, 0xCACAAB61, 0xF4F4E91D, 0xE9E9CE27, 0x6363A5C6, 0x12123624, 0xC2C2B371, 0xA6A61FB9, 0x14143C28, 0xBCBC318D, 0xD3D38053, 0x28287850, 0xAFAF04AB, 0x2F2F715E, 0xE6E6DF39, 0x24246C48, 0x5252F6A4, 0xC6C6BF79, 0xA0A015B5, 0x09091B12, 0xBDBD328F, 0x8C8C61ED, 0xCFCFA46B, 0x5D5DE7BA, 0x11113322, 0x5F5FE1BE, 0x01010302, 0xC5C5BA7F, 0x9F9F54CB, 0x3D3D477A, 0xA2A213B1, 0x9B9B58C3, 0xC9C9AE67, 0x3B3B4D76, 0xBEBE3789, 0x5151F3A2, 0x19192B32, 0x1F1F213E, 0x3F3F417E, 0x5C5CE4B8, 0xB2B22391, 0xEFEFC42B, 0x4A4ADE94, 0xCDCDA26F, 0xBFBF348B, 0xBABA3B81, 0x6F6FB1DE, 0x6464ACC8, 0xD9D99E47, 0xF3F3E013, 0x3E3E427C, 0xB4B4299D, 0xAAAA0BA1, 0xDCDC914D, 0xD5D58A5F, 0x06060A0C, 0xC0C0B575, 0x7E7E82FC, 0xF6F6EF19, 0x6666AACC, 0x6C6CB4D8, 0x848479FD, 0x717193E2, 0x38384870, 0xB9B93E87, 0x1D1D273A, 0x7F7F81FE, 0x9D9D52CF, 0x4848D890, 0x8B8B68E3, 0x2A2A7E54, 0xDADA9B41, 0xA5A51ABF, 0x33335566, 0x828273F1, 0x39394B72, 0xD6D68F59, 0x787888F0, 0x86867FF9, 0xFAFAFB01, 0xE4E4D93D, 0x2B2B7D56, 0xA9A90EA7, 0x1E1E223C, 0x89896EE7, 0x6060A0C0, 0x6B6BBDD6, 0xEAEACB21, 0x5555FFAA, 0x4C4CD498, 0xF7F7EC1B, 0xE2E2D331 }; const u32bit Square::TD0[256] = { 0xE368BC02, 0x5585620C, 0x2A3F2331, 0x61AB13F7, 0x98D46D72, 0x21CB9A19, 0x3C22A461, 0x459D3DCD, 0x05FDB423, 0x2BC4075F, 0x9B2C01C0, 0x3DD9800F, 0x486C5C74, 0xF97F7E85, 0xF173AB1F, 0xB6EDDE0E, 0x283C6BED, 0x4997781A, 0x9F2A918D, 0xC9579F33, 0xA907A8AA, 0xA50DED7D, 0x7C422D8F, 0x764DB0C9, 0x4D91E857, 0xCEA963CC, 0xB4EE96D2, 0x3028E1B6, 0x0DF161B9, 0xBD196726, 0x419BAD80, 0xC0A06EC7, 0x5183F241, 0x92DBF034, 0x6FA21EFC, 0x8F32CE4C, 0x13E03373, 0x69A7C66D, 0xE56D6493, 0xBF1A2FFA, 0xBB1CBFB7, 0x587403B5, 0xE76E2C4F, 0x5D89B796, 0xE89C052A, 0x446619A3, 0x342E71FB, 0x0FF22965, 0xFE81827A, 0xB11322F1, 0xA30835EC, 0xCD510F7E, 0xFF7AA614, 0x5C7293F8, 0x2FC29712, 0xF370E3C3, 0x992F491C, 0xD1431568, 0xC2A3261B, 0x88CC32B3, 0x8ACF7A6F, 0xB0E8069F, 0x7A47F51E, 0xD2BB79DA, 0xE6950821, 0x4398E55C, 0xD0B83106, 0x11E37BAF, 0x7E416553, 0xCCAA2B10, 0xD8B4E49C, 0x6456A7D4, 0xFB7C3659, 0x724B2084, 0xEA9F4DF6, 0x6A5FAADF, 0x2DC1DFCE, 0x70486858, 0xCAAFF381, 0x0605D891, 0x5A774B69, 0x94DE28A5, 0x39DF1042, 0x813BC347, 0xFC82CAA6, 0x23C8D2C5, 0x03F86CB2, 0x080CD59A, 0xDAB7AC40, 0x7DB909E1, 0x3824342C, 0xCF5247A2, 0xDCB274D1, 0x63A85B2B, 0x35D55595, 0x479E7511, 0x15E5EBE2, 0x4B9430C6, 0x4A6F14A8, 0x91239C86, 0x4C6ACC39, 0x5F8AFF4A, 0x0406904D, 0xEE99DDBB, 0x1E1152CA, 0xAAFFC418, 0xEB646998, 0x07FEFCFF, 0x8B345E01, 0x567D0EBE, 0xBAE79BD9, 0x4263C132, 0x75B5DC7B, 0x97264417, 0x67AECB66, 0x95250CCB, 0xEC9A9567, 0x57862AD0, 0x60503799, 0xB8E4D305, 0x65AD83BA, 0x19EFAE35, 0xA4F6C913, 0xC15B4AA9, 0x873E1BD6, 0xA0F0595E, 0x18148A5B, 0xAF02703B, 0xAB04E076, 0xDD4950BF, 0xDF4A1863, 0xC6A5B656, 0x853D530A, 0xFA871237, 0x77B694A7, 0x4665517F, 0xED61B109, 0x1BECE6E9, 0xD5458525, 0xF5753B52, 0x7FBA413D, 0x27CE4288, 0xB2EB4E43, 0xD6BDE997, 0x527B9EF3, 0x62537F45, 0x2C3AFBA0, 0x7BBCD170, 0xB91FF76B, 0x121B171D, 0xFD79EEC8, 0x3A277CF0, 0x0C0A45D7, 0x96DD6079, 0x2233F6AB, 0xACFA1C89, 0xC8ACBB5D, 0xA10B7D30, 0xD4BEA14B, 0xBEE10B94, 0x25CD0A54, 0x547E4662, 0xA2F31182, 0x17E6A33E, 0x263566E6, 0xC3580275, 0x83388B9B, 0x7844BDC2, 0x020348DC, 0x4F92A08B, 0x2E39B37C, 0x4E6984E5, 0xF0888F71, 0x362D3927, 0x9CD2FD3F, 0x01FB246E, 0x893716DD, 0x00000000, 0xF68D57E0, 0xE293986C, 0x744EF815, 0x9320D45A, 0xAD0138E7, 0xD3405DB4, 0x1A17C287, 0xB3106A2D, 0x5078D62F, 0xF48E1F3C, 0xA70EA5A1, 0x71B34C36, 0x9AD725AE, 0x5E71DB24, 0x161D8750, 0xEF62F9D5, 0x8D318690, 0x1C121A16, 0xA6F581CF, 0x5B8C6F07, 0x37D61D49, 0x6E593A92, 0x84C67764, 0x86C53FB8, 0xD746CDF9, 0xE090D0B0, 0x29C74F83, 0xE49640FD, 0x0E090D0B, 0x6DA15620, 0x8EC9EA22, 0xDB4C882E, 0xF776738E, 0xB515B2BC, 0x10185FC1, 0x322BA96A, 0x6BA48EB1, 0xAEF95455, 0x406089EE, 0x6655EF08, 0xE9672144, 0x3E21ECBD, 0x2030BE77, 0xF28BC7AD, 0x80C0E729, 0x141ECF8C, 0xBCE24348, 0xC4A6FE8A, 0x31D3C5D8, 0xB716FA60, 0x5380BA9D, 0xD94FC0F2, 0x1DE93E78, 0x24362E3A, 0xE16BF4DE, 0xCB54D7EF, 0x09F7F1F4, 0x82C3AFF5, 0x0BF4B928, 0x9D29D951, 0xC75E9238, 0xF8845AEB, 0x90D8B8E8, 0xDEB13C0D, 0x33D08D04, 0x685CE203, 0xC55DDAE4, 0x3BDC589E, 0x0A0F9D46, 0x3FDAC8D3, 0x598F27DB, 0xA8FC8CC4, 0x79BF99AC, 0x6C5A724E, 0x8CCAA2FE, 0x9ED1B5E3, 0x1FEA76A4, 0x73B004EA }; const u32bit Square::TD1[256] = { 0x02E368BC, 0x0C558562, 0x312A3F23, 0xF761AB13, 0x7298D46D, 0x1921CB9A, 0x613C22A4, 0xCD459D3D, 0x2305FDB4, 0x5F2BC407, 0xC09B2C01, 0x0F3DD980, 0x74486C5C, 0x85F97F7E, 0x1FF173AB, 0x0EB6EDDE, 0xED283C6B, 0x1A499778, 0x8D9F2A91, 0x33C9579F, 0xAAA907A8, 0x7DA50DED, 0x8F7C422D, 0xC9764DB0, 0x574D91E8, 0xCCCEA963, 0xD2B4EE96, 0xB63028E1, 0xB90DF161, 0x26BD1967, 0x80419BAD, 0xC7C0A06E, 0x415183F2, 0x3492DBF0, 0xFC6FA21E, 0x4C8F32CE, 0x7313E033, 0x6D69A7C6, 0x93E56D64, 0xFABF1A2F, 0xB7BB1CBF, 0xB5587403, 0x4FE76E2C, 0x965D89B7, 0x2AE89C05, 0xA3446619, 0xFB342E71, 0x650FF229, 0x7AFE8182, 0xF1B11322, 0xECA30835, 0x7ECD510F, 0x14FF7AA6, 0xF85C7293, 0x122FC297, 0xC3F370E3, 0x1C992F49, 0x68D14315, 0x1BC2A326, 0xB388CC32, 0x6F8ACF7A, 0x9FB0E806, 0x1E7A47F5, 0xDAD2BB79, 0x21E69508, 0x5C4398E5, 0x06D0B831, 0xAF11E37B, 0x537E4165, 0x10CCAA2B, 0x9CD8B4E4, 0xD46456A7, 0x59FB7C36, 0x84724B20, 0xF6EA9F4D, 0xDF6A5FAA, 0xCE2DC1DF, 0x58704868, 0x81CAAFF3, 0x910605D8, 0x695A774B, 0xA594DE28, 0x4239DF10, 0x47813BC3, 0xA6FC82CA, 0xC523C8D2, 0xB203F86C, 0x9A080CD5, 0x40DAB7AC, 0xE17DB909, 0x2C382434, 0xA2CF5247, 0xD1DCB274, 0x2B63A85B, 0x9535D555, 0x11479E75, 0xE215E5EB, 0xC64B9430, 0xA84A6F14, 0x8691239C, 0x394C6ACC, 0x4A5F8AFF, 0x4D040690, 0xBBEE99DD, 0xCA1E1152, 0x18AAFFC4, 0x98EB6469, 0xFF07FEFC, 0x018B345E, 0xBE567D0E, 0xD9BAE79B, 0x324263C1, 0x7B75B5DC, 0x17972644, 0x6667AECB, 0xCB95250C, 0x67EC9A95, 0xD057862A, 0x99605037, 0x05B8E4D3, 0xBA65AD83, 0x3519EFAE, 0x13A4F6C9, 0xA9C15B4A, 0xD6873E1B, 0x5EA0F059, 0x5B18148A, 0x3BAF0270, 0x76AB04E0, 0xBFDD4950, 0x63DF4A18, 0x56C6A5B6, 0x0A853D53, 0x37FA8712, 0xA777B694, 0x7F466551, 0x09ED61B1, 0xE91BECE6, 0x25D54585, 0x52F5753B, 0x3D7FBA41, 0x8827CE42, 0x43B2EB4E, 0x97D6BDE9, 0xF3527B9E, 0x4562537F, 0xA02C3AFB, 0x707BBCD1, 0x6BB91FF7, 0x1D121B17, 0xC8FD79EE, 0xF03A277C, 0xD70C0A45, 0x7996DD60, 0xAB2233F6, 0x89ACFA1C, 0x5DC8ACBB, 0x30A10B7D, 0x4BD4BEA1, 0x94BEE10B, 0x5425CD0A, 0x62547E46, 0x82A2F311, 0x3E17E6A3, 0xE6263566, 0x75C35802, 0x9B83388B, 0xC27844BD, 0xDC020348, 0x8B4F92A0, 0x7C2E39B3, 0xE54E6984, 0x71F0888F, 0x27362D39, 0x3F9CD2FD, 0x6E01FB24, 0xDD893716, 0x00000000, 0xE0F68D57, 0x6CE29398, 0x15744EF8, 0x5A9320D4, 0xE7AD0138, 0xB4D3405D, 0x871A17C2, 0x2DB3106A, 0x2F5078D6, 0x3CF48E1F, 0xA1A70EA5, 0x3671B34C, 0xAE9AD725, 0x245E71DB, 0x50161D87, 0xD5EF62F9, 0x908D3186, 0x161C121A, 0xCFA6F581, 0x075B8C6F, 0x4937D61D, 0x926E593A, 0x6484C677, 0xB886C53F, 0xF9D746CD, 0xB0E090D0, 0x8329C74F, 0xFDE49640, 0x0B0E090D, 0x206DA156, 0x228EC9EA, 0x2EDB4C88, 0x8EF77673, 0xBCB515B2, 0xC110185F, 0x6A322BA9, 0xB16BA48E, 0x55AEF954, 0xEE406089, 0x086655EF, 0x44E96721, 0xBD3E21EC, 0x772030BE, 0xADF28BC7, 0x2980C0E7, 0x8C141ECF, 0x48BCE243, 0x8AC4A6FE, 0xD831D3C5, 0x60B716FA, 0x9D5380BA, 0xF2D94FC0, 0x781DE93E, 0x3A24362E, 0xDEE16BF4, 0xEFCB54D7, 0xF409F7F1, 0xF582C3AF, 0x280BF4B9, 0x519D29D9, 0x38C75E92, 0xEBF8845A, 0xE890D8B8, 0x0DDEB13C, 0x0433D08D, 0x03685CE2, 0xE4C55DDA, 0x9E3BDC58, 0x460A0F9D, 0xD33FDAC8, 0xDB598F27, 0xC4A8FC8C, 0xAC79BF99, 0x4E6C5A72, 0xFE8CCAA2, 0xE39ED1B5, 0xA41FEA76, 0xEA73B004 }; const u32bit Square::TD2[256] = { 0xBC02E368, 0x620C5585, 0x23312A3F, 0x13F761AB, 0x6D7298D4, 0x9A1921CB, 0xA4613C22, 0x3DCD459D, 0xB42305FD, 0x075F2BC4, 0x01C09B2C, 0x800F3DD9, 0x5C74486C, 0x7E85F97F, 0xAB1FF173, 0xDE0EB6ED, 0x6BED283C, 0x781A4997, 0x918D9F2A, 0x9F33C957, 0xA8AAA907, 0xED7DA50D, 0x2D8F7C42, 0xB0C9764D, 0xE8574D91, 0x63CCCEA9, 0x96D2B4EE, 0xE1B63028, 0x61B90DF1, 0x6726BD19, 0xAD80419B, 0x6EC7C0A0, 0xF2415183, 0xF03492DB, 0x1EFC6FA2, 0xCE4C8F32, 0x337313E0, 0xC66D69A7, 0x6493E56D, 0x2FFABF1A, 0xBFB7BB1C, 0x03B55874, 0x2C4FE76E, 0xB7965D89, 0x052AE89C, 0x19A34466, 0x71FB342E, 0x29650FF2, 0x827AFE81, 0x22F1B113, 0x35ECA308, 0x0F7ECD51, 0xA614FF7A, 0x93F85C72, 0x97122FC2, 0xE3C3F370, 0x491C992F, 0x1568D143, 0x261BC2A3, 0x32B388CC, 0x7A6F8ACF, 0x069FB0E8, 0xF51E7A47, 0x79DAD2BB, 0x0821E695, 0xE55C4398, 0x3106D0B8, 0x7BAF11E3, 0x65537E41, 0x2B10CCAA, 0xE49CD8B4, 0xA7D46456, 0x3659FB7C, 0x2084724B, 0x4DF6EA9F, 0xAADF6A5F, 0xDFCE2DC1, 0x68587048, 0xF381CAAF, 0xD8910605, 0x4B695A77, 0x28A594DE, 0x104239DF, 0xC347813B, 0xCAA6FC82, 0xD2C523C8, 0x6CB203F8, 0xD59A080C, 0xAC40DAB7, 0x09E17DB9, 0x342C3824, 0x47A2CF52, 0x74D1DCB2, 0x5B2B63A8, 0x559535D5, 0x7511479E, 0xEBE215E5, 0x30C64B94, 0x14A84A6F, 0x9C869123, 0xCC394C6A, 0xFF4A5F8A, 0x904D0406, 0xDDBBEE99, 0x52CA1E11, 0xC418AAFF, 0x6998EB64, 0xFCFF07FE, 0x5E018B34, 0x0EBE567D, 0x9BD9BAE7, 0xC1324263, 0xDC7B75B5, 0x44179726, 0xCB6667AE, 0x0CCB9525, 0x9567EC9A, 0x2AD05786, 0x37996050, 0xD305B8E4, 0x83BA65AD, 0xAE3519EF, 0xC913A4F6, 0x4AA9C15B, 0x1BD6873E, 0x595EA0F0, 0x8A5B1814, 0x703BAF02, 0xE076AB04, 0x50BFDD49, 0x1863DF4A, 0xB656C6A5, 0x530A853D, 0x1237FA87, 0x94A777B6, 0x517F4665, 0xB109ED61, 0xE6E91BEC, 0x8525D545, 0x3B52F575, 0x413D7FBA, 0x428827CE, 0x4E43B2EB, 0xE997D6BD, 0x9EF3527B, 0x7F456253, 0xFBA02C3A, 0xD1707BBC, 0xF76BB91F, 0x171D121B, 0xEEC8FD79, 0x7CF03A27, 0x45D70C0A, 0x607996DD, 0xF6AB2233, 0x1C89ACFA, 0xBB5DC8AC, 0x7D30A10B, 0xA14BD4BE, 0x0B94BEE1, 0x0A5425CD, 0x4662547E, 0x1182A2F3, 0xA33E17E6, 0x66E62635, 0x0275C358, 0x8B9B8338, 0xBDC27844, 0x48DC0203, 0xA08B4F92, 0xB37C2E39, 0x84E54E69, 0x8F71F088, 0x3927362D, 0xFD3F9CD2, 0x246E01FB, 0x16DD8937, 0x00000000, 0x57E0F68D, 0x986CE293, 0xF815744E, 0xD45A9320, 0x38E7AD01, 0x5DB4D340, 0xC2871A17, 0x6A2DB310, 0xD62F5078, 0x1F3CF48E, 0xA5A1A70E, 0x4C3671B3, 0x25AE9AD7, 0xDB245E71, 0x8750161D, 0xF9D5EF62, 0x86908D31, 0x1A161C12, 0x81CFA6F5, 0x6F075B8C, 0x1D4937D6, 0x3A926E59, 0x776484C6, 0x3FB886C5, 0xCDF9D746, 0xD0B0E090, 0x4F8329C7, 0x40FDE496, 0x0D0B0E09, 0x56206DA1, 0xEA228EC9, 0x882EDB4C, 0x738EF776, 0xB2BCB515, 0x5FC11018, 0xA96A322B, 0x8EB16BA4, 0x5455AEF9, 0x89EE4060, 0xEF086655, 0x2144E967, 0xECBD3E21, 0xBE772030, 0xC7ADF28B, 0xE72980C0, 0xCF8C141E, 0x4348BCE2, 0xFE8AC4A6, 0xC5D831D3, 0xFA60B716, 0xBA9D5380, 0xC0F2D94F, 0x3E781DE9, 0x2E3A2436, 0xF4DEE16B, 0xD7EFCB54, 0xF1F409F7, 0xAFF582C3, 0xB9280BF4, 0xD9519D29, 0x9238C75E, 0x5AEBF884, 0xB8E890D8, 0x3C0DDEB1, 0x8D0433D0, 0xE203685C, 0xDAE4C55D, 0x589E3BDC, 0x9D460A0F, 0xC8D33FDA, 0x27DB598F, 0x8CC4A8FC, 0x99AC79BF, 0x724E6C5A, 0xA2FE8CCA, 0xB5E39ED1, 0x76A41FEA, 0x04EA73B0 }; const u32bit Square::TD3[256] = { 0x68BC02E3, 0x85620C55, 0x3F23312A, 0xAB13F761, 0xD46D7298, 0xCB9A1921, 0x22A4613C, 0x9D3DCD45, 0xFDB42305, 0xC4075F2B, 0x2C01C09B, 0xD9800F3D, 0x6C5C7448, 0x7F7E85F9, 0x73AB1FF1, 0xEDDE0EB6, 0x3C6BED28, 0x97781A49, 0x2A918D9F, 0x579F33C9, 0x07A8AAA9, 0x0DED7DA5, 0x422D8F7C, 0x4DB0C976, 0x91E8574D, 0xA963CCCE, 0xEE96D2B4, 0x28E1B630, 0xF161B90D, 0x196726BD, 0x9BAD8041, 0xA06EC7C0, 0x83F24151, 0xDBF03492, 0xA21EFC6F, 0x32CE4C8F, 0xE0337313, 0xA7C66D69, 0x6D6493E5, 0x1A2FFABF, 0x1CBFB7BB, 0x7403B558, 0x6E2C4FE7, 0x89B7965D, 0x9C052AE8, 0x6619A344, 0x2E71FB34, 0xF229650F, 0x81827AFE, 0x1322F1B1, 0x0835ECA3, 0x510F7ECD, 0x7AA614FF, 0x7293F85C, 0xC297122F, 0x70E3C3F3, 0x2F491C99, 0x431568D1, 0xA3261BC2, 0xCC32B388, 0xCF7A6F8A, 0xE8069FB0, 0x47F51E7A, 0xBB79DAD2, 0x950821E6, 0x98E55C43, 0xB83106D0, 0xE37BAF11, 0x4165537E, 0xAA2B10CC, 0xB4E49CD8, 0x56A7D464, 0x7C3659FB, 0x4B208472, 0x9F4DF6EA, 0x5FAADF6A, 0xC1DFCE2D, 0x48685870, 0xAFF381CA, 0x05D89106, 0x774B695A, 0xDE28A594, 0xDF104239, 0x3BC34781, 0x82CAA6FC, 0xC8D2C523, 0xF86CB203, 0x0CD59A08, 0xB7AC40DA, 0xB909E17D, 0x24342C38, 0x5247A2CF, 0xB274D1DC, 0xA85B2B63, 0xD5559535, 0x9E751147, 0xE5EBE215, 0x9430C64B, 0x6F14A84A, 0x239C8691, 0x6ACC394C, 0x8AFF4A5F, 0x06904D04, 0x99DDBBEE, 0x1152CA1E, 0xFFC418AA, 0x646998EB, 0xFEFCFF07, 0x345E018B, 0x7D0EBE56, 0xE79BD9BA, 0x63C13242, 0xB5DC7B75, 0x26441797, 0xAECB6667, 0x250CCB95, 0x9A9567EC, 0x862AD057, 0x50379960, 0xE4D305B8, 0xAD83BA65, 0xEFAE3519, 0xF6C913A4, 0x5B4AA9C1, 0x3E1BD687, 0xF0595EA0, 0x148A5B18, 0x02703BAF, 0x04E076AB, 0x4950BFDD, 0x4A1863DF, 0xA5B656C6, 0x3D530A85, 0x871237FA, 0xB694A777, 0x65517F46, 0x61B109ED, 0xECE6E91B, 0x458525D5, 0x753B52F5, 0xBA413D7F, 0xCE428827, 0xEB4E43B2, 0xBDE997D6, 0x7B9EF352, 0x537F4562, 0x3AFBA02C, 0xBCD1707B, 0x1FF76BB9, 0x1B171D12, 0x79EEC8FD, 0x277CF03A, 0x0A45D70C, 0xDD607996, 0x33F6AB22, 0xFA1C89AC, 0xACBB5DC8, 0x0B7D30A1, 0xBEA14BD4, 0xE10B94BE, 0xCD0A5425, 0x7E466254, 0xF31182A2, 0xE6A33E17, 0x3566E626, 0x580275C3, 0x388B9B83, 0x44BDC278, 0x0348DC02, 0x92A08B4F, 0x39B37C2E, 0x6984E54E, 0x888F71F0, 0x2D392736, 0xD2FD3F9C, 0xFB246E01, 0x3716DD89, 0x00000000, 0x8D57E0F6, 0x93986CE2, 0x4EF81574, 0x20D45A93, 0x0138E7AD, 0x405DB4D3, 0x17C2871A, 0x106A2DB3, 0x78D62F50, 0x8E1F3CF4, 0x0EA5A1A7, 0xB34C3671, 0xD725AE9A, 0x71DB245E, 0x1D875016, 0x62F9D5EF, 0x3186908D, 0x121A161C, 0xF581CFA6, 0x8C6F075B, 0xD61D4937, 0x593A926E, 0xC6776484, 0xC53FB886, 0x46CDF9D7, 0x90D0B0E0, 0xC74F8329, 0x9640FDE4, 0x090D0B0E, 0xA156206D, 0xC9EA228E, 0x4C882EDB, 0x76738EF7, 0x15B2BCB5, 0x185FC110, 0x2BA96A32, 0xA48EB16B, 0xF95455AE, 0x6089EE40, 0x55EF0866, 0x672144E9, 0x21ECBD3E, 0x30BE7720, 0x8BC7ADF2, 0xC0E72980, 0x1ECF8C14, 0xE24348BC, 0xA6FE8AC4, 0xD3C5D831, 0x16FA60B7, 0x80BA9D53, 0x4FC0F2D9, 0xE93E781D, 0x362E3A24, 0x6BF4DEE1, 0x54D7EFCB, 0xF7F1F409, 0xC3AFF582, 0xF4B9280B, 0x29D9519D, 0x5E9238C7, 0x845AEBF8, 0xD8B8E890, 0xB13C0DDE, 0xD08D0433, 0x5CE20368, 0x5DDAE4C5, 0xDC589E3B, 0x0F9D460A, 0xDAC8D33F, 0x8F27DB59, 0xFC8CC4A8, 0xBF99AC79, 0x5A724E6C, 0xCAA2FE8C, 0xD1B5E39E, 0xEA76A41F, 0xB004EA73 }; } Botan-1.10.12/src/block/square/square.cpp0000664000175000017500000001600712654331322017755 0ustar jackjack00000000000000/* * Square * (C) 1999-2007 Jack Lloyd * * Based on the public domain reference implemenation * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Square Encryption */ void Square::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit B0, B1, B2, B3; B0 = TE0[in[ 0] ^ ME[ 0]] ^ TE1[in[ 4] ^ ME[ 4]] ^ TE2[in[ 8] ^ ME[ 8]] ^ TE3[in[12] ^ ME[12]] ^ EK[0]; B1 = TE0[in[ 1] ^ ME[ 1]] ^ TE1[in[ 5] ^ ME[ 5]] ^ TE2[in[ 9] ^ ME[ 9]] ^ TE3[in[13] ^ ME[13]] ^ EK[1]; B2 = TE0[in[ 2] ^ ME[ 2]] ^ TE1[in[ 6] ^ ME[ 6]] ^ TE2[in[10] ^ ME[10]] ^ TE3[in[14] ^ ME[14]] ^ EK[2]; B3 = TE0[in[ 3] ^ ME[ 3]] ^ TE1[in[ 7] ^ ME[ 7]] ^ TE2[in[11] ^ ME[11]] ^ TE3[in[15] ^ ME[15]] ^ EK[3]; for(size_t j = 1; j != 7; j += 2) { u32bit T0, T1, T2, T3; T0 = TE0[get_byte(0, B0)] ^ TE1[get_byte(0, B1)] ^ TE2[get_byte(0, B2)] ^ TE3[get_byte(0, B3)] ^ EK[4*j+0]; T1 = TE0[get_byte(1, B0)] ^ TE1[get_byte(1, B1)] ^ TE2[get_byte(1, B2)] ^ TE3[get_byte(1, B3)] ^ EK[4*j+1]; T2 = TE0[get_byte(2, B0)] ^ TE1[get_byte(2, B1)] ^ TE2[get_byte(2, B2)] ^ TE3[get_byte(2, B3)] ^ EK[4*j+2]; T3 = TE0[get_byte(3, B0)] ^ TE1[get_byte(3, B1)] ^ TE2[get_byte(3, B2)] ^ TE3[get_byte(3, B3)] ^ EK[4*j+3]; B0 = TE0[get_byte(0, T0)] ^ TE1[get_byte(0, T1)] ^ TE2[get_byte(0, T2)] ^ TE3[get_byte(0, T3)] ^ EK[4*j+4]; B1 = TE0[get_byte(1, T0)] ^ TE1[get_byte(1, T1)] ^ TE2[get_byte(1, T2)] ^ TE3[get_byte(1, T3)] ^ EK[4*j+5]; B2 = TE0[get_byte(2, T0)] ^ TE1[get_byte(2, T1)] ^ TE2[get_byte(2, T2)] ^ TE3[get_byte(2, T3)] ^ EK[4*j+6]; B3 = TE0[get_byte(3, T0)] ^ TE1[get_byte(3, T1)] ^ TE2[get_byte(3, T2)] ^ TE3[get_byte(3, T3)] ^ EK[4*j+7]; } out[ 0] = SE[get_byte(0, B0)] ^ ME[16]; out[ 1] = SE[get_byte(0, B1)] ^ ME[17]; out[ 2] = SE[get_byte(0, B2)] ^ ME[18]; out[ 3] = SE[get_byte(0, B3)] ^ ME[19]; out[ 4] = SE[get_byte(1, B0)] ^ ME[20]; out[ 5] = SE[get_byte(1, B1)] ^ ME[21]; out[ 6] = SE[get_byte(1, B2)] ^ ME[22]; out[ 7] = SE[get_byte(1, B3)] ^ ME[23]; out[ 8] = SE[get_byte(2, B0)] ^ ME[24]; out[ 9] = SE[get_byte(2, B1)] ^ ME[25]; out[10] = SE[get_byte(2, B2)] ^ ME[26]; out[11] = SE[get_byte(2, B3)] ^ ME[27]; out[12] = SE[get_byte(3, B0)] ^ ME[28]; out[13] = SE[get_byte(3, B1)] ^ ME[29]; out[14] = SE[get_byte(3, B2)] ^ ME[30]; out[15] = SE[get_byte(3, B3)] ^ ME[31]; in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Square Decryption */ void Square::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit B0, B1, B2, B3; B0 = TD0[in[ 0] ^ MD[ 0]] ^ TD1[in[ 4] ^ MD[ 4]] ^ TD2[in[ 8] ^ MD[ 8]] ^ TD3[in[12] ^ MD[12]] ^ DK[0]; B1 = TD0[in[ 1] ^ MD[ 1]] ^ TD1[in[ 5] ^ MD[ 5]] ^ TD2[in[ 9] ^ MD[ 9]] ^ TD3[in[13] ^ MD[13]] ^ DK[1]; B2 = TD0[in[ 2] ^ MD[ 2]] ^ TD1[in[ 6] ^ MD[ 6]] ^ TD2[in[10] ^ MD[10]] ^ TD3[in[14] ^ MD[14]] ^ DK[2]; B3 = TD0[in[ 3] ^ MD[ 3]] ^ TD1[in[ 7] ^ MD[ 7]] ^ TD2[in[11] ^ MD[11]] ^ TD3[in[15] ^ MD[15]] ^ DK[3]; for(size_t j = 1; j != 7; j += 2) { u32bit T0, T1, T2, T3; T0 = TD0[get_byte(0, B0)] ^ TD1[get_byte(0, B1)] ^ TD2[get_byte(0, B2)] ^ TD3[get_byte(0, B3)] ^ DK[4*j+0]; T1 = TD0[get_byte(1, B0)] ^ TD1[get_byte(1, B1)] ^ TD2[get_byte(1, B2)] ^ TD3[get_byte(1, B3)] ^ DK[4*j+1]; T2 = TD0[get_byte(2, B0)] ^ TD1[get_byte(2, B1)] ^ TD2[get_byte(2, B2)] ^ TD3[get_byte(2, B3)] ^ DK[4*j+2]; T3 = TD0[get_byte(3, B0)] ^ TD1[get_byte(3, B1)] ^ TD2[get_byte(3, B2)] ^ TD3[get_byte(3, B3)] ^ DK[4*j+3]; B0 = TD0[get_byte(0, T0)] ^ TD1[get_byte(0, T1)] ^ TD2[get_byte(0, T2)] ^ TD3[get_byte(0, T3)] ^ DK[4*j+4]; B1 = TD0[get_byte(1, T0)] ^ TD1[get_byte(1, T1)] ^ TD2[get_byte(1, T2)] ^ TD3[get_byte(1, T3)] ^ DK[4*j+5]; B2 = TD0[get_byte(2, T0)] ^ TD1[get_byte(2, T1)] ^ TD2[get_byte(2, T2)] ^ TD3[get_byte(2, T3)] ^ DK[4*j+6]; B3 = TD0[get_byte(3, T0)] ^ TD1[get_byte(3, T1)] ^ TD2[get_byte(3, T2)] ^ TD3[get_byte(3, T3)] ^ DK[4*j+7]; } out[ 0] = SD[get_byte(0, B0)] ^ MD[16]; out[ 1] = SD[get_byte(0, B1)] ^ MD[17]; out[ 2] = SD[get_byte(0, B2)] ^ MD[18]; out[ 3] = SD[get_byte(0, B3)] ^ MD[19]; out[ 4] = SD[get_byte(1, B0)] ^ MD[20]; out[ 5] = SD[get_byte(1, B1)] ^ MD[21]; out[ 6] = SD[get_byte(1, B2)] ^ MD[22]; out[ 7] = SD[get_byte(1, B3)] ^ MD[23]; out[ 8] = SD[get_byte(2, B0)] ^ MD[24]; out[ 9] = SD[get_byte(2, B1)] ^ MD[25]; out[10] = SD[get_byte(2, B2)] ^ MD[26]; out[11] = SD[get_byte(2, B3)] ^ MD[27]; out[12] = SD[get_byte(3, B0)] ^ MD[28]; out[13] = SD[get_byte(3, B1)] ^ MD[29]; out[14] = SD[get_byte(3, B2)] ^ MD[30]; out[15] = SD[get_byte(3, B3)] ^ MD[31]; in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Square Key Schedule */ void Square::key_schedule(const byte key[], size_t) { SecureVector XEK(36), XDK(36); for(size_t i = 0; i != 4; ++i) XEK[i] = load_be(key, i); for(size_t i = 0; i != 8; ++i) { XEK[4*i+4] = XEK[4*i ] ^ rotate_left(XEK[4*i+3], 8) ^ (0x01000000 << i); XEK[4*i+5] = XEK[4*i+1] ^ XEK[4*i+4]; XEK[4*i+6] = XEK[4*i+2] ^ XEK[4*i+5]; XEK[4*i+7] = XEK[4*i+3] ^ XEK[4*i+6]; for(size_t j = 0; j != 4; ++j) XDK[28 - 4*i + j] = XEK[4*(i+1)+j]; transform(&XEK[4*i]); } for(size_t i = 0; i != 4; ++i) for(size_t j = 0; j != 4; ++j) { ME[4*i+j ] = get_byte(j, XEK[i ]); ME[4*i+j+16] = get_byte(j, XEK[i+32]); MD[4*i+j ] = get_byte(j, XDK[i ]); MD[4*i+j+16] = get_byte(j, XEK[i ]); } EK.copy(&XEK[4], 28); DK.copy(&XDK[4], 28); } /* * Square's Inverse Linear Transformation */ void Square::transform(u32bit round_key[4]) { static const byte G[4][4] = { { 2, 1, 1, 3 }, { 3, 2, 1, 1 }, { 1, 3, 2, 1 }, { 1, 1, 3, 2 } }; for(size_t i = 0; i != 4; ++i) { byte A[4] = { 0 }, B[4] = { 0 }; store_be(round_key[i], A); for(size_t j = 0; j != 4; ++j) for(size_t k = 0; k != 4; ++k) { const byte a = A[k]; const byte b = G[k][j]; if(a && b) B[j] ^= ALog[(Log[a] + Log[b]) % 255]; } round_key[i] = load_be(B, 0); } } /* * Clear memory of sensitive data */ void Square::clear() { zeroise(EK); zeroise(DK); zeroise(ME); zeroise(MD); } } Botan-1.10.12/src/block/square/square.h0000664000175000017500000000232112654331322017414 0ustar jackjack00000000000000/* * Square * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SQUARE_H__ #define BOTAN_SQUARE_H__ #include namespace Botan { /** * Square */ class BOTAN_DLL Square : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "Square"; } BlockCipher* clone() const { return new Square; } Square() : EK(28), DK(28), ME(32), MD(32) {} private: void key_schedule(const byte[], size_t); static void transform(u32bit[4]); static const byte SE[256]; static const byte SD[256]; static const byte Log[256]; static const byte ALog[255]; static const u32bit TE0[256]; static const u32bit TE1[256]; static const u32bit TE2[256]; static const u32bit TE3[256]; static const u32bit TD0[256]; static const u32bit TD1[256]; static const u32bit TD2[256]; static const u32bit TD3[256]; SecureVector EK, DK; SecureVector ME, MD; }; } #endif Botan-1.10.12/src/block/tea/info.txt0000664000175000017500000000001312654331322016704 0ustar jackjack00000000000000define TEA Botan-1.10.12/src/block/tea/tea.cpp0000664000175000017500000000263412654331322016500 0ustar jackjack00000000000000/* * TEA * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * TEA Encryption */ void TEA::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit L = load_be(in, 0); u32bit R = load_be(in, 1); u32bit S = 0; for(size_t j = 0; j != 32; ++j) { S += 0x9E3779B9; L += ((R << 4) + K[0]) ^ (R + S) ^ ((R >> 5) + K[1]); R += ((L << 4) + K[2]) ^ (L + S) ^ ((L >> 5) + K[3]); } store_be(out, L, R); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * TEA Decryption */ void TEA::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit L = load_be(in, 0); u32bit R = load_be(in, 1); u32bit S = 0xC6EF3720; for(size_t j = 0; j != 32; ++j) { R -= ((L << 4) + K[2]) ^ (L + S) ^ ((L >> 5) + K[3]); L -= ((R << 4) + K[0]) ^ (R + S) ^ ((R >> 5) + K[1]); S -= 0x9E3779B9; } store_be(out, L, R); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * TEA Key Schedule */ void TEA::key_schedule(const byte key[], size_t) { for(size_t i = 0; i != 4; ++i) K[i] = load_be(key, i); } } Botan-1.10.12/src/block/tea/tea.h0000664000175000017500000000126412654331322016143 0ustar jackjack00000000000000/* * TEA * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_TEA_H__ #define BOTAN_TEA_H__ #include namespace Botan { /** * TEA */ class BOTAN_DLL TEA : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(K); } std::string name() const { return "TEA"; } BlockCipher* clone() const { return new TEA; } TEA() : K(4) {} private: void key_schedule(const byte[], size_t); SecureVector K; }; } #endif Botan-1.10.12/src/block/twofish/info.txt0000664000175000017500000000001712654331322017622 0ustar jackjack00000000000000define TWOFISH Botan-1.10.12/src/block/twofish/two_tab.cpp0000664000175000017500000004672012654331322020304 0ustar jackjack00000000000000/* * S-Box and MDS Tables for Twofish * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { const byte Twofish::Q0[256] = { 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0 }; const byte Twofish::Q1[256] = { 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 }; const byte Twofish::RS[32] = { 0x01, 0xA4, 0x02, 0xA4, 0xA4, 0x56, 0xA1, 0x55, 0x55, 0x82, 0xFC, 0x87, 0x87, 0xF3, 0xC1, 0x5A, 0x5A, 0x1E, 0x47, 0x58, 0x58, 0xC6, 0xAE, 0xDB, 0xDB, 0x68, 0x3D, 0x9E, 0x9E, 0xE5, 0x19, 0x03 }; const byte Twofish::EXP_TO_POLY[255] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D, 0x9A, 0x79, 0xF2, 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E, 0xDC, 0xF5, 0xA7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD, 0xD7, 0xE3, 0x8B, 0x5B, 0xB6, 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59, 0xB2, 0x29, 0x52, 0xA4, 0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0x0D, 0x1A, 0x34, 0x68, 0xD0, 0xED, 0x97, 0x63, 0xC6, 0xC1, 0xCF, 0xD3, 0xEB, 0x9B, 0x7B, 0xF6, 0xA1, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xAD, 0x17, 0x2E, 0x5C, 0xB8, 0x3D, 0x7A, 0xF4, 0xA5, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x8D, 0x57, 0xAE, 0x11, 0x22, 0x44, 0x88, 0x5D, 0xBA, 0x39, 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, 0xA2, 0x09, 0x12, 0x24, 0x48, 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, 0xCC, 0xD5, 0xE7, 0x83, 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, 0x1B, 0x36, 0x6C, 0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19, 0x32, 0x64, 0xC8, 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x2D, 0x5A, 0xB4, 0x25, 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3, 0x2B, 0x56, 0xAC, 0x15, 0x2A, 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8, 0x9D, 0x77, 0xEE, 0x91, 0x6F, 0xDE, 0xF1, 0xAF, 0x13, 0x26, 0x4C, 0x98, 0x7D, 0xFA, 0xB9, 0x3F, 0x7E, 0xFC, 0xB5, 0x27, 0x4E, 0x9C, 0x75, 0xEA, 0x99, 0x7F, 0xFE, 0xB1, 0x2F, 0x5E, 0xBC, 0x35, 0x6A, 0xD4, 0xE5, 0x87, 0x43, 0x86, 0x41, 0x82, 0x49, 0x92, 0x69, 0xD2, 0xE9, 0x9F, 0x73, 0xE6, 0x81, 0x4F, 0x9E, 0x71, 0xE2, 0x89, 0x5F, 0xBE, 0x31, 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB, 0xDB, 0xFB, 0xBB, 0x3B, 0x76, 0xEC, 0x95, 0x67, 0xCE, 0xD1, 0xEF, 0x93, 0x6B, 0xD6, 0xE1, 0x8F, 0x53, 0xA6 }; const byte Twofish::POLY_TO_EXP[255] = { 0x00, 0x01, 0x17, 0x02, 0x2E, 0x18, 0x53, 0x03, 0x6A, 0x2F, 0x93, 0x19, 0x34, 0x54, 0x45, 0x04, 0x5C, 0x6B, 0xB6, 0x30, 0xA6, 0x94, 0x4B, 0x1A, 0x8C, 0x35, 0x81, 0x55, 0xAA, 0x46, 0x0D, 0x05, 0x24, 0x5D, 0x87, 0x6C, 0x9B, 0xB7, 0xC1, 0x31, 0x2B, 0xA7, 0xA3, 0x95, 0x98, 0x4C, 0xCA, 0x1B, 0xE6, 0x8D, 0x73, 0x36, 0xCD, 0x82, 0x12, 0x56, 0x62, 0xAB, 0xF0, 0x47, 0x4F, 0x0E, 0xBD, 0x06, 0xD4, 0x25, 0xD2, 0x5E, 0x27, 0x88, 0x66, 0x6D, 0xD6, 0x9C, 0x79, 0xB8, 0x08, 0xC2, 0xDF, 0x32, 0x68, 0x2C, 0xFD, 0xA8, 0x8A, 0xA4, 0x5A, 0x96, 0x29, 0x99, 0x22, 0x4D, 0x60, 0xCB, 0xE4, 0x1C, 0x7B, 0xE7, 0x3B, 0x8E, 0x9E, 0x74, 0xF4, 0x37, 0xD8, 0xCE, 0xF9, 0x83, 0x6F, 0x13, 0xB2, 0x57, 0xE1, 0x63, 0xDC, 0xAC, 0xC4, 0xF1, 0xAF, 0x48, 0x0A, 0x50, 0x42, 0x0F, 0xBA, 0xBE, 0xC7, 0x07, 0xDE, 0xD5, 0x78, 0x26, 0x65, 0xD3, 0xD1, 0x5F, 0xE3, 0x28, 0x21, 0x89, 0x59, 0x67, 0xFC, 0x6E, 0xB1, 0xD7, 0xF8, 0x9D, 0xF3, 0x7A, 0x3A, 0xB9, 0xC6, 0x09, 0x41, 0xC3, 0xAE, 0xE0, 0xDB, 0x33, 0x44, 0x69, 0x92, 0x2D, 0x52, 0xFE, 0x16, 0xA9, 0x0C, 0x8B, 0x80, 0xA5, 0x4A, 0x5B, 0xB5, 0x97, 0xC9, 0x2A, 0xA2, 0x9A, 0xC0, 0x23, 0x86, 0x4E, 0xBC, 0x61, 0xEF, 0xCC, 0x11, 0xE5, 0x72, 0x1D, 0x3D, 0x7C, 0xEB, 0xE8, 0xE9, 0x3C, 0xEA, 0x8F, 0x7D, 0x9F, 0xEC, 0x75, 0x1E, 0xF5, 0x3E, 0x38, 0xF6, 0xD9, 0x3F, 0xCF, 0x76, 0xFA, 0x1F, 0x84, 0xA0, 0x70, 0xED, 0x14, 0x90, 0xB3, 0x7E, 0x58, 0xFB, 0xE2, 0x20, 0x64, 0xD0, 0xDD, 0x77, 0xAD, 0xDA, 0xC5, 0x40, 0xF2, 0x39, 0xB0, 0xF7, 0x49, 0xB4, 0x0B, 0x7F, 0x51, 0x15, 0x43, 0x91, 0x10, 0x71, 0xBB, 0xEE, 0xBF, 0x85, 0xC8, 0xA1 }; const u32bit Twofish::MDS0[256] = { 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8, 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F, 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3, 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C, 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC, 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17, 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149, 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48, 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5, 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC, 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2, 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 }; const u32bit Twofish::MDS1[256] = { 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4, 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E, 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D, 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B, 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D, 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7, 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E, 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F, 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7, 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323, 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000, 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 }; const u32bit Twofish::MDS2[256] = { 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA, 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE, 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065, 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF, 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF, 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC, 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101, 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A, 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6, 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB, 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746, 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF }; const u32bit Twofish::MDS3[256] = { 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF, 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A, 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63, 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197, 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20, 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730, 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F, 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D, 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6, 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439, 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000, 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 }; } Botan-1.10.12/src/block/twofish/twofish.cpp0000664000175000017500000001604512654331322020325 0ustar jackjack00000000000000/* * Twofish * (C) 1999-2007 Jack Lloyd * * The key schedule implemenation is based on a public domain * implementation by Matthew Skala * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Twofish Encryption */ void Twofish::encrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A = load_le(in, 0) ^ RK[0]; u32bit B = load_le(in, 1) ^ RK[1]; u32bit C = load_le(in, 2) ^ RK[2]; u32bit D = load_le(in, 3) ^ RK[3]; for(size_t j = 0; j != 16; j += 2) { u32bit X, Y; X = SB[ get_byte(3, A)] ^ SB[256+get_byte(2, A)] ^ SB[512+get_byte(1, A)] ^ SB[768+get_byte(0, A)]; Y = SB[ get_byte(0, B)] ^ SB[256+get_byte(3, B)] ^ SB[512+get_byte(2, B)] ^ SB[768+get_byte(1, B)]; X += Y; Y += X + RK[2*j + 9]; X += RK[2*j + 8]; C = rotate_right(C ^ X, 1); D = rotate_left(D, 1) ^ Y; X = SB[ get_byte(3, C)] ^ SB[256+get_byte(2, C)] ^ SB[512+get_byte(1, C)] ^ SB[768+get_byte(0, C)]; Y = SB[ get_byte(0, D)] ^ SB[256+get_byte(3, D)] ^ SB[512+get_byte(2, D)] ^ SB[768+get_byte(1, D)]; X += Y; Y += X + RK[2*j + 11]; X += RK[2*j + 10]; A = rotate_right(A ^ X, 1); B = rotate_left(B, 1) ^ Y; } C ^= RK[4]; D ^= RK[5]; A ^= RK[6]; B ^= RK[7]; store_le(out, C, D, A, B); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Twofish Decryption */ void Twofish::decrypt_n(const byte in[], byte out[], size_t blocks) const { for(size_t i = 0; i != blocks; ++i) { u32bit A = load_le(in, 0) ^ RK[4]; u32bit B = load_le(in, 1) ^ RK[5]; u32bit C = load_le(in, 2) ^ RK[6]; u32bit D = load_le(in, 3) ^ RK[7]; for(size_t j = 0; j != 16; j += 2) { u32bit X, Y; X = SB[ get_byte(3, A)] ^ SB[256+get_byte(2, A)] ^ SB[512+get_byte(1, A)] ^ SB[768+get_byte(0, A)]; Y = SB[ get_byte(0, B)] ^ SB[256+get_byte(3, B)] ^ SB[512+get_byte(2, B)] ^ SB[768+get_byte(1, B)]; X += Y; Y += X + RK[39 - 2*j]; X += RK[38 - 2*j]; C = rotate_left(C, 1) ^ X; D = rotate_right(D ^ Y, 1); X = SB[ get_byte(3, C)] ^ SB[256+get_byte(2, C)] ^ SB[512+get_byte(1, C)] ^ SB[768+get_byte(0, C)]; Y = SB[ get_byte(0, D)] ^ SB[256+get_byte(3, D)] ^ SB[512+get_byte(2, D)] ^ SB[768+get_byte(1, D)]; X += Y; Y += X + RK[37 - 2*j]; X += RK[36 - 2*j]; A = rotate_left(A, 1) ^ X; B = rotate_right(B ^ Y, 1); } C ^= RK[0]; D ^= RK[1]; A ^= RK[2]; B ^= RK[3]; store_le(out, C, D, A, B); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Twofish Key Schedule */ void Twofish::key_schedule(const byte key[], size_t length) { SecureVector S(16); for(size_t i = 0; i != length; ++i) rs_mul(&S[4*(i/8)], key[i], i); if(length == 16) { for(size_t i = 0; i != 256; ++i) { SB[ i] = MDS0[Q0[Q0[i]^S[ 0]]^S[ 4]]; SB[256+i] = MDS1[Q0[Q1[i]^S[ 1]]^S[ 5]]; SB[512+i] = MDS2[Q1[Q0[i]^S[ 2]]^S[ 6]]; SB[768+i] = MDS3[Q1[Q1[i]^S[ 3]]^S[ 7]]; } for(size_t i = 0; i != 40; i += 2) { u32bit X = MDS0[Q0[Q0[i ]^key[ 8]]^key[ 0]] ^ MDS1[Q0[Q1[i ]^key[ 9]]^key[ 1]] ^ MDS2[Q1[Q0[i ]^key[10]]^key[ 2]] ^ MDS3[Q1[Q1[i ]^key[11]]^key[ 3]]; u32bit Y = MDS0[Q0[Q0[i+1]^key[12]]^key[ 4]] ^ MDS1[Q0[Q1[i+1]^key[13]]^key[ 5]] ^ MDS2[Q1[Q0[i+1]^key[14]]^key[ 6]] ^ MDS3[Q1[Q1[i+1]^key[15]]^key[ 7]]; Y = rotate_left(Y, 8); X += Y; Y += X; RK[i] = X; RK[i+1] = rotate_left(Y, 9); } } else if(length == 24) { for(size_t i = 0; i != 256; ++i) { SB[ i] = MDS0[Q0[Q0[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]]; SB[256+i] = MDS1[Q0[Q1[Q1[i]^S[ 1]]^S[ 5]]^S[ 9]]; SB[512+i] = MDS2[Q1[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]]; SB[768+i] = MDS3[Q1[Q1[Q0[i]^S[ 3]]^S[ 7]]^S[11]]; } for(size_t i = 0; i != 40; i += 2) { u32bit X = MDS0[Q0[Q0[Q1[i ]^key[16]]^key[ 8]]^key[ 0]] ^ MDS1[Q0[Q1[Q1[i ]^key[17]]^key[ 9]]^key[ 1]] ^ MDS2[Q1[Q0[Q0[i ]^key[18]]^key[10]]^key[ 2]] ^ MDS3[Q1[Q1[Q0[i ]^key[19]]^key[11]]^key[ 3]]; u32bit Y = MDS0[Q0[Q0[Q1[i+1]^key[20]]^key[12]]^key[ 4]] ^ MDS1[Q0[Q1[Q1[i+1]^key[21]]^key[13]]^key[ 5]] ^ MDS2[Q1[Q0[Q0[i+1]^key[22]]^key[14]]^key[ 6]] ^ MDS3[Q1[Q1[Q0[i+1]^key[23]]^key[15]]^key[ 7]]; Y = rotate_left(Y, 8); X += Y; Y += X; RK[i] = X; RK[i+1] = rotate_left(Y, 9); } } else if(length == 32) { for(size_t i = 0; i != 256; ++i) { SB[ i] = MDS0[Q0[Q0[Q1[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]]^S[12]]; SB[256+i] = MDS1[Q0[Q1[Q1[Q0[i]^S[ 1]]^S[ 5]]^S[ 9]]^S[13]]; SB[512+i] = MDS2[Q1[Q0[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]]^S[14]]; SB[768+i] = MDS3[Q1[Q1[Q0[Q1[i]^S[ 3]]^S[ 7]]^S[11]]^S[15]]; } for(size_t i = 0; i != 40; i += 2) { u32bit X = MDS0[Q0[Q0[Q1[Q1[i ]^key[24]]^key[16]]^key[ 8]]^key[ 0]] ^ MDS1[Q0[Q1[Q1[Q0[i ]^key[25]]^key[17]]^key[ 9]]^key[ 1]] ^ MDS2[Q1[Q0[Q0[Q0[i ]^key[26]]^key[18]]^key[10]]^key[ 2]] ^ MDS3[Q1[Q1[Q0[Q1[i ]^key[27]]^key[19]]^key[11]]^key[ 3]]; u32bit Y = MDS0[Q0[Q0[Q1[Q1[i+1]^key[28]]^key[20]]^key[12]]^key[ 4]] ^ MDS1[Q0[Q1[Q1[Q0[i+1]^key[29]]^key[21]]^key[13]]^key[ 5]] ^ MDS2[Q1[Q0[Q0[Q0[i+1]^key[30]]^key[22]]^key[14]]^key[ 6]] ^ MDS3[Q1[Q1[Q0[Q1[i+1]^key[31]]^key[23]]^key[15]]^key[ 7]]; Y = rotate_left(Y, 8); X += Y; Y += X; RK[i] = X; RK[i+1] = rotate_left(Y, 9); } } } /* * Do one column of the RS matrix multiplcation */ void Twofish::rs_mul(byte S[4], byte key, size_t offset) { if(key) { byte X = POLY_TO_EXP[key - 1]; byte RS1 = RS[(4*offset ) % 32]; byte RS2 = RS[(4*offset+1) % 32]; byte RS3 = RS[(4*offset+2) % 32]; byte RS4 = RS[(4*offset+3) % 32]; S[0] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS1 - 1]) % 255]; S[1] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS2 - 1]) % 255]; S[2] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS3 - 1]) % 255]; S[3] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS4 - 1]) % 255]; } } /* * Clear memory of sensitive data */ void Twofish::clear() { zeroise(SB); zeroise(RK); } } Botan-1.10.12/src/block/twofish/twofish.h0000664000175000017500000000215512654331322017767 0ustar jackjack00000000000000/* * Twofish * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_TWOFISH_H__ #define BOTAN_TWOFISH_H__ #include namespace Botan { /** * Twofish, an AES finalist */ class BOTAN_DLL Twofish : public Block_Cipher_Fixed_Params<16, 16, 32, 8> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); std::string name() const { return "Twofish"; } BlockCipher* clone() const { return new Twofish; } Twofish() : SB(1024), RK(40) {} private: void key_schedule(const byte[], size_t); static void rs_mul(byte[4], byte, size_t); static const u32bit MDS0[256]; static const u32bit MDS1[256]; static const u32bit MDS2[256]; static const u32bit MDS3[256]; static const byte Q0[256]; static const byte Q1[256]; static const byte RS[32]; static const byte EXP_TO_POLY[255]; static const byte POLY_TO_EXP[255]; SecureVector SB, RK; }; } #endif Botan-1.10.12/src/block/xtea/info.txt0000664000175000017500000000001412654331322017075 0ustar jackjack00000000000000define XTEA Botan-1.10.12/src/block/xtea/xtea.cpp0000664000175000017500000000637212654331322017063 0ustar jackjack00000000000000/* * XTEA * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { void xtea_encrypt_4(const byte in[32], byte out[32], const u32bit EK[64]) { u32bit L0, R0, L1, R1, L2, R2, L3, R3; load_be(in, L0, R0, L1, R1, L2, R2, L3, R3); for(size_t i = 0; i != 32; ++i) { L0 += (((R0 << 4) ^ (R0 >> 5)) + R0) ^ EK[2*i]; L1 += (((R1 << 4) ^ (R1 >> 5)) + R1) ^ EK[2*i]; L2 += (((R2 << 4) ^ (R2 >> 5)) + R2) ^ EK[2*i]; L3 += (((R3 << 4) ^ (R3 >> 5)) + R3) ^ EK[2*i]; R0 += (((L0 << 4) ^ (L0 >> 5)) + L0) ^ EK[2*i+1]; R1 += (((L1 << 4) ^ (L1 >> 5)) + L1) ^ EK[2*i+1]; R2 += (((L2 << 4) ^ (L2 >> 5)) + L2) ^ EK[2*i+1]; R3 += (((L3 << 4) ^ (L3 >> 5)) + L3) ^ EK[2*i+1]; } store_be(out, L0, R0, L1, R1, L2, R2, L3, R3); } void xtea_decrypt_4(const byte in[32], byte out[32], const u32bit EK[64]) { u32bit L0, R0, L1, R1, L2, R2, L3, R3; load_be(in, L0, R0, L1, R1, L2, R2, L3, R3); for(size_t i = 0; i != 32; ++i) { R0 -= (((L0 << 4) ^ (L0 >> 5)) + L0) ^ EK[63 - 2*i]; R1 -= (((L1 << 4) ^ (L1 >> 5)) + L1) ^ EK[63 - 2*i]; R2 -= (((L2 << 4) ^ (L2 >> 5)) + L2) ^ EK[63 - 2*i]; R3 -= (((L3 << 4) ^ (L3 >> 5)) + L3) ^ EK[63 - 2*i]; L0 -= (((R0 << 4) ^ (R0 >> 5)) + R0) ^ EK[62 - 2*i]; L1 -= (((R1 << 4) ^ (R1 >> 5)) + R1) ^ EK[62 - 2*i]; L2 -= (((R2 << 4) ^ (R2 >> 5)) + R2) ^ EK[62 - 2*i]; L3 -= (((R3 << 4) ^ (R3 >> 5)) + R3) ^ EK[62 - 2*i]; } store_be(out, L0, R0, L1, R1, L2, R2, L3, R3); } } /* * XTEA Encryption */ void XTEA::encrypt_n(const byte in[], byte out[], size_t blocks) const { while(blocks >= 4) { xtea_encrypt_4(in, out, &(this->EK[0])); in += 4 * BLOCK_SIZE; out += 4 * BLOCK_SIZE; blocks -= 4; } for(size_t i = 0; i != blocks; ++i) { u32bit L = load_be(in, 0); u32bit R = load_be(in, 1); for(size_t j = 0; j != 32; ++j) { L += (((R << 4) ^ (R >> 5)) + R) ^ EK[2*j]; R += (((L << 4) ^ (L >> 5)) + L) ^ EK[2*j+1]; } store_be(out, L, R); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * XTEA Decryption */ void XTEA::decrypt_n(const byte in[], byte out[], size_t blocks) const { while(blocks >= 4) { xtea_decrypt_4(in, out, &(this->EK[0])); in += 4 * BLOCK_SIZE; out += 4 * BLOCK_SIZE; blocks -= 4; } for(size_t i = 0; i != blocks; ++i) { u32bit L = load_be(in, 0); u32bit R = load_be(in, 1); for(size_t j = 0; j != 32; ++j) { R -= (((L << 4) ^ (L >> 5)) + L) ^ EK[63 - 2*j]; L -= (((R << 4) ^ (R >> 5)) + R) ^ EK[62 - 2*j]; } store_be(out, L, R); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * XTEA Key Schedule */ void XTEA::key_schedule(const byte key[], size_t) { SecureVector UK(4); for(size_t i = 0; i != 4; ++i) UK[i] = load_be(key, i); u32bit D = 0; for(size_t i = 0; i != 64; i += 2) { EK[i ] = D + UK[D % 4]; D += 0x9E3779B9; EK[i+1] = D + UK[(D >> 11) % 4]; } } } Botan-1.10.12/src/block/xtea/xtea.h0000664000175000017500000000152612654331322016524 0ustar jackjack00000000000000/* * XTEA * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_XTEA_H__ #define BOTAN_XTEA_H__ #include namespace Botan { /** * XTEA */ class BOTAN_DLL XTEA : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear() { zeroise(EK); } std::string name() const { return "XTEA"; } BlockCipher* clone() const { return new XTEA; } XTEA() : EK(64) {} protected: /** * @return const reference to the key schedule */ const SecureVector& get_EK() const { return EK; } private: void key_schedule(const byte[], size_t); SecureVector EK; }; } #endif Botan-1.10.12/src/block/xtea_simd/info.txt0000664000175000017500000000007712654331322020122 0ustar jackjack00000000000000define XTEA_SIMD xtea simd simd_engine Botan-1.10.12/src/block/xtea_simd/xtea_simd.cpp0000664000175000017500000000562612654331322021114 0ustar jackjack00000000000000/* * XTEA in SIMD * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { void xtea_encrypt_8(const byte in[64], byte out[64], const u32bit EK[64]) { SIMD_32 L0 = SIMD_32::load_be(in ); SIMD_32 R0 = SIMD_32::load_be(in + 16); SIMD_32 L1 = SIMD_32::load_be(in + 32); SIMD_32 R1 = SIMD_32::load_be(in + 48); SIMD_32::transpose(L0, R0, L1, R1); for(size_t i = 0; i != 32; i += 2) { SIMD_32 K0(EK[2*i ]); SIMD_32 K1(EK[2*i+1]); SIMD_32 K2(EK[2*i+2]); SIMD_32 K3(EK[2*i+3]); L0 += (((R0 << 4) ^ (R0 >> 5)) + R0) ^ K0; L1 += (((R1 << 4) ^ (R1 >> 5)) + R1) ^ K0; R0 += (((L0 << 4) ^ (L0 >> 5)) + L0) ^ K1; R1 += (((L1 << 4) ^ (L1 >> 5)) + L1) ^ K1; L0 += (((R0 << 4) ^ (R0 >> 5)) + R0) ^ K2; L1 += (((R1 << 4) ^ (R1 >> 5)) + R1) ^ K2; R0 += (((L0 << 4) ^ (L0 >> 5)) + L0) ^ K3; R1 += (((L1 << 4) ^ (L1 >> 5)) + L1) ^ K3; } SIMD_32::transpose(L0, R0, L1, R1); L0.store_be(out); R0.store_be(out + 16); L1.store_be(out + 32); R1.store_be(out + 48); } void xtea_decrypt_8(const byte in[64], byte out[64], const u32bit EK[64]) { SIMD_32 L0 = SIMD_32::load_be(in ); SIMD_32 R0 = SIMD_32::load_be(in + 16); SIMD_32 L1 = SIMD_32::load_be(in + 32); SIMD_32 R1 = SIMD_32::load_be(in + 48); SIMD_32::transpose(L0, R0, L1, R1); for(size_t i = 0; i != 32; i += 2) { SIMD_32 K0(EK[63 - 2*i]); SIMD_32 K1(EK[62 - 2*i]); SIMD_32 K2(EK[61 - 2*i]); SIMD_32 K3(EK[60 - 2*i]); R0 -= (((L0 << 4) ^ (L0 >> 5)) + L0) ^ K0; R1 -= (((L1 << 4) ^ (L1 >> 5)) + L1) ^ K0; L0 -= (((R0 << 4) ^ (R0 >> 5)) + R0) ^ K1; L1 -= (((R1 << 4) ^ (R1 >> 5)) + R1) ^ K1; R0 -= (((L0 << 4) ^ (L0 >> 5)) + L0) ^ K2; R1 -= (((L1 << 4) ^ (L1 >> 5)) + L1) ^ K2; L0 -= (((R0 << 4) ^ (R0 >> 5)) + R0) ^ K3; L1 -= (((R1 << 4) ^ (R1 >> 5)) + R1) ^ K3; } SIMD_32::transpose(L0, R0, L1, R1); L0.store_be(out); R0.store_be(out + 16); L1.store_be(out + 32); R1.store_be(out + 48); } } /* * XTEA Encryption */ void XTEA_SIMD::encrypt_n(const byte in[], byte out[], size_t blocks) const { const u32bit* KS = &(this->get_EK()[0]); while(blocks >= 8) { xtea_encrypt_8(in, out, KS); in += 8 * BLOCK_SIZE; out += 8 * BLOCK_SIZE; blocks -= 8; } if(blocks) XTEA::encrypt_n(in, out, blocks); } /* * XTEA Decryption */ void XTEA_SIMD::decrypt_n(const byte in[], byte out[], size_t blocks) const { const u32bit* KS = &(this->get_EK()[0]); while(blocks >= 8) { xtea_decrypt_8(in, out, KS); in += 8 * BLOCK_SIZE; out += 8 * BLOCK_SIZE; blocks -= 8; } if(blocks) XTEA::decrypt_n(in, out, blocks); } } Botan-1.10.12/src/block/xtea_simd/xtea_simd.h0000664000175000017500000000107212654331322020550 0ustar jackjack00000000000000/* * XTEA in SIMD * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_XTEA_SIMD_H__ #define BOTAN_XTEA_SIMD_H__ #include namespace Botan { /** * XTEA implemented using SIMD operations */ class BOTAN_DLL XTEA_SIMD : public XTEA { public: size_t parallelism() const { return 8; } void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; BlockCipher* clone() const { return new XTEA_SIMD; } }; } #endif Botan-1.10.12/src/build-data/arch/alpha.txt0000664000175000017500000000061512654331322020126 0ustar jackjack00000000000000endian little axp alphaaxp alpha-ev4 alpha-ev5 alpha-ev56 alpha-pca56 alpha-ev6 alpha-ev67 alpha-ev68 alpha-ev7 alphaev4 -> alpha-ev4 alphaev5 -> alpha-ev5 alphaev56 -> alpha-ev56 alphapca56 -> alpha-pca56 alphaev6 -> alpha-ev6 alphaev67 -> alpha-ev67 alphaev68 -> alpha-ev68 alphaev7 -> alpha-ev7 Botan-1.10.12/src/build-data/arch/arm.txt0000664000175000017500000000064112654331322017617 0ustar jackjack00000000000000 endian little family arm armel # For Debian armhf # For Debian armv2 armv2a armv3 armv3m armv4 armv5 armv5e armv5te armv6 armv6j armv6t2 armv6z armv6zk armv6-m armv7 armv7-a armv7-r armv7-m iwmmxt iwmmxt2 ep9312 strongarm -> armv4 xscale -> armv5te cortex-a8 -> armv7-a cortex-a9 -> armv7-a neon:armv7-a Botan-1.10.12/src/build-data/arch/hppa.txt0000664000175000017500000000016112654331322017765 0ustar jackjack00000000000000 hp-pa parisc pa-risc hp-parisc hp-pa-risc hppa1.0 hppa1.1 hppa2.0 Botan-1.10.12/src/build-data/arch/ia64.txt0000664000175000017500000000022412654331322017600 0ustar jackjack00000000000000 itanium itanic merced mckinley montvale itanium2 -> mckinley Botan-1.10.12/src/build-data/arch/m68k.txt0000664000175000017500000000020212654331322017616 0ustar jackjack00000000000000endian big # Except for Coldfire #unaligned ok 680x0 68k 68020 68030 68040 68060 Botan-1.10.12/src/build-data/arch/mips32.txt0000664000175000017500000000031312654331322020151 0ustar jackjack00000000000000 mips mipsel # For Debian r3000 r6000 r3k -> r3000 r6k -> r6000 # These are for RPM mipsbe -> r3000 mipsle -> r3000 Botan-1.10.12/src/build-data/arch/mips64.txt0000664000175000017500000000031512654331322020160 0ustar jackjack00000000000000 mips64el r4000 r4100 r4300 r4400 r4600 r4560 r5000 r8000 r10000 r4k -> r4000 r5k -> r5000 r8k -> r8000 r10k -> r10000 Botan-1.10.12/src/build-data/arch/ppc32.txt0000664000175000017500000000045712654331322017774 0ustar jackjack00000000000000endian big unaligned ok family ppc powerpc ppc ppc601 ppc603 ppc604 ppc740 ppc750 ppc7400 ppc7450 e500v2 g3 -> ppc740 g4 -> ppc7450 powerpcspe -> e500v2 # for Debian altivec:ppc7400,ppc7450 Botan-1.10.12/src/build-data/arch/ppc64.txt0000664000175000017500000000047412654331322020000 0ustar jackjack00000000000000endian big family ppc powerpc64 g5 -> ppc970 ppc970 power3 power4 power5 power6 power7 cellppu cellbroadbandengine -> cellppu altivec:cellppu,ppc970,power6,power7 Botan-1.10.12/src/build-data/arch/s390.txt0000664000175000017500000000006712654331322017540 0ustar jackjack00000000000000endian big unaligned ok s390 Botan-1.10.12/src/build-data/arch/s390x.txt0000664000175000017500000000007012654331322017722 0ustar jackjack00000000000000endian big unaligned ok s390x Botan-1.10.12/src/build-data/arch/sparc32.txt0000664000175000017500000000066312654331322020321 0ustar jackjack00000000000000endian big family sparc sparc sparc32-v7 sparc32-v8 sparc32-v9 cypress -> sparc32-v7 supersparc -> sparc32-v8 hypersparc -> sparc32-v8 microsparc -> sparc32-v8 sparclite -> sparc32-v8 sparcv7 -> sparc32-v7 sparcv8 -> sparc32-v8 sparcv9 -> sparc32-v9 sparc-v7 -> sparc32-v7 sparc-v8 -> sparc32-v8 sparc-v9 -> sparc32-v9 sun4u -> sparc32-v9 Botan-1.10.12/src/build-data/arch/sparc64.txt0000664000175000017500000000030212654331322020314 0ustar jackjack00000000000000 family sparc ultrasparc ultrasparc3 niagra niagra2 # Functionally the same for optimization purposes ultrasparc2 -> ultrasparc Botan-1.10.12/src/build-data/arch/superh.txt0000664000175000017500000000004512654331322020344 0ustar jackjack00000000000000 sh2 sh3 sh4 Botan-1.10.12/src/build-data/arch/x86_32.txt0000664000175000017500000000155512654331322017776 0ustar jackjack00000000000000endian little unaligned ok family x86 ia32 x86 ix86 80x86 i86pc # for Solaris x86pc # for QNX bepc # for Haiku i386 i486 i586 i686 pentium2 pentium3 pentium4 pentium-m prescott k6 athlon atom32 pentium -> i586 pentiumpro -> i686 pentium_pro -> i686 pentium2 -> pentium2 pentiumii -> pentium2 pentium3 -> pentium3 pentiumiii -> pentium3 x86family5 -> i586 x86family6 -> i686 pentiumm -> pentium-m intelpentiumm -> pentium-m intelpentium4 -> pentium4 duron -> athlon athlon-xp -> athlon k7 -> athlon p2 -> i686 p3 -> i686 p4 -> pentium4 intelcput2250 -> prescott intelcput2300 -> prescott intelcput2400 -> prescott intelcput2500 -> prescott intelcput2600 -> prescott intelcput2700 -> prescott sse2:pentium4,prescott,pentium-m,atom32 ssse3:atom32 movbe:atom32 Botan-1.10.12/src/build-data/arch/x86_64.txt0000664000175000017500000000077212654331322020003 0ustar jackjack00000000000000endian little unaligned ok family x86 amd64 x86-64 em64t x64 k8 k10 atom nocona core2 nehalem westmere sandybridge core2duo -> core2 intelcore2 -> core2 intelcore2duo -> core2 sledgehammer -> k8 opteron -> k8 amdopteron -> k8 athlon64 -> k8 barcelona -> k10 corei5cpum520 -> westmere corei7cpu860 -> nehalem sse2:all ssse3:core2,nehalem,westmere,atom,sandybridge aes-ni:westmere,sandybridge Botan-1.10.12/src/build-data/botan-config.in0000664000175000017500000000162312654331322020261 0ustar jackjack00000000000000#!/bin/sh includedir=%{includedir}/botan-%{version_major}.%{version_minor} libdir=%{libdir} prefix=%{prefix} usage() { echo "$0 [--prefix[=DIR]] [--version] [--libs] [--cflags]" exit 1 } if test $# -eq 0; then usage fi while test $# -gt 0; do case "$1" in -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac case "$1" in --prefix=*) prefix=$optarg ;; --prefix) echo $prefix ;; --version) echo %{version} exit 0 ;; --cflags) echo -I$prefix/$includedir ;; --libs) if [ $prefix != "/usr" ] then echo -L$prefix/$libdir -lbotan-%{version_major}.%{version_minor} %{link_to} else echo -lbotan-%{version_major}.%{version_minor} %{link_to} fi ;; *) usage ;; esac shift done exit 0 Botan-1.10.12/src/build-data/botan.doxy.in0000664000175000017500000001415512654331322020004 0ustar jackjack00000000000000# Doxyfile 1.5.4 PROJECT_NAME = Botan PROJECT_NUMBER = %{version} OUTPUT_DIRECTORY = %{doc_output_dir}/doxygen DOXYFILE_ENCODING = UTF-8 CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = YES FULL_PATH_NAMES = YES STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = NO EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = YES SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = YES WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = src INPUT_ENCODING = UTF-8 FILE_PATTERNS = RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = */wrap/* EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = YES STRIP_CODE_COMMENTS = NO REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = . HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO HTML_DYNAMIC_SECTIONS = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = YES DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO Botan-1.10.12/src/build-data/botan.pc.in0000664000175000017500000000050512654331322017415 0ustar jackjack00000000000000prefix=%{prefix} exec_prefix=${prefix} libdir=${prefix}/%{libdir} includedir=${prefix}/include/botan-%{version_major}.%{version_minor} Name: Botan Description: Multi-platform C++ crypto library Version: %{version} Libs: -L${libdir} -lbotan-%{version_major}.%{version_minor} Libs.private: %{link_to} Cflags: -I${includedir} Botan-1.10.12/src/build-data/buildh.in0000664000175000017500000000554112654331322017165 0ustar jackjack00000000000000 #ifndef BOTAN_BUILD_CONFIG_H__ #define BOTAN_BUILD_CONFIG_H__ /* * This file was automatically generated %{timestamp} UTC by * %{user}@%{hostname} running '%{command_line}' * * Target * - Compiler: %{cc} %{lib_opt} %{mach_opt} * - Arch: %{submodel}/%{arch} * - OS: %{os} */ #define BOTAN_VERSION_MAJOR %{version_major} #define BOTAN_VERSION_MINOR %{version_minor} #define BOTAN_VERSION_PATCH %{version_patch} #define BOTAN_VERSION_DATESTAMP %{version_datestamp} #define BOTAN_VERSION_VC_REVISION "%{version_vc_rev}" #define BOTAN_DISTRIBUTION_INFO "%{distribution_info}" #ifndef BOTAN_DLL #define BOTAN_DLL %{visibility_attribute} #endif /* Chunk sizes */ #define BOTAN_DEFAULT_BUFFER_SIZE 4096 #define BOTAN_MEM_POOL_CHUNK_SIZE 64*1024 #define BOTAN_BLOCK_CIPHER_PAR_MULT 4 /* BigInt toggles */ #define BOTAN_MP_WORD_BITS %{mp_bits} #define BOTAN_KARAT_MUL_THRESHOLD 32 #define BOTAN_KARAT_SQR_THRESHOLD 32 /* PK key consistency checking toggles */ #define BOTAN_PUBLIC_KEY_STRONG_CHECKS_ON_LOAD 1 #define BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_LOAD 0 #define BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_GENERATE 1 /* * RNGs will automatically poll the system for additional * seed material after producing this many bytes of output. */ #define BOTAN_RNG_MAX_OUTPUT_BEFORE_RESEED 512 #define BOTAN_RNG_RESEED_POLL_BITS 128 /* Should we use GCC-style inline assembler? */ #if !defined(BOTAN_USE_GCC_INLINE_ASM) && defined(__GNUG__) #define BOTAN_USE_GCC_INLINE_ASM 1 #endif #if !defined(BOTAN_USE_GCC_INLINE_ASM) #define BOTAN_USE_GCC_INLINE_ASM 0 #endif #ifdef __GNUC__ #define BOTAN_GCC_VERSION \ (__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__) #else #define BOTAN_GCC_VERSION 0 #endif /* Target identification and feature test macros */ %{target_os_defines} %{target_cpu_defines} #if defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) || \ defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) #define BOTAN_TARGET_CPU_HAS_KNOWN_ENDIANNESS #endif %{target_compiler_defines} #if defined(_MSC_VER) // 4250: inherits via dominance (diamond inheritence issue) // 4251: needs DLL interface (STL DLL exports) #pragma warning(disable: 4250 4251) #endif /* * Compile-time deprecatation warnings */ #if !defined(BOTAN_NO_DEPRECATED_WARNINGS) #if defined(__clang__) #define BOTAN_DEPRECATED(msg) __attribute__ ((deprecated)) #elif defined(_MSC_VER) #define BOTAN_DEPRECATED(msg) __declspec(deprecated(msg)) #elif defined(__GNUG__) #if BOTAN_GCC_VERSION >= 450 && !defined(__INTEL_COMPILER) #define BOTAN_DEPRECATED(msg) __attribute__ ((deprecated(msg))) #else #define BOTAN_DEPRECATED(msg) __attribute__ ((deprecated)) #endif #endif #endif #if !defined(BOTAN_DEPRECATED) #define BOTAN_DEPRECATED(msg) #endif /* * Module availability definitions */ %{module_defines} /* * Local configuration options (if any) follow */ %{local_config} #endif Botan-1.10.12/src/build-data/cc/bcc.txt0000664000175000017500000000054012654331322017235 0ustar jackjack00000000000000macro_name BORLAND binary_name bcc32 compile_option "-c " output_to_option "-o" add_include_dir_option -I add_lib_dir_option -L add_lib_option "" no_debug_flags "-O2" debug_flags "" check_opt_flags "-O2" lang_flags "" warning_flags "" shared_flags "" ar_command lib makefile_style nmake all -> "-tM" Botan-1.10.12/src/build-data/cc/clang.txt0000664000175000017500000000237212654331322017577 0ustar jackjack00000000000000# Largely copied from the gcc config macro_name CLANG binary_name clang++ compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lang_flags "-D_REENTRANT -ansi -Wno-long-long" warning_flags "-W -Wall" makefile_style unix lib_opt_flags "-O2" check_opt_flags "-O2" shared_flags "-fPIC" debug_flags -g no_debug_flags "-finline-functions" visibility_build_flags "-fvisibility=hidden" visibility_attribute '__attribute__((visibility("default")))' # The default works for GNU ld and several other Unix linkers default -> "$(CXX) -shared -fPIC -Wl,-soname,$(SONAME)" darwin -> "$(CXX) -dynamiclib -fPIC -install_name $(LIBDIR)/$(SONAME)" x86_64 -> "-march=SUBMODEL" nehalem -> "-march=corei7" westmere -> "-march=corei7 -maes" x86_64 -> "-m64" mips64 -> "-mabi=64" s390 -> "-m31" s390x -> "-m64" sparc32 -> "-m32 -mno-app-regs" sparc64 -> "-m64 -mno-app-regs" ppc64 -> "-m64" # This should probably be used on most/all targets, but the docs are incomplete openbsd -> "-pthread" freebsd -> "-pthread" dragonfly -> "-pthread" netbsd -> "-pthread -D_NETBSD_SOURCE" qnx -> "-fexceptions -D_QNX_SOURCE" Botan-1.10.12/src/build-data/cc/compaq.txt0000664000175000017500000000072312654331322017771 0ustar jackjack00000000000000macro_name COMPAQ binary_name cxx compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l # -O3 and up seem to be unhappy with Botan lib_opt_flags "-O2" check_opt_flags "-O2" debug_flags -g no_debug_flags "" lang_flags "-std ansi -D__USE_STD_IOSTREAM" makefile_style unix default -> "$(CXX) -shared -soname $(SONAME)" alpha -> "-arch=SUBMODEL" alpha- Botan-1.10.12/src/build-data/cc/ekopath.txt0000664000175000017500000000122412654331322020141 0ustar jackjack00000000000000macro_name PATHSCALE binary_name pathCC compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lib_opt_flags "-O3 -OPT:Ofast:alias=disjoint" check_opt_flags "-O2" lang_flags "-D_REENTRANT -ansi -Wno-long-long" warning_flags "-W -Wall" ar_command "pathCC -ar -o" shared_flags "-fPIC" debug_flags -g makefile_style unix default -> "$(CXX) -shared -fPIC -Wl,-soname,$(SONAME)" athlon -> "-mcpu=athlon" pentium4 -> "-mcpu=pentium4" k8 -> "-mcpu=opteron" core2 -> "-mcpu=core" x86_32 -> "-mcpu=anyx86" x86_64 -> "-mcpu=athlon64" Botan-1.10.12/src/build-data/cc/gcc.txt0000664000175000017500000000642612654331322017253 0ustar jackjack00000000000000macro_name GCC binary_name g++ has_tr1 yes compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lang_flags "-D_REENTRANT -Wno-long-long" warning_flags "-W -Wall" maintainer_warning_flags "-Werror -Wall -Wextra -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual -Wold-style-cast" lib_opt_flags "-O3" check_opt_flags "-O2" shared_flags "-fPIC" debug_flags -g no_debug_flags "-finline-functions" visibility_build_flags "-fvisibility=hidden" visibility_attribute '__attribute__((visibility("default")))' makefile_style unix # The default works for GNU ld and several other Unix linkers default -> "$(CXX) -shared -fPIC -Wl,-soname,$(SONAME)" # AIX doesn't seem to have soname support (weird...) aix -> "$(CXX) -shared -fPIC" # OpenBSD doesn't use soname openbsd -> "$(CXX) -shared -fPIC" darwin -> "$(CXX) -dynamiclib -fPIC -install_name $(LIBDIR)/$(SONAME)" hpux -> "$(CXX) -shared -fPIC -Wl,+h,$(SONAME)" solaris -> "$(CXX) -shared -fPIC -Wl,-h,$(SONAME)" # Avoid using -march=i[345]86, instead tune for generic i386 -> "-mtune=generic -momit-leaf-frame-pointer" i486 -> "-mtune=generic -momit-leaf-frame-pointer" i586 -> "-mtune=generic -momit-leaf-frame-pointer" sandybridge -> "-march=corei7-avx -momit-leaf-frame-pointer" atom32 -> "-march=atom -momit-leaf-frame-pointer" # For recent GCC nehalem -> "-march=corei7 -momit-leaf-frame-pointer" westmere -> "-march=corei7 -maes -momit-leaf-frame-pointer" # For older GCC #nehalem -> "-march=core2 -msse4.1 -msse4.2 -momit-leaf-frame-pointer" #westmere -> "-march=core2 -msse4.1 -msse4.2 -maes -momit-leaf-frame-pointer" ppc601 -> "-mpowerpc -mcpu=601" cellppu -> "-mcpu=cell" e500v2 -> "-mcpu=8548" # No scheduler in GCC for anything after EV67 alpha-ev68 -> "-mcpu=ev67" alpha-ev7 -> "-mcpu=ev67" # The patch from Debian bug 594159 has this, don't know why though... sh4 -> "-m4 -mieee" # Default family options (SUBMODEL is substitued with the actual # submodel name). Anything after the quotes is what should be # *removed* from the submodel name before it's put into SUBMODEL. alpha -> "-mcpu=SUBMODEL" alpha- arm -> "-march=SUBMODEL" superh -> "-mSUBMODEL" sh hppa -> "-march=SUBMODEL" hppa ia64 -> "-mtune=SUBMODEL" m68k -> "-mSUBMODEL" mips32 -> "-mips1 -mcpu=SUBMODEL" mips32- mips64 -> "-mips3 -mcpu=SUBMODEL" mips64- ppc32 -> "-mcpu=SUBMODEL" ppc ppc64 -> "-mcpu=SUBMODEL" ppc sparc32 -> "-mcpu=SUBMODEL -Wa,-xarch=v8plus" sparc32- sparc64 -> "-mcpu=v9 -mtune=SUBMODEL" x86_32 -> "-march=SUBMODEL -momit-leaf-frame-pointer" x86_64 -> "-march=SUBMODEL -momit-leaf-frame-pointer" # The 'linking' bit means "use this for both compiling *and* linking" x86_64 -> "-m64" mips64 -> "-mabi=64" s390 -> "-m31" s390x -> "-m64" sparc32 -> "-m32 -mno-app-regs" sparc64 -> "-m64 -mno-app-regs" ppc64 -> "-m64" # This should probably be used on most/all targets, but the docs are unclear openbsd -> "-pthread" freebsd -> "-pthread" dragonfly -> "-pthread" netbsd -> "-pthread -D_NETBSD_SOURCE" qnx -> "-fexceptions -D_QNX_SOURCE" Botan-1.10.12/src/build-data/cc/hpcc.txt0000664000175000017500000000103012654331322017416 0ustar jackjack00000000000000macro_name HP_ACC binary_name aCC compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lib_opt_flags "+O2" check_opt_flags "+O2" debug_flags -g no_debug_flags "" lang_flags "-AA -ext +eh -z" warning_flags "" # +w shared_flags "+Z" makefile_style unix hppa1.0 -> "+DAportable" hppa1.1 -> "+DA1.1" hppa2.0 -> "+DA2.0W" default -> "$(CXX) +Z -b -Wl,+h,$(SONAME)" # Documented in cc(1), but not CC(1) (?) Botan-1.10.12/src/build-data/cc/icc.txt0000664000175000017500000000126612654331322017252 0ustar jackjack00000000000000macro_name INTEL binary_name icpc has_tr1 yes compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lib_opt_flags "-O2 -ip -unroll" check_opt_flags "-O2" debug_flags -g no_debug_flags "-fomit-frame-pointer" lang_flags "" warning_flags "-w1" shared_flags "-fPIC" makefile_style unix pentium3 -> "-march=pentium3" pentium4 -> "-march=pentium4" pentium-m -> "-march=pentium3" core2 -> "-march=core2" # ICC 11.1 doesn't have native Nehalem or Westmere support nehalem -> "-march=core2" westmere -> "-march=core2" default -> "$(CXX) -fPIC -shared -Wl,-soname,$(SONAME)" Botan-1.10.12/src/build-data/cc/kai.txt0000664000175000017500000000072412654331322017256 0ustar jackjack00000000000000macro_name KAI binary_name KCC compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l ar_command "KCC -o" lib_opt_flags "+K3 --inline_auto_space_time=65 --abstract_pointer" check_opt_flags "+K3" lang_flags "-D__KAI_STRICT" debug_flags -g no_debug_flags "" makefile_style unix default -> "$(CXX) --soname $(SONAME)" all -> "--one_per" Botan-1.10.12/src/build-data/cc/mipspro.txt0000664000175000017500000000142512654331322020202 0ustar jackjack00000000000000macro_name MIPSPRO binary_name CC compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lib_opt_flags "-O3 -OPT:alias=TYPED" check_opt_flags "-O3 -OPT:alias=TYPED" debug_flags "-g3" no_debug_flags "" shared_flags "-KPIC" lang_flags "-ansi -LANG:ansi-for-init-scope=ON" # Disabled, because, while my code is fine, it warns about a lot of it's own # headers #warning_flags "-fullwarn" makefile_style unix default -> "$(CXX) -shared -Wl,-soname,$(SONAME)" mips32 -> "-mips1" mips64 -> "-mips3" mips64-r5000 -> "-mips4 -r5000" mips64-r8000 -> "-mips4 -r8000" mips64-r10000 -> "-mips4 -r10000" mips32 -> "-n32" mips64 -> "-64" Botan-1.10.12/src/build-data/cc/msvc.txt0000664000175000017500000000110012654331322017447 0ustar jackjack00000000000000macro_name MSVC binary_name cl compile_option "/nologo /c " output_to_option "/Fo" add_include_dir_option "/I" add_lib_dir_option -L add_lib_option "" no_debug_flags "/O2" debug_flags "/Od /Zi /DDEBUG" check_opt_flags "/O2 /D_CONSOLE" lang_flags "/EHs /GR" warning_flags "/W3 /wd4275 /wd4267" visibility_build_flags "/DBOTAN_DLL=__declspec(dllexport)" visibility_attribute "__declspec(dllimport)" ar_command lib makefile_style nmake default -> "$(CXX) /LD" all -> "/MD" all-debug -> "/MDd" Botan-1.10.12/src/build-data/cc/open64.txt0000664000175000017500000000103312654331322017617 0ustar jackjack00000000000000macro_name OPEN64 binary_name openCC compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lib_opt_flags "-O3 -OPT:alias=TYPED" check_opt_flags "-O3 -OPT:alias=TYPED" debug_flags "-g3" no_debug_flags "-fomit-frame-pointer" shared_flags "-fPIC" lang_flags "-ansi -LANG:ansi-for-init-scope=ON" warning_flags "-Wall -W" makefile_style unix default -> "$(CXX) -shared -Wl,-soname,$(SONAME)" x86_64 -> "-m64" Botan-1.10.12/src/build-data/cc/pgi.txt0000664000175000017500000000100612654331322017263 0ustar jackjack00000000000000macro_name PORTLAND_GROUP binary_name pgCC compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lib_opt_flags "-fast -Minline" check_opt_flags "-fast" shared_flags "-fPIC" makefile_style unix linux -> "$(CXX) -shared -fPIC -Wl,-soname,$(SONAME)" solaris -> "$(CXX) -G -fPIC -Wl,-h,$(SONAME)" i586 -> "-tp p5" i686 -> "-tp p6" athlon -> "-tp k7" pentium4 -> "-tp p6" x86_32 -> "-tp px" Botan-1.10.12/src/build-data/cc/sgipro64.txt0000664000175000017500000000075012654331322020166 0ustar jackjack00000000000000macro_name SGI_PRO64 binary_name sgiCC compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lib_opt_flags "-O3 -OPT:alias=TYPED" check_opt_flags "-O3 -OPT:alias=TYPED" debug_flags "-g3" no_debug_flags "" shared_flags "-KPIC" lang_flags "-ansi -LANG:ansi-for-init-scope=ON" warning_flags "-Wall -W" makefile_style unix default -> "$(CXX) -shared -Wl,-soname,$(SONAME)" Botan-1.10.12/src/build-data/cc/sunstudio.txt0000664000175000017500000000225612654331322020551 0ustar jackjack00000000000000macro_name SUN_STUDIO binary_name CC compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lib_opt_flags "-xO5" check_opt_flags "-xO2" debug_flags -g no_debug_flags "" shared_flags "-KPIC" warning_flags "+w -erroff=truncwarn,wnoretvalue" lang_flags "+p -features=extensions -D__FUNCTION__=__func__" ar_command "CC -xar -o" makefile_style unix default -> "$(CXX) -G -h$(SONAME)" i386 -> "-xtarget=486" i486 -> "-xtarget=486" i586 -> "-xtarget=pentium" k6 -> "-xtarget=pentium" i686 -> "-xtarget=pentium_pro" pentium3 -> "-xtarget=pentium3" pentium4 -> "-xtarget=pentium4" core2 -> "-xtarget=core2" opteron -> "-xtarget=opteron" nehalem -> "-xtarget=nehalem" sparc32-v9 -> "-xchip=ultra -xarch=v8" ultrasparc3 -> "-xchip=ultra3" niagra1 -> "-xchip=ultraT1" niagra2 -> "-xchip=ultraT2" sparc32 -> "-xchip=ultra -xarch=SUBMODEL" sparc32- sparc64 -> "-xchip=generic" # Needed on some Linux distros linux -> "-library=stlport4" sparc64 -> "-xarch=v9" x86_64 -> "-m64" Botan-1.10.12/src/build-data/cc/xlc.txt0000664000175000017500000000074212654331322017300 0ustar jackjack00000000000000macro_name IBM_XLC binary_name xlC compile_option "-c " output_to_option "-o " add_include_dir_option -I add_lib_dir_option -L add_lib_option -l lib_opt_flags "-O2" check_opt_flags "-O2" lang_flags "" debug_flags -g no_debug_flags "" makefile_style unix cellppu -> "-qarch=cell" ppc970 -> "-qarch=ppc970" power4 -> "-qarch=pwr4" power5 -> "-qarch=pwr5" cellppu -> "-qarch=cell" default -> "$(CXX) -qmkshrobj" Botan-1.10.12/src/build-data/innosetup.in0000664000175000017500000000476712654331322017753 0ustar jackjack00000000000000; A script for packaging botan with InnoSetup [Setup] AppName=Botan AppVerName=Botan %{version} AppPublisher=Jack Lloyd AppPublisherURL=http://botan.randombit.net/ AppVersion=%{version} VersionInfoCopyright=Copyright (C) 1999-2010 Jack Lloyd and others VersionInfoVersion=%{version_major}.%{version_minor}.%{version_patch}.0 ; Require at least Windows 98 or 2000 MinVersion=4.1,5.0 ; Uncomment for 64 bit builds ;ArchitecturesAllowed = x64 ;ArchitecturesInstallIn64BitMode = x64 DefaultDirName={pf}\botan DefaultGroupName=botan SolidCompression=yes OutputDir=. OutputBaseFilename=botan-%{version} [Types] Name: "user"; Description: "User" Name: "devel"; Description: "Developer" Name: "custom"; Description: "Custom"; Flags: iscustom [Components] name: "dll"; Description: "Runtime DLLs"; Types: user devel custom; Flags: fixed name: "implib"; Description: "Import Library"; Types: devel name: "includes"; Description: "Include Files"; Types: devel name: "docs"; Description: "Developer Documentation"; Types: devel [Files] ; DLL and license file is always included Source: "..\doc\license.txt"; DestDir: "{app}"; Components: dll; AfterInstall: ConvertLineEndings Source: "..\botan.dll"; DestDir: "{app}"; Components: dll Source: "..\botan.dll.manifest"; DestDir: "{app}"; Components: dll; Flags: skipifsourcedoesntexist Source: "include\botan\*"; DestDir: "{app}\include\botan"; Components: includes; AfterInstall: ConvertLineEndings Source: "..\readme.txt"; DestDir: "{app}\doc"; Components: docs; AfterInstall: ConvertLineEndings Source: "..\doc\*.txt"; DestDir: "{app}\doc"; Excludes: "license.txt"; Components: docs; AfterInstall: ConvertLineEndings Source: "..\doc\examples\*.cpp"; DestDir: "{app}\doc\examples"; Components: docs; AfterInstall: ConvertLineEndings Source: "..\botan.exp"; DestDir: "{app}"; Components: implib Source: "..\botan.lib"; DestDir: "{app}"; Components: implib Source: "..\doc\manual.pdf"; DestDir: "{app}\doc"; Components: docs; Flags: skipifsourcedoesntexist Source: "..\doc\tutorial.pdf"; DestDir: "{app}\doc"; Components: docs; Flags: skipifsourcedoesntexist [Code] const LF = #10; CR = #13; CRLF = CR + LF; procedure ConvertLineEndings(); var FilePath : String; FileContents : String; begin FilePath := ExpandConstant(CurrentFileName) if ExtractFileName(CurrentFileName) <> 'build.h' then begin LoadStringFromFile(FilePath, FileContents); StringChangeEx(FileContents, LF, CRLF, False); SaveStringToFile(FilePath, FileContents, False); end; end; Botan-1.10.12/src/build-data/makefile/nmake.in0000664000175000017500000000401112654331322020555 0ustar jackjack00000000000000### Compiler Options CXX = %{cc} LIB_OPT = %{lib_opt} CHECK_OPT = %{check_opt} MACH_OPT = %{mach_opt} LANG_FLAGS = %{lang_flags} WARN_FLAGS = %{warn_flags} SO_OBJ_FLAGS = %{shared_flags} LIB_LINK_CMD = %{so_link} LINK_TO = %{link_to} ### Version Numbers VERSION = %{version} ### Installation Settings DESTDIR = %{prefix} ### Aliases for Common Programs AR = %{ar_command} COPY = copy CD = @cd ECHO = @echo INSTALL = %{install_cmd_exec} INSTALL_CMD = %{install_cmd_exec} MKDIR = @md MKDIR_INSTALL = @md RM = @del /Q RM_R = $(RM) /S RMDIR = @rmdir ### File Lists CHECK = check HEADERS = %{include_files} LIBOBJS = %{lib_objs} CHECKOBJS = %{check_objs} LIB_FLAGS = $(LIB_OPT) $(MACH_OPT) $(LANG_FLAGS) $(WARN_FLAGS) $(SO_OBJ_FLAGS) CHECK_FLAGS = $(CHECK_OPT) $(LANG_FLAGS) $(WARN_FLAGS) LIBNAME = botan LIBRARIES = $(BOTAN_LIB) # This will be either a static lib or the DLL import lib BOTAN_LIB = $(LIBNAME).%{static_suffix} all: $(LIBRARIES) ### Build Commands %{lib_build_cmds} %{check_build_cmds} ### Link Commands $(CHECK): $(LIBRARIES) $(CHECKOBJS) $(CXX) /Fe$@ $(CHECKOBJS) $(BOTAN_LIB) $(LINK_TO) $(BOTAN_LIB): $(LIBOBJS) !If "$(SO_OBJ_FLAGS)" == "" $(AR) /OUT:$(BOTAN_LIB) $(LIBOBJS) !Else $(LIB_LINK_CMD) /Fe$(LIBNAME) $(LIBOBJS) $(LINK_TO) !Endif ### Fake Targets docs: %{build_doc_commands} clean: $(RM) %{build_dir}\lib\* %{build_dir}\checks\* $(RM) *.manifest *.exp *.dll $(RM) $(LIBRARIES) $(CHECK) distclean: clean $(RM_R) %{build_dir} $(RMDIR) %{build_dir}\include\botan\internal $(RMDIR) %{build_dir}\include\botan $(RMDIR) %{build_dir}\include $(RMDIR) %{build_dir}\lib %{build_dir}\checks $(RMDIR) %{build_dir} $(RM) Makefile $(LIBNAME).* $(CHECK).* ### Install Commands install: $(LIBRARIES) -$(MKDIR) $(DESTDIR)\include\botan $(INSTALL_CMD) botan.* $(DESTDIR) $(INSTALL_CMD) build\include\botan\*.h $(DESTDIR)\include\botan Botan-1.10.12/src/build-data/makefile/python.in0000664000175000017500000000201112654331322021001 0ustar jackjack00000000000000CXX = %{cc} CFLAGS = -Os LDFLAGS = WARN_FLAGS = %{warn_flags} SERIES = %{version_major}.%{version_minor} PYTHON_ROOT = /usr/lib/python%{python_version}/config PYTHON_INC = -I/usr/include/python%{python_version} PYTHON_SITE_PACKAGE_DIR = /usr/lib/python%{python_version}/site-packages/ PYTHON_FLAGS = -I%{python_dir} -fPIC -ftemplate-depth-255 $(WARN_FLAGS) $(PYTHON_INC) $(CFLAGS) BOTAN_PYTHON_MODDIR = %{python_obj_dir} PYTHON_OBJS = %{python_objs} all: $(BOTAN_PYTHON_MODDIR)/_botan.so %{python_build_cmds} $(BOTAN_PYTHON_MODDIR)/_botan.so: $(PYTHON_OBJS) cp %{python_dir}/*.py $(BOTAN_PYTHON_MODDIR) $(CXX) -shared -Wl,-soname,$@ $(PYTHON_OBJS) -L. -L$(PYTHON_ROOT) $(LDFLAGS) -lbotan-$(SERIES) -lboost_python -o $@ clean: rm -rf $(BOTAN_PYTHON_MODDIR)/* rm -f $(PYTHON_OBJS) install: mkdir -p $(PYTHON_SITE_PACKAGE_DIR)/botan cp $(BOTAN_PYTHON_MODDIR)/_botan.so $(BOTAN_PYTHON_MODDIR)/*.py $(PYTHON_SITE_PACKAGE_DIR)/botan chmod -R u=rwX,go=rX $(PYTHON_SITE_PACKAGE_DIR)/botan Botan-1.10.12/src/build-data/makefile/unix.in0000664000175000017500000000500612654331322020452 0ustar jackjack00000000000000# Compiler Options CXX = %{cc} LIB_OPT = %{lib_opt} CHECK_OPT = %{check_opt} MACH_OPT = %{mach_opt} LANG_FLAGS = %{lang_flags} WARN_FLAGS = %{warn_flags} LINK_TO = %{link_to} # Version Numbers VERSION = %{version} SERIES = %{version_major}.%{version_minor} # Installation Settings DESTDIR = %{prefix} BINDIR = $(DESTDIR)/bin LIBDIR = $(DESTDIR)/%{libdir} HEADERDIR = $(DESTDIR)/%{includedir}/botan-$(SERIES)/botan DOCDIR = $(DESTDIR)/%{docdir}/botan-$(VERSION) PKGCONF_DIR = $(LIBDIR)/pkgconfig CONFIG_SCRIPT = %{botan_config} PKGCONFIG = %{botan_pkgconfig} # Aliases for Common Programs AR = %{ar_command} COPY = cp COPY_R = cp -r CD = @cd ECHO = @echo INSTALL_CMD_EXEC = %{install_cmd_exec} INSTALL_CMD_DATA = %{install_cmd_data} LN = ln -fs MKDIR = @mkdir MKDIR_INSTALL = @umask 022; mkdir -p -m 755 RANLIB = %{ranlib_command} RM = @rm -f RM_R = @rm -rf # File Lists CHECK = %{check_prefix}check HEADERS = %{include_files} LIBOBJS = %{lib_objs} CHECKOBJS = %{check_objs} LIB_FLAGS = $(LIB_OPT) $(MACH_OPT) $(LANG_FLAGS) $(WARN_FLAGS) CHECK_FLAGS = $(CHECK_OPT) $(LANG_FLAGS) $(WARN_FLAGS) LIBRARIES = $(STATIC_LIB) LIBNAME = %{lib_prefix}libbotan STATIC_LIB = $(LIBNAME)-$(SERIES).a all: $(LIBRARIES) # Build Commands %{lib_build_cmds} %{check_build_cmds} # Link Commands $(CHECK): $(LIBRARIES) $(CHECKOBJS) $(CXX) $(CHECKOBJS) $(STATIC_LIB) $(LINK_TO) -o $(CHECK) $(STATIC_LIB): $(LIBOBJS) $(RM) $(STATIC_LIB) $(AR) $(STATIC_LIB) $(LIBOBJS) $(RANLIB) $(STATIC_LIB) # Fake Targets .PHONY = docs clean distclean install static static: $(STATIC_LIB) docs: %{build_doc_commands} clean: $(RM_R) %{build_dir}/lib/* %{build_dir}/checks/* $(RM) $(LIBRARIES) $(SYMLINK) $(CHECK) distclean: clean $(RM_R) %{build_dir} $(RM) Makefile* $(CONFIG_SCRIPT) $(PKGCONFIG) $(RM) botan_all.cpp botan_all.h install: $(LIBRARIES) docs $(ECHO) "Installing Botan into $(DESTDIR)... " $(MKDIR_INSTALL) $(DOCDIR) $(COPY_R) %{doc_output_dir}/* $(DOCDIR) $(MKDIR_INSTALL) $(HEADERDIR) for i in $(HEADERS); do \ $(INSTALL_CMD_DATA) $$i $(HEADERDIR); \ done $(MKDIR_INSTALL) $(LIBDIR) $(INSTALL_CMD_DATA) $(STATIC_LIB) $(LIBDIR) $(MKDIR_INSTALL) $(BINDIR) $(INSTALL_CMD_EXEC) $(CONFIG_SCRIPT) $(BINDIR) $(MKDIR_INSTALL) $(PKGCONF_DIR) $(INSTALL_CMD_DATA) $(PKGCONFIG) $(PKGCONF_DIR) Botan-1.10.12/src/build-data/makefile/unix_shr.in0000664000175000017500000000613312654331322021330 0ustar jackjack00000000000000# Compiler Options CXX = %{cc} LIB_OPT = %{lib_opt} CHECK_OPT = %{check_opt} MACH_OPT = %{mach_opt} LANG_FLAGS = %{lang_flags} WARN_FLAGS = %{warn_flags} SO_OBJ_FLAGS = %{shared_flags} SO_LINK_CMD = %{so_link} LINK_TO = %{link_to} # Version Numbers VERSION = %{version} SERIES = %{version_major}.%{version_minor} # Installation Settings DESTDIR = %{prefix} BINDIR = $(DESTDIR)/bin LIBDIR = $(DESTDIR)/%{libdir} HEADERDIR = $(DESTDIR)/%{includedir}/botan-$(SERIES)/botan DOCDIR = $(DESTDIR)/%{docdir}/botan-$(VERSION) PKGCONF_DIR = $(LIBDIR)/pkgconfig CONFIG_SCRIPT = %{botan_config} PKGCONFIG = %{botan_pkgconfig} # Aliases for Common Programs AR = %{ar_command} COPY = cp COPY_R = cp -r CD = @cd ECHO = @echo INSTALL_CMD_EXEC = %{install_cmd_exec} INSTALL_CMD_DATA = %{install_cmd_data} LN = ln -fs MKDIR = @mkdir MKDIR_INSTALL = @umask 022; mkdir -p -m 755 RANLIB = %{ranlib_command} RM = @rm -f RM_R = @rm -rf # File Lists CHECK = %{check_prefix}check HEADERS = %{include_files} LIBOBJS = %{lib_objs} CHECKOBJS = %{check_objs} LIB_FLAGS = $(LIB_OPT) $(MACH_OPT) $(LANG_FLAGS) $(WARN_FLAGS) $(SO_OBJ_FLAGS) CHECK_FLAGS = $(CHECK_OPT) $(LANG_FLAGS) $(WARN_FLAGS) LIBRARIES = $(STATIC_LIB) $(SHARED_LIB) LIBNAME = %{lib_prefix}libbotan STATIC_LIB = $(LIBNAME)-$(SERIES).a SONAME = $(LIBNAME)-$(SERIES).%{so_suffix}.%{so_abi_rev} SHARED_LIB = $(SONAME).%{version_patch} SYMLINK = $(LIBNAME)-$(SERIES).%{so_suffix} all: $(LIBRARIES) # Build Commands %{lib_build_cmds} %{check_build_cmds} # Link Commands $(CHECK): $(LIBRARIES) $(CHECKOBJS) $(CXX) $(LDFLAGS) $(CHECKOBJS) $(SHARED_LIB) $(LINK_TO) -o $(CHECK) $(STATIC_LIB): $(LIBOBJS) $(RM) $(STATIC_LIB) $(AR) $(STATIC_LIB) $(LIBOBJS) $(RANLIB) $(STATIC_LIB) $(SHARED_LIB): $(LIBOBJS) $(SO_LINK_CMD) $(LDFLAGS) $(LIBOBJS) -o $(SHARED_LIB) $(LINK_TO) $(LN) $(SHARED_LIB) $(SONAME) $(LN) $(SHARED_LIB) $(SYMLINK) # Fake Targets .PHONY = docs clean distclean install static shared static: $(STATIC_LIB) shared: $(SHARED_LIB) docs: %{build_doc_commands} clean: $(RM_R) %{build_dir}/lib/* %{build_dir}/checks/* $(RM) $(LIBRARIES) $(SYMLINK) $(SONAME) $(CHECK) distclean: clean $(RM_R) %{build_dir} $(RM) Makefile* $(CONFIG_SCRIPT) $(PKGCONFIG) $(RM) botan_all.cpp botan_all.h install: $(LIBRARIES) docs $(ECHO) "Installing Botan into $(DESTDIR)... " $(MKDIR_INSTALL) $(DOCDIR) $(COPY_R) %{doc_output_dir}/* $(DOCDIR) $(MKDIR_INSTALL) $(HEADERDIR) for i in $(HEADERS); do \ $(INSTALL_CMD_DATA) $$i $(HEADERDIR); \ done $(MKDIR_INSTALL) $(LIBDIR) $(INSTALL_CMD_DATA) $(STATIC_LIB) $(LIBDIR) $(INSTALL_CMD_EXEC) $(SHARED_LIB) $(LIBDIR) $(CD) $(LIBDIR); $(LN) $(SHARED_LIB) $(SYMLINK) $(CD) $(LIBDIR); $(LN) $(SHARED_LIB) $(SONAME) $(MKDIR_INSTALL) $(BINDIR) $(INSTALL_CMD_EXEC) $(CONFIG_SCRIPT) $(BINDIR) $(MKDIR_INSTALL) $(PKGCONF_DIR) $(INSTALL_CMD_DATA) $(PKGCONFIG) $(PKGCONF_DIR) Botan-1.10.12/src/build-data/os/aix.txt0000664000175000017500000000010012654331322017313 0ustar jackjack00000000000000os_type unix gettimeofday Botan-1.10.12/src/build-data/os/cygwin.txt0000664000175000017500000000051412654331322020043 0ustar jackjack00000000000000os_type unix # Cygwin supports shared libs fine, but there are problems with making a Botan # shared library when libraries it depends on are static-only (such as libz). # So until I can figure out a work-around, it's disabled. build_shared no install_root c:\Botan doc_dir docs gettimeofday Botan-1.10.12/src/build-data/os/darwin.txt0000664000175000017500000000034212654331322020026 0ustar jackjack00000000000000os_type unix so_suffix dylib # It doesn't have the 's' option; you need to use needs ranlib ar_command "ar cr" ar_needs_ranlib yes doc_dir doc gettimeofday macosx Botan-1.10.12/src/build-data/os/dragonfly.txt0000664000175000017500000000013212654331322020524 0ustar jackjack00000000000000os_type unix clock_gettime gettimeofday posix_mlock Botan-1.10.12/src/build-data/os/freebsd.txt0000664000175000017500000000011412654331322020151 0ustar jackjack00000000000000os_type unix posix_mlock gettimeofday Botan-1.10.12/src/build-data/os/haiku.txt0000664000175000017500000000030312654331322017640 0ustar jackjack00000000000000os_type unix install_root /boot header_dir develop/headers lib_dir system/lib doc_dir system/documentation gettimeofday gmtime_r beos Botan-1.10.12/src/build-data/os/hpux.txt0000664000175000017500000000015212654331322017525 0ustar jackjack00000000000000os_type unix so_suffix sl gettimeofday hp-ux Botan-1.10.12/src/build-data/os/hurd.txt0000664000175000017500000000013112654331322017500 0ustar jackjack00000000000000os_type unix posix_mlock gnu Botan-1.10.12/src/build-data/os/irix.txt0000664000175000017500000000010012654331322017505 0ustar jackjack00000000000000os_type unix gettimeofday Botan-1.10.12/src/build-data/os/linux.txt0000664000175000017500000000015212654331322017700 0ustar jackjack00000000000000os_type unix clock_gettime gettimeofday posix_mlock gmtime_r dlopen Botan-1.10.12/src/build-data/os/mingw.txt0000664000175000017500000000047112654331322017666 0ustar jackjack00000000000000os_type windows obj_suffix o so_suffix dll static_suffix a build_shared no ar_command "ar crs" ar_needs_ranlib yes install_root /mingw header_dir include lib_dir lib doc_dir share/doc msys mingw32 loadlibrary win32_virtual_lock win32_get_systemtime Botan-1.10.12/src/build-data/os/nacl.txt0000664000175000017500000000006312654331322017457 0ustar jackjack00000000000000 gettimeofday Botan-1.10.12/src/build-data/os/netbsd.txt0000664000175000017500000000010012654331322020011 0ustar jackjack00000000000000os_type unix gettimeofday Botan-1.10.12/src/build-data/os/openbsd.txt0000664000175000017500000000010012654331322020164 0ustar jackjack00000000000000os_type unix gettimeofday Botan-1.10.12/src/build-data/os/qnx.txt0000664000175000017500000000015212654331322017347 0ustar jackjack00000000000000os_type unix clock_gettime gettimeofday posix_mlock gmtime_r dlopen Botan-1.10.12/src/build-data/os/solaris.txt0000664000175000017500000000027712654331322020225 0ustar jackjack00000000000000os_type unix install_cmd_data '/usr/ucb/install -m 644' install_cmd_exec '/usr/ucb/install -m 755' posix_mlock gettimeofday sunos Botan-1.10.12/src/build-data/os/tru64.txt0000664000175000017500000000013312654331322017524 0ustar jackjack00000000000000os_type unix gettimeofday osf1 Botan-1.10.12/src/build-data/os/windows.txt0000664000175000017500000000043512654331322020237 0ustar jackjack00000000000000os_type windows obj_suffix obj so_suffix dll static_suffix lib install_root c:\\Botan doc_dir docs install_cmd_data "copy" install_cmd_exec "copy" win32_virtual_lock win32_get_systemtime gmtime_s loadlibrary win32 MSWin32 Botan-1.10.12/src/build-data/scripts/dist.py0000775000175000017500000001473412654331322020401 0ustar jackjack00000000000000#!/usr/bin/python """ Release script for botan (http://botan.randombit.net/) (C) 2011, 2012 Jack Lloyd Distributed under the terms of the Botan license """ import errno import logging import optparse import os import shlex import StringIO import shutil import subprocess import sys import tarfile def check_subprocess_results(subproc, name): (stdout, stderr) = subproc.communicate() stdout = stdout.strip() stderr = stderr.strip() if subproc.returncode != 0: if stdout != '': logging.error(stdout) if stderr != '': logging.error(stderr) raise Exception('Running %s failed' % (name)) else: if stderr != '': logging.debug(stderr) return stdout def run_monotone(db, args): mtn = subprocess.Popen(['mtn', '--db', db] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) return check_subprocess_results(mtn, 'mtn') def get_certs(db, rev_id): tokens = shlex.split(run_monotone(db, ['automate', 'certs', rev_id])) def usable_cert(cert): if 'signature' not in cert or cert['signature'] != 'ok': return False if 'trust' not in cert or cert['trust'] != 'trusted': return False if 'name' not in cert or 'value' not in cert: return False return True def cert_builder(tokens): pairs = zip(tokens[::2], tokens[1::2]) current_cert = {} for pair in pairs: if pair[0] == 'key': if usable_cert(current_cert): name = current_cert['name'] value = current_cert['value'] current_cert = {} logging.debug('Cert %s "%s" for rev %s' % (name, value, rev_id)) yield (name, value) current_cert[pair[0]] = pair[1] certs = dict(cert_builder(tokens)) return certs def datestamp(db, rev_id): certs = get_certs(db, rev_id) if 'date' in certs: return int(certs['date'].replace('-','')[0:8]) logging.info('Could not retreive date for %s' % (rev_id)) return 0 def gpg_sign(keyid, files): for filename in files: logging.info('Signing %s using PGP id %s' % (filename, keyid)) gpg = subprocess.Popen(['gpg', '--armor', '--detach-sign', '--local-user', keyid, filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE) check_subprocess_results(gpg, 'gpg') def parse_args(args): parser = optparse.OptionParser() parser.add_option('--verbose', action='store_true', default=False, help='Extra debug output') parser.add_option('--output-dir', metavar='DIR', default='.', help='Where to place output (default %default)') parser.add_option('--mtn-db', metavar='DB', default=os.getenv('BOTAN_MTN_DB', ''), help='Set monotone db (default \'%default\')') parser.add_option('--pgp-key-id', metavar='KEYID', default='EFBADFBC', help='PGP signing key (default %default)') return parser.parse_args(args) def remove_file_if_exists(fspath): try: os.unlink(fspath) except OSError as e: if e.errno != errno.ENOENT: raise def main(args = None): if args is None: args = sys.argv[1:] (options, args) = parse_args(args) def log_level(): if options.verbose: return logging.DEBUG return logging.INFO logging.basicConfig(stream = sys.stdout, format = '%(levelname) 7s: %(message)s', level = log_level()) if options.mtn_db == '': logging.error('No monotone db set (use --mtn-db)') return 1 if not os.access(options.mtn_db, os.R_OK): logging.error('Monotone db %s not found' % (options.mtn_db)) return 1 if len(args) != 1: logging.error('Usage: %s version' % (sys.argv[0])) return 1 version = args[0] rev_id = run_monotone(options.mtn_db, ['automate', 'select', 't:' + version]) if rev_id == '': logging.error('No revision for %s found' % (version)) return 2 output_basename = os.path.join(options.output_dir, 'Botan-' + version) output_tgz = output_basename + '.tgz' output_tbz = output_basename + '.tbz' logging.info('Found revision id %s' % (rev_id)) if os.access(output_basename, os.X_OK): shutil.rmtree(output_basename) run_monotone(options.mtn_db, ['checkout', '-r', rev_id, output_basename]) shutil.rmtree(os.path.join(output_basename, '_MTN')) remove_file_if_exists(os.path.join(output_basename, '.mtn-ignore')) version_file = os.path.join(output_basename, 'botan_version.py') if os.access(version_file, os.R_OK): # rewrite botan_version.py contents = open(version_file).readlines() def content_rewriter(): for line in contents: if line == 'release_vc_rev = None\n': yield 'release_vc_rev = \'mtn:%s\'\n' % (rev_id) elif line == 'release_datestamp = 0\n': yield 'release_datestamp = %d\n' % (datestamp(options.mtn_db, rev_id)) else: yield line open(version_file, 'w').write(''.join(list(content_rewriter()))) else: logging.error('Cannot find %s' % (version_file)) return 2 try: os.makedirs(options.output_dir) except OSError as e: if e.errno != errno.EEXIST: logging.error('Creating dir %s failed %s' % (options.output_dir, e)) return 2 remove_file_if_exists(output_tgz) remove_file_if_exists(output_tgz + '.asc') archive = tarfile.open(output_tgz, 'w:gz') archive.add(output_basename) archive.close() remove_file_if_exists(output_tbz) remove_file_if_exists(output_tbz + '.asc') archive = tarfile.open(output_tbz, 'w:bz2') archive.add(output_basename) archive.close() if options.pgp_key_id != '': gpg_sign(options.pgp_key_id, [output_tbz, output_tgz]) shutil.rmtree(output_basename) return 0 if __name__ == '__main__': try: sys.exit(main()) except Exception as e: logging.error(e) import traceback logging.info(traceback.format_exc()) sys.exit(1) Botan-1.10.12/src/cert/certstore/certstor.cpp0000664000175000017500000000427012654331322020676 0ustar jackjack00000000000000/* * Certificate Store * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { Certificate_Store* Certificate_Store_Memory::clone() const { return new Certificate_Store_Memory(*this); } void Certificate_Store_Memory::add_certificate(const X509_Certificate& cert) { for(size_t i = 0; i != certs.size(); ++i) { if(certs[i] == cert) return; } certs.push_back(cert); } std::vector Certificate_Store_Memory::find_cert_by_subject_and_key_id( const X509_DN& subject_dn, const MemoryRegion& key_id) const { std::vector result; for(size_t i = 0; i != certs.size(); ++i) { // Only compare key ids if set in both call and in the cert if(key_id.size()) { MemoryVector skid = certs[i].subject_key_id(); if(skid.size() && skid != key_id) // no match continue; } if(certs[i].subject_dn() == subject_dn) result.push_back(certs[i]); } return result; } void Certificate_Store_Memory::add_crl(const X509_CRL& crl) { X509_DN crl_issuer = crl.issuer_dn(); for(size_t i = 0; i != crls.size(); ++i) { // Found an update of a previously existing one; replace it if(crls[i].issuer_dn() == crl_issuer) { if(crls[i].this_update() < crl.this_update()) { crls[i] = crl; return; } } } // Totally new CRL, add to the list crls.push_back(crl); } std::vector Certificate_Store_Memory::find_crl_by_subject_and_key_id( const X509_DN& issuer_dn, const MemoryRegion& key_id) const { std::vector result; for(size_t i = 0; i != crls.size(); ++i) { // Only compare key ids if set in both call and in the CRL if(key_id.size()) { MemoryVector akid = crls[i].authority_key_id(); if(akid.size() && akid != key_id) // no match continue; } if(crls[i].issuer_dn() == issuer_dn) result.push_back(crls[i]); } return result; } } Botan-1.10.12/src/cert/certstore/certstor.h0000664000175000017500000000375012654331322020345 0ustar jackjack00000000000000/* * Certificate Store * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CERT_STORE_H__ #define BOTAN_CERT_STORE_H__ #include #include namespace Botan { /** * Certificate Store Interface */ class BOTAN_DLL Certificate_Store { public: virtual ~Certificate_Store() {} virtual Certificate_Store* clone() const = 0; /** * Add a certificate; this may fail if the store is write-only */ virtual void add_certificate(const X509_Certificate& cert) = 0; /** * Add a CRL; this may fail if the store is write-only */ virtual void add_crl(const X509_CRL& crl) = 0; /** * Subject DN and (optionally) key identifier */ virtual std::vector find_cert_by_subject_and_key_id( const X509_DN& subject_dn, const MemoryRegion& key_id) const = 0; /** * Find CRLs by the DN and key id of the issuer */ virtual std::vector find_crl_by_subject_and_key_id( const X509_DN& issuer_dn, const MemoryRegion& key_id) const = 0; }; /** * In Memory Certificate Store */ class BOTAN_DLL Certificate_Store_Memory : public Certificate_Store { public: Certificate_Store* clone() const; void add_certificate(const X509_Certificate& cert); void add_crl(const X509_CRL& crl); std::vector find_cert_by_subject_and_key_id( const X509_DN& subject_dn, const MemoryRegion& key_id) const; std::vector find_crl_by_subject_and_key_id( const X509_DN& issuer_dn, const MemoryRegion& key_id) const; Certificate_Store_Memory() {} private: // TODO: Add indexing on the DN and key id to avoid linear search? std::vector certs; std::vector crls; }; // TODO: file-backed store } #endif Botan-1.10.12/src/cert/certstore/info.txt0000664000175000017500000000010212654331322020007 0ustar jackjack00000000000000define CERTIFICATE_STORE x509cert x509crl Botan-1.10.12/src/cert/cvc/asn1_eac_str.cpp0000664000175000017500000000536512654331322020142 0ustar jackjack00000000000000/* * Simple ASN.1 String Types * (C) 2007 FlexSecure GmbH * 2008-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { /* * Create an ASN1_EAC_String */ ASN1_EAC_String::ASN1_EAC_String(const std::string& str, ASN1_Tag t) : tag(t) { iso_8859_str = Charset::transcode(str, LOCAL_CHARSET, LATIN1_CHARSET); if(!sanity_check()) throw Invalid_Argument("ASN1_EAC_String contains illegal characters"); } /* * Return this string in ISO 8859-1 encoding */ std::string ASN1_EAC_String::iso_8859() const { return iso_8859_str; } /* * Return this string in local encoding */ std::string ASN1_EAC_String::value() const { return Charset::transcode(iso_8859_str, LATIN1_CHARSET, LOCAL_CHARSET); } /* * Return the type of this string object */ ASN1_Tag ASN1_EAC_String::tagging() const { return tag; } /* * DER encode an ASN1_EAC_String */ void ASN1_EAC_String::encode_into(DER_Encoder& encoder) const { std::string value = iso_8859(); encoder.add_object(tagging(), APPLICATION, value); } /* * Decode a BER encoded ASN1_EAC_String */ void ASN1_EAC_String::decode_from(BER_Decoder& source) { BER_Object obj = source.get_next_object(); if(obj.type_tag != this->tag) { std::stringstream ss; ss << "ASN1_EAC_String tag mismatch, tag was " << std::hex << obj.type_tag << " expected " << std::hex << this->tag; throw Decoding_Error(ss.str()); } Character_Set charset_is; charset_is = LATIN1_CHARSET; try { *this = ASN1_EAC_String( Charset::transcode(ASN1::to_string(obj), charset_is, LOCAL_CHARSET), obj.type_tag); } catch(Invalid_Argument inv_arg) { throw Decoding_Error(std::string("ASN1_EAC_String decoding failed: ") + inv_arg.what()); } } // checks for compliance to the alphabet defined in TR-03110 v1.10, 2007-08-20 // p. 43 bool ASN1_EAC_String::sanity_check() const { const byte* rep = reinterpret_cast(iso_8859_str.data()); const size_t rep_len = iso_8859_str.size(); for(size_t i = 0; i != rep_len; ++i) { if((rep[i] < 0x20) || ((rep[i] >= 0x7F) && (rep[i] < 0xA0))) return false; } return true; } bool operator==(const ASN1_EAC_String& lhs, const ASN1_EAC_String& rhs) { return (lhs.iso_8859() == rhs.iso_8859()); } ASN1_Car::ASN1_Car(std::string const& str) : ASN1_EAC_String(str, ASN1_Tag(2)) {} ASN1_Chr::ASN1_Chr(std::string const& str) : ASN1_EAC_String(str, ASN1_Tag(32)) {} } Botan-1.10.12/src/cert/cvc/asn1_eac_tm.cpp0000664000175000017500000001532412654331322017746 0ustar jackjack00000000000000/* * EAC Time Types * (C) 2007 FlexSecure GmbH * 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { SecureVector enc_two_digit(u32bit in) { SecureVector result; in %= 100; if (in < 10) result.push_back(0x00); else { u32bit y_first_pos = round_down(in, 10) / 10; result.push_back(static_cast(y_first_pos)); } u32bit y_sec_pos = in % 10; result.push_back(static_cast(y_sec_pos)); return result; } u32bit dec_two_digit(byte b1, byte b2) { u32bit upper = b1; u32bit lower = b2; if(upper > 9 || lower > 9) throw Invalid_Argument("CVC dec_two_digit value too large"); return upper*10 + lower; } } /* * Create an EAC_Time */ EAC_Time::EAC_Time(u64bit timer, ASN1_Tag t) : tag(t) { calendar_point cal = calendar_value(timer); year = cal.year; month = cal.month; day = cal.day; } /* * Create an EAC_Time */ EAC_Time::EAC_Time(const std::string& t_spec, ASN1_Tag t) : tag(t) { set_to(t_spec); } /* * Create an EAC_Time */ EAC_Time::EAC_Time(u32bit y, u32bit m, u32bit d, ASN1_Tag t) : year(y), month(m), day(d), tag(t) { } /* * Set the time with a human readable string */ void EAC_Time::set_to(const std::string& time_str) { if (time_str == "") { year = month = day = 0; return; } std::vector params; std::string current; for (u32bit j = 0; j != time_str.size(); ++j) { if (Charset::is_digit(time_str[j])) current += time_str[j]; else { if (current != "") params.push_back(current); current.clear(); } } if (current != "") params.push_back(current); if (params.size() != 3) throw Invalid_Argument("Invalid time specification " + time_str); year = to_u32bit(params[0]); month = to_u32bit(params[1]); day = to_u32bit(params[2]); if (!passes_sanity_check()) throw Invalid_Argument("Invalid time specification " + time_str); } /* * DER encode a EAC_Time */ void EAC_Time::encode_into(DER_Encoder& der) const { der.add_object(tag, APPLICATION, encoded_eac_time()); } /* * Return a string representation of the time */ std::string EAC_Time::as_string() const { if (time_is_set() == false) throw Invalid_State("EAC_Time::as_string: No time set"); std::string asn1rep; asn1rep = to_string(year, 2); asn1rep += to_string(month, 2) + to_string(day, 2); return asn1rep; } /* * Return if the time has been set somehow */ bool EAC_Time::time_is_set() const { return (year != 0); } /* * Return a human readable string representation */ std::string EAC_Time::readable_string() const { if (time_is_set() == false) throw Invalid_State("EAC_Time::readable_string: No time set"); std::string readable; readable += to_string(year, 2) + "/"; readable += to_string(month, 2) + "/"; readable += to_string(day, 2) + " "; return readable; } /* * Do a general sanity check on the time */ bool EAC_Time::passes_sanity_check() const { if (year < 2000 || year > 2099) return false; if (month == 0 || month > 12) return false; if (day == 0 || day > 31) return false; return true; } /* * modification functions */ void EAC_Time::add_years(u32bit years) { year += years; } void EAC_Time::add_months(u32bit months) { year += months/12; month += months % 12; if(month > 12) { year += 1; month -= 12; } } /* * Compare this time against another */ s32bit EAC_Time::cmp(const EAC_Time& other) const { if (time_is_set() == false) throw Invalid_State("EAC_Time::cmp: No time set"); const s32bit EARLIER = -1, LATER = 1, SAME_TIME = 0; if (year < other.year) return EARLIER; if (year > other.year) return LATER; if (month < other.month) return EARLIER; if (month > other.month) return LATER; if (day < other.day) return EARLIER; if (day > other.day) return LATER; return SAME_TIME; } /* * Compare two EAC_Times for in various ways */ bool operator==(const EAC_Time& t1, const EAC_Time& t2) { return (t1.cmp(t2) == 0); } bool operator!=(const EAC_Time& t1, const EAC_Time& t2) { return (t1.cmp(t2) != 0); } bool operator<=(const EAC_Time& t1, const EAC_Time& t2) { return (t1.cmp(t2) <= 0); } bool operator>=(const EAC_Time& t1, const EAC_Time& t2) { return (t1.cmp(t2) >= 0); } bool operator>(const EAC_Time& t1, const EAC_Time& t2) { return (t1.cmp(t2) > 0); } bool operator<(const EAC_Time& t1, const EAC_Time& t2) { return (t1.cmp(t2) < 0); } /* * Decode a BER encoded EAC_Time */ void EAC_Time::decode_from(BER_Decoder& source) { BER_Object obj = source.get_next_object(); if(obj.type_tag != this->tag) throw BER_Decoding_Error("Tag mismatch when decoding"); if(obj.value.size() != 6) { throw Decoding_Error("EAC_Time decoding failed"); } try { u32bit tmp_year = dec_two_digit(obj.value[0], obj.value[1]); u32bit tmp_mon = dec_two_digit(obj.value[2], obj.value[3]); u32bit tmp_day = dec_two_digit(obj.value[4], obj.value[5]); year = tmp_year + 2000; month = tmp_mon; day = tmp_day; } catch (Invalid_Argument) { throw Decoding_Error("EAC_Time decoding failed"); } } u32bit EAC_Time::get_year() const { return year; } u32bit EAC_Time::get_month() const { return month; } u32bit EAC_Time::get_day() const { return day; } /* * make the value an octet string for encoding */ SecureVector EAC_Time::encoded_eac_time() const { SecureVector result; result += enc_two_digit(year); result += enc_two_digit(month); result += enc_two_digit(day); return result; } ASN1_Ced::ASN1_Ced(std::string const& str) : EAC_Time(str, ASN1_Tag(37)) {} ASN1_Ced::ASN1_Ced(u64bit val) : EAC_Time(val, ASN1_Tag(37)) {} ASN1_Ced::ASN1_Ced(EAC_Time const& other) : EAC_Time(other.get_year(), other.get_month(), other.get_day(), ASN1_Tag(37)) {} ASN1_Cex::ASN1_Cex(std::string const& str) : EAC_Time(str, ASN1_Tag(36)) {} ASN1_Cex::ASN1_Cex(u64bit val) : EAC_Time(val, ASN1_Tag(36)) {} ASN1_Cex::ASN1_Cex(EAC_Time const& other) : EAC_Time(other.get_year(), other.get_month(), other.get_day(), ASN1_Tag(36)) {} } Botan-1.10.12/src/cert/cvc/cvc_ado.cpp0000664000175000017500000000617512654331322017176 0ustar jackjack00000000000000/* * CVC Certificate Constructor * (C) 2007 FlexSecure GmbH * 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { EAC1_1_ADO::EAC1_1_ADO(DataSource& in) { init(in); do_decode(); } EAC1_1_ADO::EAC1_1_ADO(const std::string& in) { DataSource_Stream stream(in, true); init(stream); do_decode(); } void EAC1_1_ADO::force_decode() { SecureVector inner_cert; BER_Decoder(tbs_bits) .start_cons(ASN1_Tag(33)) .raw_bytes(inner_cert) .end_cons() .decode(m_car) .verify_end(); SecureVector req_bits = DER_Encoder() .start_cons(ASN1_Tag(33), APPLICATION) .raw_bytes(inner_cert) .end_cons() .get_contents(); DataSource_Memory req_source(req_bits); m_req = EAC1_1_Req(req_source); sig_algo = m_req.sig_algo; } MemoryVector EAC1_1_ADO::make_signed(PK_Signer& signer, const MemoryRegion& tbs_bits, RandomNumberGenerator& rng) { SecureVector concat_sig = signer.sign_message(tbs_bits, rng); return DER_Encoder() .start_cons(ASN1_Tag(7), APPLICATION) .raw_bytes(tbs_bits) .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) .end_cons() .get_contents(); } ASN1_Car EAC1_1_ADO::get_car() const { return m_car; } void EAC1_1_ADO::decode_info(DataSource& source, SecureVector & res_tbs_bits, ECDSA_Signature & res_sig) { SecureVector concat_sig; SecureVector cert_inner_bits; ASN1_Car car; BER_Decoder(source) .start_cons(ASN1_Tag(7)) .start_cons(ASN1_Tag(33)) .raw_bytes(cert_inner_bits) .end_cons() .decode(car) .decode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) .end_cons(); SecureVector enc_cert = DER_Encoder() .start_cons(ASN1_Tag(33), APPLICATION) .raw_bytes(cert_inner_bits) .end_cons() .get_contents(); res_tbs_bits = enc_cert; res_tbs_bits += DER_Encoder().encode(car).get_contents(); res_sig = decode_concatenation(concat_sig); } void EAC1_1_ADO::encode(Pipe& out, X509_Encoding encoding) const { if(encoding == PEM) throw Invalid_Argument("EAC1_1_ADO::encode() cannot PEM encode an EAC object"); SecureVector concat_sig( EAC1_1_obj::m_sig.get_concatenation()); out.write(DER_Encoder() .start_cons(ASN1_Tag(7), APPLICATION) .raw_bytes(tbs_bits) .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) .end_cons() .get_contents()); } SecureVector EAC1_1_ADO::tbs_data() const { return tbs_bits; } bool EAC1_1_ADO::operator==(EAC1_1_ADO const& rhs) const { return (this->get_concat_sig() == rhs.get_concat_sig() && this->tbs_data() == rhs.tbs_data() && this->get_car() == rhs.get_car()); } EAC1_1_Req EAC1_1_ADO::get_request() const { return m_req; } } Botan-1.10.12/src/cert/cvc/cvc_ado.h0000664000175000017500000000461312654331322016636 0ustar jackjack00000000000000/* * EAC1_1 CVC ADO * (C) 2008 Falko Strenzke * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EAC_CVC_ADO_H__ #define BOTAN_EAC_CVC_ADO_H__ #include #include #include #include namespace Botan { /** * This class represents a TR03110 (EAC) v1.1 CVC ADO request */ // CRTP continuation from EAC1_1_obj class BOTAN_DLL EAC1_1_ADO : public EAC1_1_obj { public: friend class EAC1_1_obj; /** * Construct a CVC ADO request from a DER encoded CVC ADO request file. * @param str the path to the DER encoded file */ EAC1_1_ADO(const std::string& str); /** * Construct a CVC ADO request from a data source * @param source the data source */ EAC1_1_ADO(DataSource& source); /** * Create a signed CVC ADO request from to be signed (TBS) data * @param signer the signer used to sign the CVC ADO request * @param tbs_bits the TBS data to sign * @param rng a random number generator */ static MemoryVector make_signed( PK_Signer& signer, const MemoryRegion& tbs_bits, RandomNumberGenerator& rng); /** * Get the CAR of this CVC ADO request * @result the CAR of this CVC ADO request */ ASN1_Car get_car() const; /** * Get the CVC request contained in this object. * @result the CVC request inside this CVC ADO request */ EAC1_1_Req get_request() const; /** * Encode this object into a pipe. Only DER is supported. * @param out the pipe to encode this object into * @param encoding the encoding type to use, must be DER */ void encode(Pipe& out, X509_Encoding encoding) const; bool operator==(EAC1_1_ADO const& rhs) const; /** * Get the TBS data of this CVC ADO request. * @result the TBS data */ SecureVector tbs_data() const; virtual ~EAC1_1_ADO() {} private: ASN1_Car m_car; EAC1_1_Req m_req; void force_decode(); static void decode_info(DataSource& source, SecureVector & res_tbs_bits, ECDSA_Signature & res_sig); }; inline bool operator!=(EAC1_1_ADO const& lhs, EAC1_1_ADO const& rhs) { return (!(lhs == rhs)); } } #endif Botan-1.10.12/src/cert/cvc/cvc_cert.cpp0000664000175000017500000000632212654331322017362 0ustar jackjack00000000000000/* (C) 2007 FlexSecure GmbH 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { ASN1_Car EAC1_1_CVC::get_car() const { return m_car; } ASN1_Ced EAC1_1_CVC::get_ced() const { return m_ced; } ASN1_Cex EAC1_1_CVC::get_cex() const { return m_cex; } u32bit EAC1_1_CVC::get_chat_value() const { return m_chat_val; } /* * Decode the TBSCertificate data */ void EAC1_1_CVC::force_decode() { SecureVector enc_pk; SecureVector enc_chat_val; size_t cpi; BER_Decoder tbs_cert(tbs_bits); tbs_cert.decode(cpi, ASN1_Tag(41), APPLICATION) .decode(m_car) .start_cons(ASN1_Tag(73)) .raw_bytes(enc_pk) .end_cons() .decode(m_chr) .start_cons(ASN1_Tag(76)) .decode(m_chat_oid) .decode(enc_chat_val, OCTET_STRING, ASN1_Tag(19), APPLICATION) .end_cons() .decode(m_ced) .decode(m_cex) .verify_end(); if(enc_chat_val.size() != 1) throw Decoding_Error("CertificateHolderAuthorizationValue was not of length 1"); if(cpi != 0) throw Decoding_Error("EAC1_1 certificate's cpi was not 0"); m_pk = decode_eac1_1_key(enc_pk, sig_algo); m_chat_val = enc_chat_val[0]; self_signed = (m_car.iso_8859() == m_chr.iso_8859()); } /* * CVC Certificate Constructor */ EAC1_1_CVC::EAC1_1_CVC(DataSource& in) { init(in); self_signed = false; do_decode(); } EAC1_1_CVC::EAC1_1_CVC(const std::string& in) { DataSource_Stream stream(in, true); init(stream); self_signed = false; do_decode(); } bool EAC1_1_CVC::operator==(EAC1_1_CVC const& rhs) const { return (tbs_data() == rhs.tbs_data() && get_concat_sig() == rhs.get_concat_sig()); } ECDSA_PublicKey* decode_eac1_1_key(const MemoryRegion&, AlgorithmIdentifier&) { throw Internal_Error("decode_eac1_1_key: Unimplemented"); return 0; } EAC1_1_CVC make_cvc_cert(PK_Signer& signer, MemoryRegion const& public_key, ASN1_Car const& car, ASN1_Chr const& chr, byte holder_auth_templ, ASN1_Ced ced, ASN1_Cex cex, RandomNumberGenerator& rng) { OID chat_oid(OIDS::lookup("CertificateHolderAuthorizationTemplate")); MemoryVector enc_chat_val; enc_chat_val.push_back(holder_auth_templ); MemoryVector enc_cpi; enc_cpi.push_back(0x00); MemoryVector tbs = DER_Encoder() .encode(enc_cpi, OCTET_STRING, ASN1_Tag(41), APPLICATION) // cpi .encode(car) .raw_bytes(public_key) .encode(chr) .start_cons(ASN1_Tag(76), APPLICATION) .encode(chat_oid) .encode(enc_chat_val, OCTET_STRING, ASN1_Tag(19), APPLICATION) .end_cons() .encode(ced) .encode(cex) .get_contents(); MemoryVector signed_cert = EAC1_1_CVC::make_signed(signer, EAC1_1_CVC::build_cert_body(tbs), rng); DataSource_Memory source(signed_cert); return EAC1_1_CVC(source); } } Botan-1.10.12/src/cert/cvc/cvc_cert.h0000664000175000017500000000561112654331322017027 0ustar jackjack00000000000000/* * EAC1_1 CVC * (C) 2008 Falko Strenzke * 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CVC_EAC_H__ #define BOTAN_CVC_EAC_H__ #include #include #include namespace Botan { /** * This class represents TR03110 (EAC) v1.1 CV Certificates */ class BOTAN_DLL EAC1_1_CVC : public EAC1_1_gen_CVC//Signed_Object { public: friend class EAC1_1_obj; /** * Get the CAR of the certificate. * @result the CAR of the certificate */ ASN1_Car get_car() const; /** * Get the CED of this certificate. * @result the CED this certificate */ ASN1_Ced get_ced() const; /** * Get the CEX of this certificate. * @result the CEX this certificate */ ASN1_Cex get_cex() const; /** * Get the CHAT value. * @result the CHAT value */ u32bit get_chat_value() const; bool operator==(const EAC1_1_CVC&) const; /** * Construct a CVC from a data source * @param source the data source */ EAC1_1_CVC(DataSource& source); /** * Construct a CVC from a file * @param str the path to the certificate file */ EAC1_1_CVC(const std::string& str); virtual ~EAC1_1_CVC() {} private: void force_decode(); EAC1_1_CVC() {} ASN1_Car m_car; ASN1_Ced m_ced; ASN1_Cex m_cex; byte m_chat_val; OID m_chat_oid; }; /* * Comparison */ inline bool operator!=(EAC1_1_CVC const& lhs, EAC1_1_CVC const& rhs) { return !(lhs == rhs); } /** * Create an arbitrary EAC 1.1 CVC. * The desired key encoding must be set within the key (if applicable). * @param signer the signer used to sign the certificate * @param public_key the DER encoded public key to appear in * the certificate * @param car the CAR of the certificate * @param chr the CHR of the certificate * @param holder_auth_templ the holder authorization value byte to * appear in the CHAT of the certificate * @param ced the CED to appear in the certificate * @param cex the CEX to appear in the certificate * @param rng a random number generator */ EAC1_1_CVC BOTAN_DLL make_cvc_cert(PK_Signer& signer, const MemoryRegion& public_key, ASN1_Car const& car, ASN1_Chr const& chr, byte holder_auth_templ, ASN1_Ced ced, ASN1_Cex cex, RandomNumberGenerator& rng); /** * Decode an EAC encoding ECDSA key */ BOTAN_DLL ECDSA_PublicKey* decode_eac1_1_key(const MemoryRegion& enc_key, AlgorithmIdentifier& sig_algo); } #endif Botan-1.10.12/src/cert/cvc/cvc_gen_cert.h0000664000175000017500000001155612654331322017665 0ustar jackjack00000000000000/* * EAC1_1 general CVC * (C) 2008 Falko Strenzke * 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EAC_CVC_GEN_CERT_H__ #define BOTAN_EAC_CVC_GEN_CERT_H__ #include #include #include #include namespace Botan { /** * This class represents TR03110 (EAC) v1.1 generalized CV Certificates */ template class EAC1_1_gen_CVC : public EAC1_1_obj // CRTP continuation from EAC1_1_obj { friend class EAC1_1_obj; public: /** * Get this certificates public key. * @result this certificates public key */ Public_Key* subject_public_key() const; /** * Find out whether this object is self signed. * @result true if this object is self signed */ bool is_self_signed() const; /** * Get the CHR of the certificate. * @result the CHR of the certificate */ ASN1_Chr get_chr() const; /** * Put the DER encoded version of this object into a pipe. PEM * is not supported. * @param out the pipe to push the DER encoded version into * @param encoding the encoding to use. Must be DER. */ void encode(Pipe& out, X509_Encoding encoding) const; /** * Get the to-be-signed (TBS) data of this object. * @result the TBS data of this object */ SecureVector tbs_data() const; /** * Build the DER encoded certifcate body of an object * @param tbs the data to be signed * @result the correctly encoded body of the object */ static SecureVector build_cert_body(MemoryRegion const& tbs); /** * Create a signed generalized CVC object. * @param signer the signer used to sign this object * @param tbs_bits the body the generalized CVC object to be signed * @param rng a random number generator * @result the DER encoded signed generalized CVC object */ static MemoryVector make_signed( PK_Signer& signer, const MemoryRegion& tbs_bits, RandomNumberGenerator& rng); EAC1_1_gen_CVC() { m_pk = 0; } virtual ~EAC1_1_gen_CVC() { delete m_pk; } protected: ECDSA_PublicKey* m_pk; ASN1_Chr m_chr; bool self_signed; static void decode_info(DataSource& source, SecureVector & res_tbs_bits, ECDSA_Signature & res_sig); }; template ASN1_Chr EAC1_1_gen_CVC::get_chr() const { return m_chr; } template bool EAC1_1_gen_CVC::is_self_signed() const { return self_signed; } template MemoryVector EAC1_1_gen_CVC::make_signed( PK_Signer& signer, const MemoryRegion& tbs_bits, RandomNumberGenerator& rng) // static { SecureVector concat_sig = signer.sign_message(tbs_bits, rng); return DER_Encoder() .start_cons(ASN1_Tag(33), APPLICATION) .raw_bytes(tbs_bits) .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) .end_cons() .get_contents(); } template Public_Key* EAC1_1_gen_CVC::subject_public_key() const { return new ECDSA_PublicKey(*m_pk); } template SecureVector EAC1_1_gen_CVC::build_cert_body(MemoryRegion const& tbs) { return DER_Encoder() .start_cons(ASN1_Tag(78), APPLICATION) .raw_bytes(tbs) .end_cons().get_contents(); } template SecureVector EAC1_1_gen_CVC::tbs_data() const { return build_cert_body(EAC1_1_obj::tbs_bits); } template void EAC1_1_gen_CVC::encode(Pipe& out, X509_Encoding encoding) const { SecureVector concat_sig(EAC1_1_obj::m_sig.get_concatenation()); SecureVector der = DER_Encoder() .start_cons(ASN1_Tag(33), APPLICATION) .start_cons(ASN1_Tag(78), APPLICATION) .raw_bytes(EAC1_1_obj::tbs_bits) .end_cons() .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) .end_cons() .get_contents(); if (encoding == PEM) throw Invalid_Argument("EAC1_1_gen_CVC::encode() cannot PEM encode an EAC object"); else out.write(der); } template void EAC1_1_gen_CVC::decode_info( DataSource& source, SecureVector & res_tbs_bits, ECDSA_Signature & res_sig) { SecureVector concat_sig; BER_Decoder(source) .start_cons(ASN1_Tag(33)) .start_cons(ASN1_Tag(78)) .raw_bytes(res_tbs_bits) .end_cons() .decode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) .end_cons(); res_sig = decode_concatenation(concat_sig); } } #endif Botan-1.10.12/src/cert/cvc/cvc_req.cpp0000664000175000017500000000205212654331322017210 0ustar jackjack00000000000000/* (C) 2007 FlexSecure GmbH 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { bool EAC1_1_Req::operator==(EAC1_1_Req const& rhs) const { return (this->tbs_data() == rhs.tbs_data() && this->get_concat_sig() == rhs.get_concat_sig()); } void EAC1_1_Req::force_decode() { SecureVector enc_pk; BER_Decoder tbs_cert(tbs_bits); size_t cpi; tbs_cert.decode(cpi, ASN1_Tag(41), APPLICATION) .start_cons(ASN1_Tag(73)) .raw_bytes(enc_pk) .end_cons() .decode(m_chr) .verify_end(); if(cpi != 0) throw Decoding_Error("EAC1_1 requests cpi was not 0"); m_pk = decode_eac1_1_key(enc_pk, sig_algo); } EAC1_1_Req::EAC1_1_Req(DataSource& in) { init(in); self_signed = true; do_decode(); } EAC1_1_Req::EAC1_1_Req(const std::string& in) { DataSource_Stream stream(in, true); init(stream); self_signed = true; do_decode(); } } Botan-1.10.12/src/cert/cvc/cvc_req.h0000664000175000017500000000227612654331322016665 0ustar jackjack00000000000000/* * EAC1_1 CVC Request * (C) 2008 Falko Strenzke * 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EAC_CVC_REQ_H__ #define BOTAN_EAC_CVC_REQ_H__ #include namespace Botan { /** * This class represents TR03110 v1.1 EAC CV Certificate Requests. */ class BOTAN_DLL EAC1_1_Req : public EAC1_1_gen_CVC { public: friend class EAC1_1_ADO; friend class EAC1_1_obj; /** * Compare for equality with other * @param other compare for equality with this object */ bool operator==(const EAC1_1_Req& other) const; /** * Construct a CVC request from a data source. * @param source the data source */ EAC1_1_Req(DataSource& source); /** * Construct a CVC request from a DER encoded CVC request file. * @param str the path to the DER encoded file */ EAC1_1_Req(const std::string& str); virtual ~EAC1_1_Req(){} private: void force_decode(); EAC1_1_Req() {} }; /* * Comparison Operator */ inline bool operator!=(EAC1_1_Req const& lhs, EAC1_1_Req const& rhs) { return !(lhs == rhs); } } #endif Botan-1.10.12/src/cert/cvc/cvc_self.cpp0000664000175000017500000002624712654331322017366 0ustar jackjack00000000000000/* (C) 2007 FlexSecure GmbH 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { /* * cvc CHAT values */ enum CHAT_values{ CVCA = 0xC0, DVCA_domestic = 0x80, DVCA_foreign = 0x40, IS = 0x00, IRIS = 0x02, FINGERPRINT = 0x01 }; void encode_eac_bigint(DER_Encoder& der, const BigInt& x, ASN1_Tag tag) { der.encode(BigInt::encode_1363(x, x.bytes()), OCTET_STRING, tag); } MemoryVector eac_1_1_encoding(const EC_PublicKey* key, const OID& sig_algo) { if(key->domain_format() == EC_DOMPAR_ENC_OID) throw Encoding_Error("CVC encoder: cannot encode parameters by OID"); const EC_Group& domain = key->domain(); // This is why we can't have nice things DER_Encoder enc; enc.start_cons(ASN1_Tag(73), APPLICATION) .encode(sig_algo); if(key->domain_format() == EC_DOMPAR_ENC_EXPLICIT) { encode_eac_bigint(enc, domain.get_curve().get_p(), ASN1_Tag(1)); encode_eac_bigint(enc, domain.get_curve().get_a(), ASN1_Tag(2)); encode_eac_bigint(enc, domain.get_curve().get_b(), ASN1_Tag(3)); enc.encode(EC2OSP(domain.get_base_point(), PointGFp::UNCOMPRESSED), OCTET_STRING, ASN1_Tag(4)); encode_eac_bigint(enc, domain.get_order(), ASN1_Tag(4)); } enc.encode(EC2OSP(key->public_point(), PointGFp::UNCOMPRESSED), OCTET_STRING, ASN1_Tag(6)); if(key->domain_format() == EC_DOMPAR_ENC_EXPLICIT) encode_eac_bigint(enc, domain.get_cofactor(), ASN1_Tag(7)); enc.end_cons(); return enc.get_contents(); } std::string padding_and_hash_from_oid(OID const& oid) { std::string padding_and_hash = OIDS::lookup(oid); // use the hash if(padding_and_hash.substr(0,6) != "ECDSA/") throw Invalid_State("CVC: Can only use ECDSA, not " + padding_and_hash); padding_and_hash.erase(0, padding_and_hash.find("/") + 1); return padding_and_hash; } } namespace CVC_EAC { EAC1_1_CVC create_self_signed_cert(Private_Key const& key, EAC1_1_CVC_Options const& opt, RandomNumberGenerator& rng) { // NOTE: we ignore the value of opt.chr const ECDSA_PrivateKey* priv_key = dynamic_cast(&key); if(priv_key == 0) throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); ASN1_Chr chr(opt.car.value()); AlgorithmIdentifier sig_algo; std::string padding_and_hash("EMSA1_BSI(" + opt.hash_alg + ")"); sig_algo.oid = OIDS::lookup(priv_key->algo_name() + "/" + padding_and_hash); sig_algo = AlgorithmIdentifier(sig_algo.oid, AlgorithmIdentifier::USE_NULL_PARAM); PK_Signer signer(*priv_key, padding_and_hash); MemoryVector enc_public_key = eac_1_1_encoding(priv_key, sig_algo.oid); return make_cvc_cert(signer, enc_public_key, opt.car, chr, opt.holder_auth_templ, opt.ced, opt.cex, rng); } EAC1_1_Req create_cvc_req(Private_Key const& key, ASN1_Chr const& chr, std::string const& hash_alg, RandomNumberGenerator& rng) { ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); if (priv_key == 0) { throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); } AlgorithmIdentifier sig_algo; std::string padding_and_hash("EMSA1_BSI(" + hash_alg + ")"); sig_algo.oid = OIDS::lookup(priv_key->algo_name() + "/" + padding_and_hash); sig_algo = AlgorithmIdentifier(sig_algo.oid, AlgorithmIdentifier::USE_NULL_PARAM); PK_Signer signer(*priv_key, padding_and_hash); MemoryVector enc_public_key = eac_1_1_encoding(priv_key, sig_algo.oid); MemoryVector enc_cpi; enc_cpi.push_back(0x00); MemoryVector tbs = DER_Encoder() .encode(enc_cpi, OCTET_STRING, ASN1_Tag(41), APPLICATION) .raw_bytes(enc_public_key) .encode(chr) .get_contents(); MemoryVector signed_cert = EAC1_1_gen_CVC::make_signed(signer, EAC1_1_gen_CVC::build_cert_body(tbs), rng); DataSource_Memory source(signed_cert); return EAC1_1_Req(source); } EAC1_1_ADO create_ado_req(Private_Key const& key, EAC1_1_Req const& req, ASN1_Car const& car, RandomNumberGenerator& rng) { ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); if (priv_key == 0) { throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); } std::string padding_and_hash = padding_and_hash_from_oid(req.signature_algorithm().oid); PK_Signer signer(*priv_key, padding_and_hash); SecureVector tbs_bits = req.BER_encode(); tbs_bits += DER_Encoder().encode(car).get_contents(); MemoryVector signed_cert = EAC1_1_ADO::make_signed(signer, tbs_bits, rng); DataSource_Memory source(signed_cert); return EAC1_1_ADO(source); } } // namespace CVC_EAC namespace DE_EAC { EAC1_1_CVC create_cvca(Private_Key const& key, std::string const& hash, ASN1_Car const& car, bool iris, bool fingerpr, u32bit cvca_validity_months, RandomNumberGenerator& rng) { ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); if (priv_key == 0) { throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); } EAC1_1_CVC_Options opts; opts.car = car; const u64bit current_time = system_time(); opts.ced = ASN1_Ced(current_time); opts.cex = ASN1_Cex(opts.ced); opts.cex.add_months(cvca_validity_months); opts.holder_auth_templ = (CVCA | (iris * IRIS) | (fingerpr * FINGERPRINT)); opts.hash_alg = hash; return CVC_EAC::create_self_signed_cert(*priv_key, opts, rng); } EAC1_1_CVC link_cvca(EAC1_1_CVC const& signer, Private_Key const& key, EAC1_1_CVC const& signee, RandomNumberGenerator& rng) { ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); if (priv_key == 0) { throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); } ASN1_Ced ced(system_time()); ASN1_Cex cex(signee.get_cex()); if (*static_cast(&ced) > *static_cast(&cex)) { std::string detail("link_cvca(): validity periods of provided certificates don't overlap: currend time = ced = "); detail += ced.as_string(); detail += ", signee.cex = "; detail += cex.as_string(); throw Invalid_Argument(detail); } if (signer.signature_algorithm() != signee.signature_algorithm()) { throw Invalid_Argument("link_cvca(): signature algorithms of signer and signee don't match"); } AlgorithmIdentifier sig_algo = signer.signature_algorithm(); std::string padding_and_hash = padding_and_hash_from_oid(sig_algo.oid); PK_Signer pk_signer(*priv_key, padding_and_hash); std::auto_ptr pk(signee.subject_public_key()); ECDSA_PublicKey* subj_pk = dynamic_cast(pk.get()); subj_pk->set_parameter_encoding(EC_DOMPAR_ENC_EXPLICIT); MemoryVector enc_public_key = eac_1_1_encoding(priv_key, sig_algo.oid); return make_cvc_cert(pk_signer, enc_public_key, signer.get_car(), signee.get_chr(), signer.get_chat_value(), ced, cex, rng); } EAC1_1_CVC sign_request(EAC1_1_CVC const& signer_cert, Private_Key const& key, EAC1_1_Req const& signee, u32bit seqnr, u32bit seqnr_len, bool domestic, u32bit dvca_validity_months, u32bit ca_is_validity_months, RandomNumberGenerator& rng) { ECDSA_PrivateKey const* priv_key = dynamic_cast(&key); if (priv_key == 0) { throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); } std::string chr_str = signee.get_chr().value(); chr_str += to_string(seqnr, seqnr_len); ASN1_Chr chr(chr_str); std::string padding_and_hash = padding_and_hash_from_oid(signee.signature_algorithm().oid); PK_Signer pk_signer(*priv_key, padding_and_hash); std::auto_ptr pk(signee.subject_public_key()); ECDSA_PublicKey* subj_pk = dynamic_cast(pk.get()); std::auto_ptr signer_pk(signer_cert.subject_public_key()); // for the case that the domain parameters are not set... // (we use those from the signer because they must fit) //subj_pk->set_domain_parameters(priv_key->domain_parameters()); subj_pk->set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); AlgorithmIdentifier sig_algo(signer_cert.signature_algorithm()); const u64bit current_time = system_time(); ASN1_Ced ced(current_time); u32bit chat_val; u32bit chat_low = signer_cert.get_chat_value() & 0x3; // take the chat rights from signer ASN1_Cex cex(ced); if ((signer_cert.get_chat_value() & CVCA) == CVCA) { // we sign a dvca cex.add_months(dvca_validity_months); if (domestic) chat_val = DVCA_domestic | chat_low; else chat_val = DVCA_foreign | chat_low; } else if ((signer_cert.get_chat_value() & DVCA_domestic) == DVCA_domestic || (signer_cert.get_chat_value() & DVCA_foreign) == DVCA_foreign) { cex.add_months(ca_is_validity_months); chat_val = IS | chat_low; } else { throw Invalid_Argument("sign_request(): encountered illegal value for CHAT"); // (IS cannot sign certificates) } MemoryVector enc_public_key = eac_1_1_encoding(priv_key, sig_algo.oid); return make_cvc_cert(pk_signer, enc_public_key, ASN1_Car(signer_cert.get_chr().iso_8859()), chr, chat_val, ced, cex, rng); } EAC1_1_Req create_cvc_req(Private_Key const& prkey, ASN1_Chr const& chr, std::string const& hash_alg, RandomNumberGenerator& rng) { ECDSA_PrivateKey const* priv_key = dynamic_cast(&prkey); if (priv_key == 0) { throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); } ECDSA_PrivateKey key(*priv_key); key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); return CVC_EAC::create_cvc_req(key, chr, hash_alg, rng); } } // namespace DE_EAC } Botan-1.10.12/src/cert/cvc/cvc_self.h0000664000175000017500000001403412654331322017022 0ustar jackjack00000000000000/* * CVC Self-Signed Certificate * (C) 2007 FlexSecure GmbH * 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CVC_EAC_SELF_H__ #define BOTAN_CVC_EAC_SELF_H__ #include #include #include #include #include #include namespace Botan { /** * This class represents a set of options used for the creation of CVC certificates */ class BOTAN_DLL EAC1_1_CVC_Options { public: ASN1_Car car; ASN1_Chr chr; byte holder_auth_templ; ASN1_Ced ced; ASN1_Cex cex; std::string hash_alg; }; /** * This namespace represents general EAC 1.1 convenience functions. */ namespace CVC_EAC { /** * Create a selfsigned CVCA * @param rng the rng to use * @param key the ECDSA private key to be used to sign the certificate * @param opts used to set several parameters. Necessary are: * car, holder_auth_templ, hash_alg, ced, cex and hash_alg * @result the self signed certificate */ EAC1_1_CVC BOTAN_DLL create_self_signed_cert(Private_Key const& key, EAC1_1_CVC_Options const& opts, RandomNumberGenerator& rng); /** * Create a CVC request. The key encoding will be according to the provided private key. * @param priv_key the private key associated with the requesting entity * @param chr the chr to appear in the certificate (to be provided without * sequence number) * @param hash_alg the string defining the hash algorithm to be used for the creation * of the signature * @param rng the rng to use * @result the new request */ EAC1_1_Req BOTAN_DLL create_cvc_req(Private_Key const& priv_key, ASN1_Chr const& chr, std::string const& hash_alg, RandomNumberGenerator& rng); /** * Create an ADO from a request object. * @param priv_key the private key used to sign the ADO * @param req the request forming the body of the ADO * @param car the CAR forming the body of the ADO, i.e. the * CHR of the entity associated with the provided private key * @param rng the rng to use */ EAC1_1_ADO BOTAN_DLL create_ado_req(Private_Key const& priv_key, EAC1_1_Req const& req, ASN1_Car const& car, RandomNumberGenerator& rng); } /** * This namespace represents EAC 1.1 CVC convenience functions * following the specific german requirements. */ namespace DE_EAC { /** * Create a CVCA certificate. * @param priv_key the private key associated with the CVCA certificate * to be created * @param hash the string identifying the hash algorithm to be used * for signing the certificate to be created * @param car the CAR of the certificate to be created * @param iris indicates whether the entity associated with the certificate * shall be entitled to read the biometrical iris image * @param fingerpr indicates whether the entity associated with the certificate * shall be entitled to read the biometrical fingerprint image * @param cvca_validity_months length of time in months this will be valid * @param rng a random number generator * @result the CVCA certificate created */ EAC1_1_CVC BOTAN_DLL create_cvca(Private_Key const& priv_key, std::string const& hash, ASN1_Car const& car, bool iris, bool fingerpr, u32bit cvca_validity_months, RandomNumberGenerator& rng); /** * Create a link certificate between two CVCA certificates. The key * encoding will be implicitCA. * @param signer the cvca certificate associated with the signing * entity * @param priv_key the private key associated with the signer * @param to_be_signed the certificate which whose CAR/CHR will be * the holder of the link certificate * @param rng a random number generator */ EAC1_1_CVC BOTAN_DLL link_cvca(EAC1_1_CVC const& signer, Private_Key const& priv_key, EAC1_1_CVC const& to_be_signed, RandomNumberGenerator& rng); /** * Create a CVC request. The key encoding will be implicitCA. * @param priv_key the private key associated with the requesting entity * @param chr the chr to appear in the certificate (to be provided without * sequence number) * @param hash_alg the string defining the hash algorithm to be used for the creation * of the signature * @param rng a random number generator * @result the new request */ EAC1_1_Req BOTAN_DLL create_cvc_req(Private_Key const& priv_key, ASN1_Chr const& chr, std::string const& hash_alg, RandomNumberGenerator& rng); /** * Sign a CVC request. * @param signer_cert the certificate of the signing entity * @param priv_key the private key of the signing entity * @param req the request to be signed * @param seqnr the sequence number of the certificate to be created * @param seqnr_len the number of digits the sequence number will be * encoded in * @param domestic indicates whether to sign a domestic or a foreign * certificate: set to true for domestic * @param dvca_validity_months validity period in months * @param ca_is_validity_months validity period in months * @param rng a random number generator * @result the new certificate * **/ EAC1_1_CVC BOTAN_DLL sign_request(EAC1_1_CVC const& signer_cert, Private_Key const& priv_key, EAC1_1_Req const& req, u32bit seqnr, u32bit seqnr_len, bool domestic, u32bit dvca_validity_months, u32bit ca_is_validity_months, RandomNumberGenerator& rng); } } #endif Botan-1.10.12/src/cert/cvc/eac_asn_obj.h0000664000175000017500000001400612654331322017460 0ustar jackjack00000000000000/* * EAC ASN.1 Objects * (C) 2007-2008 FlexSecure GmbH * 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EAC_ASN1_OBJ_H__ #define BOTAN_EAC_ASN1_OBJ_H__ #include namespace Botan { /** * This class represents CVC EAC Time objects. * It only models year, month and day. Only limited sanity checks of * the inputted date value are performed. */ class BOTAN_DLL EAC_Time : public ASN1_Object { public: void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); /** * Get a this objects value as a string. * @return date string */ std::string as_string() const; /** * Get a this objects value as a readable formatted string. * @return date string */ std::string readable_string() const; /** * Find out whether this object's values have been set. * @return true if this object's internal values are set */ bool time_is_set() const; /** * Compare this to another EAC_Time object. * @return -1 if this object's date is earlier than * other, +1 in the opposite case, and 0 if both dates are * equal. */ s32bit cmp(const EAC_Time& other) const; /** * Set this' value by a string value. * @param str a string in the format "yyyy mm dd", * e.g. "2007 08 01" */ void set_to(const std::string& str); //void set_to(const std::string&, ASN1_Tag); /** * Add the specified number of years to this. * @param years the number of years to add */ void add_years(u32bit years); /** * Add the specified number of months to this. * @param months the number of months to add */ void add_months(u32bit months); /** * Get the year value of this objects. * @return year value */ u32bit get_year() const; /** * Get the month value of this objects. * @return month value */ u32bit get_month() const; /** * Get the day value of this objects. * @return day value */ u32bit get_day() const; EAC_Time(u64bit, ASN1_Tag t = ASN1_Tag(0)); //EAC_Time(const std::string& = ""); EAC_Time(const std::string&, ASN1_Tag = ASN1_Tag(0)); EAC_Time(u32bit year, u32bit month, u32bit day, ASN1_Tag = ASN1_Tag(0)); virtual ~EAC_Time() {} private: SecureVector encoded_eac_time() const; bool passes_sanity_check() const; u32bit year, month, day; ASN1_Tag tag; }; /** * This class represents CVC CEDs. Only limited sanity checks of * the inputted date value are performed. */ class BOTAN_DLL ASN1_Ced : public EAC_Time { public: /** * Construct a CED from a string value. * @param str a string in the format "yyyy mm dd", * e.g. "2007 08 01" */ ASN1_Ced(std::string const& str = ""); /** * Construct a CED from a timer value. * @param time the number of seconds elapsed midnight, 1st * January 1970 GMT (or 7pm, 31st December 1969 EST) up to the * desired date */ ASN1_Ced(u64bit time); /** * Copy constructor (for general EAC_Time objects). * @param other the object to copy from */ ASN1_Ced(EAC_Time const& other); //ASN1_Ced(ASN1_Cex const& cex); }; /** * This class represents CVC CEXs. Only limited sanity checks of * the inputted date value are performed. */ class BOTAN_DLL ASN1_Cex : public EAC_Time { public: /** * Construct a CED from a string value. * @param str a string in the format "yyyy mm dd", * e.g. "2007 08 01" */ ASN1_Cex(std::string const& str=""); /** * Construct a CED from a timer value. * @param time the number of seconds elapsed * midnight, 1st * January 1970 GMT (or 7pm, 31st December 1969 EST) * up to the desired date */ ASN1_Cex(u64bit time); /** * Copy constructor (for general EAC_Time objects). * @param other the object to copy from */ ASN1_Cex(EAC_Time const& other); //ASN1_Cex(ASN1_Ced const& ced); }; /** * Base class for car/chr of cv certificates. */ class BOTAN_DLL ASN1_EAC_String: public ASN1_Object { public: void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); /** * Get this objects string value. * @return string value */ std::string value() const; /** * Get this objects string value. * @return string value in iso8859 encoding */ std::string iso_8859() const; ASN1_Tag tagging() const; ASN1_EAC_String(const std::string& str, ASN1_Tag the_tag); virtual ~ASN1_EAC_String() {} protected: bool sanity_check() const; private: std::string iso_8859_str; ASN1_Tag tag; }; /** * This class represents CARs of CVCs. (String tagged with 2) */ class BOTAN_DLL ASN1_Car : public ASN1_EAC_String { public: /** * Create a CAR with the specified content. * @param str the CAR value */ ASN1_Car(std::string const& str = ""); }; /** * This class represents CHRs of CVCs (tag 32) */ class BOTAN_DLL ASN1_Chr : public ASN1_EAC_String { public: /** * Create a CHR with the specified content. * @param str the CHR value */ ASN1_Chr(std::string const& str = ""); }; /* * Comparison Operations */ bool BOTAN_DLL operator==(const EAC_Time&, const EAC_Time&); bool BOTAN_DLL operator!=(const EAC_Time&, const EAC_Time&); bool BOTAN_DLL operator<=(const EAC_Time&, const EAC_Time&); bool BOTAN_DLL operator>=(const EAC_Time&, const EAC_Time&); bool BOTAN_DLL operator>(const EAC_Time&, const EAC_Time&); bool BOTAN_DLL operator<(const EAC_Time&, const EAC_Time&); bool BOTAN_DLL operator==(const ASN1_EAC_String&, const ASN1_EAC_String&); inline bool operator!=(const ASN1_EAC_String& lhs, const ASN1_EAC_String& rhs) { return !(lhs == rhs); } } #endif Botan-1.10.12/src/cert/cvc/eac_obj.h0000664000175000017500000000222212654331322016614 0ustar jackjack00000000000000/* * EAC1_1 objects * (C) 2008 Falko Strenzke * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EAC_OBJ_H__ #define BOTAN_EAC_OBJ_H__ #include #include namespace Botan { /** * TR03110 v1.1 EAC CV Certificate */ template // CRTP is used enable the call sequence: class EAC1_1_obj : public EAC_Signed_Object { public: /** * Return the signature as a concatenation of the encoded parts. * @result the concatenated signature */ SecureVector get_concat_sig() const { return m_sig.get_concatenation(); } bool check_signature(class Public_Key& key) const { return EAC_Signed_Object::check_signature(key, m_sig.DER_encode()); } protected: ECDSA_Signature m_sig; void init(DataSource& in) { try { Derived::decode_info(in, tbs_bits, m_sig); } catch(Decoding_Error) { throw Decoding_Error(PEM_label_pref + " decoding failed"); } } virtual ~EAC1_1_obj(){} }; } #endif Botan-1.10.12/src/cert/cvc/ecdsa_sig.cpp0000664000175000017500000000247012654331322017513 0ustar jackjack00000000000000/* * ECDSA Signature * (C) 2007 Falko Strenzke, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { ECDSA_Signature::ECDSA_Signature(const MemoryRegion& ber) { BER_Decoder(ber) .start_cons(SEQUENCE) .decode(m_r) .decode(m_s) .end_cons() .verify_end(); } MemoryVector ECDSA_Signature::DER_encode() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(get_r()) .encode(get_s()) .end_cons() .get_contents(); } MemoryVector ECDSA_Signature::get_concatenation() const { // use the larger const size_t enc_len = m_r > m_s ? m_r.bytes() : m_s.bytes(); SecureVector sv_r = BigInt::encode_1363(m_r, enc_len); SecureVector sv_s = BigInt::encode_1363(m_s, enc_len); SecureVector result(sv_r); result += sv_s; return result; } ECDSA_Signature decode_concatenation(const MemoryRegion& concat) { if(concat.size() % 2 != 0) throw Invalid_Argument("Erroneous length of signature"); const size_t rs_len = concat.size() / 2; BigInt r = BigInt::decode(&concat[0], rs_len); BigInt s = BigInt::decode(&concat[rs_len], rs_len); return ECDSA_Signature(r, s); } } Botan-1.10.12/src/cert/cvc/ecdsa_sig.h0000664000175000017500000000240112654331322017152 0ustar jackjack00000000000000/* * ECDSA Signature * (C) 2007 Falko Strenzke, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ECDSA_SIGNATURE_H__ #define BOTAN_ECDSA_SIGNATURE_H__ #include #include #include namespace Botan { /** * Class representing an ECDSA signature */ class BOTAN_DLL ECDSA_Signature { public: friend class ECDSA_Signature_Decoder; ECDSA_Signature() {} ECDSA_Signature(const BigInt& r, const BigInt& s) : m_r(r), m_s(s) {} ECDSA_Signature(const MemoryRegion& ber); const BigInt& get_r() const { return m_r; } const BigInt& get_s() const { return m_s; } /** * return the r||s */ MemoryVector get_concatenation() const; MemoryVector DER_encode() const; bool operator==(const ECDSA_Signature& other) const { return (get_r() == other.get_r() && get_s() == other.get_s()); } private: BigInt m_r; BigInt m_s; }; inline bool operator!=(const ECDSA_Signature& lhs, const ECDSA_Signature& rhs) { return !(lhs == rhs); } ECDSA_Signature decode_concatenation(const MemoryRegion& concatenation); } #endif Botan-1.10.12/src/cert/cvc/info.txt0000664000175000017500000000062612654331322016563 0ustar jackjack00000000000000define CARD_VERIFIABLE_CERTIFICATES load_on request cvc_ado.h cvc_cert.h cvc_gen_cert.h cvc_req.h cvc_self.h eac_asn_obj.h eac_obj.h ecdsa_sig.h signed_obj.h asn1_eac_str.cpp asn1_eac_tm.cpp ecdsa_sig.cpp cvc_ado.cpp cvc_cert.cpp cvc_req.cpp cvc_self.cpp signed_obj.cpp asn1 bigint ecdsa filters libstate oid_lookup pem pubkey Botan-1.10.12/src/cert/cvc/signed_obj.cpp0000664000175000017500000000374112654331322017677 0ustar jackjack00000000000000/* * EAC SIGNED Object * (C) 1999-2010 Jack Lloyd * 2007 FlexSecure GmbH * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Return a BER encoded X.509 object */ SecureVector EAC_Signed_Object::BER_encode() const { Pipe ber; ber.start_msg(); encode(ber, RAW_BER); ber.end_msg(); return ber.read_all(); } /* * Return a PEM encoded X.509 object */ std::string EAC_Signed_Object::PEM_encode() const { Pipe pem; pem.start_msg(); encode(pem, PEM); pem.end_msg(); return pem.read_all_as_string(); } /* * Return the algorithm used to sign this object */ AlgorithmIdentifier EAC_Signed_Object::signature_algorithm() const { return sig_algo; } bool EAC_Signed_Object::check_signature(Public_Key& pub_key, const MemoryRegion& sig) const { try { std::vector sig_info = split_on(OIDS::lookup(sig_algo.oid), '/'); if(sig_info.size() != 2 || sig_info[0] != pub_key.algo_name()) { return false; } std::string padding = sig_info[1]; Signature_Format format = (pub_key.message_parts() >= 2) ? DER_SEQUENCE : IEEE_1363; SecureVector to_sign = tbs_data(); PK_Verifier verifier(pub_key, padding, format); return verifier.verify_message(to_sign, sig); } catch(...) { return false; } } /* * Try to decode the actual information */ void EAC_Signed_Object::do_decode() { try { force_decode(); } catch(Decoding_Error& e) { const std::string what = e.what(); throw Decoding_Error(PEM_label_pref + " decoding failed (" + what + ")"); } catch(Invalid_Argument& e) { const std::string what = e.what(); throw Decoding_Error(PEM_label_pref + " decoding failed (" + what + ")"); } } } Botan-1.10.12/src/cert/cvc/signed_obj.h0000664000175000017500000000507412654331322017345 0ustar jackjack00000000000000/* * EAC SIGNED Object * (C) 2007 FlexSecure GmbH * 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EAC_SIGNED_OBJECT_H__ #define BOTAN_EAC_SIGNED_OBJECT_H__ #include #include #include #include namespace Botan { /** * This class represents abstract signed EAC object */ class BOTAN_DLL EAC_Signed_Object { public: /** * Get the TBS (to-be-signed) data in this object. * @return DER encoded TBS data of this object */ virtual SecureVector tbs_data() const = 0; /** * Get the signature of this object as a concatenation, i.e. if the * signature consists of multiple parts (like in the case of ECDSA) * these will be concatenated. * @return signature as a concatenation of its parts */ /* NOTE: this is here only because abstract signature objects have not yet been introduced */ virtual SecureVector get_concat_sig() const = 0; /** * Get the signature algorithm identifier used to sign this object. * @result the signature algorithm identifier */ AlgorithmIdentifier signature_algorithm() const; /** * Check the signature of this object. * @param key the public key associated with this signed object * @param sig the signature we are checking * @return true if the signature was created by the private key * associated with this public key */ bool check_signature(class Public_Key& key, const MemoryRegion& sig) const; /** * Write this object DER encoded into a specified pipe. * @param pipe the pipe to write the encoded object to * @param encoding the encoding type to use */ virtual void encode(Pipe& pipe, X509_Encoding encoding = PEM) const = 0; /** * BER encode this object. * @return result containing the BER representation of this object. */ SecureVector BER_encode() const; /** * PEM encode this object. * @return result containing the PEM representation of this object. */ std::string PEM_encode() const; virtual ~EAC_Signed_Object() {} protected: void do_decode(); EAC_Signed_Object() {} AlgorithmIdentifier sig_algo; SecureVector tbs_bits; std::string PEM_label_pref; std::vector PEM_labels_allowed; private: virtual void force_decode() = 0; }; } #endif Botan-1.10.12/src/cert/pkcs10/info.txt0000664000175000017500000000007512654331322017107 0ustar jackjack00000000000000define PKCS10_REQUESTS asn1 x509cert Botan-1.10.12/src/cert/pkcs10/pkcs10.cpp0000664000175000017500000001137612654331322017226 0ustar jackjack00000000000000/* * PKCS #10 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include namespace Botan { /* * PKCS10_Request Constructor */ PKCS10_Request::PKCS10_Request(DataSource& in) : X509_Object(in, "CERTIFICATE REQUEST/NEW CERTIFICATE REQUEST") { do_decode(); } /* * PKCS10_Request Constructor */ PKCS10_Request::PKCS10_Request(const std::string& in) : X509_Object(in, "CERTIFICATE REQUEST/NEW CERTIFICATE REQUEST") { do_decode(); } /* * Deocde the CertificateRequestInfo */ void PKCS10_Request::force_decode() { BER_Decoder cert_req_info(tbs_bits); size_t version; cert_req_info.decode(version); if(version != 0) throw Decoding_Error("Unknown version code in PKCS #10 request: " + to_string(version)); X509_DN dn_subject; cert_req_info.decode(dn_subject); info.add(dn_subject.contents()); BER_Object public_key = cert_req_info.get_next_object(); if(public_key.type_tag != SEQUENCE || public_key.class_tag != CONSTRUCTED) throw BER_Bad_Tag("PKCS10_Request: Unexpected tag for public key", public_key.type_tag, public_key.class_tag); info.add("X509.Certificate.public_key", PEM_Code::encode( ASN1::put_in_sequence(public_key.value), "PUBLIC KEY" ) ); BER_Object attr_bits = cert_req_info.get_next_object(); if(attr_bits.type_tag == 0 && attr_bits.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { BER_Decoder attributes(attr_bits.value); while(attributes.more_items()) { Attribute attr; attributes.decode(attr); handle_attribute(attr); } attributes.verify_end(); } else if(attr_bits.type_tag != NO_OBJECT) throw BER_Bad_Tag("PKCS10_Request: Unexpected tag for attributes", attr_bits.type_tag, attr_bits.class_tag); cert_req_info.verify_end(); if(!this->check_signature(subject_public_key())) throw Decoding_Error("PKCS #10 request: Bad signature detected"); } /* * Handle attributes in a PKCS #10 request */ void PKCS10_Request::handle_attribute(const Attribute& attr) { BER_Decoder value(attr.parameters); if(attr.oid == OIDS::lookup("PKCS9.EmailAddress")) { ASN1_String email; value.decode(email); info.add("RFC822", email.value()); } else if(attr.oid == OIDS::lookup("PKCS9.ChallengePassword")) { ASN1_String challenge_password; value.decode(challenge_password); info.add("PKCS9.ChallengePassword", challenge_password.value()); } else if(attr.oid == OIDS::lookup("PKCS9.ExtensionRequest")) { Extensions extensions; value.decode(extensions).verify_end(); Data_Store issuer_info; extensions.contents_to(info, issuer_info); } } /* * Return the challenge password (if any) */ std::string PKCS10_Request::challenge_password() const { return info.get1("PKCS9.ChallengePassword"); } /* * Return the name of the requestor */ X509_DN PKCS10_Request::subject_dn() const { return create_dn(info); } /* * Return the public key of the requestor */ MemoryVector PKCS10_Request::raw_public_key() const { DataSource_Memory source(info.get1("X509.Certificate.public_key")); return PEM_Code::decode_check_label(source, "PUBLIC KEY"); } /* * Return the public key of the requestor */ Public_Key* PKCS10_Request::subject_public_key() const { DataSource_Memory source(info.get1("X509.Certificate.public_key")); return X509::load_key(source); } /* * Return the alternative names of the requestor */ AlternativeName PKCS10_Request::subject_alt_name() const { return create_alt_name(info); } /* * Return the key constraints (if any) */ Key_Constraints PKCS10_Request::constraints() const { return Key_Constraints(info.get1_u32bit("X509v3.KeyUsage", NO_CONSTRAINTS)); } /* * Return the extendend key constraints (if any) */ std::vector PKCS10_Request::ex_constraints() const { std::vector oids = info.get("X509v3.ExtendedKeyUsage"); std::vector result; for(size_t i = 0; i != oids.size(); ++i) result.push_back(OID(oids[i])); return result; } /* * Return is a CA certificate is requested */ bool PKCS10_Request::is_CA() const { return (info.get1_u32bit("X509v3.BasicConstraints.is_ca") > 0); } /* * Return the desired path limit (if any) */ u32bit PKCS10_Request::path_limit() const { return info.get1_u32bit("X509v3.BasicConstraints.path_constraint", 0); } } Botan-1.10.12/src/cert/pkcs10/pkcs10.h0000664000175000017500000000443612654331322016672 0ustar jackjack00000000000000/* * PKCS #10 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PKCS10_H__ #define BOTAN_PKCS10_H__ #include #include #include #include #include namespace Botan { /** * PKCS #10 Certificate Request. */ class BOTAN_DLL PKCS10_Request : public X509_Object { public: /** * Get the subject public key. * @return subject public key */ Public_Key* subject_public_key() const; /** * Get the raw DER encoded public key. * @return raw DER encoded public key */ MemoryVector raw_public_key() const; /** * Get the subject DN. * @return subject DN */ X509_DN subject_dn() const; /** * Get the subject alternative name. * @return subject alternative name. */ AlternativeName subject_alt_name() const; /** * Get the key constraints for the key associated with this * PKCS#10 object. * @return key constraints */ Key_Constraints constraints() const; /** * Get the extendend key constraints (if any). * @return extended key constraints */ std::vector ex_constraints() const; /** * Find out whether this is a CA request. * @result true if it is a CA request, false otherwise. */ bool is_CA() const; /** * Return the constraint on the path length defined * in the BasicConstraints extension. * @return path limit */ u32bit path_limit() const; /** * Get the challenge password for this request * @return challenge password for this request */ std::string challenge_password() const; /** * Create a PKCS#10 Request from a data source. * @param source the data source providing the DER encoded request */ PKCS10_Request(DataSource& source); /** * Create a PKCS#10 Request from a file. * @param filename the name of the file containing the DER or PEM * encoded request file */ PKCS10_Request(const std::string& filename); private: void force_decode(); void handle_attribute(const Attribute&); Data_Store info; }; } #endif Botan-1.10.12/src/cert/x509ca/info.txt0000664000175000017500000000006712654331322017020 0ustar jackjack00000000000000define X509_CA pkcs10 x509cert Botan-1.10.12/src/cert/x509ca/x509_ca.cpp0000664000175000017500000001577312654331322017212 0ustar jackjack00000000000000/* * X.509 Certificate Authority * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { /* * Load the certificate and private key */ X509_CA::X509_CA(const X509_Certificate& c, const Private_Key& key, const std::string& hash_fn) : cert(c) { if(!cert.is_CA_cert()) throw Invalid_Argument("X509_CA: This certificate is not for a CA"); signer = choose_sig_format(key, hash_fn, ca_sig_algo); } /* * X509_CA Destructor */ X509_CA::~X509_CA() { delete signer; } /* * Sign a PKCS #10 certificate request */ X509_Certificate X509_CA::sign_request(const PKCS10_Request& req, RandomNumberGenerator& rng, const X509_Time& not_before, const X509_Time& not_after) { Key_Constraints constraints; if(req.is_CA()) constraints = Key_Constraints(KEY_CERT_SIGN | CRL_SIGN); else { std::auto_ptr key(req.subject_public_key()); constraints = X509::find_constraints(*key, req.constraints()); } Extensions extensions; extensions.add( new Cert_Extension::Basic_Constraints(req.is_CA(), req.path_limit()), true); extensions.add(new Cert_Extension::Key_Usage(constraints), true); extensions.add(new Cert_Extension::Authority_Key_ID(cert.subject_key_id())); extensions.add(new Cert_Extension::Subject_Key_ID(req.raw_public_key())); extensions.add( new Cert_Extension::Subject_Alternative_Name(req.subject_alt_name())); extensions.add( new Cert_Extension::Extended_Key_Usage(req.ex_constraints())); return make_cert(signer, rng, ca_sig_algo, req.raw_public_key(), not_before, not_after, cert.subject_dn(), req.subject_dn(), extensions); } /* * Create a new certificate */ X509_Certificate X509_CA::make_cert(PK_Signer* signer, RandomNumberGenerator& rng, const AlgorithmIdentifier& sig_algo, const MemoryRegion& pub_key, const X509_Time& not_before, const X509_Time& not_after, const X509_DN& issuer_dn, const X509_DN& subject_dn, const Extensions& extensions) { const size_t X509_CERT_VERSION = 3; const size_t SERIAL_BITS = 128; BigInt serial_no(rng, SERIAL_BITS); DataSource_Memory source(X509_Object::make_signed(signer, rng, sig_algo, DER_Encoder().start_cons(SEQUENCE) .start_explicit(0) .encode(X509_CERT_VERSION-1) .end_explicit() .encode(serial_no) .encode(sig_algo) .encode(issuer_dn) .start_cons(SEQUENCE) .encode(not_before) .encode(not_after) .end_cons() .encode(subject_dn) .raw_bytes(pub_key) .start_explicit(3) .start_cons(SEQUENCE) .encode(extensions) .end_cons() .end_explicit() .end_cons() .get_contents() )); return X509_Certificate(source); } /* * Create a new, empty CRL */ X509_CRL X509_CA::new_crl(RandomNumberGenerator& rng, u32bit next_update) const { std::vector empty; return make_crl(empty, 1, next_update, rng); } /* * Update a CRL with new entries */ X509_CRL X509_CA::update_crl(const X509_CRL& crl, const std::vector& new_revoked, RandomNumberGenerator& rng, u32bit next_update) const { std::vector revoked = crl.get_revoked(); std::copy(new_revoked.begin(), new_revoked.end(), std::back_inserter(revoked)); return make_crl(revoked, crl.crl_number() + 1, next_update, rng); } /* * Create a CRL */ X509_CRL X509_CA::make_crl(const std::vector& revoked, u32bit crl_number, u32bit next_update, RandomNumberGenerator& rng) const { const size_t X509_CRL_VERSION = 2; if(next_update == 0) next_update = timespec_to_u32bit("7d"); // Totally stupid: ties encoding logic to the return of std::time!! const u64bit current_time = system_time(); Extensions extensions; extensions.add( new Cert_Extension::Authority_Key_ID(cert.subject_key_id())); extensions.add(new Cert_Extension::CRL_Number(crl_number)); DataSource_Memory source(X509_Object::make_signed(signer, rng, ca_sig_algo, DER_Encoder().start_cons(SEQUENCE) .encode(X509_CRL_VERSION-1) .encode(ca_sig_algo) .encode(cert.issuer_dn()) .encode(X509_Time(current_time)) .encode(X509_Time(current_time + next_update)) .encode_if(revoked.size() > 0, DER_Encoder() .start_cons(SEQUENCE) .encode_list(revoked) .end_cons() ) .start_explicit(0) .start_cons(SEQUENCE) .encode(extensions) .end_cons() .end_explicit() .end_cons() .get_contents() )); return X509_CRL(source); } /* * Return the CA's certificate */ X509_Certificate X509_CA::ca_certificate() const { return cert; } /* * Choose a signing format for the key */ PK_Signer* choose_sig_format(const Private_Key& key, const std::string& hash_fn, AlgorithmIdentifier& sig_algo) { std::string padding; const std::string algo_name = key.algo_name(); const HashFunction* proto_hash = retrieve_hash(hash_fn); if(!proto_hash) throw Algorithm_Not_Found(hash_fn); if(key.max_input_bits() < proto_hash->output_length()*8) throw Invalid_Argument("Key is too small for chosen hash function"); if(algo_name == "RSA") padding = "EMSA3"; else if(algo_name == "DSA") padding = "EMSA1"; else if(algo_name == "ECDSA") padding = "EMSA1_BSI"; else throw Invalid_Argument("Unknown X.509 signing key type: " + algo_name); Signature_Format format = (key.message_parts() > 1) ? DER_SEQUENCE : IEEE_1363; padding = padding + '(' + proto_hash->name() + ')'; sig_algo.oid = OIDS::lookup(algo_name + "/" + padding); sig_algo.parameters = key.algorithm_identifier().parameters; return new PK_Signer(key, padding, format); } } Botan-1.10.12/src/cert/x509ca/x509_ca.h0000664000175000017500000001100512654331322016637 0ustar jackjack00000000000000/* * X.509 Certificate Authority * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X509_CA_H__ #define BOTAN_X509_CA_H__ #include #include #include #include #include #include namespace Botan { /** * This class represents X.509 Certificate Authorities (CAs). */ class BOTAN_DLL X509_CA { public: /** * Sign a PKCS#10 Request. * @param req the request to sign * @param rng the rng to use * @param not_before the starting time for the certificate * @param not_after the expiration time for the certificate * @return resulting certificate */ X509_Certificate sign_request(const PKCS10_Request& req, RandomNumberGenerator& rng, const X509_Time& not_before, const X509_Time& not_after); /** * Get the certificate of this CA. * @return CA certificate */ X509_Certificate ca_certificate() const; /** * Create a new and empty CRL for this CA. * @param rng the random number generator to use * @param next_update the time to set in next update in seconds * as the offset from the current time * @return new CRL */ X509_CRL new_crl(RandomNumberGenerator& rng, u32bit next_update = 0) const; /** * Create a new CRL by with additional entries. * @param last_crl the last CRL of this CA to add the new entries to * @param new_entries contains the new CRL entries to be added to the CRL * @param rng the random number generator to use * @param next_update the time to set in next update in seconds * as the offset from the current time */ X509_CRL update_crl(const X509_CRL& last_crl, const std::vector& new_entries, RandomNumberGenerator& rng, u32bit next_update = 0) const; /** * Interface for creating new certificates * @param signer a signing object * @param rng a random number generator * @param sig_algo the signature algorithm identifier * @param pub_key the serialized public key * @param not_before the start time of the certificate * @param not_after the end time of the certificate * @param issuer_dn the DN of the issuer * @param subject_dn the DN of the subject * @param extensions an optional list of certificate extensions * @returns newly minted certificate */ static X509_Certificate make_cert(PK_Signer* signer, RandomNumberGenerator& rng, const AlgorithmIdentifier& sig_algo, const MemoryRegion& pub_key, const X509_Time& not_before, const X509_Time& not_after, const X509_DN& issuer_dn, const X509_DN& subject_dn, const Extensions& extensions); /** * Create a new CA object. * @param ca_certificate the certificate of the CA * @param key the private key of the CA * @param hash_fn name of a hash function to use for signing */ X509_CA(const X509_Certificate& ca_certificate, const Private_Key& key, const std::string& hash_fn); ~X509_CA(); private: X509_CA(const X509_CA&) {} X509_CA& operator=(const X509_CA&) { return (*this); } X509_CRL make_crl(const std::vector& entries, u32bit crl_number, u32bit next_update, RandomNumberGenerator& rng) const; AlgorithmIdentifier ca_sig_algo; X509_Certificate cert; PK_Signer* signer; }; /** * Choose the default signature format for a certain public key signature * scheme. * @param key will be the key to choose a padding scheme for * @param hash_fn is the desired hash function * @param alg_id will be set to the chosen scheme * @return A PK_Signer object for generating signatures */ BOTAN_DLL PK_Signer* choose_sig_format(const Private_Key& key, const std::string& hash_fn, AlgorithmIdentifier& alg_id); } #endif Botan-1.10.12/src/cert/x509cert/info.txt0000664000175000017500000000010412654331322017362 0ustar jackjack00000000000000define X509_CERTIFICATES certstore datastor Botan-1.10.12/src/cert/x509cert/x509_ext.cpp0000664000175000017500000003251012654331322017765 0ustar jackjack00000000000000/* * X.509 Certificate Extensions * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include namespace Botan { /* * List of X.509 Certificate Extensions */ Certificate_Extension* Extensions::get_extension(const OID& oid) { #define X509_EXTENSION(NAME, TYPE) \ if(OIDS::name_of(oid, NAME)) \ return new Cert_Extension::TYPE(); X509_EXTENSION("X509v3.KeyUsage", Key_Usage); X509_EXTENSION("X509v3.BasicConstraints", Basic_Constraints); X509_EXTENSION("X509v3.SubjectKeyIdentifier", Subject_Key_ID); X509_EXTENSION("X509v3.AuthorityKeyIdentifier", Authority_Key_ID); X509_EXTENSION("X509v3.ExtendedKeyUsage", Extended_Key_Usage); X509_EXTENSION("X509v3.IssuerAlternativeName", Issuer_Alternative_Name); X509_EXTENSION("X509v3.SubjectAlternativeName", Subject_Alternative_Name); X509_EXTENSION("X509v3.CRLNumber", CRL_Number); X509_EXTENSION("X509v3.CertificatePolicies", Certificate_Policies); X509_EXTENSION("X509v3.ReasonCode", CRL_ReasonCode); return 0; } /* * Extensions Copy Constructor */ Extensions::Extensions(const Extensions& extensions) : ASN1_Object() { *this = extensions; } /* * Extensions Assignment Operator */ Extensions& Extensions::operator=(const Extensions& other) { for(size_t i = 0; i != extensions.size(); ++i) delete extensions[i].first; extensions.clear(); for(size_t i = 0; i != other.extensions.size(); ++i) extensions.push_back( std::make_pair(other.extensions[i].first->copy(), other.extensions[i].second)); should_throw = other.should_throw; return (*this); } /* * Return the OID of this extension */ OID Certificate_Extension::oid_of() const { return OIDS::lookup(oid_name()); } void Extensions::add(Certificate_Extension* extn, bool critical) { extensions.push_back(std::make_pair(extn, critical)); } /* * Encode an Extensions list */ void Extensions::encode_into(DER_Encoder& to_object) const { for(size_t i = 0; i != extensions.size(); ++i) { const Certificate_Extension* ext = extensions[i].first; const bool is_critical = extensions[i].second; const bool should_encode = ext->should_encode(); if(should_encode) { to_object.start_cons(SEQUENCE) .encode(ext->oid_of()) .encode_optional(is_critical, false) .encode(ext->encode_inner(), OCTET_STRING) .end_cons(); } } } /* * Decode a list of Extensions */ void Extensions::decode_from(BER_Decoder& from_source) { for(size_t i = 0; i != extensions.size(); ++i) delete extensions[i].first; extensions.clear(); BER_Decoder sequence = from_source.start_cons(SEQUENCE); while(sequence.more_items()) { OID oid; MemoryVector value; bool critical; sequence.start_cons(SEQUENCE) .decode(oid) .decode_optional(critical, BOOLEAN, UNIVERSAL, false) .decode(value, OCTET_STRING) .verify_end() .end_cons(); Certificate_Extension* ext = get_extension(oid); if(!ext) { if(!critical || !should_throw) continue; throw Decoding_Error("Encountered unknown X.509 extension marked " "as critical; OID = " + oid.as_string()); } ext->decode_inner(value); extensions.push_back(std::make_pair(ext, critical)); } sequence.verify_end(); } /* * Write the extensions to an info store */ void Extensions::contents_to(Data_Store& subject_info, Data_Store& issuer_info) const { for(size_t i = 0; i != extensions.size(); ++i) extensions[i].first->contents_to(subject_info, issuer_info); } /* * Delete an Extensions list */ Extensions::~Extensions() { for(size_t i = 0; i != extensions.size(); ++i) delete extensions[i].first; } namespace Cert_Extension { /* * Checked accessor for the path_limit member */ size_t Basic_Constraints::get_path_limit() const { if(!is_ca) throw Invalid_State("Basic_Constraints::get_path_limit: Not a CA"); return path_limit; } /* * Encode the extension */ MemoryVector Basic_Constraints::encode_inner() const { return DER_Encoder() .start_cons(SEQUENCE) .encode_if(is_ca, DER_Encoder() .encode(is_ca) .encode_optional(path_limit, NO_CERT_PATH_LIMIT) ) .end_cons() .get_contents(); } /* * Decode the extension */ void Basic_Constraints::decode_inner(const MemoryRegion& in) { BER_Decoder(in) .start_cons(SEQUENCE) .decode_optional(is_ca, BOOLEAN, UNIVERSAL, false) .decode_optional(path_limit, INTEGER, UNIVERSAL, NO_CERT_PATH_LIMIT) .verify_end() .end_cons(); if(is_ca == false) path_limit = 0; } /* * Return a textual representation */ void Basic_Constraints::contents_to(Data_Store& subject, Data_Store&) const { subject.add("X509v3.BasicConstraints.is_ca", (is_ca ? 1 : 0)); subject.add("X509v3.BasicConstraints.path_constraint", path_limit); } /* * Encode the extension */ MemoryVector Key_Usage::encode_inner() const { if(constraints == NO_CONSTRAINTS) throw Encoding_Error("Cannot encode zero usage constraints"); const size_t unused_bits = low_bit(constraints) - 1; MemoryVector der; der.push_back(BIT_STRING); der.push_back(2 + ((unused_bits < 8) ? 1 : 0)); der.push_back(unused_bits % 8); der.push_back((constraints >> 8) & 0xFF); if(constraints & 0xFF) der.push_back(constraints & 0xFF); return der; } /* * Decode the extension */ void Key_Usage::decode_inner(const MemoryRegion& in) { BER_Decoder ber(in); BER_Object obj = ber.get_next_object(); if(obj.type_tag != BIT_STRING || obj.class_tag != UNIVERSAL) throw BER_Bad_Tag("Bad tag for usage constraint", obj.type_tag, obj.class_tag); if(obj.value.size() != 2 && obj.value.size() != 3) throw BER_Decoding_Error("Bad size for BITSTRING in usage constraint"); if(obj.value[0] >= 8) throw BER_Decoding_Error("Invalid unused bits in usage constraint"); obj.value[obj.value.size()-1] &= (0xFF << obj.value[0]); u16bit usage = 0; for(size_t i = 1; i != obj.value.size(); ++i) usage = (obj.value[i] << 8) | usage; constraints = Key_Constraints(usage); } /* * Return a textual representation */ void Key_Usage::contents_to(Data_Store& subject, Data_Store&) const { subject.add("X509v3.KeyUsage", constraints); } /* * Encode the extension */ MemoryVector Subject_Key_ID::encode_inner() const { return DER_Encoder().encode(key_id, OCTET_STRING).get_contents(); } /* * Decode the extension */ void Subject_Key_ID::decode_inner(const MemoryRegion& in) { BER_Decoder(in).decode(key_id, OCTET_STRING).verify_end(); } /* * Return a textual representation */ void Subject_Key_ID::contents_to(Data_Store& subject, Data_Store&) const { subject.add("X509v3.SubjectKeyIdentifier", key_id); } /* * Subject_Key_ID Constructor */ Subject_Key_ID::Subject_Key_ID(const MemoryRegion& pub_key) { SHA_160 hash; key_id = hash.process(pub_key); } /* * Encode the extension */ MemoryVector Authority_Key_ID::encode_inner() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(key_id, OCTET_STRING, ASN1_Tag(0), CONTEXT_SPECIFIC) .end_cons() .get_contents(); } /* * Decode the extension */ void Authority_Key_ID::decode_inner(const MemoryRegion& in) { BER_Decoder(in) .start_cons(SEQUENCE) .decode_optional_string(key_id, OCTET_STRING, 0); } /* * Return a textual representation */ void Authority_Key_ID::contents_to(Data_Store&, Data_Store& issuer) const { if(key_id.size()) issuer.add("X509v3.AuthorityKeyIdentifier", key_id); } /* * Encode the extension */ MemoryVector Alternative_Name::encode_inner() const { return DER_Encoder().encode(alt_name).get_contents(); } /* * Decode the extension */ void Alternative_Name::decode_inner(const MemoryRegion& in) { BER_Decoder(in).decode(alt_name); } /* * Return a textual representation */ void Alternative_Name::contents_to(Data_Store& subject_info, Data_Store& issuer_info) const { std::multimap contents = get_alt_name().contents(); if(oid_name_str == "X509v3.SubjectAlternativeName") subject_info.add(contents); else if(oid_name_str == "X509v3.IssuerAlternativeName") issuer_info.add(contents); else throw Internal_Error("In Alternative_Name, unknown type " + oid_name_str); } /* * Alternative_Name Constructor */ Alternative_Name::Alternative_Name(const AlternativeName& alt_name, const std::string& oid_name_str, const std::string& config_name_str) { this->alt_name = alt_name; this->oid_name_str = oid_name_str; this->config_name_str = config_name_str; } /* * Subject_Alternative_Name Constructor */ Subject_Alternative_Name::Subject_Alternative_Name( const AlternativeName& name) : Alternative_Name(name, "X509v3.SubjectAlternativeName", "subject_alternative_name") { } /* * Issuer_Alternative_Name Constructor */ Issuer_Alternative_Name::Issuer_Alternative_Name(const AlternativeName& name) : Alternative_Name(name, "X509v3.IssuerAlternativeName", "issuer_alternative_name") { } /* * Encode the extension */ MemoryVector Extended_Key_Usage::encode_inner() const { return DER_Encoder() .start_cons(SEQUENCE) .encode_list(oids) .end_cons() .get_contents(); } /* * Decode the extension */ void Extended_Key_Usage::decode_inner(const MemoryRegion& in) { BER_Decoder(in) .start_cons(SEQUENCE) .decode_list(oids) .end_cons(); } /* * Return a textual representation */ void Extended_Key_Usage::contents_to(Data_Store& subject, Data_Store&) const { for(size_t i = 0; i != oids.size(); ++i) subject.add("X509v3.ExtendedKeyUsage", oids[i].as_string()); } namespace { /* * A policy specifier */ class Policy_Information : public ASN1_Object { public: OID oid; Policy_Information() {} Policy_Information(const OID& oid) : oid(oid) {} void encode_into(DER_Encoder& codec) const { codec.start_cons(SEQUENCE) .encode(oid) .end_cons(); } void decode_from(BER_Decoder& codec) { codec.start_cons(SEQUENCE) .decode(oid) .discard_remaining() .end_cons(); } }; } /* * Encode the extension */ MemoryVector Certificate_Policies::encode_inner() const { std::vector policies; for(size_t i = 0; i != oids.size(); ++i) policies.push_back(oids[i]); return DER_Encoder() .start_cons(SEQUENCE) .encode_list(policies) .end_cons() .get_contents(); } /* * Decode the extension */ void Certificate_Policies::decode_inner(const MemoryRegion& in) { std::vector policies; BER_Decoder(in) .start_cons(SEQUENCE) .decode_list(policies) .end_cons(); oids.clear(); for(size_t i = 0; i != policies.size(); ++i) oids.push_back(policies[i].oid); } /* * Return a textual representation */ void Certificate_Policies::contents_to(Data_Store& info, Data_Store&) const { for(size_t i = 0; i != oids.size(); ++i) info.add("X509v3.ExtendedKeyUsage", oids[i].as_string()); } /* * Checked accessor for the crl_number member */ size_t CRL_Number::get_crl_number() const { if(!has_value) throw Invalid_State("CRL_Number::get_crl_number: Not set"); return crl_number; } /* * Copy a CRL_Number extension */ CRL_Number* CRL_Number::copy() const { if(!has_value) throw Invalid_State("CRL_Number::copy: Not set"); return new CRL_Number(crl_number); } /* * Encode the extension */ MemoryVector CRL_Number::encode_inner() const { return DER_Encoder().encode(crl_number).get_contents(); } /* * Decode the extension */ void CRL_Number::decode_inner(const MemoryRegion& in) { BER_Decoder(in).decode(crl_number); } /* * Return a textual representation */ void CRL_Number::contents_to(Data_Store& info, Data_Store&) const { info.add("X509v3.CRLNumber", crl_number); } /* * Encode the extension */ MemoryVector CRL_ReasonCode::encode_inner() const { return DER_Encoder() .encode(static_cast(reason), ENUMERATED, UNIVERSAL) .get_contents(); } /* * Decode the extension */ void CRL_ReasonCode::decode_inner(const MemoryRegion& in) { size_t reason_code = 0; BER_Decoder(in).decode(reason_code, ENUMERATED, UNIVERSAL); reason = static_cast(reason_code); } /* * Return a textual representation */ void CRL_ReasonCode::contents_to(Data_Store& info, Data_Store&) const { info.add("X509v3.CRLReasonCode", reason); } } } Botan-1.10.12/src/cert/x509cert/x509_ext.h0000664000175000017500000002275212654331322017441 0ustar jackjack00000000000000/* * X.509 Certificate Extensions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X509_EXTENSIONS_H__ #define BOTAN_X509_EXTENSIONS_H__ #include #include #include #include #include namespace Botan { /** * X.509 Certificate Extension */ class BOTAN_DLL Certificate_Extension { public: /** * @return OID representing this extension */ OID oid_of() const; /** * Make a copy of this extension * @return copy of this */ virtual Certificate_Extension* copy() const = 0; /* * Add the contents of this extension into the information * for the subject and/or issuer, as necessary. * @param subject the subject info * @param issuer the issuer info */ virtual void contents_to(Data_Store& subject, Data_Store& issuer) const = 0; /* * @return short readable name */ virtual std::string config_id() const = 0; /* * @return specific OID name */ virtual std::string oid_name() const = 0; virtual ~Certificate_Extension() {} protected: friend class Extensions; virtual bool should_encode() const { return true; } virtual MemoryVector encode_inner() const = 0; virtual void decode_inner(const MemoryRegion&) = 0; }; /** * X.509 Certificate Extension List */ class BOTAN_DLL Extensions : public ASN1_Object { public: void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); void contents_to(Data_Store&, Data_Store&) const; void add(Certificate_Extension* extn, bool critical = false); Extensions& operator=(const Extensions&); Extensions(const Extensions&); Extensions(bool st = true) : should_throw(st) {} ~Extensions(); private: static Certificate_Extension* get_extension(const OID&); std::vector > extensions; bool should_throw; }; namespace Cert_Extension { static const size_t NO_CERT_PATH_LIMIT = 0xFFFFFFF0; /** * Basic Constraints Extension */ class BOTAN_DLL Basic_Constraints : public Certificate_Extension { public: Basic_Constraints* copy() const { return new Basic_Constraints(is_ca, path_limit); } Basic_Constraints(bool ca = false, size_t limit = 0) : is_ca(ca), path_limit(limit) {} bool get_is_ca() const { return is_ca; } size_t get_path_limit() const; private: std::string config_id() const { return "basic_constraints"; } std::string oid_name() const { return "X509v3.BasicConstraints"; } MemoryVector encode_inner() const; void decode_inner(const MemoryRegion&); void contents_to(Data_Store&, Data_Store&) const; bool is_ca; size_t path_limit; }; /** * Key Usage Constraints Extension */ class BOTAN_DLL Key_Usage : public Certificate_Extension { public: Key_Usage* copy() const { return new Key_Usage(constraints); } Key_Usage(Key_Constraints c = NO_CONSTRAINTS) : constraints(c) {} Key_Constraints get_constraints() const { return constraints; } private: std::string config_id() const { return "key_usage"; } std::string oid_name() const { return "X509v3.KeyUsage"; } bool should_encode() const { return (constraints != NO_CONSTRAINTS); } MemoryVector encode_inner() const; void decode_inner(const MemoryRegion&); void contents_to(Data_Store&, Data_Store&) const; Key_Constraints constraints; }; /** * Subject Key Identifier Extension */ class BOTAN_DLL Subject_Key_ID : public Certificate_Extension { public: Subject_Key_ID* copy() const { return new Subject_Key_ID(key_id); } Subject_Key_ID() {} Subject_Key_ID(const MemoryRegion&); MemoryVector get_key_id() const { return key_id; } private: std::string config_id() const { return "subject_key_id"; } std::string oid_name() const { return "X509v3.SubjectKeyIdentifier"; } bool should_encode() const { return (key_id.size() > 0); } MemoryVector encode_inner() const; void decode_inner(const MemoryRegion&); void contents_to(Data_Store&, Data_Store&) const; MemoryVector key_id; }; /** * Authority Key Identifier Extension */ class BOTAN_DLL Authority_Key_ID : public Certificate_Extension { public: Authority_Key_ID* copy() const { return new Authority_Key_ID(key_id); } Authority_Key_ID() {} Authority_Key_ID(const MemoryRegion& k) : key_id(k) {} MemoryVector get_key_id() const { return key_id; } private: std::string config_id() const { return "authority_key_id"; } std::string oid_name() const { return "X509v3.AuthorityKeyIdentifier"; } bool should_encode() const { return (key_id.size() > 0); } MemoryVector encode_inner() const; void decode_inner(const MemoryRegion&); void contents_to(Data_Store&, Data_Store&) const; MemoryVector key_id; }; /** * Alternative Name Extension Base Class */ class BOTAN_DLL Alternative_Name : public Certificate_Extension { public: AlternativeName get_alt_name() const { return alt_name; } protected: Alternative_Name(const AlternativeName&, const std::string&, const std::string&); Alternative_Name(const std::string&, const std::string&); private: std::string config_id() const { return config_name_str; } std::string oid_name() const { return oid_name_str; } bool should_encode() const { return alt_name.has_items(); } MemoryVector encode_inner() const; void decode_inner(const MemoryRegion&); void contents_to(Data_Store&, Data_Store&) const; std::string config_name_str, oid_name_str; AlternativeName alt_name; }; /** * Subject Alternative Name Extension */ class BOTAN_DLL Subject_Alternative_Name : public Alternative_Name { public: Subject_Alternative_Name* copy() const { return new Subject_Alternative_Name(get_alt_name()); } Subject_Alternative_Name(const AlternativeName& = AlternativeName()); }; /** * Issuer Alternative Name Extension */ class BOTAN_DLL Issuer_Alternative_Name : public Alternative_Name { public: Issuer_Alternative_Name* copy() const { return new Issuer_Alternative_Name(get_alt_name()); } Issuer_Alternative_Name(const AlternativeName& = AlternativeName()); }; /** * Extended Key Usage Extension */ class BOTAN_DLL Extended_Key_Usage : public Certificate_Extension { public: Extended_Key_Usage* copy() const { return new Extended_Key_Usage(oids); } Extended_Key_Usage() {} Extended_Key_Usage(const std::vector& o) : oids(o) {} std::vector get_oids() const { return oids; } private: std::string config_id() const { return "extended_key_usage"; } std::string oid_name() const { return "X509v3.ExtendedKeyUsage"; } bool should_encode() const { return (oids.size() > 0); } MemoryVector encode_inner() const; void decode_inner(const MemoryRegion&); void contents_to(Data_Store&, Data_Store&) const; std::vector oids; }; /** * Certificate Policies Extension */ class BOTAN_DLL Certificate_Policies : public Certificate_Extension { public: Certificate_Policies* copy() const { return new Certificate_Policies(oids); } Certificate_Policies() {} Certificate_Policies(const std::vector& o) : oids(o) {} std::vector get_oids() const { return oids; } private: std::string config_id() const { return "policy_info"; } std::string oid_name() const { return "X509v3.CertificatePolicies"; } bool should_encode() const { return (oids.size() > 0); } MemoryVector encode_inner() const; void decode_inner(const MemoryRegion&); void contents_to(Data_Store&, Data_Store&) const; std::vector oids; }; /** * CRL Number Extension */ class BOTAN_DLL CRL_Number : public Certificate_Extension { public: CRL_Number* copy() const; CRL_Number() : has_value(false), crl_number(0) {} CRL_Number(size_t n) : has_value(true), crl_number(n) {} size_t get_crl_number() const; private: std::string config_id() const { return "crl_number"; } std::string oid_name() const { return "X509v3.CRLNumber"; } bool should_encode() const { return has_value; } MemoryVector encode_inner() const; void decode_inner(const MemoryRegion&); void contents_to(Data_Store&, Data_Store&) const; bool has_value; size_t crl_number; }; /** * CRL Entry Reason Code Extension */ class BOTAN_DLL CRL_ReasonCode : public Certificate_Extension { public: CRL_ReasonCode* copy() const { return new CRL_ReasonCode(reason); } CRL_ReasonCode(CRL_Code r = UNSPECIFIED) : reason(r) {} CRL_Code get_reason() const { return reason; } private: std::string config_id() const { return "crl_reason"; } std::string oid_name() const { return "X509v3.ReasonCode"; } bool should_encode() const { return (reason != UNSPECIFIED); } MemoryVector encode_inner() const; void decode_inner(const MemoryRegion&); void contents_to(Data_Store&, Data_Store&) const; CRL_Code reason; }; } } #endif Botan-1.10.12/src/cert/x509cert/x509_obj.cpp0000664000175000017500000001261212654331322017740 0ustar jackjack00000000000000/* * X.509 SIGNED Object * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include namespace Botan { /* * Create a generic X.509 object */ X509_Object::X509_Object(DataSource& stream, const std::string& labels) { init(stream, labels); } /* * Createa a generic X.509 object */ X509_Object::X509_Object(const std::string& file, const std::string& labels) { DataSource_Stream stream(file, true); init(stream, labels); } /* * Read a PEM or BER X.509 object */ void X509_Object::init(DataSource& in, const std::string& labels) { PEM_labels_allowed = split_on(labels, '/'); if(PEM_labels_allowed.size() < 1) throw Invalid_Argument("Bad labels argument to X509_Object"); PEM_label_pref = PEM_labels_allowed[0]; std::sort(PEM_labels_allowed.begin(), PEM_labels_allowed.end()); try { if(ASN1::maybe_BER(in) && !PEM_Code::matches(in)) decode_info(in); else { std::string got_label; DataSource_Memory ber(PEM_Code::decode(in, got_label)); if(!std::binary_search(PEM_labels_allowed.begin(), PEM_labels_allowed.end(), got_label)) throw Decoding_Error("Invalid PEM label: " + got_label); decode_info(ber); } } catch(Decoding_Error& e) { throw Decoding_Error(PEM_label_pref + " decoding failed: " + e.what()); } } /* * Read a BER encoded X.509 object */ void X509_Object::decode_info(DataSource& source) { BER_Decoder(source) .start_cons(SEQUENCE) .start_cons(SEQUENCE) .raw_bytes(tbs_bits) .end_cons() .decode(sig_algo) .decode(sig, BIT_STRING) .verify_end() .end_cons(); } /* * Return a BER or PEM encoded X.509 object */ void X509_Object::encode(Pipe& out, X509_Encoding encoding) const { if(encoding == PEM) out.write(this->PEM_encode()); else out.write(this->BER_encode()); } /* * Return a BER encoded X.509 object */ MemoryVector X509_Object::BER_encode() const { return DER_Encoder() .start_cons(SEQUENCE) .start_cons(SEQUENCE) .raw_bytes(tbs_bits) .end_cons() .encode(sig_algo) .encode(sig, BIT_STRING) .end_cons() .get_contents(); } /* * Return a PEM encoded X.509 object */ std::string X509_Object::PEM_encode() const { return PEM_Code::encode(BER_encode(), PEM_label_pref); } /* * Return the TBS data */ MemoryVector X509_Object::tbs_data() const { return ASN1::put_in_sequence(tbs_bits); } /* * Return the signature of this object */ MemoryVector X509_Object::signature() const { return sig; } /* * Return the algorithm used to sign this object */ AlgorithmIdentifier X509_Object::signature_algorithm() const { return sig_algo; } /* * Return the hash used in generating the signature */ std::string X509_Object::hash_used_for_signature() const { std::vector sig_info = split_on(OIDS::lookup(sig_algo.oid), '/'); if(sig_info.size() != 2) throw Internal_Error("Invalid name format found for " + sig_algo.oid.as_string()); std::vector pad_and_hash = parse_algorithm_name(sig_info[1]); if(pad_and_hash.size() != 2) throw Internal_Error("Invalid name format " + sig_info[1]); return pad_and_hash[1]; } /* * Check the signature on an object */ bool X509_Object::check_signature(Public_Key* pub_key) const { std::auto_ptr key(pub_key); return check_signature(*key); } /* * Check the signature on an object */ bool X509_Object::check_signature(Public_Key& pub_key) const { try { std::vector sig_info = split_on(OIDS::lookup(sig_algo.oid), '/'); if(sig_info.size() != 2 || sig_info[0] != pub_key.algo_name()) return false; std::string padding = sig_info[1]; Signature_Format format = (pub_key.message_parts() >= 2) ? DER_SEQUENCE : IEEE_1363; PK_Verifier verifier(pub_key, padding, format); return verifier.verify_message(tbs_data(), signature()); } catch(...) { return false; } } /* * Apply the X.509 SIGNED macro */ MemoryVector X509_Object::make_signed(PK_Signer* signer, RandomNumberGenerator& rng, const AlgorithmIdentifier& algo, const MemoryRegion& tbs_bits) { return DER_Encoder() .start_cons(SEQUENCE) .raw_bytes(tbs_bits) .encode(algo) .encode(signer->sign_message(tbs_bits, rng), BIT_STRING) .end_cons() .get_contents(); } /* * Try to decode the actual information */ void X509_Object::do_decode() { try { force_decode(); } catch(Decoding_Error& e) { throw Decoding_Error(PEM_label_pref + " decoding failed (" + e.what() + ")"); } catch(Invalid_Argument& e) { throw Decoding_Error(PEM_label_pref + " decoding failed (" + e.what() + ")"); } } } Botan-1.10.12/src/cert/x509cert/x509_obj.h0000664000175000017500000000624112654331322017406 0ustar jackjack00000000000000/* * X.509 SIGNED Object * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X509_OBJECT_H__ #define BOTAN_X509_OBJECT_H__ #include #include #include #include #include namespace Botan { /** * This class represents abstract X.509 signed objects as * in the X.500 SIGNED macro */ class BOTAN_DLL X509_Object { public: /** * The underlying data that is to be or was signed * @return data that is or was signed */ MemoryVector tbs_data() const; /** * @return signature on tbs_data() */ MemoryVector signature() const; /** * @return signature algorithm that was used to generate signature */ AlgorithmIdentifier signature_algorithm() const; /** * @return hash algorithm that was used to generate signature */ std::string hash_used_for_signature() const; /** * Create a signed X509 object. * @param signer the signer used to sign the object * @param rng the random number generator to use * @param alg_id the algorithm identifier of the signature scheme * @param tbs the tbs bits to be signed * @return signed X509 object */ static MemoryVector make_signed(class PK_Signer* signer, RandomNumberGenerator& rng, const AlgorithmIdentifier& alg_id, const MemoryRegion& tbs); /** * Check the signature on this data * @param key the public key purportedly used to sign this data * @return true if the signature is valid, otherwise false */ bool check_signature(class Public_Key& key) const; /** * Check the signature on this data * @param key the public key purportedly used to sign this data * the pointer will be deleted after use * @return true if the signature is valid, otherwise false */ bool check_signature(class Public_Key* key) const; /** * @return BER encoding of this */ MemoryVector BER_encode() const; /** * @return PEM encoding of this */ std::string PEM_encode() const; /** * Encode this to a pipe * @deprecated use BER_encode or PEM_encode instead * @param out the pipe to write to * @param encoding the encoding to use */ BOTAN_DEPRECATED("Use BER_encode or PEM_encode") void encode(Pipe& out, X509_Encoding encoding = PEM) const; virtual ~X509_Object() {} protected: X509_Object(DataSource& src, const std::string& pem_labels); X509_Object(const std::string& file, const std::string& pem_labels); void do_decode(); X509_Object() {} AlgorithmIdentifier sig_algo; MemoryVector tbs_bits, sig; private: virtual void force_decode() = 0; void init(DataSource&, const std::string&); void decode_info(DataSource&); std::vector PEM_labels_allowed; std::string PEM_label_pref; }; } #endif Botan-1.10.12/src/cert/x509cert/x509cert.cpp0000664000175000017500000003004312654331322017762 0ustar jackjack00000000000000/* * X.509 Certificates * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace { /* * Lookup each OID in the vector */ std::vector lookup_oids(const std::vector& in) { std::vector out; std::vector::const_iterator i = in.begin(); while(i != in.end()) { out.push_back(OIDS::lookup(OID(*i))); ++i; } return out; } } /* * X509_Certificate Constructor */ X509_Certificate::X509_Certificate(DataSource& in) : X509_Object(in, "CERTIFICATE/X509 CERTIFICATE") { self_signed = false; do_decode(); } /* * X509_Certificate Constructor */ X509_Certificate::X509_Certificate(const std::string& in) : X509_Object(in, "CERTIFICATE/X509 CERTIFICATE") { self_signed = false; do_decode(); } /* * Decode the TBSCertificate data */ void X509_Certificate::force_decode() { size_t version; BigInt serial_bn; AlgorithmIdentifier sig_algo_inner; X509_DN dn_issuer, dn_subject; X509_Time start, end; BER_Decoder tbs_cert(tbs_bits); tbs_cert.decode_optional(version, ASN1_Tag(0), ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) .decode(serial_bn) .decode(sig_algo_inner) .decode(dn_issuer) .start_cons(SEQUENCE) .decode(start) .decode(end) .verify_end() .end_cons() .decode(dn_subject); if(version > 2) throw Decoding_Error("Unknown X.509 cert version " + Botan::to_string(version)); if(sig_algo != sig_algo_inner) throw Decoding_Error("Algorithm identifier mismatch"); self_signed = (dn_subject == dn_issuer); subject.add(dn_subject.contents()); issuer.add(dn_issuer.contents()); BER_Object public_key = tbs_cert.get_next_object(); if(public_key.type_tag != SEQUENCE || public_key.class_tag != CONSTRUCTED) throw BER_Bad_Tag("X509_Certificate: Unexpected tag for public key", public_key.type_tag, public_key.class_tag); MemoryVector v2_issuer_key_id, v2_subject_key_id; tbs_cert.decode_optional_string(v2_issuer_key_id, BIT_STRING, 1); tbs_cert.decode_optional_string(v2_subject_key_id, BIT_STRING, 2); BER_Object v3_exts_data = tbs_cert.get_next_object(); if(v3_exts_data.type_tag == 3 && v3_exts_data.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { Extensions extensions; BER_Decoder(v3_exts_data.value).decode(extensions).verify_end(); extensions.contents_to(subject, issuer); } else if(v3_exts_data.type_tag != NO_OBJECT) throw BER_Bad_Tag("Unknown tag in X.509 cert", v3_exts_data.type_tag, v3_exts_data.class_tag); if(tbs_cert.more_items()) throw Decoding_Error("TBSCertificate has more items that expected"); subject.add("X509.Certificate.version", version); subject.add("X509.Certificate.serial", BigInt::encode(serial_bn)); subject.add("X509.Certificate.start", start.readable_string()); subject.add("X509.Certificate.end", end.readable_string()); issuer.add("X509.Certificate.v2.key_id", v2_issuer_key_id); subject.add("X509.Certificate.v2.key_id", v2_subject_key_id); subject.add("X509.Certificate.public_key", PEM_Code::encode( ASN1::put_in_sequence(public_key.value), "PUBLIC KEY" ) ); if(is_CA_cert() && !subject.has_value("X509v3.BasicConstraints.path_constraint")) { const size_t limit = (x509_version() < 3) ? Cert_Extension::NO_CERT_PATH_LIMIT : 0; subject.add("X509v3.BasicConstraints.path_constraint", limit); } } /* * Return the X.509 version in use */ u32bit X509_Certificate::x509_version() const { return (subject.get1_u32bit("X509.Certificate.version") + 1); } /* * Return the time this cert becomes valid */ std::string X509_Certificate::start_time() const { return subject.get1("X509.Certificate.start"); } /* * Return the time this cert becomes invalid */ std::string X509_Certificate::end_time() const { return subject.get1("X509.Certificate.end"); } /* * Return information about the subject */ std::vector X509_Certificate::subject_info(const std::string& what) const { return subject.get(X509_DN::deref_info_field(what)); } /* * Return information about the issuer */ std::vector X509_Certificate::issuer_info(const std::string& what) const { return issuer.get(X509_DN::deref_info_field(what)); } /* * Return the public key in this certificate */ Public_Key* X509_Certificate::subject_public_key() const { DataSource_Memory source(subject.get1("X509.Certificate.public_key")); return X509::load_key(source); } /* * Check if the certificate is for a CA */ bool X509_Certificate::is_CA_cert() const { if(!subject.get1_u32bit("X509v3.BasicConstraints.is_ca")) return false; if((constraints() & KEY_CERT_SIGN) || (constraints() == NO_CONSTRAINTS)) return true; return false; } /* * Return the path length constraint */ u32bit X509_Certificate::path_limit() const { return subject.get1_u32bit("X509v3.BasicConstraints.path_constraint", 0); } /* * Return the key usage constraints */ Key_Constraints X509_Certificate::constraints() const { return Key_Constraints(subject.get1_u32bit("X509v3.KeyUsage", NO_CONSTRAINTS)); } /* * Return the list of extended key usage OIDs */ std::vector X509_Certificate::ex_constraints() const { return lookup_oids(subject.get("X509v3.ExtendedKeyUsage")); } /* * Return the list of certificate policies */ std::vector X509_Certificate::policies() const { return lookup_oids(subject.get("X509v3.CertificatePolicies")); } /* * Return the authority key id */ MemoryVector X509_Certificate::authority_key_id() const { return issuer.get1_memvec("X509v3.AuthorityKeyIdentifier"); } /* * Return the subject key id */ MemoryVector X509_Certificate::subject_key_id() const { return subject.get1_memvec("X509v3.SubjectKeyIdentifier"); } /* * Return the certificate serial number */ MemoryVector X509_Certificate::serial_number() const { return subject.get1_memvec("X509.Certificate.serial"); } /* * Return the distinguished name of the issuer */ X509_DN X509_Certificate::issuer_dn() const { return create_dn(issuer); } /* * Return the distinguished name of the subject */ X509_DN X509_Certificate::subject_dn() const { return create_dn(subject); } /* * Compare two certificates for equality */ bool X509_Certificate::operator==(const X509_Certificate& other) const { return (sig == other.sig && sig_algo == other.sig_algo && self_signed == other.self_signed && issuer == other.issuer && subject == other.subject); } /* * X.509 Certificate Comparison */ bool operator!=(const X509_Certificate& cert1, const X509_Certificate& cert2) { return !(cert1 == cert2); } std::string X509_Certificate::to_string() const { const char* dn_fields[] = { "Name", "Email", "Organization", "Organizational Unit", "Locality", "State", "Country", "IP", "DNS", "URI", "PKIX.XMPPAddr", 0 }; std::ostringstream out; for(size_t i = 0; dn_fields[i]; ++i) { const std::vector vals = this->subject_info(dn_fields[i]); if(vals.empty()) continue; out << "Subject " << dn_fields[i] << ":"; for(size_t j = 0; j != vals.size(); ++j) out << " " << vals[j]; out << "\n"; } for(size_t i = 0; dn_fields[i]; ++i) { const std::vector vals = this->issuer_info(dn_fields[i]); if(vals.empty()) continue; out << "Issuer " << dn_fields[i] << ":"; for(size_t j = 0; j != vals.size(); ++j) out << " " << vals[j]; out << "\n"; } out << "Version: " << this->x509_version() << "\n"; out << "Not valid before: " << this->start_time() << "\n"; out << "Not valid after: " << this->end_time() << "\n"; out << "Constraints:\n"; Key_Constraints constraints = this->constraints(); if(constraints == NO_CONSTRAINTS) out << " None\n"; else { if(constraints & DIGITAL_SIGNATURE) out << " Digital Signature\n"; if(constraints & NON_REPUDIATION) out << " Non-Repuidation\n"; if(constraints & KEY_ENCIPHERMENT) out << " Key Encipherment\n"; if(constraints & DATA_ENCIPHERMENT) out << " Data Encipherment\n"; if(constraints & KEY_AGREEMENT) out << " Key Agreement\n"; if(constraints & KEY_CERT_SIGN) out << " Cert Sign\n"; if(constraints & CRL_SIGN) out << " CRL Sign\n"; } std::vector policies = this->policies(); if(policies.size()) { out << "Policies: " << "\n"; for(size_t i = 0; i != policies.size(); i++) out << " " << policies[i] << "\n"; } std::vector ex_constraints = this->ex_constraints(); if(ex_constraints.size()) { out << "Extended Constraints:\n"; for(size_t i = 0; i != ex_constraints.size(); i++) out << " " << ex_constraints[i] << "\n"; } out << "Signature algorithm: " << OIDS::lookup(this->signature_algorithm().oid) << "\n"; out << "Serial number: " << hex_encode(this->serial_number()) << "\n"; if(this->authority_key_id().size()) out << "Authority keyid: " << hex_encode(this->authority_key_id()) << "\n"; if(this->subject_key_id().size()) out << "Subject keyid: " << hex_encode(this->subject_key_id()) << "\n"; X509_PublicKey* pubkey = this->subject_public_key(); out << "Public Key:\n" << X509::PEM_encode(*pubkey); delete pubkey; return out.str(); } /* * Create and populate a X509_DN */ X509_DN create_dn(const Data_Store& info) { class DN_Matcher : public Data_Store::Matcher { public: bool operator()(const std::string& key, const std::string&) const { if(key.find("X520.") != std::string::npos) return true; return false; } }; std::multimap names = info.search_with(DN_Matcher()); X509_DN dn; std::multimap::iterator i; for(i = names.begin(); i != names.end(); ++i) dn.add_attribute(i->first, i->second); return dn; } /* * Create and populate an AlternativeName */ AlternativeName create_alt_name(const Data_Store& info) { class AltName_Matcher : public Data_Store::Matcher { public: bool operator()(const std::string& key, const std::string&) const { for(size_t i = 0; i != matches.size(); ++i) if(key.compare(matches[i]) == 0) return true; return false; } AltName_Matcher(const std::string& match_any_of) { matches = split_on(match_any_of, '/'); } private: std::vector matches; }; std::multimap names = info.search_with(AltName_Matcher("RFC822/DNS/URI/IP")); AlternativeName alt_name; std::multimap::iterator i; for(i = names.begin(); i != names.end(); ++i) alt_name.add_attribute(i->first, i->second); return alt_name; } } Botan-1.10.12/src/cert/x509cert/x509cert.h0000664000175000017500000001242612654331322017434 0ustar jackjack00000000000000/* * X.509 Certificates * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X509_CERTS_H__ #define BOTAN_X509_CERTS_H__ #include #include #include #include #include #include namespace Botan { /** * This class represents X.509 Certificate */ class BOTAN_DLL X509_Certificate : public X509_Object { public: /** * Get the public key associated with this certificate. * @return subject public key of this certificate */ Public_Key* subject_public_key() const; /** * Get the issuer certificate DN. * @return issuer DN of this certificate */ X509_DN issuer_dn() const; /** * Get the subject certificate DN. * @return subject DN of this certificate */ X509_DN subject_dn() const; /** * Get a value for a specific subject_info parameter name. * @param name the name of the paramter to look up. Possible names are * "X509.Certificate.version", "X509.Certificate.serial", * "X509.Certificate.start", "X509.Certificate.end", * "X509.Certificate.v2.key_id", "X509.Certificate.public_key", * "X509v3.BasicConstraints.path_constraint", * "X509v3.BasicConstraints.is_ca", "X509v3.ExtendedKeyUsage", * "X509v3.CertificatePolicies", "X509v3.SubjectKeyIdentifier" or * "X509.Certificate.serial". * @return value(s) of the specified parameter */ std::vector subject_info(const std::string& name) const; /** * Get a value for a specific subject_info parameter name. * @param name the name of the paramter to look up. Possible names are * "X509.Certificate.v2.key_id" or "X509v3.AuthorityKeyIdentifier". * @return value(s) of the specified parameter */ std::vector issuer_info(const std::string& name) const; /** * Get the notBefore of the certificate. * @return notBefore of the certificate */ std::string start_time() const; /** * Get the notAfter of the certificate. * @return notAfter of the certificate */ std::string end_time() const; /** * Get the X509 version of this certificate object. * @return X509 version */ u32bit x509_version() const; /** * Get the serial number of this certificate. * @return certificates serial number */ MemoryVector serial_number() const; /** * Get the DER encoded AuthorityKeyIdentifier of this certificate. * @return DER encoded AuthorityKeyIdentifier */ MemoryVector authority_key_id() const; /** * Get the DER encoded SubjectKeyIdentifier of this certificate. * @return DER encoded SubjectKeyIdentifier */ MemoryVector subject_key_id() const; /** * Check whether this certificate is self signed. * @return true if this certificate is self signed */ bool is_self_signed() const { return self_signed; } /** * Check whether this certificate is a CA certificate. * @return true if this certificate is a CA certificate */ bool is_CA_cert() const; /** * Get the path limit as defined in the BasicConstraints extension of * this certificate. * @return path limit */ u32bit path_limit() const; /** * Get the key constraints as defined in the KeyUsage extension of this * certificate. * @return key constraints */ Key_Constraints constraints() const; /** * Get the key constraints as defined in the ExtendedKeyUsage * extension of this * certificate. * @return key constraints */ std::vector ex_constraints() const; /** * Get the policies as defined in the CertificatePolicies extension * of this certificate. * @return certificate policies */ std::vector policies() const; /** * @return a string describing the certificate */ std::string to_string() const; /** * Check to certificates for equality. * @return true both certificates are (binary) equal */ bool operator==(const X509_Certificate& other) const; /** * Create a certificate from a data source providing the DER or * PEM encoded certificate. * @param source the data source */ X509_Certificate(DataSource& source); /** * Create a certificate from a file containing the DER or PEM * encoded certificate. * @param filename the name of the certificate file */ X509_Certificate(const std::string& filename); private: void force_decode(); friend class X509_CA; X509_Certificate() {} Data_Store subject, issuer; bool self_signed; }; /** * Check two certificates for inequality * @return true if the arguments represent different certificates, * false if they are binary identical */ BOTAN_DLL bool operator!=(const X509_Certificate&, const X509_Certificate&); /* * Data Store Extraction Operations */ BOTAN_DLL X509_DN create_dn(const Data_Store&); BOTAN_DLL AlternativeName create_alt_name(const Data_Store&); } #endif Botan-1.10.12/src/cert/x509crl/crl_ent.cpp0000664000175000017500000000410512654331322017650 0ustar jackjack00000000000000/* * CRL Entry * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { /* * Create a CRL_Entry */ CRL_Entry::CRL_Entry(bool t_on_unknown_crit) : throw_on_unknown_critical(t_on_unknown_crit) { reason = UNSPECIFIED; } /* * Create a CRL_Entry */ CRL_Entry::CRL_Entry(const X509_Certificate& cert, CRL_Code why) : throw_on_unknown_critical(false) { serial = cert.serial_number(); time = X509_Time(system_time()); reason = why; } /* * Compare two CRL_Entrys for equality */ bool operator==(const CRL_Entry& a1, const CRL_Entry& a2) { if(a1.serial_number() != a2.serial_number()) return false; if(a1.expire_time() != a2.expire_time()) return false; if(a1.reason_code() != a2.reason_code()) return false; return true; } /* * Compare two CRL_Entrys for inequality */ bool operator!=(const CRL_Entry& a1, const CRL_Entry& a2) { return !(a1 == a2); } /* * DER encode a CRL_Entry */ void CRL_Entry::encode_into(DER_Encoder& der) const { Extensions extensions; extensions.add(new Cert_Extension::CRL_ReasonCode(reason)); der.start_cons(SEQUENCE) .encode(BigInt::decode(serial)) .encode(time) .start_cons(SEQUENCE) .encode(extensions) .end_cons() .end_cons(); } /* * Decode a BER encoded CRL_Entry */ void CRL_Entry::decode_from(BER_Decoder& source) { BigInt serial_number_bn; reason = UNSPECIFIED; BER_Decoder entry = source.start_cons(SEQUENCE); entry.decode(serial_number_bn).decode(time); if(entry.more_items()) { Extensions extensions(throw_on_unknown_critical); entry.decode(extensions); Data_Store info; extensions.contents_to(info, info); reason = CRL_Code(info.get1_u32bit("X509v3.CRLReasonCode")); } entry.end_cons(); serial = BigInt::encode(serial_number_bn); } } Botan-1.10.12/src/cert/x509crl/crl_ent.h0000664000175000017500000000327112654331322017320 0ustar jackjack00000000000000/* * CRL Entry * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CRL_ENTRY_H__ #define BOTAN_CRL_ENTRY_H__ #include namespace Botan { /** * This class represents CRL entries */ class BOTAN_DLL CRL_Entry : public ASN1_Object { public: void encode_into(class DER_Encoder&) const; void decode_from(class BER_Decoder&); /** * Get the serial number of the certificate associated with this entry. * @return certificate's serial number */ MemoryVector serial_number() const { return serial; } /** * Get the revocation date of the certificate associated with this entry * @return certificate's revocation date */ X509_Time expire_time() const { return time; } /** * Get the entries reason code * @return reason code */ CRL_Code reason_code() const { return reason; } /** * Construct an empty CRL entry. */ CRL_Entry(bool throw_on_unknown_critical_extension = false); /** * Construct an CRL entry. * @param cert the certificate to revoke * @param reason the reason code to set in the entry */ CRL_Entry(const X509_Certificate& cert, CRL_Code reason = UNSPECIFIED); private: bool throw_on_unknown_critical; MemoryVector serial; X509_Time time; CRL_Code reason; }; /** * Test two CRL entries for equality in all fields. */ BOTAN_DLL bool operator==(const CRL_Entry&, const CRL_Entry&); /** * Test two CRL entries for inequality in at least one field. */ BOTAN_DLL bool operator!=(const CRL_Entry&, const CRL_Entry&); } #endif Botan-1.10.12/src/cert/x509crl/info.txt0000664000175000017500000000006212654331322017210 0ustar jackjack00000000000000define X509_CRL x509cert Botan-1.10.12/src/cert/x509crl/x509_crl.cpp0000664000175000017500000000601112654331322017565 0ustar jackjack00000000000000/* * X.509 CRL * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { /* * Load a X.509 CRL */ X509_CRL::X509_CRL(DataSource& in, bool touc) : X509_Object(in, "X509 CRL/CRL"), throw_on_unknown_critical(touc) { do_decode(); } /* * Load a X.509 CRL */ X509_CRL::X509_CRL(const std::string& in, bool touc) : X509_Object(in, "CRL/X509 CRL"), throw_on_unknown_critical(touc) { do_decode(); } /* * Decode the TBSCertList data */ void X509_CRL::force_decode() { BER_Decoder tbs_crl(tbs_bits); size_t version; tbs_crl.decode_optional(version, INTEGER, UNIVERSAL); if(version != 0 && version != 1) throw X509_CRL_Error("Unknown X.509 CRL version " + to_string(version+1)); AlgorithmIdentifier sig_algo_inner; tbs_crl.decode(sig_algo_inner); if(sig_algo != sig_algo_inner) throw X509_CRL_Error("Algorithm identifier mismatch"); X509_DN dn_issuer; tbs_crl.decode(dn_issuer); info.add(dn_issuer.contents()); X509_Time start, end; tbs_crl.decode(start).decode(end); info.add("X509.CRL.start", start.readable_string()); info.add("X509.CRL.end", end.readable_string()); BER_Object next = tbs_crl.get_next_object(); if(next.type_tag == SEQUENCE && next.class_tag == CONSTRUCTED) { BER_Decoder cert_list(next.value); while(cert_list.more_items()) { CRL_Entry entry(throw_on_unknown_critical); cert_list.decode(entry); revoked.push_back(entry); } next = tbs_crl.get_next_object(); } if(next.type_tag == 0 && next.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { BER_Decoder crl_options(next.value); Extensions extensions(throw_on_unknown_critical); crl_options.decode(extensions).verify_end(); extensions.contents_to(info, info); next = tbs_crl.get_next_object(); } if(next.type_tag != NO_OBJECT) throw X509_CRL_Error("Unknown tag in CRL"); tbs_crl.verify_end(); } /* * Return the list of revoked certificates */ std::vector X509_CRL::get_revoked() const { return revoked; } /* * Return the distinguished name of the issuer */ X509_DN X509_CRL::issuer_dn() const { return create_dn(info); } /* * Return the key identifier of the issuer */ MemoryVector X509_CRL::authority_key_id() const { return info.get1_memvec("X509v3.AuthorityKeyIdentifier"); } /* * Return the CRL number of this CRL */ u32bit X509_CRL::crl_number() const { return info.get1_u32bit("X509v3.CRLNumber"); } /* * Return the issue data of the CRL */ X509_Time X509_CRL::this_update() const { return info.get1("X509.CRL.start"); } /* * Return the date when a new CRL will be issued */ X509_Time X509_CRL::next_update() const { return info.get1("X509.CRL.end"); } } Botan-1.10.12/src/cert/x509crl/x509_crl.h0000664000175000017500000000454412654331322017243 0ustar jackjack00000000000000/* * X.509 CRL * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X509_CRL_H__ #define BOTAN_X509_CRL_H__ #include #include #include namespace Botan { /** * This class represents X.509 Certificate Revocation Lists (CRLs). */ class BOTAN_DLL X509_CRL : public X509_Object { public: /** * This class represents CRL related errors. */ struct BOTAN_DLL X509_CRL_Error : public Exception { X509_CRL_Error(const std::string& error) : Exception("X509_CRL: " + error) {} }; /** * Get the entries of this CRL in the form of a vector. * @return vector containing the entries of this CRL. */ std::vector get_revoked() const; /** * Get the issuer DN of this CRL. * @return CRLs issuer DN */ X509_DN issuer_dn() const; /** * Get the AuthorityKeyIdentifier of this CRL. * @return this CRLs AuthorityKeyIdentifier */ MemoryVector authority_key_id() const; /** * Get the serial number of this CRL. * @return CRLs serial number */ u32bit crl_number() const; /** * Get the CRL's thisUpdate value. * @return CRLs thisUpdate */ X509_Time this_update() const; /** * Get the CRL's nextUpdate value. * @return CRLs nextdUpdate */ X509_Time next_update() const; /** * Construct a CRL from a data source. * @param source the data source providing the DER or PEM encoded CRL. * @param throw_on_unknown_critical should we throw an exception * if an unknown CRL extension marked as critical is encountered. */ X509_CRL(DataSource& source, bool throw_on_unknown_critical = false); /** * Construct a CRL from a file containing the DER or PEM encoded CRL. * @param filename the name of the CRL file * @param throw_on_unknown_critical should we throw an exception * if an unknown CRL extension marked as critical is encountered. */ X509_CRL(const std::string& filename, bool throw_on_unknown_critical = false); private: void force_decode(); bool throw_on_unknown_critical; std::vector revoked; Data_Store info; }; } #endif Botan-1.10.12/src/cert/x509self/info.txt0000664000175000017500000000007212654331322017362 0ustar jackjack00000000000000define X509_SELF_SIGNED x509cert Botan-1.10.12/src/cert/x509self/x509opt.cpp0000664000175000017500000000453212654331322017627 0ustar jackjack00000000000000/* * X.509 Certificate Options * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Set when the certificate should become valid */ void X509_Cert_Options::not_before(const std::string& time_string) { start = X509_Time(time_string); } /* * Set when the certificate should expire */ void X509_Cert_Options::not_after(const std::string& time_string) { end = X509_Time(time_string); } /* * Set key constraint information */ void X509_Cert_Options::add_constraints(Key_Constraints usage) { constraints = usage; } /* * Set key constraint information */ void X509_Cert_Options::add_ex_constraint(const OID& oid) { ex_constraints.push_back(oid); } /* * Set key constraint information */ void X509_Cert_Options::add_ex_constraint(const std::string& oid_str) { ex_constraints.push_back(OIDS::lookup(oid_str)); } /* * Mark this certificate for CA usage */ void X509_Cert_Options::CA_key(size_t limit) { is_CA = true; path_limit = limit; } /* * Do basic sanity checks */ void X509_Cert_Options::sanity_check() const { if(common_name == "" || country == "") throw Encoding_Error("X.509 certificate: name and country MUST be set"); if(country.size() != 2) throw Encoding_Error("Invalid ISO country code: " + country); if(start >= end) throw Encoding_Error("X509_Cert_Options: invalid time constraints"); } /* * Initialize the certificate options */ X509_Cert_Options::X509_Cert_Options(const std::string& initial_opts, u32bit expiration_time_in_seconds) { is_CA = false; path_limit = 0; constraints = NO_CONSTRAINTS; const u64bit now = system_time(); start = X509_Time(now); end = X509_Time(now + expiration_time_in_seconds); if(initial_opts == "") return; std::vector parsed = split_on(initial_opts, '/'); if(parsed.size() > 4) throw Invalid_Argument("X.509 cert options: Too many names: " + initial_opts); if(parsed.size() >= 1) common_name = parsed[0]; if(parsed.size() >= 2) country = parsed[1]; if(parsed.size() >= 3) organization = parsed[2]; if(parsed.size() == 4) org_unit = parsed[3]; } } Botan-1.10.12/src/cert/x509self/x509self.cpp0000664000175000017500000001121312654331322017750 0ustar jackjack00000000000000/* * PKCS #10/Self Signed Cert Creation * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { /* * Load information from the X509_Cert_Options */ void load_info(const X509_Cert_Options& opts, X509_DN& subject_dn, AlternativeName& subject_alt) { subject_dn.add_attribute("X520.CommonName", opts.common_name); subject_dn.add_attribute("X520.Country", opts.country); subject_dn.add_attribute("X520.State", opts.state); subject_dn.add_attribute("X520.Locality", opts.locality); subject_dn.add_attribute("X520.Organization", opts.organization); subject_dn.add_attribute("X520.OrganizationalUnit", opts.org_unit); subject_dn.add_attribute("X520.SerialNumber", opts.serial_number); subject_alt = AlternativeName(opts.email, opts.uri, opts.dns, opts.ip); subject_alt.add_othername(OIDS::lookup("PKIX.XMPPAddr"), opts.xmpp, UTF8_STRING); } } namespace X509 { /* * Create a new self-signed X.509 certificate */ X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng) { AlgorithmIdentifier sig_algo; X509_DN subject_dn; AlternativeName subject_alt; opts.sanity_check(); MemoryVector pub_key = X509::BER_encode(key); std::auto_ptr signer(choose_sig_format(key, hash_fn, sig_algo)); load_info(opts, subject_dn, subject_alt); Key_Constraints constraints; if(opts.is_CA) constraints = Key_Constraints(KEY_CERT_SIGN | CRL_SIGN); else constraints = find_constraints(key, opts.constraints); Extensions extensions; extensions.add( new Cert_Extension::Basic_Constraints(opts.is_CA, opts.path_limit), true); extensions.add(new Cert_Extension::Key_Usage(constraints), true); extensions.add(new Cert_Extension::Subject_Key_ID(pub_key)); extensions.add( new Cert_Extension::Subject_Alternative_Name(subject_alt)); extensions.add( new Cert_Extension::Extended_Key_Usage(opts.ex_constraints)); return X509_CA::make_cert(signer.get(), rng, sig_algo, pub_key, opts.start, opts.end, subject_dn, subject_dn, extensions); } /* * Create a PKCS #10 certificate request */ PKCS10_Request create_cert_req(const X509_Cert_Options& opts, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng) { AlgorithmIdentifier sig_algo; X509_DN subject_dn; AlternativeName subject_alt; opts.sanity_check(); MemoryVector pub_key = X509::BER_encode(key); std::auto_ptr signer(choose_sig_format(key, hash_fn, sig_algo)); load_info(opts, subject_dn, subject_alt); const size_t PKCS10_VERSION = 0; Extensions extensions; extensions.add( new Cert_Extension::Basic_Constraints(opts.is_CA, opts.path_limit)); extensions.add( new Cert_Extension::Key_Usage( opts.is_CA ? Key_Constraints(KEY_CERT_SIGN | CRL_SIGN) : find_constraints(key, opts.constraints) ) ); extensions.add( new Cert_Extension::Extended_Key_Usage(opts.ex_constraints)); extensions.add( new Cert_Extension::Subject_Alternative_Name(subject_alt)); DER_Encoder tbs_req; tbs_req.start_cons(SEQUENCE) .encode(PKCS10_VERSION) .encode(subject_dn) .raw_bytes(pub_key) .start_explicit(0); if(opts.challenge != "") { ASN1_String challenge(opts.challenge, DIRECTORY_STRING); tbs_req.encode( Attribute("PKCS9.ChallengePassword", DER_Encoder().encode(challenge).get_contents() ) ); } tbs_req.encode( Attribute("PKCS9.ExtensionRequest", DER_Encoder() .start_cons(SEQUENCE) .encode(extensions) .end_cons() .get_contents() ) ) .end_explicit() .end_cons(); DataSource_Memory source( X509_Object::make_signed(signer.get(), rng, sig_algo, tbs_req.get_contents()) ); return PKCS10_Request(source); } } } Botan-1.10.12/src/cert/x509self/x509self.h0000664000175000017500000001112512654331322017417 0ustar jackjack00000000000000/* * X.509 Self-Signed Certificate * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X509_SELF_H__ #define BOTAN_X509_SELF_H__ #include #include #include namespace Botan { /** * Options for X.509 certificates. */ class BOTAN_DLL X509_Cert_Options { public: /** * the subject common name */ std::string common_name; /** * the subject counry */ std::string country; /** * the subject organization */ std::string organization; /** * the subject organizational unit */ std::string org_unit; /** * the subject locality */ std::string locality; /** * the subject state */ std::string state; /** * the subject serial number */ std::string serial_number; /** * the subject email adress */ std::string email; /** * the subject URI */ std::string uri; /** * the subject IPv4 address */ std::string ip; /** * the subject DNS */ std::string dns; /** * the subject XMPP */ std::string xmpp; /** * the subject challenge password */ std::string challenge; /** * the subject notBefore */ X509_Time start; /** * the subject notAfter */ X509_Time end; /** * Indicates whether the certificate request */ bool is_CA; /** * Indicates the BasicConstraints path limit */ size_t path_limit; /** * The key constraints for the subject public key */ Key_Constraints constraints; /** * The key extended constraints for the subject public key */ std::vector ex_constraints; /** * Check the options set in this object for validity. */ void sanity_check() const; /** * Mark the certificate as a CA certificate and set the path limit. * @param limit the path limit to be set in the BasicConstraints extension. */ void CA_key(size_t limit = 1); /** * Set the notBefore of the certificate. * @param time the notBefore value of the certificate */ void not_before(const std::string& time); /** * Set the notAfter of the certificate. * @param time the notAfter value of the certificate */ void not_after(const std::string& time); /** * Add the key constraints of the KeyUsage extension. * @param constr the constraints to set */ void add_constraints(Key_Constraints constr); /** * Add constraints to the ExtendedKeyUsage extension. * @param oid the oid to add */ void add_ex_constraint(const OID& oid); /** * Add constraints to the ExtendedKeyUsage extension. * @param name the name to look up the oid to add */ void add_ex_constraint(const std::string& name); /** * Construct a new options object * @param opts define the common name of this object. An example for this * parameter would be "common_name/country/organization/organizational_unit". * @param expire_time the expiration time (from the current clock in seconds) */ X509_Cert_Options(const std::string& opts = "", u32bit expire_time = 365 * 24 * 60 * 60); }; namespace X509 { /** * Create a self-signed X.509 certificate. * @param opts the options defining the certificate to create * @param key the private key used for signing, i.e. the key * associated with this self-signed certificate * @param hash_fn the hash function to use * @param rng the rng to use * @return newly created self-signed certificate */ BOTAN_DLL X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng); /** * Create a PKCS#10 certificate request. * @param opts the options defining the request to create * @param key the key used to sign this request * @param rng the rng to use * @param hash_fn the hash function to use * @return newly created PKCS#10 request */ BOTAN_DLL PKCS10_Request create_cert_req(const X509_Cert_Options& opts, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng); } } #endif Botan-1.10.12/src/cert/x509store/info.txt0000664000175000017500000000006312654331322017565 0ustar jackjack00000000000000define X509_STORE x509cert Botan-1.10.12/src/cert/x509store/x509stor.cpp0000664000175000017500000004137612654331322020226 0ustar jackjack00000000000000/* * X.509 Certificate Store * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { /* * Do a validity check */ s32bit validity_check(const X509_Time& start, const X509_Time& end, u64bit current_time, u32bit slack) { const s32bit NOT_YET_VALID = -1, VALID_TIME = 0, EXPIRED = 1; if(start.cmp(current_time + slack) > 0) return NOT_YET_VALID; if(end.cmp(current_time - slack) < 0) return EXPIRED; return VALID_TIME; } /* * Compare the value of unique ID fields */ bool compare_ids(const MemoryVector& id1, const MemoryVector& id2) { if(!id1.size() || !id2.size()) return true; return (id1 == id2); } /* * Check a particular usage restriction */ bool check_usage(const X509_Certificate& cert, X509_Store::Cert_Usage usage, X509_Store::Cert_Usage check_for, Key_Constraints constraints) { if((usage & check_for) == 0) return true; if(cert.constraints() == NO_CONSTRAINTS) return true; if(cert.constraints() & constraints) return true; return false; } /* * Check a particular usage restriction */ bool check_usage(const X509_Certificate& cert, X509_Store::Cert_Usage usage, X509_Store::Cert_Usage check_for, const std::string& usage_oid) { if((usage & check_for) == 0) return true; const std::vector constraints = cert.ex_constraints(); if(constraints.empty()) return true; return std::binary_search(constraints.begin(), constraints.end(), usage_oid); } /* * Check the usage restrictions */ X509_Code usage_check(const X509_Certificate& cert, X509_Store::Cert_Usage usage) { if(usage == X509_Store::ANY) return VERIFIED; if(!check_usage(cert, usage, X509_Store::CRL_SIGNING, CRL_SIGN)) return CA_CERT_NOT_FOR_CRL_ISSUER; if(!check_usage(cert, usage, X509_Store::TLS_SERVER, "PKIX.ServerAuth")) return INVALID_USAGE; if(!check_usage(cert, usage, X509_Store::TLS_CLIENT, "PKIX.ClientAuth")) return INVALID_USAGE; if(!check_usage(cert, usage, X509_Store::CODE_SIGNING, "PKIX.CodeSigning")) return INVALID_USAGE; if(!check_usage(cert, usage, X509_Store::EMAIL_PROTECTION, "PKIX.EmailProtection")) return INVALID_USAGE; if(!check_usage(cert, usage, X509_Store::TIME_STAMPING, "PKIX.TimeStamping")) return INVALID_USAGE; return VERIFIED; } } /* * Define equality for revocation data */ bool X509_Store::CRL_Data::operator==(const CRL_Data& other) const { if(issuer != other.issuer) return false; if(serial != other.serial) return false; return compare_ids(auth_key_id, other.auth_key_id); } /* * Define inequality for revocation data */ bool X509_Store::CRL_Data::operator!=(const CRL_Data& other) const { return !((*this) == other); } /* * Define an ordering for revocation data */ bool X509_Store::CRL_Data::operator<(const X509_Store::CRL_Data& other) const { if(*this == other) return false; const MemoryVector& serial1 = serial; const MemoryVector& key_id1 = auth_key_id; const MemoryVector& serial2 = other.serial; const MemoryVector& key_id2 = other.auth_key_id; if(compare_ids(key_id1, key_id2) == false) { if(std::lexicographical_compare(key_id1.begin(), key_id1.end(), key_id2.begin(), key_id2.end())) return true; if(std::lexicographical_compare(key_id2.begin(), key_id2.end(), key_id1.begin(), key_id1.end())) return false; } if(compare_ids(serial1, serial2) == false) { if(std::lexicographical_compare(serial1.begin(), serial1.end(), serial2.begin(), serial2.end())) return true; if(std::lexicographical_compare(serial2.begin(), serial2.end(), serial1.begin(), serial1.end())) return false; } return (issuer < other.issuer); } /* * X509_Store Constructor */ X509_Store::X509_Store(u32bit slack, u32bit cache_timeout) { revoked_info_valid = true; validation_cache_timeout = cache_timeout; time_slack = slack; } /* * X509_Store Copy Constructor */ X509_Store::X509_Store(const X509_Store& other) { certs = other.certs; revoked = other.revoked; revoked_info_valid = other.revoked_info_valid; for(size_t j = 0; j != other.stores.size(); ++j) stores[j] = other.stores[j]->clone(); time_slack = other.time_slack; validation_cache_timeout = other.validation_cache_timeout; } /* * X509_Store Destructor */ X509_Store::~X509_Store() { for(size_t j = 0; j != stores.size(); ++j) delete stores[j]; } /* * Verify a certificate's authenticity */ X509_Code X509_Store::validate_cert(const X509_Certificate& cert, Cert_Usage cert_usage) { recompute_revoked_info(); std::vector indexes; X509_Code chaining_result = construct_cert_chain(cert, indexes); if(chaining_result != VERIFIED) return chaining_result; const u64bit current_time = system_time(); s32bit time_check = validity_check(cert.start_time(), cert.end_time(), current_time, time_slack); if(time_check < 0) return CERT_NOT_YET_VALID; else if(time_check > 0) return CERT_HAS_EXPIRED; X509_Code sig_check_result = check_sig(cert, certs[indexes[0]]); if(sig_check_result != VERIFIED) return sig_check_result; if(is_revoked(cert)) return CERT_IS_REVOKED; for(size_t j = 0; j != indexes.size() - 1; ++j) { const X509_Certificate& current_cert = certs[indexes[j]].cert; time_check = validity_check(current_cert.start_time(), current_cert.end_time(), current_time, time_slack); if(time_check < 0) return CERT_NOT_YET_VALID; else if(time_check > 0) return CERT_HAS_EXPIRED; sig_check_result = check_sig(certs[indexes[j]], certs[indexes[j+1]]); if(sig_check_result != VERIFIED) return sig_check_result; } return usage_check(cert, cert_usage); } /* * Find this certificate */ size_t X509_Store::find_cert(const X509_DN& subject_dn, const MemoryRegion& subject_key_id) const { for(size_t j = 0; j != certs.size(); ++j) { const X509_Certificate& this_cert = certs[j].cert; if(compare_ids(this_cert.subject_key_id(), subject_key_id) && this_cert.subject_dn() == subject_dn) return j; } return NO_CERT_FOUND; } /* * Find the parent of this certificate */ size_t X509_Store::find_parent_of(const X509_Certificate& cert) { const X509_DN issuer_dn = cert.issuer_dn(); const MemoryVector auth_key_id = cert.authority_key_id(); size_t index = find_cert(issuer_dn, auth_key_id); if(index != NO_CERT_FOUND) return index; for(size_t j = 0; j != stores.size(); ++j) { std::vector got = stores[j]->find_cert_by_subject_and_key_id(issuer_dn, auth_key_id); for(size_t k = 0; k != got.size(); ++k) add_cert(got[k]); } return find_cert(issuer_dn, auth_key_id); } /* * Construct a chain of certificate relationships */ X509_Code X509_Store::construct_cert_chain(const X509_Certificate& end_cert, std::vector& indexes, bool need_full_chain) { size_t parent = find_parent_of(end_cert); while(true) { if(parent == NO_CERT_FOUND) return CERT_ISSUER_NOT_FOUND; indexes.push_back(parent); if(certs[parent].is_verified(validation_cache_timeout)) if(certs[parent].verify_result() != VERIFIED) return certs[parent].verify_result(); const X509_Certificate& parent_cert = certs[parent].cert; if(!parent_cert.is_CA_cert()) return CA_CERT_NOT_FOR_CERT_ISSUER; if(certs[parent].is_trusted()) break; if(parent_cert.is_self_signed()) return CANNOT_ESTABLISH_TRUST; if(parent_cert.path_limit() < indexes.size() - 1) return CERT_CHAIN_TOO_LONG; parent = find_parent_of(parent_cert); } if(need_full_chain) return VERIFIED; while(true) { if(indexes.size() < 2) break; const size_t cert = indexes.back(); if(certs[cert].is_verified(validation_cache_timeout)) { if(certs[cert].verify_result() != VERIFIED) throw Internal_Error("X509_Store::construct_cert_chain"); indexes.pop_back(); } else break; } const size_t last_cert = indexes.back(); const size_t parent_of_last_cert = find_parent_of(certs[last_cert].cert); if(parent_of_last_cert == NO_CERT_FOUND) return CERT_ISSUER_NOT_FOUND; indexes.push_back(parent_of_last_cert); return VERIFIED; } /* * Check the CAs signature on a certificate */ X509_Code X509_Store::check_sig(const Cert_Info& cert_info, const Cert_Info& ca_cert_info) const { if(cert_info.is_verified(validation_cache_timeout)) return cert_info.verify_result(); const X509_Certificate& cert = cert_info.cert; const X509_Certificate& ca_cert = ca_cert_info.cert; X509_Code verify_code = check_sig(cert, ca_cert.subject_public_key()); cert_info.set_result(verify_code); return verify_code; } /* * Check a CA's signature */ X509_Code X509_Store::check_sig(const X509_Object& object, Public_Key* key) { std::auto_ptr pub_key(key); try { std::vector sig_info = split_on(OIDS::lookup(object.signature_algorithm().oid), '/'); if(sig_info.size() != 2 || sig_info[0] != pub_key->algo_name()) return SIGNATURE_ERROR; std::string padding = sig_info[1]; Signature_Format format; if(key->message_parts() >= 2) format = DER_SEQUENCE; else format = IEEE_1363; PK_Verifier verifier(*pub_key.get(), padding, format); bool valid = verifier.verify_message(object.tbs_data(), object.signature()); if(valid) return VERIFIED; else return SIGNATURE_ERROR; } catch(Lookup_Error) { return CA_CERT_CANNOT_SIGN; } catch(Decoding_Error) { return CERT_FORMAT_ERROR; } catch(Exception) {} return UNKNOWN_X509_ERROR; } /* * Recompute the revocation status of the certs */ void X509_Store::recompute_revoked_info() const { if(revoked_info_valid) return; for(size_t j = 0; j != certs.size(); ++j) { if((certs[j].is_verified(validation_cache_timeout)) && (certs[j].verify_result() != VERIFIED)) continue; if(is_revoked(certs[j].cert)) certs[j].set_result(CERT_IS_REVOKED); } revoked_info_valid = true; } /* * Check if a certificate is revoked */ bool X509_Store::is_revoked(const X509_Certificate& cert) const { CRL_Data revoked_info; revoked_info.issuer = cert.issuer_dn(); revoked_info.serial = cert.serial_number(); revoked_info.auth_key_id = cert.authority_key_id(); if(std::binary_search(revoked.begin(), revoked.end(), revoked_info)) return true; return false; } /* * Construct a path back to a root for this cert */ std::vector X509_Store::get_cert_chain(const X509_Certificate& cert) { std::vector result; std::vector indexes; X509_Code chaining_result = construct_cert_chain(cert, indexes, true); if(chaining_result != VERIFIED) throw Invalid_State("X509_Store::get_cert_chain: Can't construct chain"); for(size_t j = 0; j != indexes.size(); ++j) result.push_back(certs[indexes[j]].cert); return result; } /* * Add a certificate store to the list of stores */ void X509_Store::add_new_certstore(Certificate_Store* certstore) { stores.push_back(certstore); } /* * Add a certificate to the store */ void X509_Store::add_cert(const X509_Certificate& cert, bool trusted) { if(trusted && !cert.is_self_signed()) throw Invalid_Argument("X509_Store: Trusted certs must be self-signed"); if(find_cert(cert.subject_dn(), cert.subject_key_id()) == NO_CERT_FOUND) { revoked_info_valid = false; Cert_Info info(cert, trusted); certs.push_back(info); } else if(trusted) { for(size_t j = 0; j != certs.size(); ++j) { const X509_Certificate& this_cert = certs[j].cert; if(this_cert == cert) certs[j].trusted = trusted; } } } /* * Add one or more certificates to the store */ void X509_Store::do_add_certs(DataSource& source, bool trusted) { while(!source.end_of_data()) { try { X509_Certificate cert(source); add_cert(cert, trusted); } catch(Decoding_Error) {} catch(Invalid_Argument) {} } } /* * Add one or more certificates to the store */ void X509_Store::add_certs(DataSource& source) { do_add_certs(source, false); } /* * Add one or more certificates to the store */ void X509_Store::add_trusted_certs(DataSource& source) { do_add_certs(source, true); } /* * Add one or more certificates to the store */ X509_Code X509_Store::add_crl(const X509_CRL& crl) { s32bit time_check = validity_check(crl.this_update(), crl.next_update(), system_time(), time_slack); if(time_check < 0) return CRL_NOT_YET_VALID; else if(time_check > 0) return CRL_HAS_EXPIRED; size_t cert_index = NO_CERT_FOUND; for(size_t j = 0; j != certs.size(); ++j) { const X509_Certificate& this_cert = certs[j].cert; if(compare_ids(this_cert.subject_key_id(), crl.authority_key_id())) { if(this_cert.subject_dn() == crl.issuer_dn()) cert_index = j; } } if(cert_index == NO_CERT_FOUND) return CRL_ISSUER_NOT_FOUND; const X509_Certificate& ca_cert = certs[cert_index].cert; X509_Code verify_result = validate_cert(ca_cert, CRL_SIGNING); if(verify_result != VERIFIED) return verify_result; verify_result = check_sig(crl, ca_cert.subject_public_key()); if(verify_result != VERIFIED) return verify_result; std::vector revoked_certs = crl.get_revoked(); for(size_t j = 0; j != revoked_certs.size(); ++j) { CRL_Data revoked_info; revoked_info.issuer = crl.issuer_dn(); revoked_info.serial = revoked_certs[j].serial_number(); revoked_info.auth_key_id = crl.authority_key_id(); std::vector::iterator p = std::find(revoked.begin(), revoked.end(), revoked_info); if(revoked_certs[j].reason_code() == REMOVE_FROM_CRL) { if(p == revoked.end()) continue; revoked.erase(p); } else { if(p != revoked.end()) continue; revoked.push_back(revoked_info); } } std::sort(revoked.begin(), revoked.end()); revoked_info_valid = false; return VERIFIED; } /* * PEM encode the set of certificates */ std::string X509_Store::PEM_encode() const { std::string cert_store; for(size_t j = 0; j != certs.size(); ++j) cert_store += certs[j].cert.PEM_encode(); return cert_store; } /* * Create a Cert_Info structure */ X509_Store::Cert_Info::Cert_Info(const X509_Certificate& c, bool t) : cert(c), trusted(t) { checked = false; result = UNKNOWN_X509_ERROR; last_checked = 0; } /* * Return the verification results */ X509_Code X509_Store::Cert_Info::verify_result() const { if(!checked) throw Invalid_State("Cert_Info::verify_result() called; not checked"); return result; } /* * Set the verification results */ void X509_Store::Cert_Info::set_result(X509_Code code) const { result = code; last_checked = system_time(); checked = true; } /* * Check if this certificate can be trusted */ bool X509_Store::Cert_Info::is_trusted() const { return trusted; } /* * Check if this certificate has been verified */ bool X509_Store::Cert_Info::is_verified(u32bit timeout) const { if(!checked) return false; if(result != VERIFIED && result != CERT_NOT_YET_VALID) return true; const u64bit current_time = system_time(); if(current_time > last_checked + timeout) checked = false; return checked; } } Botan-1.10.12/src/cert/x509store/x509stor.h0000664000175000017500000000654212654331322017667 0ustar jackjack00000000000000/* * X.509 Certificate Store * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X509_CERT_STORE_H__ #define BOTAN_X509_CERT_STORE_H__ #include #include #include namespace Botan { /** * X.509 Certificate Validation Result */ enum X509_Code { VERIFIED, UNKNOWN_X509_ERROR, CANNOT_ESTABLISH_TRUST, CERT_CHAIN_TOO_LONG, SIGNATURE_ERROR, POLICY_ERROR, INVALID_USAGE, CERT_FORMAT_ERROR, CERT_ISSUER_NOT_FOUND, CERT_NOT_YET_VALID, CERT_HAS_EXPIRED, CERT_IS_REVOKED, CRL_FORMAT_ERROR, CRL_ISSUER_NOT_FOUND, CRL_NOT_YET_VALID, CRL_HAS_EXPIRED, CA_CERT_CANNOT_SIGN, CA_CERT_NOT_FOR_CERT_ISSUER, CA_CERT_NOT_FOR_CRL_ISSUER }; /** * X.509 Certificate Store */ class BOTAN_DLL X509_Store { public: enum Cert_Usage { ANY = 0x00, TLS_SERVER = 0x01, TLS_CLIENT = 0x02, CODE_SIGNING = 0x04, EMAIL_PROTECTION = 0x08, TIME_STAMPING = 0x10, CRL_SIGNING = 0x20 }; X509_Code validate_cert(const X509_Certificate&, Cert_Usage = ANY); std::vector get_cert_chain(const X509_Certificate&); std::string PEM_encode() const; X509_Code add_crl(const X509_CRL&); void add_cert(const X509_Certificate&, bool = false); void add_certs(DataSource&); void add_trusted_certs(DataSource&); void add_new_certstore(Certificate_Store*); X509_Store(u32bit time_slack = 24*60*60, u32bit cache_results = 30*60); X509_Store(const X509_Store&); ~X509_Store(); private: X509_Store& operator=(const X509_Store&) { return (*this); } class BOTAN_DLL CRL_Data { public: X509_DN issuer; MemoryVector serial, auth_key_id; bool operator==(const CRL_Data&) const; bool operator!=(const CRL_Data&) const; bool operator<(const CRL_Data&) const; }; class BOTAN_DLL Cert_Info { public: bool is_verified(u32bit timeout) const; bool is_trusted() const; X509_Code verify_result() const; void set_result(X509_Code) const; Cert_Info(const X509_Certificate&, bool = false); X509_Certificate cert; bool trusted; private: mutable bool checked; mutable X509_Code result; mutable u64bit last_checked; }; static X509_Code check_sig(const X509_Object&, Public_Key*); size_t find_cert(const X509_DN&, const MemoryRegion&) const; X509_Code check_sig(const Cert_Info&, const Cert_Info&) const; void recompute_revoked_info() const; void do_add_certs(DataSource&, bool); X509_Code construct_cert_chain(const X509_Certificate&, std::vector&, bool = false); size_t find_parent_of(const X509_Certificate&); bool is_revoked(const X509_Certificate&) const; static const size_t NO_CERT_FOUND = 0xFFFFFFFF; std::vector certs; std::vector revoked; std::vector stores; u32bit time_slack, validation_cache_timeout; mutable bool revoked_info_valid; }; } #endif Botan-1.10.12/src/checksum/adler32/adler32.cpp0000664000175000017500000000312412654331322020351 0ustar jackjack00000000000000/* * Adler32 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { void adler32_update(const byte input[], size_t length, u16bit& S1, u16bit& S2) { u32bit S1x = S1; u32bit S2x = S2; while(length >= 16) { S1x += input[ 0]; S2x += S1x; S1x += input[ 1]; S2x += S1x; S1x += input[ 2]; S2x += S1x; S1x += input[ 3]; S2x += S1x; S1x += input[ 4]; S2x += S1x; S1x += input[ 5]; S2x += S1x; S1x += input[ 6]; S2x += S1x; S1x += input[ 7]; S2x += S1x; S1x += input[ 8]; S2x += S1x; S1x += input[ 9]; S2x += S1x; S1x += input[10]; S2x += S1x; S1x += input[11]; S2x += S1x; S1x += input[12]; S2x += S1x; S1x += input[13]; S2x += S1x; S1x += input[14]; S2x += S1x; S1x += input[15]; S2x += S1x; input += 16; length -= 16; } for(size_t j = 0; j != length; ++j) { S1x += input[j]; S2x += S1x; } S1 = S1x % 65521; S2 = S2x % 65521; } } /* * Update an Adler32 Checksum */ void Adler32::add_data(const byte input[], size_t length) { const size_t PROCESS_AMOUNT = 5552; while(length >= PROCESS_AMOUNT) { adler32_update(input, PROCESS_AMOUNT, S1, S2); input += PROCESS_AMOUNT; length -= PROCESS_AMOUNT; } adler32_update(input, length, S1, S2); } /* * Finalize an Adler32 Checksum */ void Adler32::final_result(byte output[]) { store_be(output, S2, S1); clear(); } } Botan-1.10.12/src/checksum/adler32/adler32.h0000664000175000017500000000125612654331322020022 0ustar jackjack00000000000000/* * Adler32 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ADLER32_H__ #define BOTAN_ADLER32_H__ #include namespace Botan { /** * The Adler32 checksum, used in zlib */ class BOTAN_DLL Adler32 : public HashFunction { public: std::string name() const { return "Adler32"; } size_t output_length() const { return 4; } HashFunction* clone() const { return new Adler32; } void clear() { S1 = 1; S2 = 0; } Adler32() { clear(); } ~Adler32() { clear(); } private: void add_data(const byte[], size_t); void final_result(byte[]); u16bit S1, S2; }; } #endif Botan-1.10.12/src/checksum/adler32/info.txt0000664000175000017500000000005412654331322020104 0ustar jackjack00000000000000define ADLER32 hash Botan-1.10.12/src/checksum/crc24/crc24.cpp0000664000175000017500000001172512654331322017521 0ustar jackjack00000000000000/* * CRC24 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Update a CRC24 Checksum */ void CRC24::add_data(const byte input[], size_t length) { const u32bit TABLE[256] = { 0x00000000, 0x00864CFB, 0x008AD50D, 0x000C99F6, 0x0093E6E1, 0x0015AA1A, 0x001933EC, 0x009F7F17, 0x00A18139, 0x0027CDC2, 0x002B5434, 0x00AD18CF, 0x003267D8, 0x00B42B23, 0x00B8B2D5, 0x003EFE2E, 0x00C54E89, 0x00430272, 0x004F9B84, 0x00C9D77F, 0x0056A868, 0x00D0E493, 0x00DC7D65, 0x005A319E, 0x0064CFB0, 0x00E2834B, 0x00EE1ABD, 0x00685646, 0x00F72951, 0x007165AA, 0x007DFC5C, 0x00FBB0A7, 0x000CD1E9, 0x008A9D12, 0x008604E4, 0x0000481F, 0x009F3708, 0x00197BF3, 0x0015E205, 0x0093AEFE, 0x00AD50D0, 0x002B1C2B, 0x002785DD, 0x00A1C926, 0x003EB631, 0x00B8FACA, 0x00B4633C, 0x00322FC7, 0x00C99F60, 0x004FD39B, 0x00434A6D, 0x00C50696, 0x005A7981, 0x00DC357A, 0x00D0AC8C, 0x0056E077, 0x00681E59, 0x00EE52A2, 0x00E2CB54, 0x006487AF, 0x00FBF8B8, 0x007DB443, 0x00712DB5, 0x00F7614E, 0x0019A3D2, 0x009FEF29, 0x009376DF, 0x00153A24, 0x008A4533, 0x000C09C8, 0x0000903E, 0x0086DCC5, 0x00B822EB, 0x003E6E10, 0x0032F7E6, 0x00B4BB1D, 0x002BC40A, 0x00AD88F1, 0x00A11107, 0x00275DFC, 0x00DCED5B, 0x005AA1A0, 0x00563856, 0x00D074AD, 0x004F0BBA, 0x00C94741, 0x00C5DEB7, 0x0043924C, 0x007D6C62, 0x00FB2099, 0x00F7B96F, 0x0071F594, 0x00EE8A83, 0x0068C678, 0x00645F8E, 0x00E21375, 0x0015723B, 0x00933EC0, 0x009FA736, 0x0019EBCD, 0x008694DA, 0x0000D821, 0x000C41D7, 0x008A0D2C, 0x00B4F302, 0x0032BFF9, 0x003E260F, 0x00B86AF4, 0x002715E3, 0x00A15918, 0x00ADC0EE, 0x002B8C15, 0x00D03CB2, 0x00567049, 0x005AE9BF, 0x00DCA544, 0x0043DA53, 0x00C596A8, 0x00C90F5E, 0x004F43A5, 0x0071BD8B, 0x00F7F170, 0x00FB6886, 0x007D247D, 0x00E25B6A, 0x00641791, 0x00688E67, 0x00EEC29C, 0x003347A4, 0x00B50B5F, 0x00B992A9, 0x003FDE52, 0x00A0A145, 0x0026EDBE, 0x002A7448, 0x00AC38B3, 0x0092C69D, 0x00148A66, 0x00181390, 0x009E5F6B, 0x0001207C, 0x00876C87, 0x008BF571, 0x000DB98A, 0x00F6092D, 0x007045D6, 0x007CDC20, 0x00FA90DB, 0x0065EFCC, 0x00E3A337, 0x00EF3AC1, 0x0069763A, 0x00578814, 0x00D1C4EF, 0x00DD5D19, 0x005B11E2, 0x00C46EF5, 0x0042220E, 0x004EBBF8, 0x00C8F703, 0x003F964D, 0x00B9DAB6, 0x00B54340, 0x00330FBB, 0x00AC70AC, 0x002A3C57, 0x0026A5A1, 0x00A0E95A, 0x009E1774, 0x00185B8F, 0x0014C279, 0x00928E82, 0x000DF195, 0x008BBD6E, 0x00872498, 0x00016863, 0x00FAD8C4, 0x007C943F, 0x00700DC9, 0x00F64132, 0x00693E25, 0x00EF72DE, 0x00E3EB28, 0x0065A7D3, 0x005B59FD, 0x00DD1506, 0x00D18CF0, 0x0057C00B, 0x00C8BF1C, 0x004EF3E7, 0x00426A11, 0x00C426EA, 0x002AE476, 0x00ACA88D, 0x00A0317B, 0x00267D80, 0x00B90297, 0x003F4E6C, 0x0033D79A, 0x00B59B61, 0x008B654F, 0x000D29B4, 0x0001B042, 0x0087FCB9, 0x001883AE, 0x009ECF55, 0x009256A3, 0x00141A58, 0x00EFAAFF, 0x0069E604, 0x00657FF2, 0x00E33309, 0x007C4C1E, 0x00FA00E5, 0x00F69913, 0x0070D5E8, 0x004E2BC6, 0x00C8673D, 0x00C4FECB, 0x0042B230, 0x00DDCD27, 0x005B81DC, 0x0057182A, 0x00D154D1, 0x0026359F, 0x00A07964, 0x00ACE092, 0x002AAC69, 0x00B5D37E, 0x00339F85, 0x003F0673, 0x00B94A88, 0x0087B4A6, 0x0001F85D, 0x000D61AB, 0x008B2D50, 0x00145247, 0x00921EBC, 0x009E874A, 0x0018CBB1, 0x00E37B16, 0x006537ED, 0x0069AE1B, 0x00EFE2E0, 0x00709DF7, 0x00F6D10C, 0x00FA48FA, 0x007C0401, 0x0042FA2F, 0x00C4B6D4, 0x00C82F22, 0x004E63D9, 0x00D11CCE, 0x00575035, 0x005BC9C3, 0x00DD8538 }; u32bit tmp = crc; while(length >= 16) { tmp = TABLE[((tmp >> 16) ^ input[ 0]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[ 1]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[ 2]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[ 3]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[ 4]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[ 5]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[ 6]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[ 7]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[ 8]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[ 9]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[10]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[11]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[12]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[13]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[14]) & 0xFF] ^ (tmp << 8); tmp = TABLE[((tmp >> 16) ^ input[15]) & 0xFF] ^ (tmp << 8); input += 16; length -= 16; } for(size_t i = 0; i != length; ++i) tmp = TABLE[((tmp >> 16) ^ input[i]) & 0xFF] ^ (tmp << 8); crc = tmp; } /* * Finalize a CRC24 Checksum */ void CRC24::final_result(byte output[]) { for(size_t i = 0; i != 3; ++i) output[i] = get_byte(i+1, crc); clear(); } } Botan-1.10.12/src/checksum/crc24/crc24.h0000664000175000017500000000122712654331322017162 0ustar jackjack00000000000000/* * CRC24 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CRC24_H__ #define BOTAN_CRC24_H__ #include namespace Botan { /** * 24-bit cyclic redundancy check */ class BOTAN_DLL CRC24 : public HashFunction { public: std::string name() const { return "CRC24"; } size_t output_length() const { return 3; } HashFunction* clone() const { return new CRC24; } void clear() { crc = 0xB704CE; } CRC24() { clear(); } ~CRC24() { clear(); } private: void add_data(const byte[], size_t); void final_result(byte[]); u32bit crc; }; } #endif Botan-1.10.12/src/checksum/crc24/info.txt0000664000175000017500000000005212654331322017563 0ustar jackjack00000000000000define CRC24 hash Botan-1.10.12/src/checksum/crc32/crc32.cpp0000664000175000017500000001146512654331322017520 0ustar jackjack00000000000000/* * CRC32 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Update a CRC32 Checksum */ void CRC32::add_data(const byte input[], size_t length) { const u32bit TABLE[256] = { 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; u32bit tmp = crc; while(length >= 16) { tmp = TABLE[(tmp ^ input[ 0]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 1]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 2]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 3]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 4]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 5]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 6]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 7]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 8]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 9]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[10]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[11]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[12]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[13]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[14]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[15]) & 0xFF] ^ (tmp >> 8); input += 16; length -= 16; } for(size_t i = 0; i != length; ++i) tmp = TABLE[(tmp ^ input[i]) & 0xFF] ^ (tmp >> 8); crc = tmp; } /* * Finalize a CRC32 Checksum */ void CRC32::final_result(byte output[]) { crc ^= 0xFFFFFFFF; store_be(crc, output); clear(); } } Botan-1.10.12/src/checksum/crc32/crc32.h0000664000175000017500000000123112654331322017153 0ustar jackjack00000000000000/* * CRC32 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CRC32_H__ #define BOTAN_CRC32_H__ #include namespace Botan { /** * 32-bit cyclic redundancy check */ class BOTAN_DLL CRC32 : public HashFunction { public: std::string name() const { return "CRC32"; } size_t output_length() const { return 4; } HashFunction* clone() const { return new CRC32; } void clear() { crc = 0xFFFFFFFF; } CRC32() { clear(); } ~CRC32() { clear(); } private: void add_data(const byte[], size_t); void final_result(byte[]); u32bit crc; }; } #endif Botan-1.10.12/src/checksum/crc32/info.txt0000664000175000017500000000005212654331322017562 0ustar jackjack00000000000000define CRC32 hash Botan-1.10.12/src/cms/cms_algo.cpp0000664000175000017500000001061112654331322016424 0ustar jackjack00000000000000/* * CMS Algorithm Specific Code * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #if defined(BOTAN_HAS_RC2) #include #endif namespace Botan { namespace { /* * Wrap a key as specified in RFC 3217 */ SecureVector do_rfc3217_wrap(RandomNumberGenerator& rng, const std::string& cipher_name, const SymmetricKey& kek, const SecureVector& input) { class Flip_Bytes : public Filter { public: std::string name() const { return "Fip_Bytes"; } void write(const byte data[], size_t length) { buf += std::make_pair(data, length); } void end_msg() { for(size_t j = 0; j != buf.size(); j++) send(buf[buf.size()-j-1]); buf.clear(); } Flip_Bytes(const SecureVector& prefix) : buf(prefix) {} private: SecureVector buf; }; Algorithm_Factory& af = global_state().algorithm_factory(); const BlockCipher* cipher = af.prototype_block_cipher(cipher_name); if(!cipher || cipher->block_size() != 8) throw Encoding_Error("do_rfc3217_wrap: Bad cipher: " + cipher_name); Pipe icv(new Hash_Filter(new SHA_160, 8)); icv.process_msg(input); InitializationVector iv(rng, 8); InitializationVector fixed("4ADDA22C79E82105"); Pipe pipe(new CBC_Encryption(cipher->clone(), new Null_Padding, kek, iv), new Flip_Bytes(iv.bits_of()), new CBC_Encryption(cipher->clone(), new Null_Padding, kek, iv)); pipe.start_msg(); pipe.write(input); pipe.write(icv.read_all()); pipe.end_msg(); return pipe.read_all(); } } /* * Wrap a CEK with a KEK */ SecureVector CMS_Encoder::wrap_key(RandomNumberGenerator& rng, const std::string& cipher, const SymmetricKey& cek, const SymmetricKey& kek) { #if defined(BOTAN_HAS_DES) if(cipher == "TripleDES") { SymmetricKey cek_parity = cek; cek_parity.set_odd_parity(); return do_rfc3217_wrap(rng, cipher, kek, cek_parity.bits_of()); } #endif #if defined(BOTAN_HAS_RC2) || defined(BOTAN_HAS_CAST) if(cipher == "RC2" || cipher == "CAST-128") { if(kek.length() != 16) throw Encoding_Error("CMS: 128-bit KEKs must be used with " + cipher); SecureVector lcekpad; lcekpad.push_back(static_cast(cek.length())); lcekpad += cek.bits_of(); while(lcekpad.size() % 8) lcekpad.push_back(rng.next_byte()); return do_rfc3217_wrap(rng, cipher, kek, lcekpad); } #endif throw Invalid_Argument("CMS_Encoder::wrap: Unknown cipher " + cipher); } /* * Encode the parameters for an encryption algo */ SecureVector CMS_Encoder::encode_params(const std::string& cipher, const SymmetricKey& key, const InitializationVector& iv) { DER_Encoder encoder; #if defined(BOTAN_HAS_RC2) if(cipher == "RC2") { encoder.start_cons(SEQUENCE). encode(static_cast(RC2::EKB_code(8*key.length()))). encode(iv.bits_of(), OCTET_STRING). end_cons(); return encoder.get_contents(); } #endif if(cipher == "CAST-128") { encoder.start_cons(SEQUENCE). encode(iv.bits_of(), OCTET_STRING). encode(8*key.length()). end_cons(); } else encoder.encode(iv.bits_of(), OCTET_STRING); return encoder.get_contents(); } /* * Generate a CEK or KEK for the cipher */ SymmetricKey CMS_Encoder::setup_key(RandomNumberGenerator& rng, const std::string& cipher) { size_t keysize = 0; if(cipher == "TripleDES") keysize = 24; if(cipher == "RC2") keysize = 16; if(cipher == "CAST-128") keysize = 16; if(keysize == 0) throw Invalid_Argument("CMS: Cannot encrypt with cipher " + cipher); SymmetricKey key(rng, keysize); if(cipher == "DES" || cipher == "TripleDES") key.set_odd_parity(); return key; } } Botan-1.10.12/src/cms/cms_comp.cpp0000664000175000017500000000444112654331322016444 0ustar jackjack00000000000000/* * CMS Compression * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) #include #endif namespace Botan { /* * Compress a message */ void CMS_Encoder::compress(const std::string& algo) { if(!CMS_Encoder::can_compress_with(algo)) throw Invalid_Argument("CMS_Encoder: Cannot compress with " + algo); Filter* compressor = 0; #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) if(algo == "Zlib") compressor = new Zlib_Compression; #endif if(compressor == 0) throw Internal_Error("CMS: Couldn't get ahold of a compressor"); Pipe pipe(compressor); pipe.process_msg(data); SecureVector compressed = pipe.read_all(); DER_Encoder encoder; encoder.start_cons(SEQUENCE). encode(static_cast(0)). encode(AlgorithmIdentifier("Compression." + algo, MemoryVector())). raw_bytes(make_econtent(compressed, type)). end_cons(); add_layer("CMS.CompressedData", encoder); } /* * See if the named compression algo is available */ bool CMS_Encoder::can_compress_with(const std::string& algo) { if(algo == "") throw Invalid_Algorithm_Name("Empty string to can_compress_with"); #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) if(algo == "Zlib") return true; #endif return false; } /* * Decompress a message */ void CMS_Decoder::decompress(BER_Decoder& decoder) { size_t version; AlgorithmIdentifier comp_algo; BER_Decoder comp_info = decoder.start_cons(SEQUENCE); comp_info.decode(version); if(version != 0) throw Decoding_Error("CMS: Unknown version for CompressedData"); comp_info.decode(comp_algo); read_econtent(comp_info); comp_info.end_cons(); Filter* decompressor = 0; info = comp_algo.oid.as_string(); #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) if(comp_algo.oid == OIDS::lookup("Compression.Zlib")) { decompressor = new Zlib_Decompression; info = "Zlib"; } #endif if(!decompressor) status = FAILURE; Pipe pipe(decompressor); pipe.process_msg(data); data = pipe.read_all(); } } Botan-1.10.12/src/cms/cms_dalg.cpp0000664000175000017500000001740312654331322016417 0ustar jackjack00000000000000/* * CMS Decoding Operations * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { /* * Compute the hash of some content */ SecureVector hash_of(const SecureVector& content, const AlgorithmIdentifier& hash_algo, std::string& hash_name) { hash_name = OIDS::lookup(hash_algo.oid); Algorithm_Factory& af = global_state().algorithm_factory(); std::auto_ptr hash_fn(af.make_hash_function(hash_name)); return hash_fn->process(content); } /* * Find a cert based on SignerIdentifier */ std::vector get_cert(BER_Decoder& signer_info, X509_Store&) { BER_Object id = signer_info.get_next_object(); std::vector found; #if 0 if(id.type_tag == SEQUENCE && id.class_tag == CONSTRUCTED) { X509_DN issuer; BigInt serial; BER_Decoder iands(id.value); iands.decode(issuer); iands.decode(serial); found = store.get_certs(IandS_Match(issuer, BigInt::encode(serial))); } else if(id.type_tag == 0 && id.class_tag == CONSTRUCTED) found = store.get_certs(SKID_Match(id.value)); else throw Decoding_Error("CMS: Unknown tag for cert identifier"); #endif throw Internal_Error("Not implemented"); // verify cert if found if(found.size() > 1) throw Internal_Error("CMS: Found more than one match in get_cert"); return found; } /* * Read OriginatorInfo */ void read_orig_info(BER_Decoder& info, X509_Store& store) { BER_Object next = info.get_next_object(); if(next.type_tag == 0 && next.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { DataSource_Memory certs(next.value); while(!certs.end_of_data()) { // FIXME: can be attribute certs too // FIXME: DoS? X509_Certificate cert(certs); store.add_cert(cert); } next = info.get_next_object(); } if(next.type_tag == 1 && next.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { DataSource_Memory crls(next.value); while(!crls.end_of_data()) { // FIXME: DoS? X509_CRL crl(crls); store.add_crl(crl); } next = info.get_next_object(); } info.push_back(next); } /* * Decode any Attributes, and check type */ SecureVector decode_attributes(BER_Decoder& ber, const OID& type, bool& bad_attributes) { BER_Object obj = ber.get_next_object(); SecureVector digest; bool got_digest = false; bool got_content_type = false; if(obj.type_tag == 0 && obj.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) ber.push_back(obj); else { BER_Decoder attributes(obj.value); while(attributes.more_items()) { Attribute attr; attributes.decode(attr); BER_Decoder attr_value(attr.parameters); if(attr.oid == OIDS::lookup("PKCS9.MessageDigest")) { got_digest = true; attr_value.decode(digest, OCTET_STRING); } else if(attr.oid == OIDS::lookup("PKCS9.ContentType")) { got_content_type = true; OID inner_type; attr_value.decode(inner_type); if(inner_type != type) bad_attributes = true; } else throw Decoding_Error("Unknown/unhandled CMS attribute found: " + OIDS::lookup(attr.oid)); } if(!got_digest || !got_content_type) bad_attributes = true; } return digest; } } /* * Decode this layer of CMS encoding */ void CMS_Decoder::decode_layer() { try { if(status == FAILURE) throw Invalid_State("CMS: Decoder is in FAILURE state"); status = GOOD; info = ""; type = next_type; if(type == OIDS::lookup("CMS.DataContent")) return; BER_Decoder decoder(data); if(type == OIDS::lookup("CMS.CompressedData")) decompress(decoder); else if(type == OIDS::lookup("CMS.DigestedData")) { size_t version; AlgorithmIdentifier hash_algo; SecureVector digest; BER_Decoder hash_info = decoder.start_cons(SEQUENCE); hash_info.decode(version); if(version != 0 && version != 2) throw Decoding_Error("CMS: Unknown version for DigestedData"); hash_info.decode(hash_algo); read_econtent(hash_info); hash_info.decode(digest, OCTET_STRING); hash_info.end_cons(); if(digest != hash_of(data, hash_algo, info)) status = BAD; } else if(type == OIDS::lookup("CMS.SignedData")) { #if 1 throw Internal_Error("FIXME: not implemented"); #else size_t version; BER_Decoder sig_info = BER::get_subsequence(decoder); BER::decode(sig_info, version); if(version != 1 && version != 3) throw Decoding_Error("CMS: Unknown version for SignedData"); BER::get_subset(sig_info); // hash algos (do something with these?) read_econtent(sig_info); read_orig_info(sig_info, store); BER_Decoder signer_infos = BER::get_subset(sig_info); while(signer_infos.more_items()) { AlgorithmIdentifier sig_algo, hash_algo; SecureVector signature, digest; size_t version; BER_Decoder signer_info = BER::get_subsequence(signer_infos); BER::decode(signer_info, version); if(version != 1 && version != 3) throw Decoding_Error("CMS: Unknown version for SignerInfo"); std::vector certs = get_cert(signer_info, store); if(certs.size() == 0) { status = NO_KEY; continue; } BER::decode(signer_info, hash_algo); bool bad_attr = false; digest = decode_attributes(signer_info, next_type, bad_attr); if(bad_attr) { status = BAD; continue; } BER::decode(signer_info, sig_algo); BER::decode(signer_info, signature, OCTET_STRING); // unsigned attributes signer_info.verify_end(); if(digest.has_items()) { std::string hash; if(digest != hash_of(data, hash_algo, hash)) { status = BAD; continue; } status = check_sig(signed_attr, sig_algo, signature, certs[0]); } else status = check_sig(data, sig_algo, signature, certs[0]); if(status == BAD) continue; // fix this (gets only last signer, for one thing) // maybe some way for the user to get all certs that signed the // message? that would be useful info = "CN=" + cert.subject_info("CommonName") + ",O=" + cert.subject_info("Organization") + ",OU=" + cert.subject_info("Organizational Unit"); } #endif } else if(type == OIDS::lookup("CMS.EnvelopedData")) { throw Internal_Error("FIXME: not implemented"); } else if(type == OIDS::lookup("CMS.AuthenticatedData")) { throw Internal_Error("FIXME: not implemented"); } else throw Decoding_Error("CMS: Unknown content ID " + type.as_string()); } catch(std::exception) { status = FAILURE; } } } Botan-1.10.12/src/cms/cms_dec.cpp0000664000175000017500000000530212654331322016236 0ustar jackjack00000000000000/* * CMS Decoding * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * CMS_Decoder Constructor */ CMS_Decoder::CMS_Decoder(DataSource& in, const X509_Store& x509store, Private_Key* key) : store(x509store) { status = GOOD; add_key(key); if(ASN1::maybe_BER(in) && !PEM_Code::matches(in)) initial_read(in); else { DataSource_Memory ber(PEM_Code::decode_check_label(in, "PKCS7")); initial_read(ber); } } /* * Read the outermost ContentInfo */ void CMS_Decoder::initial_read(DataSource&) { // FIXME... /* BER_Decoder decoder(in); BER_Decoder content_info = decoder.start_cons(SEQUENCE); content_info.decode(next_type); BER_Decoder content_type = BER::get_subsequence(content_info, ASN1_Tag(0)); data = content_type.get_remaining(); */ decode_layer(); } /* * Add another private key to use */ void CMS_Decoder::add_key(Private_Key* key) { if(!key) return; #if 0 for(u32bit j = 0; j != keys.size(); j++) if(keys[j]->key_id() == key->key_id()) return; #endif keys.push_back(key); } /* * Return the status information */ CMS_Decoder::Status CMS_Decoder::layer_status() const { return status; } /* * Return the final data content */ std::string CMS_Decoder::get_data() const { if(layer_type() != DATA) throw Invalid_State("CMS: Cannot retrieve data from non-DATA layer"); return std::string(reinterpret_cast(&data[0]), data.size()); } /* * Return the content type of this layer */ CMS_Decoder::Content_Type CMS_Decoder::layer_type() const { if(type == OIDS::lookup("CMS.DataContent")) return DATA; if(type == OIDS::lookup("CMS.EnvelopedData")) return ENVELOPED; if(type == OIDS::lookup("CMS.CompressedData")) return COMPRESSED; if(type == OIDS::lookup("CMS.SignedData")) return SIGNED; if(type == OIDS::lookup("CMS.AuthenticatedData")) return AUTHENTICATED; if(type == OIDS::lookup("CMS.DigestedData")) return DIGESTED; return UNKNOWN; } /* * Return some information about this layer */ std::string CMS_Decoder::layer_info() const { return info; } /* * Return some information about this layer */ void CMS_Decoder::read_econtent(BER_Decoder& decoder) { BER_Decoder econtent_info = decoder.start_cons(SEQUENCE); econtent_info.decode(next_type); // FIXME //BER_Decoder econtent = BER::get_subsequence(econtent_info, ASN1_Tag(0)); //econtent.decode(data, OCTET_STRING); } } Botan-1.10.12/src/cms/cms_dec.h0000664000175000017500000000263312654331322015707 0ustar jackjack00000000000000/* * CMS Decoding * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CMS_DECODER_H__ #define BOTAN_CMS_DECODER_H__ #include #include #include #include namespace Botan { /** * CMS Decoding Operation */ class BOTAN_DLL CMS_Decoder { public: enum Status { GOOD, BAD, NO_KEY, FAILURE }; enum Content_Type { DATA, UNKNOWN, COMPRESSED, ENVELOPED, SIGNED, AUTHENTICATED, DIGESTED }; Status layer_status() const; Content_Type layer_type() const; std::string layer_info() const; std::string layer_algo() const; std::string get_data() const; std::vector get_certs() const; std::vector get_crls() const; void next_layer() { decode_layer(); } void add_key(Private_Key*); CMS_Decoder(DataSource&, const X509_Store&, Private_Key* = 0); private: std::string get_passphrase(const std::string&); void read_econtent(BER_Decoder&); void initial_read(DataSource&); void decode_layer(); void decompress(BER_Decoder&); X509_Store store; std::vector passphrases; std::vector keys; OID type, next_type; SecureVector data; Status status; std::string info; }; } #endif Botan-1.10.12/src/cms/cms_ealg.cpp0000664000175000017500000002635112654331322016422 0ustar jackjack00000000000000/* * CMS Encoding Operations * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace { /* * Choose an algorithm */ std::string choose_algo(const std::string& user_algo, const std::string& default_algo) { if(user_algo == "") return global_state().deref_alias(default_algo); return global_state().deref_alias(user_algo); } /* * Encode a SignerIdentifier/RecipientIdentifier */ DER_Encoder& encode_si(DER_Encoder& der, const X509_Certificate& cert, bool use_skid_encoding = false) { if(cert.subject_key_id().size() && use_skid_encoding) der.encode(cert.subject_key_id(), OCTET_STRING, ASN1_Tag(0)); else { der.start_cons(SEQUENCE). encode(cert.issuer_dn()). encode(BigInt::decode(cert.serial_number())). end_cons(); } return der; } /* * Compute the hash of some content */ SecureVector hash_of(const SecureVector& content, const std::string& hash_name) { Algorithm_Factory& af = global_state().algorithm_factory(); std::auto_ptr hash_fn(af.make_hash_function(hash_name)); return hash_fn->process(content); } /* * Encode Attributes containing info on content */ SecureVector encode_attr(const SecureVector& data, const std::string& type, const std::string& hash) { SecureVector digest = hash_of(data, hash); DER_Encoder encoder; encoder.encode(OIDS::lookup(type)); Attribute content_type("PKCS9.ContentType", encoder.get_contents()); encoder.encode(digest, OCTET_STRING); Attribute message_digest("PKCS9.MessageDigest", encoder.get_contents()); encoder.start_cons(SET) .encode(content_type) .encode(message_digest) .end_cons(); return encoder.get_contents(); } } /* * Encrypt a message */ void CMS_Encoder::encrypt(RandomNumberGenerator& rng, const X509_Certificate& to, const std::string user_cipher) { const std::string cipher = choose_algo(user_cipher, "TripleDES"); std::auto_ptr key(to.subject_public_key()); const std::string algo = key->algo_name(); Key_Constraints constraints = to.constraints(); if(algo == "RSA") { if(constraints != NO_CONSTRAINTS && !(constraints & KEY_ENCIPHERMENT)) throw Invalid_Argument("CMS: Constraints not set for encryption"); encrypt_ktri(rng, to, key.get(), cipher); } else if(algo == "DH") { if(constraints != NO_CONSTRAINTS && !(constraints & KEY_AGREEMENT)) throw Invalid_Argument("CMS: Constraints not set for key agreement"); encrypt_kari(rng, to, key.get(), cipher); } else throw Invalid_Argument("Unknown CMS PK encryption algorithm " + algo); } /* * Encrypt a message with a key transport algo */ void CMS_Encoder::encrypt_ktri(RandomNumberGenerator& rng, const X509_Certificate& to, Public_Key* pub_key, const std::string& cipher) { const std::string padding = "EME-PKCS1-v1_5"; const std::string pk_algo = pub_key->algo_name(); PK_Encryptor_EME encryptor(*pub_key, padding); SymmetricKey cek = setup_key(rng, cipher); AlgorithmIdentifier alg_id(OIDS::lookup(pk_algo + '/' + padding), AlgorithmIdentifier::USE_NULL_PARAM); DER_Encoder encoder; encoder.start_cons(SEQUENCE) .encode(static_cast(0)) .start_cons(SET) .start_cons(SEQUENCE) .encode(static_cast(0)); encode_si(encoder, to) .encode(alg_id) .encode(encryptor.encrypt(cek.bits_of(), rng), OCTET_STRING) .end_cons() .end_cons() .raw_bytes(do_encrypt(rng, cek, cipher)) .end_cons(); add_layer("CMS.EnvelopedData", encoder); } /* * Encrypt a message with a key agreement algo */ void CMS_Encoder::encrypt_kari(RandomNumberGenerator&, const X509_Certificate&, Public_Key*, const std::string&) { throw Internal_Error("FIXME: unimplemented"); #if 0 SymmetricKey cek = setup_key(rng, cipher); DER_Encoder encoder; encoder.start_cons(SEQUENCE); encoder.encode(2); encoder.start_cons(SET); encoder.start_sequence(ASN1_Tag(1)); encoder.encode(3); encode_si(encoder, to); encoder.encode(AlgorithmIdentifier(pk_algo + "/" + padding)); encoder.encode(encrypted_cek, OCTET_STRING); encoder.end_cons(); encoder.end_cons(); encoder.raw_bytes(do_encrypt(rng, cek, cipher)); encoder.end_cons(); add_layer("CMS.EnvelopedData", encoder); #endif } /* * Encrypt a message with a shared key */ void CMS_Encoder::encrypt(RandomNumberGenerator& rng, const SymmetricKey& kek, const std::string& user_cipher) { throw Internal_Error("FIXME: untested"); const std::string cipher = choose_algo(user_cipher, "TripleDES"); SymmetricKey cek = setup_key(rng, cipher); SecureVector kek_id; // FIXME: ? DER_Encoder encoder; encoder.start_cons(SEQUENCE) .encode(static_cast(2)) .start_explicit(ASN1_Tag(2)) .encode(static_cast(4)) .start_cons(SEQUENCE) .encode(kek_id, OCTET_STRING) .end_cons() .encode(AlgorithmIdentifier(OIDS::lookup("KeyWrap." + cipher), AlgorithmIdentifier::USE_NULL_PARAM)) .encode(wrap_key(rng, cipher, cek, kek), OCTET_STRING) .end_cons() .raw_bytes(do_encrypt(rng, cek, cipher)) .end_cons(); add_layer("CMS.EnvelopedData", encoder); } /* * Encrypt a message with a passphrase */ void CMS_Encoder::encrypt(RandomNumberGenerator&, const std::string&, const std::string& user_cipher) { const std::string cipher = choose_algo(user_cipher, "TripleDES"); throw Internal_Error("FIXME: unimplemented"); /* SymmetricKey cek = setup_key(key); DER_Encoder encoder; encoder.start_cons(SEQUENCE); encoder.encode(0); encoder.raw_bytes(do_encrypt(rng, cek, cipher)); encoder.end_cons(); add_layer("CMS.EnvelopedData", encoder); */ } /* * Encrypt the content with the chosen key/cipher */ SecureVector CMS_Encoder::do_encrypt(RandomNumberGenerator& rng, const SymmetricKey& key, const std::string& cipher_name) { Algorithm_Factory& af = global_state().algorithm_factory(); const BlockCipher* cipher = af.prototype_block_cipher(cipher_name); if(!cipher) throw Invalid_Argument("CMS: Can't encrypt with non-existent cipher " + cipher_name); if(!OIDS::have_oid(cipher->name() + "/CBC")) throw Encoding_Error("CMS: No OID assigned for " + cipher_name + "/CBC"); InitializationVector iv(rng, cipher->block_size()); AlgorithmIdentifier content_cipher; content_cipher.oid = OIDS::lookup(cipher->name() + "/CBC"); content_cipher.parameters = encode_params(cipher->name(), key, iv); Pipe pipe(new CBC_Encryption(cipher->clone(), new PKCS7_Padding, key, iv)); pipe.process_msg(data); DER_Encoder encoder; encoder.start_cons(SEQUENCE); encoder.encode(OIDS::lookup(type)); encoder.encode(content_cipher); encoder.encode(pipe.read_all(), OCTET_STRING, ASN1_Tag(0)); encoder.end_cons(); return encoder.get_contents(); } /* * Sign a message */ void CMS_Encoder::sign(const X509_Certificate& cert, const Private_Key& key, RandomNumberGenerator& rng, const std::vector& chain, const std::string& hash, const std::string& pad_algo) { std::string padding = pad_algo + "(" + hash + ")"; Signature_Format format = IEEE_1363; PK_Signer signer(key, padding, format); AlgorithmIdentifier sig_algo(OIDS::lookup(key.algo_name() + "/" + padding), AlgorithmIdentifier::USE_NULL_PARAM); SecureVector signed_attr = encode_attr(data, type, hash); signer.update(signed_attr); SecureVector signature = signer.signature(rng); signed_attr[0] = 0xA0; const size_t SI_VERSION = cert.subject_key_id().size() ? 3 : 1; const size_t CMS_VERSION = (type != "CMS.DataContent") ? 3 : SI_VERSION; DER_Encoder encoder; encoder.start_cons(SEQUENCE) .encode(CMS_VERSION) .start_cons(SET) .encode(AlgorithmIdentifier(OIDS::lookup(hash), AlgorithmIdentifier::USE_NULL_PARAM)) .end_cons() .raw_bytes(make_econtent(data, type)); encoder.start_cons(ASN1_Tag(0), CONTEXT_SPECIFIC); for(size_t j = 0; j != chain.size(); j++) encoder.raw_bytes(chain[j].BER_encode()); encoder.raw_bytes(cert.BER_encode()).end_cons(); encoder.start_cons(SET) .start_cons(SEQUENCE) .encode(SI_VERSION); encode_si(encoder, cert, ((SI_VERSION == 3) ? true : false)) .encode( AlgorithmIdentifier(OIDS::lookup(hash), AlgorithmIdentifier::USE_NULL_PARAM) ) .raw_bytes(signed_attr) .encode(sig_algo) .encode(signature, OCTET_STRING) .end_cons() .end_cons() .end_cons(); add_layer("CMS.SignedData", encoder); } /* * Digest a message */ void CMS_Encoder::digest(const std::string& user_hash) { const std::string hash = choose_algo(user_hash, "SHA-1"); if(!OIDS::have_oid(hash)) throw Encoding_Error("CMS: No OID assigned for " + hash); const size_t VERSION = (type != "CMS.DataContent") ? 2 : 0; DER_Encoder encoder; encoder.start_cons(SEQUENCE) .encode(VERSION) .encode(AlgorithmIdentifier(OIDS::lookup(hash), AlgorithmIdentifier::USE_NULL_PARAM)) .raw_bytes(make_econtent(data, type)) .encode(hash_of(data, hash), OCTET_STRING) .end_cons(); add_layer("CMS.DigestedData", encoder); } /* * MAC a message with an encrypted key */ void CMS_Encoder::authenticate(const X509_Certificate&, const std::string& mac_algo) { const std::string mac = choose_algo(mac_algo, "HMAC(SHA-1)"); throw Internal_Error("FIXME: unimplemented"); } /* * MAC a message with a shared key */ void CMS_Encoder::authenticate(const SymmetricKey&, const std::string& mac_algo) { const std::string mac = choose_algo(mac_algo, "HMAC(SHA-1)"); throw Internal_Error("FIXME: unimplemented"); } /* * MAC a message with a passphrase */ void CMS_Encoder::authenticate(const std::string&, const std::string& mac_algo) { const std::string mac = choose_algo(mac_algo, "HMAC(SHA-1)"); throw Internal_Error("FIXME: unimplemented"); } } Botan-1.10.12/src/cms/cms_enc.cpp0000664000175000017500000000334112654331322016251 0ustar jackjack00000000000000/* * CMS Encoding Base * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Setup the intitial layer of CMS data */ void CMS_Encoder::set_data(const byte buf[], size_t length) { if(!data.empty()) throw Invalid_State("Cannot call CMS_Encoder::set_data here"); data.resize(length); copy_mem(&data[0], buf, length); type = "CMS.DataContent"; } /* * Setup the intitial layer of CMS data */ void CMS_Encoder::set_data(const std::string& str) { set_data(reinterpret_cast(str.c_str()), str.length()); } /* * Finalize and return the CMS encoded data */ SecureVector CMS_Encoder::get_contents() { DER_Encoder encoder; encoder.start_cons(SEQUENCE). encode(OIDS::lookup(type)). start_explicit(0). raw_bytes(data). end_explicit(). end_cons(); data.clear(); return encoder.get_contents(); } /* * Add a new layer of encapsulation */ void CMS_Encoder::add_layer(const std::string& oid, DER_Encoder& new_layer) { data = new_layer.get_contents(); type = oid; } /* * Return the PEM-encoded data */ std::string CMS_Encoder::PEM_contents() { return PEM_Code::encode(get_contents(), "PKCS7"); } /* * Make an EncapsulatedContentInfo */ SecureVector CMS_Encoder::make_econtent(const SecureVector& data, const std::string& type) { return DER_Encoder().start_cons(SEQUENCE). encode(OIDS::lookup(type)). start_explicit(0). encode(data, OCTET_STRING). end_explicit(). end_cons(). get_contents(); } } Botan-1.10.12/src/cms/cms_enc.h0000664000175000017500000000563612654331322015727 0ustar jackjack00000000000000/* * CMS Encoding * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CMS_ENCODER_H__ #define BOTAN_CMS_ENCODER_H__ #include #include #include #include namespace Botan { /** * CMS Encoding Operation */ class BOTAN_DLL CMS_Encoder { public: void encrypt(RandomNumberGenerator&, const X509_Certificate&, const std::string = ""); void encrypt(RandomNumberGenerator& rng, const std::string&, const std::string& = ""); void encrypt(RandomNumberGenerator& rng, const SymmetricKey&, const std::string& = ""); void authenticate(const X509_Certificate&, const std::string& = ""); void authenticate(const std::string&, const std::string& = ""); void authenticate(const SymmetricKey&, const std::string& = ""); void sign(const X509_Certificate& cert, const Private_Key& key, RandomNumberGenerator& rng, const std::vector& cert_chain, const std::string& hash, const std::string& padding); void digest(const std::string& = ""); void compress(const std::string&); static bool can_compress_with(const std::string&); SecureVector get_contents(); std::string PEM_contents(); void set_data(const std::string&); void set_data(const byte[], size_t); CMS_Encoder(const std::string& str) { set_data(str); } CMS_Encoder(const byte buf[], size_t length) { set_data(buf, length); } private: void add_layer(const std::string&, DER_Encoder&); void encrypt_ktri(RandomNumberGenerator&, const X509_Certificate&, Public_Key*, const std::string&); void encrypt_kari(RandomNumberGenerator&, const X509_Certificate&, Public_Key*, const std::string&); SecureVector do_encrypt(RandomNumberGenerator& rng, const SymmetricKey&, const std::string&); static SecureVector make_econtent(const SecureVector&, const std::string&); static SymmetricKey setup_key(RandomNumberGenerator& rng, const std::string&); static SecureVector wrap_key(RandomNumberGenerator& rng, const std::string&, const SymmetricKey&, const SymmetricKey&); static SecureVector encode_params(const std::string&, const SymmetricKey&, const InitializationVector&); SecureVector data; std::string type; }; } #endif Botan-1.10.12/src/cms/info.txt0000664000175000017500000000021012654331322015622 0ustar jackjack00000000000000define CMS load_on request asn1 bigint cbc filters hash libstate oid_lookup pem pubkey sha1 algo_base x509cert Botan-1.10.12/src/codec/base64/base64.cpp0000664000175000017500000001725112654331322017312 0ustar jackjack00000000000000/* * Base64 Encoding and Decoding * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace { static const byte BIN_TO_BASE64[64] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; void do_base64_encode(char out[4], const byte in[3]) { out[0] = BIN_TO_BASE64[((in[0] & 0xFC) >> 2)]; out[1] = BIN_TO_BASE64[((in[0] & 0x03) << 4) | (in[1] >> 4)]; out[2] = BIN_TO_BASE64[((in[1] & 0x0F) << 2) | (in[2] >> 6)]; out[3] = BIN_TO_BASE64[((in[2] & 0x3F) )]; } } size_t base64_encode(char out[], const byte in[], size_t input_length, size_t& input_consumed, bool final_inputs) { input_consumed = 0; size_t input_remaining = input_length; size_t output_produced = 0; while(input_remaining >= 3) { do_base64_encode(out + output_produced, in + input_consumed); input_consumed += 3; output_produced += 4; input_remaining -= 3; } if(final_inputs && input_remaining) { byte remainder[3] = { 0 }; for(size_t i = 0; i != input_remaining; ++i) remainder[i] = in[input_consumed + i]; do_base64_encode(out + output_produced, remainder); size_t empty_bits = 8 * (3 - input_remaining); size_t index = output_produced + 4 - 1; while(empty_bits >= 8) { out[index--] = '='; empty_bits -= 6; } input_consumed += input_remaining; output_produced += 4; } return output_produced; } std::string base64_encode(const byte input[], size_t input_length) { std::string output((round_up(input_length, 3) / 3) * 4, 0); size_t consumed = 0; size_t produced = base64_encode(&output[0], input, input_length, consumed, true); BOTAN_ASSERT_EQUAL(consumed, input_length, "Did not consume all input"); BOTAN_ASSERT_EQUAL(produced, output.size(), "Did not produce right amount"); return output; } std::string base64_encode(const MemoryRegion& input) { return base64_encode(&input[0], input.size()); } size_t base64_decode(byte output[], const char input[], size_t input_length, size_t& input_consumed, bool final_inputs, bool ignore_ws) { /* * Base64 Decoder Lookup Table * Warning: assumes ASCII encodings */ static const byte BASE64_TO_BIN[256] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; byte* out_ptr = output; byte decode_buf[4]; size_t decode_buf_pos = 0; size_t final_truncate = 0; clear_mem(output, input_length * 3 / 4); for(size_t i = 0; i != input_length; ++i) { const byte bin = BASE64_TO_BIN[static_cast(input[i])]; if(bin <= 0x3F) { decode_buf[decode_buf_pos] = bin; decode_buf_pos += 1; } else if(!(bin == 0x81 || (bin == 0x80 && ignore_ws))) { std::string bad_char(1, input[i]); if(bad_char == "\t") bad_char = "\\t"; else if(bad_char == "\n") bad_char = "\\n"; else if(bad_char == "\r") bad_char = "\\r"; throw std::invalid_argument( std::string("base64_decode: invalid base64 character '") + bad_char + "'"); } /* * If we're at the end of the input, pad with 0s and truncate */ if(final_inputs && (i == input_length - 1)) { if(decode_buf_pos) { for(size_t i = decode_buf_pos; i != 4; ++i) decode_buf[i] = 0; final_truncate = (4 - decode_buf_pos); decode_buf_pos = 4; } } if(decode_buf_pos == 4) { out_ptr[0] = (decode_buf[0] << 2) | (decode_buf[1] >> 4); out_ptr[1] = (decode_buf[1] << 4) | (decode_buf[2] >> 2); out_ptr[2] = (decode_buf[2] << 6) | decode_buf[3]; out_ptr += 3; decode_buf_pos = 0; input_consumed = i+1; } } while(input_consumed < input_length && BASE64_TO_BIN[static_cast(input[input_consumed])] == 0x80) { ++input_consumed; } size_t written = (out_ptr - output) - final_truncate; return written; } size_t base64_decode(byte output[], const char input[], size_t input_length, bool ignore_ws) { size_t consumed = 0; size_t written = base64_decode(output, input, input_length, consumed, true, ignore_ws); if(consumed != input_length) throw std::invalid_argument("base64_decode: input did not have full bytes"); return written; } size_t base64_decode(byte output[], const std::string& input, bool ignore_ws) { return base64_decode(output, &input[0], input.length(), ignore_ws); } SecureVector base64_decode(const char input[], size_t input_length, bool ignore_ws) { SecureVector bin((round_up(input_length, 4) * 3) / 4); size_t written = base64_decode(&bin[0], input, input_length, ignore_ws); bin.resize(written); return bin; } SecureVector base64_decode(const std::string& input, bool ignore_ws) { return base64_decode(&input[0], input.size(), ignore_ws); } } Botan-1.10.12/src/codec/base64/base64.h0000664000175000017500000001041012654331322016745 0ustar jackjack00000000000000/* * Base64 Encoding and Decoding * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BASE64_CODEC_H__ #define BOTAN_BASE64_CODEC_H__ #include #include namespace Botan { /** * Perform base64 encoding * @param output an array of at least input_length*4/3 bytes * @param input is some binary data * @param input_length length of input in bytes * @param input_consumed is an output parameter which says how many * bytes of input were actually consumed. If less than * input_length, then the range input[consumed:length] * should be passed in later along with more input. * @param final_inputs true iff this is the last input, in which case padding chars will be applied if needed * @return number of bytes written to output */ size_t BOTAN_DLL base64_encode(char output[], const byte input[], size_t input_length, size_t& input_consumed, bool final_inputs); /** * Perform base64 encoding * @param input some input * @param input_length length of input in bytes * @return base64adecimal representation of input */ std::string BOTAN_DLL base64_encode(const byte input[], size_t input_length); /** * Perform base64 encoding * @param input some input * @return base64adecimal representation of input */ std::string BOTAN_DLL base64_encode(const MemoryRegion& input); /** * Perform base64 decoding * @param output an array of at least input_length*3/4 bytes * @param input some base64 input * @param input_length length of input in bytes * @param input_consumed is an output parameter which says how many * bytes of input were actually consumed. If less than * input_length, then the range input[consumed:length] * should be passed in later along with more input. * @param final_inputs true iff this is the last input, in which case padding is allowed * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_DLL base64_decode(byte output[], const char input[], size_t input_length, size_t& input_consumed, bool final_inputs, bool ignore_ws = true); /** * Perform base64 decoding * @param output an array of at least input_length*3/4 bytes * @param input some base64 input * @param input_length length of input in bytes * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_DLL base64_decode(byte output[], const char input[], size_t input_length, bool ignore_ws = true); /** * Perform base64 decoding * @param output an array of at least input_length/3*4 bytes * @param input some base64 input * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_DLL base64_decode(byte output[], const std::string& input, bool ignore_ws = true); /** * Perform base64 decoding * @param input some base64 input * @param input_length the length of input in bytes * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded base64 output */ SecureVector BOTAN_DLL base64_decode(const char input[], size_t input_length, bool ignore_ws = true); /** * Perform base64 decoding * @param input some base64 input * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded base64 output */ SecureVector BOTAN_DLL base64_decode(const std::string& input, bool ignore_ws = true); } #endif Botan-1.10.12/src/codec/base64/info.txt0000664000175000017500000000002412654331322017204 0ustar jackjack00000000000000define BASE64_CODEC Botan-1.10.12/src/codec/hex/hex.cpp0000664000175000017500000001316312654331322016510 0ustar jackjack00000000000000/* * Hex Encoding and Decoding * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { void hex_encode(char output[], const byte input[], size_t input_length, bool uppercase) { static const byte BIN_TO_HEX_UPPER[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; static const byte BIN_TO_HEX_LOWER[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; const byte* tbl = uppercase ? BIN_TO_HEX_UPPER : BIN_TO_HEX_LOWER; for(size_t i = 0; i != input_length; ++i) { byte x = input[i]; output[2*i ] = tbl[(x >> 4) & 0x0F]; output[2*i+1] = tbl[(x ) & 0x0F]; } } std::string hex_encode(const MemoryRegion& input, bool uppercase) { return hex_encode(&input[0], input.size(), uppercase); } std::string hex_encode(const byte input[], size_t input_length, bool uppercase) { std::string output(2 * input_length, 0); if(input_length) hex_encode(&output[0], input, input_length, uppercase); return output; } size_t hex_decode(byte output[], const char input[], size_t input_length, size_t& input_consumed, bool ignore_ws) { /* * Mapping of hex characters to either their binary equivalent * or to an error code. * If valid hex (0-9 A-F a-f), the value. * If whitespace, then 0x80 * Otherwise 0xFF * Warning: this table assumes ASCII character encodings */ static const byte HEX_TO_BIN[256] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; byte* out_ptr = output; bool top_nibble = true; clear_mem(output, input_length / 2); for(size_t i = 0; i != input_length; ++i) { const byte bin = HEX_TO_BIN[static_cast(input[i])]; if(bin >= 0x10) { if(bin == 0x80 && ignore_ws) continue; std::string bad_char(1, input[i]); if(bad_char == "\t") bad_char = "\\t"; else if(bad_char == "\n") bad_char = "\\n"; throw std::invalid_argument( std::string("hex_decode: invalid hex character '") + bad_char + "'"); } *out_ptr |= bin << (top_nibble*4); top_nibble = !top_nibble; if(top_nibble) ++out_ptr; } input_consumed = input_length; size_t written = (out_ptr - output); /* * We only got half of a byte at the end; zap the half-written * output and mark it as unread */ if(!top_nibble) { *out_ptr = 0; input_consumed -= 1; } return written; } size_t hex_decode(byte output[], const char input[], size_t input_length, bool ignore_ws) { size_t consumed = 0; size_t written = hex_decode(output, input, input_length, consumed, ignore_ws); if(consumed != input_length) throw std::invalid_argument("hex_decode: input did not have full bytes"); return written; } size_t hex_decode(byte output[], const std::string& input, bool ignore_ws) { return hex_decode(output, &input[0], input.length(), ignore_ws); } SecureVector hex_decode(const char input[], size_t input_length, bool ignore_ws) { SecureVector bin(1 + input_length / 2); size_t written = hex_decode(&bin[0], input, input_length, ignore_ws); bin.resize(written); return bin; } SecureVector hex_decode(const std::string& input, bool ignore_ws) { return hex_decode(&input[0], input.size(), ignore_ws); } } Botan-1.10.12/src/codec/hex/hex.h0000664000175000017500000000746012654331322016160 0ustar jackjack00000000000000/* * Hex Encoding and Decoding * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_HEX_CODEC_H__ #define BOTAN_HEX_CODEC_H__ #include #include namespace Botan { /** * Perform hex encoding * @param output an array of at least input_length*2 bytes * @param input is some binary data * @param input_length length of input in bytes * @param uppercase should output be upper or lower case? */ void BOTAN_DLL hex_encode(char output[], const byte input[], size_t input_length, bool uppercase = true); /** * Perform hex encoding * @param input some input * @param input_length length of input in bytes * @param uppercase should output be upper or lower case? * @return hexadecimal representation of input */ std::string BOTAN_DLL hex_encode(const byte input[], size_t input_length, bool uppercase = true); /** * Perform hex encoding * @param input some input * @param uppercase should output be upper or lower case? * @return hexadecimal representation of input */ std::string BOTAN_DLL hex_encode(const MemoryRegion& input, bool uppercase = true); /** * Perform hex decoding * @param output an array of at least input_length/2 bytes * @param input some hex input * @param input_length length of input in bytes * @param input_consumed is an output parameter which says how many * bytes of input were actually consumed. If less than * input_length, then the range input[consumed:length] * should be passed in later along with more input. * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_DLL hex_decode(byte output[], const char input[], size_t input_length, size_t& input_consumed, bool ignore_ws = true); /** * Perform hex decoding * @param output an array of at least input_length/2 bytes * @param input some hex input * @param input_length length of input in bytes * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_DLL hex_decode(byte output[], const char input[], size_t input_length, bool ignore_ws = true); /** * Perform hex decoding * @param output an array of at least input_length/2 bytes * @param input some hex input * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_DLL hex_decode(byte output[], const std::string& input, bool ignore_ws = true); /** * Perform hex decoding * @param input some hex input * @param input_length the length of input in bytes * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded hex output */ SecureVector BOTAN_DLL hex_decode(const char input[], size_t input_length, bool ignore_ws = true); /** * Perform hex decoding * @param input some hex input * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded hex output */ SecureVector BOTAN_DLL hex_decode(const std::string& input, bool ignore_ws = true); } #endif Botan-1.10.12/src/codec/hex/info.txt0000664000175000017500000000002112654331322016701 0ustar jackjack00000000000000define HEX_CODEC Botan-1.10.12/src/codec/openpgp/info.txt0000664000175000017500000000011112654331322017565 0ustar jackjack00000000000000define OPENPGP_CODEC load_on auto crc24 filters Botan-1.10.12/src/codec/openpgp/openpgp.cpp0000664000175000017500000001204412654331322020255 0ustar jackjack00000000000000/* * OpenPGP Codec * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * OpenPGP Base64 encoding */ std::string PGP_encode( const byte input[], size_t length, const std::string& label, const std::map& headers) { const std::string PGP_HEADER = "-----BEGIN PGP " + label + "-----\n"; const std::string PGP_TRAILER = "-----END PGP " + label + "-----\n"; const size_t PGP_WIDTH = 64; std::string pgp_encoded = PGP_HEADER; if(headers.find("Version") != headers.end()) pgp_encoded += "Version: " + headers.find("Version")->second + '\n'; std::map::const_iterator i = headers.begin(); while(i != headers.end()) { if(i->first != "Version") pgp_encoded += i->first + ": " + i->second + '\n'; ++i; } pgp_encoded += '\n'; Pipe pipe(new Fork( new Base64_Encoder(true, PGP_WIDTH), new Chain(new Hash_Filter(new CRC24), new Base64_Encoder) ) ); pipe.process_msg(input, length); pgp_encoded += pipe.read_all_as_string(0); pgp_encoded += '=' + pipe.read_all_as_string(1) + '\n'; pgp_encoded += PGP_TRAILER; return pgp_encoded; } /* * OpenPGP Base64 encoding */ std::string PGP_encode(const byte input[], size_t length, const std::string& type) { std::map empty; return PGP_encode(input, length, type, empty); } /* * OpenPGP Base64 decoding */ SecureVector PGP_decode(DataSource& source, std::string& label, std::map& headers) { const size_t RANDOM_CHAR_LIMIT = 5; const std::string PGP_HEADER1 = "-----BEGIN PGP "; const std::string PGP_HEADER2 = "-----"; size_t position = 0; while(position != PGP_HEADER1.length()) { byte b; if(!source.read_byte(b)) throw Decoding_Error("PGP: No PGP header found"); if(b == PGP_HEADER1[position]) ++position; else if(position >= RANDOM_CHAR_LIMIT) throw Decoding_Error("PGP: Malformed PGP header"); else position = 0; } position = 0; while(position != PGP_HEADER2.length()) { byte b; if(!source.read_byte(b)) throw Decoding_Error("PGP: No PGP header found"); if(b == PGP_HEADER2[position]) ++position; else if(position) throw Decoding_Error("PGP: Malformed PGP header"); if(position == 0) label += static_cast(b); } headers.clear(); bool end_of_headers = false; while(!end_of_headers) { std::string this_header; byte b = 0; while(b != '\n') { if(!source.read_byte(b)) throw Decoding_Error("PGP: Bad armor header"); if(b != '\n') this_header += static_cast(b); } end_of_headers = true; for(size_t j = 0; j != this_header.length(); ++j) if(!Charset::is_space(this_header[j])) end_of_headers = false; if(!end_of_headers) { std::string::size_type pos = this_header.find(": "); if(pos == std::string::npos) throw Decoding_Error("OpenPGP: Bad headers"); std::string key = this_header.substr(0, pos); std::string value = this_header.substr(pos + 2, std::string::npos); headers[key] = value; } } Pipe base64(new Base64_Decoder, new Fork(0, new Chain(new Hash_Filter(new CRC24), new Base64_Encoder) ) ); base64.start_msg(); const std::string PGP_TRAILER = "-----END PGP " + label + "-----"; position = 0; bool newline_seen = 0; std::string crc; while(position != PGP_TRAILER.length()) { byte b; if(!source.read_byte(b)) throw Decoding_Error("PGP: No PGP trailer found"); if(b == PGP_TRAILER[position]) ++position; else if(position) throw Decoding_Error("PGP: Malformed PGP trailer"); if(b == '=' && newline_seen) { while(b != '\n') { if(!source.read_byte(b)) throw Decoding_Error("PGP: Bad CRC tail"); if(b != '\n') crc += static_cast(b); } } else if(b == '\n') newline_seen = true; else if(position == 0) { base64.write(b); newline_seen = false; } } base64.end_msg(); if(crc != "" && crc != base64.read_all_as_string(1)) throw Decoding_Error("PGP: Corrupt CRC"); return base64.read_all(); } /* * OpenPGP Base64 decoding */ SecureVector PGP_decode(DataSource& source, std::string& label) { std::map ignored; return PGP_decode(source, label, ignored); } } Botan-1.10.12/src/codec/openpgp/openpgp.h0000664000175000017500000000250512654331322017723 0ustar jackjack00000000000000/* * OpenPGP Codec * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_OPENPGP_CODEC_H__ #define BOTAN_OPENPGP_CODEC_H__ #include #include #include namespace Botan { /** * @param input the input data * @param length length of input in bytes * @param label the human-readable label * @param headers a set of key/value pairs included in the header */ BOTAN_DLL std::string PGP_encode( const byte input[], size_t length, const std::string& label, const std::map& headers); /** * @param input the input data * @param length length of input in bytes * @param label the human-readable label */ BOTAN_DLL std::string PGP_encode( const byte input[], size_t length, const std::string& label); /** * @param source the input source * @param label is set to the human-readable label * @param headers is set to any headers * @return decoded output as raw binary */ BOTAN_DLL SecureVector PGP_decode( DataSource& source, std::string& label, std::map& headers); /** * @param source the input source * @param label is set to the human-readable label * @return decoded output as raw binary */ BOTAN_DLL SecureVector PGP_decode( DataSource& source, std::string& label); } #endif Botan-1.10.12/src/codec/pem/info.txt0000664000175000017500000000007312654331322016705 0ustar jackjack00000000000000define PEM_CODEC base64 codec_filt Botan-1.10.12/src/codec/pem/pem.cpp0000664000175000017500000000667412654331322016513 0ustar jackjack00000000000000/* * PEM Encoding/Decoding * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace PEM_Code { /* * PEM encode BER/DER-encoded objects */ std::string encode(const byte der[], size_t length, const std::string& label, size_t width) { const std::string PEM_HEADER = "-----BEGIN " + label + "-----\n"; const std::string PEM_TRAILER = "-----END " + label + "-----\n"; Pipe pipe(new Base64_Encoder(true, width)); pipe.process_msg(der, length); return (PEM_HEADER + pipe.read_all_as_string() + PEM_TRAILER); } /* * PEM encode BER/DER-encoded objects */ std::string encode(const MemoryRegion& data, const std::string& label, size_t width) { return encode(&data[0], data.size(), label, width); } /* * Decode PEM down to raw BER/DER */ SecureVector decode_check_label(DataSource& source, const std::string& label_want) { std::string label_got; SecureVector ber = decode(source, label_got); if(label_got != label_want) throw Decoding_Error("PEM: Label mismatch, wanted " + label_want + ", got " + label_got); return ber; } /* * Decode PEM down to raw BER/DER */ SecureVector decode(DataSource& source, std::string& label) { const size_t RANDOM_CHAR_LIMIT = 8; const std::string PEM_HEADER1 = "-----BEGIN "; const std::string PEM_HEADER2 = "-----"; size_t position = 0; while(position != PEM_HEADER1.length()) { byte b; if(!source.read_byte(b)) throw Decoding_Error("PEM: No PEM header found"); if(b == PEM_HEADER1[position]) ++position; else if(position >= RANDOM_CHAR_LIMIT) throw Decoding_Error("PEM: Malformed PEM header"); else position = 0; } position = 0; while(position != PEM_HEADER2.length()) { byte b; if(!source.read_byte(b)) throw Decoding_Error("PEM: No PEM header found"); if(b == PEM_HEADER2[position]) ++position; else if(position) throw Decoding_Error("PEM: Malformed PEM header"); if(position == 0) label += static_cast(b); } Pipe base64(new Base64_Decoder); base64.start_msg(); const std::string PEM_TRAILER = "-----END " + label + "-----"; position = 0; while(position != PEM_TRAILER.length()) { byte b; if(!source.read_byte(b)) throw Decoding_Error("PEM: No PEM trailer found"); if(b == PEM_TRAILER[position]) ++position; else if(position) throw Decoding_Error("PEM: Malformed PEM trailer"); if(position == 0) base64.write(b); } base64.end_msg(); return base64.read_all(); } /* * Search for a PEM signature */ bool matches(DataSource& source, const std::string& extra, size_t search_range) { const std::string PEM_HEADER = "-----BEGIN " + extra; SecureVector search_buf(search_range); size_t got = source.peek(&search_buf[0], search_buf.size(), 0); if(got < PEM_HEADER.length()) return false; size_t index = 0; for(size_t j = 0; j != got; ++j) { if(search_buf[j] == PEM_HEADER[index]) ++index; else index = 0; if(index == PEM_HEADER.size()) return true; } return false; } } } Botan-1.10.12/src/codec/pem/pem.h0000664000175000017500000000145312654331322016146 0ustar jackjack00000000000000/* * PEM Encoding/Decoding * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PEM_H__ #define BOTAN_PEM_H__ #include namespace Botan { namespace PEM_Code { /* * PEM Encoding/Decoding */ BOTAN_DLL std::string encode(const byte[], size_t, const std::string&, size_t = 64); BOTAN_DLL std::string encode(const MemoryRegion&, const std::string&, size_t = 64); BOTAN_DLL SecureVector decode(DataSource&, std::string&); BOTAN_DLL SecureVector decode_check_label(DataSource&, const std::string&); BOTAN_DLL bool matches(DataSource&, const std::string& = "", size_t search_range = 4096); } } #endif Botan-1.10.12/src/constructs/aont/info.txt0000664000175000017500000000010712654331322020215 0ustar jackjack00000000000000define PACKAGE_TRANSFORM block ctr rng filters Botan-1.10.12/src/constructs/aont/package.cpp0000664000175000017500000000644512654331322020633 0ustar jackjack00000000000000/* * Rivest's Package Tranform * * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { void aont_package(RandomNumberGenerator& rng, BlockCipher* cipher, const byte input[], size_t input_len, byte output[]) { const size_t BLOCK_SIZE = cipher->block_size(); if(!cipher->valid_keylength(BLOCK_SIZE)) throw Invalid_Argument("AONT::package: Invalid cipher"); // The all-zero string which is used both as the CTR IV and as K0 const std::string all_zeros(BLOCK_SIZE*2, '0'); SymmetricKey package_key(rng, BLOCK_SIZE); Pipe pipe(new StreamCipher_Filter(new CTR_BE(cipher), package_key)); pipe.process_msg(input, input_len); pipe.read(output, pipe.remaining()); // Set K0 (the all zero key) cipher->set_key(SymmetricKey(all_zeros)); SecureVector buf(BLOCK_SIZE); const size_t blocks = (input_len + BLOCK_SIZE - 1) / BLOCK_SIZE; byte* final_block = output + input_len; clear_mem(final_block, BLOCK_SIZE); // XOR the hash blocks into the final block for(size_t i = 0; i != blocks; ++i) { const size_t left = std::min(BLOCK_SIZE, input_len - BLOCK_SIZE * i); zeroise(buf); copy_mem(&buf[0], output + (BLOCK_SIZE * i), left); for(size_t j = 0; j != sizeof(i); ++j) buf[BLOCK_SIZE - 1 - j] ^= get_byte(sizeof(i)-1-j, i); cipher->encrypt(buf); xor_buf(final_block, buf, BLOCK_SIZE); } // XOR the random package key into the final block xor_buf(final_block, package_key.begin(), BLOCK_SIZE); } void aont_unpackage(BlockCipher* cipher, const byte input[], size_t input_len, byte output[]) { const size_t BLOCK_SIZE = cipher->block_size(); if(!cipher->valid_keylength(BLOCK_SIZE)) throw Invalid_Argument("AONT::unpackage: Invalid cipher"); if(input_len < BLOCK_SIZE) throw Invalid_Argument("AONT::unpackage: Input too short"); // The all-zero string which is used both as the CTR IV and as K0 const std::string all_zeros(BLOCK_SIZE*2, '0'); cipher->set_key(SymmetricKey(all_zeros)); SecureVector package_key(BLOCK_SIZE); SecureVector buf(BLOCK_SIZE); // Copy the package key (masked with the block hashes) copy_mem(&package_key[0], input + (input_len - BLOCK_SIZE), BLOCK_SIZE); const size_t blocks = ((input_len - 1) / BLOCK_SIZE); // XOR the blocks into the package key bits for(size_t i = 0; i != blocks; ++i) { const size_t left = std::min(BLOCK_SIZE, input_len - BLOCK_SIZE * (i+1)); zeroise(buf); copy_mem(&buf[0], input + (BLOCK_SIZE * i), left); for(size_t j = 0; j != sizeof(i); ++j) buf[BLOCK_SIZE - 1 - j] ^= get_byte(sizeof(i)-1-j, i); cipher->encrypt(buf); xor_buf(&package_key[0], buf, BLOCK_SIZE); } Pipe pipe(new StreamCipher_Filter(new CTR_BE(cipher), package_key)); pipe.process_msg(input, input_len - BLOCK_SIZE); pipe.read(output, pipe.remaining()); } } Botan-1.10.12/src/constructs/aont/package.h0000664000175000017500000000237412654331322020275 0ustar jackjack00000000000000/* * Rivest's Package Tranform * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_AONT_PACKAGE_TRANSFORM_H__ #define BOTAN_AONT_PACKAGE_TRANSFORM_H__ #include #include namespace Botan { /** * Rivest's Package Tranform * @param rng the random number generator to use * @param cipher the block cipher to use * @param input the input data buffer * @param input_len the length of the input data in bytes * @param output the output data buffer (must be at least * input_len + cipher->BLOCK_SIZE bytes long) */ void BOTAN_DLL aont_package(RandomNumberGenerator& rng, BlockCipher* cipher, const byte input[], size_t input_len, byte output[]); /** * Rivest's Package Tranform (Inversion) * @param cipher the block cipher to use * @param input the input data buffer * @param input_len the length of the input data in bytes * @param output the output data buffer (must be at least * input_len - cipher->BLOCK_SIZE bytes long) */ void BOTAN_DLL aont_unpackage(BlockCipher* cipher, const byte input[], size_t input_len, byte output[]); } #endif Botan-1.10.12/src/constructs/cryptobox/cryptobox.cpp0000664000175000017500000001123512654331322022352 0ustar jackjack00000000000000/* * Cryptobox Message Routines * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace CryptoBox { namespace { /* First 24 bits of SHA-256("Botan Cryptobox"), followed by 8 0 bits for later use as flags, etc if needed */ const u32bit CRYPTOBOX_VERSION_CODE = 0xEFC22400; const size_t VERSION_CODE_LEN = 4; const size_t CIPHER_KEY_LEN = 32; const size_t CIPHER_IV_LEN = 16; const size_t MAC_KEY_LEN = 32; const size_t MAC_OUTPUT_LEN = 20; const size_t PBKDF_SALT_LEN = 10; const size_t PBKDF_ITERATIONS = 8 * 1024; const size_t PBKDF_OUTPUT_LEN = CIPHER_KEY_LEN + CIPHER_IV_LEN + MAC_KEY_LEN; } std::string encrypt(const byte input[], size_t input_len, const std::string& passphrase, RandomNumberGenerator& rng) { SecureVector pbkdf_salt(PBKDF_SALT_LEN); rng.randomize(&pbkdf_salt[0], pbkdf_salt.size()); PKCS5_PBKDF2 pbkdf(new HMAC(new SHA_512)); OctetString master_key = pbkdf.derive_key( PBKDF_OUTPUT_LEN, passphrase, &pbkdf_salt[0], pbkdf_salt.size(), PBKDF_ITERATIONS); const byte* mk = master_key.begin(); SymmetricKey cipher_key(&mk[0], CIPHER_KEY_LEN); SymmetricKey mac_key(&mk[CIPHER_KEY_LEN], MAC_KEY_LEN); InitializationVector iv(&mk[CIPHER_KEY_LEN + MAC_KEY_LEN], CIPHER_IV_LEN); Pipe pipe(get_cipher("Serpent/CTR-BE", cipher_key, iv, ENCRYPTION), new Fork( 0, new MAC_Filter(new HMAC(new SHA_512), mac_key, MAC_OUTPUT_LEN))); pipe.process_msg(input, input_len); /* Output format is: version # (4 bytes) salt (10 bytes) mac (20 bytes) ciphertext */ const size_t ciphertext_len = pipe.remaining(0); SecureVector out_buf(VERSION_CODE_LEN + PBKDF_SALT_LEN + MAC_OUTPUT_LEN + ciphertext_len); for(size_t i = 0; i != VERSION_CODE_LEN; ++i) out_buf[i] = get_byte(i, CRYPTOBOX_VERSION_CODE); copy_mem(&out_buf[VERSION_CODE_LEN], &pbkdf_salt[0], PBKDF_SALT_LEN); pipe.read(&out_buf[VERSION_CODE_LEN + PBKDF_SALT_LEN], MAC_OUTPUT_LEN, 1); pipe.read(&out_buf[VERSION_CODE_LEN + PBKDF_SALT_LEN + MAC_OUTPUT_LEN], ciphertext_len, 0); return PEM_Code::encode(out_buf, "BOTAN CRYPTOBOX MESSAGE"); } std::string decrypt(const byte input[], size_t input_len, const std::string& passphrase) { DataSource_Memory input_src(input, input_len); SecureVector ciphertext = PEM_Code::decode_check_label(input_src, "BOTAN CRYPTOBOX MESSAGE"); if(ciphertext.size() < (VERSION_CODE_LEN + PBKDF_SALT_LEN + MAC_OUTPUT_LEN)) throw Decoding_Error("Invalid CryptoBox input"); for(size_t i = 0; i != VERSION_CODE_LEN; ++i) if(ciphertext[i] != get_byte(i, CRYPTOBOX_VERSION_CODE)) throw Decoding_Error("Bad CryptoBox version"); const byte* pbkdf_salt = &ciphertext[VERSION_CODE_LEN]; PKCS5_PBKDF2 pbkdf(new HMAC(new SHA_512)); OctetString master_key = pbkdf.derive_key( PBKDF_OUTPUT_LEN, passphrase, pbkdf_salt, PBKDF_SALT_LEN, PBKDF_ITERATIONS); const byte* mk = master_key.begin(); SymmetricKey cipher_key(&mk[0], CIPHER_KEY_LEN); SymmetricKey mac_key(&mk[CIPHER_KEY_LEN], MAC_KEY_LEN); InitializationVector iv(&mk[CIPHER_KEY_LEN + MAC_KEY_LEN], CIPHER_IV_LEN); Pipe pipe(new Fork( get_cipher("Serpent/CTR-BE", cipher_key, iv, DECRYPTION), new MAC_Filter(new HMAC(new SHA_512), mac_key, MAC_OUTPUT_LEN))); const size_t ciphertext_offset = VERSION_CODE_LEN + PBKDF_SALT_LEN + MAC_OUTPUT_LEN; pipe.process_msg(&ciphertext[ciphertext_offset], ciphertext.size() - ciphertext_offset); byte computed_mac[MAC_OUTPUT_LEN]; pipe.read(computed_mac, MAC_OUTPUT_LEN, 1); if(!same_mem(computed_mac, &ciphertext[VERSION_CODE_LEN + PBKDF_SALT_LEN], MAC_OUTPUT_LEN)) throw Decoding_Error("CryptoBox integrity failure"); return pipe.read_all_as_string(0); } std::string decrypt(const std::string& input, const std::string& passphrase) { return decrypt(reinterpret_cast(&input[0]), input.size(), passphrase); } } } Botan-1.10.12/src/constructs/cryptobox/cryptobox.h0000664000175000017500000000255112654331322022020 0ustar jackjack00000000000000/* * Cryptobox Message Routines * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CRYPTOBOX_H__ #define BOTAN_CRYPTOBOX_H__ #include #include namespace Botan { /** * This namespace holds various high-level crypto functions */ namespace CryptoBox { /** * Encrypt a message using a passphrase * @param input the input data * @param input_len the length of input in bytes * @param passphrase the passphrase used to encrypt the message * @param rng a ref to a random number generator, such as AutoSeeded_RNG */ BOTAN_DLL std::string encrypt(const byte input[], size_t input_len, const std::string& passphrase, RandomNumberGenerator& rng); /** * Decrypt a message encrypted with CryptoBox::encrypt * @param input the input data * @param input_len the length of input in bytes * @param passphrase the passphrase used to encrypt the message */ BOTAN_DLL std::string decrypt(const byte input[], size_t input_len, const std::string& passphrase); /** * Decrypt a message encrypted with CryptoBox::encrypt * @param input the input data * @param passphrase the passphrase used to encrypt the message */ BOTAN_DLL std::string decrypt(const std::string& input, const std::string& passphrase); } } #endif Botan-1.10.12/src/constructs/cryptobox/info.txt0000664000175000017500000000014112654331322021303 0ustar jackjack00000000000000define CRYPTO_BOX filters ctr hmac rng serpent sha2_64 base64 pbkdf2 pem Botan-1.10.12/src/constructs/fpe_fe1/fpe_fe1.cpp0000664000175000017500000001017612654331322021105 0ustar jackjack00000000000000/* * Format Preserving Encryption using the scheme FE1 from the paper * "Format-Preserving Encryption" by Bellare, Rogaway, et al * (http://eprint.iacr.org/2009/251) * * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace FPE { namespace { // Normally FPE is for SSNs, CC#s, etc, nothing too big const size_t MAX_N_BYTES = 128/8; /* * Factor n into a and b which are as close together as possible. * Assumes n is composed mostly of small factors which is the case for * typical uses of FPE (typically, n is a power of 10) * * Want a >= b since the safe number of rounds is 2+log_a(b); if a >= b * then this is always 3 */ void factor(BigInt n, BigInt& a, BigInt& b) { a = 1; b = 1; size_t n_low_zero = low_zero_bits(n); a <<= (n_low_zero / 2); b <<= n_low_zero - (n_low_zero / 2); n >>= n_low_zero; for(size_t i = 0; i != PRIME_TABLE_SIZE; ++i) { while(n % PRIMES[i] == 0) { a *= PRIMES[i]; if(a > b) std::swap(a, b); n /= PRIMES[i]; } } if(a > b) std::swap(a, b); a *= n; if(a < b) std::swap(a, b); if(a <= 1 || b <= 1) throw std::runtime_error("Could not factor n for use in FPE"); } /* * According to a paper by Rogaway, Bellare, etc, the min safe number * of rounds to use for FPE is 2+log_a(b). If a >= b then log_a(b) <= 1 * so 3 rounds is safe. The FPE factorization routine should always * return a >= b, so just confirm that and return 3. */ size_t rounds(const BigInt& a, const BigInt& b) { if(a < b) throw std::logic_error("FPE rounds: a < b"); return 3; } /* * A simple round function based on HMAC(SHA-256) */ class FPE_Encryptor { public: FPE_Encryptor(const SymmetricKey& key, const BigInt& n, const MemoryRegion& tweak); ~FPE_Encryptor() { delete mac; } BigInt operator()(size_t i, const BigInt& R); private: MessageAuthenticationCode* mac; SecureVector mac_n_t; }; FPE_Encryptor::FPE_Encryptor(const SymmetricKey& key, const BigInt& n, const MemoryRegion& tweak) { mac = new HMAC(new SHA_256); mac->set_key(key); SecureVector n_bin = BigInt::encode(n); if(n_bin.size() > MAX_N_BYTES) throw std::runtime_error("N is too large for FPE encryption"); mac->update_be(static_cast(n_bin.size())); mac->update(&n_bin[0], n_bin.size()); mac->update_be(static_cast(tweak.size())); mac->update(&tweak[0], tweak.size()); mac_n_t = mac->final(); } BigInt FPE_Encryptor::operator()(size_t round_no, const BigInt& R) { SecureVector r_bin = BigInt::encode(R); mac->update(mac_n_t); mac->update_be(static_cast(round_no)); mac->update_be(static_cast(r_bin.size())); mac->update(&r_bin[0], r_bin.size()); SecureVector X = mac->final(); return BigInt(&X[0], X.size()); } } /* * Generic Z_n FPE encryption, FE1 scheme */ BigInt fe1_encrypt(const BigInt& n, const BigInt& X0, const SymmetricKey& key, const MemoryRegion& tweak) { FPE_Encryptor F(key, n, tweak); BigInt a, b; factor(n, a, b); const size_t r = rounds(a, b); BigInt X = X0; for(size_t i = 0; i != r; ++i) { BigInt L = X / b; BigInt R = X % b; BigInt W = (L + F(i, R)) % a; X = a * R + W; } return X; } /* * Generic Z_n FPE decryption, FD1 scheme */ BigInt fe1_decrypt(const BigInt& n, const BigInt& X0, const SymmetricKey& key, const MemoryRegion& tweak) { FPE_Encryptor F(key, n, tweak); BigInt a, b; factor(n, a, b); const size_t r = rounds(a, b); BigInt X = X0; for(size_t i = 0; i != r; ++i) { BigInt W = X % a; BigInt R = X / a; BigInt L = (W - F(r-i-1, R)) % a; X = b * L + R; } return X; } } } Botan-1.10.12/src/constructs/fpe_fe1/fpe_fe1.h0000664000175000017500000000207012654331322020544 0ustar jackjack00000000000000/* * Format Preserving Encryption (FE1 scheme) * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_FPE_FE1_H__ #define BOTAN_FPE_FE1_H__ #include #include namespace Botan { namespace FPE { /** * Encrypt X from and onto the group Z_n using key and tweak * @param n the modulus * @param X the plaintext as a BigInt * @param key a random key * @param tweak will modify the ciphertext (think of as an IV) */ BigInt BOTAN_DLL fe1_encrypt(const BigInt& n, const BigInt& X, const SymmetricKey& key, const MemoryRegion& tweak); /** * Decrypt X from and onto the group Z_n using key and tweak * @param n the modulus * @param X the ciphertext as a BigInt * @param key is the key used for encryption * @param tweak the same tweak used for encryption */ BigInt BOTAN_DLL fe1_decrypt(const BigInt& n, const BigInt& X, const SymmetricKey& key, const MemoryRegion& tweak); } } #endif Botan-1.10.12/src/constructs/fpe_fe1/info.txt0000664000175000017500000000007312654331322020563 0ustar jackjack00000000000000define FPE_FE1 hmac sha2_32 bigint Botan-1.10.12/src/constructs/rfc3394/info.txt0000664000175000017500000000002712654331322020352 0ustar jackjack00000000000000define RFC3394_KEYWRAP Botan-1.10.12/src/constructs/rfc3394/rfc3394.cpp0000664000175000017500000000544412654331322020467 0ustar jackjack00000000000000/* * AES Key Wrap (RFC 3394) * (C) 2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { BlockCipher* make_aes(size_t keylength, Algorithm_Factory& af) { if(keylength == 16) return af.make_block_cipher("AES-128"); else if(keylength == 24) return af.make_block_cipher("AES-192"); else if(keylength == 32) return af.make_block_cipher("AES-256"); else throw std::invalid_argument("Bad KEK length for NIST keywrap"); } } SecureVector rfc3394_keywrap(const MemoryRegion& key, const SymmetricKey& kek, Algorithm_Factory& af) { if(key.size() % 8 != 0) throw std::invalid_argument("Bad input key size for NIST key wrap"); std::auto_ptr aes(make_aes(kek.length(), af)); aes->set_key(kek); const size_t n = key.size() / 8; SecureVector R((n + 1) * 8); SecureVector A(16); for(size_t i = 0; i != 8; ++i) A[i] = 0xA6; copy_mem(&R[8], key.begin(), key.size()); for(size_t j = 0; j <= 5; ++j) { for(size_t i = 1; i <= n; ++i) { const u32bit t = (n * j) + i; copy_mem(&A[8], &R[8*i], 8); aes->encrypt(&A[0]); copy_mem(&R[8*i], &A[8], 8); byte t_buf[4] = { 0 }; store_be(t, t_buf); xor_buf(&A[4], &t_buf[0], 4); } } copy_mem(&R[0], &A[0], 8); return R; } SecureVector rfc3394_keyunwrap(const MemoryRegion& key, const SymmetricKey& kek, Algorithm_Factory& af) { if(key.size() < 16 || key.size() % 8 != 0) throw std::invalid_argument("Bad input key size for NIST key unwrap"); std::auto_ptr aes(make_aes(kek.length(), af)); aes->set_key(kek); const size_t n = (key.size() - 8) / 8; SecureVector R(n * 8); SecureVector A(16); for(size_t i = 0; i != 8; ++i) A[i] = key[i]; copy_mem(&R[0], key.begin() + 8, key.size() - 8); for(size_t j = 0; j <= 5; ++j) { for(size_t i = n; i != 0; --i) { const u32bit t = (5 - j) * n + i; byte t_buf[4] = { 0 }; store_be(t, t_buf); xor_buf(&A[4], &t_buf[0], 4); copy_mem(&A[8], &R[8*(i-1)], 8); aes->decrypt(&A[0]); copy_mem(&R[8*(i-1)], &A[8], 8); } } if(load_be(&A[0], 0) != 0xA6A6A6A6A6A6A6A6) throw Integrity_Failure("NIST key unwrap failed"); return R; } } Botan-1.10.12/src/constructs/rfc3394/rfc3394.h0000664000175000017500000000222512654331322020126 0ustar jackjack00000000000000/* * AES Key Wrap (RFC 3394) * (C) 2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_AES_KEY_WRAP_H__ #define BOTAN_AES_KEY_WRAP_H__ #include namespace Botan { class Algorithm_Factory; /** * Encrypt a key under a key encryption key using the algorithm * described in RFC 3394 * * @param key the plaintext key to encrypt * @param kek the key encryption key * @param af an algorithm factory * @return key encrypted under kek */ SecureVector BOTAN_DLL rfc3394_keywrap(const MemoryRegion& key, const SymmetricKey& kek, Algorithm_Factory& af); /** * Decrypt a key under a key encryption key using the algorithm * described in RFC 3394 * * @param key the encrypted key to decrypt * @param kek the key encryption key * @param af an algorithm factory * @return key decrypted under kek */ SecureVector BOTAN_DLL rfc3394_keyunwrap(const MemoryRegion& key, const SymmetricKey& kek, Algorithm_Factory& af); } #endif Botan-1.10.12/src/constructs/srp6/info.txt0000664000175000017500000000007112654331322020146 0ustar jackjack00000000000000define SRP6 bigint hash dl_group Botan-1.10.12/src/constructs/srp6/srp6.cpp0000664000175000017500000001122212654331322020050 0ustar jackjack00000000000000/* * SRP-6a (RFC 5054 compatatible) * (C) 2011,2012 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace { BigInt hash_seq(const std::string& hash_id, size_t pad_to, const BigInt& in1, const BigInt& in2) { std::auto_ptr hash_fn( global_state().algorithm_factory().make_hash_function(hash_id)); hash_fn->update(BigInt::encode_1363(in1, pad_to)); hash_fn->update(BigInt::encode_1363(in2, pad_to)); return BigInt::decode(hash_fn->final()); } BigInt hash_seq(const std::string& hash_id, size_t pad_to, const BigInt& in1, const BigInt& in2, const BigInt& in3) { std::auto_ptr hash_fn( global_state().algorithm_factory().make_hash_function(hash_id)); hash_fn->update(BigInt::encode_1363(in1, pad_to)); hash_fn->update(BigInt::encode_1363(in2, pad_to)); hash_fn->update(BigInt::encode_1363(in3, pad_to)); return BigInt::decode(hash_fn->final()); } BigInt compute_x(const std::string& hash_id, const std::string& identifier, const std::string& password, const MemoryRegion& salt) { std::auto_ptr hash_fn( global_state().algorithm_factory().make_hash_function(hash_id)); hash_fn->update(identifier); hash_fn->update(":"); hash_fn->update(password); SecureVector inner_h = hash_fn->final(); hash_fn->update(salt); hash_fn->update(inner_h); SecureVector outer_h = hash_fn->final(); return BigInt::decode(outer_h); } } std::string srp6_group_identifier(const BigInt& N, const BigInt& g) { /* This function assumes that only one 'standard' SRP parameter set has been defined for a particular bitsize. As of this writing that is the case. */ try { const std::string group_name = "modp/srp/" + to_string(N.bits()); DL_Group group(group_name); if(group.get_p() == N && group.get_g() == g) return group_name; throw std::runtime_error("Unknown SRP params"); } catch(...) { throw Invalid_Argument("Bad SRP group parameters"); } } std::pair srp6_client_agree(const std::string& identifier, const std::string& password, const std::string& group_id, const std::string& hash_id, const MemoryRegion& salt, const BigInt& B, RandomNumberGenerator& rng) { DL_Group group(group_id); const BigInt& g = group.get_g(); const BigInt& p = group.get_p(); const size_t p_bytes = group.get_p().bytes(); if(B <= 0 || B >= p) throw std::runtime_error("Invalid SRP parameter from server"); BigInt k = hash_seq(hash_id, p_bytes, p, g); BigInt a(rng, 256); BigInt A = power_mod(g, a, p); BigInt u = hash_seq(hash_id, p_bytes, A, B); const BigInt x = compute_x(hash_id, identifier, password, salt); BigInt S = power_mod((B - (k * power_mod(g, x, p))) % p, (a + (u * x)), p); SymmetricKey Sk(BigInt::encode_1363(S, p_bytes)); return std::make_pair(A, Sk); } BigInt generate_srp6_verifier(const std::string& identifier, const std::string& password, const MemoryRegion& salt, const std::string& group_id, const std::string& hash_id) { const BigInt x = compute_x(hash_id, identifier, password, salt); DL_Group group(group_id); return power_mod(group.get_g(), x, group.get_p()); } BigInt SRP6_Server_Session::step1(const BigInt& v, const std::string& group_id, const std::string& hash_id, RandomNumberGenerator& rng) { DL_Group group(group_id); const BigInt& g = group.get_g(); const BigInt& p = group.get_p(); p_bytes = p.bytes(); BigInt k = hash_seq(hash_id, p_bytes, p, g); BigInt b(rng, 256); B = (v*k + power_mod(g, b, p)) % p; this->v = v; this->b = b; this->p = p; this->hash_id = hash_id; return B; } SymmetricKey SRP6_Server_Session::step2(const BigInt& A) { if(A <= 0 || A >= p) throw std::runtime_error("Invalid SRP parameter from client"); BigInt u = hash_seq(hash_id, p_bytes, A, B); BigInt S = power_mod(A * power_mod(v, u, p), b, p); return BigInt::encode_1363(S, p_bytes); } } Botan-1.10.12/src/constructs/srp6/srp6.h0000664000175000017500000000462412654331322017525 0ustar jackjack00000000000000/* * SRP-6a (RFC 5054 compatatible) * (C) 2011,2012 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RFC5054_SRP6_H__ #define BOTAN_RFC5054_SRP6_H__ #include #include #include #include #include namespace Botan { /** * SRP6a Client side * @param username the username we are attempting login for * @param password the password we are attempting to use * @param group_id specifies the shared SRP group * @param hash_id specifies a secure hash function * @param salt is the salt value sent by the server * @param B is the server's public value * @param rng is a random number generator * * @return (A,K) the client public key and the shared secret key */ std::pair BOTAN_DLL srp6_client_agree(const std::string& username, const std::string& password, const std::string& group_id, const std::string& hash_id, const MemoryRegion& salt, const BigInt& B, RandomNumberGenerator& rng); /** * Generate a new SRP-6 verifier * @param identifier a username or other client identifier * @param password the secret used to authenticate user * @param salt a randomly chosen value, at least 128 bits long */ BigInt BOTAN_DLL generate_srp6_verifier(const std::string& identifier, const std::string& password, const MemoryRegion& salt, const std::string& group_id, const std::string& hash_id); /** * Return the group id for this SRP param set, or else thrown an * exception */ std::string BOTAN_DLL srp6_group_identifier(const BigInt& N, const BigInt& g); /** * Represents a SRP-6a server session */ class BOTAN_DLL SRP6_Server_Session { public: /** * Server side step 1 * @param v the verification value saved from client registration */ BigInt step1(const BigInt& v, const std::string& group_id, const std::string& hash_id, RandomNumberGenerator& rng); SymmetricKey step2(const BigInt& A); private: std::string hash_id; BigInt B, b, v, S, p; size_t p_bytes; }; } #endif Botan-1.10.12/src/constructs/tss/info.txt0000664000175000017500000000011512654331322020064 0ustar jackjack00000000000000define THRESHOLD_SECRET_SHARING hash rng filters hex Botan-1.10.12/src/constructs/tss/tss.cpp0000664000175000017500000002065512654331322017720 0ustar jackjack00000000000000/* * RTSS (threshold secret sharing) * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { /** Table for GF(2^8) arithmetic (exponentials) */ const byte RTSS_EXP[256] = { 0x01, 0x03, 0x05, 0x0F, 0x11, 0x33, 0x55, 0xFF, 0x1A, 0x2E, 0x72, 0x96, 0xA1, 0xF8, 0x13, 0x35, 0x5F, 0xE1, 0x38, 0x48, 0xD8, 0x73, 0x95, 0xA4, 0xF7, 0x02, 0x06, 0x0A, 0x1E, 0x22, 0x66, 0xAA, 0xE5, 0x34, 0x5C, 0xE4, 0x37, 0x59, 0xEB, 0x26, 0x6A, 0xBE, 0xD9, 0x70, 0x90, 0xAB, 0xE6, 0x31, 0x53, 0xF5, 0x04, 0x0C, 0x14, 0x3C, 0x44, 0xCC, 0x4F, 0xD1, 0x68, 0xB8, 0xD3, 0x6E, 0xB2, 0xCD, 0x4C, 0xD4, 0x67, 0xA9, 0xE0, 0x3B, 0x4D, 0xD7, 0x62, 0xA6, 0xF1, 0x08, 0x18, 0x28, 0x78, 0x88, 0x83, 0x9E, 0xB9, 0xD0, 0x6B, 0xBD, 0xDC, 0x7F, 0x81, 0x98, 0xB3, 0xCE, 0x49, 0xDB, 0x76, 0x9A, 0xB5, 0xC4, 0x57, 0xF9, 0x10, 0x30, 0x50, 0xF0, 0x0B, 0x1D, 0x27, 0x69, 0xBB, 0xD6, 0x61, 0xA3, 0xFE, 0x19, 0x2B, 0x7D, 0x87, 0x92, 0xAD, 0xEC, 0x2F, 0x71, 0x93, 0xAE, 0xE9, 0x20, 0x60, 0xA0, 0xFB, 0x16, 0x3A, 0x4E, 0xD2, 0x6D, 0xB7, 0xC2, 0x5D, 0xE7, 0x32, 0x56, 0xFA, 0x15, 0x3F, 0x41, 0xC3, 0x5E, 0xE2, 0x3D, 0x47, 0xC9, 0x40, 0xC0, 0x5B, 0xED, 0x2C, 0x74, 0x9C, 0xBF, 0xDA, 0x75, 0x9F, 0xBA, 0xD5, 0x64, 0xAC, 0xEF, 0x2A, 0x7E, 0x82, 0x9D, 0xBC, 0xDF, 0x7A, 0x8E, 0x89, 0x80, 0x9B, 0xB6, 0xC1, 0x58, 0xE8, 0x23, 0x65, 0xAF, 0xEA, 0x25, 0x6F, 0xB1, 0xC8, 0x43, 0xC5, 0x54, 0xFC, 0x1F, 0x21, 0x63, 0xA5, 0xF4, 0x07, 0x09, 0x1B, 0x2D, 0x77, 0x99, 0xB0, 0xCB, 0x46, 0xCA, 0x45, 0xCF, 0x4A, 0xDE, 0x79, 0x8B, 0x86, 0x91, 0xA8, 0xE3, 0x3E, 0x42, 0xC6, 0x51, 0xF3, 0x0E, 0x12, 0x36, 0x5A, 0xEE, 0x29, 0x7B, 0x8D, 0x8C, 0x8F, 0x8A, 0x85, 0x94, 0xA7, 0xF2, 0x0D, 0x17, 0x39, 0x4B, 0xDD, 0x7C, 0x84, 0x97, 0xA2, 0xFD, 0x1C, 0x24, 0x6C, 0xB4, 0xC7, 0x52, 0xF6, 0x01 }; /** Table for GF(2^8) arithmetic (logarithms) */ const byte RTSS_LOG[] = { 0x90, 0x00, 0x19, 0x01, 0x32, 0x02, 0x1A, 0xC6, 0x4B, 0xC7, 0x1B, 0x68, 0x33, 0xEE, 0xDF, 0x03, 0x64, 0x04, 0xE0, 0x0E, 0x34, 0x8D, 0x81, 0xEF, 0x4C, 0x71, 0x08, 0xC8, 0xF8, 0x69, 0x1C, 0xC1, 0x7D, 0xC2, 0x1D, 0xB5, 0xF9, 0xB9, 0x27, 0x6A, 0x4D, 0xE4, 0xA6, 0x72, 0x9A, 0xC9, 0x09, 0x78, 0x65, 0x2F, 0x8A, 0x05, 0x21, 0x0F, 0xE1, 0x24, 0x12, 0xF0, 0x82, 0x45, 0x35, 0x93, 0xDA, 0x8E, 0x96, 0x8F, 0xDB, 0xBD, 0x36, 0xD0, 0xCE, 0x94, 0x13, 0x5C, 0xD2, 0xF1, 0x40, 0x46, 0x83, 0x38, 0x66, 0xDD, 0xFD, 0x30, 0xBF, 0x06, 0x8B, 0x62, 0xB3, 0x25, 0xE2, 0x98, 0x22, 0x88, 0x91, 0x10, 0x7E, 0x6E, 0x48, 0xC3, 0xA3, 0xB6, 0x1E, 0x42, 0x3A, 0x6B, 0x28, 0x54, 0xFA, 0x85, 0x3D, 0xBA, 0x2B, 0x79, 0x0A, 0x15, 0x9B, 0x9F, 0x5E, 0xCA, 0x4E, 0xD4, 0xAC, 0xE5, 0xF3, 0x73, 0xA7, 0x57, 0xAF, 0x58, 0xA8, 0x50, 0xF4, 0xEA, 0xD6, 0x74, 0x4F, 0xAE, 0xE9, 0xD5, 0xE7, 0xE6, 0xAD, 0xE8, 0x2C, 0xD7, 0x75, 0x7A, 0xEB, 0x16, 0x0B, 0xF5, 0x59, 0xCB, 0x5F, 0xB0, 0x9C, 0xA9, 0x51, 0xA0, 0x7F, 0x0C, 0xF6, 0x6F, 0x17, 0xC4, 0x49, 0xEC, 0xD8, 0x43, 0x1F, 0x2D, 0xA4, 0x76, 0x7B, 0xB7, 0xCC, 0xBB, 0x3E, 0x5A, 0xFB, 0x60, 0xB1, 0x86, 0x3B, 0x52, 0xA1, 0x6C, 0xAA, 0x55, 0x29, 0x9D, 0x97, 0xB2, 0x87, 0x90, 0x61, 0xBE, 0xDC, 0xFC, 0xBC, 0x95, 0xCF, 0xCD, 0x37, 0x3F, 0x5B, 0xD1, 0x53, 0x39, 0x84, 0x3C, 0x41, 0xA2, 0x6D, 0x47, 0x14, 0x2A, 0x9E, 0x5D, 0x56, 0xF2, 0xD3, 0xAB, 0x44, 0x11, 0x92, 0xD9, 0x23, 0x20, 0x2E, 0x89, 0xB4, 0x7C, 0xB8, 0x26, 0x77, 0x99, 0xE3, 0xA5, 0x67, 0x4A, 0xED, 0xDE, 0xC5, 0x31, 0xFE, 0x18, 0x0D, 0x63, 0x8C, 0x80, 0xC0, 0xF7, 0x70, 0x07 }; byte gfp_mul(byte x, byte y) { if(x == 0 || y == 0) return 0; return RTSS_EXP[(RTSS_LOG[x] + RTSS_LOG[y]) % 255]; } byte rtss_hash_id(const std::string& hash_name) { if(hash_name == "SHA-160") return 1; else if(hash_name == "SHA-256") return 2; else throw Invalid_Argument("RTSS only supports SHA-1 and SHA-256"); } HashFunction* get_rtss_hash_by_id(byte id) { if(id == 1) return new SHA_160; else if(id == 2) return new SHA_256; else throw Decoding_Error("Bad RTSS hash identifier"); } } RTSS_Share::RTSS_Share(const std::string& hex_input) { contents = hex_decode(hex_input); } byte RTSS_Share::share_id() const { if(!initialized()) throw Invalid_State("RTSS_Share::share_id not initialized"); return contents[20]; } std::string RTSS_Share::to_string() const { return hex_encode(&contents[0], contents.size()); } std::vector RTSS_Share::split(byte M, byte N, const byte S[], u16bit S_len, const byte identifier[16], RandomNumberGenerator& rng) { if(M == 0 || N == 0 || M > N) throw Encoding_Error("RTSS_Share::split: M == 0 or N == 0 or M > N"); SHA_256 hash; // always use SHA-256 when generating shares std::vector shares(N); // Create RTSS header in each share for(byte i = 0; i != N; ++i) { shares[i].contents += std::make_pair(identifier, 16); shares[i].contents += rtss_hash_id(hash.name()); shares[i].contents += M; shares[i].contents += get_byte(0, S_len); shares[i].contents += get_byte(1, S_len); } // Choose sequential values for X starting from 1 for(byte i = 0; i != N; ++i) shares[i].contents.push_back(i+1); // secret = S || H(S) SecureVector secret(S, S_len); secret += hash.process(S, S_len); for(size_t i = 0; i != secret.size(); ++i) { std::vector coefficients(M-1); rng.randomize(&coefficients[0], coefficients.size()); for(byte j = 0; j != N; ++j) { const byte X = j + 1; byte sum = secret[i]; byte X_i = X; for(size_t k = 0; k != coefficients.size(); ++k) { sum ^= gfp_mul(X_i, coefficients[k]); X_i = gfp_mul(X_i, X); } shares[j].contents.push_back(sum); } } return shares; } SecureVector RTSS_Share::reconstruct(const std::vector& shares) { const size_t RTSS_HEADER_SIZE = 20; for(size_t i = 0; i != shares.size(); ++i) { if(shares[i].size() != shares[0].size()) throw Decoding_Error("Different sized RTSS shares detected"); if(shares[i].share_id() == 0) throw Decoding_Error("Invalid (id = 0) RTSS share detected"); if(shares[i].size() < RTSS_HEADER_SIZE) throw Decoding_Error("Missing or malformed RTSS header"); if(!same_mem(&shares[0].contents[0], &shares[i].contents[0], RTSS_HEADER_SIZE)) throw Decoding_Error("Different RTSS headers detected"); } if(shares.size() < shares[0].contents[17]) throw Decoding_Error("Insufficient shares to do TSS reconstruction"); u16bit secret_len = make_u16bit(shares[0].contents[18], shares[0].contents[19]); byte hash_id = shares[0].contents[16]; std::auto_ptr hash(get_rtss_hash_by_id(hash_id)); if(shares[0].size() != secret_len + hash->output_length() + RTSS_HEADER_SIZE + 1) throw Decoding_Error("Bad RTSS length field in header"); std::vector V(shares.size()); SecureVector secret; for(size_t i = RTSS_HEADER_SIZE + 1; i != shares[0].size(); ++i) { for(size_t j = 0; j != V.size(); ++j) V[j] = shares[j].contents[i]; byte r = 0; for(size_t k = 0; k != shares.size(); ++k) { // L_i function: byte r2 = 1; for(size_t l = 0; l != shares.size(); ++l) { if(k == l) continue; byte share_k = shares[k].share_id(); byte share_l = shares[l].share_id(); if(share_k == share_l) throw Decoding_Error("Duplicate shares found in RTSS recovery"); byte div = RTSS_EXP[(255 + RTSS_LOG[share_l] - RTSS_LOG[share_k ^ share_l]) % 255]; r2 = gfp_mul(r2, div); } r ^= gfp_mul(V[k], r2); } secret.push_back(r); } if(secret.size() != secret_len + hash->output_length()) throw Decoding_Error("Bad length in RTSS output"); hash->update(&secret[0], secret_len); SecureVector hash_check = hash->final(); if(!same_mem(&hash_check[0], &secret[secret_len], hash->output_length())) throw Decoding_Error("RTSS hash check failed"); return SecureVector(&secret[0], secret_len); } } Botan-1.10.12/src/constructs/tss/tss.h0000664000175000017500000000327212654331322017361 0ustar jackjack00000000000000/* * RTSS (threshold secret sharing) * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RTSS_H__ #define BOTAN_RTSS_H__ #include #include #include #include namespace Botan { /** * A split secret, using the format from draft-mcgrew-tss-03 */ class BOTAN_DLL RTSS_Share { public: /** * @param M the number of shares needed to reconstruct * @param N the number of shares generated * @param secret the secret to split * @param secret_len the length of the secret * @param identifier the 16 byte share identifier * @param rng the random number generator to use */ static std::vector split(byte M, byte N, const byte secret[], u16bit secret_len, const byte identifier[16], RandomNumberGenerator& rng); /** * @param shares the list of shares */ static SecureVector reconstruct(const std::vector& shares); RTSS_Share() {} /** * @param hex_input the share encoded in hexadecimal */ RTSS_Share(const std::string& hex_input); /** * @return hex representation */ std::string to_string() const; /** * @return share identifier */ byte share_id() const; /** * @return size of this share in bytes */ size_t size() const { return contents.size(); } /** * @return if this TSS share was initialized or not */ bool initialized() const { return (contents.size() > 0); } private: SecureVector contents; }; } #endif Botan-1.10.12/src/engine/aes_isa_eng/aes_isa_engine.cpp0000664000175000017500000000133312654331322022512 0ustar jackjack00000000000000/* * Engine for AES instructions * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #if defined(BOTAN_HAS_AES_NI) #include #endif namespace Botan { BlockCipher* AES_ISA_Engine::find_block_cipher(const SCAN_Name& request, Algorithm_Factory&) const { #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { if(request.algo_name() == "AES-128") return new AES_128_NI; if(request.algo_name() == "AES-192") return new AES_192_NI; if(request.algo_name() == "AES-256") return new AES_256_NI; } #endif return 0; } } Botan-1.10.12/src/engine/aes_isa_eng/aes_isa_engine.h0000664000175000017500000000112512654331322022156 0ustar jackjack00000000000000/* * Engine for AES instructions * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_AES_ISA_ENGINE_H__ #define BOTAN_AES_ISA_ENGINE_H__ #include namespace Botan { /** * Engine for implementations that hook into CPU-specific * AES implementations (eg AES-NI, VIA C7, or AMD Geode) */ class AES_ISA_Engine : public Engine { public: std::string provider_name() const { return "aes_isa"; } BlockCipher* find_block_cipher(const SCAN_Name&, Algorithm_Factory&) const; }; } #endif Botan-1.10.12/src/engine/aes_isa_eng/info.txt0000664000175000017500000000020112654331322020542 0ustar jackjack00000000000000define ENGINE_AES_ISA load_on dep aes_isa_engine.cpp aes_isa_engine.h Botan-1.10.12/src/engine/asm_engine/asm_engine.cpp0000664000175000017500000000262012654331322021536 0ustar jackjack00000000000000/* * Assembly Implementation Engine * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #if defined(BOTAN_HAS_SERPENT_X86_32) #include #endif #if defined(BOTAN_HAS_MD4_X86_32) #include #endif #if defined(BOTAN_HAS_MD5_X86_32) #include #endif #if defined(BOTAN_HAS_SHA1_X86_64) #include #endif #if defined(BOTAN_HAS_SHA1_X86_32) #include #endif namespace Botan { BlockCipher* Assembler_Engine::find_block_cipher(const SCAN_Name& request, Algorithm_Factory&) const { if(request.algo_name() == "Serpent") { #if defined(BOTAN_HAS_SERPENT_X86_32) return new Serpent_X86_32; #endif } return 0; } HashFunction* Assembler_Engine::find_hash(const SCAN_Name& request, Algorithm_Factory&) const { #if defined(BOTAN_HAS_MD4_X86_32) if(request.algo_name() == "MD4") return new MD4_X86_32; #endif #if defined(BOTAN_HAS_MD5_X86_32) if(request.algo_name() == "MD5") return new MD5_X86_32; #endif if(request.algo_name() == "SHA-160") { #if defined(BOTAN_HAS_SHA1_X86_64) return new SHA_160_X86_64; #elif defined(BOTAN_HAS_SHA1_X86_32) return new SHA_160_X86_32; #endif } return 0; } } Botan-1.10.12/src/engine/asm_engine/asm_engine.h0000664000175000017500000000121712654331322021204 0ustar jackjack00000000000000/* * Assembly Implementation Engine * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X86_32_ASM_ENGINE_H__ #define BOTAN_X86_32_ASM_ENGINE_H__ #include namespace Botan { /** * Engine for x86-32 specific implementations */ class Assembler_Engine : public Engine { public: std::string provider_name() const { return "asm"; } BlockCipher* find_block_cipher(const SCAN_Name&, Algorithm_Factory&) const; HashFunction* find_hash(const SCAN_Name& request, Algorithm_Factory&) const; }; } #endif Botan-1.10.12/src/engine/asm_engine/info.txt0000664000175000017500000000017312654331322020422 0ustar jackjack00000000000000define ENGINE_ASSEMBLER load_on dep asm_engine.cpp asm_engine.h Botan-1.10.12/src/engine/core_engine/core_engine.h0000664000175000017500000000404012654331322021521 0ustar jackjack00000000000000/* * Core Engine * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CORE_ENGINE_H__ #define BOTAN_CORE_ENGINE_H__ #include namespace Botan { /** * Core Engine */ class Core_Engine : public Engine { public: std::string provider_name() const { return "core"; } PK_Ops::Key_Agreement* get_key_agreement_op(const Private_Key& key) const; PK_Ops::Signature* get_signature_op(const Private_Key& key) const; PK_Ops::Verification* get_verify_op(const Public_Key& key) const; PK_Ops::Encryption* get_encryption_op(const Public_Key& key) const; PK_Ops::Decryption* get_decryption_op(const Private_Key& key) const; Modular_Exponentiator* mod_exp(const BigInt& n, Power_Mod::Usage_Hints) const; Keyed_Filter* get_cipher(const std::string&, Cipher_Dir, Algorithm_Factory&); BlockCipher* find_block_cipher(const SCAN_Name&, Algorithm_Factory&) const; StreamCipher* find_stream_cipher(const SCAN_Name&, Algorithm_Factory&) const; HashFunction* find_hash(const SCAN_Name& request, Algorithm_Factory&) const; MessageAuthenticationCode* find_mac(const SCAN_Name& request, Algorithm_Factory&) const; PBKDF* find_pbkdf(const SCAN_Name& algo_spec, Algorithm_Factory& af) const; }; /** * Create a cipher mode filter object * @param block_cipher a block cipher object * @param direction are we encrypting or decrypting? * @param mode the name of the cipher mode to use * @param padding the mode padding to use (only used for ECB, CBC) */ Keyed_Filter* get_cipher_mode(const BlockCipher* block_cipher, Cipher_Dir direction, const std::string& mode, const std::string& padding); } #endif Botan-1.10.12/src/engine/core_engine/core_modes.cpp0000664000175000017500000001324412654331322021724 0ustar jackjack00000000000000/* * Core Engine * (C) 1999-2007,2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #if defined(BOTAN_HAS_ECB) #include #endif #if defined(BOTAN_HAS_CBC) #include #endif #if defined(BOTAN_HAS_CTS) #include #endif #if defined(BOTAN_HAS_CFB) #include #endif #if defined(BOTAN_HAS_OFB) #include #endif #if defined(BOTAN_HAS_CTR_BE) #include #endif #if defined(BOTAN_HAS_EAX) #include #endif #if defined(BOTAN_HAS_XTS) #include #endif namespace Botan { namespace { /** * Get a block cipher padding method by name */ BlockCipherModePaddingMethod* get_bc_pad(const std::string& algo_spec, const std::string& def_if_empty) { #if defined(BOTAN_HAS_CIPHER_MODE_PADDING) if(algo_spec == "NoPadding" || (algo_spec == "" && def_if_empty == "NoPadding")) return new Null_Padding; if(algo_spec == "PKCS7" || (algo_spec == "" && def_if_empty == "PKCS7")) return new PKCS7_Padding; if(algo_spec == "OneAndZeros") return new OneAndZeros_Padding; if(algo_spec == "X9.23") return new ANSI_X923_Padding; #endif throw Algorithm_Not_Found(algo_spec); } } Keyed_Filter* get_cipher_mode(const BlockCipher* block_cipher, Cipher_Dir direction, const std::string& mode, const std::string& padding) { #if defined(BOTAN_HAS_OFB) if(mode == "OFB") return new StreamCipher_Filter(new OFB(block_cipher->clone())); #endif #if defined(BOTAN_HAS_CTR_BE) if(mode == "CTR-BE") return new StreamCipher_Filter(new CTR_BE(block_cipher->clone())); #endif #if defined(BOTAN_HAS_ECB) if(mode == "ECB" || mode == "") { if(direction == ENCRYPTION) return new ECB_Encryption(block_cipher->clone(), get_bc_pad(padding, "NoPadding")); else return new ECB_Decryption(block_cipher->clone(), get_bc_pad(padding, "NoPadding")); } #endif if(mode == "CBC") { if(padding == "CTS") { #if defined(BOTAN_HAS_CTS) if(direction == ENCRYPTION) return new CTS_Encryption(block_cipher->clone()); else return new CTS_Decryption(block_cipher->clone()); #else return 0; #endif } #if defined(BOTAN_HAS_CBC) if(direction == ENCRYPTION) return new CBC_Encryption(block_cipher->clone(), get_bc_pad(padding, "PKCS7")); else return new CBC_Decryption(block_cipher->clone(), get_bc_pad(padding, "PKCS7")); #else return 0; #endif } #if defined(BOTAN_HAS_XTS) if(mode == "XTS") { if(direction == ENCRYPTION) return new XTS_Encryption(block_cipher->clone()); else return new XTS_Decryption(block_cipher->clone()); } #endif if(mode.find("CFB") != std::string::npos || mode.find("EAX") != std::string::npos) { size_t bits = 0; std::vector algo_info = parse_algorithm_name(mode); std::string mode_name = algo_info[0]; if(algo_info.size() == 1) bits = 8 * block_cipher->block_size(); else if(algo_info.size() == 2) bits = to_u32bit(algo_info[1]); else return 0; #if defined(BOTAN_HAS_CFB) if(mode_name == "CFB") { if(direction == ENCRYPTION) return new CFB_Encryption(block_cipher->clone(), bits); else return new CFB_Decryption(block_cipher->clone(), bits); } #endif #if defined(BOTAN_HAS_EAX) if(mode_name == "EAX") { if(direction == ENCRYPTION) return new EAX_Encryption(block_cipher->clone(), bits); else return new EAX_Decryption(block_cipher->clone(), bits); } #endif } return 0; } /* * Get a cipher object */ Keyed_Filter* Core_Engine::get_cipher(const std::string& algo_spec, Cipher_Dir direction, Algorithm_Factory& af) { std::vector algo_parts = split_on(algo_spec, '/'); if(algo_parts.empty()) throw Invalid_Algorithm_Name(algo_spec); const std::string cipher_name = algo_parts[0]; // check if it is a stream cipher first (easy case) const StreamCipher* stream_cipher = af.prototype_stream_cipher(cipher_name); if(stream_cipher) return new StreamCipher_Filter(stream_cipher->clone()); const BlockCipher* block_cipher = af.prototype_block_cipher(cipher_name); if(!block_cipher) return 0; if(algo_parts.size() >= 4) return 0; // 4 part mode, not something we know about if(algo_parts.size() < 2) throw Lookup_Error("Cipher specification '" + algo_spec + "' is missing mode identifier"); std::string mode = algo_parts[1]; std::string padding; if(algo_parts.size() == 3) padding = algo_parts[2]; else padding = (mode == "CBC") ? "PKCS7" : "NoPadding"; if(mode == "ECB" && padding == "CTS") return 0; else if((mode != "CBC" && mode != "ECB") && padding != "NoPadding") throw Invalid_Algorithm_Name(algo_spec); Keyed_Filter* filt = get_cipher_mode(block_cipher, direction, mode, padding); if(filt) return filt; throw Algorithm_Not_Found(cipher_name + "/" + mode + "/" + padding); } } Botan-1.10.12/src/engine/core_engine/def_pk_ops.cpp0000664000175000017500000001017312654331322021714 0ustar jackjack00000000000000/* * PK Operations * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_RW) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif #if defined(BOTAN_HAS_ELGAMAL) #include #endif #if defined(BOTAN_HAS_GOST_34_10_2001) #include #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) #include #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include #endif #if defined(BOTAN_HAS_ECDH) #include #endif namespace Botan { PK_Ops::Encryption* Core_Engine::get_encryption_op(const Public_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PublicKey* s = dynamic_cast(&key)) return new RSA_Public_Operation(*s); #endif #if defined(BOTAN_HAS_ELGAMAL) if(const ElGamal_PublicKey* s = dynamic_cast(&key)) return new ElGamal_Encryption_Operation(*s); #endif return 0; } PK_Ops::Decryption* Core_Engine::get_decryption_op(const Private_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PrivateKey* s = dynamic_cast(&key)) return new RSA_Private_Operation(*s); #endif #if defined(BOTAN_HAS_ELGAMAL) if(const ElGamal_PrivateKey* s = dynamic_cast(&key)) return new ElGamal_Decryption_Operation(*s); #endif return 0; } PK_Ops::Key_Agreement* Core_Engine::get_key_agreement_op(const Private_Key& key) const { #if defined(BOTAN_HAS_DIFFIE_HELLMAN) if(const DH_PrivateKey* dh = dynamic_cast(&key)) return new DH_KA_Operation(*dh); #endif #if defined(BOTAN_HAS_ECDH) if(const ECDH_PrivateKey* ecdh = dynamic_cast(&key)) return new ECDH_KA_Operation(*ecdh); #endif return 0; } PK_Ops::Signature* Core_Engine::get_signature_op(const Private_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PrivateKey* s = dynamic_cast(&key)) return new RSA_Private_Operation(*s); #endif #if defined(BOTAN_HAS_RW) if(const RW_PrivateKey* s = dynamic_cast(&key)) return new RW_Signature_Operation(*s); #endif #if defined(BOTAN_HAS_DSA) if(const DSA_PrivateKey* s = dynamic_cast(&key)) return new DSA_Signature_Operation(*s); #endif #if defined(BOTAN_HAS_ECDSA) if(const ECDSA_PrivateKey* s = dynamic_cast(&key)) return new ECDSA_Signature_Operation(*s); #endif #if defined(BOTAN_HAS_GOST_34_10_2001) if(const GOST_3410_PrivateKey* s = dynamic_cast(&key)) return new GOST_3410_Signature_Operation(*s); #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) if(const NR_PrivateKey* s = dynamic_cast(&key)) return new NR_Signature_Operation(*s); #endif return 0; } PK_Ops::Verification* Core_Engine::get_verify_op(const Public_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PublicKey* s = dynamic_cast(&key)) return new RSA_Public_Operation(*s); #endif #if defined(BOTAN_HAS_RW) if(const RW_PublicKey* s = dynamic_cast(&key)) return new RW_Verification_Operation(*s); #endif #if defined(BOTAN_HAS_DSA) if(const DSA_PublicKey* s = dynamic_cast(&key)) return new DSA_Verification_Operation(*s); #endif #if defined(BOTAN_HAS_ECDSA) if(const ECDSA_PublicKey* s = dynamic_cast(&key)) return new ECDSA_Verification_Operation(*s); #endif #if defined(BOTAN_HAS_GOST_34_10_2001) if(const GOST_3410_PublicKey* s = dynamic_cast(&key)) return new GOST_3410_Verification_Operation(*s); #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) if(const NR_PublicKey* s = dynamic_cast(&key)) return new NR_Verification_Operation(*s); #endif return 0; } } Botan-1.10.12/src/engine/core_engine/def_powm.cpp0000664000175000017500000000075312654331322021406 0ustar jackjack00000000000000/* * Modular Exponentiation * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Choose a modular exponentation algorithm */ Modular_Exponentiator* Core_Engine::mod_exp(const BigInt& n, Power_Mod::Usage_Hints hints) const { if(n.is_odd()) return new Montgomery_Exponentiator(n, hints); return new Fixed_Window_Exponentiator(n, hints); } } Botan-1.10.12/src/engine/core_engine/info.txt0000664000175000017500000000044512654331322020574 0ustar jackjack00000000000000define CORE_ENGINE core_engine.h core_modes.cpp def_pk_ops.cpp def_powm.cpp lookup_block.cpp lookup_hash.cpp lookup_mac.cpp lookup_stream.cpp lookup_pbkdf.cpp algo_factory filters libstate mode_pad numbertheory Botan-1.10.12/src/engine/core_engine/lookup_block.cpp0000664000175000017500000001373212654331322022272 0ustar jackjack00000000000000/* * Block Cipher Lookup * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #if defined(BOTAN_HAS_AES) #include #endif #if defined(BOTAN_HAS_BLOWFISH) #include #endif #if defined(BOTAN_HAS_CAMELLIA) #include #endif #if defined(BOTAN_HAS_CAST) #include #include #endif #if defined(BOTAN_HAS_CASCADE) #include #endif #if defined(BOTAN_HAS_DES) #include #include #endif #if defined(BOTAN_HAS_GOST_28147_89) #include #endif #if defined(BOTAN_HAS_IDEA) #include #endif #if defined(BOTAN_HAS_KASUMI) #include #endif #if defined(BOTAN_HAS_LION) #include #endif #if defined(BOTAN_HAS_LUBY_RACKOFF) #include #endif #if defined(BOTAN_HAS_MARS) #include #endif #if defined(BOTAN_HAS_MISTY1) #include #endif #if defined(BOTAN_HAS_NOEKEON) #include #endif #if defined(BOTAN_HAS_RC2) #include #endif #if defined(BOTAN_HAS_RC5) #include #endif #if defined(BOTAN_HAS_RC6) #include #endif #if defined(BOTAN_HAS_SAFER) #include #endif #if defined(BOTAN_HAS_SEED) #include #endif #if defined(BOTAN_HAS_SERPENT) #include #endif #if defined(BOTAN_HAS_SKIPJACK) #include #endif #if defined(BOTAN_HAS_SQUARE) #include #endif #if defined(BOTAN_HAS_TEA) #include #endif #if defined(BOTAN_HAS_TWOFISH) #include #endif #if defined(BOTAN_HAS_XTEA) #include #endif namespace Botan { /* * Look for an algorithm with this name */ BlockCipher* Core_Engine::find_block_cipher(const SCAN_Name& request, Algorithm_Factory& af) const { #if defined(BOTAN_HAS_AES) if(request.algo_name() == "AES-128") return new AES_128; if(request.algo_name() == "AES-192") return new AES_192; if(request.algo_name() == "AES-256") return new AES_256; #endif #if defined(BOTAN_HAS_BLOWFISH) if(request.algo_name() == "Blowfish") return new Blowfish; #endif #if defined(BOTAN_HAS_CAMELLIA) if(request.algo_name() == "Camellia-128") return new Camellia_128; if(request.algo_name() == "Camellia-192") return new Camellia_192; if(request.algo_name() == "Camellia-256") return new Camellia_256; #endif #if defined(BOTAN_HAS_CAST) if(request.algo_name() == "CAST-128") return new CAST_128; if(request.algo_name() == "CAST-256") return new CAST_256; #endif #if defined(BOTAN_HAS_DES) if(request.algo_name() == "DES") return new DES; if(request.algo_name() == "DESX") return new DESX; if(request.algo_name() == "TripleDES") return new TripleDES; #endif #if defined(BOTAN_HAS_GOST_28147_89) if(request.algo_name() == "GOST-28147-89") return new GOST_28147_89(request.arg(0, "R3411_94_TestParam")); #endif #if defined(BOTAN_HAS_IDEA) if(request.algo_name() == "IDEA") return new IDEA; #endif #if defined(BOTAN_HAS_KASUMI) if(request.algo_name() == "KASUMI") return new KASUMI; #endif #if defined(BOTAN_HAS_MARS) if(request.algo_name() == "MARS") return new MARS; #endif #if defined(BOTAN_HAS_MISTY1) if(request.algo_name() == "MISTY1") return new MISTY1(request.arg_as_integer(0, 8)); #endif #if defined(BOTAN_HAS_NOEKEON) if(request.algo_name() == "Noekeon") return new Noekeon; #endif #if defined(BOTAN_HAS_RC2) if(request.algo_name() == "RC2") return new RC2; #endif #if defined(BOTAN_HAS_RC5) if(request.algo_name() == "RC5") return new RC5(request.arg_as_integer(0, 12)); #endif #if defined(BOTAN_HAS_RC6) if(request.algo_name() == "RC6") return new RC6; #endif #if defined(BOTAN_HAS_SAFER) if(request.algo_name() == "SAFER-SK") return new SAFER_SK(request.arg_as_integer(0, 10)); #endif #if defined(BOTAN_HAS_SEED) if(request.algo_name() == "SEED") return new SEED; #endif #if defined(BOTAN_HAS_SERPENT) if(request.algo_name() == "Serpent") return new Serpent; #endif #if defined(BOTAN_HAS_SKIPJACK) if(request.algo_name() == "Skipjack") return new Skipjack; #endif #if defined(BOTAN_HAS_SQUARE) if(request.algo_name() == "Square") return new Square; #endif #if defined(BOTAN_HAS_TEA) if(request.algo_name() == "TEA") return new TEA; #endif #if defined(BOTAN_HAS_TWOFISH) if(request.algo_name() == "Twofish") return new Twofish; #endif #if defined(BOTAN_HAS_XTEA) if(request.algo_name() == "XTEA") return new XTEA; #endif #if defined(BOTAN_HAS_LUBY_RACKOFF) if(request.algo_name() == "Luby-Rackoff" && request.arg_count() == 1) { const HashFunction* hash = af.prototype_hash_function(request.arg(0)); if(hash) return new LubyRackoff(hash->clone()); } #endif #if defined(BOTAN_HAS_CASCADE) if(request.algo_name() == "Cascade" && request.arg_count() == 2) { const BlockCipher* c1 = af.prototype_block_cipher(request.arg(0)); const BlockCipher* c2 = af.prototype_block_cipher(request.arg(1)); if(c1 && c2) return new Cascade_Cipher(c1->clone(), c2->clone()); } #endif #if defined(BOTAN_HAS_LION) if(request.algo_name() == "Lion" && request.arg_count_between(2, 3)) { const size_t block_size = request.arg_as_integer(2, 1024); const HashFunction* hash = af.prototype_hash_function(request.arg(0)); const StreamCipher* stream_cipher = af.prototype_stream_cipher(request.arg(1)); if(!hash || !stream_cipher) return 0; return new Lion(hash->clone(), stream_cipher->clone(), block_size); } #endif return 0; } } Botan-1.10.12/src/engine/core_engine/lookup_hash.cpp0000664000175000017500000001200212654331322022110 0ustar jackjack00000000000000/* * Hash Algorithms Lookup * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #if defined(BOTAN_HAS_ADLER32) #include #endif #if defined(BOTAN_HAS_CRC24) #include #endif #if defined(BOTAN_HAS_CRC32) #include #endif #if defined(BOTAN_HAS_BMW_512) #include #endif #if defined(BOTAN_HAS_GOST_34_11) #include #endif #if defined(BOTAN_HAS_HAS_160) #include #endif #if defined(BOTAN_HAS_KECCAK) #include #endif #if defined(BOTAN_HAS_MD2) #include #endif #if defined(BOTAN_HAS_MD4) #include #endif #if defined(BOTAN_HAS_MD5) #include #endif #if defined(BOTAN_HAS_RIPEMD_128) #include #endif #if defined(BOTAN_HAS_RIPEMD_160) #include #endif #if defined(BOTAN_HAS_SHA1) #include #endif #if defined(BOTAN_HAS_SHA2_32) #include #endif #if defined(BOTAN_HAS_SHA2_64) #include #endif #if defined(BOTAN_HAS_SKEIN_512) #include #endif #if defined(BOTAN_HAS_TIGER) #include #endif #if defined(BOTAN_HAS_WHIRLPOOL) #include #endif #if defined(BOTAN_HAS_PARALLEL_HASH) #include #endif #if defined(BOTAN_HAS_COMB4P) #include #endif namespace Botan { /* * Look for an algorithm with this name */ HashFunction* Core_Engine::find_hash(const SCAN_Name& request, Algorithm_Factory& af) const { #if defined(BOTAN_HAS_ADLER32) if(request.algo_name() == "Adler32") return new Adler32; #endif #if defined(BOTAN_HAS_CRC24) if(request.algo_name() == "CRC24") return new CRC24; #endif #if defined(BOTAN_HAS_CRC32) if(request.algo_name() == "CRC32") return new CRC32; #endif #if defined(BOTAN_HAS_BMW_512) if(request.algo_name() == "BMW-512") return new BMW_512; #endif #if defined(BOTAN_HAS_GOST_34_11) if(request.algo_name() == "GOST-34.11") return new GOST_34_11; #endif #if defined(BOTAN_HAS_HAS_160) if(request.algo_name() == "HAS-160") return new HAS_160; #endif #if defined(BOTAN_HAS_KECCAK) if(request.algo_name() == "Keccak-1600") return new Keccak_1600(request.arg_as_integer(0, 512)); #endif #if defined(BOTAN_HAS_MD2) if(request.algo_name() == "MD2") return new MD2; #endif #if defined(BOTAN_HAS_MD4) if(request.algo_name() == "MD4") return new MD4; #endif #if defined(BOTAN_HAS_MD5) if(request.algo_name() == "MD5") return new MD5; #endif #if defined(BOTAN_HAS_RIPEMD_128) if(request.algo_name() == "RIPEMD-128") return new RIPEMD_128; #endif #if defined(BOTAN_HAS_RIPEMD_160) if(request.algo_name() == "RIPEMD-160") return new RIPEMD_160; #endif #if defined(BOTAN_HAS_SHA1) if(request.algo_name() == "SHA-160") return new SHA_160; #endif #if defined(BOTAN_HAS_SHA2_32) if(request.algo_name() == "SHA-224") return new SHA_224; if(request.algo_name() == "SHA-256") return new SHA_256; #endif #if defined(BOTAN_HAS_SHA2_64) if(request.algo_name() == "SHA-384") return new SHA_384; if(request.algo_name() == "SHA-512") return new SHA_512; #endif #if defined(BOTAN_HAS_TIGER) if(request.algo_name() == "Tiger") return new Tiger(request.arg_as_integer(0, 24), // hash output request.arg_as_integer(1, 3)); // # passes #endif #if defined(BOTAN_HAS_SKEIN_512) if(request.algo_name() == "Skein-512") return new Skein_512(request.arg_as_integer(0, 512), request.arg(1, "")); #endif #if defined(BOTAN_HAS_WHIRLPOOL) if(request.algo_name() == "Whirlpool") return new Whirlpool; #endif #if defined(BOTAN_HAS_COMB4P) if(request.algo_name() == "Comb4P" && request.arg_count() == 2) { const HashFunction* h1 = af.prototype_hash_function(request.arg(0)); const HashFunction* h2 = af.prototype_hash_function(request.arg(1)); if(h1 && h2) return new Comb4P(h1->clone(), h2->clone()); } #endif #if defined(BOTAN_HAS_PARALLEL_HASH) if(request.algo_name() == "Parallel") { std::vector hash_prototypes; /* First pass, just get the prototypes (no memory allocation). Then if all were found, replace each prototype with a newly created clone */ for(size_t i = 0; i != request.arg_count(); ++i) { const HashFunction* hash = af.prototype_hash_function(request.arg(i)); if(!hash) return 0; hash_prototypes.push_back(hash); } std::vector hashes; for(size_t i = 0; i != hash_prototypes.size(); ++i) hashes.push_back(hash_prototypes[i]->clone()); return new Parallel(hashes); } #endif return 0; } } Botan-1.10.12/src/engine/core_engine/lookup_mac.cpp0000664000175000017500000000310312654331322021727 0ustar jackjack00000000000000/* * MAC Lookup * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #if defined(BOTAN_HAS_CBC_MAC) #include #endif #if defined(BOTAN_HAS_CMAC) #include #endif #if defined(BOTAN_HAS_HMAC) #include #endif #if defined(BOTAN_HAS_SSL3_MAC) #include #endif #if defined(BOTAN_HAS_ANSI_X919_MAC) #include #endif namespace Botan { /* * Look for an algorithm with this name */ MessageAuthenticationCode* Core_Engine::find_mac(const SCAN_Name& request, Algorithm_Factory& af) const { #if defined(BOTAN_HAS_CBC_MAC) if(request.algo_name() == "CBC-MAC" && request.arg_count() == 1) return new CBC_MAC(af.make_block_cipher(request.arg(0))); #endif #if defined(BOTAN_HAS_CMAC) if(request.algo_name() == "CMAC" && request.arg_count() == 1) return new CMAC(af.make_block_cipher(request.arg(0))); #endif #if defined(BOTAN_HAS_HMAC) if(request.algo_name() == "HMAC" && request.arg_count() == 1) return new HMAC(af.make_hash_function(request.arg(0))); #endif #if defined(BOTAN_HAS_SSL3_MAC) if(request.algo_name() == "SSL3-MAC" && request.arg_count() == 1) return new SSL3_MAC(af.make_hash_function(request.arg(0))); #endif #if defined(BOTAN_HAS_ANSI_X919_MAC) if(request.algo_name() == "X9.19-MAC" && request.arg_count() == 0) return new ANSI_X919_MAC(af.make_block_cipher("DES")); #endif return 0; } } Botan-1.10.12/src/engine/core_engine/lookup_pbkdf.cpp0000664000175000017500000000237412654331322022266 0ustar jackjack00000000000000/* * PBKDF Lookup * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #if defined(BOTAN_HAS_PBKDF1) #include #endif #if defined(BOTAN_HAS_PBKDF2) #include #endif #if defined(BOTAN_HAS_PGPS2K) #include #endif namespace Botan { PBKDF* Core_Engine::find_pbkdf(const SCAN_Name& algo_spec, Algorithm_Factory& af) const { #if defined(BOTAN_HAS_PBKDF1) if(algo_spec.algo_name() == "PBKDF1" && algo_spec.arg_count() == 1) return new PKCS5_PBKDF1(af.make_hash_function(algo_spec.arg(0))); #endif #if defined(BOTAN_HAS_PBKDF2) if(algo_spec.algo_name() == "PBKDF2" && algo_spec.arg_count() == 1) { if(const MessageAuthenticationCode* mac_proto = af.prototype_mac(algo_spec.arg(0))) return new PKCS5_PBKDF2(mac_proto->clone()); return new PKCS5_PBKDF2(af.make_mac("HMAC(" + algo_spec.arg(0) + ")")); } #endif #if defined(BOTAN_HAS_PGPS2K) if(algo_spec.algo_name() == "OpenPGP-S2K" && algo_spec.arg_count() == 1) return new OpenPGP_S2K(af.make_hash_function(algo_spec.arg(0))); #endif return 0; } } Botan-1.10.12/src/engine/core_engine/lookup_stream.cpp0000664000175000017500000000224612654331322022471 0ustar jackjack00000000000000/* * Stream Cipher Lookup * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #if defined(BOTAN_HAS_ARC4) #include #endif #if defined(BOTAN_HAS_SALSA20) #include #endif #if defined(BOTAN_HAS_TURING) #include #endif #if defined(BOTAN_HAS_WID_WAKE) #include #endif namespace Botan { /* * Look for an algorithm with this name */ StreamCipher* Core_Engine::find_stream_cipher(const SCAN_Name& request, Algorithm_Factory&) const { #if defined(BOTAN_HAS_ARC4) if(request.algo_name() == "ARC4") return new ARC4(request.arg_as_integer(0, 0)); if(request.algo_name() == "RC4_drop") return new ARC4(768); #endif #if defined(BOTAN_HAS_SALSA20) if(request.algo_name() == "Salsa20") return new Salsa20; #endif #if defined(BOTAN_HAS_TURING) if(request.algo_name() == "Turing") return new Turing; #endif #if defined(BOTAN_HAS_WID_WAKE) if(request.algo_name() == "WiderWake4+1-BE") return new WiderWake_41_BE; #endif return 0; } } Botan-1.10.12/src/engine/dyn_engine/dyn_engine.cpp0000664000175000017500000000243512654331322021566 0ustar jackjack00000000000000/** * Dynamically Loaded Engine * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { extern "C" { typedef Engine* (*creator_func)(void); typedef u32bit (*module_version_func)(void); } } Dynamically_Loaded_Engine::Dynamically_Loaded_Engine( const std::string& library_path) : engine(0) { lib = new Dynamically_Loaded_Library(library_path); try { module_version_func get_version = lib->resolve("module_version"); const u32bit mod_version = get_version(); if(mod_version != 20101003) throw std::runtime_error("Incompatible version in " + library_path + " of " + to_string(mod_version)); creator_func creator = lib->resolve("create_engine"); engine = creator(); if(!engine) throw std::runtime_error("Creator function in " + library_path + " failed"); } catch(...) { delete lib; lib = 0; throw; } } Dynamically_Loaded_Engine::~Dynamically_Loaded_Engine() { delete engine; delete lib; } } Botan-1.10.12/src/engine/dyn_engine/dyn_engine.h0000664000175000017500000000565612654331322021243 0ustar jackjack00000000000000/** * Dynamically Loaded Engine * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DYN_LOADED_ENGINE_H__ #define BOTAN_DYN_LOADED_ENGINE_H__ #include namespace Botan { /** * Dynamically_Loaded_Engine just proxies the requests to the underlying * Engine object, and handles load/unload details */ class BOTAN_DLL Dynamically_Loaded_Engine : public Engine { public: /** * @param lib_path full pathname to DLL to load */ Dynamically_Loaded_Engine(const std::string& lib_path); ~Dynamically_Loaded_Engine(); std::string provider_name() const { return engine->provider_name(); } BlockCipher* find_block_cipher(const SCAN_Name& algo_spec, Algorithm_Factory& af) const { return engine->find_block_cipher(algo_spec, af); } StreamCipher* find_stream_cipher(const SCAN_Name& algo_spec, Algorithm_Factory& af) const { return engine->find_stream_cipher(algo_spec, af); } HashFunction* find_hash(const SCAN_Name& algo_spec, Algorithm_Factory& af) const { return engine->find_hash(algo_spec, af); } MessageAuthenticationCode* find_mac(const SCAN_Name& algo_spec, Algorithm_Factory& af) const { return engine->find_mac(algo_spec, af); } PBKDF* find_pbkdf(const SCAN_Name& algo_spec, Algorithm_Factory& af) const { return engine->find_pbkdf(algo_spec, af); } Modular_Exponentiator* mod_exp(const BigInt& n, Power_Mod::Usage_Hints hints) const { return engine->mod_exp(n, hints); } Keyed_Filter* get_cipher(const std::string& algo_spec, Cipher_Dir dir, Algorithm_Factory& af) { return engine->get_cipher(algo_spec, dir, af); } PK_Ops::Key_Agreement* get_key_agreement_op(const Private_Key& key) const { return engine->get_key_agreement_op(key); } PK_Ops::Signature* get_signature_op(const Private_Key& key) const { return engine->get_signature_op(key); } PK_Ops::Verification* get_verify_op(const Public_Key& key) const { return engine->get_verify_op(key); } PK_Ops::Encryption* get_encryption_op(const Public_Key& key) const { return engine->get_encryption_op(key); } PK_Ops::Decryption* get_decryption_op(const Private_Key& key) const { return engine->get_decryption_op(key); } private: class Dynamically_Loaded_Library* lib; Engine* engine; }; } #endif Botan-1.10.12/src/engine/dyn_engine/info.txt0000664000175000017500000000023312654331322020431 0ustar jackjack00000000000000define DYNAMICALLY_LOADED_ENGINE dyn_engine.h dyn_engine.cpp engine dyn_load Botan-1.10.12/src/engine/engine.cpp0000664000175000017500000000301312654331322016566 0ustar jackjack00000000000000/* * Engine * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { BlockCipher* Engine::find_block_cipher(const SCAN_Name&, Algorithm_Factory&) const { return 0; } StreamCipher* Engine::find_stream_cipher(const SCAN_Name&, Algorithm_Factory&) const { return 0; } HashFunction* Engine::find_hash(const SCAN_Name&, Algorithm_Factory&) const { return 0; } MessageAuthenticationCode* Engine::find_mac(const SCAN_Name&, Algorithm_Factory&) const { return 0; } PBKDF* Engine::find_pbkdf(const SCAN_Name&, Algorithm_Factory&) const { return 0; } Modular_Exponentiator* Engine::mod_exp(const BigInt&, Power_Mod::Usage_Hints) const { return 0; } Keyed_Filter* Engine::get_cipher(const std::string&, Cipher_Dir, Algorithm_Factory&) { return 0; } PK_Ops::Key_Agreement* Engine::get_key_agreement_op(const Private_Key&) const { return 0; } PK_Ops::Signature* Engine::get_signature_op(const Private_Key&) const { return 0; } PK_Ops::Verification* Engine::get_verify_op(const Public_Key&) const { return 0; } PK_Ops::Encryption* Engine::get_encryption_op(const Public_Key&) const { return 0; } PK_Ops::Decryption* Engine::get_decryption_op(const Private_Key&) const { return 0; } } Botan-1.10.12/src/engine/engine.h0000664000175000017500000001070112654331322016235 0ustar jackjack00000000000000/* * Engine * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENGINE_H__ #define BOTAN_ENGINE_H__ #include #include #include #include #include #include #include #include #include namespace Botan { class Algorithm_Factory; class Keyed_Filter; /** * Base class for all engines. All non-pure virtual functions simply * return NULL, indicating the algorithm in question is not * supported. Subclasses can reimplement whichever function(s) * they want to hook in a particular type. */ class BOTAN_DLL Engine { public: virtual ~Engine() {} /** * @return name of this engine */ virtual std::string provider_name() const = 0; /** * @param algo_spec the algorithm name/specification * @param af an algorithm factory object * @return newly allocated object, or NULL */ virtual BlockCipher* find_block_cipher(const SCAN_Name& algo_spec, Algorithm_Factory& af) const; /** * @param algo_spec the algorithm name/specification * @param af an algorithm factory object * @return newly allocated object, or NULL */ virtual StreamCipher* find_stream_cipher(const SCAN_Name& algo_spec, Algorithm_Factory& af) const; /** * @param algo_spec the algorithm name/specification * @param af an algorithm factory object * @return newly allocated object, or NULL */ virtual HashFunction* find_hash(const SCAN_Name& algo_spec, Algorithm_Factory& af) const; /** * @param algo_spec the algorithm name/specification * @param af an algorithm factory object * @return newly allocated object, or NULL */ virtual MessageAuthenticationCode* find_mac(const SCAN_Name& algo_spec, Algorithm_Factory& af) const; /** * @param algo_spec the algorithm name/specification * @param af an algorithm factory object * @return newly allocated object, or NULL */ virtual PBKDF* find_pbkdf(const SCAN_Name& algo_spec, Algorithm_Factory& af) const; /** * @param n the modulus * @param hints any use hints * @return newly allocated object, or NULL */ virtual Modular_Exponentiator* mod_exp(const BigInt& n, Power_Mod::Usage_Hints hints) const; /** * Return a new cipher object * @param algo_spec the algorithm name/specification * @param dir specifies if encryption or decryption is desired * @param af an algorithm factory object * @return newly allocated object, or NULL */ virtual Keyed_Filter* get_cipher(const std::string& algo_spec, Cipher_Dir dir, Algorithm_Factory& af); /** * Return a new operator object for this key, if possible * @param key the key we want an operator for * @return newly allocated operator object, or NULL */ virtual PK_Ops::Key_Agreement* get_key_agreement_op(const Private_Key& key) const; /** * Return a new operator object for this key, if possible * @param key the key we want an operator for * @return newly allocated operator object, or NULL */ virtual PK_Ops::Signature* get_signature_op(const Private_Key& key) const; /** * Return a new operator object for this key, if possible * @param key the key we want an operator for * @return newly allocated operator object, or NULL */ virtual PK_Ops::Verification* get_verify_op(const Public_Key& key) const; /** * Return a new operator object for this key, if possible * @param key the key we want an operator for * @return newly allocated operator object, or NULL */ virtual PK_Ops::Encryption* get_encryption_op(const Public_Key& key) const; /** * Return a new operator object for this key, if possible * @param key the key we want an operator for * @return newly allocated operator object, or NULL */ virtual PK_Ops::Decryption* get_decryption_op(const Private_Key& key) const; }; } #endif Botan-1.10.12/src/engine/gnump/gmp_mem.cpp0000664000175000017500000000231212654331322020071 0ustar jackjack00000000000000/* * GNU MP Memory Handlers * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * Allocator used by GNU MP */ Allocator* gmp_alloc = 0; size_t gmp_alloc_refcnt = 0; /* * Allocation Function for GNU MP */ void* gmp_malloc(size_t n) { return gmp_alloc->allocate(n); } /* * Reallocation Function for GNU MP */ void* gmp_realloc(void* ptr, size_t old_n, size_t new_n) { void* new_buf = gmp_alloc->allocate(new_n); std::memcpy(new_buf, ptr, std::min(old_n, new_n)); gmp_alloc->deallocate(ptr, old_n); return new_buf; } /* * Deallocation Function for GNU MP */ void gmp_free(void* ptr, size_t n) { gmp_alloc->deallocate(ptr, n); } } /* * GMP_Engine Constructor */ GMP_Engine::GMP_Engine() { if(gmp_alloc == 0) { gmp_alloc = Allocator::get(true); mp_set_memory_functions(gmp_malloc, gmp_realloc, gmp_free); } ++gmp_alloc_refcnt; } GMP_Engine::~GMP_Engine() { --gmp_alloc_refcnt; if(gmp_alloc_refcnt == 0) { mp_set_memory_functions(NULL, NULL, NULL); gmp_alloc = 0; } } } Botan-1.10.12/src/engine/gnump/gmp_powm.cpp0000664000175000017500000000213112654331322020274 0ustar jackjack00000000000000/* * GMP Modular Exponentiation * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { /* * GMP Modular Exponentiator */ class GMP_Modular_Exponentiator : public Modular_Exponentiator { public: void set_base(const BigInt& b) { base = b; } void set_exponent(const BigInt& e) { exp = e; } BigInt execute() const; Modular_Exponentiator* copy() const { return new GMP_Modular_Exponentiator(*this); } GMP_Modular_Exponentiator(const BigInt& n) : mod(n) {} private: GMP_MPZ base, exp, mod; }; /* * Compute the result */ BigInt GMP_Modular_Exponentiator::execute() const { GMP_MPZ r; mpz_powm(r.value, base.value, exp.value, mod.value); return r.to_bigint(); } } /* * Return the GMP-based modular exponentiator */ Modular_Exponentiator* GMP_Engine::mod_exp(const BigInt& n, Power_Mod::Usage_Hints) const { return new GMP_Modular_Exponentiator(n); } } Botan-1.10.12/src/engine/gnump/gmp_wrap.cpp0000664000175000017500000000346712654331322020300 0ustar jackjack00000000000000/* * GMP Wrapper * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #define GNU_MP_VERSION_CODE_FOR(a,b,c) ((a << 16) | (b << 8) | (c)) #define GNU_MP_VERSION_CODE \ GNU_MP_VERSION_CODE_FOR(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, \ __GNU_MP_VERSION_PATCHLEVEL) #if GNU_MP_VERSION_CODE < GNU_MP_VERSION_CODE_FOR(4,1,0) #error Your GNU MP install is too old, upgrade to 4.1 or later #endif namespace Botan { /* * GMP_MPZ Constructor */ GMP_MPZ::GMP_MPZ(const BigInt& in) { mpz_init(value); if(in != 0) mpz_import(value, in.sig_words(), -1, sizeof(word), 0, 0, in.data()); } /* * GMP_MPZ Constructor */ GMP_MPZ::GMP_MPZ(const byte in[], size_t length) { mpz_init(value); mpz_import(value, length, 1, 1, 0, 0, in); } /* * GMP_MPZ Copy Constructor */ GMP_MPZ::GMP_MPZ(const GMP_MPZ& other) { mpz_init_set(value, other.value); } /* * GMP_MPZ Destructor */ GMP_MPZ::~GMP_MPZ() { mpz_clear(value); } /* * GMP_MPZ Assignment Operator */ GMP_MPZ& GMP_MPZ::operator=(const GMP_MPZ& other) { mpz_set(value, other.value); return (*this); } /* * Export the mpz_t as a bytestring */ void GMP_MPZ::encode(byte out[], size_t length) const { size_t dummy = 0; mpz_export(out + (length - bytes()), &dummy, 1, 1, 0, 0, value); } /* * Return the number of significant bytes */ size_t GMP_MPZ::bytes() const { return ((mpz_sizeinbase(value, 2) + 7) / 8); } /* * GMP to BigInt Conversions */ BigInt GMP_MPZ::to_bigint() const { BigInt out(BigInt::Positive, (bytes() + sizeof(word) - 1) / sizeof(word)); size_t dummy = 0; mpz_export(out.get_reg(), &dummy, -1, sizeof(word), 0, 0, value); if(mpz_sgn(value) < 0) out.flip_sign(); return out; } } Botan-1.10.12/src/engine/gnump/gmp_wrap.h0000664000175000017500000000131612654331322017734 0ustar jackjack00000000000000/* * GMP MPZ Wrapper * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_GMP_MPZ_WRAP_H__ #define BOTAN_GMP_MPZ_WRAP_H__ #include #include namespace Botan { /** * Lightweight GMP mpz_t wrapper. For internal use only. */ class GMP_MPZ { public: mpz_t value; BigInt to_bigint() const; void encode(byte[], size_t) const; size_t bytes() const; SecureVector to_bytes() const { return BigInt::encode(to_bigint()); } GMP_MPZ& operator=(const GMP_MPZ&); GMP_MPZ(const GMP_MPZ&); GMP_MPZ(const BigInt& = 0); GMP_MPZ(const byte[], size_t); ~GMP_MPZ(); }; } #endif Botan-1.10.12/src/engine/gnump/gnump_engine.h0000664000175000017500000000162712654331322020600 0ustar jackjack00000000000000/* * GMP Engine * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENGINE_GMP_H__ #define BOTAN_ENGINE_GMP_H__ #include namespace Botan { /** * Engine using GNU MP */ class GMP_Engine : public Engine { public: GMP_Engine(); ~GMP_Engine(); std::string provider_name() const { return "gmp"; } PK_Ops::Key_Agreement* get_key_agreement_op(const Private_Key& key) const; PK_Ops::Signature* get_signature_op(const Private_Key& key) const; PK_Ops::Verification* get_verify_op(const Public_Key& key) const; PK_Ops::Encryption* get_encryption_op(const Public_Key& key) const; PK_Ops::Decryption* get_decryption_op(const Private_Key& key) const; Modular_Exponentiator* mod_exp(const BigInt&, Power_Mod::Usage_Hints) const; }; } #endif Botan-1.10.12/src/engine/gnump/gnump_pk.cpp0000664000175000017500000002111212654331322020267 0ustar jackjack00000000000000/* * GnuMP PK operations * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include /* GnuMP 5.0 and later have a side-channel resistent powm */ #if defined(HAVE_MPZ_POWM_SEC) #undef mpz_powm #define mpz_powm mpz_powm_sec #endif #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include #endif namespace Botan { namespace { #if defined(BOTAN_HAS_DIFFIE_HELLMAN) class GMP_DH_KA_Operation : public PK_Ops::Key_Agreement { public: GMP_DH_KA_Operation(const DH_PrivateKey& dh) : x(dh.get_x()), p(dh.group_p()) {} SecureVector agree(const byte w[], size_t w_len) { GMP_MPZ z(w, w_len); mpz_powm(z.value, z.value, x.value, p.value); return z.to_bytes(); } private: GMP_MPZ x, p; }; #endif #if defined(BOTAN_HAS_DSA) class GMP_DSA_Signature_Operation : public PK_Ops::Signature { public: GMP_DSA_Signature_Operation(const DSA_PrivateKey& dsa) : x(dsa.get_x()), p(dsa.group_p()), q(dsa.group_q()), g(dsa.group_g()), q_bits(dsa.group_q().bits()) {} size_t message_parts() const { return 2; } size_t message_part_size() const { return (q_bits + 7) / 8; } size_t max_input_bits() const { return q_bits; } SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng); private: const GMP_MPZ x, p, q, g; size_t q_bits; }; SecureVector GMP_DSA_Signature_Operation::sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) { const size_t q_bytes = (q_bits + 7) / 8; rng.add_entropy(msg, msg_len); BigInt k_bn; do k_bn.randomize(rng, q_bits); while(k_bn >= q.to_bigint()); GMP_MPZ i(msg, msg_len); GMP_MPZ k(k_bn); GMP_MPZ r; mpz_powm(r.value, g.value, k.value, p.value); mpz_mod(r.value, r.value, q.value); mpz_invert(k.value, k.value, q.value); GMP_MPZ s; mpz_mul(s.value, x.value, r.value); mpz_add(s.value, s.value, i.value); mpz_mul(s.value, s.value, k.value); mpz_mod(s.value, s.value, q.value); if(mpz_cmp_ui(r.value, 0) == 0 || mpz_cmp_ui(s.value, 0) == 0) throw Internal_Error("GMP_DSA_Op::sign: r or s was zero"); SecureVector output(2*q_bytes); r.encode(output, q_bytes); s.encode(output + q_bytes, q_bytes); return output; } class GMP_DSA_Verification_Operation : public PK_Ops::Verification { public: GMP_DSA_Verification_Operation(const DSA_PublicKey& dsa) : y(dsa.get_y()), p(dsa.group_p()), q(dsa.group_q()), g(dsa.group_g()), q_bits(dsa.group_q().bits()) {} size_t message_parts() const { return 2; } size_t message_part_size() const { return (q_bits + 7) / 8; } size_t max_input_bits() const { return q_bits; } bool with_recovery() const { return false; } bool verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len); private: const GMP_MPZ y, p, q, g; size_t q_bits; }; bool GMP_DSA_Verification_Operation::verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len) { const size_t q_bytes = q.bytes(); if(sig_len != 2*q_bytes || msg_len > q_bytes) return false; GMP_MPZ r(sig, q_bytes); GMP_MPZ s(sig + q_bytes, q_bytes); GMP_MPZ i(msg, msg_len); if(mpz_cmp_ui(r.value, 0) <= 0 || mpz_cmp(r.value, q.value) >= 0) return false; if(mpz_cmp_ui(s.value, 0) <= 0 || mpz_cmp(s.value, q.value) >= 0) return false; if(mpz_invert(s.value, s.value, q.value) == 0) return false; GMP_MPZ si; mpz_mul(si.value, s.value, i.value); mpz_mod(si.value, si.value, q.value); mpz_powm(si.value, g.value, si.value, p.value); GMP_MPZ sr; mpz_mul(sr.value, s.value, r.value); mpz_mod(sr.value, sr.value, q.value); mpz_powm(sr.value, y.value, sr.value, p.value); mpz_mul(si.value, si.value, sr.value); mpz_mod(si.value, si.value, p.value); mpz_mod(si.value, si.value, q.value); if(mpz_cmp(si.value, r.value) == 0) return true; return false; } #endif #if defined(BOTAN_HAS_RSA) class GMP_RSA_Private_Operation : public PK_Ops::Signature, public PK_Ops::Decryption { public: GMP_RSA_Private_Operation(const RSA_PrivateKey& rsa) : mod(rsa.get_n()), p(rsa.get_p()), q(rsa.get_q()), d1(rsa.get_d1()), d2(rsa.get_d2()), c(rsa.get_c()), n_bits(rsa.get_n().bits()) {} size_t max_input_bits() const { return (n_bits - 1); } SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator&) { BigInt m(msg, msg_len); BigInt x = private_op(m); return BigInt::encode_1363(x, (n_bits + 7) / 8); } SecureVector decrypt(const byte msg[], size_t msg_len) { BigInt m(msg, msg_len); return BigInt::encode(private_op(m)); } private: BigInt private_op(const BigInt& m) const; GMP_MPZ mod, p, q, d1, d2, c; size_t n_bits; }; BigInt GMP_RSA_Private_Operation::private_op(const BigInt& m) const { GMP_MPZ j1, j2, h(m); mpz_powm(j1.value, h.value, d1.value, p.value); mpz_powm(j2.value, h.value, d2.value, q.value); mpz_sub(h.value, j1.value, j2.value); mpz_mul(h.value, h.value, c.value); mpz_mod(h.value, h.value, p.value); mpz_mul(h.value, h.value, q.value); mpz_add(h.value, h.value, j2.value); return h.to_bigint(); } class GMP_RSA_Public_Operation : public PK_Ops::Verification, public PK_Ops::Encryption { public: GMP_RSA_Public_Operation(const RSA_PublicKey& rsa) : n(rsa.get_n()), e(rsa.get_e()), mod(rsa.get_n()) {} size_t max_input_bits() const { return (n.bits() - 1); } bool with_recovery() const { return true; } SecureVector encrypt(const byte msg[], size_t msg_len, RandomNumberGenerator&) { BigInt m(msg, msg_len); return BigInt::encode_1363(public_op(m), n.bytes()); } SecureVector verify_mr(const byte msg[], size_t msg_len) { BigInt m(msg, msg_len); return BigInt::encode(public_op(m)); } private: BigInt public_op(const BigInt& m) const { if(m >= n) throw Invalid_Argument("RSA public op - input is too large"); GMP_MPZ m_gmp(m); mpz_powm(m_gmp.value, m_gmp.value, e.value, mod.value); return m_gmp.to_bigint(); } const BigInt& n; const GMP_MPZ e, mod; }; #endif } PK_Ops::Key_Agreement* GMP_Engine::get_key_agreement_op(const Private_Key& key) const { #if defined(BOTAN_HAS_DIFFIE_HELLMAN) if(const DH_PrivateKey* dh = dynamic_cast(&key)) return new GMP_DH_KA_Operation(*dh); #endif return 0; } PK_Ops::Signature* GMP_Engine::get_signature_op(const Private_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PrivateKey* s = dynamic_cast(&key)) return new GMP_RSA_Private_Operation(*s); #endif #if defined(BOTAN_HAS_DSA) if(const DSA_PrivateKey* s = dynamic_cast(&key)) return new GMP_DSA_Signature_Operation(*s); #endif return 0; } PK_Ops::Verification* GMP_Engine::get_verify_op(const Public_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PublicKey* s = dynamic_cast(&key)) return new GMP_RSA_Public_Operation(*s); #endif #if defined(BOTAN_HAS_DSA) if(const DSA_PublicKey* s = dynamic_cast(&key)) return new GMP_DSA_Verification_Operation(*s); #endif return 0; } PK_Ops::Encryption* GMP_Engine::get_encryption_op(const Public_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PublicKey* s = dynamic_cast(&key)) return new GMP_RSA_Public_Operation(*s); #endif return 0; } PK_Ops::Decryption* GMP_Engine::get_decryption_op(const Private_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PrivateKey* s = dynamic_cast(&key)) return new GMP_RSA_Private_Operation(*s); #endif return 0; } } Botan-1.10.12/src/engine/gnump/info.txt0000664000175000017500000000034712654331322017446 0ustar jackjack00000000000000define ENGINE_GNU_MP load_on request all -> gmp gnump_engine.h gmp_wrap.h gmp_mem.cpp gmp_powm.cpp gmp_wrap.cpp gnump_pk.cpp bigint Botan-1.10.12/src/engine/info.txt0000664000175000017500000000025212654331322016313 0ustar jackjack00000000000000define ENGINES engine.h engine.cpp block hash libstate mac numbertheory pbkdf pubkey stream Botan-1.10.12/src/engine/openssl/bn_powm.cpp0000664000175000017500000000224212654331322020450 0ustar jackjack00000000000000/* * OpenSSL Modular Exponentiation * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { /* * OpenSSL Modular Exponentiator */ class OpenSSL_Modular_Exponentiator : public Modular_Exponentiator { public: void set_base(const BigInt& b) { base = b; } void set_exponent(const BigInt& e) { exp = e; } BigInt execute() const; Modular_Exponentiator* copy() const { return new OpenSSL_Modular_Exponentiator(*this); } OpenSSL_Modular_Exponentiator(const BigInt& n) : mod(n) {} private: OSSL_BN base, exp, mod; OSSL_BN_CTX ctx; }; /* * Compute the result */ BigInt OpenSSL_Modular_Exponentiator::execute() const { OSSL_BN r; BN_mod_exp(r.value, base.value, exp.value, mod.value, ctx.value); return r.to_bigint(); } } /* * Return the OpenSSL-based modular exponentiator */ Modular_Exponentiator* OpenSSL_Engine::mod_exp(const BigInt& n, Power_Mod::Usage_Hints) const { return new OpenSSL_Modular_Exponentiator(n); } } Botan-1.10.12/src/engine/openssl/bn_wrap.cpp0000664000175000017500000000335612654331322020446 0ustar jackjack00000000000000/* * OpenSSL BN Wrapper * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * OSSL_BN Constructor */ OSSL_BN::OSSL_BN(const BigInt& in) { value = BN_new(); SecureVector encoding = BigInt::encode(in); if(in != 0) BN_bin2bn(encoding, encoding.size(), value); } /* * OSSL_BN Constructor */ OSSL_BN::OSSL_BN(const byte in[], size_t length) { value = BN_new(); BN_bin2bn(in, length, value); } /* * OSSL_BN Copy Constructor */ OSSL_BN::OSSL_BN(const OSSL_BN& other) { value = BN_dup(other.value); } /* * OSSL_BN Destructor */ OSSL_BN::~OSSL_BN() { BN_clear_free(value); } /* * OSSL_BN Assignment Operator */ OSSL_BN& OSSL_BN::operator=(const OSSL_BN& other) { BN_copy(value, other.value); return (*this); } /* * Export the BIGNUM as a bytestring */ void OSSL_BN::encode(byte out[], size_t length) const { BN_bn2bin(value, out + (length - bytes())); } /* * Return the number of significant bytes */ size_t OSSL_BN::bytes() const { return BN_num_bytes(value); } /* * OpenSSL to BigInt Conversions */ BigInt OSSL_BN::to_bigint() const { SecureVector out(bytes()); BN_bn2bin(value, out); return BigInt::decode(out); } /* * OSSL_BN_CTX Constructor */ OSSL_BN_CTX::OSSL_BN_CTX() { value = BN_CTX_new(); } /* * OSSL_BN_CTX Copy Constructor */ OSSL_BN_CTX::OSSL_BN_CTX(const OSSL_BN_CTX&) { value = BN_CTX_new(); } /* * OSSL_BN_CTX Destructor */ OSSL_BN_CTX::~OSSL_BN_CTX() { BN_CTX_free(value); } /* * OSSL_BN_CTX Assignment Operator */ OSSL_BN_CTX& OSSL_BN_CTX::operator=(const OSSL_BN_CTX&) { value = BN_CTX_new(); return (*this); } } Botan-1.10.12/src/engine/openssl/bn_wrap.h0000664000175000017500000000175112654331322020110 0ustar jackjack00000000000000/* * OpenSSL BN Wrapper * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_OPENSSL_BN_WRAP_H__ #define BOTAN_OPENSSL_BN_WRAP_H__ #include #include namespace Botan { /** * Lightweight OpenSSL BN wrapper. For internal use only. */ class OSSL_BN { public: BIGNUM* value; BigInt to_bigint() const; void encode(byte[], size_t) const; size_t bytes() const; SecureVector to_bytes() const { return BigInt::encode(to_bigint()); } OSSL_BN& operator=(const OSSL_BN&); OSSL_BN(const OSSL_BN&); OSSL_BN(const BigInt& = 0); OSSL_BN(const byte[], size_t); ~OSSL_BN(); }; /** * Lightweight OpenSSL BN_CTX wrapper. For internal use only. */ class OSSL_BN_CTX { public: BN_CTX* value; OSSL_BN_CTX& operator=(const OSSL_BN_CTX&); OSSL_BN_CTX(); OSSL_BN_CTX(const OSSL_BN_CTX&); ~OSSL_BN_CTX(); }; } #endif Botan-1.10.12/src/engine/openssl/info.txt0000664000175000017500000000040312654331322017774 0ustar jackjack00000000000000define ENGINE_OPENSSL load_on request all -> crypto openssl_engine.h bn_wrap.h bn_powm.cpp bn_wrap.cpp ossl_arc4.cpp ossl_bc.cpp ossl_md.cpp ossl_pk.cpp bigint Botan-1.10.12/src/engine/openssl/openssl_engine.h0000664000175000017500000000237412654331322021472 0ustar jackjack00000000000000/* * OpenSSL Engine * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENGINE_OPENSSL_H__ #define BOTAN_ENGINE_OPENSSL_H__ #include namespace Botan { /** * OpenSSL Engine */ class OpenSSL_Engine : public Engine { public: /** * Return the provider name ("openssl") */ std::string provider_name() const { return "openssl"; } PK_Ops::Key_Agreement* get_key_agreement_op(const Private_Key& key) const; PK_Ops::Signature* get_signature_op(const Private_Key& key) const; PK_Ops::Verification* get_verify_op(const Public_Key& key) const; PK_Ops::Encryption* get_encryption_op(const Public_Key& key) const; PK_Ops::Decryption* get_decryption_op(const Private_Key& key) const; Modular_Exponentiator* mod_exp(const BigInt&, Power_Mod::Usage_Hints) const; BlockCipher* find_block_cipher(const SCAN_Name&, Algorithm_Factory&) const; StreamCipher* find_stream_cipher(const SCAN_Name&, Algorithm_Factory&) const; HashFunction* find_hash(const SCAN_Name&, Algorithm_Factory&) const; }; } #endif Botan-1.10.12/src/engine/openssl/ossl_arc4.cpp0000664000175000017500000000350112654331322020677 0ustar jackjack00000000000000/* * OpenSSL ARC4 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /** * ARC4 as implemented by OpenSSL */ class ARC4_OpenSSL : public StreamCipher { public: void clear() { std::memset(&state, 0, sizeof(state)); } std::string name() const; StreamCipher* clone() const { return new ARC4_OpenSSL(SKIP); } Key_Length_Specification key_spec() const { return Key_Length_Specification(1, 32); } ARC4_OpenSSL(size_t s = 0) : SKIP(s) { clear(); } ~ARC4_OpenSSL() { clear(); } private: void cipher(const byte[], byte[], size_t); void key_schedule(const byte[], size_t); const size_t SKIP; RC4_KEY state; }; /* * Return the name of this type */ std::string ARC4_OpenSSL::name() const { if(SKIP == 0) return "ARC4"; if(SKIP == 256) return "MARK-4"; else return "RC4_skip(" + to_string(SKIP) + ")"; } /* * ARC4 Key Schedule */ void ARC4_OpenSSL::key_schedule(const byte key[], size_t length) { RC4_set_key(&state, length, key); byte dummy = 0; for(size_t i = 0; i != SKIP; ++i) RC4(&state, 1, &dummy, &dummy); } /* * ARC4 Encryption */ void ARC4_OpenSSL::cipher(const byte in[], byte out[], size_t length) { RC4(&state, length, in, out); } } /** * Look for an OpenSSL-supported stream cipher (ARC4) */ StreamCipher* OpenSSL_Engine::find_stream_cipher(const SCAN_Name& request, Algorithm_Factory&) const { if(request.algo_name() == "ARC4") return new ARC4_OpenSSL(request.arg_as_integer(0, 0)); if(request.algo_name() == "RC4_drop") return new ARC4_OpenSSL(768); return 0; } } Botan-1.10.12/src/engine/openssl/ossl_bc.cpp0000664000175000017500000001540512654331322020440 0ustar jackjack00000000000000/* * OpenSSL Block Cipher * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { /* * EVP Block Cipher */ class EVP_BlockCipher : public BlockCipher { public: void clear(); std::string name() const { return cipher_name; } BlockCipher* clone() const; size_t block_size() const { return block_sz; } EVP_BlockCipher(const EVP_CIPHER*, const std::string&); EVP_BlockCipher(const EVP_CIPHER*, const std::string&, size_t, size_t, size_t); Key_Length_Specification key_spec() const { return cipher_key_spec; } ~EVP_BlockCipher(); private: void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void key_schedule(const byte[], size_t); size_t block_sz; Key_Length_Specification cipher_key_spec; std::string cipher_name; mutable EVP_CIPHER_CTX encrypt, decrypt; }; /* * EVP Block Cipher Constructor */ EVP_BlockCipher::EVP_BlockCipher(const EVP_CIPHER* algo, const std::string& algo_name) : block_sz(EVP_CIPHER_block_size(algo)), cipher_key_spec(EVP_CIPHER_key_length(algo)), cipher_name(algo_name) { if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE) throw Invalid_Argument("EVP_BlockCipher: Non-ECB EVP was passed in"); EVP_CIPHER_CTX_init(&encrypt); EVP_CIPHER_CTX_init(&decrypt); EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0); EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0); EVP_CIPHER_CTX_set_padding(&encrypt, 0); EVP_CIPHER_CTX_set_padding(&decrypt, 0); } /* * EVP Block Cipher Constructor */ EVP_BlockCipher::EVP_BlockCipher(const EVP_CIPHER* algo, const std::string& algo_name, size_t key_min, size_t key_max, size_t key_mod) : block_sz(EVP_CIPHER_block_size(algo)), cipher_key_spec(key_min, key_max, key_mod), cipher_name(algo_name) { if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE) throw Invalid_Argument("EVP_BlockCipher: Non-ECB EVP was passed in"); EVP_CIPHER_CTX_init(&encrypt); EVP_CIPHER_CTX_init(&decrypt); EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0); EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0); EVP_CIPHER_CTX_set_padding(&encrypt, 0); EVP_CIPHER_CTX_set_padding(&decrypt, 0); } /* * EVP Block Cipher Destructor */ EVP_BlockCipher::~EVP_BlockCipher() { EVP_CIPHER_CTX_cleanup(&encrypt); EVP_CIPHER_CTX_cleanup(&decrypt); } /* * Encrypt a block */ void EVP_BlockCipher::encrypt_n(const byte in[], byte out[], size_t blocks) const { int out_len = 0; EVP_EncryptUpdate(&encrypt, out, &out_len, in, blocks * block_sz); } /* * Decrypt a block */ void EVP_BlockCipher::decrypt_n(const byte in[], byte out[], size_t blocks) const { int out_len = 0; EVP_DecryptUpdate(&decrypt, out, &out_len, in, blocks * block_sz); } /* * Set the key */ void EVP_BlockCipher::key_schedule(const byte key[], size_t length) { SecureVector full_key(key, length); if(cipher_name == "TripleDES" && length == 16) { full_key += std::make_pair(key, 8); } else if(EVP_CIPHER_CTX_set_key_length(&encrypt, length) == 0 || EVP_CIPHER_CTX_set_key_length(&decrypt, length) == 0) throw Invalid_Argument("EVP_BlockCipher: Bad key length for " + cipher_name); if(cipher_name == "RC2") { EVP_CIPHER_CTX_ctrl(&encrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0); EVP_CIPHER_CTX_ctrl(&decrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0); } EVP_EncryptInit_ex(&encrypt, 0, 0, full_key.begin(), 0); EVP_DecryptInit_ex(&decrypt, 0, 0, full_key.begin(), 0); } /* * Return a clone of this object */ BlockCipher* EVP_BlockCipher::clone() const { return new EVP_BlockCipher(EVP_CIPHER_CTX_cipher(&encrypt), cipher_name, cipher_key_spec.minimum_keylength(), cipher_key_spec.maximum_keylength(), cipher_key_spec.keylength_multiple()); } /* * Clear memory of sensitive data */ void EVP_BlockCipher::clear() { const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(&encrypt); EVP_CIPHER_CTX_cleanup(&encrypt); EVP_CIPHER_CTX_cleanup(&decrypt); EVP_CIPHER_CTX_init(&encrypt); EVP_CIPHER_CTX_init(&decrypt); EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0); EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0); EVP_CIPHER_CTX_set_padding(&encrypt, 0); EVP_CIPHER_CTX_set_padding(&decrypt, 0); } } /* * Look for an algorithm with this name */ BlockCipher* OpenSSL_Engine::find_block_cipher(const SCAN_Name& request, Algorithm_Factory&) const { #define HANDLE_EVP_CIPHER(NAME, EVP) \ if(request.algo_name() == NAME && request.arg_count() == 0) \ return new EVP_BlockCipher(EVP, NAME); #define HANDLE_EVP_CIPHER_KEYLEN(NAME, EVP, MIN, MAX, MOD) \ if(request.algo_name() == NAME && request.arg_count() == 0) \ return new EVP_BlockCipher(EVP, NAME, MIN, MAX, MOD); #if !defined(OPENSSL_NO_AES) /* Using OpenSSL's AES causes crashes inside EVP on x86-64 with OpenSSL 0.9.8g cause is unknown */ HANDLE_EVP_CIPHER("AES-128", EVP_aes_128_ecb()); HANDLE_EVP_CIPHER("AES-192", EVP_aes_192_ecb()); HANDLE_EVP_CIPHER("AES-256", EVP_aes_256_ecb()); #endif #if !defined(OPENSSL_NO_DES) HANDLE_EVP_CIPHER("DES", EVP_des_ecb()); HANDLE_EVP_CIPHER_KEYLEN("TripleDES", EVP_des_ede3_ecb(), 16, 24, 8); #endif #if !defined(OPENSSL_NO_BF) HANDLE_EVP_CIPHER_KEYLEN("Blowfish", EVP_bf_ecb(), 1, 56, 1); #endif #if !defined(OPENSSL_NO_CAST) HANDLE_EVP_CIPHER_KEYLEN("CAST-128", EVP_cast5_ecb(), 1, 16, 1); #endif #if !defined(OPENSSL_NO_CAMELLIA) HANDLE_EVP_CIPHER("Camellia-128", EVP_camellia_128_ecb()); HANDLE_EVP_CIPHER("Camellia-192", EVP_camellia_192_ecb()); HANDLE_EVP_CIPHER("Camellia-256", EVP_camellia_256_ecb()); #endif #if !defined(OPENSSL_NO_RC2) HANDLE_EVP_CIPHER_KEYLEN("RC2", EVP_rc2_ecb(), 1, 32, 1); #endif #if !defined(OPENSSL_NO_RC5) && 0 if(request.algo_name() == "RC5") if(request.arg_as_integer(0, 12) == 12) return new EVP_BlockCipher(EVP_rc5_32_12_16_ecb(), "RC5(12)", 1, 32, 1); #endif #if !defined(OPENSSL_NO_IDEA) && 0 HANDLE_EVP_CIPHER("IDEA", EVP_idea_ecb()); #endif #if !defined(OPENSSL_NO_SEED) HANDLE_EVP_CIPHER("SEED", EVP_seed_ecb()); #endif #undef HANDLE_EVP_CIPHER #undef HANDLE_EVP_CIPHER_KEYLEN return 0; } } Botan-1.10.12/src/engine/openssl/ossl_md.cpp0000664000175000017500000000637012654331322020455 0ustar jackjack00000000000000/* * OpenSSL Hash Functions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { /* * EVP Hash Function */ class EVP_HashFunction : public HashFunction { public: void clear(); std::string name() const { return algo_name; } HashFunction* clone() const; size_t output_length() const { return EVP_MD_size(EVP_MD_CTX_md(&md)); } size_t hash_block_size() const { return EVP_MD_block_size(EVP_MD_CTX_md(&md)); } EVP_HashFunction(const EVP_MD*, const std::string&); ~EVP_HashFunction(); private: void add_data(const byte[], size_t); void final_result(byte[]); size_t block_size; std::string algo_name; EVP_MD_CTX md; }; /* * Update an EVP Hash Calculation */ void EVP_HashFunction::add_data(const byte input[], size_t length) { EVP_DigestUpdate(&md, input, length); } /* * Finalize an EVP Hash Calculation */ void EVP_HashFunction::final_result(byte output[]) { EVP_DigestFinal_ex(&md, output, 0); const EVP_MD* algo = EVP_MD_CTX_md(&md); EVP_DigestInit_ex(&md, algo, 0); } /* * Clear memory of sensitive data */ void EVP_HashFunction::clear() { const EVP_MD* algo = EVP_MD_CTX_md(&md); EVP_DigestInit_ex(&md, algo, 0); } /* * Return a clone of this object */ HashFunction* EVP_HashFunction::clone() const { const EVP_MD* algo = EVP_MD_CTX_md(&md); return new EVP_HashFunction(algo, name()); } /* * Create an EVP hash function */ EVP_HashFunction::EVP_HashFunction(const EVP_MD* algo, const std::string& name) : algo_name(name) { EVP_MD_CTX_init(&md); EVP_DigestInit_ex(&md, algo, 0); } /* * Destroy an EVP hash function */ EVP_HashFunction::~EVP_HashFunction() { EVP_MD_CTX_cleanup(&md); } } /* * Look for an algorithm with this name */ HashFunction* OpenSSL_Engine::find_hash(const SCAN_Name& request, Algorithm_Factory&) const { #if !defined(OPENSSL_NO_SHA) if(request.algo_name() == "SHA-160") return new EVP_HashFunction(EVP_sha1(), "SHA-160"); #endif #if !defined(OPENSSL_NO_SHA256) if(request.algo_name() == "SHA-224") return new EVP_HashFunction(EVP_sha224(), "SHA-224"); if(request.algo_name() == "SHA-256") return new EVP_HashFunction(EVP_sha256(), "SHA-256"); #endif #if !defined(OPENSSL_NO_SHA512) if(request.algo_name() == "SHA-384") return new EVP_HashFunction(EVP_sha384(), "SHA-384"); if(request.algo_name() == "SHA-512") return new EVP_HashFunction(EVP_sha512(), "SHA-512"); #endif #if !defined(OPENSSL_NO_MD2) if(request.algo_name() == "MD2") return new EVP_HashFunction(EVP_md2(), "MD2"); #endif #if !defined(OPENSSL_NO_MD4) if(request.algo_name() == "MD4") return new EVP_HashFunction(EVP_md4(), "MD4"); #endif #if !defined(OPENSSL_NO_MD5) if(request.algo_name() == "MD5") return new EVP_HashFunction(EVP_md5(), "MD5"); #endif #if !defined(OPENSSL_NO_RIPEMD) if(request.algo_name() == "RIPEMD-160") return new EVP_HashFunction(EVP_ripemd160(), "RIPEMD-160"); #endif return 0; } } Botan-1.10.12/src/engine/openssl/ossl_pk.cpp0000664000175000017500000002137512654331322020471 0ustar jackjack00000000000000/* * OpenSSL PK operations * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_ECDSA) #include #include #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include #endif namespace Botan { namespace { #if defined(BOTAN_HAS_DIFFIE_HELLMAN) class OSSL_DH_KA_Operation : public PK_Ops::Key_Agreement { public: OSSL_DH_KA_Operation(const DH_PrivateKey& dh) : x(dh.get_x()), p(dh.group_p()) {} SecureVector agree(const byte w[], size_t w_len) { OSSL_BN i(w, w_len), r; BN_mod_exp(r.value, i.value, x.value, p.value, ctx.value); return r.to_bytes(); } private: const OSSL_BN x, p; OSSL_BN_CTX ctx; }; #endif #if defined(BOTAN_HAS_DSA) class OSSL_DSA_Signature_Operation : public PK_Ops::Signature { public: OSSL_DSA_Signature_Operation(const DSA_PrivateKey& dsa) : x(dsa.get_x()), p(dsa.group_p()), q(dsa.group_q()), g(dsa.group_g()), q_bits(dsa.group_q().bits()) {} size_t message_parts() const { return 2; } size_t message_part_size() const { return (q_bits + 7) / 8; } size_t max_input_bits() const { return q_bits; } SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng); private: const OSSL_BN x, p, q, g; const OSSL_BN_CTX ctx; size_t q_bits; }; SecureVector OSSL_DSA_Signature_Operation::sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) { const size_t q_bytes = (q_bits + 7) / 8; rng.add_entropy(msg, msg_len); BigInt k_bn; do k_bn.randomize(rng, q_bits); while(k_bn >= q.to_bigint()); OSSL_BN i(msg, msg_len); OSSL_BN k(k_bn); OSSL_BN r; BN_mod_exp(r.value, g.value, k.value, p.value, ctx.value); BN_nnmod(r.value, r.value, q.value, ctx.value); BN_mod_inverse(k.value, k.value, q.value, ctx.value); OSSL_BN s; BN_mul(s.value, x.value, r.value, ctx.value); BN_add(s.value, s.value, i.value); BN_mod_mul(s.value, s.value, k.value, q.value, ctx.value); if(BN_is_zero(r.value) || BN_is_zero(s.value)) throw Internal_Error("OpenSSL_DSA_Op::sign: r or s was zero"); SecureVector output(2*q_bytes); r.encode(output, q_bytes); s.encode(output + q_bytes, q_bytes); return output; } class OSSL_DSA_Verification_Operation : public PK_Ops::Verification { public: OSSL_DSA_Verification_Operation(const DSA_PublicKey& dsa) : y(dsa.get_y()), p(dsa.group_p()), q(dsa.group_q()), g(dsa.group_g()), q_bits(dsa.group_q().bits()) {} size_t message_parts() const { return 2; } size_t message_part_size() const { return (q_bits + 7) / 8; } size_t max_input_bits() const { return q_bits; } bool with_recovery() const { return false; } bool verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len); private: const OSSL_BN y, p, q, g; const OSSL_BN_CTX ctx; size_t q_bits; }; bool OSSL_DSA_Verification_Operation::verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len) { const size_t q_bytes = q.bytes(); if(sig_len != 2*q_bytes || msg_len > q_bytes) return false; OSSL_BN r(sig, q_bytes); OSSL_BN s(sig + q_bytes, q_bytes); OSSL_BN i(msg, msg_len); if(BN_is_zero(r.value) || BN_cmp(r.value, q.value) >= 0) return false; if(BN_is_zero(s.value) || BN_cmp(s.value, q.value) >= 0) return false; if(BN_mod_inverse(s.value, s.value, q.value, ctx.value) == 0) return false; OSSL_BN si; BN_mod_mul(si.value, s.value, i.value, q.value, ctx.value); BN_mod_exp(si.value, g.value, si.value, p.value, ctx.value); OSSL_BN sr; BN_mod_mul(sr.value, s.value, r.value, q.value, ctx.value); BN_mod_exp(sr.value, y.value, sr.value, p.value, ctx.value); BN_mod_mul(si.value, si.value, sr.value, p.value, ctx.value); BN_nnmod(si.value, si.value, q.value, ctx.value); if(BN_cmp(si.value, r.value) == 0) return true; return false; return false; } #endif #if defined(BOTAN_HAS_RSA) class OSSL_RSA_Private_Operation : public PK_Ops::Signature, public PK_Ops::Decryption { public: OSSL_RSA_Private_Operation(const RSA_PrivateKey& rsa) : mod(rsa.get_n()), p(rsa.get_p()), q(rsa.get_q()), d1(rsa.get_d1()), d2(rsa.get_d2()), c(rsa.get_c()), n_bits(rsa.get_n().bits()) {} size_t max_input_bits() const { return (n_bits - 1); } SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator&) { BigInt m(msg, msg_len); BigInt x = private_op(m); return BigInt::encode_1363(x, (n_bits + 7) / 8); } SecureVector decrypt(const byte msg[], size_t msg_len) { BigInt m(msg, msg_len); return BigInt::encode(private_op(m)); } private: BigInt private_op(const BigInt& m) const; const OSSL_BN mod, p, q, d1, d2, c; const OSSL_BN_CTX ctx; size_t n_bits; }; BigInt OSSL_RSA_Private_Operation::private_op(const BigInt& m) const { OSSL_BN j1, j2, h(m); BN_mod_exp(j1.value, h.value, d1.value, p.value, ctx.value); BN_mod_exp(j2.value, h.value, d2.value, q.value, ctx.value); BN_sub(h.value, j1.value, j2.value); BN_mod_mul(h.value, h.value, c.value, p.value, ctx.value); BN_mul(h.value, h.value, q.value, ctx.value); BN_add(h.value, h.value, j2.value); return h.to_bigint(); } class OSSL_RSA_Public_Operation : public PK_Ops::Verification, public PK_Ops::Encryption { public: OSSL_RSA_Public_Operation(const RSA_PublicKey& rsa) : n(rsa.get_n()), e(rsa.get_e()), mod(rsa.get_n()) {} size_t max_input_bits() const { return (n.bits() - 1); } bool with_recovery() const { return true; } SecureVector encrypt(const byte msg[], size_t msg_len, RandomNumberGenerator&) { BigInt m(msg, msg_len); return BigInt::encode_1363(public_op(m), n.bytes()); } SecureVector verify_mr(const byte msg[], size_t msg_len) { BigInt m(msg, msg_len); return BigInt::encode(public_op(m)); } private: BigInt public_op(const BigInt& m) const { if(m >= n) throw Invalid_Argument("RSA public op - input is too large"); OSSL_BN m_bn(m), r; BN_mod_exp(r.value, m_bn.value, e.value, mod.value, ctx.value); return r.to_bigint(); } const BigInt& n; const OSSL_BN e, mod; const OSSL_BN_CTX ctx; }; #endif } PK_Ops::Key_Agreement* OpenSSL_Engine::get_key_agreement_op(const Private_Key& key) const { #if defined(BOTAN_HAS_DIFFIE_HELLMAN) if(const DH_PrivateKey* dh = dynamic_cast(&key)) return new OSSL_DH_KA_Operation(*dh); #endif return 0; } PK_Ops::Signature* OpenSSL_Engine::get_signature_op(const Private_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PrivateKey* s = dynamic_cast(&key)) return new OSSL_RSA_Private_Operation(*s); #endif #if defined(BOTAN_HAS_DSA) if(const DSA_PrivateKey* s = dynamic_cast(&key)) return new OSSL_DSA_Signature_Operation(*s); #endif return 0; } PK_Ops::Verification* OpenSSL_Engine::get_verify_op(const Public_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PublicKey* s = dynamic_cast(&key)) return new OSSL_RSA_Public_Operation(*s); #endif #if defined(BOTAN_HAS_DSA) if(const DSA_PublicKey* s = dynamic_cast(&key)) return new OSSL_DSA_Verification_Operation(*s); #endif return 0; } PK_Ops::Encryption* OpenSSL_Engine::get_encryption_op(const Public_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PublicKey* s = dynamic_cast(&key)) return new OSSL_RSA_Public_Operation(*s); #endif return 0; } PK_Ops::Decryption* OpenSSL_Engine::get_decryption_op(const Private_Key& key) const { #if defined(BOTAN_HAS_RSA) if(const RSA_PrivateKey* s = dynamic_cast(&key)) return new OSSL_RSA_Private_Operation(*s); #endif return 0; } } Botan-1.10.12/src/engine/simd_engine/info.txt0000664000175000017500000000022512654331322020574 0ustar jackjack00000000000000define ENGINE_SIMD load_on dep simd_engine.cpp simd_engine.h simd Botan-1.10.12/src/engine/simd_engine/simd_engine.cpp0000664000175000017500000000362112654331322022070 0ustar jackjack00000000000000/* * SIMD Engine * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #if defined(BOTAN_HAS_AES_SSSE3) #include #endif #if defined(BOTAN_HAS_SERPENT_SIMD) #include #endif #if defined(BOTAN_HAS_NOEKEON_SIMD) #include #endif #if defined(BOTAN_HAS_XTEA_SIMD) #include #endif #if defined(BOTAN_HAS_IDEA_SSE2) #include #endif #if defined(BOTAN_HAS_SHA1_SSE2) #include #endif namespace Botan { BlockCipher* SIMD_Engine::find_block_cipher(const SCAN_Name& request, Algorithm_Factory&) const { #if defined(BOTAN_HAS_AES_SSSE3) if(request.algo_name() == "AES-128" && CPUID::has_ssse3()) return new AES_128_SSSE3; if(request.algo_name() == "AES-192" && CPUID::has_ssse3()) return new AES_192_SSSE3; if(request.algo_name() == "AES-256" && CPUID::has_ssse3()) return new AES_256_SSSE3; #endif #if defined(BOTAN_HAS_IDEA_SSE2) if(request.algo_name() == "IDEA" && CPUID::has_sse2()) return new IDEA_SSE2; #endif #if defined(BOTAN_HAS_NOEKEON_SIMD) if(request.algo_name() == "Noekeon" && SIMD_32::enabled()) return new Noekeon_SIMD; #endif #if defined(BOTAN_HAS_SERPENT_SIMD) if(request.algo_name() == "Serpent" && SIMD_32::enabled()) return new Serpent_SIMD; #endif #if defined(BOTAN_HAS_XTEA_SIMD) if(request.algo_name() == "XTEA" && SIMD_32::enabled()) return new XTEA_SIMD; #endif return 0; } HashFunction* SIMD_Engine::find_hash(const SCAN_Name& request, Algorithm_Factory&) const { #if defined(BOTAN_HAS_SHA1_SSE2) if(request.algo_name() == "SHA-160" && CPUID::has_sse2()) return new SHA_160_SSE2; #endif return 0; } } Botan-1.10.12/src/engine/simd_engine/simd_engine.h0000664000175000017500000000120012654331322021524 0ustar jackjack00000000000000/* * SIMD Assembly Engine * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SIMD_ENGINE_H__ #define BOTAN_SIMD_ENGINE_H__ #include namespace Botan { /** * Engine for implementations that use some kind of SIMD */ class SIMD_Engine : public Engine { public: std::string provider_name() const { return "simd"; } BlockCipher* find_block_cipher(const SCAN_Name&, Algorithm_Factory&) const; HashFunction* find_hash(const SCAN_Name& request, Algorithm_Factory&) const; }; } #endif Botan-1.10.12/src/entropy/beos_stats/es_beos.cpp0000664000175000017500000000254312654331322021350 0ustar jackjack00000000000000/* * BeOS EntropySource * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /** * BeOS entropy poll */ void BeOS_EntropySource::poll(Entropy_Accumulator& accum) { system_info info_sys; get_system_info(&info_sys); accum.add(info_sys, 2); key_info info_key; // current state of the keyboard get_key_info(&info_key); accum.add(info_key, 0); team_info info_team; int32 cookie_team = 0; while(get_next_team_info(&cookie_team, &info_team) == B_OK) { accum.add(info_team, 2); team_id id = info_team.team; int32 cookie = 0; thread_info info_thr; while(get_next_thread_info(id, &cookie, &info_thr) == B_OK) accum.add(info_thr, 1); cookie = 0; image_info info_img; while(get_next_image_info(id, &cookie, &info_img) == B_OK) accum.add(info_img, 1); cookie = 0; sem_info info_sem; while(get_next_sem_info(id, &cookie, &info_sem) == B_OK) accum.add(info_sem, 1); cookie = 0; area_info info_area; while(get_next_area_info(id, &cookie, &info_area) == B_OK) accum.add(info_area, 2); if(accum.polling_goal_achieved()) break; } } } Botan-1.10.12/src/entropy/beos_stats/es_beos.h0000664000175000017500000000070012654331322021006 0ustar jackjack00000000000000/* * BeOS EntropySource * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SRC_BEOS_H__ #define BOTAN_ENTROPY_SRC_BEOS_H__ #include namespace Botan { /** * BeOS Entropy Source */ class BeOS_EntropySource : public EntropySource { private: std::string name() const { return "BeOS Statistics"; } void poll(Entropy_Accumulator& accum); }; } #endif Botan-1.10.12/src/entropy/beos_stats/info.txt0000664000175000017500000000023312654331322020713 0ustar jackjack00000000000000define ENTROPY_SRC_BEOS es_beos.cpp es_beos.h haiku haiku -> root,be Botan-1.10.12/src/entropy/cryptoapi_rng/es_capi.cpp0000664000175000017500000000412412654331322022043 0ustar jackjack00000000000000/* * Win32 CryptoAPI EntropySource * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { class CSP_Handle { public: CSP_Handle(u64bit capi_provider) { valid = false; DWORD prov_type = (DWORD)capi_provider; if(CryptAcquireContext(&handle, 0, 0, prov_type, CRYPT_VERIFYCONTEXT)) valid = true; } ~CSP_Handle() { if(is_valid()) CryptReleaseContext(handle, 0); } size_t gen_random(byte out[], size_t n) const { if(is_valid() && CryptGenRandom(handle, static_cast(n), out)) return n; return 0; } bool is_valid() const { return valid; } HCRYPTPROV get_handle() const { return handle; } private: HCRYPTPROV handle; bool valid; }; } /* * Gather Entropy from Win32 CAPI */ void Win32_CAPI_EntropySource::poll(Entropy_Accumulator& accum) { MemoryRegion& io_buffer = accum.get_io_buffer(32); for(size_t i = 0; i != prov_types.size(); ++i) { CSP_Handle csp(prov_types[i]); size_t got = csp.gen_random(&io_buffer[0], io_buffer.size()); if(got) { accum.add(&io_buffer[0], io_buffer.size(), 6); break; } } } /* * Win32_Capi_Entropysource Constructor */ Win32_CAPI_EntropySource::Win32_CAPI_EntropySource(const std::string& provs) { std::vector capi_provs = split_on(provs, ':'); for(size_t i = 0; i != capi_provs.size(); ++i) { if(capi_provs[i] == "RSA_FULL") prov_types.push_back(PROV_RSA_FULL); if(capi_provs[i] == "INTEL_SEC") prov_types.push_back(PROV_INTEL_SEC); if(capi_provs[i] == "FORTEZZA") prov_types.push_back(PROV_FORTEZZA); if(capi_provs[i] == "RNG") prov_types.push_back(PROV_RNG); } if(prov_types.size() == 0) prov_types.push_back(PROV_RSA_FULL); } } Botan-1.10.12/src/entropy/cryptoapi_rng/es_capi.h0000664000175000017500000000133412654331322021510 0ustar jackjack00000000000000/* * Win32 CAPI EntropySource * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SRC_WIN32_CAPI_H__ #define BOTAN_ENTROPY_SRC_WIN32_CAPI_H__ #include #include namespace Botan { /** * Win32 CAPI Entropy Source */ class Win32_CAPI_EntropySource : public EntropySource { public: std::string name() const { return "Win32 CryptoGenRandom"; } void poll(Entropy_Accumulator& accum); /** * Win32_Capi_Entropysource Constructor * @param provs list of providers, separated by ':' */ Win32_CAPI_EntropySource(const std::string& provs = ""); private: std::vector prov_types; }; } #endif Botan-1.10.12/src/entropy/cryptoapi_rng/info.txt0000664000175000017500000000042212654331322021425 0ustar jackjack00000000000000define ENTROPY_SRC_CAPI es_capi.cpp es_capi.h # We'll just assume CAPI is there; this is OK except for 3.x, early # versions of 95, and maybe NT 3.5 windows cygwin windows -> advapi32.lib Botan-1.10.12/src/entropy/dev_random/dev_random.cpp0000664000175000017500000000427112654331322022017 0ustar jackjack00000000000000/* * Reader of /dev/random and company * (C) 1999-2009,2013 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { int open_nonblocking(const char* pathname) { #ifndef O_NONBLOCK #define O_NONBLOCK 0 #endif #ifndef O_NOCTTY #define O_NOCTTY 0 #endif const int flags = O_RDONLY | O_NONBLOCK | O_NOCTTY; return ::open(pathname, flags); } } /** Device_EntropySource constructor Open a file descriptor to each (available) device in fsnames */ Device_EntropySource::Device_EntropySource(const std::vector& fsnames) { for(size_t i = 0; i != fsnames.size(); ++i) { fd_type fd = open_nonblocking(fsnames[i].c_str()); if(fd >= 0 && fd < FD_SETSIZE) devices.push_back(fd); } } /** Device_EntropySource destructor: close all open devices */ Device_EntropySource::~Device_EntropySource() { for(size_t i = 0; i != devices.size(); ++i) ::close(devices[i]); } /** * Gather entropy from a RNG device */ void Device_EntropySource::poll(Entropy_Accumulator& accum) { if(devices.empty()) return; const size_t ENTROPY_BITS_PER_BYTE = 8; const size_t MS_WAIT_TIME = 32; const size_t READ_ATTEMPT = accum.desired_remaining_bits() / 4; MemoryRegion& io_buffer = accum.get_io_buffer(READ_ATTEMPT); int max_fd = devices[0]; fd_set read_set; FD_ZERO(&read_set); for(size_t i = 0; i != devices.size(); ++i) { FD_SET(devices[i], &read_set); max_fd = std::max(devices[i], max_fd); } struct ::timeval timeout; timeout.tv_sec = (MS_WAIT_TIME / 1000); timeout.tv_usec = (MS_WAIT_TIME % 1000) * 1000; if(::select(max_fd + 1, &read_set, 0, 0, &timeout) < 0) return; for(size_t i = 0; i != devices.size(); ++i) { if(FD_ISSET(devices[i], &read_set)) { const ssize_t got = ::read(devices[i], &io_buffer[0], io_buffer.size()); if(got > 0) accum.add(&io_buffer[0], got, ENTROPY_BITS_PER_BYTE); } } } } Botan-1.10.12/src/entropy/dev_random/dev_random.h0000664000175000017500000000131312654331322021456 0ustar jackjack00000000000000/* * /dev/random EntropySource * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SRC_DEVICE_H__ #define BOTAN_ENTROPY_SRC_DEVICE_H__ #include #include #include namespace Botan { /** * Entropy source reading from kernel devices like /dev/random */ class Device_EntropySource : public EntropySource { public: std::string name() const { return "RNG Device Reader"; } void poll(Entropy_Accumulator& accum); Device_EntropySource(const std::vector& fsnames); ~Device_EntropySource(); private: typedef int fd_type; std::vector devices; }; } #endif Botan-1.10.12/src/entropy/dev_random/info.txt0000664000175000017500000000034012654331322020662 0ustar jackjack00000000000000define ENTROPY_SRC_DEV_RANDOM dev_random.cpp dev_random.h aix cygwin darwin dragonfly freebsd haiku hpux hurd irix linux netbsd openbsd qnx solaris tru64 Botan-1.10.12/src/entropy/egd/es_egd.cpp0000664000175000017500000000651312654331322017551 0ustar jackjack00000000000000/* * EGD EntropySource * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #include #ifndef PF_LOCAL #define PF_LOCAL PF_UNIX #endif namespace Botan { EGD_EntropySource::EGD_Socket::EGD_Socket(const std::string& path) : socket_path(path), m_fd(-1) { } /** * Attempt a connection to an EGD/PRNGD socket */ int EGD_EntropySource::EGD_Socket::open_socket(const std::string& path) { int fd = ::socket(PF_LOCAL, SOCK_STREAM, 0); if(fd >= 0) { sockaddr_un addr; std::memset(&addr, 0, sizeof(addr)); addr.sun_family = PF_LOCAL; if(path.length() >= sizeof(addr.sun_path)) throw std::invalid_argument("EGD socket path is too long"); std::strncpy(addr.sun_path, path.c_str(), sizeof(addr.sun_path)); int len = sizeof(addr.sun_family) + std::strlen(addr.sun_path) + 1; if(::connect(fd, reinterpret_cast(&addr), len) < 0) { ::close(fd); fd = -1; } } return fd; } /** * Attempt to read entropy from EGD */ size_t EGD_EntropySource::EGD_Socket::read(byte outbuf[], size_t length) { if(length == 0) return 0; if(m_fd < 0) { m_fd = open_socket(socket_path); if(m_fd < 0) return 0; } try { // 1 == EGD command for non-blocking read byte egd_read_command[2] = { 1, static_cast(std::min(length, 255)) }; if(::write(m_fd, egd_read_command, 2) != 2) throw std::runtime_error("Writing entropy read command to EGD failed"); byte out_len = 0; if(::read(m_fd, &out_len, 1) != 1) throw std::runtime_error("Reading response length from EGD failed"); if(out_len > egd_read_command[1]) throw std::runtime_error("Bogus length field received from EGD"); ssize_t count = ::read(m_fd, outbuf, out_len); if(count != out_len) throw std::runtime_error("Reading entropy result from EGD failed"); return static_cast(count); } catch(std::exception) { this->close(); // Will attempt to reopen next poll } return 0; } void EGD_EntropySource::EGD_Socket::close() { if(m_fd > 0) { ::close(m_fd); m_fd = -1; } } /** * EGD_EntropySource constructor */ EGD_EntropySource::EGD_EntropySource(const std::vector& paths) { for(size_t i = 0; i != paths.size(); ++i) sockets.push_back(EGD_Socket(paths[i])); } EGD_EntropySource::~EGD_EntropySource() { for(size_t i = 0; i != sockets.size(); ++i) sockets[i].close(); sockets.clear(); } /** * Gather Entropy from EGD */ void EGD_EntropySource::poll(Entropy_Accumulator& accum) { size_t go_get = std::min(accum.desired_remaining_bits() / 8, 32); MemoryRegion& io_buffer = accum.get_io_buffer(go_get); for(size_t i = 0; i != sockets.size(); ++i) { size_t got = sockets[i].read(&io_buffer[0], io_buffer.size()); if(got) { accum.add(&io_buffer[0], got, 6); break; } } } } Botan-1.10.12/src/entropy/egd/es_egd.h0000664000175000017500000000167512654331322017222 0ustar jackjack00000000000000/* * EGD EntropySource * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SRC_EGD_H__ #define BOTAN_ENTROPY_SRC_EGD_H__ #include #include #include namespace Botan { /** * EGD Entropy Source */ class EGD_EntropySource : public EntropySource { public: std::string name() const { return "EGD/PRNGD"; } void poll(Entropy_Accumulator& accum); EGD_EntropySource(const std::vector&); ~EGD_EntropySource(); private: class EGD_Socket { public: EGD_Socket(const std::string& path); void close(); size_t read(byte outbuf[], size_t length); private: static int open_socket(const std::string& path); std::string socket_path; int m_fd; // cached fd }; std::vector sockets; }; } #endif Botan-1.10.12/src/entropy/egd/info.txt0000664000175000017500000000036612654331322017313 0ustar jackjack00000000000000define ENTROPY_SRC_EGD es_egd.cpp es_egd.h solaris -> socket qnx -> socket aix cygwin darwin freebsd dragonfly hpux irix linux netbsd openbsd qnx solaris tru64 Botan-1.10.12/src/entropy/entropy_src.h0000664000175000017500000000734512654331322017604 0ustar jackjack00000000000000/* * EntropySource * (C) 2008-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SOURCE_BASE_H__ #define BOTAN_ENTROPY_SOURCE_BASE_H__ #include #include namespace Botan { /** * Class used to accumulate the poll results of EntropySources */ class BOTAN_DLL Entropy_Accumulator { public: /** * Initialize an Entropy_Accumulator * @param goal is how many bits we would like to collect */ Entropy_Accumulator(size_t goal) : entropy_goal(goal), collected_bits(0) {} virtual ~Entropy_Accumulator() {} /** * Get a cached I/O buffer (purely for minimizing allocation * overhead to polls) * * @param size requested size for the I/O buffer * @return cached I/O buffer for repeated polls */ MemoryRegion& get_io_buffer(size_t size) { io_buffer.resize(size); return io_buffer; } /** * @return number of bits collected so far */ size_t bits_collected() const { return static_cast(collected_bits); } /** * @return if our polling goal has been achieved */ bool polling_goal_achieved() const { return (collected_bits >= entropy_goal); } /** * @return how many bits we need to reach our polling goal */ size_t desired_remaining_bits() const { if(collected_bits >= entropy_goal) return 0; return static_cast(entropy_goal - collected_bits); } /** * Add entropy to the accumulator * @param bytes the input bytes * @param length specifies how many bytes the input is * @param entropy_bits_per_byte is a best guess at how much * entropy per byte is in this input */ void add(const void* bytes, size_t length, double entropy_bits_per_byte) { add_bytes(reinterpret_cast(bytes), length); collected_bits += entropy_bits_per_byte * length; } /** * Add entropy to the accumulator * @param v is some value * @param entropy_bits_per_byte is a best guess at how much * entropy per byte is in this input */ template void add(const T& v, double entropy_bits_per_byte) { add(&v, sizeof(T), entropy_bits_per_byte); } private: virtual void add_bytes(const byte bytes[], size_t length) = 0; SecureVector io_buffer; size_t entropy_goal; double collected_bits; }; /** * Entropy accumulator that puts the input into a Buffered_Computation */ class BOTAN_DLL Entropy_Accumulator_BufferedComputation : public Entropy_Accumulator { public: /** * @param sink the hash or MAC we are feeding the poll data into * @param goal is how many bits we want to collect in this poll */ Entropy_Accumulator_BufferedComputation(Buffered_Computation& sink, size_t goal) : Entropy_Accumulator(goal), entropy_sink(sink) {} private: virtual void add_bytes(const byte bytes[], size_t length) { entropy_sink.update(bytes, length); } Buffered_Computation& entropy_sink; }; /** * Abstract interface to a source of (hopefully unpredictable) system entropy */ class BOTAN_DLL EntropySource { public: /** * @return name identifying this entropy source */ virtual std::string name() const = 0; /** * Perform an entropy gathering poll * @param accum is an accumulator object that will be given entropy */ virtual void poll(Entropy_Accumulator& accum) = 0; virtual ~EntropySource() {} }; } #endif Botan-1.10.12/src/entropy/hres_timer/hres_timer.cpp0000664000175000017500000000467212654331322022072 0ustar jackjack00000000000000/* * High Resolution Timestamp Entropy Source * (C) 1999-2009,2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #if defined(BOTAN_TARGET_OS_IS_WINDOWS) #include #endif namespace Botan { /* * Get the timestamp */ void High_Resolution_Timestamp::poll(Entropy_Accumulator& accum) { // If Windows, grab the Performance Counter (usually TSC or PIT) #if defined(BOTAN_TARGET_OS_IS_WINDOWS) { LARGE_INTEGER tv; ::QueryPerformanceCounter(&tv); accum.add(tv.QuadPart, 0); } #endif #if defined(BOTAN_TARGET_OS_HAS_CLOCK_GETTIME) #define CLOCK_POLL(src) \ do { \ struct timespec ts; \ clock_gettime(src, &ts); \ accum.add(&ts, sizeof(ts), 0); \ } while(0) #if defined(CLOCK_REALTIME) CLOCK_POLL(CLOCK_REALTIME); #endif #if defined(CLOCK_MONOTONIC) CLOCK_POLL(CLOCK_MONOTONIC); #endif #if defined(CLOCK_MONOTONIC_RAW) CLOCK_POLL(CLOCK_MONOTONIC_RAW); #endif #if defined(CLOCK_PROCESS_CPUTIME_ID) CLOCK_POLL(CLOCK_PROCESS_CPUTIME_ID); #endif #if defined(CLOCK_THREAD_CPUTIME_ID) CLOCK_POLL(CLOCK_THREAD_CPUTIME_ID); #endif #undef CLOCK_POLL #endif #if BOTAN_USE_GCC_INLINE_ASM u64bit rtc = 0; #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) if(CPUID::has_rdtsc()) // not availble on all x86 CPUs { u32bit rtc_low = 0, rtc_high = 0; asm volatile("rdtsc" : "=d" (rtc_high), "=a" (rtc_low)); rtc = (static_cast(rtc_high) << 32) | rtc_low; } #elif defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) u32bit rtc_low = 0, rtc_high = 0; asm volatile("mftbu %0; mftb %1" : "=r" (rtc_high), "=r" (rtc_low)); rtc = (static_cast(rtc_high) << 32) | rtc_low; #elif defined(BOTAN_TARGET_ARCH_IS_ALPHA) asm volatile("rpcc %0" : "=r" (rtc)); #elif defined(BOTAN_TARGET_ARCH_IS_SPARC64) && !defined(BOTAN_TARGET_OS_IS_OPENBSD) asm volatile("rd %%tick, %0" : "=r" (rtc)); #elif defined(BOTAN_TARGET_ARCH_IS_IA64) asm volatile("mov %0=ar.itc" : "=r" (rtc)); #elif defined(BOTAN_TARGET_ARCH_IS_S390X) asm volatile("stck 0(%0)" : : "a" (&rtc) : "memory", "cc"); #elif defined(BOTAN_TARGET_ARCH_IS_HPPA) asm volatile("mfctl 16,%0" : "=r" (rtc)); // 64-bit only? #endif // Don't count the timestamp as contributing entropy accum.add(rtc, 0); #endif } } Botan-1.10.12/src/entropy/hres_timer/hres_timer.h0000664000175000017500000000122212654331322021523 0ustar jackjack00000000000000/* * High Resolution Timestamp Entropy Source * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SRC_HRES_TIMER_H__ #define BOTAN_ENTROPY_SRC_HRES_TIMER_H__ #include namespace Botan { /** * Entropy source using high resolution timers * * @note Any results from timers are marked as not contributing entropy * to the poll, as a local attacker could observe them directly. */ class High_Resolution_Timestamp : public EntropySource { public: std::string name() const { return "High Resolution Timestamp"; } void poll(Entropy_Accumulator& accum); }; } #endif Botan-1.10.12/src/entropy/hres_timer/info.txt0000664000175000017500000000017712654331322020715 0ustar jackjack00000000000000define ENTROPY_SRC_HIGH_RESOLUTION_TIMER hres_timer.cpp hres_timer.h Botan-1.10.12/src/entropy/info.txt0000664000175000017500000000004112654331322016542 0ustar jackjack00000000000000 algo_base Botan-1.10.12/src/entropy/proc_walk/es_ftw.cpp0000664000175000017500000000745712654331322021044 0ustar jackjack00000000000000/* * FTW EntropySource * (C) 1999-2008,2012 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199309 #endif #include #include #include #include #include namespace Botan { /** * Returns file descriptors. Until it doesn't */ class File_Descriptor_Source { public: /** * @return next file descriptor, or -1 if done */ virtual int next_fd() = 0; virtual ~File_Descriptor_Source() {} }; namespace { class Directory_Walker : public File_Descriptor_Source { public: Directory_Walker(const std::string& root) : m_cur_dir(std::make_pair(0, "")) { if(DIR* root_dir = ::opendir(root.c_str())) m_cur_dir = std::make_pair(root_dir, root); } ~Directory_Walker() { if(m_cur_dir.first) ::closedir(m_cur_dir.first); } int next_fd(); private: void add_directory(const std::string& dirname) { m_dirlist.push_back(dirname); } std::pair get_next_dirent(); std::pair m_cur_dir; std::deque m_dirlist; }; std::pair Directory_Walker::get_next_dirent() { while(m_cur_dir.first) { struct dirent* dir = ::readdir(m_cur_dir.first); if(dir) return std::make_pair(dir, m_cur_dir.second); ::closedir(m_cur_dir.first); m_cur_dir = std::make_pair(0, ""); while(!m_dirlist.empty() && m_cur_dir.first == 0) { const std::string next_dir_name = m_dirlist[0]; m_dirlist.pop_front(); if(DIR* next_dir = ::opendir(next_dir_name.c_str())) m_cur_dir = std::make_pair(next_dir, next_dir_name); } } return std::make_pair(0, ""); // nothing left } int Directory_Walker::next_fd() { while(true) { std::pair entry = get_next_dirent(); if(!entry.first) break; // no more dirs const std::string filename = entry.first->d_name; if(filename == "." || filename == "..") continue; const std::string full_path = entry.second + '/' + filename; struct stat stat_buf; if(::lstat(full_path.c_str(), &stat_buf) == -1) continue; if(S_ISDIR(stat_buf.st_mode)) { add_directory(full_path); } else if(S_ISREG(stat_buf.st_mode) && (stat_buf.st_mode & S_IROTH)) { int fd = ::open(full_path.c_str(), O_RDONLY | O_NOCTTY); if(fd >= 0) return fd; } } return -1; } } /** * FTW_EntropySource Constructor */ FTW_EntropySource::FTW_EntropySource(const std::string& p) : path(p) { dir = 0; } /** * FTW_EntropySource Destructor */ FTW_EntropySource::~FTW_EntropySource() { delete dir; } void FTW_EntropySource::poll(Entropy_Accumulator& accum) { const size_t MAX_FILES_READ_PER_POLL = 2048; if(!dir) dir = new Directory_Walker(path); MemoryRegion& io_buffer = accum.get_io_buffer(4096); for(size_t i = 0; i != MAX_FILES_READ_PER_POLL; ++i) { int fd = dir->next_fd(); // If we've exhaused this walk of the directory, halt the poll if(fd == -1) { delete dir; dir = 0; break; } ssize_t got = ::read(fd, &io_buffer[0], io_buffer.size()); ::close(fd); if(got > 0) accum.add(&io_buffer[0], got, .001); if(accum.polling_goal_achieved()) break; } } } Botan-1.10.12/src/entropy/proc_walk/es_ftw.h0000664000175000017500000000116212654331322020474 0ustar jackjack00000000000000/* * File Tree Walking EntropySource * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SRC_FTW_H__ #define BOTAN_ENTROPY_SRC_FTW_H__ #include namespace Botan { /** * File Tree Walking Entropy Source */ class FTW_EntropySource : public EntropySource { public: std::string name() const { return "Proc Walker"; } void poll(Entropy_Accumulator& accum); FTW_EntropySource(const std::string& root_dir); ~FTW_EntropySource(); private: std::string path; class File_Descriptor_Source* dir; }; } #endif Botan-1.10.12/src/entropy/proc_walk/info.txt0000664000175000017500000000035112654331322020527 0ustar jackjack00000000000000define ENTROPY_SRC_FTW es_ftw.cpp es_ftw.h aix cygwin darwin dragonfly freebsd hpux hurd irix linux netbsd openbsd qnx solaris tru64 alloc Botan-1.10.12/src/entropy/rdrand/info.txt0000664000175000017500000000023512654331322020021 0ustar jackjack00000000000000define ENTROPY_SRC_RDRAND rdrand.cpp rdrand.h x86 x86_64 gcc clang icc Botan-1.10.12/src/entropy/rdrand/rdrand.cpp0000664000175000017500000000275512654331322020314 0ustar jackjack00000000000000/* * Entropy Source Using Intel's rdrand instruction * (C) 2012 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #if !defined(BOTAN_USE_GCC_INLINE_ASM) #include #endif namespace Botan { /* * Get the timestamp */ void Intel_Rdrand::poll(Entropy_Accumulator& accum) { if(!CPUID::has_rdrand()) return; /* * Put an upper bound on the total entropy we're willing to claim * for any one polling of rdrand to prevent it from swamping our * poll. Internally, the rdrand system is a DRGB that reseeds at a * somewhat unpredictable rate (the current conditions are * documented, but that might not be true for different * implementations, eg on Haswell or a future AMD chip, so I don't * want to assume). This limit ensures we're going to poll at least * one other source so we have some diversity in our inputs. */ const size_t POLL_UPPER_BOUND = 96; const size_t RDRAND_POLLS = 32; const double ENTROPY_PER_POLL = static_cast(POLL_UPPER_BOUND) / (RDRAND_POLLS * 4); for(size_t i = 0; i != RDRAND_POLLS; ++i) { unsigned int r = 0; #if BOTAN_USE_GCC_INLINE_ASM int cf = 0; // Encoding of rdrand %eax asm(".byte 0x0F, 0xC7, 0xF0; adcl $0,%1" : "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc"); #else int cf = _rdrand32_step(&r); #endif if(cf == 1) accum.add(r, ENTROPY_PER_POLL); } } } Botan-1.10.12/src/entropy/rdrand/rdrand.h0000664000175000017500000000104012654331322017743 0ustar jackjack00000000000000/* * Entropy Source Using Intel's rdrand instruction * (C) 2012 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SRC_RDRAND_H__ #define BOTAN_ENTROPY_SRC_RDRAND_H__ #include namespace Botan { /** * Entropy source using the rdrand instruction first introduced on * Intel's Ivy Bridge architecture. */ class Intel_Rdrand : public EntropySource { public: std::string name() const { return "Intel Rdrand"; } void poll(Entropy_Accumulator& accum); }; } #endif Botan-1.10.12/src/entropy/unix_procs/es_unix.cpp0000664000175000017500000000527312654331322021431 0ustar jackjack00000000000000/* * Unix EntropySource * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include namespace Botan { namespace { /** * Sort ordering by priority */ bool Unix_Program_Cmp(const Unix_Program& a, const Unix_Program& b) { if(a.priority == b.priority) return (a.name_and_args < b.name_and_args); return (a.priority < b.priority); } } /** * Unix_EntropySource Constructor */ Unix_EntropySource::Unix_EntropySource(const std::vector& path) : PATH(path) { std::vector default_sources = get_default_sources(); add_sources(&default_sources[0], default_sources.size()); } /** * Add sources to the list */ void Unix_EntropySource::add_sources(const Unix_Program srcs[], size_t count) { sources.insert(sources.end(), srcs, srcs + count); std::sort(sources.begin(), sources.end(), Unix_Program_Cmp); } /** * Poll for entropy on a generic Unix system, first by grabbing various * statistics (stat on common files, getrusage, etc), and then, if more * is required, by exec'ing various programs like uname and rpcinfo and * reading the output. */ void Unix_EntropySource::poll(Entropy_Accumulator& accum) { const char* stat_targets[] = { "/", "/tmp", "/var/tmp", "/usr", "/home", "/etc/passwd", ".", "..", 0 }; for(size_t i = 0; stat_targets[i]; i++) { struct stat statbuf; clear_mem(&statbuf, 1); if(::stat(stat_targets[i], &statbuf) == 0) accum.add(&statbuf, sizeof(statbuf), .005); } accum.add(::getpid(), 0); accum.add(::getppid(), 0); accum.add(::getuid(), 0); accum.add(::getgid(), 0); accum.add(::getpgrp(), 0); struct ::rusage usage; ::getrusage(RUSAGE_SELF, &usage); accum.add(usage, .005); ::getrusage(RUSAGE_CHILDREN, &usage); accum.add(usage, .005); const size_t MINIMAL_WORKING = 16; MemoryRegion& io_buffer = accum.get_io_buffer(DEFAULT_BUFFERSIZE); for(size_t i = 0; i != sources.size(); i++) { DataSource_Command pipe(sources[i].name_and_args, PATH); size_t got_from_src = 0; while(!pipe.end_of_data()) { size_t got_this_loop = pipe.read(&io_buffer[0], io_buffer.size()); got_from_src += got_this_loop; accum.add(&io_buffer[0], got_this_loop, .005); } sources[i].working = (got_from_src >= MINIMAL_WORKING) ? true : false; if(accum.polling_goal_achieved()) break; } } } Botan-1.10.12/src/entropy/unix_procs/es_unix.h0000664000175000017500000000150212654331322021065 0ustar jackjack00000000000000/* * Unix EntropySource * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SRC_UNIX_H__ #define BOTAN_ENTROPY_SRC_UNIX_H__ #include #include #include namespace Botan { /** * Unix Entropy Source */ class Unix_EntropySource : public EntropySource { public: std::string name() const { return "Unix Entropy Source"; } void poll(Entropy_Accumulator& accum); void add_sources(const Unix_Program[], size_t); Unix_EntropySource(const std::vector& path); private: static std::vector get_default_sources(); void fast_poll(Entropy_Accumulator& accum); const std::vector PATH; std::vector sources; }; } #endif Botan-1.10.12/src/entropy/unix_procs/info.txt0000664000175000017500000000040212654331322020734 0ustar jackjack00000000000000define ENTROPY_SRC_UNIX es_unix.cpp unix_cmd.cpp unix_src.cpp es_unix.h unix_cmd.h aix cygwin darwin freebsd haiku hpux irix linux netbsd qnx solaris tru64 filters Botan-1.10.12/src/entropy/unix_procs/unix_cmd.cpp0000664000175000017500000001151212654331322021556 0ustar jackjack00000000000000/* * Unix Command Execution * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace { /** * Attempt to execute the command */ void do_exec(const std::vector& arg_list, const std::vector& paths) { const size_t args = arg_list.size() - 1; const char* arg1 = (args >= 1) ? arg_list[1].c_str() : 0; const char* arg2 = (args >= 2) ? arg_list[2].c_str() : 0; const char* arg3 = (args >= 3) ? arg_list[3].c_str() : 0; const char* arg4 = (args >= 4) ? arg_list[4].c_str() : 0; for(size_t j = 0; j != paths.size(); j++) { const std::string full_path = paths[j] + "/" + arg_list[0]; const char* fsname = full_path.c_str(); ::execl(fsname, fsname, arg1, arg2, arg3, arg4, NULL); } } } /** * Local information about the pipe */ struct pipe_wrapper { int fd; pid_t pid; pipe_wrapper(int f, pid_t p) : fd(f), pid(p) {} ~pipe_wrapper() { ::close(fd); } }; /** * Read from the pipe */ size_t DataSource_Command::read(byte buf[], size_t length) { if(end_of_data()) return 0; fd_set set; FD_ZERO(&set); FD_SET(pipe->fd, &set); struct ::timeval tv; tv.tv_sec = 0; tv.tv_usec = MAX_BLOCK_USECS; ssize_t got = 0; if(::select(pipe->fd + 1, &set, 0, 0, &tv) == 1) { if(FD_ISSET(pipe->fd, &set)) got = ::read(pipe->fd, buf, length); } if(got <= 0) { shutdown_pipe(); return 0; } return static_cast(got); } /** * Peek at the pipe contents */ size_t DataSource_Command::peek(byte[], size_t, size_t) const { if(end_of_data()) throw Invalid_State("DataSource_Command: Cannot peek when out of data"); throw Stream_IO_Error("Cannot peek/seek on a command pipe"); } bool DataSource_Command::check_available(size_t) { throw Stream_IO_Error("Cannot check available bytes on a pipe"); } /** * Check if we reached EOF */ bool DataSource_Command::end_of_data() const { return (pipe) ? false : true; } /** * Return the Unix file descriptor of the pipe */ int DataSource_Command::fd() const { if(!pipe) return -1; return pipe->fd; } /** * Return a human-readable ID for this stream */ std::string DataSource_Command::id() const { return "Unix command: " + arg_list[0]; } /** * Create the pipe */ void DataSource_Command::create_pipe(const std::vector& paths) { bool found_something = false; for(size_t j = 0; j != paths.size(); j++) { const std::string full_path = paths[j] + "/" + arg_list[0]; if(::access(full_path.c_str(), X_OK) == 0) { found_something = true; break; } } if(!found_something) return; int pipe_fd[2]; if(::pipe(pipe_fd) != 0) return; pid_t pid = ::fork(); if(pid == -1) { ::close(pipe_fd[0]); ::close(pipe_fd[1]); } else if(pid > 0) { pipe = new pipe_wrapper(pipe_fd[0], pid); ::close(pipe_fd[1]); } else { if(dup2(pipe_fd[1], STDOUT_FILENO) == -1) ::exit(127); if(close(pipe_fd[0]) != 0 || close(pipe_fd[1]) != 0) ::exit(127); if(close(STDERR_FILENO) != 0) ::exit(127); do_exec(arg_list, paths); ::exit(127); } } /** * Shutdown the pipe */ void DataSource_Command::shutdown_pipe() { if(pipe) { pid_t reaped = waitpid(pipe->pid, 0, WNOHANG); if(reaped == 0) { kill(pipe->pid, SIGTERM); struct ::timeval tv; tv.tv_sec = 0; tv.tv_usec = KILL_WAIT; select(0, 0, 0, 0, &tv); reaped = ::waitpid(pipe->pid, 0, WNOHANG); if(reaped == 0) { ::kill(pipe->pid, SIGKILL); do reaped = ::waitpid(pipe->pid, 0, 0); while(reaped == -1); } } delete pipe; pipe = 0; } } /** * DataSource_Command Constructor */ DataSource_Command::DataSource_Command(const std::string& prog_and_args, const std::vector& paths) : MAX_BLOCK_USECS(100000), KILL_WAIT(10000) { arg_list = split_on(prog_and_args, ' '); if(arg_list.size() == 0) throw Invalid_Argument("DataSource_Command: No command given"); if(arg_list.size() > 5) throw Invalid_Argument("DataSource_Command: Too many args"); pipe = 0; create_pipe(paths); } /** * DataSource_Command Destructor */ DataSource_Command::~DataSource_Command() { if(!end_of_data()) shutdown_pipe(); } } Botan-1.10.12/src/entropy/unix_procs/unix_cmd.h0000664000175000017500000000273712654331322021234 0ustar jackjack00000000000000/* * Unix Command Execution * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_UNIX_CMD_H__ #define BOTAN_UNIX_CMD_H__ #include #include #include #include namespace Botan { /** * Unix Program Info */ struct Unix_Program { /** * @param n is the name and arguments of what we are going run * @param p is the priority level (lower prio numbers get polled first) */ Unix_Program(const char* n, size_t p) { name_and_args = n; priority = p; working = true; } /** * The name and arguments for this command */ std::string name_and_args; /** * Priority: we scan from low to high */ size_t priority; /** * Does this source seem to be working? */ bool working; }; /** * Command Output DataSource */ class DataSource_Command : public DataSource { public: size_t read(byte[], size_t); size_t peek(byte[], size_t, size_t) const; bool check_available(size_t n); bool end_of_data() const; std::string id() const; int fd() const; DataSource_Command(const std::string&, const std::vector& paths); ~DataSource_Command(); private: void create_pipe(const std::vector&); void shutdown_pipe(); const size_t MAX_BLOCK_USECS, KILL_WAIT; std::vector arg_list; struct pipe_wrapper* pipe; }; } #endif Botan-1.10.12/src/entropy/unix_procs/unix_src.cpp0000664000175000017500000000500512654331322021602 0ustar jackjack00000000000000/* * Program List for Unix_EntropySource * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /** * Default Commands for Entropy Gathering */ std::vector Unix_EntropySource::get_default_sources() { std::vector srcs; srcs.push_back(Unix_Program("netstat -in", 1)); srcs.push_back(Unix_Program("pfstat", 1)); srcs.push_back(Unix_Program("vmstat -s", 1)); srcs.push_back(Unix_Program("vmstat", 1)); srcs.push_back(Unix_Program("arp -a -n", 2)); srcs.push_back(Unix_Program("ifconfig -a", 2)); srcs.push_back(Unix_Program("iostat", 2)); srcs.push_back(Unix_Program("ipcs -a", 2)); srcs.push_back(Unix_Program("mpstat", 2)); srcs.push_back(Unix_Program("netstat -an", 2)); srcs.push_back(Unix_Program("netstat -s", 2)); srcs.push_back(Unix_Program("nfsstat", 2)); srcs.push_back(Unix_Program("portstat", 2)); srcs.push_back(Unix_Program("procinfo -a", 2)); srcs.push_back(Unix_Program("pstat -T", 2)); srcs.push_back(Unix_Program("pstat -s", 2)); srcs.push_back(Unix_Program("uname -a", 2)); srcs.push_back(Unix_Program("uptime", 2)); srcs.push_back(Unix_Program("listarea", 3)); srcs.push_back(Unix_Program("listdev", 3)); srcs.push_back(Unix_Program("ps -A", 3)); srcs.push_back(Unix_Program("sysinfo", 3)); srcs.push_back(Unix_Program("finger", 4)); srcs.push_back(Unix_Program("mailstats", 4)); srcs.push_back(Unix_Program("rpcinfo -p localhost", 4)); srcs.push_back(Unix_Program("who", 4)); srcs.push_back(Unix_Program("df -l", 4)); srcs.push_back(Unix_Program("dmesg", 4)); srcs.push_back(Unix_Program("last -5", 4)); srcs.push_back(Unix_Program("ls -alni /proc", 4)); srcs.push_back(Unix_Program("ls -alni /tmp", 4)); srcs.push_back(Unix_Program("pstat -f", 4)); srcs.push_back(Unix_Program("ps -elf", 5)); srcs.push_back(Unix_Program("ps aux", 5)); srcs.push_back(Unix_Program("lsof -n", 6)); srcs.push_back(Unix_Program("sar -A", 6)); return srcs; } } Botan-1.10.12/src/entropy/win32_stats/es_win32.cpp0000664000175000017500000000643312654331322021376 0ustar jackjack00000000000000/* * Win32 EntropySource * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /** * Win32 poll using stats functions including Tooltip32 */ void Win32_EntropySource::poll(Entropy_Accumulator& accum) { /* First query a bunch of basic statistical stuff, though don't count it for much in terms of contributed entropy. */ accum.add(GetTickCount(), 0); accum.add(GetMessagePos(), 0); accum.add(GetMessageTime(), 0); accum.add(GetInputState(), 0); accum.add(GetCurrentProcessId(), 0); accum.add(GetCurrentThreadId(), 0); SYSTEM_INFO sys_info; GetSystemInfo(&sys_info); accum.add(sys_info, 1); MEMORYSTATUS mem_info; GlobalMemoryStatus(&mem_info); accum.add(mem_info, 1); POINT point; GetCursorPos(&point); accum.add(point, 1); GetCaretPos(&point); accum.add(point, 1); LARGE_INTEGER perf_counter; QueryPerformanceCounter(&perf_counter); accum.add(perf_counter, 0); /* Now use the Tooltip library to iterate throug various objects on the system, including processes, threads, and heap objects. */ HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); #define TOOLHELP32_ITER(DATA_TYPE, FUNC_FIRST, FUNC_NEXT) \ if(!accum.polling_goal_achieved()) \ { \ DATA_TYPE info; \ info.dwSize = sizeof(DATA_TYPE); \ if(FUNC_FIRST(snapshot, &info)) \ { \ do \ { \ accum.add(info, 1); \ } while(FUNC_NEXT(snapshot, &info)); \ } \ } TOOLHELP32_ITER(MODULEENTRY32, Module32First, Module32Next); TOOLHELP32_ITER(PROCESSENTRY32, Process32First, Process32Next); TOOLHELP32_ITER(THREADENTRY32, Thread32First, Thread32Next); #undef TOOLHELP32_ITER if(!accum.polling_goal_achieved()) { size_t heap_lists_found = 0; HEAPLIST32 heap_list; heap_list.dwSize = sizeof(HEAPLIST32); const size_t HEAP_LISTS_MAX = 32; const size_t HEAP_OBJS_PER_LIST = 128; if(Heap32ListFirst(snapshot, &heap_list)) { do { accum.add(heap_list, 1); if(++heap_lists_found > HEAP_LISTS_MAX) break; size_t heap_objs_found = 0; HEAPENTRY32 heap_entry; heap_entry.dwSize = sizeof(HEAPENTRY32); if(Heap32First(&heap_entry, heap_list.th32ProcessID, heap_list.th32HeapID)) { do { if(heap_objs_found++ > HEAP_OBJS_PER_LIST) break; accum.add(heap_entry, 1); } while(Heap32Next(&heap_entry)); } if(accum.polling_goal_achieved()) break; } while(Heap32ListNext(snapshot, &heap_list)); } } CloseHandle(snapshot); } } Botan-1.10.12/src/entropy/win32_stats/es_win32.h0000664000175000017500000000070412654331322021036 0ustar jackjack00000000000000/* * Win32 EntropySource * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENTROPY_SRC_WIN32_H__ #define BOTAN_ENTROPY_SRC_WIN32_H__ #include namespace Botan { /** * Win32 Entropy Source */ class Win32_EntropySource : public EntropySource { public: std::string name() const { return "Win32 Statistics"; } void poll(Entropy_Accumulator& accum); }; } #endif Botan-1.10.12/src/entropy/win32_stats/info.txt0000664000175000017500000000026212654331322020727 0ustar jackjack00000000000000define ENTROPY_SRC_WIN32 es_win32.cpp es_win32.h windows cygwin mingw windows -> user32.lib Botan-1.10.12/src/filters/algo_filt.cpp0000664000175000017500000000573512654331322017501 0ustar jackjack00000000000000/* * Filters * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * StreamCipher_Filter Constructor */ StreamCipher_Filter::StreamCipher_Filter(StreamCipher* stream_cipher) : buffer(DEFAULT_BUFFERSIZE) { cipher = stream_cipher; } /* * StreamCipher_Filter Constructor */ StreamCipher_Filter::StreamCipher_Filter(StreamCipher* stream_cipher, const SymmetricKey& key) : buffer(DEFAULT_BUFFERSIZE) { cipher = stream_cipher; cipher->set_key(key); } /* * StreamCipher_Filter Constructor */ StreamCipher_Filter::StreamCipher_Filter(const std::string& sc_name) : buffer(DEFAULT_BUFFERSIZE) { Algorithm_Factory& af = global_state().algorithm_factory(); cipher = af.make_stream_cipher(sc_name); } /* * StreamCipher_Filter Constructor */ StreamCipher_Filter::StreamCipher_Filter(const std::string& sc_name, const SymmetricKey& key) : buffer(DEFAULT_BUFFERSIZE) { Algorithm_Factory& af = global_state().algorithm_factory(); cipher = af.make_stream_cipher(sc_name); cipher->set_key(key); } /* * Set the IV of a stream cipher */ void StreamCipher_Filter::set_iv(const InitializationVector& iv) { cipher->set_iv(iv.begin(), iv.length()); } /* * Write data into a StreamCipher_Filter */ void StreamCipher_Filter::write(const byte input[], size_t length) { while(length) { size_t copied = std::min(length, buffer.size()); cipher->cipher(input, &buffer[0], copied); send(buffer, copied); input += copied; length -= copied; } } /* * Hash_Filter Constructor */ Hash_Filter::Hash_Filter(const std::string& algo_spec, size_t len) : OUTPUT_LENGTH(len) { Algorithm_Factory& af = global_state().algorithm_factory(); hash = af.make_hash_function(algo_spec); } /* * Complete a calculation by a Hash_Filter */ void Hash_Filter::end_msg() { SecureVector output = hash->final(); if(OUTPUT_LENGTH) send(output, std::min(OUTPUT_LENGTH, output.size())); else send(output); } /* * MAC_Filter Constructor */ MAC_Filter::MAC_Filter(const std::string& mac_name, size_t len) : OUTPUT_LENGTH(len) { Algorithm_Factory& af = global_state().algorithm_factory(); mac = af.make_mac(mac_name); } /* * MAC_Filter Constructor */ MAC_Filter::MAC_Filter(const std::string& mac_name, const SymmetricKey& key, size_t len) : OUTPUT_LENGTH(len) { Algorithm_Factory& af = global_state().algorithm_factory(); mac = af.make_mac(mac_name); mac->set_key(key); } /* * Complete a calculation by a MAC_Filter */ void MAC_Filter::end_msg() { SecureVector output = mac->final(); if(OUTPUT_LENGTH) send(output, std::min(OUTPUT_LENGTH, output.size())); else send(output); } } Botan-1.10.12/src/filters/basefilt.cpp0000664000175000017500000000224612654331322017324 0ustar jackjack00000000000000/* * Basic Filters * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { void Keyed_Filter::set_iv(const InitializationVector& iv) { if(iv.length() != 0) throw Invalid_IV_Length(name(), iv.length()); } /* * Chain Constructor */ Chain::Chain(Filter* f1, Filter* f2, Filter* f3, Filter* f4) { if(f1) { attach(f1); incr_owns(); } if(f2) { attach(f2); incr_owns(); } if(f3) { attach(f3); incr_owns(); } if(f4) { attach(f4); incr_owns(); } } /* * Chain Constructor */ Chain::Chain(Filter* filters[], size_t count) { for(size_t j = 0; j != count; ++j) if(filters[j]) { attach(filters[j]); incr_owns(); } } std::string Chain::name() const { return "Chain"; } /* * Fork Constructor */ Fork::Fork(Filter* f1, Filter* f2, Filter* f3, Filter* f4) { Filter* filters[4] = { f1, f2, f3, f4 }; set_next(filters, 4); } /* * Fork Constructor */ Fork::Fork(Filter* filters[], size_t count) { set_next(filters, count); } std::string Fork::name() const { return "Fork"; } } Botan-1.10.12/src/filters/basefilt.h0000664000175000017500000000366712654331322017001 0ustar jackjack00000000000000/* * Basic Filters * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BASEFILT_H__ #define BOTAN_BASEFILT_H__ #include namespace Botan { /** * BitBucket is a filter which simply discards all inputs */ struct BOTAN_DLL BitBucket : public Filter { void write(const byte[], size_t) {} std::string name() const { return "BitBucket"; } }; /** * This class represents Filter chains. A Filter chain is an ordered * concatenation of Filters, the input to a Chain sequentially passes * through all the Filters contained in the Chain. */ class BOTAN_DLL Chain : public Fanout_Filter { public: void write(const byte input[], size_t length) { send(input, length); } std::string name() const; /** * Construct a chain of up to four filters. The filters are set * up in the same order as the arguments. */ Chain(Filter* = 0, Filter* = 0, Filter* = 0, Filter* = 0); /** * Construct a chain from range of filters * @param filter_arr the list of filters * @param length how many filters */ Chain(Filter* filter_arr[], size_t length); }; /** * This class represents a fork filter, whose purpose is to fork the * flow of data. It causes an input message to result in n messages at * the end of the filter, where n is the number of forks. */ class BOTAN_DLL Fork : public Fanout_Filter { public: void write(const byte input[], size_t length) { send(input, length); } void set_port(size_t n) { Fanout_Filter::set_port(n); } std::string name() const; /** * Construct a Fork filter with up to four forks. */ Fork(Filter*, Filter*, Filter* = 0, Filter* = 0); /** * Construct a Fork from range of filters * @param filter_arr the list of filters * @param length how many filters */ Fork(Filter* filter_arr[], size_t length); }; } #endif Botan-1.10.12/src/filters/buf_filt.cpp0000664000175000017500000000455512654331322017332 0ustar jackjack00000000000000/* * Buffered Filter * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Buffered_Filter Constructor */ Buffered_Filter::Buffered_Filter(size_t b, size_t f) : main_block_mod(b), final_minimum(f) { if(main_block_mod == 0) throw std::invalid_argument("main_block_mod == 0"); if(final_minimum > main_block_mod) throw std::invalid_argument("final_minimum > main_block_mod"); buffer.resize(2 * main_block_mod); buffer_pos = 0; } /* * Buffer input into blocks, trying to minimize copying */ void Buffered_Filter::write(const byte input[], size_t input_size) { if(!input_size) return; if(buffer_pos + input_size >= main_block_mod + final_minimum) { size_t to_copy = std::min(buffer.size() - buffer_pos, input_size); copy_mem(&buffer[buffer_pos], input, to_copy); buffer_pos += to_copy; input += to_copy; input_size -= to_copy; size_t total_to_consume = round_down(std::min(buffer_pos, buffer_pos + input_size - final_minimum), main_block_mod); buffered_block(&buffer[0], total_to_consume); buffer_pos -= total_to_consume; copy_mem(&buffer[0], &buffer[total_to_consume], buffer_pos); } if(input_size >= final_minimum) { size_t full_blocks = (input_size - final_minimum) / main_block_mod; size_t to_copy = full_blocks * main_block_mod; if(to_copy) { buffered_block(input, to_copy); input += to_copy; input_size -= to_copy; } } copy_mem(&buffer[buffer_pos], input, input_size); buffer_pos += input_size; } /* * Finish/flush operation */ void Buffered_Filter::end_msg() { if(buffer_pos < final_minimum) throw std::runtime_error("Buffered filter end_msg without enough input"); size_t spare_blocks = (buffer_pos - final_minimum) / main_block_mod; if(spare_blocks) { size_t spare_bytes = main_block_mod * spare_blocks; buffered_block(&buffer[0], spare_bytes); buffered_final(&buffer[spare_bytes], buffer_pos - spare_bytes); } else { buffered_final(&buffer[0], buffer_pos); } buffer_pos = 0; } } Botan-1.10.12/src/filters/buf_filt.h0000664000175000017500000000437512654331322016777 0ustar jackjack00000000000000/* * Buffered Filter * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BUFFERED_FILTER_H__ #define BOTAN_BUFFERED_FILTER_H__ #include namespace Botan { /** * Filter mixin that breaks input into blocks, useful for * cipher modes */ class BOTAN_DLL Buffered_Filter { public: /** * Write bytes into the buffered filter, which will them emit them * in calls to buffered_block in the subclass * @param in the input bytes * @param length of in in bytes */ void write(const byte in[], size_t length); /** * Finish a message, emitting to buffered_block and buffered_final * Will throw an exception if less than final_minimum bytes were * written into the filter. */ void end_msg(); /** * Initialize a Buffered_Filter * @param block_size the function buffered_block will be called * with inputs which are a multiple of this size * @param final_minimum the function buffered_final will be called * with at least this many bytes. */ Buffered_Filter(size_t block_size, size_t final_minimum); virtual ~Buffered_Filter() {} protected: /** * The block processor, implemented by subclasses * @param input some input bytes * @param length the size of input, guaranteed to be a multiple * of block_size */ virtual void buffered_block(const byte input[], size_t length) = 0; /** * The final block, implemented by subclasses * @param input some input bytes * @param length the size of input, guaranteed to be at least * final_minimum bytes */ virtual void buffered_final(const byte input[], size_t length) = 0; /** * @return block size of inputs */ size_t buffered_block_size() const { return main_block_mod; } /** * @return current position in the buffer */ size_t current_position() const { return buffer_pos; } /** * Reset the buffer position */ void buffer_reset() { buffer_pos = 0; } private: size_t main_block_mod, final_minimum; SecureVector buffer; size_t buffer_pos; }; } #endif Botan-1.10.12/src/filters/bzip2/bzip2.cpp0000664000175000017500000001432212654331322017605 0ustar jackjack00000000000000/* * Bzip Compressor * (C) 2001 Peter J Jones * 2001-2007 Jack Lloyd * 2006 Matt Johnston * * Distributed under the terms of the Botan license */ #include #include #include #include #define BZ_NO_STDIO #include namespace Botan { namespace { /* * Allocation Information for Bzip */ class Bzip_Alloc_Info { public: std::map current_allocs; Allocator* alloc; Bzip_Alloc_Info() { alloc = Allocator::get(false); } }; /* * Allocation Function for Bzip */ void* bzip_malloc(void* info_ptr, int n, int size) { Bzip_Alloc_Info* info = static_cast(info_ptr); void* ptr = info->alloc->allocate(n * size); info->current_allocs[ptr] = n * size; return ptr; } /* * Allocation Function for Bzip */ void bzip_free(void* info_ptr, void* ptr) { Bzip_Alloc_Info* info = static_cast(info_ptr); std::map::const_iterator i = info->current_allocs.find(ptr); if(i == info->current_allocs.end()) throw Invalid_Argument("bzip_free: Got pointer not allocated by us"); info->alloc->deallocate(ptr, i->second); } } /** * Wrapper Type for Bzip2 Stream */ class Bzip_Stream { public: /** * Underlying stream */ bz_stream stream; /** * Constructor */ Bzip_Stream() { std::memset(&stream, 0, sizeof(bz_stream)); stream.bzalloc = bzip_malloc; stream.bzfree = bzip_free; stream.opaque = new Bzip_Alloc_Info; } /** * Destructor */ ~Bzip_Stream() { Bzip_Alloc_Info* info = static_cast(stream.opaque); delete info; std::memset(&stream, 0, sizeof(bz_stream)); } }; /* * Bzip_Compression Constructor */ Bzip_Compression::Bzip_Compression(size_t l) : level((l >= 9) ? 9 : l), buffer(DEFAULT_BUFFERSIZE) { bz = 0; } /* * Start Compressing with Bzip */ void Bzip_Compression::start_msg() { clear(); bz = new Bzip_Stream; if(BZ2_bzCompressInit(&(bz->stream), level, 0, 0) != BZ_OK) throw Memory_Exhaustion(); } /* * Compress Input with Bzip */ void Bzip_Compression::write(const byte input[], size_t length) { bz->stream.next_in = reinterpret_cast(const_cast(input)); bz->stream.avail_in = length; while(bz->stream.avail_in != 0) { bz->stream.next_out = reinterpret_cast(buffer.begin()); bz->stream.avail_out = buffer.size(); BZ2_bzCompress(&(bz->stream), BZ_RUN); send(buffer, buffer.size() - bz->stream.avail_out); } } /* * Finish Compressing with Bzip */ void Bzip_Compression::end_msg() { bz->stream.next_in = 0; bz->stream.avail_in = 0; int rc = BZ_OK; while(rc != BZ_STREAM_END) { bz->stream.next_out = reinterpret_cast(buffer.begin()); bz->stream.avail_out = buffer.size(); rc = BZ2_bzCompress(&(bz->stream), BZ_FINISH); send(buffer, buffer.size() - bz->stream.avail_out); } clear(); } /* * Flush the Bzip Compressor */ void Bzip_Compression::flush() { bz->stream.next_in = 0; bz->stream.avail_in = 0; int rc = BZ_OK; while(rc != BZ_RUN_OK) { bz->stream.next_out = reinterpret_cast(buffer.begin()); bz->stream.avail_out = buffer.size(); rc = BZ2_bzCompress(&(bz->stream), BZ_FLUSH); send(buffer, buffer.size() - bz->stream.avail_out); } } /* * Clean up Compression Context */ void Bzip_Compression::clear() { zeroise(buffer); if(bz) { BZ2_bzCompressEnd(&(bz->stream)); delete bz; bz = 0; } } /* * Bzip_Decompression Constructor */ Bzip_Decompression::Bzip_Decompression(bool s) : small_mem(s), buffer(DEFAULT_BUFFERSIZE) { no_writes = true; bz = 0; } /* * Decompress Input with Bzip */ void Bzip_Decompression::write(const byte input_arr[], size_t length) { if(length) no_writes = false; char* input = reinterpret_cast(const_cast(input_arr)); bz->stream.next_in = input; bz->stream.avail_in = length; while(bz->stream.avail_in != 0) { bz->stream.next_out = reinterpret_cast(buffer.begin()); bz->stream.avail_out = buffer.size(); int rc = BZ2_bzDecompress(&(bz->stream)); if(rc != BZ_OK && rc != BZ_STREAM_END) { clear(); if(rc == BZ_DATA_ERROR) throw Decoding_Error("Bzip_Decompression: Data integrity error"); else if(rc == BZ_DATA_ERROR_MAGIC) throw Decoding_Error("Bzip_Decompression: Invalid input"); else if(rc == BZ_MEM_ERROR) throw Memory_Exhaustion(); else throw std::runtime_error("Bzip2 decompression: Unknown error"); } send(buffer, buffer.size() - bz->stream.avail_out); if(rc == BZ_STREAM_END) { size_t read_from_block = length - bz->stream.avail_in; start_msg(); bz->stream.next_in = input + read_from_block; bz->stream.avail_in = length - read_from_block; input += read_from_block; length -= read_from_block; } } } /* * Start Decompressing with Bzip */ void Bzip_Decompression::start_msg() { clear(); bz = new Bzip_Stream; if(BZ2_bzDecompressInit(&(bz->stream), 0, small_mem) != BZ_OK) throw Memory_Exhaustion(); no_writes = true; } /* * Finish Decompressing with Bzip */ void Bzip_Decompression::end_msg() { if(no_writes) return; bz->stream.next_in = 0; bz->stream.avail_in = 0; int rc = BZ_OK; while(rc != BZ_STREAM_END) { bz->stream.next_out = reinterpret_cast(buffer.begin()); bz->stream.avail_out = buffer.size(); rc = BZ2_bzDecompress(&(bz->stream)); if(rc != BZ_OK && rc != BZ_STREAM_END) { clear(); throw Decoding_Error("Bzip_Decompression: Error finalizing"); } send(buffer, buffer.size() - bz->stream.avail_out); } clear(); } /* * Clean up Decompression Context */ void Bzip_Decompression::clear() { zeroise(buffer); if(bz) { BZ2_bzDecompressEnd(&(bz->stream)); delete bz; bz = 0; } } } Botan-1.10.12/src/filters/bzip2/bzip2.h0000664000175000017500000000230412654331322017247 0ustar jackjack00000000000000/* * Bzip Compressor * (C) 2001 Peter J Jones * 2001-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BZIP2_H__ #define BOTAN_BZIP2_H__ #include namespace Botan { /** * Bzip Compression Filter */ class BOTAN_DLL Bzip_Compression : public Filter { public: std::string name() const { return "Bzip_Compression"; } void write(const byte input[], size_t length); void start_msg(); void end_msg(); void flush(); Bzip_Compression(size_t = 9); ~Bzip_Compression() { clear(); } private: void clear(); const size_t level; SecureVector buffer; class Bzip_Stream* bz; }; /** * Bzip Decompression Filter */ class BOTAN_DLL Bzip_Decompression : public Filter { public: std::string name() const { return "Bzip_Decompression"; } void write(const byte input[], size_t length); void start_msg(); void end_msg(); Bzip_Decompression(bool = false); ~Bzip_Decompression() { clear(); } private: void clear(); const bool small_mem; SecureVector buffer; class Bzip_Stream* bz; bool no_writes; }; } #endif Botan-1.10.12/src/filters/bzip2/info.txt0000664000175000017500000000014412654331322017544 0ustar jackjack00000000000000define COMPRESSOR_BZIP2 load_on request all -> bz2 filters Botan-1.10.12/src/filters/codec_filt/b64_filt.cpp0000664000175000017500000001010612654331322021231 0ustar jackjack00000000000000/* * Base64 Encoder/Decoder * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * Base64_Encoder Constructor */ Base64_Encoder::Base64_Encoder(bool breaks, size_t length, bool t_n) : line_length(breaks ? length : 0), trailing_newline(t_n && breaks), in(48), out(64), position(0), out_position(0) { } /* * Encode and send a block */ void Base64_Encoder::encode_and_send(const byte input[], size_t length, bool final_inputs) { while(length) { const size_t proc = std::min(length, in.size()); size_t consumed = 0; size_t produced = base64_encode(reinterpret_cast(&out[0]), input, proc, consumed, final_inputs); do_output(&out[0], produced); // FIXME: s/proc/consumed/? input += proc; length -= proc; } } /* * Handle the output */ void Base64_Encoder::do_output(const byte input[], size_t length) { if(line_length == 0) send(input, length); else { size_t remaining = length, offset = 0; while(remaining) { size_t sent = std::min(line_length - out_position, remaining); send(input + offset, sent); out_position += sent; remaining -= sent; offset += sent; if(out_position == line_length) { send('\n'); out_position = 0; } } } } /* * Convert some data into Base64 */ void Base64_Encoder::write(const byte input[], size_t length) { in.copy(position, input, length); if(position + length >= in.size()) { encode_and_send(&in[0], in.size()); input += (in.size() - position); length -= (in.size() - position); while(length >= in.size()) { encode_and_send(input, in.size()); input += in.size(); length -= in.size(); } in.copy(input, length); position = 0; } position += length; } /* * Flush buffers */ void Base64_Encoder::end_msg() { encode_and_send(&in[0], position, true); if(trailing_newline || (out_position && line_length)) send('\n'); out_position = position = 0; } /* * Base64_Decoder Constructor */ Base64_Decoder::Base64_Decoder(Decoder_Checking c) : checking(c), in(64), out(48), position(0) { } /* * Convert some data from Base64 */ void Base64_Decoder::write(const byte input[], size_t length) { while(length) { size_t to_copy = std::min(length, in.size() - position); if(to_copy == 0) { in.resize(in.size()*2); out.resize(out.size()*2); } copy_mem(&in[position], input, to_copy); position += to_copy; size_t consumed = 0; size_t written = base64_decode(&out[0], reinterpret_cast(&in[0]), position, consumed, false, checking != FULL_CHECK); send(out, written); if(consumed != position) { copy_mem(&in[0], &in[consumed], position - consumed); position = position - consumed; } else position = 0; length -= to_copy; input += to_copy; } } /* * Flush buffers */ void Base64_Decoder::end_msg() { size_t consumed = 0; size_t written = base64_decode(&out[0], reinterpret_cast(&in[0]), position, consumed, true, checking != FULL_CHECK); send(out, written); const bool not_full_bytes = consumed != position; position = 0; if(not_full_bytes) throw std::invalid_argument("Base64_Decoder: Input not full bytes"); } } Botan-1.10.12/src/filters/codec_filt/b64_filt.h0000664000175000017500000000426112654331322020703 0ustar jackjack00000000000000/* * Base64 Encoder/Decoder * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BASE64_FILTER_H__ #define BOTAN_BASE64_FILTER_H__ #include namespace Botan { /** * This class represents a Base64 encoder. */ class BOTAN_DLL Base64_Encoder : public Filter { public: std::string name() const { return "Base64_Encoder"; } /** * Input a part of a message to the encoder. * @param input the message to input as a byte array * @param length the length of the byte array input */ void write(const byte input[], size_t length); /** * Inform the Encoder that the current message shall be closed. */ void end_msg(); /** * Create a base64 encoder. * @param breaks whether to use line breaks in the output * @param length the length of the lines of the output * @param t_n whether to use a trailing newline */ Base64_Encoder(bool breaks = false, size_t length = 72, bool t_n = false); private: void encode_and_send(const byte input[], size_t length, bool final_inputs = false); void do_output(const byte output[], size_t length); const size_t line_length; const bool trailing_newline; MemoryVector in, out; size_t position, out_position; }; /** * This object represents a Base64 decoder. */ class BOTAN_DLL Base64_Decoder : public Filter { public: std::string name() const { return "Base64_Decoder"; } /** * Input a part of a message to the decoder. * @param input the message to input as a byte array * @param length the length of the byte array input */ void write(const byte input[], size_t length); /** * Finish up the current message */ void end_msg(); /** * Create a base64 decoder. * @param checking the type of checking that shall be performed by * the decoder */ Base64_Decoder(Decoder_Checking checking = NONE); private: const Decoder_Checking checking; MemoryVector in, out; size_t position; }; } #endif Botan-1.10.12/src/filters/codec_filt/hex_filt.cpp0000664000175000017500000000733612654331322021435 0ustar jackjack00000000000000/* * Hex Encoder/Decoder * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { /** * Size used for internal buffer in hex encoder/decoder */ const size_t HEX_CODEC_BUFFER_SIZE = 256; /* * Hex_Encoder Constructor */ Hex_Encoder::Hex_Encoder(bool breaks, size_t length, Case c) : casing(c), line_length(breaks ? length : 0) { in.resize(HEX_CODEC_BUFFER_SIZE); out.resize(2*in.size()); counter = position = 0; } /* * Hex_Encoder Constructor */ Hex_Encoder::Hex_Encoder(Case c) : casing(c), line_length(0) { in.resize(HEX_CODEC_BUFFER_SIZE); out.resize(2*in.size()); counter = position = 0; } /* * Encode and send a block */ void Hex_Encoder::encode_and_send(const byte block[], size_t length) { hex_encode(reinterpret_cast(&out[0]), block, length, casing == Uppercase); if(line_length == 0) send(out, 2*length); else { size_t remaining = 2*length, offset = 0; while(remaining) { size_t sent = std::min(line_length - counter, remaining); send(&out[offset], sent); counter += sent; remaining -= sent; offset += sent; if(counter == line_length) { send('\n'); counter = 0; } } } } /* * Convert some data into hex format */ void Hex_Encoder::write(const byte input[], size_t length) { in.copy(position, input, length); if(position + length >= in.size()) { encode_and_send(&in[0], in.size()); input += (in.size() - position); length -= (in.size() - position); while(length >= in.size()) { encode_and_send(input, in.size()); input += in.size(); length -= in.size(); } in.copy(input, length); position = 0; } position += length; } /* * Flush buffers */ void Hex_Encoder::end_msg() { encode_and_send(&in[0], position); if(counter && line_length) send('\n'); counter = position = 0; } /* * Hex_Decoder Constructor */ Hex_Decoder::Hex_Decoder(Decoder_Checking c) : checking(c) { in.resize(HEX_CODEC_BUFFER_SIZE); out.resize(in.size() / 2); position = 0; } /* * Convert some data from hex format */ void Hex_Decoder::write(const byte input[], size_t length) { while(length) { size_t to_copy = std::min(length, in.size() - position); copy_mem(&in[position], input, to_copy); position += to_copy; size_t consumed = 0; size_t written = hex_decode(&out[0], reinterpret_cast(&in[0]), position, consumed, checking != FULL_CHECK); send(out, written); if(consumed != position) { copy_mem(&in[0], &in[consumed], position - consumed); position = position - consumed; } else position = 0; length -= to_copy; input += to_copy; } } /* * Flush buffers */ void Hex_Decoder::end_msg() { size_t consumed = 0; size_t written = hex_decode(&out[0], reinterpret_cast(&in[0]), position, consumed, checking != FULL_CHECK); send(out, written); const bool not_full_bytes = consumed != position; position = 0; if(not_full_bytes) throw std::invalid_argument("Hex_Decoder: Input not full bytes"); } } Botan-1.10.12/src/filters/codec_filt/hex_filt.h0000664000175000017500000000354612654331322021101 0ustar jackjack00000000000000/* * Hex Encoder/Decoder * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_HEX_FILTER_H__ #define BOTAN_HEX_FILTER_H__ #include namespace Botan { /** * Converts arbitrary binary data to hex strings, optionally with * newlines inserted */ class BOTAN_DLL Hex_Encoder : public Filter { public: /** * Whether to use uppercase or lowercase letters for the encoded string. */ enum Case { Uppercase, Lowercase }; std::string name() const { return "Hex_Encoder"; } void write(const byte in[], size_t length); void end_msg(); /** * Create a hex encoder. * @param the_case the case to use in the encoded strings. */ Hex_Encoder(Case the_case); /** * Create a hex encoder. * @param newlines should newlines be used * @param line_length if newlines are used, how long are lines * @param the_case the case to use in the encoded strings */ Hex_Encoder(bool newlines = false, size_t line_length = 72, Case the_case = Uppercase); private: void encode_and_send(const byte[], size_t); const Case casing; const size_t line_length; MemoryVector in, out; size_t position, counter; }; /** * Converts hex strings to bytes */ class BOTAN_DLL Hex_Decoder : public Filter { public: std::string name() const { return "Hex_Decoder"; } void write(const byte[], size_t); void end_msg(); /** * Construct a Hex Decoder using the specified * character checking. * @param checking the checking to use during decoding. */ Hex_Decoder(Decoder_Checking checking = NONE); private: const Decoder_Checking checking; MemoryVector in, out; size_t position; }; } #endif Botan-1.10.12/src/filters/codec_filt/info.txt0000664000175000017500000000006512654331322020613 0ustar jackjack00000000000000define CODEC_FILTERS filters Botan-1.10.12/src/filters/data_snk.cpp0000664000175000017500000000235112654331322017314 0ustar jackjack00000000000000/* * DataSink * (C) 1999-2007 Jack Lloyd * 2005 Matthew Gregan * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Write to a stream */ void DataSink_Stream::write(const byte out[], size_t length) { sink.write(reinterpret_cast(out), length); if(!sink.good()) throw Stream_IO_Error("DataSink_Stream: Failure writing to " + identifier); } /* * DataSink_Stream Constructor */ DataSink_Stream::DataSink_Stream(std::ostream& out, const std::string& name) : identifier(name), sink_p(0), sink(out) { } /* * DataSink_Stream Constructor */ DataSink_Stream::DataSink_Stream(const std::string& path, bool use_binary) : identifier(path), sink_p(new std::ofstream( path.c_str(), use_binary ? std::ios::binary : std::ios::out)), sink(*sink_p) { if(!sink.good()) { delete sink_p; throw Stream_IO_Error("DataSink_Stream: Failure opening " + path); } } /* * DataSink_Stream Destructor */ DataSink_Stream::~DataSink_Stream() { delete sink_p; } } Botan-1.10.12/src/filters/data_snk.h0000664000175000017500000000275412654331322016770 0ustar jackjack00000000000000/* * DataSink * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DATA_SINK_H__ #define BOTAN_DATA_SINK_H__ #include #include namespace Botan { /** * This class represents abstract data sink objects. */ class BOTAN_DLL DataSink : public Filter { public: bool attachable() { return false; } DataSink() {} virtual ~DataSink() {} private: DataSink& operator=(const DataSink&) { return (*this); } DataSink(const DataSink&); }; /** * This class represents a data sink which writes its output to a stream. */ class BOTAN_DLL DataSink_Stream : public DataSink { public: std::string name() const { return identifier; } void write(const byte[], size_t); /** * Construct a DataSink_Stream from a stream. * @param stream the stream to write to * @param name identifier */ DataSink_Stream(std::ostream& stream, const std::string& name = ""); /** * Construct a DataSink_Stream from a stream. * @param pathname the name of the file to open a stream to * @param use_binary indicates whether to treat the file * as a binary file or not */ DataSink_Stream(const std::string& pathname, bool use_binary = false); ~DataSink_Stream(); private: const std::string identifier; std::ostream* sink_p; std::ostream& sink; }; } #endif Botan-1.10.12/src/filters/data_src.cpp0000664000175000017500000001072212654331322017311 0ustar jackjack00000000000000/* * DataSource * (C) 1999-2007 Jack Lloyd * 2005 Matthew Gregan * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Read a single byte from the DataSource */ size_t DataSource::read_byte(byte& out) { return read(&out, 1); } /* * Peek a single byte from the DataSource */ size_t DataSource::peek_byte(byte& out) const { return peek(&out, 1, 0); } /* * Discard the next N bytes of the data */ size_t DataSource::discard_next(size_t n) { size_t discarded = 0; byte dummy; for(size_t j = 0; j != n; ++j) discarded += read_byte(dummy); return discarded; } /* * Read from a memory buffer */ size_t DataSource_Memory::read(byte out[], size_t length) { size_t got = std::min(source.size() - offset, length); copy_mem(out, &source[offset], got); offset += got; return got; } /* * Peek into a memory buffer */ size_t DataSource_Memory::peek(byte out[], size_t length, size_t peek_offset) const { const size_t bytes_left = source.size() - offset; if(peek_offset >= bytes_left) return 0; size_t got = std::min(bytes_left - peek_offset, length); copy_mem(out, &source[offset + peek_offset], got); return got; } /* * Check if the memory buffer is empty */ bool DataSource_Memory::end_of_data() const { return (offset == source.size()); } /* * DataSource_Memory Constructor */ DataSource_Memory::DataSource_Memory(const byte in[], size_t length) : source(in, length) { offset = 0; } /* * DataSource_Memory Constructor */ DataSource_Memory::DataSource_Memory(const MemoryRegion& in) : source(in) { offset = 0; } /* * DataSource_Memory Constructor */ DataSource_Memory::DataSource_Memory(const std::string& in) : source(reinterpret_cast(in.data()), in.length()) { offset = 0; } bool DataSource_Memory::check_available(size_t n) { return (n <= (source.size() - offset)); } /* * Read from a stream */ size_t DataSource_Stream::read(byte out[], size_t length) { source.read(reinterpret_cast(out), length); if(source.bad()) throw Stream_IO_Error("DataSource_Stream::read: Source failure"); size_t got = source.gcount(); total_read += got; return got; } bool DataSource_Stream::check_available(size_t n) { const std::streampos orig_pos = source.tellg(); source.seekg(0, std::ios::end); const size_t avail = source.tellg() - orig_pos; source.seekg(orig_pos); return (avail >= n); } /* * Peek into a stream */ size_t DataSource_Stream::peek(byte out[], size_t length, size_t offset) const { if(end_of_data()) throw Invalid_State("DataSource_Stream: Cannot peek when out of data"); size_t got = 0; if(offset) { SecureVector buf(offset); source.read(reinterpret_cast(&buf[0]), buf.size()); if(source.bad()) throw Stream_IO_Error("DataSource_Stream::peek: Source failure"); got = source.gcount(); } if(got == offset) { source.read(reinterpret_cast(out), length); if(source.bad()) throw Stream_IO_Error("DataSource_Stream::peek: Source failure"); got = source.gcount(); } if(source.eof()) source.clear(); source.seekg(total_read, std::ios::beg); return got; } /* * Check if the stream is empty or in error */ bool DataSource_Stream::end_of_data() const { return (!source.good()); } /* * Return a human-readable ID for this stream */ std::string DataSource_Stream::id() const { return identifier; } /* * DataSource_Stream Constructor */ DataSource_Stream::DataSource_Stream(const std::string& path, bool use_binary) : identifier(path), source_p(new std::ifstream( path.c_str(), use_binary ? std::ios::binary : std::ios::in)), source(*source_p), total_read(0) { if(!source.good()) { delete source_p; throw Stream_IO_Error("DataSource: Failure opening file " + path); } } /* * DataSource_Stream Constructor */ DataSource_Stream::DataSource_Stream(std::istream& in, const std::string& name) : identifier(name), source_p(0), source(in), total_read(0) { } /* * DataSource_Stream Destructor */ DataSource_Stream::~DataSource_Stream() { delete source_p; } } Botan-1.10.12/src/filters/data_src.h0000664000175000017500000001035712654331322016762 0ustar jackjack00000000000000/* * DataSource * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DATA_SRC_H__ #define BOTAN_DATA_SRC_H__ #include #include #include namespace Botan { /** * This class represents an abstract data source object. */ class BOTAN_DLL DataSource { public: /** * Read from the source. Moves the internal offset so that every * call to read will return a new portion of the source. * * @param out the byte array to write the result to * @param length the length of the byte array out * @return length in bytes that was actually read and put * into out */ virtual size_t read(byte out[], size_t length) = 0; /** * Read from the source but do not modify the internal * offset. Consecutive calls to peek() will return portions of * the source starting at the same position. * * @param out the byte array to write the output to * @param length the length of the byte array out * @param peek_offset the offset into the stream to read at * @return length in bytes that was actually read and put * into out */ virtual size_t peek(byte out[], size_t length, size_t peek_offset) const = 0; /** * Test whether the source still has data that can be read. * @return true if there is still data to read, false otherwise */ virtual bool end_of_data() const = 0; /** * return the id of this data source * @return std::string representing the id of this data source */ virtual std::string id() const { return ""; } virtual bool check_available(size_t n) = 0; /** * Read one byte. * @param out the byte to read to * @return length in bytes that was actually read and put * into out */ size_t read_byte(byte& out); /** * Peek at one byte. * @param out an output byte * @return length in bytes that was actually read and put * into out */ size_t peek_byte(byte& out) const; /** * Discard the next N bytes of the data * @param N the number of bytes to discard * @return number of bytes actually discarded */ size_t discard_next(size_t N); DataSource() {} virtual ~DataSource() {} private: DataSource& operator=(const DataSource&) { return (*this); } DataSource(const DataSource&); }; /** * This class represents a Memory-Based DataSource */ class BOTAN_DLL DataSource_Memory : public DataSource { public: size_t read(byte[], size_t); size_t peek(byte[], size_t, size_t) const; bool check_available(size_t n); bool end_of_data() const; /** * Construct a memory source that reads from a string * @param in the string to read from */ DataSource_Memory(const std::string& in); /** * Construct a memory source that reads from a byte array * @param in the byte array to read from * @param length the length of the byte array */ DataSource_Memory(const byte in[], size_t length); /** * Construct a memory source that reads from a MemoryRegion * @param in the MemoryRegion to read from */ DataSource_Memory(const MemoryRegion& in); private: SecureVector source; size_t offset; }; /** * This class represents a Stream-Based DataSource. */ class BOTAN_DLL DataSource_Stream : public DataSource { public: size_t read(byte[], size_t); size_t peek(byte[], size_t, size_t) const; bool check_available(size_t n); bool end_of_data() const; std::string id() const; DataSource_Stream(std::istream&, const std::string& id = ""); /** * Construct a Stream-Based DataSource from file * @param file the name of the file * @param use_binary whether to treat the file as binary or not */ DataSource_Stream(const std::string& file, bool use_binary = false); ~DataSource_Stream(); private: const std::string identifier; std::istream* source_p; std::istream& source; size_t total_read; }; } #endif Botan-1.10.12/src/filters/fd_unix/fd_unix.cpp0000664000175000017500000000215012654331322020615 0ustar jackjack00000000000000/* * Pipe I/O for Unix * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Write data from a pipe into a Unix fd */ int operator<<(int fd, Pipe& pipe) { SecureVector buffer(DEFAULT_BUFFERSIZE); while(pipe.remaining()) { size_t got = pipe.read(&buffer[0], buffer.size()); size_t position = 0; while(got) { ssize_t ret = write(fd, &buffer[position], got); if(ret == -1) throw Stream_IO_Error("Pipe output operator (unixfd) has failed"); position += ret; got -= ret; } } return fd; } /* * Read data from a Unix fd into a pipe */ int operator>>(int fd, Pipe& pipe) { SecureVector buffer(DEFAULT_BUFFERSIZE); while(true) { ssize_t ret = read(fd, &buffer[0], buffer.size()); if(ret == 0) break; if(ret == -1) throw Stream_IO_Error("Pipe input operator (unixfd) has failed"); pipe.write(&buffer[0], ret); } return fd; } } Botan-1.10.12/src/filters/fd_unix/fd_unix.h0000664000175000017500000000126012654331322020263 0ustar jackjack00000000000000/* * Pipe I/O for Unix * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PIPE_UNIXFD_H__ #define BOTAN_PIPE_UNIXFD_H__ #include namespace Botan { /** * Stream output operator; dumps the results from pipe's default * message to the output stream. * @param out file descriptor for an open output stream * @param pipe the pipe */ int BOTAN_DLL operator<<(int out, Pipe& pipe); /** * File descriptor input operator; dumps the remaining bytes of input * to the (assumed open) pipe message. * @param in file descriptor for an open input stream * @param pipe the pipe */ int BOTAN_DLL operator>>(int in, Pipe& pipe); } #endif Botan-1.10.12/src/filters/fd_unix/info.txt0000664000175000017500000000021312654331322020147 0ustar jackjack00000000000000define PIPE_UNIXFD_IO load_on auto aix cygwin darwin dragonfly freebsd haiku hpux irix linux netbsd openbsd qnx solaris tru64 Botan-1.10.12/src/filters/filter.cpp0000664000175000017500000000425112654331322017016 0ustar jackjack00000000000000/* * Filter * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Filter Constructor */ Filter::Filter() { next.resize(1); port_num = 0; filter_owns = 0; owned = false; } /* * Send data to all ports */ void Filter::send(const byte input[], size_t length) { bool nothing_attached = true; for(size_t j = 0; j != total_ports(); ++j) if(next[j]) { if(write_queue.size()) next[j]->write(&write_queue[0], write_queue.size()); next[j]->write(input, length); nothing_attached = false; } if(nothing_attached) write_queue += std::make_pair(input, length); else write_queue.clear(); } /* * Start a new message */ void Filter::new_msg() { start_msg(); for(size_t j = 0; j != total_ports(); ++j) if(next[j]) next[j]->new_msg(); } /* * End the current message */ void Filter::finish_msg() { end_msg(); for(size_t j = 0; j != total_ports(); ++j) if(next[j]) next[j]->finish_msg(); } /* * Attach a filter to the current port */ void Filter::attach(Filter* new_filter) { if(new_filter) { Filter* last = this; while(last->get_next()) last = last->get_next(); last->next[last->current_port()] = new_filter; } } /* * Set the active port on a filter */ void Filter::set_port(size_t new_port) { if(new_port >= total_ports()) throw Invalid_Argument("Filter: Invalid port number"); port_num = new_port; } /* * Return the next Filter in the logical chain */ Filter* Filter::get_next() const { if(port_num < next.size()) return next[port_num]; return 0; } /* * Set the next Filters */ void Filter::set_next(Filter* filters[], size_t size) { next.clear(); port_num = 0; filter_owns = 0; while(size && filters && filters[size-1] == 0) --size; if(filters && size) next.assign(filters, filters + size); } /* * Return the total number of ports */ size_t Filter::total_ports() const { return next.size(); } } Botan-1.10.12/src/filters/filter.h0000664000175000017500000000746712654331322016477 0ustar jackjack00000000000000/* * Filter * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_FILTER_H__ #define BOTAN_FILTER_H__ #include #include namespace Botan { /** * This class represents general abstract filter objects. */ class BOTAN_DLL Filter { public: /** * @return descriptive name for this filter */ virtual std::string name() const = 0; /** * Write a portion of a message to this filter. * @param input the input as a byte array * @param length the length of the byte array input */ virtual void write(const byte input[], size_t length) = 0; /** * Start a new message. Must be closed by end_msg() before another * message can be started. */ virtual void start_msg() {} /** * Notify that the current message is finished; flush buffers and * do end-of-message processing (if any). */ virtual void end_msg() {} /** * Check whether this filter is an attachable filter. * @return true if this filter is attachable, false otherwise */ virtual bool attachable() { return true; } virtual ~Filter() {} protected: /** * @param in some input for the filter * @param length the length of in */ void send(const byte in[], size_t length); /** * @param in some input for the filter */ void send(byte in) { send(&in, 1); } /** * @param in some input for the filter */ void send(const MemoryRegion& in) { send(&in[0], in.size()); } /** * @param in some input for the filter * @param length the number of bytes of in to send */ void send(const MemoryRegion& in, size_t length) { send(&in[0], length); } Filter(); private: Filter(const Filter&) {} Filter& operator=(const Filter&) { return (*this); } /** * Start a new message in *this and all following filters. Only for * internal use, not intended for use in client applications. */ void new_msg(); /** * End a new message in *this and all following filters. Only for * internal use, not intended for use in client applications. */ void finish_msg(); friend class Pipe; friend class Fanout_Filter; size_t total_ports() const; size_t current_port() const { return port_num; } /** * Set the active port * @param new_port the new value */ void set_port(size_t new_port); size_t owns() const { return filter_owns; } /** * Attach another filter to this one * @param f filter to attach */ void attach(Filter* f); /** * @param filters the filters to set * @param count number of items in filters */ void set_next(Filter* filters[], size_t count); Filter* get_next() const; SecureVector write_queue; std::vector next; size_t port_num, filter_owns; // true if filter belongs to a pipe --> prohibit filter sharing! bool owned; }; /** * This is the abstract Fanout_Filter base class. **/ class BOTAN_DLL Fanout_Filter : public Filter { protected: /** * Increment the number of filters past us that we own */ void incr_owns() { ++filter_owns; } void set_port(size_t n) { Filter::set_port(n); } void set_next(Filter* f[], size_t n) { Filter::set_next(f, n); } void attach(Filter* f) { Filter::attach(f); } }; /** * The type of checking to be performed by decoders: * NONE - no checks, IGNORE_WS - perform checks, but ignore * whitespaces, FULL_CHECK - perform checks, also complain * about white spaces. */ enum Decoder_Checking { NONE, IGNORE_WS, FULL_CHECK }; } #endif Botan-1.10.12/src/filters/filters.h0000664000175000017500000001510512654331322016646 0ustar jackjack00000000000000/* * Filters * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_FILTERS_H__ #define BOTAN_FILTERS_H__ #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_CODEC_FILTERS) #include #include #endif namespace Botan { /** * Stream Cipher Filter. */ class BOTAN_DLL StreamCipher_Filter : public Keyed_Filter { public: std::string name() const { return cipher->name(); } /** * Write input data * @param input data * @param input_len length of input in bytes */ void write(const byte input[], size_t input_len); bool valid_iv_length(size_t iv_len) const { return cipher->valid_iv_length(iv_len); } /** * Set the initialization vector for this filter. * @param iv the initialization vector to set */ void set_iv(const InitializationVector& iv); /** * Set the key of this filter. * @param key the key to set */ void set_key(const SymmetricKey& key) { cipher->set_key(key); } /** * Check whether a key length is valid for this filter. * @param length the key length to be checked for validity * @return true if the key length is valid, false otherwise */ bool valid_keylength(size_t length) const { return cipher->valid_keylength(length); } /** * Construct a stream cipher filter. * @param cipher_obj a cipher object to use */ StreamCipher_Filter(StreamCipher* cipher_obj); /** * Construct a stream cipher filter. * @param cipher_obj a cipher object to use * @param key the key to use inside this filter */ StreamCipher_Filter(StreamCipher* cipher_obj, const SymmetricKey& key); /** * Construct a stream cipher filter. * @param cipher the name of the desired cipher */ StreamCipher_Filter(const std::string& cipher); /** * Construct a stream cipher filter. * @param cipher the name of the desired cipher * @param key the key to use inside this filter */ StreamCipher_Filter(const std::string& cipher, const SymmetricKey& key); ~StreamCipher_Filter() { delete cipher; } private: SecureVector buffer; StreamCipher* cipher; }; /** * Hash Filter. */ class BOTAN_DLL Hash_Filter : public Filter { public: void write(const byte input[], size_t len) { hash->update(input, len); } void end_msg(); std::string name() const { return hash->name(); } /** * Construct a hash filter. * @param hash_fun the hash function to use * @param len the output length of this filter. Leave the default * value 0 if you want to use the full output of the hashfunction * hash. Otherwise, specify a smaller value here so that the * output of the hash algorithm will be cut off. */ Hash_Filter(HashFunction* hash_fun, size_t len = 0) : OUTPUT_LENGTH(len), hash(hash_fun) {} /** * Construct a hash filter. * @param request the name of the hash algorithm to use * @param len the output length of this filter. Leave the default * value 0 if you want to use the full output of the hashfunction * hash. Otherwise, specify a smaller value here so that the * output of the hash algorithm will be cut off. */ Hash_Filter(const std::string& request, size_t len = 0); ~Hash_Filter() { delete hash; } private: const size_t OUTPUT_LENGTH; HashFunction* hash; }; /** * MessageAuthenticationCode Filter. */ class BOTAN_DLL MAC_Filter : public Keyed_Filter { public: void write(const byte input[], size_t len) { mac->update(input, len); } void end_msg(); std::string name() const { return mac->name(); } /** * Set the key of this filter. * @param key the key to set */ void set_key(const SymmetricKey& key) { mac->set_key(key); } /** * Check whether a key length is valid for this filter. * @param length the key length to be checked for validity * @return true if the key length is valid, false otherwise */ bool valid_keylength(size_t length) const { return mac->valid_keylength(length); } /** * Construct a MAC filter. The MAC key will be left empty. * @param mac_obj the MAC to use * @param out_len the output length of this filter. Leave the default * value 0 if you want to use the full output of the * MAC. Otherwise, specify a smaller value here so that the * output of the MAC will be cut off. */ MAC_Filter(MessageAuthenticationCode* mac_obj, size_t out_len = 0) : OUTPUT_LENGTH(out_len) { mac = mac_obj; } /** * Construct a MAC filter. * @param mac_obj the MAC to use * @param key the MAC key to use * @param out_len the output length of this filter. Leave the default * value 0 if you want to use the full output of the * MAC. Otherwise, specify a smaller value here so that the * output of the MAC will be cut off. */ MAC_Filter(MessageAuthenticationCode* mac_obj, const SymmetricKey& key, size_t out_len = 0) : OUTPUT_LENGTH(out_len) { mac = mac_obj; mac->set_key(key); } /** * Construct a MAC filter. The MAC key will be left empty. * @param mac the name of the MAC to use * @param len the output length of this filter. Leave the default * value 0 if you want to use the full output of the * MAC. Otherwise, specify a smaller value here so that the * output of the MAC will be cut off. */ MAC_Filter(const std::string& mac, size_t len = 0); /** * Construct a MAC filter. * @param mac the name of the MAC to use * @param key the MAC key to use * @param len the output length of this filter. Leave the default * value 0 if you want to use the full output of the * MAC. Otherwise, specify a smaller value here so that the * output of the MAC will be cut off. */ MAC_Filter(const std::string& mac, const SymmetricKey& key, size_t len = 0); ~MAC_Filter() { delete mac; } private: const size_t OUTPUT_LENGTH; MessageAuthenticationCode* mac; }; } #endif Botan-1.10.12/src/filters/info.txt0000664000175000017500000000065012654331322016520 0ustar jackjack00000000000000define FILTERS algo_filt.cpp basefilt.cpp buf_filt.cpp data_snk.cpp data_src.cpp filter.cpp out_buf.cpp pipe.cpp pipe_io.cpp pipe_rw.cpp secqueue.cpp basefilt.h buf_filt.h data_snk.h data_src.h filter.h filters.h key_filt.h pipe.h secqueue.h out_buf.h alloc asn1 block hash libstate mac rng stream algo_base Botan-1.10.12/src/filters/key_filt.h0000664000175000017500000000257412654331322017012 0ustar jackjack00000000000000/* * Keyed_Filter * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_KEYED_FILTER_H__ #define BOTAN_KEYED_FILTER_H__ #include #include namespace Botan { /** * This class represents keyed filters, i.e. filters that have to be * fed with a key in order to function. */ class BOTAN_DLL Keyed_Filter : public Filter { public: /** * Set the key of this filter * @param key the key to use */ virtual void set_key(const SymmetricKey& key) = 0; /** * Set the initialization vector of this filter. Note: you should * call set_iv() only after you have called set_key() * @param iv the initialization vector to use */ virtual void set_iv(const InitializationVector& iv); /** * Check whether a key length is valid for this filter * @param length the key length to be checked for validity * @return true if the key length is valid, false otherwise */ virtual bool valid_keylength(size_t length) const = 0; /** * Check whether an IV length is valid for this filter * @param length the IV length to be checked for validity * @return true if the IV length is valid, false otherwise */ virtual bool valid_iv_length(size_t length) const { return (length == 0); } }; } #endif Botan-1.10.12/src/filters/modes/cbc/cbc.cpp0000664000175000017500000001326312654331322020121 0ustar jackjack00000000000000/* * CBC Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * CBC Encryption Constructor */ CBC_Encryption::CBC_Encryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad) : Buffered_Filter(ciph->block_size(), 0), cipher(ciph), padder(pad) { if(!padder->valid_blocksize(cipher->block_size())) throw Invalid_Block_Size(name(), padder->name()); state.resize(cipher->block_size()); } /* * CBC Encryption Constructor */ CBC_Encryption::CBC_Encryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad, const SymmetricKey& key, const InitializationVector& iv) : Buffered_Filter(ciph->block_size(), 0), cipher(ciph), padder(pad) { if(!padder->valid_blocksize(cipher->block_size())) throw Invalid_Block_Size(name(), padder->name()); state.resize(cipher->block_size()); set_key(key); set_iv(iv); } /* * Set the IV */ void CBC_Encryption::set_iv(const InitializationVector& iv) { if(!valid_iv_length(iv.length())) throw Invalid_IV_Length(name(), iv.length()); state = iv.bits_of(); buffer_reset(); } /* * Encrypt in CBC mode */ void CBC_Encryption::buffered_block(const byte input[], size_t length) { size_t blocks = length / state.size(); for(size_t i = 0; i != blocks; ++i) { xor_buf(state, input + i * cipher->block_size(), state.size()); cipher->encrypt(state); send(state, state.size()); } } /* * Finish encrypting in CBC mode */ void CBC_Encryption::buffered_final(const byte input[], size_t length) { if(length % cipher->block_size() == 0) buffered_block(input, length); else if(length != 0) throw Encoding_Error(name() + ": Did not pad to full blocksize"); } void CBC_Encryption::write(const byte input[], size_t input_length) { Buffered_Filter::write(input, input_length); } void CBC_Encryption::end_msg() { size_t last_block = current_position() % cipher->block_size(); SecureVector padding(cipher->block_size()); padder->pad(padding, padding.size(), last_block); size_t pad_bytes = padder->pad_bytes(cipher->block_size(), last_block); if(pad_bytes) Buffered_Filter::write(padding, pad_bytes); Buffered_Filter::end_msg(); } /* * Return a CBC mode name */ std::string CBC_Encryption::name() const { return (cipher->name() + "/CBC/" + padder->name()); } /* * CBC Decryption Constructor */ CBC_Decryption::CBC_Decryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad) : Buffered_Filter(ciph->parallel_bytes(), ciph->block_size()), cipher(ciph), padder(pad) { if(!padder->valid_blocksize(cipher->block_size())) throw Invalid_Block_Size(name(), padder->name()); state.resize(cipher->block_size()); temp.resize(buffered_block_size()); } /* * CBC Decryption Constructor */ CBC_Decryption::CBC_Decryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad, const SymmetricKey& key, const InitializationVector& iv) : Buffered_Filter(ciph->parallel_bytes(), ciph->block_size()), cipher(ciph), padder(pad) { if(!padder->valid_blocksize(cipher->block_size())) throw Invalid_Block_Size(name(), padder->name()); state.resize(cipher->block_size()); temp.resize(buffered_block_size()); set_key(key); set_iv(iv); } /* * Set the IV */ void CBC_Decryption::set_iv(const InitializationVector& iv) { if(!valid_iv_length(iv.length())) throw Invalid_IV_Length(name(), iv.length()); state = iv.bits_of(); buffer_reset(); } /* * Decrypt in CBC mode */ void CBC_Decryption::buffered_block(const byte input[], size_t length) { const size_t blocks_in_temp = temp.size() / cipher->block_size(); size_t blocks = length / cipher->block_size(); while(blocks) { size_t to_proc = std::min(blocks, blocks_in_temp); cipher->decrypt_n(input, &temp[0], to_proc); xor_buf(temp, state, cipher->block_size()); for(size_t i = 1; i < to_proc; ++i) xor_buf(&temp[i * cipher->block_size()], input + (i-1) * cipher->block_size(), cipher->block_size()); copy_mem(&state[0], input + (to_proc - 1) * cipher->block_size(), cipher->block_size()); send(temp, to_proc * cipher->block_size()); input += to_proc * cipher->block_size(); blocks -= to_proc; } } /* * Finish encrypting in CBC mode */ void CBC_Decryption::buffered_final(const byte input[], size_t length) { if(length == 0 || length % cipher->block_size() != 0) throw Decoding_Error(name() + ": Ciphertext not multiple of block size"); size_t extra_blocks = (length - 1) / cipher->block_size(); buffered_block(input, extra_blocks * cipher->block_size()); input += extra_blocks * cipher->block_size(); cipher->decrypt(input, temp); xor_buf(temp, state, cipher->block_size()); send(temp, padder->unpad(temp, cipher->block_size())); copy_mem(&state[0], input, state.size()); // save for IV chaining } /* * Decrypt in CBC mode */ void CBC_Decryption::write(const byte input[], size_t length) { Buffered_Filter::write(input, length); } /* * Finish decrypting in CBC mode */ void CBC_Decryption::end_msg() { Buffered_Filter::end_msg(); } /* * Return a CBC mode name */ std::string CBC_Decryption::name() const { return (cipher->name() + "/CBC/" + padder->name()); } } Botan-1.10.12/src/filters/modes/cbc/cbc.h0000664000175000017500000000525012654331322017563 0ustar jackjack00000000000000/* * CBC Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CBC_H__ #define BOTAN_CBC_H__ #include #include #include #include namespace Botan { /** * CBC Encryption */ class BOTAN_DLL CBC_Encryption : public Keyed_Filter, private Buffered_Filter { public: std::string name() const; void set_iv(const InitializationVector& iv); void set_key(const SymmetricKey& key) { cipher->set_key(key); } bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } CBC_Encryption(BlockCipher* cipher, BlockCipherModePaddingMethod* padding); CBC_Encryption(BlockCipher* cipher, BlockCipherModePaddingMethod* padding, const SymmetricKey& key, const InitializationVector& iv); ~CBC_Encryption() { delete cipher; delete padder; } private: void buffered_block(const byte input[], size_t input_length); void buffered_final(const byte input[], size_t input_length); void write(const byte input[], size_t input_length); void end_msg(); BlockCipher* cipher; const BlockCipherModePaddingMethod* padder; SecureVector state; }; /** * CBC Decryption */ class BOTAN_DLL CBC_Decryption : public Keyed_Filter, private Buffered_Filter { public: std::string name() const; void set_iv(const InitializationVector& iv); void set_key(const SymmetricKey& key) { cipher->set_key(key); } bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } CBC_Decryption(BlockCipher* cipher, BlockCipherModePaddingMethod* padding); CBC_Decryption(BlockCipher* cipher, BlockCipherModePaddingMethod* padding, const SymmetricKey& key, const InitializationVector& iv); ~CBC_Decryption() { delete cipher; delete padder; } private: void buffered_block(const byte input[], size_t input_length); void buffered_final(const byte input[], size_t input_length); void write(const byte[], size_t); void end_msg(); BlockCipher* cipher; const BlockCipherModePaddingMethod* padder; SecureVector state, temp; }; } #endif Botan-1.10.12/src/filters/modes/cbc/info.txt0000664000175000017500000000006212654331322020353 0ustar jackjack00000000000000define CBC block mode_pad Botan-1.10.12/src/filters/modes/cfb/cfb.cpp0000664000175000017500000001056712654331322020133 0ustar jackjack00000000000000/* * CFB Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * CFB Encryption Constructor */ CFB_Encryption::CFB_Encryption(BlockCipher* ciph, size_t fback_bits) { cipher = ciph; feedback = fback_bits ? fback_bits / 8: cipher->block_size(); buffer.resize(cipher->block_size()); state.resize(cipher->block_size()); position = 0; if(feedback == 0 || fback_bits % 8 != 0 || feedback > cipher->block_size()) throw Invalid_Argument("CFB_Encryption: Invalid feedback size " + to_string(fback_bits)); } /* * CFB Encryption Constructor */ CFB_Encryption::CFB_Encryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv, size_t fback_bits) { cipher = ciph; feedback = fback_bits ? fback_bits / 8: cipher->block_size(); buffer.resize(cipher->block_size()); state.resize(cipher->block_size()); position = 0; if(feedback == 0 || fback_bits % 8 != 0 || feedback > cipher->block_size()) throw Invalid_Argument("CFB_Encryption: Invalid feedback size " + to_string(fback_bits)); set_key(key); set_iv(iv); } void CFB_Encryption::set_iv(const InitializationVector& iv) { if(!valid_iv_length(iv.length())) throw Invalid_IV_Length(name(), iv.length()); state = iv.bits_of(); zeroise(buffer); position = 0; cipher->encrypt(state, buffer); } /* * Encrypt data in CFB mode */ void CFB_Encryption::write(const byte input[], size_t length) { while(length) { size_t xored = std::min(feedback - position, length); xor_buf(&buffer[position], input, xored); send(&buffer[position], xored); input += xored; length -= xored; position += xored; if(position == feedback) { for(size_t j = 0; j != cipher->block_size() - feedback; ++j) state[j] = state[j + feedback]; state.copy(cipher->block_size() - feedback, buffer, feedback); cipher->encrypt(state, buffer); position = 0; } } } /* * CFB Decryption Constructor */ CFB_Decryption::CFB_Decryption(BlockCipher* ciph, size_t fback_bits) { cipher = ciph; feedback = fback_bits ? fback_bits / 8: cipher->block_size(); buffer.resize(cipher->block_size()); state.resize(cipher->block_size()); position = 0; if(feedback == 0 || fback_bits % 8 != 0 || feedback > cipher->block_size()) throw Invalid_Argument("CFB_Decryption: Invalid feedback size " + to_string(fback_bits)); } /* * CFB Decryption Constructor */ CFB_Decryption::CFB_Decryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv, size_t fback_bits) { cipher = ciph; feedback = fback_bits ? fback_bits / 8: cipher->block_size(); buffer.resize(cipher->block_size()); state.resize(cipher->block_size()); position = 0; if(feedback == 0 || fback_bits % 8 != 0 || feedback > cipher->block_size()) throw Invalid_Argument("CFB_Decryption: Invalid feedback size " + to_string(fback_bits)); set_key(key); set_iv(iv); } void CFB_Decryption::set_iv(const InitializationVector& iv) { if(!valid_iv_length(iv.length())) throw Invalid_IV_Length(name(), iv.length()); state = iv.bits_of(); zeroise(buffer); position = 0; cipher->encrypt(state, buffer); } /* * Decrypt data in CFB mode */ void CFB_Decryption::write(const byte input[], size_t length) { while(length) { size_t xored = std::min(feedback - position, length); xor_buf(&buffer[position], input, xored); send(&buffer[position], xored); buffer.copy(position, input, xored); input += xored; length -= xored; position += xored; if(position == feedback) { for(size_t j = 0; j != cipher->block_size() - feedback; ++j) state[j] = state[j + feedback]; state.copy(cipher->block_size() - feedback, buffer, feedback); cipher->encrypt(state, buffer); position = 0; } } } } Botan-1.10.12/src/filters/modes/cfb/cfb.h0000664000175000017500000000410312654331322017565 0ustar jackjack00000000000000/* * CFB Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CFB_H__ #define BOTAN_CFB_H__ #include #include namespace Botan { /** * CFB Encryption */ class BOTAN_DLL CFB_Encryption : public Keyed_Filter { public: std::string name() const { return cipher->name() + "/CFB"; } void set_iv(const InitializationVector&); void set_key(const SymmetricKey& key) { cipher->set_key(key); } bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } CFB_Encryption(BlockCipher* cipher, size_t feedback = 0); CFB_Encryption(BlockCipher* cipher, const SymmetricKey& key, const InitializationVector& iv, size_t feedback = 0); ~CFB_Encryption() { delete cipher; } private: void write(const byte[], size_t); BlockCipher* cipher; SecureVector buffer, state; size_t position, feedback; }; /** * CFB Decryption */ class BOTAN_DLL CFB_Decryption : public Keyed_Filter { public: std::string name() const { return cipher->name() + "/CFB"; } void set_iv(const InitializationVector&); void set_key(const SymmetricKey& key) { cipher->set_key(key); } bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } CFB_Decryption(BlockCipher* cipher, size_t feedback = 0); CFB_Decryption(BlockCipher* cipher, const SymmetricKey& key, const InitializationVector& iv, size_t feedback = 0); ~CFB_Decryption() { delete cipher; } private: void write(const byte[], size_t); BlockCipher* cipher; SecureVector buffer, state; size_t position, feedback; }; } #endif Botan-1.10.12/src/filters/modes/cfb/info.txt0000664000175000017500000000005112654331322020354 0ustar jackjack00000000000000define CFB block Botan-1.10.12/src/filters/modes/cts/cts.cpp0000664000175000017500000001162612654331322020226 0ustar jackjack00000000000000/* * CTS Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * CTS Encryption Constructor */ CTS_Encryption::CTS_Encryption(BlockCipher* ciph) : cipher(ciph) { buffer.resize(2 * cipher->block_size()); state.resize(cipher->block_size()); position = 0; } /* * CTS Encryption Constructor */ CTS_Encryption::CTS_Encryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv) : cipher(ciph) { buffer.resize(2 * cipher->block_size()); state.resize(cipher->block_size()); position = 0; set_key(key); set_iv(iv); } /* * Set the IV */ void CTS_Encryption::set_iv(const InitializationVector& iv) { if(!valid_iv_length(iv.length())) throw Invalid_IV_Length(name(), iv.length()); state = iv.bits_of(); zeroise(buffer); position = 0; } /* * Encrypt a block */ void CTS_Encryption::encrypt(const byte block[]) { xor_buf(state, block, cipher->block_size()); cipher->encrypt(state); send(state, cipher->block_size()); } /* * Encrypt in CTS mode */ void CTS_Encryption::write(const byte input[], size_t length) { size_t copied = std::min(buffer.size() - position, length); buffer.copy(position, input, copied); length -= copied; input += copied; position += copied; if(length == 0) return; encrypt(&buffer[0]); if(length > cipher->block_size()) { encrypt(&buffer[cipher->block_size()]); while(length > 2*cipher->block_size()) { encrypt(input); length -= cipher->block_size(); input += cipher->block_size(); } position = 0; } else { copy_mem(&buffer[0], &buffer[cipher->block_size()], cipher->block_size()); position = cipher->block_size(); } buffer.copy(position, input, length); position += length; } /* * Finish encrypting in CTS mode */ void CTS_Encryption::end_msg() { if(position < cipher->block_size() + 1) throw Encoding_Error(name() + ": insufficient data to encrypt"); xor_buf(state, buffer, cipher->block_size()); cipher->encrypt(state); SecureVector cn = state; clear_mem(&buffer[position], buffer.size() - position); encrypt(&buffer[cipher->block_size()]); send(cn, position - cipher->block_size()); } /* * CTS Decryption Constructor */ CTS_Decryption::CTS_Decryption(BlockCipher* ciph) : cipher(ciph) { buffer.resize(2 * cipher->block_size()); state.resize(cipher->block_size()); temp.resize(cipher->block_size()); position = 0; } /* * CTS Decryption Constructor */ CTS_Decryption::CTS_Decryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv) : cipher(ciph) { buffer.resize(2 * cipher->block_size()); state.resize(cipher->block_size()); temp.resize(cipher->block_size()); position = 0; set_key(key); set_iv(iv); } /* * Set the IV */ void CTS_Decryption::set_iv(const InitializationVector& iv) { if(!valid_iv_length(iv.length())) throw Invalid_IV_Length(name(), iv.length()); state = iv.bits_of(); zeroise(buffer); position = 0; } /* * Decrypt a block */ void CTS_Decryption::decrypt(const byte block[]) { cipher->decrypt(block, &temp[0]); xor_buf(temp, state, cipher->block_size()); send(temp, cipher->block_size()); state.copy(block, cipher->block_size()); } /* * Decrypt in CTS mode */ void CTS_Decryption::write(const byte input[], size_t length) { size_t copied = std::min(buffer.size() - position, length); buffer.copy(position, input, copied); length -= copied; input += copied; position += copied; if(length == 0) return; decrypt(buffer); if(length > cipher->block_size()) { decrypt(&buffer[cipher->block_size()]); while(length > 2*cipher->block_size()) { decrypt(input); length -= cipher->block_size(); input += cipher->block_size(); } position = 0; } else { copy_mem(&buffer[0], &buffer[cipher->block_size()], cipher->block_size()); position = cipher->block_size(); } buffer.copy(position, input, length); position += length; } /* * Finish decrypting in CTS mode */ void CTS_Decryption::end_msg() { cipher->decrypt(buffer, temp); xor_buf(temp, &buffer[cipher->block_size()], position - cipher->block_size()); SecureVector xn = temp; copy_mem(&buffer[position], &xn[position - cipher->block_size()], buffer.size() - position); cipher->decrypt(&buffer[cipher->block_size()], temp); xor_buf(temp, state, cipher->block_size()); send(temp, cipher->block_size()); send(xn, position - cipher->block_size()); } } Botan-1.10.12/src/filters/modes/cts/cts.h0000664000175000017500000000413112654331322017664 0ustar jackjack00000000000000/* * CTS Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CTS_H__ #define BOTAN_CTS_H__ #include #include namespace Botan { /** * CBC encryption with ciphertext stealing */ class BOTAN_DLL CTS_Encryption : public Keyed_Filter { public: std::string name() const { return cipher->name() + "/CTS"; } void set_iv(const InitializationVector&); void set_key(const SymmetricKey& key) { cipher->set_key(key); } bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } CTS_Encryption(BlockCipher* cipher); CTS_Encryption(BlockCipher* cipher, const SymmetricKey& key, const InitializationVector& iv); ~CTS_Encryption() { delete cipher; } private: void write(const byte[], size_t); void end_msg(); void encrypt(const byte[]); BlockCipher* cipher; SecureVector buffer, state; size_t position; }; /** * CBC decryption with ciphertext stealing */ class BOTAN_DLL CTS_Decryption : public Keyed_Filter { public: std::string name() const { return cipher->name() + "/CTS"; } void set_iv(const InitializationVector&); void set_key(const SymmetricKey& key) { cipher->set_key(key); } bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } CTS_Decryption(BlockCipher* cipher); CTS_Decryption(BlockCipher* cipher, const SymmetricKey& key, const InitializationVector& iv); ~CTS_Decryption() { delete cipher; } private: void write(const byte[], size_t); void end_msg(); void decrypt(const byte[]); BlockCipher* cipher; SecureVector buffer, state, temp; size_t position; }; } #endif Botan-1.10.12/src/filters/modes/cts/info.txt0000664000175000017500000000005112654331322020413 0ustar jackjack00000000000000define CTS block Botan-1.10.12/src/filters/modes/eax/eax.cpp0000664000175000017500000000555712654331322020204 0ustar jackjack00000000000000/* * EAX Mode Encryption * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { namespace { /* * EAX MAC-based PRF */ SecureVector eax_prf(byte tag, size_t BLOCK_SIZE, MessageAuthenticationCode* mac, const byte in[], size_t length) { for(size_t i = 0; i != BLOCK_SIZE - 1; ++i) mac->update(0); mac->update(tag); mac->update(in, length); return mac->final(); } } /* * EAX_Base Constructor */ EAX_Base::EAX_Base(BlockCipher* cipher, size_t tag_size) : BLOCK_SIZE(cipher->block_size()), TAG_SIZE(tag_size ? tag_size / 8 : BLOCK_SIZE), cipher_name(cipher->name()), ctr_buf(DEFAULT_BUFFERSIZE) { cmac = new CMAC(cipher->clone()); ctr = new CTR_BE(cipher); // takes ownership if(tag_size % 8 != 0 || TAG_SIZE == 0 || TAG_SIZE > cmac->output_length()) throw Invalid_Argument(name() + ": Bad tag size " + to_string(tag_size)); } /* * Check if a keylength is valid for EAX */ bool EAX_Base::valid_keylength(size_t n) const { if(!ctr->valid_keylength(n)) return false; return true; } /* * Set the EAX key */ void EAX_Base::set_key(const SymmetricKey& key) { /* * These could share the key schedule, which is one nice part of EAX, * but it's much easier to ignore that here... */ ctr->set_key(key); cmac->set_key(key); header_mac = eax_prf(1, BLOCK_SIZE, cmac, 0, 0); } /* * Do setup at the start of each message */ void EAX_Base::start_msg() { for(size_t i = 0; i != BLOCK_SIZE - 1; ++i) cmac->update(0); cmac->update(2); } /* * Set the EAX nonce */ void EAX_Base::set_iv(const InitializationVector& iv) { nonce_mac = eax_prf(0, BLOCK_SIZE, cmac, iv.begin(), iv.length()); ctr->set_iv(&nonce_mac[0], nonce_mac.size()); } /* * Set the EAX header */ void EAX_Base::set_header(const byte header[], size_t length) { header_mac = eax_prf(1, BLOCK_SIZE, cmac, header, length); } /* * Return the name of this cipher mode */ std::string EAX_Base::name() const { return (cipher_name + "/EAX"); } /* * Encrypt in EAX mode */ void EAX_Encryption::write(const byte input[], size_t length) { while(length) { size_t copied = std::min(length, ctr_buf.size()); ctr->cipher(input, &ctr_buf[0], copied); cmac->update(&ctr_buf[0], copied); send(ctr_buf, copied); input += copied; length -= copied; } } /* * Finish encrypting in EAX mode */ void EAX_Encryption::end_msg() { SecureVector data_mac = cmac->final(); xor_buf(data_mac, nonce_mac, data_mac.size()); xor_buf(data_mac, header_mac, data_mac.size()); send(data_mac, TAG_SIZE); } } Botan-1.10.12/src/filters/modes/eax/eax.h0000664000175000017500000000701512654331322017640 0ustar jackjack00000000000000/* * EAX Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EAX_H__ #define BOTAN_EAX_H__ #include #include #include #include namespace Botan { /** * EAX Base Class */ class BOTAN_DLL EAX_Base : public Keyed_Filter { public: void set_key(const SymmetricKey& key); void set_iv(const InitializationVector& iv); /** * Set some additional data that is not included in the * ciphertext but that will be authenticated. * @param header the header contents * @param header_len length of header in bytes */ void set_header(const byte header[], size_t header_len); /** * @return name of this mode */ std::string name() const; bool valid_keylength(size_t key_len) const; /** * EAX supports arbitrary IV lengths */ bool valid_iv_length(size_t) const { return true; } ~EAX_Base() { delete ctr; delete cmac; } protected: /** * @param cipher the cipher to use * @param tag_size is how big the auth tag will be */ EAX_Base(BlockCipher* cipher, size_t tag_size); void start_msg(); /** * The block size of the underlying cipher */ const size_t BLOCK_SIZE; /** * The requested tag name */ const size_t TAG_SIZE; /** * The name of the cipher */ std::string cipher_name; /** * The stream cipher (CTR mode) */ StreamCipher* ctr; /** * The MAC (CMAC) */ MessageAuthenticationCode* cmac; /** * The MAC of the nonce */ SecureVector nonce_mac; /** * The MAC of the header */ SecureVector header_mac; /** * A buffer for CTR mode encryption */ SecureVector ctr_buf; }; /** * EAX Encryption */ class BOTAN_DLL EAX_Encryption : public EAX_Base { public: /** * @param ciph the cipher to use * @param tag_size is how big the auth tag will be */ EAX_Encryption(BlockCipher* ciph, size_t tag_size = 0) : EAX_Base(ciph, tag_size) {} /** * @param ciph the cipher to use * @param key the key to use * @param iv the initially set IV * @param tag_size is how big the auth tag will be */ EAX_Encryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv, size_t tag_size) : EAX_Base(ciph, tag_size) { set_key(key); set_iv(iv); } private: void write(const byte[], size_t); void end_msg(); }; /** * EAX Decryption */ class BOTAN_DLL EAX_Decryption : public EAX_Base { public: /** * @param ciph the cipher to use * @param tag_size is how big the auth tag will be */ EAX_Decryption(BlockCipher* ciph, size_t tag_size = 0); /** * @param ciph the cipher to use * @param key the key to use * @param iv the initially set IV * @param tag_size is how big the auth tag will be */ EAX_Decryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv, size_t tag_size = 0); private: void write(const byte[], size_t); void do_write(const byte[], size_t); void end_msg(); SecureVector queue; size_t queue_start, queue_end; }; } #endif Botan-1.10.12/src/filters/modes/eax/eax_dec.cpp0000664000175000017500000000541212654331322021005 0ustar jackjack00000000000000/* * EAX Mode Encryption * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * EAX_Decryption Constructor */ EAX_Decryption::EAX_Decryption(BlockCipher* ciph, size_t tag_size) : EAX_Base(ciph, tag_size) { queue.resize(2*TAG_SIZE + DEFAULT_BUFFERSIZE); queue_start = queue_end = 0; } /* * EAX_Decryption Constructor */ EAX_Decryption::EAX_Decryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv, size_t tag_size) : EAX_Base(ciph, tag_size) { set_key(key); set_iv(iv); queue.resize(2*TAG_SIZE + DEFAULT_BUFFERSIZE); queue_start = queue_end = 0; } /* * Decrypt in EAX mode */ void EAX_Decryption::write(const byte input[], size_t length) { while(length) { const size_t copied = std::min(length, queue.size() - queue_end); queue.copy(queue_end, input, copied); input += copied; length -= copied; queue_end += copied; while((queue_end - queue_start) > TAG_SIZE) { size_t removed = (queue_end - queue_start) - TAG_SIZE; do_write(&queue[queue_start], removed); queue_start += removed; } if(queue_start + TAG_SIZE == queue_end && queue_start >= queue.size() / 2) { SecureVector queue_data(TAG_SIZE); queue_data.copy(&queue[queue_start], TAG_SIZE); queue.copy(&queue_data[0], TAG_SIZE); queue_start = 0; queue_end = TAG_SIZE; } } } /* * Decrypt in EAX mode */ void EAX_Decryption::do_write(const byte input[], size_t length) { while(length) { size_t copied = std::min(length, ctr_buf.size()); /* Process same block with cmac and ctr at the same time to help cache locality. */ cmac->update(input, copied); ctr->cipher(input, &ctr_buf[0], copied); send(ctr_buf, copied); input += copied; length -= copied; } } /* * Finish decrypting in EAX mode */ void EAX_Decryption::end_msg() { if((queue_end - queue_start) != TAG_SIZE) throw Decoding_Error(name() + ": Message authentication failure"); const byte* included_mac = &queue[queue_start]; SecureVector computed_mac = cmac->final(); xor_buf(&computed_mac[0], &nonce_mac[0], TAG_SIZE); xor_buf(&computed_mac[0], &header_mac[0], TAG_SIZE); if(!same_mem(included_mac, &computed_mac[0], TAG_SIZE)) throw Decoding_Error(name() + ": Message authentication failure"); queue_start = queue_end = 0; } } Botan-1.10.12/src/filters/modes/eax/info.txt0000664000175000017500000000006212654331322020401 0ustar jackjack00000000000000define EAX block cmac ctr Botan-1.10.12/src/filters/modes/ecb/ecb.cpp0000664000175000017500000001072312654331322020123 0ustar jackjack00000000000000/* * ECB Mode * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * ECB_Encryption Constructor */ ECB_Encryption::ECB_Encryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad) : Buffered_Filter(ciph->parallel_bytes(), 0) { cipher = ciph; padder = pad; temp.resize(buffered_block_size()); } /* * ECB_Encryption Constructor */ ECB_Encryption::ECB_Encryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad, const SymmetricKey& key) : Buffered_Filter(ciph->parallel_bytes(), 0) { cipher = ciph; padder = pad; temp.resize(buffered_block_size()); cipher->set_key(key); } /* * ECB_Encryption Destructor */ ECB_Encryption::~ECB_Encryption() { delete cipher; delete padder; } /* * Return an ECB mode name */ std::string ECB_Encryption::name() const { return (cipher->name() + "/ECB/" + padder->name()); } /* * Encrypt in ECB mode */ void ECB_Encryption::write(const byte input[], size_t length) { Buffered_Filter::write(input, length); } /* * Finish encrypting in ECB mode */ void ECB_Encryption::end_msg() { size_t last_block = current_position() % cipher->block_size(); SecureVector padding(cipher->block_size()); padder->pad(padding, padding.size(), last_block); size_t pad_bytes = padder->pad_bytes(cipher->block_size(), last_block); if(pad_bytes) Buffered_Filter::write(padding, pad_bytes); Buffered_Filter::end_msg(); } void ECB_Encryption::buffered_block(const byte input[], size_t input_length) { const size_t blocks_in_temp = temp.size() / cipher->block_size(); size_t blocks = input_length / cipher->block_size(); while(blocks) { size_t to_proc = std::min(blocks, blocks_in_temp); cipher->encrypt_n(input, &temp[0], to_proc); send(temp, to_proc * cipher->block_size()); input += to_proc * cipher->block_size(); blocks -= to_proc; } } void ECB_Encryption::buffered_final(const byte input[], size_t input_length) { if(input_length % cipher->block_size() == 0) buffered_block(input, input_length); else if(input_length != 0) throw Encoding_Error(name() + ": Did not pad to full blocksize"); } /* * ECB_Decryption Constructor */ ECB_Decryption::ECB_Decryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad) : Buffered_Filter(ciph->parallel_bytes(), 1) { cipher = ciph; padder = pad; temp.resize(buffered_block_size()); } /* * ECB_Decryption Constructor */ ECB_Decryption::ECB_Decryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad, const SymmetricKey& key) : Buffered_Filter(ciph->parallel_bytes(), 1) { cipher = ciph; padder = pad; temp.resize(buffered_block_size()); cipher->set_key(key); } /* * ECB_Decryption Destructor */ ECB_Decryption::~ECB_Decryption() { delete cipher; delete padder; } /* * Return an ECB mode name */ std::string ECB_Decryption::name() const { return (cipher->name() + "/ECB/" + padder->name()); } /* * Decrypt in ECB mode */ void ECB_Decryption::write(const byte input[], size_t length) { Buffered_Filter::write(input, length); } /* * Finish decrypting in ECB mode */ void ECB_Decryption::end_msg() { Buffered_Filter::end_msg(); } /* * Decrypt in ECB mode */ void ECB_Decryption::buffered_block(const byte input[], size_t length) { const size_t blocks_in_temp = temp.size() / cipher->block_size(); size_t blocks = length / cipher->block_size(); while(blocks) { size_t to_proc = std::min(blocks, blocks_in_temp); cipher->decrypt_n(input, &temp[0], to_proc); send(temp, to_proc * cipher->block_size()); input += to_proc * cipher->block_size(); blocks -= to_proc; } } /* * Finish encrypting in ECB mode */ void ECB_Decryption::buffered_final(const byte input[], size_t length) { if(length == 0 || length % cipher->block_size() != 0) throw Decoding_Error(name() + ": Ciphertext not multiple of block size"); size_t extra_blocks = (length - 1) / cipher->block_size(); buffered_block(input, extra_blocks * cipher->block_size()); input += extra_blocks * cipher->block_size(); cipher->decrypt(input, temp); send(temp, padder->unpad(temp, cipher->block_size())); } } Botan-1.10.12/src/filters/modes/ecb/ecb.h0000664000175000017500000000425412654331322017572 0ustar jackjack00000000000000/* * ECB Mode * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ECB_H__ #define BOTAN_ECB_H__ #include #include #include #include namespace Botan { /** * ECB Encryption */ class BOTAN_DLL ECB_Encryption : public Keyed_Filter, private Buffered_Filter { public: std::string name() const; void set_key(const SymmetricKey& key) { cipher->set_key(key); } bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } ECB_Encryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad); ECB_Encryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad, const SymmetricKey& key); ~ECB_Encryption(); private: void buffered_block(const byte input[], size_t input_length); void buffered_final(const byte input[], size_t input_length); void write(const byte input[], size_t input_length); void end_msg(); BlockCipher* cipher; BlockCipherModePaddingMethod* padder; SecureVector temp; }; /** * ECB Decryption */ class BOTAN_DLL ECB_Decryption : public Keyed_Filter, public Buffered_Filter { public: std::string name() const; void set_key(const SymmetricKey& key) { cipher->set_key(key); } bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } ECB_Decryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad); ECB_Decryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad, const SymmetricKey& key); ~ECB_Decryption(); private: void buffered_block(const byte input[], size_t input_length); void buffered_final(const byte input[], size_t input_length); void write(const byte input[], size_t input_length); void end_msg(); BlockCipher* cipher; BlockCipherModePaddingMethod* padder; SecureVector temp; }; } #endif Botan-1.10.12/src/filters/modes/ecb/info.txt0000664000175000017500000000006212654331322020355 0ustar jackjack00000000000000define ECB block mode_pad Botan-1.10.12/src/filters/modes/mode_pad/info.txt0000664000175000017500000000003312654331322021372 0ustar jackjack00000000000000define CIPHER_MODE_PADDING Botan-1.10.12/src/filters/modes/mode_pad/mode_pad.cpp0000664000175000017500000000540312654331322022160 0ustar jackjack00000000000000/* * CBC Padding Methods * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Default amount of padding */ size_t BlockCipherModePaddingMethod::pad_bytes(size_t bs, size_t pos) const { return (bs - pos); } /* * Pad with PKCS #7 Method */ void PKCS7_Padding::pad(byte block[], size_t size, size_t position) const { const size_t bytes_remaining = size - position; const byte pad_value = static_cast(bytes_remaining); BOTAN_ASSERT_EQUAL(pad_value, bytes_remaining, "Overflow in PKCS7_Padding"); for(size_t j = 0; j != size; ++j) block[j] = pad_value; } /* * Unpad with PKCS #7 Method */ size_t PKCS7_Padding::unpad(const byte block[], size_t size) const { size_t position = block[size-1]; if(position > size) throw Decoding_Error(name()); for(size_t j = size-position; j != size-1; ++j) if(block[j] != position) throw Decoding_Error(name()); return (size-position); } /* * Query if the size is valid for this method */ bool PKCS7_Padding::valid_blocksize(size_t size) const { if(size > 0 && size < 256) return true; else return false; } /* * Pad with ANSI X9.23 Method */ void ANSI_X923_Padding::pad(byte block[], size_t size, size_t position) const { for(size_t j = 0; j != size-position; ++j) block[j] = 0; block[size-position-1] = static_cast(size-position); } /* * Unpad with ANSI X9.23 Method */ size_t ANSI_X923_Padding::unpad(const byte block[], size_t size) const { size_t position = block[size-1]; if(position > size) throw Decoding_Error(name()); for(size_t j = size-position; j != size-1; ++j) if(block[j] != 0) throw Decoding_Error(name()); return (size-position); } /* * Query if the size is valid for this method */ bool ANSI_X923_Padding::valid_blocksize(size_t size) const { if(size > 0 && size < 256) return true; else return false; } /* * Pad with One and Zeros Method */ void OneAndZeros_Padding::pad(byte block[], size_t size, size_t) const { block[0] = 0x80; for(size_t j = 1; j != size; ++j) block[j] = 0x00; } /* * Unpad with One and Zeros Method */ size_t OneAndZeros_Padding::unpad(const byte block[], size_t size) const { while(size) { if(block[size-1] == 0x80) break; if(block[size-1] != 0x00) throw Decoding_Error(name()); size--; } if(!size) throw Decoding_Error(name()); return (size-1); } /* * Query if the size is valid for this method */ bool OneAndZeros_Padding::valid_blocksize(size_t size) const { return (size > 0); } } Botan-1.10.12/src/filters/modes/mode_pad/mode_pad.h0000664000175000017500000000611312654331322021624 0ustar jackjack00000000000000/* * CBC Padding Methods * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CBC_PADDING_H__ #define BOTAN_CBC_PADDING_H__ #include #include namespace Botan { /** * Block Cipher Mode Padding Method * This class is pretty limited, it cannot deal well with * randomized padding methods, or any padding method that * wants to add more than one block. For instance, it should * be possible to define cipher text stealing mode as simply * a padding mode for CBC, which happens to consume the last * two block (and requires use of the block cipher). */ class BOTAN_DLL BlockCipherModePaddingMethod { public: /** * @param block output buffer * @param size of the block * @param current_position in the last block */ virtual void pad(byte block[], size_t size, size_t current_position) const = 0; /** * @param block the last block * @param size the of the block */ virtual size_t unpad(const byte block[], size_t size) const = 0; /** * @param block_size of the cipher * @param position in the current block * @return number of padding bytes that will be appended */ virtual size_t pad_bytes(size_t block_size, size_t position) const; /** * @param block_size of the cipher * @return valid block size for this padding mode */ virtual bool valid_blocksize(size_t block_size) const = 0; /** * @return name of the mode */ virtual std::string name() const = 0; /** * virtual destructor */ virtual ~BlockCipherModePaddingMethod() {} }; /** * PKCS#7 Padding */ class BOTAN_DLL PKCS7_Padding : public BlockCipherModePaddingMethod { public: void pad(byte[], size_t, size_t) const; size_t unpad(const byte[], size_t) const; bool valid_blocksize(size_t) const; std::string name() const { return "PKCS7"; } }; /** * ANSI X9.23 Padding */ class BOTAN_DLL ANSI_X923_Padding : public BlockCipherModePaddingMethod { public: void pad(byte[], size_t, size_t) const; size_t unpad(const byte[], size_t) const; bool valid_blocksize(size_t) const; std::string name() const { return "X9.23"; } }; /** * One And Zeros Padding */ class BOTAN_DLL OneAndZeros_Padding : public BlockCipherModePaddingMethod { public: void pad(byte[], size_t, size_t) const; size_t unpad(const byte[], size_t) const; bool valid_blocksize(size_t) const; std::string name() const { return "OneAndZeros"; } }; /** * Null Padding */ class BOTAN_DLL Null_Padding : public BlockCipherModePaddingMethod { public: void pad(byte[], size_t, size_t) const { return; } size_t unpad(const byte[], size_t size) const { return size; } size_t pad_bytes(size_t, size_t) const { return 0; } bool valid_blocksize(size_t) const { return true; } std::string name() const { return "NoPadding"; } }; } #endif Botan-1.10.12/src/filters/modes/xts/info.txt0000664000175000017500000000005112654331322020440 0ustar jackjack00000000000000define XTS block Botan-1.10.12/src/filters/modes/xts/xts.cpp0000664000175000017500000002304412654331322020275 0ustar jackjack00000000000000/* * XTS Mode * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { void poly_double(byte tweak[], size_t size) { const byte polynomial = (size == 16) ? 0x87 : 0x1B; byte carry = 0; for(size_t i = 0; i != size; ++i) { byte carry2 = (tweak[i] >> 7); tweak[i] = (tweak[i] << 1) | carry; carry = carry2; } if(carry) tweak[0] ^= polynomial; } /* XTS needs to process at least 2 blocks in parallel because block_size+1 bytes are needed at the end */ size_t xts_parallelism(BlockCipher* cipher) { return std::max(cipher->parallel_bytes(), 2 * cipher->block_size()); } } /* * XTS_Encryption constructor */ XTS_Encryption::XTS_Encryption(BlockCipher* ciph) : Buffered_Filter(xts_parallelism(ciph), ciph->block_size() + 1), cipher(ciph) { if(cipher->block_size() != 8 && cipher->block_size() != 16) throw std::invalid_argument("Bad cipher for XTS: " + cipher->name()); cipher2 = cipher->clone(); tweak.resize(buffered_block_size()); } /* * XTS_Encryption constructor */ XTS_Encryption::XTS_Encryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv) : Buffered_Filter(xts_parallelism(ciph), ciph->block_size() + 1), cipher(ciph) { if(cipher->block_size() != 8 && cipher->block_size() != 16) throw std::invalid_argument("Bad cipher for XTS: " + cipher->name()); cipher2 = cipher->clone(); tweak.resize(buffered_block_size()); set_key(key); set_iv(iv); } /* * Return the name */ std::string XTS_Encryption::name() const { return (cipher->name() + "/XTS"); } /* * Set new tweak */ void XTS_Encryption::set_iv(const InitializationVector& iv) { if(!valid_iv_length(iv.length())) throw Invalid_IV_Length(name(), iv.length()); const size_t blocks_in_tweak = tweak.size() / cipher->block_size(); tweak.copy(iv.begin(), iv.length()); cipher2->encrypt(tweak); for(size_t i = 1; i < blocks_in_tweak; ++i) { tweak.copy(i*cipher->block_size(), &tweak[(i-1)*cipher->block_size()], cipher->block_size()); poly_double(&tweak[i*cipher->block_size()], cipher->block_size()); } } void XTS_Encryption::set_key(const SymmetricKey& key) { size_t key_half = key.length() / 2; if(key.length() % 2 == 1 || !cipher->valid_keylength(key_half)) throw Invalid_Key_Length(name(), key.length()); cipher->set_key(key.begin(), key_half); cipher2->set_key(key.begin() + key_half, key_half); } /* * Encrypt in XTS mode */ void XTS_Encryption::write(const byte input[], size_t length) { Buffered_Filter::write(input, length); } /* * Finish encrypting in XTS mode */ void XTS_Encryption::end_msg() { Buffered_Filter::end_msg(); } void XTS_Encryption::buffered_block(const byte input[], size_t length) { const size_t blocks_in_tweak = tweak.size() / cipher->block_size(); size_t blocks = length / cipher->block_size(); SecureVector temp(tweak.size()); while(blocks) { size_t to_proc = std::min(blocks, blocks_in_tweak); size_t to_proc_bytes = to_proc * cipher->block_size(); xor_buf(temp, input, tweak, to_proc_bytes); cipher->encrypt_n(&temp[0], &temp[0], to_proc); xor_buf(temp, tweak, to_proc_bytes); send(temp, to_proc_bytes); tweak.copy(&tweak[(to_proc-1)*cipher->block_size()], cipher->block_size()); poly_double(&tweak[0], cipher->block_size()); for(size_t i = 1; i < blocks_in_tweak; ++i) { tweak.copy(i*cipher->block_size(), &tweak[(i-1)*cipher->block_size()], cipher->block_size()); poly_double(&tweak[i*cipher->block_size()], cipher->block_size()); } input += to_proc * cipher->block_size(); blocks -= to_proc; } } /* * Finish encrypting in XTS mode */ void XTS_Encryption::buffered_final(const byte input[], size_t length) { if(length <= cipher->block_size()) throw Encoding_Error("XTS_Encryption: insufficient data to encrypt"); if(length % cipher->block_size() == 0) { buffered_block(input, length); } else { // steal ciphertext size_t leftover_blocks = ((length / cipher->block_size()) - 1) * cipher->block_size(); buffered_block(input, leftover_blocks); input += leftover_blocks; length -= leftover_blocks; SecureVector temp(input, length); xor_buf(temp, tweak, cipher->block_size()); cipher->encrypt(temp); xor_buf(temp, tweak, cipher->block_size()); poly_double(&tweak[0], cipher->block_size()); for(size_t i = 0; i != length - cipher->block_size(); ++i) std::swap(temp[i], temp[i + cipher->block_size()]); xor_buf(temp, tweak, cipher->block_size()); cipher->encrypt(temp); xor_buf(temp, tweak, cipher->block_size()); send(temp, temp.size()); } buffer_reset(); } /* * XTS_Decryption constructor */ XTS_Decryption::XTS_Decryption(BlockCipher* ciph) : Buffered_Filter(xts_parallelism(ciph), ciph->block_size() + 1), cipher(ciph) { if(cipher->block_size() != 8 && cipher->block_size() != 16) throw std::invalid_argument("Bad cipher for XTS: " + cipher->name()); cipher2 = ciph->clone(); tweak.resize(buffered_block_size()); } /* * XTS_Decryption constructor */ XTS_Decryption::XTS_Decryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv) : Buffered_Filter(xts_parallelism(ciph), ciph->block_size() + 1), cipher(ciph) { if(cipher->block_size() != 8 && cipher->block_size() != 16) throw std::invalid_argument("Bad cipher for XTS: " + cipher->name()); cipher2 = ciph->clone(); tweak.resize(buffered_block_size()); set_key(key); set_iv(iv); } /* * Return the name */ std::string XTS_Decryption::name() const { return (cipher->name() + "/XTS"); } /* * Set new tweak */ void XTS_Decryption::set_iv(const InitializationVector& iv) { if(!valid_iv_length(iv.length())) throw Invalid_IV_Length(name(), iv.length()); const size_t blocks_in_tweak = tweak.size() / cipher->block_size(); tweak.copy(iv.begin(), iv.length()); cipher2->encrypt(tweak); for(size_t i = 1; i < blocks_in_tweak; ++i) { tweak.copy(i*cipher->block_size(), &tweak[(i-1)*cipher->block_size()], cipher->block_size()); poly_double(&tweak[i*cipher->block_size()], cipher->block_size()); } } void XTS_Decryption::set_key(const SymmetricKey& key) { size_t key_half = key.length() / 2; if(key.length() % 2 == 1 || !cipher->valid_keylength(key_half)) throw Invalid_Key_Length(name(), key.length()); cipher->set_key(key.begin(), key_half); cipher2->set_key(key.begin() + key_half, key_half); } /* * Decrypt in XTS mode */ void XTS_Decryption::write(const byte input[], size_t length) { Buffered_Filter::write(input, length); } /* * Finish decrypting in XTS mode */ void XTS_Decryption::end_msg() { Buffered_Filter::end_msg(); } void XTS_Decryption::buffered_block(const byte input[], size_t input_length) { const size_t blocks_in_tweak = tweak.size() / cipher->block_size(); size_t blocks = input_length / cipher->block_size(); SecureVector temp(tweak.size()); while(blocks) { size_t to_proc = std::min(blocks, blocks_in_tweak); size_t to_proc_bytes = to_proc * cipher->block_size(); xor_buf(temp, input, tweak, to_proc_bytes); cipher->decrypt_n(&temp[0], &temp[0], to_proc); xor_buf(temp, tweak, to_proc_bytes); send(temp, to_proc_bytes); tweak.copy(&tweak[(to_proc-1)*cipher->block_size()], cipher->block_size()); poly_double(&tweak[0], cipher->block_size()); for(size_t i = 1; i < blocks_in_tweak; ++i) { tweak.copy(i*cipher->block_size(), &tweak[(i-1)*cipher->block_size()], cipher->block_size()); poly_double(&tweak[i*cipher->block_size()], cipher->block_size()); } input += to_proc * cipher->block_size(); blocks -= to_proc; } } void XTS_Decryption::buffered_final(const byte input[], size_t length) { if(length <= cipher->block_size()) throw Decoding_Error("XTS_Decryption: insufficient data to decrypt"); if(length % cipher->block_size() == 0) { buffered_block(input, length); } else { size_t leftover_blocks = ((length / cipher->block_size()) - 1) * cipher->block_size(); buffered_block(input, leftover_blocks); input += leftover_blocks; length -= leftover_blocks; SecureVector temp(input, length); SecureVector tweak_copy(&tweak[0], cipher->block_size()); poly_double(&tweak_copy[0], cipher->block_size()); xor_buf(temp, tweak_copy, cipher->block_size()); cipher->decrypt(temp); xor_buf(temp, tweak_copy, cipher->block_size()); for(size_t i = 0; i != length - cipher->block_size(); ++i) std::swap(temp[i], temp[i + cipher->block_size()]); xor_buf(temp, tweak, cipher->block_size()); cipher->decrypt(temp); xor_buf(temp, tweak, cipher->block_size()); send(temp, length); } buffer_reset(); } } Botan-1.10.12/src/filters/modes/xts/xts.h0000664000175000017500000000447712654331322017753 0ustar jackjack00000000000000/* * XTS mode, from IEEE P1619 * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_XTS_H__ #define BOTAN_XTS_H__ #include #include #include namespace Botan { /** * IEEE P1619 XTS Encryption */ class BOTAN_DLL XTS_Encryption : public Keyed_Filter, private Buffered_Filter { public: void set_key(const SymmetricKey& key); void set_iv(const InitializationVector& iv); bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } std::string name() const; XTS_Encryption(BlockCipher* ciph); XTS_Encryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv); ~XTS_Encryption() { delete cipher; delete cipher2; } private: void write(const byte[], size_t); void end_msg(); void buffered_block(const byte input[], size_t input_length); void buffered_final(const byte input[], size_t input_length); BlockCipher* cipher; BlockCipher* cipher2; SecureVector tweak; }; /** * IEEE P1619 XTS Encryption */ class BOTAN_DLL XTS_Decryption : public Keyed_Filter, private Buffered_Filter { public: void set_key(const SymmetricKey& key); void set_iv(const InitializationVector& iv); bool valid_keylength(size_t key_len) const { return cipher->valid_keylength(key_len); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } std::string name() const; XTS_Decryption(BlockCipher* ciph); XTS_Decryption(BlockCipher* ciph, const SymmetricKey& key, const InitializationVector& iv); ~XTS_Decryption() { delete cipher; delete cipher2; } private: void write(const byte[], size_t); void end_msg(); void buffered_block(const byte input[], size_t input_length); void buffered_final(const byte input[], size_t input_length); BlockCipher* cipher; BlockCipher* cipher2; SecureVector tweak; }; } #endif Botan-1.10.12/src/filters/out_buf.cpp0000664000175000017500000000434212654331322017175 0ustar jackjack00000000000000/* * Pipe Output Buffer * (C) 1999-2007,2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Read data from a message */ size_t Output_Buffers::read(byte output[], size_t length, Pipe::message_id msg) { SecureQueue* q = get(msg); if(q) return q->read(output, length); return 0; } /* * Peek at data in a message */ size_t Output_Buffers::peek(byte output[], size_t length, size_t stream_offset, Pipe::message_id msg) const { SecureQueue* q = get(msg); if(q) return q->peek(output, length, stream_offset); return 0; } /* * Check available bytes in a message */ size_t Output_Buffers::remaining(Pipe::message_id msg) const { SecureQueue* q = get(msg); if(q) return q->size(); return 0; } /* * Add a new output queue */ void Output_Buffers::add(SecureQueue* queue) { BOTAN_ASSERT(queue, "argument was NULL"); BOTAN_ASSERT(buffers.size() < buffers.max_size(), "No more room in container"); buffers.push_back(queue); } /* * Retire old output queues */ void Output_Buffers::retire() { for(size_t i = 0; i != buffers.size(); ++i) if(buffers[i] && buffers[i]->size() == 0) { delete buffers[i]; buffers[i] = 0; } while(buffers.size() && !buffers[0]) { buffers.pop_front(); offset = offset + Pipe::message_id(1); } } /* * Get a particular output queue */ SecureQueue* Output_Buffers::get(Pipe::message_id msg) const { if(msg < offset) return 0; BOTAN_ASSERT(msg < message_count(), "Message number out of range"); return buffers[msg-offset]; } /* * Return the total number of messages */ Pipe::message_id Output_Buffers::message_count() const { return (offset + buffers.size()); } /* * Output_Buffers Constructor */ Output_Buffers::Output_Buffers() { offset = 0; } /* * Output_Buffers Destructor */ Output_Buffers::~Output_Buffers() { for(size_t j = 0; j != buffers.size(); ++j) delete buffers[j]; } } Botan-1.10.12/src/filters/out_buf.h0000664000175000017500000000145712654331322016646 0ustar jackjack00000000000000/* * Output Buffer * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_OUTPUT_BUFFER_H__ #define BOTAN_OUTPUT_BUFFER_H__ #include #include #include namespace Botan { /** * Container of output buffers for Pipe */ class Output_Buffers { public: size_t read(byte[], size_t, Pipe::message_id); size_t peek(byte[], size_t, size_t, Pipe::message_id) const; size_t remaining(Pipe::message_id) const; void add(class SecureQueue*); void retire(); Pipe::message_id message_count() const; Output_Buffers(); ~Output_Buffers(); private: class SecureQueue* get(Pipe::message_id) const; std::deque buffers; Pipe::message_id offset; }; } #endif Botan-1.10.12/src/filters/pipe.cpp0000664000175000017500000001254412654331322016472 0ustar jackjack00000000000000/* * Pipe * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { /* * A Filter that does nothing */ class Null_Filter : public Filter { public: void write(const byte input[], size_t length) { send(input, length); } std::string name() const { return "Null"; } }; } /* * Pipe Constructor */ Pipe::Pipe(Filter* f1, Filter* f2, Filter* f3, Filter* f4) { init(); append(f1); append(f2); append(f3); append(f4); } /* * Pipe Constructor */ Pipe::Pipe(Filter* filter_array[], size_t count) { init(); for(size_t j = 0; j != count; ++j) append(filter_array[j]); } /* * Pipe Destructor */ Pipe::~Pipe() { destruct(pipe); delete outputs; } /* * Initialize the Pipe */ void Pipe::init() { outputs = new Output_Buffers; pipe = 0; default_read = 0; inside_msg = false; } /* * Reset the Pipe */ void Pipe::reset() { destruct(pipe); pipe = 0; inside_msg = false; } /* * Destroy the Pipe */ void Pipe::destruct(Filter* to_kill) { if(!to_kill || dynamic_cast(to_kill)) return; for(size_t j = 0; j != to_kill->total_ports(); ++j) destruct(to_kill->next[j]); delete to_kill; } /* * Test if the Pipe has any data in it */ bool Pipe::end_of_data() const { return (remaining() == 0); } /* * Set the default read message */ void Pipe::set_default_msg(message_id msg) { if(msg >= message_count()) throw Invalid_Argument("Pipe::set_default_msg: msg number is too high"); default_read = msg; } /* * Process a full message at once */ void Pipe::process_msg(const byte input[], size_t length) { start_msg(); write(input, length); end_msg(); } /* * Process a full message at once */ void Pipe::process_msg(const MemoryRegion& input) { process_msg(&input[0], input.size()); } /* * Process a full message at once */ void Pipe::process_msg(const std::string& input) { process_msg(reinterpret_cast(input.data()), input.length()); } /* * Process a full message at once */ void Pipe::process_msg(DataSource& input) { start_msg(); write(input); end_msg(); } /* * Start a new message */ void Pipe::start_msg() { if(inside_msg) throw Invalid_State("Pipe::start_msg: Message was already started"); if(pipe == 0) pipe = new Null_Filter; find_endpoints(pipe); pipe->new_msg(); inside_msg = true; } /* * End the current message */ void Pipe::end_msg() { if(!inside_msg) throw Invalid_State("Pipe::end_msg: Message was already ended"); pipe->finish_msg(); clear_endpoints(pipe); if(dynamic_cast(pipe)) { delete pipe; pipe = 0; } inside_msg = false; outputs->retire(); } /* * Find the endpoints of the Pipe */ void Pipe::find_endpoints(Filter* f) { for(size_t j = 0; j != f->total_ports(); ++j) if(f->next[j] && !dynamic_cast(f->next[j])) find_endpoints(f->next[j]); else { SecureQueue* q = new SecureQueue; f->next[j] = q; outputs->add(q); } } /* * Remove the SecureQueues attached to the Filter */ void Pipe::clear_endpoints(Filter* f) { if(!f) return; for(size_t j = 0; j != f->total_ports(); ++j) { if(f->next[j] && dynamic_cast(f->next[j])) f->next[j] = 0; clear_endpoints(f->next[j]); } } /* * Append a Filter to the Pipe */ void Pipe::append(Filter* filter) { if(inside_msg) throw Invalid_State("Cannot append to a Pipe while it is processing"); if(!filter) return; if(dynamic_cast(filter)) throw Invalid_Argument("Pipe::append: SecureQueue cannot be used"); if(filter->owned) throw Invalid_Argument("Filters cannot be shared among multiple Pipes"); filter->owned = true; if(!pipe) pipe = filter; else pipe->attach(filter); } /* * Prepend a Filter to the Pipe */ void Pipe::prepend(Filter* filter) { if(inside_msg) throw Invalid_State("Cannot prepend to a Pipe while it is processing"); if(!filter) return; if(dynamic_cast(filter)) throw Invalid_Argument("Pipe::prepend: SecureQueue cannot be used"); if(filter->owned) throw Invalid_Argument("Filters cannot be shared among multiple Pipes"); filter->owned = true; if(pipe) filter->attach(pipe); pipe = filter; } /* * Pop a Filter off the Pipe */ void Pipe::pop() { if(inside_msg) throw Invalid_State("Cannot pop off a Pipe while it is processing"); if(!pipe) return; if(pipe->total_ports() > 1) throw Invalid_State("Cannot pop off a Filter with multiple ports"); Filter* f = pipe; size_t owns = f->owns(); pipe = pipe->next[0]; delete f; while(owns--) { f = pipe; pipe = pipe->next[0]; delete f; } } /* * Return the number of messages in this Pipe */ Pipe::message_id Pipe::message_count() const { return outputs->message_count(); } /* * Static Member Variables */ const Pipe::message_id Pipe::LAST_MESSAGE = static_cast(-2); const Pipe::message_id Pipe::DEFAULT_MESSAGE = static_cast(-1); } Botan-1.10.12/src/filters/pipe.h0000664000175000017500000002362412654331322016140 0ustar jackjack00000000000000/* * Pipe * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PIPE_H__ #define BOTAN_PIPE_H__ #include #include #include #include namespace Botan { /** * This class represents pipe objects. * A set of filters can be placed into a pipe, and information flows * through the pipe until it reaches the end, where the output is * collected for retrieval. If you're familiar with the Unix shell * environment, this design will sound quite familiar. */ class BOTAN_DLL Pipe : public DataSource { public: /** * An opaque type that identifies a message in this Pipe */ typedef size_t message_id; /** * Exception if you use an invalid message as an argument to * read, remaining, etc */ struct BOTAN_DLL Invalid_Message_Number : public Invalid_Argument { /** * @param where the error occured * @param msg the invalid message id that was used */ Invalid_Message_Number(const std::string& where, message_id msg) : Invalid_Argument("Pipe::" + where + ": Invalid message number " + to_string(msg)) {} }; /** * A meta-id for whatever the last message is */ static const message_id LAST_MESSAGE; /** * A meta-id for the default message (set with set_default_msg) */ static const message_id DEFAULT_MESSAGE; /** * Write input to the pipe, i.e. to its first filter. * @param in the byte array to write * @param length the length of the byte array in */ void write(const byte in[], size_t length); /** * Write input to the pipe, i.e. to its first filter. * @param in the MemoryRegion containing the data to write */ void write(const MemoryRegion& in); /** * Write input to the pipe, i.e. to its first filter. * @param in the string containing the data to write */ void write(const std::string& in); /** * Write input to the pipe, i.e. to its first filter. * @param in the DataSource to read the data from */ void write(DataSource& in); /** * Write input to the pipe, i.e. to its first filter. * @param in a single byte to be written */ void write(byte in); /** * Perform start_msg(), write() and end_msg() sequentially. * @param in the byte array containing the data to write * @param length the length of the byte array to write */ void process_msg(const byte in[], size_t length); /** * Perform start_msg(), write() and end_msg() sequentially. * @param in the MemoryRegion containing the data to write */ void process_msg(const MemoryRegion& in); /** * Perform start_msg(), write() and end_msg() sequentially. * @param in the string containing the data to write */ void process_msg(const std::string& in); /** * Perform start_msg(), write() and end_msg() sequentially. * @param in the DataSource providing the data to write */ void process_msg(DataSource& in); /** * Find out how many bytes are ready to read. * @param msg the number identifying the message * for which the information is desired * @return number of bytes that can still be read */ size_t remaining(message_id msg = DEFAULT_MESSAGE) const; /** * Read the default message from the pipe. Moves the internal * offset so that every call to read will return a new portion of * the message. * * @param output the byte array to write the read bytes to * @param length the length of the byte array output * @return number of bytes actually read into output */ size_t read(byte output[], size_t length); /** * Read a specified message from the pipe. Moves the internal * offset so that every call to read will return a new portion of * the message. * @param output the byte array to write the read bytes to * @param length the length of the byte array output * @param msg the number identifying the message to read from * @return number of bytes actually read into output */ size_t read(byte output[], size_t length, message_id msg); /** * Read a single byte from the pipe. Moves the internal offset so * that every call to read will return a new portion of the * message. * * @param output the byte to write the result to * @param msg the message to read from * @return number of bytes actually read into output */ size_t read(byte& output, message_id msg = DEFAULT_MESSAGE); /** * Read the full contents of the pipe. * @param msg the number identifying the message to read from * @return SecureVector holding the contents of the pipe */ SecureVector read_all(message_id msg = DEFAULT_MESSAGE); /** * Read the full contents of the pipe. * @param msg the number identifying the message to read from * @return string holding the contents of the pipe */ std::string read_all_as_string(message_id = DEFAULT_MESSAGE); /** Read from the default message but do not modify the internal * offset. Consecutive calls to peek() will return portions of * the message starting at the same position. * @param output the byte array to write the peeked message part to * @param length the length of the byte array output * @param offset the offset from the current position in message * @return number of bytes actually peeked and written into output */ size_t peek(byte output[], size_t length, size_t offset) const; /** Read from the specified message but do not modify the * internal offset. Consecutive calls to peek() will return * portions of the message starting at the same position. * @param output the byte array to write the peeked message part to * @param length the length of the byte array output * @param offset the offset from the current position in message * @param msg the number identifying the message to peek from * @return number of bytes actually peeked and written into output */ size_t peek(byte output[], size_t length, size_t offset, message_id msg) const; /** Read a single byte from the specified message but do not * modify the internal offset. Consecutive calls to peek() will * return portions of the message starting at the same position. * @param output the byte to write the peeked message byte to * @param offset the offset from the current position in message * @param msg the number identifying the message to peek from * @return number of bytes actually peeked and written into output */ size_t peek(byte& output, size_t offset, message_id msg = DEFAULT_MESSAGE) const; bool check_available(size_t n); bool check_available_msg(size_t n, message_id msg); /** * @return currently set default message */ size_t default_msg() const { return default_read; } /** * Set the default message * @param msg the number identifying the message which is going to * be the new default message */ void set_default_msg(message_id msg); /** * Get the number of messages the are in this pipe. * @return number of messages the are in this pipe */ message_id message_count() const; /** * Test whether this pipe has any data that can be read from. * @return true if there is more data to read, false otherwise */ bool end_of_data() const; /** * Start a new message in the pipe. A potential other message in this pipe * must be closed with end_msg() before this function may be called. */ void start_msg(); /** * End the current message. */ void end_msg(); /** * Insert a new filter at the front of the pipe * @param filt the new filter to insert */ void prepend(Filter* filt); /** * Insert a new filter at the back of the pipe * @param filt the new filter to insert */ void append(Filter* filt); /** * Remove the first filter at the front of the pipe. */ void pop(); /** * Reset this pipe to an empty pipe. */ void reset(); /** * Construct a Pipe of up to four filters. The filters are set up * in the same order as the arguments. */ Pipe(Filter* = 0, Filter* = 0, Filter* = 0, Filter* = 0); /** * Construct a Pipe from range of filters passed as an array * @param filters the set of filters to use * @param count the number of elements in filters */ Pipe(Filter* filters[], size_t count); ~Pipe(); private: Pipe(const Pipe&) : DataSource() {} Pipe& operator=(const Pipe&) { return (*this); } void init(); void destruct(Filter*); void find_endpoints(Filter*); void clear_endpoints(Filter*); message_id get_message_no(const std::string&, message_id) const; Filter* pipe; class Output_Buffers* outputs; message_id default_read; bool inside_msg; }; /** * Stream output operator; dumps the results from pipe's default * message to the output stream. * @param out an output stream * @param pipe the pipe */ BOTAN_DLL std::ostream& operator<<(std::ostream& out, Pipe& pipe); /** * Stream input operator; dumps the remaining bytes of input * to the (assumed open) pipe message. * @param in the input stream * @param pipe the pipe */ BOTAN_DLL std::istream& operator>>(std::istream& in, Pipe& pipe); } #if defined(BOTAN_HAS_PIPE_UNIXFD_IO) #include #endif #endif Botan-1.10.12/src/filters/pipe_io.cpp0000664000175000017500000000211712654331322017154 0ustar jackjack00000000000000/* * Pipe I/O * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Write data from a pipe into an ostream */ std::ostream& operator<<(std::ostream& stream, Pipe& pipe) { SecureVector buffer(DEFAULT_BUFFERSIZE); while(stream.good() && pipe.remaining()) { size_t got = pipe.read(&buffer[0], buffer.size()); stream.write(reinterpret_cast(&buffer[0]), got); } if(!stream.good()) throw Stream_IO_Error("Pipe output operator (iostream) has failed"); return stream; } /* * Read data from an istream into a pipe */ std::istream& operator>>(std::istream& stream, Pipe& pipe) { SecureVector buffer(DEFAULT_BUFFERSIZE); while(stream.good()) { stream.read(reinterpret_cast(&buffer[0]), buffer.size()); pipe.write(&buffer[0], stream.gcount()); } if(stream.bad() || (stream.fail() && !stream.eof())) throw Stream_IO_Error("Pipe input operator (iostream) has failed"); return stream; } } Botan-1.10.12/src/filters/pipe_rw.cpp0000664000175000017500000000711212654331322017175 0ustar jackjack00000000000000/* * Pipe Reading/Writing * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Look up the canonical ID for a queue */ Pipe::message_id Pipe::get_message_no(const std::string& func_name, message_id msg) const { if(msg == DEFAULT_MESSAGE) msg = default_msg(); else if(msg == LAST_MESSAGE) msg = message_count() - 1; if(msg >= message_count()) throw Invalid_Message_Number(func_name, msg); return msg; } /* * Write into a Pipe */ void Pipe::write(const byte input[], size_t length) { if(!inside_msg) throw Invalid_State("Cannot write to a Pipe while it is not processing"); pipe->write(input, length); } /* * Write into a Pipe */ void Pipe::write(const MemoryRegion& input) { write(&input[0], input.size()); } /* * Write a string into a Pipe */ void Pipe::write(const std::string& str) { write(reinterpret_cast(str.data()), str.size()); } /* * Write a single byte into a Pipe */ void Pipe::write(byte input) { write(&input, 1); } /* * Write the contents of a DataSource into a Pipe */ void Pipe::write(DataSource& source) { SecureVector buffer(DEFAULT_BUFFERSIZE); while(!source.end_of_data()) { size_t got = source.read(&buffer[0], buffer.size()); write(&buffer[0], got); } } /* * Read some data from the pipe */ size_t Pipe::read(byte output[], size_t length, message_id msg) { return outputs->read(output, length, get_message_no("read", msg)); } /* * Read some data from the pipe */ size_t Pipe::read(byte output[], size_t length) { return read(output, length, DEFAULT_MESSAGE); } /* * Read a single byte from the pipe */ size_t Pipe::read(byte& out, message_id msg) { return read(&out, 1, msg); } /* * Return all data in the pipe */ SecureVector Pipe::read_all(message_id msg) { msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg()); SecureVector buffer(remaining(msg)); size_t got = read(&buffer[0], buffer.size(), msg); buffer.resize(got); return buffer; } /* * Return all data in the pipe as a string */ std::string Pipe::read_all_as_string(message_id msg) { msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg()); SecureVector buffer(DEFAULT_BUFFERSIZE); std::string str; str.reserve(remaining(msg)); while(true) { size_t got = read(&buffer[0], buffer.size(), msg); if(got == 0) break; str.append(reinterpret_cast(&buffer[0]), got); } return str; } /* * Find out how many bytes are ready to read */ size_t Pipe::remaining(message_id msg) const { return outputs->remaining(get_message_no("remaining", msg)); } bool Pipe::check_available(size_t n) { return (n <= remaining(DEFAULT_MESSAGE)); } bool Pipe::check_available_msg(size_t n, message_id msg) { return (n <= remaining(msg)); } /* * Peek at some data in the pipe */ size_t Pipe::peek(byte output[], size_t length, size_t offset, message_id msg) const { return outputs->peek(output, length, offset, get_message_no("peek", msg)); } /* * Peek at some data in the pipe */ size_t Pipe::peek(byte output[], size_t length, size_t offset) const { return peek(output, length, offset, DEFAULT_MESSAGE); } /* * Peek at a byte in the pipe */ size_t Pipe::peek(byte& out, size_t offset, message_id msg) const { return peek(&out, 1, offset, msg); } } Botan-1.10.12/src/filters/pk_filts/info.txt0000664000175000017500000000011612654331322020330 0ustar jackjack00000000000000define PUBLIC_KEY_CRYPTO load_on auto pubkey filters Botan-1.10.12/src/filters/pk_filts/pk_filts.cpp0000664000175000017500000000405712654331322021163 0ustar jackjack00000000000000/* * PK Filters * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * Append to the buffer */ void PK_Encryptor_Filter::write(const byte input[], size_t length) { buffer += std::make_pair(input, length); } /* * Encrypt the message */ void PK_Encryptor_Filter::end_msg() { send(cipher->encrypt(buffer, rng)); buffer.clear(); } /* * Append to the buffer */ void PK_Decryptor_Filter::write(const byte input[], size_t length) { buffer += std::make_pair(input, length); } /* * Decrypt the message */ void PK_Decryptor_Filter::end_msg() { send(cipher->decrypt(buffer)); buffer.clear(); } /* * Add more data */ void PK_Signer_Filter::write(const byte input[], size_t length) { signer->update(input, length); } /* * Sign the message */ void PK_Signer_Filter::end_msg() { send(signer->signature(rng)); } /* * Add more data */ void PK_Verifier_Filter::write(const byte input[], size_t length) { verifier->update(input, length); } /* * Verify the message */ void PK_Verifier_Filter::end_msg() { if(signature.empty()) throw Invalid_State("PK_Verifier_Filter: No signature to check against"); bool is_valid = verifier->check_signature(signature); send((is_valid ? 1 : 0)); } /* * Set the signature to check */ void PK_Verifier_Filter::set_signature(const byte sig[], size_t length) { signature.resize(length); copy_mem(&signature[0], sig, length); } /* * Set the signature to check */ void PK_Verifier_Filter::set_signature(const MemoryRegion& sig) { signature = sig; } /* * PK_Verifier_Filter Constructor */ PK_Verifier_Filter::PK_Verifier_Filter(PK_Verifier* v, const byte sig[], size_t length) : verifier(v), signature(sig, length) { } /* * PK_Verifier_Filter Constructor */ PK_Verifier_Filter::PK_Verifier_Filter(PK_Verifier* v, const MemoryRegion& sig) : verifier(v), signature(sig) { } } Botan-1.10.12/src/filters/pk_filts/pk_filts.h0000664000175000017500000000433212654331322020624 0ustar jackjack00000000000000/* * PK Filters * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PK_FILTERS_H__ #define BOTAN_PK_FILTERS_H__ #include #include namespace Botan { /** * PK_Encryptor Filter */ class BOTAN_DLL PK_Encryptor_Filter : public Filter { public: std::string name() const { return "PK Encryptor"; } void write(const byte[], size_t); void end_msg(); PK_Encryptor_Filter(PK_Encryptor* c, RandomNumberGenerator& rng_ref) : cipher(c), rng(rng_ref) {} ~PK_Encryptor_Filter() { delete cipher; } private: PK_Encryptor* cipher; RandomNumberGenerator& rng; SecureVector buffer; }; /** * PK_Decryptor Filter */ class BOTAN_DLL PK_Decryptor_Filter : public Filter { public: std::string name() const { return "PK Decryptor"; } void write(const byte[], size_t); void end_msg(); PK_Decryptor_Filter(PK_Decryptor* c) : cipher(c) {} ~PK_Decryptor_Filter() { delete cipher; } private: PK_Decryptor* cipher; SecureVector buffer; }; /** * PK_Signer Filter */ class BOTAN_DLL PK_Signer_Filter : public Filter { public: std::string name() const { return "PK Signer"; } void write(const byte[], size_t); void end_msg(); PK_Signer_Filter(PK_Signer* s, RandomNumberGenerator& rng_ref) : signer(s), rng(rng_ref) {} ~PK_Signer_Filter() { delete signer; } private: PK_Signer* signer; RandomNumberGenerator& rng; }; /** * PK_Verifier Filter */ class BOTAN_DLL PK_Verifier_Filter : public Filter { public: std::string name() const { return "PK Verifier"; } void write(const byte[], size_t); void end_msg(); void set_signature(const byte[], size_t); void set_signature(const MemoryRegion&); PK_Verifier_Filter(PK_Verifier* v) : verifier(v) {} PK_Verifier_Filter(PK_Verifier*, const byte[], size_t); PK_Verifier_Filter(PK_Verifier*, const MemoryRegion&); ~PK_Verifier_Filter() { delete verifier; } private: PK_Verifier* verifier; SecureVector signature; }; } #endif Botan-1.10.12/src/filters/secqueue.cpp0000664000175000017500000001020212654331322017341 0ustar jackjack00000000000000/* * SecureQueue * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /** * A node in a SecureQueue */ class SecureQueueNode { public: SecureQueueNode() : buffer(DEFAULT_BUFFERSIZE) { next = 0; start = end = 0; } ~SecureQueueNode() { next = 0; start = end = 0; } size_t write(const byte input[], size_t length) { size_t copied = std::min(length, buffer.size() - end); copy_mem(&buffer[end], input, copied); end += copied; return copied; } size_t read(byte output[], size_t length) { size_t copied = std::min(length, end - start); copy_mem(output, &buffer[start], copied); start += copied; return copied; } size_t peek(byte output[], size_t length, size_t offset = 0) { const size_t left = end - start; if(offset >= left) return 0; size_t copied = std::min(length, left - offset); copy_mem(output, &buffer[start + offset], copied); return copied; } size_t size() const { return (end - start); } private: friend class SecureQueue; SecureQueueNode* next; SecureVector buffer; size_t start, end; }; /* * Create a SecureQueue */ SecureQueue::SecureQueue() { set_next(0, 0); head = tail = new SecureQueueNode; } /* * Copy a SecureQueue */ SecureQueue::SecureQueue(const SecureQueue& input) : Fanout_Filter(), DataSource() { set_next(0, 0); head = tail = new SecureQueueNode; SecureQueueNode* temp = input.head; while(temp) { write(&temp->buffer[temp->start], temp->end - temp->start); temp = temp->next; } } /* * Destroy this SecureQueue */ void SecureQueue::destroy() { SecureQueueNode* temp = head; while(temp) { SecureQueueNode* holder = temp->next; delete temp; temp = holder; } head = tail = 0; } /* * Copy a SecureQueue */ SecureQueue& SecureQueue::operator=(const SecureQueue& input) { destroy(); head = tail = new SecureQueueNode; SecureQueueNode* temp = input.head; while(temp) { write(&temp->buffer[temp->start], temp->end - temp->start); temp = temp->next; } return (*this); } /* * Add some bytes to the queue */ void SecureQueue::write(const byte input[], size_t length) { if(!head) head = tail = new SecureQueueNode; while(length) { const size_t n = tail->write(input, length); input += n; length -= n; if(length) { tail->next = new SecureQueueNode; tail = tail->next; } } } /* * Read some bytes from the queue */ size_t SecureQueue::read(byte output[], size_t length) { size_t got = 0; while(length && head) { const size_t n = head->read(output, length); output += n; got += n; length -= n; if(head->size() == 0) { SecureQueueNode* holder = head->next; delete head; head = holder; } } return got; } /* * Read data, but do not remove it from queue */ size_t SecureQueue::peek(byte output[], size_t length, size_t offset) const { SecureQueueNode* current = head; while(offset && current) { if(offset >= current->size()) { offset -= current->size(); current = current->next; } else break; } size_t got = 0; while(length && current) { const size_t n = current->peek(output, length, offset); offset = 0; output += n; got += n; length -= n; current = current->next; } return got; } /* * Return how many bytes the queue holds */ size_t SecureQueue::size() const { SecureQueueNode* current = head; size_t count = 0; while(current) { count += current->size(); current = current->next; } return count; } /* * Test if the queue has any data in it */ bool SecureQueue::end_of_data() const { return (size() == 0); } } Botan-1.10.12/src/filters/secqueue.h0000664000175000017500000000247712654331322017025 0ustar jackjack00000000000000/* * SecureQueue * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SECURE_QUEUE_H__ #define BOTAN_SECURE_QUEUE_H__ #include #include namespace Botan { /** * A queue that knows how to zeroize itself */ class BOTAN_DLL SecureQueue : public Fanout_Filter, public DataSource { public: std::string name() const { return "Queue"; } void write(const byte[], size_t); size_t read(byte[], size_t); size_t peek(byte[], size_t, size_t = 0) const; bool end_of_data() const; /** * @return number of bytes available in the queue */ size_t size() const; bool attachable() { return false; } bool check_available(size_t n) { return n <= size(); } /** * SecureQueue assignment * @param other the queue to copy */ SecureQueue& operator=(const SecureQueue& other); /** * SecureQueue default constructor (creates empty queue) */ SecureQueue(); /** * SecureQueue copy constructor * @param other the queue to copy */ SecureQueue(const SecureQueue& other); ~SecureQueue() { destroy(); } private: void destroy(); class SecureQueueNode* head; class SecureQueueNode* tail; }; } #endif Botan-1.10.12/src/filters/zlib/info.txt0000664000175000017500000000014112654331322017453 0ustar jackjack00000000000000define COMPRESSOR_ZLIB load_on request all -> z filters Botan-1.10.12/src/filters/zlib/zlib.cpp0000664000175000017500000001447712654331322017444 0ustar jackjack00000000000000/* * Zlib Compressor * (C) 2001 Peter J Jones * 2001-2007 Jack Lloyd * 2006 Matt Johnston * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace { /* * Allocation Information for Zlib */ class Zlib_Alloc_Info { public: std::map current_allocs; Allocator* alloc; Zlib_Alloc_Info() { alloc = Allocator::get(false); } }; /* * Allocation Function for Zlib */ void* zlib_malloc(void* info_ptr, unsigned int n, unsigned int size) { Zlib_Alloc_Info* info = static_cast(info_ptr); void* ptr = info->alloc->allocate(n * size); info->current_allocs[ptr] = n * size; return ptr; } /* * Allocation Function for Zlib */ void zlib_free(void* info_ptr, void* ptr) { Zlib_Alloc_Info* info = static_cast(info_ptr); std::map::const_iterator i = info->current_allocs.find(ptr); if(i == info->current_allocs.end()) throw Invalid_Argument("zlib_free: Got pointer not allocated by us"); info->alloc->deallocate(ptr, i->second); } } /** * Wrapper Type for Zlib z_stream */ class Zlib_Stream { public: /** * Underlying stream */ z_stream stream; /** * Constructor */ Zlib_Stream() { std::memset(&stream, 0, sizeof(z_stream)); stream.zalloc = zlib_malloc; stream.zfree = zlib_free; stream.opaque = new Zlib_Alloc_Info; } /** * Destructor */ ~Zlib_Stream() { Zlib_Alloc_Info* info = static_cast(stream.opaque); delete info; std::memset(&stream, 0, sizeof(z_stream)); } }; /* * Zlib_Compression Constructor */ Zlib_Compression::Zlib_Compression(size_t l) : level((l >= 9) ? 9 : l), buffer(DEFAULT_BUFFERSIZE) { zlib = 0; } /* * Start Compressing with Zlib */ void Zlib_Compression::start_msg() { clear(); zlib = new Zlib_Stream; if(deflateInit(&(zlib->stream), level) != Z_OK) throw Memory_Exhaustion(); } /* * Compress Input with Zlib */ void Zlib_Compression::write(const byte input[], size_t length) { zlib->stream.next_in = static_cast(const_cast(input)); zlib->stream.avail_in = length; while(zlib->stream.avail_in != 0) { zlib->stream.next_out = static_cast(buffer.begin()); zlib->stream.avail_out = buffer.size(); deflate(&(zlib->stream), Z_NO_FLUSH); send(buffer.begin(), buffer.size() - zlib->stream.avail_out); } } /* * Finish Compressing with Zlib */ void Zlib_Compression::end_msg() { zlib->stream.next_in = 0; zlib->stream.avail_in = 0; int rc = Z_OK; while(rc != Z_STREAM_END) { zlib->stream.next_out = reinterpret_cast(buffer.begin()); zlib->stream.avail_out = buffer.size(); rc = deflate(&(zlib->stream), Z_FINISH); send(buffer.begin(), buffer.size() - zlib->stream.avail_out); } clear(); } /* * Flush the Zlib Compressor */ void Zlib_Compression::flush() { zlib->stream.next_in = 0; zlib->stream.avail_in = 0; while(true) { zlib->stream.avail_out = buffer.size(); zlib->stream.next_out = reinterpret_cast(buffer.begin()); deflate(&(zlib->stream), Z_FULL_FLUSH); send(buffer.begin(), buffer.size() - zlib->stream.avail_out); if(zlib->stream.avail_out == buffer.size()) break; } } /* * Clean up Compression Context */ void Zlib_Compression::clear() { zeroise(buffer); if(zlib) { deflateEnd(&(zlib->stream)); delete zlib; zlib = 0; } } /* * Zlib_Decompression Constructor */ Zlib_Decompression::Zlib_Decompression() : buffer(DEFAULT_BUFFERSIZE) { zlib = 0; no_writes = true; } /* * Start Decompressing with Zlib */ void Zlib_Decompression::start_msg() { clear(); zlib = new Zlib_Stream; if(inflateInit(&(zlib->stream)) != Z_OK) throw Memory_Exhaustion(); } /* * Decompress Input with Zlib */ void Zlib_Decompression::write(const byte input_arr[], size_t length) { if(length) no_writes = false; // non-const needed by zlib api :( Bytef* input = reinterpret_cast(const_cast(input_arr)); zlib->stream.next_in = input; zlib->stream.avail_in = length; while(zlib->stream.avail_in != 0) { zlib->stream.next_out = reinterpret_cast(buffer.begin()); zlib->stream.avail_out = buffer.size(); int rc = inflate(&(zlib->stream), Z_SYNC_FLUSH); if(rc != Z_OK && rc != Z_STREAM_END) { clear(); if(rc == Z_DATA_ERROR) throw Decoding_Error("Zlib_Decompression: Data integrity error"); else if(rc == Z_NEED_DICT) throw Decoding_Error("Zlib_Decompression: Need preset dictionary"); else if(rc == Z_MEM_ERROR) throw Memory_Exhaustion(); else throw std::runtime_error("Zlib decompression: Unknown error"); } send(buffer.begin(), buffer.size() - zlib->stream.avail_out); if(rc == Z_STREAM_END) { size_t read_from_block = length - zlib->stream.avail_in; start_msg(); zlib->stream.next_in = input + read_from_block; zlib->stream.avail_in = length - read_from_block; input += read_from_block; length -= read_from_block; } } } /* * Finish Decompressing with Zlib */ void Zlib_Decompression::end_msg() { if(no_writes) return; zlib->stream.next_in = 0; zlib->stream.avail_in = 0; int rc = Z_OK; while(rc != Z_STREAM_END) { zlib->stream.next_out = reinterpret_cast(buffer.begin()); zlib->stream.avail_out = buffer.size(); rc = inflate(&(zlib->stream), Z_SYNC_FLUSH); if(rc != Z_OK && rc != Z_STREAM_END) { clear(); throw Decoding_Error("Zlib_Decompression: Error finalizing"); } send(buffer.begin(), buffer.size() - zlib->stream.avail_out); } clear(); } /* * Clean up Decompression Context */ void Zlib_Decompression::clear() { zeroise(buffer); no_writes = true; if(zlib) { inflateEnd(&(zlib->stream)); delete zlib; zlib = 0; } } } Botan-1.10.12/src/filters/zlib/zlib.h0000664000175000017500000000255412654331322017102 0ustar jackjack00000000000000/* * Zlib Compressor * (C) 2001 Peter J Jones * 2001-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ZLIB_H__ #define BOTAN_ZLIB_H__ #include namespace Botan { /** * Zlib Compression Filter */ class BOTAN_DLL Zlib_Compression : public Filter { public: std::string name() const { return "Zlib_Compression"; } void write(const byte input[], size_t length); void start_msg(); void end_msg(); /** * Flush the compressor */ void flush(); /** @param level how much effort to use on compressing (0 to 9); higher levels are slower but tend to give better compression */ Zlib_Compression(size_t level = 6); ~Zlib_Compression() { clear(); } private: void clear(); const size_t level; SecureVector buffer; class Zlib_Stream* zlib; }; /** * Zlib Decompression Filter */ class BOTAN_DLL Zlib_Decompression : public Filter { public: std::string name() const { return "Zlib_Decompression"; } void write(const byte input[], size_t length); void start_msg(); void end_msg(); Zlib_Decompression(); ~Zlib_Decompression() { clear(); } private: void clear(); SecureVector buffer; class Zlib_Stream* zlib; bool no_writes; }; } #endif Botan-1.10.12/src/hash/bmw_512/bmw_512.cpp0000664000175000017500000001461612654331322017342 0ustar jackjack00000000000000/* * Blue Midnight Wish 512 (Round 2 tweaked) * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { inline u64bit S0(u64bit X) { return (X >> 1) ^ (X << 3) ^ rotate_left(X, 4) ^ rotate_left(X, 37); } inline u64bit S1(u64bit X) { return (X >> 1) ^ (X << 2) ^ rotate_left(X, 13) ^ rotate_left(X, 43); } inline u64bit S2(u64bit X) { return (X >> 2) ^ (X << 1) ^ rotate_left(X, 19) ^ rotate_left(X, 53); } inline u64bit S3(u64bit X) { return (X >> 2) ^ (X << 2) ^ rotate_left(X, 28) ^ rotate_left(X, 59); } inline u64bit S4(u64bit X) { return (X >> 1) ^ X; } /** * Blue Midnight Wish 512 compression function */ void BMW_512_compress(u64bit H[16], const u64bit M[16], u64bit Q[32]) { const size_t EXPAND_1_ROUNDS = 2; for(size_t i = 0; i != 16; ++i) Q[i] = H[i] ^ M[i]; Q[16] = Q[ 5] - Q[ 7] + Q[10] + Q[13] + Q[14]; Q[17] = Q[ 6] - Q[ 8] + Q[11] + Q[14] - Q[15]; Q[18] = Q[ 0] + Q[ 7] + Q[ 9] - Q[12] + Q[15]; Q[19] = Q[ 0] - Q[ 1] + Q[ 8] - Q[10] + Q[13]; Q[20] = Q[ 1] + Q[ 2] + Q[ 9] - Q[11] - Q[14]; Q[21] = Q[ 3] - Q[ 2] + Q[10] - Q[12] + Q[15]; Q[22] = Q[ 4] - Q[ 0] - Q[ 3] - Q[11] + Q[13]; Q[23] = Q[ 1] - Q[ 4] - Q[ 5] - Q[12] - Q[14]; Q[24] = Q[ 2] - Q[ 5] - Q[ 6] + Q[13] - Q[15]; Q[25] = Q[ 0] - Q[ 3] + Q[ 6] - Q[ 7] + Q[14]; Q[26] = Q[ 8] - Q[ 1] - Q[ 4] - Q[ 7] + Q[15]; Q[27] = Q[ 8] - Q[ 0] - Q[ 2] - Q[ 5] + Q[ 9]; Q[28] = Q[ 1] + Q[ 3] - Q[ 6] - Q[ 9] + Q[10]; Q[29] = Q[ 2] + Q[ 4] + Q[ 7] + Q[10] + Q[11]; Q[30] = Q[ 3] - Q[ 5] + Q[ 8] - Q[11] - Q[12]; Q[31] = Q[12] - Q[ 4] - Q[ 6] - Q[ 9] + Q[13]; Q[ 0] = S0(Q[16]) + H[ 1]; Q[ 1] = S1(Q[17]) + H[ 2]; Q[ 2] = S2(Q[18]) + H[ 3]; Q[ 3] = S3(Q[19]) + H[ 4]; Q[ 4] = S4(Q[20]) + H[ 5]; Q[ 5] = S0(Q[21]) + H[ 6]; Q[ 6] = S1(Q[22]) + H[ 7]; Q[ 7] = S2(Q[23]) + H[ 8]; Q[ 8] = S3(Q[24]) + H[ 9]; Q[ 9] = S4(Q[25]) + H[10]; Q[10] = S0(Q[26]) + H[11]; Q[11] = S1(Q[27]) + H[12]; Q[12] = S2(Q[28]) + H[13]; Q[13] = S3(Q[29]) + H[14]; Q[14] = S4(Q[30]) + H[15]; Q[15] = S0(Q[31]) + H[ 0]; static const u64bit x55 = 0x0555555555555555; for(size_t i = 16; i != 16 + EXPAND_1_ROUNDS; ++i) { Q[i] = S1(Q[i-16]) + S2(Q[i-15]) + S3(Q[i-14]) + S0(Q[i-13]) + S1(Q[i-12]) + S2(Q[i-11]) + S3(Q[i-10]) + S0(Q[i- 9]) + S1(Q[i- 8]) + S2(Q[i- 7]) + S3(Q[i- 6]) + S0(Q[i- 5]) + S1(Q[i- 4]) + S2(Q[i- 3]) + S3(Q[i- 2]) + S0(Q[i- 1]) + ((rotate_left(M[(i-16) % 16], ((i-16)%16) + 1) + rotate_left(M[(i-13) % 16], ((i-13)%16) + 1) - rotate_left(M[(i- 6) % 16], ((i-6)%16) + 1) + (x55 * i)) ^ H[(i-16+7)%16]); } for(size_t i = 16 + EXPAND_1_ROUNDS; i != 32; ++i) { Q[i] = Q[i-16] + rotate_left(Q[i-15], 5) + Q[i-14] + rotate_left(Q[i-13], 11) + Q[i-12] + rotate_left(Q[i-11], 27) + Q[i-10] + rotate_left(Q[i- 9], 32) + Q[i- 8] + rotate_left(Q[i- 7], 37) + Q[i- 6] + rotate_left(Q[i- 5], 43) + Q[i- 4] + rotate_left(Q[i- 3], 53) + S4(Q[i - 2]) + ((Q[i-1] >> 2) ^ Q[i-1]) + ((rotate_left(M[(i-16) % 16], ((i-16)%16 + 1)) + rotate_left(M[(i-13) % 16], ((i-13)%16 + 1)) - rotate_left(M[(i- 6) % 16], ((i-6)%16 + 1)) + (x55 * i)) ^ H[(i-16+7)%16]); } u64bit XL = Q[16] ^ Q[17] ^ Q[18] ^ Q[19] ^ Q[20] ^ Q[21] ^ Q[22] ^ Q[23]; u64bit XH = Q[24] ^ Q[25] ^ Q[26] ^ Q[27] ^ Q[28] ^ Q[29] ^ Q[30] ^ Q[31]; XH ^= XL; H[ 0] = ((XH << 5) ^ (Q[16] >> 5) ^ M[0]) + (XL ^ Q[24] ^ Q[0]); H[ 1] = ((XH >> 7) ^ (Q[17] << 8) ^ M[1]) + (XL ^ Q[25] ^ Q[1]); H[ 2] = ((XH >> 5) ^ (Q[18] << 5) ^ M[2]) + (XL ^ Q[26] ^ Q[2]); H[ 3] = ((XH >> 1) ^ (Q[19] << 5) ^ M[3]) + (XL ^ Q[27] ^ Q[3]); H[ 4] = ((XH >> 3) ^ (Q[20] ) ^ M[4]) + (XL ^ Q[28] ^ Q[4]); H[ 5] = ((XH << 6) ^ (Q[21] >> 6) ^ M[5]) + (XL ^ Q[29] ^ Q[5]); H[ 6] = ((XH >> 4) ^ (Q[22] << 6) ^ M[6]) + (XL ^ Q[30] ^ Q[6]); H[ 7] = ((XH >> 11) ^ (Q[23] << 2) ^ M[7]) + (XL ^ Q[31] ^ Q[7]); H[ 8] = rotate_left(H[4], 9) + (XH ^ Q[24] ^ M[ 8]) + ((XL << 8) ^ Q[23] ^ Q[ 8]); H[ 9] = rotate_left(H[5], 10) + (XH ^ Q[25] ^ M[ 9]) + ((XL >> 6) ^ Q[16] ^ Q[ 9]); H[10] = rotate_left(H[6], 11) + (XH ^ Q[26] ^ M[10]) + ((XL << 6) ^ Q[17] ^ Q[10]); H[11] = rotate_left(H[7], 12) + (XH ^ Q[27] ^ M[11]) + ((XL << 4) ^ Q[18] ^ Q[11]); H[12] = rotate_left(H[0], 13) + (XH ^ Q[28] ^ M[12]) + ((XL >> 3) ^ Q[19] ^ Q[12]); H[13] = rotate_left(H[1], 14) + (XH ^ Q[29] ^ M[13]) + ((XL >> 4) ^ Q[20] ^ Q[13]); H[14] = rotate_left(H[2], 15) + (XH ^ Q[30] ^ M[14]) + ((XL >> 7) ^ Q[21] ^ Q[14]); H[15] = rotate_left(H[3], 16) + (XH ^ Q[31] ^ M[15]) + ((XL >> 2) ^ Q[22] ^ Q[15]); } } void BMW_512::compress_n(const byte input[], size_t blocks) { for(size_t i = 0; i != blocks; ++i) { load_le(&M[0], input, M.size()); BMW_512_compress(&H[0], &M[0], &Q[0]); input += hash_block_size(); } } /* * Copy out the digest */ void BMW_512::copy_out(byte output[]) { u64bit final[16] = { 0xAAAAAAAAAAAAAAA0, 0xAAAAAAAAAAAAAAA1, 0xAAAAAAAAAAAAAAA2, 0xAAAAAAAAAAAAAAA3, 0xAAAAAAAAAAAAAAA4, 0xAAAAAAAAAAAAAAA5, 0xAAAAAAAAAAAAAAA6, 0xAAAAAAAAAAAAAAA7, 0xAAAAAAAAAAAAAAA8, 0xAAAAAAAAAAAAAAA9, 0xAAAAAAAAAAAAAAAA, 0xAAAAAAAAAAAAAAAB, 0xAAAAAAAAAAAAAAAC, 0xAAAAAAAAAAAAAAAD, 0xAAAAAAAAAAAAAAAE, 0xAAAAAAAAAAAAAAAF }; BMW_512_compress(final, &H[0], &Q[0]); for(size_t i = 0; i != output_length(); i += 8) store_le(final[8 + i/8], output + i); } /* * Clear memory of sensitive data */ void BMW_512::clear() { MDx_HashFunction::clear(); zeroise(M); zeroise(Q); H[ 0] = 0x8081828384858687; H[ 1] = 0x88898A8B8C8D8E8F; H[ 2] = 0x9091929394959697; H[ 3] = 0x98999A9B9C9D9E9F; H[ 4] = 0xA0A1A2A3A4A5A6A7; H[ 5] = 0xA8A9AAABACADAEAF; H[ 6] = 0xB0B1B2B3B4B5B6B7; H[ 7] = 0xB8B9BABBBCBDBEBF; H[ 8] = 0xC0C1C2C3C4C5C6C7; H[ 9] = 0xC8C9CACBCCCDCECF; H[10] = 0xD0D1D2D3D4D5D6D7; H[11] = 0xD8D9DADBDCDDDEDF; H[12] = 0xE0E1E2E3E4E5E6E7; H[13] = 0xE8E9EAEBECEDEEEF; H[14] = 0xF0F1F2F3F4F5F6F7; H[15] = 0xF8F9FAFBFCFDFEFF; } } Botan-1.10.12/src/hash/bmw_512/bmw_512.h0000664000175000017500000000142412654331322017000 0ustar jackjack00000000000000/* * Blue Midnight Wish 512 (Round 2 tweaked) * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BMW_512_H__ #define BOTAN_BMW_512_H__ #include namespace Botan { /** * Blue Midnight Wish 512 (Round 2 tweaked version) */ class BOTAN_DLL BMW_512 : public MDx_HashFunction { public: std::string name() const { return "BMW512"; } size_t output_length() const { return 64; } HashFunction* clone() const { return new BMW_512; } void clear(); BMW_512() : MDx_HashFunction(128, false, true), H(16), M(16), Q(32) { clear(); } private: void compress_n(const byte input[], size_t blocks); void copy_out(byte output[]); SecureVector H, M, Q; }; } #endif Botan-1.10.12/src/hash/bmw_512/info.txt0000664000175000017500000000006012654331322017142 0ustar jackjack00000000000000define BMW_512 mdx_hash Botan-1.10.12/src/hash/comb4p/comb4p.cpp0000664000175000017500000000444112654331322017355 0ustar jackjack00000000000000/* * Comb4P hash combiner * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { void comb4p_round(MemoryRegion& out, const MemoryRegion& in, byte round_no, HashFunction* h1, HashFunction* h2) { h1->update(round_no); h2->update(round_no); h1->update(&in[0], in.size()); h2->update(&in[0], in.size()); SecureVector h_buf = h1->final(); xor_buf(&out[0], &h_buf[0], std::min(out.size(), h_buf.size())); h_buf = h2->final(); xor_buf(&out[0], &h_buf[0], std::min(out.size(), h_buf.size())); } } Comb4P::Comb4P(HashFunction* h1, HashFunction* h2) : hash1(h1), hash2(h2) { if(hash1->name() == hash2->name()) throw std::invalid_argument("Comb4P: Must use two distinct hashes"); if(hash1->output_length() != hash2->output_length()) throw std::invalid_argument("Comb4P: Incompatible hashes " + hash1->name() + " and " + hash2->name()); clear(); } size_t Comb4P::hash_block_size() const { if(hash1->hash_block_size() == hash2->hash_block_size()) return hash1->hash_block_size(); /* * Return LCM of the block sizes? This would probably be OK for * HMAC, which is the main thing relying on knowing the block size. */ return 0; } void Comb4P::clear() { hash1->clear(); hash2->clear(); // Prep for processing next message, if any hash1->update(0); hash2->update(0); } void Comb4P::add_data(const byte input[], size_t length) { hash1->update(input, length); hash2->update(input, length); } void Comb4P::final_result(byte out[]) { SecureVector h1 = hash1->final(); SecureVector h2 = hash2->final(); // First round xor_buf(&h1[0], &h2[0], std::min(h1.size(), h2.size())); // Second round comb4p_round(h2, h1, 1, hash1, hash2); // Third round comb4p_round(h1, h2, 2, hash1, hash2); copy_mem(out , &h1[0], h1.size()); copy_mem(out + h1.size(), &h2[0], h2.size()); // Prep for processing next message, if any hash1->update(0); hash2->update(0); } } Botan-1.10.12/src/hash/comb4p/comb4p.h0000664000175000017500000000223712654331322017023 0ustar jackjack00000000000000/* * Comb4P hash combiner * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_COMB4P_H__ #define BOTAN_COMB4P_H__ #include namespace Botan { /** * Combines two hash functions using a Feistel scheme. Described in * "On the Security of Hash Function Combiners", Anja Lehmann */ class BOTAN_DLL Comb4P : public HashFunction { public: /** * @param h1 the first hash * @param h2 the second hash */ Comb4P(HashFunction* h1, HashFunction* h2); ~Comb4P() { delete hash1; delete hash2; } size_t hash_block_size() const; size_t output_length() const { return hash1->output_length() + hash2->output_length(); } HashFunction* clone() const { return new Comb4P(hash1->clone(), hash2->clone()); } std::string name() const { return "Comb4P(" + hash1->name() + "," + hash2->name() + ")"; } void clear(); private: void add_data(const byte input[], size_t length); void final_result(byte out[]); HashFunction* hash1; HashFunction* hash2; }; } #endif Botan-1.10.12/src/hash/comb4p/info.txt0000664000175000017500000000001612654331322017153 0ustar jackjack00000000000000define COMB4P Botan-1.10.12/src/hash/gost_3411/gost_3411.cpp0000664000175000017500000002026512654331322020057 0ustar jackjack00000000000000/* * GOST 34.11 * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /** * GOST 34.11 Constructor */ GOST_34_11::GOST_34_11() : cipher(GOST_28147_89_Params("R3411_CryptoPro")), buffer(32), sum(32), hash(32) { count = 0; position = 0; } void GOST_34_11::clear() { cipher.clear(); zeroise(sum); zeroise(hash); count = 0; position = 0; } /** * Hash additional inputs */ void GOST_34_11::add_data(const byte input[], size_t length) { count += length; if(position) { buffer.copy(position, input, length); if(position + length >= hash_block_size()) { compress_n(&buffer[0], 1); input += (hash_block_size() - position); length -= (hash_block_size() - position); position = 0; } } const size_t full_blocks = length / hash_block_size(); const size_t remaining = length % hash_block_size(); if(full_blocks) compress_n(input, full_blocks); buffer.copy(position, input + full_blocks * hash_block_size(), remaining); position += remaining; } /** * The GOST 34.11 compression function */ void GOST_34_11::compress_n(const byte input[], size_t blocks) { for(size_t i = 0; i != blocks; ++i) { for(u16bit j = 0, carry = 0; j != 32; ++j) { u16bit s = sum[j] + input[32*i+j] + carry; carry = get_byte(0, s); sum[j] = get_byte(1, s); } byte S[32] = { 0 }; u64bit U[4], V[4]; load_be(U, &hash[0], 4); load_be(V, input + 32*i, 4); for(size_t j = 0; j != 4; ++j) { byte key[32] = { 0 }; // P transformation for(size_t k = 0; k != 4; ++k) for(size_t l = 0; l != 8; ++l) key[4*l+k] = get_byte(l, U[k]) ^ get_byte(l, V[k]); cipher.set_key(key, 32); cipher.encrypt(&hash[8*j], S + 8*j); if(j == 3) break; // A(x) u64bit A_U = U[0]; U[0] = U[1]; U[1] = U[2]; U[2] = U[3]; U[3] = U[0] ^ A_U; if(j == 1) // C_3 { U[0] ^= 0x00FF00FF00FF00FF; U[1] ^= 0xFF00FF00FF00FF00; U[2] ^= 0x00FFFF00FF0000FF; U[3] ^= 0xFF000000FFFF00FF; } // A(A(x)) u64bit AA_V_1 = V[0] ^ V[1]; u64bit AA_V_2 = V[1] ^ V[2]; V[0] = V[2]; V[1] = V[3]; V[2] = AA_V_1; V[3] = AA_V_2; } byte S2[32] = { 0 }; // 12 rounds of psi S2[ 0] = S[24]; S2[ 1] = S[25]; S2[ 2] = S[26]; S2[ 3] = S[27]; S2[ 4] = S[28]; S2[ 5] = S[29]; S2[ 6] = S[30]; S2[ 7] = S[31]; S2[ 8] = S[ 0] ^ S[ 2] ^ S[ 4] ^ S[ 6] ^ S[24] ^ S[30]; S2[ 9] = S[ 1] ^ S[ 3] ^ S[ 5] ^ S[ 7] ^ S[25] ^ S[31]; S2[10] = S[ 0] ^ S[ 8] ^ S[24] ^ S[26] ^ S[30]; S2[11] = S[ 1] ^ S[ 9] ^ S[25] ^ S[27] ^ S[31]; S2[12] = S[ 0] ^ S[ 4] ^ S[ 6] ^ S[10] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; S2[13] = S[ 1] ^ S[ 5] ^ S[ 7] ^ S[11] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; S2[14] = S[ 0] ^ S[ 4] ^ S[ 8] ^ S[12] ^ S[24] ^ S[26] ^ S[28]; S2[15] = S[ 1] ^ S[ 5] ^ S[ 9] ^ S[13] ^ S[25] ^ S[27] ^ S[29]; S2[16] = S[ 2] ^ S[ 6] ^ S[10] ^ S[14] ^ S[26] ^ S[28] ^ S[30]; S2[17] = S[ 3] ^ S[ 7] ^ S[11] ^ S[15] ^ S[27] ^ S[29] ^ S[31]; S2[18] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[ 8] ^ S[12] ^ S[16] ^ S[24] ^ S[28]; S2[19] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[ 9] ^ S[13] ^ S[17] ^ S[25] ^ S[29]; S2[20] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[10] ^ S[14] ^ S[18] ^ S[26] ^ S[30]; S2[21] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[11] ^ S[15] ^ S[19] ^ S[27] ^ S[31]; S2[22] = S[ 0] ^ S[ 2] ^ S[10] ^ S[12] ^ S[16] ^ S[20] ^ S[24] ^ S[28] ^ S[30]; S2[23] = S[ 1] ^ S[ 3] ^ S[11] ^ S[13] ^ S[17] ^ S[21] ^ S[25] ^ S[29] ^ S[31]; S2[24] = S[ 0] ^ S[ 6] ^ S[12] ^ S[14] ^ S[18] ^ S[22] ^ S[24] ^ S[26]; S2[25] = S[ 1] ^ S[ 7] ^ S[13] ^ S[15] ^ S[19] ^ S[23] ^ S[25] ^ S[27]; S2[26] = S[ 2] ^ S[ 8] ^ S[14] ^ S[16] ^ S[20] ^ S[24] ^ S[26] ^ S[28]; S2[27] = S[ 3] ^ S[ 9] ^ S[15] ^ S[17] ^ S[21] ^ S[25] ^ S[27] ^ S[29]; S2[28] = S[ 4] ^ S[10] ^ S[16] ^ S[18] ^ S[22] ^ S[26] ^ S[28] ^ S[30]; S2[29] = S[ 5] ^ S[11] ^ S[17] ^ S[19] ^ S[23] ^ S[27] ^ S[29] ^ S[31]; S2[30] = S[ 0] ^ S[ 2] ^ S[ 4] ^ S[12] ^ S[18] ^ S[20] ^ S[28]; S2[31] = S[ 1] ^ S[ 3] ^ S[ 5] ^ S[13] ^ S[19] ^ S[21] ^ S[29]; xor_buf(S, S2, input + 32*i, 32); S2[0] = S[0] ^ S[2] ^ S[4] ^ S[6] ^ S[24] ^ S[30]; S2[1] = S[1] ^ S[3] ^ S[5] ^ S[7] ^ S[25] ^ S[31]; copy_mem(S, S+2, 30); S[30] = S2[0]; S[31] = S2[1]; xor_buf(S, &hash[0], 32); // 61 rounds of psi S2[ 0] = S[ 2] ^ S[ 6] ^ S[14] ^ S[20] ^ S[22] ^ S[26] ^ S[28] ^ S[30]; S2[ 1] = S[ 3] ^ S[ 7] ^ S[15] ^ S[21] ^ S[23] ^ S[27] ^ S[29] ^ S[31]; S2[ 2] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[ 8] ^ S[16] ^ S[22] ^ S[28]; S2[ 3] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[ 9] ^ S[17] ^ S[23] ^ S[29]; S2[ 4] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[10] ^ S[18] ^ S[24] ^ S[30]; S2[ 5] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[11] ^ S[19] ^ S[25] ^ S[31]; S2[ 6] = S[ 0] ^ S[ 2] ^ S[10] ^ S[12] ^ S[20] ^ S[24] ^ S[26] ^ S[30]; S2[ 7] = S[ 1] ^ S[ 3] ^ S[11] ^ S[13] ^ S[21] ^ S[25] ^ S[27] ^ S[31]; S2[ 8] = S[ 0] ^ S[ 6] ^ S[12] ^ S[14] ^ S[22] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; S2[ 9] = S[ 1] ^ S[ 7] ^ S[13] ^ S[15] ^ S[23] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; S2[10] = S[ 0] ^ S[ 4] ^ S[ 6] ^ S[ 8] ^ S[14] ^ S[16] ^ S[26] ^ S[28]; S2[11] = S[ 1] ^ S[ 5] ^ S[ 7] ^ S[ 9] ^ S[15] ^ S[17] ^ S[27] ^ S[29]; S2[12] = S[ 2] ^ S[ 6] ^ S[ 8] ^ S[10] ^ S[16] ^ S[18] ^ S[28] ^ S[30]; S2[13] = S[ 3] ^ S[ 7] ^ S[ 9] ^ S[11] ^ S[17] ^ S[19] ^ S[29] ^ S[31]; S2[14] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[ 8] ^ S[10] ^ S[12] ^ S[18] ^ S[20] ^ S[24]; S2[15] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[ 9] ^ S[11] ^ S[13] ^ S[19] ^ S[21] ^ S[25]; S2[16] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[10] ^ S[12] ^ S[14] ^ S[20] ^ S[22] ^ S[26]; S2[17] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[11] ^ S[13] ^ S[15] ^ S[21] ^ S[23] ^ S[27]; S2[18] = S[ 4] ^ S[ 6] ^ S[10] ^ S[12] ^ S[14] ^ S[16] ^ S[22] ^ S[24] ^ S[28]; S2[19] = S[ 5] ^ S[ 7] ^ S[11] ^ S[13] ^ S[15] ^ S[17] ^ S[23] ^ S[25] ^ S[29]; S2[20] = S[ 6] ^ S[ 8] ^ S[12] ^ S[14] ^ S[16] ^ S[18] ^ S[24] ^ S[26] ^ S[30]; S2[21] = S[ 7] ^ S[ 9] ^ S[13] ^ S[15] ^ S[17] ^ S[19] ^ S[25] ^ S[27] ^ S[31]; S2[22] = S[ 0] ^ S[ 2] ^ S[ 4] ^ S[ 6] ^ S[ 8] ^ S[10] ^ S[14] ^ S[16] ^ S[18] ^ S[20] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; S2[23] = S[ 1] ^ S[ 3] ^ S[ 5] ^ S[ 7] ^ S[ 9] ^ S[11] ^ S[15] ^ S[17] ^ S[19] ^ S[21] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; S2[24] = S[ 0] ^ S[ 8] ^ S[10] ^ S[12] ^ S[16] ^ S[18] ^ S[20] ^ S[22] ^ S[24] ^ S[26] ^ S[28]; S2[25] = S[ 1] ^ S[ 9] ^ S[11] ^ S[13] ^ S[17] ^ S[19] ^ S[21] ^ S[23] ^ S[25] ^ S[27] ^ S[29]; S2[26] = S[ 2] ^ S[10] ^ S[12] ^ S[14] ^ S[18] ^ S[20] ^ S[22] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; S2[27] = S[ 3] ^ S[11] ^ S[13] ^ S[15] ^ S[19] ^ S[21] ^ S[23] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; S2[28] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[12] ^ S[14] ^ S[16] ^ S[20] ^ S[22] ^ S[26] ^ S[28]; S2[29] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[13] ^ S[15] ^ S[17] ^ S[21] ^ S[23] ^ S[27] ^ S[29]; S2[30] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[14] ^ S[16] ^ S[18] ^ S[22] ^ S[24] ^ S[28] ^ S[30]; S2[31] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[15] ^ S[17] ^ S[19] ^ S[23] ^ S[25] ^ S[29] ^ S[31]; hash.copy(S2, 32); } } /** * Produce the final GOST 34.11 output */ void GOST_34_11::final_result(byte out[]) { if(position) { clear_mem(&buffer[0] + position, buffer.size() - position); compress_n(&buffer[0], 1); } SecureVector length_buf(32); const u64bit bit_count = count * 8; store_le(bit_count, &length_buf[0]); SecureVector sum_buf = sum; compress_n(&length_buf[0], 1); compress_n(&sum_buf[0], 1); copy_mem(out, &hash[0], 32); clear(); } } Botan-1.10.12/src/hash/gost_3411/gost_3411.h0000664000175000017500000000153212654331322017520 0ustar jackjack00000000000000/* * GOST 34.11 * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_GOST_3411_H__ #define BOTAN_GOST_3411_H__ #include #include namespace Botan { /** * GOST 34.11 */ class BOTAN_DLL GOST_34_11 : public HashFunction { public: std::string name() const { return "GOST-R-34.11-94" ; } size_t output_length() const { return 32; } size_t hash_block_size() const { return 32; } HashFunction* clone() const { return new GOST_34_11; } void clear(); GOST_34_11(); private: void compress_n(const byte input[], size_t blocks); void add_data(const byte[], size_t); void final_result(byte[]); GOST_28147_89 cipher; SecureVector buffer, sum, hash; size_t position; u64bit count; }; } #endif Botan-1.10.12/src/hash/gost_3411/info.txt0000664000175000017500000000006512654331322017417 0ustar jackjack00000000000000define GOST_34_11 gost_28147 Botan-1.10.12/src/hash/has160/has160.cpp0000664000175000017500000001166712654331322017021 0ustar jackjack00000000000000/* * HAS-160 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace HAS_160_F { /* * HAS-160 F1 Function */ inline void F1(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg, u32bit rot) { E += rotate_left(A, rot) + (D ^ (B & (C ^ D))) + msg; B = rotate_left(B, 10); } /* * HAS-160 F2 Function */ inline void F2(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg, u32bit rot) { E += rotate_left(A, rot) + (B ^ C ^ D) + msg + 0x5A827999; B = rotate_left(B, 17); } /* * HAS-160 F3 Function */ inline void F3(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg, u32bit rot) { E += rotate_left(A, rot) + (C ^ (B | ~D)) + msg + 0x6ED9EBA1; B = rotate_left(B, 25); } /* * HAS-160 F4 Function */ inline void F4(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg, u32bit rot) { E += rotate_left(A, rot) + (B ^ C ^ D) + msg + 0x8F1BBCDC; B = rotate_left(B, 30); } } /* * HAS-160 Compression Function */ void HAS_160::compress_n(const byte input[], size_t blocks) { using namespace HAS_160_F; u32bit A = digest[0], B = digest[1], C = digest[2], D = digest[3], E = digest[4]; for(size_t i = 0; i != blocks; ++i) { load_le(&X[0], input, 16); X[16] = X[ 0] ^ X[ 1] ^ X[ 2] ^ X[ 3]; X[17] = X[ 4] ^ X[ 5] ^ X[ 6] ^ X[ 7]; X[18] = X[ 8] ^ X[ 9] ^ X[10] ^ X[11]; X[19] = X[12] ^ X[13] ^ X[14] ^ X[15]; F1(A,B,C,D,E,X[18], 5); F1(E,A,B,C,D,X[ 0],11); F1(D,E,A,B,C,X[ 1], 7); F1(C,D,E,A,B,X[ 2],15); F1(B,C,D,E,A,X[ 3], 6); F1(A,B,C,D,E,X[19],13); F1(E,A,B,C,D,X[ 4], 8); F1(D,E,A,B,C,X[ 5],14); F1(C,D,E,A,B,X[ 6], 7); F1(B,C,D,E,A,X[ 7],12); F1(A,B,C,D,E,X[16], 9); F1(E,A,B,C,D,X[ 8],11); F1(D,E,A,B,C,X[ 9], 8); F1(C,D,E,A,B,X[10],15); F1(B,C,D,E,A,X[11], 6); F1(A,B,C,D,E,X[17],12); F1(E,A,B,C,D,X[12], 9); F1(D,E,A,B,C,X[13],14); F1(C,D,E,A,B,X[14], 5); F1(B,C,D,E,A,X[15],13); X[16] = X[ 3] ^ X[ 6] ^ X[ 9] ^ X[12]; X[17] = X[ 2] ^ X[ 5] ^ X[ 8] ^ X[15]; X[18] = X[ 1] ^ X[ 4] ^ X[11] ^ X[14]; X[19] = X[ 0] ^ X[ 7] ^ X[10] ^ X[13]; F2(A,B,C,D,E,X[18], 5); F2(E,A,B,C,D,X[ 3],11); F2(D,E,A,B,C,X[ 6], 7); F2(C,D,E,A,B,X[ 9],15); F2(B,C,D,E,A,X[12], 6); F2(A,B,C,D,E,X[19],13); F2(E,A,B,C,D,X[15], 8); F2(D,E,A,B,C,X[ 2],14); F2(C,D,E,A,B,X[ 5], 7); F2(B,C,D,E,A,X[ 8],12); F2(A,B,C,D,E,X[16], 9); F2(E,A,B,C,D,X[11],11); F2(D,E,A,B,C,X[14], 8); F2(C,D,E,A,B,X[ 1],15); F2(B,C,D,E,A,X[ 4], 6); F2(A,B,C,D,E,X[17],12); F2(E,A,B,C,D,X[ 7], 9); F2(D,E,A,B,C,X[10],14); F2(C,D,E,A,B,X[13], 5); F2(B,C,D,E,A,X[ 0],13); X[16] = X[ 5] ^ X[ 7] ^ X[12] ^ X[14]; X[17] = X[ 0] ^ X[ 2] ^ X[ 9] ^ X[11]; X[18] = X[ 4] ^ X[ 6] ^ X[13] ^ X[15]; X[19] = X[ 1] ^ X[ 3] ^ X[ 8] ^ X[10]; F3(A,B,C,D,E,X[18], 5); F3(E,A,B,C,D,X[12],11); F3(D,E,A,B,C,X[ 5], 7); F3(C,D,E,A,B,X[14],15); F3(B,C,D,E,A,X[ 7], 6); F3(A,B,C,D,E,X[19],13); F3(E,A,B,C,D,X[ 0], 8); F3(D,E,A,B,C,X[ 9],14); F3(C,D,E,A,B,X[ 2], 7); F3(B,C,D,E,A,X[11],12); F3(A,B,C,D,E,X[16], 9); F3(E,A,B,C,D,X[ 4],11); F3(D,E,A,B,C,X[13], 8); F3(C,D,E,A,B,X[ 6],15); F3(B,C,D,E,A,X[15], 6); F3(A,B,C,D,E,X[17],12); F3(E,A,B,C,D,X[ 8], 9); F3(D,E,A,B,C,X[ 1],14); F3(C,D,E,A,B,X[10], 5); F3(B,C,D,E,A,X[ 3],13); X[16] = X[ 2] ^ X[ 7] ^ X[ 8] ^ X[13]; X[17] = X[ 3] ^ X[ 4] ^ X[ 9] ^ X[14]; X[18] = X[ 0] ^ X[ 5] ^ X[10] ^ X[15]; X[19] = X[ 1] ^ X[ 6] ^ X[11] ^ X[12]; F4(A,B,C,D,E,X[18], 5); F4(E,A,B,C,D,X[ 7],11); F4(D,E,A,B,C,X[ 2], 7); F4(C,D,E,A,B,X[13],15); F4(B,C,D,E,A,X[ 8], 6); F4(A,B,C,D,E,X[19],13); F4(E,A,B,C,D,X[ 3], 8); F4(D,E,A,B,C,X[14],14); F4(C,D,E,A,B,X[ 9], 7); F4(B,C,D,E,A,X[ 4],12); F4(A,B,C,D,E,X[16], 9); F4(E,A,B,C,D,X[15],11); F4(D,E,A,B,C,X[10], 8); F4(C,D,E,A,B,X[ 5],15); F4(B,C,D,E,A,X[ 0], 6); F4(A,B,C,D,E,X[17],12); F4(E,A,B,C,D,X[11], 9); F4(D,E,A,B,C,X[ 6],14); F4(C,D,E,A,B,X[ 1], 5); F4(B,C,D,E,A,X[12],13); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); E = (digest[4] += E); input += hash_block_size(); } } /* * Copy out the digest */ void HAS_160::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 4) store_le(digest[i/4], output + i); } /* * Clear memory of sensitive data */ void HAS_160::clear() { MDx_HashFunction::clear(); zeroise(X); digest[0] = 0x67452301; digest[1] = 0xEFCDAB89; digest[2] = 0x98BADCFE; digest[3] = 0x10325476; digest[4] = 0xC3D2E1F0; } } Botan-1.10.12/src/hash/has160/has160.h0000664000175000017500000000143512654331322016456 0ustar jackjack00000000000000/* * HAS-160 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_HAS_160_H__ #define BOTAN_HAS_160_H__ #include namespace Botan { /** * HAS-160, a Korean hash function standardized in * TTAS.KO-12.0011/R1. Used in conjuction with KCDSA */ class BOTAN_DLL HAS_160 : public MDx_HashFunction { public: std::string name() const { return "HAS-160"; } size_t output_length() const { return 20; } HashFunction* clone() const { return new HAS_160; } void clear(); HAS_160() : MDx_HashFunction(64, false, true), X(20), digest(5) { clear(); } private: void compress_n(const byte[], size_t blocks); void copy_out(byte[]); SecureVector X, digest; }; } #endif Botan-1.10.12/src/hash/has160/info.txt0000664000175000017500000000006012654331322016770 0ustar jackjack00000000000000define HAS_160 mdx_hash Botan-1.10.12/src/hash/hash.h0000664000175000017500000000141012654331322015366 0ustar jackjack00000000000000/* * Hash Function Base Class * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_HASH_FUNCTION_BASE_CLASS_H__ #define BOTAN_HASH_FUNCTION_BASE_CLASS_H__ #include #include #include namespace Botan { /** * This class represents hash function (message digest) objects */ class BOTAN_DLL HashFunction : public Buffered_Computation, public Algorithm { public: /** * Get a new object representing the same algorithm as *this */ virtual HashFunction* clone() const = 0; /** * The hash block size as defined for this algorithm */ virtual size_t hash_block_size() const { return 0; } }; } #endif Botan-1.10.12/src/hash/info.txt0000664000175000017500000000004112654331322015765 0ustar jackjack00000000000000 algo_base Botan-1.10.12/src/hash/keccak/info.txt0000664000175000017500000000005412654331322017212 0ustar jackjack00000000000000define KECCAK alloc Botan-1.10.12/src/hash/keccak/keccak.cpp0000664000175000017500000001312512654331322017446 0ustar jackjack00000000000000/* * Keccak * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { namespace { void keccak_f_1600(u64bit A[25]) { static const u64bit RC[24] = { 0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000, 0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009, 0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A, 0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A, 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 }; for(size_t i = 0; i != 24; ++i) { const u64bit C0 = A[0] ^ A[5] ^ A[10] ^ A[15] ^ A[20]; const u64bit C1 = A[1] ^ A[6] ^ A[11] ^ A[16] ^ A[21]; const u64bit C2 = A[2] ^ A[7] ^ A[12] ^ A[17] ^ A[22]; const u64bit C3 = A[3] ^ A[8] ^ A[13] ^ A[18] ^ A[23]; const u64bit C4 = A[4] ^ A[9] ^ A[14] ^ A[19] ^ A[24]; const u64bit D0 = rotate_left(C0, 1) ^ C3; const u64bit D1 = rotate_left(C1, 1) ^ C4; const u64bit D2 = rotate_left(C2, 1) ^ C0; const u64bit D3 = rotate_left(C3, 1) ^ C1; const u64bit D4 = rotate_left(C4, 1) ^ C2; const u64bit B00 = A[ 0] ^ D1; const u64bit B01 = rotate_left(A[ 6] ^ D2, 44); const u64bit B02 = rotate_left(A[12] ^ D3, 43); const u64bit B03 = rotate_left(A[18] ^ D4, 21); const u64bit B04 = rotate_left(A[24] ^ D0, 14); const u64bit B05 = rotate_left(A[ 3] ^ D4, 28); const u64bit B06 = rotate_left(A[ 9] ^ D0, 20); const u64bit B07 = rotate_left(A[10] ^ D1, 3); const u64bit B08 = rotate_left(A[16] ^ D2, 45); const u64bit B09 = rotate_left(A[22] ^ D3, 61); const u64bit B10 = rotate_left(A[ 1] ^ D2, 1); const u64bit B11 = rotate_left(A[ 7] ^ D3, 6); const u64bit B12 = rotate_left(A[13] ^ D4, 25); const u64bit B13 = rotate_left(A[19] ^ D0, 8); const u64bit B14 = rotate_left(A[20] ^ D1, 18); const u64bit B15 = rotate_left(A[ 4] ^ D0, 27); const u64bit B16 = rotate_left(A[ 5] ^ D1, 36); const u64bit B17 = rotate_left(A[11] ^ D2, 10); const u64bit B18 = rotate_left(A[17] ^ D3, 15); const u64bit B19 = rotate_left(A[23] ^ D4, 56); const u64bit B20 = rotate_left(A[ 2] ^ D3, 62); const u64bit B21 = rotate_left(A[ 8] ^ D4, 55); const u64bit B22 = rotate_left(A[14] ^ D0, 39); const u64bit B23 = rotate_left(A[15] ^ D1, 41); const u64bit B24 = rotate_left(A[21] ^ D2, 2); A[ 0] = B00 ^ (~B01 & B02); A[ 1] = B01 ^ (~B02 & B03); A[ 2] = B02 ^ (~B03 & B04); A[ 3] = B03 ^ (~B04 & B00); A[ 4] = B04 ^ (~B00 & B01); A[ 5] = B05 ^ (~B06 & B07); A[ 6] = B06 ^ (~B07 & B08); A[ 7] = B07 ^ (~B08 & B09); A[ 8] = B08 ^ (~B09 & B05); A[ 9] = B09 ^ (~B05 & B06); A[10] = B10 ^ (~B11 & B12); A[11] = B11 ^ (~B12 & B13); A[12] = B12 ^ (~B13 & B14); A[13] = B13 ^ (~B14 & B10); A[14] = B14 ^ (~B10 & B11); A[15] = B15 ^ (~B16 & B17); A[16] = B16 ^ (~B17 & B18); A[17] = B17 ^ (~B18 & B19); A[18] = B18 ^ (~B19 & B15); A[19] = B19 ^ (~B15 & B16); A[20] = B20 ^ (~B21 & B22); A[21] = B21 ^ (~B22 & B23); A[22] = B22 ^ (~B23 & B24); A[23] = B23 ^ (~B24 & B20); A[24] = B24 ^ (~B20 & B21); A[0] ^= RC[i]; } } } Keccak_1600::Keccak_1600(size_t output_bits) : output_bits(output_bits), bitrate(1600 - 2*output_bits), S(25), S_pos(0) { // We only support the parameters for the SHA-3 proposal if(output_bits != 224 && output_bits != 256 && output_bits != 384 && output_bits != 512) throw Invalid_Argument("Keccak_1600: Invalid output length " + to_string(output_bits)); } std::string Keccak_1600::name() const { return "Keccak-1600(" + to_string(output_bits) + ")"; } HashFunction* Keccak_1600::clone() const { return new Keccak_1600(output_bits); } void Keccak_1600::clear() { zeroise(S); S_pos = 0; } void Keccak_1600::add_data(const byte input[], size_t length) { if(length == 0) return; while(length) { size_t to_take = std::min(length, bitrate / 8 - S_pos); length -= to_take; while(to_take && S_pos % 8) { S[S_pos / 8] ^= static_cast(input[0]) << (8 * (S_pos % 8)); ++S_pos; ++input; --to_take; } while(to_take && to_take % 8 == 0) { S[S_pos / 8] ^= load_le(input, 0); S_pos += 8; input += 8; to_take -= 8; } while(to_take) { S[S_pos / 8] ^= static_cast(input[0]) << (8 * (S_pos % 8)); ++S_pos; ++input; --to_take; } if(S_pos == bitrate / 8) { keccak_f_1600(&S[0]); S_pos = 0; } } } void Keccak_1600::final_result(byte output[]) { MemoryVector padding(bitrate / 8 - S_pos); padding[0] = 0x01; padding[padding.size()-1] |= 0x80; add_data(padding, padding.size()); /* * We never have to run the permutation again because we only support * limited output lengths */ for(size_t i = 0; i != output_bits/8; ++i) output[i] = get_byte(7 - (i % 8), S[i/8]); clear(); } } Botan-1.10.12/src/hash/keccak/keccak.h0000664000175000017500000000165712654331322017122 0ustar jackjack00000000000000/* * Keccak * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_KECCAK_H__ #define BOTAN_KECCAK_H__ #include #include #include namespace Botan { /** * Keccak[1600], a SHA-3 candidate */ class BOTAN_DLL Keccak_1600 : public HashFunction { public: /** * @param output_bits the size of the hash output; must be one of * 224, 256, 384, or 512 */ Keccak_1600(size_t output_bits = 512); size_t hash_block_size() const { return bitrate / 8; } size_t output_length() const { return output_bits / 8; } HashFunction* clone() const; std::string name() const; void clear(); private: void add_data(const byte input[], size_t length); void final_result(byte out[]); size_t output_bits, bitrate; SecureVector S; size_t S_pos; }; } #endif Botan-1.10.12/src/hash/md2/info.txt0000664000175000017500000000001312654331322016446 0ustar jackjack00000000000000define MD2 Botan-1.10.12/src/hash/md2/md2.cpp0000664000175000017500000000674112654331322016156 0ustar jackjack00000000000000/* * MD2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /** * MD2 Compression Function */ void MD2::hash(const byte input[]) { static const byte SBOX[256] = { 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21, 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F, 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A, 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14 }; X.copy(16, input, hash_block_size()); xor_buf(&X[32], &X[0], &X[16], hash_block_size()); byte T = 0; for(size_t i = 0; i != 18; ++i) { for(size_t k = 0; k != 48; k += 8) { T = X[k ] ^= SBOX[T]; T = X[k+1] ^= SBOX[T]; T = X[k+2] ^= SBOX[T]; T = X[k+3] ^= SBOX[T]; T = X[k+4] ^= SBOX[T]; T = X[k+5] ^= SBOX[T]; T = X[k+6] ^= SBOX[T]; T = X[k+7] ^= SBOX[T]; } T += static_cast(i); } T = checksum[15]; for(size_t i = 0; i != hash_block_size(); ++i) T = checksum[i] ^= SBOX[input[i] ^ T]; } /** * Update the hash */ void MD2::add_data(const byte input[], size_t length) { buffer.copy(position, input, length); if(position + length >= hash_block_size()) { hash(&buffer[0]); input += (hash_block_size() - position); length -= (hash_block_size() - position); while(length >= hash_block_size()) { hash(input); input += hash_block_size(); length -= hash_block_size(); } buffer.copy(input, length); position = 0; } position += length; } /** * Finalize a MD2 Hash */ void MD2::final_result(byte output[]) { for(size_t i = position; i != hash_block_size(); ++i) buffer[i] = static_cast(hash_block_size() - position); hash(&buffer[0]); hash(&checksum[0]); copy_mem(output, &X[0], output_length()); clear(); } /** * Clear memory of sensitive data */ void MD2::clear() { zeroise(X); zeroise(checksum); zeroise(buffer); position = 0; } } Botan-1.10.12/src/hash/md2/md2.h0000664000175000017500000000136212654331322015615 0ustar jackjack00000000000000/* * MD2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MD2_H__ #define BOTAN_MD2_H__ #include namespace Botan { /** * MD2 */ class BOTAN_DLL MD2 : public HashFunction { public: std::string name() const { return "MD2"; } size_t output_length() const { return 16; } size_t hash_block_size() const { return 16; } HashFunction* clone() const { return new MD2; } void clear(); MD2() : X(48), checksum(16), buffer(16) { clear(); } private: void add_data(const byte[], size_t); void hash(const byte[]); void final_result(byte[]); SecureVector X, checksum, buffer; size_t position; }; } #endif Botan-1.10.12/src/hash/md4/info.txt0000664000175000017500000000005412654331322016455 0ustar jackjack00000000000000define MD4 mdx_hash Botan-1.10.12/src/hash/md4/md4.cpp0000664000175000017500000000534512654331322016161 0ustar jackjack00000000000000/* * MD4 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * MD4 FF Function */ inline void FF(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit M, byte S) { A += (D ^ (B & (C ^ D))) + M; A = rotate_left(A, S); } /* * MD4 GG Function */ inline void GG(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit M, byte S) { A += ((B & C) | (D & (B | C))) + M + 0x5A827999; A = rotate_left(A, S); } /* * MD4 HH Function */ inline void HH(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit M, byte S) { A += (B ^ C ^ D) + M + 0x6ED9EBA1; A = rotate_left(A, S); } } /* * MD4 Compression Function */ void MD4::compress_n(const byte input[], size_t blocks) { u32bit A = digest[0], B = digest[1], C = digest[2], D = digest[3]; for(size_t i = 0; i != blocks; ++i) { load_le(&M[0], input, M.size()); FF(A,B,C,D,M[ 0], 3); FF(D,A,B,C,M[ 1], 7); FF(C,D,A,B,M[ 2],11); FF(B,C,D,A,M[ 3],19); FF(A,B,C,D,M[ 4], 3); FF(D,A,B,C,M[ 5], 7); FF(C,D,A,B,M[ 6],11); FF(B,C,D,A,M[ 7],19); FF(A,B,C,D,M[ 8], 3); FF(D,A,B,C,M[ 9], 7); FF(C,D,A,B,M[10],11); FF(B,C,D,A,M[11],19); FF(A,B,C,D,M[12], 3); FF(D,A,B,C,M[13], 7); FF(C,D,A,B,M[14],11); FF(B,C,D,A,M[15],19); GG(A,B,C,D,M[ 0], 3); GG(D,A,B,C,M[ 4], 5); GG(C,D,A,B,M[ 8], 9); GG(B,C,D,A,M[12],13); GG(A,B,C,D,M[ 1], 3); GG(D,A,B,C,M[ 5], 5); GG(C,D,A,B,M[ 9], 9); GG(B,C,D,A,M[13],13); GG(A,B,C,D,M[ 2], 3); GG(D,A,B,C,M[ 6], 5); GG(C,D,A,B,M[10], 9); GG(B,C,D,A,M[14],13); GG(A,B,C,D,M[ 3], 3); GG(D,A,B,C,M[ 7], 5); GG(C,D,A,B,M[11], 9); GG(B,C,D,A,M[15],13); HH(A,B,C,D,M[ 0], 3); HH(D,A,B,C,M[ 8], 9); HH(C,D,A,B,M[ 4],11); HH(B,C,D,A,M[12],15); HH(A,B,C,D,M[ 2], 3); HH(D,A,B,C,M[10], 9); HH(C,D,A,B,M[ 6],11); HH(B,C,D,A,M[14],15); HH(A,B,C,D,M[ 1], 3); HH(D,A,B,C,M[ 9], 9); HH(C,D,A,B,M[ 5],11); HH(B,C,D,A,M[13],15); HH(A,B,C,D,M[ 3], 3); HH(D,A,B,C,M[11], 9); HH(C,D,A,B,M[ 7],11); HH(B,C,D,A,M[15],15); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); input += hash_block_size(); } } /* * Copy out the digest */ void MD4::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 4) store_le(digest[i/4], output + i); } /* * Clear memory of sensitive data */ void MD4::clear() { MDx_HashFunction::clear(); zeroise(M); digest[0] = 0x67452301; digest[1] = 0xEFCDAB89; digest[2] = 0x98BADCFE; digest[3] = 0x10325476; } } Botan-1.10.12/src/hash/md4/md4.h0000664000175000017500000000156112654331322015622 0ustar jackjack00000000000000/* * MD4 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MD4_H__ #define BOTAN_MD4_H__ #include namespace Botan { /** * MD4 */ class BOTAN_DLL MD4 : public MDx_HashFunction { public: std::string name() const { return "MD4"; } size_t output_length() const { return 16; } HashFunction* clone() const { return new MD4; } void clear(); MD4() : MDx_HashFunction(64, false, true), M(16), digest(4) { clear(); } protected: void compress_n(const byte input[], size_t blocks); void copy_out(byte[]); /** * The message buffer, exposed for use by subclasses (x86 asm) */ SecureVector M; /** * The digest value, exposed for use by subclasses (x86 asm) */ SecureVector digest; }; } #endif Botan-1.10.12/src/hash/md4_x86_32/info.txt0000664000175000017500000000014012654331322017462 0ustar jackjack00000000000000define MD4_X86_32 load_on asm_ok x86_32 asm_x86_32 md4 Botan-1.10.12/src/hash/md4_x86_32/md4_x86_32.cpp0000664000175000017500000000132312654331322020173 0ustar jackjack00000000000000/* * MD4 (x86-32) * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /** * MD4 compression function in x86-32 asm * @param digest the current digest * @param input the input block * @param M the message buffer */ extern "C" void botan_md4_x86_32_compress(u32bit digest[4], const byte input[64], u32bit M[16]); /* * MD4 Compression Function */ void MD4_X86_32::compress_n(const byte input[], size_t blocks) { for(size_t i = 0; i != blocks; ++i) { botan_md4_x86_32_compress(digest, input, M); input += hash_block_size(); } } } Botan-1.10.12/src/hash/md4_x86_32/md4_x86_32.h0000664000175000017500000000066212654331322017645 0ustar jackjack00000000000000/* * MD4 (x86-32) * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MD4_X86_32_H__ #define BOTAN_MD4_X86_32_H__ #include namespace Botan { /** * MD4 using x86 assembly */ class BOTAN_DLL MD4_X86_32 : public MD4 { public: HashFunction* clone() const { return new MD4_X86_32; } private: void compress_n(const byte[], size_t blocks); }; } #endif Botan-1.10.12/src/hash/md4_x86_32/md4_x86_32_imp.S0000664000175000017500000000720612654331322020466 0ustar jackjack00000000000000/* * MD4 in x86-32 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include START_LISTING(md4_x86_32_imp.S) START_FUNCTION(botan_md4_x86_32_compress) SPILL_REGS() #define PUSHED 4 ASSIGN(EBP, ARG(2)) /* input block */ ASSIGN(EDI, ARG(3)) /* expanded words */ ZEROIZE(ESI) START_LOOP(.LOAD_INPUT) ADD_IMM(ESI, 4) ASSIGN(EAX, ARRAY4(EBP, 0)) ASSIGN(EBX, ARRAY4(EBP, 1)) ASSIGN(ECX, ARRAY4(EBP, 2)) ASSIGN(EDX, ARRAY4(EBP, 3)) ADD_IMM(EBP, 16) ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-4), EAX) ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-3), EBX) ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-2), ECX) ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-1), EDX) LOOP_UNTIL_EQ(ESI, 16, .LOAD_INPUT) ASSIGN(EBP, ARG(1)) ASSIGN(EAX, ARRAY4(EBP, 0)) ASSIGN(EBX, ARRAY4(EBP, 1)) ASSIGN(ECX, ARRAY4(EBP, 2)) ASSIGN(EDX, ARRAY4(EBP, 3)) #define MSG EDI #define T1 ESI #define T2 EBP #define FF(A, B, C, D, N, S) \ ASSIGN(T1, ARRAY4(MSG, N)) ; \ ASSIGN(T2, C) ; \ XOR(T2, D) ; \ AND(T2, B) ; \ XOR(T2, D) ; \ ADD(A, T1) ; \ ADD(A, T2) ; \ ROTL_IMM(A, S) ; #define GG(A, B, C, D, N, S) \ ASSIGN(T1, ARRAY4(MSG, N)) ; \ ASSIGN(T2, B) ; \ OR(T2, C) ; \ AND(T2, D) ; \ ADD3_IMM(A, T1, 0x5A827999) ; \ ASSIGN(T1, B) ; \ AND(T1, C) ; \ OR(T2, T1) ; \ ADD(A, T2) ; \ ROTL_IMM(A, S) ; #define HH(A, B, C, D, N, S) \ ASSIGN(T1, ARRAY4(MSG, N)) ; \ ASSIGN(T2, B) ; \ XOR(T2, C) ; \ XOR(T2, D) ; \ ADD3_IMM(A, T1, 0x6ED9EBA1) ; \ ADD(A, T2) ; \ ROTL_IMM(A, S) ; FF(EAX,EBX,ECX,EDX, 0, 3); FF(EDX,EAX,EBX,ECX, 1, 7); FF(ECX,EDX,EAX,EBX, 2,11); FF(EBX,ECX,EDX,EAX, 3,19); FF(EAX,EBX,ECX,EDX, 4, 3); FF(EDX,EAX,EBX,ECX, 5, 7); FF(ECX,EDX,EAX,EBX, 6,11); FF(EBX,ECX,EDX,EAX, 7,19); FF(EAX,EBX,ECX,EDX, 8, 3); FF(EDX,EAX,EBX,ECX, 9, 7); FF(ECX,EDX,EAX,EBX,10,11); FF(EBX,ECX,EDX,EAX,11,19); FF(EAX,EBX,ECX,EDX,12, 3); FF(EDX,EAX,EBX,ECX,13, 7); FF(ECX,EDX,EAX,EBX,14,11); FF(EBX,ECX,EDX,EAX,15,19); GG(EAX,EBX,ECX,EDX, 0, 3); GG(EDX,EAX,EBX,ECX, 4, 5); GG(ECX,EDX,EAX,EBX, 8, 9); GG(EBX,ECX,EDX,EAX,12,13); GG(EAX,EBX,ECX,EDX, 1, 3); GG(EDX,EAX,EBX,ECX, 5, 5); GG(ECX,EDX,EAX,EBX, 9, 9); GG(EBX,ECX,EDX,EAX,13,13); GG(EAX,EBX,ECX,EDX, 2, 3); GG(EDX,EAX,EBX,ECX, 6, 5); GG(ECX,EDX,EAX,EBX,10, 9); GG(EBX,ECX,EDX,EAX,14,13); GG(EAX,EBX,ECX,EDX, 3, 3); GG(EDX,EAX,EBX,ECX, 7, 5); GG(ECX,EDX,EAX,EBX,11, 9); GG(EBX,ECX,EDX,EAX,15,13); HH(EAX,EBX,ECX,EDX, 0, 3); HH(EDX,EAX,EBX,ECX, 8, 9); HH(ECX,EDX,EAX,EBX, 4,11); HH(EBX,ECX,EDX,EAX,12,15); HH(EAX,EBX,ECX,EDX, 2, 3); HH(EDX,EAX,EBX,ECX,10, 9); HH(ECX,EDX,EAX,EBX, 6,11); HH(EBX,ECX,EDX,EAX,14,15); HH(EAX,EBX,ECX,EDX, 1, 3); HH(EDX,EAX,EBX,ECX, 9, 9); HH(ECX,EDX,EAX,EBX, 5,11); HH(EBX,ECX,EDX,EAX,13,15); HH(EAX,EBX,ECX,EDX, 3, 3); HH(EDX,EAX,EBX,ECX,11, 9); HH(ECX,EDX,EAX,EBX, 7,11); HH(EBX,ECX,EDX,EAX,15,15); ASSIGN(EBP, ARG(1)) ADD(ARRAY4(EBP, 0), EAX) ADD(ARRAY4(EBP, 1), EBX) ADD(ARRAY4(EBP, 2), ECX) ADD(ARRAY4(EBP, 3), EDX) RESTORE_REGS() END_FUNCTION(botan_md4_x86_32_compress) Botan-1.10.12/src/hash/md5/info.txt0000664000175000017500000000005412654331322016456 0ustar jackjack00000000000000define MD5 mdx_hash Botan-1.10.12/src/hash/md5/md5.cpp0000664000175000017500000001017612654331322016161 0ustar jackjack00000000000000/* * MD5 * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * MD5 FF Function */ inline void FF(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, byte S, u32bit magic) { A += (D ^ (B & (C ^ D))) + msg + magic; A = rotate_left(A, S) + B; } /* * MD5 GG Function */ inline void GG(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, byte S, u32bit magic) { A += (C ^ (D & (B ^ C))) + msg + magic; A = rotate_left(A, S) + B; } /* * MD5 HH Function */ inline void HH(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, byte S, u32bit magic) { A += (B ^ C ^ D) + msg + magic; A = rotate_left(A, S) + B; } /* * MD5 II Function */ inline void II(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, byte S, u32bit magic) { A += (C ^ (B | ~D)) + msg + magic; A = rotate_left(A, S) + B; } } /* * MD5 Compression Function */ void MD5::compress_n(const byte input[], size_t blocks) { u32bit A = digest[0], B = digest[1], C = digest[2], D = digest[3]; for(size_t i = 0; i != blocks; ++i) { load_le(&M[0], input, M.size()); FF(A,B,C,D,M[ 0], 7,0xD76AA478); FF(D,A,B,C,M[ 1],12,0xE8C7B756); FF(C,D,A,B,M[ 2],17,0x242070DB); FF(B,C,D,A,M[ 3],22,0xC1BDCEEE); FF(A,B,C,D,M[ 4], 7,0xF57C0FAF); FF(D,A,B,C,M[ 5],12,0x4787C62A); FF(C,D,A,B,M[ 6],17,0xA8304613); FF(B,C,D,A,M[ 7],22,0xFD469501); FF(A,B,C,D,M[ 8], 7,0x698098D8); FF(D,A,B,C,M[ 9],12,0x8B44F7AF); FF(C,D,A,B,M[10],17,0xFFFF5BB1); FF(B,C,D,A,M[11],22,0x895CD7BE); FF(A,B,C,D,M[12], 7,0x6B901122); FF(D,A,B,C,M[13],12,0xFD987193); FF(C,D,A,B,M[14],17,0xA679438E); FF(B,C,D,A,M[15],22,0x49B40821); GG(A,B,C,D,M[ 1], 5,0xF61E2562); GG(D,A,B,C,M[ 6], 9,0xC040B340); GG(C,D,A,B,M[11],14,0x265E5A51); GG(B,C,D,A,M[ 0],20,0xE9B6C7AA); GG(A,B,C,D,M[ 5], 5,0xD62F105D); GG(D,A,B,C,M[10], 9,0x02441453); GG(C,D,A,B,M[15],14,0xD8A1E681); GG(B,C,D,A,M[ 4],20,0xE7D3FBC8); GG(A,B,C,D,M[ 9], 5,0x21E1CDE6); GG(D,A,B,C,M[14], 9,0xC33707D6); GG(C,D,A,B,M[ 3],14,0xF4D50D87); GG(B,C,D,A,M[ 8],20,0x455A14ED); GG(A,B,C,D,M[13], 5,0xA9E3E905); GG(D,A,B,C,M[ 2], 9,0xFCEFA3F8); GG(C,D,A,B,M[ 7],14,0x676F02D9); GG(B,C,D,A,M[12],20,0x8D2A4C8A); HH(A,B,C,D,M[ 5], 4,0xFFFA3942); HH(D,A,B,C,M[ 8],11,0x8771F681); HH(C,D,A,B,M[11],16,0x6D9D6122); HH(B,C,D,A,M[14],23,0xFDE5380C); HH(A,B,C,D,M[ 1], 4,0xA4BEEA44); HH(D,A,B,C,M[ 4],11,0x4BDECFA9); HH(C,D,A,B,M[ 7],16,0xF6BB4B60); HH(B,C,D,A,M[10],23,0xBEBFBC70); HH(A,B,C,D,M[13], 4,0x289B7EC6); HH(D,A,B,C,M[ 0],11,0xEAA127FA); HH(C,D,A,B,M[ 3],16,0xD4EF3085); HH(B,C,D,A,M[ 6],23,0x04881D05); HH(A,B,C,D,M[ 9], 4,0xD9D4D039); HH(D,A,B,C,M[12],11,0xE6DB99E5); HH(C,D,A,B,M[15],16,0x1FA27CF8); HH(B,C,D,A,M[ 2],23,0xC4AC5665); II(A,B,C,D,M[ 0], 6,0xF4292244); II(D,A,B,C,M[ 7],10,0x432AFF97); II(C,D,A,B,M[14],15,0xAB9423A7); II(B,C,D,A,M[ 5],21,0xFC93A039); II(A,B,C,D,M[12], 6,0x655B59C3); II(D,A,B,C,M[ 3],10,0x8F0CCC92); II(C,D,A,B,M[10],15,0xFFEFF47D); II(B,C,D,A,M[ 1],21,0x85845DD1); II(A,B,C,D,M[ 8], 6,0x6FA87E4F); II(D,A,B,C,M[15],10,0xFE2CE6E0); II(C,D,A,B,M[ 6],15,0xA3014314); II(B,C,D,A,M[13],21,0x4E0811A1); II(A,B,C,D,M[ 4], 6,0xF7537E82); II(D,A,B,C,M[11],10,0xBD3AF235); II(C,D,A,B,M[ 2],15,0x2AD7D2BB); II(B,C,D,A,M[ 9],21,0xEB86D391); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); input += hash_block_size(); } } /* * Copy out the digest */ void MD5::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 4) store_le(digest[i/4], output + i); } /* * Clear memory of sensitive data */ void MD5::clear() { MDx_HashFunction::clear(); zeroise(M); digest[0] = 0x67452301; digest[1] = 0xEFCDAB89; digest[2] = 0x98BADCFE; digest[3] = 0x10325476; } } Botan-1.10.12/src/hash/md5/md5.h0000664000175000017500000000155312654331322015625 0ustar jackjack00000000000000/* * MD5 * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MD5_H__ #define BOTAN_MD5_H__ #include namespace Botan { /** * MD5 */ class BOTAN_DLL MD5 : public MDx_HashFunction { public: std::string name() const { return "MD5"; } size_t output_length() const { return 16; } HashFunction* clone() const { return new MD5; } void clear(); MD5() : MDx_HashFunction(64, false, true), M(16), digest(4) { clear(); } protected: void compress_n(const byte[], size_t blocks); void copy_out(byte[]); /** * The message buffer, exposed for use by subclasses (x86 asm) */ SecureVector M; /** * The digest value, exposed for use by subclasses (x86 asm) */ SecureVector digest; }; } #endif Botan-1.10.12/src/hash/md5_x86_32/info.txt0000664000175000017500000000014012654331322017463 0ustar jackjack00000000000000define MD5_X86_32 load_on asm_ok x86_32 asm_x86_32 md5 Botan-1.10.12/src/hash/md5_x86_32/md5_x86_32.cpp0000664000175000017500000000076412654331322020205 0ustar jackjack00000000000000/* * MD5 (x86-32) * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { namespace { extern "C" void botan_md5_x86_32_compress(u32bit[4], const byte[64], u32bit[16]); } /* * MD5 Compression Function */ void MD5_X86_32::compress_n(const byte input[], size_t blocks) { for(size_t i = 0; i != blocks; ++i) { botan_md5_x86_32_compress(digest, input, M); input += hash_block_size(); } } } Botan-1.10.12/src/hash/md5_x86_32/md5_x86_32.h0000664000175000017500000000065712654331322017653 0ustar jackjack00000000000000/* * MD5 (x86-32) * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MD5_X86_32_H__ #define BOTAN_MD5_X86_32_H__ #include namespace Botan { /** * MD5 in x86 assembly */ class BOTAN_DLL MD5_X86_32 : public MD5 { public: HashFunction* clone() const { return new MD5_X86_32; } private: void compress_n(const byte[], size_t blocks); }; } #endif Botan-1.10.12/src/hash/md5_x86_32/md5_x86_32_imp.S0000664000175000017500000001233212654331322020464 0ustar jackjack00000000000000/* * MD5 in x86-32 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include START_LISTING(md5_x86_32.S) START_FUNCTION(botan_md5_x86_32_compress) SPILL_REGS() #define PUSHED 4 ASSIGN(EBP, ARG(2)) /* input block */ ASSIGN(EDI, ARG(3)) /* expanded words */ ZEROIZE(ESI) START_LOOP(.LOAD_INPUT) ADD_IMM(ESI, 4) ASSIGN(EAX, ARRAY4(EBP, 0)) ASSIGN(EBX, ARRAY4(EBP, 1)) ASSIGN(ECX, ARRAY4(EBP, 2)) ASSIGN(EDX, ARRAY4(EBP, 3)) ADD_IMM(EBP, 16) ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-4), EAX) ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-3), EBX) ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-2), ECX) ASSIGN(ARRAY4_INDIRECT(EDI,ESI,-1), EDX) LOOP_UNTIL_EQ(ESI, 16, .LOAD_INPUT) ASSIGN(EBP, ARG(1)) ASSIGN(EAX, ARRAY4(EBP, 0)) ASSIGN(EBX, ARRAY4(EBP, 1)) ASSIGN(ECX, ARRAY4(EBP, 2)) ASSIGN(EDX, ARRAY4(EBP, 3)) #define MSG EDI #define T1 ESI #define T2 EBP #define FF(A, B, C, D, N, S, MAGIC) \ ASSIGN(T1, ARRAY4(MSG, N)) ; \ ASSIGN(T2, C) ; \ XOR(T2, D) ; \ AND(T2, B) ; \ XOR(T2, D) ; \ ADD3_IMM(A, T1, MAGIC) ; \ ADD(A, T2) ; \ ROTL_IMM(A, S) ; \ ADD(A, B) ; #define GG(A, B, C, D, N, S, MAGIC) \ ASSIGN(T1, ARRAY4(MSG, N)) ; \ ASSIGN(T2, B) ; \ XOR(T2, C) ; \ AND(T2, D) ; \ XOR(T2, C) ; \ ADD3_IMM(A, T1, MAGIC) ; \ ADD(A, T2) ; \ ROTL_IMM(A, S) ; \ ADD(A, B) ; #define HH(A, B, C, D, N, S, MAGIC) \ ASSIGN(T1, ARRAY4(MSG, N)) ; \ ASSIGN(T2, B) ; \ XOR(T2, C) ; \ XOR(T2, D) ; \ ADD3_IMM(A, T1, MAGIC) ; \ ADD(A, T2) ; \ ROTL_IMM(A, S) ; \ ADD(A, B) ; #define II(A, B, C, D, N, S, MAGIC) \ ASSIGN(T1, ARRAY4(MSG, N)) ; \ ASSIGN(T2, D) ; \ NOT(T2) ; \ OR(T2, B) ; \ XOR(T2, C) ; \ ADD3_IMM(A, T1, MAGIC) ; \ ADD(A, T2) ; \ ROTL_IMM(A, S) ; \ ADD(A, B) ; FF(EAX,EBX,ECX,EDX, 0, 7,0xD76AA478); FF(EDX,EAX,EBX,ECX, 1,12,0xE8C7B756); FF(ECX,EDX,EAX,EBX, 2,17,0x242070DB); FF(EBX,ECX,EDX,EAX, 3,22,0xC1BDCEEE); FF(EAX,EBX,ECX,EDX, 4, 7,0xF57C0FAF); FF(EDX,EAX,EBX,ECX, 5,12,0x4787C62A); FF(ECX,EDX,EAX,EBX, 6,17,0xA8304613); FF(EBX,ECX,EDX,EAX, 7,22,0xFD469501); FF(EAX,EBX,ECX,EDX, 8, 7,0x698098D8); FF(EDX,EAX,EBX,ECX, 9,12,0x8B44F7AF); FF(ECX,EDX,EAX,EBX,10,17,0xFFFF5BB1); FF(EBX,ECX,EDX,EAX,11,22,0x895CD7BE); FF(EAX,EBX,ECX,EDX,12, 7,0x6B901122); FF(EDX,EAX,EBX,ECX,13,12,0xFD987193); FF(ECX,EDX,EAX,EBX,14,17,0xA679438E); FF(EBX,ECX,EDX,EAX,15,22,0x49B40821); GG(EAX,EBX,ECX,EDX, 1, 5,0xF61E2562); GG(EDX,EAX,EBX,ECX, 6, 9,0xC040B340); GG(ECX,EDX,EAX,EBX,11,14,0x265E5A51); GG(EBX,ECX,EDX,EAX, 0,20,0xE9B6C7AA); GG(EAX,EBX,ECX,EDX, 5, 5,0xD62F105D); GG(EDX,EAX,EBX,ECX,10, 9,0x02441453); GG(ECX,EDX,EAX,EBX,15,14,0xD8A1E681); GG(EBX,ECX,EDX,EAX, 4,20,0xE7D3FBC8); GG(EAX,EBX,ECX,EDX, 9, 5,0x21E1CDE6); GG(EDX,EAX,EBX,ECX,14, 9,0xC33707D6); GG(ECX,EDX,EAX,EBX, 3,14,0xF4D50D87); GG(EBX,ECX,EDX,EAX, 8,20,0x455A14ED); GG(EAX,EBX,ECX,EDX,13, 5,0xA9E3E905); GG(EDX,EAX,EBX,ECX, 2, 9,0xFCEFA3F8); GG(ECX,EDX,EAX,EBX, 7,14,0x676F02D9); GG(EBX,ECX,EDX,EAX,12,20,0x8D2A4C8A); HH(EAX,EBX,ECX,EDX, 5, 4,0xFFFA3942); HH(EDX,EAX,EBX,ECX, 8,11,0x8771F681); HH(ECX,EDX,EAX,EBX,11,16,0x6D9D6122); HH(EBX,ECX,EDX,EAX,14,23,0xFDE5380C); HH(EAX,EBX,ECX,EDX, 1, 4,0xA4BEEA44); HH(EDX,EAX,EBX,ECX, 4,11,0x4BDECFA9); HH(ECX,EDX,EAX,EBX, 7,16,0xF6BB4B60); HH(EBX,ECX,EDX,EAX,10,23,0xBEBFBC70); HH(EAX,EBX,ECX,EDX,13, 4,0x289B7EC6); HH(EDX,EAX,EBX,ECX, 0,11,0xEAA127FA); HH(ECX,EDX,EAX,EBX, 3,16,0xD4EF3085); HH(EBX,ECX,EDX,EAX, 6,23,0x04881D05); HH(EAX,EBX,ECX,EDX, 9, 4,0xD9D4D039); HH(EDX,EAX,EBX,ECX,12,11,0xE6DB99E5); HH(ECX,EDX,EAX,EBX,15,16,0x1FA27CF8); HH(EBX,ECX,EDX,EAX, 2,23,0xC4AC5665); II(EAX,EBX,ECX,EDX, 0, 6,0xF4292244); II(EDX,EAX,EBX,ECX, 7,10,0x432AFF97); II(ECX,EDX,EAX,EBX,14,15,0xAB9423A7); II(EBX,ECX,EDX,EAX, 5,21,0xFC93A039); II(EAX,EBX,ECX,EDX,12, 6,0x655B59C3); II(EDX,EAX,EBX,ECX, 3,10,0x8F0CCC92); II(ECX,EDX,EAX,EBX,10,15,0xFFEFF47D); II(EBX,ECX,EDX,EAX, 1,21,0x85845DD1); II(EAX,EBX,ECX,EDX, 8, 6,0x6FA87E4F); II(EDX,EAX,EBX,ECX,15,10,0xFE2CE6E0); II(ECX,EDX,EAX,EBX, 6,15,0xA3014314); II(EBX,ECX,EDX,EAX,13,21,0x4E0811A1); II(EAX,EBX,ECX,EDX, 4, 6,0xF7537E82); II(EDX,EAX,EBX,ECX,11,10,0xBD3AF235); II(ECX,EDX,EAX,EBX, 2,15,0x2AD7D2BB); II(EBX,ECX,EDX,EAX, 9,21,0xEB86D391); ASSIGN(EBP, ARG(1)) ADD(ARRAY4(EBP, 0), EAX) ADD(ARRAY4(EBP, 1), EBX) ADD(ARRAY4(EBP, 2), ECX) ADD(ARRAY4(EBP, 3), EDX) RESTORE_REGS() END_FUNCTION(botan_md5_x86_32_compress) Botan-1.10.12/src/hash/mdx_hash/info.txt0000664000175000017500000000004612654331322017565 0ustar jackjack00000000000000define MDX_HASH_FUNCTION load_on dep Botan-1.10.12/src/hash/mdx_hash/mdx_hash.cpp0000664000175000017500000000452212654331322020373 0ustar jackjack00000000000000/* * Merkle-Damgard Hash Function * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * MDx_HashFunction Constructor */ MDx_HashFunction::MDx_HashFunction(size_t block_len, bool byte_end, bool bit_end, size_t cnt_size) : buffer(block_len), BIG_BYTE_ENDIAN(byte_end), BIG_BIT_ENDIAN(bit_end), COUNT_SIZE(cnt_size) { count = position = 0; } /* * Clear memory of sensitive data */ void MDx_HashFunction::clear() { zeroise(buffer); count = position = 0; } /* * Update the hash */ void MDx_HashFunction::add_data(const byte input[], size_t length) { count += length; if(position) { buffer.copy(position, input, length); if(position + length >= buffer.size()) { compress_n(&buffer[0], 1); input += (buffer.size() - position); length -= (buffer.size() - position); position = 0; } } const size_t full_blocks = length / buffer.size(); const size_t remaining = length % buffer.size(); if(full_blocks) compress_n(input, full_blocks); buffer.copy(position, input + full_blocks * buffer.size(), remaining); position += remaining; } /* * Finalize a hash */ void MDx_HashFunction::final_result(byte output[]) { buffer[position] = (BIG_BIT_ENDIAN ? 0x80 : 0x01); for(size_t i = position+1; i != buffer.size(); ++i) buffer[i] = 0; if(position >= buffer.size() - COUNT_SIZE) { compress_n(&buffer[0], 1); zeroise(buffer); } write_count(&buffer[buffer.size() - COUNT_SIZE]); compress_n(&buffer[0], 1); copy_out(output); clear(); } /* * Write the count bits to the buffer */ void MDx_HashFunction::write_count(byte out[]) { if(COUNT_SIZE < 8) throw Invalid_State("MDx_HashFunction::write_count: COUNT_SIZE < 8"); if(COUNT_SIZE >= output_length() || COUNT_SIZE >= hash_block_size()) throw Invalid_Argument("MDx_HashFunction: COUNT_SIZE is too big"); const u64bit bit_count = count * 8; if(BIG_BYTE_ENDIAN) store_be(bit_count, out + COUNT_SIZE - 8); else store_le(bit_count, out + COUNT_SIZE - 8); } } Botan-1.10.12/src/hash/mdx_hash/mdx_hash.h0000664000175000017500000000327612654331322020045 0ustar jackjack00000000000000/* * MDx Hash Function * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MDX_BASE_H__ #define BOTAN_MDX_BASE_H__ #include namespace Botan { /** * MDx Hash Function Base Class */ class BOTAN_DLL MDx_HashFunction : public HashFunction { public: /** * @param block_length is the number of bytes per block * @param big_byte_endian specifies if the hash uses big-endian bytes * @param big_bit_endian specifies if the hash uses big-endian bits * @param counter_size specifies the size of the counter var in bytes */ MDx_HashFunction(size_t block_length, bool big_byte_endian, bool big_bit_endian, size_t counter_size = 8); size_t hash_block_size() const { return buffer.size(); } protected: void add_data(const byte input[], size_t length); void final_result(byte output[]); /** * Run the hash's compression function over a set of blocks * @param blocks the input * @param block_n the number of blocks */ virtual void compress_n(const byte blocks[], size_t block_n) = 0; void clear(); /** * Copy the output to the buffer * @param buffer to put the output into */ virtual void copy_out(byte buffer[]) = 0; /** * Write the count, if used, to this spot * @param out where to write the counter to */ virtual void write_count(byte out[]); private: SecureVector buffer; u64bit count; size_t position; const bool BIG_BYTE_ENDIAN, BIG_BIT_ENDIAN; const size_t COUNT_SIZE; }; } #endif Botan-1.10.12/src/hash/par_hash/info.txt0000664000175000017500000000002512654331322017554 0ustar jackjack00000000000000define PARALLEL_HASH Botan-1.10.12/src/hash/par_hash/par_hash.cpp0000664000175000017500000000327512654331322020363 0ustar jackjack00000000000000/* * Parallel * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * Update the hash */ void Parallel::add_data(const byte input[], size_t length) { for(size_t i = 0; i != hashes.size(); ++i) hashes[i]->update(input, length); } /* * Finalize the hash */ void Parallel::final_result(byte hash[]) { size_t offset = 0; for(size_t i = 0; i != hashes.size(); ++i) { hashes[i]->final(hash + offset); offset += hashes[i]->output_length(); } } /* * Return output size */ size_t Parallel::output_length() const { size_t sum = 0; for(size_t i = 0; i != hashes.size(); ++i) sum += hashes[i]->output_length(); return sum; } /* * Return the name of this type */ std::string Parallel::name() const { std::string hash_names; for(size_t i = 0; i != hashes.size(); ++i) { if(i) hash_names += ','; hash_names += hashes[i]->name(); } return "Parallel(" + hash_names + ")"; } /* * Return a clone of this object */ HashFunction* Parallel::clone() const { std::vector hash_copies; for(size_t i = 0; i != hashes.size(); ++i) hash_copies.push_back(hashes[i]->clone()); return new Parallel(hash_copies); } /* * Clear memory of sensitive data */ void Parallel::clear() { for(size_t i = 0; i != hashes.size(); ++i) hashes[i]->clear(); } /* * Parallel Constructor */ Parallel::Parallel(const std::vector& hash_in) : hashes(hash_in) { } /* * Parallel Destructor */ Parallel::~Parallel() { for(size_t i = 0; i != hashes.size(); ++i) delete hashes[i]; } } Botan-1.10.12/src/hash/par_hash/par_hash.h0000664000175000017500000000135212654331322020022 0ustar jackjack00000000000000/* * Parallel Hash * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PARALLEL_HASH_H__ #define BOTAN_PARALLEL_HASH_H__ #include #include namespace Botan { /** * Parallel Hashes */ class BOTAN_DLL Parallel : public HashFunction { public: void clear(); std::string name() const; HashFunction* clone() const; size_t output_length() const; /** * @param hashes a set of hashes to compute in parallel */ Parallel(const std::vector& hashes); ~Parallel(); private: void add_data(const byte[], size_t); void final_result(byte[]); std::vector hashes; }; } #endif Botan-1.10.12/src/hash/rmd128/info.txt0000664000175000017500000000006312654331322017006 0ustar jackjack00000000000000define RIPEMD_128 mdx_hash Botan-1.10.12/src/hash/rmd128/rmd128.cpp0000664000175000017500000001553212654331322017042 0ustar jackjack00000000000000/* * RIPEMD-128 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace RIPEMD_128_F { /* * RIPEMD-128 F1 Function */ inline void F1(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, u32bit shift) { A += (B ^ C ^ D) + msg; A = rotate_left(A, shift); } /* * RIPEMD-128 F2 Function */ inline void F2(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, u32bit shift, u32bit magic) { A += (D ^ (B & (C ^ D))) + msg + magic; A = rotate_left(A, shift); } /* * RIPEMD-128 F3 Function */ inline void F3(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, u32bit shift, u32bit magic) { A += (D ^ (B | ~C)) + msg + magic; A = rotate_left(A, shift); } /* * RIPEMD-128 F4 Function */ inline void F4(u32bit& A, u32bit B, u32bit C, u32bit D, u32bit msg, u32bit shift, u32bit magic) { A += (C ^ (D & (B ^ C))) + msg + magic; A = rotate_left(A, shift); } } /* * RIPEMD-128 Compression Function */ void RIPEMD_128::compress_n(const byte input[], size_t blocks) { using namespace RIPEMD_128_F; const u32bit MAGIC2 = 0x5A827999, MAGIC3 = 0x6ED9EBA1, MAGIC4 = 0x8F1BBCDC, MAGIC5 = 0x50A28BE6, MAGIC6 = 0x5C4DD124, MAGIC7 = 0x6D703EF3; for(size_t i = 0; i != blocks; ++i) { load_le(&M[0], input, M.size()); u32bit A1 = digest[0], A2 = A1, B1 = digest[1], B2 = B1, C1 = digest[2], C2 = C1, D1 = digest[3], D2 = D1; F1(A1,B1,C1,D1,M[ 0],11 ); F4(A2,B2,C2,D2,M[ 5], 8,MAGIC5); F1(D1,A1,B1,C1,M[ 1],14 ); F4(D2,A2,B2,C2,M[14], 9,MAGIC5); F1(C1,D1,A1,B1,M[ 2],15 ); F4(C2,D2,A2,B2,M[ 7], 9,MAGIC5); F1(B1,C1,D1,A1,M[ 3],12 ); F4(B2,C2,D2,A2,M[ 0],11,MAGIC5); F1(A1,B1,C1,D1,M[ 4], 5 ); F4(A2,B2,C2,D2,M[ 9],13,MAGIC5); F1(D1,A1,B1,C1,M[ 5], 8 ); F4(D2,A2,B2,C2,M[ 2],15,MAGIC5); F1(C1,D1,A1,B1,M[ 6], 7 ); F4(C2,D2,A2,B2,M[11],15,MAGIC5); F1(B1,C1,D1,A1,M[ 7], 9 ); F4(B2,C2,D2,A2,M[ 4], 5,MAGIC5); F1(A1,B1,C1,D1,M[ 8],11 ); F4(A2,B2,C2,D2,M[13], 7,MAGIC5); F1(D1,A1,B1,C1,M[ 9],13 ); F4(D2,A2,B2,C2,M[ 6], 7,MAGIC5); F1(C1,D1,A1,B1,M[10],14 ); F4(C2,D2,A2,B2,M[15], 8,MAGIC5); F1(B1,C1,D1,A1,M[11],15 ); F4(B2,C2,D2,A2,M[ 8],11,MAGIC5); F1(A1,B1,C1,D1,M[12], 6 ); F4(A2,B2,C2,D2,M[ 1],14,MAGIC5); F1(D1,A1,B1,C1,M[13], 7 ); F4(D2,A2,B2,C2,M[10],14,MAGIC5); F1(C1,D1,A1,B1,M[14], 9 ); F4(C2,D2,A2,B2,M[ 3],12,MAGIC5); F1(B1,C1,D1,A1,M[15], 8 ); F4(B2,C2,D2,A2,M[12], 6,MAGIC5); F2(A1,B1,C1,D1,M[ 7], 7,MAGIC2); F3(A2,B2,C2,D2,M[ 6], 9,MAGIC6); F2(D1,A1,B1,C1,M[ 4], 6,MAGIC2); F3(D2,A2,B2,C2,M[11],13,MAGIC6); F2(C1,D1,A1,B1,M[13], 8,MAGIC2); F3(C2,D2,A2,B2,M[ 3],15,MAGIC6); F2(B1,C1,D1,A1,M[ 1],13,MAGIC2); F3(B2,C2,D2,A2,M[ 7], 7,MAGIC6); F2(A1,B1,C1,D1,M[10],11,MAGIC2); F3(A2,B2,C2,D2,M[ 0],12,MAGIC6); F2(D1,A1,B1,C1,M[ 6], 9,MAGIC2); F3(D2,A2,B2,C2,M[13], 8,MAGIC6); F2(C1,D1,A1,B1,M[15], 7,MAGIC2); F3(C2,D2,A2,B2,M[ 5], 9,MAGIC6); F2(B1,C1,D1,A1,M[ 3],15,MAGIC2); F3(B2,C2,D2,A2,M[10],11,MAGIC6); F2(A1,B1,C1,D1,M[12], 7,MAGIC2); F3(A2,B2,C2,D2,M[14], 7,MAGIC6); F2(D1,A1,B1,C1,M[ 0],12,MAGIC2); F3(D2,A2,B2,C2,M[15], 7,MAGIC6); F2(C1,D1,A1,B1,M[ 9],15,MAGIC2); F3(C2,D2,A2,B2,M[ 8],12,MAGIC6); F2(B1,C1,D1,A1,M[ 5], 9,MAGIC2); F3(B2,C2,D2,A2,M[12], 7,MAGIC6); F2(A1,B1,C1,D1,M[ 2],11,MAGIC2); F3(A2,B2,C2,D2,M[ 4], 6,MAGIC6); F2(D1,A1,B1,C1,M[14], 7,MAGIC2); F3(D2,A2,B2,C2,M[ 9],15,MAGIC6); F2(C1,D1,A1,B1,M[11],13,MAGIC2); F3(C2,D2,A2,B2,M[ 1],13,MAGIC6); F2(B1,C1,D1,A1,M[ 8],12,MAGIC2); F3(B2,C2,D2,A2,M[ 2],11,MAGIC6); F3(A1,B1,C1,D1,M[ 3],11,MAGIC3); F2(A2,B2,C2,D2,M[15], 9,MAGIC7); F3(D1,A1,B1,C1,M[10],13,MAGIC3); F2(D2,A2,B2,C2,M[ 5], 7,MAGIC7); F3(C1,D1,A1,B1,M[14], 6,MAGIC3); F2(C2,D2,A2,B2,M[ 1],15,MAGIC7); F3(B1,C1,D1,A1,M[ 4], 7,MAGIC3); F2(B2,C2,D2,A2,M[ 3],11,MAGIC7); F3(A1,B1,C1,D1,M[ 9],14,MAGIC3); F2(A2,B2,C2,D2,M[ 7], 8,MAGIC7); F3(D1,A1,B1,C1,M[15], 9,MAGIC3); F2(D2,A2,B2,C2,M[14], 6,MAGIC7); F3(C1,D1,A1,B1,M[ 8],13,MAGIC3); F2(C2,D2,A2,B2,M[ 6], 6,MAGIC7); F3(B1,C1,D1,A1,M[ 1],15,MAGIC3); F2(B2,C2,D2,A2,M[ 9],14,MAGIC7); F3(A1,B1,C1,D1,M[ 2],14,MAGIC3); F2(A2,B2,C2,D2,M[11],12,MAGIC7); F3(D1,A1,B1,C1,M[ 7], 8,MAGIC3); F2(D2,A2,B2,C2,M[ 8],13,MAGIC7); F3(C1,D1,A1,B1,M[ 0],13,MAGIC3); F2(C2,D2,A2,B2,M[12], 5,MAGIC7); F3(B1,C1,D1,A1,M[ 6], 6,MAGIC3); F2(B2,C2,D2,A2,M[ 2],14,MAGIC7); F3(A1,B1,C1,D1,M[13], 5,MAGIC3); F2(A2,B2,C2,D2,M[10],13,MAGIC7); F3(D1,A1,B1,C1,M[11],12,MAGIC3); F2(D2,A2,B2,C2,M[ 0],13,MAGIC7); F3(C1,D1,A1,B1,M[ 5], 7,MAGIC3); F2(C2,D2,A2,B2,M[ 4], 7,MAGIC7); F3(B1,C1,D1,A1,M[12], 5,MAGIC3); F2(B2,C2,D2,A2,M[13], 5,MAGIC7); F4(A1,B1,C1,D1,M[ 1],11,MAGIC4); F1(A2,B2,C2,D2,M[ 8],15 ); F4(D1,A1,B1,C1,M[ 9],12,MAGIC4); F1(D2,A2,B2,C2,M[ 6], 5 ); F4(C1,D1,A1,B1,M[11],14,MAGIC4); F1(C2,D2,A2,B2,M[ 4], 8 ); F4(B1,C1,D1,A1,M[10],15,MAGIC4); F1(B2,C2,D2,A2,M[ 1],11 ); F4(A1,B1,C1,D1,M[ 0],14,MAGIC4); F1(A2,B2,C2,D2,M[ 3],14 ); F4(D1,A1,B1,C1,M[ 8],15,MAGIC4); F1(D2,A2,B2,C2,M[11],14 ); F4(C1,D1,A1,B1,M[12], 9,MAGIC4); F1(C2,D2,A2,B2,M[15], 6 ); F4(B1,C1,D1,A1,M[ 4], 8,MAGIC4); F1(B2,C2,D2,A2,M[ 0],14 ); F4(A1,B1,C1,D1,M[13], 9,MAGIC4); F1(A2,B2,C2,D2,M[ 5], 6 ); F4(D1,A1,B1,C1,M[ 3],14,MAGIC4); F1(D2,A2,B2,C2,M[12], 9 ); F4(C1,D1,A1,B1,M[ 7], 5,MAGIC4); F1(C2,D2,A2,B2,M[ 2],12 ); F4(B1,C1,D1,A1,M[15], 6,MAGIC4); F1(B2,C2,D2,A2,M[13], 9 ); F4(A1,B1,C1,D1,M[14], 8,MAGIC4); F1(A2,B2,C2,D2,M[ 9],12 ); F4(D1,A1,B1,C1,M[ 5], 6,MAGIC4); F1(D2,A2,B2,C2,M[ 7], 5 ); F4(C1,D1,A1,B1,M[ 6], 5,MAGIC4); F1(C2,D2,A2,B2,M[10],15 ); F4(B1,C1,D1,A1,M[ 2],12,MAGIC4); F1(B2,C2,D2,A2,M[14], 8 ); D2 = digest[1] + C1 + D2; digest[1] = digest[2] + D1 + A2; digest[2] = digest[3] + A1 + B2; digest[3] = digest[0] + B1 + C2; digest[0] = D2; input += hash_block_size(); } } /* * Copy out the digest */ void RIPEMD_128::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 4) store_le(digest[i/4], output + i); } /* * Clear memory of sensitive data */ void RIPEMD_128::clear() { MDx_HashFunction::clear(); zeroise(M); digest[0] = 0x67452301; digest[1] = 0xEFCDAB89; digest[2] = 0x98BADCFE; digest[3] = 0x10325476; } } Botan-1.10.12/src/hash/rmd128/rmd128.h0000664000175000017500000000133112654331322016477 0ustar jackjack00000000000000/* * RIPEMD-128 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RIPEMD_128_H__ #define BOTAN_RIPEMD_128_H__ #include namespace Botan { /** * RIPEMD-128 */ class BOTAN_DLL RIPEMD_128 : public MDx_HashFunction { public: std::string name() const { return "RIPEMD-128"; } size_t output_length() const { return 16; } HashFunction* clone() const { return new RIPEMD_128; } void clear(); RIPEMD_128() : MDx_HashFunction(64, false, true), M(16), digest(4) { clear(); } private: void compress_n(const byte[], size_t blocks); void copy_out(byte[]); SecureVector M, digest; }; } #endif Botan-1.10.12/src/hash/rmd160/info.txt0000664000175000017500000000006312654331322017002 0ustar jackjack00000000000000define RIPEMD_160 mdx_hash Botan-1.10.12/src/hash/rmd160/rmd160.cpp0000664000175000017500000002166312654331322017034 0ustar jackjack00000000000000/* * RIPEMD-160 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { /* * RIPEMD-160 F1 Function */ inline void F1(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, u32bit msg, u32bit shift) { A += (B ^ C ^ D) + msg; A = rotate_left(A, shift) + E; C = rotate_left(C, 10); } /* * RIPEMD-160 F2 Function */ inline void F2(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, u32bit msg, u32bit shift, u32bit magic) { A += (D ^ (B & (C ^ D))) + msg + magic; A = rotate_left(A, shift) + E; C = rotate_left(C, 10); } /* * RIPEMD-160 F3 Function */ inline void F3(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, u32bit msg, u32bit shift, u32bit magic) { A += (D ^ (B | ~C)) + msg + magic; A = rotate_left(A, shift) + E; C = rotate_left(C, 10); } /* * RIPEMD-160 F4 Function */ inline void F4(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, u32bit msg, u32bit shift, u32bit magic) { A += (C ^ (D & (B ^ C))) + msg + magic; A = rotate_left(A, shift) + E; C = rotate_left(C, 10); } /* * RIPEMD-160 F5 Function */ inline void F5(u32bit& A, u32bit B, u32bit& C, u32bit D, u32bit E, u32bit msg, u32bit shift, u32bit magic) { A += (B ^ (C | ~D)) + msg + magic; A = rotate_left(A, shift) + E; C = rotate_left(C, 10); } } /* * RIPEMD-160 Compression Function */ void RIPEMD_160::compress_n(const byte input[], size_t blocks) { const u32bit MAGIC2 = 0x5A827999, MAGIC3 = 0x6ED9EBA1, MAGIC4 = 0x8F1BBCDC, MAGIC5 = 0xA953FD4E, MAGIC6 = 0x50A28BE6, MAGIC7 = 0x5C4DD124, MAGIC8 = 0x6D703EF3, MAGIC9 = 0x7A6D76E9; for(size_t i = 0; i != blocks; ++i) { load_le(&M[0], input, M.size()); u32bit A1 = digest[0], A2 = A1, B1 = digest[1], B2 = B1, C1 = digest[2], C2 = C1, D1 = digest[3], D2 = D1, E1 = digest[4], E2 = E1; F1(A1,B1,C1,D1,E1,M[ 0],11 ); F5(A2,B2,C2,D2,E2,M[ 5], 8,MAGIC6); F1(E1,A1,B1,C1,D1,M[ 1],14 ); F5(E2,A2,B2,C2,D2,M[14], 9,MAGIC6); F1(D1,E1,A1,B1,C1,M[ 2],15 ); F5(D2,E2,A2,B2,C2,M[ 7], 9,MAGIC6); F1(C1,D1,E1,A1,B1,M[ 3],12 ); F5(C2,D2,E2,A2,B2,M[ 0],11,MAGIC6); F1(B1,C1,D1,E1,A1,M[ 4], 5 ); F5(B2,C2,D2,E2,A2,M[ 9],13,MAGIC6); F1(A1,B1,C1,D1,E1,M[ 5], 8 ); F5(A2,B2,C2,D2,E2,M[ 2],15,MAGIC6); F1(E1,A1,B1,C1,D1,M[ 6], 7 ); F5(E2,A2,B2,C2,D2,M[11],15,MAGIC6); F1(D1,E1,A1,B1,C1,M[ 7], 9 ); F5(D2,E2,A2,B2,C2,M[ 4], 5,MAGIC6); F1(C1,D1,E1,A1,B1,M[ 8],11 ); F5(C2,D2,E2,A2,B2,M[13], 7,MAGIC6); F1(B1,C1,D1,E1,A1,M[ 9],13 ); F5(B2,C2,D2,E2,A2,M[ 6], 7,MAGIC6); F1(A1,B1,C1,D1,E1,M[10],14 ); F5(A2,B2,C2,D2,E2,M[15], 8,MAGIC6); F1(E1,A1,B1,C1,D1,M[11],15 ); F5(E2,A2,B2,C2,D2,M[ 8],11,MAGIC6); F1(D1,E1,A1,B1,C1,M[12], 6 ); F5(D2,E2,A2,B2,C2,M[ 1],14,MAGIC6); F1(C1,D1,E1,A1,B1,M[13], 7 ); F5(C2,D2,E2,A2,B2,M[10],14,MAGIC6); F1(B1,C1,D1,E1,A1,M[14], 9 ); F5(B2,C2,D2,E2,A2,M[ 3],12,MAGIC6); F1(A1,B1,C1,D1,E1,M[15], 8 ); F5(A2,B2,C2,D2,E2,M[12], 6,MAGIC6); F2(E1,A1,B1,C1,D1,M[ 7], 7,MAGIC2); F4(E2,A2,B2,C2,D2,M[ 6], 9,MAGIC7); F2(D1,E1,A1,B1,C1,M[ 4], 6,MAGIC2); F4(D2,E2,A2,B2,C2,M[11],13,MAGIC7); F2(C1,D1,E1,A1,B1,M[13], 8,MAGIC2); F4(C2,D2,E2,A2,B2,M[ 3],15,MAGIC7); F2(B1,C1,D1,E1,A1,M[ 1],13,MAGIC2); F4(B2,C2,D2,E2,A2,M[ 7], 7,MAGIC7); F2(A1,B1,C1,D1,E1,M[10],11,MAGIC2); F4(A2,B2,C2,D2,E2,M[ 0],12,MAGIC7); F2(E1,A1,B1,C1,D1,M[ 6], 9,MAGIC2); F4(E2,A2,B2,C2,D2,M[13], 8,MAGIC7); F2(D1,E1,A1,B1,C1,M[15], 7,MAGIC2); F4(D2,E2,A2,B2,C2,M[ 5], 9,MAGIC7); F2(C1,D1,E1,A1,B1,M[ 3],15,MAGIC2); F4(C2,D2,E2,A2,B2,M[10],11,MAGIC7); F2(B1,C1,D1,E1,A1,M[12], 7,MAGIC2); F4(B2,C2,D2,E2,A2,M[14], 7,MAGIC7); F2(A1,B1,C1,D1,E1,M[ 0],12,MAGIC2); F4(A2,B2,C2,D2,E2,M[15], 7,MAGIC7); F2(E1,A1,B1,C1,D1,M[ 9],15,MAGIC2); F4(E2,A2,B2,C2,D2,M[ 8],12,MAGIC7); F2(D1,E1,A1,B1,C1,M[ 5], 9,MAGIC2); F4(D2,E2,A2,B2,C2,M[12], 7,MAGIC7); F2(C1,D1,E1,A1,B1,M[ 2],11,MAGIC2); F4(C2,D2,E2,A2,B2,M[ 4], 6,MAGIC7); F2(B1,C1,D1,E1,A1,M[14], 7,MAGIC2); F4(B2,C2,D2,E2,A2,M[ 9],15,MAGIC7); F2(A1,B1,C1,D1,E1,M[11],13,MAGIC2); F4(A2,B2,C2,D2,E2,M[ 1],13,MAGIC7); F2(E1,A1,B1,C1,D1,M[ 8],12,MAGIC2); F4(E2,A2,B2,C2,D2,M[ 2],11,MAGIC7); F3(D1,E1,A1,B1,C1,M[ 3],11,MAGIC3); F3(D2,E2,A2,B2,C2,M[15], 9,MAGIC8); F3(C1,D1,E1,A1,B1,M[10],13,MAGIC3); F3(C2,D2,E2,A2,B2,M[ 5], 7,MAGIC8); F3(B1,C1,D1,E1,A1,M[14], 6,MAGIC3); F3(B2,C2,D2,E2,A2,M[ 1],15,MAGIC8); F3(A1,B1,C1,D1,E1,M[ 4], 7,MAGIC3); F3(A2,B2,C2,D2,E2,M[ 3],11,MAGIC8); F3(E1,A1,B1,C1,D1,M[ 9],14,MAGIC3); F3(E2,A2,B2,C2,D2,M[ 7], 8,MAGIC8); F3(D1,E1,A1,B1,C1,M[15], 9,MAGIC3); F3(D2,E2,A2,B2,C2,M[14], 6,MAGIC8); F3(C1,D1,E1,A1,B1,M[ 8],13,MAGIC3); F3(C2,D2,E2,A2,B2,M[ 6], 6,MAGIC8); F3(B1,C1,D1,E1,A1,M[ 1],15,MAGIC3); F3(B2,C2,D2,E2,A2,M[ 9],14,MAGIC8); F3(A1,B1,C1,D1,E1,M[ 2],14,MAGIC3); F3(A2,B2,C2,D2,E2,M[11],12,MAGIC8); F3(E1,A1,B1,C1,D1,M[ 7], 8,MAGIC3); F3(E2,A2,B2,C2,D2,M[ 8],13,MAGIC8); F3(D1,E1,A1,B1,C1,M[ 0],13,MAGIC3); F3(D2,E2,A2,B2,C2,M[12], 5,MAGIC8); F3(C1,D1,E1,A1,B1,M[ 6], 6,MAGIC3); F3(C2,D2,E2,A2,B2,M[ 2],14,MAGIC8); F3(B1,C1,D1,E1,A1,M[13], 5,MAGIC3); F3(B2,C2,D2,E2,A2,M[10],13,MAGIC8); F3(A1,B1,C1,D1,E1,M[11],12,MAGIC3); F3(A2,B2,C2,D2,E2,M[ 0],13,MAGIC8); F3(E1,A1,B1,C1,D1,M[ 5], 7,MAGIC3); F3(E2,A2,B2,C2,D2,M[ 4], 7,MAGIC8); F3(D1,E1,A1,B1,C1,M[12], 5,MAGIC3); F3(D2,E2,A2,B2,C2,M[13], 5,MAGIC8); F4(C1,D1,E1,A1,B1,M[ 1],11,MAGIC4); F2(C2,D2,E2,A2,B2,M[ 8],15,MAGIC9); F4(B1,C1,D1,E1,A1,M[ 9],12,MAGIC4); F2(B2,C2,D2,E2,A2,M[ 6], 5,MAGIC9); F4(A1,B1,C1,D1,E1,M[11],14,MAGIC4); F2(A2,B2,C2,D2,E2,M[ 4], 8,MAGIC9); F4(E1,A1,B1,C1,D1,M[10],15,MAGIC4); F2(E2,A2,B2,C2,D2,M[ 1],11,MAGIC9); F4(D1,E1,A1,B1,C1,M[ 0],14,MAGIC4); F2(D2,E2,A2,B2,C2,M[ 3],14,MAGIC9); F4(C1,D1,E1,A1,B1,M[ 8],15,MAGIC4); F2(C2,D2,E2,A2,B2,M[11],14,MAGIC9); F4(B1,C1,D1,E1,A1,M[12], 9,MAGIC4); F2(B2,C2,D2,E2,A2,M[15], 6,MAGIC9); F4(A1,B1,C1,D1,E1,M[ 4], 8,MAGIC4); F2(A2,B2,C2,D2,E2,M[ 0],14,MAGIC9); F4(E1,A1,B1,C1,D1,M[13], 9,MAGIC4); F2(E2,A2,B2,C2,D2,M[ 5], 6,MAGIC9); F4(D1,E1,A1,B1,C1,M[ 3],14,MAGIC4); F2(D2,E2,A2,B2,C2,M[12], 9,MAGIC9); F4(C1,D1,E1,A1,B1,M[ 7], 5,MAGIC4); F2(C2,D2,E2,A2,B2,M[ 2],12,MAGIC9); F4(B1,C1,D1,E1,A1,M[15], 6,MAGIC4); F2(B2,C2,D2,E2,A2,M[13], 9,MAGIC9); F4(A1,B1,C1,D1,E1,M[14], 8,MAGIC4); F2(A2,B2,C2,D2,E2,M[ 9],12,MAGIC9); F4(E1,A1,B1,C1,D1,M[ 5], 6,MAGIC4); F2(E2,A2,B2,C2,D2,M[ 7], 5,MAGIC9); F4(D1,E1,A1,B1,C1,M[ 6], 5,MAGIC4); F2(D2,E2,A2,B2,C2,M[10],15,MAGIC9); F4(C1,D1,E1,A1,B1,M[ 2],12,MAGIC4); F2(C2,D2,E2,A2,B2,M[14], 8,MAGIC9); F5(B1,C1,D1,E1,A1,M[ 4], 9,MAGIC5); F1(B2,C2,D2,E2,A2,M[12], 8 ); F5(A1,B1,C1,D1,E1,M[ 0],15,MAGIC5); F1(A2,B2,C2,D2,E2,M[15], 5 ); F5(E1,A1,B1,C1,D1,M[ 5], 5,MAGIC5); F1(E2,A2,B2,C2,D2,M[10],12 ); F5(D1,E1,A1,B1,C1,M[ 9],11,MAGIC5); F1(D2,E2,A2,B2,C2,M[ 4], 9 ); F5(C1,D1,E1,A1,B1,M[ 7], 6,MAGIC5); F1(C2,D2,E2,A2,B2,M[ 1],12 ); F5(B1,C1,D1,E1,A1,M[12], 8,MAGIC5); F1(B2,C2,D2,E2,A2,M[ 5], 5 ); F5(A1,B1,C1,D1,E1,M[ 2],13,MAGIC5); F1(A2,B2,C2,D2,E2,M[ 8],14 ); F5(E1,A1,B1,C1,D1,M[10],12,MAGIC5); F1(E2,A2,B2,C2,D2,M[ 7], 6 ); F5(D1,E1,A1,B1,C1,M[14], 5,MAGIC5); F1(D2,E2,A2,B2,C2,M[ 6], 8 ); F5(C1,D1,E1,A1,B1,M[ 1],12,MAGIC5); F1(C2,D2,E2,A2,B2,M[ 2],13 ); F5(B1,C1,D1,E1,A1,M[ 3],13,MAGIC5); F1(B2,C2,D2,E2,A2,M[13], 6 ); F5(A1,B1,C1,D1,E1,M[ 8],14,MAGIC5); F1(A2,B2,C2,D2,E2,M[14], 5 ); F5(E1,A1,B1,C1,D1,M[11],11,MAGIC5); F1(E2,A2,B2,C2,D2,M[ 0],15 ); F5(D1,E1,A1,B1,C1,M[ 6], 8,MAGIC5); F1(D2,E2,A2,B2,C2,M[ 3],13 ); F5(C1,D1,E1,A1,B1,M[15], 5,MAGIC5); F1(C2,D2,E2,A2,B2,M[ 9],11 ); F5(B1,C1,D1,E1,A1,M[13], 6,MAGIC5); F1(B2,C2,D2,E2,A2,M[11],11 ); C1 = digest[1] + C1 + D2; digest[1] = digest[2] + D1 + E2; digest[2] = digest[3] + E1 + A2; digest[3] = digest[4] + A1 + B2; digest[4] = digest[0] + B1 + C2; digest[0] = C1; input += hash_block_size(); } } /* * Copy out the digest */ void RIPEMD_160::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 4) store_le(digest[i/4], output + i); } /* * Clear memory of sensitive data */ void RIPEMD_160::clear() { MDx_HashFunction::clear(); zeroise(M); digest[0] = 0x67452301; digest[1] = 0xEFCDAB89; digest[2] = 0x98BADCFE; digest[3] = 0x10325476; digest[4] = 0xC3D2E1F0; } } Botan-1.10.12/src/hash/rmd160/rmd160.h0000664000175000017500000000133112654331322016467 0ustar jackjack00000000000000/* * RIPEMD-160 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RIPEMD_160_H__ #define BOTAN_RIPEMD_160_H__ #include namespace Botan { /** * RIPEMD-160 */ class BOTAN_DLL RIPEMD_160 : public MDx_HashFunction { public: std::string name() const { return "RIPEMD-160"; } size_t output_length() const { return 20; } HashFunction* clone() const { return new RIPEMD_160; } void clear(); RIPEMD_160() : MDx_HashFunction(64, false, true), M(16), digest(5) { clear(); } private: void compress_n(const byte[], size_t blocks); void copy_out(byte[]); SecureVector M, digest; }; } #endif Botan-1.10.12/src/hash/sha1/info.txt0000664000175000017500000000005512654331322016626 0ustar jackjack00000000000000define SHA1 mdx_hash Botan-1.10.12/src/hash/sha1/sha160.cpp0000664000175000017500000001170312654331322016642 0ustar jackjack00000000000000/* * SHA-160 * (C) 1999-2008,2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace SHA1_F { namespace { /* * SHA-160 F1 Function */ inline void F1(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) { E += (D ^ (B & (C ^ D))) + msg + 0x5A827999 + rotate_left(A, 5); B = rotate_left(B, 30); } /* * SHA-160 F2 Function */ inline void F2(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) { E += (B ^ C ^ D) + msg + 0x6ED9EBA1 + rotate_left(A, 5); B = rotate_left(B, 30); } /* * SHA-160 F3 Function */ inline void F3(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) { E += ((B & C) | ((B | C) & D)) + msg + 0x8F1BBCDC + rotate_left(A, 5); B = rotate_left(B, 30); } /* * SHA-160 F4 Function */ inline void F4(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) { E += (B ^ C ^ D) + msg + 0xCA62C1D6 + rotate_left(A, 5); B = rotate_left(B, 30); } } } /* * SHA-160 Compression Function */ void SHA_160::compress_n(const byte input[], size_t blocks) { using namespace SHA1_F; u32bit A = digest[0], B = digest[1], C = digest[2], D = digest[3], E = digest[4]; for(size_t i = 0; i != blocks; ++i) { load_be(&W[0], input, 16); for(size_t j = 16; j != 80; j += 8) { W[j ] = rotate_left((W[j-3] ^ W[j-8] ^ W[j-14] ^ W[j-16]), 1); W[j+1] = rotate_left((W[j-2] ^ W[j-7] ^ W[j-13] ^ W[j-15]), 1); W[j+2] = rotate_left((W[j-1] ^ W[j-6] ^ W[j-12] ^ W[j-14]), 1); W[j+3] = rotate_left((W[j ] ^ W[j-5] ^ W[j-11] ^ W[j-13]), 1); W[j+4] = rotate_left((W[j+1] ^ W[j-4] ^ W[j-10] ^ W[j-12]), 1); W[j+5] = rotate_left((W[j+2] ^ W[j-3] ^ W[j- 9] ^ W[j-11]), 1); W[j+6] = rotate_left((W[j+3] ^ W[j-2] ^ W[j- 8] ^ W[j-10]), 1); W[j+7] = rotate_left((W[j+4] ^ W[j-1] ^ W[j- 7] ^ W[j- 9]), 1); } F1(A, B, C, D, E, W[ 0]); F1(E, A, B, C, D, W[ 1]); F1(D, E, A, B, C, W[ 2]); F1(C, D, E, A, B, W[ 3]); F1(B, C, D, E, A, W[ 4]); F1(A, B, C, D, E, W[ 5]); F1(E, A, B, C, D, W[ 6]); F1(D, E, A, B, C, W[ 7]); F1(C, D, E, A, B, W[ 8]); F1(B, C, D, E, A, W[ 9]); F1(A, B, C, D, E, W[10]); F1(E, A, B, C, D, W[11]); F1(D, E, A, B, C, W[12]); F1(C, D, E, A, B, W[13]); F1(B, C, D, E, A, W[14]); F1(A, B, C, D, E, W[15]); F1(E, A, B, C, D, W[16]); F1(D, E, A, B, C, W[17]); F1(C, D, E, A, B, W[18]); F1(B, C, D, E, A, W[19]); F2(A, B, C, D, E, W[20]); F2(E, A, B, C, D, W[21]); F2(D, E, A, B, C, W[22]); F2(C, D, E, A, B, W[23]); F2(B, C, D, E, A, W[24]); F2(A, B, C, D, E, W[25]); F2(E, A, B, C, D, W[26]); F2(D, E, A, B, C, W[27]); F2(C, D, E, A, B, W[28]); F2(B, C, D, E, A, W[29]); F2(A, B, C, D, E, W[30]); F2(E, A, B, C, D, W[31]); F2(D, E, A, B, C, W[32]); F2(C, D, E, A, B, W[33]); F2(B, C, D, E, A, W[34]); F2(A, B, C, D, E, W[35]); F2(E, A, B, C, D, W[36]); F2(D, E, A, B, C, W[37]); F2(C, D, E, A, B, W[38]); F2(B, C, D, E, A, W[39]); F3(A, B, C, D, E, W[40]); F3(E, A, B, C, D, W[41]); F3(D, E, A, B, C, W[42]); F3(C, D, E, A, B, W[43]); F3(B, C, D, E, A, W[44]); F3(A, B, C, D, E, W[45]); F3(E, A, B, C, D, W[46]); F3(D, E, A, B, C, W[47]); F3(C, D, E, A, B, W[48]); F3(B, C, D, E, A, W[49]); F3(A, B, C, D, E, W[50]); F3(E, A, B, C, D, W[51]); F3(D, E, A, B, C, W[52]); F3(C, D, E, A, B, W[53]); F3(B, C, D, E, A, W[54]); F3(A, B, C, D, E, W[55]); F3(E, A, B, C, D, W[56]); F3(D, E, A, B, C, W[57]); F3(C, D, E, A, B, W[58]); F3(B, C, D, E, A, W[59]); F4(A, B, C, D, E, W[60]); F4(E, A, B, C, D, W[61]); F4(D, E, A, B, C, W[62]); F4(C, D, E, A, B, W[63]); F4(B, C, D, E, A, W[64]); F4(A, B, C, D, E, W[65]); F4(E, A, B, C, D, W[66]); F4(D, E, A, B, C, W[67]); F4(C, D, E, A, B, W[68]); F4(B, C, D, E, A, W[69]); F4(A, B, C, D, E, W[70]); F4(E, A, B, C, D, W[71]); F4(D, E, A, B, C, W[72]); F4(C, D, E, A, B, W[73]); F4(B, C, D, E, A, W[74]); F4(A, B, C, D, E, W[75]); F4(E, A, B, C, D, W[76]); F4(D, E, A, B, C, W[77]); F4(C, D, E, A, B, W[78]); F4(B, C, D, E, A, W[79]); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); E = (digest[4] += E); input += hash_block_size(); } } /* * Copy out the digest */ void SHA_160::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 4) store_be(digest[i/4], output + i); } /* * Clear memory of sensitive data */ void SHA_160::clear() { MDx_HashFunction::clear(); zeroise(W); digest[0] = 0x67452301; digest[1] = 0xEFCDAB89; digest[2] = 0x98BADCFE; digest[3] = 0x10325476; digest[4] = 0xC3D2E1F0; } } Botan-1.10.12/src/hash/sha1/sha160.h0000664000175000017500000000240312654331322016304 0ustar jackjack00000000000000/* * SHA-160 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SHA_160_H__ #define BOTAN_SHA_160_H__ #include namespace Botan { /** * NIST's SHA-160 */ class BOTAN_DLL SHA_160 : public MDx_HashFunction { public: std::string name() const { return "SHA-160"; } size_t output_length() const { return 20; } HashFunction* clone() const { return new SHA_160; } void clear(); SHA_160() : MDx_HashFunction(64, true, true), digest(5), W(80) { clear(); } protected: /** * Set a custom size for the W array. Normally 80, but some * subclasses need slightly more for best performance/internal * constraints * @param W_size how big to make W */ SHA_160(size_t W_size) : MDx_HashFunction(64, true, true), digest(5), W(W_size) { clear(); } void compress_n(const byte[], size_t blocks); void copy_out(byte[]); /** * The digest value, exposed for use by subclasses (asm, SSE2) */ SecureVector digest; /** * The message buffer, exposed for use by subclasses (asm, SSE2) */ SecureVector W; }; } #endif Botan-1.10.12/src/hash/sha1_sse2/info.txt0000664000175000017500000000011112654331322017553 0ustar jackjack00000000000000define SHA1_SSE2 need_isa sse2 sha1 simd_engine Botan-1.10.12/src/hash/sha1_sse2/sha1_sse2.cpp0000664000175000017500000002465612654331322020377 0ustar jackjack00000000000000/* * SHA-1 using SSE2 * (C) 2009-2011 Jack Lloyd * * Distributed under the terms of the Botan license * * Based on public domain code by Dean Gaudet * (http://arctic.org/~dean/crypto/sha1.html) */ #include #include #include namespace Botan { namespace SHA1_SSE2_F { namespace { /* * First 16 bytes just need byte swapping. Preparing just means * adding in the round constants. */ #define prep00_15(P, W) \ do { \ W = _mm_shufflehi_epi16(W, _MM_SHUFFLE(2, 3, 0, 1)); \ W = _mm_shufflelo_epi16(W, _MM_SHUFFLE(2, 3, 0, 1)); \ W = _mm_or_si128(_mm_slli_epi16(W, 8), \ _mm_srli_epi16(W, 8)); \ P.u128 = _mm_add_epi32(W, K00_19); \ } while(0) /* For each multiple of 4, t, we want to calculate this: W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1); W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1); W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1); W[t+3] = rol(W[t] ^ W[t-5] ^ W[t-11] ^ W[t-13], 1); we'll actually calculate this: W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1); W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1); W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1); W[t+3] = rol( 0 ^ W[t-5] ^ W[t-11] ^ W[t-13], 1); W[t+3] ^= rol(W[t+0], 1); the parameters are: W0 = &W[t-16]; W1 = &W[t-12]; W2 = &W[t- 8]; W3 = &W[t- 4]; and on output: prepared = W0 + K W0 = W[t]..W[t+3] */ /* note that there is a step here where i want to do a rol by 1, which * normally would look like this: * * r1 = psrld r0,$31 * r0 = pslld r0,$1 * r0 = por r0,r1 * * but instead i do this: * * r1 = pcmpltd r0,zero * r0 = paddd r0,r0 * r0 = psub r0,r1 * * because pcmpltd and paddd are availabe in both MMX units on * efficeon, pentium-m, and opteron but shifts are available in * only one unit. */ #define prep(prep, XW0, XW1, XW2, XW3, K) \ do { \ __m128i r0, r1, r2, r3; \ \ /* load W[t-4] 16-byte aligned, and shift */ \ r3 = _mm_srli_si128((XW3), 4); \ r0 = (XW0); \ /* get high 64-bits of XW0 into low 64-bits */ \ r1 = _mm_shuffle_epi32((XW0), _MM_SHUFFLE(1,0,3,2)); \ /* load high 64-bits of r1 */ \ r1 = _mm_unpacklo_epi64(r1, (XW1)); \ r2 = (XW2); \ \ r0 = _mm_xor_si128(r1, r0); \ r2 = _mm_xor_si128(r3, r2); \ r0 = _mm_xor_si128(r2, r0); \ /* unrotated W[t]..W[t+2] in r0 ... still need W[t+3] */ \ \ r2 = _mm_slli_si128(r0, 12); \ r1 = _mm_cmplt_epi32(r0, _mm_setzero_si128()); \ r0 = _mm_add_epi32(r0, r0); /* shift left by 1 */ \ r0 = _mm_sub_epi32(r0, r1); /* r0 has W[t]..W[t+2] */ \ \ r3 = _mm_srli_epi32(r2, 30); \ r2 = _mm_slli_epi32(r2, 2); \ \ r0 = _mm_xor_si128(r0, r3); \ r0 = _mm_xor_si128(r0, r2); /* r0 now has W[t+3] */ \ \ (XW0) = r0; \ (prep).u128 = _mm_add_epi32(r0, K); \ } while(0) /* * SHA-160 F1 Function */ inline void F1(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) { E += (D ^ (B & (C ^ D))) + msg + rotate_left(A, 5); B = rotate_left(B, 30); } /* * SHA-160 F2 Function */ inline void F2(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) { E += (B ^ C ^ D) + msg + rotate_left(A, 5); B = rotate_left(B, 30); } /* * SHA-160 F3 Function */ inline void F3(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) { E += ((B & C) | ((B | C) & D)) + msg + rotate_left(A, 5); B = rotate_left(B, 30); } /* * SHA-160 F4 Function */ inline void F4(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg) { E += (B ^ C ^ D) + msg + rotate_left(A, 5); B = rotate_left(B, 30); } } } /* * SHA-160 Compression Function using SSE for message expansion */ void SHA_160_SSE2::compress_n(const byte input_bytes[], size_t blocks) { using namespace SHA1_SSE2_F; const __m128i K00_19 = _mm_set1_epi32(0x5A827999); const __m128i K20_39 = _mm_set1_epi32(0x6ED9EBA1); const __m128i K40_59 = _mm_set1_epi32(0x8F1BBCDC); const __m128i K60_79 = _mm_set1_epi32(0xCA62C1D6); u32bit A = digest[0], B = digest[1], C = digest[2], D = digest[3], E = digest[4]; const __m128i* input = reinterpret_cast(input_bytes); for(size_t i = 0; i != blocks; ++i) { union v4si { u32bit u32[4]; __m128i u128; }; v4si P0, P1, P2, P3; __m128i W0 = _mm_loadu_si128(&input[0]); prep00_15(P0, W0); __m128i W1 = _mm_loadu_si128(&input[1]); prep00_15(P1, W1); __m128i W2 = _mm_loadu_si128(&input[2]); prep00_15(P2, W2); __m128i W3 = _mm_loadu_si128(&input[3]); prep00_15(P3, W3); /* Using SSE4; slower on Core2 and Nehalem #define GET_P_32(P, i) _mm_extract_epi32(P.u128, i) Much slower on all tested platforms #define GET_P_32(P,i) _mm_cvtsi128_si32(_mm_srli_si128(P.u128, i*4)) */ #define GET_P_32(P, i) P.u32[i] F1(A, B, C, D, E, GET_P_32(P0, 0)); F1(E, A, B, C, D, GET_P_32(P0, 1)); F1(D, E, A, B, C, GET_P_32(P0, 2)); F1(C, D, E, A, B, GET_P_32(P0, 3)); prep(P0, W0, W1, W2, W3, K00_19); F1(B, C, D, E, A, GET_P_32(P1, 0)); F1(A, B, C, D, E, GET_P_32(P1, 1)); F1(E, A, B, C, D, GET_P_32(P1, 2)); F1(D, E, A, B, C, GET_P_32(P1, 3)); prep(P1, W1, W2, W3, W0, K20_39); F1(C, D, E, A, B, GET_P_32(P2, 0)); F1(B, C, D, E, A, GET_P_32(P2, 1)); F1(A, B, C, D, E, GET_P_32(P2, 2)); F1(E, A, B, C, D, GET_P_32(P2, 3)); prep(P2, W2, W3, W0, W1, K20_39); F1(D, E, A, B, C, GET_P_32(P3, 0)); F1(C, D, E, A, B, GET_P_32(P3, 1)); F1(B, C, D, E, A, GET_P_32(P3, 2)); F1(A, B, C, D, E, GET_P_32(P3, 3)); prep(P3, W3, W0, W1, W2, K20_39); F1(E, A, B, C, D, GET_P_32(P0, 0)); F1(D, E, A, B, C, GET_P_32(P0, 1)); F1(C, D, E, A, B, GET_P_32(P0, 2)); F1(B, C, D, E, A, GET_P_32(P0, 3)); prep(P0, W0, W1, W2, W3, K20_39); F2(A, B, C, D, E, GET_P_32(P1, 0)); F2(E, A, B, C, D, GET_P_32(P1, 1)); F2(D, E, A, B, C, GET_P_32(P1, 2)); F2(C, D, E, A, B, GET_P_32(P1, 3)); prep(P1, W1, W2, W3, W0, K20_39); F2(B, C, D, E, A, GET_P_32(P2, 0)); F2(A, B, C, D, E, GET_P_32(P2, 1)); F2(E, A, B, C, D, GET_P_32(P2, 2)); F2(D, E, A, B, C, GET_P_32(P2, 3)); prep(P2, W2, W3, W0, W1, K40_59); F2(C, D, E, A, B, GET_P_32(P3, 0)); F2(B, C, D, E, A, GET_P_32(P3, 1)); F2(A, B, C, D, E, GET_P_32(P3, 2)); F2(E, A, B, C, D, GET_P_32(P3, 3)); prep(P3, W3, W0, W1, W2, K40_59); F2(D, E, A, B, C, GET_P_32(P0, 0)); F2(C, D, E, A, B, GET_P_32(P0, 1)); F2(B, C, D, E, A, GET_P_32(P0, 2)); F2(A, B, C, D, E, GET_P_32(P0, 3)); prep(P0, W0, W1, W2, W3, K40_59); F2(E, A, B, C, D, GET_P_32(P1, 0)); F2(D, E, A, B, C, GET_P_32(P1, 1)); F2(C, D, E, A, B, GET_P_32(P1, 2)); F2(B, C, D, E, A, GET_P_32(P1, 3)); prep(P1, W1, W2, W3, W0, K40_59); F3(A, B, C, D, E, GET_P_32(P2, 0)); F3(E, A, B, C, D, GET_P_32(P2, 1)); F3(D, E, A, B, C, GET_P_32(P2, 2)); F3(C, D, E, A, B, GET_P_32(P2, 3)); prep(P2, W2, W3, W0, W1, K40_59); F3(B, C, D, E, A, GET_P_32(P3, 0)); F3(A, B, C, D, E, GET_P_32(P3, 1)); F3(E, A, B, C, D, GET_P_32(P3, 2)); F3(D, E, A, B, C, GET_P_32(P3, 3)); prep(P3, W3, W0, W1, W2, K60_79); F3(C, D, E, A, B, GET_P_32(P0, 0)); F3(B, C, D, E, A, GET_P_32(P0, 1)); F3(A, B, C, D, E, GET_P_32(P0, 2)); F3(E, A, B, C, D, GET_P_32(P0, 3)); prep(P0, W0, W1, W2, W3, K60_79); F3(D, E, A, B, C, GET_P_32(P1, 0)); F3(C, D, E, A, B, GET_P_32(P1, 1)); F3(B, C, D, E, A, GET_P_32(P1, 2)); F3(A, B, C, D, E, GET_P_32(P1, 3)); prep(P1, W1, W2, W3, W0, K60_79); F3(E, A, B, C, D, GET_P_32(P2, 0)); F3(D, E, A, B, C, GET_P_32(P2, 1)); F3(C, D, E, A, B, GET_P_32(P2, 2)); F3(B, C, D, E, A, GET_P_32(P2, 3)); prep(P2, W2, W3, W0, W1, K60_79); F4(A, B, C, D, E, GET_P_32(P3, 0)); F4(E, A, B, C, D, GET_P_32(P3, 1)); F4(D, E, A, B, C, GET_P_32(P3, 2)); F4(C, D, E, A, B, GET_P_32(P3, 3)); prep(P3, W3, W0, W1, W2, K60_79); F4(B, C, D, E, A, GET_P_32(P0, 0)); F4(A, B, C, D, E, GET_P_32(P0, 1)); F4(E, A, B, C, D, GET_P_32(P0, 2)); F4(D, E, A, B, C, GET_P_32(P0, 3)); F4(C, D, E, A, B, GET_P_32(P1, 0)); F4(B, C, D, E, A, GET_P_32(P1, 1)); F4(A, B, C, D, E, GET_P_32(P1, 2)); F4(E, A, B, C, D, GET_P_32(P1, 3)); F4(D, E, A, B, C, GET_P_32(P2, 0)); F4(C, D, E, A, B, GET_P_32(P2, 1)); F4(B, C, D, E, A, GET_P_32(P2, 2)); F4(A, B, C, D, E, GET_P_32(P2, 3)); F4(E, A, B, C, D, GET_P_32(P3, 0)); F4(D, E, A, B, C, GET_P_32(P3, 1)); F4(C, D, E, A, B, GET_P_32(P3, 2)); F4(B, C, D, E, A, GET_P_32(P3, 3)); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); E = (digest[4] += E); input += (hash_block_size() / 16); } #undef GET_P_32 } #undef prep00_15 #undef prep } Botan-1.10.12/src/hash/sha1_sse2/sha1_sse2.h0000664000175000017500000000100612654331322020024 0ustar jackjack00000000000000/* * SHA-160 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SHA_160_SSE2_H__ #define BOTAN_SHA_160_SSE2_H__ #include namespace Botan { /** * SHA-160 using SSE2 for the message expansion */ class BOTAN_DLL SHA_160_SSE2 : public SHA_160 { public: HashFunction* clone() const { return new SHA_160_SSE2; } SHA_160_SSE2() : SHA_160(0) {} // no W needed private: void compress_n(const byte[], size_t blocks); }; } #endif Botan-1.10.12/src/hash/sha1_x86_32/info.txt0000664000175000017500000000014212654331322017634 0ustar jackjack00000000000000define SHA1_X86_32 load_on asm_ok x86_32 asm_x86_32 sha1 Botan-1.10.12/src/hash/sha1_x86_32/sha1_x86_32.cpp0000664000175000017500000000102012654331322020505 0ustar jackjack00000000000000/* * SHA-160 in x86-32 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { namespace { extern "C" void botan_sha160_x86_32_compress(u32bit[5], const byte[64], u32bit[81]); } /* * SHA-160 Compression Function */ void SHA_160_X86_32::compress_n(const byte input[], size_t blocks) { for(size_t i = 0; i != blocks; ++i) { botan_sha160_x86_32_compress(&digest[0], input, &W[0]); input += hash_block_size(); } } } Botan-1.10.12/src/hash/sha1_x86_32/sha1_x86_32.h0000664000175000017500000000110212654331322020153 0ustar jackjack00000000000000/* * SHA-160 in x86-32 asm * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SHA_160_X86_32_H__ #define BOTAN_SHA_160_X86_32_H__ #include namespace Botan { /** * SHA-160 in x86 assembly */ class BOTAN_DLL SHA_160_X86_32 : public SHA_160 { public: HashFunction* clone() const { return new SHA_160_X86_32; } // Note 81 instead of normal 80: x86-32 asm needs an extra temp SHA_160_X86_32() : SHA_160(81) {} private: void compress_n(const byte[], size_t blocks); }; } #endif Botan-1.10.12/src/hash/sha1_x86_32/sha1_x86_32_imp.S0000664000175000017500000001576712654331322021021 0ustar jackjack00000000000000/* * SHA-1 in x86-32 asm * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include START_LISTING(sha1_x86_32_imp.S) START_FUNCTION(botan_sha160_x86_32_compress) SPILL_REGS() #define PUSHED 4 ASSIGN(EDI, ARG(2)) ASSIGN(EBP, ARG(3)) ZEROIZE(ESI) START_LOOP(.LOAD_INPUT) ADD_IMM(ESI, 4) ASSIGN(EAX, ARRAY4(EDI, 0)) ASSIGN(EBX, ARRAY4(EDI, 1)) ASSIGN(ECX, ARRAY4(EDI, 2)) ASSIGN(EDX, ARRAY4(EDI, 3)) ADD_IMM(EDI, 16) BSWAP(EAX) BSWAP(EBX) BSWAP(ECX) BSWAP(EDX) ASSIGN(ARRAY4_INDIRECT(EBP,ESI,-4), EAX) ASSIGN(ARRAY4_INDIRECT(EBP,ESI,-3), EBX) ASSIGN(ARRAY4_INDIRECT(EBP,ESI,-2), ECX) ASSIGN(ARRAY4_INDIRECT(EBP,ESI,-1), EDX) LOOP_UNTIL_EQ(ESI, 16, .LOAD_INPUT) ADD2_IMM(EDI, EBP, 64) START_LOOP(.L_SHA_EXPANSION) ADD_IMM(ESI, 4) ZEROIZE(EAX) ASSIGN(EBX, ARRAY4(EDI, -1)) ASSIGN(ECX, ARRAY4(EDI, -2)) ASSIGN(EDX, ARRAY4(EDI, -3)) XOR(EAX, ARRAY4(EDI, -5)) XOR(EBX, ARRAY4(EDI, -6)) XOR(ECX, ARRAY4(EDI, -7)) XOR(EDX, ARRAY4(EDI, -8)) XOR(EAX, ARRAY4(EDI, -11)) XOR(EBX, ARRAY4(EDI, -12)) XOR(ECX, ARRAY4(EDI, -13)) XOR(EDX, ARRAY4(EDI, -14)) XOR(EAX, ARRAY4(EDI, -13)) XOR(EBX, ARRAY4(EDI, -14)) XOR(ECX, ARRAY4(EDI, -15)) XOR(EDX, ARRAY4(EDI, -16)) ROTL_IMM(EDX, 1) ROTL_IMM(ECX, 1) ROTL_IMM(EBX, 1) XOR(EAX, EDX) ROTL_IMM(EAX, 1) ASSIGN(ARRAY4(EDI, 0), EDX) ASSIGN(ARRAY4(EDI, 1), ECX) ASSIGN(ARRAY4(EDI, 2), EBX) ASSIGN(ARRAY4(EDI, 3), EAX) ADD_IMM(EDI, 16) LOOP_UNTIL_EQ(ESI, 80, .L_SHA_EXPANSION) #define MAGIC1 0x5A827999 #define MAGIC2 0x6ED9EBA1 #define MAGIC3 0x8F1BBCDC #define MAGIC4 0xCA62C1D6 #define MSG ESP #define T2 EBP #define F1(A, B, C, D, E, F, N) \ ASSIGN(T2, ARRAY4(MSG, N)) ; \ ASSIGN(A, F) ; \ ROTL_IMM(F, 5) ; \ ADD(F, E) ; \ ASSIGN(E, C) ; \ XOR(E, D) ; \ ADD3_IMM(F, T2, MAGIC1) ; \ AND(E, B) ; \ XOR(E, D) ; \ ROTR_IMM(B, 2) ; \ ADD(E, F) ; #define F2_4(A, B, C, D, E, F, N, MAGIC) \ ASSIGN(T2, ARRAY4(MSG, N)) ; \ ASSIGN(A, F) ; \ ROTL_IMM(F, 5) ; \ ADD(F, E) ; \ ASSIGN(E, B) ; \ XOR(E, C) ; \ ADD3_IMM(F, T2, MAGIC) ; \ XOR(E, D) ; \ ROTR_IMM(B, 2) ; \ ADD(E, F) ; #define F3(A, B, C, D, E, F, N) \ ASSIGN(T2, ARRAY4(MSG, N)) ; \ ASSIGN(A, F) ; \ ROTL_IMM(F, 5) ; \ ADD(F, E) ; \ ASSIGN(E, B) ; \ OR(E, C) ; \ AND(E, D) ; \ ADD3_IMM(F, T2, MAGIC3) ; \ ASSIGN(T2, B) ; \ AND(T2, C) ; \ OR(E, T2) ; \ ROTR_IMM(B, 2) ; \ ADD(E, F) ; #define F2(A, B, C, D, E, F, MSG) \ F2_4(A, B, C, D, E, F, MSG, MAGIC2) #define F4(A, B, C, D, E, F, MSG) \ F2_4(A, B, C, D, E, F, MSG, MAGIC4) ASSIGN(EAX, ARG(1)) ASSIGN(EDI, ARRAY4(EAX, 0)) ASSIGN(EBX, ARRAY4(EAX, 1)) ASSIGN(ECX, ARRAY4(EAX, 2)) ASSIGN(EDX, ARRAY4(EAX, 3)) ASSIGN(ESI, ARRAY4(EAX, 4)) ASSIGN(ARRAY4(EBP, 80), ESP) ASSIGN(ESP, EBP) /* First Round */ F1(EAX, EBX, ECX, EDX, ESI, EDI, 0) F1(EDI, EAX, EBX, ECX, EDX, ESI, 1) F1(ESI, EDI, EAX, EBX, ECX, EDX, 2) F1(EDX, ESI, EDI, EAX, EBX, ECX, 3) F1(ECX, EDX, ESI, EDI, EAX, EBX, 4) F1(EBX, ECX, EDX, ESI, EDI, EAX, 5) F1(EAX, EBX, ECX, EDX, ESI, EDI, 6) F1(EDI, EAX, EBX, ECX, EDX, ESI, 7) F1(ESI, EDI, EAX, EBX, ECX, EDX, 8) F1(EDX, ESI, EDI, EAX, EBX, ECX, 9) F1(ECX, EDX, ESI, EDI, EAX, EBX, 10) F1(EBX, ECX, EDX, ESI, EDI, EAX, 11) F1(EAX, EBX, ECX, EDX, ESI, EDI, 12) F1(EDI, EAX, EBX, ECX, EDX, ESI, 13) F1(ESI, EDI, EAX, EBX, ECX, EDX, 14) F1(EDX, ESI, EDI, EAX, EBX, ECX, 15) F1(ECX, EDX, ESI, EDI, EAX, EBX, 16) F1(EBX, ECX, EDX, ESI, EDI, EAX, 17) F1(EAX, EBX, ECX, EDX, ESI, EDI, 18) F1(EDI, EAX, EBX, ECX, EDX, ESI, 19) /* Second Round */ F2(ESI, EDI, EAX, EBX, ECX, EDX, 20) F2(EDX, ESI, EDI, EAX, EBX, ECX, 21) F2(ECX, EDX, ESI, EDI, EAX, EBX, 22) F2(EBX, ECX, EDX, ESI, EDI, EAX, 23) F2(EAX, EBX, ECX, EDX, ESI, EDI, 24) F2(EDI, EAX, EBX, ECX, EDX, ESI, 25) F2(ESI, EDI, EAX, EBX, ECX, EDX, 26) F2(EDX, ESI, EDI, EAX, EBX, ECX, 27) F2(ECX, EDX, ESI, EDI, EAX, EBX, 28) F2(EBX, ECX, EDX, ESI, EDI, EAX, 29) F2(EAX, EBX, ECX, EDX, ESI, EDI, 30) F2(EDI, EAX, EBX, ECX, EDX, ESI, 31) F2(ESI, EDI, EAX, EBX, ECX, EDX, 32) F2(EDX, ESI, EDI, EAX, EBX, ECX, 33) F2(ECX, EDX, ESI, EDI, EAX, EBX, 34) F2(EBX, ECX, EDX, ESI, EDI, EAX, 35) F2(EAX, EBX, ECX, EDX, ESI, EDI, 36) F2(EDI, EAX, EBX, ECX, EDX, ESI, 37) F2(ESI, EDI, EAX, EBX, ECX, EDX, 38) F2(EDX, ESI, EDI, EAX, EBX, ECX, 39) /* Third Round */ F3(ECX, EDX, ESI, EDI, EAX, EBX, 40) F3(EBX, ECX, EDX, ESI, EDI, EAX, 41) F3(EAX, EBX, ECX, EDX, ESI, EDI, 42) F3(EDI, EAX, EBX, ECX, EDX, ESI, 43) F3(ESI, EDI, EAX, EBX, ECX, EDX, 44) F3(EDX, ESI, EDI, EAX, EBX, ECX, 45) F3(ECX, EDX, ESI, EDI, EAX, EBX, 46) F3(EBX, ECX, EDX, ESI, EDI, EAX, 47) F3(EAX, EBX, ECX, EDX, ESI, EDI, 48) F3(EDI, EAX, EBX, ECX, EDX, ESI, 49) F3(ESI, EDI, EAX, EBX, ECX, EDX, 50) F3(EDX, ESI, EDI, EAX, EBX, ECX, 51) F3(ECX, EDX, ESI, EDI, EAX, EBX, 52) F3(EBX, ECX, EDX, ESI, EDI, EAX, 53) F3(EAX, EBX, ECX, EDX, ESI, EDI, 54) F3(EDI, EAX, EBX, ECX, EDX, ESI, 55) F3(ESI, EDI, EAX, EBX, ECX, EDX, 56) F3(EDX, ESI, EDI, EAX, EBX, ECX, 57) F3(ECX, EDX, ESI, EDI, EAX, EBX, 58) F3(EBX, ECX, EDX, ESI, EDI, EAX, 59) /* Fourth Round */ F4(EAX, EBX, ECX, EDX, ESI, EDI, 60) F4(EDI, EAX, EBX, ECX, EDX, ESI, 61) F4(ESI, EDI, EAX, EBX, ECX, EDX, 62) F4(EDX, ESI, EDI, EAX, EBX, ECX, 63) F4(ECX, EDX, ESI, EDI, EAX, EBX, 64) F4(EBX, ECX, EDX, ESI, EDI, EAX, 65) F4(EAX, EBX, ECX, EDX, ESI, EDI, 66) F4(EDI, EAX, EBX, ECX, EDX, ESI, 67) F4(ESI, EDI, EAX, EBX, ECX, EDX, 68) F4(EDX, ESI, EDI, EAX, EBX, ECX, 69) F4(ECX, EDX, ESI, EDI, EAX, EBX, 70) F4(EBX, ECX, EDX, ESI, EDI, EAX, 71) F4(EAX, EBX, ECX, EDX, ESI, EDI, 72) F4(EDI, EAX, EBX, ECX, EDX, ESI, 73) F4(ESI, EDI, EAX, EBX, ECX, EDX, 74) F4(EDX, ESI, EDI, EAX, EBX, ECX, 75) F4(ECX, EDX, ESI, EDI, EAX, EBX, 76) F4(EBX, ECX, EDX, ESI, EDI, EAX, 77) F4(EAX, EBX, ECX, EDX, ESI, EDI, 78) F4(EDI, EAX, EBX, ECX, EDX, ESI, 79) ASSIGN(ESP, ARRAY4(ESP, 80)) ASSIGN(EBP, ARG(1)) ADD(ARRAY4(EBP, 0), EDX) ADD(ARRAY4(EBP, 1), EDI) ADD(ARRAY4(EBP, 2), EAX) ADD(ARRAY4(EBP, 3), EBX) ADD(ARRAY4(EBP, 4), ECX) RESTORE_REGS() END_FUNCTION(botan_sha160_x86_32_compress) Botan-1.10.12/src/hash/sha1_x86_64/info.txt0000664000175000017500000000015512654331322017645 0ustar jackjack00000000000000define SHA1_X86_64 load_on asm_ok x86_64 asm_engine asm_x86_64 sha1 Botan-1.10.12/src/hash/sha1_x86_64/sha1_x86_64.cpp0000664000175000017500000000100612654331322020523 0ustar jackjack00000000000000/* * SHA-160 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { namespace { extern "C" void botan_sha160_x86_64_compress(u32bit[5], const byte[64], u32bit[80]); } /* * SHA-160 Compression Function */ void SHA_160_X86_64::compress_n(const byte input[], size_t blocks) { for(size_t i = 0; i != blocks; ++i) { botan_sha160_x86_64_compress(&digest[0], input, &W[0]); input += hash_block_size(); } } } Botan-1.10.12/src/hash/sha1_x86_64/sha1_x86_64.h0000664000175000017500000000072112654331322020173 0ustar jackjack00000000000000/* * SHA-160 (x86-64) * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SHA_160_X86_64_H__ #define BOTAN_SHA_160_X86_64_H__ #include namespace Botan { /** * SHA-160 in x86-64 assembly */ class BOTAN_DLL SHA_160_X86_64 : public SHA_160 { public: HashFunction* clone() const { return new SHA_160_X86_64; } private: void compress_n(const byte[], size_t blocks); }; } #endif Botan-1.10.12/src/hash/sha1_x86_64/sha1_x86_64_imp.S0000664000175000017500000001435412654331322021022 0ustar jackjack00000000000000/* * SHA-1 in x86-64 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include START_LISTING(sha1_x86_64_imp.S) START_FUNCTION(botan_sha160_x86_64_compress) #define DIGEST_ARR %rdi #define INPUT %rsi #define W %rdx #define LOOP_CTR %eax #define A %r8d #define B %r9d #define C %r10d #define D %r11d #define E %ecx ZEROIZE(LOOP_CTR) ALIGN; .LOOP_LOAD_INPUT: addl $8, %eax movq ARRAY8(INPUT, 0), %r8 movq ARRAY8(INPUT, 1), %r9 movq ARRAY8(INPUT, 2), %r10 movq ARRAY8(INPUT, 3), %r11 bswap %r8 bswap %r9 bswap %r10 bswap %r11 rolq $32, %r8 rolq $32, %r9 rolq $32, %r10 rolq $32, %r11 movq %r8, ARRAY8(W, 0) movq %r9, ARRAY8(W, 1) movq %r10, ARRAY8(W, 2) movq %r11, ARRAY8(W, 3) addq $32, W addq $32, INPUT cmp IMM(16), LOOP_CTR jne .LOOP_LOAD_INPUT /* #define A %r8d #define B %r9d #define C %r10d #define D %r11d #define E %ecx */ ALIGN; .LOOP_EXPANSION: addl $4, LOOP_CTR ZEROIZE(A) ASSIGN(B, ARRAY4(W, -1)) ASSIGN(C, ARRAY4(W, -2)) ASSIGN(D, ARRAY4(W, -3)) XOR(A, ARRAY4(W, -5)) XOR(B, ARRAY4(W, -6)) XOR(C, ARRAY4(W, -7)) XOR(D, ARRAY4(W, -8)) XOR(A, ARRAY4(W, -11)) XOR(B, ARRAY4(W, -12)) XOR(C, ARRAY4(W, -13)) XOR(D, ARRAY4(W, -14)) XOR(A, ARRAY4(W, -13)) XOR(B, ARRAY4(W, -14)) XOR(C, ARRAY4(W, -15)) XOR(D, ARRAY4(W, -16)) ROTL_IMM(D, 1) ROTL_IMM(C, 1) ROTL_IMM(B, 1) XOR(A, D) ROTL_IMM(A, 1) ASSIGN(ARRAY4(W, 0), D) ASSIGN(ARRAY4(W, 1), C) ASSIGN(ARRAY4(W, 2), B) ASSIGN(ARRAY4(W, 3), A) addq $16, W cmp IMM(80), LOOP_CTR jne .LOOP_EXPANSION subq $320, W /* * Using negative values for SHA-1 constants > 2^31 to work around * a bug in binutils not accepting large lea displacements. * -0x70E44324 == 0x8F1BBCDC * -0x359D3E2A == 0xCA62C1D6 */ #define MAGIC1 0x5A827999 #define MAGIC2 0x6ED9EBA1 #define MAGIC3 -0x70E44324 #define MAGIC4 -0x359D3E2A #define T %esi #define T2 %eax #define F1(A, B, C, D, E, F, N) \ ASSIGN(T2, ARRAY4(W, N)) ; \ ASSIGN(A, F) ; \ ROTL_IMM(F, 5) ; \ ADD(F, E) ; \ ASSIGN(E, C) ; \ XOR(E, D) ; \ ADD3_IMM(F, T2, MAGIC1) ; \ AND(E, B) ; \ XOR(E, D) ; \ ROTR_IMM(B, 2) ; \ ADD(E, F) ; #define F2_4(A, B, C, D, E, F, N, MAGIC) \ ASSIGN(T2, ARRAY4(W, N)) ; \ ASSIGN(A, F) ; \ ROTL_IMM(F, 5) ; \ ADD(F, E) ; \ ASSIGN(E, B) ; \ XOR(E, C) ; \ ADD3_IMM(F, T2, MAGIC) ; \ XOR(E, D) ; \ ROTR_IMM(B, 2) ; \ ADD(E, F) ; #define F3(A, B, C, D, E, F, N) \ ASSIGN(T2, ARRAY4(W, N)) ; \ ASSIGN(A, F) ; \ ROTL_IMM(F, 5) ; \ ADD(F, E) ; \ ASSIGN(E, B) ; \ OR(E, C) ; \ AND(E, D) ; \ ADD3_IMM(F, T2, MAGIC3) ; \ ASSIGN(T2, B) ; \ AND(T2, C) ; \ OR(E, T2) ; \ ROTR_IMM(B, 2) ; \ ADD(E, F) ; #define F2(A, B, C, D, E, F, W) \ F2_4(A, B, C, D, E, F, W, MAGIC2) #define F4(A, B, C, D, E, F, W) \ F2_4(A, B, C, D, E, F, W, MAGIC4) ASSIGN(T, ARRAY4(DIGEST_ARR, 0)) ASSIGN(B, ARRAY4(DIGEST_ARR, 1)) ASSIGN(C, ARRAY4(DIGEST_ARR, 2)) ASSIGN(D, ARRAY4(DIGEST_ARR, 3)) ASSIGN(E, ARRAY4(DIGEST_ARR, 4)) /* First Round */ F1(A, B, C, D, E, T, 0) F1(T, A, B, C, D, E, 1) F1(E, T, A, B, C, D, 2) F1(D, E, T, A, B, C, 3) F1(C, D, E, T, A, B, 4) F1(B, C, D, E, T, A, 5) F1(A, B, C, D, E, T, 6) F1(T, A, B, C, D, E, 7) F1(E, T, A, B, C, D, 8) F1(D, E, T, A, B, C, 9) F1(C, D, E, T, A, B, 10) F1(B, C, D, E, T, A, 11) F1(A, B, C, D, E, T, 12) F1(T, A, B, C, D, E, 13) F1(E, T, A, B, C, D, 14) F1(D, E, T, A, B, C, 15) F1(C, D, E, T, A, B, 16) F1(B, C, D, E, T, A, 17) F1(A, B, C, D, E, T, 18) F1(T, A, B, C, D, E, 19) /* Second Round */ F2(E, T, A, B, C, D, 20) F2(D, E, T, A, B, C, 21) F2(C, D, E, T, A, B, 22) F2(B, C, D, E, T, A, 23) F2(A, B, C, D, E, T, 24) F2(T, A, B, C, D, E, 25) F2(E, T, A, B, C, D, 26) F2(D, E, T, A, B, C, 27) F2(C, D, E, T, A, B, 28) F2(B, C, D, E, T, A, 29) F2(A, B, C, D, E, T, 30) F2(T, A, B, C, D, E, 31) F2(E, T, A, B, C, D, 32) F2(D, E, T, A, B, C, 33) F2(C, D, E, T, A, B, 34) F2(B, C, D, E, T, A, 35) F2(A, B, C, D, E, T, 36) F2(T, A, B, C, D, E, 37) F2(E, T, A, B, C, D, 38) F2(D, E, T, A, B, C, 39) /* Third Round */ F3(C, D, E, T, A, B, 40) F3(B, C, D, E, T, A, 41) F3(A, B, C, D, E, T, 42) F3(T, A, B, C, D, E, 43) F3(E, T, A, B, C, D, 44) F3(D, E, T, A, B, C, 45) F3(C, D, E, T, A, B, 46) F3(B, C, D, E, T, A, 47) F3(A, B, C, D, E, T, 48) F3(T, A, B, C, D, E, 49) F3(E, T, A, B, C, D, 50) F3(D, E, T, A, B, C, 51) F3(C, D, E, T, A, B, 52) F3(B, C, D, E, T, A, 53) F3(A, B, C, D, E, T, 54) F3(T, A, B, C, D, E, 55) F3(E, T, A, B, C, D, 56) F3(D, E, T, A, B, C, 57) F3(C, D, E, T, A, B, 58) F3(B, C, D, E, T, A, 59) /* Fourth Round */ F4(A, B, C, D, E, T, 60) F4(T, A, B, C, D, E, 61) F4(E, T, A, B, C, D, 62) F4(D, E, T, A, B, C, 63) F4(C, D, E, T, A, B, 64) F4(B, C, D, E, T, A, 65) F4(A, B, C, D, E, T, 66) F4(T, A, B, C, D, E, 67) F4(E, T, A, B, C, D, 68) F4(D, E, T, A, B, C, 69) F4(C, D, E, T, A, B, 70) F4(B, C, D, E, T, A, 71) F4(A, B, C, D, E, T, 72) F4(T, A, B, C, D, E, 73) F4(E, T, A, B, C, D, 74) F4(D, E, T, A, B, C, 75) F4(C, D, E, T, A, B, 76) F4(B, C, D, E, T, A, 77) F4(A, B, C, D, E, T, 78) F4(T, A, B, C, D, E, 79) ADD(ARRAY4(DIGEST_ARR, 0), D) ADD(ARRAY4(DIGEST_ARR, 1), T) ADD(ARRAY4(DIGEST_ARR, 2), A) ADD(ARRAY4(DIGEST_ARR, 3), B) ADD(ARRAY4(DIGEST_ARR, 4), C) END_FUNCTION(botan_sha160_x86_64_compress) Botan-1.10.12/src/hash/sha2_32/info.txt0000664000175000017500000000006012654331322017127 0ustar jackjack00000000000000define SHA2_32 mdx_hash Botan-1.10.12/src/hash/sha2_32/sha2_32.cpp0000664000175000017500000002053112654331322017305 0ustar jackjack00000000000000/* * SHA-{224,256} * (C) 1999-2010 Jack Lloyd * 2007 FlexSecure GmbH * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { namespace SHA2_32 { /* * SHA-256 Rho Function */ inline u32bit rho(u32bit X, u32bit rot1, u32bit rot2, u32bit rot3) { return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ rotate_right(X, rot3)); } /* * SHA-256 Sigma Function */ inline u32bit sigma(u32bit X, u32bit rot1, u32bit rot2, u32bit shift) { return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ (X >> shift)); } /* * SHA-256 F1 Function * * Use a macro as many compilers won't inline a function this big, * even though it is much faster if inlined. */ #define SHA2_32_F(A, B, C, D, E, F, G, H, M1, M2, M3, M4, magic) \ do { \ H += magic + rho(E, 6, 11, 25) + ((E & F) ^ (~E & G)) + M1; \ D += H; \ H += rho(A, 2, 13, 22) + ((A & B) | ((A | B) & C)); \ M1 += sigma(M2, 17, 19, 10) + M3 + sigma(M4, 7, 18, 3); \ } while(0); /* * SHA-224 / SHA-256 compression function */ void compress(MemoryRegion& digest, const byte input[], size_t blocks) { u32bit A = digest[0], B = digest[1], C = digest[2], D = digest[3], E = digest[4], F = digest[5], G = digest[6], H = digest[7]; for(size_t i = 0; i != blocks; ++i) { u32bit W00 = load_be(input, 0); u32bit W01 = load_be(input, 1); u32bit W02 = load_be(input, 2); u32bit W03 = load_be(input, 3); u32bit W04 = load_be(input, 4); u32bit W05 = load_be(input, 5); u32bit W06 = load_be(input, 6); u32bit W07 = load_be(input, 7); u32bit W08 = load_be(input, 8); u32bit W09 = load_be(input, 9); u32bit W10 = load_be(input, 10); u32bit W11 = load_be(input, 11); u32bit W12 = load_be(input, 12); u32bit W13 = load_be(input, 13); u32bit W14 = load_be(input, 14); u32bit W15 = load_be(input, 15); SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x428A2F98); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x71374491); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xB5C0FBCF); SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xE9B5DBA5); SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x3956C25B); SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x59F111F1); SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x923F82A4); SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0xAB1C5ED5); SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xD807AA98); SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x12835B01); SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x243185BE); SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x550C7DC3); SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x72BE5D74); SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x80DEB1FE); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x9BDC06A7); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC19BF174); SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xE49B69C1); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xEFBE4786); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x0FC19DC6); SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x240CA1CC); SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x2DE92C6F); SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4A7484AA); SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5CB0A9DC); SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x76F988DA); SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x983E5152); SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA831C66D); SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xB00327C8); SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xBF597FC7); SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xC6E00BF3); SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD5A79147); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x06CA6351); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x14292967); SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x27B70A85); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x2E1B2138); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x4D2C6DFC); SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x53380D13); SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x650A7354); SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x766A0ABB); SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x81C2C92E); SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x92722C85); SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xA2BFE8A1); SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA81A664B); SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xC24B8B70); SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xC76C51A3); SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xD192E819); SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD6990624); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xF40E3585); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x106AA070); SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x19A4C116); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x1E376C08); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x2748774C); SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x34B0BCB5); SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x391C0CB3); SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4ED8AA4A); SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5B9CCA4F); SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x682E6FF3); SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x748F82EE); SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x78A5636F); SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x84C87814); SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x8CC70208); SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x90BEFFFA); SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xA4506CEB); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xBEF9A3F7); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC67178F2); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); E = (digest[4] += E); F = (digest[5] += F); G = (digest[6] += G); H = (digest[7] += H); input += 64; } } } } /* * SHA-224 compression function */ void SHA_224::compress_n(const byte input[], size_t blocks) { SHA2_32::compress(digest, input, blocks); } /* * Copy out the digest */ void SHA_224::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 4) store_be(digest[i/4], output + i); } /* * Clear memory of sensitive data */ void SHA_224::clear() { MDx_HashFunction::clear(); digest[0] = 0xC1059ED8; digest[1] = 0x367CD507; digest[2] = 0x3070DD17; digest[3] = 0xF70E5939; digest[4] = 0xFFC00B31; digest[5] = 0x68581511; digest[6] = 0x64F98FA7; digest[7] = 0xBEFA4FA4; } /* * SHA-256 compression function */ void SHA_256::compress_n(const byte input[], size_t blocks) { SHA2_32::compress(digest, input, blocks); } /* * Copy out the digest */ void SHA_256::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 4) store_be(digest[i/4], output + i); } /* * Clear memory of sensitive data */ void SHA_256::clear() { MDx_HashFunction::clear(); digest[0] = 0x6A09E667; digest[1] = 0xBB67AE85; digest[2] = 0x3C6EF372; digest[3] = 0xA54FF53A; digest[4] = 0x510E527F; digest[5] = 0x9B05688C; digest[6] = 0x1F83D9AB; digest[7] = 0x5BE0CD19; } } Botan-1.10.12/src/hash/sha2_32/sha2_32.h0000664000175000017500000000230512654331322016751 0ustar jackjack00000000000000/* * SHA-{224,256} * (C) 1999-2011 Jack Lloyd * 2007 FlexSecure GmbH * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SHA_224_256_H__ #define BOTAN_SHA_224_256_H__ #include namespace Botan { /** * SHA-224 */ class BOTAN_DLL SHA_224 : public MDx_HashFunction { public: std::string name() const { return "SHA-224"; } size_t output_length() const { return 28; } HashFunction* clone() const { return new SHA_224; } void clear(); SHA_224() : MDx_HashFunction(64, true, true), digest(8) { clear(); } private: void compress_n(const byte[], size_t blocks); void copy_out(byte[]); SecureVector digest; }; /** * SHA-256 */ class BOTAN_DLL SHA_256 : public MDx_HashFunction { public: std::string name() const { return "SHA-256"; } size_t output_length() const { return 32; } HashFunction* clone() const { return new SHA_256; } void clear(); SHA_256() : MDx_HashFunction(64, true, true), digest(8) { clear(); } private: void compress_n(const byte[], size_t blocks); void copy_out(byte[]); SecureVector digest; }; } #endif Botan-1.10.12/src/hash/sha2_64/info.txt0000664000175000017500000000006012654331322017134 0ustar jackjack00000000000000define SHA2_64 mdx_hash Botan-1.10.12/src/hash/sha2_64/sha2_64.cpp0000664000175000017500000002432712654331322017326 0ustar jackjack00000000000000/* * SHA-{384,512} * (C) 1999-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { namespace { namespace SHA2_64 { /* * SHA-{384,512} Rho Function */ inline u64bit rho(u64bit X, u32bit rot1, u32bit rot2, u32bit rot3) { return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ rotate_right(X, rot3)); } /* * SHA-{384,512} Sigma Function */ inline u64bit sigma(u64bit X, u32bit rot1, u32bit rot2, u32bit shift) { return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ (X >> shift)); } /* * SHA-512 F1 Function * * Use a macro as many compilers won't inline a function this big, * even though it is much faster if inlined. */ #define SHA2_64_F(A, B, C, D, E, F, G, H, M1, M2, M3, M4, magic) \ do { \ H += magic + rho(E, 14, 18, 41) + ((E & F) ^ (~E & G)) + M1; \ D += H; \ H += rho(A, 28, 34, 39) + ((A & B) | ((A | B) & C)); \ M1 += sigma(M2, 19, 61, 6) + M3 + sigma(M4, 1, 8, 7); \ } while(0); /* * SHA-{384,512} Compression Function */ void compress(MemoryRegion& digest, const byte input[], size_t blocks) { u64bit A = digest[0], B = digest[1], C = digest[2], D = digest[3], E = digest[4], F = digest[5], G = digest[6], H = digest[7]; for(size_t i = 0; i != blocks; ++i) { u64bit W00 = load_be(input, 0); u64bit W01 = load_be(input, 1); u64bit W02 = load_be(input, 2); u64bit W03 = load_be(input, 3); u64bit W04 = load_be(input, 4); u64bit W05 = load_be(input, 5); u64bit W06 = load_be(input, 6); u64bit W07 = load_be(input, 7); u64bit W08 = load_be(input, 8); u64bit W09 = load_be(input, 9); u64bit W10 = load_be(input, 10); u64bit W11 = load_be(input, 11); u64bit W12 = load_be(input, 12); u64bit W13 = load_be(input, 13); u64bit W14 = load_be(input, 14); u64bit W15 = load_be(input, 15); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x428A2F98D728AE22); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x7137449123EF65CD); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xB5C0FBCFEC4D3B2F); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xE9B5DBA58189DBBC); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x3956C25BF348B538); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x59F111F1B605D019); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x923F82A4AF194F9B); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0xAB1C5ED5DA6D8118); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xD807AA98A3030242); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x12835B0145706FBE); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x243185BE4EE4B28C); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x550C7DC3D5FFB4E2); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x72BE5D74F27B896F); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x80DEB1FE3B1696B1); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x9BDC06A725C71235); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC19BF174CF692694); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xE49B69C19EF14AD2); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xEFBE4786384F25E3); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x0FC19DC68B8CD5B5); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x240CA1CC77AC9C65); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x2DE92C6F592B0275); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4A7484AA6EA6E483); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5CB0A9DCBD41FBD4); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x76F988DA831153B5); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x983E5152EE66DFAB); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA831C66D2DB43210); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xB00327C898FB213F); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xBF597FC7BEEF0EE4); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xC6E00BF33DA88FC2); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD5A79147930AA725); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x06CA6351E003826F); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x142929670A0E6E70); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x27B70A8546D22FFC); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x2E1B21385C26C926); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x4D2C6DFC5AC42AED); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x53380D139D95B3DF); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x650A73548BAF63DE); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x766A0ABB3C77B2A8); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x81C2C92E47EDAEE6); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x92722C851482353B); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xA2BFE8A14CF10364); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA81A664BBC423001); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xC24B8B70D0F89791); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xC76C51A30654BE30); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xD192E819D6EF5218); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD69906245565A910); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xF40E35855771202A); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x106AA07032BBD1B8); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x19A4C116B8D2D0C8); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x1E376C085141AB53); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x2748774CDF8EEB99); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x34B0BCB5E19B48A8); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x391C0CB3C5C95A63); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4ED8AA4AE3418ACB); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5B9CCA4F7763E373); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x682E6FF3D6B2B8A3); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x748F82EE5DEFB2FC); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x78A5636F43172F60); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x84C87814A1F0AB72); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x8CC702081A6439EC); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x90BEFFFA23631E28); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xA4506CEBDE82BDE9); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xBEF9A3F7B2C67915); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC67178F2E372532B); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xCA273ECEEA26619C); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xD186B8C721C0C207); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xEADA7DD6CDE0EB1E); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xF57D4F7FEE6ED178); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x06F067AA72176FBA); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x0A637DC5A2C898A6); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x113F9804BEF90DAE); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x1B710B35131C471B); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x28DB77F523047D84); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x32CAAB7B40C72493); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x3C9EBE0A15C9BEBC); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x431D67C49C100D4C); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x4CC5D4BECB3E42B6); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x597F299CFC657E2A); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x5FCB6FAB3AD6FAEC); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x6C44198C4A475817); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); E = (digest[4] += E); F = (digest[5] += F); G = (digest[6] += G); H = (digest[7] += H); input += 128; } } } } /* * SHA-384 compression function */ void SHA_384::compress_n(const byte input[], size_t blocks) { SHA2_64::compress(digest, input, blocks); } /* * Copy out the digest */ void SHA_384::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 8) store_be(digest[i/8], output + i); } /* * Clear memory of sensitive data */ void SHA_384::clear() { MDx_HashFunction::clear(); digest[0] = 0xCBBB9D5DC1059ED8; digest[1] = 0x629A292A367CD507; digest[2] = 0x9159015A3070DD17; digest[3] = 0x152FECD8F70E5939; digest[4] = 0x67332667FFC00B31; digest[5] = 0x8EB44A8768581511; digest[6] = 0xDB0C2E0D64F98FA7; digest[7] = 0x47B5481DBEFA4FA4; } /* * SHA-512 compression function */ void SHA_512::compress_n(const byte input[], size_t blocks) { SHA2_64::compress(digest, input, blocks); } /* * Copy out the digest */ void SHA_512::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 8) store_be(digest[i/8], output + i); } /* * Clear memory of sensitive data */ void SHA_512::clear() { MDx_HashFunction::clear(); digest[0] = 0x6A09E667F3BCC908; digest[1] = 0xBB67AE8584CAA73B; digest[2] = 0x3C6EF372FE94F82B; digest[3] = 0xA54FF53A5F1D36F1; digest[4] = 0x510E527FADE682D1; digest[5] = 0x9B05688C2B3E6C1F; digest[6] = 0x1F83D9ABFB41BD6B; digest[7] = 0x5BE0CD19137E2179; } } Botan-1.10.12/src/hash/sha2_64/sha2_64.h0000664000175000017500000000226012654331322016763 0ustar jackjack00000000000000/* * SHA-{384,512} * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SHA_64BIT_H__ #define BOTAN_SHA_64BIT_H__ #include namespace Botan { /** * SHA-384 */ class BOTAN_DLL SHA_384 : public MDx_HashFunction { public: std::string name() const { return "SHA-384"; } size_t output_length() const { return 48; } HashFunction* clone() const { return new SHA_384; } void clear(); SHA_384() : MDx_HashFunction(128, true, true, 16), digest(8) { clear(); } private: void compress_n(const byte[], size_t blocks); void copy_out(byte[]); SecureVector digest; }; /** * SHA-512 */ class BOTAN_DLL SHA_512 : public MDx_HashFunction { public: std::string name() const { return "SHA-512"; } size_t output_length() const { return 64; } HashFunction* clone() const { return new SHA_512; } void clear(); SHA_512() : MDx_HashFunction(128, true, true, 16), digest(8) { clear(); } private: void compress_n(const byte[], size_t blocks); void copy_out(byte[]); SecureVector digest; }; } #endif Botan-1.10.12/src/hash/skein/info.txt0000664000175000017500000000005712654331322017105 0ustar jackjack00000000000000define SKEIN_512 alloc Botan-1.10.12/src/hash/skein/skein_512.cpp0000664000175000017500000001661212654331322017621 0ustar jackjack00000000000000/* * The Skein-512 hash function * (C) 2009-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { namespace { enum type_code { SKEIN_KEY = 0, SKEIN_CONFIG = 4, SKEIN_PERSONALIZATION = 8, SKEIN_PUBLIC_KEY = 12, SKEIN_KEY_IDENTIFIER = 16, SKEIN_NONCE = 20, SKEIN_MSG = 48, SKEIN_OUTPUT = 63 }; void ubi_512(MemoryRegion& H, MemoryRegion& T, const byte msg[], size_t msg_len) { do { const size_t to_proc = std::min(msg_len, 64); T[0] += to_proc; u64bit M[8] = { 0 }; load_le(M, msg, to_proc / 8); if(to_proc % 8) { for(size_t j = 0; j != to_proc % 8; ++j) M[to_proc/8] |= static_cast(msg[8*(to_proc/8)+j]) << (8*j); } H[8] = H[0] ^ H[1] ^ H[2] ^ H[3] ^ H[4] ^ H[5] ^ H[6] ^ H[7] ^ 0x1BD11BDAA9FC1A22; T[2] = T[0] ^ T[1]; u64bit X0 = M[0] + H[0]; u64bit X1 = M[1] + H[1]; u64bit X2 = M[2] + H[2]; u64bit X3 = M[3] + H[3]; u64bit X4 = M[4] + H[4]; u64bit X5 = M[5] + H[5] + T[0]; u64bit X6 = M[6] + H[6] + T[1]; u64bit X7 = M[7] + H[7]; #define THREEFISH_ROUND(I1,I2,I3,I4,I5,I6,I7,I8,ROT1,ROT2,ROT3,ROT4) \ do { \ X##I1 += X##I2; X##I2 = rotate_left(X##I2, ROT1) ^ X##I1; \ X##I3 += X##I4; X##I4 = rotate_left(X##I4, ROT2) ^ X##I3; \ X##I5 += X##I6; X##I6 = rotate_left(X##I6, ROT3) ^ X##I5; \ X##I7 += X##I8; X##I8 = rotate_left(X##I8, ROT4) ^ X##I7; \ } while(0); #define THREEFISH_INJECT_KEY(r) \ do { \ X0 += H[(r ) % 9]; \ X1 += H[(r+1) % 9]; \ X2 += H[(r+2) % 9]; \ X3 += H[(r+3) % 9]; \ X4 += H[(r+4) % 9]; \ X5 += H[(r+5) % 9] + T[(r ) % 3]; \ X6 += H[(r+6) % 9] + T[(r+1) % 3]; \ X7 += H[(r+7) % 9] + (r); \ } while(0); #define THREEFISH_8_ROUNDS(R1,R2) \ do { \ THREEFISH_ROUND(0,1,2,3,4,5,6,7, 46,36,19,37); \ THREEFISH_ROUND(2,1,4,7,6,5,0,3, 33,27,14,42); \ THREEFISH_ROUND(4,1,6,3,0,5,2,7, 17,49,36,39); \ THREEFISH_ROUND(6,1,0,7,2,5,4,3, 44, 9,54,56); \ \ THREEFISH_INJECT_KEY(R1); \ \ THREEFISH_ROUND(0,1,2,3,4,5,6,7, 39,30,34,24); \ THREEFISH_ROUND(2,1,4,7,6,5,0,3, 13,50,10,17); \ THREEFISH_ROUND(4,1,6,3,0,5,2,7, 25,29,39,43); \ THREEFISH_ROUND(6,1,0,7,2,5,4,3, 8,35,56,22); \ \ THREEFISH_INJECT_KEY(R2); \ } while(0); THREEFISH_8_ROUNDS(1,2); THREEFISH_8_ROUNDS(3,4); THREEFISH_8_ROUNDS(5,6); THREEFISH_8_ROUNDS(7,8); THREEFISH_8_ROUNDS(9,10); THREEFISH_8_ROUNDS(11,12); THREEFISH_8_ROUNDS(13,14); THREEFISH_8_ROUNDS(15,16); THREEFISH_8_ROUNDS(17,18); // message feed forward H[0] = X0 ^ M[0]; H[1] = X1 ^ M[1]; H[2] = X2 ^ M[2]; H[3] = X3 ^ M[3]; H[4] = X4 ^ M[4]; H[5] = X5 ^ M[5]; H[6] = X6 ^ M[6]; H[7] = X7 ^ M[7]; // clear first flag if set T[1] &= ~(static_cast(1) << 62); msg_len -= to_proc; msg += to_proc; } while(msg_len); } void reset_tweak(MemoryRegion& T, type_code type, bool final) { T[0] = 0; T[1] = (static_cast(type) << 56) | (static_cast(1) << 62) | (static_cast(final) << 63); } void initial_block(MemoryRegion& H, MemoryRegion& T, size_t output_bits, const std::string& personalization) { zeroise(H); // ASCII("SHA3") followed by version (0x0001) code byte config_str[32] = { 0x53, 0x48, 0x41, 0x33, 0x01, 0x00, 0 }; store_le(u32bit(output_bits), config_str + 8); reset_tweak(T, SKEIN_CONFIG, true); ubi_512(H, T, config_str, sizeof(config_str)); if(personalization != "") { /* This is a limitation of this implementation, and not of the algorithm specification. Could be fixed relatively easily, but doesn't seem worth the trouble. */ if(personalization.length() > 64) throw Invalid_Argument("Skein personalization must be <= 64 bytes"); const byte* bits = reinterpret_cast(personalization.data()); reset_tweak(T, SKEIN_PERSONALIZATION, true); ubi_512(H, T, bits, personalization.length()); } reset_tweak(T, SKEIN_MSG, false); } } Skein_512::Skein_512(size_t arg_output_bits, const std::string& arg_personalization) : personalization(arg_personalization), output_bits(arg_output_bits), H(9), T(3), buffer(64), buf_pos(0) { if(output_bits == 0 || output_bits % 8 != 0 || output_bits > 64*1024) throw Invalid_Argument("Bad output bits size for Skein-512"); initial_block(H, T, output_bits, personalization); } std::string Skein_512::name() const { if(personalization != "") return "Skein-512(" + to_string(output_bits) + "," + personalization + ")"; return "Skein-512(" + to_string(output_bits) + ")"; } HashFunction* Skein_512::clone() const { return new Skein_512(output_bits, personalization); } void Skein_512::clear() { zeroise(H); zeroise(T); zeroise(buffer); buf_pos = 0; } void Skein_512::add_data(const byte input[], size_t length) { if(length == 0) return; if(buf_pos) { buffer.copy(buf_pos, input, length); if(buf_pos + length > 64) { ubi_512(H, T, &buffer[0], buffer.size()); input += (64 - buf_pos); length -= (64 - buf_pos); buf_pos = 0; } } const size_t full_blocks = (length - 1) / 64; if(full_blocks) ubi_512(H, T, input, 64*full_blocks); length -= full_blocks * 64; buffer.copy(buf_pos, input + full_blocks * 64, length); buf_pos += length; } void Skein_512::final_result(byte out[]) { T[1] |= (static_cast(1) << 63); // final block flag for(size_t i = buf_pos; i != buffer.size(); ++i) buffer[i] = 0; ubi_512(H, T, &buffer[0], buf_pos); byte counter[8] = { 0 }; size_t out_bytes = output_bits / 8; SecureVector H_out(9); while(out_bytes) { const size_t to_proc = std::min(out_bytes, 64); H_out.copy(&H[0], 8); reset_tweak(T, SKEIN_OUTPUT, true); ubi_512(H_out, T, counter, sizeof(counter)); for(size_t i = 0; i != to_proc; ++i) out[i] = get_byte(7-i%8, H_out[i/8]); out_bytes -= to_proc; out += to_proc; for(size_t i = 0; i != sizeof(counter); ++i) if(++counter[i]) break; } buf_pos = 0; initial_block(H, T, output_bits, personalization); } } Botan-1.10.12/src/hash/skein/skein_512.h0000664000175000017500000000215412654331322017262 0ustar jackjack00000000000000/* * The Skein-512 hash function * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SKEIN_512_H__ #define BOTAN_SKEIN_512_H__ #include #include #include namespace Botan { /** * Skein-512, a SHA-3 candidate */ class BOTAN_DLL Skein_512 : public HashFunction { public: /** * @param output_bits the output size of Skein in bits * @param personalization is a string that will paramaterize the * hash output */ Skein_512(size_t output_bits = 512, const std::string& personalization = ""); size_t hash_block_size() const { return 64; } size_t output_length() const { return output_bits / 8; } HashFunction* clone() const; std::string name() const; void clear(); private: void add_data(const byte input[], size_t length); void final_result(byte out[]); std::string personalization; size_t output_bits; SecureVector H; SecureVector T; SecureVector buffer; size_t buf_pos; }; } #endif Botan-1.10.12/src/hash/tiger/info.txt0000664000175000017500000000005612654331322017105 0ustar jackjack00000000000000define TIGER mdx_hash Botan-1.10.12/src/hash/tiger/tig_tab.cpp0000664000175000017500000005247712654331322017544 0ustar jackjack00000000000000/* * S-Box Tables for Tiger * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { const u64bit Tiger::SBOX1[256] = { 0x02AAB17CF7E90C5E, 0xAC424B03E243A8EC, 0x72CD5BE30DD5FCD3, 0x6D019B93F6F97F3A, 0xCD9978FFD21F9193, 0x7573A1C9708029E2, 0xB164326B922A83C3, 0x46883EEE04915870, 0xEAACE3057103ECE6, 0xC54169B808A3535C, 0x4CE754918DDEC47C, 0x0AA2F4DFDC0DF40C, 0x10B76F18A74DBEFA, 0xC6CCB6235AD1AB6A, 0x13726121572FE2FF, 0x1A488C6F199D921E, 0x4BC9F9F4DA0007CA, 0x26F5E6F6E85241C7, 0x859079DBEA5947B6, 0x4F1885C5C99E8C92, 0xD78E761EA96F864B, 0x8E36428C52B5C17D, 0x69CF6827373063C1, 0xB607C93D9BB4C56E, 0x7D820E760E76B5EA, 0x645C9CC6F07FDC42, 0xBF38A078243342E0, 0x5F6B343C9D2E7D04, 0xF2C28AEB600B0EC6, 0x6C0ED85F7254BCAC, 0x71592281A4DB4FE5, 0x1967FA69CE0FED9F, 0xFD5293F8B96545DB, 0xC879E9D7F2A7600B, 0x860248920193194E, 0xA4F9533B2D9CC0B3, 0x9053836C15957613, 0xDB6DCF8AFC357BF1, 0x18BEEA7A7A370F57, 0x037117CA50B99066, 0x6AB30A9774424A35, 0xF4E92F02E325249B, 0x7739DB07061CCAE1, 0xD8F3B49CECA42A05, 0xBD56BE3F51382F73, 0x45FAED5843B0BB28, 0x1C813D5C11BF1F83, 0x8AF0E4B6D75FA169, 0x33EE18A487AD9999, 0x3C26E8EAB1C94410, 0xB510102BC0A822F9, 0x141EEF310CE6123B, 0xFC65B90059DDB154, 0xE0158640C5E0E607, 0x884E079826C3A3CF, 0x930D0D9523C535FD, 0x35638D754E9A2B00, 0x4085FCCF40469DD5, 0xC4B17AD28BE23A4C, 0xCAB2F0FC6A3E6A2E, 0x2860971A6B943FCD, 0x3DDE6EE212E30446, 0x6222F32AE01765AE, 0x5D550BB5478308FE, 0xA9EFA98DA0EDA22A, 0xC351A71686C40DA7, 0x1105586D9C867C84, 0xDCFFEE85FDA22853, 0xCCFBD0262C5EEF76, 0xBAF294CB8990D201, 0xE69464F52AFAD975, 0x94B013AFDF133E14, 0x06A7D1A32823C958, 0x6F95FE5130F61119, 0xD92AB34E462C06C0, 0xED7BDE33887C71D2, 0x79746D6E6518393E, 0x5BA419385D713329, 0x7C1BA6B948A97564, 0x31987C197BFDAC67, 0xDE6C23C44B053D02, 0x581C49FED002D64D, 0xDD474D6338261571, 0xAA4546C3E473D062, 0x928FCE349455F860, 0x48161BBACAAB94D9, 0x63912430770E6F68, 0x6EC8A5E602C6641C, 0x87282515337DDD2B, 0x2CDA6B42034B701B, 0xB03D37C181CB096D, 0xE108438266C71C6F, 0x2B3180C7EB51B255, 0xDF92B82F96C08BBC, 0x5C68C8C0A632F3BA, 0x5504CC861C3D0556, 0xABBFA4E55FB26B8F, 0x41848B0AB3BACEB4, 0xB334A273AA445D32, 0xBCA696F0A85AD881, 0x24F6EC65B528D56C, 0x0CE1512E90F4524A, 0x4E9DD79D5506D35A, 0x258905FAC6CE9779, 0x2019295B3E109B33, 0xF8A9478B73A054CC, 0x2924F2F934417EB0, 0x3993357D536D1BC4, 0x38A81AC21DB6FF8B, 0x47C4FBF17D6016BF, 0x1E0FAADD7667E3F5, 0x7ABCFF62938BEB96, 0xA78DAD948FC179C9, 0x8F1F98B72911E50D, 0x61E48EAE27121A91, 0x4D62F7AD31859808, 0xECEBA345EF5CEAEB, 0xF5CEB25EBC9684CE, 0xF633E20CB7F76221, 0xA32CDF06AB8293E4, 0x985A202CA5EE2CA4, 0xCF0B8447CC8A8FB1, 0x9F765244979859A3, 0xA8D516B1A1240017, 0x0BD7BA3EBB5DC726, 0xE54BCA55B86ADB39, 0x1D7A3AFD6C478063, 0x519EC608E7669EDD, 0x0E5715A2D149AA23, 0x177D4571848FF194, 0xEEB55F3241014C22, 0x0F5E5CA13A6E2EC2, 0x8029927B75F5C361, 0xAD139FABC3D6E436, 0x0D5DF1A94CCF402F, 0x3E8BD948BEA5DFC8, 0xA5A0D357BD3FF77E, 0xA2D12E251F74F645, 0x66FD9E525E81A082, 0x2E0C90CE7F687A49, 0xC2E8BCBEBA973BC5, 0x000001BCE509745F, 0x423777BBE6DAB3D6, 0xD1661C7EAEF06EB5, 0xA1781F354DAACFD8, 0x2D11284A2B16AFFC, 0xF1FC4F67FA891D1F, 0x73ECC25DCB920ADA, 0xAE610C22C2A12651, 0x96E0A810D356B78A, 0x5A9A381F2FE7870F, 0xD5AD62EDE94E5530, 0xD225E5E8368D1427, 0x65977B70C7AF4631, 0x99F889B2DE39D74F, 0x233F30BF54E1D143, 0x9A9675D3D9A63C97, 0x5470554FF334F9A8, 0x166ACB744A4F5688, 0x70C74CAAB2E4AEAD, 0xF0D091646F294D12, 0x57B82A89684031D1, 0xEFD95A5A61BE0B6B, 0x2FBD12E969F2F29A, 0x9BD37013FEFF9FE8, 0x3F9B0404D6085A06, 0x4940C1F3166CFE15, 0x09542C4DCDF3DEFB, 0xB4C5218385CD5CE3, 0xC935B7DC4462A641, 0x3417F8A68ED3B63F, 0xB80959295B215B40, 0xF99CDAEF3B8C8572, 0x018C0614F8FCB95D, 0x1B14ACCD1A3ACDF3, 0x84D471F200BB732D, 0xC1A3110E95E8DA16, 0x430A7220BF1A82B8, 0xB77E090D39DF210E, 0x5EF4BD9F3CD05E9D, 0x9D4FF6DA7E57A444, 0xDA1D60E183D4A5F8, 0xB287C38417998E47, 0xFE3EDC121BB31886, 0xC7FE3CCC980CCBEF, 0xE46FB590189BFD03, 0x3732FD469A4C57DC, 0x7EF700A07CF1AD65, 0x59C64468A31D8859, 0x762FB0B4D45B61F6, 0x155BAED099047718, 0x68755E4C3D50BAA6, 0xE9214E7F22D8B4DF, 0x2ADDBF532EAC95F4, 0x32AE3909B4BD0109, 0x834DF537B08E3450, 0xFA209DA84220728D, 0x9E691D9B9EFE23F7, 0x0446D288C4AE8D7F, 0x7B4CC524E169785B, 0x21D87F0135CA1385, 0xCEBB400F137B8AA5, 0x272E2B66580796BE, 0x3612264125C2B0DE, 0x057702BDAD1EFBB2, 0xD4BABB8EACF84BE9, 0x91583139641BC67B, 0x8BDC2DE08036E024, 0x603C8156F49F68ED, 0xF7D236F7DBEF5111, 0x9727C4598AD21E80, 0xA08A0896670A5FD7, 0xCB4A8F4309EBA9CB, 0x81AF564B0F7036A1, 0xC0B99AA778199ABD, 0x959F1EC83FC8E952, 0x8C505077794A81B9, 0x3ACAAF8F056338F0, 0x07B43F50627A6778, 0x4A44AB49F5ECCC77, 0x3BC3D6E4B679EE98, 0x9CC0D4D1CF14108C, 0x4406C00B206BC8A0, 0x82A18854C8D72D89, 0x67E366B35C3C432C, 0xB923DD61102B37F2, 0x56AB2779D884271D, 0xBE83E1B0FF1525AF, 0xFB7C65D4217E49A9, 0x6BDBE0E76D48E7D4, 0x08DF828745D9179E, 0x22EA6A9ADD53BD34, 0xE36E141C5622200A, 0x7F805D1B8CB750EE, 0xAFE5C7A59F58E837, 0xE27F996A4FB1C23C, 0xD3867DFB0775F0D0, 0xD0E673DE6E88891A, 0x123AEB9EAFB86C25, 0x30F1D5D5C145B895, 0xBB434A2DEE7269E7, 0x78CB67ECF931FA38, 0xF33B0372323BBF9C, 0x52D66336FB279C74, 0x505F33AC0AFB4EAA, 0xE8A5CD99A2CCE187, 0x534974801E2D30BB, 0x8D2D5711D5876D90, 0x1F1A412891BC038E, 0xD6E2E71D82E56648, 0x74036C3A497732B7, 0x89B67ED96361F5AB, 0xFFED95D8F1EA02A2, 0xE72B3BD61464D43D, 0xA6300F170BDC4820, 0xEBC18760ED78A77A }; const u64bit Tiger::SBOX2[256] = { 0xE6A6BE5A05A12138, 0xB5A122A5B4F87C98, 0x563C6089140B6990, 0x4C46CB2E391F5DD5, 0xD932ADDBC9B79434, 0x08EA70E42015AFF5, 0xD765A6673E478CF1, 0xC4FB757EAB278D99, 0xDF11C6862D6E0692, 0xDDEB84F10D7F3B16, 0x6F2EF604A665EA04, 0x4A8E0F0FF0E0DFB3, 0xA5EDEEF83DBCBA51, 0xFC4F0A2A0EA4371E, 0xE83E1DA85CB38429, 0xDC8FF882BA1B1CE2, 0xCD45505E8353E80D, 0x18D19A00D4DB0717, 0x34A0CFEDA5F38101, 0x0BE77E518887CAF2, 0x1E341438B3C45136, 0xE05797F49089CCF9, 0xFFD23F9DF2591D14, 0x543DDA228595C5CD, 0x661F81FD99052A33, 0x8736E641DB0F7B76, 0x15227725418E5307, 0xE25F7F46162EB2FA, 0x48A8B2126C13D9FE, 0xAFDC541792E76EEA, 0x03D912BFC6D1898F, 0x31B1AAFA1B83F51B, 0xF1AC2796E42AB7D9, 0x40A3A7D7FCD2EBAC, 0x1056136D0AFBBCC5, 0x7889E1DD9A6D0C85, 0xD33525782A7974AA, 0xA7E25D09078AC09B, 0xBD4138B3EAC6EDD0, 0x920ABFBE71EB9E70, 0xA2A5D0F54FC2625C, 0xC054E36B0B1290A3, 0xF6DD59FF62FE932B, 0x3537354511A8AC7D, 0xCA845E9172FADCD4, 0x84F82B60329D20DC, 0x79C62CE1CD672F18, 0x8B09A2ADD124642C, 0xD0C1E96A19D9E726, 0x5A786A9B4BA9500C, 0x0E020336634C43F3, 0xC17B474AEB66D822, 0x6A731AE3EC9BAAC2, 0x8226667AE0840258, 0x67D4567691CAECA5, 0x1D94155C4875ADB5, 0x6D00FD985B813FDF, 0x51286EFCB774CD06, 0x5E8834471FA744AF, 0xF72CA0AEE761AE2E, 0xBE40E4CDAEE8E09A, 0xE9970BBB5118F665, 0x726E4BEB33DF1964, 0x703B000729199762, 0x4631D816F5EF30A7, 0xB880B5B51504A6BE, 0x641793C37ED84B6C, 0x7B21ED77F6E97D96, 0x776306312EF96B73, 0xAE528948E86FF3F4, 0x53DBD7F286A3F8F8, 0x16CADCE74CFC1063, 0x005C19BDFA52C6DD, 0x68868F5D64D46AD3, 0x3A9D512CCF1E186A, 0x367E62C2385660AE, 0xE359E7EA77DCB1D7, 0x526C0773749ABE6E, 0x735AE5F9D09F734B, 0x493FC7CC8A558BA8, 0xB0B9C1533041AB45, 0x321958BA470A59BD, 0x852DB00B5F46C393, 0x91209B2BD336B0E5, 0x6E604F7D659EF19F, 0xB99A8AE2782CCB24, 0xCCF52AB6C814C4C7, 0x4727D9AFBE11727B, 0x7E950D0C0121B34D, 0x756F435670AD471F, 0xF5ADD442615A6849, 0x4E87E09980B9957A, 0x2ACFA1DF50AEE355, 0xD898263AFD2FD556, 0xC8F4924DD80C8FD6, 0xCF99CA3D754A173A, 0xFE477BACAF91BF3C, 0xED5371F6D690C12D, 0x831A5C285E687094, 0xC5D3C90A3708A0A4, 0x0F7F903717D06580, 0x19F9BB13B8FDF27F, 0xB1BD6F1B4D502843, 0x1C761BA38FFF4012, 0x0D1530C4E2E21F3B, 0x8943CE69A7372C8A, 0xE5184E11FEB5CE66, 0x618BDB80BD736621, 0x7D29BAD68B574D0B, 0x81BB613E25E6FE5B, 0x071C9C10BC07913F, 0xC7BEEB7909AC2D97, 0xC3E58D353BC5D757, 0xEB017892F38F61E8, 0xD4EFFB9C9B1CC21A, 0x99727D26F494F7AB, 0xA3E063A2956B3E03, 0x9D4A8B9A4AA09C30, 0x3F6AB7D500090FB4, 0x9CC0F2A057268AC0, 0x3DEE9D2DEDBF42D1, 0x330F49C87960A972, 0xC6B2720287421B41, 0x0AC59EC07C00369C, 0xEF4EAC49CB353425, 0xF450244EEF0129D8, 0x8ACC46E5CAF4DEB6, 0x2FFEAB63989263F7, 0x8F7CB9FE5D7A4578, 0x5BD8F7644E634635, 0x427A7315BF2DC900, 0x17D0C4AA2125261C, 0x3992486C93518E50, 0xB4CBFEE0A2D7D4C3, 0x7C75D6202C5DDD8D, 0xDBC295D8E35B6C61, 0x60B369D302032B19, 0xCE42685FDCE44132, 0x06F3DDB9DDF65610, 0x8EA4D21DB5E148F0, 0x20B0FCE62FCD496F, 0x2C1B912358B0EE31, 0xB28317B818F5A308, 0xA89C1E189CA6D2CF, 0x0C6B18576AAADBC8, 0xB65DEAA91299FAE3, 0xFB2B794B7F1027E7, 0x04E4317F443B5BEB, 0x4B852D325939D0A6, 0xD5AE6BEEFB207FFC, 0x309682B281C7D374, 0xBAE309A194C3B475, 0x8CC3F97B13B49F05, 0x98A9422FF8293967, 0x244B16B01076FF7C, 0xF8BF571C663D67EE, 0x1F0D6758EEE30DA1, 0xC9B611D97ADEB9B7, 0xB7AFD5887B6C57A2, 0x6290AE846B984FE1, 0x94DF4CDEACC1A5FD, 0x058A5BD1C5483AFF, 0x63166CC142BA3C37, 0x8DB8526EB2F76F40, 0xE10880036F0D6D4E, 0x9E0523C9971D311D, 0x45EC2824CC7CD691, 0x575B8359E62382C9, 0xFA9E400DC4889995, 0xD1823ECB45721568, 0xDAFD983B8206082F, 0xAA7D29082386A8CB, 0x269FCD4403B87588, 0x1B91F5F728BDD1E0, 0xE4669F39040201F6, 0x7A1D7C218CF04ADE, 0x65623C29D79CE5CE, 0x2368449096C00BB1, 0xAB9BF1879DA503BA, 0xBC23ECB1A458058E, 0x9A58DF01BB401ECC, 0xA070E868A85F143D, 0x4FF188307DF2239E, 0x14D565B41A641183, 0xEE13337452701602, 0x950E3DCF3F285E09, 0x59930254B9C80953, 0x3BF299408930DA6D, 0xA955943F53691387, 0xA15EDECAA9CB8784, 0x29142127352BE9A0, 0x76F0371FFF4E7AFB, 0x0239F450274F2228, 0xBB073AF01D5E868B, 0xBFC80571C10E96C1, 0xD267088568222E23, 0x9671A3D48E80B5B0, 0x55B5D38AE193BB81, 0x693AE2D0A18B04B8, 0x5C48B4ECADD5335F, 0xFD743B194916A1CA, 0x2577018134BE98C4, 0xE77987E83C54A4AD, 0x28E11014DA33E1B9, 0x270CC59E226AA213, 0x71495F756D1A5F60, 0x9BE853FB60AFEF77, 0xADC786A7F7443DBF, 0x0904456173B29A82, 0x58BC7A66C232BD5E, 0xF306558C673AC8B2, 0x41F639C6B6C9772A, 0x216DEFE99FDA35DA, 0x11640CC71C7BE615, 0x93C43694565C5527, 0xEA038E6246777839, 0xF9ABF3CE5A3E2469, 0x741E768D0FD312D2, 0x0144B883CED652C6, 0xC20B5A5BA33F8552, 0x1AE69633C3435A9D, 0x97A28CA4088CFDEC, 0x8824A43C1E96F420, 0x37612FA66EEEA746, 0x6B4CB165F9CF0E5A, 0x43AA1C06A0ABFB4A, 0x7F4DC26FF162796B, 0x6CBACC8E54ED9B0F, 0xA6B7FFEFD2BB253E, 0x2E25BC95B0A29D4F, 0x86D6A58BDEF1388C, 0xDED74AC576B6F054, 0x8030BDBC2B45805D, 0x3C81AF70E94D9289, 0x3EFF6DDA9E3100DB, 0xB38DC39FDFCC8847, 0x123885528D17B87E, 0xF2DA0ED240B1B642, 0x44CEFADCD54BF9A9, 0x1312200E433C7EE6, 0x9FFCC84F3A78C748, 0xF0CD1F72248576BB, 0xEC6974053638CFE4, 0x2BA7B67C0CEC4E4C, 0xAC2F4DF3E5CE32ED, 0xCB33D14326EA4C11, 0xA4E9044CC77E58BC, 0x5F513293D934FCEF, 0x5DC9645506E55444, 0x50DE418F317DE40A, 0x388CB31A69DDE259, 0x2DB4A83455820A86, 0x9010A91E84711AE9, 0x4DF7F0B7B1498371, 0xD62A2EABC0977179, 0x22FAC097AA8D5C0E }; const u64bit Tiger::SBOX3[256] = { 0xF49FCC2FF1DAF39B, 0x487FD5C66FF29281, 0xE8A30667FCDCA83F, 0x2C9B4BE3D2FCCE63, 0xDA3FF74B93FBBBC2, 0x2FA165D2FE70BA66, 0xA103E279970E93D4, 0xBECDEC77B0E45E71, 0xCFB41E723985E497, 0xB70AAA025EF75017, 0xD42309F03840B8E0, 0x8EFC1AD035898579, 0x96C6920BE2B2ABC5, 0x66AF4163375A9172, 0x2174ABDCCA7127FB, 0xB33CCEA64A72FF41, 0xF04A4933083066A5, 0x8D970ACDD7289AF5, 0x8F96E8E031C8C25E, 0xF3FEC02276875D47, 0xEC7BF310056190DD, 0xF5ADB0AEBB0F1491, 0x9B50F8850FD58892, 0x4975488358B74DE8, 0xA3354FF691531C61, 0x0702BBE481D2C6EE, 0x89FB24057DEDED98, 0xAC3075138596E902, 0x1D2D3580172772ED, 0xEB738FC28E6BC30D, 0x5854EF8F63044326, 0x9E5C52325ADD3BBE, 0x90AA53CF325C4623, 0xC1D24D51349DD067, 0x2051CFEEA69EA624, 0x13220F0A862E7E4F, 0xCE39399404E04864, 0xD9C42CA47086FCB7, 0x685AD2238A03E7CC, 0x066484B2AB2FF1DB, 0xFE9D5D70EFBF79EC, 0x5B13B9DD9C481854, 0x15F0D475ED1509AD, 0x0BEBCD060EC79851, 0xD58C6791183AB7F8, 0xD1187C5052F3EEE4, 0xC95D1192E54E82FF, 0x86EEA14CB9AC6CA2, 0x3485BEB153677D5D, 0xDD191D781F8C492A, 0xF60866BAA784EBF9, 0x518F643BA2D08C74, 0x8852E956E1087C22, 0xA768CB8DC410AE8D, 0x38047726BFEC8E1A, 0xA67738B4CD3B45AA, 0xAD16691CEC0DDE19, 0xC6D4319380462E07, 0xC5A5876D0BA61938, 0x16B9FA1FA58FD840, 0x188AB1173CA74F18, 0xABDA2F98C99C021F, 0x3E0580AB134AE816, 0x5F3B05B773645ABB, 0x2501A2BE5575F2F6, 0x1B2F74004E7E8BA9, 0x1CD7580371E8D953, 0x7F6ED89562764E30, 0xB15926FF596F003D, 0x9F65293DA8C5D6B9, 0x6ECEF04DD690F84C, 0x4782275FFF33AF88, 0xE41433083F820801, 0xFD0DFE409A1AF9B5, 0x4325A3342CDB396B, 0x8AE77E62B301B252, 0xC36F9E9F6655615A, 0x85455A2D92D32C09, 0xF2C7DEA949477485, 0x63CFB4C133A39EBA, 0x83B040CC6EBC5462, 0x3B9454C8FDB326B0, 0x56F56A9E87FFD78C, 0x2DC2940D99F42BC6, 0x98F7DF096B096E2D, 0x19A6E01E3AD852BF, 0x42A99CCBDBD4B40B, 0xA59998AF45E9C559, 0x366295E807D93186, 0x6B48181BFAA1F773, 0x1FEC57E2157A0A1D, 0x4667446AF6201AD5, 0xE615EBCACFB0F075, 0xB8F31F4F68290778, 0x22713ED6CE22D11E, 0x3057C1A72EC3C93B, 0xCB46ACC37C3F1F2F, 0xDBB893FD02AAF50E, 0x331FD92E600B9FCF, 0xA498F96148EA3AD6, 0xA8D8426E8B6A83EA, 0xA089B274B7735CDC, 0x87F6B3731E524A11, 0x118808E5CBC96749, 0x9906E4C7B19BD394, 0xAFED7F7E9B24A20C, 0x6509EADEEB3644A7, 0x6C1EF1D3E8EF0EDE, 0xB9C97D43E9798FB4, 0xA2F2D784740C28A3, 0x7B8496476197566F, 0x7A5BE3E6B65F069D, 0xF96330ED78BE6F10, 0xEEE60DE77A076A15, 0x2B4BEE4AA08B9BD0, 0x6A56A63EC7B8894E, 0x02121359BA34FEF4, 0x4CBF99F8283703FC, 0x398071350CAF30C8, 0xD0A77A89F017687A, 0xF1C1A9EB9E423569, 0x8C7976282DEE8199, 0x5D1737A5DD1F7ABD, 0x4F53433C09A9FA80, 0xFA8B0C53DF7CA1D9, 0x3FD9DCBC886CCB77, 0xC040917CA91B4720, 0x7DD00142F9D1DCDF, 0x8476FC1D4F387B58, 0x23F8E7C5F3316503, 0x032A2244E7E37339, 0x5C87A5D750F5A74B, 0x082B4CC43698992E, 0xDF917BECB858F63C, 0x3270B8FC5BF86DDA, 0x10AE72BB29B5DD76, 0x576AC94E7700362B, 0x1AD112DAC61EFB8F, 0x691BC30EC5FAA427, 0xFF246311CC327143, 0x3142368E30E53206, 0x71380E31E02CA396, 0x958D5C960AAD76F1, 0xF8D6F430C16DA536, 0xC8FFD13F1BE7E1D2, 0x7578AE66004DDBE1, 0x05833F01067BE646, 0xBB34B5AD3BFE586D, 0x095F34C9A12B97F0, 0x247AB64525D60CA8, 0xDCDBC6F3017477D1, 0x4A2E14D4DECAD24D, 0xBDB5E6D9BE0A1EEB, 0x2A7E70F7794301AB, 0xDEF42D8A270540FD, 0x01078EC0A34C22C1, 0xE5DE511AF4C16387, 0x7EBB3A52BD9A330A, 0x77697857AA7D6435, 0x004E831603AE4C32, 0xE7A21020AD78E312, 0x9D41A70C6AB420F2, 0x28E06C18EA1141E6, 0xD2B28CBD984F6B28, 0x26B75F6C446E9D83, 0xBA47568C4D418D7F, 0xD80BADBFE6183D8E, 0x0E206D7F5F166044, 0xE258A43911CBCA3E, 0x723A1746B21DC0BC, 0xC7CAA854F5D7CDD3, 0x7CAC32883D261D9C, 0x7690C26423BA942C, 0x17E55524478042B8, 0xE0BE477656A2389F, 0x4D289B5E67AB2DA0, 0x44862B9C8FBBFD31, 0xB47CC8049D141365, 0x822C1B362B91C793, 0x4EB14655FB13DFD8, 0x1ECBBA0714E2A97B, 0x6143459D5CDE5F14, 0x53A8FBF1D5F0AC89, 0x97EA04D81C5E5B00, 0x622181A8D4FDB3F3, 0xE9BCD341572A1208, 0x1411258643CCE58A, 0x9144C5FEA4C6E0A4, 0x0D33D06565CF620F, 0x54A48D489F219CA1, 0xC43E5EAC6D63C821, 0xA9728B3A72770DAF, 0xD7934E7B20DF87EF, 0xE35503B61A3E86E5, 0xCAE321FBC819D504, 0x129A50B3AC60BFA6, 0xCD5E68EA7E9FB6C3, 0xB01C90199483B1C7, 0x3DE93CD5C295376C, 0xAED52EDF2AB9AD13, 0x2E60F512C0A07884, 0xBC3D86A3E36210C9, 0x35269D9B163951CE, 0x0C7D6E2AD0CDB5FA, 0x59E86297D87F5733, 0x298EF221898DB0E7, 0x55000029D1A5AA7E, 0x8BC08AE1B5061B45, 0xC2C31C2B6C92703A, 0x94CC596BAF25EF42, 0x0A1D73DB22540456, 0x04B6A0F9D9C4179A, 0xEFFDAFA2AE3D3C60, 0xF7C8075BB49496C4, 0x9CC5C7141D1CD4E3, 0x78BD1638218E5534, 0xB2F11568F850246A, 0xEDFABCFA9502BC29, 0x796CE5F2DA23051B, 0xAAE128B0DC93537C, 0x3A493DA0EE4B29AE, 0xB5DF6B2C416895D7, 0xFCABBD25122D7F37, 0x70810B58105DC4B1, 0xE10FDD37F7882A90, 0x524DCAB5518A3F5C, 0x3C9E85878451255B, 0x4029828119BD34E2, 0x74A05B6F5D3CECCB, 0xB610021542E13ECA, 0x0FF979D12F59E2AC, 0x6037DA27E4F9CC50, 0x5E92975A0DF1847D, 0xD66DE190D3E623FE, 0x5032D6B87B568048, 0x9A36B7CE8235216E, 0x80272A7A24F64B4A, 0x93EFED8B8C6916F7, 0x37DDBFF44CCE1555, 0x4B95DB5D4B99BD25, 0x92D3FDA169812FC0, 0xFB1A4A9A90660BB6, 0x730C196946A4B9B2, 0x81E289AA7F49DA68, 0x64669A0F83B1A05F, 0x27B3FF7D9644F48B, 0xCC6B615C8DB675B3, 0x674F20B9BCEBBE95, 0x6F31238275655982, 0x5AE488713E45CF05, 0xBF619F9954C21157, 0xEABAC46040A8EAE9, 0x454C6FE9F2C0C1CD, 0x419CF6496412691C, 0xD3DC3BEF265B0F70, 0x6D0E60F5C3578A9E }; const u64bit Tiger::SBOX4[256] = { 0x5B0E608526323C55, 0x1A46C1A9FA1B59F5, 0xA9E245A17C4C8FFA, 0x65CA5159DB2955D7, 0x05DB0A76CE35AFC2, 0x81EAC77EA9113D45, 0x528EF88AB6AC0A0D, 0xA09EA253597BE3FF, 0x430DDFB3AC48CD56, 0xC4B3A67AF45CE46F, 0x4ECECFD8FBE2D05E, 0x3EF56F10B39935F0, 0x0B22D6829CD619C6, 0x17FD460A74DF2069, 0x6CF8CC8E8510ED40, 0xD6C824BF3A6ECAA7, 0x61243D581A817049, 0x048BACB6BBC163A2, 0xD9A38AC27D44CC32, 0x7FDDFF5BAAF410AB, 0xAD6D495AA804824B, 0xE1A6A74F2D8C9F94, 0xD4F7851235DEE8E3, 0xFD4B7F886540D893, 0x247C20042AA4BFDA, 0x096EA1C517D1327C, 0xD56966B4361A6685, 0x277DA5C31221057D, 0x94D59893A43ACFF7, 0x64F0C51CCDC02281, 0x3D33BCC4FF6189DB, 0xE005CB184CE66AF1, 0xFF5CCD1D1DB99BEA, 0xB0B854A7FE42980F, 0x7BD46A6A718D4B9F, 0xD10FA8CC22A5FD8C, 0xD31484952BE4BD31, 0xC7FA975FCB243847, 0x4886ED1E5846C407, 0x28CDDB791EB70B04, 0xC2B00BE2F573417F, 0x5C9590452180F877, 0x7A6BDDFFF370EB00, 0xCE509E38D6D9D6A4, 0xEBEB0F00647FA702, 0x1DCC06CF76606F06, 0xE4D9F28BA286FF0A, 0xD85A305DC918C262, 0x475B1D8732225F54, 0x2D4FB51668CCB5FE, 0xA679B9D9D72BBA20, 0x53841C0D912D43A5, 0x3B7EAA48BF12A4E8, 0x781E0E47F22F1DDF, 0xEFF20CE60AB50973, 0x20D261D19DFFB742, 0x16A12B03062A2E39, 0x1960EB2239650495, 0x251C16FED50EB8B8, 0x9AC0C330F826016E, 0xED152665953E7671, 0x02D63194A6369570, 0x5074F08394B1C987, 0x70BA598C90B25CE1, 0x794A15810B9742F6, 0x0D5925E9FCAF8C6C, 0x3067716CD868744E, 0x910AB077E8D7731B, 0x6A61BBDB5AC42F61, 0x93513EFBF0851567, 0xF494724B9E83E9D5, 0xE887E1985C09648D, 0x34B1D3C675370CFD, 0xDC35E433BC0D255D, 0xD0AAB84234131BE0, 0x08042A50B48B7EAF, 0x9997C4EE44A3AB35, 0x829A7B49201799D0, 0x263B8307B7C54441, 0x752F95F4FD6A6CA6, 0x927217402C08C6E5, 0x2A8AB754A795D9EE, 0xA442F7552F72943D, 0x2C31334E19781208, 0x4FA98D7CEAEE6291, 0x55C3862F665DB309, 0xBD0610175D53B1F3, 0x46FE6CB840413F27, 0x3FE03792DF0CFA59, 0xCFE700372EB85E8F, 0xA7BE29E7ADBCE118, 0xE544EE5CDE8431DD, 0x8A781B1B41F1873E, 0xA5C94C78A0D2F0E7, 0x39412E2877B60728, 0xA1265EF3AFC9A62C, 0xBCC2770C6A2506C5, 0x3AB66DD5DCE1CE12, 0xE65499D04A675B37, 0x7D8F523481BFD216, 0x0F6F64FCEC15F389, 0x74EFBE618B5B13C8, 0xACDC82B714273E1D, 0xDD40BFE003199D17, 0x37E99257E7E061F8, 0xFA52626904775AAA, 0x8BBBF63A463D56F9, 0xF0013F1543A26E64, 0xA8307E9F879EC898, 0xCC4C27A4150177CC, 0x1B432F2CCA1D3348, 0xDE1D1F8F9F6FA013, 0x606602A047A7DDD6, 0xD237AB64CC1CB2C7, 0x9B938E7225FCD1D3, 0xEC4E03708E0FF476, 0xFEB2FBDA3D03C12D, 0xAE0BCED2EE43889A, 0x22CB8923EBFB4F43, 0x69360D013CF7396D, 0x855E3602D2D4E022, 0x073805BAD01F784C, 0x33E17A133852F546, 0xDF4874058AC7B638, 0xBA92B29C678AA14A, 0x0CE89FC76CFAADCD, 0x5F9D4E0908339E34, 0xF1AFE9291F5923B9, 0x6E3480F60F4A265F, 0xEEBF3A2AB29B841C, 0xE21938A88F91B4AD, 0x57DFEFF845C6D3C3, 0x2F006B0BF62CAAF2, 0x62F479EF6F75EE78, 0x11A55AD41C8916A9, 0xF229D29084FED453, 0x42F1C27B16B000E6, 0x2B1F76749823C074, 0x4B76ECA3C2745360, 0x8C98F463B91691BD, 0x14BCC93CF1ADE66A, 0x8885213E6D458397, 0x8E177DF0274D4711, 0xB49B73B5503F2951, 0x10168168C3F96B6B, 0x0E3D963B63CAB0AE, 0x8DFC4B5655A1DB14, 0xF789F1356E14DE5C, 0x683E68AF4E51DAC1, 0xC9A84F9D8D4B0FD9, 0x3691E03F52A0F9D1, 0x5ED86E46E1878E80, 0x3C711A0E99D07150, 0x5A0865B20C4E9310, 0x56FBFC1FE4F0682E, 0xEA8D5DE3105EDF9B, 0x71ABFDB12379187A, 0x2EB99DE1BEE77B9C, 0x21ECC0EA33CF4523, 0x59A4D7521805C7A1, 0x3896F5EB56AE7C72, 0xAA638F3DB18F75DC, 0x9F39358DABE9808E, 0xB7DEFA91C00B72AC, 0x6B5541FD62492D92, 0x6DC6DEE8F92E4D5B, 0x353F57ABC4BEEA7E, 0x735769D6DA5690CE, 0x0A234AA642391484, 0xF6F9508028F80D9D, 0xB8E319A27AB3F215, 0x31AD9C1151341A4D, 0x773C22A57BEF5805, 0x45C7561A07968633, 0xF913DA9E249DBE36, 0xDA652D9B78A64C68, 0x4C27A97F3BC334EF, 0x76621220E66B17F4, 0x967743899ACD7D0B, 0xF3EE5BCAE0ED6782, 0x409F753600C879FC, 0x06D09A39B5926DB6, 0x6F83AEB0317AC588, 0x01E6CA4A86381F21, 0x66FF3462D19F3025, 0x72207C24DDFD3BFB, 0x4AF6B6D3E2ECE2EB, 0x9C994DBEC7EA08DE, 0x49ACE597B09A8BC4, 0xB38C4766CF0797BA, 0x131B9373C57C2A75, 0xB1822CCE61931E58, 0x9D7555B909BA1C0C, 0x127FAFDD937D11D2, 0x29DA3BADC66D92E4, 0xA2C1D57154C2ECBC, 0x58C5134D82F6FE24, 0x1C3AE3515B62274F, 0xE907C82E01CB8126, 0xF8ED091913E37FCB, 0x3249D8F9C80046C9, 0x80CF9BEDE388FB63, 0x1881539A116CF19E, 0x5103F3F76BD52457, 0x15B7E6F5AE47F7A8, 0xDBD7C6DED47E9CCF, 0x44E55C410228BB1A, 0xB647D4255EDB4E99, 0x5D11882BB8AAFC30, 0xF5098BBB29D3212A, 0x8FB5EA14E90296B3, 0x677B942157DD025A, 0xFB58E7C0A390ACB5, 0x89D3674C83BD4A01, 0x9E2DA4DF4BF3B93B, 0xFCC41E328CAB4829, 0x03F38C96BA582C52, 0xCAD1BDBD7FD85DB2, 0xBBB442C16082AE83, 0xB95FE86BA5DA9AB0, 0xB22E04673771A93F, 0x845358C9493152D8, 0xBE2A488697B4541E, 0x95A2DC2DD38E6966, 0xC02C11AC923C852B, 0x2388B1990DF2A87B, 0x7C8008FA1B4F37BE, 0x1F70D0C84D54E503, 0x5490ADEC7ECE57D4, 0x002B3C27D9063A3A, 0x7EAEA3848030A2BF, 0xC602326DED2003C0, 0x83A7287D69A94086, 0xC57A5FCB30F57A8A, 0xB56844E479EBE779, 0xA373B40F05DCBCE9, 0xD71A786E88570EE2, 0x879CBACDBDE8F6A0, 0x976AD1BCC164A32F, 0xAB21E25E9666D78B, 0x901063AAE5E5C33C, 0x9818B34448698D90, 0xE36487AE3E1E8ABB, 0xAFBDF931893BDCB4, 0x6345A0DC5FBBD519, 0x8628FE269B9465CA, 0x1E5D01603F9C51EC, 0x4DE44006A15049B7, 0xBF6C70E5F776CBB1, 0x411218F2EF552BED, 0xCB0C0708705A36A3, 0xE74D14754F986044, 0xCD56D9430EA8280E, 0xC12591D7535F5065, 0xC83223F1720AEF96, 0xC3A0396F7363A51F }; } Botan-1.10.12/src/hash/tiger/tiger.cpp0000664000175000017500000001076412654331322017236 0ustar jackjack00000000000000/* * Tiger * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { /* * Tiger Mixing Function */ inline void mix(MemoryRegion& X) { X[0] -= X[7] ^ 0xA5A5A5A5A5A5A5A5; X[1] ^= X[0]; X[2] += X[1]; X[3] -= X[2] ^ ((~X[1]) << 19); X[4] ^= X[3]; X[5] += X[4]; X[6] -= X[5] ^ ((~X[4]) >> 23); X[7] ^= X[6]; X[0] += X[7]; X[1] -= X[0] ^ ((~X[7]) << 19); X[2] ^= X[1]; X[3] += X[2]; X[4] -= X[3] ^ ((~X[2]) >> 23); X[5] ^= X[4]; X[6] += X[5]; X[7] -= X[6] ^ 0x0123456789ABCDEF; } } /* * Tiger Compression Function */ void Tiger::compress_n(const byte input[], size_t blocks) { u64bit A = digest[0], B = digest[1], C = digest[2]; for(size_t i = 0; i != blocks; ++i) { load_le(&X[0], input, X.size()); pass(A, B, C, X, 5); mix(X); pass(C, A, B, X, 7); mix(X); pass(B, C, A, X, 9); for(size_t j = 3; j != passes; ++j) { mix(X); pass(A, B, C, X, 9); u64bit T = A; A = C; C = B; B = T; } A = (digest[0] ^= A); B = digest[1] = B - digest[1]; C = (digest[2] += C); input += hash_block_size(); } } /* * Copy out the digest */ void Tiger::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); ++i) output[i] = get_byte(7 - (i % 8), digest[i/8]); } /* * Tiger Pass */ void Tiger::pass(u64bit& A, u64bit& B, u64bit& C, const MemoryRegion& X, byte mul) { C ^= X[0]; A -= SBOX1[get_byte(7, C)] ^ SBOX2[get_byte(5, C)] ^ SBOX3[get_byte(3, C)] ^ SBOX4[get_byte(1, C)]; B += SBOX1[get_byte(0, C)] ^ SBOX2[get_byte(2, C)] ^ SBOX3[get_byte(4, C)] ^ SBOX4[get_byte(6, C)]; B *= mul; A ^= X[1]; B -= SBOX1[get_byte(7, A)] ^ SBOX2[get_byte(5, A)] ^ SBOX3[get_byte(3, A)] ^ SBOX4[get_byte(1, A)]; C += SBOX1[get_byte(0, A)] ^ SBOX2[get_byte(2, A)] ^ SBOX3[get_byte(4, A)] ^ SBOX4[get_byte(6, A)]; C *= mul; B ^= X[2]; C -= SBOX1[get_byte(7, B)] ^ SBOX2[get_byte(5, B)] ^ SBOX3[get_byte(3, B)] ^ SBOX4[get_byte(1, B)]; A += SBOX1[get_byte(0, B)] ^ SBOX2[get_byte(2, B)] ^ SBOX3[get_byte(4, B)] ^ SBOX4[get_byte(6, B)]; A *= mul; C ^= X[3]; A -= SBOX1[get_byte(7, C)] ^ SBOX2[get_byte(5, C)] ^ SBOX3[get_byte(3, C)] ^ SBOX4[get_byte(1, C)]; B += SBOX1[get_byte(0, C)] ^ SBOX2[get_byte(2, C)] ^ SBOX3[get_byte(4, C)] ^ SBOX4[get_byte(6, C)]; B *= mul; A ^= X[4]; B -= SBOX1[get_byte(7, A)] ^ SBOX2[get_byte(5, A)] ^ SBOX3[get_byte(3, A)] ^ SBOX4[get_byte(1, A)]; C += SBOX1[get_byte(0, A)] ^ SBOX2[get_byte(2, A)] ^ SBOX3[get_byte(4, A)] ^ SBOX4[get_byte(6, A)]; C *= mul; B ^= X[5]; C -= SBOX1[get_byte(7, B)] ^ SBOX2[get_byte(5, B)] ^ SBOX3[get_byte(3, B)] ^ SBOX4[get_byte(1, B)]; A += SBOX1[get_byte(0, B)] ^ SBOX2[get_byte(2, B)] ^ SBOX3[get_byte(4, B)] ^ SBOX4[get_byte(6, B)]; A *= mul; C ^= X[6]; A -= SBOX1[get_byte(7, C)] ^ SBOX2[get_byte(5, C)] ^ SBOX3[get_byte(3, C)] ^ SBOX4[get_byte(1, C)]; B += SBOX1[get_byte(0, C)] ^ SBOX2[get_byte(2, C)] ^ SBOX3[get_byte(4, C)] ^ SBOX4[get_byte(6, C)]; B *= mul; A ^= X[7]; B -= SBOX1[get_byte(7, A)] ^ SBOX2[get_byte(5, A)] ^ SBOX3[get_byte(3, A)] ^ SBOX4[get_byte(1, A)]; C += SBOX1[get_byte(0, A)] ^ SBOX2[get_byte(2, A)] ^ SBOX3[get_byte(4, A)] ^ SBOX4[get_byte(6, A)]; C *= mul; } /* * Clear memory of sensitive data */ void Tiger::clear() { MDx_HashFunction::clear(); zeroise(X); digest[0] = 0x0123456789ABCDEF; digest[1] = 0xFEDCBA9876543210; digest[2] = 0xF096A5B4C3B2E187; } /* * Return the name of this type */ std::string Tiger::name() const { return "Tiger(" + to_string(output_length()) + "," + to_string(passes) + ")"; } /* * Tiger Constructor */ Tiger::Tiger(size_t hash_len, size_t passes) : MDx_HashFunction(64, false, false), X(8), digest(3), hash_len(hash_len), passes(passes) { if(output_length() != 16 && output_length() != 20 && output_length() != 24) throw Invalid_Argument("Tiger: Illegal hash output size: " + to_string(output_length())); if(passes < 3) throw Invalid_Argument("Tiger: Invalid number of passes: " + to_string(passes)); clear(); } } Botan-1.10.12/src/hash/tiger/tiger.h0000664000175000017500000000221712654331322016675 0ustar jackjack00000000000000/* * Tiger * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_TIGER_H__ #define BOTAN_TIGER_H__ #include namespace Botan { /** * Tiger */ class BOTAN_DLL Tiger : public MDx_HashFunction { public: std::string name() const; size_t output_length() const { return hash_len; } HashFunction* clone() const { return new Tiger(output_length(), passes); } void clear(); /** * @param out_size specifies the output length; can be 16, 20, or 24 * @param passes to make in the algorithm */ Tiger(size_t out_size = 24, size_t passes = 3); private: void compress_n(const byte[], size_t block); void copy_out(byte[]); static void pass(u64bit& A, u64bit& B, u64bit& C, const MemoryRegion& M, byte mul); static const u64bit SBOX1[256]; static const u64bit SBOX2[256]; static const u64bit SBOX3[256]; static const u64bit SBOX4[256]; SecureVector X, digest; const size_t hash_len, passes; }; } #endif Botan-1.10.12/src/hash/whirlpool/info.txt0000664000175000017500000000006212654331322020007 0ustar jackjack00000000000000define WHIRLPOOL mdx_hash Botan-1.10.12/src/hash/whirlpool/whrl_tab.cpp0000664000175000017500000012074212654331322020631 0ustar jackjack00000000000000/* * Diffusion Tables for Whirlpool * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { const u64bit Whirlpool::C0[256] = { 0x18186018C07830D8, 0x23238C2305AF4626, 0xC6C63FC67EF991B8, 0xE8E887E8136FCDFB, 0x878726874CA113CB, 0xB8B8DAB8A9626D11, 0x0101040108050209, 0x4F4F214F426E9E0D, 0x3636D836ADEE6C9B, 0xA6A6A2A6590451FF, 0xD2D26FD2DEBDB90C, 0xF5F5F3F5FB06F70E, 0x7979F979EF80F296, 0x6F6FA16F5FCEDE30, 0x91917E91FCEF3F6D, 0x52525552AA07A4F8, 0x60609D6027FDC047, 0xBCBCCABC89766535, 0x9B9B569BACCD2B37, 0x8E8E028E048C018A, 0xA3A3B6A371155BD2, 0x0C0C300C603C186C, 0x7B7BF17BFF8AF684, 0x3535D435B5E16A80, 0x1D1D741DE8693AF5, 0xE0E0A7E05347DDB3, 0xD7D77BD7F6ACB321, 0xC2C22FC25EED999C, 0x2E2EB82E6D965C43, 0x4B4B314B627A9629, 0xFEFEDFFEA321E15D, 0x575741578216AED5, 0x15155415A8412ABD, 0x7777C1779FB6EEE8, 0x3737DC37A5EB6E92, 0xE5E5B3E57B56D79E, 0x9F9F469F8CD92313, 0xF0F0E7F0D317FD23, 0x4A4A354A6A7F9420, 0xDADA4FDA9E95A944, 0x58587D58FA25B0A2, 0xC9C903C906CA8FCF, 0x2929A429558D527C, 0x0A0A280A5022145A, 0xB1B1FEB1E14F7F50, 0xA0A0BAA0691A5DC9, 0x6B6BB16B7FDAD614, 0x85852E855CAB17D9, 0xBDBDCEBD8173673C, 0x5D5D695DD234BA8F, 0x1010401080502090, 0xF4F4F7F4F303F507, 0xCBCB0BCB16C08BDD, 0x3E3EF83EEDC67CD3, 0x0505140528110A2D, 0x676781671FE6CE78, 0xE4E4B7E47353D597, 0x27279C2725BB4E02, 0x4141194132588273, 0x8B8B168B2C9D0BA7, 0xA7A7A6A7510153F6, 0x7D7DE97DCF94FAB2, 0x95956E95DCFB3749, 0xD8D847D88E9FAD56, 0xFBFBCBFB8B30EB70, 0xEEEE9FEE2371C1CD, 0x7C7CED7CC791F8BB, 0x6666856617E3CC71, 0xDDDD53DDA68EA77B, 0x17175C17B84B2EAF, 0x4747014702468E45, 0x9E9E429E84DC211A, 0xCACA0FCA1EC589D4, 0x2D2DB42D75995A58, 0xBFBFC6BF9179632E, 0x07071C07381B0E3F, 0xADAD8EAD012347AC, 0x5A5A755AEA2FB4B0, 0x838336836CB51BEF, 0x3333CC3385FF66B6, 0x636391633FF2C65C, 0x02020802100A0412, 0xAAAA92AA39384993, 0x7171D971AFA8E2DE, 0xC8C807C80ECF8DC6, 0x19196419C87D32D1, 0x494939497270923B, 0xD9D943D9869AAF5F, 0xF2F2EFF2C31DF931, 0xE3E3ABE34B48DBA8, 0x5B5B715BE22AB6B9, 0x88881A8834920DBC, 0x9A9A529AA4C8293E, 0x262698262DBE4C0B, 0x3232C8328DFA64BF, 0xB0B0FAB0E94A7D59, 0xE9E983E91B6ACFF2, 0x0F0F3C0F78331E77, 0xD5D573D5E6A6B733, 0x80803A8074BA1DF4, 0xBEBEC2BE997C6127, 0xCDCD13CD26DE87EB, 0x3434D034BDE46889, 0x48483D487A759032, 0xFFFFDBFFAB24E354, 0x7A7AF57AF78FF48D, 0x90907A90F4EA3D64, 0x5F5F615FC23EBE9D, 0x202080201DA0403D, 0x6868BD6867D5D00F, 0x1A1A681AD07234CA, 0xAEAE82AE192C41B7, 0xB4B4EAB4C95E757D, 0x54544D549A19A8CE, 0x93937693ECE53B7F, 0x222288220DAA442F, 0x64648D6407E9C863, 0xF1F1E3F1DB12FF2A, 0x7373D173BFA2E6CC, 0x12124812905A2482, 0x40401D403A5D807A, 0x0808200840281048, 0xC3C32BC356E89B95, 0xECEC97EC337BC5DF, 0xDBDB4BDB9690AB4D, 0xA1A1BEA1611F5FC0, 0x8D8D0E8D1C830791, 0x3D3DF43DF5C97AC8, 0x97976697CCF1335B, 0x0000000000000000, 0xCFCF1BCF36D483F9, 0x2B2BAC2B4587566E, 0x7676C57697B3ECE1, 0x8282328264B019E6, 0xD6D67FD6FEA9B128, 0x1B1B6C1BD87736C3, 0xB5B5EEB5C15B7774, 0xAFAF86AF112943BE, 0x6A6AB56A77DFD41D, 0x50505D50BA0DA0EA, 0x45450945124C8A57, 0xF3F3EBF3CB18FB38, 0x3030C0309DF060AD, 0xEFEF9BEF2B74C3C4, 0x3F3FFC3FE5C37EDA, 0x55554955921CAAC7, 0xA2A2B2A2791059DB, 0xEAEA8FEA0365C9E9, 0x656589650FECCA6A, 0xBABAD2BAB9686903, 0x2F2FBC2F65935E4A, 0xC0C027C04EE79D8E, 0xDEDE5FDEBE81A160, 0x1C1C701CE06C38FC, 0xFDFDD3FDBB2EE746, 0x4D4D294D52649A1F, 0x92927292E4E03976, 0x7575C9758FBCEAFA, 0x06061806301E0C36, 0x8A8A128A249809AE, 0xB2B2F2B2F940794B, 0xE6E6BFE66359D185, 0x0E0E380E70361C7E, 0x1F1F7C1FF8633EE7, 0x6262956237F7C455, 0xD4D477D4EEA3B53A, 0xA8A89AA829324D81, 0x96966296C4F43152, 0xF9F9C3F99B3AEF62, 0xC5C533C566F697A3, 0x2525942535B14A10, 0x59597959F220B2AB, 0x84842A8454AE15D0, 0x7272D572B7A7E4C5, 0x3939E439D5DD72EC, 0x4C4C2D4C5A619816, 0x5E5E655ECA3BBC94, 0x7878FD78E785F09F, 0x3838E038DDD870E5, 0x8C8C0A8C14860598, 0xD1D163D1C6B2BF17, 0xA5A5AEA5410B57E4, 0xE2E2AFE2434DD9A1, 0x616199612FF8C24E, 0xB3B3F6B3F1457B42, 0x2121842115A54234, 0x9C9C4A9C94D62508, 0x1E1E781EF0663CEE, 0x4343114322528661, 0xC7C73BC776FC93B1, 0xFCFCD7FCB32BE54F, 0x0404100420140824, 0x51515951B208A2E3, 0x99995E99BCC72F25, 0x6D6DA96D4FC4DA22, 0x0D0D340D68391A65, 0xFAFACFFA8335E979, 0xDFDF5BDFB684A369, 0x7E7EE57ED79BFCA9, 0x242490243DB44819, 0x3B3BEC3BC5D776FE, 0xABAB96AB313D4B9A, 0xCECE1FCE3ED181F0, 0x1111441188552299, 0x8F8F068F0C890383, 0x4E4E254E4A6B9C04, 0xB7B7E6B7D1517366, 0xEBEB8BEB0B60CBE0, 0x3C3CF03CFDCC78C1, 0x81813E817CBF1FFD, 0x94946A94D4FE3540, 0xF7F7FBF7EB0CF31C, 0xB9B9DEB9A1676F18, 0x13134C13985F268B, 0x2C2CB02C7D9C5851, 0xD3D36BD3D6B8BB05, 0xE7E7BBE76B5CD38C, 0x6E6EA56E57CBDC39, 0xC4C437C46EF395AA, 0x03030C03180F061B, 0x565645568A13ACDC, 0x44440D441A49885E, 0x7F7FE17FDF9EFEA0, 0xA9A99EA921374F88, 0x2A2AA82A4D825467, 0xBBBBD6BBB16D6B0A, 0xC1C123C146E29F87, 0x53535153A202A6F1, 0xDCDC57DCAE8BA572, 0x0B0B2C0B58271653, 0x9D9D4E9D9CD32701, 0x6C6CAD6C47C1D82B, 0x3131C43195F562A4, 0x7474CD7487B9E8F3, 0xF6F6FFF6E309F115, 0x464605460A438C4C, 0xACAC8AAC092645A5, 0x89891E893C970FB5, 0x14145014A04428B4, 0xE1E1A3E15B42DFBA, 0x16165816B04E2CA6, 0x3A3AE83ACDD274F7, 0x6969B9696FD0D206, 0x09092409482D1241, 0x7070DD70A7ADE0D7, 0xB6B6E2B6D954716F, 0xD0D067D0CEB7BD1E, 0xEDED93ED3B7EC7D6, 0xCCCC17CC2EDB85E2, 0x424215422A578468, 0x98985A98B4C22D2C, 0xA4A4AAA4490E55ED, 0x2828A0285D885075, 0x5C5C6D5CDA31B886, 0xF8F8C7F8933FED6B, 0x8686228644A411C2 }; const u64bit Whirlpool::C1[256] = { 0xD818186018C07830, 0x2623238C2305AF46, 0xB8C6C63FC67EF991, 0xFBE8E887E8136FCD, 0xCB878726874CA113, 0x11B8B8DAB8A9626D, 0x0901010401080502, 0x0D4F4F214F426E9E, 0x9B3636D836ADEE6C, 0xFFA6A6A2A6590451, 0x0CD2D26FD2DEBDB9, 0x0EF5F5F3F5FB06F7, 0x967979F979EF80F2, 0x306F6FA16F5FCEDE, 0x6D91917E91FCEF3F, 0xF852525552AA07A4, 0x4760609D6027FDC0, 0x35BCBCCABC897665, 0x379B9B569BACCD2B, 0x8A8E8E028E048C01, 0xD2A3A3B6A371155B, 0x6C0C0C300C603C18, 0x847B7BF17BFF8AF6, 0x803535D435B5E16A, 0xF51D1D741DE8693A, 0xB3E0E0A7E05347DD, 0x21D7D77BD7F6ACB3, 0x9CC2C22FC25EED99, 0x432E2EB82E6D965C, 0x294B4B314B627A96, 0x5DFEFEDFFEA321E1, 0xD5575741578216AE, 0xBD15155415A8412A, 0xE87777C1779FB6EE, 0x923737DC37A5EB6E, 0x9EE5E5B3E57B56D7, 0x139F9F469F8CD923, 0x23F0F0E7F0D317FD, 0x204A4A354A6A7F94, 0x44DADA4FDA9E95A9, 0xA258587D58FA25B0, 0xCFC9C903C906CA8F, 0x7C2929A429558D52, 0x5A0A0A280A502214, 0x50B1B1FEB1E14F7F, 0xC9A0A0BAA0691A5D, 0x146B6BB16B7FDAD6, 0xD985852E855CAB17, 0x3CBDBDCEBD817367, 0x8F5D5D695DD234BA, 0x9010104010805020, 0x07F4F4F7F4F303F5, 0xDDCBCB0BCB16C08B, 0xD33E3EF83EEDC67C, 0x2D0505140528110A, 0x78676781671FE6CE, 0x97E4E4B7E47353D5, 0x0227279C2725BB4E, 0x7341411941325882, 0xA78B8B168B2C9D0B, 0xF6A7A7A6A7510153, 0xB27D7DE97DCF94FA, 0x4995956E95DCFB37, 0x56D8D847D88E9FAD, 0x70FBFBCBFB8B30EB, 0xCDEEEE9FEE2371C1, 0xBB7C7CED7CC791F8, 0x716666856617E3CC, 0x7BDDDD53DDA68EA7, 0xAF17175C17B84B2E, 0x454747014702468E, 0x1A9E9E429E84DC21, 0xD4CACA0FCA1EC589, 0x582D2DB42D75995A, 0x2EBFBFC6BF917963, 0x3F07071C07381B0E, 0xACADAD8EAD012347, 0xB05A5A755AEA2FB4, 0xEF838336836CB51B, 0xB63333CC3385FF66, 0x5C636391633FF2C6, 0x1202020802100A04, 0x93AAAA92AA393849, 0xDE7171D971AFA8E2, 0xC6C8C807C80ECF8D, 0xD119196419C87D32, 0x3B49493949727092, 0x5FD9D943D9869AAF, 0x31F2F2EFF2C31DF9, 0xA8E3E3ABE34B48DB, 0xB95B5B715BE22AB6, 0xBC88881A8834920D, 0x3E9A9A529AA4C829, 0x0B262698262DBE4C, 0xBF3232C8328DFA64, 0x59B0B0FAB0E94A7D, 0xF2E9E983E91B6ACF, 0x770F0F3C0F78331E, 0x33D5D573D5E6A6B7, 0xF480803A8074BA1D, 0x27BEBEC2BE997C61, 0xEBCDCD13CD26DE87, 0x893434D034BDE468, 0x3248483D487A7590, 0x54FFFFDBFFAB24E3, 0x8D7A7AF57AF78FF4, 0x6490907A90F4EA3D, 0x9D5F5F615FC23EBE, 0x3D202080201DA040, 0x0F6868BD6867D5D0, 0xCA1A1A681AD07234, 0xB7AEAE82AE192C41, 0x7DB4B4EAB4C95E75, 0xCE54544D549A19A8, 0x7F93937693ECE53B, 0x2F222288220DAA44, 0x6364648D6407E9C8, 0x2AF1F1E3F1DB12FF, 0xCC7373D173BFA2E6, 0x8212124812905A24, 0x7A40401D403A5D80, 0x4808082008402810, 0x95C3C32BC356E89B, 0xDFECEC97EC337BC5, 0x4DDBDB4BDB9690AB, 0xC0A1A1BEA1611F5F, 0x918D8D0E8D1C8307, 0xC83D3DF43DF5C97A, 0x5B97976697CCF133, 0x0000000000000000, 0xF9CFCF1BCF36D483, 0x6E2B2BAC2B458756, 0xE17676C57697B3EC, 0xE68282328264B019, 0x28D6D67FD6FEA9B1, 0xC31B1B6C1BD87736, 0x74B5B5EEB5C15B77, 0xBEAFAF86AF112943, 0x1D6A6AB56A77DFD4, 0xEA50505D50BA0DA0, 0x5745450945124C8A, 0x38F3F3EBF3CB18FB, 0xAD3030C0309DF060, 0xC4EFEF9BEF2B74C3, 0xDA3F3FFC3FE5C37E, 0xC755554955921CAA, 0xDBA2A2B2A2791059, 0xE9EAEA8FEA0365C9, 0x6A656589650FECCA, 0x03BABAD2BAB96869, 0x4A2F2FBC2F65935E, 0x8EC0C027C04EE79D, 0x60DEDE5FDEBE81A1, 0xFC1C1C701CE06C38, 0x46FDFDD3FDBB2EE7, 0x1F4D4D294D52649A, 0x7692927292E4E039, 0xFA7575C9758FBCEA, 0x3606061806301E0C, 0xAE8A8A128A249809, 0x4BB2B2F2B2F94079, 0x85E6E6BFE66359D1, 0x7E0E0E380E70361C, 0xE71F1F7C1FF8633E, 0x556262956237F7C4, 0x3AD4D477D4EEA3B5, 0x81A8A89AA829324D, 0x5296966296C4F431, 0x62F9F9C3F99B3AEF, 0xA3C5C533C566F697, 0x102525942535B14A, 0xAB59597959F220B2, 0xD084842A8454AE15, 0xC57272D572B7A7E4, 0xEC3939E439D5DD72, 0x164C4C2D4C5A6198, 0x945E5E655ECA3BBC, 0x9F7878FD78E785F0, 0xE53838E038DDD870, 0x988C8C0A8C148605, 0x17D1D163D1C6B2BF, 0xE4A5A5AEA5410B57, 0xA1E2E2AFE2434DD9, 0x4E616199612FF8C2, 0x42B3B3F6B3F1457B, 0x342121842115A542, 0x089C9C4A9C94D625, 0xEE1E1E781EF0663C, 0x6143431143225286, 0xB1C7C73BC776FC93, 0x4FFCFCD7FCB32BE5, 0x2404041004201408, 0xE351515951B208A2, 0x2599995E99BCC72F, 0x226D6DA96D4FC4DA, 0x650D0D340D68391A, 0x79FAFACFFA8335E9, 0x69DFDF5BDFB684A3, 0xA97E7EE57ED79BFC, 0x19242490243DB448, 0xFE3B3BEC3BC5D776, 0x9AABAB96AB313D4B, 0xF0CECE1FCE3ED181, 0x9911114411885522, 0x838F8F068F0C8903, 0x044E4E254E4A6B9C, 0x66B7B7E6B7D15173, 0xE0EBEB8BEB0B60CB, 0xC13C3CF03CFDCC78, 0xFD81813E817CBF1F, 0x4094946A94D4FE35, 0x1CF7F7FBF7EB0CF3, 0x18B9B9DEB9A1676F, 0x8B13134C13985F26, 0x512C2CB02C7D9C58, 0x05D3D36BD3D6B8BB, 0x8CE7E7BBE76B5CD3, 0x396E6EA56E57CBDC, 0xAAC4C437C46EF395, 0x1B03030C03180F06, 0xDC565645568A13AC, 0x5E44440D441A4988, 0xA07F7FE17FDF9EFE, 0x88A9A99EA921374F, 0x672A2AA82A4D8254, 0x0ABBBBD6BBB16D6B, 0x87C1C123C146E29F, 0xF153535153A202A6, 0x72DCDC57DCAE8BA5, 0x530B0B2C0B582716, 0x019D9D4E9D9CD327, 0x2B6C6CAD6C47C1D8, 0xA43131C43195F562, 0xF37474CD7487B9E8, 0x15F6F6FFF6E309F1, 0x4C464605460A438C, 0xA5ACAC8AAC092645, 0xB589891E893C970F, 0xB414145014A04428, 0xBAE1E1A3E15B42DF, 0xA616165816B04E2C, 0xF73A3AE83ACDD274, 0x066969B9696FD0D2, 0x4109092409482D12, 0xD77070DD70A7ADE0, 0x6FB6B6E2B6D95471, 0x1ED0D067D0CEB7BD, 0xD6EDED93ED3B7EC7, 0xE2CCCC17CC2EDB85, 0x68424215422A5784, 0x2C98985A98B4C22D, 0xEDA4A4AAA4490E55, 0x752828A0285D8850, 0x865C5C6D5CDA31B8, 0x6BF8F8C7F8933FED, 0xC28686228644A411 }; const u64bit Whirlpool::C2[256] = { 0x30D818186018C078, 0x462623238C2305AF, 0x91B8C6C63FC67EF9, 0xCDFBE8E887E8136F, 0x13CB878726874CA1, 0x6D11B8B8DAB8A962, 0x0209010104010805, 0x9E0D4F4F214F426E, 0x6C9B3636D836ADEE, 0x51FFA6A6A2A65904, 0xB90CD2D26FD2DEBD, 0xF70EF5F5F3F5FB06, 0xF2967979F979EF80, 0xDE306F6FA16F5FCE, 0x3F6D91917E91FCEF, 0xA4F852525552AA07, 0xC04760609D6027FD, 0x6535BCBCCABC8976, 0x2B379B9B569BACCD, 0x018A8E8E028E048C, 0x5BD2A3A3B6A37115, 0x186C0C0C300C603C, 0xF6847B7BF17BFF8A, 0x6A803535D435B5E1, 0x3AF51D1D741DE869, 0xDDB3E0E0A7E05347, 0xB321D7D77BD7F6AC, 0x999CC2C22FC25EED, 0x5C432E2EB82E6D96, 0x96294B4B314B627A, 0xE15DFEFEDFFEA321, 0xAED5575741578216, 0x2ABD15155415A841, 0xEEE87777C1779FB6, 0x6E923737DC37A5EB, 0xD79EE5E5B3E57B56, 0x23139F9F469F8CD9, 0xFD23F0F0E7F0D317, 0x94204A4A354A6A7F, 0xA944DADA4FDA9E95, 0xB0A258587D58FA25, 0x8FCFC9C903C906CA, 0x527C2929A429558D, 0x145A0A0A280A5022, 0x7F50B1B1FEB1E14F, 0x5DC9A0A0BAA0691A, 0xD6146B6BB16B7FDA, 0x17D985852E855CAB, 0x673CBDBDCEBD8173, 0xBA8F5D5D695DD234, 0x2090101040108050, 0xF507F4F4F7F4F303, 0x8BDDCBCB0BCB16C0, 0x7CD33E3EF83EEDC6, 0x0A2D050514052811, 0xCE78676781671FE6, 0xD597E4E4B7E47353, 0x4E0227279C2725BB, 0x8273414119413258, 0x0BA78B8B168B2C9D, 0x53F6A7A7A6A75101, 0xFAB27D7DE97DCF94, 0x374995956E95DCFB, 0xAD56D8D847D88E9F, 0xEB70FBFBCBFB8B30, 0xC1CDEEEE9FEE2371, 0xF8BB7C7CED7CC791, 0xCC716666856617E3, 0xA77BDDDD53DDA68E, 0x2EAF17175C17B84B, 0x8E45474701470246, 0x211A9E9E429E84DC, 0x89D4CACA0FCA1EC5, 0x5A582D2DB42D7599, 0x632EBFBFC6BF9179, 0x0E3F07071C07381B, 0x47ACADAD8EAD0123, 0xB4B05A5A755AEA2F, 0x1BEF838336836CB5, 0x66B63333CC3385FF, 0xC65C636391633FF2, 0x041202020802100A, 0x4993AAAA92AA3938, 0xE2DE7171D971AFA8, 0x8DC6C8C807C80ECF, 0x32D119196419C87D, 0x923B494939497270, 0xAF5FD9D943D9869A, 0xF931F2F2EFF2C31D, 0xDBA8E3E3ABE34B48, 0xB6B95B5B715BE22A, 0x0DBC88881A883492, 0x293E9A9A529AA4C8, 0x4C0B262698262DBE, 0x64BF3232C8328DFA, 0x7D59B0B0FAB0E94A, 0xCFF2E9E983E91B6A, 0x1E770F0F3C0F7833, 0xB733D5D573D5E6A6, 0x1DF480803A8074BA, 0x6127BEBEC2BE997C, 0x87EBCDCD13CD26DE, 0x68893434D034BDE4, 0x903248483D487A75, 0xE354FFFFDBFFAB24, 0xF48D7A7AF57AF78F, 0x3D6490907A90F4EA, 0xBE9D5F5F615FC23E, 0x403D202080201DA0, 0xD00F6868BD6867D5, 0x34CA1A1A681AD072, 0x41B7AEAE82AE192C, 0x757DB4B4EAB4C95E, 0xA8CE54544D549A19, 0x3B7F93937693ECE5, 0x442F222288220DAA, 0xC86364648D6407E9, 0xFF2AF1F1E3F1DB12, 0xE6CC7373D173BFA2, 0x248212124812905A, 0x807A40401D403A5D, 0x1048080820084028, 0x9B95C3C32BC356E8, 0xC5DFECEC97EC337B, 0xAB4DDBDB4BDB9690, 0x5FC0A1A1BEA1611F, 0x07918D8D0E8D1C83, 0x7AC83D3DF43DF5C9, 0x335B97976697CCF1, 0x0000000000000000, 0x83F9CFCF1BCF36D4, 0x566E2B2BAC2B4587, 0xECE17676C57697B3, 0x19E68282328264B0, 0xB128D6D67FD6FEA9, 0x36C31B1B6C1BD877, 0x7774B5B5EEB5C15B, 0x43BEAFAF86AF1129, 0xD41D6A6AB56A77DF, 0xA0EA50505D50BA0D, 0x8A5745450945124C, 0xFB38F3F3EBF3CB18, 0x60AD3030C0309DF0, 0xC3C4EFEF9BEF2B74, 0x7EDA3F3FFC3FE5C3, 0xAAC755554955921C, 0x59DBA2A2B2A27910, 0xC9E9EAEA8FEA0365, 0xCA6A656589650FEC, 0x6903BABAD2BAB968, 0x5E4A2F2FBC2F6593, 0x9D8EC0C027C04EE7, 0xA160DEDE5FDEBE81, 0x38FC1C1C701CE06C, 0xE746FDFDD3FDBB2E, 0x9A1F4D4D294D5264, 0x397692927292E4E0, 0xEAFA7575C9758FBC, 0x0C3606061806301E, 0x09AE8A8A128A2498, 0x794BB2B2F2B2F940, 0xD185E6E6BFE66359, 0x1C7E0E0E380E7036, 0x3EE71F1F7C1FF863, 0xC4556262956237F7, 0xB53AD4D477D4EEA3, 0x4D81A8A89AA82932, 0x315296966296C4F4, 0xEF62F9F9C3F99B3A, 0x97A3C5C533C566F6, 0x4A102525942535B1, 0xB2AB59597959F220, 0x15D084842A8454AE, 0xE4C57272D572B7A7, 0x72EC3939E439D5DD, 0x98164C4C2D4C5A61, 0xBC945E5E655ECA3B, 0xF09F7878FD78E785, 0x70E53838E038DDD8, 0x05988C8C0A8C1486, 0xBF17D1D163D1C6B2, 0x57E4A5A5AEA5410B, 0xD9A1E2E2AFE2434D, 0xC24E616199612FF8, 0x7B42B3B3F6B3F145, 0x42342121842115A5, 0x25089C9C4A9C94D6, 0x3CEE1E1E781EF066, 0x8661434311432252, 0x93B1C7C73BC776FC, 0xE54FFCFCD7FCB32B, 0x0824040410042014, 0xA2E351515951B208, 0x2F2599995E99BCC7, 0xDA226D6DA96D4FC4, 0x1A650D0D340D6839, 0xE979FAFACFFA8335, 0xA369DFDF5BDFB684, 0xFCA97E7EE57ED79B, 0x4819242490243DB4, 0x76FE3B3BEC3BC5D7, 0x4B9AABAB96AB313D, 0x81F0CECE1FCE3ED1, 0x2299111144118855, 0x03838F8F068F0C89, 0x9C044E4E254E4A6B, 0x7366B7B7E6B7D151, 0xCBE0EBEB8BEB0B60, 0x78C13C3CF03CFDCC, 0x1FFD81813E817CBF, 0x354094946A94D4FE, 0xF31CF7F7FBF7EB0C, 0x6F18B9B9DEB9A167, 0x268B13134C13985F, 0x58512C2CB02C7D9C, 0xBB05D3D36BD3D6B8, 0xD38CE7E7BBE76B5C, 0xDC396E6EA56E57CB, 0x95AAC4C437C46EF3, 0x061B03030C03180F, 0xACDC565645568A13, 0x885E44440D441A49, 0xFEA07F7FE17FDF9E, 0x4F88A9A99EA92137, 0x54672A2AA82A4D82, 0x6B0ABBBBD6BBB16D, 0x9F87C1C123C146E2, 0xA6F153535153A202, 0xA572DCDC57DCAE8B, 0x16530B0B2C0B5827, 0x27019D9D4E9D9CD3, 0xD82B6C6CAD6C47C1, 0x62A43131C43195F5, 0xE8F37474CD7487B9, 0xF115F6F6FFF6E309, 0x8C4C464605460A43, 0x45A5ACAC8AAC0926, 0x0FB589891E893C97, 0x28B414145014A044, 0xDFBAE1E1A3E15B42, 0x2CA616165816B04E, 0x74F73A3AE83ACDD2, 0xD2066969B9696FD0, 0x124109092409482D, 0xE0D77070DD70A7AD, 0x716FB6B6E2B6D954, 0xBD1ED0D067D0CEB7, 0xC7D6EDED93ED3B7E, 0x85E2CCCC17CC2EDB, 0x8468424215422A57, 0x2D2C98985A98B4C2, 0x55EDA4A4AAA4490E, 0x50752828A0285D88, 0xB8865C5C6D5CDA31, 0xED6BF8F8C7F8933F, 0x11C28686228644A4 }; const u64bit Whirlpool::C3[256] = { 0x7830D818186018C0, 0xAF462623238C2305, 0xF991B8C6C63FC67E, 0x6FCDFBE8E887E813, 0xA113CB878726874C, 0x626D11B8B8DAB8A9, 0x0502090101040108, 0x6E9E0D4F4F214F42, 0xEE6C9B3636D836AD, 0x0451FFA6A6A2A659, 0xBDB90CD2D26FD2DE, 0x06F70EF5F5F3F5FB, 0x80F2967979F979EF, 0xCEDE306F6FA16F5F, 0xEF3F6D91917E91FC, 0x07A4F852525552AA, 0xFDC04760609D6027, 0x766535BCBCCABC89, 0xCD2B379B9B569BAC, 0x8C018A8E8E028E04, 0x155BD2A3A3B6A371, 0x3C186C0C0C300C60, 0x8AF6847B7BF17BFF, 0xE16A803535D435B5, 0x693AF51D1D741DE8, 0x47DDB3E0E0A7E053, 0xACB321D7D77BD7F6, 0xED999CC2C22FC25E, 0x965C432E2EB82E6D, 0x7A96294B4B314B62, 0x21E15DFEFEDFFEA3, 0x16AED55757415782, 0x412ABD15155415A8, 0xB6EEE87777C1779F, 0xEB6E923737DC37A5, 0x56D79EE5E5B3E57B, 0xD923139F9F469F8C, 0x17FD23F0F0E7F0D3, 0x7F94204A4A354A6A, 0x95A944DADA4FDA9E, 0x25B0A258587D58FA, 0xCA8FCFC9C903C906, 0x8D527C2929A42955, 0x22145A0A0A280A50, 0x4F7F50B1B1FEB1E1, 0x1A5DC9A0A0BAA069, 0xDAD6146B6BB16B7F, 0xAB17D985852E855C, 0x73673CBDBDCEBD81, 0x34BA8F5D5D695DD2, 0x5020901010401080, 0x03F507F4F4F7F4F3, 0xC08BDDCBCB0BCB16, 0xC67CD33E3EF83EED, 0x110A2D0505140528, 0xE6CE78676781671F, 0x53D597E4E4B7E473, 0xBB4E0227279C2725, 0x5882734141194132, 0x9D0BA78B8B168B2C, 0x0153F6A7A7A6A751, 0x94FAB27D7DE97DCF, 0xFB374995956E95DC, 0x9FAD56D8D847D88E, 0x30EB70FBFBCBFB8B, 0x71C1CDEEEE9FEE23, 0x91F8BB7C7CED7CC7, 0xE3CC716666856617, 0x8EA77BDDDD53DDA6, 0x4B2EAF17175C17B8, 0x468E454747014702, 0xDC211A9E9E429E84, 0xC589D4CACA0FCA1E, 0x995A582D2DB42D75, 0x79632EBFBFC6BF91, 0x1B0E3F07071C0738, 0x2347ACADAD8EAD01, 0x2FB4B05A5A755AEA, 0xB51BEF838336836C, 0xFF66B63333CC3385, 0xF2C65C636391633F, 0x0A04120202080210, 0x384993AAAA92AA39, 0xA8E2DE7171D971AF, 0xCF8DC6C8C807C80E, 0x7D32D119196419C8, 0x70923B4949394972, 0x9AAF5FD9D943D986, 0x1DF931F2F2EFF2C3, 0x48DBA8E3E3ABE34B, 0x2AB6B95B5B715BE2, 0x920DBC88881A8834, 0xC8293E9A9A529AA4, 0xBE4C0B262698262D, 0xFA64BF3232C8328D, 0x4A7D59B0B0FAB0E9, 0x6ACFF2E9E983E91B, 0x331E770F0F3C0F78, 0xA6B733D5D573D5E6, 0xBA1DF480803A8074, 0x7C6127BEBEC2BE99, 0xDE87EBCDCD13CD26, 0xE468893434D034BD, 0x75903248483D487A, 0x24E354FFFFDBFFAB, 0x8FF48D7A7AF57AF7, 0xEA3D6490907A90F4, 0x3EBE9D5F5F615FC2, 0xA0403D202080201D, 0xD5D00F6868BD6867, 0x7234CA1A1A681AD0, 0x2C41B7AEAE82AE19, 0x5E757DB4B4EAB4C9, 0x19A8CE54544D549A, 0xE53B7F93937693EC, 0xAA442F222288220D, 0xE9C86364648D6407, 0x12FF2AF1F1E3F1DB, 0xA2E6CC7373D173BF, 0x5A24821212481290, 0x5D807A40401D403A, 0x2810480808200840, 0xE89B95C3C32BC356, 0x7BC5DFECEC97EC33, 0x90AB4DDBDB4BDB96, 0x1F5FC0A1A1BEA161, 0x8307918D8D0E8D1C, 0xC97AC83D3DF43DF5, 0xF1335B97976697CC, 0x0000000000000000, 0xD483F9CFCF1BCF36, 0x87566E2B2BAC2B45, 0xB3ECE17676C57697, 0xB019E68282328264, 0xA9B128D6D67FD6FE, 0x7736C31B1B6C1BD8, 0x5B7774B5B5EEB5C1, 0x2943BEAFAF86AF11, 0xDFD41D6A6AB56A77, 0x0DA0EA50505D50BA, 0x4C8A574545094512, 0x18FB38F3F3EBF3CB, 0xF060AD3030C0309D, 0x74C3C4EFEF9BEF2B, 0xC37EDA3F3FFC3FE5, 0x1CAAC75555495592, 0x1059DBA2A2B2A279, 0x65C9E9EAEA8FEA03, 0xECCA6A656589650F, 0x686903BABAD2BAB9, 0x935E4A2F2FBC2F65, 0xE79D8EC0C027C04E, 0x81A160DEDE5FDEBE, 0x6C38FC1C1C701CE0, 0x2EE746FDFDD3FDBB, 0x649A1F4D4D294D52, 0xE0397692927292E4, 0xBCEAFA7575C9758F, 0x1E0C360606180630, 0x9809AE8A8A128A24, 0x40794BB2B2F2B2F9, 0x59D185E6E6BFE663, 0x361C7E0E0E380E70, 0x633EE71F1F7C1FF8, 0xF7C4556262956237, 0xA3B53AD4D477D4EE, 0x324D81A8A89AA829, 0xF4315296966296C4, 0x3AEF62F9F9C3F99B, 0xF697A3C5C533C566, 0xB14A102525942535, 0x20B2AB59597959F2, 0xAE15D084842A8454, 0xA7E4C57272D572B7, 0xDD72EC3939E439D5, 0x6198164C4C2D4C5A, 0x3BBC945E5E655ECA, 0x85F09F7878FD78E7, 0xD870E53838E038DD, 0x8605988C8C0A8C14, 0xB2BF17D1D163D1C6, 0x0B57E4A5A5AEA541, 0x4DD9A1E2E2AFE243, 0xF8C24E616199612F, 0x457B42B3B3F6B3F1, 0xA542342121842115, 0xD625089C9C4A9C94, 0x663CEE1E1E781EF0, 0x5286614343114322, 0xFC93B1C7C73BC776, 0x2BE54FFCFCD7FCB3, 0x1408240404100420, 0x08A2E351515951B2, 0xC72F2599995E99BC, 0xC4DA226D6DA96D4F, 0x391A650D0D340D68, 0x35E979FAFACFFA83, 0x84A369DFDF5BDFB6, 0x9BFCA97E7EE57ED7, 0xB44819242490243D, 0xD776FE3B3BEC3BC5, 0x3D4B9AABAB96AB31, 0xD181F0CECE1FCE3E, 0x5522991111441188, 0x8903838F8F068F0C, 0x6B9C044E4E254E4A, 0x517366B7B7E6B7D1, 0x60CBE0EBEB8BEB0B, 0xCC78C13C3CF03CFD, 0xBF1FFD81813E817C, 0xFE354094946A94D4, 0x0CF31CF7F7FBF7EB, 0x676F18B9B9DEB9A1, 0x5F268B13134C1398, 0x9C58512C2CB02C7D, 0xB8BB05D3D36BD3D6, 0x5CD38CE7E7BBE76B, 0xCBDC396E6EA56E57, 0xF395AAC4C437C46E, 0x0F061B03030C0318, 0x13ACDC565645568A, 0x49885E44440D441A, 0x9EFEA07F7FE17FDF, 0x374F88A9A99EA921, 0x8254672A2AA82A4D, 0x6D6B0ABBBBD6BBB1, 0xE29F87C1C123C146, 0x02A6F153535153A2, 0x8BA572DCDC57DCAE, 0x2716530B0B2C0B58, 0xD327019D9D4E9D9C, 0xC1D82B6C6CAD6C47, 0xF562A43131C43195, 0xB9E8F37474CD7487, 0x09F115F6F6FFF6E3, 0x438C4C464605460A, 0x2645A5ACAC8AAC09, 0x970FB589891E893C, 0x4428B414145014A0, 0x42DFBAE1E1A3E15B, 0x4E2CA616165816B0, 0xD274F73A3AE83ACD, 0xD0D2066969B9696F, 0x2D12410909240948, 0xADE0D77070DD70A7, 0x54716FB6B6E2B6D9, 0xB7BD1ED0D067D0CE, 0x7EC7D6EDED93ED3B, 0xDB85E2CCCC17CC2E, 0x578468424215422A, 0xC22D2C98985A98B4, 0x0E55EDA4A4AAA449, 0x8850752828A0285D, 0x31B8865C5C6D5CDA, 0x3FED6BF8F8C7F893, 0xA411C28686228644 }; const u64bit Whirlpool::C4[256] = { 0xC07830D818186018, 0x05AF462623238C23, 0x7EF991B8C6C63FC6, 0x136FCDFBE8E887E8, 0x4CA113CB87872687, 0xA9626D11B8B8DAB8, 0x0805020901010401, 0x426E9E0D4F4F214F, 0xADEE6C9B3636D836, 0x590451FFA6A6A2A6, 0xDEBDB90CD2D26FD2, 0xFB06F70EF5F5F3F5, 0xEF80F2967979F979, 0x5FCEDE306F6FA16F, 0xFCEF3F6D91917E91, 0xAA07A4F852525552, 0x27FDC04760609D60, 0x89766535BCBCCABC, 0xACCD2B379B9B569B, 0x048C018A8E8E028E, 0x71155BD2A3A3B6A3, 0x603C186C0C0C300C, 0xFF8AF6847B7BF17B, 0xB5E16A803535D435, 0xE8693AF51D1D741D, 0x5347DDB3E0E0A7E0, 0xF6ACB321D7D77BD7, 0x5EED999CC2C22FC2, 0x6D965C432E2EB82E, 0x627A96294B4B314B, 0xA321E15DFEFEDFFE, 0x8216AED557574157, 0xA8412ABD15155415, 0x9FB6EEE87777C177, 0xA5EB6E923737DC37, 0x7B56D79EE5E5B3E5, 0x8CD923139F9F469F, 0xD317FD23F0F0E7F0, 0x6A7F94204A4A354A, 0x9E95A944DADA4FDA, 0xFA25B0A258587D58, 0x06CA8FCFC9C903C9, 0x558D527C2929A429, 0x5022145A0A0A280A, 0xE14F7F50B1B1FEB1, 0x691A5DC9A0A0BAA0, 0x7FDAD6146B6BB16B, 0x5CAB17D985852E85, 0x8173673CBDBDCEBD, 0xD234BA8F5D5D695D, 0x8050209010104010, 0xF303F507F4F4F7F4, 0x16C08BDDCBCB0BCB, 0xEDC67CD33E3EF83E, 0x28110A2D05051405, 0x1FE6CE7867678167, 0x7353D597E4E4B7E4, 0x25BB4E0227279C27, 0x3258827341411941, 0x2C9D0BA78B8B168B, 0x510153F6A7A7A6A7, 0xCF94FAB27D7DE97D, 0xDCFB374995956E95, 0x8E9FAD56D8D847D8, 0x8B30EB70FBFBCBFB, 0x2371C1CDEEEE9FEE, 0xC791F8BB7C7CED7C, 0x17E3CC7166668566, 0xA68EA77BDDDD53DD, 0xB84B2EAF17175C17, 0x02468E4547470147, 0x84DC211A9E9E429E, 0x1EC589D4CACA0FCA, 0x75995A582D2DB42D, 0x9179632EBFBFC6BF, 0x381B0E3F07071C07, 0x012347ACADAD8EAD, 0xEA2FB4B05A5A755A, 0x6CB51BEF83833683, 0x85FF66B63333CC33, 0x3FF2C65C63639163, 0x100A041202020802, 0x39384993AAAA92AA, 0xAFA8E2DE7171D971, 0x0ECF8DC6C8C807C8, 0xC87D32D119196419, 0x7270923B49493949, 0x869AAF5FD9D943D9, 0xC31DF931F2F2EFF2, 0x4B48DBA8E3E3ABE3, 0xE22AB6B95B5B715B, 0x34920DBC88881A88, 0xA4C8293E9A9A529A, 0x2DBE4C0B26269826, 0x8DFA64BF3232C832, 0xE94A7D59B0B0FAB0, 0x1B6ACFF2E9E983E9, 0x78331E770F0F3C0F, 0xE6A6B733D5D573D5, 0x74BA1DF480803A80, 0x997C6127BEBEC2BE, 0x26DE87EBCDCD13CD, 0xBDE468893434D034, 0x7A75903248483D48, 0xAB24E354FFFFDBFF, 0xF78FF48D7A7AF57A, 0xF4EA3D6490907A90, 0xC23EBE9D5F5F615F, 0x1DA0403D20208020, 0x67D5D00F6868BD68, 0xD07234CA1A1A681A, 0x192C41B7AEAE82AE, 0xC95E757DB4B4EAB4, 0x9A19A8CE54544D54, 0xECE53B7F93937693, 0x0DAA442F22228822, 0x07E9C86364648D64, 0xDB12FF2AF1F1E3F1, 0xBFA2E6CC7373D173, 0x905A248212124812, 0x3A5D807A40401D40, 0x4028104808082008, 0x56E89B95C3C32BC3, 0x337BC5DFECEC97EC, 0x9690AB4DDBDB4BDB, 0x611F5FC0A1A1BEA1, 0x1C8307918D8D0E8D, 0xF5C97AC83D3DF43D, 0xCCF1335B97976697, 0x0000000000000000, 0x36D483F9CFCF1BCF, 0x4587566E2B2BAC2B, 0x97B3ECE17676C576, 0x64B019E682823282, 0xFEA9B128D6D67FD6, 0xD87736C31B1B6C1B, 0xC15B7774B5B5EEB5, 0x112943BEAFAF86AF, 0x77DFD41D6A6AB56A, 0xBA0DA0EA50505D50, 0x124C8A5745450945, 0xCB18FB38F3F3EBF3, 0x9DF060AD3030C030, 0x2B74C3C4EFEF9BEF, 0xE5C37EDA3F3FFC3F, 0x921CAAC755554955, 0x791059DBA2A2B2A2, 0x0365C9E9EAEA8FEA, 0x0FECCA6A65658965, 0xB9686903BABAD2BA, 0x65935E4A2F2FBC2F, 0x4EE79D8EC0C027C0, 0xBE81A160DEDE5FDE, 0xE06C38FC1C1C701C, 0xBB2EE746FDFDD3FD, 0x52649A1F4D4D294D, 0xE4E0397692927292, 0x8FBCEAFA7575C975, 0x301E0C3606061806, 0x249809AE8A8A128A, 0xF940794BB2B2F2B2, 0x6359D185E6E6BFE6, 0x70361C7E0E0E380E, 0xF8633EE71F1F7C1F, 0x37F7C45562629562, 0xEEA3B53AD4D477D4, 0x29324D81A8A89AA8, 0xC4F4315296966296, 0x9B3AEF62F9F9C3F9, 0x66F697A3C5C533C5, 0x35B14A1025259425, 0xF220B2AB59597959, 0x54AE15D084842A84, 0xB7A7E4C57272D572, 0xD5DD72EC3939E439, 0x5A6198164C4C2D4C, 0xCA3BBC945E5E655E, 0xE785F09F7878FD78, 0xDDD870E53838E038, 0x148605988C8C0A8C, 0xC6B2BF17D1D163D1, 0x410B57E4A5A5AEA5, 0x434DD9A1E2E2AFE2, 0x2FF8C24E61619961, 0xF1457B42B3B3F6B3, 0x15A5423421218421, 0x94D625089C9C4A9C, 0xF0663CEE1E1E781E, 0x2252866143431143, 0x76FC93B1C7C73BC7, 0xB32BE54FFCFCD7FC, 0x2014082404041004, 0xB208A2E351515951, 0xBCC72F2599995E99, 0x4FC4DA226D6DA96D, 0x68391A650D0D340D, 0x8335E979FAFACFFA, 0xB684A369DFDF5BDF, 0xD79BFCA97E7EE57E, 0x3DB4481924249024, 0xC5D776FE3B3BEC3B, 0x313D4B9AABAB96AB, 0x3ED181F0CECE1FCE, 0x8855229911114411, 0x0C8903838F8F068F, 0x4A6B9C044E4E254E, 0xD1517366B7B7E6B7, 0x0B60CBE0EBEB8BEB, 0xFDCC78C13C3CF03C, 0x7CBF1FFD81813E81, 0xD4FE354094946A94, 0xEB0CF31CF7F7FBF7, 0xA1676F18B9B9DEB9, 0x985F268B13134C13, 0x7D9C58512C2CB02C, 0xD6B8BB05D3D36BD3, 0x6B5CD38CE7E7BBE7, 0x57CBDC396E6EA56E, 0x6EF395AAC4C437C4, 0x180F061B03030C03, 0x8A13ACDC56564556, 0x1A49885E44440D44, 0xDF9EFEA07F7FE17F, 0x21374F88A9A99EA9, 0x4D8254672A2AA82A, 0xB16D6B0ABBBBD6BB, 0x46E29F87C1C123C1, 0xA202A6F153535153, 0xAE8BA572DCDC57DC, 0x582716530B0B2C0B, 0x9CD327019D9D4E9D, 0x47C1D82B6C6CAD6C, 0x95F562A43131C431, 0x87B9E8F37474CD74, 0xE309F115F6F6FFF6, 0x0A438C4C46460546, 0x092645A5ACAC8AAC, 0x3C970FB589891E89, 0xA04428B414145014, 0x5B42DFBAE1E1A3E1, 0xB04E2CA616165816, 0xCDD274F73A3AE83A, 0x6FD0D2066969B969, 0x482D124109092409, 0xA7ADE0D77070DD70, 0xD954716FB6B6E2B6, 0xCEB7BD1ED0D067D0, 0x3B7EC7D6EDED93ED, 0x2EDB85E2CCCC17CC, 0x2A57846842421542, 0xB4C22D2C98985A98, 0x490E55EDA4A4AAA4, 0x5D8850752828A028, 0xDA31B8865C5C6D5C, 0x933FED6BF8F8C7F8, 0x44A411C286862286 }; const u64bit Whirlpool::C5[256] = { 0x18C07830D8181860, 0x2305AF462623238C, 0xC67EF991B8C6C63F, 0xE8136FCDFBE8E887, 0x874CA113CB878726, 0xB8A9626D11B8B8DA, 0x0108050209010104, 0x4F426E9E0D4F4F21, 0x36ADEE6C9B3636D8, 0xA6590451FFA6A6A2, 0xD2DEBDB90CD2D26F, 0xF5FB06F70EF5F5F3, 0x79EF80F2967979F9, 0x6F5FCEDE306F6FA1, 0x91FCEF3F6D91917E, 0x52AA07A4F8525255, 0x6027FDC04760609D, 0xBC89766535BCBCCA, 0x9BACCD2B379B9B56, 0x8E048C018A8E8E02, 0xA371155BD2A3A3B6, 0x0C603C186C0C0C30, 0x7BFF8AF6847B7BF1, 0x35B5E16A803535D4, 0x1DE8693AF51D1D74, 0xE05347DDB3E0E0A7, 0xD7F6ACB321D7D77B, 0xC25EED999CC2C22F, 0x2E6D965C432E2EB8, 0x4B627A96294B4B31, 0xFEA321E15DFEFEDF, 0x578216AED5575741, 0x15A8412ABD151554, 0x779FB6EEE87777C1, 0x37A5EB6E923737DC, 0xE57B56D79EE5E5B3, 0x9F8CD923139F9F46, 0xF0D317FD23F0F0E7, 0x4A6A7F94204A4A35, 0xDA9E95A944DADA4F, 0x58FA25B0A258587D, 0xC906CA8FCFC9C903, 0x29558D527C2929A4, 0x0A5022145A0A0A28, 0xB1E14F7F50B1B1FE, 0xA0691A5DC9A0A0BA, 0x6B7FDAD6146B6BB1, 0x855CAB17D985852E, 0xBD8173673CBDBDCE, 0x5DD234BA8F5D5D69, 0x1080502090101040, 0xF4F303F507F4F4F7, 0xCB16C08BDDCBCB0B, 0x3EEDC67CD33E3EF8, 0x0528110A2D050514, 0x671FE6CE78676781, 0xE47353D597E4E4B7, 0x2725BB4E0227279C, 0x4132588273414119, 0x8B2C9D0BA78B8B16, 0xA7510153F6A7A7A6, 0x7DCF94FAB27D7DE9, 0x95DCFB374995956E, 0xD88E9FAD56D8D847, 0xFB8B30EB70FBFBCB, 0xEE2371C1CDEEEE9F, 0x7CC791F8BB7C7CED, 0x6617E3CC71666685, 0xDDA68EA77BDDDD53, 0x17B84B2EAF17175C, 0x4702468E45474701, 0x9E84DC211A9E9E42, 0xCA1EC589D4CACA0F, 0x2D75995A582D2DB4, 0xBF9179632EBFBFC6, 0x07381B0E3F07071C, 0xAD012347ACADAD8E, 0x5AEA2FB4B05A5A75, 0x836CB51BEF838336, 0x3385FF66B63333CC, 0x633FF2C65C636391, 0x02100A0412020208, 0xAA39384993AAAA92, 0x71AFA8E2DE7171D9, 0xC80ECF8DC6C8C807, 0x19C87D32D1191964, 0x497270923B494939, 0xD9869AAF5FD9D943, 0xF2C31DF931F2F2EF, 0xE34B48DBA8E3E3AB, 0x5BE22AB6B95B5B71, 0x8834920DBC88881A, 0x9AA4C8293E9A9A52, 0x262DBE4C0B262698, 0x328DFA64BF3232C8, 0xB0E94A7D59B0B0FA, 0xE91B6ACFF2E9E983, 0x0F78331E770F0F3C, 0xD5E6A6B733D5D573, 0x8074BA1DF480803A, 0xBE997C6127BEBEC2, 0xCD26DE87EBCDCD13, 0x34BDE468893434D0, 0x487A75903248483D, 0xFFAB24E354FFFFDB, 0x7AF78FF48D7A7AF5, 0x90F4EA3D6490907A, 0x5FC23EBE9D5F5F61, 0x201DA0403D202080, 0x6867D5D00F6868BD, 0x1AD07234CA1A1A68, 0xAE192C41B7AEAE82, 0xB4C95E757DB4B4EA, 0x549A19A8CE54544D, 0x93ECE53B7F939376, 0x220DAA442F222288, 0x6407E9C86364648D, 0xF1DB12FF2AF1F1E3, 0x73BFA2E6CC7373D1, 0x12905A2482121248, 0x403A5D807A40401D, 0x0840281048080820, 0xC356E89B95C3C32B, 0xEC337BC5DFECEC97, 0xDB9690AB4DDBDB4B, 0xA1611F5FC0A1A1BE, 0x8D1C8307918D8D0E, 0x3DF5C97AC83D3DF4, 0x97CCF1335B979766, 0x0000000000000000, 0xCF36D483F9CFCF1B, 0x2B4587566E2B2BAC, 0x7697B3ECE17676C5, 0x8264B019E6828232, 0xD6FEA9B128D6D67F, 0x1BD87736C31B1B6C, 0xB5C15B7774B5B5EE, 0xAF112943BEAFAF86, 0x6A77DFD41D6A6AB5, 0x50BA0DA0EA50505D, 0x45124C8A57454509, 0xF3CB18FB38F3F3EB, 0x309DF060AD3030C0, 0xEF2B74C3C4EFEF9B, 0x3FE5C37EDA3F3FFC, 0x55921CAAC7555549, 0xA2791059DBA2A2B2, 0xEA0365C9E9EAEA8F, 0x650FECCA6A656589, 0xBAB9686903BABAD2, 0x2F65935E4A2F2FBC, 0xC04EE79D8EC0C027, 0xDEBE81A160DEDE5F, 0x1CE06C38FC1C1C70, 0xFDBB2EE746FDFDD3, 0x4D52649A1F4D4D29, 0x92E4E03976929272, 0x758FBCEAFA7575C9, 0x06301E0C36060618, 0x8A249809AE8A8A12, 0xB2F940794BB2B2F2, 0xE66359D185E6E6BF, 0x0E70361C7E0E0E38, 0x1FF8633EE71F1F7C, 0x6237F7C455626295, 0xD4EEA3B53AD4D477, 0xA829324D81A8A89A, 0x96C4F43152969662, 0xF99B3AEF62F9F9C3, 0xC566F697A3C5C533, 0x2535B14A10252594, 0x59F220B2AB595979, 0x8454AE15D084842A, 0x72B7A7E4C57272D5, 0x39D5DD72EC3939E4, 0x4C5A6198164C4C2D, 0x5ECA3BBC945E5E65, 0x78E785F09F7878FD, 0x38DDD870E53838E0, 0x8C148605988C8C0A, 0xD1C6B2BF17D1D163, 0xA5410B57E4A5A5AE, 0xE2434DD9A1E2E2AF, 0x612FF8C24E616199, 0xB3F1457B42B3B3F6, 0x2115A54234212184, 0x9C94D625089C9C4A, 0x1EF0663CEE1E1E78, 0x4322528661434311, 0xC776FC93B1C7C73B, 0xFCB32BE54FFCFCD7, 0x0420140824040410, 0x51B208A2E3515159, 0x99BCC72F2599995E, 0x6D4FC4DA226D6DA9, 0x0D68391A650D0D34, 0xFA8335E979FAFACF, 0xDFB684A369DFDF5B, 0x7ED79BFCA97E7EE5, 0x243DB44819242490, 0x3BC5D776FE3B3BEC, 0xAB313D4B9AABAB96, 0xCE3ED181F0CECE1F, 0x1188552299111144, 0x8F0C8903838F8F06, 0x4E4A6B9C044E4E25, 0xB7D1517366B7B7E6, 0xEB0B60CBE0EBEB8B, 0x3CFDCC78C13C3CF0, 0x817CBF1FFD81813E, 0x94D4FE354094946A, 0xF7EB0CF31CF7F7FB, 0xB9A1676F18B9B9DE, 0x13985F268B13134C, 0x2C7D9C58512C2CB0, 0xD3D6B8BB05D3D36B, 0xE76B5CD38CE7E7BB, 0x6E57CBDC396E6EA5, 0xC46EF395AAC4C437, 0x03180F061B03030C, 0x568A13ACDC565645, 0x441A49885E44440D, 0x7FDF9EFEA07F7FE1, 0xA921374F88A9A99E, 0x2A4D8254672A2AA8, 0xBBB16D6B0ABBBBD6, 0xC146E29F87C1C123, 0x53A202A6F1535351, 0xDCAE8BA572DCDC57, 0x0B582716530B0B2C, 0x9D9CD327019D9D4E, 0x6C47C1D82B6C6CAD, 0x3195F562A43131C4, 0x7487B9E8F37474CD, 0xF6E309F115F6F6FF, 0x460A438C4C464605, 0xAC092645A5ACAC8A, 0x893C970FB589891E, 0x14A04428B4141450, 0xE15B42DFBAE1E1A3, 0x16B04E2CA6161658, 0x3ACDD274F73A3AE8, 0x696FD0D2066969B9, 0x09482D1241090924, 0x70A7ADE0D77070DD, 0xB6D954716FB6B6E2, 0xD0CEB7BD1ED0D067, 0xED3B7EC7D6EDED93, 0xCC2EDB85E2CCCC17, 0x422A578468424215, 0x98B4C22D2C98985A, 0xA4490E55EDA4A4AA, 0x285D8850752828A0, 0x5CDA31B8865C5C6D, 0xF8933FED6BF8F8C7, 0x8644A411C2868622 }; const u64bit Whirlpool::C6[256] = { 0x6018C07830D81818, 0x8C2305AF46262323, 0x3FC67EF991B8C6C6, 0x87E8136FCDFBE8E8, 0x26874CA113CB8787, 0xDAB8A9626D11B8B8, 0x0401080502090101, 0x214F426E9E0D4F4F, 0xD836ADEE6C9B3636, 0xA2A6590451FFA6A6, 0x6FD2DEBDB90CD2D2, 0xF3F5FB06F70EF5F5, 0xF979EF80F2967979, 0xA16F5FCEDE306F6F, 0x7E91FCEF3F6D9191, 0x5552AA07A4F85252, 0x9D6027FDC0476060, 0xCABC89766535BCBC, 0x569BACCD2B379B9B, 0x028E048C018A8E8E, 0xB6A371155BD2A3A3, 0x300C603C186C0C0C, 0xF17BFF8AF6847B7B, 0xD435B5E16A803535, 0x741DE8693AF51D1D, 0xA7E05347DDB3E0E0, 0x7BD7F6ACB321D7D7, 0x2FC25EED999CC2C2, 0xB82E6D965C432E2E, 0x314B627A96294B4B, 0xDFFEA321E15DFEFE, 0x41578216AED55757, 0x5415A8412ABD1515, 0xC1779FB6EEE87777, 0xDC37A5EB6E923737, 0xB3E57B56D79EE5E5, 0x469F8CD923139F9F, 0xE7F0D317FD23F0F0, 0x354A6A7F94204A4A, 0x4FDA9E95A944DADA, 0x7D58FA25B0A25858, 0x03C906CA8FCFC9C9, 0xA429558D527C2929, 0x280A5022145A0A0A, 0xFEB1E14F7F50B1B1, 0xBAA0691A5DC9A0A0, 0xB16B7FDAD6146B6B, 0x2E855CAB17D98585, 0xCEBD8173673CBDBD, 0x695DD234BA8F5D5D, 0x4010805020901010, 0xF7F4F303F507F4F4, 0x0BCB16C08BDDCBCB, 0xF83EEDC67CD33E3E, 0x140528110A2D0505, 0x81671FE6CE786767, 0xB7E47353D597E4E4, 0x9C2725BB4E022727, 0x1941325882734141, 0x168B2C9D0BA78B8B, 0xA6A7510153F6A7A7, 0xE97DCF94FAB27D7D, 0x6E95DCFB37499595, 0x47D88E9FAD56D8D8, 0xCBFB8B30EB70FBFB, 0x9FEE2371C1CDEEEE, 0xED7CC791F8BB7C7C, 0x856617E3CC716666, 0x53DDA68EA77BDDDD, 0x5C17B84B2EAF1717, 0x014702468E454747, 0x429E84DC211A9E9E, 0x0FCA1EC589D4CACA, 0xB42D75995A582D2D, 0xC6BF9179632EBFBF, 0x1C07381B0E3F0707, 0x8EAD012347ACADAD, 0x755AEA2FB4B05A5A, 0x36836CB51BEF8383, 0xCC3385FF66B63333, 0x91633FF2C65C6363, 0x0802100A04120202, 0x92AA39384993AAAA, 0xD971AFA8E2DE7171, 0x07C80ECF8DC6C8C8, 0x6419C87D32D11919, 0x39497270923B4949, 0x43D9869AAF5FD9D9, 0xEFF2C31DF931F2F2, 0xABE34B48DBA8E3E3, 0x715BE22AB6B95B5B, 0x1A8834920DBC8888, 0x529AA4C8293E9A9A, 0x98262DBE4C0B2626, 0xC8328DFA64BF3232, 0xFAB0E94A7D59B0B0, 0x83E91B6ACFF2E9E9, 0x3C0F78331E770F0F, 0x73D5E6A6B733D5D5, 0x3A8074BA1DF48080, 0xC2BE997C6127BEBE, 0x13CD26DE87EBCDCD, 0xD034BDE468893434, 0x3D487A7590324848, 0xDBFFAB24E354FFFF, 0xF57AF78FF48D7A7A, 0x7A90F4EA3D649090, 0x615FC23EBE9D5F5F, 0x80201DA0403D2020, 0xBD6867D5D00F6868, 0x681AD07234CA1A1A, 0x82AE192C41B7AEAE, 0xEAB4C95E757DB4B4, 0x4D549A19A8CE5454, 0x7693ECE53B7F9393, 0x88220DAA442F2222, 0x8D6407E9C8636464, 0xE3F1DB12FF2AF1F1, 0xD173BFA2E6CC7373, 0x4812905A24821212, 0x1D403A5D807A4040, 0x2008402810480808, 0x2BC356E89B95C3C3, 0x97EC337BC5DFECEC, 0x4BDB9690AB4DDBDB, 0xBEA1611F5FC0A1A1, 0x0E8D1C8307918D8D, 0xF43DF5C97AC83D3D, 0x6697CCF1335B9797, 0x0000000000000000, 0x1BCF36D483F9CFCF, 0xAC2B4587566E2B2B, 0xC57697B3ECE17676, 0x328264B019E68282, 0x7FD6FEA9B128D6D6, 0x6C1BD87736C31B1B, 0xEEB5C15B7774B5B5, 0x86AF112943BEAFAF, 0xB56A77DFD41D6A6A, 0x5D50BA0DA0EA5050, 0x0945124C8A574545, 0xEBF3CB18FB38F3F3, 0xC0309DF060AD3030, 0x9BEF2B74C3C4EFEF, 0xFC3FE5C37EDA3F3F, 0x4955921CAAC75555, 0xB2A2791059DBA2A2, 0x8FEA0365C9E9EAEA, 0x89650FECCA6A6565, 0xD2BAB9686903BABA, 0xBC2F65935E4A2F2F, 0x27C04EE79D8EC0C0, 0x5FDEBE81A160DEDE, 0x701CE06C38FC1C1C, 0xD3FDBB2EE746FDFD, 0x294D52649A1F4D4D, 0x7292E4E039769292, 0xC9758FBCEAFA7575, 0x1806301E0C360606, 0x128A249809AE8A8A, 0xF2B2F940794BB2B2, 0xBFE66359D185E6E6, 0x380E70361C7E0E0E, 0x7C1FF8633EE71F1F, 0x956237F7C4556262, 0x77D4EEA3B53AD4D4, 0x9AA829324D81A8A8, 0x6296C4F431529696, 0xC3F99B3AEF62F9F9, 0x33C566F697A3C5C5, 0x942535B14A102525, 0x7959F220B2AB5959, 0x2A8454AE15D08484, 0xD572B7A7E4C57272, 0xE439D5DD72EC3939, 0x2D4C5A6198164C4C, 0x655ECA3BBC945E5E, 0xFD78E785F09F7878, 0xE038DDD870E53838, 0x0A8C148605988C8C, 0x63D1C6B2BF17D1D1, 0xAEA5410B57E4A5A5, 0xAFE2434DD9A1E2E2, 0x99612FF8C24E6161, 0xF6B3F1457B42B3B3, 0x842115A542342121, 0x4A9C94D625089C9C, 0x781EF0663CEE1E1E, 0x1143225286614343, 0x3BC776FC93B1C7C7, 0xD7FCB32BE54FFCFC, 0x1004201408240404, 0x5951B208A2E35151, 0x5E99BCC72F259999, 0xA96D4FC4DA226D6D, 0x340D68391A650D0D, 0xCFFA8335E979FAFA, 0x5BDFB684A369DFDF, 0xE57ED79BFCA97E7E, 0x90243DB448192424, 0xEC3BC5D776FE3B3B, 0x96AB313D4B9AABAB, 0x1FCE3ED181F0CECE, 0x4411885522991111, 0x068F0C8903838F8F, 0x254E4A6B9C044E4E, 0xE6B7D1517366B7B7, 0x8BEB0B60CBE0EBEB, 0xF03CFDCC78C13C3C, 0x3E817CBF1FFD8181, 0x6A94D4FE35409494, 0xFBF7EB0CF31CF7F7, 0xDEB9A1676F18B9B9, 0x4C13985F268B1313, 0xB02C7D9C58512C2C, 0x6BD3D6B8BB05D3D3, 0xBBE76B5CD38CE7E7, 0xA56E57CBDC396E6E, 0x37C46EF395AAC4C4, 0x0C03180F061B0303, 0x45568A13ACDC5656, 0x0D441A49885E4444, 0xE17FDF9EFEA07F7F, 0x9EA921374F88A9A9, 0xA82A4D8254672A2A, 0xD6BBB16D6B0ABBBB, 0x23C146E29F87C1C1, 0x5153A202A6F15353, 0x57DCAE8BA572DCDC, 0x2C0B582716530B0B, 0x4E9D9CD327019D9D, 0xAD6C47C1D82B6C6C, 0xC43195F562A43131, 0xCD7487B9E8F37474, 0xFFF6E309F115F6F6, 0x05460A438C4C4646, 0x8AAC092645A5ACAC, 0x1E893C970FB58989, 0x5014A04428B41414, 0xA3E15B42DFBAE1E1, 0x5816B04E2CA61616, 0xE83ACDD274F73A3A, 0xB9696FD0D2066969, 0x2409482D12410909, 0xDD70A7ADE0D77070, 0xE2B6D954716FB6B6, 0x67D0CEB7BD1ED0D0, 0x93ED3B7EC7D6EDED, 0x17CC2EDB85E2CCCC, 0x15422A5784684242, 0x5A98B4C22D2C9898, 0xAAA4490E55EDA4A4, 0xA0285D8850752828, 0x6D5CDA31B8865C5C, 0xC7F8933FED6BF8F8, 0x228644A411C28686 }; const u64bit Whirlpool::C7[256] = { 0x186018C07830D818, 0x238C2305AF462623, 0xC63FC67EF991B8C6, 0xE887E8136FCDFBE8, 0x8726874CA113CB87, 0xB8DAB8A9626D11B8, 0x0104010805020901, 0x4F214F426E9E0D4F, 0x36D836ADEE6C9B36, 0xA6A2A6590451FFA6, 0xD26FD2DEBDB90CD2, 0xF5F3F5FB06F70EF5, 0x79F979EF80F29679, 0x6FA16F5FCEDE306F, 0x917E91FCEF3F6D91, 0x525552AA07A4F852, 0x609D6027FDC04760, 0xBCCABC89766535BC, 0x9B569BACCD2B379B, 0x8E028E048C018A8E, 0xA3B6A371155BD2A3, 0x0C300C603C186C0C, 0x7BF17BFF8AF6847B, 0x35D435B5E16A8035, 0x1D741DE8693AF51D, 0xE0A7E05347DDB3E0, 0xD77BD7F6ACB321D7, 0xC22FC25EED999CC2, 0x2EB82E6D965C432E, 0x4B314B627A96294B, 0xFEDFFEA321E15DFE, 0x5741578216AED557, 0x155415A8412ABD15, 0x77C1779FB6EEE877, 0x37DC37A5EB6E9237, 0xE5B3E57B56D79EE5, 0x9F469F8CD923139F, 0xF0E7F0D317FD23F0, 0x4A354A6A7F94204A, 0xDA4FDA9E95A944DA, 0x587D58FA25B0A258, 0xC903C906CA8FCFC9, 0x29A429558D527C29, 0x0A280A5022145A0A, 0xB1FEB1E14F7F50B1, 0xA0BAA0691A5DC9A0, 0x6BB16B7FDAD6146B, 0x852E855CAB17D985, 0xBDCEBD8173673CBD, 0x5D695DD234BA8F5D, 0x1040108050209010, 0xF4F7F4F303F507F4, 0xCB0BCB16C08BDDCB, 0x3EF83EEDC67CD33E, 0x05140528110A2D05, 0x6781671FE6CE7867, 0xE4B7E47353D597E4, 0x279C2725BB4E0227, 0x4119413258827341, 0x8B168B2C9D0BA78B, 0xA7A6A7510153F6A7, 0x7DE97DCF94FAB27D, 0x956E95DCFB374995, 0xD847D88E9FAD56D8, 0xFBCBFB8B30EB70FB, 0xEE9FEE2371C1CDEE, 0x7CED7CC791F8BB7C, 0x66856617E3CC7166, 0xDD53DDA68EA77BDD, 0x175C17B84B2EAF17, 0x47014702468E4547, 0x9E429E84DC211A9E, 0xCA0FCA1EC589D4CA, 0x2DB42D75995A582D, 0xBFC6BF9179632EBF, 0x071C07381B0E3F07, 0xAD8EAD012347ACAD, 0x5A755AEA2FB4B05A, 0x8336836CB51BEF83, 0x33CC3385FF66B633, 0x6391633FF2C65C63, 0x020802100A041202, 0xAA92AA39384993AA, 0x71D971AFA8E2DE71, 0xC807C80ECF8DC6C8, 0x196419C87D32D119, 0x4939497270923B49, 0xD943D9869AAF5FD9, 0xF2EFF2C31DF931F2, 0xE3ABE34B48DBA8E3, 0x5B715BE22AB6B95B, 0x881A8834920DBC88, 0x9A529AA4C8293E9A, 0x2698262DBE4C0B26, 0x32C8328DFA64BF32, 0xB0FAB0E94A7D59B0, 0xE983E91B6ACFF2E9, 0x0F3C0F78331E770F, 0xD573D5E6A6B733D5, 0x803A8074BA1DF480, 0xBEC2BE997C6127BE, 0xCD13CD26DE87EBCD, 0x34D034BDE4688934, 0x483D487A75903248, 0xFFDBFFAB24E354FF, 0x7AF57AF78FF48D7A, 0x907A90F4EA3D6490, 0x5F615FC23EBE9D5F, 0x2080201DA0403D20, 0x68BD6867D5D00F68, 0x1A681AD07234CA1A, 0xAE82AE192C41B7AE, 0xB4EAB4C95E757DB4, 0x544D549A19A8CE54, 0x937693ECE53B7F93, 0x2288220DAA442F22, 0x648D6407E9C86364, 0xF1E3F1DB12FF2AF1, 0x73D173BFA2E6CC73, 0x124812905A248212, 0x401D403A5D807A40, 0x0820084028104808, 0xC32BC356E89B95C3, 0xEC97EC337BC5DFEC, 0xDB4BDB9690AB4DDB, 0xA1BEA1611F5FC0A1, 0x8D0E8D1C8307918D, 0x3DF43DF5C97AC83D, 0x976697CCF1335B97, 0x0000000000000000, 0xCF1BCF36D483F9CF, 0x2BAC2B4587566E2B, 0x76C57697B3ECE176, 0x82328264B019E682, 0xD67FD6FEA9B128D6, 0x1B6C1BD87736C31B, 0xB5EEB5C15B7774B5, 0xAF86AF112943BEAF, 0x6AB56A77DFD41D6A, 0x505D50BA0DA0EA50, 0x450945124C8A5745, 0xF3EBF3CB18FB38F3, 0x30C0309DF060AD30, 0xEF9BEF2B74C3C4EF, 0x3FFC3FE5C37EDA3F, 0x554955921CAAC755, 0xA2B2A2791059DBA2, 0xEA8FEA0365C9E9EA, 0x6589650FECCA6A65, 0xBAD2BAB9686903BA, 0x2FBC2F65935E4A2F, 0xC027C04EE79D8EC0, 0xDE5FDEBE81A160DE, 0x1C701CE06C38FC1C, 0xFDD3FDBB2EE746FD, 0x4D294D52649A1F4D, 0x927292E4E0397692, 0x75C9758FBCEAFA75, 0x061806301E0C3606, 0x8A128A249809AE8A, 0xB2F2B2F940794BB2, 0xE6BFE66359D185E6, 0x0E380E70361C7E0E, 0x1F7C1FF8633EE71F, 0x62956237F7C45562, 0xD477D4EEA3B53AD4, 0xA89AA829324D81A8, 0x966296C4F4315296, 0xF9C3F99B3AEF62F9, 0xC533C566F697A3C5, 0x25942535B14A1025, 0x597959F220B2AB59, 0x842A8454AE15D084, 0x72D572B7A7E4C572, 0x39E439D5DD72EC39, 0x4C2D4C5A6198164C, 0x5E655ECA3BBC945E, 0x78FD78E785F09F78, 0x38E038DDD870E538, 0x8C0A8C148605988C, 0xD163D1C6B2BF17D1, 0xA5AEA5410B57E4A5, 0xE2AFE2434DD9A1E2, 0x6199612FF8C24E61, 0xB3F6B3F1457B42B3, 0x21842115A5423421, 0x9C4A9C94D625089C, 0x1E781EF0663CEE1E, 0x4311432252866143, 0xC73BC776FC93B1C7, 0xFCD7FCB32BE54FFC, 0x0410042014082404, 0x515951B208A2E351, 0x995E99BCC72F2599, 0x6DA96D4FC4DA226D, 0x0D340D68391A650D, 0xFACFFA8335E979FA, 0xDF5BDFB684A369DF, 0x7EE57ED79BFCA97E, 0x2490243DB4481924, 0x3BEC3BC5D776FE3B, 0xAB96AB313D4B9AAB, 0xCE1FCE3ED181F0CE, 0x1144118855229911, 0x8F068F0C8903838F, 0x4E254E4A6B9C044E, 0xB7E6B7D1517366B7, 0xEB8BEB0B60CBE0EB, 0x3CF03CFDCC78C13C, 0x813E817CBF1FFD81, 0x946A94D4FE354094, 0xF7FBF7EB0CF31CF7, 0xB9DEB9A1676F18B9, 0x134C13985F268B13, 0x2CB02C7D9C58512C, 0xD36BD3D6B8BB05D3, 0xE7BBE76B5CD38CE7, 0x6EA56E57CBDC396E, 0xC437C46EF395AAC4, 0x030C03180F061B03, 0x5645568A13ACDC56, 0x440D441A49885E44, 0x7FE17FDF9EFEA07F, 0xA99EA921374F88A9, 0x2AA82A4D8254672A, 0xBBD6BBB16D6B0ABB, 0xC123C146E29F87C1, 0x535153A202A6F153, 0xDC57DCAE8BA572DC, 0x0B2C0B582716530B, 0x9D4E9D9CD327019D, 0x6CAD6C47C1D82B6C, 0x31C43195F562A431, 0x74CD7487B9E8F374, 0xF6FFF6E309F115F6, 0x4605460A438C4C46, 0xAC8AAC092645A5AC, 0x891E893C970FB589, 0x145014A04428B414, 0xE1A3E15B42DFBAE1, 0x165816B04E2CA616, 0x3AE83ACDD274F73A, 0x69B9696FD0D20669, 0x092409482D124109, 0x70DD70A7ADE0D770, 0xB6E2B6D954716FB6, 0xD067D0CEB7BD1ED0, 0xED93ED3B7EC7D6ED, 0xCC17CC2EDB85E2CC, 0x4215422A57846842, 0x985A98B4C22D2C98, 0xA4AAA4490E55EDA4, 0x28A0285D88507528, 0x5C6D5CDA31B8865C, 0xF8C7F8933FED6BF8, 0x86228644A411C286 }; } Botan-1.10.12/src/hash/whirlpool/whrlpool.cpp0000664000175000017500000001300612654331322020667 0ustar jackjack00000000000000/* * Whirlpool * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Whirlpool Compression Function */ void Whirlpool::compress_n(const byte in[], size_t blocks) { static const u64bit RC[10] = { 0x1823C6E887B8014F, 0x36A6D2F5796F9152, 0x60BC9B8EA30C7B35, 0x1DE0D7C22E4BFE57, 0x157737E59FF04ADA, 0x58C9290AB1A06B85, 0xBD5D10F4CB3E0567, 0xE427418BA77D95D8, 0xFBEE7C66DD17479E, 0xCA2DBF07AD5A8333 }; for(size_t i = 0; i != blocks; ++i) { load_be(&M[0], in, M.size()); u64bit K0, K1, K2, K3, K4, K5, K6, K7; K0 = digest[0]; K1 = digest[1]; K2 = digest[2]; K3 = digest[3]; K4 = digest[4]; K5 = digest[5]; K6 = digest[6]; K7 = digest[7]; u64bit B0, B1, B2, B3, B4, B5, B6, B7; B0 = K0 ^ M[0]; B1 = K1 ^ M[1]; B2 = K2 ^ M[2]; B3 = K3 ^ M[3]; B4 = K4 ^ M[4]; B5 = K5 ^ M[5]; B6 = K6 ^ M[6]; B7 = K7 ^ M[7]; for(size_t j = 0; j != 10; ++j) { u64bit T0, T1, T2, T3, T4, T5, T6, T7; T0 = C0[get_byte(0, K0)] ^ C1[get_byte(1, K7)] ^ C2[get_byte(2, K6)] ^ C3[get_byte(3, K5)] ^ C4[get_byte(4, K4)] ^ C5[get_byte(5, K3)] ^ C6[get_byte(6, K2)] ^ C7[get_byte(7, K1)] ^ RC[j]; T1 = C0[get_byte(0, K1)] ^ C1[get_byte(1, K0)] ^ C2[get_byte(2, K7)] ^ C3[get_byte(3, K6)] ^ C4[get_byte(4, K5)] ^ C5[get_byte(5, K4)] ^ C6[get_byte(6, K3)] ^ C7[get_byte(7, K2)]; T2 = C0[get_byte(0, K2)] ^ C1[get_byte(1, K1)] ^ C2[get_byte(2, K0)] ^ C3[get_byte(3, K7)] ^ C4[get_byte(4, K6)] ^ C5[get_byte(5, K5)] ^ C6[get_byte(6, K4)] ^ C7[get_byte(7, K3)]; T3 = C0[get_byte(0, K3)] ^ C1[get_byte(1, K2)] ^ C2[get_byte(2, K1)] ^ C3[get_byte(3, K0)] ^ C4[get_byte(4, K7)] ^ C5[get_byte(5, K6)] ^ C6[get_byte(6, K5)] ^ C7[get_byte(7, K4)]; T4 = C0[get_byte(0, K4)] ^ C1[get_byte(1, K3)] ^ C2[get_byte(2, K2)] ^ C3[get_byte(3, K1)] ^ C4[get_byte(4, K0)] ^ C5[get_byte(5, K7)] ^ C6[get_byte(6, K6)] ^ C7[get_byte(7, K5)]; T5 = C0[get_byte(0, K5)] ^ C1[get_byte(1, K4)] ^ C2[get_byte(2, K3)] ^ C3[get_byte(3, K2)] ^ C4[get_byte(4, K1)] ^ C5[get_byte(5, K0)] ^ C6[get_byte(6, K7)] ^ C7[get_byte(7, K6)]; T6 = C0[get_byte(0, K6)] ^ C1[get_byte(1, K5)] ^ C2[get_byte(2, K4)] ^ C3[get_byte(3, K3)] ^ C4[get_byte(4, K2)] ^ C5[get_byte(5, K1)] ^ C6[get_byte(6, K0)] ^ C7[get_byte(7, K7)]; T7 = C0[get_byte(0, K7)] ^ C1[get_byte(1, K6)] ^ C2[get_byte(2, K5)] ^ C3[get_byte(3, K4)] ^ C4[get_byte(4, K3)] ^ C5[get_byte(5, K2)] ^ C6[get_byte(6, K1)] ^ C7[get_byte(7, K0)]; K0 = T0; K1 = T1; K2 = T2; K3 = T3; K4 = T4; K5 = T5; K6 = T6; K7 = T7; T0 = C0[get_byte(0, B0)] ^ C1[get_byte(1, B7)] ^ C2[get_byte(2, B6)] ^ C3[get_byte(3, B5)] ^ C4[get_byte(4, B4)] ^ C5[get_byte(5, B3)] ^ C6[get_byte(6, B2)] ^ C7[get_byte(7, B1)] ^ K0; T1 = C0[get_byte(0, B1)] ^ C1[get_byte(1, B0)] ^ C2[get_byte(2, B7)] ^ C3[get_byte(3, B6)] ^ C4[get_byte(4, B5)] ^ C5[get_byte(5, B4)] ^ C6[get_byte(6, B3)] ^ C7[get_byte(7, B2)] ^ K1; T2 = C0[get_byte(0, B2)] ^ C1[get_byte(1, B1)] ^ C2[get_byte(2, B0)] ^ C3[get_byte(3, B7)] ^ C4[get_byte(4, B6)] ^ C5[get_byte(5, B5)] ^ C6[get_byte(6, B4)] ^ C7[get_byte(7, B3)] ^ K2; T3 = C0[get_byte(0, B3)] ^ C1[get_byte(1, B2)] ^ C2[get_byte(2, B1)] ^ C3[get_byte(3, B0)] ^ C4[get_byte(4, B7)] ^ C5[get_byte(5, B6)] ^ C6[get_byte(6, B5)] ^ C7[get_byte(7, B4)] ^ K3; T4 = C0[get_byte(0, B4)] ^ C1[get_byte(1, B3)] ^ C2[get_byte(2, B2)] ^ C3[get_byte(3, B1)] ^ C4[get_byte(4, B0)] ^ C5[get_byte(5, B7)] ^ C6[get_byte(6, B6)] ^ C7[get_byte(7, B5)] ^ K4; T5 = C0[get_byte(0, B5)] ^ C1[get_byte(1, B4)] ^ C2[get_byte(2, B3)] ^ C3[get_byte(3, B2)] ^ C4[get_byte(4, B1)] ^ C5[get_byte(5, B0)] ^ C6[get_byte(6, B7)] ^ C7[get_byte(7, B6)] ^ K5; T6 = C0[get_byte(0, B6)] ^ C1[get_byte(1, B5)] ^ C2[get_byte(2, B4)] ^ C3[get_byte(3, B3)] ^ C4[get_byte(4, B2)] ^ C5[get_byte(5, B1)] ^ C6[get_byte(6, B0)] ^ C7[get_byte(7, B7)] ^ K6; T7 = C0[get_byte(0, B7)] ^ C1[get_byte(1, B6)] ^ C2[get_byte(2, B5)] ^ C3[get_byte(3, B4)] ^ C4[get_byte(4, B3)] ^ C5[get_byte(5, B2)] ^ C6[get_byte(6, B1)] ^ C7[get_byte(7, B0)] ^ K7; B0 = T0; B1 = T1; B2 = T2; B3 = T3; B4 = T4; B5 = T5; B6 = T6; B7 = T7; } digest[0] ^= B0 ^ M[0]; digest[1] ^= B1 ^ M[1]; digest[2] ^= B2 ^ M[2]; digest[3] ^= B3 ^ M[3]; digest[4] ^= B4 ^ M[4]; digest[5] ^= B5 ^ M[5]; digest[6] ^= B6 ^ M[6]; digest[7] ^= B7 ^ M[7]; in += hash_block_size(); } } /* * Copy out the digest */ void Whirlpool::copy_out(byte output[]) { for(size_t i = 0; i != output_length(); i += 8) store_be(digest[i/8], output + i); } /* * Clear memory of sensitive data */ void Whirlpool::clear() { MDx_HashFunction::clear(); zeroise(M); zeroise(digest); } } Botan-1.10.12/src/hash/whirlpool/whrlpool.h0000664000175000017500000000175412654331322020343 0ustar jackjack00000000000000/* * Whirlpool * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_WHIRLPOOL_H__ #define BOTAN_WHIRLPOOL_H__ #include namespace Botan { /** * Whirlpool */ class BOTAN_DLL Whirlpool : public MDx_HashFunction { public: std::string name() const { return "Whirlpool"; } size_t output_length() const { return 64; } HashFunction* clone() const { return new Whirlpool; } void clear(); Whirlpool() : MDx_HashFunction(64, true, true, 32), M(8), digest(8) { clear(); } private: void compress_n(const byte[], size_t blocks); void copy_out(byte[]); static const u64bit C0[256]; static const u64bit C1[256]; static const u64bit C2[256]; static const u64bit C3[256]; static const u64bit C4[256]; static const u64bit C5[256]; static const u64bit C6[256]; static const u64bit C7[256]; SecureVector M, digest; }; } #endif Botan-1.10.12/src/kdf/info.txt0000664000175000017500000000005612654331322015614 0ustar jackjack00000000000000define KDF_BASE alloc Botan-1.10.12/src/kdf/kdf.cpp0000664000175000017500000000347312654331322015376 0ustar jackjack00000000000000/* * KDF Base Class * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * Derive a key */ SecureVector KDF::derive_key(size_t key_len, const MemoryRegion& secret, const std::string& salt) const { return derive_key(key_len, &secret[0], secret.size(), reinterpret_cast(salt.data()), salt.length()); } /* * Derive a key */ SecureVector KDF::derive_key(size_t key_len, const MemoryRegion& secret, const byte salt[], size_t salt_len) const { return derive_key(key_len, &secret[0], secret.size(), salt, salt_len); } /* * Derive a key */ SecureVector KDF::derive_key(size_t key_len, const MemoryRegion& secret, const MemoryRegion& salt) const { return derive_key(key_len, &secret[0], secret.size(), &salt[0], salt.size()); } /* * Derive a key */ SecureVector KDF::derive_key(size_t key_len, const byte secret[], size_t secret_len, const std::string& salt) const { return derive_key(key_len, secret, secret_len, reinterpret_cast(salt.data()), salt.length()); } /* * Derive a key */ SecureVector KDF::derive_key(size_t key_len, const byte secret[], size_t secret_len, const byte salt[], size_t salt_len) const { return derive(key_len, secret, secret_len, salt, salt_len); } } Botan-1.10.12/src/kdf/kdf.h0000664000175000017500000000573612654331322015047 0ustar jackjack00000000000000/* * KDF/MGF * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_KDF_BASE_H__ #define BOTAN_KDF_BASE_H__ #include #include #include namespace Botan { /** * Key Derivation Function */ class BOTAN_DLL KDF : public Algorithm { public: /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param salt a diversifier */ SecureVector derive_key(size_t key_len, const MemoryRegion& secret, const std::string& salt = "") const; /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param salt a diversifier */ SecureVector derive_key(size_t key_len, const MemoryRegion& secret, const MemoryRegion& salt) const; /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param salt a diversifier * @param salt_len size of salt in bytes */ SecureVector derive_key(size_t key_len, const MemoryRegion& secret, const byte salt[], size_t salt_len) const; /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param secret_len size of secret in bytes * @param salt a diversifier */ SecureVector derive_key(size_t key_len, const byte secret[], size_t secret_len, const std::string& salt = "") const; /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param secret_len size of secret in bytes * @param salt a diversifier * @param salt_len size of salt in bytes */ SecureVector derive_key(size_t key_len, const byte secret[], size_t secret_len, const byte salt[], size_t salt_len) const; void clear() {} virtual KDF* clone() const = 0; private: virtual SecureVector derive(size_t key_len, const byte secret[], size_t secret_len, const byte salt[], size_t salt_len) const = 0; }; /** * Mask Generation Function */ class BOTAN_DLL MGF { public: virtual void mask(const byte in[], size_t in_len, byte out[], size_t out_len) const = 0; virtual ~MGF() {} }; } #endif Botan-1.10.12/src/kdf/kdf1/info.txt0000664000175000017500000000005112654331322016434 0ustar jackjack00000000000000define KDF1 hash Botan-1.10.12/src/kdf/kdf1/kdf1.cpp0000664000175000017500000000071212654331322016275 0ustar jackjack00000000000000/* * KDF1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * KDF1 Key Derivation Mechanism */ SecureVector KDF1::derive(size_t, const byte secret[], size_t secret_len, const byte P[], size_t P_len) const { hash->update(secret, secret_len); hash->update(P, P_len); return hash->final(); } } Botan-1.10.12/src/kdf/kdf1/kdf1.h0000664000175000017500000000144012654331322015741 0ustar jackjack00000000000000/* * KDF1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_KDF1_H__ #define BOTAN_KDF1_H__ #include #include namespace Botan { /** * KDF1, from IEEE 1363 */ class BOTAN_DLL KDF1 : public KDF { public: SecureVector derive(size_t, const byte secret[], size_t secret_len, const byte P[], size_t P_len) const; std::string name() const { return "KDF1(" + hash->name() + ")"; } KDF* clone() const { return new KDF1(hash->clone()); } KDF1(HashFunction* h) : hash(h) {} KDF1(const KDF1& other) : KDF(), hash(other.hash->clone()) {} ~KDF1() { delete hash; } private: HashFunction* hash; }; } #endif Botan-1.10.12/src/kdf/kdf2/info.txt0000664000175000017500000000005112654331322016435 0ustar jackjack00000000000000define KDF2 hash Botan-1.10.12/src/kdf/kdf2/kdf2.cpp0000664000175000017500000000145312654331322016302 0ustar jackjack00000000000000/* * KDF2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * KDF2 Key Derivation Mechanism */ SecureVector KDF2::derive(size_t out_len, const byte secret[], size_t secret_len, const byte P[], size_t P_len) const { SecureVector output; u32bit counter = 1; while(out_len && counter) { hash->update(secret, secret_len); hash->update_be(counter); hash->update(P, P_len); SecureVector hash_result = hash->final(); size_t added = std::min(hash_result.size(), out_len); output += std::make_pair(&hash_result[0], added); out_len -= added; ++counter; } return output; } } Botan-1.10.12/src/kdf/kdf2/kdf2.h0000664000175000017500000000134512654331322015747 0ustar jackjack00000000000000/* * KDF2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_KDF2_H__ #define BOTAN_KDF2_H__ #include #include namespace Botan { /** * KDF2, from IEEE 1363 */ class BOTAN_DLL KDF2 : public KDF { public: SecureVector derive(size_t, const byte[], size_t, const byte[], size_t) const; std::string name() const { return "KDF2(" + hash->name() + ")"; } KDF* clone() const { return new KDF2(hash->clone()); } KDF2(HashFunction* h) : hash(h) {} KDF2(const KDF2& other) : KDF(), hash(other.hash->clone()) {} ~KDF2() { delete hash; } private: HashFunction* hash; }; } #endif Botan-1.10.12/src/kdf/mgf1/info.txt0000664000175000017500000000005112654331322016441 0ustar jackjack00000000000000define MGF1 hash Botan-1.10.12/src/kdf/mgf1/mgf1.cpp0000664000175000017500000000165212654331322016313 0ustar jackjack00000000000000/* * MGF1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * MGF1 Mask Generation Function */ void MGF1::mask(const byte in[], size_t in_len, byte out[], size_t out_len) const { u32bit counter = 0; while(out_len) { hash->update(in, in_len); hash->update_be(counter); SecureVector buffer = hash->final(); size_t xored = std::min(buffer.size(), out_len); xor_buf(out, &buffer[0], xored); out += xored; out_len -= xored; ++counter; } } /* * MGF1 Constructor */ MGF1::MGF1(HashFunction* h) : hash(h) { if(!hash) throw Invalid_Argument("MGF1 given null hash object"); } /* * MGF1 Destructor */ MGF1::~MGF1() { delete hash; } } Botan-1.10.12/src/kdf/mgf1/mgf1.h0000664000175000017500000000101212654331322015746 0ustar jackjack00000000000000/* * MGF1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MGF1_H__ #define BOTAN_MGF1_H__ #include #include namespace Botan { /** * MGF1 from PKCS #1 v2.0 */ class BOTAN_DLL MGF1 : public MGF { public: void mask(const byte[], size_t, byte[], size_t) const; /** MGF1 constructor: takes ownership of hash */ MGF1(HashFunction* hash); ~MGF1(); private: HashFunction* hash; }; } #endif Botan-1.10.12/src/kdf/prf_ssl3/info.txt0000664000175000017500000000007512654331322017350 0ustar jackjack00000000000000define SSL_V3_PRF md5 sha1 algo_base Botan-1.10.12/src/kdf/prf_ssl3/prf_ssl3.cpp0000664000175000017500000000337312654331322020117 0ustar jackjack00000000000000/* * SSLv3 PRF * (C) 2004-2006 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { /* * Return the next inner hash */ OctetString next_hash(size_t where, size_t want, HashFunction& md5, HashFunction& sha1, const byte secret[], size_t secret_len, const byte seed[], size_t seed_len) { BOTAN_ASSERT(want <= md5.output_length(), "Desired output too large"); const byte ASCII_A_CHAR = 0x41; for(size_t j = 0; j != where + 1; j++) sha1.update(static_cast(ASCII_A_CHAR + where)); sha1.update(secret, secret_len); sha1.update(seed, seed_len); SecureVector sha1_hash = sha1.final(); md5.update(secret, secret_len); md5.update(sha1_hash); SecureVector md5_hash = md5.final(); return OctetString(&md5_hash[0], want); } } /* * SSL3 PRF */ SecureVector SSL3_PRF::derive(size_t key_len, const byte secret[], size_t secret_len, const byte seed[], size_t seed_len) const { if(key_len > 416) throw Invalid_Argument("SSL3_PRF: Requested key length is too large"); MD5 md5; SHA_160 sha1; OctetString output; int counter = 0; while(key_len) { const size_t produce = std::min(key_len, md5.output_length()); output = output + next_hash(counter++, produce, md5, sha1, secret, secret_len, seed, seed_len); key_len -= produce; } return output.bits_of(); } } Botan-1.10.12/src/kdf/prf_ssl3/prf_ssl3.h0000664000175000017500000000101512654331322017553 0ustar jackjack00000000000000/* * SSLv3 PRF * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SSLV3_PRF_H__ #define BOTAN_SSLV3_PRF_H__ #include namespace Botan { /** * PRF used in SSLv3 */ class BOTAN_DLL SSL3_PRF : public KDF { public: SecureVector derive(size_t, const byte[], size_t, const byte[], size_t) const; std::string name() const { return "SSL3-PRF"; } KDF* clone() const { return new SSL3_PRF; } }; } #endif Botan-1.10.12/src/kdf/prf_tls/info.txt0000664000175000017500000000007112654331322017262 0ustar jackjack00000000000000define TLS_V10_PRF hmac md5 sha1 Botan-1.10.12/src/kdf/prf_tls/prf_tls.cpp0000664000175000017500000000440212654331322017745 0ustar jackjack00000000000000/* * TLS v1.0 and v1.2 PRFs * (C) 2004-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace { /* * TLS PRF P_hash function */ void P_hash(MemoryRegion& output, MessageAuthenticationCode* mac, const byte secret[], size_t secret_len, const byte seed[], size_t seed_len) { mac->set_key(secret, secret_len); SecureVector A(seed, seed_len); size_t offset = 0; while(offset != output.size()) { const size_t this_block_len = std::min(mac->output_length(), output.size() - offset); A = mac->process(A); mac->update(A); mac->update(seed, seed_len); SecureVector block = mac->final(); xor_buf(&output[offset], &block[0], this_block_len); offset += this_block_len; } } } /* * TLS PRF Constructor and Destructor */ TLS_PRF::TLS_PRF() { hmac_md5 = new HMAC(new MD5); hmac_sha1 = new HMAC(new SHA_160); } TLS_PRF::~TLS_PRF() { delete hmac_md5; delete hmac_sha1; } /* * TLS PRF */ SecureVector TLS_PRF::derive(size_t key_len, const byte secret[], size_t secret_len, const byte seed[], size_t seed_len) const { SecureVector output(key_len); size_t S1_len = (secret_len + 1) / 2, S2_len = (secret_len + 1) / 2; const byte* S1 = secret; const byte* S2 = secret + (secret_len - S2_len); P_hash(output, hmac_md5, S1, S1_len, seed, seed_len); P_hash(output, hmac_sha1, S2, S2_len, seed, seed_len); return output; } /* * TLS v1.2 PRF Constructor and Destructor */ TLS_12_PRF::TLS_12_PRF(MessageAuthenticationCode* mac) : hmac(mac) { } TLS_12_PRF::~TLS_12_PRF() { delete hmac; } SecureVector TLS_12_PRF::derive(size_t key_len, const byte secret[], size_t secret_len, const byte seed[], size_t seed_len) const { SecureVector output(key_len); P_hash(output, hmac, secret, secret_len, seed, seed_len); return output; } } Botan-1.10.12/src/kdf/prf_tls/prf_tls.h0000664000175000017500000000250412654331322017413 0ustar jackjack00000000000000/* * TLS v1.0 and v1.2 PRFs * (C) 2004-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_TLS_PRF_H__ #define BOTAN_TLS_PRF_H__ #include #include #include namespace Botan { /** * PRF used in TLS 1.0/1.1 */ class BOTAN_DLL TLS_PRF : public KDF { public: SecureVector derive(size_t key_len, const byte secret[], size_t secret_len, const byte seed[], size_t seed_len) const; std::string name() const { return "TLS-PRF"; } KDF* clone() const { return new TLS_PRF; } TLS_PRF(); ~TLS_PRF(); private: MessageAuthenticationCode* hmac_md5; MessageAuthenticationCode* hmac_sha1; }; /** * PRF used in TLS 1.2 */ class BOTAN_DLL TLS_12_PRF : public KDF { public: SecureVector derive(size_t key_len, const byte secret[], size_t secret_len, const byte seed[], size_t seed_len) const; std::string name() const { return "TLSv12-PRF(" + hmac->name() + ")"; } KDF* clone() const { return new TLS_12_PRF(hmac->clone()); } TLS_12_PRF(MessageAuthenticationCode* hmac); ~TLS_12_PRF(); private: MessageAuthenticationCode* hmac; }; } #endif Botan-1.10.12/src/kdf/prf_x942/info.txt0000664000175000017500000000007512654331322017172 0ustar jackjack00000000000000define X942_PRF asn1 oid_lookup sha1 Botan-1.10.12/src/kdf/prf_x942/prf_x942.cpp0000664000175000017500000000367212654331322017565 0ustar jackjack00000000000000/* * X9.42 PRF * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { /* * Encode an integer as an OCTET STRING */ MemoryVector encode_x942_int(u32bit n) { byte n_buf[4] = { 0 }; store_be(n, n_buf); return DER_Encoder().encode(n_buf, 4, OCTET_STRING).get_contents(); } } /* * X9.42 PRF */ SecureVector X942_PRF::derive(size_t key_len, const byte secret[], size_t secret_len, const byte salt[], size_t salt_len) const { SHA_160 hash; const OID kek_algo(key_wrap_oid); SecureVector key; u32bit counter = 1; while(key.size() != key_len && counter) { hash.update(secret, secret_len); hash.update( DER_Encoder().start_cons(SEQUENCE) .start_cons(SEQUENCE) .encode(kek_algo) .raw_bytes(encode_x942_int(counter)) .end_cons() .encode_if(salt_len != 0, DER_Encoder() .start_explicit(0) .encode(salt, salt_len, OCTET_STRING) .end_explicit() ) .start_explicit(2) .raw_bytes(encode_x942_int(static_cast(8 * key_len))) .end_explicit() .end_cons().get_contents() ); SecureVector digest = hash.final(); const size_t needed = std::min(digest.size(), key_len - key.size()); key += std::make_pair(&digest[0], needed); ++counter; } return key; } /* * X9.42 Constructor */ X942_PRF::X942_PRF(const std::string& oid) { if(OIDS::have_oid(oid)) key_wrap_oid = OIDS::lookup(oid).as_string(); else key_wrap_oid = oid; } } Botan-1.10.12/src/kdf/prf_x942/prf_x942.h0000664000175000017500000000122012654331322017215 0ustar jackjack00000000000000/* * X9.42 PRF * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ANSI_X942_PRF_H__ #define BOTAN_ANSI_X942_PRF_H__ #include namespace Botan { /** * PRF from ANSI X9.42 */ class BOTAN_DLL X942_PRF : public KDF { public: SecureVector derive(size_t, const byte[], size_t, const byte[], size_t) const; std::string name() const { return "X942_PRF(" + key_wrap_oid + ")"; } KDF* clone() const { return new X942_PRF(key_wrap_oid); } X942_PRF(const std::string& oid); private: std::string key_wrap_oid; }; } #endif Botan-1.10.12/src/libstate/botan.h0000664000175000017500000000064512654331322016443 0ustar jackjack00000000000000/* * A vague catch all include file for Botan * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BOTAN_H__ #define BOTAN_BOTAN_H__ #include #include #include #include #include #include #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) #include #endif #endif Botan-1.10.12/src/libstate/get_enc.cpp0000664000175000017500000001146312654331322017277 0ustar jackjack00000000000000/* * PBKDF/EMSA/EME/KDF/MGF Retrieval * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #if defined(BOTAN_HAS_MGF1) #include #endif #if defined(BOTAN_HAS_EMSA1) #include #endif #if defined(BOTAN_HAS_EMSA1_BSI) #include #endif #if defined(BOTAN_HAS_EMSA2) #include #endif #if defined(BOTAN_HAS_EMSA3) #include #endif #if defined(BOTAN_HAS_EMSA4) #include #endif #if defined(BOTAN_HAS_EMSA_RAW) #include #endif #if defined(BOTAN_HAS_EME1) #include #endif #if defined(BOTAN_HAS_EME_PKCS1v15) #include #endif #if defined(BOTAN_HAS_KDF1) #include #endif #if defined(BOTAN_HAS_KDF2) #include #endif #if defined(BOTAN_HAS_X942_PRF) #include #endif #if defined(BOTAN_HAS_SSL_V3_PRF) #include #endif #if defined(BOTAN_HAS_TLS_V10_PRF) #include #endif namespace Botan { /* * Get a PBKDF algorithm by name */ PBKDF* get_pbkdf(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); if(PBKDF* pbkdf = af.make_pbkdf(algo_spec)) return pbkdf; throw Algorithm_Not_Found(algo_spec); } /* * Get an EMSA by name */ EMSA* get_emsa(const std::string& algo_spec) { SCAN_Name request(algo_spec); Algorithm_Factory& af = global_state().algorithm_factory(); #if defined(BOTAN_HAS_EMSA_RAW) if(request.algo_name() == "Raw" && request.arg_count() == 0) return new EMSA_Raw; #endif #if defined(BOTAN_HAS_EMSA1) if(request.algo_name() == "EMSA1" && request.arg_count() == 1) return new EMSA1(af.make_hash_function(request.arg(0))); #endif #if defined(BOTAN_HAS_EMSA1_BSI) if(request.algo_name() == "EMSA1_BSI" && request.arg_count() == 1) return new EMSA1_BSI(af.make_hash_function(request.arg(0))); #endif #if defined(BOTAN_HAS_EMSA2) if(request.algo_name() == "EMSA2" && request.arg_count() == 1) return new EMSA2(af.make_hash_function(request.arg(0))); #endif #if defined(BOTAN_HAS_EMSA3) if(request.algo_name() == "EMSA3" && request.arg_count() == 1) { if(request.arg(0) == "Raw") return new EMSA3_Raw; return new EMSA3(af.make_hash_function(request.arg(0))); } #endif #if defined(BOTAN_HAS_EMSA4) if(request.algo_name() == "EMSA4" && request.arg_count_between(1, 3)) { // 3 args: Hash, MGF, salt size (MGF is hardcoded MGF1 in Botan) if(request.arg_count() == 1) return new EMSA4(af.make_hash_function(request.arg(0))); if(request.arg_count() == 2 && request.arg(1) != "MGF1") return new EMSA4(af.make_hash_function(request.arg(0))); if(request.arg_count() == 3) return new EMSA4(af.make_hash_function(request.arg(0)), request.arg_as_integer(2, 0)); } #endif throw Algorithm_Not_Found(algo_spec); } /* * Get an EME by name */ EME* get_eme(const std::string& algo_spec) { SCAN_Name request(algo_spec); Algorithm_Factory& af = global_state().algorithm_factory(); if(request.algo_name() == "Raw") return 0; // No padding #if defined(BOTAN_HAS_EME_PKCS1v15) if(request.algo_name() == "PKCS1v15" && request.arg_count() == 0) return new EME_PKCS1v15; #endif #if defined(BOTAN_HAS_EME1) if(request.algo_name() == "EME1" && request.arg_count_between(1, 2)) { if(request.arg_count() == 1 || (request.arg_count() == 2 && request.arg(1) == "MGF1")) { return new EME1(af.make_hash_function(request.arg(0))); } } #endif throw Algorithm_Not_Found(algo_spec); } /* * Get an KDF by name */ KDF* get_kdf(const std::string& algo_spec) { SCAN_Name request(algo_spec); Algorithm_Factory& af = global_state().algorithm_factory(); if(request.algo_name() == "Raw") return 0; // No KDF #if defined(BOTAN_HAS_KDF1) if(request.algo_name() == "KDF1" && request.arg_count() == 1) return new KDF1(af.make_hash_function(request.arg(0))); #endif #if defined(BOTAN_HAS_KDF2) if(request.algo_name() == "KDF2" && request.arg_count() == 1) return new KDF2(af.make_hash_function(request.arg(0))); #endif #if defined(BOTAN_HAS_X942_PRF) if(request.algo_name() == "X9.42-PRF" && request.arg_count() == 1) return new X942_PRF(request.arg(0)); // OID #endif #if defined(BOTAN_HAS_TLS_V10_PRF) if(request.algo_name() == "TLS-PRF" && request.arg_count() == 0) return new TLS_PRF; #endif #if defined(BOTAN_HAS_SSL_V3_PRF) if(request.algo_name() == "SSL3-PRF" && request.arg_count() == 0) return new SSL3_PRF; #endif throw Algorithm_Not_Found(algo_spec); } } Botan-1.10.12/src/libstate/global_rng.cpp0000664000175000017500000001070312654331322017775 0ustar jackjack00000000000000/* * Global PRNG * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #if defined(BOTAN_HAS_RANDPOOL) #include #endif #if defined(BOTAN_HAS_HMAC_RNG) #include #endif #if defined(BOTAN_HAS_X931_RNG) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_HIGH_RESOLUTION_TIMER) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_RDRAND) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_EGD) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_UNIX) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_BEOS) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_CAPI) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_WIN32) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_FTW) #include #endif namespace Botan { namespace { /** * Add any known entropy sources to this RNG */ void add_entropy_sources(RandomNumberGenerator* rng) { #if defined(BOTAN_HAS_ENTROPY_SRC_HIGH_RESOLUTION_TIMER) rng->add_entropy_source(new High_Resolution_Timestamp); #endif #if defined(BOTAN_HAS_ENTROPY_SRC_RDRAND) rng->add_entropy_source(new Intel_Rdrand); #endif #if defined(BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM) rng->add_entropy_source( new Device_EntropySource( split_on("/dev/urandom:/dev/srandom:/dev/random", ':') ) ); #endif #if defined(BOTAN_HAS_ENTROPY_SRC_EGD) rng->add_entropy_source( new EGD_EntropySource(split_on("/var/run/egd-pool:/dev/egd-pool", ':')) ); #endif #if defined(BOTAN_HAS_ENTROPY_SRC_CAPI) rng->add_entropy_source(new Win32_CAPI_EntropySource); #endif #if defined(BOTAN_HAS_ENTROPY_SRC_FTW) rng->add_entropy_source(new FTW_EntropySource("/proc")); #endif #if defined(BOTAN_HAS_ENTROPY_SRC_WIN32) rng->add_entropy_source(new Win32_EntropySource); #endif #if defined(BOTAN_HAS_ENTROPY_SRC_BEOS) rng->add_entropy_source(new BeOS_EntropySource); #endif #if defined(BOTAN_HAS_ENTROPY_SRC_UNIX) rng->add_entropy_source( new Unix_EntropySource(split_on("/bin:/sbin:/usr/bin:/usr/sbin", ':')) ); #endif } class Serialized_PRNG : public RandomNumberGenerator { public: void randomize(byte out[], size_t len) { Mutex_Holder lock(mutex); rng->randomize(out, len); } bool is_seeded() const { Mutex_Holder lock(mutex); return rng->is_seeded(); } void clear() { Mutex_Holder lock(mutex); rng->clear(); } std::string name() const { Mutex_Holder lock(mutex); return rng->name(); } void reseed(size_t poll_bits) { Mutex_Holder lock(mutex); rng->reseed(poll_bits); } void add_entropy_source(EntropySource* es) { Mutex_Holder lock(mutex); rng->add_entropy_source(es); } void add_entropy(const byte in[], size_t len) { Mutex_Holder lock(mutex); rng->add_entropy(in, len); } // We do not own the mutex; Library_State does Serialized_PRNG(RandomNumberGenerator* r, Mutex* m) : mutex(m), rng(r) {} ~Serialized_PRNG() { delete rng; } private: Mutex* mutex; RandomNumberGenerator* rng; }; } RandomNumberGenerator* Library_State::make_global_rng(Algorithm_Factory& af, Mutex* mutex) { RandomNumberGenerator* rng = 0; #if defined(BOTAN_HAS_HMAC_RNG) rng = new HMAC_RNG(af.make_mac("HMAC(SHA-512)"), af.make_mac("HMAC(SHA-256)")); #elif defined(BOTAN_HAS_RANDPOOL) rng = new Randpool(af.make_block_cipher("AES-256"), af.make_mac("HMAC(SHA-256)")); #endif if(!rng) throw Internal_Error("No usable RNG found enabled in build"); /* If X9.31 is available, use it to wrap the other RNG as a failsafe */ #if defined(BOTAN_HAS_X931_RNG) rng = new ANSI_X931_RNG(af.make_block_cipher("AES-256"), rng); #endif add_entropy_sources(rng); rng->reseed(256); return new Serialized_PRNG(rng, mutex); } } Botan-1.10.12/src/libstate/global_state.cpp0000664000175000017500000000300212654331322020321 0ustar jackjack00000000000000/* * Global State Management * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * @todo There should probably be a lock to avoid racy manipulation * of the state among different threads */ namespace Global_State_Management { /* * Botan's global state */ namespace { Library_State* global_lib_state = 0; } /* * Access the global state object */ Library_State& global_state() { /* Lazy initialization. Botan still needs to be deinitialized later on or memory might leak. */ if(!global_lib_state) { global_lib_state = new Library_State; global_lib_state->initialize(true); } return (*global_lib_state); } /* * Set a new global state object */ void set_global_state(Library_State* new_state) { delete swap_global_state(new_state); } /* * Set a new global state object unless one already existed */ bool set_global_state_unless_set(Library_State* new_state) { if(global_lib_state) { delete new_state; return false; } else { delete swap_global_state(new_state); return true; } } /* * Swap two global state objects */ Library_State* swap_global_state(Library_State* new_state) { Library_State* old_state = global_lib_state; global_lib_state = new_state; return old_state; } /* * Query if library is initialized */ bool global_state_exists() { return (global_lib_state != 0); } } } Botan-1.10.12/src/libstate/global_state.h0000664000175000017500000000275212654331322020001 0ustar jackjack00000000000000/* * Global State Management * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_GLOBAL_STATE_H__ #define BOTAN_GLOBAL_STATE_H__ #include namespace Botan { /* * Forward declare to avoid recursive dependency between this header * and libstate.h */ class Library_State; /** * Namespace for management of the global state */ namespace Global_State_Management { /** * Access the global library state * @return reference to the global library state */ BOTAN_DLL Library_State& global_state(); /** * Set the global state object * @param state the new global state to use */ BOTAN_DLL void set_global_state(Library_State* state); /** * Set the global state object unless it is already set * @param state the new global state to use * @return true if the state parameter is now being used as the global * state, or false if one was already set, in which case the * parameter was deleted immediately */ BOTAN_DLL bool set_global_state_unless_set(Library_State* state); /** * Swap the current state for another * @param new_state the new state object to use * @return previous state (or NULL if none) */ BOTAN_DLL Library_State* swap_global_state(Library_State* new_state); /** * Query if the library is currently initialized * @return true iff the library is initialized */ BOTAN_DLL bool global_state_exists(); } /* * Insert into Botan ns for convenience/backwards compatability */ using Global_State_Management::global_state; } #endif Botan-1.10.12/src/libstate/info.txt0000664000175000017500000000072312654331322016660 0ustar jackjack00000000000000load_on always define LIBSTATE_MODULE botan.h global_state.h init.h libstate.h look_pk.h lookup.h scan_name.h get_enc.cpp global_rng.cpp global_state.cpp init.cpp libstate.cpp lookup.cpp policy.cpp scan_name.cpp aes algo_factory alloc bigint block core_engine engine filters hash hmac hmac_rng kdf mac mode_pad mutex noop_mutex pbkdf pk_pad pubkey rng sha2_32 sha2_64 stream system_alloc Botan-1.10.12/src/libstate/init.cpp0000664000175000017500000000325212654331322016633 0ustar jackjack00000000000000/* * Default Initialization Function * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Library Initialization */ void LibraryInitializer::initialize(const std::string& arg_string) { bool thread_safe = false; const std::vector arg_list = split_on(arg_string, ' '); for(size_t i = 0; i != arg_list.size(); ++i) { if(arg_list[i].size() == 0) continue; std::string name, value; if(arg_list[i].find('=') == std::string::npos) { name = arg_list[i]; value = "true"; } else { std::vector name_and_value = split_on(arg_list[i], '='); name = name_and_value[0]; value = name_and_value[1]; } bool is_on = (value == "1" || value == "true" || value == "yes" || value == "on"); if(name == "thread_safe") thread_safe = is_on; } try { /* This two stage initialization process is because Library_State's constructor will implicitly refer to global state through the allocators and so forth, so global_state() has to be a valid reference before initialize() can be called. Yeah, gross. */ Global_State_Management::set_global_state(new Library_State); global_state().initialize(thread_safe); } catch(...) { deinitialize(); throw; } } /* * Library Shutdown */ void LibraryInitializer::deinitialize() { Global_State_Management::set_global_state(0); } } Botan-1.10.12/src/libstate/init.h0000664000175000017500000000213012654331322016272 0ustar jackjack00000000000000/* * Library Initialization * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_LIBRARY_INITIALIZER_H__ #define BOTAN_LIBRARY_INITIALIZER_H__ #include #include namespace Botan { /** * This class represents the Library Initialization/Shutdown Object. It * has to exceed the lifetime of any Botan object used in an * application. You can call initialize/deinitialize or use * LibraryInitializer in the RAII style. */ class BOTAN_DLL LibraryInitializer { public: /** * Initialize the library * @param options a string listing initialization options */ static void initialize(const std::string& options = ""); /** * Shutdown the library */ static void deinitialize(); /** * Initialize the library * @param options a string listing initialization options */ LibraryInitializer(const std::string& options = "") { LibraryInitializer::initialize(options); } ~LibraryInitializer() { LibraryInitializer::deinitialize(); } }; } #endif Botan-1.10.12/src/libstate/libstate.cpp0000664000175000017500000001503712654331322017503 0ustar jackjack00000000000000/* * Library Internal/Global State * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_SELFTESTS) #include #endif #if defined(BOTAN_HAS_MUTEX_PTHREAD) #include #elif defined(BOTAN_HAS_MUTEX_WIN32) #include #endif #if defined(BOTAN_HAS_ALLOC_MMAP) #include #endif #if defined(BOTAN_HAS_ENGINE_ASSEMBLER) #include #endif #if defined(BOTAN_HAS_ENGINE_AES_ISA) #include #endif #if defined(BOTAN_HAS_ENGINE_SIMD) #include #endif #if defined(BOTAN_HAS_ENGINE_GNU_MP) #include #endif #if defined(BOTAN_HAS_ENGINE_OPENSSL) #include #endif namespace Botan { /* * Get a new mutex object */ Mutex* Library_State::get_mutex() const { return mutex_factory->make(); } /* * Get an allocator by its name */ Allocator* Library_State::get_allocator(const std::string& type) const { Mutex_Holder lock(allocator_lock); if(type != "") return search_map(alloc_factory, type, 0); if(!cached_default_allocator) { cached_default_allocator = search_map(alloc_factory, default_allocator_name, 0); } return cached_default_allocator; } /* * Create a new name to object mapping */ void Library_State::add_allocator(Allocator* allocator) { Mutex_Holder lock(allocator_lock); allocator->init(); allocators.push_back(allocator); alloc_factory[allocator->type()] = allocator; } /* * Set the default allocator type */ void Library_State::set_default_allocator(const std::string& type) { Mutex_Holder lock(allocator_lock); if(type == "") return; default_allocator_name = type; cached_default_allocator = 0; } /* * Get a configuration value */ std::string Library_State::get(const std::string& section, const std::string& key) const { Mutex_Holder lock(config_lock); return search_map(config, section + "/" + key, ""); } /* * See if a particular option has been set */ bool Library_State::is_set(const std::string& section, const std::string& key) const { Mutex_Holder lock(config_lock); return config.count(section + "/" + key) != 0; } /* * Set a configuration value */ void Library_State::set(const std::string& section, const std::string& key, const std::string& value, bool overwrite) { Mutex_Holder lock(config_lock); std::string full_key = section + "/" + key; std::map::const_iterator i = config.find(full_key); if(overwrite || i == config.end() || i->second == "") config[full_key] = value; } /* * Add an alias */ void Library_State::add_alias(const std::string& key, const std::string& value) { set("alias", key, value); } /* * Dereference an alias to a fixed name */ std::string Library_State::deref_alias(const std::string& key) const { std::string result = key; while(is_set("alias", result)) result = get("alias", result); return result; } /* * Return a reference to the Algorithm_Factory */ Algorithm_Factory& Library_State::algorithm_factory() const { if(!m_algorithm_factory) throw Invalid_State("Uninitialized in Library_State::algorithm_factory"); return *m_algorithm_factory; } /* * Return a reference to the global PRNG */ RandomNumberGenerator& Library_State::global_rng() { Mutex_Holder lock(global_rng_lock); if(!global_rng_ptr) global_rng_ptr = make_global_rng(algorithm_factory(), global_rng_lock); return *global_rng_ptr; } /* * Load a set of modules */ void Library_State::initialize(bool thread_safe) { CPUID::initialize(); if(mutex_factory) throw Invalid_State("Library_State has already been initialized"); if(!thread_safe) { mutex_factory = new Noop_Mutex_Factory; } else { #if defined(BOTAN_HAS_MUTEX_PTHREAD) mutex_factory = new Pthread_Mutex_Factory; #elif defined(BOTAN_HAS_MUTEX_WIN32) mutex_factory = new Win32_Mutex_Factory; #else throw Invalid_State("Could not find a thread-safe mutex object to use"); #endif } allocator_lock = get_mutex(); config_lock = get_mutex(); global_rng_lock = get_mutex(); default_allocator_name = has_mlock() ? "locking" : "malloc"; add_allocator(new Malloc_Allocator); add_allocator(new Locking_Allocator(get_mutex())); #if defined(BOTAN_HAS_ALLOC_MMAP) add_allocator(new MemoryMapping_Allocator(get_mutex())); #endif load_default_config(); m_algorithm_factory = new Algorithm_Factory(*mutex_factory); #if defined(BOTAN_HAS_ENGINE_GNU_MP) algorithm_factory().add_engine(new GMP_Engine); #endif #if defined(BOTAN_HAS_ENGINE_OPENSSL) algorithm_factory().add_engine(new OpenSSL_Engine); #endif #if defined(BOTAN_HAS_ENGINE_AES_ISA) algorithm_factory().add_engine(new AES_ISA_Engine); #endif #if defined(BOTAN_HAS_ENGINE_SIMD) algorithm_factory().add_engine(new SIMD_Engine); #endif #if defined(BOTAN_HAS_ENGINE_ASSEMBLER) algorithm_factory().add_engine(new Assembler_Engine); #endif algorithm_factory().add_engine(new Core_Engine); #if defined(BOTAN_HAS_SELFTESTS) confirm_startup_self_tests(algorithm_factory()); #endif } /* * Library_State Constructor */ Library_State::Library_State() { mutex_factory = 0; allocator_lock = config_lock = 0; cached_default_allocator = 0; m_algorithm_factory = 0; global_rng_lock = 0; global_rng_ptr = 0; } /* * Library_State Destructor */ Library_State::~Library_State() { delete m_algorithm_factory; delete global_rng_ptr; cached_default_allocator = 0; for(size_t i = 0; i != allocators.size(); ++i) { allocators[i]->destroy(); delete allocators[i]; } delete global_rng_lock; delete allocator_lock; delete mutex_factory; delete config_lock; } } Botan-1.10.12/src/libstate/libstate.h0000664000175000017500000000757612654331322017161 0ustar jackjack00000000000000/* * Library Internal/Global State * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_LIB_STATE_H__ #define BOTAN_LIB_STATE_H__ #include #include #include #include #include #include #include namespace Botan { class Mutex; /** * Global state container aka the buritto at the center of it all */ class BOTAN_DLL Library_State { public: Library_State(); ~Library_State(); /** * @param thread_safe should a mutex be used for serialization */ void initialize(bool thread_safe); /** * @return global Algorithm_Factory */ Algorithm_Factory& algorithm_factory() const; /** * @return global RandomNumberGenerator */ RandomNumberGenerator& global_rng(); /** * @param name the name of the allocator * @return allocator matching this name, or NULL */ Allocator* get_allocator(const std::string& name = "") const; /** * Add a new allocator to the list of available ones * @param alloc the allocator to add */ void add_allocator(Allocator* alloc); /** * Set the default allocator * @param name the name of the allocator to use as the default */ void set_default_allocator(const std::string& name); /** * Get a parameter value as std::string. * @param section the section of the desired key * @param key the desired keys name * @result the value of the parameter */ std::string get(const std::string& section, const std::string& key) const; /** * Check whether a certain parameter is set or not. * @param section the section of the desired key * @param key the desired keys name * @result true if the parameters value is set, * false otherwise */ bool is_set(const std::string& section, const std::string& key) const; /** * Set a configuration parameter. * @param section the section of the desired key * @param key the desired keys name * @param value the new value * @param overwrite if set to true, the parameters value * will be overwritten even if it is already set, otherwise * no existing values will be overwritten. */ void set(const std::string& section, const std::string& key, const std::string& value, bool overwrite = true); /** * Add a parameter value to the "alias" section. * @param key the name of the parameter which shall have a new alias * @param value the new alias */ void add_alias(const std::string& key, const std::string& value); /** * Resolve an alias. * @param alias the alias to resolve. * @return what the alias stands for */ std::string deref_alias(const std::string& alias) const; /** * @return newly created Mutex (free with delete) */ Mutex* get_mutex() const; private: static RandomNumberGenerator* make_global_rng(Algorithm_Factory& af, Mutex* mutex); void load_default_config(); Library_State(const Library_State&) {} Library_State& operator=(const Library_State&) { return (*this); } class Mutex_Factory* mutex_factory; Mutex* global_rng_lock; RandomNumberGenerator* global_rng_ptr; Mutex* config_lock; std::map config; Mutex* allocator_lock; std::string default_allocator_name; std::map alloc_factory; mutable Allocator* cached_default_allocator; std::vector allocators; Algorithm_Factory* m_algorithm_factory; }; } #endif Botan-1.10.12/src/libstate/look_pk.h0000664000175000017500000000551512654331322016777 0ustar jackjack00000000000000/* * PK Algorithm Lookup * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PK_LOOKUP_H__ #define BOTAN_PK_LOOKUP_H__ #include #include namespace Botan { /** * Public key encryptor factory method. * @deprecated Instantiate object from pubkey.h directly * * @param key the key that will work inside the encryptor * @param eme determines the algorithm and encoding * @return public key encryptor object */ BOTAN_DEPRECATED("Instantiate object directly") inline PK_Encryptor* get_pk_encryptor(const Public_Key& key, const std::string& eme) { return new PK_Encryptor_EME(key, eme); } /** * Public key decryptor factory method. * @deprecated Instantiate object from pubkey.h directly * * @param key the key that will work inside the decryptor * @param eme determines the algorithm and encoding * @return public key decryptor object */ BOTAN_DEPRECATED("Instantiate object directly") inline PK_Decryptor* get_pk_decryptor(const Private_Key& key, const std::string& eme) { return new PK_Decryptor_EME(key, eme); } /** * Public key signer factory method. * @deprecated Instantiate object from pubkey.h directly * * @param key the key that will work inside the signer * @param emsa determines the algorithm, encoding and hash algorithm * @param sig_format the signature format to be used * @return public key signer object */ BOTAN_DEPRECATED("Instantiate object directly") inline PK_Signer* get_pk_signer(const Private_Key& key, const std::string& emsa, Signature_Format sig_format = IEEE_1363) { return new PK_Signer(key, emsa, sig_format); } /** * Public key verifier factory method. * @deprecated Instantiate object from pubkey.h directly * * @param key the key that will work inside the verifier * @param emsa determines the algorithm, encoding and hash algorithm * @param sig_format the signature format to be used * @return public key verifier object */ BOTAN_DEPRECATED("Instantiate object directly") inline PK_Verifier* get_pk_verifier(const Public_Key& key, const std::string& emsa, Signature_Format sig_format = IEEE_1363) { return new PK_Verifier(key, emsa, sig_format); } /** * Public key key agreement factory method. * @deprecated Instantiate object from pubkey.h directly * * @param key the key that will work inside the key agreement * @param kdf the kdf algorithm to use * @return key agreement algorithm */ BOTAN_DEPRECATED("Instantiate object directly") inline PK_Key_Agreement* get_pk_kas(const PK_Key_Agreement_Key& key, const std::string& kdf) { return new PK_Key_Agreement(key, kdf); } } #endif Botan-1.10.12/src/libstate/lookup.cpp0000664000175000017500000001034112654331322017176 0ustar jackjack00000000000000/* * Algorithm Retrieval * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Query if an algorithm exists */ bool have_algorithm(const std::string& name) { Algorithm_Factory& af = global_state().algorithm_factory(); if(af.prototype_block_cipher(name)) return true; if(af.prototype_stream_cipher(name)) return true; if(af.prototype_hash_function(name)) return true; if(af.prototype_mac(name)) return true; return false; } /* * Query the block size of a cipher or hash */ size_t block_size_of(const std::string& name) { Algorithm_Factory& af = global_state().algorithm_factory(); if(const BlockCipher* cipher = af.prototype_block_cipher(name)) return cipher->block_size(); if(const HashFunction* hash = af.prototype_hash_function(name)) return hash->hash_block_size(); throw Algorithm_Not_Found(name); } /* * Query the output_length() of a hash or MAC */ size_t output_length_of(const std::string& name) { Algorithm_Factory& af = global_state().algorithm_factory(); if(const HashFunction* hash = af.prototype_hash_function(name)) return hash->output_length(); if(const MessageAuthenticationCode* mac = af.prototype_mac(name)) return mac->output_length(); throw Algorithm_Not_Found(name); } /* * Query the minimum allowed key length of an algorithm implementation */ size_t min_keylength_of(const std::string& name) { Algorithm_Factory& af = global_state().algorithm_factory(); if(const BlockCipher* bc = af.prototype_block_cipher(name)) return bc->key_spec().minimum_keylength(); if(const StreamCipher* sc = af.prototype_stream_cipher(name)) return sc->key_spec().minimum_keylength(); if(const MessageAuthenticationCode* mac = af.prototype_mac(name)) return mac->key_spec().minimum_keylength(); throw Algorithm_Not_Found(name); } /* * Query the maximum allowed keylength of an algorithm implementation */ size_t max_keylength_of(const std::string& name) { Algorithm_Factory& af = global_state().algorithm_factory(); if(const BlockCipher* bc = af.prototype_block_cipher(name)) return bc->key_spec().maximum_keylength(); if(const StreamCipher* sc = af.prototype_stream_cipher(name)) return sc->key_spec().maximum_keylength(); if(const MessageAuthenticationCode* mac = af.prototype_mac(name)) return mac->key_spec().maximum_keylength(); throw Algorithm_Not_Found(name); } /* * Query the number of byte a valid key must be a multiple of */ size_t keylength_multiple_of(const std::string& name) { Algorithm_Factory& af = global_state().algorithm_factory(); if(const BlockCipher* bc = af.prototype_block_cipher(name)) return bc->key_spec().keylength_multiple(); if(const StreamCipher* sc = af.prototype_stream_cipher(name)) return sc->key_spec().keylength_multiple(); if(const MessageAuthenticationCode* mac = af.prototype_mac(name)) return mac->key_spec().keylength_multiple(); throw Algorithm_Not_Found(name); } /* * Get a cipher object */ Keyed_Filter* get_cipher(const std::string& algo_spec, Cipher_Dir direction) { Algorithm_Factory& af = global_state().algorithm_factory(); Algorithm_Factory::Engine_Iterator i(af); while(Engine* engine = i.next()) { if(Keyed_Filter* algo = engine->get_cipher(algo_spec, direction, af)) return algo; } throw Algorithm_Not_Found(algo_spec); } /* * Get a cipher object */ Keyed_Filter* get_cipher(const std::string& algo_spec, const SymmetricKey& key, const InitializationVector& iv, Cipher_Dir direction) { Keyed_Filter* cipher = get_cipher(algo_spec, direction); cipher->set_key(key); if(iv.length()) cipher->set_iv(iv); return cipher; } /* * Get a cipher object */ Keyed_Filter* get_cipher(const std::string& algo_spec, const SymmetricKey& key, Cipher_Dir direction) { return get_cipher(algo_spec, key, InitializationVector(), direction); } } Botan-1.10.12/src/libstate/lookup.h0000664000175000017500000002354012654331322016650 0ustar jackjack00000000000000/* * Algorithm Lookup * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_LOOKUP_H__ #define BOTAN_LOOKUP_H__ #include #include #include #include #include #include #include #include namespace Botan { /** * Retrieve an object prototype from the global factory * @param algo_spec an algorithm name * @return constant prototype object (use clone to create usable object), library retains ownership */ inline const BlockCipher* retrieve_block_cipher(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return af.prototype_block_cipher(algo_spec); } /** * Retrieve an object prototype from the global factory * @param algo_spec an algorithm name * @return constant prototype object (use clone to create usable object), library retains ownership */ inline const StreamCipher* retrieve_stream_cipher(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return af.prototype_stream_cipher(algo_spec); } /** * Retrieve an object prototype from the global factory * @param algo_spec an algorithm name * @return constant prototype object (use clone to create usable object), library retains ownership */ inline const HashFunction* retrieve_hash(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return af.prototype_hash_function(algo_spec); } /** * Retrieve an object prototype from the global factory * @param algo_spec an algorithm name * @return constant prototype object (use clone to create usable object), library retains ownership */ inline const MessageAuthenticationCode* retrieve_mac(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return af.prototype_mac(algo_spec); } /* * Get an algorithm object * NOTE: these functions create and return new objects, letting the * caller assume ownership of them */ /** * Block cipher factory method. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the desired block cipher * @return pointer to the block cipher object */ inline BlockCipher* get_block_cipher(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return af.make_block_cipher(algo_spec); } /** * Stream cipher factory method. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the desired stream cipher * @return pointer to the stream cipher object */ inline StreamCipher* get_stream_cipher(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return af.make_stream_cipher(algo_spec); } /** * Hash function factory method. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the desired hash function * @return pointer to the hash function object */ inline HashFunction* get_hash(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return af.make_hash_function(algo_spec); } /** * MAC factory method. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the desired MAC * @return pointer to the MAC object */ inline MessageAuthenticationCode* get_mac(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return af.make_mac(algo_spec); } /** * Password based key derivation function factory method * @param algo_spec the name of the desired PBKDF algorithm * @return pointer to newly allocated object of that type */ BOTAN_DLL PBKDF* get_pbkdf(const std::string& algo_spec); /** * @deprecated Use get_pbkdf * @param algo_spec the name of the desired algorithm * @return pointer to newly allocated object of that type */ inline PBKDF* get_s2k(const std::string& algo_spec) { return get_pbkdf(algo_spec); } /* * Get an EMSA/EME/KDF/MGF function */ // NOTE: these functions create and return new objects, letting the // caller assume ownership of them /** * Factory method for EME (message-encoding methods for encryption) objects * @param algo_spec the name of the EME to create * @return pointer to newly allocated object of that type */ BOTAN_DLL EME* get_eme(const std::string& algo_spec); /** * Factory method for EMSA (message-encoding methods for signatures * with appendix) objects * @param algo_spec the name of the EME to create * @return pointer to newly allocated object of that type */ BOTAN_DLL EMSA* get_emsa(const std::string& algo_spec); /** * Factory method for KDF (key derivation function) * @param algo_spec the name of the KDF to create * @return pointer to newly allocated object of that type */ BOTAN_DLL KDF* get_kdf(const std::string& algo_spec); /* * Get a cipher object */ /** * Factory method for general symmetric cipher filters. * @param algo_spec the name of the desired cipher * @param key the key to be used for encryption/decryption performed by * the filter * @param iv the initialization vector to be used * @param direction determines whether the filter will be an encrypting * or decrypting filter * @return pointer to newly allocated encryption or decryption filter */ BOTAN_DLL Keyed_Filter* get_cipher(const std::string& algo_spec, const SymmetricKey& key, const InitializationVector& iv, Cipher_Dir direction); /** * Factory method for general symmetric cipher filters. * @param algo_spec the name of the desired cipher * @param key the key to be used for encryption/decryption performed by * the filter * @param direction determines whether the filter will be an encrypting * or decrypting filter * @return pointer to the encryption or decryption filter */ BOTAN_DLL Keyed_Filter* get_cipher(const std::string& algo_spec, const SymmetricKey& key, Cipher_Dir direction); /** * Factory method for general symmetric cipher filters. No key will be * set in the filter. * * @param algo_spec the name of the desired cipher * @param direction determines whether the filter will be an encrypting or * decrypting filter * @return pointer to the encryption or decryption filter */ BOTAN_DLL Keyed_Filter* get_cipher(const std::string& algo_spec, Cipher_Dir direction); /** * Check if an algorithm exists. * @param algo_spec the name of the algorithm to check for * @return true if the algorithm exists, false otherwise */ BOTAN_DLL bool have_algorithm(const std::string& algo_spec); /** * Check if a block cipher algorithm exists. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the algorithm to check for * @return true if the algorithm exists, false otherwise */ inline bool have_block_cipher(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return (af.prototype_block_cipher(algo_spec) != 0); } /** * Check if a stream cipher algorithm exists. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the algorithm to check for * @return true if the algorithm exists, false otherwise */ inline bool have_stream_cipher(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return (af.prototype_stream_cipher(algo_spec) != 0); } /** * Check if a hash algorithm exists. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the algorithm to check for * @return true if the algorithm exists, false otherwise */ inline bool have_hash(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return (af.prototype_hash_function(algo_spec) != 0); } /** * Check if a MAC algorithm exists. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the algorithm to check for * @return true if the algorithm exists, false otherwise */ inline bool have_mac(const std::string& algo_spec) { Algorithm_Factory& af = global_state().algorithm_factory(); return (af.prototype_mac(algo_spec) != 0); } /* * Query information about an algorithm */ /** * Find out the block size of a certain symmetric algorithm. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the algorithm * @return block size of the specified algorithm */ BOTAN_DLL size_t block_size_of(const std::string& algo_spec); /** * Find out the output length of a certain symmetric algorithm. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the algorithm * @return output length of the specified algorithm */ BOTAN_DLL size_t output_length_of(const std::string& algo_spec); /** * Find out the minimum key size of a certain symmetric algorithm. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the algorithm * @return minimum key length of the specified algorithm */ BOTAN_DEPRECATED("Retrieve object you want and then call key_spec") BOTAN_DLL size_t min_keylength_of(const std::string& algo_spec); /** * Find out the maximum key size of a certain symmetric algorithm. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the algorithm * @return maximum key length of the specified algorithm */ BOTAN_DEPRECATED("Retrieve object you want and then call key_spec") BOTAN_DLL size_t max_keylength_of(const std::string& algo_spec); /** * Find out the size any valid key is a multiple of for a certain algorithm. * @deprecated Call algorithm_factory() directly * * @param algo_spec the name of the algorithm * @return size any valid key is a multiple of */ BOTAN_DEPRECATED("Retrieve object you want and then call key_spec") BOTAN_DLL size_t keylength_multiple_of(const std::string& algo_spec); } #endif Botan-1.10.12/src/libstate/oid_lookup/info.txt0000664000175000017500000000005712654331322021024 0ustar jackjack00000000000000define OID_LOOKUP asn1 Botan-1.10.12/src/libstate/oid_lookup/oids.cpp0000664000175000017500000000257012654331322020774 0ustar jackjack00000000000000/* * OID Registry * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace OIDS { /* * Register an OID to string mapping */ void add_oid(const OID& oid, const std::string& name) { const std::string oid_str = oid.as_string(); if(!global_state().is_set("oid2str", oid_str)) global_state().set("oid2str", oid_str, name); if(!global_state().is_set("str2oid", name)) global_state().set("str2oid", name, oid_str); } /* * Do an OID to string lookup */ std::string lookup(const OID& oid) { std::string name = global_state().get("oid2str", oid.as_string()); if(name == "") return oid.as_string(); return name; } /* * Do a string to OID lookup */ OID lookup(const std::string& name) { std::string value = global_state().get("str2oid", name); if(value != "") return OID(value); try { return OID(name); } catch(...) { throw Lookup_Error("No object identifier found for " + name); } } /* * Check to see if an OID exists in the table */ bool have_oid(const std::string& name) { return global_state().is_set("str2oid", name); } /* * Check to see if an OID exists in the table */ bool name_of(const OID& oid, const std::string& name) { return (oid == lookup(name)); } } } Botan-1.10.12/src/libstate/oid_lookup/oids.h0000664000175000017500000000234612654331322020442 0ustar jackjack00000000000000/* * OID Registry * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_OIDS_H__ #define BOTAN_OIDS_H__ #include namespace Botan { namespace OIDS { /** * Register an OID to string mapping. * @param oid the oid to register * @param name the name to be associated with the oid */ BOTAN_DLL void add_oid(const OID& oid, const std::string& name); /** * See if an OID exists in the internal table. * @param oid the oid to check for * @return true if the oid is registered */ BOTAN_DLL bool have_oid(const std::string& oid); /** * Resolve an OID * @param oid the OID to look up * @return name associated with this OID */ BOTAN_DLL std::string lookup(const OID& oid); /** * Find the OID to a name. The lookup will be performed in the * general OID section of the configuration. * @param name the name to resolve * @return OID associated with the specified name */ BOTAN_DLL OID lookup(const std::string& name); /** * Tests whether the specified OID stands for the specified name. * @param oid the OID to check * @param name the name to check * @return true if the specified OID stands for the specified name */ BOTAN_DLL bool name_of(const OID& oid, const std::string& name); } } #endif Botan-1.10.12/src/libstate/policy.cpp0000664000175000017500000014130612654331322017172 0ustar jackjack00000000000000/* * Default Policy * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { namespace { /* * OID loading helper function */ void add_oid(Library_State& config, const std::string& oid_str, const std::string& name) { if(!config.is_set("oid2str", oid_str)) config.set("oid2str", oid_str, name); if(!config.is_set("str2oid", name)) config.set("str2oid", name, oid_str); } /* * Load all of the default OIDs */ void set_default_oids(Library_State& config) { /* Public key types */ add_oid(config, "1.2.840.113549.1.1.1", "RSA"); add_oid(config, "2.5.8.1.1", "RSA"); // RSA alternate add_oid(config, "1.2.840.10040.4.1", "DSA"); add_oid(config, "1.2.840.10046.2.1", "DH"); add_oid(config, "1.3.6.1.4.1.3029.1.2.1", "ElGamal"); add_oid(config, "1.3.6.1.4.1.25258.1.1", "RW"); add_oid(config, "1.3.6.1.4.1.25258.1.2", "NR"); // X9.62 ecPublicKey, valid for ECDSA and ECDH (RFC 3279 sec 2.3.5) add_oid(config, "1.2.840.10045.2.1", "ECDSA"); /* * This is an OID defined for ECDH keys though rarely used for such. * In this configuration it is accepted on decoding, but not used for * encoding. You can enable it for encoding by calling * global_state().set("str2oid", "ECDH", "1.3.132.1.12") * from your application code. */ config.set("oid2str", "1.3.132.1.12", "ECDH"); add_oid(config, "1.2.643.2.2.19", "GOST-34.10"); // RFC 4491 /* Ciphers */ add_oid(config, "1.3.14.3.2.7", "DES/CBC"); add_oid(config, "1.2.840.113549.3.7", "TripleDES/CBC"); add_oid(config, "1.2.840.113549.3.2", "RC2/CBC"); add_oid(config, "1.2.840.113533.7.66.10", "CAST-128/CBC"); add_oid(config, "2.16.840.1.101.3.4.1.2", "AES-128/CBC"); add_oid(config, "2.16.840.1.101.3.4.1.22", "AES-192/CBC"); add_oid(config, "2.16.840.1.101.3.4.1.42", "AES-256/CBC"); add_oid(config, "1.2.410.200004.1.4", "SEED/CBC"); // RFC 4010 add_oid(config, "1.3.6.1.4.1.25258.3.1", "Serpent/CBC"); /* Hash Functions */ add_oid(config, "1.2.840.113549.2.5", "MD5"); add_oid(config, "1.3.6.1.4.1.11591.12.2", "Tiger(24,3)"); add_oid(config, "1.3.14.3.2.26", "SHA-160"); add_oid(config, "2.16.840.1.101.3.4.2.4", "SHA-224"); add_oid(config, "2.16.840.1.101.3.4.2.1", "SHA-256"); add_oid(config, "2.16.840.1.101.3.4.2.2", "SHA-384"); add_oid(config, "2.16.840.1.101.3.4.2.3", "SHA-512"); /* MACs */ add_oid(config, "1.2.840.113549.2.7", "HMAC(SHA-1)"); add_oid(config, "1.2.840.113549.2.8", "HMAC(SHA-224)"); add_oid(config, "1.2.840.113549.2.9", "HMAC(SHA-256)"); add_oid(config, "1.2.840.113549.2.10", "HMAC(SHA-384)"); add_oid(config, "1.2.840.113549.2.11", "HMAC(SHA-512)"); /* Key Wrap */ add_oid(config, "1.2.840.113549.1.9.16.3.6", "KeyWrap.TripleDES"); add_oid(config, "1.2.840.113549.1.9.16.3.7", "KeyWrap.RC2"); add_oid(config, "1.2.840.113533.7.66.15", "KeyWrap.CAST-128"); add_oid(config, "2.16.840.1.101.3.4.1.5", "KeyWrap.AES-128"); add_oid(config, "2.16.840.1.101.3.4.1.25", "KeyWrap.AES-192"); add_oid(config, "2.16.840.1.101.3.4.1.45", "KeyWrap.AES-256"); /* Compression */ add_oid(config, "1.2.840.113549.1.9.16.3.8", "Compression.Zlib"); /* Public key signature schemes */ add_oid(config, "1.2.840.113549.1.1.1", "RSA/EME-PKCS1-v1_5"); add_oid(config, "1.2.840.113549.1.1.2", "RSA/EMSA3(MD2)"); add_oid(config, "1.2.840.113549.1.1.4", "RSA/EMSA3(MD5)"); add_oid(config, "1.2.840.113549.1.1.5", "RSA/EMSA3(SHA-160)"); add_oid(config, "1.2.840.113549.1.1.11", "RSA/EMSA3(SHA-256)"); add_oid(config, "1.2.840.113549.1.1.12", "RSA/EMSA3(SHA-384)"); add_oid(config, "1.2.840.113549.1.1.13", "RSA/EMSA3(SHA-512)"); add_oid(config, "1.3.36.3.3.1.2", "RSA/EMSA3(RIPEMD-160)"); add_oid(config, "1.2.840.10040.4.3", "DSA/EMSA1(SHA-160)"); add_oid(config, "2.16.840.1.101.3.4.3.1", "DSA/EMSA1(SHA-224)"); add_oid(config, "2.16.840.1.101.3.4.3.2", "DSA/EMSA1(SHA-256)"); add_oid(config, "0.4.0.127.0.7.1.1.4.1.1", "ECDSA/EMSA1_BSI(SHA-160)"); add_oid(config, "0.4.0.127.0.7.1.1.4.1.2", "ECDSA/EMSA1_BSI(SHA-224)"); add_oid(config, "0.4.0.127.0.7.1.1.4.1.3", "ECDSA/EMSA1_BSI(SHA-256)"); add_oid(config, "0.4.0.127.0.7.1.1.4.1.4", "ECDSA/EMSA1_BSI(SHA-384)"); add_oid(config, "0.4.0.127.0.7.1.1.4.1.5", "ECDSA/EMSA1_BSI(SHA-512)"); add_oid(config, "0.4.0.127.0.7.1.1.4.1.6", "ECDSA/EMSA1_BSI(RIPEMD-160)"); add_oid(config, "1.2.840.10045.4.1", "ECDSA/EMSA1(SHA-160)"); add_oid(config, "1.2.840.10045.4.3.1", "ECDSA/EMSA1(SHA-224)"); add_oid(config, "1.2.840.10045.4.3.2", "ECDSA/EMSA1(SHA-256)"); add_oid(config, "1.2.840.10045.4.3.3", "ECDSA/EMSA1(SHA-384)"); add_oid(config, "1.2.840.10045.4.3.4", "ECDSA/EMSA1(SHA-512)"); add_oid(config, "1.2.643.2.2.3", "GOST-34.10/EMSA1(GOST-R-34.11-94)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.1.1", "RW/EMSA2(RIPEMD-160)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.1.2", "RW/EMSA2(SHA-160)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.1.3", "RW/EMSA2(SHA-224)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.1.4", "RW/EMSA2(SHA-256)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.1.5", "RW/EMSA2(SHA-384)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.1.6", "RW/EMSA2(SHA-512)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.2.1", "RW/EMSA4(RIPEMD-160)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.2.2", "RW/EMSA4(SHA-160)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.2.3", "RW/EMSA4(SHA-224)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.2.4", "RW/EMSA4(SHA-256)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.2.5", "RW/EMSA4(SHA-384)"); add_oid(config, "1.3.6.1.4.1.25258.2.1.2.6", "RW/EMSA4(SHA-512)"); add_oid(config, "1.3.6.1.4.1.25258.2.2.1.1", "NR/EMSA2(RIPEMD-160)"); add_oid(config, "1.3.6.1.4.1.25258.2.2.1.2", "NR/EMSA2(SHA-160)"); add_oid(config, "1.3.6.1.4.1.25258.2.2.1.3", "NR/EMSA2(SHA-224)"); add_oid(config, "1.3.6.1.4.1.25258.2.2.1.4", "NR/EMSA2(SHA-256)"); add_oid(config, "1.3.6.1.4.1.25258.2.2.1.5", "NR/EMSA2(SHA-384)"); add_oid(config, "1.3.6.1.4.1.25258.2.2.1.6", "NR/EMSA2(SHA-512)"); add_oid(config, "2.5.4.3", "X520.CommonName"); add_oid(config, "2.5.4.4", "X520.Surname"); add_oid(config, "2.5.4.5", "X520.SerialNumber"); add_oid(config, "2.5.4.6", "X520.Country"); add_oid(config, "2.5.4.7", "X520.Locality"); add_oid(config, "2.5.4.8", "X520.State"); add_oid(config, "2.5.4.10", "X520.Organization"); add_oid(config, "2.5.4.11", "X520.OrganizationalUnit"); add_oid(config, "2.5.4.12", "X520.Title"); add_oid(config, "2.5.4.42", "X520.GivenName"); add_oid(config, "2.5.4.43", "X520.Initials"); add_oid(config, "2.5.4.44", "X520.GenerationalQualifier"); add_oid(config, "2.5.4.46", "X520.DNQualifier"); add_oid(config, "2.5.4.65", "X520.Pseudonym"); add_oid(config, "1.2.840.113549.1.5.12", "PKCS5.PBKDF2"); add_oid(config, "1.2.840.113549.1.5.1", "PBE-PKCS5v15(MD2,DES/CBC)"); add_oid(config, "1.2.840.113549.1.5.4", "PBE-PKCS5v15(MD2,RC2/CBC)"); add_oid(config, "1.2.840.113549.1.5.3", "PBE-PKCS5v15(MD5,DES/CBC)"); add_oid(config, "1.2.840.113549.1.5.6", "PBE-PKCS5v15(MD5,RC2/CBC)"); add_oid(config, "1.2.840.113549.1.5.10", "PBE-PKCS5v15(SHA-160,DES/CBC)"); add_oid(config, "1.2.840.113549.1.5.11", "PBE-PKCS5v15(SHA-160,RC2/CBC)"); add_oid(config, "1.2.840.113549.1.5.13", "PBE-PKCS5v20"); add_oid(config, "1.2.840.113549.1.9.1", "PKCS9.EmailAddress"); add_oid(config, "1.2.840.113549.1.9.2", "PKCS9.UnstructuredName"); add_oid(config, "1.2.840.113549.1.9.3", "PKCS9.ContentType"); add_oid(config, "1.2.840.113549.1.9.4", "PKCS9.MessageDigest"); add_oid(config, "1.2.840.113549.1.9.7", "PKCS9.ChallengePassword"); add_oid(config, "1.2.840.113549.1.9.14", "PKCS9.ExtensionRequest"); add_oid(config, "1.2.840.113549.1.7.1", "CMS.DataContent"); add_oid(config, "1.2.840.113549.1.7.2", "CMS.SignedData"); add_oid(config, "1.2.840.113549.1.7.3", "CMS.EnvelopedData"); add_oid(config, "1.2.840.113549.1.7.5", "CMS.DigestedData"); add_oid(config, "1.2.840.113549.1.7.6", "CMS.EncryptedData"); add_oid(config, "1.2.840.113549.1.9.16.1.2", "CMS.AuthenticatedData"); add_oid(config, "1.2.840.113549.1.9.16.1.9", "CMS.CompressedData"); add_oid(config, "2.5.29.14", "X509v3.SubjectKeyIdentifier"); add_oid(config, "2.5.29.15", "X509v3.KeyUsage"); add_oid(config, "2.5.29.17", "X509v3.SubjectAlternativeName"); add_oid(config, "2.5.29.18", "X509v3.IssuerAlternativeName"); add_oid(config, "2.5.29.19", "X509v3.BasicConstraints"); add_oid(config, "2.5.29.20", "X509v3.CRLNumber"); add_oid(config, "2.5.29.21", "X509v3.ReasonCode"); add_oid(config, "2.5.29.23", "X509v3.HoldInstructionCode"); add_oid(config, "2.5.29.24", "X509v3.InvalidityDate"); add_oid(config, "2.5.29.32", "X509v3.CertificatePolicies"); add_oid(config, "2.5.29.35", "X509v3.AuthorityKeyIdentifier"); add_oid(config, "2.5.29.36", "X509v3.PolicyConstraints"); add_oid(config, "2.5.29.37", "X509v3.ExtendedKeyUsage"); add_oid(config, "2.5.29.32.0", "X509v3.AnyPolicy"); add_oid(config, "1.3.6.1.5.5.7.3.1", "PKIX.ServerAuth"); add_oid(config, "1.3.6.1.5.5.7.3.2", "PKIX.ClientAuth"); add_oid(config, "1.3.6.1.5.5.7.3.3", "PKIX.CodeSigning"); add_oid(config, "1.3.6.1.5.5.7.3.4", "PKIX.EmailProtection"); add_oid(config, "1.3.6.1.5.5.7.3.5", "PKIX.IPsecEndSystem"); add_oid(config, "1.3.6.1.5.5.7.3.6", "PKIX.IPsecTunnel"); add_oid(config, "1.3.6.1.5.5.7.3.7", "PKIX.IPsecUser"); add_oid(config, "1.3.6.1.5.5.7.3.8", "PKIX.TimeStamping"); add_oid(config, "1.3.6.1.5.5.7.3.9", "PKIX.OCSPSigning"); add_oid(config, "1.3.6.1.5.5.7.8.5", "PKIX.XMPPAddr"); /* ECC domain parameters */ add_oid(config, "1.3.132.0.6", "secp112r1"); add_oid(config, "1.3.132.0.7", "secp112r2"); add_oid(config, "1.3.132.0.8", "secp160r1"); add_oid(config, "1.3.132.0.9", "secp160k1"); add_oid(config, "1.3.132.0.10", "secp256k1"); add_oid(config, "1.3.132.0.28", "secp128r1"); add_oid(config, "1.3.132.0.29", "secp128r2"); add_oid(config, "1.3.132.0.30", "secp160r2"); add_oid(config, "1.3.132.0.31", "secp192k1"); add_oid(config, "1.3.132.0.32", "secp224k1"); add_oid(config, "1.3.132.0.33", "secp224r1"); add_oid(config, "1.3.132.0.34", "secp384r1"); add_oid(config, "1.3.132.0.35", "secp521r1"); add_oid(config, "1.2.840.10045.3.1.1", "secp192r1"); add_oid(config, "1.2.840.10045.3.1.2", "x962_p192v2"); add_oid(config, "1.2.840.10045.3.1.3", "x962_p192v3"); add_oid(config, "1.2.840.10045.3.1.4", "x962_p239v1"); add_oid(config, "1.2.840.10045.3.1.5", "x962_p239v2"); add_oid(config, "1.2.840.10045.3.1.6", "x962_p239v3"); add_oid(config, "1.2.840.10045.3.1.7", "secp256r1"); add_oid(config, "1.3.36.3.3.2.8.1.1.1", "brainpool160r1"); add_oid(config, "1.3.36.3.3.2.8.1.1.3", "brainpool192r1"); add_oid(config, "1.3.36.3.3.2.8.1.1.5", "brainpool224r1"); add_oid(config, "1.3.36.3.3.2.8.1.1.7", "brainpool256r1"); add_oid(config, "1.3.36.3.3.2.8.1.1.9", "brainpool320r1"); add_oid(config, "1.3.36.3.3.2.8.1.1.11", "brainpool384r1"); add_oid(config, "1.3.36.3.3.2.8.1.1.13", "brainpool512r1"); add_oid(config, "1.2.643.2.2.35.1", "gost_256A"); add_oid(config, "1.2.643.2.2.36.0", "gost_256A"); /* CVC */ add_oid(config, "0.4.0.127.0.7.3.1.2.1", "CertificateHolderAuthorizationTemplate"); } /* * Set the default algorithm aliases */ void set_default_aliases(Library_State& config) { config.add_alias("OpenPGP.Cipher.1", "IDEA"); config.add_alias("OpenPGP.Cipher.2", "TripleDES"); config.add_alias("OpenPGP.Cipher.3", "CAST-128"); config.add_alias("OpenPGP.Cipher.4", "Blowfish"); config.add_alias("OpenPGP.Cipher.5", "SAFER-SK(13)"); config.add_alias("OpenPGP.Cipher.7", "AES-128"); config.add_alias("OpenPGP.Cipher.8", "AES-192"); config.add_alias("OpenPGP.Cipher.9", "AES-256"); config.add_alias("OpenPGP.Cipher.10", "Twofish"); config.add_alias("OpenPGP.Digest.1", "MD5"); config.add_alias("OpenPGP.Digest.2", "SHA-1"); config.add_alias("OpenPGP.Digest.3", "RIPEMD-160"); config.add_alias("OpenPGP.Digest.5", "MD2"); config.add_alias("OpenPGP.Digest.6", "Tiger(24,3)"); config.add_alias("OpenPGP.Digest.8", "SHA-256"); config.add_alias("TLS.Digest.0", "Parallel(MD5,SHA-160)"); config.add_alias("EME-PKCS1-v1_5", "PKCS1v15"); config.add_alias("OAEP-MGF1", "EME1"); config.add_alias("EME-OAEP", "EME1"); config.add_alias("X9.31", "EMSA2"); config.add_alias("EMSA-PKCS1-v1_5", "EMSA3"); config.add_alias("PSS-MGF1", "EMSA4"); config.add_alias("EMSA-PSS", "EMSA4"); config.add_alias("3DES", "TripleDES"); config.add_alias("DES-EDE", "TripleDES"); config.add_alias("CAST5", "CAST-128"); config.add_alias("SHA1", "SHA-160"); config.add_alias("SHA-1", "SHA-160"); config.add_alias("MARK-4", "ARC4(256)"); config.add_alias("OMAC", "CMAC"); config.add_alias("GOST", "GOST-28147-89"); } /* * Set the built-in discrete log groups */ void set_default_dl_groups(Library_State& config) { config.set("dl", "modp/ietf/768", "-----BEGIN X942 DH PARAMETERS-----" "MIHIAmEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxObIlFK" "CHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjo2IP//" "////////AgECAmB//////////+SH7VEQtGEaYmMxRcBuDmiUgScERTPmOgEF31Md" "ic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Catrao4SLyQtq7MS8/Y3omIXTT" "HRsQf/////////8=" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/ietf/1024", "-----BEGIN X942 DH PARAMETERS-----" "MIIBCgKBgQD//////////8kP2qIhaMI0xMZii4DcHNEpAk4IimfMdAILvqY7E5si" "UUoIeY40BN3vlRmzzTpDGzArCm3yXxQ3T+E1bW1RwkXkhbV2Yl5+xvRMQummN+1r" "C/9ctvQGt+3uOGv7Womfpa6fJBF8Sx/mSShmUezmU4H//////////wIBAgKBgH//" "////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6AQXfUx2JzZEopQQ8xxoCbvfK" "jNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9jeiYhdNMb9rWF/65begNb9vcc" "Nf2tRM/S10+SCL4lj/MklDMo9nMpwP//////////" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/srp/1024", "-----BEGIN X942 DH PARAMETERS-----" "MIIBCgKBgQDurwq5rbON1pwz+Ar6j8XoYHJhh3X/PAueojFMnCVldtZ033SW6oHT" "ODtIE9aSxuDg1djiULmL5I5JXB1gidrRXcfXtGFU1rbOjvStabFdSYJVmyl7zxiF" "xSn1ZmYOV+xo7bw8BXJswC/Uy/SXbqqa/VE4/oN2Q1ufxh0vwOsG4wIBAgKBgHdX" "hVzW2cbrThn8BX1H4vQwOTDDuv+eBc9RGKZOErK7azpvukt1QOmcHaQJ60ljcHBq" "7HEoXMXyRySuDrBE7Wiu4+vaMKprW2dHela02K6kwSrNlL3njELilPqzMwcr9jR2" "3h4CuTZgF+pl+ku3VU1+qJx/Qbshrc/jDpfgdYNx" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/ietf/1536", "-----BEGIN X942 DH PARAMETERS-----" "MIIBigKBwQD//////////8kP2qIhaMI0xMZii4DcHNEpAk4IimfMdAILvqY7E5si" "UUoIeY40BN3vlRmzzTpDGzArCm3yXxQ3T+E1bW1RwkXkhbV2Yl5+xvRMQummN+1r" "C/9ctvQGt+3uOGv7Womfpa6fJBF8Sx/mSShmUezkWz3CAHy4oWO/BZjaSDYcVdOa" "aRY/qP0kz1+DZV0j3KOtlhxi81YghVK7ntUpB3CWlm1nDDVOSryYBPF0bAjKI3Mn" "//////////8CAQICgcB//////////+SH7VEQtGEaYmMxRcBuDmiUgScERTPmOgEF" "31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Catrao4SLyQtq7MS8/Y3om" "IXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/zJJQzKPZyLZ7hAD5cULHfgsxt" "JBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqldz2qUg7hLSzazhhqnJV5MAni6" "NgRlEbmT//////////8=" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/srp/1536", "-----BEGIN DH PARAMETERS-----" "MIHHAoHBAJ3vPK+5OSd6sfEqhheke7vbpR30maxMgL7uqWFLGcxNX09fVW4ny95R" "xqlL5GB6KRVYkDug0PhDgLZVu5oi6NzfAop87Gfw0IE0sci5eYkUm2CeC+O6tj1H" "VIOB28Wx/HZOP0tT3Z2hFYv9PiucjPVu3wGVOTSWJ9sv1T0kt8SGZXcuQ31sf4zk" "QnNK98y3roN8Jkrjqb64f4ov6bi1KS5aAh//XpFHnoznoowkQsbzFRgPk0maI03P" "duP+0TX5uwIBAg==" "-----END DH PARAMETERS-----"); config.set("dl", "modp/ietf/2048", "-----BEGIN X942 DH PARAMETERS-----" "MIICDAKCAQEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqsqmj//////////wIBAgKCAQB//////////+SH7VEQtGEa" "YmMxRcBuDmiUgScERTPmOgEF31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4ob" "p/Catrao4SLyQtq7MS8/Y3omIXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/z" "JJQzKPZyLZ7hAD5cULHfgsxtJBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqld" "z2qUg7hLSzazhhqnJV5MAni6NgRlDBC+GUgvIxcbZx3xzzuWDAdDAc2TwdF2A9FH" "2uKu+DemKWTvFeX7SqwLjBzKpL51SrVyiukTDEx9AogKuUctRVZVNH//////////" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/srp/2048", "-----BEGIN X942 DH PARAMETERS-----" "MIICDAKCAQEArGvbQTJKmpvxZt5eE4lYL69ytmUZh+4H/DGSlD21YFCjcynLtKCZ" "7YGT4HV3Z6E91SMSq0sDMQ3Nf0ip2gT9UOgIOWntt2ewz2CVF5oWOrNmGgX71fqq" "6CkYqZYvC5O4Vfl5k+yXXuqoDXQK2/T/dHNZ0EHVwz6nHSgeRGsUdzvKl7Q6I/uA" "Fna9IHpDbGSB8dK5B4cXRhpbnTLmiPh3SFRFI7UksNV9Xqd6J3XS7PoDLPvb9S+z" "eGFgJ5AE5Xrmr4dOcwPOUymczAQce8MI2CpWmPOo0MOCca41+Onb+7aUtcgD2J96" "5DXeI21SX1R1m2XjcvzWjvIPpxEfnkr/cwIBAgKCAQBWNe2gmSVNTfizby8JxKwX" "17lbMozD9wP+GMlKHtqwKFG5lOXaUEz2wMnwOruz0J7qkYlVpYGYhua/pFTtAn6o" "dAQctPbbs9hnsEqLzQsdWbMNAv3q/VV0FIxUyxeFydwq/LzJ9kuvdVQGugVt+n+6" "OazoIOrhn1OOlA8iNYo7neVL2h0R/cALO16QPSG2MkD46VyDw4ujDS3OmXNEfDuk" "KiKR2pJYar6vU70Tuul2fQGWfe36l9m8MLATyAJyvXNXw6c5gecplM5mAg494YRs" "FStMedRoYcE41xr8dO3920pa5AHsT71yGu8RtqkvqjrNsvG5fmtHeQfTiI/PJX+5" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/ietf/3072", "-----BEGIN X942 DH PARAMETERS-----" "MIIDDAKCAYEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqTrS" "yv//////////AgECAoIBgH//////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6" "AQXfUx2JzZEopQQ8xxoCbvfKjNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9j" "eiYhdNMb9rWF/65begNb9vccNf2tRM/S10+SCL4lj/MklDMo9nItnuEAPlxQsd+C" "zG0kGw4q6c00ix/UfpJnr8GyrpHuUdbLDjF5qxBCqV3PapSDuEtLNrOGGqclXkwC" "eLo2BGUMEL4ZSC8jFxtnHfHPO5YMB0MBzZPB0XYD0Ufa4q74N6YpZO8V5ftKrAuM" "HMqkvnVKtXKK6RMMTH0CiAq5Ry1FVWIW1pmLhoIoPRnUKpDV745dMnZ9woIsbfeF" "RXU4q66DBj7Zy4fC03DyY9X610ZthJnrj0ZKcCUSsM7ncekTDWl3NfiX/QNsxQQy" "bDsBOZ9kNTIpD5WMC72QBl3wi6u9MK62O4TEYF1so3EEcSfQOnLVmKHtrf5wfohH" "JcFokFSdaWV//////////w==" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/srp/3072", "-----BEGIN DH PARAMETERS-----" "MIIBiAKCAYEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqTrS" "yv//////////AgEF" "-----END DH PARAMETERS-----"); config.set("dl", "modp/ietf/4096", "-----BEGIN X942 DH PARAMETERS-----" "MIIEDAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQICggIA" "f//////////kh+1RELRhGmJjMUXAbg5olIEnBEUz5joBBd9THYnNkSilBDzHGgJu" "98qM2eadIY2YFYU2+S+KG6fwmra2qOEi8kLauzEvP2N6JiF00xv2tYX/rlt6A1v2" "9xw1/a1Ez9LXT5IIviWP8ySUMyj2ci2e4QA+XFCx34LMbSQbDirpzTSLH9R+kmev" "wbKuke5R1ssOMXmrEEKpXc9qlIO4S0s2s4YapyVeTAJ4ujYEZQwQvhlILyMXG2cd" "8c87lgwHQwHNk8HRdgPRR9rirvg3pilk7xXl+0qsC4wcyqS+dUq1corpEwxMfQKI" "CrlHLUVVYhbWmYuGgig9GdQqkNXvjl0ydn3Cgixt94VFdTirroMGPtnLh8LTcPJj" "1frXRm2EmeuPRkpwJRKwzudx6RMNaXc1+Jf9A2zFBDJsOwE5n2Q1MikPlYwLvZAG" "XfCLq70wrrY7hMRgXWyjcQRxJ9A6ctWYoe2t/nB+iEclwWiQVJCEAI05HglTw/Nr" "xDjNCF7dLZNM4ZOMNXpxHg1KNBpbCoXtEsH05RVqJnRt3eFtgm9HfJdHfgoP32VT" "FD4so6c14C7M2Usn0Ehh0RGd0MMorfP2j7CUuGdxa9fcDe67ELgkDmgDSJPq2C1U" "ydp1TEbH7uDDf9vuSFNgR6b6GuSaAxjM//////////8=" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/srp/4096", "-----BEGIN DH PARAMETERS-----" "MIICCAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQU=" "-----END DH PARAMETERS-----"); config.set("dl", "modp/ietf/6144", "-----BEGIN X942 DH PARAMETERS-----" "MIIGDAKCAwEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebcxA" "JP//////////AoIDAH//////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6AQXf" "Ux2JzZEopQQ8xxoCbvfKjNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9jeiYh" "dNMb9rWF/65begNb9vccNf2tRM/S10+SCL4lj/MklDMo9nItnuEAPlxQsd+CzG0k" "Gw4q6c00ix/UfpJnr8GyrpHuUdbLDjF5qxBCqV3PapSDuEtLNrOGGqclXkwCeLo2" "BGUMEL4ZSC8jFxtnHfHPO5YMB0MBzZPB0XYD0Ufa4q74N6YpZO8V5ftKrAuMHMqk" "vnVKtXKK6RMMTH0CiAq5Ry1FVWIW1pmLhoIoPRnUKpDV745dMnZ9woIsbfeFRXU4" "q66DBj7Zy4fC03DyY9X610ZthJnrj0ZKcCUSsM7ncekTDWl3NfiX/QNsxQQybDsB" "OZ9kNTIpD5WMC72QBl3wi6u9MK62O4TEYF1so3EEcSfQOnLVmKHtrf5wfohHJcFo" "kFSQhACNOR4JU8Pza8Q4zQhe3S2TTOGTjDV6cR4NSjQaWwqF7RLB9OUVaiZ0bd3h" "bYJvR3yXR34KD99lUxQ+LKOnNeAuzNlLJ9BIYdERndDDKK3z9o+wlLhncWvX3A3u" "uxC4JA5oA0iT6tgtVMnadUxGx+7gw3/b7khTYEem+hrkmgFCSRth/VppPjgTYOpu" "WTATI29kuo87Ht0b3vx/ygNWzymHcu2cF6CYANdYNSn2yBPsGIvLk9hDLUSMbR9t" "9efNinaiZzZdZ2pdje2/iiPzZhKlmZAoqJXr16E33HoAm8ZpX6zB5QDjJcl2eBl1" "Cui5DoH6QWvnNzp/e2qvOBejTAZBWtQgGMgFjk8s8+S/32P0eZHUvT8bZkRfB46i" "2/+sLWKl6gPZFaCqVWZHtr9fpHDsCmYvaQfAG/BTy4r3eU3xlANQ6sXb4u07eqhV" "HsUP3/h1jOZY0Ynqrm0rZPYXeUsZHD/0a7ceAjQCH0ezH6Qwdwlflq2Fujprc0p8" "jzbmIBJ//////////wIBAg==" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/srp/6144", "-----BEGIN DH PARAMETERS-----" "MIIDCAKCAwEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebcxA" "JP//////////AgEF" "-----END DH PARAMETERS-----"); config.set("dl", "modp/ietf/8192", "-----BEGIN X942 DH PARAMETERS-----" "MIIIDAKCBAEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebb4R" "WXSjkm8S/uXkOHd8tqky34zYvsTQc7kxujvIMraNndMAdB+nv4r8R+0ldvaTa6Qk" "ZjqrY5xa5PVoNCO0dCvxyXgjjxbL451lLeP9uL78hIrZIiIuBKQDfAcT61eoGiPw" "xzRz/GRs6jBrS8vIhi+Dhd36nUt/osCH6HloMwPtW906Bis89bOieKZtKhP4P0T4" "Ld8xDuB0q2o2RZfomaAlXcFk8xzFCEaFHfmrSBld7X6hsdUQvX7nTXP682vDHs+i" "aDWQRvTrh5+SQAlDi0gcbNeImgAu1e44K8kZDab8Am5HlVjkR1Z36aqeMFDidlaU" "38gfVuiAuW5xYMmA3Zjt09///////////wKCBAB//////////+SH7VEQtGEaYmMx" "RcBuDmiUgScERTPmOgEF31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Ca" "trao4SLyQtq7MS8/Y3omIXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/zJJQz" "KPZyLZ7hAD5cULHfgsxtJBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqldz2qU" "g7hLSzazhhqnJV5MAni6NgRlDBC+GUgvIxcbZx3xzzuWDAdDAc2TwdF2A9FH2uKu" "+DemKWTvFeX7SqwLjBzKpL51SrVyiukTDEx9AogKuUctRVViFtaZi4aCKD0Z1CqQ" "1e+OXTJ2fcKCLG33hUV1OKuugwY+2cuHwtNw8mPV+tdGbYSZ649GSnAlErDO53Hp" "Ew1pdzX4l/0DbMUEMmw7ATmfZDUyKQ+VjAu9kAZd8IurvTCutjuExGBdbKNxBHEn" "0Dpy1Zih7a3+cH6IRyXBaJBUkIQAjTkeCVPD82vEOM0IXt0tk0zhk4w1enEeDUo0" "GlsKhe0SwfTlFWomdG3d4W2Cb0d8l0d+Cg/fZVMUPiyjpzXgLszZSyfQSGHREZ3Q" "wyit8/aPsJS4Z3Fr19wN7rsQuCQOaANIk+rYLVTJ2nVMRsfu4MN/2+5IU2BHpvoa" "5JoBQkkbYf1aaT44E2DqblkwEyNvZLqPOx7dG978f8oDVs8ph3LtnBegmADXWDUp" "9sgT7BiLy5PYQy1EjG0fbfXnzYp2omc2XWdqXY3tv4oj82YSpZmQKKiV69ehN9x6" "AJvGaV+sweUA4yXJdngZdQrouQ6B+kFr5zc6f3tqrzgXo0wGQVrUIBjIBY5PLPPk" "v99j9HmR1L0/G2ZEXweOotv/rC1ipeoD2RWgqlVmR7a/X6Rw7ApmL2kHwBvwU8uK" "93lN8ZQDUOrF2+LtO3qoVR7FD9/4dYzmWNGJ6q5tK2T2F3lLGRw/9Gu3HgI0Ah9H" "sx+kMHcJX5athbo6a3NKfI823wisulHJN4l/cvIcO75bVJlvxmxfYmg53JjdHeQZ" "W0bO6YA6D9PfxX4j9pK7e0m10hIzHVWxzi1yerQaEdo6FfjkvBHHi2XxzrKW8f7c" "X35CRWyRERcCUgG+A4n1q9QNEfhjmjn+MjZ1GDWl5eRDF8HC7v1Opb/RYEP0PLQZ" "gfat7p0DFZ562dE8UzaVCfwfonwW75iHcDpVtRsiy/RM0BKu4LJ5jmKEI0KO/NWk" "DK72v1DY6ohev3Omuf15teGPZ9E0GsgjenXDz8kgBKHFpA42a8RNABdq9xwV5IyG" "034BNyPKrHIjqzv01U8YKHE7K0pv5A+rdEBctziwZMBuzHbp7///////////AgEC" "-----END X942 DH PARAMETERS-----"); config.set("dl", "modp/srp/8192", "-----BEGIN DH PARAMETERS-----" "MIIECAKCBAEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebb4R" "WXSjkm8S/uXkOHd8tqky34zYvsTQc7kxujvIMraNndMAdB+nv4r8R+0ldvaTa6Qk" "ZjqrY5xa5PVoNCO0dCvxyXgjjxbL451lLeP9uL78hIrZIiIuBKQDfAcT61eoGiPw" "xzRz/GRs6jBrS8vIhi+Dhd36nUt/osCH6HloMwPtW906Bis89bOieKZtKhP4P0T4" "Ld8xDuB0q2o2RZfomaAlXcFk8xzFCEaFHfmrSBld7X6hsdUQvX7nTXP682vDHs+i" "aDWQRvTrh5+SQAlDi0gcbNeImgAu1e44K8kZDab8Am5HlVjkR1Z36aqeMFDidlaU" "38gfVuiAuW5xYMmA3Zjt09///////////wIBEw==" "-----END DH PARAMETERS-----"); config.set("dl", "dsa/jce/512", "-----BEGIN DSA PARAMETERS-----" "MIGdAkEA/KaCzo4Syrom78z3EQ5SbbB4sF7ey80etKII864WF64B81uRpH5t9jQT" "xeEu0ImbzRMqzVDZkVG9xD7nN1kuFwIVAJYu3cw2nLqOuyYO5rahJtk0bjjFAkEA" "3gtU76vylwh+5iPVylWIxkgo70/eT/uuHs0gBndrBbEbgeo83pvDlkwWh8UyW/Q9" "fM76DQqGvl3/3dDRFD3NdQ==" "-----END DSA PARAMETERS-----"); config.set("dl", "dsa/jce/768", "-----BEGIN DSA PARAMETERS-----" "MIHdAmEA6eZCWZ01XzfJf/01ZxILjiXJzUPpJ7OpZw++xdiQFBki0sOzrSSACTeZ" "hp0ehGqrSfqwrSbSzmoiIZ1HC859d31KIfvpwnC1f2BwAvPO+Dk2lM9F7jaIwRqM" "VqsSej2vAhUAnNvYTJ8awvOND4D0KrlS5zOL9RECYQDe7p717RUWzn5pXmcrjO5F" "5s17NuDmOF+JS6hhY/bz5sbU6KgRRtQBfe/dccvZD6Akdlm4i3zByJT0gmn9Txqs" "CjBTjf9rP8ds+xMcnnlltYhYqwpDtVczWRKoqlR/lWg=" "-----END DSA PARAMETERS-----"); config.set("dl", "dsa/jce/1024", "-----BEGIN DSA PARAMETERS-----" "MIIBHgKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9" "jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX" "58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8V" "IwvMspK5gqLrhAvwWBz1AoGARpYDUS4wJ4zTlHWV2yLuyYJqYyKtyXNE9B10DDJX" "JMj577qn1NgD/4xgnc0QDrxb38+tfGpCX66nhuogUOvpg1HqH9of3yTWlHqmuaoj" "dmlTgC9NfUqOy6BtGXaKJJH/sW0O+cQ6mbX3FnL/bwoktETQc20E04oaEyLa9s3Y" "jJ0=" "-----END DSA PARAMETERS-----"); config.set("dl", "dsa/botan/2048", "-----BEGIN DSA PARAMETERS-----" "MIICLAKCAQEAkcSKT9+898Aq6V59oSYSK13Shk9Vm4fo50oobVL1m9HeaN/WRdDg" "DGDAgAMYkZgDdO61lKUyv9Z7mgnqxLhmOgeRDmjzlGX7cEDSXfE5MuusQ0elMOy6" "YchU+biA08DDZgCAWHxFVm2t4mvVo5S+CTtMDyS1r/747GxbPlf7iQJam8FnaZMh" "MeFtPJTvyrGNDfBhIDzFPmEDvHLVWUv9QMplOA9EqahR3LB1SV/AM6ilgHGhvXj+" "BS9mVVZI60txnSr+i0iA+NrW8VgYuhePiSdMhwvpuW6wjEbEAEDMLv4d+xsYaN0x" "nePDSjKmOrbrEiQgmkGWgMx5AtFyjU354QIhAIzX1FD4bwrZTu5M5GmodW0evRBY" "JBlD6v+ws1RYXpJNAoIBAA2fXgdhtNvRgz1qsalhoJlsXyIwP3LYTBQPZ8Qx2Uq1" "cVvqgaDJjTnOS8941rnryJXTT+idlAkdWEhhXvFfXobxHZb2yWniA936WDVkIKSc" "tES1lbkBqTPP4HZ7WU8YoHt/kd7NukRriJkPePL/kfL+fNQ/0uRtGOraH3u2YCxh" "f27zpLKE8v2boQo2BC3o+oeiyjZZf+yBFXoUheRAQd8CgwERy4gLvm7UlIFIhvll" "zcMTX1zPE4Nyi/ZbgG+WksCxDWxMCcdabKO0ATyxarLBBfa+I66pAA6rIXiYX5cs" "mAV+HIbkTnIYaI6krg82NtzKdFydzU5q/7Z8y8E9YTE=" "-----END DSA PARAMETERS-----"); config.set("dl", "dsa/botan/3072", "-----BEGIN DSA PARAMETERS-----" "MIIDLAKCAYEA5LUIgHWWY1heFCRgyi2d/xMviuTIQN2jomZoiRJP5WOLhOiim3rz" "+hIJvmv8S1By7Tsrc4e68/hX9HioAijvNgC3az3Pth0g00RlslBtLK+H3259wM6R" "vS0Wekb2rcwxxTHk+cervbkq3fNbCoBsZikqX14X6WTdCZkDczrEKKs12A6m9oW/" "uovkBo5UGK5eytno/wc94rY+Tn6tNciptwtb1Hz7iNNztm83kxk5sKtxvVWVgJCG" "2gFVM30YWg5Ps2pRmxtiArhZHmACRJzxzTpmOE9tIHOxzXO+ypO68eGmEX0COPIi" "rh7X/tGFqJDn9n+rj+uXU8wTSlGD3+h64llfe1wtn7tCJJ/dWVE+HTOWs+sv2GaE" "8oWoRI/nV6ApiBxAdguU75Gb35dAw4OJWZ7FGm6btRmo4GhJHpzgovz+PLYNZs8N" "+tIKjsaEBIaEphREV1vRck1zUrRKdgB3s71r04XOWwpyUMwL92jagpI4Buuc+7E4" "hDcxthggjHWbAiEAs+vTZOxp74zzuvZDt1c0sWM5suSeXN4bWcHp+0DuDFsCggGA" "K+0h7vg5ZKIwrom7px2ffDnFL8gim047x+WUTTKdoQ8BDqyee69sAJ/E6ylgcj4r" "Vt9GY+TDrIAOkljeL3ZJ0gZ4KJP4Ze/KSY0u7zAHTqXop6smJxKk2UovOwuaku5A" "D7OKPMWaXcfkNtXABLIuNQKDgbUck0B+sy1K4P1Cy0XhLQ7O6KJiOO3iCCp7FSIR" "PGbO+NdFxs88uUX4TS9N4W1Epx3hmCcOE/A1U8iLjTI60LlIob8hA6lJl5tu0W+1" "88lT2Vt8jojKZ9z1pjb7nKOdkkIV96iE7Wx+48ltjZcVQnl0t8Q1EoLhPTdz99KL" "RS8QiSoTx1hzKN6kgntrNpsqjcFyrcWD9R8qZZjFSD5bxGewL5HQWcQC0Y4sJoD3" "dqoG9JKAoscsF8xC1bbnQMXEsas8UcLtCSviotiwU65Xc9FCXtKwjwbi3VBZLfGk" "eMFVkc39EVZP+I/zi3IdQjkv2kcyEtz9jS2IqXagCv/m//tDCjWeZMorNRyiQSOU" "-----END DSA PARAMETERS-----"); config.set("ec", "secp112r1", "-----BEGIN EC PARAMETERS-----" "MHQCAQEwGgYHKoZIzj0BAQIPANt8Kr9i415mgHa+rSCLMCAEDtt8Kr9i415mgHa+" "rSCIBA5lnvi6BDkW7t6JEXArIgQdBAlIcjmZWl7na1X5wvCYqJzlr4ckwKI+Dg/3" "dQACDwDbfCq/YuNedijfrGVhxQIBAQ==" "-----END EC PARAMETERS-----"); config.set("ec", "secp112r2", "-----BEGIN EC PARAMETERS-----" "MHMCAQEwGgYHKoZIzj0BAQIPANt8Kr9i415mgHa+rSCLMCAEDmEnwkwF84oKqvZc" "DvAsBA5R3vGBXbXtdPzDTIXXCQQdBEujCrXokrThZJ3QkoZDrc1G9YguN0fe826V" "bpcCDjbfCq/YuNdZfKEFINBLAgEB" "-----END EC PARAMETERS-----"); config.set("ec", "secp128r1", "-----BEGIN EC PARAMETERS-----" "MIGAAgEBMBwGByqGSM49AQECEQD////9////////////////MCQEEP////3/////" "//////////wEEOh1ecEQefQ92CSZPCzuXtMEIQQWH/dSi4mbLQwoYHylLFuGz1rI" "OVuv6xPALaKS3e16gwIRAP////4AAAAAdaMNG5A4oRUCAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp128r2", "-----BEGIN EC PARAMETERS-----" "MH8CAQEwHAYHKoZIzj0BAQIRAP////3///////////////8wJAQQ1gMZmNGzu/6/" "Wcybv/mu4QQQXu78o4DQKRncLGVYu22KXQQhBHtqpdheVymD5vsyp83rwUAntpFq" "iU067nEG/oBfw0tEAhA/////f////74AJHIGE7WjAgEE" "-----END EC PARAMETERS-----"); config.set("ec", "secp160k1", "-----BEGIN EC PARAMETERS-----" "MIGYAgEBMCAGByqGSM49AQECFQD////////////////////+//+sczAsBBQAAAAA" "AAAAAAAAAAAAAAAAAAAAAAQUAAAAAAAAAAAAAAAAAAAAAAAAAAcEKQQ7TDgs43qh" "kqQBnnYwNvT13U1+u5OM+TUxj9zta8KChlMXM8PwPE/uAhUBAAAAAAAAAAAAAbj6" "Ft+rmsoWtrMCAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp160r1", "-----BEGIN EC PARAMETERS-----" "MIGYAgEBMCAGByqGSM49AQECFQD/////////////////////f////zAsBBT/////" "////////////////f////AQUHJe+/FS9eotlrPifgdTUrcVl+kUEKQRKlrVojvVz" "KEZkaYlow4u5E8v8giOmKFUxaJR9WdzJEgQjUTd6xfsyAhUBAAAAAAAAAAAAAfTI" "+Seu08p1IlcCAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp160r2", "-----BEGIN EC PARAMETERS-----" "MIGYAgEBMCAGByqGSM49AQECFQD////////////////////+//+sczAsBBT/////" "///////////////+//+scAQUtOE00/tZ64urVydJBGZNWvUDiLoEKQRS3LA0KToR" "fh9P8Rsw9xmdMUTObf6v/vLjMfKW4HH6DfmYLP6n1D8uAhUBAAAAAAAAAAAAADUe" "54aoGPOhoWsCAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp192k1", "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQD//////////////////////////v//7jcwNAQY" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAMEMQTbT/EOwFfpriawfQKAt/Q0HaXRsergbH2bLy9tnFYop4RBY9AVvoY0QIKq" "iNleL50CGQD///////////////4m8vwXD2lGanTe/Y0CAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp192r1", "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQD////////////////////+//////////8wNAQY" "/////////////////////v/////////8BBhkIQUZ5ZyA5w+n6atyJDBJ/rje7MFG" "ubEEMQQYjagOsDCQ9ny/IOtDoYgA9P8K/YL/EBIHGSuV/8jaeGMQEe1rJM3Vc/l3" "oR55SBECGQD///////////////+Z3vg2FGvJsbTSKDECAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp224k1", "-----BEGIN EC PARAMETERS-----" "MIHIAgEBMCgGByqGSM49AQECHQD///////////////////////////////7//+Vt" "MDwEHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAUEOQShRVszTfCZ3zD8KKFppGfp5HB1qQ9+ZQ62t6Rcfgif" "7X+6NEKCyvvW9+MZ98CwvVniykvbVW1hpQIdAQAAAAAAAAAAAAAAAAAB3OjS7GGE" "yvCpcXafsfcCAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp224r1", "-----BEGIN EC PARAMETERS-----" "MIHIAgEBMCgGByqGSM49AQECHQD/////////////////////AAAAAAAAAAAAAAAB" "MDwEHP////////////////////7///////////////4EHLQFCoUMBLOr9UEyVlBE" "sLfXv9i6Jws5QyNV/7QEOQS3Dgy9a7S/fzITkLlKA8HTVsIRIjQygNYRXB0hvTdj" "iLX3I/tMIt/mzUN1oFoHR2RE1YGZhQB+NAIdAP//////////////////FqLguPA+" "E90pRVxcKj0CAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp256k1", "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQD////////////////////////////////////+" "///8LzBEBCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcEQQR5vmZ++dy7rFWgYpXOhwsHApv8" "2y3OKNlZ8oFbFvgXmEg62ncmo8RlXaT7/A4RCKj9F7RIpoVUGZxH0I/7ENS4AiEA" "/////////////////////rqu3OavSKA7v9JejNA2QUECAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp256r1", "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQD/////AAAAAQAAAAAAAAAAAAAAAP//////////" "/////zBEBCD/////AAAAAQAAAAAAAAAAAAAAAP///////////////AQgWsY12Ko6" "k+ez671VdpiGvGUdBrDMU7D2O848PifSYEsEQQRrF9Hy4SxCR/i85uVjpEDydwN9" "gS3rM6D0oTlF2JjClk/jQuL+Gn+bjufrSnwPnhYrzjNXazFezsu2QGg3v1H1AiEA" "/////wAAAAD//////////7zm+q2nF56E87nKwvxjJVECAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "secp384r1", "-----BEGIN EC PARAMETERS-----" "MIIBQAIBATA8BgcqhkjOPQEBAjEA////////////////////////////////////" "//////7/////AAAAAAAAAAD/////MGQEMP//////////////////////////////" "///////////+/////wAAAAAAAAAA/////AQwszEvp+I+5+SYjgVr4/gtGRgdnG7+" "gUESAxQIj1ATh1rGVjmNii7RnSqFyO3T7CrvBGEEqofKIr6LBTeOscce8yCtdG4d" "O2KLp5uYWfdB4IJUKjhVAvJdv1UpbDpUXjhydgq3NhfeSpYmLG9dnpi/kpLcKfj0" "Hb0omhR86doxE7XwuMAKYLHOHX6BnXpDHXyQ6g5fAjEA////////////////////" "////////////x2NNgfQ3Ld9YGg2ySLCneuzsGWrMxSlzAgEB" "-----END EC PARAMETERS-----"); config.set("ec", "secp521r1", "-----BEGIN EC PARAMETERS-----" "MIIBrAIBATBNBgcqhkjOPQEBAkIB////////////////////////////////////" "//////////////////////////////////////////////////8wgYgEQgH/////" "////////////////////////////////////////////////////////////////" "/////////////////ARCAFGVPrlhjhyaH5KaIaC2hUDuotpyW5mzFfO4tImRjvEJ" "4VYZOVHsfpN7FlLAvTuxvwc1c9+IPSw08e9FH9RrUD8ABIGFBADGhY4GtwQE6c2e" "PstmI5W0QpxkgTkFP7Uh+CivYGtNPbqhS1537+dZKP4dwSei/6jeM0izwYVqQpv5" "fn4xwuW9ZgEYOSlqeJo7wARcil+0LH0b2Zj1RElXm0RoF6+9Fyc+ZiyX7nKZXvQm" "QMVQuQE/rQdhNTxwhqJywkCIvpR2n9FmUAJCAf//////////////////////////" "////////////////+lGGh4O/L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGQJAgEB" "-----END EC PARAMETERS-----"); config.set("ec", "1.3.6.1.4.1.8301.3.1.2.9.0.38", "-----BEGIN EC PARAMETERS-----" "MIIBrAIBATBNBgcqhkjOPQEBAkIB////////////////////////////////////" "//////////////////////////////////////////////////8wgYgEQgH/////" "////////////////////////////////////////////////////////////////" "/////////////////ARCAFGVPrlhjhyaH5KaIaC2hUDuotpyW5mzFfO4tImRjvEJ" "4VYZOVHsfpN7FlLAvTuxvwc1c9+IPSw08e9FH9RrUD8ABIGFBADGhY4GtwQE6c2e" "PstmI5W0QpxkgTkFP7Uh+CivYGtNPbqhS1537+dZKP4dwSei/6jeM0izwYVqQpv5" "fn4xwuW9ZgEYOSlqeJo7wARcil+0LH0b2Zj1RElXm0RoF6+9Fyc+ZiyX7nKZXvQm" "QMVQuQE/rQdhNTxwhqJywkCIvpR2n9FmUAJCAf//////////////////////////" "////////////////+lGGh4O/L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGQJAgEB" "-----END EC PARAMETERS-----"); config.set("ec", "brainpool160r1", "-----BEGIN EC PARAMETERS-----" "MIGYAgEBMCAGByqGSM49AQECFQDpXkpfc3BZ3GDfx62Vs9gTlRViDzAsBBQ0Dnvi" "ooDrdOK+YbradF2X6PfDAAQUHliahZVCNBITT6otveyVyNhnXlgEKQS+1a8W6j9q" "T2KTjEYx61r3vbzbwxZny0d6Go7DOPlHQWacl2MW2mMhAhUA6V5KX3NwWdxg31mR" "1FApQJ5g/AkCAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "brainpool192r1", "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQDDAvQdkyo2zaejRjCT0Y23j85HbeGoYpcwNAQY" "apEXQHax4OGcOcAx/oaFwcrgQOXGmijvBBhGmijvfCjMo9xyHQRPRJa8yn70FG+/" "JckEMQTAoGR+qrakh1OwM8VssPCQCi9cSFM3X9YUtpCGar1buItfSCjBSQAC5nc/" "ovopm48CGQDDAvQdkyo2zaejRi+enpFrW+jxAprErMECAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "brainpool224r1", "-----BEGIN EC PARAMETERS-----" "MIHIAgEBMCgGByqGSM49AQECHQDXwTSqJkNmhioYMCV10deHsJ8HV5faifV+yMD/" "MDwEHGil5iypzmwcKZgDpsFTC1FOGCrYsAQqWcrSn0MEHCWA9jzP5EE4hwcTsakj" "aeM+ITXSZtuzcjhsQAsEOQQNkCmtLH5c9DQII7KofcaMnkzjF0webv3uEsB9WKpW" "93LAcm8kxrieTs2sJDVLnpnKo/bTdhQCzQIdANfBNKomQ2aGKhgwJXXQ+5jRFrxL" "bd68o6Wnk58CAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "brainpool256r1", "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQCp+1fboe6pvD5mCpCdg41ybjv2I9UmICggE0gd" "H25TdzBEBCB9Wgl1/CwwV+72dTBBev/n+4BVwSbcXGzpSktE8zC12QQgJtxcbOlK" "S0TzMLXZu9d8v5WEFilc9+HOa8zcGP+MB7YEQQSL0q65y35XyyxLSC/8gbevud4n" "4eO9I8I6RFO9ms4yYlR++DXD2sT9l/hGGhRhHcnCd0UTLe2OVFwdVMcvBGmXAiEA" "qftX26Huqbw+ZgqQnYONcYw5eqO1Yab3kB4OgpdIVqcCAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "brainpool320r1", "-----BEGIN EC PARAMETERS-----" "MIIBEAIBATA0BgcqhkjOPQEBAikA015HIDa8T7fhPHhe0gHgZfmPz6b29A3vT5K5" "7HiT7Cj81BKx8bMuJzBUBCg+4wtWj7qw+IPM69RtPzu4oqc1E/XredpmGQ6whf+p" "9JLzdal9hg60BChSCIOUnf28QtOtGYZAaIpv4T9BNJVUtJrMMdzNiEU5gW9etKyP" "sfGmBFEEQ71+mvtT2LhSibzEjuW/5vIBN9EKCH6254ceKhClmccQr40NOeIGERT9" "0FVF7BzIq0CTJH93J14HQ//tEXGC6qnHeHeqrGrH01JF0WkujuECKQDTXkcgNrxP" "t+E8eF7SAeBl+Y/PpbaPEqMtSC7H7oZY6YaRVVtExZMRAgEB" "-----END EC PARAMETERS-----"); config.set("ec", "brainpool384r1", "-----BEGIN EC PARAMETERS-----" "MIIBQAIBATA8BgcqhkjOPQEBAjEAjLkegqM4bSgPXW9+UOZB3xUvcQntVFa0ErHa" "GX+3ESOs06cpkB0acYdHABMxB+xTMGQEMHvDgsY9jBUMPHIICs4Fr6DCvqKOT7In" "hxORZe+6kfkPiqWBSlA61OsEqMfdIs4oJgQwBKjH3SLOKCaLObVUFvBEfC+3feEH" "3NKmLogOpT7rYtV8tDkCldvJlDq3hpb6UEwRBGEEHRxk8GjPRf+ipjqBt8E/a4hH" "o+d+8U/j23/K/gy9EOjoJuA0NtZGqu+HsuJH1K8eir4ddSD5wqRcseuOlc/VUmK3" "Cyn+7Fhk4ZwFT/mRKSgORkYhd5GBEUKCA0EmPFMVAjEAjLkegqM4bSgPXW9+UOZB" "3xUvcQntVFazHxZubKwEJafPOrava3/DEDuIMgLpBGVlAgEB" "-----END EC PARAMETERS-----"); config.set("ec", "brainpool512r1", "-----BEGIN EC PARAMETERS-----" "MIIBogIBATBMBgcqhkjOPQEBAkEAqt2duNvpxIs/1OauM8n8B8swjbOzydIO1mOc" "ynAzCHF9TZsAm8ZoQq7NoSrmo4DmKIH/Ly2CxoUoqmBWWDpI8zCBhARAeDCjMYtg" "O4niMnFFrCNMxZTL3Y09+RYQqDRByuqYY7wt7V1aqCU6oQou8cmLmsi1fxEXpyvy" "x7nnwaxNd/yUygRAPfkWEKg0QcrqmGO8Le1dWqglOqEKLvHJi5rItX8RF6cr8se5" "58GsTXf8lMrcCD5nmEBQt1665d0oCb1jgBb3IwSBgQSBruS92C7ZZFohMi6cTGqT" "he2fcLXZFsG0O2Lu9NAJjv87H3ji0NSNUNFoe5O5fV98bVBHQGpeaIs1Igm8ufgi" "fd44XVZjMuzA6r+pz3gi/fIJ9wAkpXsaoADFW4gfgRGy3N5JSl9IXlvKS9iKJ2Ou" "0corL6jwVAZ4zR4POtgIkgJBAKrdnbjb6cSLP9TmrjPJ/AfLMI2zs8nSDtZjnMpw" "MwhwVT5cQUypJhlBhmEZf6wQRx2x04EIXdrdtYeWgpypAGkCAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "x962_p192v2", "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQD////////////////////+//////////8wNAQY" "/////////////////////v/////////8BBjMItbfuVxrJeScDWNkpOWYDDk6ohZo" "2VMEMQTuorrn4Ul4QvLed2nP6cmJwHKtaW9IA0pldNEdabbsemcruCoIPfLysIR9" "6XCy3hUCGQD///////////////5fsack3IBBhkjY3TECAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "x962_p192v3", "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQD////////////////////+//////////8wNAQY" "/////////////////////v/////////8BBgiEj3COVoFyqdCPa7MyUdgp9RiJWvV" "aRYEMQR9KXeBAMZaHaF4NxZYjc4ri0rujiKPGJY4qQ8iY3M3M0tJ3LZqbcj5l4rK" "dkipQ7ACGQD///////////////96YtAxyD9ClPZA7BMCAQE=" "-----END EC PARAMETERS-----"); config.set("ec", "x962_p239v1", "-----BEGIN EC PARAMETERS-----" "MIHSAgEBMCkGByqGSM49AQECHn///////////////3///////4AAAAAAAH//////" "/zBABB5///////////////9///////+AAAAAAAB///////wEHmsBbDvc8YlB0NZU" "khR1ynGp2y+yfR03eWGFwpQsCgQ9BA/6ljzcqIFszDO4ZCvt+QXD01hXPT8n+707" "PLmqr33r6OTpCl2ubkBUylMLoEZUs2gYziJrOfzLewLxrgIef///////////////" "f///nl6an12QcfvRUiaIkJ0LAgEB" "-----END EC PARAMETERS-----"); config.set("ec", "x962_p239v2", "-----BEGIN EC PARAMETERS-----" "MIHSAgEBMCkGByqGSM49AQECHn///////////////3///////4AAAAAAAH//////" "/zBABB5///////////////9///////+AAAAAAAB///////wEHmF/q2gyV2y7/tUN" "mfAknD/uWLlLoAOMeuhMjIMvLAQ9BDivCdmHJ3BRIMkhu16eJilqPNzy81dXoOr9" "h7gw51sBJeTb6g7HIG2g/AHZsIEyn7VV3m70YCN9/4vkugIef///////////////" "gAAAz6foWUN31BTAOCG8WCBjAgEB" "-----END EC PARAMETERS-----"); config.set("ec", "x962_p239v3", "-----BEGIN EC PARAMETERS-----" "MIHSAgEBMCkGByqGSM49AQECHn///////////////3///////4AAAAAAAH//////" "/zBABB5///////////////9///////+AAAAAAAB///////wEHiVXBfoqMGZUsfTL" "A9anUKMMJQEC1JiHF9m6FattPgQ9BGdoro4Yu5LPzwBclJqixtlIU9DmYLv4VLHJ" "UF/pWhYH5omPOQwGvB1VK60ibztvz+SLboGEma8Y4+1s8wIef///////////////" "f///l13rQbOmBXw8QyFGUmVRAgEB" "-----END EC PARAMETERS-----"); config.set("ec", "gost_256A", "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQD/////////////////////////////////////" "///9lzBEBCD////////////////////////////////////////9lAQgAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKYEQQQAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAY2R5HHgmJzaJ99QWkU/K3Y1KU8t3yPjsSKsyZyenx4UAiEA" "/////////////////////2xhEHCZWtEARYQbCbdhuJMCAQE=" "-----END EC PARAMETERS-----"); } } /* * Set the default policy */ void Library_State::load_default_config() { set_default_aliases(*this); set_default_oids(*this); set_default_dl_groups(*this); } } Botan-1.10.12/src/libstate/scan_name.cpp0000664000175000017500000000727612654331322017626 0ustar jackjack00000000000000/* * SCAN Name Abstraction * (C) 2008-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace { std::string make_arg( const std::vector >& name, size_t start) { std::string output = name[start].second; size_t level = name[start].first; size_t paren_depth = 0; for(size_t i = start + 1; i != name.size(); ++i) { if(name[i].first <= name[start].first) break; if(name[i].first > level) { output += '(' + name[i].second; ++paren_depth; } else if(name[i].first < level) { output += ")," + name[i].second; --paren_depth; } else { if(output[output.size() - 1] != '(') output += ","; output += name[i].second; } level = name[i].first; } for(size_t i = 0; i != paren_depth; ++i) output += ')'; return output; } std::pair deref_aliases(const std::pair& in) { return std::make_pair(in.first, global_state().deref_alias(in.second)); } } SCAN_Name::SCAN_Name(std::string algo_spec) { orig_algo_spec = algo_spec; std::vector > name; size_t level = 0; std::pair accum = std::make_pair(level, ""); std::string decoding_error = "Bad SCAN name '" + algo_spec + "': "; algo_spec = global_state().deref_alias(algo_spec); for(size_t i = 0; i != algo_spec.size(); ++i) { char c = algo_spec[i]; if(c == '/' || c == ',' || c == '(' || c == ')') { if(c == '(') ++level; else if(c == ')') { if(level == 0) throw Decoding_Error(decoding_error + "Mismatched parens"); --level; } if(c == '/' && level > 0) accum.second.push_back(c); else { if(accum.second != "") name.push_back(deref_aliases(accum)); accum = std::make_pair(level, ""); } } else accum.second.push_back(c); } if(accum.second != "") name.push_back(deref_aliases(accum)); if(level != 0) throw Decoding_Error(decoding_error + "Missing close paren"); if(name.size() == 0) throw Decoding_Error(decoding_error + "Empty name"); alg_name = name[0].second; bool in_modes = false; for(size_t i = 1; i != name.size(); ++i) { if(name[i].first == 0) { mode_info.push_back(make_arg(name, i)); in_modes = true; } else if(name[i].first == 1 && !in_modes) args.push_back(make_arg(name, i)); } } std::string SCAN_Name::algo_name_and_args() const { std::string out; out = algo_name(); if(arg_count()) { out += '('; for(size_t i = 0; i != arg_count(); ++i) { out += arg(i); if(i != arg_count() - 1) out += ','; } out += ')'; } return out; } std::string SCAN_Name::arg(size_t i) const { if(i >= arg_count()) throw std::range_error("SCAN_Name::argument - i out of range"); return args[i]; } std::string SCAN_Name::arg(size_t i, const std::string& def_value) const { if(i >= arg_count()) return def_value; return args[i]; } size_t SCAN_Name::arg_as_integer(size_t i, size_t def_value) const { if(i >= arg_count()) return def_value; return to_u32bit(args[i]); } } Botan-1.10.12/src/libstate/scan_name.h0000664000175000017500000000443312654331322017263 0ustar jackjack00000000000000/* * SCAN Name Abstraction * (C) 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SCAN_NAME_H__ #define BOTAN_SCAN_NAME_H__ #include #include #include namespace Botan { /** A class encapsulating a SCAN name (similar to JCE conventions) http://www.users.zetnet.co.uk/hopwood/crypto/scan/ */ class BOTAN_DLL SCAN_Name { public: /** * @param algo_spec A SCAN-format name */ SCAN_Name(std::string algo_spec); /** * @return original input string */ std::string as_string() const { return orig_algo_spec; } /** * @return algorithm name */ std::string algo_name() const { return alg_name; } /** * @return algorithm name plus any arguments */ std::string algo_name_and_args() const; /** * @return number of arguments */ size_t arg_count() const { return args.size(); } /** * @param lower is the lower bound * @param upper is the upper bound * @return if the number of arguments is between lower and upper */ bool arg_count_between(size_t lower, size_t upper) const { return ((arg_count() >= lower) && (arg_count() <= upper)); } /** * @param i which argument * @return ith argument */ std::string arg(size_t i) const; /** * @param i which argument * @param def_value the default value * @return ith argument or the default value */ std::string arg(size_t i, const std::string& def_value) const; /** * @param i which argument * @param def_value the default value * @return ith argument as an integer, or the default value */ size_t arg_as_integer(size_t i, size_t def_value) const; /** * @return cipher mode (if any) */ std::string cipher_mode() const { return (mode_info.size() >= 1) ? mode_info[0] : ""; } /** * @return cipher mode padding (if any) */ std::string cipher_mode_pad() const { return (mode_info.size() >= 2) ? mode_info[1] : ""; } private: std::string orig_algo_spec; std::string alg_name; std::vector args; std::vector mode_info; }; } #endif Botan-1.10.12/src/mac/cbc_mac/cbc_mac.cpp0000664000175000017500000000326212654331322017540 0ustar jackjack00000000000000/* * CBC-MAC * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Update an CBC-MAC Calculation */ void CBC_MAC::add_data(const byte input[], size_t length) { size_t xored = std::min(output_length() - position, length); xor_buf(&state[position], input, xored); position += xored; if(position < output_length()) return; e->encrypt(state); input += xored; length -= xored; while(length >= output_length()) { xor_buf(state, input, output_length()); e->encrypt(state); input += output_length(); length -= output_length(); } xor_buf(state, input, length); position = length; } /* * Finalize an CBC-MAC Calculation */ void CBC_MAC::final_result(byte mac[]) { if(position) e->encrypt(state); copy_mem(mac, &state[0], state.size()); zeroise(state); position = 0; } /* * CBC-MAC Key Schedule */ void CBC_MAC::key_schedule(const byte key[], size_t length) { e->set_key(key, length); } /* * Clear memory of sensitive data */ void CBC_MAC::clear() { e->clear(); zeroise(state); position = 0; } /* * Return the name of this type */ std::string CBC_MAC::name() const { return "CBC-MAC(" + e->name() + ")"; } /* * Return a clone of this object */ MessageAuthenticationCode* CBC_MAC::clone() const { return new CBC_MAC(e->clone()); } /* * CBC-MAC Constructor */ CBC_MAC::CBC_MAC(BlockCipher* e_in) : e(e_in), state(e->block_size()) { position = 0; } /* * CBC-MAC Destructor */ CBC_MAC::~CBC_MAC() { delete e; } } Botan-1.10.12/src/mac/cbc_mac/cbc_mac.h0000664000175000017500000000165712654331322017213 0ustar jackjack00000000000000/* * CBC-MAC * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CBC_MAC_H__ #define BOTAN_CBC_MAC_H__ #include #include namespace Botan { /** * CBC-MAC */ class BOTAN_DLL CBC_MAC : public MessageAuthenticationCode { public: std::string name() const; MessageAuthenticationCode* clone() const; size_t output_length() const { return e->block_size(); } void clear(); Key_Length_Specification key_spec() const { return e->key_spec(); } /** * @param cipher the underlying block cipher to use */ CBC_MAC(BlockCipher* cipher); ~CBC_MAC(); private: void add_data(const byte[], size_t); void final_result(byte[]); void key_schedule(const byte[], size_t); BlockCipher* e; SecureVector state; size_t position; }; } #endif Botan-1.10.12/src/mac/cbc_mac/info.txt0000664000175000017500000000005512654331322017156 0ustar jackjack00000000000000define CBC_MAC block Botan-1.10.12/src/mac/cmac/cmac.cpp0000664000175000017500000000552412654331322016433 0ustar jackjack00000000000000/* * CMAC * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Perform CMAC's multiplication in GF(2^n) */ SecureVector CMAC::poly_double(const MemoryRegion& in, byte polynomial) { const byte poly_xor = (in[0] & 0x80) ? polynomial : 0; SecureVector out = in; byte carry = 0; for(size_t i = out.size(); i != 0; --i) { byte temp = out[i-1]; out[i-1] = (temp << 1) | carry; carry = (temp >> 7); } out[out.size()-1] ^= poly_xor; return out; } /* * Update an CMAC Calculation */ void CMAC::add_data(const byte input[], size_t length) { buffer.copy(position, input, length); if(position + length > output_length()) { xor_buf(state, buffer, output_length()); e->encrypt(state); input += (output_length() - position); length -= (output_length() - position); while(length > output_length()) { xor_buf(state, input, output_length()); e->encrypt(state); input += output_length(); length -= output_length(); } buffer.copy(input, length); position = 0; } position += length; } /* * Finalize an CMAC Calculation */ void CMAC::final_result(byte mac[]) { xor_buf(state, buffer, position); if(position == output_length()) { xor_buf(state, B, output_length()); } else { state[position] ^= 0x80; xor_buf(state, P, output_length()); } e->encrypt(state); for(size_t i = 0; i != output_length(); ++i) mac[i] = state[i]; zeroise(state); zeroise(buffer); position = 0; } /* * CMAC Key Schedule */ void CMAC::key_schedule(const byte key[], size_t length) { clear(); e->set_key(key, length); e->encrypt(B); B = poly_double(B, polynomial); P = poly_double(B, polynomial); } /* * Clear memory of sensitive data */ void CMAC::clear() { e->clear(); zeroise(state); zeroise(buffer); zeroise(B); zeroise(P); position = 0; } /* * Return the name of this type */ std::string CMAC::name() const { return "CMAC(" + e->name() + ")"; } /* * Return a clone of this object */ MessageAuthenticationCode* CMAC::clone() const { return new CMAC(e->clone()); } /* * CMAC Constructor */ CMAC::CMAC(BlockCipher* e_in) : e(e_in) { if(e->block_size() == 16) polynomial = 0x87; else if(e->block_size() == 8) polynomial = 0x1B; else throw Invalid_Argument("CMAC cannot use the cipher " + e->name()); state.resize(output_length()); buffer.resize(output_length()); B.resize(output_length()); P.resize(output_length()); position = 0; } /* * CMAC Destructor */ CMAC::~CMAC() { delete e; } } Botan-1.10.12/src/mac/cmac/cmac.h0000664000175000017500000000236512654331322016100 0ustar jackjack00000000000000/* * CMAC * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CMAC_H__ #define BOTAN_CMAC_H__ #include #include namespace Botan { /** * CMAC, also known as OMAC1 */ class BOTAN_DLL CMAC : public MessageAuthenticationCode { public: std::string name() const; size_t output_length() const { return e->block_size(); } MessageAuthenticationCode* clone() const; void clear(); Key_Length_Specification key_spec() const { return e->key_spec(); } /** * CMAC's polynomial doubling operation * @param in the input * @param polynomial the byte value of the polynomial */ static SecureVector poly_double(const MemoryRegion& in, byte polynomial); /** * @param cipher the underlying block cipher to use */ CMAC(BlockCipher* cipher); ~CMAC(); private: void add_data(const byte[], size_t); void final_result(byte[]); void key_schedule(const byte[], size_t); BlockCipher* e; SecureVector buffer, state, B, P; size_t position; byte polynomial; }; } #endif Botan-1.10.12/src/mac/cmac/info.txt0000664000175000017500000000005212654331322016507 0ustar jackjack00000000000000define CMAC block Botan-1.10.12/src/mac/hmac/hmac.cpp0000664000175000017500000000332312654331322016440 0ustar jackjack00000000000000/* * HMAC * (C) 1999-2007 Jack Lloyd * 2007 Yves Jerschow * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Update a HMAC Calculation */ void HMAC::add_data(const byte input[], size_t length) { hash->update(input, length); } /* * Finalize a HMAC Calculation */ void HMAC::final_result(byte mac[]) { hash->final(mac); hash->update(o_key); hash->update(mac, output_length()); hash->final(mac); hash->update(i_key); } /* * HMAC Key Schedule */ void HMAC::key_schedule(const byte key[], size_t length) { hash->clear(); std::fill(i_key.begin(), i_key.end(), 0x36); std::fill(o_key.begin(), o_key.end(), 0x5C); if(length > hash->hash_block_size()) { SecureVector hmac_key = hash->process(key, length); xor_buf(i_key, hmac_key, hmac_key.size()); xor_buf(o_key, hmac_key, hmac_key.size()); } else { xor_buf(i_key, key, length); xor_buf(o_key, key, length); } hash->update(i_key); } /* * Clear memory of sensitive data */ void HMAC::clear() { hash->clear(); zeroise(i_key); zeroise(o_key); } /* * Return the name of this type */ std::string HMAC::name() const { return "HMAC(" + hash->name() + ")"; } /* * Return a clone of this object */ MessageAuthenticationCode* HMAC::clone() const { return new HMAC(hash->clone()); } /* * HMAC Constructor */ HMAC::HMAC(HashFunction* hash_in) : hash(hash_in) { if(hash->hash_block_size() == 0) throw Invalid_Argument("HMAC cannot be used with " + hash->name()); i_key.resize(hash->hash_block_size()); o_key.resize(hash->hash_block_size()); } } Botan-1.10.12/src/mac/hmac/hmac.h0000664000175000017500000000173612654331322016113 0ustar jackjack00000000000000/* * HMAC * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_HMAC_H__ #define BOTAN_HMAC_H__ #include #include namespace Botan { /** * HMAC */ class BOTAN_DLL HMAC : public MessageAuthenticationCode { public: void clear(); std::string name() const; MessageAuthenticationCode* clone() const; size_t output_length() const { return hash->output_length(); } Key_Length_Specification key_spec() const { // Absurd max length here is to support PBKDF2 return Key_Length_Specification(0, 512); } /** * @param hash the hash to use for HMACing */ HMAC(HashFunction* hash); ~HMAC() { delete hash; } private: void add_data(const byte[], size_t); void final_result(byte[]); void key_schedule(const byte[], size_t); HashFunction* hash; SecureVector i_key, o_key; }; } #endif Botan-1.10.12/src/mac/hmac/info.txt0000664000175000017500000000005112654331322016513 0ustar jackjack00000000000000define HMAC hash Botan-1.10.12/src/mac/info.txt0000664000175000017500000000004112654331322015602 0ustar jackjack00000000000000 algo_base Botan-1.10.12/src/mac/mac.cpp0000664000175000017500000000075312654331322015364 0ustar jackjack00000000000000/* * Message Authentication Code base class * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Default (deterministic) MAC verification operation */ bool MessageAuthenticationCode::verify_mac(const byte mac[], size_t length) { SecureVector our_mac = final(); if(our_mac.size() != length) return false; return same_mem(&our_mac[0], &mac[0], length); } } Botan-1.10.12/src/mac/mac.h0000664000175000017500000000212312654331322015022 0ustar jackjack00000000000000/* * Base class for message authentiction codes * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MESSAGE_AUTH_CODE_BASE_H__ #define BOTAN_MESSAGE_AUTH_CODE_BASE_H__ #include #include #include namespace Botan { /** * This class represents Message Authentication Code (MAC) objects. */ class BOTAN_DLL MessageAuthenticationCode : public Buffered_Computation, public SymmetricAlgorithm { public: /** * Verify a MAC. * @param in the MAC to verify as a byte array * @param length the length of param in * @return true if the MAC is valid, false otherwise */ virtual bool verify_mac(const byte in[], size_t length); /** * Get a new object representing the same algorithm as *this */ virtual MessageAuthenticationCode* clone() const = 0; /** * Get the name of this algorithm. * @return name of this algorithm */ virtual std::string name() const = 0; }; } #endif Botan-1.10.12/src/mac/ssl3mac/info.txt0000664000175000017500000000005512654331322017154 0ustar jackjack00000000000000define SSL3_MAC hash Botan-1.10.12/src/mac/ssl3mac/ssl3_mac.cpp0000664000175000017500000000313712654331322017674 0ustar jackjack00000000000000/* * SSL3-MAC * (C) 1999-2004 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * Update a SSL3-MAC Calculation */ void SSL3_MAC::add_data(const byte input[], size_t length) { hash->update(input, length); } /* * Finalize a SSL3-MAC Calculation */ void SSL3_MAC::final_result(byte mac[]) { hash->final(mac); hash->update(o_key); hash->update(mac, output_length()); hash->final(mac); hash->update(i_key); } /* * SSL3-MAC Key Schedule */ void SSL3_MAC::key_schedule(const byte key[], size_t length) { hash->clear(); std::fill(i_key.begin(), i_key.end(), 0x36); std::fill(o_key.begin(), o_key.end(), 0x5C); i_key.copy(key, length); o_key.copy(key, length); hash->update(i_key); } /* * Clear memory of sensitive data */ void SSL3_MAC::clear() { hash->clear(); zeroise(i_key); zeroise(o_key); } /* * Return the name of this type */ std::string SSL3_MAC::name() const { return "SSL3-MAC(" + hash->name() + ")"; } /* * Return a clone of this object */ MessageAuthenticationCode* SSL3_MAC::clone() const { return new SSL3_MAC(hash->clone()); } /* * SSL3-MAC Constructor */ SSL3_MAC::SSL3_MAC(HashFunction* hash_in) : hash(hash_in) { if(hash->hash_block_size() == 0) throw Invalid_Argument("SSL3-MAC cannot be used with " + hash->name()); // Quirk to deal with specification bug const size_t INNER_HASH_LENGTH = (hash->name() == "SHA-160") ? 60 : hash->hash_block_size(); i_key.resize(INNER_HASH_LENGTH); o_key.resize(INNER_HASH_LENGTH); } } Botan-1.10.12/src/mac/ssl3mac/ssl3_mac.h0000664000175000017500000000201112654331322017327 0ustar jackjack00000000000000/* * SSL3-MAC * (C) 1999-2004 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SSL3_MAC_H__ #define BOTAN_SSL3_MAC_H__ #include #include namespace Botan { /** * A MAC only used in SSLv3. Do not use elsewhere! Use HMAC instead. */ class BOTAN_DLL SSL3_MAC : public MessageAuthenticationCode { public: std::string name() const; size_t output_length() const { return hash->output_length(); } MessageAuthenticationCode* clone() const; void clear(); Key_Length_Specification key_spec() const { return Key_Length_Specification(hash->output_length()); } /** * @param hash the underlying hash to use */ SSL3_MAC(HashFunction* hash); ~SSL3_MAC() { delete hash; } private: void add_data(const byte[], size_t); void final_result(byte[]); void key_schedule(const byte[], size_t); HashFunction* hash; SecureVector i_key, o_key; }; } #endif Botan-1.10.12/src/mac/x919_mac/info.txt0000664000175000017500000000006312654331322017140 0ustar jackjack00000000000000define ANSI_X919_MAC block Botan-1.10.12/src/mac/x919_mac/x919_mac.cpp0000664000175000017500000000347612654331322017515 0ustar jackjack00000000000000/* * ANSI X9.19 MAC * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Update an ANSI X9.19 MAC Calculation */ void ANSI_X919_MAC::add_data(const byte input[], size_t length) { size_t xored = std::min(8 - position, length); xor_buf(&state[position], input, xored); position += xored; if(position < 8) return; e->encrypt(state); input += xored; length -= xored; while(length >= 8) { xor_buf(state, input, 8); e->encrypt(state); input += 8; length -= 8; } xor_buf(state, input, length); position = length; } /* * Finalize an ANSI X9.19 MAC Calculation */ void ANSI_X919_MAC::final_result(byte mac[]) { if(position) e->encrypt(state); d->decrypt(state, mac); e->encrypt(mac); zeroise(state); position = 0; } /* * ANSI X9.19 MAC Key Schedule */ void ANSI_X919_MAC::key_schedule(const byte key[], size_t length) { e->set_key(key, 8); if(length == 8) d->set_key(key, 8); else d->set_key(key + 8, 8); } /* * Clear memory of sensitive data */ void ANSI_X919_MAC::clear() { e->clear(); d->clear(); zeroise(state); position = 0; } std::string ANSI_X919_MAC::name() const { return "X9.19-MAC"; } MessageAuthenticationCode* ANSI_X919_MAC::clone() const { return new ANSI_X919_MAC(e->clone()); } /* * ANSI X9.19 MAC Constructor */ ANSI_X919_MAC::ANSI_X919_MAC(BlockCipher* e_in) : e(e_in), d(e->clone()), state(e->block_size()), position(0) { if(e->name() != "DES") throw Invalid_Argument("ANSI X9.19 MAC only supports DES"); } /* * ANSI X9.19 MAC Destructor le*/ ANSI_X919_MAC::~ANSI_X919_MAC() { delete e; delete d; } } Botan-1.10.12/src/mac/x919_mac/x919_mac.h0000664000175000017500000000203212654331322017145 0ustar jackjack00000000000000/* * ANSI X9.19 MAC * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ANSI_X919_MAC_H__ #define BOTAN_ANSI_X919_MAC_H__ #include #include namespace Botan { /** * DES/3DES-based MAC from ANSI X9.19 */ class BOTAN_DLL ANSI_X919_MAC : public MessageAuthenticationCode { public: void clear(); std::string name() const; size_t output_length() const { return e->block_size(); } MessageAuthenticationCode* clone() const; Key_Length_Specification key_spec() const { return Key_Length_Specification(8, 16, 8); } /** * @param cipher the underlying block cipher to use */ ANSI_X919_MAC(BlockCipher* cipher); ~ANSI_X919_MAC(); private: void add_data(const byte[], size_t); void final_result(byte[]); void key_schedule(const byte[], size_t); BlockCipher* e; BlockCipher* d; SecureVector state; size_t position; }; } #endif Botan-1.10.12/src/math/bigint/big_code.cpp0000664000175000017500000000760612654331322020030 0ustar jackjack00000000000000/* * BigInt Encoding/Decoding * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Encode a BigInt */ void BigInt::encode(byte output[], const BigInt& n, Base base) { if(base == Binary) n.binary_encode(output); else if(base == Hexadecimal) { SecureVector binary(n.encoded_size(Binary)); n.binary_encode(&binary[0]); hex_encode(reinterpret_cast(output), &binary[0], binary.size()); } else if(base == Octal) { BigInt copy = n; const size_t output_size = n.encoded_size(Octal); for(size_t j = 0; j != output_size; ++j) { output[output_size - 1 - j] = Charset::digit2char(static_cast(copy % 8)); copy /= 8; } } else if(base == Decimal) { BigInt copy = n; BigInt remainder; copy.set_sign(Positive); const size_t output_size = n.encoded_size(Decimal); for(size_t j = 0; j != output_size; ++j) { divide(copy, 10, copy, remainder); output[output_size - 1 - j] = Charset::digit2char(static_cast(remainder.word_at(0))); if(copy.is_zero()) break; } } else throw Invalid_Argument("Unknown BigInt encoding method"); } /* * Encode a BigInt */ SecureVector BigInt::encode(const BigInt& n, Base base) { SecureVector output(n.encoded_size(base)); encode(&output[0], n, base); if(base != Binary) for(size_t j = 0; j != output.size(); ++j) if(output[j] == 0) output[j] = '0'; return output; } /* * Encode a BigInt, with leading 0s if needed */ SecureVector BigInt::encode_1363(const BigInt& n, size_t bytes) { const size_t n_bytes = n.bytes(); if(n_bytes > bytes) throw Encoding_Error("encode_1363: n is too large to encode properly"); const size_t leading_0s = bytes - n_bytes; SecureVector output(bytes); encode(&output[leading_0s], n, Binary); return output; } /* * Decode a BigInt */ BigInt BigInt::decode(const MemoryRegion& buf, Base base) { return BigInt::decode(&buf[0], buf.size(), base); } /* * Decode a BigInt */ BigInt BigInt::decode(const byte buf[], size_t length, Base base) { BigInt r; if(base == Binary) r.binary_decode(buf, length); else if(base == Hexadecimal) { SecureVector binary; if(length % 2) { // Handle lack of leading 0 const char buf0_with_leading_0[2] = { '0', static_cast(buf[0]) }; binary = hex_decode(buf0_with_leading_0, 2); binary += hex_decode(reinterpret_cast(&buf[1]), length - 1, false); } else binary = hex_decode(reinterpret_cast(buf), length, false); r.binary_decode(&binary[0], binary.size()); } else if(base == Decimal || base == Octal) { const size_t RADIX = ((base == Decimal) ? 10 : 8); for(size_t j = 0; j != length; ++j) { if(Charset::is_space(buf[j])) continue; if(!Charset::is_digit(buf[j])) throw Invalid_Argument("BigInt::decode: " "Invalid character in decimal input"); byte x = Charset::char2digit(buf[j]); if(x >= RADIX) { if(RADIX == 10) throw Invalid_Argument("BigInt: Invalid decimal string"); else throw Invalid_Argument("BigInt: Invalid octal string"); } r *= RADIX; r += x; } } else throw Invalid_Argument("Unknown BigInt decoding method"); return r; } } Botan-1.10.12/src/math/bigint/big_io.cpp0000664000175000017500000000237512654331322017523 0ustar jackjack00000000000000/* * BigInt Input/Output * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Write the BigInt into a stream */ std::ostream& operator<<(std::ostream& stream, const BigInt& n) { BigInt::Base base = BigInt::Decimal; if(stream.flags() & std::ios::hex) base = BigInt::Hexadecimal; else if(stream.flags() & std::ios::oct) base = BigInt::Octal; if(n == 0) stream.write("0", 1); else { if(n < 0) stream.write("-", 1); SecureVector buffer = BigInt::encode(n, base); size_t skip = 0; while(buffer[skip] == '0' && skip < buffer.size()) ++skip; stream.write(reinterpret_cast(&buffer[0]) + skip, buffer.size() - skip); } if(!stream.good()) throw Stream_IO_Error("BigInt output operator has failed"); return stream; } /* * Read the BigInt from a stream */ std::istream& operator>>(std::istream& stream, BigInt& n) { std::string str; std::getline(stream, str); if(stream.bad() || (stream.fail() && !stream.eof())) throw Stream_IO_Error("BigInt input operator has failed"); n = BigInt(str); return stream; } } Botan-1.10.12/src/math/bigint/big_ops2.cpp0000664000175000017500000001102112654331322017763 0ustar jackjack00000000000000/* * BigInt Assignment Operators * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Addition Operator */ BigInt& BigInt::operator+=(const BigInt& y) { const size_t x_sw = sig_words(), y_sw = y.sig_words(); const size_t reg_size = std::max(x_sw, y_sw) + 1; grow_to(reg_size); if(sign() == y.sign()) bigint_add2(get_reg(), reg_size - 1, y.data(), y_sw); else { s32bit relative_size = bigint_cmp(data(), x_sw, y.data(), y_sw); if(relative_size < 0) { SecureVector z(reg_size - 1); bigint_sub3(z, y.data(), reg_size - 1, data(), x_sw); copy_mem(®[0], &z[0], z.size()); set_sign(y.sign()); } else if(relative_size == 0) { zeroise(reg); set_sign(Positive); } else if(relative_size > 0) bigint_sub2(get_reg(), x_sw, y.data(), y_sw); } return (*this); } /* * Subtraction Operator */ BigInt& BigInt::operator-=(const BigInt& y) { const size_t x_sw = sig_words(), y_sw = y.sig_words(); s32bit relative_size = bigint_cmp(data(), x_sw, y.data(), y_sw); const size_t reg_size = std::max(x_sw, y_sw) + 1; grow_to(reg_size); if(relative_size < 0) { if(sign() == y.sign()) bigint_sub2_rev(get_reg(), y.data(), y_sw); else bigint_add2(get_reg(), reg_size - 1, y.data(), y_sw); set_sign(y.reverse_sign()); } else if(relative_size == 0) { if(sign() == y.sign()) { clear(); set_sign(Positive); } else bigint_shl1(get_reg(), x_sw, 0, 1); } else if(relative_size > 0) { if(sign() == y.sign()) bigint_sub2(get_reg(), x_sw, y.data(), y_sw); else bigint_add2(get_reg(), reg_size - 1, y.data(), y_sw); } return (*this); } /* * Multiplication Operator */ BigInt& BigInt::operator*=(const BigInt& y) { const size_t x_sw = sig_words(), y_sw = y.sig_words(); set_sign((sign() == y.sign()) ? Positive : Negative); if(x_sw == 0 || y_sw == 0) { clear(); set_sign(Positive); } else if(x_sw == 1 && y_sw) { grow_to(y_sw + 2); bigint_linmul3(get_reg(), y.data(), y_sw, word_at(0)); } else if(y_sw == 1 && x_sw) { grow_to(x_sw + 2); bigint_linmul2(get_reg(), x_sw, y.word_at(0)); } else { grow_to(size() + y.size()); SecureVector z(data(), x_sw); SecureVector workspace(size()); bigint_mul(get_reg(), size(), workspace, z, z.size(), x_sw, y.data(), y.size(), y_sw); } return (*this); } /* * Division Operator */ BigInt& BigInt::operator/=(const BigInt& y) { if(y.sig_words() == 1 && power_of_2(y.word_at(0))) (*this) >>= (y.bits() - 1); else (*this) = (*this) / y; return (*this); } /* * Modulo Operator */ BigInt& BigInt::operator%=(const BigInt& mod) { return (*this = (*this) % mod); } /* * Modulo Operator */ word BigInt::operator%=(word mod) { if(mod == 0) throw BigInt::DivideByZero(); if(power_of_2(mod)) { word result = (word_at(0) & (mod - 1)); clear(); grow_to(2); get_reg()[0] = result; return result; } word remainder = 0; for(size_t j = sig_words(); j > 0; --j) remainder = bigint_modop(remainder, word_at(j-1), mod); clear(); grow_to(2); if(remainder && sign() == BigInt::Negative) get_reg()[0] = mod - remainder; else get_reg()[0] = remainder; set_sign(BigInt::Positive); return word_at(0); } /* * Left Shift Operator */ BigInt& BigInt::operator<<=(size_t shift) { if(shift) { const size_t shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS, words = sig_words(); grow_to(words + shift_words + (shift_bits ? 1 : 0)); bigint_shl1(get_reg(), words, shift_words, shift_bits); } return (*this); } /* * Right Shift Operator */ BigInt& BigInt::operator>>=(size_t shift) { if(shift) { const size_t shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS; bigint_shr1(get_reg(), sig_words(), shift_words, shift_bits); if(is_zero()) set_sign(Positive); } return (*this); } } Botan-1.10.12/src/math/bigint/big_ops3.cpp0000664000175000017500000001050512654331322017772 0ustar jackjack00000000000000/* * BigInt Binary Operators * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * Addition Operator */ BigInt operator+(const BigInt& x, const BigInt& y) { const size_t x_sw = x.sig_words(), y_sw = y.sig_words(); BigInt z(x.sign(), std::max(x_sw, y_sw) + 1); if((x.sign() == y.sign())) bigint_add3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); else { s32bit relative_size = bigint_cmp(x.data(), x_sw, y.data(), y_sw); if(relative_size < 0) { bigint_sub3(z.get_reg(), y.data(), y_sw, x.data(), x_sw); z.set_sign(y.sign()); } else if(relative_size == 0) z.set_sign(BigInt::Positive); else if(relative_size > 0) bigint_sub3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); } return z; } /* * Subtraction Operator */ BigInt operator-(const BigInt& x, const BigInt& y) { const size_t x_sw = x.sig_words(), y_sw = y.sig_words(); s32bit relative_size = bigint_cmp(x.data(), x_sw, y.data(), y_sw); BigInt z(BigInt::Positive, std::max(x_sw, y_sw) + 1); if(relative_size < 0) { if(x.sign() == y.sign()) bigint_sub3(z.get_reg(), y.data(), y_sw, x.data(), x_sw); else bigint_add3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); z.set_sign(y.reverse_sign()); } else if(relative_size == 0) { if(x.sign() != y.sign()) bigint_shl2(z.get_reg(), x.data(), x_sw, 0, 1); } else if(relative_size > 0) { if(x.sign() == y.sign()) bigint_sub3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); else bigint_add3(z.get_reg(), x.data(), x_sw, y.data(), y_sw); z.set_sign(x.sign()); } return z; } /* * Multiplication Operator */ BigInt operator*(const BigInt& x, const BigInt& y) { const size_t x_sw = x.sig_words(), y_sw = y.sig_words(); BigInt z(BigInt::Positive, x.size() + y.size()); if(x_sw == 1 && y_sw) bigint_linmul3(z.get_reg(), y.data(), y_sw, x.word_at(0)); else if(y_sw == 1 && x_sw) bigint_linmul3(z.get_reg(), x.data(), x_sw, y.word_at(0)); else if(x_sw && y_sw) { SecureVector workspace(z.size()); bigint_mul(z.get_reg(), z.size(), workspace, x.data(), x.size(), x_sw, y.data(), y.size(), y_sw); } if(x_sw && y_sw && x.sign() != y.sign()) z.flip_sign(); return z; } /* * Division Operator */ BigInt operator/(const BigInt& x, const BigInt& y) { BigInt q, r; divide(x, y, q, r); return q; } /* * Modulo Operator */ BigInt operator%(const BigInt& n, const BigInt& mod) { if(mod.is_zero()) throw BigInt::DivideByZero(); if(mod.is_negative()) throw Invalid_Argument("BigInt::operator%: modulus must be > 0"); if(n.is_positive() && mod.is_positive() && n < mod) return n; BigInt q, r; divide(n, mod, q, r); return r; } /* * Modulo Operator */ word operator%(const BigInt& n, word mod) { if(mod == 0) throw BigInt::DivideByZero(); if(power_of_2(mod)) return (n.word_at(0) & (mod - 1)); word remainder = 0; for(size_t j = n.sig_words(); j > 0; --j) remainder = bigint_modop(remainder, n.word_at(j-1), mod); if(remainder && n.sign() == BigInt::Negative) return mod - remainder; return remainder; } /* * Left Shift Operator */ BigInt operator<<(const BigInt& x, size_t shift) { if(shift == 0) return x; const size_t shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS; const size_t x_sw = x.sig_words(); BigInt y(x.sign(), x_sw + shift_words + (shift_bits ? 1 : 0)); bigint_shl2(y.get_reg(), x.data(), x_sw, shift_words, shift_bits); return y; } /* * Right Shift Operator */ BigInt operator>>(const BigInt& x, size_t shift) { if(shift == 0) return x; if(x.bits() <= shift) return 0; const size_t shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS, x_sw = x.sig_words(); BigInt y(x.sign(), x_sw - shift_words); bigint_shr2(y.get_reg(), x.data(), x_sw, shift_words, shift_bits); return y; } } Botan-1.10.12/src/math/bigint/big_rand.cpp0000664000175000017500000000236612654331322020040 0ustar jackjack00000000000000/* * BigInt Random Generation * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Construct a BigInt of a specific form */ BigInt::BigInt(NumberType type, size_t bits) { set_sign(Positive); if(type == Power2) set_bit(bits); else throw Invalid_Argument("BigInt(NumberType): Unknown type"); } /* * Randomize this number */ void BigInt::randomize(RandomNumberGenerator& rng, size_t bitsize) { set_sign(Positive); if(bitsize == 0) clear(); else { SecureVector array = rng.random_vec((bitsize + 7) / 8); if(bitsize % 8) array[0] &= 0xFF >> (8 - (bitsize % 8)); array[0] |= 0x80 >> ((bitsize % 8) ? (8 - bitsize % 8) : 0); binary_decode(&array[0], array.size()); } } /* * Generate a random integer within given range */ BigInt BigInt::random_integer(RandomNumberGenerator& rng, const BigInt& min, const BigInt& max) { BigInt range = max - min; if(range <= 0) throw Invalid_Argument("random_integer: invalid min/max values"); return (min + (BigInt(rng, range.bits() + 2) % range)); } } Botan-1.10.12/src/math/bigint/bigint.cpp0000664000175000017500000001736312654331322017552 0ustar jackjack00000000000000/* * BigInt Base * (C) 1999-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * Construct a BigInt from a regular number */ BigInt::BigInt(u64bit n) { set_sign(Positive); if(n == 0) return; const size_t limbs_needed = sizeof(u64bit) / sizeof(word); reg.resize(4*limbs_needed); for(size_t i = 0; i != limbs_needed; ++i) reg[i] = ((n >> (i*MP_WORD_BITS)) & MP_WORD_MASK); } /* * Construct a BigInt of the specified size */ BigInt::BigInt(Sign s, size_t size) { reg.resize(round_up(size, 8)); signedness = s; } /* * Construct a BigInt from a "raw" BigInt */ BigInt::BigInt(const BigInt& b) { const size_t b_words = b.sig_words(); if(b_words) { reg.resize(round_up(b_words, 8)); reg.copy(b.data(), b_words); set_sign(b.sign()); } else { reg.resize(2); set_sign(Positive); } } /* * Construct a BigInt from a string */ BigInt::BigInt(const std::string& str) { Base base = Decimal; size_t markers = 0; bool negative = false; if(str.length() > 0 && str[0] == '-') { markers += 1; negative = true; } if(str.length() > markers + 2 && str[markers ] == '0' && str[markers + 1] == 'x') { markers += 2; base = Hexadecimal; } else if(str.length() > markers + 1 && str[markers] == '0') { markers += 1; base = Octal; } *this = decode(reinterpret_cast(str.data()) + markers, str.length() - markers, base); if(negative) set_sign(Negative); else set_sign(Positive); } /* * Construct a BigInt from an encoded BigInt */ BigInt::BigInt(const byte input[], size_t length, Base base) { set_sign(Positive); *this = decode(input, length, base); } /* * Construct a BigInt from an encoded BigInt */ BigInt::BigInt(RandomNumberGenerator& rng, size_t bits) { set_sign(Positive); randomize(rng, bits); } /* * Swap this BigInt with another */ void BigInt::swap(BigInt& other) { reg.swap(other.reg); std::swap(signedness, other.signedness); } /* * Grow the internal storage */ void BigInt::grow_reg(size_t n) { reg.resize(round_up(size() + n, 8)); } /* * Grow the internal storage */ void BigInt::grow_to(size_t n) { if(n > size()) reg.resize(round_up(n, 8)); } /* * Comparison Function */ s32bit BigInt::cmp(const BigInt& n, bool check_signs) const { if(check_signs) { if(n.is_positive() && this->is_negative()) return -1; if(n.is_negative() && this->is_positive()) return 1; if(n.is_negative() && this->is_negative()) return (-bigint_cmp(data(), sig_words(), n.data(), n.sig_words())); } return bigint_cmp(data(), sig_words(), n.data(), n.sig_words()); } /* * Return byte n of this number */ byte BigInt::byte_at(size_t n) const { const size_t WORD_BYTES = sizeof(word); size_t word_num = n / WORD_BYTES, byte_num = n % WORD_BYTES; if(word_num >= size()) return 0; else return get_byte(WORD_BYTES - byte_num - 1, reg[word_num]); } /* * Return bit n of this number */ bool BigInt::get_bit(size_t n) const { return ((word_at(n / MP_WORD_BITS) >> (n % MP_WORD_BITS)) & 1); } /* * Return bits {offset...offset+length} */ u32bit BigInt::get_substring(size_t offset, size_t length) const { if(length > 32) throw Invalid_Argument("BigInt::get_substring: Substring size too big"); u64bit piece = 0; for(size_t i = 0; i != 8; ++i) { const byte part = byte_at((offset / 8) + (7-i)); piece = (piece << 8) | part; } const u64bit mask = (static_cast(1) << length) - 1; const size_t shift = (offset % 8); return static_cast((piece >> shift) & mask); } /* * Convert this number to a u32bit, if possible */ u32bit BigInt::to_u32bit() const { if(is_negative()) throw Encoding_Error("BigInt::to_u32bit: Number is negative"); if(bits() > 32) throw Encoding_Error("BigInt::to_u32bit: Number is too big to convert"); u32bit out = 0; for(u32bit j = 0; j != 4; ++j) out = (out << 8) | byte_at(3-j); return out; } /* * Set bit number n */ void BigInt::set_bit(size_t n) { const size_t which = n / MP_WORD_BITS; const word mask = static_cast(1) << (n % MP_WORD_BITS); if(which >= size()) grow_to(which + 1); reg[which] |= mask; } /* * Clear bit number n */ void BigInt::clear_bit(size_t n) { const size_t which = n / MP_WORD_BITS; const word mask = static_cast(1) << (n % MP_WORD_BITS); if(which < size()) reg[which] &= ~mask; } /* * Clear all but the lowest n bits */ void BigInt::mask_bits(size_t n) { if(n == 0) { clear(); return; } if(n >= bits()) return; const size_t top_word = n / MP_WORD_BITS; const word mask = (static_cast(1) << (n % MP_WORD_BITS)) - 1; if(top_word < size()) for(size_t i = top_word + 1; i != size(); ++i) reg[i] = 0; reg[top_word] &= mask; } /* * Count how many bytes are being used */ size_t BigInt::bytes() const { return (bits() + 7) / 8; } /* * Count how many bits are being used */ size_t BigInt::bits() const { const size_t words = sig_words(); if(words == 0) return 0; size_t full_words = words - 1, top_bits = MP_WORD_BITS; word top_word = word_at(full_words), mask = MP_WORD_TOP_BIT; while(top_bits && ((top_word & mask) == 0)) { mask >>= 1; top_bits--; } return (full_words * MP_WORD_BITS + top_bits); } /* * Calcluate the size in a certain base */ size_t BigInt::encoded_size(Base base) const { static const double LOG_2_BASE_10 = 0.30102999566; if(base == Binary) return bytes(); else if(base == Hexadecimal) return 2*bytes(); else if(base == Octal) return ((bits() + 2) / 3); else if(base == Decimal) return static_cast((bits() * LOG_2_BASE_10) + 1); else throw Invalid_Argument("Unknown base for BigInt encoding"); } /* * Set the sign */ void BigInt::set_sign(Sign s) { if(is_zero()) signedness = Positive; else signedness = s; } /* * Reverse the value of the sign flag */ void BigInt::flip_sign() { set_sign(reverse_sign()); } /* * Return the opposite value of the current sign */ BigInt::Sign BigInt::reverse_sign() const { if(sign() == Positive) return Negative; return Positive; } /* * Return the negation of this number */ BigInt BigInt::operator-() const { BigInt x = (*this); x.flip_sign(); return x; } /* * Return the absolute value of this number */ BigInt BigInt::abs() const { BigInt x = (*this); x.set_sign(Positive); return x; } /* * Encode this number into bytes */ void BigInt::binary_encode(byte output[]) const { const size_t sig_bytes = bytes(); for(size_t i = 0; i != sig_bytes; ++i) output[sig_bytes-i-1] = byte_at(i); } /* * Set this number to the value in buf */ void BigInt::binary_decode(const byte buf[], size_t length) { const size_t WORD_BYTES = sizeof(word); clear(); reg.resize(round_up((length / WORD_BYTES) + 1, 8)); for(size_t i = 0; i != length / WORD_BYTES; ++i) { const size_t top = length - WORD_BYTES*i; for(size_t j = WORD_BYTES; j > 0; --j) reg[i] = (reg[i] << 8) | buf[top - j]; } for(size_t i = 0; i != length % WORD_BYTES; ++i) reg[length / WORD_BYTES] = (reg[length / WORD_BYTES] << 8) | buf[i]; } /* * Set this number to the value in buf */ void BigInt::binary_decode(const MemoryRegion& buf) { binary_decode(buf, buf.size()); } } Botan-1.10.12/src/math/bigint/bigint.h0000664000175000017500000003550012654331322017210 0ustar jackjack00000000000000/* * BigInt * (C) 1999-2008 Jack Lloyd * 2007 FlexSecure * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BIGINT_H__ #define BOTAN_BIGINT_H__ #include #include #include #include namespace Botan { /** * Arbitrary precision integer */ class BOTAN_DLL BigInt { public: /** * Base enumerator for encoding and decoding */ enum Base { Octal = 8, Decimal = 10, Hexadecimal = 16, Binary = 256 }; /** * Sign symbol definitions for positive and negative numbers */ enum Sign { Negative = 0, Positive = 1 }; /** * Number types (currently only power-of-2 supported) */ enum NumberType { Power2 }; /** * DivideByZero Exception */ struct BOTAN_DLL DivideByZero : public Exception { DivideByZero() : Exception("BigInt divide by zero") {} }; /** * += operator * @param y the BigInt to add to this */ BigInt& operator+=(const BigInt& y); /** * -= operator * @param y the BigInt to subtract from this */ BigInt& operator-=(const BigInt& y); /** * *= operator * @param y the BigInt to multiply with this */ BigInt& operator*=(const BigInt& y); /** * /= operator * @param y the BigInt to divide this by */ BigInt& operator/=(const BigInt& y); /** * Modulo operator * @param y the modulus to reduce this by */ BigInt& operator%=(const BigInt& y); /** * Modulo operator * @param y the modulus (word) to reduce this by */ word operator%=(word y); /** * Left shift operator * @param shift the number of bits to shift this left by */ BigInt& operator<<=(size_t shift); /** * Right shift operator * @param shift the number of bits to shift this right by */ BigInt& operator>>=(size_t shift); /** * Increment operator */ BigInt& operator++() { return (*this += 1); } /** * Decrement operator */ BigInt& operator--() { return (*this -= 1); } /** * Postfix increment operator */ BigInt operator++(int) { BigInt x = (*this); ++(*this); return x; } /** * Postfix decrement operator */ BigInt operator--(int) { BigInt x = (*this); --(*this); return x; } /** * Unary negation operator * @return negative this */ BigInt operator-() const; /** * ! operator * @return true iff this is zero, otherwise false */ bool operator !() const { return (!is_nonzero()); } /** * [] operator (array access) * @param i a word index * @return the word at index i */ word& operator[](size_t i) { return reg[i]; } /** * [] operator (array access) * @param i a word index * @return the word at index i */ const word& operator[](size_t i) const { return reg[i]; } /** * Zeroize the BigInt */ void clear() { zeroise(reg); } /** * Compare this to another BigInt * @param n the BigInt value to compare with * @param check_signs include sign in comparison? * @result if (thisn) return 1, if both * values are identical return 0 [like Perl's <=> operator] */ s32bit cmp(const BigInt& n, bool check_signs = true) const; /** * Test if the integer has an even value * @result true if the integer is even, false otherwise */ bool is_even() const { return (get_bit(0) == 0); } /** * Test if the integer has an odd value * @result true if the integer is odd, false otherwise */ bool is_odd() const { return (get_bit(0) == 1); } /** * Test if the integer is not zero * @result true if the integer is non-zero, false otherwise */ bool is_nonzero() const { return (!is_zero()); } /** * Test if the integer is zero * @result true if the integer is zero, false otherwise */ bool is_zero() const { const size_t sw = sig_words(); for(size_t i = 0; i != sw; ++i) if(reg[i]) return false; return true; } /** * Set bit at specified position * @param n bit position to set */ void set_bit(size_t n); /** * Clear bit at specified position * @param n bit position to clear */ void clear_bit(size_t n); /** * Clear all but the lowest n bits * @param n amount of bits to keep */ void mask_bits(size_t n); /** * Return bit value at specified position * @param n the bit offset to test * @result true, if the bit at position n is set, false otherwise */ bool get_bit(size_t n) const; /** * Return (a maximum of) 32 bits of the complete value * @param offset the offset to start extracting * @param length amount of bits to extract (starting at offset) * @result the integer extracted from the register starting at * offset with specified length */ u32bit get_substring(size_t offset, size_t length) const; /** * Convert this value into a u32bit, if it is in the range * [0 ... 2**32-1], or otherwise throw an exception. * @result the value as a u32bit if conversion is possible */ u32bit to_u32bit() const; /** * @param n the offset to get a byte from * @result byte at offset n */ byte byte_at(size_t n) const; /** * Return the word at a specified position of the internal register * @param n position in the register * @return value at position n */ word word_at(size_t n) const { return ((n < size()) ? reg[n] : 0); } /** * Tests if the sign of the integer is negative * @result true, iff the integer has a negative sign */ bool is_negative() const { return (sign() == Negative); } /** * Tests if the sign of the integer is positive * @result true, iff the integer has a positive sign */ bool is_positive() const { return (sign() == Positive); } /** * Return the sign of the integer * @result the sign of the integer */ Sign sign() const { return (signedness); } /** * @result the opposite sign of the represented integer value */ Sign reverse_sign() const; /** * Flip the sign of this BigInt */ void flip_sign(); /** * Set sign of the integer * @param sign new Sign to set */ void set_sign(Sign sign); /** * @result absolute (positive) value of this */ BigInt abs() const; /** * Give size of internal register * @result size of internal register in words */ size_t size() const { return get_reg().size(); } /** * Return how many words we need to hold this value * @result significant words of the represented integer value */ size_t sig_words() const { const word* x = ®[0]; size_t sig = reg.size(); while(sig && (x[sig-1] == 0)) sig--; return sig; } /** * Give byte length of the integer * @result byte length of the represented integer value */ size_t bytes() const; /** * Get the bit length of the integer * @result bit length of the represented integer value */ size_t bits() const; /** * Return a pointer to the big integer word register * @result a pointer to the start of the internal register of * the integer value */ const word* data() const { return ®[0]; } /** * return a reference to the internal register containing the value * @result a reference to the word-array (SecureVector) * with the internal register value (containing the integer * value) */ SecureVector& get_reg() { return reg; } /** * return a const reference to the internal register containing the value * @result a const reference to the word-array (SecureVector) * with the internal register value (containing the integer value) */ const SecureVector& get_reg() const { return reg; } /** * Assign using a plain word array */ void assign(const word x[], size_t length) { reg.resize(length); copy_mem(®[0], x, length); } /** * Increase internal register buffer by n words * @param n increase by n words */ void grow_reg(size_t n); void grow_to(size_t n); /** * Fill BigInt with a random number with size of bitsize * @param rng the random number generator to use * @param bitsize number of bits the created random value should have */ void randomize(RandomNumberGenerator& rng, size_t bitsize = 0); /** * Store BigInt-value in a given byte array * @param buf destination byte array for the integer value */ void binary_encode(byte buf[]) const; /** * Read integer value from a byte array with given size * @param buf byte array buffer containing the integer * @param length size of buf */ void binary_decode(const byte buf[], size_t length); /** * Read integer value from a byte array (MemoryRegion) * @param buf the array to load from */ void binary_decode(const MemoryRegion& buf); /** * @param base the base to measure the size for * @return size of this integer in base base */ size_t encoded_size(Base base = Binary) const; /** * @param rng a random number generator * @param min the minimum value * @param max the maximum value * @return random integer between min and max */ static BigInt random_integer(RandomNumberGenerator& rng, const BigInt& min, const BigInt& max); /** * Encode the integer value from a BigInt to a SecureVector of bytes * @param n the BigInt to use as integer source * @param base number-base of resulting byte array representation * @result SecureVector of bytes containing the integer with given base */ static SecureVector encode(const BigInt& n, Base base = Binary); /** * Encode the integer value from a BigInt to a byte array * @param buf destination byte array for the encoded integer * value with given base * @param n the BigInt to use as integer source * @param base number-base of resulting byte array representation */ static void encode(byte buf[], const BigInt& n, Base base = Binary); /** * Create a BigInt from an integer in a byte array * @param buf the binary value to load * @param length size of buf * @param base number-base of the integer in buf * @result BigInt representing the integer in the byte array */ static BigInt decode(const byte buf[], size_t length, Base base = Binary); /** * Create a BigInt from an integer in a byte array * @param buf the binary value to load * @param base number-base of the integer in buf * @result BigInt representing the integer in the byte array */ static BigInt decode(const MemoryRegion& buf, Base base = Binary); /** * Encode a BigInt to a byte array according to IEEE 1363 * @param n the BigInt to encode * @param bytes the length of the resulting SecureVector * @result a SecureVector containing the encoded BigInt */ static SecureVector encode_1363(const BigInt& n, size_t bytes); /** * Swap this value with another * @param other BigInt to swap values with */ void swap(BigInt& other); /** * Create empty BigInt */ BigInt() { signedness = Positive; } /** * Create BigInt from 64 bit integer * @param n initial value of this BigInt */ BigInt(u64bit n); /** * Copy Constructor * @param other the BigInt to copy */ BigInt(const BigInt& other); /** * Create BigInt from a string. If the string starts with 0x the * rest of the string will be interpreted as hexadecimal digits. * If the string starts with 0 and the second character is NOT an * 'x' the string will be interpreted as octal digits. If the * string starts with non-zero digit, it will be interpreted as a * decimal number. * * @param str the string to parse for an integer value */ BigInt(const std::string& str); /** * Create a BigInt from an integer in a byte array * @param buf the byte array holding the value * @param length size of buf * @param base is the number base of the integer in buf */ BigInt(const byte buf[], size_t length, Base base = Binary); /** * Create a random BigInt of the specified size * @param rng random number generator * @param bits size in bits */ BigInt(RandomNumberGenerator& rng, size_t bits); /** * Create BigInt of specified size, all zeros * @param sign the sign * @param n size of the internal register in words */ BigInt(Sign sign, size_t n); /** * Create a number of the specified type and size * @param type the type of number to create. For Power2, * will create the integer 2^n * @param n a size/length parameter, interpretation depends upon * the value of type */ BigInt(NumberType type, size_t n); private: SecureVector reg; Sign signedness; }; /* * Arithmetic Operators */ BigInt BOTAN_DLL operator+(const BigInt& x, const BigInt& y); BigInt BOTAN_DLL operator-(const BigInt& x, const BigInt& y); BigInt BOTAN_DLL operator*(const BigInt& x, const BigInt& y); BigInt BOTAN_DLL operator/(const BigInt& x, const BigInt& d); BigInt BOTAN_DLL operator%(const BigInt& x, const BigInt& m); word BOTAN_DLL operator%(const BigInt& x, word m); BigInt BOTAN_DLL operator<<(const BigInt& x, size_t n); BigInt BOTAN_DLL operator>>(const BigInt& x, size_t n); /* * Comparison Operators */ inline bool operator==(const BigInt& a, const BigInt& b) { return (a.cmp(b) == 0); } inline bool operator!=(const BigInt& a, const BigInt& b) { return (a.cmp(b) != 0); } inline bool operator<=(const BigInt& a, const BigInt& b) { return (a.cmp(b) <= 0); } inline bool operator>=(const BigInt& a, const BigInt& b) { return (a.cmp(b) >= 0); } inline bool operator<(const BigInt& a, const BigInt& b) { return (a.cmp(b) < 0); } inline bool operator>(const BigInt& a, const BigInt& b) { return (a.cmp(b) > 0); } /* * I/O Operators */ BOTAN_DLL std::ostream& operator<<(std::ostream&, const BigInt&); BOTAN_DLL std::istream& operator>>(std::istream&, BigInt&); } namespace std { template<> inline void swap(Botan::BigInt& x, Botan::BigInt& y) { x.swap(y); } } #endif Botan-1.10.12/src/math/bigint/divide.cpp0000664000175000017500000000433712654331322017537 0ustar jackjack00000000000000/* * Division Algorithm * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { /* * Handle signed operands, if necessary */ void sign_fixup(const BigInt& x, const BigInt& y, BigInt& q, BigInt& r) { if(x.sign() == BigInt::Negative) { q.flip_sign(); if(r.is_nonzero()) { --q; r = y.abs() - r; } } if(y.sign() == BigInt::Negative) q.flip_sign(); } } /* * Solve x = q * y + r */ void divide(const BigInt& x, const BigInt& y_arg, BigInt& q, BigInt& r) { if(y_arg.is_zero()) throw BigInt::DivideByZero(); BigInt y = y_arg; const size_t y_words = y.sig_words(); r = x; q = 0; r.set_sign(BigInt::Positive); y.set_sign(BigInt::Positive); s32bit compare = r.cmp(y); if(compare == 0) { q = 1; r = 0; } else if(compare > 0) { size_t shifts = 0; word y_top = y[y.sig_words()-1]; while(y_top < MP_WORD_TOP_BIT) { y_top <<= 1; ++shifts; } y <<= shifts; r <<= shifts; const size_t n = r.sig_words() - 1, t = y_words - 1; if(n < t) throw Internal_Error("BigInt division word sizes"); q.get_reg().resize(n - t + 1); if(n <= t) { while(r > y) { r -= y; ++q; } r >>= shifts; sign_fixup(x, y_arg, q, r); return; } BigInt temp = y << (MP_WORD_BITS * (n-t)); while(r >= temp) { r -= temp; ++q[n-t]; } for(size_t j = n; j != t; --j) { const word x_j0 = r.word_at(j); const word x_j1 = r.word_at(j-1); const word y_t = y.word_at(t); if(x_j0 == y_t) q[j-t-1] = MP_WORD_MAX; else q[j-t-1] = bigint_divop(x_j0, x_j1, y_t); while(bigint_divcore(q[j-t-1], y_t, y.word_at(t-1), x_j0, x_j1, r.word_at(j-2))) --q[j-t-1]; r -= (q[j-t-1] * y) << (MP_WORD_BITS * (j-t-1)); if(r.is_negative()) { r += y << (MP_WORD_BITS * (j-t-1)); --q[j-t-1]; } } r >>= shifts; } sign_fixup(x, y_arg, q, r); } } Botan-1.10.12/src/math/bigint/divide.h0000664000175000017500000000100212654331322017166 0ustar jackjack00000000000000/* * Division * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DIVISON_ALGORITHM_H__ #define BOTAN_DIVISON_ALGORITHM_H__ #include namespace Botan { /** * BigInt Division * @param x an integer * @param y a non-zero integer * @param q will be set to x / y * @param r will be set to x % y */ void BOTAN_DLL divide(const BigInt& x, const BigInt& y, BigInt& q, BigInt& r); } #endif Botan-1.10.12/src/math/bigint/info.txt0000664000175000017500000000034212654331322017253 0ustar jackjack00000000000000load_on auto define BIGINT bigint.h divide.h big_code.cpp big_io.cpp big_ops2.cpp big_ops3.cpp big_rand.cpp bigint.cpp divide.cpp alloc mp hex rng Botan-1.10.12/src/math/ec_gfp/curve_gfp.h0000664000175000017500000000677112654331322017673 0ustar jackjack00000000000000/* * Elliptic curves over GF(p) * * (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke * 2010-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_GFP_CURVE_H__ #define BOTAN_GFP_CURVE_H__ #include namespace Botan { /** * This class represents an elliptic curve over GF(p) */ class BOTAN_DLL CurveGFp { public: /** * Create an uninitialized CurveGFp */ CurveGFp() : p_words(0), p_dash(0) {} /** * Construct the elliptic curve E: y^2 = x^3 + ax + b over GF(p) * @param p prime number of the field * @param a first coefficient * @param b second coefficient */ CurveGFp(const BigInt& p, const BigInt& a, const BigInt& b) : p(p), a(a), b(b), p_words(p.sig_words()) { BigInt r(BigInt::Power2, p_words * BOTAN_MP_WORD_BITS); p_dash = (((r * inverse_mod(r, p)) - 1) / p).word_at(0); r2 = (r * r) % p; a_r = (a * r) % p; b_r = (b * r) % p; } // CurveGFp(const CurveGFp& other) = default; // CurveGFp& operator=(const CurveGFp& other) = default; /** * @return curve coefficient a */ const BigInt& get_a() const { return a; } /** * @return curve coefficient b */ const BigInt& get_b() const { return b; } /** * Get prime modulus of the field of the curve * @return prime modulus of the field of the curve */ const BigInt& get_p() const { return p; } /** * @return Montgomery parameter r^2 % p */ const BigInt& get_r2() const { return r2; } /** * @return a * r mod p */ const BigInt& get_a_r() const { return a_r; } /** * @return b * r mod p */ const BigInt& get_b_r() const { return b_r; } /** * @return Montgomery parameter p-dash */ word get_p_dash() const { return p_dash; } /** * @return p.sig_words() */ size_t get_p_words() const { return p_words; } /** * swaps the states of *this and other, does not throw * @param other curve to swap values with */ void swap(CurveGFp& other) { std::swap(p, other.p); std::swap(a, other.a); std::swap(b, other.b); std::swap(a_r, other.a_r); std::swap(b_r, other.b_r); std::swap(p_words, other.p_words); std::swap(r2, other.r2); std::swap(p_dash, other.p_dash); } /** * Equality operator * @param other curve to compare with * @return true iff this is the same curve as other */ bool operator==(const CurveGFp& other) const { /* Relies on choice of R, but that is fixed by constructor based on size of p */ return (p == other.p && a_r == other.a_r && b_r == other.b_r); } private: // Curve parameters BigInt p, a, b; size_t p_words; // cache of p.sig_words() // Montgomery parameters BigInt r2, a_r, b_r; word p_dash; }; /** * Equality operator * @param lhs a curve * @param rhs a curve * @return true iff lhs is not the same as rhs */ inline bool operator!=(const CurveGFp& lhs, const CurveGFp& rhs) { return !(lhs == rhs); } } namespace std { template<> inline void swap(Botan::CurveGFp& curve1, Botan::CurveGFp& curve2) { curve1.swap(curve2); } } // namespace std #endif Botan-1.10.12/src/math/ec_gfp/info.txt0000664000175000017500000000024312654331322017222 0ustar jackjack00000000000000define EC_CURVE_GFP load_on auto curve_gfp.h point_gfp.h point_gfp.cpp numbertheory Botan-1.10.12/src/math/ec_gfp/point_gfp.cpp0000664000175000017500000003143112654331322020222 0ustar jackjack00000000000000/* * Point arithmetic on elliptic curves over GF(p) * * (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke * 2008-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { PointGFp::PointGFp(const CurveGFp& curve) : curve(curve), ws(2 * (curve.get_p_words() + 2)) { coord_x = 0; coord_y = monty_mult(1, curve.get_r2()); coord_z = 0; } PointGFp::PointGFp(const CurveGFp& curve, const BigInt& x, const BigInt& y) : curve(curve), ws(2 * (curve.get_p_words() + 2)) { if(x <= 0 || x >= curve.get_p()) throw Invalid_Argument("Invalid PointGFp x"); if(y <= 0 || y >= curve.get_p()) throw Invalid_Argument("Invalid PointGFp y"); coord_x = monty_mult(x, curve.get_r2()); coord_y = monty_mult(y, curve.get_r2()); coord_z = monty_mult(1, curve.get_r2()); } // Montgomery multiplication void PointGFp::monty_mult(BigInt& z, const BigInt& x, const BigInt& y) const { //assert(&z != &x && &z != &y); if(x.is_zero() || y.is_zero()) { z = 0; return; } const BigInt& p = curve.get_p(); const size_t p_size = curve.get_p_words(); const word p_dash = curve.get_p_dash(); SecureVector& z_reg = z.get_reg(); z_reg.resize(2*p_size+1); zeroise(z_reg); bigint_monty_mul(&z_reg[0], z_reg.size(), x.data(), x.size(), x.sig_words(), y.data(), y.size(), y.sig_words(), p.data(), p_size, p_dash, &ws[0]); } // Montgomery squaring void PointGFp::monty_sqr(BigInt& z, const BigInt& x) const { //assert(&z != &x); if(x.is_zero()) { z = 0; return; } const BigInt& p = curve.get_p(); const word p_dash = curve.get_p_dash(); const size_t p_size = curve.get_p_words(); const size_t x_sw = x.sig_words(); BOTAN_ASSERT(x_sw <= p_size, "x value in range"); SecureVector& z_reg = z.get_reg(); z_reg.resize(2*p_size+1); zeroise(z_reg); bigint_monty_sqr(&z_reg[0], z_reg.size(), x.data(), x.size(), x_sw, p.data(), p_size, p_dash, &ws[0]); } // Point addition void PointGFp::add(const PointGFp& rhs, std::vector& ws_bn) { if(is_zero()) { coord_x = rhs.coord_x; coord_y = rhs.coord_y; coord_z = rhs.coord_z; return; } else if(rhs.is_zero()) return; const BigInt& p = curve.get_p(); BigInt& rhs_z2 = ws_bn[0]; BigInt& U1 = ws_bn[1]; BigInt& S1 = ws_bn[2]; BigInt& lhs_z2 = ws_bn[3]; BigInt& U2 = ws_bn[4]; BigInt& S2 = ws_bn[5]; BigInt& H = ws_bn[6]; BigInt& r = ws_bn[7]; monty_sqr(rhs_z2, rhs.coord_z); monty_mult(U1, coord_x, rhs_z2); monty_mult(S1, coord_y, monty_mult(rhs.coord_z, rhs_z2)); monty_sqr(lhs_z2, coord_z); monty_mult(U2, rhs.coord_x, lhs_z2); monty_mult(S2, rhs.coord_y, monty_mult(coord_z, lhs_z2)); H = U2; H -= U1; if(H.is_negative()) H += p; r = S2; r -= S1; if(r.is_negative()) r += p; if(H.is_zero()) { if(r.is_zero()) { mult2(ws_bn); return; } *this = PointGFp(curve); // setting myself to zero return; } monty_sqr(U2, H); monty_mult(S2, U2, H); U2 = monty_mult(U1, U2); monty_sqr(coord_x, r); coord_x -= S2; coord_x -= (U2 << 1); while(coord_x.is_negative()) coord_x += p; U2 -= coord_x; if(U2.is_negative()) U2 += p; monty_mult(coord_y, r, U2); coord_y -= monty_mult(S1, S2); if(coord_y.is_negative()) coord_y += p; monty_mult(coord_z, monty_mult(coord_z, rhs.coord_z), H); } // *this *= 2 void PointGFp::mult2(std::vector& ws_bn) { if(is_zero()) return; else if(coord_y.is_zero()) { *this = PointGFp(curve); // setting myself to zero return; } const BigInt& p = curve.get_p(); BigInt& y_2 = ws_bn[0]; BigInt& S = ws_bn[1]; BigInt& z4 = ws_bn[2]; BigInt& a_z4 = ws_bn[3]; BigInt& M = ws_bn[4]; BigInt& U = ws_bn[5]; BigInt& x = ws_bn[6]; BigInt& y = ws_bn[7]; BigInt& z = ws_bn[8]; monty_sqr(y_2, coord_y); monty_mult(S, coord_x, y_2); S <<= 2; // * 4 while(S >= p) S -= p; monty_sqr(z4, monty_sqr(coord_z)); monty_mult(a_z4, curve.get_a_r(), z4); M = 3 * monty_sqr(coord_x); M += a_z4; while(M >= p) M -= p; monty_sqr(x, M); x -= (S << 1); while(x.is_negative()) x += p; monty_sqr(U, y_2); U <<= 3; while(U >= p) U -= p; S -= x; while(S.is_negative()) S += p; monty_mult(y, M, S); y -= U; if(y.is_negative()) y += p; monty_mult(z, coord_y, coord_z); z <<= 1; if(z >= p) z -= p; coord_x = x; coord_y = y; coord_z = z; } // arithmetic operators PointGFp& PointGFp::operator+=(const PointGFp& rhs) { std::vector ws(9); add(rhs, ws); return *this; } PointGFp& PointGFp::operator-=(const PointGFp& rhs) { PointGFp minus_rhs = PointGFp(rhs).negate(); if(is_zero()) *this = minus_rhs; else *this += minus_rhs; return *this; } PointGFp& PointGFp::operator*=(const BigInt& scalar) { *this = scalar * *this; return *this; } PointGFp multi_exponentiate(const PointGFp& p1, const BigInt& z1, const PointGFp& p2, const BigInt& z2) { const PointGFp p3 = p1 + p2; PointGFp H(p1.curve); // create as zero size_t bits_left = std::max(z1.bits(), z2.bits()); std::vector ws(9); while(bits_left) { H.mult2(ws); const bool z1_b = z1.get_bit(bits_left - 1); const bool z2_b = z2.get_bit(bits_left - 1); if(z1_b == true && z2_b == true) H.add(p3, ws); else if(z1_b) H.add(p1, ws); else if(z2_b) H.add(p2, ws); --bits_left; } if(z1.is_negative() != z2.is_negative()) H.negate(); return H; } PointGFp operator*(const BigInt& scalar, const PointGFp& point) { const CurveGFp& curve = point.get_curve(); if(scalar.is_zero()) return PointGFp(curve); // zero point std::vector ws(9); if(scalar.abs() <= 2) // special cases for small values { byte value = scalar.abs().byte_at(0); PointGFp result = point; if(value == 2) result.mult2(ws); if(scalar.is_negative()) result.negate(); return result; } const size_t scalar_bits = scalar.bits(); #if 0 PointGFp x1 = PointGFp(curve); PointGFp x2 = point; size_t bits_left = scalar_bits; // Montgomery Ladder while(bits_left) { const bool bit_set = scalar.get_bit(bits_left - 1); if(bit_set) { x1.add(x2, ws); x2.mult2(ws); } else { x2.add(x1, ws); x1.mult2(ws); } --bits_left; } if(scalar.is_negative()) x1.negate(); return x1; #else const size_t window_size = 4; std::vector Ps(1 << window_size); Ps[0] = PointGFp(curve); Ps[1] = point; for(size_t i = 2; i != Ps.size(); ++i) { Ps[i] = Ps[i-1]; Ps[i].add(point, ws); } PointGFp H(curve); // create as zero size_t bits_left = scalar_bits; while(bits_left >= window_size) { for(size_t i = 0; i != window_size; ++i) H.mult2(ws); const u32bit nibble = scalar.get_substring(bits_left - window_size, window_size); H.add(Ps[nibble], ws); bits_left -= window_size; } while(bits_left) { H.mult2(ws); if(scalar.get_bit(bits_left-1)) H.add(point, ws); --bits_left; } if(scalar.is_negative()) H.negate(); return H; #endif } BigInt PointGFp::get_affine_x() const { if(is_zero()) throw Illegal_Transformation("Cannot convert zero point to affine"); const BigInt& r2 = curve.get_r2(); BigInt z2 = monty_sqr(coord_z); z2 = inverse_mod(z2, curve.get_p()); z2 = monty_mult(z2, r2); return monty_mult(coord_x, z2); } BigInt PointGFp::get_affine_y() const { if(is_zero()) throw Illegal_Transformation("Cannot convert zero point to affine"); const BigInt& r2 = curve.get_r2(); BigInt z3 = monty_mult(coord_z, monty_sqr(coord_z)); z3 = inverse_mod(z3, curve.get_p()); z3 = monty_mult(z3, r2); return monty_mult(coord_y, z3); } bool PointGFp::on_the_curve() const { /* Is the point still on the curve?? (If everything is correct, the point is always on its curve; then the function will return true. If somehow the state is corrupted, which suggests a fault attack (or internal computational error), then return false. */ if(is_zero()) return true; BigInt y2 = monty_mult(monty_sqr(coord_y), 1); BigInt x3 = monty_mult(coord_x, monty_sqr(coord_x)); BigInt ax = monty_mult(coord_x, curve.get_a_r()); const BigInt& b_r = curve.get_b_r(); BigInt z2 = monty_sqr(coord_z); if(coord_z == z2) // Is z equal to 1 (in Montgomery form)? { if(y2 != monty_mult(x3 + ax + b_r, 1)) return false; } BigInt z3 = monty_mult(coord_z, z2); BigInt ax_z4 = monty_mult(ax, monty_sqr(z2)); BigInt b_z6 = monty_mult(b_r, monty_sqr(z3)); if(y2 != monty_mult(x3 + ax_z4 + b_z6, 1)) return false; return true; } // swaps the states of *this and other, does not throw! void PointGFp::swap(PointGFp& other) { curve.swap(other.curve); coord_x.swap(other.coord_x); coord_y.swap(other.coord_y); coord_z.swap(other.coord_z); ws.swap(other.ws); } bool PointGFp::operator==(const PointGFp& other) const { if(get_curve() != other.get_curve()) return false; // If this is zero, only equal if other is also zero if(is_zero()) return other.is_zero(); return (get_affine_x() == other.get_affine_x() && get_affine_y() == other.get_affine_y()); } // encoding and decoding SecureVector EC2OSP(const PointGFp& point, byte format) { if(point.is_zero()) return SecureVector(1); // single 0 byte const size_t p_bytes = point.get_curve().get_p().bytes(); BigInt x = point.get_affine_x(); BigInt y = point.get_affine_y(); SecureVector bX = BigInt::encode_1363(x, p_bytes); SecureVector bY = BigInt::encode_1363(y, p_bytes); if(format == PointGFp::UNCOMPRESSED) { SecureVector result; result.push_back(0x04); result += bX; result += bY; return result; } else if(format == PointGFp::COMPRESSED) { SecureVector result; result.push_back(0x02 | static_cast(y.get_bit(0))); result += bX; return result; } else if(format == PointGFp::HYBRID) { SecureVector result; result.push_back(0x06 | static_cast(y.get_bit(0))); result += bX; result += bY; return result; } else throw Invalid_Argument("illegal point encoding format specification"); } namespace { BigInt decompress_point(bool yMod2, const BigInt& x, const CurveGFp& curve) { BigInt xpow3 = x * x * x; BigInt g = curve.get_a() * x; g += xpow3; g += curve.get_b(); g = g % curve.get_p(); BigInt z = ressol(g, curve.get_p()); if(z < 0) throw Illegal_Point("error during decompression"); if(z.get_bit(0) != yMod2) z = curve.get_p() - z; return z; } } PointGFp OS2ECP(const byte data[], size_t data_len, const CurveGFp& curve) { if(data_len <= 1) return PointGFp(curve); // return zero const byte pc = data[0]; BigInt x, y; if(pc == 2 || pc == 3) { //compressed form x = BigInt::decode(&data[1], data_len - 1); const bool y_mod_2 = ((pc & 0x01) == 1); y = decompress_point(y_mod_2, x, curve); } else if(pc == 4) { const size_t l = (data_len - 1) / 2; // uncompressed form x = BigInt::decode(&data[1], l); y = BigInt::decode(&data[l+1], l); } else if(pc == 6 || pc == 7) { const size_t l = (data_len - 1) / 2; // hybrid form x = BigInt::decode(&data[1], l); y = BigInt::decode(&data[l+1], l); const bool y_mod_2 = ((pc & 0x01) == 1); if(decompress_point(y_mod_2, x, curve) != y) throw Illegal_Point("OS2ECP: Decoding error in hybrid format"); } else throw Invalid_Argument("OS2ECP: Unknown format type"); PointGFp result(curve, x, y); if(!result.on_the_curve()) throw Illegal_Point("OS2ECP: Decoded point was not on the curve"); return result; } } Botan-1.10.12/src/math/ec_gfp/point_gfp.h0000664000175000017500000001507512654331322017675 0ustar jackjack00000000000000/* * Point arithmetic on elliptic curves over GF(p) * * (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke * 2008-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_POINT_GFP_H__ #define BOTAN_POINT_GFP_H__ #include #include namespace Botan { /** * Exception thrown if you try to convert a zero point to an affine * coordinate */ struct BOTAN_DLL Illegal_Transformation : public Exception { Illegal_Transformation(const std::string& err = "Requested transformation is not possible") : Exception(err) {} }; /** * Exception thrown if some form of illegal point is decoded */ struct BOTAN_DLL Illegal_Point : public Exception { Illegal_Point(const std::string& err = "Malformed ECP point detected") : Exception(err) {} }; /** * This class represents one point on a curve of GF(p) */ class BOTAN_DLL PointGFp { public: enum Compression_Type { UNCOMPRESSED = 0, COMPRESSED = 1, HYBRID = 2 }; /** * Construct an uninitialized PointGFp */ PointGFp() {} /** * Construct the zero point * @param curve The base curve */ PointGFp(const CurveGFp& curve); /** * Construct a point from its affine coordinates * @param curve the base curve * @param x affine x coordinate * @param y affine y coordinate */ PointGFp(const CurveGFp& curve, const BigInt& x, const BigInt& y); //PointGFp(const PointGFp& other) = default; //PointGFp& operator=(const PointGFp& other) = default; /** * += Operator * @param rhs the PointGFp to add to the local value * @result resulting PointGFp */ PointGFp& operator+=(const PointGFp& rhs); /** * -= Operator * @param rhs the PointGFp to subtract from the local value * @result resulting PointGFp */ PointGFp& operator-=(const PointGFp& rhs); /** * *= Operator * @param scalar the PointGFp to multiply with *this * @result resulting PointGFp */ PointGFp& operator*=(const BigInt& scalar); /** * Multiplication Operator * @param scalar the scalar value * @param point the point value * @return scalar*point on the curve */ friend BOTAN_DLL PointGFp operator*(const BigInt& scalar, const PointGFp& point); /** * Multiexponentiation * @param p1 a point * @param z1 a scalar * @param p2 a point * @param z2 a scalar * @result (p1 * z1 + p2 * z2) */ friend BOTAN_DLL PointGFp multi_exponentiate( const PointGFp& p1, const BigInt& z1, const PointGFp& p2, const BigInt& z2); /** * Negate this point * @return *this */ PointGFp& negate() { if(!is_zero()) coord_y = curve.get_p() - coord_y; return *this; } /** * Return base curve of this point * @result the curve over GF(p) of this point */ const CurveGFp& get_curve() const { return curve; } /** * get affine x coordinate * @result affine x coordinate */ BigInt get_affine_x() const; /** * get affine y coordinate * @result affine y coordinate */ BigInt get_affine_y() const; /** * Is this the point at infinity? * @result true, if this point is at infinity, false otherwise. */ bool is_zero() const { return (coord_x.is_zero() && coord_z.is_zero()); } /** * Checks whether the point is to be found on the underlying * curve; used to prevent fault attacks. * @return if the point is on the curve */ bool on_the_curve() const; /** * swaps the states of *this and other, does not throw! * @param other the object to swap values with */ void swap(PointGFp& other); /** * Equality operator */ bool operator==(const PointGFp& other) const; private: /** * Montgomery multiplication/reduction * @param x first multiplicand * @param y second multiplicand * @param workspace temp space */ BigInt monty_mult(const BigInt& x, const BigInt& y) const { BigInt result; monty_mult(result, x, y); return result; } /** * Montgomery multiplication/reduction * @warning z cannot alias x or y * @param z output * @param x first multiplicand * @param y second multiplicand */ void monty_mult(BigInt& z, const BigInt& x, const BigInt& y) const; /** * Montgomery squaring/reduction * @param x multiplicand */ BigInt monty_sqr(const BigInt& x) const { BigInt result; monty_sqr(result, x); return result; } /** * Montgomery squaring/reduction * @warning z cannot alias x * @param z output * @param x multiplicand */ void monty_sqr(BigInt& z, const BigInt& x) const; /** * Point addition * @param workspace temp space, at least 11 elements */ void add(const PointGFp& other, std::vector& workspace); /** * Point doubling * @param workspace temp space, at least 9 elements */ void mult2(std::vector& workspace); CurveGFp curve; BigInt coord_x, coord_y, coord_z; mutable SecureVector ws; // workspace for Montgomery }; // relational operators inline bool operator!=(const PointGFp& lhs, const PointGFp& rhs) { return !(rhs == lhs); } // arithmetic operators inline PointGFp operator-(const PointGFp& lhs) { return PointGFp(lhs).negate(); } inline PointGFp operator+(const PointGFp& lhs, const PointGFp& rhs) { PointGFp tmp(lhs); return tmp += rhs; } inline PointGFp operator-(const PointGFp& lhs, const PointGFp& rhs) { PointGFp tmp(lhs); return tmp -= rhs; } inline PointGFp operator*(const PointGFp& point, const BigInt& scalar) { return scalar * point; } // encoding and decoding SecureVector BOTAN_DLL EC2OSP(const PointGFp& point, byte format); PointGFp BOTAN_DLL OS2ECP(const byte data[], size_t data_len, const CurveGFp& curve); inline PointGFp OS2ECP(const MemoryRegion& data, const CurveGFp& curve) { return OS2ECP(&data[0], data.size(), curve); } } namespace std { template<> inline void swap(Botan::PointGFp& x, Botan::PointGFp& y) { x.swap(y); } } #endif Botan-1.10.12/src/math/mp/info.txt0000664000175000017500000000046312654331322016417 0ustar jackjack00000000000000define BIGINT_MP mp_asm.cpp mp_comba.cpp mp_karat.cpp mp_monty.cpp mp_mulop.cpp mp_misc.cpp mp_shift.cpp mp_types.h mp_core.h mp_x86_64|mp_msvc64|mp_asm64|mp_x86_32|mp_x86_32_msvc|mp_generic Botan-1.10.12/src/math/mp/mp_asm.cpp0000664000175000017500000000772512654331322016713 0ustar jackjack00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2010 Jack Lloyd * 2006 Luca Piccarreta * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { extern "C" { /* * Two Operand Addition, No Carry */ word bigint_add2_nc(word x[], size_t x_size, const word y[], size_t y_size) { word carry = 0; const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) carry = word8_add2(x + i, y + i, carry); for(size_t i = blocks; i != y_size; ++i) x[i] = word_add(x[i], y[i], &carry); for(size_t i = y_size; i != x_size; ++i) x[i] = word_add(x[i], 0, &carry); return carry; } /* * Three Operand Addition, No Carry */ word bigint_add3_nc(word z[], const word x[], size_t x_size, const word y[], size_t y_size) { if(x_size < y_size) { return bigint_add3_nc(z, y, y_size, x, x_size); } word carry = 0; const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) carry = word8_add3(z + i, x + i, y + i, carry); for(size_t i = blocks; i != y_size; ++i) z[i] = word_add(x[i], y[i], &carry); for(size_t i = y_size; i != x_size; ++i) z[i] = word_add(x[i], 0, &carry); return carry; } /* * Two Operand Addition */ void bigint_add2(word x[], size_t x_size, const word y[], size_t y_size) { if(bigint_add2_nc(x, x_size, y, y_size)) x[x_size] += 1; } /* * Three Operand Addition */ void bigint_add3(word z[], const word x[], size_t x_size, const word y[], size_t y_size) { z[(x_size > y_size ? x_size : y_size)] += bigint_add3_nc(z, x, x_size, y, y_size); } /* * Two Operand Subtraction */ word bigint_sub2(word x[], size_t x_size, const word y[], size_t y_size) { word borrow = 0; const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) borrow = word8_sub2(x + i, y + i, borrow); for(size_t i = blocks; i != y_size; ++i) x[i] = word_sub(x[i], y[i], &borrow); for(size_t i = y_size; i != x_size; ++i) x[i] = word_sub(x[i], 0, &borrow); return borrow; } /* * Two Operand Subtraction x = y - x */ void bigint_sub2_rev(word x[], const word y[], size_t y_size) { word borrow = 0; const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) borrow = word8_sub2_rev(x + i, y + i, borrow); for(size_t i = blocks; i != y_size; ++i) x[i] = word_sub(y[i], x[i], &borrow); if(borrow) throw Internal_Error("bigint_sub2_rev: x >= y"); } /* * Three Operand Subtraction */ word bigint_sub3(word z[], const word x[], size_t x_size, const word y[], size_t y_size) { word borrow = 0; const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) borrow = word8_sub3(z + i, x + i, y + i, borrow); for(size_t i = blocks; i != y_size; ++i) z[i] = word_sub(x[i], y[i], &borrow); for(size_t i = y_size; i != x_size; ++i) z[i] = word_sub(x[i], 0, &borrow); return borrow; } /* * Two Operand Linear Multiply */ void bigint_linmul2(word x[], size_t x_size, word y) { const size_t blocks = x_size - (x_size % 8); word carry = 0; for(size_t i = 0; i != blocks; i += 8) carry = word8_linmul2(x + i, y, carry); for(size_t i = blocks; i != x_size; ++i) x[i] = word_madd2(x[i], y, &carry); x[x_size] = carry; } /* * Three Operand Linear Multiply */ void bigint_linmul3(word z[], const word x[], size_t x_size, word y) { const size_t blocks = x_size - (x_size % 8); word carry = 0; for(size_t i = 0; i != blocks; i += 8) carry = word8_linmul3(z + i, x + i, y, carry); for(size_t i = blocks; i != x_size; ++i) z[i] = word_madd2(x[i], y, &carry); z[x_size] = carry; } } } Botan-1.10.12/src/math/mp/mp_asm64/info.txt0000664000175000017500000000054712654331322020050 0ustar jackjack00000000000000mp_bits 64 load_on dep mp_asm.h mp_generic:mp_asmi.h alpha ia64 mips64 ppc64 sparc64 # The inline asm only works with gcc, but it looks like (at least on # UltraSPARC), using 64-bit words and the sythensized multiply is a 5 to 25% # win, so it's probably worth using elsewhere. gcc sunstudio Botan-1.10.12/src/math/mp/mp_asm64/mp_asm.h0000664000175000017500000000546712654331322020007 0ustar jackjack00000000000000/* * MPI Multiply-Add Core * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_MADD_H__ #define BOTAN_MP_MADD_H__ #include namespace Botan { #if (BOTAN_MP_WORD_BITS != 64) #error The mp_asm64 module requires that BOTAN_MP_WORD_BITS == 64 #endif #if defined(BOTAN_TARGET_ARCH_IS_ALPHA) #define BOTAN_WORD_MUL(a,b,z1,z0) do { \ asm("umulh %1,%2,%0" : "=r" (z0) : "r" (a), "r" (b)); \ z1 = a * b; \ } while(0); #elif defined(BOTAN_TARGET_ARCH_IS_IA64) #define BOTAN_WORD_MUL(a,b,z1,z0) do { \ asm("xmpy.hu %0=%1,%2" : "=f" (z0) : "f" (a), "f" (b)); \ z1 = a * b; \ } while(0); #elif defined(BOTAN_TARGET_ARCH_IS_PPC64) #define BOTAN_WORD_MUL(a,b,z1,z0) do { \ asm("mulhdu %0,%1,%2" : "=r" (z0) : "r" (a), "r" (b) : "cc"); \ z1 = a * b; \ } while(0); #elif defined(BOTAN_TARGET_ARCH_IS_MIPS64) #define BOTAN_WORD_MUL(a,b,z1,z0) do { \ typedef unsigned int uint128_t __attribute__((mode(TI))); \ uint128_t r = (uint128_t)a * b; \ z0 = (r >> 64) & 0xFFFFFFFFFFFFFFFF; \ z1 = (r ) & 0xFFFFFFFFFFFFFFFF; \ } while(0); #else // Do a 64x64->128 multiply using four 64x64->64 multiplies // plus some adds and shifts. Last resort for CPUs like UltraSPARC, // with 64-bit registers/ALU, but no 64x64->128 multiply. inline void bigint_2word_mul(word a, word b, word* z1, word* z0) { const size_t MP_HWORD_BITS = BOTAN_MP_WORD_BITS / 2; const word MP_HWORD_MASK = ((word)1 << MP_HWORD_BITS) - 1; const word a_hi = (a >> MP_HWORD_BITS); const word a_lo = (a & MP_HWORD_MASK); const word b_hi = (b >> MP_HWORD_BITS); const word b_lo = (b & MP_HWORD_MASK); word x0 = a_hi * b_hi; word x1 = a_lo * b_hi; word x2 = a_hi * b_lo; word x3 = a_lo * b_lo; x2 += x3 >> (MP_HWORD_BITS); x2 += x1; if(x2 < x1) // timing channel x0 += ((word)1 << MP_HWORD_BITS); *z0 = x0 + (x2 >> MP_HWORD_BITS); *z1 = ((x2 & MP_HWORD_MASK) << MP_HWORD_BITS) + (x3 & MP_HWORD_MASK); } #define BOTAN_WORD_MUL(a,b,z1,z0) bigint_2word_mul(a, b, &z1, &z0) #endif /* * Word Multiply/Add */ inline word word_madd2(word a, word b, word* c) { word z0 = 0, z1 = 0; BOTAN_WORD_MUL(a, b, z1, z0); z1 += *c; z0 += (z1 < *c); *c = z0; return z1; } /* * Word Multiply/Add */ inline word word_madd3(word a, word b, word c, word* d) { word z0 = 0, z1 = 0; BOTAN_WORD_MUL(a, b, z1, z0); z1 += c; z0 += (z1 < c); z1 += *d; z0 += (z1 < *d); *d = z0; return z1; } } #endif Botan-1.10.12/src/math/mp/mp_comba.cpp0000664000175000017500000007477612654331322017226 0ustar jackjack00000000000000/* * Comba Multiplication and Squaring * (C) 1999-2007,2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { extern "C" { /* * Comba 4x4 Squaring */ void bigint_comba_sqr4(word z[8], const word x[4]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], x[ 0]); z[ 0] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); z[ 1] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], x[ 1]); z[ 2] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); z[ 3] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], x[ 2]); z[ 4] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 3], x[ 3]); z[ 6] = w0; z[ 7] = w1; } /* * Comba 4x4 Multiplication */ void bigint_comba_mul4(word z[8], const word x[4], const word y[4]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); z[ 0] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); z[ 1] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); z[ 2] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); z[ 3] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); z[ 4] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); z[ 6] = w0; z[ 7] = w1; } /* * Comba 6x6 Squaring */ void bigint_comba_sqr6(word z[12], const word x[6]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], x[ 0]); z[ 0] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); z[ 1] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], x[ 1]); z[ 2] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); z[ 3] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], x[ 2]); z[ 4] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); z[ 5] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], x[ 3]); z[ 6] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]); z[ 7] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], x[ 4]); z[ 8] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]); z[ 9] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 5], x[ 5]); z[10] = w1; z[11] = w2; } /* * Comba 6x6 Multiplication */ void bigint_comba_mul6(word z[12], const word x[6], const word y[6]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); z[ 0] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); z[ 1] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); z[ 2] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); z[ 3] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]); z[ 4] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]); z[ 6] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]); z[ 7] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]); z[ 8] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]); z[ 9] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]); z[10] = w1; z[11] = w2; } /* * Comba 8x8 Squaring */ void bigint_comba_sqr8(word z[16], const word x[8]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], x[ 0]); z[ 0] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); z[ 1] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], x[ 1]); z[ 2] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); z[ 3] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], x[ 2]); z[ 4] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); z[ 5] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], x[ 3]); z[ 6] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]); z[ 7] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], x[ 4]); z[ 8] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]); word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]); z[ 9] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]); word3_muladd(&w0, &w2, &w1, x[ 5], x[ 5]); z[10] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]); z[11] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]); word3_muladd(&w2, &w1, &w0, x[ 6], x[ 6]); z[12] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]); z[13] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 7], x[ 7]); z[14] = w2; z[15] = w0; } /* * Comba 8x8 Multiplication */ void bigint_comba_mul8(word z[16], const word x[8], const word y[8]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); z[ 0] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); z[ 1] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); z[ 2] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); z[ 3] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]); z[ 4] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]); z[ 6] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]); z[ 7] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]); z[ 8] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]); z[ 9] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]); z[10] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]); z[11] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]); z[12] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]); z[13] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]); z[14] = w2; z[15] = w0; } /* * Comba 16x16 Squaring */ void bigint_comba_sqr16(word z[32], const word x[16]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], x[ 0]); z[ 0] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); z[ 1] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], x[ 1]); z[ 2] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); z[ 3] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], x[ 2]); z[ 4] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); z[ 5] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], x[ 3]); z[ 6] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]); z[ 7] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], x[ 4]); z[ 8] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 9]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]); word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]); z[ 9] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[10]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 9]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]); word3_muladd(&w0, &w2, &w1, x[ 5], x[ 5]); z[10] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[11]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[10]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 9]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]); word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]); z[11] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[12]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[11]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[10]); word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 9]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]); word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]); word3_muladd(&w2, &w1, &w0, x[ 6], x[ 6]); z[12] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[13]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[12]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[11]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[10]); word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 9]); word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]); word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]); z[13] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[14]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[13]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[12]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[11]); word3_muladd_2(&w1, &w0, &w2, x[ 4], x[10]); word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 9]); word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]); word3_muladd(&w1, &w0, &w2, x[ 7], x[ 7]); z[14] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[15]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[14]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[13]); word3_muladd_2(&w2, &w1, &w0, x[ 3], x[12]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[11]); word3_muladd_2(&w2, &w1, &w0, x[ 5], x[10]); word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 9]); word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]); z[15] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 1], x[15]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[14]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[13]); word3_muladd_2(&w0, &w2, &w1, x[ 4], x[12]); word3_muladd_2(&w0, &w2, &w1, x[ 5], x[11]); word3_muladd_2(&w0, &w2, &w1, x[ 6], x[10]); word3_muladd_2(&w0, &w2, &w1, x[ 7], x[ 9]); word3_muladd(&w0, &w2, &w1, x[ 8], x[ 8]); z[16] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 2], x[15]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[14]); word3_muladd_2(&w1, &w0, &w2, x[ 4], x[13]); word3_muladd_2(&w1, &w0, &w2, x[ 5], x[12]); word3_muladd_2(&w1, &w0, &w2, x[ 6], x[11]); word3_muladd_2(&w1, &w0, &w2, x[ 7], x[10]); word3_muladd_2(&w1, &w0, &w2, x[ 8], x[ 9]); z[17] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 3], x[15]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[14]); word3_muladd_2(&w2, &w1, &w0, x[ 5], x[13]); word3_muladd_2(&w2, &w1, &w0, x[ 6], x[12]); word3_muladd_2(&w2, &w1, &w0, x[ 7], x[11]); word3_muladd_2(&w2, &w1, &w0, x[ 8], x[10]); word3_muladd(&w2, &w1, &w0, x[ 9], x[ 9]); z[18] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 4], x[15]); word3_muladd_2(&w0, &w2, &w1, x[ 5], x[14]); word3_muladd_2(&w0, &w2, &w1, x[ 6], x[13]); word3_muladd_2(&w0, &w2, &w1, x[ 7], x[12]); word3_muladd_2(&w0, &w2, &w1, x[ 8], x[11]); word3_muladd_2(&w0, &w2, &w1, x[ 9], x[10]); z[19] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 5], x[15]); word3_muladd_2(&w1, &w0, &w2, x[ 6], x[14]); word3_muladd_2(&w1, &w0, &w2, x[ 7], x[13]); word3_muladd_2(&w1, &w0, &w2, x[ 8], x[12]); word3_muladd_2(&w1, &w0, &w2, x[ 9], x[11]); word3_muladd(&w1, &w0, &w2, x[10], x[10]); z[20] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 6], x[15]); word3_muladd_2(&w2, &w1, &w0, x[ 7], x[14]); word3_muladd_2(&w2, &w1, &w0, x[ 8], x[13]); word3_muladd_2(&w2, &w1, &w0, x[ 9], x[12]); word3_muladd_2(&w2, &w1, &w0, x[10], x[11]); z[21] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 7], x[15]); word3_muladd_2(&w0, &w2, &w1, x[ 8], x[14]); word3_muladd_2(&w0, &w2, &w1, x[ 9], x[13]); word3_muladd_2(&w0, &w2, &w1, x[10], x[12]); word3_muladd(&w0, &w2, &w1, x[11], x[11]); z[22] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 8], x[15]); word3_muladd_2(&w1, &w0, &w2, x[ 9], x[14]); word3_muladd_2(&w1, &w0, &w2, x[10], x[13]); word3_muladd_2(&w1, &w0, &w2, x[11], x[12]); z[23] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 9], x[15]); word3_muladd_2(&w2, &w1, &w0, x[10], x[14]); word3_muladd_2(&w2, &w1, &w0, x[11], x[13]); word3_muladd(&w2, &w1, &w0, x[12], x[12]); z[24] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[10], x[15]); word3_muladd_2(&w0, &w2, &w1, x[11], x[14]); word3_muladd_2(&w0, &w2, &w1, x[12], x[13]); z[25] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[11], x[15]); word3_muladd_2(&w1, &w0, &w2, x[12], x[14]); word3_muladd(&w1, &w0, &w2, x[13], x[13]); z[26] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[12], x[15]); word3_muladd_2(&w2, &w1, &w0, x[13], x[14]); z[27] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[13], x[15]); word3_muladd(&w0, &w2, &w1, x[14], x[14]); z[28] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[14], x[15]); z[29] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[15], x[15]); z[30] = w0; z[31] = w1; } /* * Comba 16x16 Multiplication */ void bigint_comba_mul16(word z[32], const word x[16], const word y[16]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); z[ 0] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); z[ 1] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); z[ 2] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); z[ 3] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]); z[ 4] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]); z[ 6] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]); z[ 7] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 0]); z[ 8] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 9]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 9], y[ 0]); z[ 9] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[10]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 9]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 8]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 8], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 9], y[ 1]); word3_muladd(&w0, &w2, &w1, x[10], y[ 0]); z[10] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[11]); word3_muladd(&w1, &w0, &w2, x[ 1], y[10]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 9]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 8]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 9], y[ 2]); word3_muladd(&w1, &w0, &w2, x[10], y[ 1]); word3_muladd(&w1, &w0, &w2, x[11], y[ 0]); z[11] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[12]); word3_muladd(&w2, &w1, &w0, x[ 1], y[11]); word3_muladd(&w2, &w1, &w0, x[ 2], y[10]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 9]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 9], y[ 3]); word3_muladd(&w2, &w1, &w0, x[10], y[ 2]); word3_muladd(&w2, &w1, &w0, x[11], y[ 1]); word3_muladd(&w2, &w1, &w0, x[12], y[ 0]); z[12] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[13]); word3_muladd(&w0, &w2, &w1, x[ 1], y[12]); word3_muladd(&w0, &w2, &w1, x[ 2], y[11]); word3_muladd(&w0, &w2, &w1, x[ 3], y[10]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 9]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 8]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 8], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 9], y[ 4]); word3_muladd(&w0, &w2, &w1, x[10], y[ 3]); word3_muladd(&w0, &w2, &w1, x[11], y[ 2]); word3_muladd(&w0, &w2, &w1, x[12], y[ 1]); word3_muladd(&w0, &w2, &w1, x[13], y[ 0]); z[13] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[14]); word3_muladd(&w1, &w0, &w2, x[ 1], y[13]); word3_muladd(&w1, &w0, &w2, x[ 2], y[12]); word3_muladd(&w1, &w0, &w2, x[ 3], y[11]); word3_muladd(&w1, &w0, &w2, x[ 4], y[10]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 9]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 8]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 9], y[ 5]); word3_muladd(&w1, &w0, &w2, x[10], y[ 4]); word3_muladd(&w1, &w0, &w2, x[11], y[ 3]); word3_muladd(&w1, &w0, &w2, x[12], y[ 2]); word3_muladd(&w1, &w0, &w2, x[13], y[ 1]); word3_muladd(&w1, &w0, &w2, x[14], y[ 0]); z[14] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[15]); word3_muladd(&w2, &w1, &w0, x[ 1], y[14]); word3_muladd(&w2, &w1, &w0, x[ 2], y[13]); word3_muladd(&w2, &w1, &w0, x[ 3], y[12]); word3_muladd(&w2, &w1, &w0, x[ 4], y[11]); word3_muladd(&w2, &w1, &w0, x[ 5], y[10]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 9]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]); word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 9], y[ 6]); word3_muladd(&w2, &w1, &w0, x[10], y[ 5]); word3_muladd(&w2, &w1, &w0, x[11], y[ 4]); word3_muladd(&w2, &w1, &w0, x[12], y[ 3]); word3_muladd(&w2, &w1, &w0, x[13], y[ 2]); word3_muladd(&w2, &w1, &w0, x[14], y[ 1]); word3_muladd(&w2, &w1, &w0, x[15], y[ 0]); z[15] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 1], y[15]); word3_muladd(&w0, &w2, &w1, x[ 2], y[14]); word3_muladd(&w0, &w2, &w1, x[ 3], y[13]); word3_muladd(&w0, &w2, &w1, x[ 4], y[12]); word3_muladd(&w0, &w2, &w1, x[ 5], y[11]); word3_muladd(&w0, &w2, &w1, x[ 6], y[10]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 9]); word3_muladd(&w0, &w2, &w1, x[ 8], y[ 8]); word3_muladd(&w0, &w2, &w1, x[ 9], y[ 7]); word3_muladd(&w0, &w2, &w1, x[10], y[ 6]); word3_muladd(&w0, &w2, &w1, x[11], y[ 5]); word3_muladd(&w0, &w2, &w1, x[12], y[ 4]); word3_muladd(&w0, &w2, &w1, x[13], y[ 3]); word3_muladd(&w0, &w2, &w1, x[14], y[ 2]); word3_muladd(&w0, &w2, &w1, x[15], y[ 1]); z[16] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 2], y[15]); word3_muladd(&w1, &w0, &w2, x[ 3], y[14]); word3_muladd(&w1, &w0, &w2, x[ 4], y[13]); word3_muladd(&w1, &w0, &w2, x[ 5], y[12]); word3_muladd(&w1, &w0, &w2, x[ 6], y[11]); word3_muladd(&w1, &w0, &w2, x[ 7], y[10]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 9]); word3_muladd(&w1, &w0, &w2, x[ 9], y[ 8]); word3_muladd(&w1, &w0, &w2, x[10], y[ 7]); word3_muladd(&w1, &w0, &w2, x[11], y[ 6]); word3_muladd(&w1, &w0, &w2, x[12], y[ 5]); word3_muladd(&w1, &w0, &w2, x[13], y[ 4]); word3_muladd(&w1, &w0, &w2, x[14], y[ 3]); word3_muladd(&w1, &w0, &w2, x[15], y[ 2]); z[17] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 3], y[15]); word3_muladd(&w2, &w1, &w0, x[ 4], y[14]); word3_muladd(&w2, &w1, &w0, x[ 5], y[13]); word3_muladd(&w2, &w1, &w0, x[ 6], y[12]); word3_muladd(&w2, &w1, &w0, x[ 7], y[11]); word3_muladd(&w2, &w1, &w0, x[ 8], y[10]); word3_muladd(&w2, &w1, &w0, x[ 9], y[ 9]); word3_muladd(&w2, &w1, &w0, x[10], y[ 8]); word3_muladd(&w2, &w1, &w0, x[11], y[ 7]); word3_muladd(&w2, &w1, &w0, x[12], y[ 6]); word3_muladd(&w2, &w1, &w0, x[13], y[ 5]); word3_muladd(&w2, &w1, &w0, x[14], y[ 4]); word3_muladd(&w2, &w1, &w0, x[15], y[ 3]); z[18] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 4], y[15]); word3_muladd(&w0, &w2, &w1, x[ 5], y[14]); word3_muladd(&w0, &w2, &w1, x[ 6], y[13]); word3_muladd(&w0, &w2, &w1, x[ 7], y[12]); word3_muladd(&w0, &w2, &w1, x[ 8], y[11]); word3_muladd(&w0, &w2, &w1, x[ 9], y[10]); word3_muladd(&w0, &w2, &w1, x[10], y[ 9]); word3_muladd(&w0, &w2, &w1, x[11], y[ 8]); word3_muladd(&w0, &w2, &w1, x[12], y[ 7]); word3_muladd(&w0, &w2, &w1, x[13], y[ 6]); word3_muladd(&w0, &w2, &w1, x[14], y[ 5]); word3_muladd(&w0, &w2, &w1, x[15], y[ 4]); z[19] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 5], y[15]); word3_muladd(&w1, &w0, &w2, x[ 6], y[14]); word3_muladd(&w1, &w0, &w2, x[ 7], y[13]); word3_muladd(&w1, &w0, &w2, x[ 8], y[12]); word3_muladd(&w1, &w0, &w2, x[ 9], y[11]); word3_muladd(&w1, &w0, &w2, x[10], y[10]); word3_muladd(&w1, &w0, &w2, x[11], y[ 9]); word3_muladd(&w1, &w0, &w2, x[12], y[ 8]); word3_muladd(&w1, &w0, &w2, x[13], y[ 7]); word3_muladd(&w1, &w0, &w2, x[14], y[ 6]); word3_muladd(&w1, &w0, &w2, x[15], y[ 5]); z[20] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 6], y[15]); word3_muladd(&w2, &w1, &w0, x[ 7], y[14]); word3_muladd(&w2, &w1, &w0, x[ 8], y[13]); word3_muladd(&w2, &w1, &w0, x[ 9], y[12]); word3_muladd(&w2, &w1, &w0, x[10], y[11]); word3_muladd(&w2, &w1, &w0, x[11], y[10]); word3_muladd(&w2, &w1, &w0, x[12], y[ 9]); word3_muladd(&w2, &w1, &w0, x[13], y[ 8]); word3_muladd(&w2, &w1, &w0, x[14], y[ 7]); word3_muladd(&w2, &w1, &w0, x[15], y[ 6]); z[21] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 7], y[15]); word3_muladd(&w0, &w2, &w1, x[ 8], y[14]); word3_muladd(&w0, &w2, &w1, x[ 9], y[13]); word3_muladd(&w0, &w2, &w1, x[10], y[12]); word3_muladd(&w0, &w2, &w1, x[11], y[11]); word3_muladd(&w0, &w2, &w1, x[12], y[10]); word3_muladd(&w0, &w2, &w1, x[13], y[ 9]); word3_muladd(&w0, &w2, &w1, x[14], y[ 8]); word3_muladd(&w0, &w2, &w1, x[15], y[ 7]); z[22] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 8], y[15]); word3_muladd(&w1, &w0, &w2, x[ 9], y[14]); word3_muladd(&w1, &w0, &w2, x[10], y[13]); word3_muladd(&w1, &w0, &w2, x[11], y[12]); word3_muladd(&w1, &w0, &w2, x[12], y[11]); word3_muladd(&w1, &w0, &w2, x[13], y[10]); word3_muladd(&w1, &w0, &w2, x[14], y[ 9]); word3_muladd(&w1, &w0, &w2, x[15], y[ 8]); z[23] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 9], y[15]); word3_muladd(&w2, &w1, &w0, x[10], y[14]); word3_muladd(&w2, &w1, &w0, x[11], y[13]); word3_muladd(&w2, &w1, &w0, x[12], y[12]); word3_muladd(&w2, &w1, &w0, x[13], y[11]); word3_muladd(&w2, &w1, &w0, x[14], y[10]); word3_muladd(&w2, &w1, &w0, x[15], y[ 9]); z[24] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[10], y[15]); word3_muladd(&w0, &w2, &w1, x[11], y[14]); word3_muladd(&w0, &w2, &w1, x[12], y[13]); word3_muladd(&w0, &w2, &w1, x[13], y[12]); word3_muladd(&w0, &w2, &w1, x[14], y[11]); word3_muladd(&w0, &w2, &w1, x[15], y[10]); z[25] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[11], y[15]); word3_muladd(&w1, &w0, &w2, x[12], y[14]); word3_muladd(&w1, &w0, &w2, x[13], y[13]); word3_muladd(&w1, &w0, &w2, x[14], y[12]); word3_muladd(&w1, &w0, &w2, x[15], y[11]); z[26] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[12], y[15]); word3_muladd(&w2, &w1, &w0, x[13], y[14]); word3_muladd(&w2, &w1, &w0, x[14], y[13]); word3_muladd(&w2, &w1, &w0, x[15], y[12]); z[27] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[13], y[15]); word3_muladd(&w0, &w2, &w1, x[14], y[14]); word3_muladd(&w0, &w2, &w1, x[15], y[13]); z[28] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[14], y[15]); word3_muladd(&w1, &w0, &w2, x[15], y[14]); z[29] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[15], y[15]); z[30] = w0; z[31] = w1; } } } Botan-1.10.12/src/math/mp/mp_core.h0000664000175000017500000001031712654331322016517 0ustar jackjack00000000000000/* * MPI Algorithms * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_CORE_H__ #define BOTAN_MP_CORE_H__ #include namespace Botan { /* * The size of the word type, in bits */ const size_t MP_WORD_BITS = BOTAN_MP_WORD_BITS; extern "C" { /* * Addition/Subtraction Operations */ void bigint_add2(word x[], size_t x_size, const word y[], size_t y_size); void bigint_add3(word z[], const word x[], size_t x_size, const word y[], size_t y_size); word bigint_add2_nc(word x[], size_t x_size, const word y[], size_t y_size); word bigint_add3_nc(word z[], const word x[], size_t x_size, const word y[], size_t y_size); word bigint_sub2(word x[], size_t x_size, const word y[], size_t y_size); /** * x = y - x; assumes y >= x */ void bigint_sub2_rev(word x[], const word y[], size_t y_size); word bigint_sub3(word z[], const word x[], size_t x_size, const word y[], size_t y_size); /* * Shift Operations */ void bigint_shl1(word x[], size_t x_size, size_t word_shift, size_t bit_shift); void bigint_shr1(word x[], size_t x_size, size_t word_shift, size_t bit_shift); void bigint_shl2(word y[], const word x[], size_t x_size, size_t word_shift, size_t bit_shift); void bigint_shr2(word y[], const word x[], size_t x_size, size_t word_shift, size_t bit_shift); /* * Simple O(N^2) Multiplication and Squaring */ void bigint_simple_mul(word z[], const word x[], size_t x_size, const word y[], size_t y_size); void bigint_simple_sqr(word z[], const word x[], size_t x_size); /* * Linear Multiply */ void bigint_linmul2(word x[], size_t x_size, word y); void bigint_linmul3(word z[], const word x[], size_t x_size, word y); /** * Montgomery Reduction * @param z integer to reduce (also output in first p_size+1 words) * @param z_size size of z (should be >= 2*p_size+1) * @param p modulus * @param p_size size of p * @param p_dash Montgomery value * @param workspace array of at least 2*(p_size+1) words */ void bigint_monty_redc(word z[], size_t z_size, const word p[], size_t p_size, word p_dash, word workspace[]); /* * Montgomery Multiplication */ void bigint_monty_mul(word z[], size_t z_size, const word x[], size_t x_size, size_t x_sw, const word y[], size_t y_size, size_t y_sw, const word p[], size_t p_size, word p_dash, word workspace[]); /* * Montgomery Squaring */ void bigint_monty_sqr(word z[], size_t z_size, const word x[], size_t x_size, size_t x_sw, const word p[], size_t p_size, word p_dash, word workspace[]); /* * Division operation */ size_t bigint_divcore(word q, word y2, word y1, word x3, word x2, word x1); /** * Compare x and y */ s32bit bigint_cmp(const word x[], size_t x_size, const word y[], size_t y_size); /** * Compute ((n1< mp_asm.h mp_asmi.h Botan-1.10.12/src/math/mp/mp_generic/mp_asm.h0000664000175000017500000000173612654331322020464 0ustar jackjack00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2008 Jack Lloyd * 2006 Luca Piccarreta * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_ASM_H__ #define BOTAN_MP_ASM_H__ #include #if (BOTAN_MP_WORD_BITS == 8) typedef Botan::u16bit dword; #elif (BOTAN_MP_WORD_BITS == 16) typedef Botan::u32bit dword; #elif (BOTAN_MP_WORD_BITS == 32) typedef Botan::u64bit dword; #elif (BOTAN_MP_WORD_BITS == 64) #error BOTAN_MP_WORD_BITS can be 64 only with assembly support #else #error BOTAN_MP_WORD_BITS must be 8, 16, 32, or 64 #endif namespace Botan { extern "C" { /* * Word Multiply/Add */ inline word word_madd2(word a, word b, word* c) { dword z = (dword)a * b + *c; *c = (word)(z >> BOTAN_MP_WORD_BITS); return (word)z; } /* * Word Multiply/Add */ inline word word_madd3(word a, word b, word c, word* d) { dword z = (dword)a * b + c + *d; *d = (word)(z >> BOTAN_MP_WORD_BITS); return (word)z; } } } #endif Botan-1.10.12/src/math/mp/mp_generic/mp_asmi.h0000664000175000017500000001175712654331322020641 0ustar jackjack00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2010 Jack Lloyd * 2006 Luca Piccarreta * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_ASM_INTERNAL_H__ #define BOTAN_MP_ASM_INTERNAL_H__ #include namespace Botan { extern "C" { /* * Word Addition */ inline word word_add(word x, word y, word* carry) { word z = x + y; word c1 = (z < x); z += *carry; *carry = c1 | (z < *carry); return z; } /* * Eight Word Block Addition, Two Argument */ inline word word8_add2(word x[8], const word y[8], word carry) { x[0] = word_add(x[0], y[0], &carry); x[1] = word_add(x[1], y[1], &carry); x[2] = word_add(x[2], y[2], &carry); x[3] = word_add(x[3], y[3], &carry); x[4] = word_add(x[4], y[4], &carry); x[5] = word_add(x[5], y[5], &carry); x[6] = word_add(x[6], y[6], &carry); x[7] = word_add(x[7], y[7], &carry); return carry; } /* * Eight Word Block Addition, Three Argument */ inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) { z[0] = word_add(x[0], y[0], &carry); z[1] = word_add(x[1], y[1], &carry); z[2] = word_add(x[2], y[2], &carry); z[3] = word_add(x[3], y[3], &carry); z[4] = word_add(x[4], y[4], &carry); z[5] = word_add(x[5], y[5], &carry); z[6] = word_add(x[6], y[6], &carry); z[7] = word_add(x[7], y[7], &carry); return carry; } /* * Word Subtraction */ inline word word_sub(word x, word y, word* carry) { word t0 = x - y; word c1 = (t0 > x); word z = t0 - *carry; *carry = c1 | (z > t0); return z; } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2(word x[8], const word y[8], word carry) { x[0] = word_sub(x[0], y[0], &carry); x[1] = word_sub(x[1], y[1], &carry); x[2] = word_sub(x[2], y[2], &carry); x[3] = word_sub(x[3], y[3], &carry); x[4] = word_sub(x[4], y[4], &carry); x[5] = word_sub(x[5], y[5], &carry); x[6] = word_sub(x[6], y[6], &carry); x[7] = word_sub(x[7], y[7], &carry); return carry; } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2_rev(word x[8], const word y[8], word carry) { x[0] = word_sub(y[0], x[0], &carry); x[1] = word_sub(y[1], x[1], &carry); x[2] = word_sub(y[2], x[2], &carry); x[3] = word_sub(y[3], x[3], &carry); x[4] = word_sub(y[4], x[4], &carry); x[5] = word_sub(y[5], x[5], &carry); x[6] = word_sub(y[6], x[6], &carry); x[7] = word_sub(y[7], x[7], &carry); return carry; } /* * Eight Word Block Subtraction, Three Argument */ inline word word8_sub3(word z[8], const word x[8], const word y[8], word carry) { z[0] = word_sub(x[0], y[0], &carry); z[1] = word_sub(x[1], y[1], &carry); z[2] = word_sub(x[2], y[2], &carry); z[3] = word_sub(x[3], y[3], &carry); z[4] = word_sub(x[4], y[4], &carry); z[5] = word_sub(x[5], y[5], &carry); z[6] = word_sub(x[6], y[6], &carry); z[7] = word_sub(x[7], y[7], &carry); return carry; } /* * Eight Word Block Linear Multiplication */ inline word word8_linmul2(word x[8], word y, word carry) { x[0] = word_madd2(x[0], y, &carry); x[1] = word_madd2(x[1], y, &carry); x[2] = word_madd2(x[2], y, &carry); x[3] = word_madd2(x[3], y, &carry); x[4] = word_madd2(x[4], y, &carry); x[5] = word_madd2(x[5], y, &carry); x[6] = word_madd2(x[6], y, &carry); x[7] = word_madd2(x[7], y, &carry); return carry; } /* * Eight Word Block Linear Multiplication */ inline word word8_linmul3(word z[8], const word x[8], word y, word carry) { z[0] = word_madd2(x[0], y, &carry); z[1] = word_madd2(x[1], y, &carry); z[2] = word_madd2(x[2], y, &carry); z[3] = word_madd2(x[3], y, &carry); z[4] = word_madd2(x[4], y, &carry); z[5] = word_madd2(x[5], y, &carry); z[6] = word_madd2(x[6], y, &carry); z[7] = word_madd2(x[7], y, &carry); return carry; } /* * Eight Word Block Multiply/Add */ inline word word8_madd3(word z[8], const word x[8], word y, word carry) { z[0] = word_madd3(x[0], y, z[0], &carry); z[1] = word_madd3(x[1], y, z[1], &carry); z[2] = word_madd3(x[2], y, z[2], &carry); z[3] = word_madd3(x[3], y, z[3], &carry); z[4] = word_madd3(x[4], y, z[4], &carry); z[5] = word_madd3(x[5], y, z[5], &carry); z[6] = word_madd3(x[6], y, z[6], &carry); z[7] = word_madd3(x[7], y, z[7], &carry); return carry; } /* * Multiply-Add Accumulator */ inline void word3_muladd(word* w2, word* w1, word* w0, word a, word b) { word carry = *w0; *w0 = word_madd2(a, b, &carry); *w1 += carry; *w2 += (*w1 < carry) ? 1 : 0; } /* * Multiply-Add Accumulator */ inline void word3_muladd_2(word* w2, word* w1, word* w0, word a, word b) { word carry = 0; a = word_madd2(a, b, &carry); b = carry; word top = (b >> (BOTAN_MP_WORD_BITS-1)); b <<= 1; b |= (a >> (BOTAN_MP_WORD_BITS-1)); a <<= 1; carry = 0; *w0 = word_add(*w0, a, &carry); *w1 = word_add(*w1, b, &carry); *w2 = word_add(*w2, top, &carry); } } } #endif Botan-1.10.12/src/math/mp/mp_karat.cpp0000664000175000017500000002002612654331322017222 0ustar jackjack00000000000000/* * Karatsuba Multiplication/Squaring * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { /* * Karatsuba Multiplication Operation */ void karatsuba_mul(word z[], const word x[], const word y[], size_t N, word workspace[]) { if(N < BOTAN_KARAT_MUL_THRESHOLD || N % 2) { if(N == 6) return bigint_comba_mul6(z, x, y); else if(N == 8) return bigint_comba_mul8(z, x, y); else if(N == 16) return bigint_comba_mul16(z, x, y); else return bigint_simple_mul(z, x, N, y, N); } const size_t N2 = N / 2; const word* x0 = x; const word* x1 = x + N2; const word* y0 = y; const word* y1 = y + N2; word* z0 = z; word* z1 = z + N; const s32bit cmp0 = bigint_cmp(x0, N2, x1, N2); const s32bit cmp1 = bigint_cmp(y1, N2, y0, N2); clear_mem(workspace, 2*N); //if(cmp0 && cmp1) { if(cmp0 > 0) bigint_sub3(z0, x0, N2, x1, N2); else bigint_sub3(z0, x1, N2, x0, N2); if(cmp1 > 0) bigint_sub3(z1, y1, N2, y0, N2); else bigint_sub3(z1, y0, N2, y1, N2); karatsuba_mul(workspace, z0, z1, N2, workspace+N); } karatsuba_mul(z0, x0, y0, N2, workspace+N); karatsuba_mul(z1, x1, y1, N2, workspace+N); const size_t blocks_of_8 = N - (N % 8); word ws_carry = 0; for(size_t j = 0; j != blocks_of_8; j += 8) ws_carry = word8_add3(workspace + N + j, z0 + j, z1 + j, ws_carry); for(size_t j = blocks_of_8; j != N; ++j) workspace[N + j] = word_add(z0[j], z1[j], &ws_carry); word z_carry = 0; for(size_t j = 0; j != blocks_of_8; j += 8) z_carry = word8_add2(z + N2 + j, workspace + N + j, z_carry); for(size_t j = blocks_of_8; j != N; ++j) z[N2 + j] = word_add(z[N2 + j], workspace[N + j], &z_carry); z[N + N2] = word_add(z[N + N2], ws_carry, &z_carry); if(z_carry) for(size_t j = 1; j != N2; ++j) if(++z[N + N2 + j]) break; if((cmp0 == cmp1) || (cmp0 == 0) || (cmp1 == 0)) bigint_add2(z + N2, 2*N-N2, workspace, N); else bigint_sub2(z + N2, 2*N-N2, workspace, N); } /* * Karatsuba Squaring Operation */ void karatsuba_sqr(word z[], const word x[], size_t N, word workspace[]) { if(N < BOTAN_KARAT_SQR_THRESHOLD || N % 2) { if(N == 6) return bigint_comba_sqr6(z, x); else if(N == 8) return bigint_comba_sqr8(z, x); else if(N == 16) return bigint_comba_sqr16(z, x); else return bigint_simple_sqr(z, x, N); } const size_t N2 = N / 2; const word* x0 = x; const word* x1 = x + N2; word* z0 = z; word* z1 = z + N; const s32bit cmp = bigint_cmp(x0, N2, x1, N2); clear_mem(workspace, 2*N); //if(cmp) { if(cmp > 0) bigint_sub3(z0, x0, N2, x1, N2); else bigint_sub3(z0, x1, N2, x0, N2); karatsuba_sqr(workspace, z0, N2, workspace+N); } karatsuba_sqr(z0, x0, N2, workspace+N); karatsuba_sqr(z1, x1, N2, workspace+N); const size_t blocks_of_8 = N - (N % 8); word ws_carry = 0; for(size_t j = 0; j != blocks_of_8; j += 8) ws_carry = word8_add3(workspace + N + j, z0 + j, z1 + j, ws_carry); for(size_t j = blocks_of_8; j != N; ++j) workspace[N + j] = word_add(z0[j], z1[j], &ws_carry); word z_carry = 0; for(size_t j = 0; j != blocks_of_8; j += 8) z_carry = word8_add2(z + N2 + j, workspace + N + j, z_carry); for(size_t j = blocks_of_8; j != N; ++j) z[N2 + j] = word_add(z[N2 + j], workspace[N + j], &z_carry); z[N + N2] = word_add(z[N + N2], ws_carry, &z_carry); if(z_carry) for(size_t j = 1; j != N2; ++j) if(++z[N + N2 + j]) break; /* * This is only actually required if cmp is != 0, however * if cmp==0 then workspace[0:N] == 0 and avoiding the jump * hides a timing channel. */ bigint_sub2(z + N2, 2*N-N2, workspace, N); } /* * Pick a good size for the Karatsuba multiply */ size_t karatsuba_size(size_t z_size, size_t x_size, size_t x_sw, size_t y_size, size_t y_sw) { if(x_sw > x_size || x_sw > y_size || y_sw > x_size || y_sw > y_size) return 0; if(((x_size == x_sw) && (x_size % 2)) || ((y_size == y_sw) && (y_size % 2))) return 0; const size_t start = (x_sw > y_sw) ? x_sw : y_sw; const size_t end = (x_size < y_size) ? x_size : y_size; if(start == end) { if(start % 2) return 0; return start; } for(size_t j = start; j <= end; ++j) { if(j % 2) continue; if(2*j > z_size) return 0; if(x_sw <= j && j <= x_size && y_sw <= j && j <= y_size) { if(j % 4 == 2 && (j+2) <= x_size && (j+2) <= y_size && 2*(j+2) <= z_size) return j+2; return j; } } return 0; } /* * Pick a good size for the Karatsuba squaring */ size_t karatsuba_size(size_t z_size, size_t x_size, size_t x_sw) { if(x_sw == x_size) { if(x_sw % 2) return 0; return x_sw; } for(size_t j = x_sw; j <= x_size; ++j) { if(j % 2) continue; if(2*j > z_size) return 0; if(j % 4 == 2 && (j+2) <= x_size && 2*(j+2) <= z_size) return j+2; return j; } return 0; } } /* * Multiplication Algorithm Dispatcher */ void bigint_mul(word z[], size_t z_size, word workspace[], const word x[], size_t x_size, size_t x_sw, const word y[], size_t y_size, size_t y_sw) { BOTAN_ASSERT(z_size > x_sw && z_size > y_sw && z_size - x_sw >= y_sw, "Sufficient output size"); if(x_sw == 1) { bigint_linmul3(z, y, y_sw, x[0]); } else if(y_sw == 1) { bigint_linmul3(z, x, x_sw, y[0]); } else if(x_sw <= 4 && x_size >= 4 && y_sw <= 4 && y_size >= 4 && z_size >= 8) { bigint_comba_mul4(z, x, y); } else if(x_sw <= 6 && x_size >= 6 && y_sw <= 6 && y_size >= 6 && z_size >= 12) { bigint_comba_mul6(z, x, y); } else if(x_sw <= 8 && x_size >= 8 && y_sw <= 8 && y_size >= 8 && z_size >= 16) { bigint_comba_mul8(z, x, y); } else if(x_sw <= 16 && x_size >= 16 && y_sw <= 16 && y_size >= 16 && z_size >= 32) { bigint_comba_mul16(z, x, y); } else if(x_sw < BOTAN_KARAT_MUL_THRESHOLD || y_sw < BOTAN_KARAT_MUL_THRESHOLD || !workspace) { bigint_simple_mul(z, x, x_sw, y, y_sw); } else { const size_t N = karatsuba_size(z_size, x_size, x_sw, y_size, y_sw); if(N) { clear_mem(workspace, 2*N); karatsuba_mul(z, x, y, N, workspace); } else bigint_simple_mul(z, x, x_sw, y, y_sw); } } /* * Squaring Algorithm Dispatcher */ void bigint_sqr(word z[], size_t z_size, word workspace[], const word x[], size_t x_size, size_t x_sw) { BOTAN_ASSERT(z_size/2 >= x_sw, "Sufficient output size"); if(x_sw == 1) { bigint_linmul3(z, x, x_sw, x[0]); } else if(x_sw <= 4 && x_size >= 4 && z_size >= 8) { bigint_comba_sqr4(z, x); } else if(x_sw <= 6 && x_size >= 6 && z_size >= 12) { bigint_comba_sqr6(z, x); } else if(x_sw <= 8 && x_size >= 8 && z_size >= 16) { bigint_comba_sqr8(z, x); } else if(x_sw <= 16 && x_size >= 16 && z_size >= 32) { bigint_comba_sqr16(z, x); } else if(x_size < BOTAN_KARAT_SQR_THRESHOLD || !workspace) { bigint_simple_sqr(z, x, x_sw); } else { const size_t N = karatsuba_size(z_size, x_size, x_sw); if(N) { clear_mem(workspace, 2*N); karatsuba_sqr(z, x, N, workspace); } else bigint_simple_sqr(z, x, x_sw); } } } Botan-1.10.12/src/math/mp/mp_misc.cpp0000664000175000017500000000337412654331322017062 0ustar jackjack00000000000000/* * MP Misc Functions * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { extern "C" { /* * Core Division Operation */ size_t bigint_divcore(word q, word y2, word y1, word x3, word x2, word x1) { // Compute (y2,y1) * q word y3 = 0; y1 = word_madd2(q, y1, &y3); y2 = word_madd2(q, y2, &y3); // Return (y3,y2,y1) >? (x3,x2,x1) if(y3 > x3) return 1; if(y3 < x3) return 0; if(y2 > x2) return 1; if(y2 < x2) return 0; if(y1 > x1) return 1; if(y1 < x1) return 0; return 0; } /* * Compare two MP integers */ s32bit bigint_cmp(const word x[], size_t x_size, const word y[], size_t y_size) { if(x_size < y_size) { return (-bigint_cmp(y, y_size, x, x_size)); } while(x_size > y_size) { if(x[x_size-1]) return 1; x_size--; } for(size_t j = x_size; j > 0; --j) { if(x[j-1] > y[j-1]) return 1; if(x[j-1] < y[j-1]) return -1; } return 0; } /* * Do a 2-word/1-word Division */ word bigint_divop(word n1, word n0, word d) { word high = n1 % d, quotient = 0; for(size_t j = 0; j != MP_WORD_BITS; ++j) { word high_top_bit = (high & MP_WORD_TOP_BIT); high <<= 1; high |= (n0 >> (MP_WORD_BITS-1-j)) & 1; quotient <<= 1; if(high_top_bit || high >= d) { high -= d; quotient |= 1; } } return quotient; } /* * Do a 2-word/1-word Modulo */ word bigint_modop(word n1, word n0, word d) { word z = bigint_divop(n1, n0, d); word dummy = 0; z = word_madd2(z, d, &dummy); return (n0-z); } } } Botan-1.10.12/src/math/mp/mp_monty.cpp0000664000175000017500000000471712654331322017277 0ustar jackjack00000000000000/* * Montgomery Reduction * (C) 1999-2011 Jack Lloyd * 2006 Luca Piccarreta * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { extern "C" { /* * Montgomery Reduction Algorithm */ void bigint_monty_redc(word z[], size_t z_size, const word p[], size_t p_size, word p_dash, word ws[]) { const size_t blocks_of_8 = p_size - (p_size % 8); for(size_t i = 0; i != p_size; ++i) { word* z_i = z + i; const word y = z_i[0] * p_dash; /* bigint_linmul3(ws, p, p_size, y); bigint_add2(z_i, z_size - i, ws, p_size+1); */ word carry = 0; for(size_t j = 0; j != blocks_of_8; j += 8) carry = word8_madd3(z_i + j, p + j, y, carry); for(size_t j = blocks_of_8; j != p_size; ++j) z_i[j] = word_madd3(p[j], y, z_i[j], &carry); word z_sum = z_i[p_size] + carry; carry = (z_sum < z_i[p_size]); z_i[p_size] = z_sum; for(size_t j = p_size + 1; carry && j != z_size - i; ++j) { ++z_i[j]; carry = !z_i[j]; } } word borrow = 0; for(size_t i = 0; i != p_size; ++i) ws[i] = word_sub(z[p_size + i], p[i], &borrow); ws[p_size] = word_sub(z[p_size+p_size], 0, &borrow); copy_mem(ws + p_size + 1, z + p_size, p_size + 1); copy_mem(z, ws + borrow*(p_size+1), p_size + 1); clear_mem(z + p_size + 1, z_size - p_size - 1); } void bigint_monty_mul(word z[], size_t z_size, const word x[], size_t x_size, size_t x_sw, const word y[], size_t y_size, size_t y_sw, const word p[], size_t p_size, word p_dash, word ws[]) { bigint_mul(&z[0], z_size, &ws[0], &x[0], x_size, x_sw, &y[0], y_size, y_sw); bigint_monty_redc(&z[0], z_size, &p[0], p_size, p_dash, &ws[0]); } void bigint_monty_sqr(word z[], size_t z_size, const word x[], size_t x_size, size_t x_sw, const word p[], size_t p_size, word p_dash, word ws[]) { bigint_sqr(&z[0], z_size, &ws[0], &x[0], x_size, x_sw); bigint_monty_redc(&z[0], z_size, &p[0], p_size, p_dash, &ws[0]); } } } Botan-1.10.12/src/math/mp/mp_msvc64/info.txt0000664000175000017500000000021112654331322020224 0ustar jackjack00000000000000load_on dep mp_bits 64 mp_asm.h mp_generic:mp_asmi.h x86_64 ia64 msvc Botan-1.10.12/src/math/mp/mp_msvc64/mp_asm.h0000664000175000017500000000151512654331322020165 0ustar jackjack00000000000000/* * Multiply-Add for 64-bit MSVC * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_ASM_H__ #define BOTAN_MP_ASM_H__ #include #include #if (BOTAN_MP_WORD_BITS != 64) #error The mp_msvc64 module requires that BOTAN_MP_WORD_BITS == 64 #endif #pragma intrinsic(_umul128) namespace Botan { extern "C" { /* * Word Multiply */ inline word word_madd2(word a, word b, word* c) { word hi, lo; lo = _umul128(a, b, &hi); lo += *c; hi += (lo < *c); // carry? *c = hi; return lo; } /* * Word Multiply/Add */ inline word word_madd3(word a, word b, word c, word* d) { word hi, lo; lo = _umul128(a, b, &hi); lo += c; hi += (lo < c); // carry? lo += *d; hi += (lo < *d); // carry? *d = hi; return lo; } } } #endif Botan-1.10.12/src/math/mp/mp_mulop.cpp0000664000175000017500000000332012654331322017252 0ustar jackjack00000000000000/* * Simple O(N^2) Multiplication and Squaring * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { extern "C" { /* * Simple O(N^2) Multiplication */ void bigint_simple_mul(word z[], const word x[], size_t x_size, const word y[], size_t y_size) { const size_t x_size_8 = x_size - (x_size % 8); clear_mem(z, x_size + y_size); for(size_t i = 0; i != y_size; ++i) { const word y_i = y[i]; word carry = 0; for(size_t j = 0; j != x_size_8; j += 8) carry = word8_madd3(z + i + j, x + j, y_i, carry); for(size_t j = x_size_8; j != x_size; ++j) z[i+j] = word_madd3(x[j], y_i, z[i+j], &carry); z[x_size+i] = carry; } } /* * Simple O(N^2) Squaring * * This is exactly the same algorithm as bigint_simple_mul, however * because C/C++ compilers suck at alias analysis it is good to have * the version where the compiler knows that x == y * * There is an O(n^1.5) squaring algorithm specified in Handbook of * Applied Cryptography, chapter 14 * */ void bigint_simple_sqr(word z[], const word x[], size_t x_size) { const size_t x_size_8 = x_size - (x_size % 8); clear_mem(z, 2*x_size); for(size_t i = 0; i != x_size; ++i) { const word x_i = x[i]; word carry = 0; for(size_t j = 0; j != x_size_8; j += 8) carry = word8_madd3(z + i + j, x + j, x_i, carry); for(size_t j = x_size_8; j != x_size; ++j) z[i+j] = word_madd3(x[j], x_i, z[i+j], &carry); z[x_size+i] = carry; } } } } Botan-1.10.12/src/math/mp/mp_shift.cpp0000664000175000017500000000564712654331322017251 0ustar jackjack00000000000000/* * MP Shift Algorithms * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { extern "C" { /* * Single Operand Left Shift */ void bigint_shl1(word x[], size_t x_size, size_t word_shift, size_t bit_shift) { if(word_shift) { for(size_t j = 1; j != x_size + 1; ++j) x[(x_size - j) + word_shift] = x[x_size - j]; clear_mem(x, word_shift); } if(bit_shift) { word carry = 0; for(size_t j = word_shift; j != x_size + word_shift + 1; ++j) { word temp = x[j]; x[j] = (temp << bit_shift) | carry; carry = (temp >> (MP_WORD_BITS - bit_shift)); } } } /* * Single Operand Right Shift */ void bigint_shr1(word x[], size_t x_size, size_t word_shift, size_t bit_shift) { if(x_size < word_shift) { clear_mem(x, x_size); return; } if(word_shift) { copy_mem(x, x + word_shift, x_size - word_shift); clear_mem(x + x_size - word_shift, word_shift); } if(bit_shift) { word carry = 0; size_t top = x_size - word_shift; while(top >= 4) { word w = x[top-1]; x[top-1] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); w = x[top-2]; x[top-2] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); w = x[top-3]; x[top-3] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); w = x[top-4]; x[top-4] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); top -= 4; } while(top) { word w = x[top-1]; x[top-1] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); top--; } } } /* * Two Operand Left Shift */ void bigint_shl2(word y[], const word x[], size_t x_size, size_t word_shift, size_t bit_shift) { for(size_t j = 0; j != x_size; ++j) y[j + word_shift] = x[j]; if(bit_shift) { word carry = 0; for(size_t j = word_shift; j != x_size + word_shift + 1; ++j) { word w = y[j]; y[j] = (w << bit_shift) | carry; carry = (w >> (MP_WORD_BITS - bit_shift)); } } } /* * Two Operand Right Shift */ void bigint_shr2(word y[], const word x[], size_t x_size, size_t word_shift, size_t bit_shift) { if(x_size < word_shift) return; for(size_t j = 0; j != x_size - word_shift; ++j) y[j] = x[j + word_shift]; if(bit_shift) { word carry = 0; for(size_t j = x_size - word_shift; j > 0; --j) { word w = y[j-1]; y[j-1] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); } } } } } Botan-1.10.12/src/math/mp/mp_types.h0000664000175000017500000000123712654331322016734 0ustar jackjack00000000000000/* * Low Level MPI Types * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MPI_TYPES_H__ #define BOTAN_MPI_TYPES_H__ #include namespace Botan { #if (BOTAN_MP_WORD_BITS == 8) typedef byte word; #elif (BOTAN_MP_WORD_BITS == 16) typedef u16bit word; #elif (BOTAN_MP_WORD_BITS == 32) typedef u32bit word; #elif (BOTAN_MP_WORD_BITS == 64) typedef u64bit word; #else #error BOTAN_MP_WORD_BITS must be 8, 16, 32, or 64 #endif const word MP_WORD_MASK = ~static_cast(0); const word MP_WORD_TOP_BIT = static_cast(1) << (8*sizeof(word) - 1); const word MP_WORD_MAX = MP_WORD_MASK; } #endif Botan-1.10.12/src/math/mp/mp_x86_32/info.txt0000664000175000017500000000020212654331322020033 0ustar jackjack00000000000000load_on dep mp_bits 32 mp_asm.h mp_asmi.h x86_32 clang gcc icc Botan-1.10.12/src/math/mp/mp_x86_32/mp_asm.h0000664000175000017500000000207412654331322017775 0ustar jackjack00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2008 Jack Lloyd * 2006 Luca Piccarreta * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_ASM_H__ #define BOTAN_MP_ASM_H__ #include #if (BOTAN_MP_WORD_BITS != 32) #error The mp_x86_32 module requires that BOTAN_MP_WORD_BITS == 32 #endif namespace Botan { extern "C" { /* * Helper Macros for x86 Assembly */ #define ASM(x) x "\n\t" /* * Word Multiply */ inline word word_madd2(word a, word b, word* c) { asm( ASM("mull %[b]") ASM("addl %[c],%[a]") ASM("adcl $0,%[carry]") : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*c) : "0"(a), "1"(b), [c]"g"(*c) : "cc"); return a; } /* * Word Multiply/Add */ inline word word_madd3(word a, word b, word c, word* d) { asm( ASM("mull %[b]") ASM("addl %[c],%[a]") ASM("adcl $0,%[carry]") ASM("addl %[d],%[a]") ASM("adcl $0,%[carry]") : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*d) : "0"(a), "1"(b), [c]"g"(c), [d]"g"(*d) : "cc"); return a; } } } #endif Botan-1.10.12/src/math/mp/mp_x86_32/mp_asmi.h0000664000175000017500000001334312654331322020147 0ustar jackjack00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2010 Jack Lloyd * 2006 Luca Piccarreta * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_ASM_INTERNAL_H__ #define BOTAN_MP_ASM_INTERNAL_H__ #include namespace Botan { extern "C" { /* * Helper Macros for x86 Assembly */ #ifndef ASM #define ASM(x) x "\n\t" #endif #define ADDSUB2_OP(OPERATION, INDEX) \ ASM("movl 4*" #INDEX "(%[y]), %[carry]") \ ASM(OPERATION " %[carry], 4*" #INDEX "(%[x])") \ #define ADDSUB3_OP(OPERATION, INDEX) \ ASM("movl 4*" #INDEX "(%[x]), %[carry]") \ ASM(OPERATION " 4*" #INDEX "(%[y]), %[carry]") \ ASM("movl %[carry], 4*" #INDEX "(%[z])") \ #define LINMUL_OP(WRITE_TO, INDEX) \ ASM("movl 4*" #INDEX "(%[x]),%%eax") \ ASM("mull %[y]") \ ASM("addl %[carry],%%eax") \ ASM("adcl $0,%%edx") \ ASM("movl %%edx,%[carry]") \ ASM("movl %%eax, 4*" #INDEX "(%[" WRITE_TO "])") #define MULADD_OP(IGNORED, INDEX) \ ASM("movl 4*" #INDEX "(%[x]),%%eax") \ ASM("mull %[y]") \ ASM("addl %[carry],%%eax") \ ASM("adcl $0,%%edx") \ ASM("addl 4*" #INDEX "(%[z]),%%eax") \ ASM("adcl $0,%%edx") \ ASM("movl %%edx,%[carry]") \ ASM("movl %%eax, 4*" #INDEX " (%[z])") #define DO_8_TIMES(MACRO, ARG) \ MACRO(ARG, 0) \ MACRO(ARG, 1) \ MACRO(ARG, 2) \ MACRO(ARG, 3) \ MACRO(ARG, 4) \ MACRO(ARG, 5) \ MACRO(ARG, 6) \ MACRO(ARG, 7) #define ADD_OR_SUBTRACT(CORE_CODE) \ ASM("rorl %[carry]") \ CORE_CODE \ ASM("sbbl %[carry],%[carry]") \ ASM("negl %[carry]") /* * Word Addition */ inline word word_add(word x, word y, word* carry) { asm( ADD_OR_SUBTRACT(ASM("adcl %[y],%[x]")) : [x]"=r"(x), [carry]"=r"(*carry) : "0"(x), [y]"rm"(y), "1"(*carry) : "cc"); return x; } /* * Eight Word Block Addition, Two Argument */ inline word word8_add2(word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "adcl")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), "0"(carry) : "cc", "memory"); return carry; } /* * Eight Word Block Addition, Three Argument */ inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "adcl")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) : "cc", "memory"); return carry; } /* * Word Subtraction */ inline word word_sub(word x, word y, word* carry) { asm( ADD_OR_SUBTRACT(ASM("sbbl %[y],%[x]")) : [x]"=r"(x), [carry]"=r"(*carry) : "0"(x), [y]"rm"(y), "1"(*carry) : "cc"); return x; } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2(word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "sbbl")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), "0"(carry) : "cc", "memory"); return carry; } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2_rev(word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbl")) : [carry]"=r"(carry) : [x]"r"(y), [y]"r"(x), [z]"r"(x), "0"(carry) : "cc", "memory"); return carry; } /* * Eight Word Block Subtraction, Three Argument */ inline word word8_sub3(word z[8], const word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbl")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) : "cc", "memory"); return carry; } /* * Eight Word Block Linear Multiplication */ inline word word8_linmul2(word x[8], word y, word carry) { asm( DO_8_TIMES(LINMUL_OP, "x") : [carry]"=r"(carry) : [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%eax", "%edx"); return carry; } /* * Eight Word Block Linear Multiplication */ inline word word8_linmul3(word z[8], const word x[8], word y, word carry) { asm( DO_8_TIMES(LINMUL_OP, "z") : [carry]"=r"(carry) : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%eax", "%edx"); return carry; } /* * Eight Word Block Multiply/Add */ inline word word8_madd3(word z[8], const word x[8], word y, word carry) { asm( DO_8_TIMES(MULADD_OP, "") : [carry]"=r"(carry) : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%eax", "%edx"); return carry; } /* * Multiply-Add Accumulator */ inline void word3_muladd(word* w2, word* w1, word* w0, word x, word y) { asm( ASM("mull %[y]") ASM("addl %[x],%[w0]") ASM("adcl %[y],%[w1]") ASM("adcl $0,%[w2]") : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) : "cc"); } /* * Multiply-Add Accumulator */ inline void word3_muladd_2(word* w2, word* w1, word* w0, word x, word y) { asm( ASM("mull %[y]") ASM("addl %[x],%[w0]") ASM("adcl %[y],%[w1]") ASM("adcl $0,%[w2]") ASM("addl %[x],%[w0]") ASM("adcl %[y],%[w1]") ASM("adcl $0,%[w2]") : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) : "cc"); } } } #endif Botan-1.10.12/src/math/mp/mp_x86_32_msvc/info.txt0000664000175000017500000000020412654331322021065 0ustar jackjack00000000000000mp_bits 32 load_on dep mp_generic:mp_asm.h mp_asmi.h x86_32 msvc Botan-1.10.12/src/math/mp/mp_x86_32_msvc/mp_asmi.h0000664000175000017500000002765312654331322021210 0ustar jackjack00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2010 Jack Lloyd * 2006 Luca Piccarreta * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_ASM_INTERNAL_H__ #define BOTAN_MP_ASM_INTERNAL_H__ #include namespace Botan { extern "C" { /* * Word Addition */ inline word word_add(word x, word y, word* carry) { word z = x + y; word c1 = (z < x); z += *carry; *carry = c1 | (z < *carry); return z; } /* * Eight Word Block Addition, Two Argument */ inline word word8_add2(word x[8], const word y[8], word carry) { __asm { mov edx,[x] mov esi,[y] xor eax,eax sub eax,[carry] //force CF=1 iff *carry==1 mov eax,[esi] adc [edx],eax mov eax,[esi+4] adc [edx+4],eax mov eax,[esi+8] adc [edx+8],eax mov eax,[esi+12] adc [edx+12],eax mov eax,[esi+16] adc [edx+16],eax mov eax,[esi+20] adc [edx+20],eax mov eax,[esi+24] adc [edx+24],eax mov eax,[esi+28] adc [edx+28],eax sbb eax,eax neg eax } } /* * Eight Word Block Addition, Three Argument */ inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) { __asm { mov edi,[x] mov esi,[y] mov ebx,[z] xor eax,eax sub eax,[carry] //force CF=1 iff *carry==1 mov eax,[edi] adc eax,[esi] mov [ebx],eax mov eax,[edi+4] adc eax,[esi+4] mov [ebx+4],eax mov eax,[edi+8] adc eax,[esi+8] mov [ebx+8],eax mov eax,[edi+12] adc eax,[esi+12] mov [ebx+12],eax mov eax,[edi+16] adc eax,[esi+16] mov [ebx+16],eax mov eax,[edi+20] adc eax,[esi+20] mov [ebx+20],eax mov eax,[edi+24] adc eax,[esi+24] mov [ebx+24],eax mov eax,[edi+28] adc eax,[esi+28] mov [ebx+28],eax sbb eax,eax neg eax } } /* * Word Subtraction */ inline word word_sub(word x, word y, word* carry) { word t0 = x - y; word c1 = (t0 > x); word z = t0 - *carry; *carry = c1 | (z > t0); return z; } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2(word x[8], const word y[8], word carry) { __asm { mov edi,[x] mov esi,[y] xor eax,eax sub eax,[carry] //force CF=1 iff *carry==1 mov eax,[edi] sbb eax,[esi] mov [edi],eax mov eax,[edi+4] sbb eax,[esi+4] mov [edi+4],eax mov eax,[edi+8] sbb eax,[esi+8] mov [edi+8],eax mov eax,[edi+12] sbb eax,[esi+12] mov [edi+12],eax mov eax,[edi+16] sbb eax,[esi+16] mov [edi+16],eax mov eax,[edi+20] sbb eax,[esi+20] mov [edi+20],eax mov eax,[edi+24] sbb eax,[esi+24] mov [edi+24],eax mov eax,[edi+28] sbb eax,[esi+28] mov [edi+28],eax sbb eax,eax neg eax } } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2_rev(word x[8], const word y[8], word carry) { x[0] = word_sub(y[0], x[0], &carry); x[1] = word_sub(y[1], x[1], &carry); x[2] = word_sub(y[2], x[2], &carry); x[3] = word_sub(y[3], x[3], &carry); x[4] = word_sub(y[4], x[4], &carry); x[5] = word_sub(y[5], x[5], &carry); x[6] = word_sub(y[6], x[6], &carry); x[7] = word_sub(y[7], x[7], &carry); return carry; } /* * Eight Word Block Subtraction, Three Argument */ inline word word8_sub3(word z[8], const word x[8], const word y[8], word carry) { __asm { mov edi,[x] mov esi,[y] xor eax,eax sub eax,[carry] //force CF=1 iff *carry==1 mov ebx,[z] mov eax,[edi] sbb eax,[esi] mov [ebx],eax mov eax,[edi+4] sbb eax,[esi+4] mov [ebx+4],eax mov eax,[edi+8] sbb eax,[esi+8] mov [ebx+8],eax mov eax,[edi+12] sbb eax,[esi+12] mov [ebx+12],eax mov eax,[edi+16] sbb eax,[esi+16] mov [ebx+16],eax mov eax,[edi+20] sbb eax,[esi+20] mov [ebx+20],eax mov eax,[edi+24] sbb eax,[esi+24] mov [ebx+24],eax mov eax,[edi+28] sbb eax,[esi+28] mov [ebx+28],eax sbb eax,eax neg eax } } /* * Eight Word Block Linear Multiplication */ inline word word8_linmul2(word x[8], word y, word carry) { __asm { mov esi,[x] mov eax,[esi] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,[carry] //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi],eax //load a mov eax,[esi+4] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+4],eax //load a mov eax,[esi+8] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+8],eax //load a mov eax,[esi+12] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+12],eax //load a mov eax,[esi+16] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+16],eax //load a mov eax,[esi+20] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+20],eax //load a mov eax,[esi+24] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+24],eax //load a mov eax,[esi+28] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov [esi+28],eax //load a mov eax,edx //store carry } } /* * Eight Word Block Linear Multiplication */ inline word word8_muladd(word z[8], const word x[8], word y, word carry) { __asm { mov esi,[x] mov ebx,[y] mov edi,[z] mov eax,[esi] //load a mul ebx //edx(hi):eax(lo)=a*b add eax,[carry] //sum lo carry adc edx,0 //sum hi carry add eax,[edi] //sum lo z adc edx,0 //sum hi z mov ecx,edx //carry for next block = hi z mov [edi],eax //save lo z mov eax,[esi+4] mul ebx add eax,ecx adc edx,0 add eax,[edi+4] adc edx,0 mov ecx,edx mov [edi+4],eax mov eax,[esi+8] mul ebx add eax,ecx adc edx,0 add eax,[edi+8] adc edx,0 mov ecx,edx mov [edi+8],eax mov eax,[esi+12] mul ebx add eax,ecx adc edx,0 add eax,[edi+12] adc edx,0 mov ecx,edx mov [edi+12],eax mov eax,[esi+16] mul ebx add eax,ecx adc edx,0 add eax,[edi+16] adc edx,0 mov ecx,edx mov [edi+16],eax mov eax,[esi+20] mul ebx add eax,ecx adc edx,0 add eax,[edi+20] adc edx,0 mov ecx,edx mov [edi+20],eax mov eax,[esi+24] mul ebx add eax,ecx adc edx,0 add eax,[edi+24] adc edx,0 mov ecx,edx mov [edi+24],eax mov eax,[esi+28] mul ebx add eax,ecx adc edx,0 add eax,[edi+28] adc edx,0 mov [edi+28],eax mov eax,edx } } inline word word8_linmul3(word z[4], const word x[4], word y, word carry) { __asm { #if 0 //it's slower!!! mov edx,[z] mov eax,[x] movd mm7,[y] movd mm0,[eax] movd mm1,[eax+4] movd mm2,[eax+8] pmuludq mm0,mm7 pmuludq mm1,mm7 pmuludq mm2,mm7 movd mm6,[carry] paddq mm0,mm6 movd [edx],mm0 psrlq mm0,32 paddq mm1,mm0 movd [edx+4],mm1 movd mm3,[eax+12] psrlq mm1,32 paddq mm2,mm1 movd [edx+8],mm2 pmuludq mm3,mm7 movd mm4,[eax+16] psrlq mm2,32 paddq mm3,mm2 movd [edx+12],mm3 pmuludq mm4,mm7 movd mm5,[eax+20] psrlq mm3,32 paddq mm4,mm3 movd [edx+16],mm4 pmuludq mm5,mm7 movd mm0,[eax+24] psrlq mm4,32 paddq mm5,mm4 movd [edx+20],mm5 pmuludq mm0,mm7 movd mm1,[eax+28] psrlq mm5,32 paddq mm0,mm5 movd [edx+24],mm0 pmuludq mm1,mm7 psrlq mm0,32 paddq mm1,mm0 movd [edx+28],mm1 psrlq mm1,32 movd eax,mm1 emms #else mov edi,[z] mov esi,[x] mov eax,[esi] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,[carry] //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi],eax //load a mov eax,[esi+4] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+4],eax //load a mov eax,[esi+8] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+8],eax //load a mov eax,[esi+12] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+12],eax //load a mov eax,[esi+16] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+16],eax //load a mov eax,[esi+20] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+20],eax //load a mov eax,[esi+24] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+24],eax //load a mov eax,[esi+28] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov [edi+28],eax //load a mov eax,edx //store carry #endif } } /* * Eight Word Block Multiply/Add */ inline word word8_madd3(word z[8], const word x[8], word y, word carry) { z[0] = word_madd3(x[0], y, z[0], &carry); z[1] = word_madd3(x[1], y, z[1], &carry); z[2] = word_madd3(x[2], y, z[2], &carry); z[3] = word_madd3(x[3], y, z[3], &carry); z[4] = word_madd3(x[4], y, z[4], &carry); z[5] = word_madd3(x[5], y, z[5], &carry); z[6] = word_madd3(x[6], y, z[6], &carry); z[7] = word_madd3(x[7], y, z[7], &carry); return carry; } /* * Multiply-Add Accumulator */ inline void word3_muladd(word* w2, word* w1, word* w0, word a, word b) { word carry = *w0; *w0 = word_madd2(a, b, &carry); *w1 += carry; *w2 += (*w1 < carry) ? 1 : 0; } /* * Multiply-Add Accumulator */ inline void word3_muladd_2(word* w2, word* w1, word* w0, word a, word b) { word carry = 0; a = word_madd2(a, b, &carry); b = carry; word top = (b >> (BOTAN_MP_WORD_BITS-1)); b <<= 1; b |= (a >> (BOTAN_MP_WORD_BITS-1)); a <<= 1; carry = 0; *w0 = word_add(*w0, a, &carry); *w1 = word_add(*w1, b, &carry); *w2 = word_add(*w2, top, &carry); } } } #endif Botan-1.10.12/src/math/mp/mp_x86_64/info.txt0000664000175000017500000000020212654331322020040 0ustar jackjack00000000000000load_on dep mp_bits 64 mp_asm.h mp_asmi.h x86_64 clang gcc icc Botan-1.10.12/src/math/mp/mp_x86_64/mp_asm.h0000664000175000017500000000211312654331322017774 0ustar jackjack00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2008 Jack Lloyd * 2006 Luca Piccarreta * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_ASM_H__ #define BOTAN_MP_ASM_H__ #include #if (BOTAN_MP_WORD_BITS != 64) #error The mp_x86_64 module requires that BOTAN_MP_WORD_BITS == 64 #endif namespace Botan { extern "C" { /* * Helper Macros for x86-64 Assembly */ #define ASM(x) x "\n\t" /* * Word Multiply */ inline word word_madd2(word a, word b, word* c) { asm( ASM("mulq %[b]") ASM("addq %[c],%[a]") ASM("adcq $0,%[carry]") : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*c) : "0"(a), "1"(b), [c]"g"(*c) : "cc"); return a; } /* * Word Multiply/Add */ inline word word_madd3(word a, word b, word c, word* d) { asm( ASM("mulq %[b]") ASM("addq %[c],%[a]") ASM("adcq $0,%[carry]") ASM("addq %[d],%[a]") ASM("adcq $0,%[carry]") : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*d) : "0"(a), "1"(b), [c]"g"(c), [d]"g"(*d) : "cc"); return a; } #undef ASM } } #endif Botan-1.10.12/src/math/mp/mp_x86_64/mp_asmi.h0000664000175000017500000001354112654331322020154 0ustar jackjack00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2010 Jack Lloyd * 2006 Luca Piccarreta * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MP_ASM_INTERNAL_H__ #define BOTAN_MP_ASM_INTERNAL_H__ #include namespace Botan { extern "C" { /* * Helper Macros for x86-64 Assembly */ #ifndef ASM #define ASM(x) x "\n\t" #endif #define ADDSUB2_OP(OPERATION, INDEX) \ ASM("movq 8*" #INDEX "(%[y]), %[carry]") \ ASM(OPERATION " %[carry], 8*" #INDEX "(%[x])") \ #define ADDSUB3_OP(OPERATION, INDEX) \ ASM("movq 8*" #INDEX "(%[x]), %[carry]") \ ASM(OPERATION " 8*" #INDEX "(%[y]), %[carry]") \ ASM("movq %[carry], 8*" #INDEX "(%[z])") \ #define LINMUL_OP(WRITE_TO, INDEX) \ ASM("movq 8*" #INDEX "(%[x]),%%rax") \ ASM("mulq %[y]") \ ASM("addq %[carry],%%rax") \ ASM("adcq $0,%%rdx") \ ASM("movq %%rdx,%[carry]") \ ASM("movq %%rax, 8*" #INDEX "(%[" WRITE_TO "])") #define MULADD_OP(IGNORED, INDEX) \ ASM("movq 8*" #INDEX "(%[x]),%%rax") \ ASM("mulq %[y]") \ ASM("addq %[carry],%%rax") \ ASM("adcq $0,%%rdx") \ ASM("addq 8*" #INDEX "(%[z]),%%rax") \ ASM("adcq $0,%%rdx") \ ASM("movq %%rdx,%[carry]") \ ASM("movq %%rax, 8*" #INDEX " (%[z])") #define DO_8_TIMES(MACRO, ARG) \ MACRO(ARG, 0) \ MACRO(ARG, 1) \ MACRO(ARG, 2) \ MACRO(ARG, 3) \ MACRO(ARG, 4) \ MACRO(ARG, 5) \ MACRO(ARG, 6) \ MACRO(ARG, 7) #define ADD_OR_SUBTRACT(CORE_CODE) \ ASM("rorq %[carry]") \ CORE_CODE \ ASM("sbbq %[carry],%[carry]") \ ASM("negq %[carry]") /* * Word Addition */ inline word word_add(word x, word y, word* carry) { asm( ADD_OR_SUBTRACT(ASM("adcq %[y],%[x]")) : [x]"=r"(x), [carry]"=r"(*carry) : "0"(x), [y]"rm"(y), "1"(*carry) : "cc"); return x; } /* * Eight Word Block Addition, Two Argument */ inline word word8_add2(word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "adcq")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), "0"(carry) : "cc", "memory"); return carry; } /* * Eight Word Block Addition, Three Argument */ inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "adcq")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) : "cc", "memory"); return carry; } /* * Word Subtraction */ inline word word_sub(word x, word y, word* carry) { asm( ADD_OR_SUBTRACT(ASM("sbbq %[y],%[x]")) : [x]"=r"(x), [carry]"=r"(*carry) : "0"(x), [y]"rm"(y), "1"(*carry) : "cc"); return x; } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2(word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "sbbq")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), "0"(carry) : "cc", "memory"); return carry; } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2_rev(word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbq")) : [carry]"=r"(carry) : [x]"r"(y), [y]"r"(x), [z]"r"(x), "0"(carry) : "cc", "memory"); return carry; } /* * Eight Word Block Subtraction, Three Argument */ inline word word8_sub3(word z[8], const word x[8], const word y[8], word carry) { asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbq")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) : "cc", "memory"); return carry; } /* * Eight Word Block Linear Multiplication */ inline word word8_linmul2(word x[8], word y, word carry) { asm( DO_8_TIMES(LINMUL_OP, "x") : [carry]"=r"(carry) : [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%rax", "%rdx"); return carry; } /* * Eight Word Block Linear Multiplication */ inline word word8_linmul3(word z[8], const word x[8], word y, word carry) { asm( DO_8_TIMES(LINMUL_OP, "z") : [carry]"=r"(carry) : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%rax", "%rdx"); return carry; } /* * Eight Word Block Multiply/Add */ inline word word8_madd3(word z[8], const word x[8], word y, word carry) { asm( DO_8_TIMES(MULADD_OP, "") : [carry]"=r"(carry) : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%rax", "%rdx"); return carry; } /* * Multiply-Add Accumulator */ inline void word3_muladd(word* w2, word* w1, word* w0, word x, word y) { asm( ASM("mulq %[y]") ASM("addq %[x],%[w0]") ASM("adcq %[y],%[w1]") ASM("adcq $0,%[w2]") : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) : "cc"); } /* * Multiply-Add Accumulator */ inline void word3_muladd_2(word* w2, word* w1, word* w0, word x, word y) { asm( ASM("mulq %[y]") ASM("addq %[x],%[w0]") ASM("adcq %[y],%[w1]") ASM("adcq $0,%[w2]") ASM("addq %[x],%[w0]") ASM("adcq %[y],%[w1]") ASM("adcq $0,%[w2]") : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) : "cc"); } #undef ASM #undef DO_8_TIMES #undef ADD_OR_SUBTRACT #undef ADDSUB2_OP #undef ADDSUB3_OP #undef LINMUL_OP #undef MULADD_OP } } #endif Botan-1.10.12/src/math/numbertheory/def_powm.h0000664000175000017500000000263012654331322021001 0ustar jackjack00000000000000/* * Modular Exponentiation * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DEFAULT_MODEXP_H__ #define BOTAN_DEFAULT_MODEXP_H__ #include #include #include namespace Botan { /** * Fixed Window Exponentiator */ class Fixed_Window_Exponentiator : public Modular_Exponentiator { public: void set_exponent(const BigInt&); void set_base(const BigInt&); BigInt execute() const; Modular_Exponentiator* copy() const { return new Fixed_Window_Exponentiator(*this); } Fixed_Window_Exponentiator(const BigInt&, Power_Mod::Usage_Hints); private: Modular_Reducer reducer; BigInt exp; size_t window_bits; std::vector g; Power_Mod::Usage_Hints hints; }; /** * Montgomery Exponentiator */ class Montgomery_Exponentiator : public Modular_Exponentiator { public: void set_exponent(const BigInt&); void set_base(const BigInt&); BigInt execute() const; Modular_Exponentiator* copy() const { return new Montgomery_Exponentiator(*this); } Montgomery_Exponentiator(const BigInt&, Power_Mod::Usage_Hints); private: BigInt exp, modulus; BigInt R2, R_mod; std::vector g; word mod_prime; size_t mod_words, exp_bits, window_bits; Power_Mod::Usage_Hints hints; }; } #endif Botan-1.10.12/src/math/numbertheory/dsa_gen.cpp0000664000175000017500000000612612654331322021140 0ustar jackjack00000000000000/* * DSA Parameter Generation * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { namespace { /* * Check if this size is allowed by FIPS 186-3 */ bool fips186_3_valid_size(size_t pbits, size_t qbits) { if(qbits == 160) return (pbits == 512 || pbits == 768 || pbits == 1024); if(qbits == 224) return (pbits == 2048); if(qbits == 256) return (pbits == 2048 || pbits == 3072); return false; } } /* * Attempt DSA prime generation with given seed */ bool generate_dsa_primes(RandomNumberGenerator& rng, Algorithm_Factory& af, BigInt& p, BigInt& q, size_t pbits, size_t qbits, const MemoryRegion& seed_c) { if(!fips186_3_valid_size(pbits, qbits)) throw Invalid_Argument( "FIPS 186-3 does not allow DSA domain parameters of " + to_string(pbits) + "/" + to_string(qbits) + " bits long"); if(seed_c.size() * 8 < qbits) throw Invalid_Argument( "Generating a DSA parameter set with a " + to_string(qbits) + "long q requires a seed at least as many bits long"); std::auto_ptr hash( af.make_hash_function("SHA-" + to_string(qbits))); const size_t HASH_SIZE = hash->output_length(); class Seed { public: Seed(const MemoryRegion& s) : seed(s) {} operator MemoryRegion& () { return seed; } Seed& operator++() { for(size_t j = seed.size(); j > 0; --j) if(++seed[j-1]) break; return (*this); } private: SecureVector seed; }; Seed seed(seed_c); q.binary_decode(hash->process(seed)); q.set_bit(qbits-1); q.set_bit(0); if(!check_prime(q, rng)) return false; const size_t n = (pbits-1) / (HASH_SIZE * 8), b = (pbits-1) % (HASH_SIZE * 8); BigInt X; SecureVector V(HASH_SIZE * (n+1)); for(size_t j = 0; j != 4096; ++j) { for(size_t k = 0; k <= n; ++k) { ++seed; hash->update(seed); hash->final(&V[HASH_SIZE * (n-k)]); } X.binary_decode(&V[HASH_SIZE - 1 - b/8], V.size() - (HASH_SIZE - 1 - b/8)); X.set_bit(pbits-1); p = X - (X % (2*q) - 1); if(p.bits() == pbits && check_prime(p, rng)) return true; } return false; } /* * Generate DSA Primes */ SecureVector generate_dsa_primes(RandomNumberGenerator& rng, Algorithm_Factory& af, BigInt& p, BigInt& q, size_t pbits, size_t qbits) { while(true) { SecureVector seed = rng.random_vec(qbits / 8); if(generate_dsa_primes(rng, af, p, q, pbits, qbits, seed)) return seed; } } } Botan-1.10.12/src/math/numbertheory/info.txt0000664000175000017500000000055012654331322020523 0ustar jackjack00000000000000define BIGINT_MATH load_on auto numthry.h pow_mod.h reducer.h def_powm.h dsa_gen.cpp jacobi.cpp make_prm.cpp mp_numth.cpp numthry.cpp pow_mod.cpp powm_fw.cpp powm_mnt.cpp primes.cpp reducer.cpp ressol.cpp algo_factory bigint hash libstate rng Botan-1.10.12/src/math/numbertheory/jacobi.cpp0000664000175000017500000000172012654331322020762 0ustar jackjack00000000000000/* * Jacobi Function * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * Calculate the Jacobi symbol */ s32bit jacobi(const BigInt& a, const BigInt& n) { if(a.is_negative()) throw Invalid_Argument("jacobi: first argument must be non-negative"); if(n.is_even() || n < 2) throw Invalid_Argument("jacobi: second argument must be odd and > 1"); BigInt x = a, y = n; s32bit J = 1; while(y > 1) { x %= y; if(x > y / 2) { x = y - x; if(y % 4 == 3) J = -J; } if(x.is_zero()) return 0; size_t shifts = low_zero_bits(x); x >>= shifts; if(shifts % 2) { word y_mod_8 = y % 8; if(y_mod_8 == 3 || y_mod_8 == 5) J = -J; } if(x % 4 == 3 && y % 4 == 3) J = -J; std::swap(x, y); } return J; } } Botan-1.10.12/src/math/numbertheory/make_prm.cpp0000664000175000017500000000467412654331322021341 0ustar jackjack00000000000000/* * Prime Generation * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Generate a random prime */ BigInt random_prime(RandomNumberGenerator& rng, size_t bits, const BigInt& coprime, size_t equiv, size_t modulo) { if(bits <= 1) throw Invalid_Argument("random_prime: Can't make a prime of " + to_string(bits) + " bits"); else if(bits == 2) return ((rng.next_byte() % 2) ? 2 : 3); else if(bits == 3) return ((rng.next_byte() % 2) ? 5 : 7); else if(bits == 4) return ((rng.next_byte() % 2) ? 11 : 13); if(coprime <= 0) throw Invalid_Argument("random_prime: coprime must be > 0"); if(modulo % 2 == 1 || modulo == 0) throw Invalid_Argument("random_prime: Invalid modulo value"); if(equiv >= modulo || equiv % 2 == 0) throw Invalid_Argument("random_prime: equiv must be < modulo, and odd"); while(true) { BigInt p(rng, bits); // Force lowest and two top bits on p.set_bit(bits - 1); p.set_bit(bits - 2); p.set_bit(0); if(p % modulo != equiv) p += (modulo - p % modulo) + equiv; const size_t sieve_size = std::min(bits / 2, PRIME_TABLE_SIZE); SecureVector sieve(sieve_size); for(size_t j = 0; j != sieve.size(); ++j) sieve[j] = p % PRIMES[j]; size_t counter = 0; while(true) { if(counter == 4096 || p.bits() > bits) break; bool passes_sieve = true; ++counter; p += modulo; if(p.bits() > bits) break; for(size_t j = 0; j != sieve.size(); ++j) { sieve[j] = (sieve[j] + modulo) % PRIMES[j]; if(sieve[j] == 0) passes_sieve = false; } if(!passes_sieve || gcd(p - 1, coprime) != 1) continue; if(check_prime(p, rng)) return p; } } } /* * Generate a random safe prime */ BigInt random_safe_prime(RandomNumberGenerator& rng, size_t bits) { if(bits <= 64) throw Invalid_Argument("random_safe_prime: Can't make a prime of " + to_string(bits) + " bits"); BigInt p; do p = (random_prime(rng, bits - 1) << 1) + 1; while(!check_prime(p, rng)); return p; } } Botan-1.10.12/src/math/numbertheory/mp_numth.cpp0000664000175000017500000000316012654331322021362 0ustar jackjack00000000000000/* * Fused and Important MP Algorithms * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Square a BigInt */ BigInt square(const BigInt& x) { const size_t x_sw = x.sig_words(); BigInt z(BigInt::Positive, round_up(2*x_sw, 16)); SecureVector workspace(z.size()); bigint_sqr(z.get_reg(), z.size(), workspace, x.data(), x.size(), x_sw); return z; } /* * Multiply-Add Operation */ BigInt mul_add(const BigInt& a, const BigInt& b, const BigInt& c) { if(c.is_negative() || c.is_zero()) throw Invalid_Argument("mul_add: Third argument must be > 0"); BigInt::Sign sign = BigInt::Positive; if(a.sign() != b.sign()) sign = BigInt::Negative; const size_t a_sw = a.sig_words(); const size_t b_sw = b.sig_words(); const size_t c_sw = c.sig_words(); BigInt r(sign, std::max(a.size() + b.size(), c_sw) + 1); SecureVector workspace(r.size()); bigint_mul(r.get_reg(), r.size(), workspace, a.data(), a.size(), a_sw, b.data(), b.size(), b_sw); const size_t r_size = std::max(r.sig_words(), c_sw); bigint_add2(r.get_reg(), r_size, c.data(), c_sw); return r; } /* * Subtract-Multiply Operation */ BigInt sub_mul(const BigInt& a, const BigInt& b, const BigInt& c) { if(a.is_negative() || b.is_negative()) throw Invalid_Argument("sub_mul: First two arguments must be >= 0"); BigInt r = a; r -= b; r *= c; return r; } } Botan-1.10.12/src/math/numbertheory/numthry.cpp0000664000175000017500000001470312654331322021246 0ustar jackjack00000000000000/* * Number Theory Functions * (C) 1999-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { /* * Miller-Rabin Primality Tester */ class MillerRabin_Test { public: bool is_witness(const BigInt& nonce); MillerRabin_Test(const BigInt& num); private: BigInt n, r, n_minus_1; size_t s; Fixed_Exponent_Power_Mod pow_mod; Modular_Reducer reducer; }; /* * Miller-Rabin Test, as described in Handbook of Applied Cryptography * section 4.24 */ bool MillerRabin_Test::is_witness(const BigInt& a) { if(a < 2 || a >= n_minus_1) throw Invalid_Argument("Bad size for nonce in Miller-Rabin test"); BigInt y = pow_mod(a); if(y == 1 || y == n_minus_1) return false; for(size_t i = 1; i != s; ++i) { y = reducer.square(y); if(y == 1) // found a non-trivial square root return true; if(y == n_minus_1) // -1, trivial square root, so give up return false; } // If we reached here then n fails the Fermat test return true; } /* * Miller-Rabin Constructor */ MillerRabin_Test::MillerRabin_Test(const BigInt& num) { if(num.is_even() || num < 3) throw Invalid_Argument("MillerRabin_Test: Invalid number for testing"); n = num; n_minus_1 = n - 1; s = low_zero_bits(n_minus_1); r = n_minus_1 >> s; pow_mod = Fixed_Exponent_Power_Mod(r, n); reducer = Modular_Reducer(n); } /* * Miller-Rabin Iterations */ size_t miller_rabin_test_iterations(size_t bits, size_t level) { struct mapping { size_t bits; size_t verify_iter; size_t check_iter; }; static const mapping tests[] = { { 50, 55, 25 }, { 100, 38, 22 }, { 160, 32, 18 }, { 163, 31, 17 }, { 168, 30, 16 }, { 177, 29, 16 }, { 181, 28, 15 }, { 185, 27, 15 }, { 190, 26, 15 }, { 195, 25, 14 }, { 201, 24, 14 }, { 208, 23, 14 }, { 215, 22, 13 }, { 222, 21, 13 }, { 231, 20, 13 }, { 241, 19, 12 }, { 252, 18, 12 }, { 264, 17, 12 }, { 278, 16, 11 }, { 294, 15, 10 }, { 313, 14, 9 }, { 334, 13, 8 }, { 360, 12, 8 }, { 392, 11, 7 }, { 430, 10, 7 }, { 479, 9, 6 }, { 542, 8, 6 }, { 626, 7, 5 }, { 746, 6, 4 }, { 926, 5, 3 }, { 1232, 4, 2 }, { 1853, 3, 2 }, { 0, 0, 0 } }; for(size_t i = 0; tests[i].bits; ++i) { if(bits <= tests[i].bits) { if(level >= 2) return tests[i].verify_iter; else if(level == 1) return tests[i].check_iter; else if(level == 0) return std::max(tests[i].check_iter / 4, 1); } } return level > 0 ? 2 : 1; // for large inputs } } /* * Return the number of 0 bits at the end of n */ size_t low_zero_bits(const BigInt& n) { size_t low_zero = 0; if(n.is_positive() && n.is_nonzero()) { for(size_t i = 0; i != n.size(); ++i) { word x = n[i]; if(x) { low_zero += ctz(x); break; } else low_zero += BOTAN_MP_WORD_BITS; } } return low_zero; } /* * Calculate the GCD */ BigInt gcd(const BigInt& a, const BigInt& b) { if(a.is_zero() || b.is_zero()) return 0; if(a == 1 || b == 1) return 1; BigInt x = a, y = b; x.set_sign(BigInt::Positive); y.set_sign(BigInt::Positive); size_t shift = std::min(low_zero_bits(x), low_zero_bits(y)); x >>= shift; y >>= shift; while(x.is_nonzero()) { x >>= low_zero_bits(x); y >>= low_zero_bits(y); if(x >= y) { x -= y; x >>= 1; } else { y -= x; y >>= 1; } } return (y << shift); } /* * Calculate the LCM */ BigInt lcm(const BigInt& a, const BigInt& b) { return ((a * b) / gcd(a, b)); } /* * Find the Modular Inverse */ BigInt inverse_mod(const BigInt& n, const BigInt& mod) { if(mod.is_zero()) throw BigInt::DivideByZero(); if(mod.is_negative() || n.is_negative()) throw Invalid_Argument("inverse_mod: arguments must be non-negative"); if(n.is_zero() || (n.is_even() && mod.is_even())) return 0; BigInt x = mod, y = n, u = mod, v = n; BigInt A = 1, B = 0, C = 0, D = 1; while(u.is_nonzero()) { size_t zero_bits = low_zero_bits(u); u >>= zero_bits; for(size_t i = 0; i != zero_bits; ++i) { if(A.is_odd() || B.is_odd()) { A += y; B -= x; } A >>= 1; B >>= 1; } zero_bits = low_zero_bits(v); v >>= zero_bits; for(size_t i = 0; i != zero_bits; ++i) { if(C.is_odd() || D.is_odd()) { C += y; D -= x; } C >>= 1; D >>= 1; } if(u >= v) { u -= v; A -= C; B -= D; } else { v -= u; C -= A; D -= B; } } if(v != 1) return 0; while(D.is_negative()) D += mod; while(D >= mod) D -= mod; return D; } /* * Modular Exponentiation */ BigInt power_mod(const BigInt& base, const BigInt& exp, const BigInt& mod) { Power_Mod pow_mod(mod); pow_mod.set_base(base); pow_mod.set_exponent(exp); return pow_mod.execute(); } /* * Test for primaility using Miller-Rabin */ bool primality_test(const BigInt& n, RandomNumberGenerator& rng, size_t level) { const size_t PREF_NONCE_BITS = 128; if(n == 2) return true; if(n <= 1 || n.is_even()) return false; // Fast path testing for small numbers (<= 65521) if(n <= PRIMES[PRIME_TABLE_SIZE-1]) { const word num = n.word_at(0); for(size_t i = 0; PRIMES[i]; ++i) { if(num == PRIMES[i]) return true; if(num < PRIMES[i]) return false; } return false; } if(level > 2) level = 2; const size_t NONCE_BITS = std::min(n.bits() - 2, PREF_NONCE_BITS); MillerRabin_Test mr(n); if(mr.is_witness(2)) return false; const size_t tests = miller_rabin_test_iterations(n.bits(), level); for(size_t i = 0; i != tests; ++i) { BigInt nonce; while(nonce < 2 || nonce >= (n-1)) nonce.randomize(rng, NONCE_BITS); if(mr.is_witness(nonce)) return false; } return true; } } Botan-1.10.12/src/math/numbertheory/numthry.h0000664000175000017500000001471712654331322020720 0ustar jackjack00000000000000/* * Number Theory Functions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_NUMBER_THEORY_H__ #define BOTAN_NUMBER_THEORY_H__ #include #include #include namespace Botan { /** * Fused multiply-add * @param a an integer * @param b an integer * @param c an integer * @return (a*b)+c */ BigInt BOTAN_DLL mul_add(const BigInt& a, const BigInt& b, const BigInt& c); /** * Fused subtract-multiply * @param a an integer * @param b an integer * @param c an integer * @return (a-b)*c */ BigInt BOTAN_DLL sub_mul(const BigInt& a, const BigInt& b, const BigInt& c); /** * Return the absolute value * @param n an integer * @return absolute value of n */ inline BigInt abs(const BigInt& n) { return n.abs(); } /** * Compute the greatest common divisor * @param x a positive integer * @param y a positive integer * @return gcd(x,y) */ BigInt BOTAN_DLL gcd(const BigInt& x, const BigInt& y); /** * Least common multiple * @param x a positive integer * @param y a positive integer * @return z, smallest integer such that z % x == 0 and z % y == 0 */ BigInt BOTAN_DLL lcm(const BigInt& x, const BigInt& y); /** * @param x an integer * @return (x*x) */ BigInt BOTAN_DLL square(const BigInt& x); /** * Modular inversion * @param x a positive integer * @param modulus a positive integer * @return y st (x*y) % modulus == 1 */ BigInt BOTAN_DLL inverse_mod(const BigInt& x, const BigInt& modulus); /** * Compute the Jacobi symbol. If n is prime, this is equivalent * to the Legendre symbol. * @see http://mathworld.wolfram.com/JacobiSymbol.html * * @param a is a non-negative integer * @param n is an odd integer > 1 * @return (n / m) */ s32bit BOTAN_DLL jacobi(const BigInt& a, const BigInt& n); /** * Modular exponentation * @param b an integer base * @param x a positive exponent * @param m a positive modulus * @return (b^x) % m */ BigInt BOTAN_DLL power_mod(const BigInt& b, const BigInt& x, const BigInt& m); /** * Compute the square root of x modulo a prime using the * Shanks-Tonnelli algorithm * * @param x the input * @param p the prime * @return y such that (y*y)%p == x, or -1 if no such integer */ BigInt BOTAN_DLL ressol(const BigInt& x, const BigInt& p); /** * @param x an integer * @return count of the zero bits in x, or, equivalently, the largest * value of n such that 2^n divides x evently */ size_t BOTAN_DLL low_zero_bits(const BigInt& x); /** * Primality Testing * @param n a positive integer to test for primality * @param rng a random number generator * @param level how hard to test * @return true if all primality tests passed, otherwise false */ bool BOTAN_DLL primality_test(const BigInt& n, RandomNumberGenerator& rng, size_t level = 1); /** * Quickly check for primality * @param n a positive integer to test for primality * @param rng a random number generator * @return true if all primality tests passed, otherwise false */ inline bool quick_check_prime(const BigInt& n, RandomNumberGenerator& rng) { return primality_test(n, rng, 0); } /** * Check for primality * @param n a positive integer to test for primality * @param rng a random number generator * @return true if all primality tests passed, otherwise false */ inline bool check_prime(const BigInt& n, RandomNumberGenerator& rng) { return primality_test(n, rng, 1); } /** * Verify primality - this function is slow but useful if you want to * ensure that a possibly malicious entity did not provide you with * something that 'looks like' a prime * @param n a positive integer to test for primality * @param rng a random number generator * @return true if all primality tests passed, otherwise false */ inline bool verify_prime(const BigInt& n, RandomNumberGenerator& rng) { return primality_test(n, rng, 2); } /** * Randomly generate a prime * @param rng a random number generator * @param bits how large the resulting prime should be in bits * @param coprime a positive integer the result should be coprime to * @param equiv a non-negative number that the result should be equivalent to modulo equiv_mod * @param equiv_mod the modulus equiv should be checked against * @return random prime with the specified criteria */ BigInt BOTAN_DLL random_prime(RandomNumberGenerator& rng, size_t bits, const BigInt& coprime = 1, size_t equiv = 1, size_t equiv_mod = 2); /** * Return a 'safe' prime, of the form p=2*q+1 with q prime * @param rng a random number generator * @param bits is how long the resulting prime should be * @return prime randomly chosen from safe primes of length bits */ BigInt BOTAN_DLL random_safe_prime(RandomNumberGenerator& rng, size_t bits); class Algorithm_Factory; /** * Generate DSA parameters using the FIPS 186 kosherizer * @param rng a random number generator * @param af an algorithm factory * @param p_out where the prime p will be stored * @param q_out where the prime q will be stored * @param pbits how long p will be in bits * @param qbits how long q will be in bits * @return random seed used to generate this parameter set */ SecureVector BOTAN_DLL generate_dsa_primes(RandomNumberGenerator& rng, Algorithm_Factory& af, BigInt& p_out, BigInt& q_out, size_t pbits, size_t qbits); /** * Generate DSA parameters using the FIPS 186 kosherizer * @param rng a random number generator * @param af an algorithm factory * @param p_out where the prime p will be stored * @param q_out where the prime q will be stored * @param pbits how long p will be in bits * @param qbits how long q will be in bits * @param seed the seed used to generate the parameters * @return true if seed generated a valid DSA parameter set, otherwise false. p_out and q_out are only valid if true was returned. */ bool BOTAN_DLL generate_dsa_primes(RandomNumberGenerator& rng, Algorithm_Factory& af, BigInt& p_out, BigInt& q_out, size_t pbits, size_t qbits, const MemoryRegion& seed); /** * The size of the PRIMES[] array */ const size_t PRIME_TABLE_SIZE = 6541; /** * A const array of all primes less than 65535 */ extern const u16bit BOTAN_DLL PRIMES[]; } #endif Botan-1.10.12/src/math/numbertheory/pow_mod.cpp0000664000175000017500000001035612654331322021204 0ustar jackjack00000000000000/* * Modular Exponentiation Proxy * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Power_Mod Constructor */ Power_Mod::Power_Mod(const BigInt& n, Usage_Hints hints) { core = 0; set_modulus(n, hints); hints = NO_HINTS; } /* * Power_Mod Copy Constructor */ Power_Mod::Power_Mod(const Power_Mod& other) { core = 0; hints = other.hints; if(other.core) core = other.core->copy(); } /* * Power_Mod Assignment Operator */ Power_Mod& Power_Mod::operator=(const Power_Mod& other) { delete core; core = 0; if(other.core) core = other.core->copy(); return (*this); } /* * Power_Mod Destructor */ Power_Mod::~Power_Mod() { delete core; } /* * Set the modulus */ void Power_Mod::set_modulus(const BigInt& n, Usage_Hints hints) const { delete core; core = 0; if(n != 0) { Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); while(const Engine* engine = i.next()) { core = engine->mod_exp(n, hints); if(core) break; } if(!core) throw Lookup_Error("Power_Mod: Unable to find a working engine"); } } /* * Set the base */ void Power_Mod::set_base(const BigInt& b) const { if(b.is_zero() || b.is_negative()) throw Invalid_Argument("Power_Mod::set_base: arg must be > 0"); if(!core) throw Internal_Error("Power_Mod::set_base: core was NULL"); core->set_base(b); } /* * Set the exponent */ void Power_Mod::set_exponent(const BigInt& e) const { if(e.is_negative()) throw Invalid_Argument("Power_Mod::set_exponent: arg must be > 0"); if(!core) throw Internal_Error("Power_Mod::set_exponent: core was NULL"); core->set_exponent(e); } /* * Compute the result */ BigInt Power_Mod::execute() const { if(!core) throw Internal_Error("Power_Mod::execute: core was NULL"); return core->execute(); } /* * Try to choose a good window size */ size_t Power_Mod::window_bits(size_t exp_bits, size_t, Power_Mod::Usage_Hints hints) { static const size_t wsize[][2] = { { 1434, 7 }, { 539, 6 }, { 197, 4 }, { 70, 3 }, { 25, 2 }, { 0, 0 } }; size_t window_bits = 1; if(exp_bits) { for(size_t j = 0; wsize[j][0]; ++j) { if(exp_bits >= wsize[j][0]) { window_bits += wsize[j][1]; break; } } } if(hints & Power_Mod::BASE_IS_FIXED) window_bits += 2; if(hints & Power_Mod::EXP_IS_LARGE) ++window_bits; return window_bits; } namespace { /* * Choose potentially useful hints */ Power_Mod::Usage_Hints choose_base_hints(const BigInt& b, const BigInt& n) { if(b == 2) return Power_Mod::Usage_Hints(Power_Mod::BASE_IS_2 | Power_Mod::BASE_IS_SMALL); const size_t b_bits = b.bits(); const size_t n_bits = n.bits(); if(b_bits < n_bits / 32) return Power_Mod::BASE_IS_SMALL; if(b_bits > n_bits / 4) return Power_Mod::BASE_IS_LARGE; return Power_Mod::NO_HINTS; } /* * Choose potentially useful hints */ Power_Mod::Usage_Hints choose_exp_hints(const BigInt& e, const BigInt& n) { const size_t e_bits = e.bits(); const size_t n_bits = n.bits(); if(e_bits < n_bits / 32) return Power_Mod::BASE_IS_SMALL; if(e_bits > n_bits / 4) return Power_Mod::BASE_IS_LARGE; return Power_Mod::NO_HINTS; } } /* * Fixed_Exponent_Power_Mod Constructor */ Fixed_Exponent_Power_Mod::Fixed_Exponent_Power_Mod(const BigInt& e, const BigInt& n, Usage_Hints hints) : Power_Mod(n, Usage_Hints(hints | EXP_IS_FIXED | choose_exp_hints(e, n))) { set_exponent(e); } /* * Fixed_Base_Power_Mod Constructor */ Fixed_Base_Power_Mod::Fixed_Base_Power_Mod(const BigInt& b, const BigInt& n, Usage_Hints hints) : Power_Mod(n, Usage_Hints(hints | BASE_IS_FIXED | choose_base_hints(b, n))) { set_base(b); } } Botan-1.10.12/src/math/numbertheory/pow_mod.h0000664000175000017500000000444512654331322020653 0ustar jackjack00000000000000/* * Modular Exponentiator * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_POWER_MOD_H__ #define BOTAN_POWER_MOD_H__ #include namespace Botan { /** * Modular Exponentiator Interface */ class BOTAN_DLL Modular_Exponentiator { public: virtual void set_base(const BigInt&) = 0; virtual void set_exponent(const BigInt&) = 0; virtual BigInt execute() const = 0; virtual Modular_Exponentiator* copy() const = 0; virtual ~Modular_Exponentiator() {} }; /** * Modular Exponentiator Proxy */ class BOTAN_DLL Power_Mod { public: enum Usage_Hints { NO_HINTS = 0x0000, BASE_IS_FIXED = 0x0001, BASE_IS_SMALL = 0x0002, BASE_IS_LARGE = 0x0004, BASE_IS_2 = 0x0008, EXP_IS_FIXED = 0x0100, EXP_IS_SMALL = 0x0200, EXP_IS_LARGE = 0x0400 }; /* * Try to choose a good window size */ static size_t window_bits(size_t exp_bits, size_t base_bits, Power_Mod::Usage_Hints hints); void set_modulus(const BigInt&, Usage_Hints = NO_HINTS) const; void set_base(const BigInt&) const; void set_exponent(const BigInt&) const; BigInt execute() const; Power_Mod& operator=(const Power_Mod&); Power_Mod(const BigInt& = 0, Usage_Hints = NO_HINTS); Power_Mod(const Power_Mod&); virtual ~Power_Mod(); private: mutable Modular_Exponentiator* core; Usage_Hints hints; }; /** * Fixed Exponent Modular Exponentiator Proxy */ class BOTAN_DLL Fixed_Exponent_Power_Mod : public Power_Mod { public: BigInt operator()(const BigInt& b) const { set_base(b); return execute(); } Fixed_Exponent_Power_Mod() {} Fixed_Exponent_Power_Mod(const BigInt&, const BigInt&, Usage_Hints = NO_HINTS); }; /** * Fixed Base Modular Exponentiator Proxy */ class BOTAN_DLL Fixed_Base_Power_Mod : public Power_Mod { public: BigInt operator()(const BigInt& e) const { set_exponent(e); return execute(); } Fixed_Base_Power_Mod() {} Fixed_Base_Power_Mod(const BigInt&, const BigInt&, Usage_Hints = NO_HINTS); }; } #endif Botan-1.10.12/src/math/numbertheory/powm_fw.cpp0000664000175000017500000000250312654331322021211 0ustar jackjack00000000000000/* * Fixed Window Exponentiation * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Set the exponent */ void Fixed_Window_Exponentiator::set_exponent(const BigInt& e) { exp = e; } /* * Set the base */ void Fixed_Window_Exponentiator::set_base(const BigInt& base) { window_bits = Power_Mod::window_bits(exp.bits(), base.bits(), hints); g.resize((1 << window_bits)); g[0] = 1; g[1] = base; for(size_t i = 2; i != g.size(); ++i) g[i] = reducer.multiply(g[i-1], g[0]); } /* * Compute the result */ BigInt Fixed_Window_Exponentiator::execute() const { const size_t exp_nibbles = (exp.bits() + window_bits - 1) / window_bits; BigInt x = 1; for(size_t i = exp_nibbles; i > 0; --i) { for(size_t j = 0; j != window_bits; ++j) x = reducer.square(x); const u32bit nibble = exp.get_substring(window_bits*(i-1), window_bits); x = reducer.multiply(x, g[nibble]); } return x; } /* * Fixed_Window_Exponentiator Constructor */ Fixed_Window_Exponentiator::Fixed_Window_Exponentiator(const BigInt& n, Power_Mod::Usage_Hints hints) { reducer = Modular_Reducer(n); this->hints = hints; window_bits = 0; } } Botan-1.10.12/src/math/numbertheory/powm_mnt.cpp0000664000175000017500000000734612654331322021405 0ustar jackjack00000000000000/* * Montgomery Exponentiation * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Set the exponent */ void Montgomery_Exponentiator::set_exponent(const BigInt& exp) { this->exp = exp; exp_bits = exp.bits(); } /* * Set the base */ void Montgomery_Exponentiator::set_base(const BigInt& base) { window_bits = Power_Mod::window_bits(exp.bits(), base.bits(), hints); g.resize((1 << window_bits)); SecureVector z(2 * (mod_words + 1)); SecureVector workspace(z.size()); g[0] = 1; bigint_monty_mul(&z[0], z.size(), g[0].data(), g[0].size(), g[0].sig_words(), R2.data(), R2.size(), R2.sig_words(), modulus.data(), mod_words, mod_prime, &workspace[0]); g[0].assign(&z[0], mod_words + 1); g[1] = (base >= modulus) ? (base % modulus) : base; bigint_monty_mul(&z[0], z.size(), g[1].data(), g[1].size(), g[1].sig_words(), R2.data(), R2.size(), R2.sig_words(), modulus.data(), mod_words, mod_prime, &workspace[0]); g[1].assign(&z[0], mod_words + 1); const BigInt& x = g[1]; const size_t x_sig = x.sig_words(); for(size_t i = 1; i != g.size(); ++i) { const BigInt& y = g[i-1]; const size_t y_sig = y.sig_words(); zeroise(z); bigint_monty_mul(&z[0], z.size(), x.data(), x.size(), x_sig, y.data(), y.size(), y_sig, modulus.data(), mod_words, mod_prime, &workspace[0]); g[i].assign(&z[0], mod_words + 1); } } /* * Compute the result */ BigInt Montgomery_Exponentiator::execute() const { const size_t exp_nibbles = (exp_bits + window_bits - 1) / window_bits; BigInt x = R_mod; SecureVector z(2 * (mod_words + 1)); SecureVector workspace(2 * (mod_words + 1)); for(size_t i = exp_nibbles; i > 0; --i) { for(size_t k = 0; k != window_bits; ++k) { zeroise(z); bigint_monty_sqr(&z[0], z.size(), x.data(), x.size(), x.sig_words(), modulus.data(), mod_words, mod_prime, &workspace[0]); x.assign(&z[0], mod_words + 1); } const u32bit nibble = exp.get_substring(window_bits*(i-1), window_bits); const BigInt& y = g[nibble]; zeroise(z); bigint_monty_mul(&z[0], z.size(), x.data(), x.size(), x.sig_words(), y.data(), y.size(), y.sig_words(), modulus.data(), mod_words, mod_prime, &workspace[0]); x.assign(&z[0], mod_words + 1); } x.get_reg().resize(2*mod_words+1); bigint_monty_redc(&x[0], x.size(), modulus.data(), mod_words, mod_prime, &workspace[0]); x.get_reg().resize(mod_words+1); return x; } /* * Montgomery_Exponentiator Constructor */ Montgomery_Exponentiator::Montgomery_Exponentiator(const BigInt& mod, Power_Mod::Usage_Hints hints) { // Montgomery reduction only works for positive odd moduli if(!mod.is_positive() || mod.is_even()) throw Invalid_Argument("Montgomery_Exponentiator: invalid modulus"); window_bits = 0; this->hints = hints; modulus = mod; exp_bits = 0; mod_words = modulus.sig_words(); BigInt r(BigInt::Power2, mod_words * BOTAN_MP_WORD_BITS); mod_prime = (((r * inverse_mod(r, mod)) - 1) / mod).word_at(0); R_mod = r % modulus; R2 = (R_mod * R_mod) % modulus; } } Botan-1.10.12/src/math/numbertheory/primes.cpp0000664000175000017500000013165212654331322021042 0ustar jackjack00000000000000/* * Small Primes Table * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { const u16bit PRIMES[PRIME_TABLE_SIZE+1] = { 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, 65519, 65521, 0 }; } Botan-1.10.12/src/math/numbertheory/reducer.cpp0000664000175000017500000000321612654331322021166 0ustar jackjack00000000000000/* * Modular Reducer * (C) 1999-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Modular_Reducer Constructor */ Modular_Reducer::Modular_Reducer(const BigInt& mod) { if(mod <= 0) throw Invalid_Argument("Modular_Reducer: modulus must be positive"); modulus = mod; mod_words = modulus.sig_words(); modulus_2 = Botan::square(modulus); mu = BigInt(BigInt::Power2, 2 * MP_WORD_BITS * mod_words) / modulus; } /* * Barrett Reduction */ BigInt Modular_Reducer::reduce(const BigInt& x) const { if(mod_words == 0) throw Invalid_State("Modular_Reducer: Never initalized"); if(x.cmp(modulus, false) < 0) { if(x.is_negative()) return x + modulus; // make positive return x; } else if(x.cmp(modulus_2, false) < 0) { BigInt t1 = x; t1.set_sign(BigInt::Positive); t1 >>= (MP_WORD_BITS * (mod_words - 1)); t1 *= mu; t1 >>= (MP_WORD_BITS * (mod_words + 1)); t1 *= modulus; t1.mask_bits(MP_WORD_BITS * (mod_words + 1)); BigInt t2 = x; t2.set_sign(BigInt::Positive); t2.mask_bits(MP_WORD_BITS * (mod_words + 1)); t2 -= t1; if(t2.is_negative()) { BigInt b_to_k1(BigInt::Power2, MP_WORD_BITS * (mod_words + 1)); t2 += b_to_k1; } while(t2 >= modulus) t2 -= modulus; if(x.is_positive()) return t2; else return (modulus - t2); } else { // too big, fall back to normal division return (x % modulus); } } } Botan-1.10.12/src/math/numbertheory/reducer.h0000664000175000017500000000230412654331322020630 0ustar jackjack00000000000000/* * Modular Reducer * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MODULAR_REDUCER_H__ #define BOTAN_MODULAR_REDUCER_H__ #include namespace Botan { /** * Modular Reducer (using Barrett's technique) */ class BOTAN_DLL Modular_Reducer { public: const BigInt& get_modulus() const { return modulus; } BigInt reduce(const BigInt& x) const; /** * Multiply mod p * @param x * @param y * @return (x * y) % p */ BigInt multiply(const BigInt& x, const BigInt& y) const { return reduce(x * y); } /** * Square mod p * @param x * @return (x * x) % p */ BigInt square(const BigInt& x) const { return reduce(Botan::square(x)); } /** * Cube mod p * @param x * @return (x * x * x) % p */ BigInt cube(const BigInt& x) const { return multiply(x, this->square(x)); } bool initialized() const { return (mod_words != 0); } Modular_Reducer() { mod_words = 0; } Modular_Reducer(const BigInt& mod); private: BigInt modulus, modulus_2, mu; size_t mod_words; }; } #endif Botan-1.10.12/src/math/numbertheory/ressol.cpp0000664000175000017500000000274112654331322021046 0ustar jackjack00000000000000/* * Shanks-Tonnelli (RESSOL) * (C) 2007-2008 Falko Strenzke, FlexSecure GmbH * (C) 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Shanks-Tonnelli algorithm */ BigInt ressol(const BigInt& a, const BigInt& p) { if(a < 0) throw Invalid_Argument("ressol(): a to solve for must be positive"); if(p <= 1) throw Invalid_Argument("ressol(): prime must be > 1"); if(a == 0) return 0; if(p == 2) return a; if(jacobi(a, p) != 1) // not a quadratic residue return -BigInt(1); if(p % 4 == 3) return power_mod(a, ((p+1) >> 2), p); size_t s = low_zero_bits(p - 1); BigInt q = p >> s; q -= 1; q >>= 1; Modular_Reducer mod_p(p); BigInt r = power_mod(a, q, p); BigInt n = mod_p.multiply(a, mod_p.square(r)); r = mod_p.multiply(r, a); if(n == 1) return r; // find random non quadratic residue z BigInt z = 2; while(jacobi(z, p) == 1) // while z quadratic residue ++z; BigInt c = power_mod(z, (q << 1) + 1, p); while(n > 1) { q = n; size_t i = 0; while(q != 1) { q = mod_p.square(q); ++i; if(i >= s) return -BigInt(1); } c = power_mod(c, BigInt(BigInt::Power2, s-i-1), p); r = mod_p.multiply(r, c); c = mod_p.square(c); n = mod_p.multiply(n, c); s = i; } return r; } } Botan-1.10.12/src/mutex/info.txt0000664000175000017500000000010412654331322016204 0ustar jackjack00000000000000define MUTEX_WRAPPERS mutex.h Botan-1.10.12/src/mutex/mutex.h0000664000175000017500000000203612654331322016031 0ustar jackjack00000000000000/* * Mutex * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MUTEX_H__ #define BOTAN_MUTEX_H__ #include namespace Botan { /** * Mutex Base Class */ class Mutex { public: /** * Lock the mutex */ virtual void lock() = 0; /** * Unlock the mutex */ virtual void unlock() = 0; virtual ~Mutex() {} }; /** * Mutex Factory */ class Mutex_Factory { public: /** * @return newly allocated mutex */ virtual Mutex* make() = 0; virtual ~Mutex_Factory() {} }; /** * Mutex Holding Class for RAII */ class Mutex_Holder { public: /** * Hold onto a mutex until we leave scope * @param m the mutex to lock */ Mutex_Holder(Mutex* m) : mux(m) { if(!mux) throw Invalid_Argument("Mutex_Holder: Argument was NULL"); mux->lock(); } ~Mutex_Holder() { mux->unlock(); } private: Mutex* mux; }; } #endif Botan-1.10.12/src/mutex/noop_mutex/info.txt0000664000175000017500000000014412654331322020405 0ustar jackjack00000000000000define MUTEX_NOOP mux_noop.cpp mux_noop.h Botan-1.10.12/src/mutex/noop_mutex/mux_noop.cpp0000664000175000017500000000177412654331322021273 0ustar jackjack00000000000000/* * No-Op Mutex Factory * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * No-Op Mutex Factory */ Mutex* Noop_Mutex_Factory::make() { class Noop_Mutex : public Mutex { public: class Mutex_State_Error : public Internal_Error { public: Mutex_State_Error(const std::string& where) : Internal_Error("Noop_Mutex::" + where + ": " + "Mutex is already " + where + "ed") {} }; void lock() { if(locked) throw Mutex_State_Error("lock"); locked = true; } void unlock() { if(!locked) throw Mutex_State_Error("unlock"); locked = false; } Noop_Mutex() { locked = false; } private: bool locked; }; return new Noop_Mutex; } } Botan-1.10.12/src/mutex/noop_mutex/mux_noop.h0000664000175000017500000000056112654331322020731 0ustar jackjack00000000000000/* * No-Op Mutex Factory * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_NOOP_MUTEX_FACTORY_H__ #define BOTAN_NOOP_MUTEX_FACTORY_H__ #include namespace Botan { /** * No-Op Mutex Factory */ class Noop_Mutex_Factory : public Mutex_Factory { public: Mutex* make(); }; } #endif Botan-1.10.12/src/mutex/pthreads/info.txt0000664000175000017500000000041412654331322020022 0ustar jackjack00000000000000define MUTEX_PTHREAD mux_pthr.cpp mux_pthr.h all!qnx,freebsd,dragonfly,openbsd,netbsd -> pthread aix cygwin darwin freebsd dragonfly hpux irix linux netbsd openbsd qnx solaris tru64 Botan-1.10.12/src/mutex/pthreads/mux_pthr.cpp0000664000175000017500000000230012654331322020674 0ustar jackjack00000000000000/* * Pthread Mutex * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199506 #endif #include namespace Botan { /* * Pthread Mutex Factory */ Mutex* Pthread_Mutex_Factory::make() { class Pthread_Mutex : public Mutex { public: void lock() { if(pthread_mutex_lock(&mutex) != 0) throw Invalid_State("Pthread_Mutex::lock: Error occured"); } void unlock() { if(pthread_mutex_unlock(&mutex) != 0) throw Invalid_State("Pthread_Mutex::unlock: Error occured"); } Pthread_Mutex() { if(pthread_mutex_init(&mutex, 0) != 0) throw Invalid_State("Pthread_Mutex: initialization failed"); } ~Pthread_Mutex() { if(pthread_mutex_destroy(&mutex) != 0) throw Invalid_State("~Pthread_Mutex: mutex is still locked"); } private: pthread_mutex_t mutex; }; return new Pthread_Mutex(); } } Botan-1.10.12/src/mutex/pthreads/mux_pthr.h0000664000175000017500000000054612654331322020353 0ustar jackjack00000000000000/* * Pthread Mutex * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MUTEX_PTHREAD_H__ #define BOTAN_MUTEX_PTHREAD_H__ #include namespace Botan { /** * Pthread Mutex Factory */ class Pthread_Mutex_Factory : public Mutex_Factory { public: Mutex* make(); }; } #endif Botan-1.10.12/src/mutex/win32_crit_section/info.txt0000664000175000017500000000021012654331322021711 0ustar jackjack00000000000000define MUTEX_WIN32 mux_win32.cpp mux_win32.h cygwin windows mingw Botan-1.10.12/src/mutex/win32_crit_section/mux_win32.cpp0000664000175000017500000000122612654331322022564 0ustar jackjack00000000000000/* * Win32 Mutex * (C) 2006 Luca Piccarreta * 2006-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Win32 Mutex Factory */ Mutex* Win32_Mutex_Factory::make() { class Win32_Mutex : public Mutex { public: void lock() { EnterCriticalSection(&mutex); } void unlock() { LeaveCriticalSection(&mutex); } Win32_Mutex() { InitializeCriticalSection(&mutex); } ~Win32_Mutex() { DeleteCriticalSection(&mutex); } private: CRITICAL_SECTION mutex; }; return new Win32_Mutex(); } } Botan-1.10.12/src/mutex/win32_crit_section/mux_win32.h0000664000175000017500000000056612654331322022237 0ustar jackjack00000000000000/* * Win32 Mutex * (C) 2006 Luca Piccarreta * 2006-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MUTEX_WIN32_H__ #define BOTAN_MUTEX_WIN32_H__ #include namespace Botan { /** * Win32 Mutex Factory */ class Win32_Mutex_Factory : public Mutex_Factory { public: Mutex* make(); }; } #endif Botan-1.10.12/src/passhash/bcrypt/bcrypt.cpp0000664000175000017500000001354012654331322020502 0ustar jackjack00000000000000/* * Bcrypt Password Hashing * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace { std::string bcrypt_base64_encode(const byte input[], size_t length) { // Bcrypt uses a non-standard base64 alphabet const byte OPENBSD_BASE64_SUB[256] = { 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x38, 0x80, 0x80, 0x80, 0x39, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x2E, 0x2F, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; std::string b64 = base64_encode(input, length); while(b64.size() && b64[b64.size()-1] == '=') b64 = b64.substr(0, b64.size() - 1); for(size_t i = 0; i != b64.size(); ++i) b64[i] = OPENBSD_BASE64_SUB[static_cast(b64[i])]; return b64; } MemoryVector bcrypt_base64_decode(std::string input) { const byte OPENBSD_BASE64_SUB[256] = { 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41, 0x42, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; for(size_t i = 0; i != input.size(); ++i) input[i] = OPENBSD_BASE64_SUB[static_cast(input[i])]; return base64_decode(input); } std::string make_bcrypt(const std::string& pass, const MemoryRegion& salt, u16bit work_factor) { const byte magic[24] = { 0x4F, 0x72, 0x70, 0x68, 0x65, 0x61, 0x6E, 0x42, 0x65, 0x68, 0x6F, 0x6C, 0x64, 0x65, 0x72, 0x53, 0x63, 0x72, 0x79, 0x44, 0x6F, 0x75, 0x62, 0x74 }; MemoryVector ctext(magic, 24); Blowfish blowfish; // Include the trailing NULL byte blowfish.eks_key_schedule(reinterpret_cast(pass.c_str()), pass.length() + 1, salt, work_factor); for(size_t i = 0; i != 64; ++i) blowfish.encrypt_n(&ctext[0], &ctext[0], 3); std::string salt_b64 = bcrypt_base64_encode(&salt[0], salt.size()); return "$2a$" + to_string(work_factor, 2) + "$" + salt_b64.substr(0, 22) + bcrypt_base64_encode(&ctext[0], ctext.size() - 1); } } std::string generate_bcrypt(const std::string& pass, RandomNumberGenerator& rng, u16bit work_factor) { return make_bcrypt(pass, rng.random_vec(16), work_factor); } bool check_bcrypt(const std::string& pass, const std::string& hash) { if(hash.size() != 60 || hash[0] != '$' || hash[1] != '2' || hash[2] != 'a' || hash[3] != '$' || hash[6] != '$') { return false; } const u16bit workfactor = to_u32bit(hash.substr(4, 2)); MemoryVector salt = bcrypt_base64_decode(hash.substr(7, 22)); const std::string compare = make_bcrypt(pass, salt, workfactor); return (hash == compare); } } Botan-1.10.12/src/passhash/bcrypt/bcrypt.h0000664000175000017500000000163012654331322020144 0ustar jackjack00000000000000/* * Bcrypt Password Hashing * (C) 2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BCRYPT_H__ #define BOTAN_BCRYPT_H__ #include namespace Botan { /** * Create a password hash using Bcrypt * @param password the password * @param rng a random number generator * @param work_factor how much work to do to slow down guessing attacks * * @see http://www.usenix.org/events/usenix99/provos/provos_html/ */ std::string BOTAN_DLL generate_bcrypt(const std::string& password, RandomNumberGenerator& rng, u16bit work_factor = 10); /** * Check a previously created password hash * @param password the password to check against * @param hash the stored hash to check against */ bool BOTAN_DLL check_bcrypt(const std::string& password, const std::string& hash); } #endif Botan-1.10.12/src/passhash/bcrypt/info.txt0000664000175000017500000000010412654331322020157 0ustar jackjack00000000000000define BCRYPT libstate blowfish rng base64 Botan-1.10.12/src/passhash/passhash9/info.txt0000664000175000017500000000010512654331322020560 0ustar jackjack00000000000000define PASSHASH9 libstate pbkdf2 rng base64 Botan-1.10.12/src/passhash/passhash9/passhash9.cpp0000664000175000017500000000665012654331322021506 0ustar jackjack00000000000000/* * Passhash9 Password Hashing * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { namespace { const std::string MAGIC_PREFIX = "$9$"; const size_t WORKFACTOR_BYTES = 2; const size_t ALGID_BYTES = 1; const size_t SALT_BYTES = 12; // 96 bits of salt const size_t PASSHASH9_PBKDF_OUTPUT_LEN = 24; // 192 bits output const size_t WORK_FACTOR_SCALE = 10000; MessageAuthenticationCode* get_pbkdf_prf(byte alg_id) { Algorithm_Factory& af = global_state().algorithm_factory(); try { if(alg_id == 0) return af.make_mac("HMAC(SHA-1)"); else if(alg_id == 1) return af.make_mac("HMAC(SHA-256)"); else if(alg_id == 2) return af.make_mac("CMAC(Blowfish)"); } catch(Algorithm_Not_Found) {} return 0; } } std::string generate_passhash9(const std::string& pass, RandomNumberGenerator& rng, u16bit work_factor, byte alg_id) { MessageAuthenticationCode* prf = get_pbkdf_prf(alg_id); if(!prf) throw Invalid_Argument("Passhash9: Algorithm id " + to_string(alg_id) + " is not defined"); PKCS5_PBKDF2 kdf(prf); // takes ownership of pointer SecureVector salt(SALT_BYTES); rng.randomize(&salt[0], salt.size()); const size_t kdf_iterations = WORK_FACTOR_SCALE * work_factor; SecureVector pbkdf2_output = kdf.derive_key(PASSHASH9_PBKDF_OUTPUT_LEN, pass, &salt[0], salt.size(), kdf_iterations).bits_of(); Pipe pipe(new Base64_Encoder); pipe.start_msg(); pipe.write(alg_id); pipe.write(get_byte(0, work_factor)); pipe.write(get_byte(1, work_factor)); pipe.write(salt); pipe.write(pbkdf2_output); pipe.end_msg(); return MAGIC_PREFIX + pipe.read_all_as_string(); } bool check_passhash9(const std::string& pass, const std::string& hash) { const size_t BINARY_LENGTH = ALGID_BYTES + WORKFACTOR_BYTES + PASSHASH9_PBKDF_OUTPUT_LEN + SALT_BYTES; const size_t BASE64_LENGTH = MAGIC_PREFIX.size() + (BINARY_LENGTH * 8) / 6; if(hash.size() != BASE64_LENGTH) return false; for(size_t i = 0; i != MAGIC_PREFIX.size(); ++i) if(hash[i] != MAGIC_PREFIX[i]) return false; Pipe pipe(new Base64_Decoder); pipe.start_msg(); pipe.write(hash.c_str() + MAGIC_PREFIX.size()); pipe.end_msg(); SecureVector bin = pipe.read_all(); if(bin.size() != BINARY_LENGTH) return false; byte alg_id = bin[0]; const size_t kdf_iterations = WORK_FACTOR_SCALE * load_be(&bin[ALGID_BYTES], 0); if(kdf_iterations == 0) return false; MessageAuthenticationCode* pbkdf_prf = get_pbkdf_prf(alg_id); if(pbkdf_prf == 0) return false; // unknown algorithm, reject PKCS5_PBKDF2 kdf(pbkdf_prf); // takes ownership of pointer SecureVector cmp = kdf.derive_key( PASSHASH9_PBKDF_OUTPUT_LEN, pass, &bin[ALGID_BYTES + WORKFACTOR_BYTES], SALT_BYTES, kdf_iterations).bits_of(); return same_mem(&cmp[0], &bin[ALGID_BYTES + WORKFACTOR_BYTES + SALT_BYTES], PASSHASH9_PBKDF_OUTPUT_LEN); } } Botan-1.10.12/src/passhash/passhash9/passhash9.h0000664000175000017500000000214312654331322021144 0ustar jackjack00000000000000/* * Passhash9 Password Hashing * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PASSHASH9_H__ #define BOTAN_PASSHASH9_H__ #include namespace Botan { /** * Create a password hash using PBKDF2 * @param password the password * @param rng a random number generator * @param work_factor how much work to do to slow down guessing attacks * @param alg_id specifies which PRF to use with PBKDF2 * 0 is HMAC(SHA-1) * 1 is HMAC(SHA-256) * 2 is CMAC(Blowfish) * all other values are currently undefined */ std::string BOTAN_DLL generate_passhash9(const std::string& password, RandomNumberGenerator& rng, u16bit work_factor = 10, byte alg_id = 0); /** * Check a previously created password hash * @param password the password to check against * @param hash the stored hash to check against */ bool BOTAN_DLL check_passhash9(const std::string& password, const std::string& hash); } #endif Botan-1.10.12/src/pbe/get_pbe.cpp0000664000175000017500000000705212654331322016236 0ustar jackjack00000000000000/* * PBE Retrieval * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #if defined(BOTAN_HAS_PBE_PKCS_V15) #include #endif #if defined(BOTAN_HAS_PBE_PKCS_V20) #include #endif namespace Botan { /* * Get an encryption PBE, set new parameters */ PBE* get_pbe(const std::string& algo_spec) { SCAN_Name request(algo_spec); const std::string pbe = request.algo_name(); std::string digest_name = request.arg(0); const std::string cipher = request.arg(1); std::vector cipher_spec = split_on(cipher, '/'); if(cipher_spec.size() != 2) throw Invalid_Argument("PBE: Invalid cipher spec " + cipher); const std::string cipher_algo = global_state().deref_alias(cipher_spec[0]); const std::string cipher_mode = cipher_spec[1]; if(cipher_mode != "CBC") throw Invalid_Argument("PBE: Invalid cipher mode " + cipher); Algorithm_Factory& af = global_state().algorithm_factory(); const BlockCipher* block_cipher = af.prototype_block_cipher(cipher_algo); if(!block_cipher) throw Algorithm_Not_Found(cipher_algo); const HashFunction* hash_function = af.prototype_hash_function(digest_name); if(!hash_function) throw Algorithm_Not_Found(digest_name); if(request.arg_count() != 2) throw Invalid_Algorithm_Name(algo_spec); #if defined(BOTAN_HAS_PBE_PKCS_V15) if(pbe == "PBE-PKCS5v15") return new PBE_PKCS5v15(block_cipher->clone(), hash_function->clone(), ENCRYPTION); #endif #if defined(BOTAN_HAS_PBE_PKCS_V20) if(pbe == "PBE-PKCS5v20") return new PBE_PKCS5v20(block_cipher->clone(), hash_function->clone()); #endif throw Algorithm_Not_Found(algo_spec); } /* * Get a decryption PBE, decode parameters */ PBE* get_pbe(const OID& pbe_oid, DataSource& params) { SCAN_Name request(OIDS::lookup(pbe_oid)); const std::string pbe = request.algo_name(); #if defined(BOTAN_HAS_PBE_PKCS_V15) if(pbe == "PBE-PKCS5v15") { if(request.arg_count() != 2) throw Invalid_Algorithm_Name(request.as_string()); std::string digest_name = request.arg(0); const std::string cipher = request.arg(1); std::vector cipher_spec = split_on(cipher, '/'); if(cipher_spec.size() != 2) throw Invalid_Argument("PBE: Invalid cipher spec " + cipher); const std::string cipher_algo = global_state().deref_alias(cipher_spec[0]); const std::string cipher_mode = cipher_spec[1]; if(cipher_mode != "CBC") throw Invalid_Argument("PBE: Invalid cipher mode " + cipher); Algorithm_Factory& af = global_state().algorithm_factory(); const BlockCipher* block_cipher = af.prototype_block_cipher(cipher_algo); if(!block_cipher) throw Algorithm_Not_Found(cipher_algo); const HashFunction* hash_function = af.prototype_hash_function(digest_name); if(!hash_function) throw Algorithm_Not_Found(digest_name); PBE* pbe = new PBE_PKCS5v15(block_cipher->clone(), hash_function->clone(), DECRYPTION); pbe->decode_params(params); return pbe; } #endif #if defined(BOTAN_HAS_PBE_PKCS_V20) if(pbe == "PBE-PKCS5v20") return new PBE_PKCS5v20(params); #endif throw Algorithm_Not_Found(pbe_oid.as_string()); } } Botan-1.10.12/src/pbe/get_pbe.h0000664000175000017500000000134612654331322015703 0ustar jackjack00000000000000/* * PBE Lookup * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_LOOKUP_PBE_H__ #define BOTAN_LOOKUP_PBE_H__ #include #include namespace Botan { /** * Factory function for PBEs. * @param algo_spec the name of the PBE algorithm to retrieve * @return pointer to a PBE with randomly created parameters */ BOTAN_DLL PBE* get_pbe(const std::string& algo_spec); /** * Factory function for PBEs. * @param pbe_oid the oid of the desired PBE * @param params a DataSource providing the DER encoded parameters to use * @return pointer to the PBE with the specified parameters */ BOTAN_DLL PBE* get_pbe(const OID& pbe_oid, DataSource& params); } #endif Botan-1.10.12/src/pbe/info.txt0000664000175000017500000000012512654331322015613 0ustar jackjack00000000000000define PASSWORD_BASED_ENCRYPTION filters libstate oid_lookup Botan-1.10.12/src/pbe/pbe.h0000664000175000017500000000236112654331322015042 0ustar jackjack00000000000000/* * PBE * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PBE_BASE_H__ #define BOTAN_PBE_BASE_H__ #include #include #include #include namespace Botan { /** * Password Based Encryption (PBE) Filter. */ class BOTAN_DLL PBE : public Filter { public: /** * Set this filter's key. * @param pw the password to be used for the encryption */ virtual void set_key(const std::string& pw) = 0; /** * Create a new random salt value and set the default iterations value. * @param rng a random number generator */ virtual void new_params(RandomNumberGenerator& rng) = 0; /** * DER encode the params (the number of iterations and the salt value) * @return encoded params */ virtual MemoryVector encode_params() const = 0; /** * Decode params and use them inside this Filter. * @param src a data source to read the encoded params from */ virtual void decode_params(DataSource& src) = 0; /** * Get this PBE's OID. * @return object identifier */ virtual OID get_oid() const = 0; }; } #endif Botan-1.10.12/src/pbe/pbes1/info.txt0000664000175000017500000000011712654331322016626 0ustar jackjack00000000000000define PBE_PKCS_V15 asn1 block cbc filters hash pbkdf1 Botan-1.10.12/src/pbe/pbes1/pbes1.cpp0000664000175000017500000001054112654331322016652 0ustar jackjack00000000000000/* * PKCS #5 PBES1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { /* * Encrypt some bytes using PBES1 */ void PBE_PKCS5v15::write(const byte input[], size_t length) { pipe.write(input, length); flush_pipe(true); } /* * Start encrypting with PBES1 */ void PBE_PKCS5v15::start_msg() { if(direction == ENCRYPTION) pipe.append(new CBC_Encryption(block_cipher->clone(), new PKCS7_Padding, key, iv)); else pipe.append(new CBC_Decryption(block_cipher->clone(), new PKCS7_Padding, key, iv)); pipe.start_msg(); if(pipe.message_count() > 1) pipe.set_default_msg(pipe.default_msg() + 1); } /* * Finish encrypting with PBES1 */ void PBE_PKCS5v15::end_msg() { pipe.end_msg(); flush_pipe(false); pipe.reset(); } /* * Flush the pipe */ void PBE_PKCS5v15::flush_pipe(bool safe_to_skip) { if(safe_to_skip && pipe.remaining() < 64) return; SecureVector buffer(DEFAULT_BUFFERSIZE); while(pipe.remaining()) { size_t got = pipe.read(&buffer[0], buffer.size()); send(buffer, got); } } /* * Set the passphrase to use */ void PBE_PKCS5v15::set_key(const std::string& passphrase) { PKCS5_PBKDF1 pbkdf(hash_function->clone()); SecureVector key_and_iv = pbkdf.derive_key(16, passphrase, &salt[0], salt.size(), iterations).bits_of(); key.resize(8); iv.resize(8); copy_mem(&key[0], &key_and_iv[0], 8); copy_mem(&iv[0], &key_and_iv[8], 8); } /* * Create a new set of PBES1 parameters */ void PBE_PKCS5v15::new_params(RandomNumberGenerator& rng) { iterations = 50000; salt = rng.random_vec(8); } /* * Encode PKCS#5 PBES1 parameters */ MemoryVector PBE_PKCS5v15::encode_params() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(salt, OCTET_STRING) .encode(iterations) .end_cons() .get_contents(); } /* * Decode PKCS#5 PBES1 parameters */ void PBE_PKCS5v15::decode_params(DataSource& source) { BER_Decoder(source) .start_cons(SEQUENCE) .decode(salt, OCTET_STRING) .decode(iterations) .verify_end() .end_cons(); if(salt.size() != 8) throw Decoding_Error("PBES1: Encoded salt is not 8 octets"); } /* * Return an OID for this PBES1 type */ OID PBE_PKCS5v15::get_oid() const { const OID base_pbes1_oid("1.2.840.113549.1.5"); const std::string cipher = block_cipher->name(); const std::string digest = hash_function->name(); if(cipher == "DES" && digest == "MD2") return (base_pbes1_oid + 1); else if(cipher == "DES" && digest == "MD5") return (base_pbes1_oid + 3); else if(cipher == "DES" && digest == "SHA-160") return (base_pbes1_oid + 10); else if(cipher == "RC2" && digest == "MD2") return (base_pbes1_oid + 4); else if(cipher == "RC2" && digest == "MD5") return (base_pbes1_oid + 6); else if(cipher == "RC2" && digest == "SHA-160") return (base_pbes1_oid + 11); else throw Internal_Error("PBE-PKCS5 v1.5: get_oid() has run out of options"); } std::string PBE_PKCS5v15::name() const { return "PBE-PKCS5v15(" + block_cipher->name() + "," + hash_function->name() + ")"; } /* * PKCS#5 v1.5 PBE Constructor */ PBE_PKCS5v15::PBE_PKCS5v15(BlockCipher* cipher, HashFunction* hash, Cipher_Dir dir) : direction(dir), block_cipher(cipher), hash_function(hash), iterations(0) { if(cipher->name() != "DES" && cipher->name() != "RC2") { throw Invalid_Argument("PBE_PKCS5v1.5: Unknown cipher " + cipher->name()); } if(hash->name() != "MD2" && hash->name() != "MD5" && hash->name() != "SHA-160") { throw Invalid_Argument("PBE_PKCS5v1.5: Unknown hash " + hash->name()); } } PBE_PKCS5v15::~PBE_PKCS5v15() { delete block_cipher; delete hash_function; } } Botan-1.10.12/src/pbe/pbes1/pbes1.h0000664000175000017500000000236112654331322016320 0ustar jackjack00000000000000/* * PKCS #5 v1.5 PBE * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PBE_PKCS_V15_H__ #define BOTAN_PBE_PKCS_V15_H__ #include #include #include #include namespace Botan { /** * PKCS #5 v1.5 PBE */ class BOTAN_DLL PBE_PKCS5v15 : public PBE { public: std::string name() const; void write(const byte[], size_t); void start_msg(); void end_msg(); /** * @param cipher the block cipher to use (DES or RC2) * @param hash the hash function to use * @param direction are we encrypting or decrypting */ PBE_PKCS5v15(BlockCipher* cipher, HashFunction* hash, Cipher_Dir direction); ~PBE_PKCS5v15(); private: void set_key(const std::string&); void new_params(RandomNumberGenerator& rng); MemoryVector encode_params() const; void decode_params(DataSource&); OID get_oid() const; void flush_pipe(bool); Cipher_Dir direction; BlockCipher* block_cipher; HashFunction* hash_function; SecureVector salt, key, iv; size_t iterations; Pipe pipe; }; } #endif Botan-1.10.12/src/pbe/pbes2/info.txt0000664000175000017500000000016512654331322016632 0ustar jackjack00000000000000define PBE_PKCS_V20 algo_factory asn1 block cbc filters hash hmac libstate oid_lookup pbkdf2 Botan-1.10.12/src/pbe/pbes2/pbes2.cpp0000664000175000017500000001331512654331322016656 0ustar jackjack00000000000000/* * PKCS #5 PBES2 * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { /* * Encrypt some bytes using PBES2 */ void PBE_PKCS5v20::write(const byte input[], size_t length) { pipe.write(input, length); flush_pipe(true); } /* * Start encrypting with PBES2 */ void PBE_PKCS5v20::start_msg() { if(direction == ENCRYPTION) pipe.append(new CBC_Encryption(block_cipher->clone(), new PKCS7_Padding, key, iv)); else pipe.append(new CBC_Decryption(block_cipher->clone(), new PKCS7_Padding, key, iv)); pipe.start_msg(); if(pipe.message_count() > 1) pipe.set_default_msg(pipe.default_msg() + 1); } /* * Finish encrypting with PBES2 */ void PBE_PKCS5v20::end_msg() { pipe.end_msg(); flush_pipe(false); pipe.reset(); } /* * Flush the pipe */ void PBE_PKCS5v20::flush_pipe(bool safe_to_skip) { if(safe_to_skip && pipe.remaining() < 64) return; SecureVector buffer(DEFAULT_BUFFERSIZE); while(pipe.remaining()) { size_t got = pipe.read(&buffer[0], buffer.size()); send(buffer, got); } } /* * Set the passphrase to use */ void PBE_PKCS5v20::set_key(const std::string& passphrase) { PKCS5_PBKDF2 pbkdf(new HMAC(hash_function->clone())); key = pbkdf.derive_key(key_length, passphrase, &salt[0], salt.size(), iterations).bits_of(); } /* * Create a new set of PBES2 parameters */ void PBE_PKCS5v20::new_params(RandomNumberGenerator& rng) { iterations = 50000; key_length = block_cipher->maximum_keylength(); salt = rng.random_vec(12); iv = rng.random_vec(block_cipher->block_size()); } /* * Encode PKCS#5 PBES2 parameters */ MemoryVector PBE_PKCS5v20::encode_params() const { return DER_Encoder() .start_cons(SEQUENCE) .encode( AlgorithmIdentifier("PKCS5.PBKDF2", DER_Encoder() .start_cons(SEQUENCE) .encode(salt, OCTET_STRING) .encode(iterations) .encode(key_length) .end_cons() .get_contents() ) ) .encode( AlgorithmIdentifier(block_cipher->name() + "/CBC", DER_Encoder() .encode(iv, OCTET_STRING) .get_contents() ) ) .end_cons() .get_contents(); } /* * Decode PKCS#5 PBES2 parameters */ void PBE_PKCS5v20::decode_params(DataSource& source) { AlgorithmIdentifier kdf_algo, enc_algo; BER_Decoder(source) .start_cons(SEQUENCE) .decode(kdf_algo) .decode(enc_algo) .verify_end() .end_cons(); if(kdf_algo.oid == OIDS::lookup("PKCS5.PBKDF2")) { BER_Decoder(kdf_algo.parameters) .start_cons(SEQUENCE) .decode(salt, OCTET_STRING) .decode(iterations) .decode_optional(key_length, INTEGER, UNIVERSAL) .verify_end() .end_cons(); } else throw Decoding_Error("PBE-PKCS5 v2.0: Unknown KDF algorithm " + kdf_algo.oid.as_string()); Algorithm_Factory& af = global_state().algorithm_factory(); std::string cipher = OIDS::lookup(enc_algo.oid); std::vector cipher_spec = split_on(cipher, '/'); if(cipher_spec.size() != 2) throw Decoding_Error("PBE-PKCS5 v2.0: Invalid cipher spec " + cipher); if(!known_cipher(cipher_spec[0]) || cipher_spec[1] != "CBC") throw Decoding_Error("PBE-PKCS5 v2.0: Don't know param format for " + cipher); BER_Decoder(enc_algo.parameters).decode(iv, OCTET_STRING).verify_end(); block_cipher = af.make_block_cipher(cipher_spec[0]); hash_function = af.make_hash_function("SHA-160"); if(key_length == 0) key_length = block_cipher->maximum_keylength(); if(salt.size() < 8) throw Decoding_Error("PBE-PKCS5 v2.0: Encoded salt is too small"); } /* * Return an OID for PBES2 */ OID PBE_PKCS5v20::get_oid() const { return OIDS::lookup("PBE-PKCS5v20"); } /* * Check if this is a known PBES2 cipher */ bool PBE_PKCS5v20::known_cipher(const std::string& algo) { if(algo == "AES-128" || algo == "AES-192" || algo == "AES-256") return true; if(algo == "DES" || algo == "TripleDES") return true; return false; } std::string PBE_PKCS5v20::name() const { return "PBE-PKCS5v20(" + block_cipher->name() + "," + hash_function->name() + ")"; } /* * PKCS#5 v2.0 PBE Constructor */ PBE_PKCS5v20::PBE_PKCS5v20(BlockCipher* cipher, HashFunction* digest) : direction(ENCRYPTION), block_cipher(cipher), hash_function(digest), iterations(0), key_length(0) { if(!known_cipher(block_cipher->name())) throw Invalid_Argument("PBE-PKCS5 v2.0: Invalid cipher " + cipher->name()); if(hash_function->name() != "SHA-160") throw Invalid_Argument("PBE-PKCS5 v2.0: Invalid digest " + digest->name()); } /* * PKCS#5 v2.0 PBE Constructor */ PBE_PKCS5v20::PBE_PKCS5v20(DataSource& params) : direction(DECRYPTION) { hash_function = 0; block_cipher = 0; decode_params(params); } PBE_PKCS5v20::~PBE_PKCS5v20() { delete hash_function; delete block_cipher; } } Botan-1.10.12/src/pbe/pbes2/pbes2.h0000664000175000017500000000270312654331322016322 0ustar jackjack00000000000000/* * PKCS #5 v2.0 PBE * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PBE_PKCS_v20_H__ #define BOTAN_PBE_PKCS_v20_H__ #include #include #include #include namespace Botan { /** * PKCS #5 v2.0 PBE */ class BOTAN_DLL PBE_PKCS5v20 : public PBE { public: /** * @param cipher names a block cipher * @return true iff PKCS #5 knows how to use this cipher */ static bool known_cipher(const std::string& cipher); std::string name() const; void write(const byte[], size_t); void start_msg(); void end_msg(); /** * Load a PKCS #5 v2.0 encrypted stream * @param input is the input source */ PBE_PKCS5v20(DataSource& input); /** * @param cipher the block cipher to use * @param hash the hash function to use */ PBE_PKCS5v20(BlockCipher* cipher, HashFunction* hash); ~PBE_PKCS5v20(); private: void set_key(const std::string&); void new_params(RandomNumberGenerator& rng); MemoryVector encode_params() const; void decode_params(DataSource&); OID get_oid() const; void flush_pipe(bool); Cipher_Dir direction; BlockCipher* block_cipher; HashFunction* hash_function; SecureVector salt, key, iv; size_t iterations, key_length; Pipe pipe; }; } #endif Botan-1.10.12/src/pbkdf/info.txt0000664000175000017500000000004112654331322016130 0ustar jackjack00000000000000 algo_base Botan-1.10.12/src/pbkdf/pbkdf.h0000664000175000017500000000242012654331322015676 0ustar jackjack00000000000000/* * PBKDF * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PBKDF_H__ #define BOTAN_PBKDF_H__ #include #include namespace Botan { /** * Base class for PBKDF (password based key derivation function) * implementations. Converts a password into a key using a salt * and iterated hashing to make brute force attacks harder. */ class BOTAN_DLL PBKDF : public Algorithm { public: /** * @return new instance of this same algorithm */ virtual PBKDF* clone() const = 0; void clear() {} /** * Derive a key from a passphrase * @param output_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param iterations the number of iterations to use (use 10K or more) */ virtual OctetString derive_key(size_t output_len, const std::string& passphrase, const byte salt[], size_t salt_len, size_t iterations) const = 0; }; /** * For compatability with 1.8 */ typedef PBKDF S2K; } #endif Botan-1.10.12/src/pbkdf/pbkdf1/info.txt0000664000175000017500000000005312654331322017302 0ustar jackjack00000000000000define PBKDF1 hash Botan-1.10.12/src/pbkdf/pbkdf1/pbkdf1.cpp0000664000175000017500000000173412654331322017470 0ustar jackjack00000000000000/* * PBKDF1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Return a PKCS#5 PBKDF1 derived key */ OctetString PKCS5_PBKDF1::derive_key(size_t key_len, const std::string& passphrase, const byte salt[], size_t salt_size, size_t iterations) const { if(iterations == 0) throw Invalid_Argument("PKCS5_PBKDF1: Invalid iteration count"); if(key_len > hash->output_length()) throw Invalid_Argument("PKCS5_PBKDF1: Requested output length too long"); hash->update(passphrase); hash->update(salt, salt_size); SecureVector key = hash->final(); for(size_t j = 1; j != iterations; ++j) { hash->update(key); hash->final(&key[0]); } return OctetString(&key[0], std::min(key_len, key.size())); } } Botan-1.10.12/src/pbkdf/pbkdf1/pbkdf1.h0000664000175000017500000000251312654331322017131 0ustar jackjack00000000000000/* * PBKDF1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PBKDF1_H__ #define BOTAN_PBKDF1_H__ #include #include namespace Botan { /** * PKCS #5 v1 PBKDF, aka PBKDF1 * Can only generate a key up to the size of the hash output. * Unless needed for backwards compatability, use PKCS5_PBKDF2 */ class BOTAN_DLL PKCS5_PBKDF1 : public PBKDF { public: /** * Create a PKCS #5 instance using the specified hash function. * @param hash_in pointer to a hash function object to use */ PKCS5_PBKDF1(HashFunction* hash_in) : hash(hash_in) {} /** * Copy constructor * @param other the object to copy */ PKCS5_PBKDF1(const PKCS5_PBKDF1& other) : PBKDF(), hash(other.hash->clone()) {} ~PKCS5_PBKDF1() { delete hash; } std::string name() const { return "PBKDF1(" + hash->name() + ")"; } PBKDF* clone() const { return new PKCS5_PBKDF1(hash->clone()); } OctetString derive_key(size_t output_len, const std::string& passphrase, const byte salt[], size_t salt_len, size_t iterations) const; private: HashFunction* hash; }; } #endif Botan-1.10.12/src/pbkdf/pbkdf2/info.txt0000664000175000017500000000005212654331322017302 0ustar jackjack00000000000000define PBKDF2 mac Botan-1.10.12/src/pbkdf/pbkdf2/pbkdf2.cpp0000664000175000017500000000275212654331322017473 0ustar jackjack00000000000000/* * PBKDF2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Return a PKCS #5 PBKDF2 derived key */ OctetString PKCS5_PBKDF2::derive_key(size_t key_len, const std::string& passphrase, const byte salt[], size_t salt_size, size_t iterations) const { if(iterations == 0) throw Invalid_Argument("PKCS#5 PBKDF2: Invalid iteration count"); try { mac->set_key(reinterpret_cast(passphrase.data()), passphrase.length()); } catch(Invalid_Key_Length) { throw Exception(name() + " cannot accept passphrases of length " + to_string(passphrase.length())); } SecureVector key(key_len); byte* T = &key[0]; SecureVector U(mac->output_length()); u32bit counter = 1; while(key_len) { size_t T_size = std::min(mac->output_length(), key_len); mac->update(salt, salt_size); mac->update_be(counter); mac->final(&U[0]); xor_buf(T, U, T_size); for(size_t j = 1; j != iterations; ++j) { mac->update(U); mac->final(&U[0]); xor_buf(T, U, T_size); } key_len -= T_size; T += T_size; ++counter; } return key; } } Botan-1.10.12/src/pbkdf/pbkdf2/pbkdf2.h0000664000175000017500000000205612654331322017135 0ustar jackjack00000000000000/* * PBKDF2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PBKDF2_H__ #define BOTAN_PBKDF2_H__ #include #include namespace Botan { /** * PKCS #5 PBKDF2 */ class BOTAN_DLL PKCS5_PBKDF2 : public PBKDF { public: std::string name() const { return "PBKDF2(" + mac->name() + ")"; } PBKDF* clone() const { return new PKCS5_PBKDF2(mac->clone()); } OctetString derive_key(size_t output_len, const std::string& passphrase, const byte salt[], size_t salt_len, size_t iterations) const; /** * Create a PKCS #5 instance using the specified message auth code * @param mac_fn the MAC to use */ PKCS5_PBKDF2(MessageAuthenticationCode* mac_fn) : mac(mac_fn) {} /** * Destructor */ ~PKCS5_PBKDF2() { delete mac; } private: MessageAuthenticationCode* mac; }; } #endif Botan-1.10.12/src/pbkdf/pgps2k/info.txt0000664000175000017500000000005312654331322017341 0ustar jackjack00000000000000define PGPS2K hash Botan-1.10.12/src/pbkdf/pgps2k/pgp_s2k.cpp0000664000175000017500000000257412654331322017730 0ustar jackjack00000000000000/* * OpenPGP S2K * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * Derive a key using the OpenPGP S2K algorithm */ OctetString OpenPGP_S2K::derive_key(size_t key_len, const std::string& passphrase, const byte salt_buf[], size_t salt_size, size_t iterations) const { SecureVector key(key_len), hash_buf; size_t pass = 0, generated = 0, total_size = passphrase.size() + salt_size; size_t to_hash = std::max(iterations, total_size); hash->clear(); while(key_len > generated) { for(size_t j = 0; j != pass; ++j) hash->update(0); size_t left = to_hash; while(left >= total_size) { hash->update(salt_buf, salt_size); hash->update(passphrase); left -= total_size; } if(left <= salt_size) hash->update(salt_buf, left); else { hash->update(salt_buf, salt_size); left -= salt_size; hash->update(reinterpret_cast(passphrase.data()), left); } hash_buf = hash->final(); key.copy(generated, &hash_buf[0], hash->output_length()); generated += hash->output_length(); ++pass; } return key; } } Botan-1.10.12/src/pbkdf/pgps2k/pgp_s2k.h0000664000175000017500000000171212654331322017366 0ustar jackjack00000000000000/* * OpenPGP PBKDF * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_OPENPGP_S2K_H__ #define BOTAN_OPENPGP_S2K_H__ #include #include namespace Botan { /** * OpenPGP's S2K */ class BOTAN_DLL OpenPGP_S2K : public PBKDF { public: /** * @param hash_in the hash function to use */ OpenPGP_S2K(HashFunction* hash_in) : hash(hash_in) {} ~OpenPGP_S2K() { delete hash; } std::string name() const { return "OpenPGP-S2K(" + hash->name() + ")"; } PBKDF* clone() const { return new OpenPGP_S2K(hash->clone()); } OctetString derive_key(size_t output_len, const std::string& passphrase, const byte salt[], size_t salt_len, size_t iterations) const; private: HashFunction* hash; }; } #endif Botan-1.10.12/src/pk_pad/eme.cpp0000664000175000017500000000205112654331322016061 0ustar jackjack00000000000000/* * EME Base Class * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * Encode a message */ SecureVector EME::encode(const byte msg[], size_t msg_len, size_t key_bits, RandomNumberGenerator& rng) const { return pad(msg, msg_len, key_bits, rng); } /* * Encode a message */ SecureVector EME::encode(const MemoryRegion& msg, size_t key_bits, RandomNumberGenerator& rng) const { return pad(&msg[0], msg.size(), key_bits, rng); } /* * Decode a message */ SecureVector EME::decode(const byte msg[], size_t msg_len, size_t key_bits) const { return unpad(msg, msg_len, key_bits); } /* * Decode a message */ SecureVector EME::decode(const MemoryRegion& msg, size_t key_bits) const { return unpad(&msg[0], msg.size(), key_bits); } } Botan-1.10.12/src/pk_pad/eme.h0000664000175000017500000000577512654331322015546 0ustar jackjack00000000000000/* * EME Classes * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PUBKEY_EME_ENCRYPTION_PAD_H__ #define BOTAN_PUBKEY_EME_ENCRYPTION_PAD_H__ #include #include namespace Botan { /** * Encoding Method for Encryption */ class BOTAN_DLL EME { public: /** * Return the maximum input size in bytes we can support * @param keybits the size of the key in bits * @return upper bound of input in bytes */ virtual size_t maximum_input_size(size_t keybits) const = 0; /** * Encode an input * @param in the plaintext * @param in_length length of plaintext in bytes * @param key_length length of the key in bits * @param rng a random number generator * @return encoded plaintext */ SecureVector encode(const byte in[], size_t in_length, size_t key_length, RandomNumberGenerator& rng) const; /** * Encode an input * @param in the plaintext * @param key_length length of the key in bits * @param rng a random number generator * @return encoded plaintext */ SecureVector encode(const MemoryRegion& in, size_t key_length, RandomNumberGenerator& rng) const; /** * Decode an input * @param in the encoded plaintext * @param in_length length of encoded plaintext in bytes * @param key_length length of the key in bits * @return plaintext */ SecureVector decode(const byte in[], size_t in_length, size_t key_length) const; /** * Decode an input * @param in the encoded plaintext * @param key_length length of the key in bits * @return plaintext */ SecureVector decode(const MemoryRegion& in, size_t key_length) const; virtual ~EME() {} private: /** * Encode an input * @param in the plaintext * @param in_length length of plaintext in bytes * @param key_length length of the key in bits * @param rng a random number generator * @return encoded plaintext */ virtual SecureVector pad(const byte in[], size_t in_length, size_t key_length, RandomNumberGenerator& rng) const = 0; /** * Decode an input * @param in the encoded plaintext * @param in_length length of encoded plaintext in bytes * @param key_length length of the key in bits * @return plaintext */ virtual SecureVector unpad(const byte in[], size_t in_length, size_t key_length) const = 0; }; } #endif Botan-1.10.12/src/pk_pad/eme1/eme1.cpp0000664000175000017500000000647612654331322017010 0ustar jackjack00000000000000/* * EME1 (aka OAEP) * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * EME1 Pad Operation */ SecureVector EME1::pad(const byte in[], size_t in_length, size_t key_length, RandomNumberGenerator& rng) const { key_length /= 8; if(key_length < in_length + 2*Phash.size() + 1) throw Invalid_Argument("EME1: Input is too large"); SecureVector out(key_length); rng.randomize(&out[0], Phash.size()); out.copy(Phash.size(), &Phash[0], Phash.size()); out[out.size() - in_length - 1] = 0x01; out.copy(out.size() - in_length, in, in_length); mgf->mask(&out[0], Phash.size(), &out[Phash.size()], out.size() - Phash.size()); mgf->mask(&out[Phash.size()], out.size() - Phash.size(), &out[0], Phash.size()); return out; } /* * EME1 Unpad Operation */ SecureVector EME1::unpad(const byte in[], size_t in_length, size_t key_length) const { /* Must be careful about error messages here; if an attacker can distinguish them, it is easy to use the differences as an oracle to find the secret key, as described in "A Chosen Ciphertext Attack on RSA Optimal Asymmetric Encryption Padding (OAEP) as Standardized in PKCS #1 v2.0", James Manger, Crypto 2001 Also have to be careful about timing attacks! Pointed out by Falko Strenzke. */ key_length /= 8; // Invalid input: truncate to zero length input, causing later // checks to fail if(in_length > key_length) in_length = 0; SecureVector input(key_length); input.copy(key_length - in_length, in, in_length); mgf->mask(&input[Phash.size()], input.size() - Phash.size(), &input[0], Phash.size()); mgf->mask(&input[0], Phash.size(), &input[Phash.size()], input.size() - Phash.size()); bool waiting_for_delim = true; bool bad_input = false; size_t delim_idx = 2 * Phash.size(); /* * GCC 4.5 on x86-64 compiles this in a way that is still vunerable * to timing analysis. Other compilers, or GCC on other platforms, * may or may not. */ for(size_t i = delim_idx; i < input.size(); ++i) { const bool zero_p = !input[i]; const bool one_p = input[i] == 0x01; const bool add_1 = waiting_for_delim && zero_p; bad_input |= waiting_for_delim && !(zero_p || one_p); delim_idx += add_1; waiting_for_delim &= zero_p; } // If we never saw any non-zero byte, then it's not valid input bad_input |= waiting_for_delim; bad_input |= !same_mem(&input[Phash.size()], &Phash[0], Phash.size()); if(bad_input) throw Decoding_Error("Invalid EME1 encoding"); return SecureVector(input + delim_idx + 1, input.size() - delim_idx - 1); } /* * Return the max input size for a given key size */ size_t EME1::maximum_input_size(size_t keybits) const { if(keybits / 8 > 2*Phash.size() + 1) return ((keybits / 8) - 2*Phash.size() - 1); else return 0; } /* * EME1 Constructor */ EME1::EME1(HashFunction* hash, const std::string& P) { Phash = hash->process(P); mgf = new MGF1(hash); } } Botan-1.10.12/src/pk_pad/eme1/eme1.h0000664000175000017500000000151312654331322016440 0ustar jackjack00000000000000/* * EME1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EME1_H__ #define BOTAN_EME1_H__ #include #include #include namespace Botan { /** * EME1, aka OAEP */ class BOTAN_DLL EME1 : public EME { public: size_t maximum_input_size(size_t) const; /** * @param hash object to use for hashing (takes ownership) * @param P an optional label. Normally empty. */ EME1(HashFunction* hash, const std::string& P = ""); ~EME1() { delete mgf; } private: SecureVector pad(const byte[], size_t, size_t, RandomNumberGenerator&) const; SecureVector unpad(const byte[], size_t, size_t) const; SecureVector Phash; MGF* mgf; }; } #endif Botan-1.10.12/src/pk_pad/eme1/info.txt0000664000175000017500000000010012654331322017123 0ustar jackjack00000000000000define EME1 load_on auto hash kdf mgf1 Botan-1.10.12/src/pk_pad/eme_pkcs/eme_pkcs.cpp0000664000175000017500000000300412654331322020666 0ustar jackjack00000000000000/* * PKCS1 EME * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * PKCS1 Pad Operation */ SecureVector EME_PKCS1v15::pad(const byte in[], size_t inlen, size_t olen, RandomNumberGenerator& rng) const { olen /= 8; if(olen < 10) throw Encoding_Error("PKCS1: Output space too small"); if(inlen > olen - 10) throw Encoding_Error("PKCS1: Input is too large"); SecureVector out(olen); out[0] = 0x02; for(size_t j = 1; j != olen - inlen - 1; ++j) while(out[j] == 0) out[j] = rng.next_byte(); out.copy(olen - inlen, in, inlen); return out; } /* * PKCS1 Unpad Operation */ SecureVector EME_PKCS1v15::unpad(const byte in[], size_t inlen, size_t key_len) const { if(inlen != key_len / 8 || inlen < 10 || in[0] != 0x02) throw Decoding_Error("PKCS1::unpad"); size_t seperator = 0; for(size_t j = 0; j != inlen; ++j) if(in[j] == 0) { seperator = j; break; } if(seperator < 9) throw Decoding_Error("PKCS1::unpad"); return SecureVector(in + seperator + 1, inlen - seperator - 1); } /* * Return the max input size for a given key size */ size_t EME_PKCS1v15::maximum_input_size(size_t keybits) const { if(keybits / 8 > 10) return ((keybits / 8) - 10); else return 0; } } Botan-1.10.12/src/pk_pad/eme_pkcs/eme_pkcs.h0000664000175000017500000000105512654331322020337 0ustar jackjack00000000000000/* * EME PKCS#1 v1.5 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EME_PKCS1_H__ #define BOTAN_EME_PKCS1_H__ #include namespace Botan { /** * EME from PKCS #1 v1.5 */ class BOTAN_DLL EME_PKCS1v15 : public EME { public: size_t maximum_input_size(size_t) const; private: SecureVector pad(const byte[], size_t, size_t, RandomNumberGenerator&) const; SecureVector unpad(const byte[], size_t, size_t) const; }; } #endif Botan-1.10.12/src/pk_pad/eme_pkcs/info.txt0000664000175000017500000000002412654331322020067 0ustar jackjack00000000000000define EME_PKCS1v15 Botan-1.10.12/src/pk_pad/emsa.h0000664000175000017500000000310212654331322015703 0ustar jackjack00000000000000/* * EMSA Classes * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PUBKEY_EMSA_H__ #define BOTAN_PUBKEY_EMSA_H__ #include #include namespace Botan { /** * Encoding Method for Signatures, Appendix */ class BOTAN_DLL EMSA { public: /** * Add more data to the signature computation * @param input some data * @param length length of input in bytes */ virtual void update(const byte input[], size_t length) = 0; /** * @return raw hash */ virtual SecureVector raw_data() = 0; /** * Return the encoding of a message * @param msg the result of raw_data() * @param output_bits the desired output bit size * @param rng a random number generator * @return encoded signature */ virtual SecureVector encoding_of(const MemoryRegion& msg, size_t output_bits, RandomNumberGenerator& rng) = 0; /** * Verify the encoding * @param coded the received (coded) message representative * @param raw the computed (local, uncoded) message representative * @param key_bits the size of the key in bits * @return true if coded is a valid encoding of raw, otherwise false */ virtual bool verify(const MemoryRegion& coded, const MemoryRegion& raw, size_t key_bits) = 0; virtual ~EMSA() {} }; } #endif Botan-1.10.12/src/pk_pad/emsa1/emsa1.cpp0000664000175000017500000000454312654331322017337 0ustar jackjack00000000000000/* * EMSA1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { namespace { SecureVector emsa1_encoding(const MemoryRegion& msg, size_t output_bits) { if(8*msg.size() <= output_bits) return msg; size_t shift = 8*msg.size() - output_bits; size_t byte_shift = shift / 8, bit_shift = shift % 8; SecureVector digest(msg.size() - byte_shift); for(size_t j = 0; j != msg.size() - byte_shift; ++j) digest[j] = msg[j]; if(bit_shift) { byte carry = 0; for(size_t j = 0; j != digest.size(); ++j) { byte temp = digest[j]; digest[j] = (temp >> bit_shift) | carry; carry = (temp << (8 - bit_shift)); } } return digest; } } /* * EMSA1 Update Operation */ void EMSA1::update(const byte input[], size_t length) { hash->update(input, length); } /* * Return the raw (unencoded) data */ SecureVector EMSA1::raw_data() { return hash->final(); } /* * EMSA1 Encode Operation */ SecureVector EMSA1::encoding_of(const MemoryRegion& msg, size_t output_bits, RandomNumberGenerator&) { if(msg.size() != hash->output_length()) throw Encoding_Error("EMSA1::encoding_of: Invalid size for input"); return emsa1_encoding(msg, output_bits); } /* * EMSA1 Decode/Verify Operation */ bool EMSA1::verify(const MemoryRegion& coded, const MemoryRegion& raw, size_t key_bits) { try { if(raw.size() != hash->output_length()) throw Encoding_Error("EMSA1::encoding_of: Invalid size for input"); SecureVector our_coding = emsa1_encoding(raw, key_bits); if(our_coding == coded) return true; if(our_coding[0] != 0) return false; if(our_coding.size() <= coded.size()) return false; size_t offset = 0; while(our_coding[offset] == 0 && offset < our_coding.size()) ++offset; if(our_coding.size() - offset != coded.size()) return false; for(size_t j = 0; j != coded.size(); ++j) if(coded[j] != our_coding[j+offset]) return false; return true; } catch(Invalid_Argument) { return false; } } } Botan-1.10.12/src/pk_pad/emsa1/emsa1.h0000664000175000017500000000173012654331322016777 0ustar jackjack00000000000000/* * EMSA1 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EMSA1_H__ #define BOTAN_EMSA1_H__ #include #include namespace Botan { /** * EMSA1 from IEEE 1363 * Essentially, sign the hash directly */ class BOTAN_DLL EMSA1 : public EMSA { public: /** * @param h the hash object to use */ EMSA1(HashFunction* h) : hash(h) {} ~EMSA1() { delete hash; } protected: /** * @return const pointer to the underlying hash */ const HashFunction* hash_ptr() const { return hash; } private: void update(const byte[], size_t); SecureVector raw_data(); SecureVector encoding_of(const MemoryRegion&, size_t, RandomNumberGenerator& rng); bool verify(const MemoryRegion&, const MemoryRegion&, size_t); HashFunction* hash; }; } #endif Botan-1.10.12/src/pk_pad/emsa1/info.txt0000664000175000017500000000005212654331322017310 0ustar jackjack00000000000000define EMSA1 hash Botan-1.10.12/src/pk_pad/emsa1_bsi/emsa1_bsi.cpp0000664000175000017500000000127612654331322021031 0ustar jackjack00000000000000/* * EMSA1 BSI * (C) 1999-2008 Jack Lloyd * 2008 Falko Strenzke, FlexSecure GmbH * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * EMSA1 BSI Encode Operation */ SecureVector EMSA1_BSI::encoding_of(const MemoryRegion& msg, size_t output_bits, RandomNumberGenerator&) { if(msg.size() != hash_ptr()->output_length()) throw Encoding_Error("EMSA1_BSI::encoding_of: Invalid size for input"); if(8*msg.size() <= output_bits) return msg; throw Encoding_Error("EMSA1_BSI::encoding_of: max key input size exceeded"); } } Botan-1.10.12/src/pk_pad/emsa1_bsi/emsa1_bsi.h0000664000175000017500000000136212654331322020472 0ustar jackjack00000000000000/* * EMSA1 BSI Variant * (C) 1999-2008 Jack Lloyd * 2007 FlexSecure GmbH * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EMSA1_BSI_H__ #define BOTAN_EMSA1_BSI_H__ #include namespace Botan { /** EMSA1_BSI is a variant of EMSA1 specified by the BSI. It accepts only hash values which are less or equal than the maximum key length. The implementation comes from InSiTo */ class BOTAN_DLL EMSA1_BSI : public EMSA1 { public: /** * @param hash the hash object to use */ EMSA1_BSI(HashFunction* hash) : EMSA1(hash) {} private: SecureVector encoding_of(const MemoryRegion&, size_t, RandomNumberGenerator& rng); }; } #endif Botan-1.10.12/src/pk_pad/emsa1_bsi/info.txt0000664000175000017500000000005712654331322020152 0ustar jackjack00000000000000define EMSA1_BSI emsa1 Botan-1.10.12/src/pk_pad/emsa2/emsa2.cpp0000664000175000017500000000470212654331322017336 0ustar jackjack00000000000000/* * EMSA2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { /* * EMSA2 Encode Operation */ SecureVector emsa2_encoding(const MemoryRegion& msg, size_t output_bits, const MemoryRegion& empty_hash, byte hash_id) { const size_t HASH_SIZE = empty_hash.size(); size_t output_length = (output_bits + 1) / 8; if(msg.size() != HASH_SIZE) throw Encoding_Error("EMSA2::encoding_of: Bad input length"); if(output_length < HASH_SIZE + 4) throw Encoding_Error("EMSA2::encoding_of: Output length is too small"); bool empty = true; for(size_t j = 0; j != HASH_SIZE; ++j) if(empty_hash[j] != msg[j]) empty = false; SecureVector output(output_length); output[0] = (empty ? 0x4B : 0x6B); output[output_length - 3 - HASH_SIZE] = 0xBA; set_mem(&output[1], output_length - 4 - HASH_SIZE, 0xBB); output.copy(output_length - (HASH_SIZE + 2), &msg[0], msg.size()); output[output_length-2] = hash_id; output[output_length-1] = 0xCC; return output; } } /* * EMSA2 Update Operation */ void EMSA2::update(const byte input[], size_t length) { hash->update(input, length); } /* * Return the raw (unencoded) data */ SecureVector EMSA2::raw_data() { return hash->final(); } /* * EMSA2 Encode Operation */ SecureVector EMSA2::encoding_of(const MemoryRegion& msg, size_t output_bits, RandomNumberGenerator&) { return emsa2_encoding(msg, output_bits, empty_hash, hash_id); } /* * EMSA2 Verify Operation */ bool EMSA2::verify(const MemoryRegion& coded, const MemoryRegion& raw, size_t key_bits) { try { return (coded == emsa2_encoding(raw, key_bits, empty_hash, hash_id)); } catch(...) { return false; } } /* * EMSA2 Constructor */ EMSA2::EMSA2(HashFunction* hash_in) : hash(hash_in) { empty_hash = hash->final(); const std::string hash_name = hash->name(); hash_id = ieee1363_hash_id(hash_name); if(hash_id == 0) { delete hash; throw Encoding_Error("EMSA2 cannot be used with " + hash_name); } } } Botan-1.10.12/src/pk_pad/emsa2/emsa2.h0000664000175000017500000000155712654331322017010 0ustar jackjack00000000000000/* * EMSA2 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EMSA2_H__ #define BOTAN_EMSA2_H__ #include #include namespace Botan { /** * EMSA2 from IEEE 1363 * Useful for Rabin-Williams */ class BOTAN_DLL EMSA2 : public EMSA { public: /** * @param hash the hash object to use */ EMSA2(HashFunction* hash); ~EMSA2() { delete hash; } private: void update(const byte[], size_t); SecureVector raw_data(); SecureVector encoding_of(const MemoryRegion&, size_t, RandomNumberGenerator& rng); bool verify(const MemoryRegion&, const MemoryRegion&, size_t); SecureVector empty_hash; HashFunction* hash; byte hash_id; }; } #endif Botan-1.10.12/src/pk_pad/emsa2/info.txt0000664000175000017500000000006212654331322017312 0ustar jackjack00000000000000define EMSA2 hash hash_id Botan-1.10.12/src/pk_pad/emsa3/emsa3.cpp0000664000175000017500000000622412654331322017341 0ustar jackjack00000000000000/* * EMSA3 and EMSA3_Raw * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { /* * EMSA3 Encode Operation */ SecureVector emsa3_encoding(const MemoryRegion& msg, size_t output_bits, const byte hash_id[], size_t hash_id_length) { size_t output_length = output_bits / 8; if(output_length < hash_id_length + msg.size() + 10) throw Encoding_Error("emsa3_encoding: Output length is too small"); SecureVector T(output_length); const size_t P_LENGTH = output_length - msg.size() - hash_id_length - 2; T[0] = 0x01; set_mem(&T[1], P_LENGTH, 0xFF); T[P_LENGTH+1] = 0x00; T.copy(P_LENGTH+2, hash_id, hash_id_length); T.copy(output_length-msg.size(), &msg[0], msg.size()); return T; } } /* * EMSA3 Update Operation */ void EMSA3::update(const byte input[], size_t length) { hash->update(input, length); } /* * Return the raw (unencoded) data */ SecureVector EMSA3::raw_data() { return hash->final(); } /* * EMSA3 Encode Operation */ SecureVector EMSA3::encoding_of(const MemoryRegion& msg, size_t output_bits, RandomNumberGenerator&) { if(msg.size() != hash->output_length()) throw Encoding_Error("EMSA3::encoding_of: Bad input length"); return emsa3_encoding(msg, output_bits, &hash_id[0], hash_id.size()); } /* * Default signature decoding */ bool EMSA3::verify(const MemoryRegion& coded, const MemoryRegion& raw, size_t key_bits) { if(raw.size() != hash->output_length()) return false; try { return (coded == emsa3_encoding(raw, key_bits, &hash_id[0], hash_id.size())); } catch(...) { return false; } } /* * EMSA3 Constructor */ EMSA3::EMSA3(HashFunction* hash_in) : hash(hash_in) { hash_id = pkcs_hash_id(hash->name()); } /* * EMSA3 Destructor */ EMSA3::~EMSA3() { delete hash; } /* * EMSA3_Raw Update Operation */ void EMSA3_Raw::update(const byte input[], size_t length) { message += std::make_pair(input, length); } /* * Return the raw (unencoded) data */ SecureVector EMSA3_Raw::raw_data() { SecureVector ret; std::swap(ret, message); return ret; } /* * EMSA3_Raw Encode Operation */ SecureVector EMSA3_Raw::encoding_of(const MemoryRegion& msg, size_t output_bits, RandomNumberGenerator&) { return emsa3_encoding(msg, output_bits, 0, 0); } /* * Default signature decoding */ bool EMSA3_Raw::verify(const MemoryRegion& coded, const MemoryRegion& raw, size_t key_bits) { try { return (coded == emsa3_encoding(raw, key_bits, 0, 0)); } catch(...) { return false; } } } Botan-1.10.12/src/pk_pad/emsa3/emsa3.h0000664000175000017500000000273212654331322017006 0ustar jackjack00000000000000/* * EMSA3 and EMSA3_Raw * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EMSA3_H__ #define BOTAN_EMSA3_H__ #include #include namespace Botan { /** * EMSA3 from IEEE 1363 * aka PKCS #1 v1.5 signature padding * aka PKCS #1 block type 1 */ class BOTAN_DLL EMSA3 : public EMSA { public: /** * @param hash the hash object to use */ EMSA3(HashFunction* hash); ~EMSA3(); void update(const byte[], size_t); SecureVector raw_data(); SecureVector encoding_of(const MemoryRegion&, size_t, RandomNumberGenerator& rng); bool verify(const MemoryRegion&, const MemoryRegion&, size_t); private: HashFunction* hash; SecureVector hash_id; }; /** * EMSA3_Raw which is EMSA3 without a hash or digest id (which * according to QCA docs is "identical to PKCS#11's CKM_RSA_PKCS * mechanism", something I have not confirmed) */ class BOTAN_DLL EMSA3_Raw : public EMSA { public: void update(const byte[], size_t); SecureVector raw_data(); SecureVector encoding_of(const MemoryRegion&, size_t, RandomNumberGenerator& rng); bool verify(const MemoryRegion&, const MemoryRegion&, size_t); private: SecureVector message; }; } #endif Botan-1.10.12/src/pk_pad/emsa3/info.txt0000664000175000017500000000006212654331322017313 0ustar jackjack00000000000000define EMSA3 hash hash_id Botan-1.10.12/src/pk_pad/emsa4/emsa4.cpp0000664000175000017500000000667212654331322017352 0ustar jackjack00000000000000/* * EMSA4 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * EMSA4 Update Operation */ void EMSA4::update(const byte input[], size_t length) { hash->update(input, length); } /* * Return the raw (unencoded) data */ SecureVector EMSA4::raw_data() { return hash->final(); } /* * EMSA4 Encode Operation */ SecureVector EMSA4::encoding_of(const MemoryRegion& msg, size_t output_bits, RandomNumberGenerator& rng) { const size_t HASH_SIZE = hash->output_length(); if(msg.size() != HASH_SIZE) throw Encoding_Error("EMSA4::encoding_of: Bad input length"); if(output_bits < 8*HASH_SIZE + 8*SALT_SIZE + 9) throw Encoding_Error("EMSA4::encoding_of: Output length is too small"); const size_t output_length = (output_bits + 7) / 8; SecureVector salt = rng.random_vec(SALT_SIZE); for(size_t j = 0; j != 8; ++j) hash->update(0); hash->update(msg); hash->update(salt, SALT_SIZE); SecureVector H = hash->final(); SecureVector EM(output_length); EM[output_length - HASH_SIZE - SALT_SIZE - 2] = 0x01; EM.copy(output_length - 1 - HASH_SIZE - SALT_SIZE, salt, SALT_SIZE); mgf->mask(H, HASH_SIZE, EM, output_length - HASH_SIZE - 1); EM[0] &= 0xFF >> (8 * ((output_bits + 7) / 8) - output_bits); EM.copy(output_length - 1 - HASH_SIZE, H, HASH_SIZE); EM[output_length-1] = 0xBC; return EM; } /* * EMSA4 Decode/Verify Operation */ bool EMSA4::verify(const MemoryRegion& const_coded, const MemoryRegion& raw, size_t key_bits) { const size_t HASH_SIZE = hash->output_length(); const size_t KEY_BYTES = (key_bits + 7) / 8; if(key_bits < 8*HASH_SIZE + 9) return false; if(raw.size() != HASH_SIZE) return false; if(const_coded.size() > KEY_BYTES || const_coded.size() <= 1) return false; if(const_coded[const_coded.size()-1] != 0xBC) return false; SecureVector coded = const_coded; if(coded.size() < KEY_BYTES) { SecureVector temp(KEY_BYTES); temp.copy(KEY_BYTES - coded.size(), coded, coded.size()); coded = temp; } const size_t TOP_BITS = 8 * ((key_bits + 7) / 8) - key_bits; if(TOP_BITS > 8 - high_bit(coded[0])) return false; SecureVector DB(&coded[0], coded.size() - HASH_SIZE - 1); SecureVector H(&coded[coded.size() - HASH_SIZE - 1], HASH_SIZE); mgf->mask(H, H.size(), DB, coded.size() - H.size() - 1); DB[0] &= 0xFF >> TOP_BITS; size_t salt_offset = 0; for(size_t j = 0; j != DB.size(); ++j) { if(DB[j] == 0x01) { salt_offset = j + 1; break; } if(DB[j]) return false; } if(salt_offset == 0) return false; SecureVector salt(&DB[salt_offset], DB.size() - salt_offset); for(size_t j = 0; j != 8; ++j) hash->update(0); hash->update(raw); hash->update(salt); SecureVector H2 = hash->final(); return (H == H2); } /* * EMSA4 Constructor */ EMSA4::EMSA4(HashFunction* h) : SALT_SIZE(h->output_length()), hash(h) { mgf = new MGF1(hash->clone()); } /* * EMSA4 Constructor */ EMSA4::EMSA4(HashFunction* h, size_t salt_size) : SALT_SIZE(salt_size), hash(h) { mgf = new MGF1(hash->clone()); } } Botan-1.10.12/src/pk_pad/emsa4/emsa4.h0000664000175000017500000000202612654331322017004 0ustar jackjack00000000000000/* * EMSA4 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EMSA4_H__ #define BOTAN_EMSA4_H__ #include #include #include namespace Botan { /** * EMSA4 aka PSS-R */ class BOTAN_DLL EMSA4 : public EMSA { public: /** * @param hash the hash object to use */ EMSA4(HashFunction* hash); /** * @param hash the hash object to use * @param salt_size the size of the salt to use in bytes */ EMSA4(HashFunction* hash, size_t salt_size); ~EMSA4() { delete hash; delete mgf; } private: void update(const byte[], size_t); SecureVector raw_data(); SecureVector encoding_of(const MemoryRegion&, size_t, RandomNumberGenerator& rng); bool verify(const MemoryRegion&, const MemoryRegion&, size_t); size_t SALT_SIZE; HashFunction* hash; const MGF* mgf; }; } #endif Botan-1.10.12/src/pk_pad/emsa4/info.txt0000664000175000017500000000006312654331322017315 0ustar jackjack00000000000000define EMSA4 hash kdf mgf1 Botan-1.10.12/src/pk_pad/emsa_raw/emsa_raw.cpp0000664000175000017500000000262612654331322020717 0ustar jackjack00000000000000/* * EMSA-Raw * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * EMSA-Raw Encode Operation */ void EMSA_Raw::update(const byte input[], size_t length) { message += std::make_pair(input, length); } /* * Return the raw (unencoded) data */ SecureVector EMSA_Raw::raw_data() { SecureVector output; std::swap(message, output); return output; } /* * EMSA-Raw Encode Operation */ SecureVector EMSA_Raw::encoding_of(const MemoryRegion& msg, size_t, RandomNumberGenerator&) { return msg; } /* * EMSA-Raw Verify Operation */ bool EMSA_Raw::verify(const MemoryRegion& coded, const MemoryRegion& raw, size_t) { if(coded.size() == raw.size()) return (coded == raw); if(coded.size() > raw.size()) return false; // handle zero padding differences const size_t leading_zeros_expected = raw.size() - coded.size(); bool same_modulo_leading_zeros = true; for(size_t i = 0; i != leading_zeros_expected; ++i) if(raw[i]) same_modulo_leading_zeros = false; if(!same_mem(&coded[0], &raw[leading_zeros_expected], coded.size())) same_modulo_leading_zeros = false; return same_modulo_leading_zeros; } } Botan-1.10.12/src/pk_pad/emsa_raw/emsa_raw.h0000664000175000017500000000130712654331322020357 0ustar jackjack00000000000000/* * EMSA-Raw * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EMSA_RAW_H__ #define BOTAN_EMSA_RAW_H__ #include namespace Botan { /** * EMSA-Raw - sign inputs directly * Don't use this unless you know what you are doing. */ class BOTAN_DLL EMSA_Raw : public EMSA { private: void update(const byte[], size_t); SecureVector raw_data(); SecureVector encoding_of(const MemoryRegion&, size_t, RandomNumberGenerator&); bool verify(const MemoryRegion&, const MemoryRegion&, size_t); SecureVector message; }; } #endif Botan-1.10.12/src/pk_pad/emsa_raw/info.txt0000664000175000017500000000002012654331322020073 0ustar jackjack00000000000000define EMSA_RAW Botan-1.10.12/src/pk_pad/hash_id/hash_id.cpp0000664000175000017500000000643412654331322020322 0ustar jackjack00000000000000/* * Hash Function Identification * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace { const byte MD2_PKCS_ID[] = { 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 }; const byte MD5_PKCS_ID[] = { 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 }; const byte RIPEMD_128_PKCS_ID[] = { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02, 0x02, 0x05, 0x00, 0x04, 0x14 }; const byte RIPEMD_160_PKCS_ID[] = { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02, 0x01, 0x05, 0x00, 0x04, 0x14 }; const byte SHA_160_PKCS_ID[] = { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14 }; const byte SHA_224_PKCS_ID[] = { 0x30, 0x2D, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1C }; const byte SHA_256_PKCS_ID[] = { 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 }; const byte SHA_384_PKCS_ID[] = { 0x30, 0x41, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30 }; const byte SHA_512_PKCS_ID[] = { 0x30, 0x51, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40 }; const byte TIGER_PKCS_ID[] = { 0x30, 0x29, 0x30, 0x0D, 0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0C, 0x02, 0x05, 0x00, 0x04, 0x18 }; } /* * HashID as specified by PKCS */ MemoryVector pkcs_hash_id(const std::string& name) { // Special case for SSL/TLS RSA signatures if(name == "Parallel(MD5,SHA-160)") return MemoryVector(); if(name == "MD2") return MemoryVector(MD2_PKCS_ID, sizeof(MD2_PKCS_ID)); if(name == "MD5") return MemoryVector(MD5_PKCS_ID, sizeof(MD5_PKCS_ID)); if(name == "RIPEMD-128") return MemoryVector(RIPEMD_128_PKCS_ID, sizeof(RIPEMD_128_PKCS_ID)); if(name == "RIPEMD-160") return MemoryVector(RIPEMD_160_PKCS_ID, sizeof(RIPEMD_160_PKCS_ID)); if(name == "SHA-160") return MemoryVector(SHA_160_PKCS_ID, sizeof(SHA_160_PKCS_ID)); if(name == "SHA-224") return MemoryVector(SHA_224_PKCS_ID, sizeof(SHA_224_PKCS_ID)); if(name == "SHA-256") return MemoryVector(SHA_256_PKCS_ID, sizeof(SHA_256_PKCS_ID)); if(name == "SHA-384") return MemoryVector(SHA_384_PKCS_ID, sizeof(SHA_384_PKCS_ID)); if(name == "SHA-512") return MemoryVector(SHA_512_PKCS_ID, sizeof(SHA_512_PKCS_ID)); if(name == "Tiger(24,3)") return MemoryVector(TIGER_PKCS_ID, sizeof(TIGER_PKCS_ID)); throw Invalid_Argument("No PKCS #1 identifier for " + name); } /* * HashID as specified by IEEE 1363/X9.31 */ byte ieee1363_hash_id(const std::string& name) { if(name == "SHA-160") return 0x33; if(name == "SHA-224") return 0x38; if(name == "SHA-256") return 0x34; if(name == "SHA-384") return 0x36; if(name == "SHA-512") return 0x35; if(name == "RIPEMD-160") return 0x31; if(name == "RIPEMD-128") return 0x32; if(name == "Whirlpool") return 0x37; return 0; } } Botan-1.10.12/src/pk_pad/hash_id/hash_id.h0000664000175000017500000000140112654331322017754 0ustar jackjack00000000000000/* * Hash Function Identification * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_HASHID_H__ #define BOTAN_HASHID_H__ #include #include namespace Botan { /** * Return the PKCS #1 hash identifier * @see RFC 3447 section 9.2 * @param hash_name the name of the hash function * @return byte sequence identifying the hash * @throw Invalid_Argument if the hash has no known PKCS #1 hash id */ BOTAN_DLL MemoryVector pkcs_hash_id(const std::string& hash_name); /** * Return the IEEE 1363 hash identifier * @param hash_name the name of the hash function * @return byte code identifying the hash, or 0 if not known */ BOTAN_DLL byte ieee1363_hash_id(const std::string& hash_name); } #endif Botan-1.10.12/src/pk_pad/hash_id/info.txt0000664000175000017500000000005512654331322017704 0ustar jackjack00000000000000define HASH_ID alloc Botan-1.10.12/src/pk_pad/info.txt0000664000175000017500000000010212654331322016276 0ustar jackjack00000000000000define PK_PADDING load_on auto alloc rng Botan-1.10.12/src/pubkey/blinding.cpp0000664000175000017500000000151212654331322017143 0ustar jackjack00000000000000/* * Blinding for public key operations * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * Blinder Constructor */ Blinder::Blinder(const BigInt& e, const BigInt& d, const BigInt& n) { if(e < 1 || d < 1 || n < 1) throw Invalid_Argument("Blinder: Arguments too small"); reducer = Modular_Reducer(n); this->e = e; this->d = d; } /* * Blind a number */ BigInt Blinder::blind(const BigInt& i) const { if(!reducer.initialized()) return i; e = reducer.square(e); d = reducer.square(d); return reducer.multiply(i, e); } /* * Unblind a number */ BigInt Blinder::unblind(const BigInt& i) const { if(!reducer.initialized()) return i; return reducer.multiply(i, d); } } Botan-1.10.12/src/pubkey/blinding.h0000664000175000017500000000163612654331322016617 0ustar jackjack00000000000000/* * Blinding for public key operations * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BLINDER_H__ #define BOTAN_BLINDER_H__ #include #include namespace Botan { /** * Blinding Function Object */ class BOTAN_DLL Blinder { public: BigInt blind(const BigInt& x) const; BigInt unblind(const BigInt& x) const; bool initialized() const { return reducer.initialized(); } Blinder() {} /** * Construct a blinder * @param mask the forward (blinding) mask * @param inverse_mask the inverse of mask (depends on algo) * @param modulus of the group operations are performed in */ Blinder(const BigInt& mask, const BigInt& inverse_mask, const BigInt& modulus); private: Modular_Reducer reducer; mutable BigInt e, d; }; } #endif Botan-1.10.12/src/pubkey/dh/dh.cpp0000664000175000017500000000413312654331322016345 0ustar jackjack00000000000000/* * Diffie-Hellman * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * DH_PublicKey Constructor */ DH_PublicKey::DH_PublicKey(const DL_Group& grp, const BigInt& y1) { group = grp; y = y1; } /* * Return the public value for key agreement */ MemoryVector DH_PublicKey::public_value() const { return BigInt::encode_1363(y, group_p().bytes()); } /* * Create a DH private key */ DH_PrivateKey::DH_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x_arg) { group = grp; x = x_arg; if(x == 0) { const BigInt& p = group_p(); x.randomize(rng, 2 * dl_work_factor(p.bits())); } if(y == 0) y = power_mod(group_g(), x, group_p()); if(x == 0) gen_check(rng); else load_check(rng); } /* * Load a DH private key */ DH_PrivateKey::DH_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng) : DL_Scheme_PrivateKey(alg_id, key_bits, DL_Group::ANSI_X9_42) { if(y == 0) y = power_mod(group_g(), x, group_p()); load_check(rng); } /* * Return the public value for key agreement */ MemoryVector DH_PrivateKey::public_value() const { return DH_PublicKey::public_value(); } DH_KA_Operation::DH_KA_Operation(const DH_PrivateKey& dh) : p(dh.group_p()), powermod_x_p(dh.get_x(), p) { BigInt k(global_state().global_rng(), p.bits() - 1); blinder = Blinder(k, powermod_x_p(inverse_mod(k, p)), p); } SecureVector DH_KA_Operation::agree(const byte w[], size_t w_len) { BigInt input = BigInt::decode(w, w_len); if(input <= 1 || input >= p - 1) throw Invalid_Argument("DH agreement - invalid key provided"); BigInt r = blinder.unblind(powermod_x_p(blinder.blind(input))); return BigInt::encode_1363(r, p.bytes()); } } Botan-1.10.12/src/pubkey/dh/dh.h0000664000175000017500000000467112654331322016021 0ustar jackjack00000000000000/* * Diffie-Hellman * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DIFFIE_HELLMAN_H__ #define BOTAN_DIFFIE_HELLMAN_H__ #include #include #include #include namespace Botan { /** * This class represents Diffie-Hellman public keys. */ class BOTAN_DLL DH_PublicKey : public virtual DL_Scheme_PublicKey { public: std::string algo_name() const { return "DH"; } MemoryVector public_value() const; size_t max_input_bits() const { return group_p().bits(); } DL_Group::Format group_format() const { return DL_Group::ANSI_X9_42; } DH_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : DL_Scheme_PublicKey(alg_id, key_bits, DL_Group::ANSI_X9_42) {} /** * Construct a public key with the specified parameters. * @param grp the DL group to use in the key * @param y the public value y */ DH_PublicKey(const DL_Group& grp, const BigInt& y); protected: DH_PublicKey() {} }; /** * This class represents Diffie-Hellman private keys. */ class BOTAN_DLL DH_PrivateKey : public DH_PublicKey, public PK_Key_Agreement_Key, public virtual DL_Scheme_PrivateKey { public: MemoryVector public_value() const; /** * Load a DH private key * @param alg_id the algorithm id * @param key_bits the subject public key * @param rng a random number generator */ DH_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng); /** * Construct a private key with predetermined value. * @param rng random number generator to use * @param grp the group to be used in the key * @param x the key's secret value (or if zero, generate a new key) */ DH_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x = 0); }; /** * DH operation */ class BOTAN_DLL DH_KA_Operation : public PK_Ops::Key_Agreement { public: DH_KA_Operation(const DH_PrivateKey& key); SecureVector agree(const byte w[], size_t w_len); private: const BigInt& p; Fixed_Exponent_Power_Mod powermod_x_p; Blinder blinder; }; } #endif Botan-1.10.12/src/pubkey/dh/info.txt0000664000175000017500000000022712654331322016742 0ustar jackjack00000000000000define DIFFIE_HELLMAN dh.h dh.cpp dl_algo dl_group libstate numbertheory Botan-1.10.12/src/pubkey/dl_algo/dl_algo.cpp0000664000175000017500000000414112654331322020360 0ustar jackjack00000000000000/* * DL Scheme * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { AlgorithmIdentifier DL_Scheme_PublicKey::algorithm_identifier() const { return AlgorithmIdentifier(get_oid(), group.DER_encode(group_format())); } MemoryVector DL_Scheme_PublicKey::x509_subject_public_key() const { return DER_Encoder().encode(y).get_contents(); } DL_Scheme_PublicKey::DL_Scheme_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, DL_Group::Format format) { DataSource_Memory source(alg_id.parameters); group.BER_decode(source, format); BER_Decoder(key_bits).decode(y); } MemoryVector DL_Scheme_PrivateKey::pkcs8_private_key() const { return DER_Encoder().encode(x).get_contents(); } DL_Scheme_PrivateKey::DL_Scheme_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, DL_Group::Format format) { DataSource_Memory source(alg_id.parameters); group.BER_decode(source, format); BER_Decoder(key_bits).decode(x); } /* * Check Public DL Parameters */ bool DL_Scheme_PublicKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(y < 2 || y >= group_p()) return false; if(!group.verify_group(rng, strong)) return false; return true; } /* * Check DL Scheme Private Parameters */ bool DL_Scheme_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { const BigInt& p = group_p(); const BigInt& g = group_g(); if(y < 2 || y >= p || x < 2 || x >= p) return false; if(!group.verify_group(rng, strong)) return false; if(!strong) return true; if(y != power_mod(g, x, p)) return false; return true; } } Botan-1.10.12/src/pubkey/dl_algo/dl_algo.h0000664000175000017500000000517212654331322020032 0ustar jackjack00000000000000/* * DL Scheme * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DL_ALGO_H__ #define BOTAN_DL_ALGO_H__ #include #include #include namespace Botan { /** * This class represents discrete logarithm (DL) public keys. */ class BOTAN_DLL DL_Scheme_PublicKey : public virtual Public_Key { public: bool check_key(RandomNumberGenerator& rng, bool) const; AlgorithmIdentifier algorithm_identifier() const; MemoryVector x509_subject_public_key() const; /** * Get the DL domain parameters of this key. * @return DL domain parameters of this key */ const DL_Group& get_domain() const { return group; } /** * Get the public value y with y = g^x mod p where x is the secret key. */ const BigInt& get_y() const { return y; } /** * Get the prime p of the underlying DL group. * @return prime p */ const BigInt& group_p() const { return group.get_p(); } /** * Get the prime q of the underlying DL group. * @return prime q */ const BigInt& group_q() const { return group.get_q(); } /** * Get the generator g of the underlying DL group. * @return generator g */ const BigInt& group_g() const { return group.get_g(); } /** * Get the underlying groups encoding format. * @return encoding format */ virtual DL_Group::Format group_format() const = 0; DL_Scheme_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, DL_Group::Format group_format); protected: DL_Scheme_PublicKey() {} /** * The DL public key */ BigInt y; /** * The DL group */ DL_Group group; }; /** * This class represents discrete logarithm (DL) private keys. */ class BOTAN_DLL DL_Scheme_PrivateKey : public virtual DL_Scheme_PublicKey, public virtual Private_Key { public: bool check_key(RandomNumberGenerator& rng, bool) const; /** * Get the secret key x. * @return secret key */ const BigInt& get_x() const { return x; } MemoryVector pkcs8_private_key() const; DL_Scheme_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, DL_Group::Format group_format); protected: DL_Scheme_PrivateKey() {} /** * The DL private key */ BigInt x; }; } #endif Botan-1.10.12/src/pubkey/dl_algo/info.txt0000664000175000017500000000012312654331322017743 0ustar jackjack00000000000000define DL_PUBLIC_KEY_FAMILY asn1 dl_group numbertheory rng Botan-1.10.12/src/pubkey/dl_group/dl_group.cpp0000664000175000017500000001610412654331322021006 0ustar jackjack00000000000000/* * Discrete Logarithm Parameters * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include namespace Botan { /* * DL_Group Constructor */ DL_Group::DL_Group() { initialized = false; } /* * DL_Group Constructor */ DL_Group::DL_Group(const std::string& type) { std::string grp_contents = global_state().get("dl", type); if(grp_contents == "") throw Invalid_Argument("DL_Group: Unknown group " + type); DataSource_Memory pem(grp_contents); PEM_decode(pem); } /* * DL_Group Constructor */ DL_Group::DL_Group(RandomNumberGenerator& rng, PrimeType type, size_t pbits, size_t qbits) { if(pbits < 512) throw Invalid_Argument("DL_Group: prime size " + to_string(pbits) + " is too small"); if(type == Strong) { p = random_safe_prime(rng, pbits); q = (p - 1) / 2; g = 2; } else if(type == Prime_Subgroup) { if(!qbits) qbits = 2 * dl_work_factor(pbits); q = random_prime(rng, qbits); BigInt X; while(p.bits() != pbits || !check_prime(p, rng)) { X.randomize(rng, pbits); p = X - (X % (2*q) - 1); } g = make_dsa_generator(p, q); } else if(type == DSA_Kosherizer) { qbits = qbits ? qbits : ((pbits <= 1024) ? 160 : 256); generate_dsa_primes(rng, global_state().algorithm_factory(), p, q, pbits, qbits); g = make_dsa_generator(p, q); } initialized = true; } /* * DL_Group Constructor */ DL_Group::DL_Group(RandomNumberGenerator& rng, const MemoryRegion& seed, size_t pbits, size_t qbits) { if(!generate_dsa_primes(rng, global_state().algorithm_factory(), p, q, pbits, qbits, seed)) throw Invalid_Argument("DL_Group: The seed given does not " "generate a DSA group"); g = make_dsa_generator(p, q); initialized = true; } /* * DL_Group Constructor */ DL_Group::DL_Group(const BigInt& p1, const BigInt& g1) { initialize(p1, 0, g1); } /* * DL_Group Constructor */ DL_Group::DL_Group(const BigInt& p1, const BigInt& q1, const BigInt& g1) { initialize(p1, q1, g1); } /* * DL_Group Initializer */ void DL_Group::initialize(const BigInt& p1, const BigInt& q1, const BigInt& g1) { if(p1 < 3) throw Invalid_Argument("DL_Group: Prime invalid"); if(g1 < 2 || g1 >= p1) throw Invalid_Argument("DL_Group: Generator invalid"); if(q1 < 0 || q1 >= p1) throw Invalid_Argument("DL_Group: Subgroup invalid"); p = p1; g = g1; q = q1; initialized = true; } /* * Verify that the group has been set */ void DL_Group::init_check() const { if(!initialized) throw Invalid_State("DLP group cannot be used uninitialized"); } /* * Verify the parameters */ bool DL_Group::verify_group(RandomNumberGenerator& rng, bool strong) const { init_check(); if(g < 2 || p < 3 || q < 0) return false; if((q != 0) && ((p - 1) % q != 0)) return false; if(!strong) return true; if(!check_prime(p, rng)) return false; if((q > 0) && !check_prime(q, rng)) return false; return true; } /* * Return the prime */ const BigInt& DL_Group::get_p() const { init_check(); return p; } /* * Return the generator */ const BigInt& DL_Group::get_g() const { init_check(); return g; } /* * Return the subgroup */ const BigInt& DL_Group::get_q() const { init_check(); if(q == 0) throw Invalid_State("DLP group has no q prime specified"); return q; } /* * DER encode the parameters */ SecureVector DL_Group::DER_encode(Format format) const { init_check(); if((q == 0) && (format != PKCS_3)) throw Encoding_Error("The ANSI DL parameter formats require a subgroup"); if(format == ANSI_X9_57) { return DER_Encoder() .start_cons(SEQUENCE) .encode(p) .encode(q) .encode(g) .end_cons() .get_contents(); } else if(format == ANSI_X9_42) { return DER_Encoder() .start_cons(SEQUENCE) .encode(p) .encode(g) .encode(q) .end_cons() .get_contents(); } else if(format == PKCS_3) { return DER_Encoder() .start_cons(SEQUENCE) .encode(p) .encode(g) .end_cons() .get_contents(); } throw Invalid_Argument("Unknown DL_Group encoding " + to_string(format)); } /* * PEM encode the parameters */ std::string DL_Group::PEM_encode(Format format) const { SecureVector encoding = DER_encode(format); if(format == PKCS_3) return PEM_Code::encode(encoding, "DH PARAMETERS"); else if(format == ANSI_X9_57) return PEM_Code::encode(encoding, "DSA PARAMETERS"); else if(format == ANSI_X9_42) return PEM_Code::encode(encoding, "X942 DH PARAMETERS"); else throw Invalid_Argument("Unknown DL_Group encoding " + to_string(format)); } /* * Decode BER encoded parameters */ void DL_Group::BER_decode(DataSource& source, Format format) { BigInt new_p, new_q, new_g; BER_Decoder decoder(source); BER_Decoder ber = decoder.start_cons(SEQUENCE); if(format == ANSI_X9_57) { ber.decode(new_p) .decode(new_q) .decode(new_g) .verify_end(); } else if(format == ANSI_X9_42) { ber.decode(new_p) .decode(new_g) .decode(new_q) .discard_remaining(); } else if(format == PKCS_3) { ber.decode(new_p) .decode(new_g) .discard_remaining(); } else throw Invalid_Argument("Unknown DL_Group encoding " + to_string(format)); initialize(new_p, new_q, new_g); } /* * Decode PEM encoded parameters */ void DL_Group::PEM_decode(DataSource& source) { std::string label; DataSource_Memory ber(PEM_Code::decode(source, label)); if(label == "DH PARAMETERS") BER_decode(ber, PKCS_3); else if(label == "DSA PARAMETERS") BER_decode(ber, ANSI_X9_57); else if(label == "X942 DH PARAMETERS") BER_decode(ber, ANSI_X9_42); else throw Decoding_Error("DL_Group: Invalid PEM label " + label); } /* * Create generator of the q-sized subgroup (DSA style generator) */ BigInt DL_Group::make_dsa_generator(const BigInt& p, const BigInt& q) { BigInt g, e = (p - 1) / q; BOTAN_ASSERT(e > 0, "q does not divide p, invalid group"); for(size_t i = 0; i != PRIME_TABLE_SIZE; ++i) { g = power_mod(PRIMES[i], e, p); if(g > 1) return g; } throw Internal_Error("DL_Group: Couldn't create a suitable generator"); } } Botan-1.10.12/src/pubkey/dl_group/dl_group.h0000664000175000017500000001132112654331322020447 0ustar jackjack00000000000000/* * Discrete Logarithm Group * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DL_PARAM_H__ #define BOTAN_DL_PARAM_H__ #include #include namespace Botan { /** * This class represents discrete logarithm groups. It holds a prime p, * a prime q = (p-1)/2 and g = x^((p-1)/q) mod p. */ class BOTAN_DLL DL_Group { public: /** * Get the prime p. * @return prime p */ const BigInt& get_p() const; /** * Get the prime q. * @return prime q */ const BigInt& get_q() const; /** * Get the base g. * @return base g */ const BigInt& get_g() const; /** * The DL group encoding format variants. */ enum Format { ANSI_X9_42, ANSI_X9_57, PKCS_3, DSA_PARAMETERS = ANSI_X9_57, DH_PARAMETERS = ANSI_X9_42, X942_DH_PARAMETERS = ANSI_X9_42, PKCS3_DH_PARAMETERS = PKCS_3 }; /** * Determine the prime creation for DL groups. */ enum PrimeType { Strong, Prime_Subgroup, DSA_Kosherizer }; /** * Perform validity checks on the group. * @param rng the rng to use * @param strong whether to perform stronger by lengthier tests * @return true if the object is consistent, false otherwise */ bool verify_group(RandomNumberGenerator& rng, bool strong) const; /** * Encode this group into a string using PEM encoding. * @param format the encoding format * @return string holding the PEM encoded group */ std::string PEM_encode(Format format) const; /** * Encode this group into a string using DER encoding. * @param format the encoding format * @return string holding the DER encoded group */ SecureVector DER_encode(Format format) const; /** * Decode a DER/BER encoded group into this instance. * @param src a DataSource providing the encoded group * @param format the format of the encoded group */ void BER_decode(DataSource& src, Format format); /** * Decode a PEM encoded group into this instance. * @param src a DataSource providing the encoded group */ void PEM_decode(DataSource& src); /** * Construct a DL group with uninitialized internal value. * Use this constructor is you wish to set the groups values * from a DER or PEM encoded group. */ DL_Group(); /** * Construct a DL group that is registered in the configuration. * @param name the name that is configured in the global configuration * for the desired group. If no configuration file is specified, * the default values from the file policy.cpp will be used. For instance, * use "modp/ietf/768" as name. */ DL_Group(const std::string& name); /** * Create a new group randomly. * @param rng the random number generator to use * @param type specifies how the creation of primes p and q shall * be performed. If type=Strong, then p will be determined as a * safe prime, and q will be chosen as (p-1)/2. If * type=Prime_Subgroup and qbits = 0, then the size of q will be * determined according to the estimated difficulty of the DL * problem. If type=DSA_Kosherizer, DSA primes will be created. * @param pbits the number of bits of p * @param qbits the number of bits of q. Leave it as 0 to have * the value determined according to pbits. */ DL_Group(RandomNumberGenerator& rng, PrimeType type, size_t pbits, size_t qbits = 0); /** * Create a DSA group with a given seed. * @param rng the random number generator to use * @param seed the seed to use to create the random primes * @param pbits the desired bit size of the prime p * @param qbits the desired bit size of the prime q. */ DL_Group(RandomNumberGenerator& rng, const MemoryRegion& seed, size_t pbits = 1024, size_t qbits = 0); /** * Create a DL group. The prime q will be determined according to p. * @param p the prime p * @param g the base g */ DL_Group(const BigInt& p, const BigInt& g); /** * Create a DL group. * @param p the prime p * @param q the prime q * @param g the base g */ DL_Group(const BigInt& p, const BigInt& q, const BigInt& g); private: static BigInt make_dsa_generator(const BigInt&, const BigInt&); void init_check() const; void initialize(const BigInt&, const BigInt&, const BigInt&); bool initialized; BigInt p, q, g; }; } #endif Botan-1.10.12/src/pubkey/dl_group/info.txt0000664000175000017500000000012612654331322020160 0ustar jackjack00000000000000define DL_GROUP asn1 bigint filters libstate numbertheory pem Botan-1.10.12/src/pubkey/dlies/dlies.cpp0000664000175000017500000000671212654331322017564 0ustar jackjack00000000000000/* * DLIES * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * DLIES_Encryptor Constructor */ DLIES_Encryptor::DLIES_Encryptor(const PK_Key_Agreement_Key& key, KDF* kdf_obj, MessageAuthenticationCode* mac_obj, size_t mac_kl) : ka(key, "Raw"), kdf(kdf_obj), mac(mac_obj), mac_keylen(mac_kl) { my_key = key.public_value(); } DLIES_Encryptor::~DLIES_Encryptor() { delete kdf; delete mac; } /* * DLIES Encryption */ SecureVector DLIES_Encryptor::enc(const byte in[], size_t length, RandomNumberGenerator&) const { if(length > maximum_input_size()) throw Invalid_Argument("DLIES: Plaintext too large"); if(other_key.empty()) throw Invalid_State("DLIES: The other key was never set"); SecureVector out(my_key.size() + length + mac->output_length()); out.copy(&my_key[0], my_key.size()); out.copy(my_key.size(), in, length); SecureVector vz = my_key; vz += ka.derive_key(0, other_key).bits_of(); const size_t K_LENGTH = length + mac_keylen; OctetString K = kdf->derive_key(K_LENGTH, vz); if(K.length() != K_LENGTH) throw Encoding_Error("DLIES: KDF did not provide sufficient output"); byte* C = &out[my_key.size()]; xor_buf(C, K.begin() + mac_keylen, length); mac->set_key(K.begin(), mac_keylen); mac->update(C, length); for(size_t j = 0; j != 8; ++j) mac->update(0); mac->final(C + length); return out; } /* * Set the other parties public key */ void DLIES_Encryptor::set_other_key(const MemoryRegion& ok) { other_key = ok; } /* * Return the max size, in bytes, of a message */ size_t DLIES_Encryptor::maximum_input_size() const { return 32; } /* * DLIES_Decryptor Constructor */ DLIES_Decryptor::DLIES_Decryptor(const PK_Key_Agreement_Key& key, KDF* kdf_obj, MessageAuthenticationCode* mac_obj, size_t mac_kl) : ka(key, "Raw"), kdf(kdf_obj), mac(mac_obj), mac_keylen(mac_kl) { my_key = key.public_value(); } DLIES_Decryptor::~DLIES_Decryptor() { delete kdf; delete mac; } /* * DLIES Decryption */ SecureVector DLIES_Decryptor::dec(const byte msg[], size_t length) const { if(length < my_key.size() + mac->output_length()) throw Decoding_Error("DLIES decryption: ciphertext is too short"); const size_t CIPHER_LEN = length - my_key.size() - mac->output_length(); SecureVector v(msg, my_key.size()); SecureVector C(msg + my_key.size(), CIPHER_LEN); SecureVector T(msg + my_key.size() + CIPHER_LEN, mac->output_length()); SecureVector vz(msg, my_key.size()); vz += ka.derive_key(0, v).bits_of(); const size_t K_LENGTH = C.size() + mac_keylen; OctetString K = kdf->derive_key(K_LENGTH, vz); if(K.length() != K_LENGTH) throw Encoding_Error("DLIES: KDF did not provide sufficient output"); mac->set_key(K.begin(), mac_keylen); mac->update(C); for(size_t j = 0; j != 8; ++j) mac->update(0); SecureVector T2 = mac->final(); if(T != T2) throw Decoding_Error("DLIES: message authentication failed"); xor_buf(C, K.begin() + mac_keylen, C.size()); return C; } } Botan-1.10.12/src/pubkey/dlies/dlies.h0000664000175000017500000000266212654331322017231 0ustar jackjack00000000000000/* * DLIES * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DLIES_H__ #define BOTAN_DLIES_H__ #include #include #include namespace Botan { /** * DLIES Encryption */ class BOTAN_DLL DLIES_Encryptor : public PK_Encryptor { public: DLIES_Encryptor(const PK_Key_Agreement_Key&, KDF* kdf, MessageAuthenticationCode* mac, size_t mac_key_len = 20); ~DLIES_Encryptor(); void set_other_key(const MemoryRegion&); private: SecureVector enc(const byte[], size_t, RandomNumberGenerator&) const; size_t maximum_input_size() const; SecureVector other_key, my_key; PK_Key_Agreement ka; KDF* kdf; MessageAuthenticationCode* mac; size_t mac_keylen; }; /** * DLIES Decryption */ class BOTAN_DLL DLIES_Decryptor : public PK_Decryptor { public: DLIES_Decryptor(const PK_Key_Agreement_Key&, KDF* kdf, MessageAuthenticationCode* mac, size_t mac_key_len = 20); ~DLIES_Decryptor(); private: SecureVector dec(const byte[], size_t) const; SecureVector my_key; PK_Key_Agreement ka; KDF* kdf; MessageAuthenticationCode* mac; size_t mac_keylen; }; } #endif Botan-1.10.12/src/pubkey/dlies/info.txt0000664000175000017500000000006612654331322017450 0ustar jackjack00000000000000define DLIES kdf libstate mac Botan-1.10.12/src/pubkey/dsa/dsa.cpp0000664000175000017500000000623412654331322016701 0ustar jackjack00000000000000/* * DSA * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * DSA_PublicKey Constructor */ DSA_PublicKey::DSA_PublicKey(const DL_Group& grp, const BigInt& y1) { group = grp; y = y1; } /* * Create a DSA private key */ DSA_PrivateKey::DSA_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x_arg) { group = grp; x = x_arg; if(x == 0) x = BigInt::random_integer(rng, 2, group_q() - 1); y = power_mod(group_g(), x, group_p()); if(x_arg == 0) gen_check(rng); else load_check(rng); } DSA_PrivateKey::DSA_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng) : DL_Scheme_PrivateKey(alg_id, key_bits, DL_Group::ANSI_X9_57) { y = power_mod(group_g(), x, group_p()); load_check(rng); } /* * Check Private DSA Parameters */ bool DSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!DL_Scheme_PrivateKey::check_key(rng, strong) || x >= group_q()) return false; if(!strong) return true; return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-1)"); } DSA_Signature_Operation::DSA_Signature_Operation(const DSA_PrivateKey& dsa) : q(dsa.group_q()), x(dsa.get_x()), powermod_g_p(dsa.group_g(), dsa.group_p()), mod_q(dsa.group_q()) { } SecureVector DSA_Signature_Operation::sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) { rng.add_entropy(msg, msg_len); BigInt i(msg, msg_len); BigInt r = 0, s = 0; while(r == 0 || s == 0) { BigInt k; do k.randomize(rng, q.bits()); while(k >= q); r = mod_q.reduce(powermod_g_p(k)); s = mod_q.multiply(inverse_mod(k, q), mul_add(x, r, i)); } SecureVector output(2*q.bytes()); r.binary_encode(&output[output.size() / 2 - r.bytes()]); s.binary_encode(&output[output.size() - s.bytes()]); return output; } DSA_Verification_Operation::DSA_Verification_Operation(const DSA_PublicKey& dsa) : q(dsa.group_q()), y(dsa.get_y()) { powermod_g_p = Fixed_Base_Power_Mod(dsa.group_g(), dsa.group_p()); powermod_y_p = Fixed_Base_Power_Mod(y, dsa.group_p()); mod_p = Modular_Reducer(dsa.group_p()); mod_q = Modular_Reducer(dsa.group_q()); } bool DSA_Verification_Operation::verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len) { const BigInt& q = mod_q.get_modulus(); if(sig_len != 2*q.bytes() || msg_len > q.bytes()) return false; BigInt r(sig, q.bytes()); BigInt s(sig + q.bytes(), q.bytes()); BigInt i(msg, msg_len); if(r <= 0 || r >= q || s <= 0 || s >= q) return false; s = inverse_mod(s, q); s = mod_p.multiply(powermod_g_p(mod_q.multiply(s, i)), powermod_y_p(mod_q.multiply(s, r))); return (mod_q.reduce(s) == r); } } Botan-1.10.12/src/pubkey/dsa/dsa.h0000664000175000017500000000545212654331322016347 0ustar jackjack00000000000000/* * DSA * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DSA_H__ #define BOTAN_DSA_H__ #include #include #include #include namespace Botan { /** * DSA Public Key */ class BOTAN_DLL DSA_PublicKey : public virtual DL_Scheme_PublicKey { public: std::string algo_name() const { return "DSA"; } DL_Group::Format group_format() const { return DL_Group::ANSI_X9_57; } size_t message_parts() const { return 2; } size_t message_part_size() const { return group_q().bytes(); } size_t max_input_bits() const { return group_q().bits(); } DSA_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : DL_Scheme_PublicKey(alg_id, key_bits, DL_Group::ANSI_X9_57) { } DSA_PublicKey(const DL_Group& group, const BigInt& y); protected: DSA_PublicKey() {} }; /** * DSA Private Key */ class BOTAN_DLL DSA_PrivateKey : public DSA_PublicKey, public virtual DL_Scheme_PrivateKey { public: DSA_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng); DSA_PrivateKey(RandomNumberGenerator& rng, const DL_Group& group, const BigInt& private_key = 0); bool check_key(RandomNumberGenerator& rng, bool strong) const; }; /** * Object that can create a DSA signature */ class BOTAN_DLL DSA_Signature_Operation : public PK_Ops::Signature { public: DSA_Signature_Operation(const DSA_PrivateKey& dsa); size_t message_parts() const { return 2; } size_t message_part_size() const { return q.bytes(); } size_t max_input_bits() const { return q.bits(); } SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng); private: const BigInt& q; const BigInt& x; Fixed_Base_Power_Mod powermod_g_p; Modular_Reducer mod_q; }; /** * Object that can verify a DSA signature */ class BOTAN_DLL DSA_Verification_Operation : public PK_Ops::Verification { public: DSA_Verification_Operation(const DSA_PublicKey& dsa); size_t message_parts() const { return 2; } size_t message_part_size() const { return q.bytes(); } size_t max_input_bits() const { return q.bits(); } bool with_recovery() const { return false; } bool verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len); private: const BigInt& q; const BigInt& y; Fixed_Base_Power_Mod powermod_g_p, powermod_y_p; Modular_Reducer mod_p, mod_q; }; } #endif Botan-1.10.12/src/pubkey/dsa/info.txt0000664000175000017500000000012212654331322017110 0ustar jackjack00000000000000define DSA dl_algo dl_group keypair libstate numbertheory Botan-1.10.12/src/pubkey/ec_group/ec_group.cpp0000664000175000017500000000722212654331322020767 0ustar jackjack00000000000000/* * ECC Domain Parameters * * (C) 2007 Falko Strenzke, FlexSecure GmbH * 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { EC_Group::EC_Group(const OID& domain_oid) { std::string pem = global_state().get("ec", OIDS::lookup(domain_oid)); if(pem == "") throw Lookup_Error("No ECC domain data for " + domain_oid.as_string()); *this = EC_Group(pem); oid = domain_oid.as_string(); } EC_Group::EC_Group(const std::string& str) { if(str == "") return; // no initialization / uninitialized try { DataSource_Memory input(str); SecureVector ber = PEM_Code::decode_check_label(input, "EC PARAMETERS"); *this = EC_Group(ber); } catch(Decoding_Error) // hmm, not PEM? { *this = EC_Group(OIDS::lookup(str)); } } EC_Group::EC_Group(const MemoryRegion& ber_data) { BER_Decoder ber(ber_data); BER_Object obj = ber.get_next_object(); if(obj.type_tag == NULL_TAG) throw Decoding_Error("Cannot handle ImplicitCA ECDSA parameters"); else if(obj.type_tag == OBJECT_ID) { OID dom_par_oid; BER_Decoder(ber_data).decode(dom_par_oid); *this = EC_Group(dom_par_oid); } else if(obj.type_tag == SEQUENCE) { BigInt p, a, b; SecureVector sv_base_point; BER_Decoder(ber_data) .start_cons(SEQUENCE) .decode_and_check(1, "Unknown ECC param version code") .start_cons(SEQUENCE) .decode_and_check(OID("1.2.840.10045.1.1"), "Only prime ECC fields supported") .decode(p) .end_cons() .start_cons(SEQUENCE) .decode_octet_string_bigint(a) .decode_octet_string_bigint(b) .end_cons() .decode(sv_base_point, OCTET_STRING) .decode(order) .decode(cofactor) .end_cons() .verify_end(); curve = CurveGFp(p, a, b); base_point = OS2ECP(sv_base_point, curve); } else throw Decoding_Error("Unexpected tag while decoding ECC domain params"); } SecureVector EC_Group::DER_encode(EC_Group_Encoding form) const { if(form == EC_DOMPAR_ENC_EXPLICIT) { const size_t ecpVers1 = 1; OID curve_type("1.2.840.10045.1.1"); const size_t p_bytes = curve.get_p().bytes(); return DER_Encoder() .start_cons(SEQUENCE) .encode(ecpVers1) .start_cons(SEQUENCE) .encode(curve_type) .encode(curve.get_p()) .end_cons() .start_cons(SEQUENCE) .encode(BigInt::encode_1363(curve.get_a(), p_bytes), OCTET_STRING) .encode(BigInt::encode_1363(curve.get_b(), p_bytes), OCTET_STRING) .end_cons() .encode(EC2OSP(base_point, PointGFp::UNCOMPRESSED), OCTET_STRING) .encode(order) .encode(cofactor) .end_cons() .get_contents(); } else if(form == EC_DOMPAR_ENC_OID) return DER_Encoder().encode(OID(get_oid())).get_contents(); else if(form == EC_DOMPAR_ENC_IMPLICITCA) return DER_Encoder().encode_null().get_contents(); else throw Internal_Error("EC_Group::DER_encode: Unknown encoding"); } std::string EC_Group::PEM_encode() const { SecureVector der = DER_encode(EC_DOMPAR_ENC_EXPLICIT); return PEM_Code::encode(der, "EC PARAMETERS"); } } Botan-1.10.12/src/pubkey/ec_group/ec_group.h0000664000175000017500000000700312654331322020431 0ustar jackjack00000000000000/* * ECC Domain Parameters * * (C) 2007 Falko Strenzke, FlexSecure GmbH * 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ECC_DOMAIN_PARAMETERS_H__ #define BOTAN_ECC_DOMAIN_PARAMETERS_H__ #include #include #include namespace Botan { /** * This class represents elliptic curce domain parameters */ enum EC_Group_Encoding { EC_DOMPAR_ENC_EXPLICIT = 0, EC_DOMPAR_ENC_IMPLICITCA = 1, EC_DOMPAR_ENC_OID = 2 }; /** * Class representing an elliptic curve */ class BOTAN_DLL EC_Group { public: /** * Construct Domain paramers from specified parameters * @param curve elliptic curve * @param base_point a base point * @param order the order of the base point * @param cofactor the cofactor */ EC_Group(const CurveGFp& curve, const PointGFp& base_point, const BigInt& order, const BigInt& cofactor) : curve(curve), base_point(base_point), order(order), cofactor(cofactor), oid("") {} /** * Decode a BER encoded ECC domain parameter set * @param ber_encoding the bytes of the BER encoding */ EC_Group(const MemoryRegion& ber_encoding); /** * Create an EC domain by OID (or throw if unknown) * @param oid the OID of the EC domain to create */ EC_Group(const OID& oid); /** * Create an EC domain from PEM encoding (as from PEM_encode), * or from an OID name (eg "secp160r1", or "1.3.132.0.8") * @param pem_or_oid PEM-encoded data, or an OID */ EC_Group(const std::string& pem_or_oid = ""); /** * Create the DER encoding of this domain * @param form of encoding to use * @returns bytes encododed as DER */ SecureVector DER_encode(EC_Group_Encoding form) const; /** * Return the PEM encoding (always in explicit form) * @return string containing PEM data */ std::string PEM_encode() const; /** * Return domain parameter curve * @result domain parameter curve */ const CurveGFp& get_curve() const { return curve; } /** * Return domain parameter curve * @result domain parameter curve */ const PointGFp& get_base_point() const { return base_point; } /** * Return the order of the base point * @result order of the base point */ const BigInt& get_order() const { return order; } /** * Return the cofactor * @result the cofactor */ const BigInt& get_cofactor() const { return cofactor; } bool initialized() const { return !base_point.is_zero(); } /** * Return the OID of these domain parameters * @result the OID */ std::string get_oid() const { return oid; } bool operator==(const EC_Group& other) const { return ((get_curve() == other.get_curve()) && (get_base_point() == other.get_base_point()) && (get_order() == other.get_order()) && (get_cofactor() == other.get_cofactor())); } private: CurveGFp curve; PointGFp base_point; BigInt order, cofactor; std::string oid; }; inline bool operator!=(const EC_Group& lhs, const EC_Group& rhs) { return !(lhs == rhs); } // For compatability with 1.8 typedef EC_Group EC_Domain_Params; } #endif Botan-1.10.12/src/pubkey/ec_group/info.txt0000664000175000017500000000013212654331322020145 0ustar jackjack00000000000000define ECC_GROUP asn1 ec_gfp libstate numbertheory oid_lookup pem Botan-1.10.12/src/pubkey/ecc_key/ecc_key.cpp0000664000175000017500000000723712654331322020373 0ustar jackjack00000000000000/* * ECC Key implemenation * (C) 2007 Manuel Hartl, FlexSecure GmbH * Falko Strenzke, FlexSecure GmbH * 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include namespace Botan { EC_PublicKey::EC_PublicKey(const EC_Group& dom_par, const PointGFp& pub_point) : domain_params(dom_par), public_key(pub_point), domain_encoding(EC_DOMPAR_ENC_EXPLICIT) { if(domain().get_curve() != public_point().get_curve()) throw Invalid_Argument("EC_PublicKey: curve mismatch in constructor"); } EC_PublicKey::EC_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) { domain_params = EC_Group(alg_id.parameters); domain_encoding = EC_DOMPAR_ENC_EXPLICIT; public_key = OS2ECP(key_bits, domain().get_curve()); } bool EC_PublicKey::check_key(RandomNumberGenerator&, bool) const { return public_point().on_the_curve(); } AlgorithmIdentifier EC_PublicKey::algorithm_identifier() const { return AlgorithmIdentifier(get_oid(), DER_domain()); } MemoryVector EC_PublicKey::x509_subject_public_key() const { return EC2OSP(public_point(), PointGFp::COMPRESSED); } void EC_PublicKey::set_parameter_encoding(EC_Group_Encoding form) { if(form != EC_DOMPAR_ENC_EXPLICIT && form != EC_DOMPAR_ENC_IMPLICITCA && form != EC_DOMPAR_ENC_OID) throw Invalid_Argument("Invalid encoding form for EC-key object specified"); if((form == EC_DOMPAR_ENC_OID) && (domain_params.get_oid() == "")) throw Invalid_Argument("Invalid encoding form OID specified for " "EC-key object whose corresponding domain " "parameters are without oid"); domain_encoding = form; } const BigInt& EC_PrivateKey::private_value() const { if(private_key == 0) throw Invalid_State("EC_PrivateKey::private_value - uninitialized"); return private_key; } /** * EC_PrivateKey constructor */ EC_PrivateKey::EC_PrivateKey(RandomNumberGenerator& rng, const EC_Group& ec_group, const BigInt& x) { domain_params = ec_group; domain_encoding = EC_DOMPAR_ENC_EXPLICIT; if(x == 0) private_key = BigInt::random_integer(rng, 1, domain().get_order()); else private_key = x; public_key = domain().get_base_point() * private_key; BOTAN_ASSERT(public_key.on_the_curve(), "ECC private key was not on the curve"); } MemoryVector EC_PrivateKey::pkcs8_private_key() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(static_cast(1)) .encode(BigInt::encode_1363(private_key, private_key.bytes()), OCTET_STRING) .end_cons() .get_contents(); } EC_PrivateKey::EC_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) { domain_params = EC_Group(alg_id.parameters); domain_encoding = EC_DOMPAR_ENC_EXPLICIT; BER_Decoder(key_bits) .start_cons(SEQUENCE) .decode_and_check(1, "Unknown version code for ECC key") .decode_octet_string_bigint(private_key); // possibly group params and public key follow public_key = domain().get_base_point() * private_key; BOTAN_ASSERT(public_key.on_the_curve(), "Loaded ECC private key not on the curve"); } } Botan-1.10.12/src/pubkey/ecc_key/ecc_key.h0000664000175000017500000000671012654331322020033 0ustar jackjack00000000000000/* * ECDSA * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ECC_PUBLIC_KEY_BASE_H__ #define BOTAN_ECC_PUBLIC_KEY_BASE_H__ #include #include #include #include namespace Botan { /** * This class represents abstract ECC public keys. When encoding a key * via an encoder that can be accessed via the corresponding member * functions, the key will decide upon its internally stored encoding * information whether to encode itself with or without domain * parameters, or using the domain parameter oid. Furthermore, a public * key without domain parameters can be decoded. In that case, it * cannot be used for verification until its domain parameters are set * by calling the corresponding member function. */ class BOTAN_DLL EC_PublicKey : public virtual Public_Key { public: EC_PublicKey(const EC_Group& dom_par, const PointGFp& pub_point); EC_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits); /** * Get the public point of this key. * @throw Invalid_State is thrown if the * domain parameters of this point are not set * @result the public point of this key */ const PointGFp& public_point() const { return public_key; } AlgorithmIdentifier algorithm_identifier() const; MemoryVector x509_subject_public_key() const; bool check_key(RandomNumberGenerator& rng, bool strong) const; /** * Get the domain parameters of this key. * @throw Invalid_State is thrown if the * domain parameters of this point are not set * @result the domain parameters of this key */ const EC_Group& domain() const { return domain_params; } /** * Set the domain parameter encoding to be used when encoding this key. * @param enc the encoding to use */ void set_parameter_encoding(EC_Group_Encoding enc); /** * Return the DER encoding of this keys domain in whatever format * is preset for this particular key */ MemoryVector DER_domain() const { return domain().DER_encode(domain_format()); } /** * Get the domain parameter encoding to be used when encoding this key. * @result the encoding to use */ EC_Group_Encoding domain_format() const { return domain_encoding; } protected: EC_PublicKey() : domain_encoding(EC_DOMPAR_ENC_EXPLICIT) {} EC_Group domain_params; PointGFp public_key; EC_Group_Encoding domain_encoding; }; /** * This abstract class represents ECC private keys */ class BOTAN_DLL EC_PrivateKey : public virtual EC_PublicKey, public virtual Private_Key { public: EC_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& private_key); EC_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits); MemoryVector pkcs8_private_key() const; /** * Get the private key value of this key object. * @result the private key value of this key object */ const BigInt& private_value() const; protected: EC_PrivateKey() {} BigInt private_key; }; } #endif Botan-1.10.12/src/pubkey/ecc_key/info.txt0000664000175000017500000000014412654331322017747 0ustar jackjack00000000000000define ECC_PUBLIC_KEY_CRYPTO alloc asn1 bigint ec_gfp ec_group numbertheory Botan-1.10.12/src/pubkey/ecdh/ecdh.cpp0000664000175000017500000000161612654331322017170 0ustar jackjack00000000000000/* * ECDH implemenation * (C) 2007 Manuel Hartl, FlexSecure GmbH * 2007 Falko Strenzke, FlexSecure GmbH * 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { ECDH_KA_Operation::ECDH_KA_Operation(const ECDH_PrivateKey& key) : curve(key.domain().get_curve()), cofactor(key.domain().get_cofactor()) { l_times_priv = inverse_mod(cofactor, key.domain().get_order()) * key.private_value(); } SecureVector ECDH_KA_Operation::agree(const byte w[], size_t w_len) { PointGFp point = OS2ECP(w, w_len, curve); PointGFp S = (cofactor * point) * l_times_priv; BOTAN_ASSERT(S.on_the_curve(), "ECDH agreed value not on the curve"); return BigInt::encode_1363(S.get_affine_x(), curve.get_p().bytes()); } } Botan-1.10.12/src/pubkey/ecdh/ecdh.h0000664000175000017500000000544112654331322016635 0ustar jackjack00000000000000/* * ECDH * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ECDH_KEY_H__ #define BOTAN_ECDH_KEY_H__ #include #include namespace Botan { /** * This class represents ECDH Public Keys. */ class BOTAN_DLL ECDH_PublicKey : public virtual EC_PublicKey { public: ECDH_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : EC_PublicKey(alg_id, key_bits) {} /** * Construct a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ ECDH_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} /** * Get this keys algorithm name. * @return this keys algorithm name */ std::string algo_name() const { return "ECDH"; } /** * Get the maximum number of bits allowed to be fed to this key. * This is the bitlength of the order of the base point. * @return maximum number of input bits */ size_t max_input_bits() const { return domain().get_order().bits(); } /** * @return public point value */ MemoryVector public_value() const { return EC2OSP(public_point(), PointGFp::UNCOMPRESSED); } protected: ECDH_PublicKey() {} }; /** * This class represents ECDH Private Keys. */ class BOTAN_DLL ECDH_PrivateKey : public ECDH_PublicKey, public EC_PrivateKey, public PK_Key_Agreement_Key { public: ECDH_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : EC_PrivateKey(alg_id, key_bits) {} /** * Generate a new private key * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key; if zero, a new random key is generated */ ECDH_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0) : EC_PrivateKey(rng, domain, x) {} MemoryVector public_value() const { return ECDH_PublicKey::public_value(); } }; /** * ECDH operation */ class BOTAN_DLL ECDH_KA_Operation : public PK_Ops::Key_Agreement { public: ECDH_KA_Operation(const ECDH_PrivateKey& key); SecureVector agree(const byte w[], size_t w_len); private: const CurveGFp& curve; const BigInt& cofactor; BigInt l_times_priv; }; } #endif Botan-1.10.12/src/pubkey/ecdh/info.txt0000664000175000017500000000012612654331322017250 0ustar jackjack00000000000000define ECDH alloc asn1 ec_group ecc_key libstate numbertheory Botan-1.10.12/src/pubkey/ecdsa/ecdsa.cpp0000664000175000017500000000463612654331322017525 0ustar jackjack00000000000000/* * ECDSA implemenation * (C) 2007 Manuel Hartl, FlexSecure GmbH * 2007 Falko Strenzke, FlexSecure GmbH * 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { bool ECDSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!public_point().on_the_curve()) return false; if(!strong) return true; return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-1)"); } ECDSA_Signature_Operation::ECDSA_Signature_Operation(const ECDSA_PrivateKey& ecdsa) : base_point(ecdsa.domain().get_base_point()), order(ecdsa.domain().get_order()), x(ecdsa.private_value()), mod_order(order) { } SecureVector ECDSA_Signature_Operation::sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) { rng.add_entropy(msg, msg_len); BigInt m(msg, msg_len); BigInt r = 0, s = 0; while(r == 0 || s == 0) { // This contortion is necessary for the tests BigInt k; k.randomize(rng, order.bits()); while(k >= order) k.randomize(rng, order.bits() - 1); PointGFp k_times_P = base_point * k; r = mod_order.reduce(k_times_P.get_affine_x()); s = mod_order.multiply(inverse_mod(k, order), mul_add(x, r, m)); } SecureVector output(2*order.bytes()); r.binary_encode(&output[output.size() / 2 - r.bytes()]); s.binary_encode(&output[output.size() - s.bytes()]); return output; } ECDSA_Verification_Operation::ECDSA_Verification_Operation(const ECDSA_PublicKey& ecdsa) : base_point(ecdsa.domain().get_base_point()), public_point(ecdsa.public_point()), order(ecdsa.domain().get_order()) { } bool ECDSA_Verification_Operation::verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len) { if(sig_len != order.bytes()*2) return false; BigInt e(msg, msg_len); BigInt r(sig, sig_len / 2); BigInt s(sig + sig_len / 2, sig_len / 2); if(r <= 0 || r >= order || s <= 0 || s >= order) return false; BigInt w = inverse_mod(s, order); PointGFp R = w * multi_exponentiate(base_point, e, public_point, r); if(R.is_zero()) return false; return (R.get_affine_x() % order == r); } } Botan-1.10.12/src/pubkey/ecdsa/ecdsa.h0000664000175000017500000000742212654331322017166 0ustar jackjack00000000000000/* * ECDSA * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ECDSA_KEY_H__ #define BOTAN_ECDSA_KEY_H__ #include #include #include namespace Botan { /** * This class represents ECDSA Public Keys. */ class BOTAN_DLL ECDSA_PublicKey : public virtual EC_PublicKey { public: /** * Construct a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ ECDSA_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} ECDSA_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : EC_PublicKey(alg_id, key_bits) {} /** * Get this keys algorithm name. * @result this keys algorithm name ("ECDSA") */ std::string algo_name() const { return "ECDSA"; } /** * Get the maximum number of bits allowed to be fed to this key. * This is the bitlength of the order of the base point. * @result the maximum number of input bits */ size_t max_input_bits() const { return domain().get_order().bits(); } size_t message_parts() const { return 2; } size_t message_part_size() const { return domain().get_order().bytes(); } protected: ECDSA_PublicKey() {} }; /** * This class represents ECDSA Private Keys */ class BOTAN_DLL ECDSA_PrivateKey : public ECDSA_PublicKey, public EC_PrivateKey { public: /** * Load a private key * @param alg_id the X.509 algorithm identifier * @param key_bits PKCS #8 structure */ ECDSA_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : EC_PrivateKey(alg_id, key_bits) {} /** * Generate a new private key * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key (if zero, generate a ney random key) */ ECDSA_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0) : EC_PrivateKey(rng, domain, x) {} bool check_key(RandomNumberGenerator& rng, bool) const; }; /** * ECDSA signature operation */ class BOTAN_DLL ECDSA_Signature_Operation : public PK_Ops::Signature { public: ECDSA_Signature_Operation(const ECDSA_PrivateKey& ecdsa); SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng); size_t message_parts() const { return 2; } size_t message_part_size() const { return order.bytes(); } size_t max_input_bits() const { return order.bits(); } private: const PointGFp& base_point; const BigInt& order; const BigInt& x; Modular_Reducer mod_order; }; /** * ECDSA verification operation */ class BOTAN_DLL ECDSA_Verification_Operation : public PK_Ops::Verification { public: ECDSA_Verification_Operation(const ECDSA_PublicKey& ecdsa); size_t message_parts() const { return 2; } size_t message_part_size() const { return order.bytes(); } size_t max_input_bits() const { return order.bits(); } bool with_recovery() const { return false; } bool verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len); private: const PointGFp& base_point; const PointGFp& public_point; const BigInt& order; }; } #endif Botan-1.10.12/src/pubkey/ecdsa/info.txt0000664000175000017500000000011412654331322017421 0ustar jackjack00000000000000define ECDSA asn1 ec_group ecc_key numbertheory rng Botan-1.10.12/src/pubkey/elgamal/elgamal.cpp0000664000175000017500000000654312654331322020372 0ustar jackjack00000000000000/* * ElGamal * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * ElGamal_PublicKey Constructor */ ElGamal_PublicKey::ElGamal_PublicKey(const DL_Group& grp, const BigInt& y1) { group = grp; y = y1; } /* * ElGamal_PrivateKey Constructor */ ElGamal_PrivateKey::ElGamal_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x_arg) { group = grp; x = x_arg; if(x == 0) x.randomize(rng, 2 * dl_work_factor(group_p().bits())); y = power_mod(group_g(), x, group_p()); if(x_arg == 0) gen_check(rng); else load_check(rng); } ElGamal_PrivateKey::ElGamal_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng) : DL_Scheme_PrivateKey(alg_id, key_bits, DL_Group::ANSI_X9_42) { y = power_mod(group_g(), x, group_p()); load_check(rng); } /* * Check Private ElGamal Parameters */ bool ElGamal_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!DL_Scheme_PrivateKey::check_key(rng, strong)) return false; if(!strong) return true; return KeyPair::encryption_consistency_check(rng, *this, "EME1(SHA-1)"); } ElGamal_Encryption_Operation::ElGamal_Encryption_Operation(const ElGamal_PublicKey& key) { const BigInt& p = key.group_p(); powermod_g_p = Fixed_Base_Power_Mod(key.group_g(), p); powermod_y_p = Fixed_Base_Power_Mod(key.get_y(), p); mod_p = Modular_Reducer(p); } SecureVector ElGamal_Encryption_Operation::encrypt(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) { const BigInt& p = mod_p.get_modulus(); BigInt m(msg, msg_len); if(m >= p) throw Invalid_Argument("ElGamal encryption: Input is too large"); BigInt k(rng, 2 * dl_work_factor(p.bits())); BigInt a = powermod_g_p(k); BigInt b = mod_p.multiply(m, powermod_y_p(k)); SecureVector output(2*p.bytes()); a.binary_encode(&output[p.bytes() - a.bytes()]); b.binary_encode(&output[output.size() / 2 + (p.bytes() - b.bytes())]); return output; } ElGamal_Decryption_Operation::ElGamal_Decryption_Operation(const ElGamal_PrivateKey& key) { const BigInt& p = key.group_p(); powermod_x_p = Fixed_Exponent_Power_Mod(key.get_x(), p); mod_p = Modular_Reducer(p); BigInt k(global_state().global_rng(), p.bits() - 1); blinder = Blinder(k, powermod_x_p(k), p); } SecureVector ElGamal_Decryption_Operation::decrypt(const byte msg[], size_t msg_len) { const BigInt& p = mod_p.get_modulus(); const size_t p_bytes = p.bytes(); if(msg_len != 2 * p_bytes) throw Invalid_Argument("ElGamal decryption: Invalid message"); BigInt a(msg, p_bytes); BigInt b(msg + p_bytes, p_bytes); if(a >= p || b >= p) throw Invalid_Argument("ElGamal decryption: Invalid message"); a = blinder.blind(a); BigInt r = mod_p.multiply(b, inverse_mod(powermod_x_p(a), p)); return BigInt::encode(blinder.unblind(r)); } } Botan-1.10.12/src/pubkey/elgamal/elgamal.h0000664000175000017500000000471012654331322020031 0ustar jackjack00000000000000/* * ElGamal * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ELGAMAL_H__ #define BOTAN_ELGAMAL_H__ #include #include #include #include #include namespace Botan { /** * ElGamal Public Key */ class BOTAN_DLL ElGamal_PublicKey : public virtual DL_Scheme_PublicKey { public: std::string algo_name() const { return "ElGamal"; } DL_Group::Format group_format() const { return DL_Group::ANSI_X9_42; } size_t max_input_bits() const { return (group_p().bits() - 1); } ElGamal_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : DL_Scheme_PublicKey(alg_id, key_bits, DL_Group::ANSI_X9_42) {} ElGamal_PublicKey(const DL_Group& group, const BigInt& y); protected: ElGamal_PublicKey() {} }; /** * ElGamal Private Key */ class BOTAN_DLL ElGamal_PrivateKey : public ElGamal_PublicKey, public virtual DL_Scheme_PrivateKey { public: bool check_key(RandomNumberGenerator& rng, bool) const; ElGamal_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng); ElGamal_PrivateKey(RandomNumberGenerator& rng, const DL_Group& group, const BigInt& priv_key = 0); }; /** * ElGamal encryption operation */ class BOTAN_DLL ElGamal_Encryption_Operation : public PK_Ops::Encryption { public: size_t max_input_bits() const { return mod_p.get_modulus().bits() - 1; } ElGamal_Encryption_Operation(const ElGamal_PublicKey& key); SecureVector encrypt(const byte msg[], size_t msg_len, RandomNumberGenerator& rng); private: Fixed_Base_Power_Mod powermod_g_p, powermod_y_p; Modular_Reducer mod_p; }; /** * ElGamal decryption operation */ class BOTAN_DLL ElGamal_Decryption_Operation : public PK_Ops::Decryption { public: size_t max_input_bits() const { return mod_p.get_modulus().bits() - 1; } ElGamal_Decryption_Operation(const ElGamal_PrivateKey& key); SecureVector decrypt(const byte msg[], size_t msg_len); private: Fixed_Exponent_Power_Mod powermod_x_p; Modular_Reducer mod_p; Blinder blinder; }; } #endif Botan-1.10.12/src/pubkey/elgamal/info.txt0000664000175000017500000000012612654331322017747 0ustar jackjack00000000000000define ELGAMAL dl_algo dl_group keypair libstate numbertheory Botan-1.10.12/src/pubkey/gost_3410/gost_3410.cpp0000664000175000017500000001103312654331322020422 0ustar jackjack00000000000000/* * GOST 34.10-2001 implemenation * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { MemoryVector GOST_3410_PublicKey::x509_subject_public_key() const { // Trust CryptoPro to come up with something obnoxious const BigInt x = public_point().get_affine_x(); const BigInt y = public_point().get_affine_y(); size_t part_size = std::max(x.bytes(), y.bytes()); MemoryVector bits(2*part_size); x.binary_encode(&bits[part_size - x.bytes()]); y.binary_encode(&bits[2*part_size - y.bytes()]); // Keys are stored in little endian format (WTF) for(size_t i = 0; i != part_size / 2; ++i) { std::swap(bits[i], bits[part_size-1-i]); std::swap(bits[part_size+i], bits[2*part_size-1-i]); } return DER_Encoder().encode(bits, OCTET_STRING).get_contents(); } AlgorithmIdentifier GOST_3410_PublicKey::algorithm_identifier() const { MemoryVector params = DER_Encoder().start_cons(SEQUENCE) .encode(OID(domain().get_oid())) .end_cons() .get_contents(); return AlgorithmIdentifier(get_oid(), params); } GOST_3410_PublicKey::GOST_3410_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) { OID ecc_param_id; // Also includes hash and cipher OIDs... brilliant design guys BER_Decoder(alg_id.parameters).start_cons(SEQUENCE).decode(ecc_param_id); domain_params = EC_Group(ecc_param_id); SecureVector bits; BER_Decoder(key_bits).decode(bits, OCTET_STRING); const size_t part_size = bits.size() / 2; // Keys are stored in little endian format (WTF) for(size_t i = 0; i != part_size / 2; ++i) { std::swap(bits[i], bits[part_size-1-i]); std::swap(bits[part_size+i], bits[2*part_size-1-i]); } BigInt x(&bits[0], part_size); BigInt y(&bits[part_size], part_size); public_key = PointGFp(domain().get_curve(), x, y); BOTAN_ASSERT(public_key.on_the_curve(), "Loaded GOST 34.10 public key not on the curve"); } namespace { BigInt decode_le(const byte msg[], size_t msg_len) { SecureVector msg_le(msg, msg_len); for(size_t i = 0; i != msg_le.size() / 2; ++i) std::swap(msg_le[i], msg_le[msg_le.size()-1-i]); return BigInt(&msg_le[0], msg_le.size()); } } GOST_3410_Signature_Operation::GOST_3410_Signature_Operation( const GOST_3410_PrivateKey& gost_3410) : base_point(gost_3410.domain().get_base_point()), order(gost_3410.domain().get_order()), x(gost_3410.private_value()) { } SecureVector GOST_3410_Signature_Operation::sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) { BigInt k; do k.randomize(rng, order.bits()-1); while(k >= order); BigInt e = decode_le(msg, msg_len); e %= order; if(e == 0) e = 1; PointGFp k_times_P = base_point * k; BOTAN_ASSERT(k_times_P.on_the_curve(), "GOST 34.10 k*g not on the curve"); BigInt r = k_times_P.get_affine_x() % order; BigInt s = (r*x + k*e) % order; if(r == 0 || s == 0) throw Invalid_State("GOST 34.10: r == 0 || s == 0"); SecureVector output(2*order.bytes()); s.binary_encode(&output[output.size() / 2 - s.bytes()]); r.binary_encode(&output[output.size() - r.bytes()]); return output; } GOST_3410_Verification_Operation::GOST_3410_Verification_Operation(const GOST_3410_PublicKey& gost) : base_point(gost.domain().get_base_point()), public_point(gost.public_point()), order(gost.domain().get_order()) { } bool GOST_3410_Verification_Operation::verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len) { if(sig_len != order.bytes()*2) return false; BigInt e = decode_le(msg, msg_len); BigInt s(sig, sig_len / 2); BigInt r(sig + sig_len / 2, sig_len / 2); if(r <= 0 || r >= order || s <= 0 || s >= order) return false; e %= order; if(e == 0) e = 1; BigInt v = inverse_mod(e, order); BigInt z1 = (s*v) % order; BigInt z2 = (-r*v) % order; PointGFp R = multi_exponentiate(base_point, z1, public_point, z2); if(R.is_zero()) return false; return (R.get_affine_x() == r); } } Botan-1.10.12/src/pubkey/gost_3410/gost_3410.h0000664000175000017500000000755412654331322020104 0ustar jackjack00000000000000/* * GOST 34.10-2001 * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_GOST_3410_KEY_H__ #define BOTAN_GOST_3410_KEY_H__ #include #include namespace Botan { /** * GOST-34.10 Public Key */ class BOTAN_DLL GOST_3410_PublicKey : public virtual EC_PublicKey { public: /** * Construct a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ GOST_3410_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} /** * Construct from X.509 algorithm id and subject public key bits */ GOST_3410_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits); /** * Get this keys algorithm name. * @result this keys algorithm name */ std::string algo_name() const { return "GOST-34.10"; } AlgorithmIdentifier algorithm_identifier() const; MemoryVector x509_subject_public_key() const; /** * Get the maximum number of bits allowed to be fed to this key. * This is the bitlength of the order of the base point. * @result the maximum number of input bits */ size_t max_input_bits() const { return domain().get_order().bits(); } size_t message_parts() const { return 2; } size_t message_part_size() const { return domain().get_order().bytes(); } protected: GOST_3410_PublicKey() {} }; /** * GOST-34.10 Private Key */ class BOTAN_DLL GOST_3410_PrivateKey : public GOST_3410_PublicKey, public EC_PrivateKey { public: GOST_3410_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : EC_PrivateKey(alg_id, key_bits) {} /** * Generate a new private key * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key; if zero, a new random key is generated */ GOST_3410_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0) : EC_PrivateKey(rng, domain, x) {} AlgorithmIdentifier pkcs8_algorithm_identifier() const { return EC_PublicKey::algorithm_identifier(); } }; /** * GOST-34.10 signature operation */ class BOTAN_DLL GOST_3410_Signature_Operation : public PK_Ops::Signature { public: GOST_3410_Signature_Operation(const GOST_3410_PrivateKey& gost_3410); size_t message_parts() const { return 2; } size_t message_part_size() const { return order.bytes(); } size_t max_input_bits() const { return order.bits(); } SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng); private: const PointGFp& base_point; const BigInt& order; const BigInt& x; }; /** * GOST-34.10 verification operation */ class BOTAN_DLL GOST_3410_Verification_Operation : public PK_Ops::Verification { public: GOST_3410_Verification_Operation(const GOST_3410_PublicKey& gost); size_t message_parts() const { return 2; } size_t message_part_size() const { return order.bytes(); } size_t max_input_bits() const { return order.bits(); } bool with_recovery() const { return false; } bool verify(const byte msg[], size_t msg_len, const byte sig[], size_t sig_len); private: const PointGFp& base_point; const PointGFp& public_point; const BigInt& order; }; } #endif Botan-1.10.12/src/pubkey/gost_3410/info.txt0000664000175000017500000000016312654331322017771 0ustar jackjack00000000000000define GOST_34_10_2001 load_on auto alloc asn1 ec_group ecc_key libstate numbertheory rng Botan-1.10.12/src/pubkey/if_algo/if_algo.cpp0000664000175000017500000000633112654331322020361 0ustar jackjack00000000000000/* * IF Scheme * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { AlgorithmIdentifier IF_Scheme_PublicKey::algorithm_identifier() const { return AlgorithmIdentifier(get_oid(), AlgorithmIdentifier::USE_NULL_PARAM); } MemoryVector IF_Scheme_PublicKey::x509_subject_public_key() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(n) .encode(e) .end_cons() .get_contents(); } IF_Scheme_PublicKey::IF_Scheme_PublicKey(const AlgorithmIdentifier&, const MemoryRegion& key_bits) { BER_Decoder(key_bits) .start_cons(SEQUENCE) .decode(n) .decode(e) .verify_end() .end_cons(); } /* * Check IF Scheme Public Parameters */ bool IF_Scheme_PublicKey::check_key(RandomNumberGenerator&, bool) const { if(n < 35 || n.is_even() || e < 2) return false; return true; } MemoryVector IF_Scheme_PrivateKey::pkcs8_private_key() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(static_cast(0)) .encode(n) .encode(e) .encode(d) .encode(p) .encode(q) .encode(d1) .encode(d2) .encode(c) .end_cons() .get_contents(); } IF_Scheme_PrivateKey::IF_Scheme_PrivateKey(RandomNumberGenerator& rng, const AlgorithmIdentifier&, const MemoryRegion& key_bits) { BER_Decoder(key_bits) .start_cons(SEQUENCE) .decode_and_check(0, "Unknown PKCS #1 key format version") .decode(n) .decode(e) .decode(d) .decode(p) .decode(q) .decode(d1) .decode(d2) .decode(c) .end_cons(); load_check(rng); } IF_Scheme_PrivateKey::IF_Scheme_PrivateKey(RandomNumberGenerator& rng, const BigInt& prime1, const BigInt& prime2, const BigInt& exp, const BigInt& d_exp, const BigInt& mod) { p = prime1; q = prime2; e = exp; d = d_exp; n = mod.is_nonzero() ? mod : p * q; if(d == 0) { BigInt inv_for_d = lcm(p - 1, q - 1); if(e.is_even()) inv_for_d >>= 1; d = inverse_mod(e, inv_for_d); } d1 = d % (p - 1); d2 = d % (q - 1); c = inverse_mod(q, p); load_check(rng); } /* * Check IF Scheme Private Parameters */ bool IF_Scheme_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(n < 35 || n.is_even() || e < 2 || d < 2 || p < 3 || q < 3 || p*q != n) return false; if(!strong) return true; if(d1 != d % (p - 1) || d2 != d % (q - 1) || c != inverse_mod(q, p)) return false; if(!check_prime(p, rng) || !check_prime(q, rng)) return false; return true; } } Botan-1.10.12/src/pubkey/if_algo/if_algo.h0000664000175000017500000000503112654331322020022 0ustar jackjack00000000000000/* * IF Scheme * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_IF_ALGO_H__ #define BOTAN_IF_ALGO_H__ #include #include #include namespace Botan { /** * This class represents public keys * of integer factorization based (IF) public key schemes. */ class BOTAN_DLL IF_Scheme_PublicKey : public virtual Public_Key { public: IF_Scheme_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits); IF_Scheme_PublicKey(const BigInt& n, const BigInt& e) : n(n), e(e) {} bool check_key(RandomNumberGenerator& rng, bool) const; AlgorithmIdentifier algorithm_identifier() const; MemoryVector x509_subject_public_key() const; /** * @return public modulus */ const BigInt& get_n() const { return n; } /** * @return public exponent */ const BigInt& get_e() const { return e; } size_t max_input_bits() const { return (n.bits() - 1); } protected: IF_Scheme_PublicKey() {} BigInt n, e; }; /** * This class represents public keys * of integer factorization based (IF) public key schemes. */ class BOTAN_DLL IF_Scheme_PrivateKey : public virtual IF_Scheme_PublicKey, public virtual Private_Key { public: IF_Scheme_PrivateKey(RandomNumberGenerator& rng, const BigInt& prime1, const BigInt& prime2, const BigInt& exp, const BigInt& d_exp, const BigInt& mod); IF_Scheme_PrivateKey(RandomNumberGenerator& rng, const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits); bool check_key(RandomNumberGenerator& rng, bool) const; /** * Get the first prime p. * @return prime p */ const BigInt& get_p() const { return p; } /** * Get the second prime q. * @return prime q */ const BigInt& get_q() const { return q; } /** * Get d with exp * d = 1 mod (p - 1, q - 1). * @return d */ const BigInt& get_d() const { return d; } const BigInt& get_c() const { return c; } const BigInt& get_d1() const { return d1; } const BigInt& get_d2() const { return d2; } MemoryVector pkcs8_private_key() const; protected: IF_Scheme_PrivateKey() {} BigInt d, p, q, d1, d2, c; }; } #endif Botan-1.10.12/src/pubkey/if_algo/info.txt0000664000175000017500000000014312654331322017744 0ustar jackjack00000000000000define IF_PUBLIC_KEY_FAMILY load_on dep asn1 bigint libstate numbertheory Botan-1.10.12/src/pubkey/info.txt0000664000175000017500000000065212654331322016351 0ustar jackjack00000000000000define PUBLIC_KEY_CRYPTO blinding.cpp pk_algs.cpp pk_keys.cpp pkcs8.cpp pubkey.cpp pubkey_enums.cpp workfactor.cpp x509_key.cpp blinding.h pk_keys.h pk_ops.h pkcs8.h pubkey.h pubkey_enums.h x509_key.h pk_algs.h workfactor.h alloc asn1 bigint engine filters kdf libstate oid_lookup pbe pem pk_pad rng algo_base Botan-1.10.12/src/pubkey/keypair/info.txt0000664000175000017500000000007012654331322020007 0ustar jackjack00000000000000define KEYPAIR_TESTING libstate Botan-1.10.12/src/pubkey/keypair/keypair.cpp0000664000175000017500000000347212654331322020474 0ustar jackjack00000000000000/* * Keypair Checks * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace KeyPair { /* * Check an encryption key pair for consistency */ bool encryption_consistency_check(RandomNumberGenerator& rng, const Private_Key& key, const std::string& padding) { PK_Encryptor_EME encryptor(key, padding); PK_Decryptor_EME decryptor(key, padding); /* Weird corner case, if the key is too small to encrypt anything at all. This can happen with very small RSA keys with PSS */ if(encryptor.maximum_input_size() == 0) return true; SecureVector plaintext = rng.random_vec(encryptor.maximum_input_size() - 1); SecureVector ciphertext = encryptor.encrypt(plaintext, rng); if(ciphertext == plaintext) return false; SecureVector decrypted = decryptor.decrypt(ciphertext); return (plaintext == decrypted); } /* * Check a signature key pair for consistency */ bool signature_consistency_check(RandomNumberGenerator& rng, const Private_Key& key, const std::string& padding) { PK_Signer signer(key, padding); PK_Verifier verifier(key, padding); SecureVector message = rng.random_vec(16); SecureVector signature; try { signature = signer.sign_message(message, rng); } catch(Encoding_Error) { return false; } if(!verifier.verify_message(message, signature)) return false; // Now try to check a corrupt signature, ensure it does not succeed ++message[0]; if(verifier.verify_message(message, signature)) return false; return true; } } } Botan-1.10.12/src/pubkey/keypair/keypair.h0000664000175000017500000000223312654331322020133 0ustar jackjack00000000000000/* * Keypair Checks * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_KEYPAIR_CHECKS_H__ #define BOTAN_KEYPAIR_CHECKS_H__ #include namespace Botan { namespace KeyPair { /** * Tests whether the key is consistent for encryption; whether * encrypting and then decrypting gives to the original plaintext. * @param rng the rng to use * @param key the key to test * @param padding the encryption padding method to use * @return true if consistent otherwise false */ BOTAN_DLL bool encryption_consistency_check(RandomNumberGenerator& rng, const Private_Key& key, const std::string& padding); /** * Tests whether the key is consistent for signatures; whether a * signature can be created and then verified * @param rng the rng to use * @param key the key to test * @param padding the signature padding method to use * @return true if consistent otherwise false */ BOTAN_DLL bool signature_consistency_check(RandomNumberGenerator& rng, const Private_Key& key, const std::string& padding); } } #endif Botan-1.10.12/src/pubkey/nr/info.txt0000664000175000017500000000013512654331322016764 0ustar jackjack00000000000000define NYBERG_RUEPPEL dl_algo dl_group keypair libstate numbertheory Botan-1.10.12/src/pubkey/nr/nr.cpp0000664000175000017500000000646412654331322016426 0ustar jackjack00000000000000/* * Nyberg-Rueppel * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { NR_PublicKey::NR_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : DL_Scheme_PublicKey(alg_id, key_bits, DL_Group::ANSI_X9_57) { } /* * NR_PublicKey Constructor */ NR_PublicKey::NR_PublicKey(const DL_Group& grp, const BigInt& y1) { group = grp; y = y1; } /* * Create a NR private key */ NR_PrivateKey::NR_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x_arg) { group = grp; x = x_arg; if(x == 0) x = BigInt::random_integer(rng, 2, group_q() - 1); y = power_mod(group_g(), x, group_p()); if(x_arg == 0) gen_check(rng); else load_check(rng); } NR_PrivateKey::NR_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng) : DL_Scheme_PrivateKey(alg_id, key_bits, DL_Group::ANSI_X9_57) { y = power_mod(group_g(), x, group_p()); load_check(rng); } /* * Check Private Nyberg-Rueppel Parameters */ bool NR_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!DL_Scheme_PrivateKey::check_key(rng, strong) || x >= group_q()) return false; if(!strong) return true; return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-1)"); } NR_Signature_Operation::NR_Signature_Operation(const NR_PrivateKey& nr) : q(nr.group_q()), x(nr.get_x()), powermod_g_p(nr.group_g(), nr.group_p()), mod_q(nr.group_q()) { } SecureVector NR_Signature_Operation::sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) { rng.add_entropy(msg, msg_len); BigInt f(msg, msg_len); if(f >= q) throw Invalid_Argument("NR_Signature_Operation: Input is out of range"); BigInt c, d; while(c == 0) { BigInt k; do k.randomize(rng, q.bits()); while(k >= q); c = mod_q.reduce(powermod_g_p(k) + f); d = mod_q.reduce(k - x * c); } SecureVector output(2*q.bytes()); c.binary_encode(&output[output.size() / 2 - c.bytes()]); d.binary_encode(&output[output.size() - d.bytes()]); return output; } NR_Verification_Operation::NR_Verification_Operation(const NR_PublicKey& nr) : q(nr.group_q()), y(nr.get_y()) { powermod_g_p = Fixed_Base_Power_Mod(nr.group_g(), nr.group_p()); powermod_y_p = Fixed_Base_Power_Mod(y, nr.group_p()); mod_p = Modular_Reducer(nr.group_p()); mod_q = Modular_Reducer(nr.group_q()); } SecureVector NR_Verification_Operation::verify_mr(const byte msg[], size_t msg_len) { const BigInt& q = mod_q.get_modulus(); if(msg_len != 2*q.bytes()) throw Invalid_Argument("NR verification: Invalid signature"); BigInt c(msg, q.bytes()); BigInt d(msg + q.bytes(), q.bytes()); if(c.is_zero() || c >= q || d >= q) throw Invalid_Argument("NR verification: Invalid signature"); BigInt i = mod_p.multiply(powermod_g_p(d), powermod_y_p(c)); return BigInt::encode(mod_q.reduce(c - i)); } } Botan-1.10.12/src/pubkey/nr/nr.h0000664000175000017500000000532412654331322016065 0ustar jackjack00000000000000/* * Nyberg-Rueppel * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_NYBERG_RUEPPEL_H__ #define BOTAN_NYBERG_RUEPPEL_H__ #include #include #include #include namespace Botan { /** * Nyberg-Rueppel Public Key */ class BOTAN_DLL NR_PublicKey : public virtual DL_Scheme_PublicKey { public: std::string algo_name() const { return "NR"; } DL_Group::Format group_format() const { return DL_Group::ANSI_X9_57; } size_t message_parts() const { return 2; } size_t message_part_size() const { return group_q().bytes(); } size_t max_input_bits() const { return (group_q().bits() - 1); } NR_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits); NR_PublicKey(const DL_Group& group, const BigInt& pub_key); protected: NR_PublicKey() {} }; /** * Nyberg-Rueppel Private Key */ class BOTAN_DLL NR_PrivateKey : public NR_PublicKey, public virtual DL_Scheme_PrivateKey { public: bool check_key(RandomNumberGenerator& rng, bool strong) const; NR_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng); NR_PrivateKey(RandomNumberGenerator& rng, const DL_Group& group, const BigInt& x = 0); }; /** * Nyberg-Rueppel signature operation */ class BOTAN_DLL NR_Signature_Operation : public PK_Ops::Signature { public: NR_Signature_Operation(const NR_PrivateKey& nr); size_t message_parts() const { return 2; } size_t message_part_size() const { return q.bytes(); } size_t max_input_bits() const { return (q.bits() - 1); } SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng); private: const BigInt& q; const BigInt& x; Fixed_Base_Power_Mod powermod_g_p; Modular_Reducer mod_q; }; /** * Nyberg-Rueppel verification operation */ class BOTAN_DLL NR_Verification_Operation : public PK_Ops::Verification { public: NR_Verification_Operation(const NR_PublicKey& nr); size_t message_parts() const { return 2; } size_t message_part_size() const { return q.bytes(); } size_t max_input_bits() const { return (q.bits() - 1); } bool with_recovery() const { return true; } SecureVector verify_mr(const byte msg[], size_t msg_len); private: const BigInt& q; const BigInt& y; Fixed_Base_Power_Mod powermod_g_p, powermod_y_p; Modular_Reducer mod_p, mod_q; }; } #endif Botan-1.10.12/src/pubkey/pk_algs.cpp0000664000175000017500000000701312654331322016777 0ustar jackjack00000000000000/* * PK Key * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif #if defined(BOTAN_HAS_GOST_34_10_2001) #include #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) #include #endif #if defined(BOTAN_HAS_RW) #include #endif #if defined(BOTAN_HAS_ELGAMAL) #include #endif #if defined(BOTAN_HAS_ECDH) #include #endif namespace Botan { Public_Key* make_public_key(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) { const std::string alg_name = OIDS::lookup(alg_id.oid); if(alg_name == "") throw Decoding_Error("Unknown algorithm OID: " + alg_id.oid.as_string()); #if defined(BOTAN_HAS_RSA) if(alg_name == "RSA") return new RSA_PublicKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_RW) if(alg_name == "RW") return new RW_PublicKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_DSA) if(alg_name == "DSA") return new DSA_PublicKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) if(alg_name == "DH") return new DH_PublicKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) if(alg_name == "NR") return new NR_PublicKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_ELGAMAL) if(alg_name == "ElGamal") return new ElGamal_PublicKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_ECDSA) if(alg_name == "ECDSA") return new ECDSA_PublicKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_GOST_34_10_2001) if(alg_name == "GOST-34.10") return new GOST_3410_PublicKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_ECDH) if(alg_name == "ECDH") return new ECDH_PublicKey(alg_id, key_bits); #endif return 0; } Private_Key* make_private_key(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng) { const std::string alg_name = OIDS::lookup(alg_id.oid); if(alg_name == "") throw Decoding_Error("Unknown algorithm OID: " + alg_id.oid.as_string()); #if defined(BOTAN_HAS_RSA) if(alg_name == "RSA") return new RSA_PrivateKey(alg_id, key_bits, rng); #endif #if defined(BOTAN_HAS_RW) if(alg_name == "RW") return new RW_PrivateKey(alg_id, key_bits, rng); #endif #if defined(BOTAN_HAS_DSA) if(alg_name == "DSA") return new DSA_PrivateKey(alg_id, key_bits, rng); #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) if(alg_name == "DH") return new DH_PrivateKey(alg_id, key_bits, rng); #endif #if defined(BOTAN_HAS_NYBERG_RUEPPEL) if(alg_name == "NR") return new NR_PrivateKey(alg_id, key_bits, rng); #endif #if defined(BOTAN_HAS_ELGAMAL) if(alg_name == "ElGamal") return new ElGamal_PrivateKey(alg_id, key_bits, rng); #endif #if defined(BOTAN_HAS_ECDSA) if(alg_name == "ECDSA") return new ECDSA_PrivateKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_GOST_34_10_2001) if(alg_name == "GOST-34.10") return new GOST_3410_PrivateKey(alg_id, key_bits); #endif #if defined(BOTAN_HAS_ECDH) if(alg_name == "ECDH") return new ECDH_PrivateKey(alg_id, key_bits); #endif return 0; } } Botan-1.10.12/src/pubkey/pk_algs.h0000664000175000017500000000104412654331322016442 0ustar jackjack00000000000000/* * PK Key Factory * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PK_KEY_FACTORY_H__ #define BOTAN_PK_KEY_FACTORY_H__ #include namespace Botan { Public_Key* make_public_key(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits); Private_Key* make_private_key(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng); } #endif Botan-1.10.12/src/pubkey/pk_keys.cpp0000664000175000017500000000226712654331322017032 0ustar jackjack00000000000000/* * PK Key Types * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Default OID access */ OID Public_Key::get_oid() const { try { return OIDS::lookup(algo_name()); } catch(Lookup_Error) { throw Lookup_Error("PK algo " + algo_name() + " has no defined OIDs"); } } /* * Run checks on a loaded public key */ void Public_Key::load_check(RandomNumberGenerator& rng) const { if(!check_key(rng, BOTAN_PUBLIC_KEY_STRONG_CHECKS_ON_LOAD)) throw Invalid_Argument(algo_name() + ": Invalid public key"); } /* * Run checks on a loaded private key */ void Private_Key::load_check(RandomNumberGenerator& rng) const { if(!check_key(rng, BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_LOAD)) throw Invalid_Argument(algo_name() + ": Invalid private key"); } /* * Run checks on a generated private key */ void Private_Key::gen_check(RandomNumberGenerator& rng) const { if(!check_key(rng, BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_GENERATE)) throw Self_Test_Failure(algo_name() + " private key generation failed"); } } Botan-1.10.12/src/pubkey/pk_keys.h0000664000175000017500000000651412654331322016476 0ustar jackjack00000000000000/* * PK Key Types * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PK_KEYS_H__ #define BOTAN_PK_KEYS_H__ #include #include #include #include namespace Botan { /** * Public Key Base Class. */ class BOTAN_DLL Public_Key { public: /** * Get the name of the underlying public key scheme. * @return name of the public key scheme */ virtual std::string algo_name() const = 0; /** * Get the OID of the underlying public key scheme. * @return OID of the public key scheme */ virtual OID get_oid() const; /** * Test the key values for consistency. * @param rng rng to use * @param strong whether to perform strong and lengthy version * of the test * @return true if the test is passed */ virtual bool check_key(RandomNumberGenerator& rng, bool strong) const = 0; /** * Find out the number of message parts supported by this scheme. * @return number of message parts */ virtual size_t message_parts() const { return 1; } /** * Find out the message part size supported by this scheme/key. * @return size of the message parts in bits */ virtual size_t message_part_size() const { return 0; } /** * Get the maximum message size in bits supported by this public key. * @return maximum message size in bits */ virtual size_t max_input_bits() const = 0; /** * @return X.509 AlgorithmIdentifier for this key */ virtual AlgorithmIdentifier algorithm_identifier() const = 0; /** * @return X.509 subject key encoding for this key object */ virtual MemoryVector x509_subject_public_key() const = 0; virtual ~Public_Key() {} protected: /** * Self-test after loading a key * @param rng a random number generator */ virtual void load_check(RandomNumberGenerator& rng) const; }; /** * Private Key Base Class */ class BOTAN_DLL Private_Key : public virtual Public_Key { public: /** * @return PKCS #8 private key encoding for this key object */ virtual MemoryVector pkcs8_private_key() const = 0; /** * @return PKCS #8 AlgorithmIdentifier for this key * Might be different from the X.509 identifier, but normally is not */ virtual AlgorithmIdentifier pkcs8_algorithm_identifier() const { return algorithm_identifier(); } protected: /** * Self-test after loading a key * @param rng a random number generator */ void load_check(RandomNumberGenerator& rng) const; /** * Self-test after generating a key * @param rng a random number generator */ void gen_check(RandomNumberGenerator& rng) const; }; /** * PK Secret Value Derivation Key */ class BOTAN_DLL PK_Key_Agreement_Key : public virtual Private_Key { public: /* * @return public component of this key */ virtual MemoryVector public_value() const = 0; virtual ~PK_Key_Agreement_Key() {} }; /* * Typedefs */ typedef PK_Key_Agreement_Key PK_KA_Key; typedef Public_Key X509_PublicKey; typedef Private_Key PKCS8_PrivateKey; } #endif Botan-1.10.12/src/pubkey/pk_ops.h0000664000175000017500000001002212654331322016311 0ustar jackjack00000000000000/* * PK Operation Types * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PK_OPERATIONS_H__ #define BOTAN_PK_OPERATIONS_H__ #include #include namespace Botan { namespace PK_Ops { /** * Public key encryption interface */ class BOTAN_DLL Encryption { public: virtual size_t max_input_bits() const = 0; virtual SecureVector encrypt(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) = 0; virtual ~Encryption() {} }; /** * Public key decryption interface */ class BOTAN_DLL Decryption { public: virtual size_t max_input_bits() const = 0; virtual SecureVector decrypt(const byte msg[], size_t msg_len) = 0; virtual ~Decryption() {} }; /** * Public key signature creation interface */ class BOTAN_DLL Signature { public: /** * Find out the number of message parts supported by this scheme. * @return number of message parts */ virtual size_t message_parts() const { return 1; } /** * Find out the message part size supported by this scheme/key. * @return size of the message parts */ virtual size_t message_part_size() const { return 0; } /** * Get the maximum message size in bits supported by this public key. * @return maximum message in bits */ virtual size_t max_input_bits() const = 0; /* * Perform a signature operation * @param msg the message * @param msg_len the length of msg in bytes * @param rng a random number generator */ virtual SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) = 0; virtual ~Signature() {} }; /** * Public key signature verification interface */ class BOTAN_DLL Verification { public: /** * Get the maximum message size in bits supported by this public key. * @return maximum message in bits */ virtual size_t max_input_bits() const = 0; /** * Find out the number of message parts supported by this scheme. * @return number of message parts */ virtual size_t message_parts() const { return 1; } /** * Find out the message part size supported by this scheme/key. * @return size of the message parts */ virtual size_t message_part_size() const { return 0; } /** * @return boolean specifying if this key type supports message * recovery and thus if you need to call verify() or verify_mr() */ virtual bool with_recovery() const = 0; /* * Perform a signature check operation * @param msg the message * @param msg_len the length of msg in bytes * @param sig the signature * @param sig_len the length of sig in bytes * @returns if signature is a valid one for message */ virtual bool verify(const byte[], size_t, const byte[], size_t) { throw Invalid_State("Message recovery required"); } /* * Perform a signature operation (with message recovery) * Only call this if with_recovery() returns true * @param msg the message * @param msg_len the length of msg in bytes * @returns recovered message */ virtual SecureVector verify_mr(const byte[], size_t) { throw Invalid_State("Message recovery not supported"); } virtual ~Verification() {} }; /** * A generic key agreement Operation (eg DH or ECDH) */ class BOTAN_DLL Key_Agreement { public: /* * Perform a key agreement operation * @param w the other key value * @param w_len the length of w in bytes * @returns the agreed key */ virtual SecureVector agree(const byte w[], size_t w_len) = 0; virtual ~Key_Agreement() {} }; } } #endif Botan-1.10.12/src/pubkey/pkcs8.cpp0000664000175000017500000001474312654331322016417 0ustar jackjack00000000000000/* * PKCS #8 * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include namespace Botan { namespace PKCS8 { namespace { /* * Get info from an EncryptedPrivateKeyInfo */ SecureVector PKCS8_extract(DataSource& source, AlgorithmIdentifier& pbe_alg_id) { SecureVector key_data; BER_Decoder(source) .start_cons(SEQUENCE) .decode(pbe_alg_id) .decode(key_data, OCTET_STRING) .verify_end(); return key_data; } /* * PEM decode and/or decrypt a private key */ SecureVector PKCS8_decode(DataSource& source, const User_Interface& ui, AlgorithmIdentifier& pk_alg_id) { AlgorithmIdentifier pbe_alg_id; SecureVector key_data, key; bool is_encrypted = true; try { if(ASN1::maybe_BER(source) && !PEM_Code::matches(source)) key_data = PKCS8_extract(source, pbe_alg_id); else { std::string label; key_data = PEM_Code::decode(source, label); if(label == "PRIVATE KEY") is_encrypted = false; else if(label == "ENCRYPTED PRIVATE KEY") { DataSource_Memory key_source(key_data); key_data = PKCS8_extract(key_source, pbe_alg_id); } else throw PKCS8_Exception("Unknown PEM label " + label); } if(key_data.empty()) throw PKCS8_Exception("No key data found"); } catch(Decoding_Error) { throw Decoding_Error("PKCS #8 private key decoding failed"); } if(!is_encrypted) key = key_data; const size_t MAX_TRIES = 3; size_t tries = 0; while(true) { try { if(MAX_TRIES && tries >= MAX_TRIES) break; if(is_encrypted) { DataSource_Memory params(pbe_alg_id.parameters); std::auto_ptr pbe(get_pbe(pbe_alg_id.oid, params)); User_Interface::UI_Result result = User_Interface::OK; const std::string passphrase = ui.get_passphrase("PKCS #8 private key", source.id(), result); if(result == User_Interface::CANCEL_ACTION) break; pbe->set_key(passphrase); Pipe decryptor(pbe.release()); decryptor.process_msg(key_data); key = decryptor.read_all(); } BER_Decoder(key) .start_cons(SEQUENCE) .decode_and_check(0, "Unknown PKCS #8 version number") .decode(pk_alg_id) .decode(key, OCTET_STRING) .discard_remaining() .end_cons(); break; } catch(Decoding_Error) { ++tries; } } if(key.empty()) throw Decoding_Error("PKCS #8 private key decoding failed"); return key; } } /* * BER encode a PKCS #8 private key, unencrypted */ SecureVector BER_encode(const Private_Key& key) { const size_t PKCS8_VERSION = 0; return DER_Encoder() .start_cons(SEQUENCE) .encode(PKCS8_VERSION) .encode(key.pkcs8_algorithm_identifier()) .encode(key.pkcs8_private_key(), OCTET_STRING) .end_cons() .get_contents(); } /* * PEM encode a PKCS #8 private key, unencrypted */ std::string PEM_encode(const Private_Key& key) { return PEM_Code::encode(PKCS8::BER_encode(key), "PRIVATE KEY"); } /* * BER encode a PKCS #8 private key, encrypted */ SecureVector BER_encode(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, const std::string& pbe_algo) { const std::string DEFAULT_PBE = "PBE-PKCS5v20(SHA-1,AES-256/CBC)"; std::auto_ptr pbe(get_pbe(((pbe_algo != "") ? pbe_algo : DEFAULT_PBE))); pbe->new_params(rng); pbe->set_key(pass); AlgorithmIdentifier pbe_algid(pbe->get_oid(), pbe->encode_params()); Pipe key_encrytor(pbe.release()); key_encrytor.process_msg(PKCS8::BER_encode(key)); return DER_Encoder() .start_cons(SEQUENCE) .encode(pbe_algid) .encode(key_encrytor.read_all(), OCTET_STRING) .end_cons() .get_contents(); } /* * PEM encode a PKCS #8 private key, encrypted */ std::string PEM_encode(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, const std::string& pbe_algo) { if(pass == "") return PEM_encode(key); return PEM_Code::encode(PKCS8::BER_encode(key, rng, pass, pbe_algo), "ENCRYPTED PRIVATE KEY"); } /* * Extract a private key and return it */ Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng, const User_Interface& ui) { AlgorithmIdentifier alg_id; SecureVector pkcs8_key = PKCS8_decode(source, ui, alg_id); const std::string alg_name = OIDS::lookup(alg_id.oid); if(alg_name == "" || alg_name == alg_id.oid.as_string()) throw PKCS8_Exception("Unknown algorithm OID: " + alg_id.oid.as_string()); return make_private_key(alg_id, pkcs8_key, rng); } /* * Extract a private key and return it */ Private_Key* load_key(const std::string& fsname, RandomNumberGenerator& rng, const User_Interface& ui) { DataSource_Stream source(fsname, true); return PKCS8::load_key(source, rng, ui); } /* * Extract a private key and return it */ Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng, const std::string& pass) { return PKCS8::load_key(source, rng, User_Interface(pass)); } /* * Extract a private key and return it */ Private_Key* load_key(const std::string& fsname, RandomNumberGenerator& rng, const std::string& pass) { return PKCS8::load_key(fsname, rng, User_Interface(pass)); } /* * Make a copy of this private key */ Private_Key* copy_key(const Private_Key& key, RandomNumberGenerator& rng) { DataSource_Memory source(PEM_encode(key)); return PKCS8::load_key(source, rng); } } } Botan-1.10.12/src/pubkey/pkcs8.h0000664000175000017500000001275712654331322016067 0ustar jackjack00000000000000/* * PKCS #8 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PKCS8_H__ #define BOTAN_PKCS8_H__ #include #include namespace Botan { /** * PKCS #8 General Exception */ struct BOTAN_DLL PKCS8_Exception : public Decoding_Error { PKCS8_Exception(const std::string& error) : Decoding_Error("PKCS #8: " + error) {} }; /** * This namespace contains functions for handling PKCS #8 private keys */ namespace PKCS8 { /** * BER encode a private key * @param key the private key to encode * @return BER encoded key */ BOTAN_DLL SecureVector BER_encode(const Private_Key& key); /** * Get a string containing a PEM encoded private key. * @param key the key to encode * @return encoded key */ BOTAN_DLL std::string PEM_encode(const Private_Key& key); /** * Encrypt a key using PKCS #8 encryption * @param key the key to encode * @param rng the rng to use * @param pass the password to use for encryption * @param pbe_algo the name of the desired password-based encryption algorithm; if empty ("") a reasonable (portable/secure) default will be chosen. * @return encrypted key in binary BER form */ BOTAN_DLL SecureVector BER_encode(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, const std::string& pbe_algo = ""); /** * Get a string containing a PEM encoded private key, encrypting it with a * password. * @param key the key to encode * @param rng the rng to use * @param pass the password to use for encryption * @param pbe_algo the name of the desired password-based encryption algorithm; if empty ("") a reasonable (portable/secure) default will be chosen. * @return encrypted key in PEM form */ BOTAN_DLL std::string PEM_encode(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, const std::string& pbe_algo = ""); /** * Encode a private key into a pipe. * @deprecated Use PEM_encode or BER_encode instead * * @param key the private key to encode * @param pipe the pipe to feed the encoded key into * @param encoding the encoding type to use */ BOTAN_DEPRECATED("Use PEM_encode or BER_encode") inline void encode(const Private_Key& key, Pipe& pipe, X509_Encoding encoding = PEM) { if(encoding == PEM) pipe.write(PKCS8::PEM_encode(key)); else pipe.write(PKCS8::BER_encode(key)); } /** * Encode and encrypt a private key into a pipe. * @deprecated Use PEM_encode or BER_encode instead * * @param key the private key to encode * @param pipe the pipe to feed the encoded key into * @param pass the password to use for encryption * @param rng the rng to use * @param pbe_algo the name of the desired password-based encryption algorithm; if empty ("") a reasonable (portable/secure) default will be chosen. * @param encoding the encoding type to use */ BOTAN_DEPRECATED("Use PEM_encode or BER_encode") inline void encrypt_key(const Private_Key& key, Pipe& pipe, RandomNumberGenerator& rng, const std::string& pass, const std::string& pbe_algo = "", X509_Encoding encoding = PEM) { if(encoding == PEM) pipe.write(PKCS8::PEM_encode(key, rng, pass, pbe_algo)); else pipe.write(PKCS8::BER_encode(key, rng, pass, pbe_algo)); } /** * Load a key from a data source. * @param source the data source providing the encoded key * @param rng the rng to use * @param ui the user interface to be used for passphrase dialog * @return loaded private key object */ BOTAN_DLL Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng, const User_Interface& ui); /** Load a key from a data source. * @param source the data source providing the encoded key * @param rng the rng to use * @param pass the passphrase to decrypt the key. Provide an empty * string if the key is not encoded. * @return loaded private key object */ BOTAN_DLL Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng, const std::string& pass = ""); /** * Load a key from a file. * @param filename the path to the file containing the encoded key * @param rng the rng to use * @param ui the user interface to be used for passphrase dialog * @return loaded private key object */ BOTAN_DLL Private_Key* load_key(const std::string& filename, RandomNumberGenerator& rng, const User_Interface& ui); /** Load a key from a file. * @param filename the path to the file containing the encoded key * @param rng the rng to use * @param pass the passphrase to decrypt the key. Provide an empty * string if the key is not encoded. * @return loaded private key object */ BOTAN_DLL Private_Key* load_key(const std::string& filename, RandomNumberGenerator& rng, const std::string& pass = ""); /** * Copy an existing encoded key object. * @param key the key to copy * @param rng the rng to use * @return new copy of the key */ BOTAN_DLL Private_Key* copy_key(const Private_Key& key, RandomNumberGenerator& rng); } } #endif Botan-1.10.12/src/pubkey/pubkey.cpp0000664000175000017500000002361312654331322016662 0ustar jackjack00000000000000/* * Public Key Base * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include #include #include #include namespace Botan { /* * PK_Encryptor_EME Constructor */ PK_Encryptor_EME::PK_Encryptor_EME(const Public_Key& key, const std::string& eme_name) { Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); op = 0; while(const Engine* engine = i.next()) { op = engine->get_encryption_op(key); if(op) break; } if(!op) throw Lookup_Error("Encryption with " + key.algo_name() + " not supported"); eme = (eme_name == "Raw") ? 0 : get_eme(eme_name); } /* * Encrypt a message */ SecureVector PK_Encryptor_EME::enc(const byte in[], size_t length, RandomNumberGenerator& rng) const { if(eme) { SecureVector encoded = eme->encode(in, length, op->max_input_bits(), rng); if(8*(encoded.size() - 1) + high_bit(encoded[0]) > op->max_input_bits()) throw Invalid_Argument("PK_Encryptor_EME: Input is too large"); return op->encrypt(&encoded[0], encoded.size(), rng); } else { if(8*(length - 1) + high_bit(in[0]) > op->max_input_bits()) throw Invalid_Argument("PK_Encryptor_EME: Input is too large"); return op->encrypt(&in[0], length, rng); } } /* * Return the max size, in bytes, of a message */ size_t PK_Encryptor_EME::maximum_input_size() const { if(!eme) return (op->max_input_bits() / 8); else return eme->maximum_input_size(op->max_input_bits()); } /* * PK_Decryptor_EME Constructor */ PK_Decryptor_EME::PK_Decryptor_EME(const Private_Key& key, const std::string& eme_name) { Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); op = 0; while(const Engine* engine = i.next()) { op = engine->get_decryption_op(key); if(op) break; } if(!op) throw Lookup_Error("Decryption with " + key.algo_name() + " not supported"); eme = (eme_name == "Raw") ? 0 : get_eme(eme_name); } /* * Decrypt a message */ SecureVector PK_Decryptor_EME::dec(const byte msg[], size_t length) const { try { SecureVector decrypted = op->decrypt(msg, length); if(eme) return eme->decode(decrypted, op->max_input_bits()); else return decrypted; } catch(Invalid_Argument) { throw Decoding_Error("PK_Decryptor_EME: Input is invalid"); } } /* * PK_Signer Constructor */ PK_Signer::PK_Signer(const Private_Key& key, const std::string& emsa_name, Signature_Format format, Fault_Protection prot) { Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); op = 0; verify_op = 0; while(const Engine* engine = i.next()) { if(!op) op = engine->get_signature_op(key); if(!verify_op && prot == ENABLE_FAULT_PROTECTION) verify_op = engine->get_verify_op(key); if(op && (verify_op || prot == DISABLE_FAULT_PROTECTION)) break; } if(!op || (!verify_op && prot == ENABLE_FAULT_PROTECTION)) throw Lookup_Error("Signing with " + key.algo_name() + " not supported"); emsa = get_emsa(emsa_name); sig_format = format; } /* * Sign a message */ SecureVector PK_Signer::sign_message(const byte msg[], size_t length, RandomNumberGenerator& rng) { update(msg, length); return signature(rng); } /* * Add more to the message to be signed */ void PK_Signer::update(const byte in[], size_t length) { emsa->update(in, length); } /* * Check the signature we just created, to help prevent fault attacks */ bool PK_Signer::self_test_signature(const MemoryRegion& msg, const MemoryRegion& sig) const { if(!verify_op) return true; // checking disabled, assume ok if(verify_op->with_recovery()) { SecureVector recovered = verify_op->verify_mr(&sig[0], sig.size()); if(msg.size() > recovered.size()) { size_t extra_0s = msg.size() - recovered.size(); for(size_t i = 0; i != extra_0s; ++i) if(msg[i] != 0) return false; return same_mem(&msg[extra_0s], &recovered[0], recovered.size()); } return (recovered == msg); } else return verify_op->verify(&msg[0], msg.size(), &sig[0], sig.size()); } /* * Create a signature */ SecureVector PK_Signer::signature(RandomNumberGenerator& rng) { SecureVector encoded = emsa->encoding_of(emsa->raw_data(), op->max_input_bits(), rng); SecureVector plain_sig = op->sign(&encoded[0], encoded.size(), rng); BOTAN_ASSERT(self_test_signature(encoded, plain_sig), "PK_Signer consistency check failed"); if(op->message_parts() == 1 || sig_format == IEEE_1363) return plain_sig; if(sig_format == DER_SEQUENCE) { if(plain_sig.size() % op->message_parts()) throw Encoding_Error("PK_Signer: strange signature size found"); const size_t SIZE_OF_PART = plain_sig.size() / op->message_parts(); std::vector sig_parts(op->message_parts()); for(size_t j = 0; j != sig_parts.size(); ++j) sig_parts[j].binary_decode(&plain_sig[SIZE_OF_PART*j], SIZE_OF_PART); return DER_Encoder() .start_cons(SEQUENCE) .encode_list(sig_parts) .end_cons() .get_contents(); } else throw Encoding_Error("PK_Signer: Unknown signature format " + to_string(sig_format)); } /* * PK_Verifier Constructor */ PK_Verifier::PK_Verifier(const Public_Key& key, const std::string& emsa_name, Signature_Format format) { Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); op = 0; while(const Engine* engine = i.next()) { op = engine->get_verify_op(key); if(op) break; } if(!op) throw Lookup_Error("Verification with " + key.algo_name() + " not supported"); emsa = get_emsa(emsa_name); sig_format = format; } /* * Set the signature format */ void PK_Verifier::set_input_format(Signature_Format format) { if(op->message_parts() == 1 && format != IEEE_1363) throw Invalid_State("PK_Verifier: This algorithm always uses IEEE 1363"); sig_format = format; } /* * Verify a message */ bool PK_Verifier::verify_message(const byte msg[], size_t msg_length, const byte sig[], size_t sig_length) { update(msg, msg_length); return check_signature(sig, sig_length); } /* * Append to the message */ void PK_Verifier::update(const byte in[], size_t length) { emsa->update(in, length); } /* * Check a signature */ bool PK_Verifier::check_signature(const byte sig[], size_t length) { try { if(sig_format == IEEE_1363) return validate_signature(emsa->raw_data(), sig, length); else if(sig_format == DER_SEQUENCE) { BER_Decoder decoder(sig, length); BER_Decoder ber_sig = decoder.start_cons(SEQUENCE); size_t count = 0; SecureVector real_sig; while(ber_sig.more_items()) { BigInt sig_part; ber_sig.decode(sig_part); real_sig += BigInt::encode_1363(sig_part, op->message_part_size()); ++count; } if(count != op->message_parts()) throw Decoding_Error("PK_Verifier: signature size invalid"); return validate_signature(emsa->raw_data(), &real_sig[0], real_sig.size()); } else throw Decoding_Error("PK_Verifier: Unknown signature format " + to_string(sig_format)); } catch(Invalid_Argument) { return false; } } /* * Verify a signature */ bool PK_Verifier::validate_signature(const MemoryRegion& msg, const byte sig[], size_t sig_len) { if(op->with_recovery()) { SecureVector output_of_key = op->verify_mr(sig, sig_len); return emsa->verify(output_of_key, msg, op->max_input_bits()); } else { Null_RNG rng; SecureVector encoded = emsa->encoding_of(msg, op->max_input_bits(), rng); return op->verify(&encoded[0], encoded.size(), sig, sig_len); } } /* * PK_Key_Agreement Constructor */ PK_Key_Agreement::PK_Key_Agreement(const PK_Key_Agreement_Key& key, const std::string& kdf_name) { Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory()); op = 0; while(const Engine* engine = i.next()) { op = engine->get_key_agreement_op(key); if(op) break; } if(!op) throw Lookup_Error("Key agreement with " + key.algo_name() + " not supported"); kdf = (kdf_name == "Raw") ? 0 : get_kdf(kdf_name); } SymmetricKey PK_Key_Agreement::derive_key(size_t key_len, const byte in[], size_t in_len, const byte params[], size_t params_len) const { SecureVector z = op->agree(in, in_len); if(!kdf) return z; return kdf->derive_key(key_len, z, params, params_len); } } Botan-1.10.12/src/pubkey/pubkey.h0000664000175000017500000003247012654331322016330 0ustar jackjack00000000000000/* * Public Key Interface * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PUBKEY_H__ #define BOTAN_PUBKEY_H__ #include #include #include #include #include #include #include namespace Botan { /** * The two types of signature format supported by Botan. */ enum Signature_Format { IEEE_1363, DER_SEQUENCE }; /** * Enum marking if protection against fault attacks should be used */ enum Fault_Protection { ENABLE_FAULT_PROTECTION, DISABLE_FAULT_PROTECTION }; /** * Public Key Encryptor */ class BOTAN_DLL PK_Encryptor { public: /** * Encrypt a message. * @param in the message as a byte array * @param length the length of the above byte array * @param rng the random number source to use * @return encrypted message */ SecureVector encrypt(const byte in[], size_t length, RandomNumberGenerator& rng) const { return enc(in, length, rng); } /** * Encrypt a message. * @param in the message * @param rng the random number source to use * @return encrypted message */ SecureVector encrypt(const MemoryRegion& in, RandomNumberGenerator& rng) const { return enc(&in[0], in.size(), rng); } /** * Return the maximum allowed message size in bytes. * @return maximum message size in bytes */ virtual size_t maximum_input_size() const = 0; PK_Encryptor() {} virtual ~PK_Encryptor() {} private: PK_Encryptor(const PK_Encryptor&) {} PK_Encryptor& operator=(const PK_Encryptor&) { return *this; } virtual SecureVector enc(const byte[], size_t, RandomNumberGenerator&) const = 0; }; /** * Public Key Decryptor */ class BOTAN_DLL PK_Decryptor { public: /** * Decrypt a ciphertext. * @param in the ciphertext as a byte array * @param length the length of the above byte array * @return decrypted message */ SecureVector decrypt(const byte in[], size_t length) const { return dec(in, length); } /** * Decrypt a ciphertext. * @param in the ciphertext * @return decrypted message */ SecureVector decrypt(const MemoryRegion& in) const { return dec(&in[0], in.size()); } PK_Decryptor() {} virtual ~PK_Decryptor() {} private: PK_Decryptor(const PK_Decryptor&) {} PK_Decryptor& operator=(const PK_Decryptor&) { return *this; } virtual SecureVector dec(const byte[], size_t) const = 0; }; /** * Public Key Signer. Use the sign_message() functions for small * messages. Use multiple calls update() to process large messages and * generate the signature by finally calling signature(). */ class BOTAN_DLL PK_Signer { public: /** * Sign a message. * @param in the message to sign as a byte array * @param length the length of the above byte array * @param rng the rng to use * @return signature */ SecureVector sign_message(const byte in[], size_t length, RandomNumberGenerator& rng); /** * Sign a message. * @param in the message to sign * @param rng the rng to use * @return signature */ SecureVector sign_message(const MemoryRegion& in, RandomNumberGenerator& rng) { return sign_message(&in[0], in.size(), rng); } /** * Add a message part (single byte). * @param in the byte to add */ void update(byte in) { update(&in, 1); } /** * Add a message part. * @param in the message part to add as a byte array * @param length the length of the above byte array */ void update(const byte in[], size_t length); /** * Add a message part. * @param in the message part to add */ void update(const MemoryRegion& in) { update(&in[0], in.size()); } /** * Get the signature of the so far processed message (provided by the * calls to update()). * @param rng the rng to use * @return signature of the total message */ SecureVector signature(RandomNumberGenerator& rng); /** * Set the output format of the signature. * @param format the signature format to use */ void set_output_format(Signature_Format format) { sig_format = format; } /** * Construct a PK Signer. * @param key the key to use inside this signer * @param emsa the EMSA to use * An example would be "EMSA1(SHA-224)". * @param format the signature format to use * @param prot says if fault protection should be enabled */ PK_Signer(const Private_Key& key, const std::string& emsa, Signature_Format format = IEEE_1363, Fault_Protection prot = ENABLE_FAULT_PROTECTION); ~PK_Signer() { delete op; delete verify_op; delete emsa; } private: bool self_test_signature(const MemoryRegion& msg, const MemoryRegion& sig) const; PK_Signer(const PK_Signer&) {} PK_Signer& operator=(const PK_Signer&) { return *this; } PK_Ops::Signature* op; PK_Ops::Verification* verify_op; EMSA* emsa; Signature_Format sig_format; }; /** * Public Key Verifier. Use the verify_message() functions for small * messages. Use multiple calls update() to process large messages and * verify the signature by finally calling check_signature(). */ class BOTAN_DLL PK_Verifier { public: /** * Verify a signature. * @param msg the message that the signature belongs to, as a byte array * @param msg_length the length of the above byte array msg * @param sig the signature as a byte array * @param sig_length the length of the above byte array sig * @return true if the signature is valid */ bool verify_message(const byte msg[], size_t msg_length, const byte sig[], size_t sig_length); /** * Verify a signature. * @param msg the message that the signature belongs to * @param sig the signature * @return true if the signature is valid */ bool verify_message(const MemoryRegion& msg, const MemoryRegion& sig) { return verify_message(&msg[0], msg.size(), &sig[0], sig.size()); } /** * Add a message part (single byte) of the message corresponding to the * signature to be verified. * @param in the byte to add */ void update(byte in) { update(&in, 1); } /** * Add a message part of the message corresponding to the * signature to be verified. * @param msg_part the new message part as a byte array * @param length the length of the above byte array */ void update(const byte msg_part[], size_t length); /** * Add a message part of the message corresponding to the * signature to be verified. * @param in the new message part */ void update(const MemoryRegion& in) { update(&in[0], in.size()); } /** * Check the signature of the buffered message, i.e. the one build * by successive calls to update. * @param sig the signature to be verified as a byte array * @param length the length of the above byte array * @return true if the signature is valid, false otherwise */ bool check_signature(const byte sig[], size_t length); /** * Check the signature of the buffered message, i.e. the one build * by successive calls to update. * @param sig the signature to be verified * @return true if the signature is valid, false otherwise */ bool check_signature(const MemoryRegion& sig) { return check_signature(&sig[0], sig.size()); } /** * Set the format of the signatures fed to this verifier. * @param format the signature format to use */ void set_input_format(Signature_Format format); /** * Construct a PK Verifier. * @param pub_key the public key to verify against * @param emsa the EMSA to use (eg "EMSA3(SHA-1)") * @param format the signature format to use */ PK_Verifier(const Public_Key& pub_key, const std::string& emsa, Signature_Format format = IEEE_1363); ~PK_Verifier() { delete op; delete emsa; } private: PK_Verifier(const PK_Verifier&) {} PK_Verifier& operator=(const PK_Verifier&) { return *this; } bool validate_signature(const MemoryRegion& msg, const byte sig[], size_t sig_len); PK_Ops::Verification* op; EMSA* emsa; Signature_Format sig_format; }; /** * Key used for key agreement */ class BOTAN_DLL PK_Key_Agreement { public: /* * Perform Key Agreement Operation * @param key_len the desired key output size * @param in the other parties key * @param in_len the length of in in bytes * @param params extra derivation params * @param params_len the length of params in bytes */ SymmetricKey derive_key(size_t key_len, const byte in[], size_t in_len, const byte params[], size_t params_len) const; /* * Perform Key Agreement Operation * @param key_len the desired key output size * @param in the other parties key * @param in_len the length of in in bytes * @param params extra derivation params * @param params_len the length of params in bytes */ SymmetricKey derive_key(size_t key_len, const MemoryRegion& in, const byte params[], size_t params_len) const { return derive_key(key_len, &in[0], in.size(), params, params_len); } /* * Perform Key Agreement Operation * @param key_len the desired key output size * @param in the other parties key * @param in_len the length of in in bytes * @param params extra derivation params */ SymmetricKey derive_key(size_t key_len, const byte in[], size_t in_len, const std::string& params = "") const { return derive_key(key_len, in, in_len, reinterpret_cast(params.data()), params.length()); } /* * Perform Key Agreement Operation * @param key_len the desired key output size * @param in the other parties key * @param params extra derivation params */ SymmetricKey derive_key(size_t key_len, const MemoryRegion& in, const std::string& params = "") const { return derive_key(key_len, &in[0], in.size(), reinterpret_cast(params.data()), params.length()); } /** * Construct a PK Key Agreement. * @param key the key to use * @param kdf name of the KDF to use (or 'Raw' for no KDF) */ PK_Key_Agreement(const PK_Key_Agreement_Key& key, const std::string& kdf); ~PK_Key_Agreement() { delete op; delete kdf; } private: PK_Key_Agreement(const PK_Key_Agreement_Key&) {} PK_Key_Agreement& operator=(const PK_Key_Agreement&) { return *this; } PK_Ops::Key_Agreement* op; KDF* kdf; }; /** * Encryption with an MR algorithm and an EME. */ class BOTAN_DLL PK_Encryptor_EME : public PK_Encryptor { public: size_t maximum_input_size() const; /** * Construct an instance. * @param key the key to use inside the decryptor * @param eme the EME to use */ PK_Encryptor_EME(const Public_Key& key, const std::string& eme); ~PK_Encryptor_EME() { delete op; delete eme; } private: SecureVector enc(const byte[], size_t, RandomNumberGenerator& rng) const; PK_Ops::Encryption* op; const EME* eme; }; /** * Decryption with an MR algorithm and an EME. */ class BOTAN_DLL PK_Decryptor_EME : public PK_Decryptor { public: /** * Construct an instance. * @param key the key to use inside the encryptor * @param eme the EME to use */ PK_Decryptor_EME(const Private_Key& key, const std::string& eme); ~PK_Decryptor_EME() { delete op; delete eme; } private: SecureVector dec(const byte[], size_t) const; PK_Ops::Decryption* op; const EME* eme; }; /* * Typedefs for compatability with 1.8 */ typedef PK_Encryptor_EME PK_Encryptor_MR_with_EME; typedef PK_Decryptor_EME PK_Decryptor_MR_with_EME; } #endif Botan-1.10.12/src/pubkey/pubkey_enums.cpp0000664000175000017500000000175412654331322020073 0ustar jackjack00000000000000/* * KeyUsage * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { namespace BER { /* * Decode a BER encoded KeyUsage */ void decode(BER_Decoder& source, Key_Constraints& key_usage) { BER_Object obj = source.get_next_object(); if(obj.type_tag != BIT_STRING || obj.class_tag != UNIVERSAL) throw BER_Bad_Tag("Bad tag for usage constraint", obj.type_tag, obj.class_tag); if(obj.value.size() != 2 && obj.value.size() != 3) throw BER_Decoding_Error("Bad size for BITSTRING in usage constraint"); if(obj.value[0] >= 8) throw BER_Decoding_Error("Invalid unused bits in usage constraint"); const byte mask = (0xFF << obj.value[0]); obj.value[obj.value.size()-1] &= mask; u16bit usage = 0; for(size_t j = 1; j != obj.value.size(); ++j) usage = (obj.value[j] << 8) | usage; key_usage = Key_Constraints(usage); } } } Botan-1.10.12/src/pubkey/pubkey_enums.h0000664000175000017500000000242212654331322017531 0ustar jackjack00000000000000/* * Enumerations * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ENUMS_H__ #define BOTAN_ENUMS_H__ #include namespace Botan { /** * X.509v3 Key Constraints. */ enum Key_Constraints { NO_CONSTRAINTS = 0, DIGITAL_SIGNATURE = 32768, NON_REPUDIATION = 16384, KEY_ENCIPHERMENT = 8192, DATA_ENCIPHERMENT = 4096, KEY_AGREEMENT = 2048, KEY_CERT_SIGN = 1024, CRL_SIGN = 512, ENCIPHER_ONLY = 256, DECIPHER_ONLY = 128 }; /** * BER Decoding Function for key constraints */ namespace BER { void BOTAN_DLL decode(BER_Decoder&, Key_Constraints&); } /** * X.509v2 CRL Reason Code. */ enum CRL_Code { UNSPECIFIED = 0, KEY_COMPROMISE = 1, CA_COMPROMISE = 2, AFFILIATION_CHANGED = 3, SUPERSEDED = 4, CESSATION_OF_OPERATION = 5, CERTIFICATE_HOLD = 6, REMOVE_FROM_CRL = 8, PRIVLEDGE_WITHDRAWN = 9, AA_COMPROMISE = 10, DELETE_CRL_ENTRY = 0xFF00, OCSP_GOOD = 0xFF01, OCSP_UNKNOWN = 0xFF02 }; /* * Various Other Enumerations */ /** * The two types of X509 encoding supported by Botan. */ enum X509_Encoding { RAW_BER, PEM }; } #endif Botan-1.10.12/src/pubkey/rsa/info.txt0000664000175000017500000000011112654331322017124 0ustar jackjack00000000000000define RSA if_algo keypair libstate numbertheory Botan-1.10.12/src/pubkey/rsa/rsa.cpp0000664000175000017500000000547712654331322016745 0ustar jackjack00000000000000/* * RSA * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { /* * Create a RSA private key */ RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng, size_t bits, size_t exp) { if(bits < 512) throw Invalid_Argument(algo_name() + ": Can't make a key that is only " + to_string(bits) + " bits long"); if(exp < 3 || exp % 2 == 0) throw Invalid_Argument(algo_name() + ": Invalid encryption exponent"); e = exp; do { p = random_prime(rng, (bits + 1) / 2, e); q = random_prime(rng, bits - p.bits(), e); n = p * q; } while(n.bits() != bits); d = inverse_mod(e, lcm(p - 1, q - 1)); d1 = d % (p - 1); d2 = d % (q - 1); c = inverse_mod(q, p); gen_check(rng); } /* * Check Private RSA Parameters */ bool RSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!IF_Scheme_PrivateKey::check_key(rng, strong)) return false; if(!strong) return true; if((e * d) % lcm(p - 1, q - 1) != 1) return false; return KeyPair::signature_consistency_check(rng, *this, "EMSA4(SHA-1)"); } RSA_Private_Operation::RSA_Private_Operation(const RSA_PrivateKey& rsa) : n(rsa.get_n()), q(rsa.get_q()), c(rsa.get_c()), powermod_e_n(rsa.get_e(), rsa.get_n()), powermod_d1_p(rsa.get_d1(), rsa.get_p()), powermod_d2_q(rsa.get_d2(), rsa.get_q()), mod_p(rsa.get_p()) { BigInt k(global_state().global_rng(), n.bits() - 1); blinder = Blinder(powermod_e_n(k), inverse_mod(k, n), n); } BigInt RSA_Private_Operation::private_op(const BigInt& m) const { if(m >= n) throw Invalid_Argument("RSA private op - input is too large"); BigInt j1 = powermod_d1_p(m); BigInt j2 = powermod_d2_q(m); j1 = mod_p.reduce(sub_mul(j1, j2, c)); return mul_add(j1, q, j2); } SecureVector RSA_Private_Operation::sign(const byte msg[], size_t msg_len, RandomNumberGenerator&) { /* We don't check signatures against powermod_e_n here because PK_Signer checks verification consistency for all signature algorithms. */ BigInt m(msg, msg_len); BigInt x = blinder.unblind(private_op(blinder.blind(m))); return BigInt::encode_1363(x, n.bytes()); } /* * RSA Decryption Operation */ SecureVector RSA_Private_Operation::decrypt(const byte msg[], size_t msg_len) { BigInt m(msg, msg_len); BigInt x = blinder.unblind(private_op(blinder.blind(m))); BOTAN_ASSERT(m == powermod_e_n(x), "RSA private op failed consistency check"); return BigInt::encode(x); } } Botan-1.10.12/src/pubkey/rsa/rsa.h0000664000175000017500000001037512654331322016403 0ustar jackjack00000000000000/* * RSA * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RSA_H__ #define BOTAN_RSA_H__ #include #include #include #include namespace Botan { /** * RSA Public Key */ class BOTAN_DLL RSA_PublicKey : public virtual IF_Scheme_PublicKey { public: std::string algo_name() const { return "RSA"; } RSA_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : IF_Scheme_PublicKey(alg_id, key_bits) {} /** * Create a RSA_PublicKey * @arg n the modulus * @arg e the exponent */ RSA_PublicKey(const BigInt& n, const BigInt& e) : IF_Scheme_PublicKey(n, e) {} protected: RSA_PublicKey() {} }; /** * RSA Private Key */ class BOTAN_DLL RSA_PrivateKey : public RSA_PublicKey, public IF_Scheme_PrivateKey { public: bool check_key(RandomNumberGenerator& rng, bool) const; RSA_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng) : IF_Scheme_PrivateKey(rng, alg_id, key_bits) {} /** * Construct a private key from the specified parameters. * @param rng a random number generator * @param p the first prime * @param q the second prime * @param e the exponent * @param d if specified, this has to be d with * exp * d = 1 mod (p - 1, q - 1). Leave it as 0 if you wish to * the constructor to calculate it. * @param n if specified, this must be n = p * q. Leave it as 0 * if you wish to the constructor to calculate it. */ RSA_PrivateKey(RandomNumberGenerator& rng, const BigInt& p, const BigInt& q, const BigInt& e, const BigInt& d = 0, const BigInt& n = 0) : IF_Scheme_PrivateKey(rng, p, q, e, d, n) {} /** * Create a new private key with the specified bit length * @param rng the random number generator to use * @param bits the desired bit length of the private key * @param exp the public exponent to be used */ RSA_PrivateKey(RandomNumberGenerator& rng, size_t bits, size_t exp = 65537); }; /** * RSA private (decrypt/sign) operation */ class BOTAN_DLL RSA_Private_Operation : public PK_Ops::Signature, public PK_Ops::Decryption { public: RSA_Private_Operation(const RSA_PrivateKey& rsa); size_t max_input_bits() const { return (n.bits() - 1); } SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng); SecureVector decrypt(const byte msg[], size_t msg_len); private: BigInt private_op(const BigInt& m) const; const BigInt& n; const BigInt& q; const BigInt& c; Fixed_Exponent_Power_Mod powermod_e_n, powermod_d1_p, powermod_d2_q; Modular_Reducer mod_p; Blinder blinder; }; /** * RSA public (encrypt/verify) operation */ class BOTAN_DLL RSA_Public_Operation : public PK_Ops::Verification, public PK_Ops::Encryption { public: RSA_Public_Operation(const RSA_PublicKey& rsa) : n(rsa.get_n()), powermod_e_n(rsa.get_e(), rsa.get_n()) {} size_t max_input_bits() const { return (n.bits() - 1); } bool with_recovery() const { return true; } SecureVector encrypt(const byte msg[], size_t msg_len, RandomNumberGenerator&) { BigInt m(msg, msg_len); return BigInt::encode_1363(public_op(m), n.bytes()); } SecureVector verify_mr(const byte msg[], size_t msg_len) { BigInt m(msg, msg_len); return BigInt::encode(public_op(m)); } private: BigInt public_op(const BigInt& m) const { if(m >= n) throw Invalid_Argument("RSA public op - input is too large"); return powermod_e_n(m); } const BigInt& n; Fixed_Exponent_Power_Mod powermod_e_n; }; } #endif Botan-1.10.12/src/pubkey/rw/info.txt0000664000175000017500000000011012654331322016766 0ustar jackjack00000000000000define RW if_algo keypair libstate numbertheory Botan-1.10.12/src/pubkey/rw/rw.cpp0000664000175000017500000000565612654331322016452 0ustar jackjack00000000000000/* * Rabin-Williams * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * Create a Rabin-Williams private key */ RW_PrivateKey::RW_PrivateKey(RandomNumberGenerator& rng, size_t bits, size_t exp) { if(bits < 512) throw Invalid_Argument(algo_name() + ": Can't make a key that is only " + to_string(bits) + " bits long"); if(exp < 2 || exp % 2 == 1) throw Invalid_Argument(algo_name() + ": Invalid encryption exponent"); e = exp; do { p = random_prime(rng, (bits + 1) / 2, e / 2, 3, 4); q = random_prime(rng, bits - p.bits(), e / 2, ((p % 8 == 3) ? 7 : 3), 8); n = p * q; } while(n.bits() != bits); d = inverse_mod(e, lcm(p - 1, q - 1) >> 1); d1 = d % (p - 1); d2 = d % (q - 1); c = inverse_mod(q, p); gen_check(rng); } /* * Check Private Rabin-Williams Parameters */ bool RW_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!IF_Scheme_PrivateKey::check_key(rng, strong)) return false; if(!strong) return true; if((e * d) % (lcm(p - 1, q - 1) / 2) != 1) return false; return KeyPair::signature_consistency_check(rng, *this, "EMSA2(SHA-1)"); } RW_Signature_Operation::RW_Signature_Operation(const RW_PrivateKey& rw) : n(rw.get_n()), e(rw.get_e()), q(rw.get_q()), c(rw.get_c()), powermod_d1_p(rw.get_d1(), rw.get_p()), powermod_d2_q(rw.get_d2(), rw.get_q()), mod_p(rw.get_p()) { } SecureVector RW_Signature_Operation::sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) { if(!blinder.initialized()) { BigInt k(rng, n.bits() / 2); blinder = Blinder(power_mod(k, e, n), inverse_mod(k, n), n); } BigInt i(msg, msg_len); if(i >= n || i % 16 != 12) throw Invalid_Argument("Rabin-Williams: invalid input"); if(jacobi(i, n) != 1) i >>= 1; i = blinder.blind(i); BigInt j1 = powermod_d1_p(i); BigInt j2 = powermod_d2_q(i); j1 = mod_p.reduce(sub_mul(j1, j2, c)); BigInt r = blinder.unblind(mul_add(j1, q, j2)); r = std::min(r, n - r); return BigInt::encode_1363(r, n.bytes()); } SecureVector RW_Verification_Operation::verify_mr(const byte msg[], size_t msg_len) { BigInt m(msg, msg_len); if((m > (n >> 1)) || m.is_negative()) throw Invalid_Argument("RW signature verification: m > n / 2 || m < 0"); BigInt r = powermod_e_n(m); if(r % 16 == 12) return BigInt::encode(r); if(r % 8 == 6) return BigInt::encode(2*r); r = n - r; if(r % 16 == 12) return BigInt::encode(r); if(r % 8 == 6) return BigInt::encode(2*r); throw Invalid_Argument("RW signature verification: Invalid signature"); } } Botan-1.10.12/src/pubkey/rw/rw.h0000664000175000017500000000522612654331322016110 0ustar jackjack00000000000000/* * Rabin-Williams * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RW_H__ #define BOTAN_RW_H__ #include #include #include #include namespace Botan { /** * Rabin-Williams Public Key */ class BOTAN_DLL RW_PublicKey : public virtual IF_Scheme_PublicKey { public: std::string algo_name() const { return "RW"; } RW_PublicKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits) : IF_Scheme_PublicKey(alg_id, key_bits) {} RW_PublicKey(const BigInt& mod, const BigInt& exponent) : IF_Scheme_PublicKey(mod, exponent) {} protected: RW_PublicKey() {} }; /** * Rabin-Williams Private Key */ class BOTAN_DLL RW_PrivateKey : public RW_PublicKey, public IF_Scheme_PrivateKey { public: RW_PrivateKey(const AlgorithmIdentifier& alg_id, const MemoryRegion& key_bits, RandomNumberGenerator& rng) : IF_Scheme_PrivateKey(rng, alg_id, key_bits) {} RW_PrivateKey(RandomNumberGenerator& rng, const BigInt& p, const BigInt& q, const BigInt& e, const BigInt& d = 0, const BigInt& n = 0) : IF_Scheme_PrivateKey(rng, p, q, e, d, n) {} RW_PrivateKey(RandomNumberGenerator& rng, size_t bits, size_t = 2); bool check_key(RandomNumberGenerator& rng, bool) const; }; /** * Rabin-Williams Signature Operation */ class BOTAN_DLL RW_Signature_Operation : public PK_Ops::Signature { public: RW_Signature_Operation(const RW_PrivateKey& rw); size_t max_input_bits() const { return (n.bits() - 1); } SecureVector sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng); private: const BigInt& n; const BigInt& e; const BigInt& q; const BigInt& c; Fixed_Exponent_Power_Mod powermod_d1_p, powermod_d2_q; Modular_Reducer mod_p; Blinder blinder; }; /** * Rabin-Williams Verification Operation */ class BOTAN_DLL RW_Verification_Operation : public PK_Ops::Verification { public: RW_Verification_Operation(const RW_PublicKey& rw) : n(rw.get_n()), powermod_e_n(rw.get_e(), rw.get_n()) {} size_t max_input_bits() const { return (n.bits() - 1); } bool with_recovery() const { return true; } SecureVector verify_mr(const byte msg[], size_t msg_len); private: const BigInt& n; Fixed_Exponent_Power_Mod powermod_e_n; }; } #endif Botan-1.10.12/src/pubkey/workfactor.cpp0000664000175000017500000000251312654331322017540 0ustar jackjack00000000000000/* * Public Key Work Factor Functions * (C) 1999-2007,2012 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { size_t dl_work_factor(size_t bits) { /* Based on GNFS work factors. Constant is 1.43 times the asymptotic value; I'm not sure but I believe that came from a paper on 'real world' runtimes, but I don't remember where now. Sample return values: |512| -> 64 |1024| -> 86 |1536| -> 102 |2048| -> 116 |3072| -> 138 |4096| -> 155 |8192| -> 206 For DL algos, we use an exponent of twice the size of the result; the assumption is that an arbitrary discrete log on a group of size bits would take about 2^n effort, and thus using an exponent of size 2^(2*n) implies that all available attacks are about as easy (as e.g Pollard's kangaroo algorithm can compute the DL in sqrt(x) operations) while minimizing the exponent size for performance reasons. */ const size_t MIN_WORKFACTOR = 64; // approximates natural logarithm of p const double log_p = bits / 1.4426; const double strength = 2.76 * std::pow(log_p, 1.0/3.0) * std::pow(std::log(log_p), 2.0/3.0); return std::max(static_cast(strength), MIN_WORKFACTOR); } } Botan-1.10.12/src/pubkey/workfactor.h0000664000175000017500000000067012654331322017207 0ustar jackjack00000000000000/* * Public Key Work Factor Functions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_WORKFACTOR_H__ #define BOTAN_WORKFACTOR_H__ #include namespace Botan { /** * Estimate work factor for discrete logarithm * @param prime_group_size size of the group in bits * @return estimated security level for this group */ size_t dl_work_factor(size_t prime_group_size); } #endif Botan-1.10.12/src/pubkey/x509_key.cpp0000664000175000017500000000573312654331322016743 0ustar jackjack00000000000000/* * X.509 Public Key * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include #include #include namespace Botan { namespace X509 { MemoryVector BER_encode(const Public_Key& key) { return DER_Encoder() .start_cons(SEQUENCE) .encode(key.algorithm_identifier()) .encode(key.x509_subject_public_key(), BIT_STRING) .end_cons() .get_contents(); } /* * PEM encode a X.509 public key */ std::string PEM_encode(const Public_Key& key) { return PEM_Code::encode(X509::BER_encode(key), "PUBLIC KEY"); } /* * Extract a public key and return it */ Public_Key* load_key(DataSource& source) { try { AlgorithmIdentifier alg_id; MemoryVector key_bits; if(ASN1::maybe_BER(source) && !PEM_Code::matches(source)) { BER_Decoder(source) .start_cons(SEQUENCE) .decode(alg_id) .decode(key_bits, BIT_STRING) .verify_end() .end_cons(); } else { DataSource_Memory ber( PEM_Code::decode_check_label(source, "PUBLIC KEY") ); BER_Decoder(ber) .start_cons(SEQUENCE) .decode(alg_id) .decode(key_bits, BIT_STRING) .verify_end() .end_cons(); } if(key_bits.empty()) throw Decoding_Error("X.509 public key decoding failed"); return make_public_key(alg_id, key_bits); } catch(Decoding_Error) { throw Decoding_Error("X.509 public key decoding failed"); } } /* * Extract a public key and return it */ Public_Key* load_key(const std::string& fsname) { DataSource_Stream source(fsname, true); return X509::load_key(source); } /* * Extract a public key and return it */ Public_Key* load_key(const MemoryRegion& mem) { DataSource_Memory source(mem); return X509::load_key(source); } /* * Make a copy of this public key */ Public_Key* copy_key(const Public_Key& key) { DataSource_Memory source(PEM_encode(key)); return X509::load_key(source); } /* * Find the allowable key constraints */ Key_Constraints find_constraints(const Public_Key& pub_key, Key_Constraints limits) { const std::string name = pub_key.algo_name(); size_t constraints = 0; if(name == "DH" || name == "ECDH") constraints |= KEY_AGREEMENT; if(name == "RSA" || name == "ElGamal") constraints |= KEY_ENCIPHERMENT | DATA_ENCIPHERMENT; if(name == "RSA" || name == "RW" || name == "NR" || name == "DSA" || name == "ECDSA") constraints |= DIGITAL_SIGNATURE | NON_REPUDIATION; if(limits) constraints &= limits; return Key_Constraints(constraints); } } } Botan-1.10.12/src/pubkey/x509_key.h0000664000175000017500000000467612654331322016415 0ustar jackjack00000000000000/* * X.509 Public Key * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_X509_PUBLIC_KEY_H__ #define BOTAN_X509_PUBLIC_KEY_H__ #include #include #include #include #include namespace Botan { /** * This namespace contains functions for handling X.509 public keys */ namespace X509 { /** * BER encode a key * @param key the public key to encode * @return BER encoding of this key */ BOTAN_DLL MemoryVector BER_encode(const Public_Key& key); /** * PEM encode a public key into a string. * @param key the key to encode * @return PEM encoded key */ BOTAN_DLL std::string PEM_encode(const Public_Key& key); /** * Create a public key from a data source. * @param source the source providing the DER or PEM encoded key * @return new public key object */ BOTAN_DLL Public_Key* load_key(DataSource& source); /** * Create a public key from a file * @param filename pathname to the file to load * @return new public key object */ BOTAN_DLL Public_Key* load_key(const std::string& filename); /** * Create a public key from a memory region. * @param enc the memory region containing the DER or PEM encoded key * @return new public key object */ BOTAN_DLL Public_Key* load_key(const MemoryRegion& enc); /** * Copy a key. * @param key the public key to copy * @return new public key object */ BOTAN_DLL Public_Key* copy_key(const Public_Key& key); /** * Create the key constraints for a specific public key. * @param pub_key the public key from which the basic set of * constraints to be placed in the return value is derived * @param limits additional limits that will be incorporated into the * return value * @return combination of key type specific constraints and * additional limits */ BOTAN_DLL Key_Constraints find_constraints(const Public_Key& pub_key, Key_Constraints limits); /** * Encode a key into a pipe. * @deprecated Use PEM_encode or BER_encode instead * * @param key the public key to encode * @param pipe the pipe to feed the encoded key into * @param encoding the encoding type to use */ BOTAN_DEPRECATED("Use PEM_encode or BER_encode") inline void encode(const Public_Key& key, Pipe& pipe, X509_Encoding encoding = PEM) { if(encoding == PEM) pipe.write(X509::PEM_encode(key)); else pipe.write(X509::BER_encode(key)); } } } #endif Botan-1.10.12/src/rng/auto_rng/auto_rng.h0000664000175000017500000000174412654331322017754 0ustar jackjack00000000000000/* * Auto Seeded RNG * (C) 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_AUTO_SEEDING_RNG_H__ #define BOTAN_AUTO_SEEDING_RNG_H__ #include #include #include namespace Botan { /** * An automatically seeded PRNG */ class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator { public: void randomize(byte out[], size_t len) { rng->randomize(out, len); } bool is_seeded() const { return rng->is_seeded(); } void clear() { rng->clear(); } std::string name() const { return rng->name(); } void reseed(size_t poll_bits = 256) { rng->reseed(poll_bits); } void add_entropy_source(EntropySource* es) { rng->add_entropy_source(es); } void add_entropy(const byte in[], size_t len) { rng->add_entropy(in, len); } AutoSeeded_RNG() { rng = &global_state().global_rng(); } private: RandomNumberGenerator* rng; }; } #endif Botan-1.10.12/src/rng/auto_rng/info.txt0000664000175000017500000000007112654331322017451 0ustar jackjack00000000000000define AUTO_SEEDING_RNG libstate Botan-1.10.12/src/rng/hmac_rng/hmac_rng.cpp0000664000175000017500000001372112654331322020205 0ustar jackjack00000000000000/* * HMAC_RNG * (C) 2008-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { namespace { void hmac_prf(MessageAuthenticationCode* prf, MemoryRegion& K, u32bit& counter, const std::string& label) { prf->update(K); prf->update(label); prf->update_be(counter); prf->update_be(get_nanoseconds_clock()); prf->final(&K[0]); ++counter; } } /* * Generate a buffer of random bytes */ void HMAC_RNG::randomize(byte out[], size_t length) { if(!is_seeded()) throw PRNG_Unseeded(name()); /* HMAC KDF as described in E-t-E, using a CTXinfo of "rng" */ while(length) { hmac_prf(prf, K, counter, "rng"); const size_t copied = std::min(K.size(), length); copy_mem(out, &K[0], copied); out += copied; length -= copied; output_since_reseed += copied; if(output_since_reseed >= BOTAN_RNG_MAX_OUTPUT_BEFORE_RESEED) reseed(BOTAN_RNG_RESEED_POLL_BITS); } } /* * Poll for entropy and reset the internal keys */ void HMAC_RNG::reseed(size_t poll_bits) { /* Using the terminology of E-t-E, XTR is the MAC function (normally HMAC) seeded with XTS (below) and we form SKM, the key material, by fast polling each source, and then slow polling as many as we think we need (in the following loop), and feeding all of the poll results, along with any optional user input, along with, finally, feedback of the current PRK value, into the extractor function. */ Entropy_Accumulator_BufferedComputation accum(*extractor, poll_bits); if(!entropy_sources.empty()) { size_t poll_attempt = 0; while(!accum.polling_goal_achieved() && poll_attempt < poll_bits) { const size_t src_idx = poll_attempt % entropy_sources.size(); entropy_sources[src_idx]->poll(accum); ++poll_attempt; } } /* * It is necessary to feed forward poll data. Otherwise, a good poll * (collecting a large amount of conditional entropy) followed by a * bad one (collecting little) would be unsafe. Do this by * generating new PRF outputs using the previous key and feeding * them into the extractor function. * * Cycle the RNG once (CTXinfo="rng"), then generate a new PRF * output using the CTXinfo "reseed". Provide these values as input * to the extractor function. */ hmac_prf(prf, K, counter, "rng"); extractor->update(K); // K is the CTXinfo=rng PRF output hmac_prf(prf, K, counter, "reseed"); extractor->update(K); // K is the CTXinfo=reseed PRF output /* Now derive the new PRK using everything that has been fed into the extractor, and set the PRF key to that */ prf->set_key(extractor->final()); // Now generate a new PRF output to use as the XTS extractor salt hmac_prf(prf, K, counter, "xts"); extractor->set_key(K); // Reset state zeroise(K); counter = 0; output_since_reseed = 0; /* Consider ourselves seeded once we've collected an estimated 128 bits of entropy in a single poll. */ if(seeded == false && accum.bits_collected() >= 128) seeded = true; } void HMAC_RNG::add_entropy(const byte input[], size_t length) { // Add user-supplied whatever to the extractor input, and then reseed extractor->update(input, length); reseed(BOTAN_RNG_RESEED_POLL_BITS); } /* * Add another entropy source to the list */ void HMAC_RNG::add_entropy_source(EntropySource* src) { entropy_sources.push_back(src); } /* * Clear memory of sensitive data */ void HMAC_RNG::clear() { extractor->clear(); prf->clear(); zeroise(K); counter = 0; output_since_reseed = 0; seeded = false; } /* * Return the name of this type */ std::string HMAC_RNG::name() const { return "HMAC_RNG(" + extractor->name() + "," + prf->name() + ")"; } /* * HMAC_RNG Constructor */ HMAC_RNG::HMAC_RNG(MessageAuthenticationCode* extractor_mac, MessageAuthenticationCode* prf_mac) : extractor(extractor_mac), prf(prf_mac) { if(!prf->valid_keylength(extractor->output_length()) || !extractor->valid_keylength(prf->output_length())) throw Invalid_Argument("HMAC_RNG: Bad algo combination " + extractor->name() + " and " + prf->name()); // First PRF inputs are all zero, as specified in section 2 K.resize(prf->output_length()); counter = 0; output_since_reseed = 0; seeded = false; /* Normally we want to feedback PRF output into the input to the extractor function to ensure a single bad poll does not damage the RNG, but obviously that is meaningless to do on the first poll. We will want to use the PRF before we set the first key (in reseed), and it is a pain to keep track if it is set or not. Since the first time it doesn't matter anyway, just set the PRF key to constant zero: randomize() will not produce output unless is_seeded() returns true, and that will only be the case if the estimated entropy counter is high enough. That variable is only set when a reseeding is performed. */ MemoryVector prf_key(extractor->output_length()); prf->set_key(prf_key); /* Use PRF("Botan HMAC_RNG XTS") as the intitial XTS key. This will be used during the first extraction sequence; XTS values after this one are generated using the PRF. If I understand the E-t-E paper correctly (specifically Section 4), using this fixed extractor key is safe to do. */ extractor->set_key(prf->process("Botan HMAC_RNG XTS")); } /* * HMAC_RNG Destructor */ HMAC_RNG::~HMAC_RNG() { delete extractor; delete prf; std::for_each(entropy_sources.begin(), entropy_sources.end(), del_fun()); counter = 0; } } Botan-1.10.12/src/rng/hmac_rng/hmac_rng.h0000664000175000017500000000277012654331322017654 0ustar jackjack00000000000000/* * HMAC RNG * (C) 2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_HMAC_RNG_H__ #define BOTAN_HMAC_RNG_H__ #include #include #include namespace Botan { /** HMAC_RNG - based on the design described in "On Extract-then-Expand Key Derivation Functions and an HMAC-based KDF" by Hugo Krawczyk (henceforce, 'E-t-E') However it actually can be parameterized with any two MAC functions, not restricted to HMAC (this variation is also described in Krawczyk's paper), for instance one could use HMAC(SHA-512) as the extractor and CMAC(AES-256) as the PRF. */ class BOTAN_DLL HMAC_RNG : public RandomNumberGenerator { public: void randomize(byte buf[], size_t len); bool is_seeded() const { return seeded; } void clear(); std::string name() const; void reseed(size_t poll_bits); void add_entropy_source(EntropySource* es); void add_entropy(const byte[], size_t); /** * @param extractor a MAC used for extracting the entropy * @param prf a MAC used as a PRF using HKDF construction */ HMAC_RNG(MessageAuthenticationCode* extractor, MessageAuthenticationCode* prf); ~HMAC_RNG(); private: MessageAuthenticationCode* extractor; MessageAuthenticationCode* prf; std::vector entropy_sources; bool seeded; SecureVector K, io_buffer; size_t output_since_reseed; u32bit counter; }; } #endif Botan-1.10.12/src/rng/hmac_rng/info.txt0000664000175000017500000000005412654331322017412 0ustar jackjack00000000000000define HMAC_RNG mac Botan-1.10.12/src/rng/info.txt0000664000175000017500000000003712654331322015635 0ustar jackjack00000000000000 entropy Botan-1.10.12/src/rng/randpool/info.txt0000664000175000017500000000006212654331322017451 0ustar jackjack00000000000000define RANDPOOL block mac Botan-1.10.12/src/rng/randpool/randpool.cpp0000664000175000017500000001030012654331322020273 0ustar jackjack00000000000000/* * Randpool * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { namespace { /* * PRF based on a MAC */ enum RANDPOOL_PRF_TAG { CIPHER_KEY = 0, MAC_KEY = 1, GEN_OUTPUT = 2 }; } /* * Generate a buffer of random bytes */ void Randpool::randomize(byte out[], size_t length) { if(!is_seeded()) throw PRNG_Unseeded(name()); update_buffer(); while(length) { const size_t copied = std::min(length, buffer.size()); copy_mem(out, &buffer[0], copied); out += copied; length -= copied; update_buffer(); } } /* * Refill the output buffer */ void Randpool::update_buffer() { for(size_t i = 0; i != counter.size(); ++i) if(++counter[i]) break; mac->update(static_cast(GEN_OUTPUT)); mac->update(counter); SecureVector mac_val = mac->final(); for(size_t i = 0; i != mac_val.size(); ++i) buffer[i % buffer.size()] ^= mac_val[i]; cipher->encrypt(buffer); if(counter[0] % ITERATIONS_BEFORE_RESEED == 0) mix_pool(); } /* * Mix the entropy pool */ void Randpool::mix_pool() { const size_t BLOCK_SIZE = cipher->block_size(); mac->update(static_cast(MAC_KEY)); mac->update(pool); mac->set_key(mac->final()); mac->update(static_cast(CIPHER_KEY)); mac->update(pool); cipher->set_key(mac->final()); xor_buf(pool, buffer, BLOCK_SIZE); cipher->encrypt(pool); for(size_t i = 1; i != POOL_BLOCKS; ++i) { const byte* previous_block = &pool[BLOCK_SIZE*(i-1)]; byte* this_block = &pool[BLOCK_SIZE*i]; xor_buf(this_block, previous_block, BLOCK_SIZE); cipher->encrypt(this_block); } update_buffer(); } /* * Reseed the internal state */ void Randpool::reseed(size_t poll_bits) { Entropy_Accumulator_BufferedComputation accum(*mac, poll_bits); if(!entropy_sources.empty()) { size_t poll_attempt = 0; while(!accum.polling_goal_achieved() && poll_attempt < poll_bits) { entropy_sources[poll_attempt % entropy_sources.size()]->poll(accum); ++poll_attempt; } } SecureVector mac_val = mac->final(); xor_buf(pool, mac_val, mac_val.size()); mix_pool(); if(accum.bits_collected() >= poll_bits) seeded = true; } /* * Add user-supplied entropy */ void Randpool::add_entropy(const byte input[], size_t length) { SecureVector mac_val = mac->process(input, length); xor_buf(pool, mac_val, mac_val.size()); mix_pool(); if(length) seeded = true; } /* * Add another entropy source to the list */ void Randpool::add_entropy_source(EntropySource* src) { entropy_sources.push_back(src); } /* * Clear memory of sensitive data */ void Randpool::clear() { cipher->clear(); mac->clear(); zeroise(pool); zeroise(buffer); zeroise(counter); seeded = false; } /* * Return the name of this type */ std::string Randpool::name() const { return "Randpool(" + cipher->name() + "," + mac->name() + ")"; } /* * Randpool Constructor */ Randpool::Randpool(BlockCipher* cipher_in, MessageAuthenticationCode* mac_in, size_t pool_blocks, size_t iter_before_reseed) : ITERATIONS_BEFORE_RESEED(iter_before_reseed), POOL_BLOCKS(pool_blocks), cipher(cipher_in), mac(mac_in) { const size_t BLOCK_SIZE = cipher->block_size(); const size_t OUTPUT_LENGTH = mac->output_length(); if(OUTPUT_LENGTH < BLOCK_SIZE || !cipher->valid_keylength(OUTPUT_LENGTH) || !mac->valid_keylength(OUTPUT_LENGTH)) { delete cipher; delete mac; throw Internal_Error("Randpool: Invalid algorithm combination"); } buffer.resize(BLOCK_SIZE); pool.resize(POOL_BLOCKS * BLOCK_SIZE); counter.resize(12); seeded = false; } /* * Randpool Destructor */ Randpool::~Randpool() { delete cipher; delete mac; std::for_each(entropy_sources.begin(), entropy_sources.end(), del_fun()); } } Botan-1.10.12/src/rng/randpool/randpool.h0000664000175000017500000000271312654331322017751 0ustar jackjack00000000000000/* * Randpool * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RANDPOOL_H__ #define BOTAN_RANDPOOL_H__ #include #include #include #include namespace Botan { /** * Randpool */ class BOTAN_DLL Randpool : public RandomNumberGenerator { public: void randomize(byte[], size_t); bool is_seeded() const { return seeded; } void clear(); std::string name() const; void reseed(size_t bits_to_collect); void add_entropy_source(EntropySource* es); void add_entropy(const byte input[], size_t length); /** * @param cipher a block cipher to use * @param mac a message authentication code to use * @param pool_blocks how many cipher blocks to use for the pool * @param iterations_before_reseed how many times we'll use the * internal state to generate output before reseeding */ Randpool(BlockCipher* cipher, MessageAuthenticationCode* mac, size_t pool_blocks = 32, size_t iterations_before_reseed = 128); ~Randpool(); private: void update_buffer(); void mix_pool(); size_t ITERATIONS_BEFORE_RESEED, POOL_BLOCKS; BlockCipher* cipher; MessageAuthenticationCode* mac; std::vector entropy_sources; SecureVector pool, buffer, counter; bool seeded; }; } #endif Botan-1.10.12/src/rng/rng.cpp0000664000175000017500000000121112654331322015426 0ustar jackjack00000000000000/* * Random Number Generator Base * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) #include #endif namespace Botan { /* * Get a single random byte */ byte RandomNumberGenerator::next_byte() { byte out; this->randomize(&out, 1); return out; } /* * Create and seed a new RNG object */ RandomNumberGenerator* RandomNumberGenerator::make_rng() { #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) return new AutoSeeded_RNG; #endif throw Algorithm_Not_Found("RandomNumberGenerator::make_rng - no RNG found"); } } Botan-1.10.12/src/rng/rng.h0000664000175000017500000000602612654331322015104 0ustar jackjack00000000000000/* * RandomNumberGenerator * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_RANDOM_NUMBER_GENERATOR_H__ #define BOTAN_RANDOM_NUMBER_GENERATOR_H__ #include #include #include namespace Botan { /** * This class represents a random number (RNG) generator object. */ class BOTAN_DLL RandomNumberGenerator { public: /** * Create a seeded and active RNG object for general application use */ static RandomNumberGenerator* make_rng(); /** * Randomize a byte array. * @param output the byte array to hold the random output. * @param length the length of the byte array output. */ virtual void randomize(byte output[], size_t length) = 0; /** * Return a random vector * @param bytes number of bytes in the result * @return randomized vector of length bytes */ SecureVector random_vec(size_t bytes) { SecureVector output(bytes); randomize(&output[0], output.size()); return output; } /** * Return a random byte * @return random byte */ byte next_byte(); /** * Check whether this RNG is seeded. * @return true if this RNG was already seeded, false otherwise. */ virtual bool is_seeded() const { return true; } /** * Clear all internally held values of this RNG. */ virtual void clear() = 0; /** * Return the name of this object */ virtual std::string name() const = 0; /** * Seed this RNG using the entropy sources it contains. * @param bits_to_collect is the number of bits of entropy to attempt to gather from the entropy sources */ virtual void reseed(size_t bits_to_collect) = 0; /** * Add this entropy source to the RNG object * @param source the entropy source which will be retained and used by RNG */ virtual void add_entropy_source(EntropySource* source) = 0; /** * Add entropy to this RNG. * @param in a byte array containg the entropy to be added * @param length the length of the byte array in */ virtual void add_entropy(const byte in[], size_t length) = 0; RandomNumberGenerator() {} virtual ~RandomNumberGenerator() {} private: RandomNumberGenerator(const RandomNumberGenerator&) {} RandomNumberGenerator& operator=(const RandomNumberGenerator&) { return (*this); } }; /** * Null/stub RNG - fails if you try to use it for anything */ class BOTAN_DLL Null_RNG : public RandomNumberGenerator { public: void randomize(byte[], size_t) { throw PRNG_Unseeded("Null_RNG"); } void clear() {} std::string name() const { return "Null_RNG"; } void reseed(size_t) {} bool is_seeded() const { return false; } void add_entropy(const byte[], size_t) {} void add_entropy_source(EntropySource* es) { delete es; } }; } #endif Botan-1.10.12/src/rng/x931_rng/info.txt0000664000175000017500000000005612654331322017210 0ustar jackjack00000000000000define X931_RNG block Botan-1.10.12/src/rng/x931_rng/x931_rng.cpp0000664000175000017500000000530012654331322017567 0ustar jackjack00000000000000/* * ANSI X9.31 RNG * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Generate a buffer of random bytes */ void ANSI_X931_RNG::randomize(byte out[], size_t length) { if(!is_seeded()) throw PRNG_Unseeded(name()); while(length) { if(position == R.size()) update_buffer(); const size_t copied = std::min(length, R.size() - position); copy_mem(out, &R[position], copied); out += copied; length -= copied; position += copied; } } /* * Refill the internal state */ void ANSI_X931_RNG::update_buffer() { const size_t BLOCK_SIZE = cipher->block_size(); SecureVector DT = prng->random_vec(BLOCK_SIZE); cipher->encrypt(DT); xor_buf(&R[0], &V[0], &DT[0], BLOCK_SIZE); cipher->encrypt(R); xor_buf(&V[0], &R[0], &DT[0], BLOCK_SIZE); cipher->encrypt(V); position = 0; } /* * Reset V and the cipher key with new values */ void ANSI_X931_RNG::rekey() { const size_t BLOCK_SIZE = cipher->block_size(); if(prng->is_seeded()) { cipher->set_key(prng->random_vec(cipher->maximum_keylength())); if(V.size() != BLOCK_SIZE) V.resize(BLOCK_SIZE); prng->randomize(&V[0], V.size()); update_buffer(); } } /* * Reseed the internal state */ void ANSI_X931_RNG::reseed(size_t poll_bits) { prng->reseed(poll_bits); rekey(); } /* * Add a entropy source to the underlying PRNG */ void ANSI_X931_RNG::add_entropy_source(EntropySource* src) { prng->add_entropy_source(src); } /* * Add some entropy to the underlying PRNG */ void ANSI_X931_RNG::add_entropy(const byte input[], size_t length) { prng->add_entropy(input, length); rekey(); } /* * Check if the the PRNG is seeded */ bool ANSI_X931_RNG::is_seeded() const { return (V.size() > 0); } /* * Clear memory of sensitive data */ void ANSI_X931_RNG::clear() { cipher->clear(); prng->clear(); zeroise(R); V.clear(); position = 0; } /* * Return the name of this type */ std::string ANSI_X931_RNG::name() const { return "X9.31(" + cipher->name() + ")"; } /* * ANSI X931 RNG Constructor */ ANSI_X931_RNG::ANSI_X931_RNG(BlockCipher* cipher_in, RandomNumberGenerator* prng_in) { if(!prng_in || !cipher_in) throw Invalid_Argument("ANSI_X931_RNG constructor: NULL arguments"); cipher = cipher_in; prng = prng_in; R.resize(cipher->block_size()); position = 0; } /* * ANSI X931 RNG Destructor */ ANSI_X931_RNG::~ANSI_X931_RNG() { delete cipher; delete prng; } } Botan-1.10.12/src/rng/x931_rng/x931_rng.h0000664000175000017500000000205612654331322017241 0ustar jackjack00000000000000/* * ANSI X9.31 RNG * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ANSI_X931_RNG_H__ #define BOTAN_ANSI_X931_RNG_H__ #include #include namespace Botan { /** * ANSI X9.31 RNG */ class BOTAN_DLL ANSI_X931_RNG : public RandomNumberGenerator { public: void randomize(byte[], size_t); bool is_seeded() const; void clear(); std::string name() const; void reseed(size_t poll_bits); void add_entropy_source(EntropySource*); void add_entropy(const byte[], size_t); /** * @param cipher the block cipher to use in this PRNG * @param rng the underlying PRNG for generating inputs * (eg, an HMAC_RNG) */ ANSI_X931_RNG(BlockCipher* cipher, RandomNumberGenerator* rng); ~ANSI_X931_RNG(); private: void rekey(); void update_buffer(); BlockCipher* cipher; RandomNumberGenerator* prng; SecureVector V, R; size_t position; }; } #endif Botan-1.10.12/src/selftest/info.txt0000664000175000017500000000011212654331322016672 0ustar jackjack00000000000000define SELFTESTS algo_factory filters core_engine Botan-1.10.12/src/selftest/selftest.cpp0000664000175000017500000002215012654331322017541 0ustar jackjack00000000000000/* * Startup Self Tests * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { /* * Perform a Known Answer Test */ bool test_filter_kat(Filter* filter, const std::string& input, const std::string& expected_output) { Pipe pipe(new Hex_Decoder, filter, new Hex_Encoder); pipe.process_msg(input); const std::string output = pipe.read_all_as_string(); return (output == expected_output); } } /* * Run a set of KATs */ std::map algorithm_kat(const SCAN_Name& algo_name, const std::map& vars, Algorithm_Factory& af) { const std::string& algo = algo_name.algo_name_and_args(); std::vector providers = af.providers_of(algo); std::map all_results; if(providers.empty()) // no providers, nothing to do return all_results; const std::string input = search_map(vars, std::string("input")); const std::string output = search_map(vars, std::string("output")); SymmetricKey key(search_map(vars, std::string("key"))); InitializationVector iv(search_map(vars, std::string("iv"))); for(size_t i = 0; i != providers.size(); ++i) { const std::string provider = providers[i]; if(const HashFunction* proto = af.prototype_hash_function(algo, provider)) { Filter* filt = new Hash_Filter(proto->clone()); all_results[provider] = test_filter_kat(filt, input, output); } else if(const MessageAuthenticationCode* proto = af.prototype_mac(algo, provider)) { Keyed_Filter* filt = new MAC_Filter(proto->clone(), key); all_results[provider] = test_filter_kat(filt, input, output); } else if(const StreamCipher* proto = af.prototype_stream_cipher(algo, provider)) { Keyed_Filter* filt = new StreamCipher_Filter(proto->clone()); filt->set_key(key); filt->set_iv(iv); all_results[provider] = test_filter_kat(filt, input, output); } else if(const BlockCipher* proto = af.prototype_block_cipher(algo, provider)) { Keyed_Filter* enc = get_cipher_mode(proto, ENCRYPTION, algo_name.cipher_mode(), algo_name.cipher_mode_pad()); Keyed_Filter* dec = get_cipher_mode(proto, DECRYPTION, algo_name.cipher_mode(), algo_name.cipher_mode_pad()); if(!enc || !dec) { delete enc; delete dec; continue; } enc->set_key(key); if(enc->valid_iv_length(iv.length())) enc->set_iv(iv); else if(!enc->valid_iv_length(0)) throw Invalid_IV_Length(algo, iv.length()); dec->set_key(key); if(dec->valid_iv_length(iv.length())) dec->set_iv(iv); else if(!dec->valid_iv_length(0)) throw Invalid_IV_Length(algo, iv.length()); bool enc_ok = test_filter_kat(enc, input, output); bool dec_ok = test_filter_kat(dec, output, input); all_results[provider] = enc_ok && dec_ok; } } return all_results; } namespace { void verify_results(const std::string& algo, const std::map& results) { for(std::map::const_iterator i = results.begin(); i != results.end(); ++i) { if(!i->second) throw Self_Test_Failure(algo + " self-test failed, provider "+ i->first); } } void hash_test(Algorithm_Factory& af, const std::string& name, const std::string& in, const std::string& out) { std::map vars; vars["input"] = in; vars["output"] = out; verify_results(name, algorithm_kat(name, vars, af)); } void mac_test(Algorithm_Factory& af, const std::string& name, const std::string& in, const std::string& out, const std::string& key) { std::map vars; vars["input"] = in; vars["output"] = out; vars["key"] = key; verify_results(name, algorithm_kat(name, vars, af)); } /* * Perform a KAT for a cipher */ void cipher_kat(Algorithm_Factory& af, const std::string& algo, const std::string& key_str, const std::string& iv_str, const std::string& in, const std::string& ecb_out, const std::string& cbc_out, const std::string& cfb_out, const std::string& ofb_out, const std::string& ctr_out) { SymmetricKey key(key_str); InitializationVector iv(iv_str); std::map vars; vars["key"] = key_str; vars["iv"] = iv_str; vars["input"] = in; std::map results; vars["output"] = ecb_out; verify_results(algo + "/ECB", algorithm_kat(algo + "/ECB", vars, af)); vars["output"] = cbc_out; verify_results(algo + "/CBC", algorithm_kat(algo + "/CBC/NoPadding", vars, af)); vars["output"] = cfb_out; verify_results(algo + "/CFB", algorithm_kat(algo + "/CFB", vars, af)); vars["output"] = ofb_out; verify_results(algo + "/OFB", algorithm_kat(algo + "/OFB", vars, af)); vars["output"] = ctr_out; verify_results(algo + "/CTR", algorithm_kat(algo + "/CTR-BE", vars, af)); } } /* * Perform Self Tests */ bool passes_self_tests(Algorithm_Factory& af) { try { confirm_startup_self_tests(af); } catch(Self_Test_Failure) { return false; } return true; } /* * Perform Self Tests */ void confirm_startup_self_tests(Algorithm_Factory& af) { cipher_kat(af, "DES", "0123456789ABCDEF", "1234567890ABCDEF", "4E6F77206973207468652074696D6520666F7220616C6C20", "3FA40E8A984D48156A271787AB8883F9893D51EC4B563B53", "E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F6", "F3096249C7F46E51A69E839B1A92F78403467133898EA622", "F3096249C7F46E5135F24A242EEB3D3F3D6D5BE3255AF8C3", "F3096249C7F46E51163A8CA0FFC94C27FA2F80F480B86F75"); cipher_kat(af, "TripleDES", "385D7189A5C3D485E1370AA5D408082B5CCCCB5E19F2D90E", "C141B5FCCD28DC8A", "6E1BD7C6120947A464A6AAB293A0F89A563D8D40D3461B68", "64EAAD4ACBB9CEAD6C7615E7C7E4792FE587D91F20C7D2F4", "6235A461AFD312973E3B4F7AA7D23E34E03371F8E8C376C9", "E26BA806A59B0330DE40CA38E77A3E494BE2B212F6DD624B", "E26BA806A59B03307DE2BCC25A08BA40A8BA335F5D604C62", "E26BA806A59B03303C62C2EFF32D3ACDD5D5F35EBCC53371"); cipher_kat(af, "AES-128", "2B7E151628AED2A6ABF7158809CF4F3C", "000102030405060708090A0B0C0D0E0F", "6BC1BEE22E409F96E93D7E117393172A" "AE2D8A571E03AC9C9EB76FAC45AF8E51", "3AD77BB40D7A3660A89ECAF32466EF97" "F5D3D58503B9699DE785895A96FDBAAF", "7649ABAC8119B246CEE98E9B12E9197D" "5086CB9B507219EE95DB113A917678B2", "3B3FD92EB72DAD20333449F8E83CFB4A" "C8A64537A0B3A93FCDE3CDAD9F1CE58B", "3B3FD92EB72DAD20333449F8E83CFB4A" "7789508D16918F03F53C52DAC54ED825", "3B3FD92EB72DAD20333449F8E83CFB4A" "010C041999E03F36448624483E582D0E"); hash_test(af, "SHA-1", "", "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"); hash_test(af, "SHA-1", "616263", "A9993E364706816ABA3E25717850C26C9CD0D89D"); hash_test(af, "SHA-1", "6162636462636465636465666465666765666768666768696768696A" "68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071", "84983E441C3BD26EBAAE4AA1F95129E5E54670F1"); mac_test(af, "HMAC(SHA-1)", "4869205468657265", "B617318655057264E28BC0B6FB378C8EF146BE00", "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B"); hash_test(af, "SHA-256", "", "E3B0C44298FC1C149AFBF4C8996FB924" "27AE41E4649B934CA495991B7852B855"); hash_test(af, "SHA-256", "616263", "BA7816BF8F01CFEA414140DE5DAE2223" "B00361A396177A9CB410FF61F20015AD"); hash_test(af, "SHA-256", "6162636462636465636465666465666765666768666768696768696A" "68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071", "248D6A61D20638B8E5C026930C3E6039" "A33CE45964FF2167F6ECEDD419DB06C1"); mac_test(af, "HMAC(SHA-256)", "4869205468657265", "198A607EB44BFBC69903A0F1CF2BBDC5" "BA0AA3F3D9AE3C1C7A3B1696A0B68CF7", "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B" "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B"); } } Botan-1.10.12/src/selftest/selftest.h0000664000175000017500000000234112654331322017206 0ustar jackjack00000000000000/* * Startup Self Test * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SELF_TESTS_H__ #define BOTAN_SELF_TESTS_H__ #include #include #include #include namespace Botan { /** * Run a set of self tests on some basic algorithms like AES and SHA-1 * @param af an algorithm factory * @throws Self_Test_Error if a failure occured */ BOTAN_DLL void confirm_startup_self_tests(Algorithm_Factory& af); /** * Run a set of self tests on some basic algorithms like AES and SHA-1 * @param af an algorithm factory * @returns false if a failure occured, otherwise true */ BOTAN_DLL bool passes_self_tests(Algorithm_Factory& af); /** * Run a set of algorithm KATs (known answer tests) * @param algo_name the algorithm we are testing * @param vars a set of input variables for this test, all hex encoded. Keys used: "input", "output", "key", and "iv" * @param af an algorithm factory * @returns map from provider name to test result for that provider */ BOTAN_DLL std::map algorithm_kat(const SCAN_Name& algo_name, const std::map& vars, Algorithm_Factory& af); } #endif Botan-1.10.12/src/simd/info.txt0000664000175000017500000000017212654331322016003 0ustar jackjack00000000000000define SIMD_32 simd_32.h simd_sse2|simd_altivec|simd_scalar Botan-1.10.12/src/simd/simd_32.h0000664000175000017500000000121512654331322015717 0ustar jackjack00000000000000/* * Lightweight wrappers for SIMD operations * (C) 2009,2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SIMD_32_H__ #define BOTAN_SIMD_32_H__ #include #if defined(BOTAN_HAS_SIMD_SSE2) #include namespace Botan { typedef SIMD_SSE2 SIMD_32; } #elif defined(BOTAN_HAS_SIMD_ALTIVEC) #include namespace Botan { typedef SIMD_Altivec SIMD_32; } #elif defined(BOTAN_HAS_SIMD_SCALAR) #include namespace Botan { typedef SIMD_Scalar SIMD_32; } #else #error "No SIMD module defined" #endif #endif Botan-1.10.12/src/simd/simd_altivec/info.txt0000664000175000017500000000015012654331322020442 0ustar jackjack00000000000000define SIMD_ALTIVEC need_isa altivec load_on dep simd_altivec.h Botan-1.10.12/src/simd/simd_altivec/simd_altivec.h0000664000175000017500000001223512654331322021571 0ustar jackjack00000000000000/* * Lightweight wrappers around AltiVec for 32-bit operations * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SIMD_ALTIVEC_H__ #define BOTAN_SIMD_ALTIVEC_H__ #if defined(BOTAN_TARGET_CPU_HAS_ALTIVEC) #include #include #include #undef vector #undef bool namespace Botan { class SIMD_Altivec { public: static bool enabled() { return CPUID::has_altivec(); } SIMD_Altivec(const u32bit B[4]) { reg = (__vector unsigned int){B[0], B[1], B[2], B[3]}; } SIMD_Altivec(u32bit B0, u32bit B1, u32bit B2, u32bit B3) { reg = (__vector unsigned int){B0, B1, B2, B3}; } SIMD_Altivec(u32bit B) { reg = (__vector unsigned int){B, B, B, B}; } static SIMD_Altivec load_le(const void* in) { const u32bit* in_32 = static_cast(in); __vector unsigned int R0 = vec_ld(0, in_32); __vector unsigned int R1 = vec_ld(12, in_32); __vector unsigned char perm = vec_lvsl(0, in_32); perm = vec_xor(perm, vec_splat_u8(3)); R0 = vec_perm(R0, R1, perm); return SIMD_Altivec(R0); } static SIMD_Altivec load_be(const void* in) { const u32bit* in_32 = static_cast(in); __vector unsigned int R0 = vec_ld(0, in_32); __vector unsigned int R1 = vec_ld(12, in_32); __vector unsigned char perm = vec_lvsl(0, in_32); R0 = vec_perm(R0, R1, perm); return SIMD_Altivec(R0); } void store_le(byte out[]) const { __vector unsigned char perm = vec_lvsl(0, (u32bit*)0); perm = vec_xor(perm, vec_splat_u8(3)); union { __vector unsigned int V; u32bit R[4]; } vec; vec.V = vec_perm(reg, reg, perm); Botan::store_be(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]); } void store_be(byte out[]) const { union { __vector unsigned int V; u32bit R[4]; } vec; vec.V = reg; Botan::store_be(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]); } void rotate_left(size_t rot) { __vector unsigned int rot_vec = (__vector unsigned int){rot, rot, rot, rot}; reg = vec_rl(reg, rot_vec); } void rotate_right(size_t rot) { rotate_left(32 - rot); } void operator+=(const SIMD_Altivec& other) { reg = vec_add(reg, other.reg); } SIMD_Altivec operator+(const SIMD_Altivec& other) const { return vec_add(reg, other.reg); } void operator-=(const SIMD_Altivec& other) { reg = vec_sub(reg, other.reg); } SIMD_Altivec operator-(const SIMD_Altivec& other) const { return vec_sub(reg, other.reg); } void operator^=(const SIMD_Altivec& other) { reg = vec_xor(reg, other.reg); } SIMD_Altivec operator^(const SIMD_Altivec& other) const { return vec_xor(reg, other.reg); } void operator|=(const SIMD_Altivec& other) { reg = vec_or(reg, other.reg); } SIMD_Altivec operator&(const SIMD_Altivec& other) { return vec_and(reg, other.reg); } void operator&=(const SIMD_Altivec& other) { reg = vec_and(reg, other.reg); } SIMD_Altivec operator<<(size_t shift) const { __vector unsigned int shift_vec = (__vector unsigned int){shift, shift, shift, shift}; return vec_sl(reg, shift_vec); } SIMD_Altivec operator>>(size_t shift) const { __vector unsigned int shift_vec = (__vector unsigned int){shift, shift, shift, shift}; return vec_sr(reg, shift_vec); } SIMD_Altivec operator~() const { return vec_nor(reg, reg); } SIMD_Altivec andc(const SIMD_Altivec& other) { // AltiVec does arg1 & ~arg2 rather than SSE's ~arg1 & arg2 return vec_andc(other.reg, reg); } SIMD_Altivec bswap() const { __vector unsigned char perm = vec_lvsl(0, (u32bit*)0); perm = vec_xor(perm, vec_splat_u8(3)); return SIMD_Altivec(vec_perm(reg, reg, perm)); } static void transpose(SIMD_Altivec& B0, SIMD_Altivec& B1, SIMD_Altivec& B2, SIMD_Altivec& B3) { __vector unsigned int T0 = vec_mergeh(B0.reg, B2.reg); __vector unsigned int T1 = vec_mergel(B0.reg, B2.reg); __vector unsigned int T2 = vec_mergeh(B1.reg, B3.reg); __vector unsigned int T3 = vec_mergel(B1.reg, B3.reg); B0.reg = vec_mergeh(T0, T2); B1.reg = vec_mergel(T0, T2); B2.reg = vec_mergeh(T1, T3); B3.reg = vec_mergel(T1, T3); } private: SIMD_Altivec(__vector unsigned int input) { reg = input; } __vector unsigned int reg; }; } #endif #endif Botan-1.10.12/src/simd/simd_scalar/info.txt0000664000175000017500000000012412654331322020261 0ustar jackjack00000000000000define SIMD_SCALAR load_on dep simd_scalar.h Botan-1.10.12/src/simd/simd_scalar/simd_scalar.h0000664000175000017500000001320012654331322021216 0ustar jackjack00000000000000/* * Scalar emulation of SIMD 32-bit operations * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SIMD_SCALAR_H__ #define BOTAN_SIMD_SCALAR_H__ #include #include namespace Botan { /** * Fake SIMD, using plain scalar operations * Often still faster than iterative on superscalar machines */ class SIMD_Scalar { public: static bool enabled() { return true; } SIMD_Scalar(const u32bit B[4]) { R0 = B[0]; R1 = B[1]; R2 = B[2]; R3 = B[3]; } SIMD_Scalar(u32bit B0, u32bit B1, u32bit B2, u32bit B3) { R0 = B0; R1 = B1; R2 = B2; R3 = B3; } SIMD_Scalar(u32bit B) { R0 = B; R1 = B; R2 = B; R3 = B; } static SIMD_Scalar load_le(const void* in) { const byte* in_b = static_cast(in); return SIMD_Scalar(Botan::load_le(in_b, 0), Botan::load_le(in_b, 1), Botan::load_le(in_b, 2), Botan::load_le(in_b, 3)); } static SIMD_Scalar load_be(const void* in) { const byte* in_b = static_cast(in); return SIMD_Scalar(Botan::load_be(in_b, 0), Botan::load_be(in_b, 1), Botan::load_be(in_b, 2), Botan::load_be(in_b, 3)); } void store_le(byte out[]) const { Botan::store_le(out, R0, R1, R2, R3); } void store_be(byte out[]) const { Botan::store_be(out, R0, R1, R2, R3); } void rotate_left(size_t rot) { R0 = Botan::rotate_left(R0, rot); R1 = Botan::rotate_left(R1, rot); R2 = Botan::rotate_left(R2, rot); R3 = Botan::rotate_left(R3, rot); } void rotate_right(size_t rot) { R0 = Botan::rotate_right(R0, rot); R1 = Botan::rotate_right(R1, rot); R2 = Botan::rotate_right(R2, rot); R3 = Botan::rotate_right(R3, rot); } void operator+=(const SIMD_Scalar& other) { R0 += other.R0; R1 += other.R1; R2 += other.R2; R3 += other.R3; } SIMD_Scalar operator+(const SIMD_Scalar& other) const { return SIMD_Scalar(R0 + other.R0, R1 + other.R1, R2 + other.R2, R3 + other.R3); } void operator-=(const SIMD_Scalar& other) { R0 -= other.R0; R1 -= other.R1; R2 -= other.R2; R3 -= other.R3; } SIMD_Scalar operator-(const SIMD_Scalar& other) const { return SIMD_Scalar(R0 - other.R0, R1 - other.R1, R2 - other.R2, R3 - other.R3); } void operator^=(const SIMD_Scalar& other) { R0 ^= other.R0; R1 ^= other.R1; R2 ^= other.R2; R3 ^= other.R3; } SIMD_Scalar operator^(const SIMD_Scalar& other) const { return SIMD_Scalar(R0 ^ other.R0, R1 ^ other.R1, R2 ^ other.R2, R3 ^ other.R3); } void operator|=(const SIMD_Scalar& other) { R0 |= other.R0; R1 |= other.R1; R2 |= other.R2; R3 |= other.R3; } SIMD_Scalar operator&(const SIMD_Scalar& other) { return SIMD_Scalar(R0 & other.R0, R1 & other.R1, R2 & other.R2, R3 & other.R3); } void operator&=(const SIMD_Scalar& other) { R0 &= other.R0; R1 &= other.R1; R2 &= other.R2; R3 &= other.R3; } SIMD_Scalar operator<<(size_t shift) const { return SIMD_Scalar(R0 << shift, R1 << shift, R2 << shift, R3 << shift); } SIMD_Scalar operator>>(size_t shift) const { return SIMD_Scalar(R0 >> shift, R1 >> shift, R2 >> shift, R3 >> shift); } SIMD_Scalar operator~() const { return SIMD_Scalar(~R0, ~R1, ~R2, ~R3); } // (~reg) & other SIMD_Scalar andc(const SIMD_Scalar& other) { return SIMD_Scalar(~R0 & other.R0, ~R1 & other.R1, ~R2 & other.R2, ~R3 & other.R3); } SIMD_Scalar bswap() const { return SIMD_Scalar(reverse_bytes(R0), reverse_bytes(R1), reverse_bytes(R2), reverse_bytes(R3)); } static void transpose(SIMD_Scalar& B0, SIMD_Scalar& B1, SIMD_Scalar& B2, SIMD_Scalar& B3) { SIMD_Scalar T0(B0.R0, B1.R0, B2.R0, B3.R0); SIMD_Scalar T1(B0.R1, B1.R1, B2.R1, B3.R1); SIMD_Scalar T2(B0.R2, B1.R2, B2.R2, B3.R2); SIMD_Scalar T3(B0.R3, B1.R3, B2.R3, B3.R3); B0 = T0; B1 = T1; B2 = T2; B3 = T3; } private: u32bit R0, R1, R2, R3; }; } #endif Botan-1.10.12/src/simd/simd_sse2/info.txt0000664000175000017500000000013712654331322017674 0ustar jackjack00000000000000define SIMD_SSE2 need_isa sse2 load_on dep simd_sse2.h Botan-1.10.12/src/simd/simd_sse2/simd_sse2.h0000664000175000017500000000774112654331322020251 0ustar jackjack00000000000000/* * Lightweight wrappers for SSE2 intrinsics for 32-bit operations * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SIMD_SSE_H__ #define BOTAN_SIMD_SSE_H__ #if defined(BOTAN_TARGET_CPU_HAS_SSE2) #include #include namespace Botan { class SIMD_SSE2 { public: static bool enabled() { return CPUID::has_sse2(); } SIMD_SSE2(const u32bit B[4]) { reg = _mm_loadu_si128(reinterpret_cast(B)); } SIMD_SSE2(u32bit B0, u32bit B1, u32bit B2, u32bit B3) { reg = _mm_set_epi32(B0, B1, B2, B3); } SIMD_SSE2(u32bit B) { reg = _mm_set1_epi32(B); } static SIMD_SSE2 load_le(const void* in) { return _mm_loadu_si128(reinterpret_cast(in)); } static SIMD_SSE2 load_be(const void* in) { return load_le(in).bswap(); } void store_le(byte out[]) const { _mm_storeu_si128(reinterpret_cast<__m128i*>(out), reg); } void store_be(byte out[]) const { bswap().store_le(out); } void rotate_left(size_t rot) { reg = _mm_or_si128(_mm_slli_epi32(reg, static_cast(rot)), _mm_srli_epi32(reg, static_cast(32-rot))); } void rotate_right(size_t rot) { rotate_left(32 - rot); } void operator+=(const SIMD_SSE2& other) { reg = _mm_add_epi32(reg, other.reg); } SIMD_SSE2 operator+(const SIMD_SSE2& other) const { return _mm_add_epi32(reg, other.reg); } void operator-=(const SIMD_SSE2& other) { reg = _mm_sub_epi32(reg, other.reg); } SIMD_SSE2 operator-(const SIMD_SSE2& other) const { return _mm_sub_epi32(reg, other.reg); } void operator^=(const SIMD_SSE2& other) { reg = _mm_xor_si128(reg, other.reg); } SIMD_SSE2 operator^(const SIMD_SSE2& other) const { return _mm_xor_si128(reg, other.reg); } void operator|=(const SIMD_SSE2& other) { reg = _mm_or_si128(reg, other.reg); } SIMD_SSE2 operator&(const SIMD_SSE2& other) { return _mm_and_si128(reg, other.reg); } void operator&=(const SIMD_SSE2& other) { reg = _mm_and_si128(reg, other.reg); } SIMD_SSE2 operator<<(size_t shift) const { return _mm_slli_epi32(reg, static_cast(shift)); } SIMD_SSE2 operator>>(size_t shift) const { return _mm_srli_epi32(reg, static_cast(shift)); } SIMD_SSE2 operator~() const { return _mm_xor_si128(reg, _mm_set1_epi32(0xFFFFFFFF)); } // (~reg) & other SIMD_SSE2 andc(const SIMD_SSE2& other) { return _mm_andnot_si128(reg, other.reg); } SIMD_SSE2 bswap() const { __m128i T = reg; T = _mm_shufflehi_epi16(T, _MM_SHUFFLE(2, 3, 0, 1)); T = _mm_shufflelo_epi16(T, _MM_SHUFFLE(2, 3, 0, 1)); return _mm_or_si128(_mm_srli_epi16(T, 8), _mm_slli_epi16(T, 8)); } static void transpose(SIMD_SSE2& B0, SIMD_SSE2& B1, SIMD_SSE2& B2, SIMD_SSE2& B3) { __m128i T0 = _mm_unpacklo_epi32(B0.reg, B1.reg); __m128i T1 = _mm_unpacklo_epi32(B2.reg, B3.reg); __m128i T2 = _mm_unpackhi_epi32(B0.reg, B1.reg); __m128i T3 = _mm_unpackhi_epi32(B2.reg, B3.reg); B0.reg = _mm_unpacklo_epi64(T0, T1); B1.reg = _mm_unpackhi_epi64(T0, T1); B2.reg = _mm_unpacklo_epi64(T2, T3); B3.reg = _mm_unpackhi_epi64(T2, T3); } private: SIMD_SSE2(__m128i in) { reg = in; } __m128i reg; }; } #endif #endif Botan-1.10.12/src/ssl/c_kex.cpp0000664000175000017500000001051412654331322015752 0ustar jackjack00000000000000/* * Client Key Exchange Message * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include #include #include #include #include namespace Botan { /** * Create a new Client Key Exchange message */ Client_Key_Exchange::Client_Key_Exchange(RandomNumberGenerator& rng, Record_Writer& writer, HandshakeHash& hash, const Public_Key* pub_key, Version_Code using_version, Version_Code pref_version) { include_length = true; if(const DH_PublicKey* dh_pub = dynamic_cast(pub_key)) { DH_PrivateKey priv_key(rng, dh_pub->get_domain()); PK_Key_Agreement ka(priv_key, "Raw"); pre_master = ka.derive_key(0, dh_pub->public_value()).bits_of(); key_material = priv_key.public_value(); } else if(const RSA_PublicKey* rsa_pub = dynamic_cast(pub_key)) { pre_master = rng.random_vec(48); pre_master[0] = (pref_version >> 8) & 0xFF; pre_master[1] = (pref_version ) & 0xFF; PK_Encryptor_EME encryptor(*rsa_pub, "PKCS1v15"); key_material = encryptor.encrypt(pre_master, rng); if(using_version == SSL_V3) include_length = false; } else throw Invalid_Argument("Client_Key_Exchange: Key not RSA or DH"); send(writer, hash); } /** * Read a Client Key Exchange message */ Client_Key_Exchange::Client_Key_Exchange(const MemoryRegion& contents, const CipherSuite& suite, Version_Code using_version) { include_length = true; if(using_version == SSL_V3 && (suite.kex_type() == TLS_ALGO_KEYEXCH_RSA)) include_length = false; deserialize(contents); } /** * Serialize a Client Key Exchange message */ SecureVector Client_Key_Exchange::serialize() const { if(include_length) { SecureVector buf; append_tls_length_value(buf, key_material, 2); return buf; } else return key_material; } /** * Deserialize a Client Key Exchange message */ void Client_Key_Exchange::deserialize(const MemoryRegion& buf) { if(include_length) { TLS_Data_Reader reader(buf); key_material = reader.get_range(2, 0, 65535); } else key_material = buf; } /** * Return the pre_master_secret */ SecureVector Client_Key_Exchange::pre_master_secret(RandomNumberGenerator& rng, const Private_Key* priv_key, Version_Code version) { if(const DH_PrivateKey* dh_priv = dynamic_cast(priv_key)) { try { PK_Key_Agreement ka(*dh_priv, "Raw"); pre_master = ka.derive_key(0, key_material).bits_of(); } catch(...) { /* * Something failed in the DH computation. To avoid possible * timing attacks, randomize the pre-master output and carry * on, allowing the protocol to fail later in the finished * checks. */ pre_master = rng.random_vec(dh_priv->public_value().size()); } return pre_master; } else if(const RSA_PrivateKey* rsa_priv = dynamic_cast(priv_key)) { PK_Decryptor_EME decryptor(*rsa_priv, "PKCS1v15"); try { pre_master = decryptor.decrypt(key_material); if(pre_master.size() != 48 || make_u16bit(pre_master[0], pre_master[1]) != version) throw Decoding_Error("Client_Key_Exchange: Secret corrupted"); } catch(...) { pre_master = rng.random_vec(48); pre_master[0] = (version >> 8) & 0xFF; pre_master[1] = (version ) & 0xFF; } return pre_master; } else throw Invalid_Argument("Client_Key_Exchange: Bad key for decrypt"); } /** * Return the pre_master_secret */ SecureVector Client_Key_Exchange::pre_master_secret() const { return pre_master; } } Botan-1.10.12/src/ssl/cert_req.cpp0000664000175000017500000000725412654331322016474 0ustar jackjack00000000000000/* * Certificate Request Message * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { /** * Create a new Certificate Request message */ Certificate_Req::Certificate_Req(Record_Writer& writer, HandshakeHash& hash, const std::vector& certs) { for(size_t i = 0; i != certs.size(); ++i) names.push_back(certs[i].subject_dn()); // FIXME: should be able to choose what to ask for types.push_back(RSA_CERT); types.push_back(DSS_CERT); send(writer, hash); } /** * Serialize a Certificate Request message */ SecureVector Certificate_Req::serialize() const { SecureVector buf; append_tls_length_value(buf, types, 1); DER_Encoder encoder; for(size_t i = 0; i != names.size(); ++i) encoder.encode(names[i]); append_tls_length_value(buf, encoder.get_contents(), 2); return buf; } /** * Deserialize a Certificate Request message */ void Certificate_Req::deserialize(const MemoryRegion& buf) { if(buf.size() < 4) throw Decoding_Error("Certificate_Req: Bad certificate request"); size_t types_size = buf[0]; if(buf.size() < types_size + 3) throw Decoding_Error("Certificate_Req: Bad certificate request"); for(size_t i = 0; i != types_size; ++i) types.push_back(static_cast(buf[i+1])); size_t names_size = make_u16bit(buf[types_size+2], buf[types_size+3]); if(buf.size() != names_size + types_size + 3) throw Decoding_Error("Certificate_Req: Bad certificate request"); BER_Decoder decoder(&buf[types_size + 3], names_size); while(decoder.more_items()) { X509_DN name; decoder.decode(name); names.push_back(name); } } /** * Create a new Certificate message */ Certificate::Certificate(Record_Writer& writer, const std::vector& cert_list, HandshakeHash& hash) { certs = cert_list; send(writer, hash); } /** * Serialize a Certificate message */ SecureVector Certificate::serialize() const { SecureVector buf(3); for(size_t i = 0; i != certs.size(); ++i) { SecureVector raw_cert = certs[i].BER_encode(); const size_t cert_size = raw_cert.size(); for(size_t i = 0; i != 3; ++i) buf.push_back(get_byte(i+1, cert_size)); buf += raw_cert; } const size_t buf_size = buf.size() - 3; for(size_t i = 0; i != 3; ++i) buf[i] = get_byte(i+1, buf_size); return buf; } /** * Deserialize a Certificate message */ void Certificate::deserialize(const MemoryRegion& buf) { if(buf.size() < 3) throw Decoding_Error("Certificate: Message malformed"); const size_t total_size = make_u32bit(0, buf[0], buf[1], buf[2]); SecureQueue queue; queue.write(&buf[3], buf.size() - 3); if(queue.size() != total_size) throw Decoding_Error("Certificate: Message malformed"); while(queue.size()) { if(queue.size() < 3) throw Decoding_Error("Certificate: Message malformed"); byte len[3]; queue.read(len, 3); const size_t cert_size = make_u32bit(0, len[0], len[1], len[2]); const size_t original_size = queue.size(); X509_Certificate cert(queue); if(queue.size() + cert_size != original_size) throw Decoding_Error("Certificate: Message malformed"); certs.push_back(cert); } } } Botan-1.10.12/src/ssl/cert_ver.cpp0000664000175000017500000000465712654331322016505 0ustar jackjack00000000000000/* * Certificate Verify Message * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { /** * Create a new Certificate Verify message */ Certificate_Verify::Certificate_Verify(RandomNumberGenerator& rng, Record_Writer& writer, HandshakeHash& hash, const Private_Key* priv_key) { std::string padding = ""; Signature_Format format = IEEE_1363; if(priv_key->algo_name() == "RSA") padding = "EMSA3(TLS.Digest.0)"; else if(priv_key->algo_name() == "DSA") { padding = "EMSA1(SHA-1)"; format = DER_SEQUENCE; } else throw Invalid_Argument(priv_key->algo_name() + " is invalid/unknown for TLS signatures"); PK_Signer signer(*priv_key, padding, format); signature = signer.sign_message(hash.final(), rng); send(writer, hash); } /** * Serialize a Certificate Verify message */ SecureVector Certificate_Verify::serialize() const { SecureVector buf; const u16bit sig_len = signature.size(); buf.push_back(get_byte(0, sig_len)); buf.push_back(get_byte(1, sig_len)); buf += signature; return buf; } /** * Deserialize a Certificate Verify message */ void Certificate_Verify::deserialize(const MemoryRegion& buf) { TLS_Data_Reader reader(buf); signature = reader.get_range(2, 0, 65535); } /** * Verify a Certificate Verify message */ bool Certificate_Verify::verify(const X509_Certificate& cert, HandshakeHash& hash) { // FIXME: duplicate of Server_Key_Exchange::verify std::auto_ptr key(cert.subject_public_key()); std::string padding = ""; Signature_Format format = IEEE_1363; if(key->algo_name() == "RSA") padding = "EMSA3(TLS.Digest.0)"; else if(key->algo_name() == "DSA") { padding = "EMSA1(SHA-1)"; format = DER_SEQUENCE; } else throw Invalid_Argument(key->algo_name() + " is invalid/unknown for TLS signatures"); PK_Verifier verifier(*key, padding, format); return verifier.verify_message(hash.final(), signature); } } Botan-1.10.12/src/ssl/finished.cpp0000664000175000017500000000515712654331322016461 0ustar jackjack00000000000000/* * Finished Message * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #include #include namespace Botan { /** * Create a new Finished message */ Finished::Finished(Record_Writer& writer, Version_Code version, Connection_Side side, const MemoryRegion& master_secret, HandshakeHash& hash) { verification_data = compute_verify(master_secret, hash, side, version); send(writer, hash); } /** * Serialize a Finished message */ SecureVector Finished::serialize() const { return verification_data; } /** * Deserialize a Finished message */ void Finished::deserialize(const MemoryRegion& buf) { verification_data = buf; } /** * Verify a Finished message */ bool Finished::verify(const MemoryRegion& secret, Version_Code version, const HandshakeHash& hash, Connection_Side side) { SecureVector computed = compute_verify(secret, hash, side, version); if(computed == verification_data) return true; return false; } /** * Compute the verify_data */ SecureVector Finished::compute_verify(const MemoryRegion& secret, HandshakeHash hash, Connection_Side side, Version_Code version) { if(version == SSL_V3) { const byte SSL_CLIENT_LABEL[] = { 0x43, 0x4C, 0x4E, 0x54 }; const byte SSL_SERVER_LABEL[] = { 0x53, 0x52, 0x56, 0x52 }; SecureVector ssl3_finished; if(side == CLIENT) hash.update(SSL_CLIENT_LABEL, sizeof(SSL_CLIENT_LABEL)); else hash.update(SSL_SERVER_LABEL, sizeof(SSL_SERVER_LABEL)); return hash.final_ssl3(secret); } else if(version == TLS_V10 || version == TLS_V11) { const byte TLS_CLIENT_LABEL[] = { 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x20, 0x66, 0x69, 0x6E, 0x69, 0x73, 0x68, 0x65, 0x64 }; const byte TLS_SERVER_LABEL[] = { 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x66, 0x69, 0x6E, 0x69, 0x73, 0x68, 0x65, 0x64 }; TLS_PRF prf; SecureVector input; if(side == CLIENT) input += std::make_pair(TLS_CLIENT_LABEL, sizeof(TLS_CLIENT_LABEL)); else input += std::make_pair(TLS_SERVER_LABEL, sizeof(TLS_SERVER_LABEL)); input += hash.final(); return prf.derive_key(12, secret, input); } else throw Invalid_Argument("Finished message: Unknown protocol version"); } } Botan-1.10.12/src/ssl/hello.cpp0000664000175000017500000002022612654331322015765 0ustar jackjack00000000000000/* * TLS Hello Messages * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include namespace Botan { /* * Encode and send a Handshake message */ void HandshakeMessage::send(Record_Writer& writer, HandshakeHash& hash) const { SecureVector buf = serialize(); SecureVector send_buf(4); const size_t buf_size = buf.size(); send_buf[0] = type(); for(size_t i = 1; i != 4; ++i) send_buf[i] = get_byte(i, buf_size); send_buf += buf; hash.update(send_buf); writer.send(HANDSHAKE, &send_buf[0], send_buf.size()); writer.flush(); } /* * Create a new Hello Request message */ Hello_Request::Hello_Request(Record_Writer& writer) { HandshakeHash dummy; // FIXME: *UGLY* send(writer, dummy); } /* * Serialize a Hello Request message */ SecureVector Hello_Request::serialize() const { return SecureVector(); } /* * Deserialize a Hello Request message */ void Hello_Request::deserialize(const MemoryRegion& buf) { if(buf.size()) throw Decoding_Error("Hello_Request: Must be empty, and is not"); } /* * Create a new Client Hello message */ Client_Hello::Client_Hello(RandomNumberGenerator& rng, Record_Writer& writer, const TLS_Policy& policy, HandshakeHash& hash) { c_random = rng.random_vec(32); suites = policy.ciphersuites(); comp_algos = policy.compression(); c_version = policy.pref_version(); send(writer, hash); } /* * Serialize a Client Hello message */ SecureVector Client_Hello::serialize() const { SecureVector buf; buf.push_back(static_cast(c_version >> 8)); buf.push_back(static_cast(c_version )); buf += c_random; append_tls_length_value(buf, sess_id, 1); append_tls_length_value(buf, suites, 2); append_tls_length_value(buf, comp_algos, 1); return buf; } void Client_Hello::deserialize_sslv2(const MemoryRegion& buf) { if(buf.size() < 12 || buf[0] != 1) throw Decoding_Error("Client_Hello: SSLv2 hello corrupted"); const size_t cipher_spec_len = make_u16bit(buf[3], buf[4]); const size_t sess_id_len = make_u16bit(buf[5], buf[6]); const size_t challenge_len = make_u16bit(buf[7], buf[8]); const size_t expected_size = (9 + sess_id_len + cipher_spec_len + challenge_len); if(buf.size() != expected_size) throw Decoding_Error("Client_Hello: SSLv2 hello corrupted"); if(sess_id_len != 0 || cipher_spec_len % 3 != 0 || (challenge_len < 16 || challenge_len > 32)) { throw Decoding_Error("Client_Hello: SSLv2 hello corrupted"); } for(size_t i = 9; i != 9 + cipher_spec_len; i += 3) { if(buf[i] != 0) // a SSLv2 cipherspec; ignore it continue; suites.push_back(make_u16bit(buf[i+1], buf[i+2])); } c_version = static_cast(make_u16bit(buf[1], buf[2])); c_random.resize(challenge_len); copy_mem(&c_random[0], &buf[9+cipher_spec_len+sess_id_len], challenge_len); } /* * Deserialize a Client Hello message */ void Client_Hello::deserialize(const MemoryRegion& buf) { if(buf.size() == 0) throw Decoding_Error("Client_Hello: Packet corrupted"); if(buf.size() < 41) throw Decoding_Error("Client_Hello: Packet corrupted"); TLS_Data_Reader reader(buf); c_version = static_cast(reader.get_u16bit()); c_random = reader.get_fixed(32); sess_id = reader.get_range(1, 0, 32); suites = reader.get_range_vector(2, 1, 32767); comp_algos = reader.get_range_vector(1, 1, 255); if(reader.has_remaining()) { const u16bit all_extn_size = reader.get_u16bit(); if(reader.remaining_bytes() != all_extn_size) throw Decoding_Error("Client_Hello: Bad extension size"); while(reader.has_remaining()) { const u16bit extension_code = reader.get_u16bit(); const u16bit extension_size = reader.get_u16bit(); if(extension_code == TLSEXT_SERVER_NAME_INDICATION) { u16bit name_bytes = reader.get_u16bit(); while(name_bytes) { byte name_type = reader.get_byte(); name_bytes--; if(name_type == 0) // DNS { std::vector name = reader.get_range_vector(2, 1, 65535); requested_hostname.assign( reinterpret_cast(&name[0]), name.size()); name_bytes -= (2 + name.size()); } else { reader.discard_next(name_bytes); name_bytes = 0; } } } else if(extension_code == TLSEXT_SRP_IDENTIFIER) { std::vector name = reader.get_range_vector(1, 1, 255); requested_srp_id.assign( reinterpret_cast(&name[0]), name.size()); } else { reader.discard_next(extension_size); } } } } /* * Check if we offered this ciphersuite */ bool Client_Hello::offered_suite(u16bit ciphersuite) const { for(size_t i = 0; i != suites.size(); ++i) if(suites[i] == ciphersuite) return true; return false; } /* * Create a new Server Hello message */ Server_Hello::Server_Hello(RandomNumberGenerator& rng, Record_Writer& writer, const TLS_Policy& policy, const std::vector& certs, const Client_Hello& c_hello, Version_Code ver, HandshakeHash& hash) { bool have_rsa = false, have_dsa = false; for(size_t i = 0; i != certs.size(); ++i) { Public_Key* key = certs[i].subject_public_key(); if(key->algo_name() == "RSA") have_rsa = true; if(key->algo_name() == "DSA") have_dsa = true; } suite = policy.choose_suite(c_hello.ciphersuites(), have_rsa, have_dsa); if(suite == 0) throw TLS_Exception(PROTOCOL_VERSION, "Can't agree on a ciphersuite with client"); comp_algo = policy.choose_compression(c_hello.compression_algos()); s_version = ver; s_random = rng.random_vec(32); send(writer, hash); } /* * Serialize a Server Hello message */ SecureVector Server_Hello::serialize() const { SecureVector buf; buf.push_back(static_cast(s_version >> 8)); buf.push_back(static_cast(s_version )); buf += s_random; append_tls_length_value(buf, sess_id, 1); buf.push_back(get_byte(0, suite)); buf.push_back(get_byte(1, suite)); buf.push_back(comp_algo); return buf; } /* * Deserialize a Server Hello message */ void Server_Hello::deserialize(const MemoryRegion& buf) { if(buf.size() < 38) throw Decoding_Error("Server_Hello: Packet corrupted"); TLS_Data_Reader reader(buf); s_version = static_cast(reader.get_u16bit()); if(s_version != SSL_V3 && s_version != TLS_V10 && s_version != TLS_V11) { throw TLS_Exception(PROTOCOL_VERSION, "Server_Hello: Unsupported server version"); } s_random = reader.get_fixed(32); sess_id = reader.get_range(1, 0, 32); suite = reader.get_u16bit(); comp_algo = reader.get_byte(); } /* * Create a new Server Hello Done message */ Server_Hello_Done::Server_Hello_Done(Record_Writer& writer, HandshakeHash& hash) { send(writer, hash); } /* * Serialize a Server Hello Done message */ SecureVector Server_Hello_Done::serialize() const { return SecureVector(); } /* * Deserialize a Server Hello Done message */ void Server_Hello_Done::deserialize(const MemoryRegion& buf) { if(buf.size()) throw Decoding_Error("Server_Hello_Done: Must be empty, and is not"); } } Botan-1.10.12/src/ssl/info.txt0000664000175000017500000000142712654331322015654 0ustar jackjack00000000000000define SSL_TLS load_on auto If you are using TLS in your application definitely consider using the version in 1.11 instead uses_tr1 yes tls_client.h tls_connection.h tls_exceptn.h tls_magic.h tls_policy.h tls_record.h tls_server.h tls_session_key.h tls_suites.h tls_alerts.h tls_handshake_hash.h tls_messages.h tls_reader.h tls_state.h c_kex.cpp cert_req.cpp cert_ver.cpp finished.cpp tls_handshake_hash.cpp hello.cpp rec_read.cpp rec_wri.cpp s_kex.cpp tls_client.cpp tls_policy.cpp tls_server.cpp tls_session_key.cpp tls_state.cpp tls_suites.cpp aes arc4 asn1 des dh dsa eme_pkcs emsa3 filters hmac md5 prf_ssl3 prf_tls rng rsa sha1 ssl3mac x509cert Botan-1.10.12/src/ssl/rec_read.cpp0000664000175000017500000001476312654331322016437 0ustar jackjack00000000000000/* * TLS Record Reading * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include namespace Botan { /* * Reset the state */ void Record_Reader::reset() { cipher.reset(); delete mac; mac = 0; mac_size = 0; block_size = 0; iv_size = 0; major = minor = 0; seq_no = 0; } /* * Set the version to use */ void Record_Reader::set_version(Version_Code version) { if(version != SSL_V3 && version != TLS_V10 && version != TLS_V11) throw Invalid_Argument("Record_Reader: Invalid protocol version"); major = (version >> 8) & 0xFF; minor = (version & 0xFF); } /* * Set the keys for reading */ void Record_Reader::set_keys(const CipherSuite& suite, const SessionKeys& keys, Connection_Side side) { cipher.reset(); delete mac; mac = 0; seq_no = 0; SymmetricKey mac_key, cipher_key; InitializationVector iv; if(side == CLIENT) { cipher_key = keys.server_cipher_key(); iv = keys.server_iv(); mac_key = keys.server_mac_key(); } else { cipher_key = keys.client_cipher_key(); iv = keys.client_iv(); mac_key = keys.client_mac_key(); } const std::string cipher_algo = suite.cipher_algo(); const std::string mac_algo = suite.mac_algo(); if(have_block_cipher(cipher_algo)) { cipher.append(get_cipher( cipher_algo + "/CBC/NoPadding", cipher_key, iv, DECRYPTION) ); block_size = block_size_of(cipher_algo); if(major > 3 || (major == 3 && minor >= 2)) iv_size = block_size; else iv_size = 0; } else if(have_stream_cipher(cipher_algo)) { cipher.append(get_cipher(cipher_algo, cipher_key, DECRYPTION)); block_size = 0; iv_size = 0; } else throw Invalid_Argument("Record_Reader: Unknown cipher " + cipher_algo); if(have_hash(mac_algo)) { Algorithm_Factory& af = global_state().algorithm_factory(); if(major == 3 && minor == 0) mac = af.make_mac("SSL3-MAC(" + mac_algo + ")"); else mac = af.make_mac("HMAC(" + mac_algo + ")"); mac->set_key(mac_key); mac_size = mac->output_length(); } else throw Invalid_Argument("Record_Reader: Unknown hash " + mac_algo); } void Record_Reader::add_input(const byte input[], size_t input_size) { input_queue.write(input, input_size); } /* * Retrieve the next record */ size_t Record_Reader::get_record(byte& msg_type, MemoryRegion& output) { byte header[5] = { 0 }; const size_t have_in_queue = input_queue.size(); if(have_in_queue < sizeof(header)) return (sizeof(header) - have_in_queue); /* * We peek first to make sure we have the full record */ input_queue.peek(header, sizeof(header)); // SSLv2-format client hello? if(header[0] & 0x80 && header[2] == 1 && header[3] == 3) { size_t record_len = make_u16bit(header[0], header[1]) & 0x7FFF; if(have_in_queue < record_len + 2) return (record_len + 2 - have_in_queue); msg_type = HANDSHAKE; output.resize(record_len + 4); input_queue.read(&output[2], record_len + 2); output[0] = CLIENT_HELLO_SSLV2; output[1] = 0; output[2] = header[0] & 0x7F; output[3] = header[1]; return 0; } if(header[0] != CHANGE_CIPHER_SPEC && header[0] != ALERT && header[0] != HANDSHAKE && header[0] != APPLICATION_DATA) { throw TLS_Exception(UNEXPECTED_MESSAGE, "Record_Reader: Unknown record type"); } const u16bit version = make_u16bit(header[1], header[2]); const u16bit record_len = make_u16bit(header[3], header[4]); if(major && (header[1] != major || header[2] != minor)) throw TLS_Exception(PROTOCOL_VERSION, "Record_Reader: Got unexpected version"); // If insufficient data, return without doing anything if(have_in_queue < (sizeof(header) + record_len)) return (sizeof(header) + record_len - have_in_queue); SecureVector buffer(record_len); input_queue.read(header, sizeof(header)); // pull off the header input_queue.read(&buffer[0], buffer.size()); /* * We are handshaking, no crypto to do so return as-is * TODO: Check msg_type to confirm a handshake? */ if(mac_size == 0) { msg_type = header[0]; output = buffer; return 0; // got a full record } // Otherwise, decrypt, check MAC, return plaintext cipher.process_msg(buffer); SecureVector plaintext = cipher.read_all(Pipe::LAST_MESSAGE); size_t pad_size = 0; if(block_size) { byte pad_value = plaintext[plaintext.size()-1]; pad_size = pad_value + 1; /* * Check the padding; if it is wrong, then say we have 0 bytes of * padding, which should ensure that the MAC check below does not * suceed. This hides a timing channel. * * This particular countermeasure is recommended in the TLS 1.2 * spec (RFC 5246) in section 6.2.3.2 */ if(version == SSL_V3) { if(pad_value > block_size) pad_size = 0; } else { bool padding_good = true; for(size_t i = 0; i != pad_size; ++i) if(plaintext[plaintext.size()-i-1] != pad_value) padding_good = false; if(!padding_good) pad_size = 0; } } if(plaintext.size() < mac_size + pad_size + iv_size) throw Decoding_Error("Record_Reader: Record truncated"); const size_t mac_offset = plaintext.size() - (mac_size + pad_size); SecureVector received_mac(&plaintext[mac_offset], mac_size); const u16bit plain_length = plaintext.size() - (mac_size + pad_size + iv_size); mac->update_be(seq_no); mac->update(header[0]); // msg_type if(version != SSL_V3) for(size_t i = 0; i != 2; ++i) mac->update(get_byte(i, version)); mac->update_be(plain_length); mac->update(&plaintext[iv_size], plain_length); ++seq_no; SecureVector computed_mac = mac->final(); if(received_mac != computed_mac) throw TLS_Exception(BAD_RECORD_MAC, "Record_Reader: MAC failure"); msg_type = header[0]; output.resize(plain_length); copy_mem(&output[0], &plaintext[iv_size], plain_length); return 0; } } Botan-1.10.12/src/ssl/rec_wri.cpp0000664000175000017500000001410012654331322016306 0ustar jackjack00000000000000/* * TLS Record Writing * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /** * Record_Writer Constructor */ Record_Writer::Record_Writer(std::tr1::function out) : output_fn(out), buffer(DEFAULT_BUFFERSIZE) { mac = 0; reset(); } /** * Reset the state */ void Record_Writer::reset() { cipher.reset(); delete mac; mac = 0; zeroise(buffer); buf_pos = 0; major = minor = buf_type = 0; block_size = 0; mac_size = 0; iv_size = 0; seq_no = 0; } /** * Set the version to use */ void Record_Writer::set_version(Version_Code version) { if(version != SSL_V3 && version != TLS_V10 && version != TLS_V11) throw Invalid_Argument("Record_Writer: Invalid protocol version"); major = (version >> 8) & 0xFF; minor = (version & 0xFF); } /** * Set the keys for writing */ void Record_Writer::set_keys(const CipherSuite& suite, const SessionKeys& keys, Connection_Side side) { cipher.reset(); delete mac; mac = 0; seq_no = 0; SymmetricKey mac_key, cipher_key; InitializationVector iv; if(side == CLIENT) { cipher_key = keys.client_cipher_key(); iv = keys.client_iv(); mac_key = keys.client_mac_key(); } else { cipher_key = keys.server_cipher_key(); iv = keys.server_iv(); mac_key = keys.server_mac_key(); } const std::string cipher_algo = suite.cipher_algo(); const std::string mac_algo = suite.mac_algo(); if(have_block_cipher(cipher_algo)) { cipher.append(get_cipher( cipher_algo + "/CBC/NoPadding", cipher_key, iv, ENCRYPTION) ); block_size = block_size_of(cipher_algo); if(major > 3 || (major == 3 && minor >= 2)) iv_size = block_size; else iv_size = 0; } else if(have_stream_cipher(cipher_algo)) { cipher.append(get_cipher(cipher_algo, cipher_key, ENCRYPTION)); block_size = 0; iv_size = 0; } else throw Invalid_Argument("Record_Writer: Unknown cipher " + cipher_algo); if(have_hash(mac_algo)) { Algorithm_Factory& af = global_state().algorithm_factory(); if(major == 3 && minor == 0) mac = af.make_mac("SSL3-MAC(" + mac_algo + ")"); else mac = af.make_mac("HMAC(" + mac_algo + ")"); mac->set_key(mac_key); mac_size = mac->output_length(); } else throw Invalid_Argument("Record_Writer: Unknown hash " + mac_algo); } /** * Send one or more records to the other side */ void Record_Writer::send(byte type, const byte input[], size_t length) { if(type != buf_type) flush(); const size_t BUFFER_SIZE = buffer.size(); buf_type = type; // FIXME: compression right here buffer.copy(buf_pos, input, length); if(buf_pos + length >= BUFFER_SIZE) { send_record(buf_type, &buffer[0], length); input += (BUFFER_SIZE - buf_pos); length -= (BUFFER_SIZE - buf_pos); while(length >= BUFFER_SIZE) { send_record(buf_type, input, BUFFER_SIZE); input += BUFFER_SIZE; length -= BUFFER_SIZE; } buffer.copy(input, length); buf_pos = 0; } buf_pos += length; } /** * Split buffer into records, and send them all */ void Record_Writer::flush() { const byte* buf_ptr = &buffer[0]; size_t offset = 0; while(offset != buf_pos) { size_t record_size = buf_pos - offset; if(record_size > MAX_PLAINTEXT_SIZE) record_size = MAX_PLAINTEXT_SIZE; send_record(buf_type, buf_ptr + offset, record_size); offset += record_size; } buf_type = 0; buf_pos = 0; } /** * Encrypt and send the record */ void Record_Writer::send_record(byte type, const byte buf[], size_t length) { if(length >= MAX_COMPRESSED_SIZE) throw TLS_Exception(INTERNAL_ERROR, "Record_Writer: Compressed packet is too big"); if(mac_size == 0) send_record(type, major, minor, buf, length); else { mac->update_be(seq_no); mac->update(type); if(major > 3 || (major == 3 && minor != 0)) { mac->update(major); mac->update(minor); } mac->update(get_byte(0, length)); mac->update(get_byte(1, length)); mac->update(buf, length); SecureVector buf_mac = mac->final(); // TODO: This could all use a single buffer cipher.start_msg(); if(iv_size) { RandomNumberGenerator& rng = global_state().global_rng(); SecureVector random_iv(iv_size); rng.randomize(&random_iv[0], random_iv.size()); cipher.write(random_iv); } cipher.write(buf, length); cipher.write(buf_mac); if(block_size) { size_t pad_val = (block_size - (1 + length + buf_mac.size())) % block_size; for(size_t i = 0; i != pad_val + 1; ++i) cipher.write(pad_val); } cipher.end_msg(); SecureVector output = cipher.read_all(Pipe::LAST_MESSAGE); send_record(type, major, minor, &output[0], output.size()); seq_no++; } } /** * Send a final record packet */ void Record_Writer::send_record(byte type, byte major, byte minor, const byte out[], size_t length) { if(length >= MAX_CIPHERTEXT_SIZE) throw TLS_Exception(INTERNAL_ERROR, "Record_Writer: Record is too big"); byte header[5] = { type, major, minor, 0 }; for(size_t i = 0; i != 2; ++i) header[i+3] = get_byte(i, length); output_fn(header, 5); output_fn(out, length); } /** * Send an alert */ void Record_Writer::alert(Alert_Level level, Alert_Type type) { byte alert[2] = { level, type }; send(ALERT, alert, sizeof(alert)); flush(); } } Botan-1.10.12/src/ssl/s_kex.cpp0000664000175000017500000001132712654331322015775 0ustar jackjack00000000000000/* * Server Key Exchange Message * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include #include #include #include #include namespace Botan { /** * Create a new Server Key Exchange message */ Server_Key_Exchange::Server_Key_Exchange(RandomNumberGenerator& rng, Record_Writer& writer, const Public_Key* kex_key, const Private_Key* priv_key, const MemoryRegion& c_random, const MemoryRegion& s_random, HandshakeHash& hash) { const DH_PublicKey* dh_pub = dynamic_cast(kex_key); const RSA_PublicKey* rsa_pub = dynamic_cast(kex_key); if(dh_pub) { params.push_back(dh_pub->get_domain().get_p()); params.push_back(dh_pub->get_domain().get_g()); params.push_back(BigInt::decode(dh_pub->public_value())); } else if(rsa_pub) { params.push_back(rsa_pub->get_n()); params.push_back(rsa_pub->get_e()); } else throw Invalid_Argument("Bad key for TLS key exchange: not DH or RSA"); std::string padding = ""; Signature_Format format = IEEE_1363; if(priv_key->algo_name() == "RSA") padding = "EMSA3(TLS.Digest.0)"; else if(priv_key->algo_name() == "DSA") { padding = "EMSA1(SHA-1)"; format = DER_SEQUENCE; } else throw Invalid_Argument(priv_key->algo_name() + " is invalid/unknown for TLS signatures"); PK_Signer signer(*priv_key, padding, format); signer.update(c_random); signer.update(s_random); signer.update(serialize_params()); signature = signer.signature(rng); send(writer, hash); } /** * Serialize a Server Key Exchange message */ SecureVector Server_Key_Exchange::serialize() const { SecureVector buf = serialize_params(); append_tls_length_value(buf, signature, 2); return buf; } /** * Serialize the ServerParams structure */ SecureVector Server_Key_Exchange::serialize_params() const { SecureVector buf; for(size_t i = 0; i != params.size(); ++i) append_tls_length_value(buf, BigInt::encode(params[i]), 2); return buf; } /** * Deserialize a Server Key Exchange message */ void Server_Key_Exchange::deserialize(const MemoryRegion& buf) { if(buf.size() < 6) throw Decoding_Error("Server_Key_Exchange: Packet corrupted"); SecureVector values[4]; size_t so_far = 0; for(size_t i = 0; i != 4; ++i) { const u16bit len = make_u16bit(buf[so_far], buf[so_far+1]); so_far += 2; if(len + so_far > buf.size()) throw Decoding_Error("Server_Key_Exchange: Packet corrupted"); values[i].resize(len); copy_mem(&values[i][0], &buf[so_far], len); so_far += len; if(i == 2 && so_far == buf.size()) break; } params.push_back(BigInt::decode(values[0])); params.push_back(BigInt::decode(values[1])); if(values[3].size()) { params.push_back(BigInt::decode(values[2])); signature = values[3]; } else signature = values[2]; } /** * Return the public key */ Public_Key* Server_Key_Exchange::key() const { if(params.size() == 2) return new RSA_PublicKey(params[0], params[1]); else if(params.size() == 3) return new DH_PublicKey(DL_Group(params[0], params[1]), params[2]); else throw Internal_Error("Server_Key_Exchange::key: No key set"); } /** * Verify a Server Key Exchange message */ bool Server_Key_Exchange::verify(const X509_Certificate& cert, const MemoryRegion& c_random, const MemoryRegion& s_random) const { std::auto_ptr key(cert.subject_public_key()); std::string padding = ""; Signature_Format format = IEEE_1363; if(key->algo_name() == "RSA") padding = "EMSA3(TLS.Digest.0)"; else if(key->algo_name() == "DSA") { padding = "EMSA1(SHA-1)"; format = DER_SEQUENCE; } else throw Invalid_Argument(key->algo_name() + " is invalid/unknown for TLS signatures"); PK_Verifier verifier(*key, padding, format); SecureVector params_got = serialize_params(); verifier.update(c_random); verifier.update(s_random); verifier.update(params_got); return verifier.check_signature(signature); } } Botan-1.10.12/src/ssl/tls_alerts.h0000664000175000017500000000204012654331322016475 0ustar jackjack00000000000000/* * Alert Message * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_ALERT_H__ #define BOTAN_TLS_ALERT_H__ #include namespace Botan { /** * SSL/TLS Alert Message */ class Alert { public: /** * @return if this alert is a fatal one or not */ bool is_fatal() const { return fatal; } /** * @return type of alert */ Alert_Type type() const { return type_code; } /** * Deserialize an Alert message * @param buf the serialized alert */ Alert(const MemoryRegion& buf) { if(buf.size() != 2) throw Decoding_Error("Alert: Bad size for alert message"); if(buf[0] == 1) fatal = false; else if(buf[0] == 2) fatal = true; else throw Decoding_Error("Alert: Bad type code for alert level"); type_code = static_cast(buf[1]); } private: bool fatal; Alert_Type type_code; }; } #endif Botan-1.10.12/src/ssl/tls_client.cpp0000664000175000017500000003617512654331322017034 0ustar jackjack00000000000000/* * TLS Client * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include #include #include #include namespace Botan { namespace { /** * Verify the state transition is allowed * FIXME: checks are wrong for session reuse (add a flag for that) */ void client_check_state(Handshake_Type new_msg, Handshake_State* state) { class State_Transition_Error : public Unexpected_Message { public: State_Transition_Error(const std::string& err) : Unexpected_Message("State transition error from " + err) {} }; if(new_msg == HELLO_REQUEST) { if(state->client_hello) throw State_Transition_Error("HelloRequest"); } else if(new_msg == SERVER_HELLO) { if(!state->client_hello || state->server_hello) throw State_Transition_Error("ServerHello"); } else if(new_msg == CERTIFICATE) { if(!state->server_hello || state->server_kex || state->cert_req || state->server_hello_done) throw State_Transition_Error("ServerCertificate"); } else if(new_msg == SERVER_KEX) { if(!state->server_hello || state->server_kex || state->cert_req || state->server_hello_done) throw State_Transition_Error("ServerKeyExchange"); } else if(new_msg == CERTIFICATE_REQUEST) { if(!state->server_certs || state->cert_req || state->server_hello_done) throw State_Transition_Error("CertificateRequest"); } else if(new_msg == SERVER_HELLO_DONE) { if(!state->server_hello || state->server_hello_done) throw State_Transition_Error("ServerHelloDone"); } else if(new_msg == HANDSHAKE_CCS) { if(!state->client_finished || state->server_finished) throw State_Transition_Error("ServerChangeCipherSpec"); } else if(new_msg == FINISHED) { if(!state->got_server_ccs) throw State_Transition_Error("ServerFinished"); } else throw Unexpected_Message("Unexpected message in handshake"); } } /** * TLS Client Constructor */ TLS_Client::TLS_Client(std::tr1::function input_fn, std::tr1::function output_fn, const TLS_Policy& policy, RandomNumberGenerator& rng) : input_fn(input_fn), policy(policy), rng(rng), writer(output_fn) { initialize(); } void TLS_Client::add_client_cert(const X509_Certificate& cert, Private_Key* cert_key) { certs.push_back(std::make_pair(cert, cert_key)); } /** * TLS Client Destructor */ TLS_Client::~TLS_Client() { close(); for(size_t i = 0; i != certs.size(); i++) delete certs[i].second; delete state; } /** * Initialize a TLS client connection */ void TLS_Client::initialize() { std::string error_str; Alert_Type error_type = NO_ALERT_TYPE; try { state = 0; active = false; writer.set_version(policy.pref_version()); do_handshake(); } catch(TLS_Exception& e) { error_str = e.what(); error_type = e.type(); } catch(std::exception& e) { error_str = e.what(); error_type = HANDSHAKE_FAILURE; } if(error_type != NO_ALERT_TYPE) { if(active) { active = false; reader.reset(); writer.alert(FATAL, error_type); writer.reset(); } if(state) { delete state; state = 0; } throw Stream_IO_Error("TLS_Client: Handshake failed: " + error_str); } } /** * Return the peer's certificate chain */ std::vector TLS_Client::peer_cert_chain() const { return peer_certs; } /** * Write to a TLS connection */ void TLS_Client::write(const byte buf[], size_t length) { if(!active) throw TLS_Exception(INTERNAL_ERROR, "TLS_Client::write called while closed"); writer.send(APPLICATION_DATA, buf, length); } /** * Read from a TLS connection */ size_t TLS_Client::read(byte out[], size_t length) { if(!active) return 0; writer.flush(); while(read_buf.size() == 0) { state_machine(); if(active == false) break; } size_t got = std::min(read_buf.size(), length); read_buf.read(out, got); return got; } /** * Close a TLS connection */ void TLS_Client::close() { close(WARNING, CLOSE_NOTIFY); } /** * Check connection status */ bool TLS_Client::is_closed() const { if(!active) return true; return false; } /** * Close a TLS connection */ void TLS_Client::close(Alert_Level level, Alert_Type alert_code) { if(active) { try { writer.alert(level, alert_code); writer.flush(); } catch(...) {} active = false; } } /** * Iterate the TLS state machine */ void TLS_Client::state_machine() { byte rec_type = CONNECTION_CLOSED; SecureVector record(1024); size_t bytes_needed = reader.get_record(rec_type, record); while(bytes_needed) { size_t to_get = std::min(record.size(), bytes_needed); size_t got = input_fn(&record[0], to_get); if(got == 0) { rec_type = CONNECTION_CLOSED; break; } reader.add_input(&record[0], got); bytes_needed = reader.get_record(rec_type, record); } if(rec_type == CONNECTION_CLOSED) { active = false; reader.reset(); writer.reset(); } else if(rec_type == APPLICATION_DATA) { if(active) read_buf.write(&record[0], record.size()); else throw Unexpected_Message("Application data before handshake done"); } else if(rec_type == HANDSHAKE || rec_type == CHANGE_CIPHER_SPEC) read_handshake(rec_type, record); else if(rec_type == ALERT) { Alert alert(record); if(alert.is_fatal() || alert.type() == CLOSE_NOTIFY) { if(alert.type() == CLOSE_NOTIFY) writer.alert(WARNING, CLOSE_NOTIFY); reader.reset(); writer.reset(); active = false; if(state) { delete state; state = 0; } } } else throw Unexpected_Message("Unknown message type received"); } /** * Split up and process handshake messages */ void TLS_Client::read_handshake(byte rec_type, const MemoryRegion& rec_buf) { if(rec_type == HANDSHAKE) { if(!state) return; state->queue.write(&rec_buf[0], rec_buf.size()); } while(true) { Handshake_Type type = HANDSHAKE_NONE; SecureVector contents; if(rec_type == HANDSHAKE) { if(state->queue.size() >= 4) { byte head[4] = { 0 }; state->queue.peek(head, 4); const size_t length = make_u32bit(0, head[1], head[2], head[3]); if(state->queue.size() >= length + 4) { type = static_cast(head[0]); contents.resize(length); state->queue.read(head, 4); state->queue.read(&contents[0], contents.size()); } } } else if(rec_type == CHANGE_CIPHER_SPEC) { if(state->queue.size() == 0 && rec_buf.size() == 1 && rec_buf[0] == 1) type = HANDSHAKE_CCS; else throw Decoding_Error("Malformed ChangeCipherSpec message"); } else throw Decoding_Error("Unknown message type in handshake processing"); if(type == HANDSHAKE_NONE) break; process_handshake_msg(type, contents); if(type == HANDSHAKE_CCS || !state) break; } } /** * Process a handshake message */ void TLS_Client::process_handshake_msg(Handshake_Type type, const MemoryRegion& contents) { if(type == HELLO_REQUEST) return; if(state == 0) throw Unexpected_Message("Unexpected handshake message"); if(type != HANDSHAKE_CCS && type != HELLO_REQUEST && type != FINISHED) { state->hash.update(static_cast(type)); const size_t record_length = contents.size(); for(size_t i = 0; i != 3; i++) state->hash.update(get_byte(i+1, record_length)); state->hash.update(contents); } if(type == SERVER_HELLO) { client_check_state(type, state); state->server_hello = new Server_Hello(contents); if(!state->client_hello->offered_suite( state->server_hello->ciphersuite() ) ) throw TLS_Exception(HANDSHAKE_FAILURE, "TLS_Client: Server replied with bad ciphersuite"); state->version = state->server_hello->version(); if(state->version > state->client_hello->version()) throw TLS_Exception(HANDSHAKE_FAILURE, "TLS_Client: Server replied with bad version"); if(state->version < policy.min_version()) throw TLS_Exception(PROTOCOL_VERSION, "TLS_Client: Server is too old for specified policy"); writer.set_version(state->version); reader.set_version(state->version); state->suite = CipherSuite(state->server_hello->ciphersuite()); } else if(type == CERTIFICATE) { client_check_state(type, state); if(state->suite.sig_type() == TLS_ALGO_SIGNER_ANON) throw Unexpected_Message("Recived certificate from anonymous server"); state->server_certs = new Certificate(contents); peer_certs = state->server_certs->cert_chain(); if(peer_certs.size() == 0) throw TLS_Exception(HANDSHAKE_FAILURE, "TLS_Client: No certificates sent by server"); if(!policy.check_cert(peer_certs)) throw TLS_Exception(BAD_CERTIFICATE, "TLS_Client: Server certificate is not valid"); state->kex_pub = peer_certs[0].subject_public_key(); bool is_dsa = false, is_rsa = false; if(dynamic_cast(state->kex_pub)) is_dsa = true; else if(dynamic_cast(state->kex_pub)) is_rsa = true; else throw TLS_Exception(UNSUPPORTED_CERTIFICATE, "Unknown key type received in server kex"); if((is_dsa && state->suite.sig_type() != TLS_ALGO_SIGNER_DSA) || (is_rsa && state->suite.sig_type() != TLS_ALGO_SIGNER_RSA)) throw TLS_Exception(ILLEGAL_PARAMETER, "Certificate key type did not match ciphersuite"); } else if(type == SERVER_KEX) { client_check_state(type, state); if(state->suite.kex_type() == TLS_ALGO_KEYEXCH_NOKEX) throw Unexpected_Message("Unexpected key exchange from server"); state->server_kex = new Server_Key_Exchange(contents); if(state->kex_pub) delete state->kex_pub; state->kex_pub = state->server_kex->key(); bool is_dh = false, is_rsa = false; if(dynamic_cast(state->kex_pub)) is_dh = true; else if(dynamic_cast(state->kex_pub)) is_rsa = true; else throw TLS_Exception(HANDSHAKE_FAILURE, "Unknown key type received in server kex"); if((is_dh && state->suite.kex_type() != TLS_ALGO_KEYEXCH_DH) || (is_rsa && state->suite.kex_type() != TLS_ALGO_KEYEXCH_RSA)) throw TLS_Exception(ILLEGAL_PARAMETER, "Certificate key type did not match ciphersuite"); if(state->suite.sig_type() != TLS_ALGO_SIGNER_ANON) { if(!state->server_kex->verify(peer_certs[0], state->client_hello->random(), state->server_hello->random())) throw TLS_Exception(DECRYPT_ERROR, "Bad signature on server key exchange"); } } else if(type == CERTIFICATE_REQUEST) { client_check_state(type, state); state->cert_req = new Certificate_Req(contents); state->do_client_auth = true; } else if(type == SERVER_HELLO_DONE) { client_check_state(type, state); state->server_hello_done = new Server_Hello_Done(contents); if(state->do_client_auth) { std::vector send_certs; std::vector types = state->cert_req->acceptable_types(); // FIXME: Fill in useful certs here, if any state->client_certs = new Certificate(writer, send_certs, state->hash); } state->client_kex = new Client_Key_Exchange(rng, writer, state->hash, state->kex_pub, state->version, state->client_hello->version()); if(state->do_client_auth) { Private_Key* key_matching_cert = 0; // FIXME state->client_verify = new Certificate_Verify(rng, writer, state->hash, key_matching_cert); } state->keys = SessionKeys(state->suite, state->version, state->client_kex->pre_master_secret(), state->client_hello->random(), state->server_hello->random()); writer.send(CHANGE_CIPHER_SPEC, 1); writer.flush(); writer.set_keys(state->suite, state->keys, CLIENT); state->client_finished = new Finished(writer, state->version, CLIENT, state->keys.master_secret(), state->hash); } else if(type == HANDSHAKE_CCS) { client_check_state(type, state); reader.set_keys(state->suite, state->keys, CLIENT); state->got_server_ccs = true; } else if(type == FINISHED) { client_check_state(type, state); state->server_finished = new Finished(contents); if(!state->server_finished->verify(state->keys.master_secret(), state->version, state->hash, SERVER)) throw TLS_Exception(DECRYPT_ERROR, "Finished message didn't verify"); delete state; state = 0; active = true; } else throw Unexpected_Message("Unknown handshake message received"); } /** * Perform a client-side TLS handshake */ void TLS_Client::do_handshake() { state = new Handshake_State; state->client_hello = new Client_Hello(rng, writer, policy, state->hash); while(true) { if(active && !state) break; if(!active && !state) throw TLS_Exception(HANDSHAKE_FAILURE, "TLS_Client: Handshake failed (do_handshake)"); state_machine(); } } } Botan-1.10.12/src/ssl/tls_client.h0000664000175000017500000000334212654331322016467 0ustar jackjack00000000000000/* * TLS Client * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_CLIENT_H__ #define BOTAN_TLS_CLIENT_H__ #include #include #include #include #include namespace Botan { /** * SSL/TLS Client */ class BOTAN_DLL TLS_Client : public TLS_Connection { public: size_t read(byte buf[], size_t buf_len); void write(const byte buf[], size_t buf_len); void close(); bool is_closed() const; std::vector peer_cert_chain() const; void add_client_cert(const X509_Certificate& cert, Private_Key* cert_key); TLS_Client(std::tr1::function input_fn, std::tr1::function output_fn, const TLS_Policy& policy, RandomNumberGenerator& rng); ~TLS_Client(); private: void close(Alert_Level, Alert_Type); size_t get_pending_socket_input(byte output[], size_t length); void initialize(); void do_handshake(); void state_machine(); void read_handshake(byte, const MemoryRegion&); void process_handshake_msg(Handshake_Type, const MemoryRegion&); std::tr1::function input_fn; const TLS_Policy& policy; RandomNumberGenerator& rng; Record_Writer writer; Record_Reader reader; std::vector peer_certs; std::vector > certs; class Handshake_State* state; SecureVector session_id; SecureQueue read_buf; bool active; }; } #endif Botan-1.10.12/src/ssl/tls_connection.h0000664000175000017500000000123012654331322017342 0ustar jackjack00000000000000/* * TLS Connection * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_CONNECTION_H__ #define BOTAN_TLS_CONNECTION_H__ #include #include namespace Botan { /** * TLS Connection */ class BOTAN_DLL TLS_Connection { public: virtual size_t read(byte[], size_t) = 0; virtual void write(const byte[], size_t) = 0; size_t read(byte& in) { return read(&in, 1); } void write(byte out) { write(&out, 1); } virtual std::vector peer_cert_chain() const = 0; virtual void close() = 0; virtual ~TLS_Connection() {} }; } #endif Botan-1.10.12/src/ssl/tls_exceptn.h0000664000175000017500000000145512654331322016662 0ustar jackjack00000000000000/* * Exceptions * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_EXCEPTION_H__ #define BOTAN_TLS_EXCEPTION_H__ #include #include namespace Botan { /** * Exception Base Class */ class BOTAN_DLL TLS_Exception : public Exception { public: Alert_Type type() const throw() { return alert_type; } TLS_Exception(Alert_Type type, const std::string& err_msg = "Unknown error") : Exception(err_msg), alert_type(type) {} private: Alert_Type alert_type; }; /** * Unexpected_Message Exception */ struct BOTAN_DLL Unexpected_Message : public TLS_Exception { Unexpected_Message(const std::string& err) : TLS_Exception(UNEXPECTED_MESSAGE, err) {} }; } #endif Botan-1.10.12/src/ssl/tls_handshake_hash.cpp0000664000175000017500000000250112654331322020471 0ustar jackjack00000000000000/* * TLS Handshake Hash * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include namespace Botan { /** * Return a TLS Handshake Hash */ SecureVector HandshakeHash::final() { MD5 md5; SHA_160 sha1; md5.update(data); sha1.update(data); SecureVector output; output += md5.final(); output += sha1.final(); return output; } /** * Return a SSLv3 Handshake Hash */ SecureVector HandshakeHash::final_ssl3(const MemoryRegion& secret) { const byte PAD_INNER = 0x36, PAD_OUTER = 0x5C; MD5 md5; SHA_160 sha1; md5.update(data); sha1.update(data); md5.update(secret); sha1.update(secret); for(size_t i = 0; i != 48; ++i) md5.update(PAD_INNER); for(size_t i = 0; i != 40; ++i) sha1.update(PAD_INNER); SecureVector inner_md5 = md5.final(), inner_sha1 = sha1.final(); md5.update(secret); sha1.update(secret); for(size_t i = 0; i != 48; ++i) md5.update(PAD_OUTER); for(size_t i = 0; i != 40; ++i) sha1.update(PAD_OUTER); md5.update(inner_md5); sha1.update(inner_sha1); SecureVector output; output += md5.final(); output += sha1.final(); return output; } } Botan-1.10.12/src/ssl/tls_handshake_hash.h0000664000175000017500000000130312654331322020135 0ustar jackjack00000000000000/* * TLS Handshake Hash * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_HANDSHAKE_HASH_H__ #define BOTAN_TLS_HANDSHAKE_HASH_H__ #include namespace Botan { using namespace Botan; /** * TLS Handshake Hash */ class HandshakeHash { public: void update(const byte in[], size_t length) { data += std::make_pair(in, length); } void update(const MemoryRegion& in) { data += in; } void update(byte in) { data.push_back(in); } SecureVector final(); SecureVector final_ssl3(const MemoryRegion&); private: SecureVector data; }; } #endif Botan-1.10.12/src/ssl/tls_magic.h0000664000175000017500000001274312654331322016276 0ustar jackjack00000000000000/* * SSL/TLS Protocol Constants * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_PROTOCOL_MAGIC_H__ #define BOTAN_TLS_PROTOCOL_MAGIC_H__ namespace Botan { /** * Protocol Constants for SSL/TLS */ enum Size_Limits { MAX_PLAINTEXT_SIZE = 16*1024, MAX_COMPRESSED_SIZE = MAX_PLAINTEXT_SIZE + 1024, MAX_CIPHERTEXT_SIZE = MAX_COMPRESSED_SIZE + 1024 }; enum Version_Code { NO_VERSION_SET = 0x0000, SSL_V3 = 0x0300, TLS_V10 = 0x0301, TLS_V11 = 0x0302 }; enum Connection_Side { CLIENT, SERVER }; enum Record_Type { CONNECTION_CLOSED = 0, CHANGE_CIPHER_SPEC = 20, ALERT = 21, HANDSHAKE = 22, APPLICATION_DATA = 23 }; enum Handshake_Type { HELLO_REQUEST = 0, CLIENT_HELLO = 1, CLIENT_HELLO_SSLV2 = 255, // not a wire value SERVER_HELLO = 2, CERTIFICATE = 11, SERVER_KEX = 12, CERTIFICATE_REQUEST = 13, SERVER_HELLO_DONE = 14, CERTIFICATE_VERIFY = 15, CLIENT_KEX = 16, FINISHED = 20, HANDSHAKE_CCS = 100, HANDSHAKE_NONE = 101 }; enum Alert_Level { WARNING = 1, FATAL = 2 }; enum Alert_Type { CLOSE_NOTIFY = 0, UNEXPECTED_MESSAGE = 10, BAD_RECORD_MAC = 20, DECRYPTION_FAILED = 21, RECORD_OVERFLOW = 22, DECOMPRESSION_FAILURE = 30, HANDSHAKE_FAILURE = 40, BAD_CERTIFICATE = 42, UNSUPPORTED_CERTIFICATE = 43, CERTIFICATE_REVOKED = 44, CERTIFICATE_EXPIRED = 45, CERTIFICATE_UNKNOWN = 46, ILLEGAL_PARAMETER = 47, UNKNOWN_CA = 48, ACCESS_DENIED = 49, DECODE_ERROR = 50, DECRYPT_ERROR = 51, EXPORT_RESTRICTION = 60, PROTOCOL_VERSION = 70, INSUFFICIENT_SECURITY = 71, INTERNAL_ERROR = 80, USER_CANCELED = 90, NO_RENEGOTIATION = 100, UNKNOWN_PSK_IDENTITY = 115, NO_ALERT_TYPE = 0xFFFF }; enum Certificate_Type { RSA_CERT = 1, DSS_CERT = 2, DH_RSA_CERT = 3, DH_DSS_CERT = 4 }; enum Ciphersuite_Code { TLS_RSA_WITH_RC4_128_MD5 = 0x0004, TLS_RSA_WITH_RC4_128_SHA = 0x0005, TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x000A, TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F, TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035, TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C, TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D, TLS_RSA_WITH_SEED_CBC_SHA = 0x0096, TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0x0013, TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032, TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040, TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A, TLS_DHE_DSS_WITH_SEED_CBC_SHA = 0x0099, TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x0016, TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033, TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B, TLS_DHE_RSA_WITH_SEED_CBC_SHA = 0x009A, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA = 0xC007, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA = 0xC008, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024, TLS_ECDHE_RSA_WITH_RC4_128_SHA = 0xC011, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA = 0xC012, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028, TLS_NO_RENEGOTIATION_SCSV = 0x00FF, }; /* * Form of the ciphersuites broken down by field instead of * being randomly assigned codepoints. */ enum TLS_Ciphersuite_Algos { TLS_ALGO_SIGNER_MASK = 0xFF000000, TLS_ALGO_SIGNER_ANON = 0x01000000, TLS_ALGO_SIGNER_RSA = 0x02000000, TLS_ALGO_SIGNER_DSA = 0x03000000, TLS_ALGO_SIGNER_ECDSA = 0x04000000, TLS_ALGO_KEYEXCH_MASK = 0x00FF0000, TLS_ALGO_KEYEXCH_NOKEX = 0x00010000, TLS_ALGO_KEYEXCH_RSA = 0x00020000, TLS_ALGO_KEYEXCH_DH = 0x00030000, TLS_ALGO_KEYEXCH_ECDH = 0x00040000, TLS_ALGO_MAC_MASK = 0x0000FF00, TLS_ALGO_MAC_MD5 = 0x00000100, TLS_ALGO_MAC_SHA1 = 0x00000200, TLS_ALGO_MAC_SHA256 = 0x00000300, TLS_ALGO_MAC_SHA384 = 0x00000400, TLS_ALGO_CIPHER_MASK = 0x000000FF, TLS_ALGO_CIPHER_RC4_128 = 0x00000001, TLS_ALGO_CIPHER_3DES_CBC = 0x00000002, TLS_ALGO_CIPHER_AES128_CBC = 0x00000003, TLS_ALGO_CIPHER_AES256_CBC = 0x00000004, TLS_ALGO_CIPHER_SEED_CBC = 0x00000005 }; enum Compression_Algo { NO_COMPRESSION = 0x00 }; enum TLS_Handshake_Extension_Type { TLSEXT_SERVER_NAME_INDICATION = 0, TLSEXT_MAX_FRAGMENT_LENGTH = 1, TLSEXT_CLIENT_CERT_URL = 2, TLSEXT_TRUSTED_CA_KEYS = 3, TLSEXT_TRUNCATED_HMAC = 4, TLSEXT_USABLE_ELLIPTIC_CURVES = 10, TLSEXT_EC_POINT_FORMATS = 11, TLSEXT_SRP_IDENTIFIER = 12, TLSEXT_CERTIFICATE_TYPES = 9, TLSEXT_SESSION_TICKET = 35 }; } #endif Botan-1.10.12/src/ssl/tls_messages.h0000664000175000017500000002116112654331322017017 0ustar jackjack00000000000000/* * TLS Messages * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_MESSAGES_H__ #define BOTAN_TLS_MESSAGES_H__ #include #include #include #include #include #include #include namespace Botan { /** * TLS Handshake Message Base Class */ class HandshakeMessage { public: void send(Record_Writer&, HandshakeHash&) const; virtual Handshake_Type type() const = 0; virtual ~HandshakeMessage() {} private: HandshakeMessage& operator=(const HandshakeMessage&) { return (*this); } virtual SecureVector serialize() const = 0; virtual void deserialize(const MemoryRegion&) = 0; }; /** * Client Hello Message */ class Client_Hello : public HandshakeMessage { public: Handshake_Type type() const { return CLIENT_HELLO; } Version_Code version() const { return c_version; } const SecureVector& session_id() const { return sess_id; } std::vector ciphersuites() const { return suites; } std::vector compression_algos() const { return comp_algos; } const SecureVector& random() const { return c_random; } std::string hostname() const { return requested_hostname; } std::string srp_identifier() const { return requested_srp_id; } bool offered_suite(u16bit) const; Client_Hello(RandomNumberGenerator& rng, Record_Writer&, const TLS_Policy&, HandshakeHash&); Client_Hello(const MemoryRegion& buf, Handshake_Type type) { if(type == CLIENT_HELLO) deserialize(buf); else deserialize_sslv2(buf); } private: SecureVector serialize() const; void deserialize(const MemoryRegion&); void deserialize_sslv2(const MemoryRegion&); Version_Code c_version; SecureVector sess_id, c_random; std::vector suites; std::vector comp_algos; std::string requested_hostname; std::string requested_srp_id; }; /** * Client Key Exchange Message */ class Client_Key_Exchange : public HandshakeMessage { public: Handshake_Type type() const { return CLIENT_KEX; } SecureVector pre_master_secret() const; SecureVector pre_master_secret(RandomNumberGenerator& rng, const Private_Key* key, Version_Code version); Client_Key_Exchange(RandomNumberGenerator& rng, Record_Writer& output, HandshakeHash& hash, const Public_Key* my_key, Version_Code using_version, Version_Code pref_version); Client_Key_Exchange(const MemoryRegion& buf, const CipherSuite& suite, Version_Code using_version); private: SecureVector serialize() const; void deserialize(const MemoryRegion&); SecureVector key_material, pre_master; bool include_length; }; /** * Certificate Message */ class Certificate : public HandshakeMessage { public: Handshake_Type type() const { return CERTIFICATE; } std::vector cert_chain() const { return certs; } Certificate(Record_Writer&, const std::vector&, HandshakeHash&); Certificate(const MemoryRegion& buf) { deserialize(buf); } private: SecureVector serialize() const; void deserialize(const MemoryRegion&); std::vector certs; }; /** * Certificate Request Message */ class Certificate_Req : public HandshakeMessage { public: Handshake_Type type() const { return CERTIFICATE_REQUEST; } std::vector acceptable_types() const { return types; } std::vector acceptable_CAs() const { return names; } /* TODO Certificate_Req(Record_Writer&, HandshakeHash&, const X509_Certificate&); */ Certificate_Req(Record_Writer&, HandshakeHash&, const std::vector&); Certificate_Req(const MemoryRegion& buf) { deserialize(buf); } private: SecureVector serialize() const; void deserialize(const MemoryRegion&); std::vector names; std::vector types; }; /** * Certificate Verify Message */ class Certificate_Verify : public HandshakeMessage { public: Handshake_Type type() const { return CERTIFICATE_VERIFY; } bool verify(const X509_Certificate&, HandshakeHash&); Certificate_Verify(RandomNumberGenerator& rng, Record_Writer&, HandshakeHash&, const Private_Key*); Certificate_Verify(const MemoryRegion& buf) { deserialize(buf); } private: SecureVector serialize() const; void deserialize(const MemoryRegion&); SecureVector signature; }; /** * Finished Message */ class Finished : public HandshakeMessage { public: Handshake_Type type() const { return FINISHED; } bool verify(const MemoryRegion&, Version_Code, const HandshakeHash&, Connection_Side); Finished(Record_Writer&, Version_Code, Connection_Side, const MemoryRegion&, HandshakeHash&); Finished(const MemoryRegion& buf) { deserialize(buf); } private: SecureVector serialize() const; void deserialize(const MemoryRegion&); SecureVector compute_verify(const MemoryRegion&, HandshakeHash, Connection_Side, Version_Code); Connection_Side side; SecureVector verification_data; }; /** * Hello Request Message */ class Hello_Request : public HandshakeMessage { public: Handshake_Type type() const { return HELLO_REQUEST; } Hello_Request(Record_Writer&); Hello_Request(const MemoryRegion& buf) { deserialize(buf); } private: SecureVector serialize() const; void deserialize(const MemoryRegion&); }; /** * Server Hello Message */ class Server_Hello : public HandshakeMessage { public: Handshake_Type type() const { return SERVER_HELLO; } Version_Code version() { return s_version; } const SecureVector& session_id() const { return sess_id; } u16bit ciphersuite() const { return suite; } byte compression_algo() const { return comp_algo; } const SecureVector& random() const { return s_random; } Server_Hello(RandomNumberGenerator& rng, Record_Writer&, const TLS_Policy&, const std::vector&, const Client_Hello&, Version_Code, HandshakeHash&); Server_Hello(const MemoryRegion& buf) { deserialize(buf); } private: SecureVector serialize() const; void deserialize(const MemoryRegion&); Version_Code s_version; SecureVector sess_id, s_random; u16bit suite; byte comp_algo; }; /** * Server Key Exchange Message */ class Server_Key_Exchange : public HandshakeMessage { public: Handshake_Type type() const { return SERVER_KEX; } Public_Key* key() const; bool verify(const X509_Certificate&, const MemoryRegion&, const MemoryRegion&) const; Server_Key_Exchange(RandomNumberGenerator& rng, Record_Writer&, const Public_Key*, const Private_Key*, const MemoryRegion&, const MemoryRegion&, HandshakeHash&); Server_Key_Exchange(const MemoryRegion& buf) { deserialize(buf); } private: SecureVector serialize() const; SecureVector serialize_params() const; void deserialize(const MemoryRegion&); std::vector params; SecureVector signature; }; /** * Server Hello Done Message */ class Server_Hello_Done : public HandshakeMessage { public: Handshake_Type type() const { return SERVER_HELLO_DONE; } Server_Hello_Done(Record_Writer&, HandshakeHash&); Server_Hello_Done(const MemoryRegion& buf) { deserialize(buf); } private: SecureVector serialize() const; void deserialize(const MemoryRegion&); }; } #endif Botan-1.10.12/src/ssl/tls_policy.cpp0000664000175000017500000000604312654331322017044 0ustar jackjack00000000000000/* * Policies for TLS * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include namespace Botan { /* * Return allowed ciphersuites */ std::vector TLS_Policy::ciphersuites() const { return suite_list(allow_static_rsa(), allow_edh_rsa(), allow_edh_dsa()); } /* * Return allowed ciphersuites */ std::vector TLS_Policy::suite_list(bool use_rsa, bool use_edh_rsa, bool use_edh_dsa) const { std::vector suites; if(use_edh_dsa) { suites.push_back(TLS_DHE_DSS_WITH_AES_256_CBC_SHA); suites.push_back(TLS_DHE_DSS_WITH_AES_128_CBC_SHA); suites.push_back(TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA); suites.push_back(TLS_DHE_DSS_WITH_SEED_CBC_SHA); } if(use_edh_rsa) { suites.push_back(TLS_DHE_RSA_WITH_AES_256_CBC_SHA); suites.push_back(TLS_DHE_RSA_WITH_AES_128_CBC_SHA); suites.push_back(TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA); suites.push_back(TLS_DHE_RSA_WITH_SEED_CBC_SHA); } if(use_rsa) { suites.push_back(TLS_RSA_WITH_AES_256_CBC_SHA); suites.push_back(TLS_RSA_WITH_AES_128_CBC_SHA); suites.push_back(TLS_RSA_WITH_3DES_EDE_CBC_SHA); suites.push_back(TLS_RSA_WITH_SEED_CBC_SHA); //suites.push_back(TLS_RSA_WITH_RC4_128_SHA); //suites.push_back(TLS_RSA_WITH_RC4_128_MD5); } if(suites.size() == 0) throw TLS_Exception(INTERNAL_ERROR, "TLS_Policy error: All ciphersuites disabled"); suites.push_back(TLS_NO_RENEGOTIATION_SCSV); return suites; } /* * Return allowed compression algorithms */ std::vector TLS_Policy::compression() const { std::vector algs; algs.push_back(NO_COMPRESSION); return algs; } /* * Choose which ciphersuite to use */ u16bit TLS_Policy::choose_suite(const std::vector& c_suites, bool have_rsa, bool have_dsa) const { bool use_static_rsa = allow_static_rsa() && have_rsa; bool use_edh_rsa = allow_edh_rsa() && have_rsa; bool use_edh_dsa = allow_edh_dsa() && have_dsa; std::vector s_suites = suite_list(use_static_rsa, use_edh_rsa, use_edh_dsa); for(size_t i = 0; i != s_suites.size(); ++i) for(size_t j = 0; j != c_suites.size(); ++j) if(s_suites[i] == c_suites[j]) return s_suites[i]; return 0; } /* * Choose which compression algorithm to use */ byte TLS_Policy::choose_compression(const std::vector& c_comp) const { std::vector s_comp = compression(); for(size_t i = 0; i != s_comp.size(); ++i) for(size_t j = 0; j != c_comp.size(); ++j) if(s_comp[i] == c_comp[j]) return s_comp[i]; return NO_COMPRESSION; } /* * Return the group to use for empheral DH */ DL_Group TLS_Policy::dh_group() const { return DL_Group("modp/ietf/1024"); } } Botan-1.10.12/src/ssl/tls_policy.h0000664000175000017500000000333412654331322016511 0ustar jackjack00000000000000/* * Policies * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_POLICY_H__ #define BOTAN_TLS_POLICY_H__ #include #include #include #include namespace Botan { /** * TLS Policy Base Class * Inherit and overload as desired to suite local policy concerns */ class BOTAN_DLL TLS_Policy { public: std::vector ciphersuites() const; virtual std::vector compression() const; virtual u16bit choose_suite(const std::vector& client_suites, bool rsa_ok, bool dsa_ok) const; virtual byte choose_compression(const std::vector& client) const; virtual bool allow_static_rsa() const { return true; } virtual bool allow_edh_rsa() const { return true; } virtual bool allow_edh_dsa() const { return true; } virtual bool require_client_auth() const { return false; } virtual DL_Group dh_group() const; virtual size_t rsa_export_keysize() const { return 512; } /* * @return the minimum version that we will negotiate */ virtual Version_Code min_version() const { return TLS_V10; } /* * @return the version we would prefer to negotiate */ virtual Version_Code pref_version() const { return TLS_V11; } virtual bool check_cert(const std::vector& cert_chain) const = 0; virtual ~TLS_Policy() {} private: virtual std::vector suite_list(bool use_rsa, bool use_edh_rsa, bool use_edh_dsa) const; }; } #endif Botan-1.10.12/src/ssl/tls_reader.h0000664000175000017500000001147312654331322016457 0ustar jackjack00000000000000/* * TLS Data Reader * (C) 2010 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_READER_H__ #define BOTAN_TLS_READER_H__ #include #include namespace Botan { /** * Helper class for decoding TLS protocol messages */ class TLS_Data_Reader { public: TLS_Data_Reader(const MemoryRegion& buf_in) : buf(buf_in), offset(0) {} size_t remaining_bytes() const { return buf.size() - offset; } bool has_remaining() const { return (remaining_bytes() > 0); } void discard_next(size_t bytes) { assert_at_least(bytes); offset += bytes; } u16bit get_u16bit() { assert_at_least(2); u16bit result = make_u16bit(buf[offset], buf[offset+1]); offset += 2; return result; } byte get_byte() { assert_at_least(1); byte result = buf[offset]; offset += 1; return result; } template Container get_elem(size_t num_elems) { assert_at_least(num_elems * sizeof(T)); Container result(num_elems); for(size_t i = 0; i != num_elems; ++i) result[i] = load_be(&buf[offset], i); offset += num_elems * sizeof(T); return result; } template SecureVector get_range(size_t len_bytes, size_t min_elems, size_t max_elems) { const size_t num_elems = get_num_elems(len_bytes, sizeof(T), min_elems, max_elems); return get_elem >(num_elems); } template std::vector get_range_vector(size_t len_bytes, size_t min_elems, size_t max_elems) { const size_t num_elems = get_num_elems(len_bytes, sizeof(T), min_elems, max_elems); return get_elem >(num_elems); } template SecureVector get_fixed(size_t size) { return get_elem >(size); } private: size_t get_length_field(size_t len_bytes) { assert_at_least(len_bytes); if(len_bytes == 1) return get_byte(); else if(len_bytes == 2) return get_u16bit(); throw Decoding_Error("TLS_Data_Reader: Bad length size"); } size_t get_num_elems(size_t len_bytes, size_t T_size, size_t min_elems, size_t max_elems) { const size_t byte_length = get_length_field(len_bytes); if(byte_length % T_size != 0) throw Decoding_Error("TLS_Data_Reader: Size isn't multiple of T"); const size_t num_elems = byte_length / T_size; if(num_elems < min_elems || num_elems > max_elems) throw Decoding_Error("TLS_Data_Reader: Range outside paramaters"); return num_elems; } void assert_at_least(size_t n) const { if(buf.size() - offset < n) throw Decoding_Error("TLS_Data_Reader: Corrupt packet"); } const MemoryRegion& buf; size_t offset; }; /** * Helper function for encoding length-tagged vectors */ template void append_tls_length_value(MemoryRegion& buf, const T* vals, size_t vals_size, size_t tag_size) { const size_t T_size = sizeof(T); const size_t val_bytes = T_size * vals_size; if(tag_size != 1 && tag_size != 2) throw std::invalid_argument("append_tls_length_value: invalid tag size"); if((tag_size == 1 && val_bytes > 255) || (tag_size == 2 && val_bytes > 65535)) throw std::invalid_argument("append_tls_length_value: value too large"); for(size_t i = 0; i != tag_size; ++i) buf.push_back(get_byte(sizeof(val_bytes)-tag_size+i, val_bytes)); for(size_t i = 0; i != vals_size; ++i) for(size_t j = 0; j != T_size; ++j) buf.push_back(get_byte(j, vals[i])); } template void append_tls_length_value(MemoryRegion& buf, const MemoryRegion& vals, size_t tag_size) { append_tls_length_value(buf, &vals[0], vals.size(), tag_size); } template void append_tls_length_value(MemoryRegion& buf, const std::vector& vals, size_t tag_size) { append_tls_length_value(buf, &vals[0], vals.size(), tag_size); } } #endif Botan-1.10.12/src/ssl/tls_record.h0000664000175000017500000000507412654331322016473 0ustar jackjack00000000000000/* * TLS Record Handling * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_RECORDS_H__ #define BOTAN_TLS_RECORDS_H__ #include #include #include #include #include #include #if defined(BOTAN_USE_STD_TR1) #if defined(BOTAN_BUILD_COMPILER_IS_MSVC) #include #else #include #endif #elif defined(BOTAN_USE_BOOST_TR1) #include #else #error "No TR1 library defined for use" #endif namespace Botan { using namespace std::tr1::placeholders; /** * TLS Record Writer */ class BOTAN_DLL Record_Writer { public: void send(byte type, const byte input[], size_t length); void send(byte type, byte val) { send(type, &val, 1); } void flush(); void alert(Alert_Level, Alert_Type); void set_keys(const CipherSuite&, const SessionKeys&, Connection_Side); void set_version(Version_Code); void reset(); Record_Writer(std::tr1::function output_fn); ~Record_Writer() { delete mac; } private: void send_record(byte type, const byte input[], size_t length); void send_record(byte type, byte major, byte minor, const byte input[], size_t length); std::tr1::function output_fn; Pipe cipher; MessageAuthenticationCode* mac; SecureVector buffer; size_t buf_pos; size_t block_size, mac_size, iv_size; u64bit seq_no; byte major, minor, buf_type; }; /** * TLS Record Reader */ class BOTAN_DLL Record_Reader { public: void add_input(const byte input[], size_t input_size); /** * @param msg_type (output variable) * @param buffer (output variable) * @return Number of bytes still needed (minimum), or 0 if success */ size_t get_record(byte& msg_type, MemoryRegion& buffer); SecureVector get_record(byte& msg_type); void set_keys(const CipherSuite& suite, const SessionKeys& keys, Connection_Side side); void set_version(Version_Code version); void reset(); Record_Reader() { mac = 0; reset(); } ~Record_Reader() { delete mac; } private: SecureQueue input_queue; Pipe cipher; MessageAuthenticationCode* mac; size_t block_size, mac_size, iv_size; u64bit seq_no; byte major, minor; }; } #endif Botan-1.10.12/src/ssl/tls_server.cpp0000664000175000017500000003172212654331322017055 0ustar jackjack00000000000000/* * TLS Server * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include #include #include namespace Botan { namespace { /* * Choose what version to respond with */ Version_Code choose_version(Version_Code client, Version_Code minimum) { if(client < minimum) throw TLS_Exception(PROTOCOL_VERSION, "Client version is unacceptable by policy"); if(client == SSL_V3 || client == TLS_V10 || client == TLS_V11) return client; return TLS_V11; } // FIXME: checks are wrong for session reuse (add a flag for that) /* * Verify the state transition is allowed */ void server_check_state(Handshake_Type new_msg, Handshake_State* state) { class State_Transition_Error : public Unexpected_Message { public: State_Transition_Error(const std::string& err) : Unexpected_Message("State transition error from " + err) {} }; if(new_msg == CLIENT_HELLO || new_msg == CLIENT_HELLO_SSLV2) { if(state->server_hello) throw State_Transition_Error("ClientHello"); } else if(new_msg == CERTIFICATE) { if(!state->do_client_auth || !state->cert_req || !state->server_hello_done || state->client_kex) throw State_Transition_Error("ClientCertificate"); } else if(new_msg == CLIENT_KEX) { if(!state->server_hello_done || state->client_verify || state->got_client_ccs) throw State_Transition_Error("ClientKeyExchange"); } else if(new_msg == CERTIFICATE_VERIFY) { if(!state->cert_req || !state->client_certs || !state->client_kex || state->got_client_ccs) throw State_Transition_Error("CertificateVerify"); } else if(new_msg == HANDSHAKE_CCS) { if(!state->client_kex || state->client_finished) throw State_Transition_Error("ClientChangeCipherSpec"); } else if(new_msg == FINISHED) { if(!state->got_client_ccs) throw State_Transition_Error("ClientFinished"); } else throw Unexpected_Message("Unexpected message in handshake"); } } /* * TLS Server Constructor */ TLS_Server::TLS_Server(std::tr1::function input_fn, std::tr1::function output_fn, const TLS_Policy& policy, RandomNumberGenerator& rng, const X509_Certificate& cert, const Private_Key& cert_key) : input_fn(input_fn), policy(policy), rng(rng), writer(output_fn) { state = 0; cert_chain.push_back(cert); private_key = PKCS8::copy_key(cert_key, rng); try { active = false; writer.set_version(TLS_V10); do_handshake(); active = true; } catch(std::exception& e) { if(state) { delete state; state = 0; } writer.alert(FATAL, HANDSHAKE_FAILURE); throw Stream_IO_Error(std::string("TLS_Server: Handshake failed: ") + e.what()); } } /* * TLS Server Destructor */ TLS_Server::~TLS_Server() { close(); delete private_key; delete state; } /* * Return the peer's certificate chain */ std::vector TLS_Server::peer_cert_chain() const { return peer_certs; } /* * Write to a TLS connection */ void TLS_Server::write(const byte buf[], size_t length) { if(!active) throw Internal_Error("TLS_Server::write called while closed"); writer.send(APPLICATION_DATA, buf, length); } /* * Read from a TLS connection */ size_t TLS_Server::read(byte out[], size_t length) { if(!active) throw Internal_Error("TLS_Server::read called while closed"); writer.flush(); while(read_buf.size() == 0) { state_machine(); if(active == false) break; } size_t got = std::min(read_buf.size(), length); read_buf.read(out, got); return got; } /* * Check connection status */ bool TLS_Server::is_closed() const { if(!active) return true; return false; } /* * Close a TLS connection */ void TLS_Server::close() { close(WARNING, CLOSE_NOTIFY); } /* * Close a TLS connection */ void TLS_Server::close(Alert_Level level, Alert_Type alert_code) { if(active) { try { active = false; writer.alert(level, alert_code); writer.flush(); } catch(...) {} } } /* * Iterate the TLS state machine */ void TLS_Server::state_machine() { byte rec_type = CONNECTION_CLOSED; SecureVector record(1024); size_t bytes_needed = reader.get_record(rec_type, record); while(bytes_needed) { size_t to_get = std::min(record.size(), bytes_needed); size_t got = input_fn(&record[0], to_get); if(got == 0) { rec_type = CONNECTION_CLOSED; break; } reader.add_input(&record[0], got); bytes_needed = reader.get_record(rec_type, record); } if(rec_type == CONNECTION_CLOSED) { active = false; reader.reset(); writer.reset(); } else if(rec_type == APPLICATION_DATA) { if(active) read_buf.write(&record[0], record.size()); else throw Unexpected_Message("Application data before handshake done"); } else if(rec_type == HANDSHAKE || rec_type == CHANGE_CIPHER_SPEC) read_handshake(rec_type, record); else if(rec_type == ALERT) { Alert alert(record); if(alert.is_fatal() || alert.type() == CLOSE_NOTIFY) { if(alert.type() == CLOSE_NOTIFY) writer.alert(WARNING, CLOSE_NOTIFY); reader.reset(); writer.reset(); active = false; } } else throw Unexpected_Message("Unknown message type received"); } /* * Split up and process handshake messages */ void TLS_Server::read_handshake(byte rec_type, const MemoryRegion& rec_buf) { if(rec_type == HANDSHAKE) { if(!state) state = new Handshake_State; state->queue.write(&rec_buf[0], rec_buf.size()); } while(true) { Handshake_Type type = HANDSHAKE_NONE; SecureVector contents; if(rec_type == HANDSHAKE) { if(state->queue.size() >= 4) { byte head[4] = { 0 }; state->queue.peek(head, 4); const size_t length = make_u32bit(0, head[1], head[2], head[3]); if(state->queue.size() >= length + 4) { type = static_cast(head[0]); contents.resize(length); state->queue.read(head, 4); state->queue.read(&contents[0], contents.size()); } } } else if(rec_type == CHANGE_CIPHER_SPEC) { if(state->queue.size() == 0 && rec_buf.size() == 1 && rec_buf[0] == 1) type = HANDSHAKE_CCS; else throw Decoding_Error("Malformed ChangeCipherSpec message"); } else throw Decoding_Error("Unknown message type in handshake processing"); if(type == HANDSHAKE_NONE) break; process_handshake_msg(type, contents); if(type == HANDSHAKE_CCS || !state) break; } } /* * Process a handshake message */ void TLS_Server::process_handshake_msg(Handshake_Type type, const MemoryRegion& contents) { rng.add_entropy(&contents[0], contents.size()); if(state == 0) throw Unexpected_Message("Unexpected handshake message"); if(active && (type == CLIENT_HELLO || type == CLIENT_HELLO_SSLV2)) { delete state; state = 0; writer.alert(WARNING, NO_RENEGOTIATION); return; } if(type != HANDSHAKE_CCS && type != FINISHED) { if(type != CLIENT_HELLO_SSLV2) { state->hash.update(static_cast(type)); const size_t record_length = contents.size(); for(size_t i = 0; i != 3; i++) state->hash.update(get_byte(i+1, record_length)); } state->hash.update(contents); } if(type == CLIENT_HELLO || type == CLIENT_HELLO_SSLV2) { server_check_state(type, state); state->client_hello = new Client_Hello(contents, type); client_requested_hostname = state->client_hello->hostname(); state->version = choose_version(state->client_hello->version(), policy.min_version()); writer.set_version(state->version); reader.set_version(state->version); state->server_hello = new Server_Hello(rng, writer, policy, cert_chain, *(state->client_hello), state->version, state->hash); state->suite = CipherSuite(state->server_hello->ciphersuite()); if(state->suite.sig_type() != TLS_ALGO_SIGNER_ANON) { // FIXME: should choose certs based on sig type state->server_certs = new Certificate(writer, cert_chain, state->hash); } state->kex_priv = PKCS8::copy_key(*private_key, rng); if(state->suite.kex_type() != TLS_ALGO_KEYEXCH_NOKEX) { if(state->suite.kex_type() == TLS_ALGO_KEYEXCH_RSA) { state->kex_priv = new RSA_PrivateKey(rng, policy.rsa_export_keysize()); } else if(state->suite.kex_type() == TLS_ALGO_KEYEXCH_DH) { state->kex_priv = new DH_PrivateKey(rng, policy.dh_group()); } else throw Internal_Error("TLS_Server: Unknown ciphersuite kex type"); state->server_kex = new Server_Key_Exchange(rng, writer, state->kex_priv, private_key, state->client_hello->random(), state->server_hello->random(), state->hash); } if(policy.require_client_auth()) { state->do_client_auth = true; throw Internal_Error("Client auth not implemented"); // FIXME: send client auth request here } state->server_hello_done = new Server_Hello_Done(writer, state->hash); } else if(type == CERTIFICATE) { server_check_state(type, state); // FIXME: process this } else if(type == CLIENT_KEX) { server_check_state(type, state); state->client_kex = new Client_Key_Exchange(contents, state->suite, state->version); SecureVector pre_master = state->client_kex->pre_master_secret(rng, state->kex_priv, state->server_hello->version()); state->keys = SessionKeys(state->suite, state->version, pre_master, state->client_hello->random(), state->server_hello->random()); } else if(type == CERTIFICATE_VERIFY) { server_check_state(type, state); // FIXME: process this } else if(type == HANDSHAKE_CCS) { server_check_state(type, state); reader.set_keys(state->suite, state->keys, SERVER); state->got_client_ccs = true; } else if(type == FINISHED) { server_check_state(type, state); state->client_finished = new Finished(contents); if(!state->client_finished->verify(state->keys.master_secret(), state->version, state->hash, CLIENT)) throw TLS_Exception(DECRYPT_ERROR, "Finished message didn't verify"); state->hash.update(static_cast(type)); const size_t record_length = contents.size(); for(size_t i = 0; i != 3; i++) state->hash.update(get_byte(i+1, record_length)); state->hash.update(contents); writer.send(CHANGE_CIPHER_SPEC, 1); writer.flush(); writer.set_keys(state->suite, state->keys, SERVER); state->server_finished = new Finished(writer, state->version, SERVER, state->keys.master_secret(), state->hash); delete state; state = 0; active = true; } else throw Unexpected_Message("Unknown handshake message received"); } /* * Perform a server-side TLS handshake */ void TLS_Server::do_handshake() { while(true) { if(active && !state) break; state_machine(); if(!active && !state) throw TLS_Exception(HANDSHAKE_FAILURE, "TLS_Server: Handshake failed"); } } } Botan-1.10.12/src/ssl/tls_server.h0000664000175000017500000000353312654331322016521 0ustar jackjack00000000000000/* * TLS Server * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_SERVER_H__ #define BOTAN_TLS_SERVER_H__ #include #include #include #include namespace Botan { /** * TLS Server */ class BOTAN_DLL TLS_Server : public TLS_Connection { public: size_t read(byte buf[], size_t buf_len); void write(const byte buf[], size_t buf_len); std::vector peer_cert_chain() const; std::string requested_hostname() const { return client_requested_hostname; } void close(); bool is_closed() const; /* * FIXME: support cert chains (!) * FIXME: support anonymous servers */ TLS_Server(std::tr1::function input_fn, std::tr1::function output_fn, const TLS_Policy& policy, RandomNumberGenerator& rng, const X509_Certificate& cert, const Private_Key& cert_key); ~TLS_Server(); private: void close(Alert_Level, Alert_Type); void do_handshake(); void state_machine(); void read_handshake(byte, const MemoryRegion&); void process_handshake_msg(Handshake_Type, const MemoryRegion&); std::tr1::function input_fn; const TLS_Policy& policy; RandomNumberGenerator& rng; Record_Writer writer; Record_Reader reader; // FIXME: rename to match TLS_Client std::vector cert_chain, peer_certs; Private_Key* private_key; class Handshake_State* state; SecureVector session_id; SecureQueue read_buf; std::string client_requested_hostname; bool active; }; } #endif Botan-1.10.12/src/ssl/tls_session_key.cpp0000664000175000017500000001007412654331322020077 0ustar jackjack00000000000000/* * TLS Session Key * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include namespace Botan { /** * Return the client cipher key */ SymmetricKey SessionKeys::client_cipher_key() const { return c_cipher; } /** * Return the server cipher key */ SymmetricKey SessionKeys::server_cipher_key() const { return s_cipher; } /** * Return the client MAC key */ SymmetricKey SessionKeys::client_mac_key() const { return c_mac; } /** * Return the server MAC key */ SymmetricKey SessionKeys::server_mac_key() const { return s_mac; } /** * Return the client cipher IV */ InitializationVector SessionKeys::client_iv() const { return c_iv; } /** * Return the server cipher IV */ InitializationVector SessionKeys::server_iv() const { return s_iv; } /** * Return the TLS master secret */ SecureVector SessionKeys::master_secret() const { return master_sec; } /** * Generate SSLv3 session keys */ SymmetricKey SessionKeys::ssl3_keygen(size_t prf_gen, const MemoryRegion& pre_master, const MemoryRegion& client_random, const MemoryRegion& server_random) { SSL3_PRF prf; SecureVector salt; salt += client_random; salt += server_random; master_sec = prf.derive_key(48, pre_master, salt); salt.clear(); salt += server_random; salt += client_random; return prf.derive_key(prf_gen, master_sec, salt); } /** * Generate TLS 1.0 session keys */ SymmetricKey SessionKeys::tls1_keygen(size_t prf_gen, const MemoryRegion& pre_master, const MemoryRegion& client_random, const MemoryRegion& server_random) { const byte MASTER_SECRET_MAGIC[] = { 0x6D, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74 }; const byte KEY_GEN_MAGIC[] = { 0x6B, 0x65, 0x79, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6E, 0x73, 0x69, 0x6F, 0x6E }; TLS_PRF prf; SecureVector salt; salt += std::make_pair(MASTER_SECRET_MAGIC, sizeof(MASTER_SECRET_MAGIC)); salt += client_random; salt += server_random; master_sec = prf.derive_key(48, pre_master, salt); salt.clear(); salt += std::make_pair(KEY_GEN_MAGIC, sizeof(KEY_GEN_MAGIC)); salt += server_random; salt += client_random; return prf.derive_key(prf_gen, master_sec, salt); } /** * SessionKeys Constructor */ SessionKeys::SessionKeys(const CipherSuite& suite, Version_Code version, const MemoryRegion& pre_master_secret, const MemoryRegion& c_random, const MemoryRegion& s_random) { if(version != SSL_V3 && version != TLS_V10 && version != TLS_V11) throw Invalid_Argument("SessionKeys: Unknown version code"); const size_t mac_keylen = output_length_of(suite.mac_algo()); const size_t cipher_keylen = suite.cipher_keylen(); size_t cipher_ivlen = 0; if(have_block_cipher(suite.cipher_algo())) cipher_ivlen = block_size_of(suite.cipher_algo()); const size_t prf_gen = 2 * (mac_keylen + cipher_keylen + cipher_ivlen); SymmetricKey keyblock = (version == SSL_V3) ? ssl3_keygen(prf_gen, pre_master_secret, c_random, s_random) : tls1_keygen(prf_gen, pre_master_secret, c_random, s_random); const byte* key_data = keyblock.begin(); c_mac = SymmetricKey(key_data, mac_keylen); key_data += mac_keylen; s_mac = SymmetricKey(key_data, mac_keylen); key_data += mac_keylen; c_cipher = SymmetricKey(key_data, cipher_keylen); key_data += cipher_keylen; s_cipher = SymmetricKey(key_data, cipher_keylen); key_data += cipher_keylen; c_iv = InitializationVector(key_data, cipher_ivlen); key_data += cipher_ivlen; s_iv = InitializationVector(key_data, cipher_ivlen); } } Botan-1.10.12/src/ssl/tls_session_key.h0000664000175000017500000000253412654331322017546 0ustar jackjack00000000000000/* * TLS Session Key * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_SESSION_KEYS_H__ #define BOTAN_TLS_SESSION_KEYS_H__ #include #include #include namespace Botan { /** * TLS Session Keys */ class BOTAN_DLL SessionKeys { public: SymmetricKey client_cipher_key() const; SymmetricKey server_cipher_key() const; SymmetricKey client_mac_key() const; SymmetricKey server_mac_key() const; InitializationVector client_iv() const; InitializationVector server_iv() const; SecureVector master_secret() const; SessionKeys() {} SessionKeys(const CipherSuite&, Version_Code, const MemoryRegion&, const MemoryRegion&, const MemoryRegion&); private: SymmetricKey ssl3_keygen(size_t, const MemoryRegion&, const MemoryRegion&, const MemoryRegion&); SymmetricKey tls1_keygen(size_t, const MemoryRegion&, const MemoryRegion&, const MemoryRegion&); SecureVector master_sec; SymmetricKey c_cipher, s_cipher, c_mac, s_mac; InitializationVector c_iv, s_iv; }; } #endif Botan-1.10.12/src/ssl/tls_state.cpp0000664000175000017500000000176212654331322016670 0ustar jackjack00000000000000/* * TLS Handshaking * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #include namespace Botan { /** * Initialize the SSL/TLS Handshake State */ Handshake_State::Handshake_State() { client_hello = 0; server_hello = 0; server_certs = 0; server_kex = 0; cert_req = 0; server_hello_done = 0; client_certs = 0; client_kex = 0; client_verify = 0; client_finished = 0; server_finished = 0; kex_pub = 0; kex_priv = 0; do_client_auth = got_client_ccs = got_server_ccs = false; version = SSL_V3; } /** * Destroy the SSL/TLS Handshake State */ Handshake_State::~Handshake_State() { delete client_hello; delete server_hello; delete server_certs; delete server_kex; delete cert_req; delete server_hello_done; delete client_certs; delete client_kex; delete client_verify; delete client_finished; delete server_finished; delete kex_pub; delete kex_priv; } } Botan-1.10.12/src/ssl/tls_state.h0000664000175000017500000000202412654331322016325 0ustar jackjack00000000000000/* * TLS Handshake State * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_HANDSHAKE_H__ #define BOTAN_TLS_HANDSHAKE_H__ #include #include namespace Botan { /** * SSL/TLS Handshake State */ class Handshake_State { public: Client_Hello* client_hello; Server_Hello* server_hello; Certificate* server_certs; Server_Key_Exchange* server_kex; Certificate_Req* cert_req; Server_Hello_Done* server_hello_done; Certificate* client_certs; Client_Key_Exchange* client_kex; Certificate_Verify* client_verify; Finished* client_finished; Finished* server_finished; Public_Key* kex_pub; Private_Key* kex_priv; CipherSuite suite; SessionKeys keys; HandshakeHash hash; SecureQueue queue; Version_Code version; bool got_client_ccs, got_server_ccs, do_client_auth; Handshake_State(); ~Handshake_State(); }; } #endif Botan-1.10.12/src/ssl/tls_suites.cpp0000664000175000017500000002615012654331322017062 0ustar jackjack00000000000000/* * TLS Cipher Suites * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #include #include namespace Botan { /** * Convert an SSL/TLS ciphersuite to algorithm fields */ TLS_Ciphersuite_Algos CipherSuite::lookup_ciphersuite(u16bit suite) { if(suite == TLS_RSA_WITH_RC4_128_MD5) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_NOKEX | TLS_ALGO_MAC_MD5 | TLS_ALGO_CIPHER_RC4_128); if(suite == TLS_RSA_WITH_RC4_128_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_NOKEX | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_RC4_128); if(suite == TLS_RSA_WITH_3DES_EDE_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_NOKEX | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_3DES_CBC); if(suite == TLS_RSA_WITH_AES_128_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_NOKEX | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_RSA_WITH_AES_256_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_NOKEX | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES256_CBC); if(suite == TLS_RSA_WITH_SEED_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_NOKEX | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_SEED_CBC); if(suite == TLS_RSA_WITH_AES_128_CBC_SHA256) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_NOKEX | TLS_ALGO_MAC_SHA256 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_RSA_WITH_AES_256_CBC_SHA256) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_NOKEX | TLS_ALGO_MAC_SHA256 | TLS_ALGO_CIPHER_AES256_CBC); if(suite == TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_DSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_3DES_CBC); if(suite == TLS_DHE_DSS_WITH_AES_128_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_DSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_DHE_DSS_WITH_SEED_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_DSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_SEED_CBC); if(suite == TLS_DHE_DSS_WITH_AES_256_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_DSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES256_CBC); if(suite == TLS_DHE_DSS_WITH_AES_128_CBC_SHA256) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_DSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA256 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_DHE_DSS_WITH_AES_256_CBC_SHA256) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_DSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA256 | TLS_ALGO_CIPHER_AES256_CBC); if(suite == TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_3DES_CBC); if(suite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_DHE_DSS_WITH_SEED_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_SEED_CBC); if(suite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES256_CBC); if(suite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA256) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA256 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA256) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_DH | TLS_ALGO_MAC_SHA256 | TLS_ALGO_CIPHER_AES256_CBC); if(suite == TLS_ECDHE_ECDSA_WITH_RC4_128_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_ECDSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_RC4_128); if(suite == TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_ECDSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_3DES_CBC); if(suite == TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_ECDSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_ECDSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES256_CBC); if(suite == TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_ECDSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA256 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_ECDSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA384 | TLS_ALGO_CIPHER_AES256_CBC); if(suite == TLS_ECDHE_RSA_WITH_RC4_128_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_RC4_128); if(suite == TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_3DES_CBC); if(suite == TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_RSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA1 | TLS_ALGO_CIPHER_AES256_CBC); if(suite == TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_ECDSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA256 | TLS_ALGO_CIPHER_AES128_CBC); if(suite == TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) return TLS_Ciphersuite_Algos(TLS_ALGO_SIGNER_ECDSA | TLS_ALGO_KEYEXCH_ECDH | TLS_ALGO_MAC_SHA384 | TLS_ALGO_CIPHER_AES256_CBC); return TLS_Ciphersuite_Algos(0); } namespace { std::pair cipher_code_to_name(TLS_Ciphersuite_Algos algo) { if((algo & TLS_ALGO_CIPHER_MASK) == TLS_ALGO_CIPHER_RC4_128) return std::make_pair("ARC4", 16); if((algo & TLS_ALGO_CIPHER_MASK) == TLS_ALGO_CIPHER_3DES_CBC) return std::make_pair("3DES", 24); if((algo & TLS_ALGO_CIPHER_MASK) == TLS_ALGO_CIPHER_AES128_CBC) return std::make_pair("AES-128", 16); if((algo & TLS_ALGO_CIPHER_MASK) == TLS_ALGO_CIPHER_AES256_CBC) return std::make_pair("AES-256", 32); if((algo & TLS_ALGO_CIPHER_MASK) == TLS_ALGO_CIPHER_SEED_CBC) return std::make_pair("SEED", 16); throw TLS_Exception(INTERNAL_ERROR, "CipherSuite: Unknown cipher type " + to_string(algo)); } std::string mac_code_to_name(TLS_Ciphersuite_Algos algo) { if((algo & TLS_ALGO_MAC_MASK) == TLS_ALGO_MAC_MD5) return "MD5"; if((algo & TLS_ALGO_MAC_MASK) == TLS_ALGO_MAC_SHA1) return "SHA-1"; if((algo & TLS_ALGO_MAC_MASK) == TLS_ALGO_MAC_SHA256) return "SHA-256"; if((algo & TLS_ALGO_MAC_MASK) == TLS_ALGO_MAC_SHA384) return "SHA-384"; throw TLS_Exception(INTERNAL_ERROR, "CipherSuite: Unknown MAC type " + to_string(algo)); } } /** * CipherSuite Constructor */ CipherSuite::CipherSuite(u16bit suite_code) { if(suite_code == 0) return; TLS_Ciphersuite_Algos algos = lookup_ciphersuite(suite_code); if(algos == 0) throw Invalid_Argument("Unknown ciphersuite: " + to_string(suite_code)); sig_algo = TLS_Ciphersuite_Algos(algos & TLS_ALGO_SIGNER_MASK); kex_algo = TLS_Ciphersuite_Algos(algos & TLS_ALGO_KEYEXCH_MASK); std::pair cipher_info = cipher_code_to_name(algos); cipher = cipher_info.first; cipher_key_length = cipher_info.second; mac = mac_code_to_name(algos); } } Botan-1.10.12/src/ssl/tls_suites.h0000664000175000017500000000157112654331322016527 0ustar jackjack00000000000000/* * Cipher Suites * (C) 2004-2010 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_CIPHERSUITES_H__ #define BOTAN_TLS_CIPHERSUITES_H__ #include #include #include namespace Botan { /** * Ciphersuite Information */ class BOTAN_DLL CipherSuite { public: static TLS_Ciphersuite_Algos lookup_ciphersuite(u16bit suite); std::string cipher_algo() const { return cipher; } std::string mac_algo() const { return mac; } size_t cipher_keylen() const { return cipher_key_length; } TLS_Ciphersuite_Algos kex_type() const { return kex_algo; } TLS_Ciphersuite_Algos sig_type() const { return sig_algo; } CipherSuite(u16bit = 0); private: TLS_Ciphersuite_Algos kex_algo, sig_algo; std::string cipher, mac; size_t cipher_key_length; }; } #endif Botan-1.10.12/src/stream/arc4/arc4.cpp0000664000175000017500000000453512654331322017043 0ustar jackjack00000000000000/* * ARC4 * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Combine cipher stream with message */ void ARC4::cipher(const byte in[], byte out[], size_t length) { while(length >= buffer.size() - position) { xor_buf(out, in, &buffer[position], buffer.size() - position); length -= (buffer.size() - position); in += (buffer.size() - position); out += (buffer.size() - position); generate(); } xor_buf(out, in, &buffer[position], length); position += length; } /* * Generate cipher stream */ void ARC4::generate() { byte SX, SY; for(size_t i = 0; i != buffer.size(); i += 4) { SX = state[X+1]; Y = (Y + SX) % 256; SY = state[Y]; state[X+1] = SY; state[Y] = SX; buffer[i] = state[(SX + SY) % 256]; SX = state[X+2]; Y = (Y + SX) % 256; SY = state[Y]; state[X+2] = SY; state[Y] = SX; buffer[i+1] = state[(SX + SY) % 256]; SX = state[X+3]; Y = (Y + SX) % 256; SY = state[Y]; state[X+3] = SY; state[Y] = SX; buffer[i+2] = state[(SX + SY) % 256]; X = (X + 4) % 256; SX = state[X]; Y = (Y + SX) % 256; SY = state[Y]; state[X] = SY; state[Y] = SX; buffer[i+3] = state[(SX + SY) % 256]; } position = 0; } /* * ARC4 Key Schedule */ void ARC4::key_schedule(const byte key[], size_t length) { clear(); for(size_t i = 0; i != 256; ++i) state[i] = static_cast(i); for(size_t i = 0, state_index = 0; i != 256; ++i) { state_index = (state_index + key[i % length] + state[i]) % 256; std::swap(state[i], state[state_index]); } for(size_t i = 0; i <= SKIP; i += buffer.size()) generate(); position += (SKIP % buffer.size()); } /* * Return the name of this type */ std::string ARC4::name() const { if(SKIP == 0) return "ARC4"; if(SKIP == 256) return "MARK-4"; else return "RC4_skip(" + to_string(SKIP) + ")"; } /* * Clear memory of sensitive data */ void ARC4::clear() { zeroise(state); zeroise(buffer); position = X = Y = 0; } /* * ARC4 Constructor */ ARC4::ARC4(size_t s) : SKIP(s), state(256), buffer(DEFAULT_BUFFERSIZE) { clear(); } } Botan-1.10.12/src/stream/arc4/arc4.h0000664000175000017500000000171512654331322016505 0ustar jackjack00000000000000/* * ARC4 * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ARC4_H__ #define BOTAN_ARC4_H__ #include #include namespace Botan { /** * Alleged RC4 */ class BOTAN_DLL ARC4 : public StreamCipher { public: void cipher(const byte in[], byte out[], size_t length); void clear(); std::string name() const; StreamCipher* clone() const { return new ARC4(SKIP); } Key_Length_Specification key_spec() const { return Key_Length_Specification(1, 256); } /** * @param skip skip this many initial bytes in the keystream */ ARC4(size_t skip = 0); ~ARC4() { clear(); } private: void key_schedule(const byte[], size_t); void generate(); const size_t SKIP; byte X, Y; SecureVector state; SecureVector buffer; size_t position; }; } #endif Botan-1.10.12/src/stream/arc4/info.txt0000664000175000017500000000001412654331322017166 0ustar jackjack00000000000000define ARC4 Botan-1.10.12/src/stream/ctr/ctr.cpp0000664000175000017500000000474412654331322016743 0ustar jackjack00000000000000/* * Counter mode * (C) 1999-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include namespace Botan { /* * CTR-BE Constructor */ CTR_BE::CTR_BE(BlockCipher* ciph) : permutation(ciph), counter(256 * permutation->block_size()), buffer(counter.size()), position(0) { } /* * CTR_BE Destructor */ CTR_BE::~CTR_BE() { delete permutation; } /* * Zeroize */ void CTR_BE::clear() { permutation->clear(); zeroise(buffer); zeroise(counter); position = 0; } /* * Set the key */ void CTR_BE::key_schedule(const byte key[], size_t key_len) { permutation->set_key(key, key_len); // Set a default all-zeros IV set_iv(0, 0); } /* * Return the name of this type */ std::string CTR_BE::name() const { return ("CTR-BE(" + permutation->name() + ")"); } /* * CTR-BE Encryption/Decryption */ void CTR_BE::cipher(const byte in[], byte out[], size_t length) { while(length >= buffer.size() - position) { xor_buf(out, in, &buffer[position], buffer.size() - position); length -= (buffer.size() - position); in += (buffer.size() - position); out += (buffer.size() - position); increment_counter(); } xor_buf(out, in, &buffer[position], length); position += length; } /* * Set CTR-BE IV */ void CTR_BE::set_iv(const byte iv[], size_t iv_len) { if(!valid_iv_length(iv_len)) throw Invalid_IV_Length(name(), iv_len); const size_t bs = permutation->block_size(); zeroise(counter); counter.copy(0, iv, iv_len); /* * Set counter blocks to IV, IV + 1, ... IV + 255 */ for(size_t i = 1; i != 256; ++i) { counter.copy(i*bs, &counter[(i-1)*bs], bs); for(size_t j = 0; j != bs; ++j) if(++counter[i*bs + (bs - 1 - j)]) break; } permutation->encrypt_n(&counter[0], &buffer[0], 256); position = 0; } /* * Increment the counter and update the buffer */ void CTR_BE::increment_counter() { const size_t bs = permutation->block_size(); /* * Each counter value always needs to be incremented by 256, * so we don't touch the lowest byte and instead treat it as * an increment of one starting with the next byte. */ for(size_t i = 0; i != 256; ++i) { for(size_t j = 1; j != bs; ++j) if(++counter[i*bs + (bs - 1 - j)]) break; } permutation->encrypt_n(&counter[0], &buffer[0], 256); position = 0; } } Botan-1.10.12/src/stream/ctr/ctr.h0000664000175000017500000000221012654331322016372 0ustar jackjack00000000000000/* * CTR-BE Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CTR_BE_H__ #define BOTAN_CTR_BE_H__ #include #include namespace Botan { /** * CTR-BE (Counter mode, big-endian) */ class BOTAN_DLL CTR_BE : public StreamCipher { public: void cipher(const byte in[], byte out[], size_t length); void set_iv(const byte iv[], size_t iv_len); bool valid_iv_length(size_t iv_len) const { return (iv_len <= permutation->block_size()); } Key_Length_Specification key_spec() const { return permutation->key_spec(); } std::string name() const; CTR_BE* clone() const { return new CTR_BE(permutation->clone()); } void clear(); /** * @param cipher the underlying block cipher to use */ CTR_BE(BlockCipher* cipher); ~CTR_BE(); private: void key_schedule(const byte key[], size_t key_len); void increment_counter(); BlockCipher* permutation; SecureVector counter, buffer; size_t position; }; } #endif Botan-1.10.12/src/stream/ctr/info.txt0000664000175000017500000000006312654331322017131 0ustar jackjack00000000000000define CTR_BE block stream Botan-1.10.12/src/stream/info.txt0000664000175000017500000000006712654331322016345 0ustar jackjack00000000000000define STREAM_CIPHER algo_base Botan-1.10.12/src/stream/ofb/info.txt0000664000175000017500000000006012654331322017104 0ustar jackjack00000000000000define OFB block stream Botan-1.10.12/src/stream/ofb/ofb.cpp0000664000175000017500000000305412654331322016670 0ustar jackjack00000000000000/* * OFB Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * OFB Constructor */ OFB::OFB(BlockCipher* ciph) : permutation(ciph) { position = 0; buffer.resize(permutation->block_size()); } /* * OFB Destructor */ OFB::~OFB() { delete permutation; } /* * Zeroize */ void OFB::clear() { permutation->clear(); zeroise(buffer); position = 0; } /* * Set the key */ void OFB::key_schedule(const byte key[], size_t key_len) { permutation->set_key(key, key_len); // Set a default all-zeros IV set_iv(0, 0); } /* * Return the name of this type */ std::string OFB::name() const { return ("OFB(" + permutation->name() + ")"); } /* * CTR-BE Encryption/Decryption */ void OFB::cipher(const byte in[], byte out[], size_t length) { while(length >= buffer.size() - position) { xor_buf(out, in, &buffer[position], buffer.size() - position); length -= (buffer.size() - position); in += (buffer.size() - position); out += (buffer.size() - position); permutation->encrypt(buffer); position = 0; } xor_buf(out, in, &buffer[position], length); position += length; } /* * Set CTR-BE IV */ void OFB::set_iv(const byte iv[], size_t iv_len) { if(!valid_iv_length(iv_len)) throw Invalid_IV_Length(name(), iv_len); zeroise(buffer); buffer.copy(0, iv, iv_len); permutation->encrypt(buffer); position = 0; } } Botan-1.10.12/src/stream/ofb/ofb.h0000664000175000017500000000213412654331322016333 0ustar jackjack00000000000000/* * OFB Mode * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_OUTPUT_FEEDBACK_MODE_H__ #define BOTAN_OUTPUT_FEEDBACK_MODE_H__ #include #include namespace Botan { /** * Output Feedback Mode */ class BOTAN_DLL OFB : public StreamCipher { public: void cipher(const byte in[], byte out[], size_t length); void set_iv(const byte iv[], size_t iv_len); bool valid_iv_length(size_t iv_len) const { return (iv_len <= permutation->block_size()); } Key_Length_Specification key_spec() const { return permutation->key_spec(); } std::string name() const; OFB* clone() const { return new OFB(permutation->clone()); } void clear(); /** * @param cipher the underlying block cipher to use */ OFB(BlockCipher* cipher); ~OFB(); private: void key_schedule(const byte key[], size_t key_len); BlockCipher* permutation; SecureVector buffer; size_t position; }; } #endif Botan-1.10.12/src/stream/salsa20/info.txt0000664000175000017500000000001712654331322017605 0ustar jackjack00000000000000define SALSA20 Botan-1.10.12/src/stream/salsa20/salsa20.cpp0000664000175000017500000001457212654331322020075 0ustar jackjack00000000000000/* * Salsa20 / XSalsa20 * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { #define SALSA20_QUARTER_ROUND(x1, x2, x3, x4) \ do { \ x2 ^= rotate_left(x1 + x4, 7); \ x3 ^= rotate_left(x2 + x1, 9); \ x4 ^= rotate_left(x3 + x2, 13); \ x1 ^= rotate_left(x4 + x3, 18); \ } while(0) /* * Generate HSalsa20 cipher stream (for XSalsa20 IV setup) */ void hsalsa20(u32bit output[8], const u32bit input[16]) { u32bit x00 = input[ 0], x01 = input[ 1], x02 = input[ 2], x03 = input[ 3], x04 = input[ 4], x05 = input[ 5], x06 = input[ 6], x07 = input[ 7], x08 = input[ 8], x09 = input[ 9], x10 = input[10], x11 = input[11], x12 = input[12], x13 = input[13], x14 = input[14], x15 = input[15]; for(size_t i = 0; i != 10; ++i) { SALSA20_QUARTER_ROUND(x00, x04, x08, x12); SALSA20_QUARTER_ROUND(x05, x09, x13, x01); SALSA20_QUARTER_ROUND(x10, x14, x02, x06); SALSA20_QUARTER_ROUND(x15, x03, x07, x11); SALSA20_QUARTER_ROUND(x00, x01, x02, x03); SALSA20_QUARTER_ROUND(x05, x06, x07, x04); SALSA20_QUARTER_ROUND(x10, x11, x08, x09); SALSA20_QUARTER_ROUND(x15, x12, x13, x14); } output[0] = x00; output[1] = x05; output[2] = x10; output[3] = x15; output[4] = x06; output[5] = x07; output[6] = x08; output[7] = x09; } /* * Generate Salsa20 cipher stream */ void salsa20(byte output[64], const u32bit input[16]) { u32bit x00 = input[ 0], x01 = input[ 1], x02 = input[ 2], x03 = input[ 3], x04 = input[ 4], x05 = input[ 5], x06 = input[ 6], x07 = input[ 7], x08 = input[ 8], x09 = input[ 9], x10 = input[10], x11 = input[11], x12 = input[12], x13 = input[13], x14 = input[14], x15 = input[15]; for(size_t i = 0; i != 10; ++i) { SALSA20_QUARTER_ROUND(x00, x04, x08, x12); SALSA20_QUARTER_ROUND(x05, x09, x13, x01); SALSA20_QUARTER_ROUND(x10, x14, x02, x06); SALSA20_QUARTER_ROUND(x15, x03, x07, x11); SALSA20_QUARTER_ROUND(x00, x01, x02, x03); SALSA20_QUARTER_ROUND(x05, x06, x07, x04); SALSA20_QUARTER_ROUND(x10, x11, x08, x09); SALSA20_QUARTER_ROUND(x15, x12, x13, x14); } store_le(x00 + input[ 0], output + 4 * 0); store_le(x01 + input[ 1], output + 4 * 1); store_le(x02 + input[ 2], output + 4 * 2); store_le(x03 + input[ 3], output + 4 * 3); store_le(x04 + input[ 4], output + 4 * 4); store_le(x05 + input[ 5], output + 4 * 5); store_le(x06 + input[ 6], output + 4 * 6); store_le(x07 + input[ 7], output + 4 * 7); store_le(x08 + input[ 8], output + 4 * 8); store_le(x09 + input[ 9], output + 4 * 9); store_le(x10 + input[10], output + 4 * 10); store_le(x11 + input[11], output + 4 * 11); store_le(x12 + input[12], output + 4 * 12); store_le(x13 + input[13], output + 4 * 13); store_le(x14 + input[14], output + 4 * 14); store_le(x15 + input[15], output + 4 * 15); } } /* * Combine cipher stream with message */ void Salsa20::cipher(const byte in[], byte out[], size_t length) { while(length >= buffer.size() - position) { xor_buf(out, in, &buffer[position], buffer.size() - position); length -= (buffer.size() - position); in += (buffer.size() - position); out += (buffer.size() - position); salsa20(&buffer[0], &state[0]); ++state[8]; if(!state[8]) // if overflow in state[8] ++state[9]; // carry to state[9] position = 0; } xor_buf(out, in, &buffer[position], length); position += length; } /* * Salsa20 Key Schedule */ void Salsa20::key_schedule(const byte key[], size_t length) { static const u32bit TAU[] = { 0x61707865, 0x3120646e, 0x79622d36, 0x6b206574 }; static const u32bit SIGMA[] = { 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 }; clear(); if(length == 16) { state[0] = TAU[0]; state[1] = load_le(key, 0); state[2] = load_le(key, 1); state[3] = load_le(key, 2); state[4] = load_le(key, 3); state[5] = TAU[1]; state[10] = TAU[2]; state[11] = load_le(key, 0); state[12] = load_le(key, 1); state[13] = load_le(key, 2); state[14] = load_le(key, 3); state[15] = TAU[3]; } else if(length == 32) { state[0] = SIGMA[0]; state[1] = load_le(key, 0); state[2] = load_le(key, 1); state[3] = load_le(key, 2); state[4] = load_le(key, 3); state[5] = SIGMA[1]; state[10] = SIGMA[2]; state[11] = load_le(key, 4); state[12] = load_le(key, 5); state[13] = load_le(key, 6); state[14] = load_le(key, 7); state[15] = SIGMA[3]; } const byte ZERO[8] = { 0 }; set_iv(ZERO, sizeof(ZERO)); } /* * Return the name of this type */ void Salsa20::set_iv(const byte iv[], size_t length) { if(!valid_iv_length(length)) throw Invalid_IV_Length(name(), length); if(length == 8) { // Salsa20 state[6] = load_le(iv, 0); state[7] = load_le(iv, 1); } else { // XSalsa20 state[6] = load_le(iv, 0); state[7] = load_le(iv, 1); state[8] = load_le(iv, 2); state[9] = load_le(iv, 3); SecureVector hsalsa(8); hsalsa20(&hsalsa[0], &state[0]); state[ 1] = hsalsa[0]; state[ 2] = hsalsa[1]; state[ 3] = hsalsa[2]; state[ 4] = hsalsa[3]; state[ 6] = load_le(iv, 4); state[ 7] = load_le(iv, 5); state[11] = hsalsa[4]; state[12] = hsalsa[5]; state[13] = hsalsa[6]; state[14] = hsalsa[7]; } state[8] = 0; state[9] = 0; salsa20(&buffer[0], &state[0]); ++state[8]; if(!state[8]) // if overflow in state[8] ++state[9]; // carry to state[9] position = 0; } /* * Return the name of this type */ std::string Salsa20::name() const { return "Salsa20"; } /* * Clear memory of sensitive data */ void Salsa20::clear() { zeroise(state); zeroise(buffer); position = 0; } } Botan-1.10.12/src/stream/salsa20/salsa20.h0000664000175000017500000000175112654331322017535 0ustar jackjack00000000000000/* * Salsa20 / XSalsa20 * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_SALSA20_H__ #define BOTAN_SALSA20_H__ #include namespace Botan { /** * DJB's Salsa20 (and XSalsa20) */ class BOTAN_DLL Salsa20 : public StreamCipher { public: void cipher(const byte in[], byte out[], size_t length); void set_iv(const byte iv[], size_t iv_len); bool valid_iv_length(size_t iv_len) const { return (iv_len == 8 || iv_len == 24); } Key_Length_Specification key_spec() const { return Key_Length_Specification(16, 32, 16); } void clear(); std::string name() const; StreamCipher* clone() const { return new Salsa20; } Salsa20() : state(16), buffer(64), position(0) {} private: void key_schedule(const byte key[], size_t key_len); SecureVector state; SecureVector buffer; size_t position; }; } #endif Botan-1.10.12/src/stream/stream_cipher.cpp0000664000175000017500000000071312654331322020200 0ustar jackjack00000000000000/* * Stream Cipher * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { void StreamCipher::set_iv(const byte[], size_t iv_len) { if(iv_len) throw Invalid_Argument("The stream cipher " + name() + " does not support resyncronization"); } bool StreamCipher::valid_iv_length(size_t iv_len) const { return (iv_len == 0); } } Botan-1.10.12/src/stream/stream_cipher.h0000664000175000017500000000257312654331322017653 0ustar jackjack00000000000000/* * Stream Cipher * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_STREAM_CIPHER_H__ #define BOTAN_STREAM_CIPHER_H__ #include namespace Botan { /** * Base class for all stream ciphers */ class BOTAN_DLL StreamCipher : public SymmetricAlgorithm { public: /** * Encrypt or decrypt a message * @param in the plaintext * @param out the byte array to hold the output, i.e. the ciphertext * @param len the length of both in and out in bytes */ virtual void cipher(const byte in[], byte out[], size_t len) = 0; /** * Encrypt or decrypt a message * @param buf the plaintext / ciphertext * @param len the length of buf in bytes */ void cipher1(byte buf[], size_t len) { cipher(buf, buf, len); } /** * Resync the cipher using the IV * @param iv the initialization vector * @param iv_len the length of the IV in bytes */ virtual void set_iv(const byte iv[], size_t iv_len); /** * @param iv_len the length of the IV in bytes * @return if the length is valid for this algorithm */ virtual bool valid_iv_length(size_t iv_len) const; /** * Get a new object representing the same algorithm as *this */ virtual StreamCipher* clone() const = 0; }; } #endif Botan-1.10.12/src/stream/turing/info.txt0000664000175000017500000000001612654331322017647 0ustar jackjack00000000000000define TURING Botan-1.10.12/src/stream/turing/tur_tab.cpp0000664000175000017500000001165112654331322020326 0ustar jackjack00000000000000/* * Tables for Turing * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { const byte Turing::SBOX[256] = { 0x61, 0x51, 0xEB, 0x19, 0xB9, 0x5D, 0x60, 0x38, 0x7C, 0xB2, 0x06, 0x12, 0xC4, 0x5B, 0x16, 0x3B, 0x2B, 0x18, 0x83, 0xB0, 0x7F, 0x75, 0xFA, 0xA0, 0xE9, 0xDD, 0x6D, 0x7A, 0x6B, 0x68, 0x2D, 0x49, 0xB5, 0x1C, 0x90, 0xF7, 0xED, 0x9F, 0xE8, 0xCE, 0xAE, 0x77, 0xC2, 0x13, 0xFD, 0xCD, 0x3E, 0xCF, 0x37, 0x6A, 0xD4, 0xDB, 0x8E, 0x65, 0x1F, 0x1A, 0x87, 0xCB, 0x40, 0x15, 0x88, 0x0D, 0x35, 0xB3, 0x11, 0x0F, 0xD0, 0x30, 0x48, 0xF9, 0xA8, 0xAC, 0x85, 0x27, 0x0E, 0x8A, 0xE0, 0x50, 0x64, 0xA7, 0xCC, 0xE4, 0xF1, 0x98, 0xFF, 0xA1, 0x04, 0xDA, 0xD5, 0xBC, 0x1B, 0xBB, 0xD1, 0xFE, 0x31, 0xCA, 0xBA, 0xD9, 0x2E, 0xF3, 0x1D, 0x47, 0x4A, 0x3D, 0x71, 0x4C, 0xAB, 0x7D, 0x8D, 0xC7, 0x59, 0xB8, 0xC1, 0x96, 0x1E, 0xFC, 0x44, 0xC8, 0x7B, 0xDC, 0x5C, 0x78, 0x2A, 0x9D, 0xA5, 0xF0, 0x73, 0x22, 0x89, 0x05, 0xF4, 0x07, 0x21, 0x52, 0xA6, 0x28, 0x9A, 0x92, 0x69, 0x8F, 0xC5, 0xC3, 0xF5, 0xE1, 0xDE, 0xEC, 0x09, 0xF2, 0xD3, 0xAF, 0x34, 0x23, 0xAA, 0xDF, 0x7E, 0x82, 0x29, 0xC0, 0x24, 0x14, 0x03, 0x32, 0x4E, 0x39, 0x6F, 0xC6, 0xB1, 0x9B, 0xEA, 0x72, 0x79, 0x41, 0xD8, 0x26, 0x6C, 0x5E, 0x2C, 0xB4, 0xA2, 0x53, 0x57, 0xE2, 0x9C, 0x86, 0x54, 0x95, 0xB6, 0x80, 0x8C, 0x36, 0x67, 0xBD, 0x08, 0x93, 0x2F, 0x99, 0x5A, 0xF8, 0x3A, 0xD7, 0x56, 0x84, 0xD2, 0x01, 0xF6, 0x66, 0x4D, 0x55, 0x8B, 0x0C, 0x0B, 0x46, 0xB7, 0x3C, 0x45, 0x91, 0xA4, 0xE3, 0x70, 0xD6, 0xFB, 0xE6, 0x10, 0xA9, 0xC9, 0x00, 0x9E, 0xE7, 0x4F, 0x76, 0x25, 0x3F, 0x5F, 0xA3, 0x33, 0x20, 0x02, 0xEF, 0x62, 0x74, 0xEE, 0x17, 0x81, 0x42, 0x58, 0x0A, 0x4B, 0x63, 0xE5, 0xBE, 0x6E, 0xAD, 0xBF, 0x43, 0x94, 0x97 }; const u32bit Turing::Q_BOX[256] = { 0x1FAA1887, 0x4E5E435C, 0x9165C042, 0x250E6EF4, 0x5957EE20, 0xD484FED3, 0xA666C502, 0x7E54E8AE, 0xD12EE9D9, 0xFC1F38D4, 0x49829B5D, 0x1B5CDF3C, 0x74864249, 0xDA2E3963, 0x28F4429F, 0xC8432C35, 0x4AF40325, 0x9FC0DD70, 0xD8973DED, 0x1A02DC5E, 0xCD175B42, 0xF10012BF, 0x6694D78C, 0xACAAB26B, 0x4EC11B9A, 0x3F168146, 0xC0EA8EC5, 0xB38AC28F, 0x1FED5C0F, 0xAAB4101C, 0xEA2DB082, 0x470929E1, 0xE71843DE, 0x508299FC, 0xE72FBC4B, 0x2E3915DD, 0x9FA803FA, 0x9546B2DE, 0x3C233342, 0x0FCEE7C3, 0x24D607EF, 0x8F97EBAB, 0xF37F859B, 0xCD1F2E2F, 0xC25B71DA, 0x75E2269A, 0x1E39C3D1, 0xEDA56B36, 0xF8C9DEF2, 0x46C9FC5F, 0x1827B3A3, 0x70A56DDF, 0x0D25B510, 0x000F85A7, 0xB2E82E71, 0x68CB8816, 0x8F951E2A, 0x72F5F6AF, 0xE4CBC2B3, 0xD34FF55D, 0x2E6B6214, 0x220B83E3, 0xD39EA6F5, 0x6FE041AF, 0x6B2F1F17, 0xAD3B99EE, 0x16A65EC0, 0x757016C6, 0xBA7709A4, 0xB0326E01, 0xF4B280D9, 0x4BFB1418, 0xD6AFF227, 0xFD548203, 0xF56B9D96, 0x6717A8C0, 0x00D5BF6E, 0x10EE7888, 0xEDFCFE64, 0x1BA193CD, 0x4B0D0184, 0x89AE4930, 0x1C014F36, 0x82A87088, 0x5EAD6C2A, 0xEF22C678, 0x31204DE7, 0xC9C2E759, 0xD200248E, 0x303B446B, 0xB00D9FC2, 0x9914A895, 0x906CC3A1, 0x54FEF170, 0x34C19155, 0xE27B8A66, 0x131B5E69, 0xC3A8623E, 0x27BDFA35, 0x97F068CC, 0xCA3A6ACD, 0x4B55E936, 0x86602DB9, 0x51DF13C1, 0x390BB16D, 0x5A80B83C, 0x22B23763, 0x39D8A911, 0x2CB6BC13, 0xBF5579D7, 0x6C5C2FA8, 0xA8F4196E, 0xBCDB5476, 0x6864A866, 0x416E16AD, 0x897FC515, 0x956FEB3C, 0xF6C8A306, 0x216799D9, 0x171A9133, 0x6C2466DD, 0x75EB5DCD, 0xDF118F50, 0xE4AFB226, 0x26B9CEF3, 0xADB36189, 0x8A7A19B1, 0xE2C73084, 0xF77DED5C, 0x8B8BC58F, 0x06DDE421, 0xB41E47FB, 0xB1CC715E, 0x68C0FF99, 0x5D122F0F, 0xA4D25184, 0x097A5E6C, 0x0CBF18BC, 0xC2D7C6E0, 0x8BB7E420, 0xA11F523F, 0x35D9B8A2, 0x03DA1A6B, 0x06888C02, 0x7DD1E354, 0x6BBA7D79, 0x32CC7753, 0xE52D9655, 0xA9829DA1, 0x301590A7, 0x9BC1C149, 0x13537F1C, 0xD3779B69, 0x2D71F2B7, 0x183C58FA, 0xACDC4418, 0x8D8C8C76, 0x2620D9F0, 0x71A80D4D, 0x7A74C473, 0x449410E9, 0xA20E4211, 0xF9C8082B, 0x0A6B334A, 0xB5F68ED2, 0x8243CC1B, 0x453C0FF3, 0x9BE564A0, 0x4FF55A4F, 0x8740F8E7, 0xCCA7F15F, 0xE300FE21, 0x786D37D6, 0xDFD506F1, 0x8EE00973, 0x17BBDE36, 0x7A670FA8, 0x5C31AB9E, 0xD4DAB618, 0xCC1F52F5, 0xE358EB4F, 0x19B9E343, 0x3A8D77DD, 0xCDB93DA6, 0x140FD52D, 0x395412F8, 0x2BA63360, 0x37E53AD0, 0x80700F1C, 0x7624ED0B, 0x703DC1EC, 0xB7366795, 0xD6549D15, 0x66CE46D7, 0xD17ABE76, 0xA448E0A0, 0x28F07C02, 0xC31249B7, 0x6E9ED6BA, 0xEAA47F78, 0xBBCFFFBD, 0xC507CA84, 0xE965F4DA, 0x8E9F35DA, 0x6AD2AA44, 0x577452AC, 0xB5D674A7, 0x5461A46A, 0x6763152A, 0x9C12B7AA, 0x12615927, 0x7B4FB118, 0xC351758D, 0x7E81687B, 0x5F52F0B3, 0x2D4254ED, 0xD4C77271, 0x0431ACAB, 0xBEF94AEC, 0xFEE994CD, 0x9C4D9E81, 0xED623730, 0xCF8A21E8, 0x51917F0B, 0xA7A9B5D6, 0xB297ADF8, 0xEED30431, 0x68CAC921, 0xF1B35D46, 0x7A430A36, 0x51194022, 0x9ABCA65E, 0x85EC70BA, 0x39AEA8CC, 0x737BAE8B, 0x582924D5, 0x03098A5A, 0x92396B81, 0x18DE2522, 0x745C1CB8, 0xA1B8FE1D, 0x5DB3C697, 0x29164F83, 0x97C16376, 0x8419224C, 0x21203B35, 0x833AC0FE, 0xD966A19A, 0xAAF0B24F, 0x40FDA998, 0xE7D52D71, 0x390896A8, 0xCEE6053F, 0xD0B0D300, 0xFF99CBCC, 0x065E3D40 }; } Botan-1.10.12/src/stream/turing/turing.cpp0000664000175000017500000002421312654331322020174 0ustar jackjack00000000000000/* * Turing * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace { /* * Perform an N-way PHT */ inline void PHT(MemoryRegion& B) { u32bit sum = 0; for(size_t i = 0; i < B.size() - 1; ++i) sum += B[i]; B[B.size()-1] += sum; sum = B[B.size()-1]; for(size_t i = 0; i < B.size() - 1; ++i) B[i] += sum; } } /* * Combine cipher stream with message */ void Turing::cipher(const byte in[], byte out[], size_t length) { while(length >= buffer.size() - position) { xor_buf(out, in, &buffer[position], buffer.size() - position); length -= (buffer.size() - position); in += (buffer.size() - position); out += (buffer.size() - position); generate(); } xor_buf(out, in, &buffer[position], length); position += length; } /* * Generate cipher stream */ void Turing::generate() { // Table for Turing's polynomial multiplication static const u32bit MULT_TAB[256] = { 0x00000000, 0xD02B4367, 0xED5686CE, 0x3D7DC5A9, 0x97AC41D1, 0x478702B6, 0x7AFAC71F, 0xAAD18478, 0x631582EF, 0xB33EC188, 0x8E430421, 0x5E684746, 0xF4B9C33E, 0x24928059, 0x19EF45F0, 0xC9C40697, 0xC62A4993, 0x16010AF4, 0x2B7CCF5D, 0xFB578C3A, 0x51860842, 0x81AD4B25, 0xBCD08E8C, 0x6CFBCDEB, 0xA53FCB7C, 0x7514881B, 0x48694DB2, 0x98420ED5, 0x32938AAD, 0xE2B8C9CA, 0xDFC50C63, 0x0FEE4F04, 0xC154926B, 0x117FD10C, 0x2C0214A5, 0xFC2957C2, 0x56F8D3BA, 0x86D390DD, 0xBBAE5574, 0x6B851613, 0xA2411084, 0x726A53E3, 0x4F17964A, 0x9F3CD52D, 0x35ED5155, 0xE5C61232, 0xD8BBD79B, 0x089094FC, 0x077EDBF8, 0xD755989F, 0xEA285D36, 0x3A031E51, 0x90D29A29, 0x40F9D94E, 0x7D841CE7, 0xADAF5F80, 0x646B5917, 0xB4401A70, 0x893DDFD9, 0x59169CBE, 0xF3C718C6, 0x23EC5BA1, 0x1E919E08, 0xCEBADD6F, 0xCFA869D6, 0x1F832AB1, 0x22FEEF18, 0xF2D5AC7F, 0x58042807, 0x882F6B60, 0xB552AEC9, 0x6579EDAE, 0xACBDEB39, 0x7C96A85E, 0x41EB6DF7, 0x91C02E90, 0x3B11AAE8, 0xEB3AE98F, 0xD6472C26, 0x066C6F41, 0x09822045, 0xD9A96322, 0xE4D4A68B, 0x34FFE5EC, 0x9E2E6194, 0x4E0522F3, 0x7378E75A, 0xA353A43D, 0x6A97A2AA, 0xBABCE1CD, 0x87C12464, 0x57EA6703, 0xFD3BE37B, 0x2D10A01C, 0x106D65B5, 0xC04626D2, 0x0EFCFBBD, 0xDED7B8DA, 0xE3AA7D73, 0x33813E14, 0x9950BA6C, 0x497BF90B, 0x74063CA2, 0xA42D7FC5, 0x6DE97952, 0xBDC23A35, 0x80BFFF9C, 0x5094BCFB, 0xFA453883, 0x2A6E7BE4, 0x1713BE4D, 0xC738FD2A, 0xC8D6B22E, 0x18FDF149, 0x258034E0, 0xF5AB7787, 0x5F7AF3FF, 0x8F51B098, 0xB22C7531, 0x62073656, 0xABC330C1, 0x7BE873A6, 0x4695B60F, 0x96BEF568, 0x3C6F7110, 0xEC443277, 0xD139F7DE, 0x0112B4B9, 0xD31DD2E1, 0x03369186, 0x3E4B542F, 0xEE601748, 0x44B19330, 0x949AD057, 0xA9E715FE, 0x79CC5699, 0xB008500E, 0x60231369, 0x5D5ED6C0, 0x8D7595A7, 0x27A411DF, 0xF78F52B8, 0xCAF29711, 0x1AD9D476, 0x15379B72, 0xC51CD815, 0xF8611DBC, 0x284A5EDB, 0x829BDAA3, 0x52B099C4, 0x6FCD5C6D, 0xBFE61F0A, 0x7622199D, 0xA6095AFA, 0x9B749F53, 0x4B5FDC34, 0xE18E584C, 0x31A51B2B, 0x0CD8DE82, 0xDCF39DE5, 0x1249408A, 0xC26203ED, 0xFF1FC644, 0x2F348523, 0x85E5015B, 0x55CE423C, 0x68B38795, 0xB898C4F2, 0x715CC265, 0xA1778102, 0x9C0A44AB, 0x4C2107CC, 0xE6F083B4, 0x36DBC0D3, 0x0BA6057A, 0xDB8D461D, 0xD4630919, 0x04484A7E, 0x39358FD7, 0xE91ECCB0, 0x43CF48C8, 0x93E40BAF, 0xAE99CE06, 0x7EB28D61, 0xB7768BF6, 0x675DC891, 0x5A200D38, 0x8A0B4E5F, 0x20DACA27, 0xF0F18940, 0xCD8C4CE9, 0x1DA70F8E, 0x1CB5BB37, 0xCC9EF850, 0xF1E33DF9, 0x21C87E9E, 0x8B19FAE6, 0x5B32B981, 0x664F7C28, 0xB6643F4F, 0x7FA039D8, 0xAF8B7ABF, 0x92F6BF16, 0x42DDFC71, 0xE80C7809, 0x38273B6E, 0x055AFEC7, 0xD571BDA0, 0xDA9FF2A4, 0x0AB4B1C3, 0x37C9746A, 0xE7E2370D, 0x4D33B375, 0x9D18F012, 0xA06535BB, 0x704E76DC, 0xB98A704B, 0x69A1332C, 0x54DCF685, 0x84F7B5E2, 0x2E26319A, 0xFE0D72FD, 0xC370B754, 0x135BF433, 0xDDE1295C, 0x0DCA6A3B, 0x30B7AF92, 0xE09CECF5, 0x4A4D688D, 0x9A662BEA, 0xA71BEE43, 0x7730AD24, 0xBEF4ABB3, 0x6EDFE8D4, 0x53A22D7D, 0x83896E1A, 0x2958EA62, 0xF973A905, 0xC40E6CAC, 0x14252FCB, 0x1BCB60CF, 0xCBE023A8, 0xF69DE601, 0x26B6A566, 0x8C67211E, 0x5C4C6279, 0x6131A7D0, 0xB11AE4B7, 0x78DEE220, 0xA8F5A147, 0x958864EE, 0x45A32789, 0xEF72A3F1, 0x3F59E096, 0x0224253F, 0xD20F6658 }; /* I tried an implementation without precomputed LFSR offsets, since I thought that might allow (especially on x86-64) the use of leal to compute all the offsets.. However on my Core2 with GCC 4.3 it turned out significantly slower (238 Mib/s, versus 300 Mib/s with precomputed offsets) I also tried using byte vs u32bit for the offset variable (since x86 memory addressing modes can be odd), but it made things even slower (186 Mib/s) */ static const byte OFFSETS[221] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 14, 15, 16, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 0, 1, 5, 7, 8, 9, 15, 16, 0, 1, 2, 3, 4, 5, 6, 10, 12, 13, 14, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 0, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15, 16, 3, 5, 6, 7, 13, 14, 15, 16, 0, 1, 2, 3, 4, 8, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 15, 16, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 3, 4, 5, 11, 12, 13, 14, 15, 16, 0, 1, 2, 6, 8, 9, 10, 16, 0, 1, 2, 3, 4, 5, 6, 7, 11, 13, 14, 15, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 1, 2, 3, 9, 10, 11, 12, 13, 14, 15, 16, 0, 4, 6, 7, 8, 14, 15, 16, 0, 1, 2, 3, 4, 5, 9, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 0, 1, 7, 8, 9, 10, 11, 12, 13, 14, 15, 2, 4, 5, 6, 12, 13, 14, 15, 16, 0, 1, 2, 3, 7, 9, 10, 11 }; for(size_t i = 0; i != 17; ++i) { const byte* R_off = OFFSETS + 13*i; u32bit R0 = R[R_off[0]]; u32bit R1 = R[R_off[1]]; u32bit R2 = R[R_off[2]]; u32bit R3 = R[R_off[3]]; u32bit R4 = R[R_off[4]]; const u32bit R5 = R[R_off[5]]; const u32bit R6 = R[R_off[6]]; const u32bit R7 = R[R_off[7]]; const u32bit R8 = R[R_off[8]]; const u32bit R9 = R[R_off[9]]; const u32bit R10 = R[R_off[10]]; const u32bit R11 = R[R_off[11]]; const u32bit R12 = R[R_off[12]]; R[R_off[0]] = R0 = ((R0 << 8) ^ MULT_TAB[(R0 >> 24) & 0xFF]) ^ R11 ^ R4; u32bit A = R0; u32bit B = R10; u32bit C = R7; u32bit D = R2; u32bit E = R1; E += A + B + C + D; A += E; B += E; C += E; D += E; A = S0[get_byte(0, A)] ^ S1[get_byte(1, A)] ^ S2[get_byte(2, A)] ^ S3[get_byte(3, A)]; B = S0[get_byte(1, B)] ^ S1[get_byte(2, B)] ^ S2[get_byte(3, B)] ^ S3[get_byte(0, B)]; C = S0[get_byte(2, C)] ^ S1[get_byte(3, C)] ^ S2[get_byte(0, C)] ^ S3[get_byte(1, C)]; D = S0[get_byte(3, D)] ^ S1[get_byte(0, D)] ^ S2[get_byte(1, D)] ^ S3[get_byte(2, D)]; E = S0[get_byte(0, E)] ^ S1[get_byte(1, E)] ^ S2[get_byte(2, E)] ^ S3[get_byte(3, E)]; E += A + B + C + D; A += E; B += E; C += E; D += E; R[R_off[1]] = R1 = ((R1 << 8) ^ MULT_TAB[(R1 >> 24) & 0xFF]) ^ R12 ^ R5; R[R_off[2]] = R2 = ((R2 << 8) ^ MULT_TAB[(R2 >> 24) & 0xFF]) ^ R0 ^ R6; R[R_off[3]] = ((R3 << 8) ^ MULT_TAB[(R3 >> 24) & 0xFF]) ^ R1 ^ R7; E += R4; R[R_off[4]] = ((R4 << 8) ^ MULT_TAB[(R4 >> 24) & 0xFF]) ^ R2 ^ R8; A += R1; B += R12; C += R9; D += R5; store_be(A, &buffer[20*i + 0]); store_be(B, &buffer[20*i + 4]); store_be(C, &buffer[20*i + 8]); store_be(D, &buffer[20*i + 12]); store_be(E, &buffer[20*i + 16]); } position = 0; } /* * Turing's byte mixing step */ u32bit Turing::fixedS(u32bit W) { byte B = SBOX[get_byte(0, W)]; W ^= Q_BOX[B]; W &= 0x00FFFFFF; W |= B << 24; B = SBOX[get_byte(1, W)]; W ^= rotate_left(Q_BOX[B], 8); W &= 0xFF00FFFF; W |= B << 16; B = SBOX[get_byte(2, W)]; W ^= rotate_left(Q_BOX[B], 16); W &= 0xFFFF00FF; W |= B << 8; B = SBOX[get_byte(3, W)]; W ^= rotate_left(Q_BOX[B], 24); W &= 0xFFFFFF00; W |= B; return W; } /* * Turing Key Schedule */ void Turing::key_schedule(const byte key[], size_t length) { K.resize(length / 4); for(size_t i = 0; i != length; ++i) K[i/4] = (K[i/4] << 8) + key[i]; for(size_t i = 0; i != K.size(); ++i) K[i] = fixedS(K[i]); PHT(K); for(u32bit i = 0; i != 256; ++i) { u32bit W0 = 0, C0 = i; u32bit W1 = 0, C1 = i; u32bit W2 = 0, C2 = i; u32bit W3 = 0, C3 = i; for(size_t j = 0; j < K.size(); ++j) { C0 = SBOX[get_byte(0, K[j]) ^ C0]; C1 = SBOX[get_byte(1, K[j]) ^ C1]; C2 = SBOX[get_byte(2, K[j]) ^ C2]; C3 = SBOX[get_byte(3, K[j]) ^ C3]; W0 ^= rotate_left(Q_BOX[C0], j); W1 ^= rotate_left(Q_BOX[C1], j + 8); W2 ^= rotate_left(Q_BOX[C2], j + 16); W3 ^= rotate_left(Q_BOX[C3], j + 24); } S0[i] = (W0 & 0x00FFFFFF) | (C0 << 24); S1[i] = (W1 & 0xFF00FFFF) | (C1 << 16); S2[i] = (W2 & 0xFFFF00FF) | (C2 << 8); S3[i] = (W3 & 0xFFFFFF00) | C3; } set_iv(0, 0); } /* * Resynchronization */ void Turing::set_iv(const byte iv[], size_t length) { if(!valid_iv_length(length)) throw Invalid_IV_Length(name(), length); SecureVector IV(length / 4); for(size_t i = 0; i != length; ++i) IV[i/4] = (IV[i/4] << 8) + iv[i]; for(size_t i = 0; i != IV.size(); ++i) R[i] = IV[i] = fixedS(IV[i]); for(size_t i = 0; i != K.size(); ++i) R[i+IV.size()] = K[i]; R[K.size() + IV.size()] = (0x010203 << 8) | (K.size() << 4) | IV.size(); for(size_t i = K.size() + IV.size() + 1; i != 17; ++i) { const u32bit W = R[i-K.size()-IV.size()-1] + R[i-1]; R[i] = S0[get_byte(0, W)] ^ S1[get_byte(1, W)] ^ S2[get_byte(2, W)] ^ S3[get_byte(3, W)]; } PHT(R); generate(); } /* * Clear memory of sensitive data */ void Turing::clear() { zeroise(S0); zeroise(S1); zeroise(S2); zeroise(S3); zeroise(buffer); position = 0; } } Botan-1.10.12/src/stream/turing/turing.h0000664000175000017500000000231412654331322017637 0ustar jackjack00000000000000/* * Turing * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_TURING_H__ #define BOTAN_TURING_H__ #include namespace Botan { /** * Turing */ class BOTAN_DLL Turing : public StreamCipher { public: void cipher(const byte in[], byte out[], size_t length); void set_iv(const byte iv[], size_t iv_length); bool valid_iv_length(size_t iv_len) const { return (iv_len % 4 == 0 && iv_len <= 16); } Key_Length_Specification key_spec() const { return Key_Length_Specification(4, 32, 4); } void clear(); std::string name() const { return "Turing"; } StreamCipher* clone() const { return new Turing; } Turing() : S0(256), S1(256), S2(256), S3(256), R(17), buffer(340), position(0) {} private: void key_schedule(const byte[], size_t); void generate(); static u32bit fixedS(u32bit); static const u32bit Q_BOX[256]; static const byte SBOX[256]; SecureVector S0, S1, S2, S3; SecureVector R; SecureVector K; SecureVector buffer; size_t position; }; } #endif Botan-1.10.12/src/stream/wid_wake/info.txt0000664000175000017500000000002012654331322020124 0ustar jackjack00000000000000define WID_WAKE Botan-1.10.12/src/stream/wid_wake/wid_wake.cpp0000664000175000017500000000624712654331322020747 0ustar jackjack00000000000000/* * WiderWake * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* * Combine cipher stream with message */ void WiderWake_41_BE::cipher(const byte in[], byte out[], size_t length) { while(length >= buffer.size() - position) { xor_buf(out, in, &buffer[position], buffer.size() - position); length -= (buffer.size() - position); in += (buffer.size() - position); out += (buffer.size() - position); generate(buffer.size()); } xor_buf(out, in, &buffer[position], length); position += length; } /* * Generate cipher stream */ void WiderWake_41_BE::generate(size_t length) { u32bit R0 = state[0], R1 = state[1], R2 = state[2], R3 = state[3], R4 = state[4]; for(size_t i = 0; i != length; i += 8) { u32bit R0a; store_be(R3, &buffer[i]); R0a = R4 + R3; R3 += R2; R2 += R1; R1 += R0; R0a = (R0a >> 8) ^ T[(R0a & 0xFF)]; R1 = (R1 >> 8) ^ T[(R1 & 0xFF)]; R2 = (R2 >> 8) ^ T[(R2 & 0xFF)]; R3 = (R3 >> 8) ^ T[(R3 & 0xFF)]; R4 = R0; R0 = R0a; store_be(R3, &buffer[i + 4]); R0a = R4 + R3; R3 += R2; R2 += R1; R1 += R0; R0a = (R0a >> 8) ^ T[(R0a & 0xFF)]; R1 = (R1 >> 8) ^ T[(R1 & 0xFF)]; R2 = (R2 >> 8) ^ T[(R2 & 0xFF)]; R3 = (R3 >> 8) ^ T[(R3 & 0xFF)]; R4 = R0; R0 = R0a; } state[0] = R0; state[1] = R1; state[2] = R2; state[3] = R3; state[4] = R4; position = 0; } /* * WiderWake Key Schedule */ void WiderWake_41_BE::key_schedule(const byte key[], size_t) { for(size_t i = 0; i != 4; ++i) t_key[i] = load_be(key, i); static const u32bit MAGIC[8] = { 0x726A8F3B, 0xE69A3B5C, 0xD3C71FE5, 0xAB3C73D2, 0x4D3A8EB3, 0x0396D6E8, 0x3D4C2F7A, 0x9EE27CF3 }; for(size_t i = 0; i != 4; ++i) T[i] = t_key[i]; for(size_t i = 4; i != 256; ++i) { u32bit X = T[i-1] + T[i-4]; T[i] = (X >> 3) ^ MAGIC[X % 8]; } for(size_t i = 0; i != 23; ++i) T[i] += T[i+89]; u32bit X = T[33]; u32bit Z = (T[59] | 0x01000001) & 0xFF7FFFFF; for(size_t i = 0; i != 256; ++i) { X = (X & 0xFF7FFFFF) + Z; T[i] = (T[i] & 0x00FFFFFF) ^ X; } X = (T[X & 0xFF] ^ X) & 0xFF; Z = T[0]; T[0] = T[X]; for(size_t i = 1; i != 256; ++i) { T[X] = T[i]; X = (T[i ^ X] ^ X) & 0xFF; T[i] = T[X]; } T[X] = Z; position = 0; const byte ZEROS[8] = { 0 }; set_iv(ZEROS, sizeof(ZEROS)); } /* * Resynchronization */ void WiderWake_41_BE::set_iv(const byte iv[], size_t length) { if(!valid_iv_length(length)) throw Invalid_IV_Length(name(), length); for(size_t i = 0; i != 4; ++i) state[i] = t_key[i]; state[4] = load_be(iv, 0); state[0] ^= state[4]; state[2] ^= load_be(iv, 1); generate(8*4); generate(buffer.size()); } /* * Clear memory of sensitive data */ void WiderWake_41_BE::clear() { position = 0; zeroise(t_key); zeroise(state); zeroise(T); zeroise(buffer); } } Botan-1.10.12/src/stream/wid_wake/wid_wake.h0000664000175000017500000000232112654331322020401 0ustar jackjack00000000000000/* * WiderWake * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_WIDER_WAKE_H__ #define BOTAN_WIDER_WAKE_H__ #include namespace Botan { /** * WiderWake4+1-BE * * Note: quite old and possibly not safe; use XSalsa20 or a block * cipher in counter mode. */ class BOTAN_DLL WiderWake_41_BE : public StreamCipher { public: void cipher(const byte[], byte[], size_t); void set_iv(const byte[], size_t); bool valid_iv_length(size_t iv_len) const { return (iv_len == 8); } Key_Length_Specification key_spec() const { return Key_Length_Specification(16); } void clear(); std::string name() const { return "WiderWake4+1-BE"; } StreamCipher* clone() const { return new WiderWake_41_BE; } WiderWake_41_BE() : T(256), state(5), t_key(4), buffer(DEFAULT_BUFFERSIZE), position(0) {} private: void key_schedule(const byte[], size_t); void generate(size_t); SecureVector T; SecureVector state; SecureVector t_key; SecureVector buffer; size_t position; }; } #endif Botan-1.10.12/src/utils/asm_x86_32/asm_x86_32.h0000664000175000017500000000515712654331322020256 0ustar jackjack00000000000000/* * Assembly Macros for 32-bit x86 * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ASM_MACROS_X86_32_H__ #define BOTAN_ASM_MACROS_X86_32_H__ /* * General/Global Macros */ #define ALIGN .p2align 4,,15 #define START_LISTING(FILENAME) \ .file #FILENAME; \ .text; \ ALIGN; #if defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif /* * Function Definitions */ #define START_FUNCTION(func_name) \ ALIGN; \ .global func_name; \ .type func_name,@function; \ func_name: #define END_FUNCTION(func_name) \ ret /* * Loop Control */ #define START_LOOP(LABEL) \ ALIGN; \ LABEL##_LOOP: #define LOOP_UNTIL_EQ(REG, NUM, LABEL) \ cmpl IMM(NUM), REG; \ jne LABEL##_LOOP #define LOOP_UNTIL_LT(REG, NUM, LABEL) \ cmpl IMM(NUM), REG; \ jge LABEL##_LOOP /* Conditional Jumps */ #define JUMP_IF_ZERO(REG, LABEL) \ cmpl IMM(0), REG; \ jz LABEL #define JUMP_IF_LT(REG, NUM, LABEL) \ cmpl IMM(NUM), REG; \ jl LABEL /* * Register Names */ #define EAX %eax #define EBX %ebx #define ECX %ecx #define EDX %edx #define EBP %ebp #define EDI %edi #define ESI %esi #define ESP %esp /* * Memory Access Operations */ #define ARRAY1(REG, NUM) (NUM)(REG) #define ARRAY4(REG, NUM) 4*(NUM)(REG) #define ARRAY4_INDIRECT(BASE, OFFSET, NUM) 4*(NUM)(BASE,OFFSET,4) #define ARG(NUM) 4*(PUSHED) + ARRAY4(ESP, NUM) #define ASSIGN(TO, FROM) movl FROM, TO #define ASSIGN_BYTE(TO, FROM) movzbl FROM, TO #define PUSH(REG) pushl REG #define POP(REG) popl REG #define SPILL_REGS() \ PUSH(EBP) ; \ PUSH(EDI) ; \ PUSH(ESI) ; \ PUSH(EBX) #define RESTORE_REGS() \ POP(EBX) ; \ POP(ESI) ; \ POP(EDI) ; \ POP(EBP) /* * ALU Operations */ #define IMM(VAL) $VAL #define ADD(TO, FROM) addl FROM, TO #define ADD_IMM(TO, NUM) ADD(TO, IMM(NUM)) #define ADD_W_CARRY(TO1, TO2, FROM) addl FROM, TO1; adcl IMM(0), TO2; #define SUB_IMM(TO, NUM) subl IMM(NUM), TO #define ADD2_IMM(TO, FROM, NUM) leal NUM(FROM), TO #define ADD3_IMM(TO, FROM, NUM) leal NUM(TO,FROM,1), TO #define MUL(REG) mull REG #define SHL_IMM(REG, SHIFT) shll IMM(SHIFT), REG #define SHR_IMM(REG, SHIFT) shrl IMM(SHIFT), REG #define SHL2_3(TO, FROM) leal 0(,FROM,8), TO #define XOR(TO, FROM) xorl FROM, TO #define AND(TO, FROM) andl FROM, TO #define OR(TO, FROM) orl FROM, TO #define NOT(REG) notl REG #define ZEROIZE(REG) XOR(REG, REG) #define ROTL_IMM(REG, NUM) roll IMM(NUM), REG #define ROTR_IMM(REG, NUM) rorl IMM(NUM), REG #define BSWAP(REG) bswapl REG #endif Botan-1.10.12/src/utils/asm_x86_32/info.txt0000664000175000017500000000032612654331322020001 0ustar jackjack00000000000000load_on dep asm_x86_32.h x86_32 # ELF systems linux freebsd dragonfly netbsd openbsd solaris gcc icc asm_engine Botan-1.10.12/src/utils/asm_x86_64/asm_x86_64.h0000664000175000017500000000464412654331322020270 0ustar jackjack00000000000000/* * Assembly Macros for 64-bit x86 * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ASM_MACROS_X86_64_H__ #define BOTAN_ASM_MACROS_X86_64_H__ /* * General/Global Macros */ #define ALIGN .p2align 4,,15 #define START_LISTING(FILENAME) \ .file #FILENAME; \ .text; \ ALIGN; #if defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif /* * Function Definitions */ #define START_FUNCTION(func_name) \ ALIGN; \ .global func_name; \ .type func_name,@function; \ func_name: #define END_FUNCTION(func_name) \ ret /* * Conditional Jumps */ #define JUMP_IF_ZERO(REG, LABEL) \ cmp IMM(0), REG; \ jz LABEL #define JUMP_IF_LT(REG, NUM, LABEL) \ cmp IMM(NUM), REG; \ jl LABEL /* * Register Names */ #define R0 %rax #define R1 %rbx #define R2 %rcx #define R2_32 %ecx #define R3 %rdx #define R3_32 %edx #define R4 %rsp #define R5 %rbp #define R6 %rsi #define R6_32 %esi #define R7 %rdi #define R8 %r8 #define R9 %r9 #define R9_32 %r9d #define R10 %r10 #define R11 %r11 #define R12 %r12 #define R13 %r13 #define R14 %r14 #define R15 %r15 #define R16 %r16 #define ARG_1 R7 #define ARG_2 R6 #define ARG_2_32 R6_32 #define ARG_3 R3 #define ARG_3_32 R3_32 #define ARG_4 R2 #define ARG_4_32 R2_32 #define ARG_5 R8 #define ARG_6 R9 #define ARG_6_32 R9_32 #define TEMP_1 R10 #define TEMP_2 R11 #define TEMP_3 ARG_6 #define TEMP_4 ARG_5 #define TEMP_5 ARG_4 #define TEMP_5_32 ARG_4_32 #define TEMP_6 ARG_3 #define TEMP_7 ARG_2 #define TEMP_8 ARG_1 #define TEMP_9 R0 /* * Memory Access Operations */ #define ARRAY8(REG, NUM) 8*(NUM)(REG) #define ARRAY4(REG, NUM) 4*(NUM)(REG) #define ASSIGN(TO, FROM) mov FROM, TO /* * ALU Operations */ #define IMM(VAL) $VAL #define ADD(TO, FROM) add FROM, TO #define ADD_LAST_CARRY(REG) adc IMM(0), REG #define ADD_IMM(TO, NUM) ADD(TO, IMM(NUM)) #define ADD_W_CARRY(TO1, TO2, FROM) add FROM, TO1; adc IMM(0), TO2; #define SUB_IMM(TO, NUM) sub IMM(NUM), TO #define MUL(REG) mul REG #define XOR(TO, FROM) xor FROM, TO #define AND(TO, FROM) and FROM, TO #define OR(TO, FROM) or FROM, TO #define NOT(REG) not REG #define ZEROIZE(REG) XOR(REG, REG) #define RETURN_VALUE_IS(V) ASSIGN(%rax, V) #define ROTL_IMM(REG, NUM) rol IMM(NUM), REG #define ROTR_IMM(REG, NUM) ror IMM(NUM), REG #define ADD3_IMM(TO, FROM, NUM) lea NUM(TO,FROM,1), TO #endif Botan-1.10.12/src/utils/asm_x86_64/info.txt0000664000175000017500000000031212654331322020001 0ustar jackjack00000000000000load_on dep asm_x86_64.h x86_64 clang gcc icc # ELF systems linux netbsd openbsd solaris asm_engine Botan-1.10.12/src/utils/assert.cpp0000664000175000017500000000126212654331322016521 0ustar jackjack00000000000000/* * Runtime assertion checking * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { void assertion_failure(const char* expr_str, const char* msg, const char* func, const char* file, int line) { std::ostringstream format; format << "Assertion " << expr_str << " failed "; if(msg) format << "(" << msg << ") "; if(func) format << "in " << func << " "; format << "@" << file << ":" << line; throw Internal_Error(format.str()); } } Botan-1.10.12/src/utils/assert.h0000664000175000017500000000352412654331322016171 0ustar jackjack00000000000000/* * Runtime assertion checking * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ASSERTION_CHECKING_H__ #define BOTAN_ASSERTION_CHECKING_H__ namespace Botan { void assertion_failure(const char* expr_str, const char* msg, const char* func, const char* file, int line); #define BOTAN_ASSERT(expr, msg) \ do { \ if(!(expr)) \ Botan::assertion_failure(#expr, \ msg, \ BOTAN_ASSERT_FUNCTION, \ __FILE__, \ __LINE__); \ } while(0) #define BOTAN_ASSERT_EQUAL(value1, value2, msg) \ do { \ if(value1 != value2) \ Botan::assertion_failure(#value1 " == " #value2, \ msg, \ BOTAN_ASSERT_FUNCTION, \ __FILE__, \ __LINE__); \ } while(0) /* * Unfortunately getting the function name from the preprocessor * isn't standard in C++98 (C++0x uses C99's __func__) */ #if defined(BOTAN_BUILD_COMPILER_IS_GCC) || \ defined(BOTAN_BUILD_COMPILER_IS_CLANG) || \ defined(BOTAN_BUILD_COMPILER_IS_INTEL) #define BOTAN_ASSERT_FUNCTION __PRETTY_FUNCTION__ #elif defined(BOTAN_BUILD_COMPILER_IS_MSVC) #define BOTAN_ASSERT_FUNCTION __FUNCTION__ #else #define BOTAN_ASSERT_FUNCTION ((const char*)0) #endif } #endif Botan-1.10.12/src/utils/bit_ops.h0000664000175000017500000000405112654331322016323 0ustar jackjack00000000000000/* * Bit/Word Operations * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BIT_OPS_H__ #define BOTAN_BIT_OPS_H__ #include namespace Botan { /** * Power of 2 test. T should be an unsigned integer type * @param arg an integer value * @return true iff arg is 2^n for some n > 0 */ template inline bool power_of_2(T arg) { return ((arg != 0 && arg != 1) && ((arg & (arg-1)) == 0)); } /** * Return the index of the highest set bit * T is an unsigned integer type * @param n an integer value * @return index of the highest set bit in n */ template inline size_t high_bit(T n) { for(size_t i = 8*sizeof(T); i > 0; --i) if((n >> (i - 1)) & 0x01) return i; return 0; } /** * Return the index of the lowest set bit * T is an unsigned integer type * @param n an integer value * @return index of the lowest set bit in n */ template inline size_t low_bit(T n) { for(size_t i = 0; i != 8*sizeof(T); ++i) if((n >> i) & 0x01) return (i + 1); return 0; } /** * Return the number of significant bytes in n * @param n an integer value * @return number of significant bytes in n */ template inline size_t significant_bytes(T n) { for(size_t i = 0; i != sizeof(T); ++i) if(get_byte(i, n)) return sizeof(T)-i; return 0; } /** * Compute Hamming weights * @param n an integer value * @return number of bits in n set to 1 */ template inline size_t hamming_weight(T n) { const byte NIBBLE_WEIGHTS[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; size_t weight = 0; for(size_t i = 0; i != 2*sizeof(T); ++i) weight += NIBBLE_WEIGHTS[(n >> (4*i)) & 0x0F]; return weight; } /** * Count the trailing zero bits in n * @param n an integer value * @return maximum x st 2^x divides n */ template inline size_t ctz(T n) { for(size_t i = 0; i != 8*sizeof(T); ++i) if((n >> i) & 0x01) return i; return 8*sizeof(T); } } #endif Botan-1.10.12/src/utils/bswap.h0000664000175000017500000000620412654331322016002 0ustar jackjack00000000000000/* * Byte Swapping Operations * (C) 1999-2011 Jack Lloyd * (C) 2007 Yves Jerschow * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BYTE_SWAP_H__ #define BOTAN_BYTE_SWAP_H__ #include #include #if defined(BOTAN_TARGET_CPU_HAS_SSE2) && !defined(BOTAN_NO_SSE_INTRINSICS) #include #endif namespace Botan { /** * Swap a 16 bit integer */ inline u16bit reverse_bytes(u16bit val) { return rotate_left(val, 8); } /** * Swap a 32 bit integer */ inline u32bit reverse_bytes(u32bit val) { #if BOTAN_GCC_VERSION >= 430 && !defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) /* GCC intrinsic added in 4.3, works for a number of CPUs However avoid under ARM, as it branches to a function in libgcc instead of generating inline asm, so slower even than the generic rotate version below. */ return __builtin_bswap32(val); #elif BOTAN_USE_GCC_INLINE_ASM && defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) // GCC-style inline assembly for x86 or x86-64 asm("bswapl %0" : "=r" (val) : "0" (val)); return val; #elif BOTAN_USE_GCC_INLINE_ASM && defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) asm ("eor r3, %1, %1, ror #16\n\t" "bic r3, r3, #0x00FF0000\n\t" "mov %0, %1, ror #8\n\t" "eor %0, %0, r3, lsr #8" : "=r" (val) : "0" (val) : "r3", "cc"); return val; #elif defined(_MSC_VER) && defined(BOTAN_TARGET_ARCH_IS_X86_32) // Visual C++ inline asm for 32-bit x86, by Yves Jerschow __asm mov eax, val; __asm bswap eax; #else // Generic implementation return (rotate_right(val, 8) & 0xFF00FF00) | (rotate_left (val, 8) & 0x00FF00FF); #endif } /** * Swap a 64 bit integer */ inline u64bit reverse_bytes(u64bit val) { #if BOTAN_GCC_VERSION >= 430 // GCC intrinsic added in 4.3, works for a number of CPUs return __builtin_bswap64(val); #elif BOTAN_USE_GCC_INLINE_ASM && defined(BOTAN_TARGET_ARCH_IS_X86_64) // GCC-style inline assembly for x86-64 asm("bswapq %0" : "=r" (val) : "0" (val)); return val; #else /* Generic implementation. Defined in terms of 32-bit bswap so any * optimizations in that version can help here (particularly * useful for 32-bit x86). */ u32bit hi = static_cast(val >> 32); u32bit lo = static_cast(val); hi = reverse_bytes(hi); lo = reverse_bytes(lo); return (static_cast(lo) << 32) | hi; #endif } /** * Swap 4 Ts in an array */ template inline void bswap_4(T x[4]) { x[0] = reverse_bytes(x[0]); x[1] = reverse_bytes(x[1]); x[2] = reverse_bytes(x[2]); x[3] = reverse_bytes(x[3]); } #if defined(BOTAN_TARGET_CPU_HAS_SSE2) && !defined(BOTAN_NO_SSE_INTRINSICS) /** * Swap 4 u32bits in an array using SSE2 shuffle instructions */ template<> inline void bswap_4(u32bit x[4]) { __m128i T = _mm_loadu_si128(reinterpret_cast(x)); T = _mm_shufflehi_epi16(T, _MM_SHUFFLE(2, 3, 0, 1)); T = _mm_shufflelo_epi16(T, _MM_SHUFFLE(2, 3, 0, 1)); T = _mm_or_si128(_mm_srli_epi16(T, 8), _mm_slli_epi16(T, 8)); _mm_storeu_si128(reinterpret_cast<__m128i*>(x), T); } #endif } #endif Botan-1.10.12/src/utils/charset.cpp0000664000175000017500000001032212654331322016646 0ustar jackjack00000000000000/* * Character Set Handling * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { namespace Charset { namespace { /* * Convert from UCS-2 to ISO 8859-1 */ std::string ucs2_to_latin1(const std::string& ucs2) { if(ucs2.size() % 2 == 1) throw Decoding_Error("UCS-2 string has an odd number of bytes"); std::string latin1; for(size_t i = 0; i != ucs2.size(); i += 2) { const byte c1 = ucs2[i]; const byte c2 = ucs2[i+1]; if(c1 != 0) throw Decoding_Error("UCS-2 has non-Latin1 characters"); latin1 += static_cast(c2); } return latin1; } /* * Convert from UTF-8 to ISO 8859-1 */ std::string utf8_to_latin1(const std::string& utf8) { std::string iso8859; size_t position = 0; while(position != utf8.size()) { const byte c1 = static_cast(utf8[position++]); if(c1 <= 0x7F) iso8859 += static_cast(c1); else if(c1 >= 0xC0 && c1 <= 0xC7) { if(position == utf8.size()) throw Decoding_Error("UTF-8: sequence truncated"); const byte c2 = static_cast(utf8[position++]); const byte iso_char = ((c1 & 0x07) << 6) | (c2 & 0x3F); if(iso_char <= 0x7F) throw Decoding_Error("UTF-8: sequence longer than needed"); iso8859 += static_cast(iso_char); } else throw Decoding_Error("UTF-8: Unicode chars not in Latin1 used"); } return iso8859; } /* * Convert from ISO 8859-1 to UTF-8 */ std::string latin1_to_utf8(const std::string& iso8859) { std::string utf8; for(size_t i = 0; i != iso8859.size(); ++i) { const byte c = static_cast(iso8859[i]); if(c <= 0x7F) utf8 += static_cast(c); else { utf8 += static_cast((0xC0 | (c >> 6))); utf8 += static_cast((0x80 | (c & 0x3F))); } } return utf8; } } /* * Perform character set transcoding */ std::string transcode(const std::string& str, Character_Set to, Character_Set from) { if(to == LOCAL_CHARSET) to = LATIN1_CHARSET; if(from == LOCAL_CHARSET) from = LATIN1_CHARSET; if(to == from) return str; if(from == LATIN1_CHARSET && to == UTF8_CHARSET) return latin1_to_utf8(str); if(from == UTF8_CHARSET && to == LATIN1_CHARSET) return utf8_to_latin1(str); if(from == UCS2_CHARSET && to == LATIN1_CHARSET) return ucs2_to_latin1(str); throw Invalid_Argument("Unknown transcoding operation from " + to_string(from) + " to " + to_string(to)); } /* * Check if a character represents a digit */ bool is_digit(char c) { if(c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7' || c == '8' || c == '9') return true; return false; } /* * Check if a character represents whitespace */ bool is_space(char c) { if(c == ' ' || c == '\t' || c == '\n' || c == '\r') return true; return false; } /* * Convert a character to a digit */ byte char2digit(char c) { switch(c) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; } throw Invalid_Argument("char2digit: Input is not a digit character"); } /* * Convert a digit to a character */ char digit2char(byte b) { switch(b) { case 0: return '0'; case 1: return '1'; case 2: return '2'; case 3: return '3'; case 4: return '4'; case 5: return '5'; case 6: return '6'; case 7: return '7'; case 8: return '8'; case 9: return '9'; } throw Invalid_Argument("digit2char: Input is not a digit"); } /* * Case-insensitive character comparison */ bool caseless_cmp(char a, char b) { return (std::tolower(static_cast(a)) == std::tolower(static_cast(b))); } } } Botan-1.10.12/src/utils/charset.h0000664000175000017500000000143312654331322016316 0ustar jackjack00000000000000/* * Character Set Handling * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CHARSET_H__ #define BOTAN_CHARSET_H__ #include #include namespace Botan { /** * The different charsets (nominally) supported by Botan. */ enum Character_Set { LOCAL_CHARSET, UCS2_CHARSET, UTF8_CHARSET, LATIN1_CHARSET }; namespace Charset { /* * Character Set Handling */ std::string BOTAN_DLL transcode(const std::string& str, Character_Set to, Character_Set from); bool BOTAN_DLL is_digit(char c); bool BOTAN_DLL is_space(char c); bool BOTAN_DLL caseless_cmp(char x, char y); byte BOTAN_DLL char2digit(char c); char BOTAN_DLL digit2char(byte b); } } #endif Botan-1.10.12/src/utils/cpuid.cpp0000664000175000017500000001235712654331322016333 0ustar jackjack00000000000000/* * Runtime CPU detection * (C) 2009-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) #if defined(BOTAN_TARGET_OS_IS_DARWIN) #include #endif #if defined(BOTAN_TARGET_OS_IS_OPENBSD) #include #include #include #endif #endif #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) #if defined(BOTAN_BUILD_COMPILER_IS_MSVC) #include #define CALL_CPUID(type, out) do { __cpuid((int*)out, type); } while(0) #elif defined(BOTAN_BUILD_COMPILER_IS_INTEL) #include #define CALL_CPUID(type, out) do { __cpuid(out, type); } while(0) #elif defined(BOTAN_BUILD_COMPILER_IS_GCC) && (BOTAN_GCC_VERSION >= 430) // Only available starting in GCC 4.3 #include namespace { /* * Prevent inlining to work around GCC bug 44174 */ void __attribute__((__noinline__)) call_gcc_cpuid(Botan::u32bit type, Botan::u32bit out[4]) { __get_cpuid(type, out, out+1, out+2, out+3); } #define CALL_CPUID call_gcc_cpuid } #elif defined(BOTAN_TARGET_ARCH_IS_X86_64) && \ (defined(BOTAN_BUILD_COMPILER_IS_CLANG) || defined(BOTAN_BUILD_COMPILER_IS_GCC)) /* * We can't safely use this on x86-32 as some 32-bit ABIs use ebx as * a PIC register, and in theory there are some x86-32s still out * there that don't support cpuid at all; it requires strange * contortions to detect them. */ #define CALL_CPUID(type, out) \ asm("cpuid\n\t" : "=a" (out[0]), "=b" (out[1]), "=c" (out[2]), "=d" (out[3]) \ : "0" (type)) #else #warning "No method of calling CPUID for this compiler" #endif #endif #ifndef CALL_CPUID // In all other cases, just zeroize the supposed cpuid output #define CALL_CPUID(type, out) \ do { out[0] = out[1] = out[2] = out[3] = 0; } while(0); #endif namespace Botan { u64bit CPUID::x86_processor_flags = 0; size_t CPUID::cache_line = 32; bool CPUID::altivec_capable = false; namespace { u32bit get_x86_cache_line_size() { const u32bit INTEL_CPUID[3] = { 0x756E6547, 0x6C65746E, 0x49656E69 }; const u32bit AMD_CPUID[3] = { 0x68747541, 0x444D4163, 0x69746E65 }; u32bit cpuid[4] = { 0 }; CALL_CPUID(0, cpuid); if(same_mem(cpuid + 1, INTEL_CPUID, 3)) { CALL_CPUID(1, cpuid); return 8 * get_byte(2, cpuid[1]); } else if(same_mem(cpuid + 1, AMD_CPUID, 3)) { CALL_CPUID(0x80000005, cpuid); return get_byte(3, cpuid[2]); } else return 32; // default cache line guess } #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) bool altivec_check_sysctl() { #if defined(BOTAN_TARGET_OS_IS_DARWIN) || defined(BOTAN_TARGET_OS_IS_OPENBSD) #if defined(BOTAN_TARGET_OS_IS_OPENBSD) int sels[2] = { CTL_MACHDEP, CPU_ALTIVEC }; #else // From Apple's docs int sels[2] = { CTL_HW, HW_VECTORUNIT }; #endif int vector_type = 0; size_t length = sizeof(vector_type); int error = sysctl(sels, 2, &vector_type, &length, NULL, 0); if(error == 0 && vector_type > 0) return true; #endif return false; } bool altivec_check_pvr_emul() { bool altivec_capable = false; #if defined(BOTAN_TARGET_OS_IS_LINUX) || defined(BOTAN_TARGET_OS_IS_NETBSD) /* On PowerPC, MSR 287 is PVR, the Processor Version Number Normally it is only accessible to ring 0, but Linux and NetBSD (others, too, maybe?) will trap and emulate it for us. PVR identifiers for various AltiVec enabled CPUs. Taken from PearPC and Linux sources, mostly. */ const u16bit PVR_G4_7400 = 0x000C; const u16bit PVR_G5_970 = 0x0039; const u16bit PVR_G5_970FX = 0x003C; const u16bit PVR_G5_970MP = 0x0044; const u16bit PVR_G5_970GX = 0x0045; const u16bit PVR_POWER6 = 0x003E; const u16bit PVR_POWER7 = 0x003F; const u16bit PVR_CELL_PPU = 0x0070; // Motorola produced G4s with PVR 0x800[0123C] (at least) const u16bit PVR_G4_74xx_24 = 0x800; u32bit pvr = 0; asm volatile("mfspr %0, 287" : "=r" (pvr)); // Top 16 bit suffice to identify model pvr >>= 16; altivec_capable |= (pvr == PVR_G4_7400); altivec_capable |= ((pvr >> 4) == PVR_G4_74xx_24); altivec_capable |= (pvr == PVR_G5_970); altivec_capable |= (pvr == PVR_G5_970FX); altivec_capable |= (pvr == PVR_G5_970MP); altivec_capable |= (pvr == PVR_G5_970GX); altivec_capable |= (pvr == PVR_POWER6); altivec_capable |= (pvr == PVR_POWER7); altivec_capable |= (pvr == PVR_CELL_PPU); #endif return altivec_capable; } #endif } void CPUID::initialize() { u32bit cpuid[4] = { 0 }; CALL_CPUID(1, cpuid); x86_processor_flags = (static_cast(cpuid[2]) << 32) | cpuid[3]; #if defined(BOTAN_TARGET_ARCH_IS_X86_64) /* * If we don't have access to CPUID, we can still safely assume that * any x86-64 processor has SSE2. */ if(x86_processor_flags == 0) x86_processor_flags |= (1 << CPUID_SSE2_BIT); #endif cache_line = get_x86_cache_line_size(); altivec_capable = false; #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) if(altivec_check_sysctl() || altivec_check_pvr_emul()) altivec_capable = true; #endif } } Botan-1.10.12/src/utils/cpuid.h0000664000175000017500000000551512654331322015776 0ustar jackjack00000000000000/* * Runtime CPU detection * (C) 2009-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_CPUID_H__ #define BOTAN_CPUID_H__ #include namespace Botan { /** * A class handling runtime CPU feature detection */ class BOTAN_DLL CPUID { public: /** * Probe the CPU and see what extensions are supported */ static void initialize(); /** * Return a best guess of the cache line size */ static size_t cache_line_size() { return cache_line; } /** * Check if the processor supports RDTSC */ static bool has_rdtsc() { return x86_processor_flags_has(CPUID_RDTSC_BIT); } /** * Check if the processor supports SSE2 */ static bool has_sse2() { return x86_processor_flags_has(CPUID_SSE2_BIT); } /** * Check if the processor supports SSSE3 */ static bool has_ssse3() { return x86_processor_flags_has(CPUID_SSSE3_BIT); } /** * Check if the processor supports SSE4.1 */ static bool has_sse41() { return x86_processor_flags_has(CPUID_SSE41_BIT); } /** * Check if the processor supports SSE4.2 */ static bool has_sse42() { return x86_processor_flags_has(CPUID_SSE42_BIT); } /** * Check if the processor supports extended AVX vector instructions */ static bool has_avx() { return x86_processor_flags_has(CPUID_AVX_BIT); } /** * Check if the processor supports AES-NI */ static bool has_aes_ni() { return x86_processor_flags_has(CPUID_AESNI_BIT); } /** * Check if the processor supports PCMULUDQ */ static bool has_pcmuludq() { return x86_processor_flags_has(CPUID_PCMUL_BIT); } /** * Check if the processor supports MOVBE */ static bool has_movbe() { return x86_processor_flags_has(CPUID_MOVBE_BIT); } /** * Check if the processor supports RDRAND */ static bool has_rdrand() { return x86_processor_flags_has(CPUID_RDRAND_BIT); } /** * Check if the processor supports AltiVec/VMX */ static bool has_altivec() { return altivec_capable; } private: enum CPUID_bits { CPUID_RDTSC_BIT = 4, CPUID_SSE2_BIT = 26, CPUID_PCMUL_BIT = 33, CPUID_SSSE3_BIT = 41, CPUID_SSE41_BIT = 51, CPUID_SSE42_BIT = 52, CPUID_MOVBE_BIT = 54, CPUID_AESNI_BIT = 57, CPUID_AVX_BIT = 60, CPUID_RDRAND_BIT = 62 }; static bool x86_processor_flags_has(u64bit bit) { return ((x86_processor_flags >> bit) & 1); } static u64bit x86_processor_flags; static size_t cache_line; static bool altivec_capable; }; } #endif Botan-1.10.12/src/utils/datastor/datastor.cpp0000664000175000017500000000721512654331322020666 0ustar jackjack00000000000000/* * Data Store * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include namespace Botan { /* * Default Matcher transform operation (identity) */ std::pair Data_Store::Matcher::transform(const std::string& key, const std::string& value) const { return std::make_pair(key, value); } /* * Data_Store Equality Comparison */ bool Data_Store::operator==(const Data_Store& other) const { return (contents == other.contents); } /* * Check if this key has at least one value */ bool Data_Store::has_value(const std::string& key) const { return (contents.lower_bound(key) != contents.end()); } /* * Search based on an arbitrary predicate */ std::multimap Data_Store::search_with(const Matcher& matcher) const { std::multimap out; std::multimap::const_iterator i = contents.begin(); while(i != contents.end()) { if(matcher(i->first, i->second)) { std::pair p( matcher.transform(i->first, i->second)); multimap_insert(out, p.first, p.second); } ++i; } return out; } /* * Search based on key equality */ std::vector Data_Store::get(const std::string& looking_for) const { typedef std::multimap::const_iterator iter; std::pair range = contents.equal_range(looking_for); std::vector out; for(iter i = range.first; i != range.second; ++i) out.push_back(i->second); return out; } /* * Get a single atom */ std::string Data_Store::get1(const std::string& key) const { std::vector vals = get(key); if(vals.empty()) throw Invalid_State("Data_Store::get1: Not values for " + key); if(vals.size() > 1) throw Invalid_State("Data_Store::get1: More than one value for " + key); return vals[0]; } /* * Get a single MemoryVector atom */ MemoryVector Data_Store::get1_memvec(const std::string& key) const { std::vector vals = get(key); if(vals.empty()) return MemoryVector(); if(vals.size() > 1) throw Invalid_State("Data_Store::get1_memvec: Multiple values for " + key); return hex_decode(vals[0]); } /* * Get a single u32bit atom */ u32bit Data_Store::get1_u32bit(const std::string& key, u32bit default_val) const { std::vector vals = get(key); if(vals.empty()) return default_val; else if(vals.size() > 1) throw Invalid_State("Data_Store::get1_u32bit: Multiple values for " + key); return to_u32bit(vals[0]); } /* * Insert a single key and value */ void Data_Store::add(const std::string& key, const std::string& val) { multimap_insert(contents, key, val); } /* * Insert a single key and value */ void Data_Store::add(const std::string& key, u32bit val) { add(key, to_string(val)); } /* * Insert a single key and value */ void Data_Store::add(const std::string& key, const MemoryRegion& val) { add(key, hex_encode(&val[0], val.size())); } /* * Insert a mapping of key/value pairs */ void Data_Store::add(const std::multimap& in) { std::multimap::const_iterator i = in.begin(); while(i != in.end()) { contents.insert(*i); ++i; } } } Botan-1.10.12/src/utils/datastor/datastor.h0000664000175000017500000000271512654331322020333 0ustar jackjack00000000000000/* * Data Store * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DATA_STORE_H__ #define BOTAN_DATA_STORE_H__ #include #include #include #include #include namespace Botan { /** * Data Store */ class BOTAN_DLL Data_Store { public: /** * A search function */ class BOTAN_DLL Matcher { public: virtual bool operator()(const std::string&, const std::string&) const = 0; virtual std::pair transform(const std::string&, const std::string&) const; virtual ~Matcher() {} }; bool operator==(const Data_Store&) const; std::multimap search_with(const Matcher&) const; std::vector get(const std::string&) const; std::string get1(const std::string&) const; MemoryVector get1_memvec(const std::string&) const; u32bit get1_u32bit(const std::string&, u32bit = 0) const; bool has_value(const std::string&) const; void add(const std::multimap&); void add(const std::string&, const std::string&); void add(const std::string&, u32bit); void add(const std::string&, const MemoryRegion&); private: std::multimap contents; }; } #endif Botan-1.10.12/src/utils/datastor/info.txt0000664000175000017500000000003512654331322020026 0ustar jackjack00000000000000 alloc Botan-1.10.12/src/utils/dyn_load/dyn_load.cpp0000664000175000017500000000361012654331322020601 0ustar jackjack00000000000000/** * Dynamically Loaded Object * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #if defined(BOTAN_TARGET_OS_HAS_DLOPEN) #include #elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY) #include #endif namespace Botan { namespace { void raise_runtime_loader_exception(const std::string& lib_name, const char* msg) { throw std::runtime_error("Failed to load " + lib_name + ": " + (msg ? msg : "Unknown error")); } } Dynamically_Loaded_Library::Dynamically_Loaded_Library( const std::string& library) : lib_name(library), lib(0) { #if defined(BOTAN_TARGET_OS_HAS_DLOPEN) lib = ::dlopen(lib_name.c_str(), RTLD_LAZY); if(!lib) raise_runtime_loader_exception(lib_name, dlerror()); #elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY) lib = ::LoadLibraryA(lib_name.c_str()); if(!lib) raise_runtime_loader_exception(lib_name, "LoadLibrary failed"); #endif if(!lib) raise_runtime_loader_exception(lib_name, "Dynamic load not supported"); } Dynamically_Loaded_Library::~Dynamically_Loaded_Library() { #if defined(BOTAN_TARGET_OS_HAS_DLOPEN) ::dlclose(lib); #elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY) ::FreeLibrary((HMODULE)lib); #endif } void* Dynamically_Loaded_Library::resolve_symbol(const std::string& symbol) { void* addr = 0; #if defined(BOTAN_TARGET_OS_HAS_DLOPEN) addr = ::dlsym(lib, symbol.c_str()); #elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY) addr = reinterpret_cast(::GetProcAddress((HMODULE)lib, symbol.c_str())); #endif if(!addr) throw std::runtime_error("Failed to resolve symbol " + symbol + " in " + lib_name); return addr; } } Botan-1.10.12/src/utils/dyn_load/dyn_load.h0000664000175000017500000000345612654331322020256 0ustar jackjack00000000000000/* * Dynamically Loaded Object * (C) 2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_DYNAMIC_LOADER_H__ #define BOTAN_DYNAMIC_LOADER_H__ #include namespace Botan { /** * Represents a DLL or shared object */ class Dynamically_Loaded_Library { public: /** * Load a DLL (or fail with an exception) * @param lib_name name or path to a library * * If you don't use a full path, the search order will be defined * by whatever the system linker does by default. Always using fully * qualified pathnames can help prevent code injection attacks (eg * via manipulation of LD_LIBRARY_PATH on Linux) */ Dynamically_Loaded_Library(const std::string& lib_name); /** * Unload the DLL * @warning Any pointers returned by resolve()/resolve_symbol() * should not be used after this destructor runs. */ ~Dynamically_Loaded_Library(); /** * Load a symbol (or fail with an exception) * @param symbol names the symbol to load * @return address of the loaded symbol */ void* resolve_symbol(const std::string& symbol); /** * Convenience function for casting symbol to the right type * @param symbol names the symbol to load * @return address of the loaded symbol */ template T resolve(const std::string& symbol) { #if defined(__GNUC__) && __GNUC__ < 4 return (T)(resolve_symbol(symbol)); #else return reinterpret_cast(resolve_symbol(symbol)); #endif } private: Dynamically_Loaded_Library(const Dynamically_Loaded_Library&); Dynamically_Loaded_Library& operator=(const Dynamically_Loaded_Library&); std::string lib_name; void* lib; }; } #endif Botan-1.10.12/src/utils/dyn_load/info.txt0000664000175000017500000000031712654331322020001 0ustar jackjack00000000000000define DYNAMIC_LOADER freebsd linux netbsd openbsd qnx solaris windows linux -> dl solaris -> dl dyn_load.cpp dyn_load.h Botan-1.10.12/src/utils/exceptn.h0000664000175000017500000001000612654331322016327 0ustar jackjack00000000000000/* * Exceptions * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_EXCEPTION_H__ #define BOTAN_EXCEPTION_H__ #include #include #include #include #include namespace Botan { typedef std::runtime_error Exception; typedef std::invalid_argument Invalid_Argument; /** * Invalid_State Exception */ struct BOTAN_DLL Invalid_State : public Exception { Invalid_State(const std::string& err) : Exception(err) {} }; /** * Lookup_Error Exception */ struct BOTAN_DLL Lookup_Error : public Exception { Lookup_Error(const std::string& err) : Exception(err) {} }; /** * Internal_Error Exception */ struct BOTAN_DLL Internal_Error : public Exception { Internal_Error(const std::string& err) : Exception("Internal error: " + err) {} }; /** * Invalid_Key_Length Exception */ struct BOTAN_DLL Invalid_Key_Length : public Invalid_Argument { Invalid_Key_Length(const std::string& name, size_t length) : Invalid_Argument(name + " cannot accept a key of length " + to_string(length)) {} }; /** * Invalid_Block_Size Exception */ struct BOTAN_DLL Invalid_Block_Size : public Invalid_Argument { Invalid_Block_Size(const std::string& mode, const std::string& pad) : Invalid_Argument("Padding method " + pad + " cannot be used with " + mode) {} }; /** * Invalid_IV_Length Exception */ struct BOTAN_DLL Invalid_IV_Length : public Invalid_Argument { Invalid_IV_Length(const std::string& mode, size_t bad_len) : Invalid_Argument("IV length " + to_string(bad_len) + " is invalid for " + mode) {} }; /** * PRNG_Unseeded Exception */ struct BOTAN_DLL PRNG_Unseeded : public Invalid_State { PRNG_Unseeded(const std::string& algo) : Invalid_State("PRNG not seeded: " + algo) {} }; /** * Policy_Violation Exception */ struct BOTAN_DLL Policy_Violation : public Invalid_State { Policy_Violation(const std::string& err) : Invalid_State("Policy violation: " + err) {} }; /** * Algorithm_Not_Found Exception */ struct BOTAN_DLL Algorithm_Not_Found : public Lookup_Error { Algorithm_Not_Found(const std::string& name) : Lookup_Error("Could not find any algorithm named \"" + name + "\"") {} }; /** * Invalid_Algorithm_Name Exception */ struct BOTAN_DLL Invalid_Algorithm_Name : public Invalid_Argument { Invalid_Algorithm_Name(const std::string& name): Invalid_Argument("Invalid algorithm name: " + name) {} }; /** * Encoding_Error Exception */ struct BOTAN_DLL Encoding_Error : public Invalid_Argument { Encoding_Error(const std::string& name) : Invalid_Argument("Encoding error: " + name) {} }; /** * Decoding_Error Exception */ struct BOTAN_DLL Decoding_Error : public Invalid_Argument { Decoding_Error(const std::string& name) : Invalid_Argument("Decoding error: " + name) {} }; /** * Integrity_Failure Exception */ struct BOTAN_DLL Integrity_Failure : public Exception { Integrity_Failure(const std::string& msg) : Exception("Integrity failure: " + msg) {} }; /** * Invalid_OID Exception */ struct BOTAN_DLL Invalid_OID : public Decoding_Error { Invalid_OID(const std::string& oid) : Decoding_Error("Invalid ASN.1 OID: " + oid) {} }; /** * Stream_IO_Error Exception */ struct BOTAN_DLL Stream_IO_Error : public Exception { Stream_IO_Error(const std::string& err) : Exception("I/O error: " + err) {} }; /** * Self Test Failure Exception */ struct BOTAN_DLL Self_Test_Failure : public Internal_Error { Self_Test_Failure(const std::string& err) : Internal_Error("Self test failed: " + err) {} }; /** * Memory Allocation Exception */ struct BOTAN_DLL Memory_Exhaustion : public std::bad_alloc { const char* what() const throw() { return "Ran out of memory, allocation failed"; } }; } #endif Botan-1.10.12/src/utils/get_byte.h0000664000175000017500000000104612654331322016467 0ustar jackjack00000000000000/* * Read out bytes * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_GET_BYTE_H__ #define BOTAN_GET_BYTE_H__ #include namespace Botan { /** * Byte extraction * @param byte_num which byte to extract, 0 == highest byte * @param input the value to extract from * @return byte byte_num of input */ template inline byte get_byte(size_t byte_num, T input) { return static_cast( input >> ((sizeof(T)-1-(byte_num&(sizeof(T)-1))) << 3) ); } } #endif Botan-1.10.12/src/utils/info.txt0000664000175000017500000000066212654331322016213 0ustar jackjack00000000000000define UTIL_FUNCTIONS load_on always assert.cpp charset.cpp cpuid.cpp mlock.cpp parsing.cpp time.cpp ui.cpp version.cpp assert.h bit_ops.h mlock.h prefetch.h rounding.h stl_util.h xor_buf.h bswap.h charset.h cpuid.h exceptn.h loadstor.h mem_ops.h parsing.h rotate.h time.h types.h ui.h version.h get_byte.h linux,tru64 -> rt Botan-1.10.12/src/utils/loadstor.h0000664000175000017500000003734312654331322016525 0ustar jackjack00000000000000/* * Load/Store Operators * (C) 1999-2007 Jack Lloyd * 2007 Yves Jerschow * * Distributed under the terms of the Botan license */ #ifndef BOTAN_LOAD_STORE_H__ #define BOTAN_LOAD_STORE_H__ #include #include #include #include #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK #if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) #define BOTAN_ENDIAN_N2B(x) (x) #define BOTAN_ENDIAN_B2N(x) (x) #define BOTAN_ENDIAN_N2L(x) reverse_bytes(x) #define BOTAN_ENDIAN_L2N(x) reverse_bytes(x) #elif defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) #define BOTAN_ENDIAN_N2L(x) (x) #define BOTAN_ENDIAN_L2N(x) (x) #define BOTAN_ENDIAN_N2B(x) reverse_bytes(x) #define BOTAN_ENDIAN_B2N(x) reverse_bytes(x) #endif #endif namespace Botan { /** * Make a u16bit from two bytes * @param i0 the first byte * @param i1 the second byte * @return i0 || i1 */ inline u16bit make_u16bit(byte i0, byte i1) { return ((static_cast(i0) << 8) | i1); } /** * Make a u32bit from four bytes * @param i0 the first byte * @param i1 the second byte * @param i2 the third byte * @param i3 the fourth byte * @return i0 || i1 || i2 || i3 */ inline u32bit make_u32bit(byte i0, byte i1, byte i2, byte i3) { return ((static_cast(i0) << 24) | (static_cast(i1) << 16) | (static_cast(i2) << 8) | (static_cast(i3))); } /** * Make a u32bit from eight bytes * @param i0 the first byte * @param i1 the second byte * @param i2 the third byte * @param i3 the fourth byte * @param i4 the fifth byte * @param i5 the sixth byte * @param i6 the seventh byte * @param i7 the eighth byte * @return i0 || i1 || i2 || i3 || i4 || i5 || i6 || i7 */ inline u64bit make_u64bit(byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) { return ((static_cast(i0) << 56) | (static_cast(i1) << 48) | (static_cast(i2) << 40) | (static_cast(i3) << 32) | (static_cast(i4) << 24) | (static_cast(i5) << 16) | (static_cast(i6) << 8) | (static_cast(i7))); } /** * Load a big-endian word * @param in a pointer to some bytes * @param off an offset into the array * @return off'th T of in, as a big-endian value */ template inline T load_be(const byte in[], size_t off) { in += off * sizeof(T); T out = 0; for(size_t i = 0; i != sizeof(T); ++i) out = (out << 8) | in[i]; return out; } /** * Load a little-endian word * @param in a pointer to some bytes * @param off an offset into the array * @return off'th T of in, as a litte-endian value */ template inline T load_le(const byte in[], size_t off) { in += off * sizeof(T); T out = 0; for(size_t i = 0; i != sizeof(T); ++i) out = (out << 8) | in[sizeof(T)-1-i]; return out; } /** * Load a big-endian u16bit * @param in a pointer to some bytes * @param off an offset into the array * @return off'th u16bit of in, as a big-endian value */ template<> inline u16bit load_be(const byte in[], size_t off) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK return BOTAN_ENDIAN_N2B(*(reinterpret_cast(in) + off)); #else in += off * sizeof(u16bit); return make_u16bit(in[0], in[1]); #endif } /** * Load a little-endian u16bit * @param in a pointer to some bytes * @param off an offset into the array * @return off'th u16bit of in, as a little-endian value */ template<> inline u16bit load_le(const byte in[], size_t off) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK return BOTAN_ENDIAN_N2L(*(reinterpret_cast(in) + off)); #else in += off * sizeof(u16bit); return make_u16bit(in[1], in[0]); #endif } /** * Load a big-endian u32bit * @param in a pointer to some bytes * @param off an offset into the array * @return off'th u32bit of in, as a big-endian value */ template<> inline u32bit load_be(const byte in[], size_t off) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK return BOTAN_ENDIAN_N2B(*(reinterpret_cast(in) + off)); #else in += off * sizeof(u32bit); return make_u32bit(in[0], in[1], in[2], in[3]); #endif } /** * Load a little-endian u32bit * @param in a pointer to some bytes * @param off an offset into the array * @return off'th u32bit of in, as a little-endian value */ template<> inline u32bit load_le(const byte in[], size_t off) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK return BOTAN_ENDIAN_N2L(*(reinterpret_cast(in) + off)); #else in += off * sizeof(u32bit); return make_u32bit(in[3], in[2], in[1], in[0]); #endif } /** * Load a big-endian u64bit * @param in a pointer to some bytes * @param off an offset into the array * @return off'th u64bit of in, as a big-endian value */ template<> inline u64bit load_be(const byte in[], size_t off) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK return BOTAN_ENDIAN_N2B(*(reinterpret_cast(in) + off)); #else in += off * sizeof(u64bit); return make_u64bit(in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7]); #endif } /** * Load a little-endian u64bit * @param in a pointer to some bytes * @param off an offset into the array * @return off'th u64bit of in, as a little-endian value */ template<> inline u64bit load_le(const byte in[], size_t off) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK return BOTAN_ENDIAN_N2L(*(reinterpret_cast(in) + off)); #else in += off * sizeof(u64bit); return make_u64bit(in[7], in[6], in[5], in[4], in[3], in[2], in[1], in[0]); #endif } /** * Load two little-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written */ template inline void load_le(const byte in[], T& x0, T& x1) { x0 = load_le(in, 0); x1 = load_le(in, 1); } /** * Load four little-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written * @param x2 where the third word will be written * @param x3 where the fourth word will be written */ template inline void load_le(const byte in[], T& x0, T& x1, T& x2, T& x3) { x0 = load_le(in, 0); x1 = load_le(in, 1); x2 = load_le(in, 2); x3 = load_le(in, 3); } /** * Load eight little-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written * @param x2 where the third word will be written * @param x3 where the fourth word will be written * @param x4 where the fifth word will be written * @param x5 where the sixth word will be written * @param x6 where the seventh word will be written * @param x7 where the eighth word will be written */ template inline void load_le(const byte in[], T& x0, T& x1, T& x2, T& x3, T& x4, T& x5, T& x6, T& x7) { x0 = load_le(in, 0); x1 = load_le(in, 1); x2 = load_le(in, 2); x3 = load_le(in, 3); x4 = load_le(in, 4); x5 = load_le(in, 5); x6 = load_le(in, 6); x7 = load_le(in, 7); } /** * Load a variable number of little-endian words * @param out the output array of words * @param in the input array of bytes * @param count how many words are in in */ template inline void load_le(T out[], const byte in[], size_t count) { #if defined(BOTAN_TARGET_CPU_HAS_KNOWN_ENDIANNESS) std::memcpy(out, in, sizeof(T)*count); #if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) const size_t blocks = count - (count % 4); const size_t left = count - blocks; for(size_t i = 0; i != blocks; i += 4) bswap_4(out + i); for(size_t i = 0; i != left; ++i) out[blocks+i] = reverse_bytes(out[blocks+i]); #endif #else for(size_t i = 0; i != count; ++i) out[i] = load_le(in, i); #endif } /** * Load two big-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written */ template inline void load_be(const byte in[], T& x0, T& x1) { x0 = load_be(in, 0); x1 = load_be(in, 1); } /** * Load four big-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written * @param x2 where the third word will be written * @param x3 where the fourth word will be written */ template inline void load_be(const byte in[], T& x0, T& x1, T& x2, T& x3) { x0 = load_be(in, 0); x1 = load_be(in, 1); x2 = load_be(in, 2); x3 = load_be(in, 3); } /** * Load eight big-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written * @param x2 where the third word will be written * @param x3 where the fourth word will be written * @param x4 where the fifth word will be written * @param x5 where the sixth word will be written * @param x6 where the seventh word will be written * @param x7 where the eighth word will be written */ template inline void load_be(const byte in[], T& x0, T& x1, T& x2, T& x3, T& x4, T& x5, T& x6, T& x7) { x0 = load_be(in, 0); x1 = load_be(in, 1); x2 = load_be(in, 2); x3 = load_be(in, 3); x4 = load_be(in, 4); x5 = load_be(in, 5); x6 = load_be(in, 6); x7 = load_be(in, 7); } /** * Load a variable number of big-endian words * @param out the output array of words * @param in the input array of bytes * @param count how many words are in in */ template inline void load_be(T out[], const byte in[], size_t count) { #if defined(BOTAN_TARGET_CPU_HAS_KNOWN_ENDIANNESS) std::memcpy(out, in, sizeof(T)*count); #if defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) const size_t blocks = count - (count % 4); const size_t left = count - blocks; for(size_t i = 0; i != blocks; i += 4) bswap_4(out + i); for(size_t i = 0; i != left; ++i) out[blocks+i] = reverse_bytes(out[blocks+i]); #endif #else for(size_t i = 0; i != count; ++i) out[i] = load_be(in, i); #endif } /** * Store a big-endian u16bit * @param in the input u16bit * @param out the byte array to write to */ inline void store_be(u16bit in, byte out[2]) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK *reinterpret_cast(out) = BOTAN_ENDIAN_B2N(in); #else out[0] = get_byte(0, in); out[1] = get_byte(1, in); #endif } /** * Store a little-endian u16bit * @param in the input u16bit * @param out the byte array to write to */ inline void store_le(u16bit in, byte out[2]) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK *reinterpret_cast(out) = BOTAN_ENDIAN_L2N(in); #else out[0] = get_byte(1, in); out[1] = get_byte(0, in); #endif } /** * Store a big-endian u32bit * @param in the input u32bit * @param out the byte array to write to */ inline void store_be(u32bit in, byte out[4]) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK *reinterpret_cast(out) = BOTAN_ENDIAN_B2N(in); #else out[0] = get_byte(0, in); out[1] = get_byte(1, in); out[2] = get_byte(2, in); out[3] = get_byte(3, in); #endif } /** * Store a little-endian u32bit * @param in the input u32bit * @param out the byte array to write to */ inline void store_le(u32bit in, byte out[4]) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK *reinterpret_cast(out) = BOTAN_ENDIAN_L2N(in); #else out[0] = get_byte(3, in); out[1] = get_byte(2, in); out[2] = get_byte(1, in); out[3] = get_byte(0, in); #endif } /** * Store a big-endian u64bit * @param in the input u64bit * @param out the byte array to write to */ inline void store_be(u64bit in, byte out[8]) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK *reinterpret_cast(out) = BOTAN_ENDIAN_B2N(in); #else out[0] = get_byte(0, in); out[1] = get_byte(1, in); out[2] = get_byte(2, in); out[3] = get_byte(3, in); out[4] = get_byte(4, in); out[5] = get_byte(5, in); out[6] = get_byte(6, in); out[7] = get_byte(7, in); #endif } /** * Store a little-endian u64bit * @param in the input u64bit * @param out the byte array to write to */ inline void store_le(u64bit in, byte out[8]) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK *reinterpret_cast(out) = BOTAN_ENDIAN_L2N(in); #else out[0] = get_byte(7, in); out[1] = get_byte(6, in); out[2] = get_byte(5, in); out[3] = get_byte(4, in); out[4] = get_byte(3, in); out[5] = get_byte(2, in); out[6] = get_byte(1, in); out[7] = get_byte(0, in); #endif } /** * Store two little-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word */ template inline void store_le(byte out[], T x0, T x1) { store_le(x0, out + (0 * sizeof(T))); store_le(x1, out + (1 * sizeof(T))); } /** * Store two big-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word */ template inline void store_be(byte out[], T x0, T x1) { store_be(x0, out + (0 * sizeof(T))); store_be(x1, out + (1 * sizeof(T))); } /** * Store four little-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word * @param x2 the third word * @param x3 the fourth word */ template inline void store_le(byte out[], T x0, T x1, T x2, T x3) { store_le(x0, out + (0 * sizeof(T))); store_le(x1, out + (1 * sizeof(T))); store_le(x2, out + (2 * sizeof(T))); store_le(x3, out + (3 * sizeof(T))); } /** * Store four big-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word * @param x2 the third word * @param x3 the fourth word */ template inline void store_be(byte out[], T x0, T x1, T x2, T x3) { store_be(x0, out + (0 * sizeof(T))); store_be(x1, out + (1 * sizeof(T))); store_be(x2, out + (2 * sizeof(T))); store_be(x3, out + (3 * sizeof(T))); } /** * Store eight little-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word * @param x2 the third word * @param x3 the fourth word * @param x4 the fifth word * @param x5 the sixth word * @param x6 the seventh word * @param x7 the eighth word */ template inline void store_le(byte out[], T x0, T x1, T x2, T x3, T x4, T x5, T x6, T x7) { store_le(x0, out + (0 * sizeof(T))); store_le(x1, out + (1 * sizeof(T))); store_le(x2, out + (2 * sizeof(T))); store_le(x3, out + (3 * sizeof(T))); store_le(x4, out + (4 * sizeof(T))); store_le(x5, out + (5 * sizeof(T))); store_le(x6, out + (6 * sizeof(T))); store_le(x7, out + (7 * sizeof(T))); } /** * Store eight big-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word * @param x2 the third word * @param x3 the fourth word * @param x4 the fifth word * @param x5 the sixth word * @param x6 the seventh word * @param x7 the eighth word */ template inline void store_be(byte out[], T x0, T x1, T x2, T x3, T x4, T x5, T x6, T x7) { store_be(x0, out + (0 * sizeof(T))); store_be(x1, out + (1 * sizeof(T))); store_be(x2, out + (2 * sizeof(T))); store_be(x3, out + (3 * sizeof(T))); store_be(x4, out + (4 * sizeof(T))); store_be(x5, out + (5 * sizeof(T))); store_be(x6, out + (6 * sizeof(T))); store_be(x7, out + (7 * sizeof(T))); } } #endif Botan-1.10.12/src/utils/mem_ops.h0000664000175000017500000000265012654331322016326 0ustar jackjack00000000000000/* * Memory Operations * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MEMORY_OPS_H__ #define BOTAN_MEMORY_OPS_H__ #include #include namespace Botan { /** * Copy memory * @param out the destination array * @param in the source array * @param n the number of elements of in/out */ template inline void copy_mem(T* out, const T* in, size_t n) { std::memmove(out, in, sizeof(T)*n); } /** * Zeroize memory * @param ptr a pointer to an array * @param n the number of Ts pointed to by ptr */ template inline void clear_mem(T* ptr, size_t n) { if(n) // avoid glibc warning if n == 0 std::memset(ptr, 0, sizeof(T)*n); } /** * Set memory to a fixed value * @param ptr a pointer to an array * @param n the number of Ts pointed to by ptr * @param val the value to set each byte to */ template inline void set_mem(T* ptr, size_t n, byte val) { std::memset(ptr, val, sizeof(T)*n); } /** * Memory comparison, input insensitive * @param p1 a pointer to an array * @param p2 a pointer to another array * @param n the number of Ts in p1 and p2 * @return true iff p1[i] == p2[i] forall i in [0...n) */ template inline bool same_mem(const T* p1, const T* p2, size_t n) { bool is_same = true; for(size_t i = 0; i != n; ++i) is_same &= (p1[i] == p2[i]); return is_same; } } #endif Botan-1.10.12/src/utils/mlock.cpp0000664000175000017500000000212712654331322016326 0ustar jackjack00000000000000/* * Memory Locking Functions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #if defined(BOTAN_TARGET_OS_HAS_POSIX_MLOCK) #include #include #elif defined(BOTAN_TARGET_OS_HAS_WIN32_VIRTUAL_LOCK) #include #endif namespace Botan { bool has_mlock() { byte buf[4096]; if(!lock_mem(&buf, sizeof(buf))) return false; unlock_mem(&buf, sizeof(buf)); return true; } /* * Lock an area of memory into RAM */ bool lock_mem(void* ptr, size_t bytes) { #if defined(BOTAN_TARGET_OS_HAS_POSIX_MLOCK) return (::mlock(static_cast(ptr), bytes) == 0); #elif defined(BOTAN_TARGET_OS_HAS_WIN32_VIRTUAL_LOCK) return (::VirtualLock(ptr, bytes) != 0); #else return false; #endif } /* * Unlock a previously locked region of memory */ void unlock_mem(void* ptr, size_t bytes) { #if defined(BOTAN_TARGET_OS_HAS_POSIX_MLOCK) ::munlock(static_cast(ptr), bytes); #elif defined(BOTAN_TARGET_OS_HAS_WIN32_VIRTUAL_LOCK) ::VirtualUnlock(ptr, bytes); #endif } } Botan-1.10.12/src/utils/mlock.h0000664000175000017500000000131612654331322015772 0ustar jackjack00000000000000/* * Memory Locking Functions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_MLOCK_H__ #define BOTAN_MLOCK_H__ #include namespace Botan { /** * Check if we can at least potentially lock memory */ bool has_mlock(); /** * Lock memory into RAM if possible * @param addr the start of the memory block * @param length the length of the memory block in bytes * @returns true if successful, false otherwise */ bool lock_mem(void* addr, size_t length); /** * Unlock memory locked with lock_mem() * @param addr the start of the memory block * @param length the length of the memory block in bytes */ void unlock_mem(void* addr, size_t length); } #endif Botan-1.10.12/src/utils/parsing.cpp0000664000175000017500000001423612654331322016670 0ustar jackjack00000000000000/* * Parser Functions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include namespace Botan { /* * Convert a string into an integer */ u32bit to_u32bit(const std::string& number) { u32bit n = 0; for(std::string::const_iterator i = number.begin(); i != number.end(); ++i) { const u32bit OVERFLOW_MARK = 0xFFFFFFFF / 10; if(*i == ' ') continue; byte digit = Charset::char2digit(*i); if((n > OVERFLOW_MARK) || (n == OVERFLOW_MARK && digit > 5)) throw Decoding_Error("to_u32bit: Integer overflow"); n *= 10; n += digit; } return n; } /* * Convert an integer into a string */ std::string to_string(u64bit n, size_t min_len) { std::string lenstr; if(n) { while(n > 0) { lenstr = Charset::digit2char(n % 10) + lenstr; n /= 10; } } else lenstr = "0"; while(lenstr.size() < min_len) lenstr = "0" + lenstr; return lenstr; } /* * Convert a string into a time duration */ u32bit timespec_to_u32bit(const std::string& timespec) { if(timespec == "") return 0; const char suffix = timespec[timespec.size()-1]; std::string value = timespec.substr(0, timespec.size()-1); u32bit scale = 1; if(Charset::is_digit(suffix)) value += suffix; else if(suffix == 's') scale = 1; else if(suffix == 'm') scale = 60; else if(suffix == 'h') scale = 60 * 60; else if(suffix == 'd') scale = 24 * 60 * 60; else if(suffix == 'y') scale = 365 * 24 * 60 * 60; else throw Decoding_Error("timespec_to_u32bit: Bad input " + timespec); return scale * to_u32bit(value); } /* * Parse a SCAN-style algorithm name */ std::vector parse_algorithm_name(const std::string& namex) { if(namex.find('(') == std::string::npos && namex.find(')') == std::string::npos) return std::vector(1, namex); std::string name = namex, substring; std::vector elems; size_t level = 0; elems.push_back(name.substr(0, name.find('('))); name = name.substr(name.find('(')); for(std::string::const_iterator i = name.begin(); i != name.end(); ++i) { char c = *i; if(c == '(') ++level; if(c == ')') { if(level == 1 && i == name.end() - 1) { if(elems.size() == 1) elems.push_back(substring.substr(1)); else elems.push_back(substring); return elems; } if(level == 0 || (level == 1 && i != name.end() - 1)) throw Invalid_Algorithm_Name(namex); --level; } if(c == ',' && level == 1) { if(elems.size() == 1) elems.push_back(substring.substr(1)); else elems.push_back(substring); substring.clear(); } else substring += c; } if(substring != "") throw Invalid_Algorithm_Name(namex); return elems; } /* * Split the string on slashes */ std::vector split_on(const std::string& str, char delim) { std::vector elems; if(str == "") return elems; std::string substr; for(std::string::const_iterator i = str.begin(); i != str.end(); ++i) { if(*i == delim) { if(substr != "") elems.push_back(substr); substr.clear(); } else substr += *i; } if(substr == "") throw Invalid_Argument("Unable to split string: " + str); elems.push_back(substr); return elems; } /* * Parse an ASN.1 OID string */ std::vector parse_asn1_oid(const std::string& oid) { std::string substring; std::vector oid_elems; for(std::string::const_iterator i = oid.begin(); i != oid.end(); ++i) { char c = *i; if(c == '.') { if(substring == "") throw Invalid_OID(oid); oid_elems.push_back(to_u32bit(substring)); substring.clear(); } else substring += c; } if(substring == "") throw Invalid_OID(oid); oid_elems.push_back(to_u32bit(substring)); if(oid_elems.size() < 2) throw Invalid_OID(oid); return oid_elems; } /* * X.500 String Comparison */ bool x500_name_cmp(const std::string& name1, const std::string& name2) { std::string::const_iterator p1 = name1.begin(); std::string::const_iterator p2 = name2.begin(); while((p1 != name1.end()) && Charset::is_space(*p1)) ++p1; while((p2 != name2.end()) && Charset::is_space(*p2)) ++p2; while(p1 != name1.end() && p2 != name2.end()) { if(Charset::is_space(*p1)) { if(!Charset::is_space(*p2)) return false; while((p1 != name1.end()) && Charset::is_space(*p1)) ++p1; while((p2 != name2.end()) && Charset::is_space(*p2)) ++p2; if(p1 == name1.end() && p2 == name2.end()) return true; } if(!Charset::caseless_cmp(*p1, *p2)) return false; ++p1; ++p2; } while((p1 != name1.end()) && Charset::is_space(*p1)) ++p1; while((p2 != name2.end()) && Charset::is_space(*p2)) ++p2; if((p1 != name1.end()) || (p2 != name2.end())) return false; return true; } /* * Convert a decimal-dotted string to binary IP */ u32bit string_to_ipv4(const std::string& str) { std::vector parts = split_on(str, '.'); if(parts.size() != 4) throw Decoding_Error("Invalid IP string " + str); u32bit ip = 0; for(size_t i = 0; i != parts.size(); ++i) { u32bit octet = to_u32bit(parts[i]); if(octet > 255) throw Decoding_Error("Invalid IP string " + str); ip = (ip << 8) | (octet & 0xFF); } return ip; } /* * Convert an IP address to decimal-dotted string */ std::string ipv4_to_string(u32bit ip) { std::string str; for(size_t i = 0; i != sizeof(ip); ++i) { if(i) str += "."; str += to_string(get_byte(i, ip)); } return str; } } Botan-1.10.12/src/utils/parsing.h0000664000175000017500000000410712654331322016331 0ustar jackjack00000000000000/* * Parser Functions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PARSER_H__ #define BOTAN_PARSER_H__ #include #include #include namespace Botan { /** * Parse a SCAN-style algorithm name * @param scan_name the name * @return the name components */ BOTAN_DLL std::vector parse_algorithm_name(const std::string& scan_name); /** * Split a string * @param str the input string * @param delim the delimitor * @return string split by delim */ BOTAN_DLL std::vector split_on( const std::string& str, char delim); /** * Parse an ASN.1 OID * @param oid the OID in string form * @return OID components */ BOTAN_DLL std::vector parse_asn1_oid(const std::string& oid); /** * Compare two names using the X.509 comparison algorithm * @param name1 the first name * @param name2 the second name * @return true if name1 is the same as name2 by the X.509 comparison rules */ BOTAN_DLL bool x500_name_cmp(const std::string& name1, const std::string& name2); /** * Convert a number to a string * @param n the integer to convert to a string * @param min_len the min length of the output string * @return n convert to a string */ BOTAN_DLL std::string to_string(u64bit n, size_t min_len = 0); /** * Convert a string to a number * @param str the string to convert * @return number value of the string */ BOTAN_DLL u32bit to_u32bit(const std::string& str); /** * Convert a time specification to a number * @param timespec the time specification * @return number of seconds represented by timespec */ BOTAN_DLL u32bit timespec_to_u32bit(const std::string& timespec); /** * Convert a string representation of an IPv4 address to a number * @param ip_str the string representation * @return integer IPv4 address */ BOTAN_DLL u32bit string_to_ipv4(const std::string& ip_str); /** * Convert an IPv4 address to a string * @param ip_addr the IPv4 address to convert * @return string representation of the IPv4 address */ BOTAN_DLL std::string ipv4_to_string(u32bit ip_addr); } #endif Botan-1.10.12/src/utils/prefetch.h0000664000175000017500000000144412654331322016467 0ustar jackjack00000000000000/* * Prefetching Operations * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PREFETCH_H__ #define BOTAN_PREFETCH_H__ #include namespace Botan { template inline void prefetch_readonly(const T* addr, size_t length) { #if defined(__GNUG__) const size_t Ts_per_cache_line = CPUID::cache_line_size() / sizeof(T); for(size_t i = 0; i <= length; i += Ts_per_cache_line) __builtin_prefetch(addr + i, 0); #endif } template inline void prefetch_readwrite(const T* addr, size_t length) { #if defined(__GNUG__) const size_t Ts_per_cache_line = CPUID::cache_line_size() / sizeof(T); for(size_t i = 0; i <= length; i += Ts_per_cache_line) __builtin_prefetch(addr + i, 1); #endif } } #endif Botan-1.10.12/src/utils/rotate.h0000664000175000017500000000156012654331322016164 0ustar jackjack00000000000000/* * Word Rotation Operations * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_WORD_ROTATE_H__ #define BOTAN_WORD_ROTATE_H__ #include namespace Botan { /** * Bit rotation left * @param input the input word * @param rot the number of bits to rotate * @return input rotated left by rot bits */ template inline T rotate_left(T input, size_t rot) { if(rot == 0) return input; return static_cast((input << rot) | (input >> (8*sizeof(T)-rot)));; } /** * Bit rotation right * @param input the input word * @param rot the number of bits to rotate * @return input rotated right by rot bits */ template inline T rotate_right(T input, size_t rot) { if(rot == 0) return input; return static_cast((input >> rot) | (input << (8*sizeof(T)-rot))); } } #endif Botan-1.10.12/src/utils/rounding.h0000664000175000017500000000134312654331322016512 0ustar jackjack00000000000000/* * Integer Rounding Functions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_ROUNDING_H__ #define BOTAN_ROUNDING_H__ #include namespace Botan { /** * Round up * @param n an integer * @param align_to the alignment boundary * @return n rounded up to a multiple of align_to */ template inline T round_up(T n, T align_to) { if(n % align_to || n == 0) n += align_to - (n % align_to); return n; } /** * Round down * @param n an integer * @param align_to the alignment boundary * @return n rounded down to a multiple of align_to */ template inline T round_down(T n, T align_to) { return (n - (n % align_to)); } } #endif Botan-1.10.12/src/utils/stl_util.h0000664000175000017500000000372112654331322016526 0ustar jackjack00000000000000/* * STL Utility Functions * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_STL_UTIL_H__ #define BOTAN_STL_UTIL_H__ #include namespace Botan { /** * Copy-on-Predicate Algorithm * @param current the first iterator value * @param end the final iterator value * @param dest an output iterator * @param copy_p the predicate */ template OutputIterator copy_if(InputIterator current, InputIterator end, OutputIterator dest, Predicate copy_p) { while(current != end) { if(copy_p(*current)) *dest++ = *current; ++current; } return dest; } /** * Searching through a std::map * @param mapping the map to search * @param key is what to look for * @param null_result is the value to return if key is not in mapping * @return mapping[key] or null_result */ template inline V search_map(const std::map& mapping, const K& key, const V& null_result = V()) { typename std::map::const_iterator i = mapping.find(key); if(i == mapping.end()) return null_result; return i->second; } /** * Function adaptor for delete operation */ template class del_fun : public std::unary_function { public: void operator()(T* ptr) { delete ptr; } }; /** * Delete the second half of a pair of objects */ template void delete2nd(Pair& pair) { delete pair.second; } /** * Insert a key/value pair into a multimap */ template void multimap_insert(std::multimap& multimap, const K& key, const V& value) { #if defined(BOTAN_BUILD_COMPILER_IS_SUN_STUDIO) // Work around a strange bug in Sun Studio multimap.insert(std::make_pair(key, value)); #else multimap.insert(std::make_pair(key, value)); #endif } } #endif Botan-1.10.12/src/utils/time.cpp0000664000175000017500000000511012654331322016152 0ustar jackjack00000000000000/* * Time Functions * (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #if defined(BOTAN_TARGET_OS_HAS_WIN32_GET_SYSTEMTIME) #include #endif #if defined(BOTAN_TARGET_OS_HAS_GETTIMEOFDAY) #include #endif #if defined(BOTAN_TARGET_OS_HAS_CLOCK_GETTIME) #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199309 #endif #include #ifndef CLOCK_REALTIME #define CLOCK_REALTIME 0 #endif #endif namespace Botan { namespace { /* * Combine a two time values into a single one */ u64bit combine_timers(u32bit seconds, u32bit parts, u32bit parts_hz) { static const u64bit NANOSECONDS_UNITS = 1000000000; u64bit res = seconds * NANOSECONDS_UNITS; res += parts * (NANOSECONDS_UNITS / parts_hz); return res; } std::tm do_gmtime(time_t time_val) { std::tm tm; #if defined(BOTAN_TARGET_OS_HAS_GMTIME_S) gmtime_s(&tm, &time_val); // Windows #elif defined(BOTAN_TARGET_OS_HAS_GMTIME_R) gmtime_r(&time_val, &tm); // Unix/SUSv2 #else std::tm* tm_p = std::gmtime(&time_val); if (tm_p == 0) throw Encoding_Error("time_t_to_tm could not convert"); tm = *tm_p; #endif return tm; } } /* * Get the system clock */ u64bit system_time() { return static_cast(std::time(0)); } /* * Convert a time_point to a calendar_point */ calendar_point calendar_value(u64bit a_time_t) { std::tm tm = do_gmtime(static_cast(a_time_t)); return calendar_point(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); } u64bit get_nanoseconds_clock() { #if defined(BOTAN_TARGET_OS_HAS_CLOCK_GETTIME) struct ::timespec tv; ::clock_gettime(CLOCK_REALTIME, &tv); return combine_timers(tv.tv_sec, tv.tv_nsec, 1000000000); #elif defined(BOTAN_TARGET_OS_HAS_GETTIMEOFDAY) struct ::timeval tv; ::gettimeofday(&tv, 0); return combine_timers(tv.tv_sec, tv.tv_usec, 1000000); #elif defined(BOTAN_TARGET_OS_HAS_WIN32_GET_SYSTEMTIME) // Returns time since January 1, 1601 in 100-ns increments ::FILETIME tv; ::GetSystemTimeAsFileTime(&tv); u64bit tstamp = (static_cast(tv.dwHighDateTime) << 32) | tv.dwLowDateTime; return (tstamp * 100); // Scale to 1 nanosecond units #else return combine_timers(static_cast(std::time(0)), std::clock(), CLOCKS_PER_SEC); #endif } } Botan-1.10.12/src/utils/time.h0000664000175000017500000000270512654331322015626 0ustar jackjack00000000000000/* * Time Functions * (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_TIME_H__ #define BOTAN_TIME_H__ #include namespace Botan { /** * Struct representing a particular date and time */ struct BOTAN_DLL calendar_point { /** The year */ u32bit year; /** The month, 1 through 12 for Jan to Dec */ byte month; /** The day of the month, 1 through 31 (or 28 or 30 based on month */ byte day; /** Hour in 24-hour form, 0 to 23 */ byte hour; /** Minutes in the hour, 0 to 60 */ byte minutes; /** Seconds in the minute, 0 to 60, but might be slightly larger to deal with leap seconds on some systems */ byte seconds; /** * Initialize a calendar_point * @param y the year * @param mon the month * @param d the day * @param h the hour * @param min the minute * @param sec the second */ calendar_point(u32bit y, byte mon, byte d, byte h, byte min, byte sec) : year(y), month(mon), day(d), hour(h), minutes(min), seconds(sec) {} }; /** * @param time_point a time point from the system clock * @return calendar_point object representing this time point */ BOTAN_DLL calendar_point calendar_value(u64bit time_point); /** * @return seconds resolution timestamp, unknown epoch */ BOTAN_DLL u64bit system_time(); /** * @return nanoseconds resolution timestamp, unknown epoch */ BOTAN_DLL u64bit get_nanoseconds_clock(); } #endif Botan-1.10.12/src/utils/types.h0000664000175000017500000000220112654331322016023 0ustar jackjack00000000000000/* * Low Level Types * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_TYPES_H__ #define BOTAN_TYPES_H__ #include #include /** * The primary namespace for the botan library */ namespace Botan { /** * Typedef representing an unsigned 8-bit quantity */ typedef unsigned char byte; /** * Typedef representing an unsigned 16-bit quantity */ typedef unsigned short u16bit; /** * Typedef representing an unsigned 32-bit quantity */ typedef unsigned int u32bit; /** * Typedef representing a signed 32-bit quantity */ typedef signed int s32bit; /** * Typedef representing an unsigned 64-bit quantity */ #if defined(_MSC_VER) || defined(__BORLANDC__) typedef unsigned __int64 u64bit; #elif defined(__KCC) typedef unsigned __long_long u64bit; #elif defined(__GNUG__) __extension__ typedef unsigned long long u64bit; #else typedef unsigned long long u64bit; #endif /** * A default buffer size; typically a memory page */ static const size_t DEFAULT_BUFFERSIZE = BOTAN_DEFAULT_BUFFER_SIZE; } namespace Botan_types { using Botan::byte; using Botan::u32bit; } #endif Botan-1.10.12/src/utils/ui.cpp0000664000175000017500000000120312654331322015630 0ustar jackjack00000000000000/* * User Interface * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* * Get a passphrase from the user */ std::string User_Interface::get_passphrase(const std::string&, const std::string&, UI_Result& action) const { action = OK; if(!first_try) action = CANCEL_ACTION; return preset_passphrase; } /* * User_Interface Constructor */ User_Interface::User_Interface(const std::string& preset) : preset_passphrase(preset) { first_try = true; } } Botan-1.10.12/src/utils/ui.h0000664000175000017500000000135012654331322015300 0ustar jackjack00000000000000/* * User Interface * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_UI_H__ #define BOTAN_UI_H__ #include #include namespace Botan { /** * User Interface * Only really used for callbacks for PKCS #8 decryption */ class BOTAN_DLL User_Interface { public: enum UI_Result { OK, CANCEL_ACTION }; virtual std::string get_passphrase(const std::string&, const std::string&, UI_Result&) const; User_Interface(const std::string& = ""); virtual ~User_Interface() {} protected: std::string preset_passphrase; mutable bool first_try; }; } #endif Botan-1.10.12/src/utils/version.cpp0000664000175000017500000000223612654331322016707 0ustar jackjack00000000000000/* * Version Information * (C) 1999-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include namespace Botan { /* These are intentionally compiled rather than inlined, so an application running against a shared library can test the true version they are running against. */ /* * Return the version as a string */ std::string version_string() { #define QUOTE(name) #name #define STR(macro) QUOTE(macro) return "Botan " STR(BOTAN_VERSION_MAJOR) "." STR(BOTAN_VERSION_MINOR) "." STR(BOTAN_VERSION_PATCH) " (" #if (BOTAN_VERSION_DATESTAMP == 0) "unreleased version" #else "released " STR(BOTAN_VERSION_DATESTAMP) #endif ", revision " BOTAN_VERSION_VC_REVISION ", distribution " BOTAN_DISTRIBUTION_INFO ")"; #undef STR #undef QUOTE } u32bit version_datestamp() { return BOTAN_VERSION_DATESTAMP; } /* * Return parts of the version as integers */ u32bit version_major() { return BOTAN_VERSION_MAJOR; } u32bit version_minor() { return BOTAN_VERSION_MINOR; } u32bit version_patch() { return BOTAN_VERSION_PATCH; } } Botan-1.10.12/src/utils/version.h0000664000175000017500000000313212654331322016350 0ustar jackjack00000000000000/* * Version Information * (C) 1999-2011 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_VERSION_H__ #define BOTAN_VERSION_H__ #include #include namespace Botan { /* * Get information describing the version */ /** * Get a human-readable string identifying the version of Botan. * No particular format should be assumed. * @return version string */ BOTAN_DLL std::string version_string(); /** * Return the date this version of botan was released, in an integer of * the form YYYYMMDD. For instance a version released on May 21, 2013 * would return the integer 20130521. If the currently running version * is not an official release, this function will return 0 instead. * * @return release date, or zero if unreleased */ BOTAN_DLL u32bit version_datestamp(); /** * Get the major version number. * @return major version number */ BOTAN_DLL u32bit version_major(); /** * Get the minor version number. * @return minor version number */ BOTAN_DLL u32bit version_minor(); /** * Get the patch number. * @return patch number */ BOTAN_DLL u32bit version_patch(); /* * Macros for compile-time version checks */ #define BOTAN_VERSION_CODE_FOR(a,b,c) ((a << 16) | (b << 8) | (c)) /** * Compare using BOTAN_VERSION_CODE_FOR, as in * # if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,8,0) * # error "Botan version too old" * # endif */ #define BOTAN_VERSION_CODE BOTAN_VERSION_CODE_FOR(BOTAN_VERSION_MAJOR, \ BOTAN_VERSION_MINOR, \ BOTAN_VERSION_PATCH) } #endif Botan-1.10.12/src/utils/xor_buf.h0000664000175000017500000000353312654331322016334 0ustar jackjack00000000000000/* * XOR operations * (C) 1999-2008 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_XOR_BUF_H__ #define BOTAN_XOR_BUF_H__ #include namespace Botan { /** * XOR arrays. Postcondition out[i] = in[i] ^ out[i] forall i = 0...length * @param out the input/output buffer * @param in the read-only input buffer * @param length the length of the buffers */ inline void xor_buf(byte out[], const byte in[], size_t length) { while(length >= 8) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK *reinterpret_cast(out) ^= *reinterpret_cast(in); #else out[0] ^= in[0]; out[1] ^= in[1]; out[2] ^= in[2]; out[3] ^= in[3]; out[4] ^= in[4]; out[5] ^= in[5]; out[6] ^= in[6]; out[7] ^= in[7]; #endif out += 8; in += 8; length -= 8; } for(size_t i = 0; i != length; ++i) out[i] ^= in[i]; } /** * XOR arrays. Postcondition out[i] = in[i] ^ in2[i] forall i = 0...length * @param out the output buffer * @param in the first input buffer * @param in2 the second output buffer * @param length the length of the three buffers */ inline void xor_buf(byte out[], const byte in[], const byte in2[], size_t length) { while(length >= 8) { #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK *reinterpret_cast(out) = *reinterpret_cast(in) ^ *reinterpret_cast(in2); #else out[0] = in[0] ^ in2[0]; out[1] = in[1] ^ in2[1]; out[2] = in[2] ^ in2[2]; out[3] = in[3] ^ in2[3]; out[4] = in[4] ^ in2[4]; out[5] = in[5] ^ in2[5]; out[6] = in[6] ^ in2[6]; out[7] = in[7] ^ in2[7]; #endif in += 8; in2 += 8; out += 8; length -= 8; } for(size_t i = 0; i != length; ++i) out[i] = in[i] ^ in2[i]; } } #endif Botan-1.10.12/src/wrap/perl-xs/Botan.pm0000664000175000017500000000355512654331322017327 0ustar jackjack00000000000000package Botan; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); require DynaLoader; require AutoLoader; use Carp; @ISA = qw(DynaLoader); $VERSION = '0.01'; @EXPORT_OK = qw( NONE IGNORE_WS FULL_CHECK ); %EXPORT_TAGS = ( 'all' => [ @EXPORT_OK ], 'decoder_checking' => [ qw( NONE IGNORE_WS FULL_CHECK )], ); sub AUTOLOAD { # This AUTOLOAD is used to 'autoload' constants from the constant() # XS function. If a constant is not found then control is passed # to the AUTOLOAD in AutoLoader. my $constname = $AUTOLOAD; $constname =~ s/.*:://; croak '& not defined' if $constname eq 'constant'; # my $val = constant($constname, @_ ? $_[0] : 0); my $val = constant($constname); if ($! != 0) { if ( $! =~ /Invalid/ ) { $AutoLoader::AUTOLOAD = $AUTOLOAD; goto &AutoLoader::AUTOLOAD; } else { croak "Your vendor has not defined Botan symbol $constname"; } } no strict 'refs'; *$AUTOLOAD = sub { $val }; goto &$AUTOLOAD; } bootstrap Botan $VERSION; # to setup inheritance... package Botan::Filter; use vars qw(@ISA); @ISA = qw(); package Botan::Chain; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Fork; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Hex_Encoder; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Hex_Decoder; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Base64_Decoder; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Base64_Encoder; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan; 1; __END__ =head1 NAME Botan - Perl extension for access to Botan ... =head1 SYNOPSIS use Botan; blah blah blah =head1 DESCRIPTION Blah blah blah. =head1 AUTHOR Vaclav Ovsik =head1 SEE ALSO Bla =cut Botan-1.10.12/src/wrap/perl-xs/Botan.xs0000664000175000017500000004007312654331322017341 0ustar jackjack00000000000000#ifdef __cplusplus extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #ifdef __cplusplus } #endif #include #include #include #include #include #include #include /* xsubpp converts ':' to '_' in typemap. We create our types without ':' */ typedef Botan::ASN1_String Botan__ASN1_String; typedef Botan::AlgorithmIdentifier Botan__AlgorithmIdentifier; typedef Botan::AlternativeName Botan__AlternativeName; typedef Botan::Attribute Botan__Attribute; typedef Botan::Base64_Decoder Botan__Base64_Decoder; typedef Botan::Base64_Encoder Botan__Base64_Encoder; typedef Botan::Chain Botan__Chain; typedef Botan::Certificate_Extension Botan__Extension; typedef Botan::Filter Botan__Filter; typedef Botan::Fork Botan__Fork; typedef Botan::Hex_Decoder Botan__Hex_Decoder; typedef Botan::Hex_Encoder Botan__Hex_Encoder; typedef Botan::OID Botan__OID; typedef Botan::Pipe Botan__Pipe; typedef Botan::X509_Certificate Botan__X509_Certificate; typedef Botan::X509_DN Botan__X509_DN; typedef Botan::X509_Time Botan__X509_Time; typedef Botan::u32bit Botan__u32bit; /* Types to keep track of destruction C++ objects passed * into other objects... * An Botan object is deleted by his parent object into which is passed, * e.g. some Filter is deleted when his Pipe is destructed. We must * track this and not to delete object again in Perls destructor. */ class ObjectInfo { private: I32 d_signature; bool d_del; public: static I32 const SIGNVAL = 0x696a626f; ObjectInfo() : d_signature(SIGNVAL), d_del(true) {}; ~ObjectInfo() {}; void set_delete(bool del = true) { d_del = del; }; void set_delete_no() { set_delete(false); }; void set_delete_yes() { set_delete(true); }; bool should_delete() const { return d_del; }; }; /* Constant object in initial state - template */ ObjectInfo const oi_init; /* Botan library initializer ... */ Botan::LibraryInitializer botan_init; /*============================================================================*/ MODULE = Botan PACKAGE = Botan PROTOTYPES: ENABLE void constant(char *name) CODE: using namespace Botan; errno = 0; switch (name[0]) { case 'F': if ( strEQ(name, "FULL_CHECK") ) XSRETURN_IV( FULL_CHECK ); // Decoder_Checking enum break; case 'I': if ( strEQ(name, "IGNORE_WS") ) XSRETURN_IV( IGNORE_WS ); // Decoder_Checking enum break; case 'N': if ( strEQ(name, "NONE") ) XSRETURN_IV( NONE ); // Decoder_Checking enum break; } errno = EINVAL; XSRETURN_UNDEF; # =========================== Botan::Chain ========================== MODULE = Botan PACKAGE = Botan::Chain Botan__Chain * Botan__Chain::new(f1 = 0, f2 = 0, f3 = 0, f4 = 0) Botan__Filter *f1; Botan__Filter *f2; Botan__Filter *f3; Botan__Filter *f4; PREINIT: ObjectInfo *f1_oi; ObjectInfo *f2_oi; ObjectInfo *f3_oi; ObjectInfo *f4_oi; CODE: try { RETVAL = new Botan__Chain(f1, f2, f3, f4); if ( f1 ) f1_oi->set_delete_no(); if ( f2 ) f2_oi->set_delete_no(); if ( f3 ) f3_oi->set_delete_no(); if ( f4 ) f4_oi->set_delete_no(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Chain::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # =========================== Botan::Fork ========================== MODULE = Botan PACKAGE = Botan::Fork Botan__Fork * Botan__Fork::new(f1 = 0, f2 = 0, f3 = 0, f4 = 0) Botan__Filter *f1; Botan__Filter *f2; Botan__Filter *f3; Botan__Filter *f4; PREINIT: ObjectInfo *f1_oi; ObjectInfo *f2_oi; ObjectInfo *f3_oi; ObjectInfo *f4_oi; CODE: try { RETVAL = new Botan__Fork(f1, f2, f3, f4); if ( f1 ) f1_oi->set_delete_no(); if ( f2 ) f2_oi->set_delete_no(); if ( f3 ) f3_oi->set_delete_no(); if ( f4 ) f4_oi->set_delete_no(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Fork::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # ============================ Botan::Base64_Decoder ============================ MODULE = Botan PACKAGE = Botan::Base64_Decoder Botan__Base64_Decoder * Botan__Base64_Decoder::new(checking = Botan::NONE) int checking; CODE: try { using namespace Botan; RETVAL = new Base64_Decoder((Decoder_Checking)checking); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Base64_Decoder::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # =========================== Botan::Base64_Encoder ========================== MODULE = Botan PACKAGE = Botan::Base64_Encoder Botan__Base64_Encoder * Botan__Base64_Encoder::new(breaks = false, length = 72) bool breaks; Botan__u32bit length; CODE: try { RETVAL = new Botan__Base64_Encoder(breaks, length); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Base64_Encoder::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # ============================ Botan::Hex_Decoder ============================ MODULE = Botan PACKAGE = Botan::Hex_Decoder Botan__Hex_Decoder * Botan__Hex_Decoder::new(checking = Botan::NONE) int checking; CODE: try { using namespace Botan; RETVAL = new Hex_Decoder((Decoder_Checking)checking); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Hex_Decoder::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # ============================ Botan::Hex_Encoder ============================ MODULE = Botan PACKAGE = Botan::Hex_Encoder Botan__Hex_Encoder * Botan__Hex_Encoder::new(breaks = false, length = 72, lcase = false) bool breaks; Botan__u32bit length; bool lcase; CODE: try { using Botan::Hex_Encoder; RETVAL = new Hex_Encoder(breaks, length, lcase ? Hex_Encoder::Lowercase : Hex_Encoder::Uppercase); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Hex_Encoder::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # ================================ Botan::OID ================================ MODULE = Botan PACKAGE = Botan::OID Botan__OID * Botan__OID::new(s) char *s; CODE: try { RETVAL = new Botan__OID(s); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__OID::DESTROY() CODE: try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } char * Botan__OID::as_string() CODE: try { RETVAL = const_cast(THIS->as_string().c_str()); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL # ================================ Botan::OIDS ================================ MODULE = Botan PACKAGE = Botan::OIDS void add_oid(oid, name) Botan__OID *oid; char *name; CODE: try { Botan::OIDS::add_oid(*oid, name); } catch (const std::exception &e) { croak(e.what()); } char * lookup_by_oid(oid) Botan__OID *oid; CODE: try { RETVAL = const_cast(Botan::OIDS::lookup(*oid).c_str()); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL Botan__OID * lookup_by_name(name) char *name; CODE: try { RETVAL = new Botan__OID(Botan::OIDS::lookup(name)); } catch (const std::exception &e) { croak(e.what()); } char const * CLASS = "Botan::OID"; OUTPUT: RETVAL int have_oid(name) char *name; CODE: try { RETVAL = Botan::OIDS::have_oid(name); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL # ================================ Botan::Pipe ================================ MODULE = Botan PACKAGE = Botan::Pipe Botan__Pipe * Botan__Pipe::new(...) CODE: for (I32 i = 1; i < items; i++) { if ( !sv_isobject(ST(i)) || (SvTYPE(SvRV(ST(i))) != SVt_PVMG) ) croak("Botan::Pipe::new() -- arg %u is not " "a blessed SV reference", i +1); if ( !sv_derived_from(ST(i), "Botan::Filter") ) croak("Botan::Pipe::new() -- arg %u is not " "an object derived from Botan::Filter", i +1); MAGIC *mg = mg_find(SvRV(ST(i)), '~'); if ( mg == 0 || mg->mg_len != sizeof(ObjectInfo) || *(I32 *)(mg->mg_ptr) != ObjectInfo::SIGNVAL ) croak("Botan::Pipe::new() -- arg %u has no " "valid private magic data (ObjectInfo)", i +1); } try { RETVAL = new Botan__Pipe(); for (I32 i = 1; i < items; i++) { SV *osv = (SV *)SvRV(ST(i)); ObjectInfo *oi = (ObjectInfo *)(mg_find(osv, '~')->mg_ptr); RETVAL->append((Botan__Filter *)(SvIV(osv))); oi->set_delete_no(); } } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Pipe::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } void Botan__Pipe::write(s) SV *s; PREINIT: ObjectInfo *THIS_oi; CODE: STRLEN len; char *ptr = SvPV(s, len); try { THIS->write((unsigned char *)ptr, len); } catch (const std::exception &e) { croak(e.what()); } void Botan__Pipe::process_msg(s) SV *s; PREINIT: ObjectInfo *THIS_oi; CODE: STRLEN len; char *ptr = SvPV(s, len); try { THIS->process_msg((unsigned char *)ptr, len); } catch (const std::exception &e) { croak(e.what()); } Botan__u32bit Botan__Pipe::remaining(msgno = Botan::Pipe::DEFAULT_MESSAGE) Botan__u32bit msgno; PREINIT: ObjectInfo *THIS_oi; CODE: try { RETVAL = THIS->remaining(msgno); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL SV * Botan__Pipe::read(len = 0xFFFFFFFF, msgno = Botan::Pipe::DEFAULT_MESSAGE) Botan__u32bit len; Botan__u32bit msgno; PREINIT: ObjectInfo *THIS_oi; CODE: try { if ( len > THIS->remaining(msgno) ) len = THIS->remaining(msgno); RETVAL = NEWSV(0, len); SvPOK_on(RETVAL); if ( len > 0 ) SvCUR_set(RETVAL, THIS->read((unsigned char *)SvPVX(RETVAL), len, msgno)); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL SV * Botan__Pipe::peek(len = 0xFFFFFFFF, offset = 0, \ msgno = Botan::Pipe::DEFAULT_MESSAGE) Botan__u32bit len; Botan__u32bit offset; Botan__u32bit msgno; PREINIT: ObjectInfo *THIS_oi; CODE: try { if ( len > THIS->remaining(msgno) ) len = THIS->remaining(msgno); RETVAL = NEWSV(0, len); SvPOK_on(RETVAL); if ( len > 0 ) SvCUR_set(RETVAL, THIS->peek((unsigned char *)SvPVX(RETVAL), len, offset, msgno)); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL Botan__u32bit Botan__Pipe::default_msg() PREINIT: ObjectInfo *THIS_oi; CODE: try { RETVAL = THIS->default_msg(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Pipe::set_default_msg(msgno) Botan__u32bit msgno; PREINIT: ObjectInfo *THIS_oi; CODE: try { THIS->set_default_msg(msgno); } catch (const std::exception &e) { croak(e.what()); } Botan__u32bit Botan__Pipe::message_count() PREINIT: ObjectInfo *THIS_oi; CODE: try { RETVAL = THIS->message_count(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL bool Botan__Pipe::end_of_data() PREINIT: ObjectInfo *THIS_oi; CODE: try { RETVAL = THIS->end_of_data(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Pipe::start_msg() PREINIT: ObjectInfo *THIS_oi; CODE: try { THIS->start_msg(); } catch (const std::exception &e) { croak(e.what()); } void Botan__Pipe::end_msg() PREINIT: ObjectInfo *THIS_oi; CODE: try { THIS->end_msg(); } catch (const std::exception &e) { croak(e.what()); } void Botan__Pipe::reset() PREINIT: ObjectInfo *THIS_oi; CODE: try { THIS->reset(); } catch (const std::exception &e) { croak(e.what()); } # ========================== Botan::X509_Certificate ========================== MODULE = Botan PACKAGE = Botan::X509_Certificate Botan__X509_Certificate * Botan__X509_Certificate::new(char *fn) CODE: try { RETVAL = new Botan__X509_Certificate(fn); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__X509_Certificate::DESTROY() CODE: try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } unsigned int Botan__X509_Certificate::x509_version() CODE: try { RETVAL = THIS->x509_version(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL char * Botan__X509_Certificate::start_time() CODE: try { RETVAL = const_cast(THIS->start_time().c_str()); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL char * Botan__X509_Certificate::end_time() CODE: try { RETVAL = const_cast(THIS->end_time().c_str()); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL char * Botan__X509_Certificate::subject_info(char *info) CODE: try { std::vector s = THIS->subject_info(info); if(s.size() > 0) RETVAL = const_cast(s[0].c_str()); else RETVAL = "err"; } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL char * Botan__X509_Certificate::issuer_info(char *info) CODE: try { std::vector s = THIS->subject_info(info); if(s.size() > 0) RETVAL = const_cast(s[0].c_str()); else RETVAL = "err"; } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL Botan__X509_DN * Botan__X509_Certificate::subject_dn() CODE: try { RETVAL = new Botan__X509_DN(THIS->subject_dn()); } catch (const std::exception &e) { croak(e.what()); } char const * CLASS = "Botan::X509_DN"; OUTPUT: RETVAL Botan__X509_DN * Botan__X509_Certificate::issuer_dn() CODE: try { RETVAL = new Botan__X509_DN(THIS->issuer_dn()); } catch (const std::exception &e) { croak(e.what()); } char const * CLASS = "Botan::X509_DN"; OUTPUT: RETVAL # ============================== Botan::X509_DN ============================== MODULE = Botan PACKAGE = Botan::X509_DN Botan__X509_DN * Botan__X509_DN::new() CODE: try { RETVAL = new Botan__X509_DN(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__X509_DN::DESTROY() CODE: try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } AV * Botan__X509_DN::get_attributes() CODE: try { using namespace std; using namespace Botan; typedef multimap::const_iterator rdn_iter; multimap const &atrmmap = THIS->get_attributes(); RETVAL = newAV(); for(rdn_iter i = atrmmap.begin(); i != atrmmap.end(); i++) { string const &atr = i->first.as_string(); string const &val = i->second; av_push(RETVAL, newSVpvn(atr.c_str(), atr.length())); av_push(RETVAL, newSVpvn(val.c_str(), val.length())); } } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL Botan-1.10.12/src/wrap/perl-xs/Changes0000664000175000017500000000014512654331322017211 0ustar jackjack00000000000000Revision history for Perl extension to Botan. 0.01 Fri, 20 Feb 2004 15:10:50 +0100 - first version Botan-1.10.12/src/wrap/perl-xs/MANIFEST0000664000175000017500000000024012654331322017043 0ustar jackjack00000000000000Botan.pm Botan.xs Changes MANIFEST Makefile.PL data/ca.cert.der data/ca.cert.pem t/base64.t t/filt.t t/hex.t t/oid.t t/pipe.t t/testutl.pl t/x509cert.t typemap Botan-1.10.12/src/wrap/perl-xs/Makefile.PL0000664000175000017500000000125012654331322017666 0ustar jackjack00000000000000use ExtUtils::MakeMaker; my ($cc, $cflags, $lids); if ( $^O eq 'MSWin32' ) { # $cflags = ''; # $libs = ':nosearch -lgdi32 -llibeay32'; } else { $cc = 'g++'; $cflags = $Config::Config{ccflags} . ' -Wno-write-strings -fexceptions ' . qx( botan-config-1.10 --cflags ); $libs = qx( botan-config-1.10 --libs ); } WriteMakefile( 'NAME' => 'Botan', 'DISTNAME' => 'Botan-XS', 'VERSION_FROM' => 'Botan.pm', # finds $VERSION 'XSOPT' => '-C++', 'CC' => $cc, 'LD' => '$(CC)', 'CCFLAGS' => $cflags, 'LIBS' => [ $libs ], 'OPTIMIZE' => '-g', # 'clean' => { # 'FILES' => 'neco.p12 rnd', # }, ); Botan-1.10.12/src/wrap/perl-xs/data/ca.cert.der0000664000175000017500000000131012654331322020635 0ustar jackjack0000000000000000-0  *H 0R1 0 UCZ10U ICZ a.s.10UTest primary CA10 *H  ca@i.cz0 000820214800Z 020810214800Z0O1 0 UCZ10U ICZ a.s.10U Test sign CA10 *H  ca@i.cz00  *H 0d^6eiQ 5p4d j{6~ԔGL곽ӛ?M ?`|new(&Botan::NONE); }; print "not " if $@ || !defined $f; print "ok 2\n"; my $dec; eval { $dec = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec; print "ok 3\n"; eval { $f = Botan::Base64_Decoder->new(&Botan::IGNORE_WS); }; print "not " if $@ || !defined $f; print "ok 4\n"; my $dec_is; eval { $dec_is = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec_is; print "ok 5\n"; eval { $f = Botan::Base64_Decoder->new(&Botan::FULL_CHECK); }; print "not " if $@ || !defined $f; print "ok 6\n"; my $dec_fc; eval { $dec_fc = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec_fc; print "ok 7\n"; # Testing clean base64 input my $data; undef $data; eval { $dec->process_msg($botan_lic_b64); $data = $dec->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 8\n"; undef $data; eval { $dec_is->process_msg($botan_lic_b64); $data = $dec_is->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 9\n"; undef $data; eval { $dec_fc->process_msg($botan_lic_b64); $data = $dec_fc->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 10\n"; # Testing base64 input with whitespaces undef $data; eval { $dec->process_msg($botan_lic_b64_ws); $dec->set_default_msg(1); $data = $dec->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 11\n"; undef $data; eval { $dec_is->process_msg($botan_lic_b64_ws); $dec_is->set_default_msg(1); $data = $dec_is->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 12\n"; undef $data; eval { $dec_fc->process_msg($botan_lic_b64_ws); $dec_fc->set_default_msg(1); $data = $dec_fc->read(); }; print "not " unless $@ && !defined $data; print "ok 13\n"; # Testing base64 input with garbage undef $data; eval { $dec->process_msg($botan_lic_b64_garbage); $dec->set_default_msg(2); $data = $dec->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 14\n"; undef $data; eval { $dec_is->process_msg($botan_lic_b64_garbage); $dec_is->set_default_msg(2); $data = $dec_is->read(); }; print "not " unless $@ && !defined $data; print "ok 15\n"; undef $data; eval { $dec_fc->process_msg($botan_lic_b64_garbage); $dec_fc->set_default_msg(2); $data = $dec_fc->read(); }; print "not " unless $@ && !defined $data; print "ok 16\n"; # Encoder... eval { $f = Botan::Base64_Encoder->new(); }; print "not " if $@ || !defined $f; print "ok 17\n"; my $enc; eval { $enc = Botan::Pipe->new($f); }; print "not " if $@ || !defined $enc; print "ok 18\n"; eval { $f = Botan::Base64_Encoder->new(1, 5); }; print "not " if $@ || !defined $f; print "ok 19\n"; my $enc2; eval { $enc2 = Botan::Pipe->new($f); }; print "not " if $@ || !defined $enc2; print "ok 20\n"; undef $data; eval { $enc->process_msg("Hello\n"); $data = $enc->read(); }; print "not " if $@ || $data ne "SGVsbG8K"; print "ok 21\n"; undef $data; eval { $enc2->process_msg("Hello\n"); $data = $enc2->read(); }; print "not " if $@ || $data ne "SGVsb\nG8K\n"; print "ok 22\n"; # Encoder with decoder... my $p; eval { $p = Botan::Pipe->new( Botan::Base64_Encoder->new(), Botan::Base64_Decoder->new(), ); }; print "not " if $@ || !defined $p; print "ok 23\n"; print "not " unless random_message_ok($p); print "ok 24\n"; Botan-1.10.12/src/wrap/perl-xs/t/filt.t0000664000175000017500000000231012654331322017300 0ustar jackjack00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..5\n"; } END { print "not ok 1\n" unless $loaded; } use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; my $pipe = Botan::Pipe->new(Botan::Hex_Encoder->new()); print "not " unless $pipe; print "ok 2\n"; $pipe->process_msg('FOO'); print "not " if $pipe->read() ne '464F4F'; print "ok 3\n"; $pipe = Botan::Pipe->new(Botan::Hex_Encoder->new(0, 0, 1)); print "not " unless $pipe; print "ok 4\n"; $pipe->process_msg('FOO'); print "not " if $pipe->read() ne '464f4f'; print "ok 5\n"; #my $pipe = Botan::Pipe->new(Botan::Base64_Encoder->new()); #$pipe->process_msg('FOO'); # #print "not " if $pipe->read() ne 'Rk9P'; #print "ok 4\n"; Botan-1.10.12/src/wrap/perl-xs/t/hex.t0000664000175000017500000001373612654331322017144 0ustar jackjack00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..24\n"; } END { print "not ok 1\n" unless $loaded; } require 't/testutl.pl'; use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; # Data prep my ($hex, $hex_ws, $hex_garbage); while ( $_ = ) { $hex_garbage .= $_; s/[^[:xdigit:][:space:]]//g; $hex_ws .= $_; s/[^[:xdigit:]]//g; $hex .= $_; } my $data_test = pack("H*", $hex); # Decoder... my $f; eval { $f = Botan::Hex_Decoder->new(&Botan::NONE); }; print "not " if $@ || !defined $f; print "ok 2\n"; my $dec; eval { $dec = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec; print "ok 3\n"; eval { $f = Botan::Hex_Decoder->new(&Botan::IGNORE_WS); }; print "not " if $@ || !defined $f; print "ok 4\n"; my $dec_is; eval { $dec_is = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec_is; print "ok 5\n"; eval { $f = Botan::Hex_Decoder->new(&Botan::FULL_CHECK); }; print "not " if $@ || !defined $f; print "ok 6\n"; my $dec_fc; eval { $dec_fc = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec_fc; print "ok 7\n"; # Testing clean hexadecimal input my $data; undef $data; eval { $dec->process_msg($hex); $data = $dec->read(); }; print "not " if $@ || $data ne $data_test; print "ok 8\n"; undef $data; eval { $dec_is->process_msg($hex); $data = $dec_is->read(); }; print "not " if $@ || $data ne $data_test; print "ok 9\n"; undef $data; eval { $dec_fc->process_msg($hex); $data = $dec_fc->read(); }; print "not " if $@ || $data ne $data_test; print "ok 10\n"; # Testing hexadecimal input with whitespaces undef $data; eval { $dec->process_msg($hex_ws); $dec->set_default_msg(1); $data = $dec->read(); }; print "not " if $@ || $data ne $data_test; print "ok 11\n"; undef $data; eval { $dec_is->process_msg($hex_ws); $dec_is->set_default_msg(1); $data = $dec_is->read(); }; print "not " if $@ || $data ne $data_test; print "ok 12\n"; undef $data; eval { $dec_fc->process_msg($hex_ws); $dec_fc->set_default_msg(1); $data = $dec_fc->read(); }; print "not " unless $@ && !defined $data; print "ok 13\n"; # Testing hexadecimal input with garbage undef $data; eval { $dec->process_msg($hex_garbage); $dec->set_default_msg(2); $data = $dec->read(); }; print "not " if $@ || $data ne $data_test; print "ok 14\n"; undef $data; eval { $dec_is->process_msg($hex_garbage); $dec_is->set_default_msg(2); $data = $dec_is->read(); }; print "not " unless $@ && !defined $data; print "ok 15\n"; undef $data; eval { $dec_fc->process_msg($hex_garbage); $dec_fc->set_default_msg(2); $data = $dec_fc->read(); }; print "not " unless $@ && !defined $data; print "ok 16\n"; # Encoder... eval { $f = Botan::Hex_Encoder->new(); }; print "not " if $@ || !defined $f; print "ok 17\n"; my $enc; eval { $enc = Botan::Pipe->new($f); }; print "not " if $@ || !defined $enc; print "ok 18\n"; eval { $f = Botan::Hex_Encoder->new(1, 5, 1); }; print "not " if $@ || !defined $f; print "ok 19\n"; my $enc2; eval { $enc2 = Botan::Pipe->new($f); }; print "not " if $@ || !defined $enc2; print "ok 20\n"; undef $data; eval { $enc->process_msg("Hello\n"); $data = $enc->read(); }; print "not " if $@ || $data ne "48656C6C6F0A"; print "ok 21\n"; undef $data; eval { $enc2->process_msg("Hello\n"); $data = $enc2->read(); }; print "not " if $@ || $data ne "48656\nc6c6f\n0a\n"; print "ok 22\n"; # Encoder with decoder... my $p; eval { $p = Botan::Pipe->new( Botan::Hex_Encoder->new(), Botan::Hex_Decoder->new(), ); }; print "not " if $@ || !defined $p; print "ok 23\n"; print "not " unless random_message_ok($p); print "ok 24\n"; __DATA__ cb13 4a4d 7522 1fd3 c6f6 7786 d04b 3043 ..JMu"....w..K.. 4552 4bcf 4d2b 9d71 0cfe 4d6a 1caf bcfd .RK.M+.q..Mj.... 8f91 6151 ff85 e900 7e6a bafc 15e9 ae51 ...Q....~j.....Q b14b 7210 bb40 5958 2b82 d49e b808 68a5 .Kr..@YX+.....h. 7945 9dec f686 9b98 989e 826d 8088 6ee7 y..........m..n. d066 1eac 8c34 c461 bb54 7726 87ab d681 .........Tw&.... a0be 52e5 1128 0cf2 759e cb2d e690 4ed9 ..R..(..u..-..N. 7e88 bda7 2523 4a0f 185a 02b1 f898 fc41 ~...%#J..Z...... dd48 fa87 945d 7611 b8c9 a50a 2de2 b670 .H...]v.....-..p 0056 c8be 2cbb e7d0 1e70 4a3d 79f0 dce9 .V..,....pJ=y... b57f 154b 2b3a db73 f086 de11 9f3e 1641 ...K+:.s.....>.. 3a28 8b9b bb0f 682b 80db b791 89e0 62c0 :(....h+........ 7204 db97 5432 2eb0 a04e f38e 809f 7223 r...T....N....r# 912e e552 1452 6dd2 e09f dd06 c715 7c1a ...R.Rm.......|. fe3d d6cc b6d0 a17a 27d7 4327 4e43 8af3 .=.....z'..'N... 6eb5 e9f8 bfe9 34c3 6636 8243 358f 966d n..............m 7d87 d17b 5c37 6acb 4972 f4ec 6806 bbde }..{\.j.Ir..h... 2689 a019 a9e2 4101 7fe2 de72 bc03 eb5e &..........r...^ b699 2d6b f8cd a08e 6e01 edfc a81a 94b6 ..-k....n....... 9073 15fb efb2 c8d9 9f85 6633 85f1 e9d0 .s.............. 20ce 578b ab9d 2e51 b947 69bf fba5 82c6 .W....Q.Gi..... 2ed0 dd36 d679 a399 7db3 8a0d cdef 0eda .....y..}....... e761 e7f1 5b17 3f67 0c83 215a eddf 9d2a ....[.?g..!Z...* 5e70 0a77 c92e 94e1 a82b fd7c f10a 894f ^p.w.....+.|...O 2955 f0e8 7398 f409 2040 b797 da03 a5a6 )U..s... @...... 7ba4 c3c9 2659 b9f7 6a56 e17a b481 983f {...&Y..jV.z...? 00ed 3cc8 5a22 ad5c b6e0 3566 d717 35a6 ..<.Z".\........ 1523 4104 de63 477e fd24 68e5 e816 98df .#....G~.$h..... 1747 417e db72 a76a be5b b9dc 3dfb 2d05 .G.~.r.j.[..=.-. d27f e597 eafc 9a29 15c5 792d 9c88 9aea .......)..y-.... 485e e431 96c3 7723 da6d 28b2 477a fd12 H^....w#.m(.Gz.. e645 5dcd 7d5a d8b4 7acc 10b2 b41a e11d ..].}Z..z....... Botan-1.10.12/src/wrap/perl-xs/t/oid.t0000664000175000017500000000247512654331322017131 0ustar jackjack00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..6\n"; } END { print "not ok 1\n" unless $loaded; } use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; print "not " unless Botan::OIDS::have_oid('X520.CommonName'); print "ok 2\n"; my $oid_c = Botan::OID->new('2.5.4.3'); print "not " if Botan::OIDS::lookup_by_oid($oid_c) ne 'X520.CommonName'; print "ok 3\n"; my $oid_x = Botan::OIDS::lookup_by_name('X520.CommonName'); print "not " if $oid_x->as_string() ne '2.5.4.3'; print "ok 4\n"; my $oid_foo_num = '1.2.3.4.5.6.7.8.9.10.11.12.13.14.15'; my $oid_foo = Botan::OID->new($oid_foo_num); print "not " if Botan::OIDS::lookup_by_oid($oid_foo) ne $oid_foo_num; print "ok 5\n"; Botan::OIDS::add_oid($oid_foo, 'Zito.Foo'); print "not " if Botan::OIDS::lookup_by_oid($oid_foo) ne 'Zito.Foo'; print "ok 6\n"; Botan-1.10.12/src/wrap/perl-xs/t/pipe.t0000664000175000017500000000427112654331322017307 0ustar jackjack00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..20\n"; } END { print "not ok 1\n" unless $loaded; } use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; my $pipe = Botan::Pipe->new(); print "not " unless $pipe; print "ok 2\n"; $pipe->start_msg(); $pipe->write('Hello world'); $pipe->end_msg(); print "not " if $pipe->message_count() != 1; print "ok 3\n"; print "not " if $pipe->remaining() != 11; print "ok 4\n"; print "not " if $pipe->end_of_data(); print "ok 5\n"; print "not " if $pipe->read() ne 'Hello world'; print "ok 6\n"; print "not " if $pipe->remaining() != 0; print "ok 7\n"; print "not " unless $pipe->end_of_data(); print "ok 8\n"; $pipe->process_msg('Hello world'); print "not " if $pipe->message_count() != 2; print "ok 9\n"; my $msg_num = $pipe->message_count() -1; print "not " if $pipe->read(5, $msg_num) ne 'Hello'; print "ok 10\n"; print "not " if $pipe->read(6, $msg_num) ne ' world'; print "ok 11\n"; print "not " if $pipe->remaining() != 0; print "ok 12\n"; print "not " unless $pipe->end_of_data(); print "ok 13\n"; $pipe->process_msg("The\0string\0with\0null\0chars\0"); $msg_num = $pipe->message_count() -1; print "not " if $pipe->read(80, $msg_num) ne "The\0string\0with\0null\0chars\0"; print "ok 14\n"; $pipe->process_msg('FOO BAR'); $pipe->set_default_msg($pipe->message_count() -1); print "not " if $pipe->peek(3) ne 'FOO'; print "ok 15\n"; print "not " if $pipe->peek(3, 4) ne 'BAR'; print "ok 16\n"; print "not " if $pipe->peek() ne 'FOO BAR'; print "ok 17\n"; print "not " if $pipe->read() ne 'FOO BAR'; print "ok 18\n"; print "not " if $pipe->remaining() != 0; print "ok 19\n"; print "not " unless $pipe->end_of_data(); print "ok 20\n"; Botan-1.10.12/src/wrap/perl-xs/t/testutl.pl0000664000175000017500000000110112654331322020213 0ustar jackjack00000000000000#!/usr/bin/perl sub random_message_ok { my ($pipe, $iter, $chunkmax) = @_; $iter = 100 unless defined $iter; $chunkmax = 300 unless defined $chunkmax; eval { my $input = ''; $pipe->start_msg(); for(my $i = 0; $i < $iter; $i++) { my $chunk = ''; my $chunklen = int(rand($chunkmax)); $chunk .= pack("C", int(rand(256))) while $chunklen--; $input .= $chunk; $pipe->write($chunk); } $pipe->end_msg(); my $msg_num = $pipe->message_count() -1; my $output = $pipe->read(0xFFFFFFFF, $msg_num); return $input eq $output; }; } 1; Botan-1.10.12/src/wrap/perl-xs/t/x509cert.t0000664000175000017500000000225012654331322017730 0ustar jackjack00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..4\n"; } END { print "not ok 1\n" unless $loaded; } use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; my $cert = Botan::X509_Certificate->new('data/ca.cert.der'); print "not " if $cert->x509_version() != 3; print "ok 2\n"; print "not " if $cert->start_time() ne '2000/8/20 21:48:00 UTC'; print "ok 3\n"; print "not " if $cert->end_time() ne '2002/8/10 21:48:00 UTC'; print "ok 4\n"; #my $subject = $cert->subject_dn()->get_attributes(); #print STDERR "subject=", join(',', @{$subject}), "\n"; # #my $issuer = $cert->issuer_dn()->get_attributes(); #print STDERR "issuer=", join(',', @{$issuer}), "\n"; # Botan-1.10.12/src/wrap/perl-xs/typemap0000664000175000017500000000352412654331322017324 0ustar jackjack00000000000000TYPEMAP Botan__ASN1_String * O_OBJECT Botan__AlgorithmIdentifier * O_OBJECT Botan__AlternativeName * O_OBJECT Botan__Attribute * O_OBJECT Botan__Base64_Decoder * O_EXTOBJECT Botan__Base64_Encoder * O_EXTOBJECT Botan__Chain * O_EXTOBJECT Botan__Extension * O_OBJECT Botan__Filter * O_EXTOBJECT Botan__Fork * O_EXTOBJECT Botan__Hex_Decoder * O_EXTOBJECT Botan__Hex_Encoder * O_EXTOBJECT Botan__OID * O_OBJECT Botan__Pipe * O_OBJECT Botan__X509_Certificate * O_OBJECT Botan__X509_DN * O_OBJECT Botan__X509_Time * O_OBJECT Botan__u32bit T_UV ###################################################################### OUTPUT # The Perl object is blessed into 'CLASS', which should be a # char* having the name of the package for the blessing. O_OBJECT sv_setref_pv($arg, CLASS, (void*)$var); O_EXTOBJECT sv_setref_pv($arg, CLASS, (void*)$var); sv_magic(SvRV($arg), 0, '~', (char *)&oi_init, sizeof(oi_init)); ###################################################################### INPUT O_OBJECT if ( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) $var = ($type)SvIV((SV*)SvRV( $arg )); else croak(\"${Package}::$func_name() -- \" \"$var is not a blessed SV reference\"); # The pointer variable "ObjectInfo *${var}_oi;" must be declared # in PREINIT section. I don't know how to emit this declaration safely here. O_EXTOBJECT if ( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) $var = ($type)SvIV((SV*)SvRV($arg)); else croak(\"${Package}::$func_name() -- \" \"$var is not a blessed SV reference\"); { MAGIC *mg = mg_find(SvRV($arg), '~'); if ( mg == 0 || mg->mg_len != sizeof(ObjectInfo) || *(I32 *)(mg->mg_ptr) != ObjectInfo::SIGNVAL ) croak(\"${Package}::$func_name() -- \" \"private magic data for $var invalid\"); ${var}_oi = (ObjectInfo *)(mg->mg_ptr); } Botan-1.10.12/src/wrap/python/__init__.py0000664000175000017500000000014712654331322017760 0ustar jackjack00000000000000from _botan import * # Initialize the library when the module is imported init = LibraryInitializer() Botan-1.10.12/src/wrap/python/core.cpp0000664000175000017500000001477212654331322017314 0ustar jackjack00000000000000/* * Boost.Python module definition * (C) 1999-2007 Jack Lloyd */ #include #include #include #include #include #include using namespace Botan; #include "python_botan.h" class Py_Cipher { public: Py_Cipher(std::string algo_name, std::string direction, std::string key); std::string cipher_noiv(const std::string& text); std::string cipher(const std::string& text, const std::string& iv); std::string name() const { return algo_name; } private: std::string algo_name; Keyed_Filter* filter; Pipe pipe; }; std::string Py_Cipher::cipher(const std::string& input, const std::string& iv_str) { if(iv_str.size()) { const byte* iv_bytes = reinterpret_cast(iv_str.data()); u32bit iv_len = iv_str.size(); filter->set_iv(InitializationVector(iv_bytes, iv_len)); } pipe.process_msg(input); return pipe.read_all_as_string(Pipe::LAST_MESSAGE); } // For IV-less algorithms std::string Py_Cipher::cipher_noiv(const std::string& input) { pipe.process_msg(input); return pipe.read_all_as_string(Pipe::LAST_MESSAGE); } Py_Cipher::Py_Cipher(std::string algo_name, std::string direction, std::string key_str) { const byte* key_bytes = reinterpret_cast(key_str.data()); u32bit key_len = key_str.size(); Cipher_Dir dir; if(direction == "encrypt") dir = ENCRYPTION; else if(direction == "decrypt") dir = DECRYPTION; else throw std::invalid_argument("Bad cipher direction " + direction); filter = get_cipher(algo_name, dir); filter->set_key(SymmetricKey(key_bytes, key_len)); pipe.append(filter); } class Py_HashFunction { public: Py_HashFunction(const std::string& algo_name) { hash = get_hash(algo_name); } ~Py_HashFunction() { delete hash; } void update(const std::string& input) { hash->update(input); } std::string final() { std::string out(output_length(), 0); hash->final(reinterpret_cast(&out[0])); return out; } std::string name() const { return hash->name(); } u32bit output_length() const { return hash->output_length(); } private: HashFunction* hash; }; class Py_MAC { public: Py_MAC(const std::string& name, const std::string& key_str) { mac = get_mac(name); mac->set_key(reinterpret_cast(key_str.data()), key_str.size()); } ~Py_MAC() { delete mac; } u32bit output_length() const { return mac->output_length(); } std::string name() const { return mac->name(); } void update(const std::string& in) { mac->update(in); } std::string final() { std::string out(output_length(), 0); mac->final(reinterpret_cast(&out[0])); return out; } private: MessageAuthenticationCode* mac; }; std::string cryptobox_encrypt(const std::string& in, const std::string& passphrase, Python_RandomNumberGenerator& rng) { const byte* in_bytes = reinterpret_cast(in.data()); return CryptoBox::encrypt(in_bytes, in.size(), passphrase, rng.get_underlying_rng()); } std::string cryptobox_decrypt(const std::string& in, const std::string& passphrase) { const byte* in_bytes = reinterpret_cast(in.data()); return CryptoBox::decrypt(in_bytes, in.size(), passphrase); } std::string python_pbkdf2(const std::string& passphrase, const std::string& salt, u32bit iterations, u32bit output_size, const std::string& hash_fn) { PKCS5_PBKDF2 pbkdf2(new HMAC(get_hash(hash_fn))); return make_string( pbkdf2.derive_key(output_size, passphrase, reinterpret_cast(salt.data()), salt.size(), iterations).bits_of()); } std::string python_kdf2(const std::string& param, const std::string& masterkey, u32bit outputlength) { std::auto_ptr kdf(get_kdf("KDF2(SHA-1)")); return make_string( kdf->derive_key(outputlength, reinterpret_cast(masterkey.data()), masterkey.length(), param)); } BOOST_PYTHON_MODULE(_botan) { python::class_("LibraryInitializer") .def(python::init< python::optional >()); python::class_("RandomNumberGenerator") .def(python::init<>()) .def("__str__", &Python_RandomNumberGenerator::name) .def("name", &Python_RandomNumberGenerator::name) .def("reseed", &Python_RandomNumberGenerator::reseed) .def("add_entropy", &Python_RandomNumberGenerator::add_entropy) .def("gen_random_byte", &Python_RandomNumberGenerator::gen_random_byte) .def("gen_random", &Python_RandomNumberGenerator::gen_random); python::class_ ("Cipher", python::init()) .def("name", &Py_Cipher::name) .def("cipher", &Py_Cipher::cipher) .def("cipher", &Py_Cipher::cipher_noiv); python::class_ ("HashFunction", python::init()) .def("update", &Py_HashFunction::update) .def("final", &Py_HashFunction::final) .def("name", &Py_HashFunction::name) .def("output_length", &Py_HashFunction::output_length); python::class_ ("MAC", python::init()) .def("update", &Py_MAC::update) .def("final", &Py_MAC::final) .def("name", &Py_MAC::name) .def("output_length", &Py_MAC::output_length); python::def("cryptobox_encrypt", cryptobox_encrypt); python::def("cryptobox_decrypt", cryptobox_decrypt); python::def("pbkdf2", python_pbkdf2); python::def("derive_key", python_kdf2); export_filters(); export_rsa(); export_x509(); } Botan-1.10.12/src/wrap/python/filter.cpp0000664000175000017500000001204512654331322017640 0ustar jackjack00000000000000/* * Boost.Python module definition * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include using namespace boost::python; #include #include using namespace Botan; class Py_Filter : public Filter { public: virtual void write_str(const std::string&) = 0; std::string name() const { return "Py_Filter_FIXME"; } void write(const byte data[], size_t length) { write_str(std::string((const char*)data, length)); } void send_str(const std::string& str) { send((const byte*)str.data(), str.length()); } }; class FilterWrapper : public Py_Filter, public wrapper { public: void start_msg() { if(override start_msg = this->get_override("start_msg")) start_msg(); } void end_msg() { if(override end_msg = this->get_override("end_msg")) end_msg(); } void default_start_msg() {} void default_end_msg() {} virtual void write_str(const std::string& str) { this->get_override("write")(str); } }; Filter* return_or_raise(Filter* filter, const std::string& name) { if(filter) return filter; throw Invalid_Argument("Filter " + name + " could not be found"); } Filter* make_filter1(const std::string& name) { Filter* filter = 0; if(have_hash(name)) filter = new Hash_Filter(name); else if(name == "Hex_Encoder") filter = new Hex_Encoder; else if(name == "Hex_Decoder") filter = new Hex_Decoder; else if(name == "Base64_Encoder") filter = new Base64_Encoder; else if(name == "Base64_Decoder") filter = new Base64_Decoder; return return_or_raise(filter, name); } Filter* make_filter2(const std::string& name, const SymmetricKey& key) { Filter* filter = 0; if(have_mac(name)) filter = new MAC_Filter(name, key); else if(have_stream_cipher(name)) filter = new StreamCipher_Filter(name, key); return return_or_raise(filter, name); } // FIXME: add new wrapper for Keyed_Filter here Filter* make_filter3(const std::string& name, const SymmetricKey& key, Cipher_Dir direction) { return return_or_raise( get_cipher(name, key, direction), name); } Filter* make_filter4(const std::string& name, const SymmetricKey& key, const InitializationVector& iv, Cipher_Dir direction) { return return_or_raise( get_cipher(name, key, iv, direction), name); } void append_filter(Pipe& pipe, std::auto_ptr filter) { pipe.append(filter.get()); filter.release(); } void prepend_filter(Pipe& pipe, std::auto_ptr filter) { pipe.prepend(filter.get()); filter.release(); } void do_send(std::auto_ptr filter, const std::string& data) { filter->send_str(data); } BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(rallas_ovls, read_all_as_string, 0, 1) void export_filters() { class_, boost::noncopyable> ("__Internal_FilterObj", no_init); def("make_filter", make_filter1, return_value_policy()); def("make_filter", make_filter2, return_value_policy()); def("make_filter", make_filter3, return_value_policy()); def("make_filter", make_filter4, return_value_policy()); // This might not work - Pipe will delete the filter, but Python // might have allocated the space with malloc() or who-knows-what -> bad class_, bases, boost::noncopyable> ("FilterObj") .def("write", pure_virtual(&Py_Filter::write_str)) .def("send", &do_send) .def("start_msg", &Filter::start_msg, &FilterWrapper::default_start_msg) .def("end_msg", &Filter::end_msg, &FilterWrapper::default_end_msg); implicitly_convertible, std::auto_ptr >(); void (Pipe::*pipe_write_str)(const std::string&) = &Pipe::write; void (Pipe::*pipe_process_str)(const std::string&) = &Pipe::process_msg; class_("PipeObj") .def(init<>()) /* .def_readonly("LAST_MESSAGE", &Pipe::LAST_MESSAGE) .def_readonly("DEFAULT_MESSAGE", &Pipe::DEFAULT_MESSAGE) */ .add_property("default_msg", &Pipe::default_msg, &Pipe::set_default_msg) .add_property("msg_count", &Pipe::message_count) .def("append", append_filter) .def("prepend", prepend_filter) .def("reset", &Pipe::reset) .def("pop", &Pipe::pop) .def("end_of_data", &Pipe::end_of_data) .def("start_msg", &Pipe::start_msg) .def("end_msg", &Pipe::end_msg) .def("write", pipe_write_str) .def("process_msg", pipe_process_str) .def("read_all", &Pipe::read_all_as_string, rallas_ovls()); } Botan-1.10.12/src/wrap/python/python_botan.h0000664000175000017500000000410512654331322020522 0ustar jackjack00000000000000/* * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_BOOST_PYTHON_COMMON_H__ #define BOTAN_BOOST_PYTHON_COMMON_H__ #include #include #include using namespace Botan; #include namespace python = boost::python; extern void export_filters(); extern void export_rsa(); extern void export_x509(); class Bad_Size : public Exception { public: Bad_Size(u32bit got, u32bit expected) : Exception("Bad size detected in Python/C++ conversion layer: got " + to_string(got) + " bytes, expected " + to_string(expected)) {} }; inline std::string make_string(const byte input[], u32bit length) { return std::string((const char*)input, length); } inline std::string make_string(const MemoryRegion& in) { return make_string(in.begin(), in.size()); } inline void string2binary(const std::string& from, byte to[], u32bit expected) { if(from.size() != expected) throw Bad_Size(from.size(), expected); std::memcpy(to, from.data(), expected); } template inline python::object get_owner(T* me) { return python::object( python::handle<>( python::borrowed(python::detail::wrapper_base_::get_owner(*me)))); } class Python_RandomNumberGenerator { public: Python_RandomNumberGenerator() { rng = RandomNumberGenerator::make_rng(); } ~Python_RandomNumberGenerator() { delete rng; } std::string name() const { return rng->name(); } void reseed() { rng->reseed(192); } int gen_random_byte() { return rng->next_byte(); } std::string gen_random(int n) { std::string s(n, 0); rng->randomize(reinterpret_cast(&s[0]), n); return s; } void add_entropy(const std::string& in) { rng->add_entropy(reinterpret_cast(in.c_str()), in.length()); } RandomNumberGenerator& get_underlying_rng() { return *rng; } private: RandomNumberGenerator* rng; }; #endif Botan-1.10.12/src/wrap/python/rsa.cpp0000664000175000017500000001571312654331322017145 0ustar jackjack00000000000000/* * Boost.Python module definition * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include using namespace Botan; #include "python_botan.h" #include std::string bigint2str(const BigInt& n) { std::ostringstream out; out << n; return out.str(); } class Py_RSA_PrivateKey { public: Py_RSA_PrivateKey(std::string pem_str, Python_RandomNumberGenerator& rng, std::string pass); Py_RSA_PrivateKey(std::string pem_str, Python_RandomNumberGenerator& rng); Py_RSA_PrivateKey(u32bit bits, Python_RandomNumberGenerator& rng); ~Py_RSA_PrivateKey() { delete rsa_key; } std::string to_string() const { return PKCS8::PEM_encode(*rsa_key); } std::string to_ber() const { SecureVector bits = PKCS8::BER_encode(*rsa_key); return std::string(reinterpret_cast(&bits[0]), bits.size()); } std::string get_N() const { return bigint2str(get_bigint_N()); } std::string get_E() const { return bigint2str(get_bigint_E()); } const BigInt& get_bigint_N() const { return rsa_key->get_n(); } const BigInt& get_bigint_E() const { return rsa_key->get_e(); } std::string decrypt(const std::string& in, const std::string& padding); std::string sign(const std::string& in, const std::string& padding, Python_RandomNumberGenerator& rng); private: RSA_PrivateKey* rsa_key; }; std::string Py_RSA_PrivateKey::decrypt(const std::string& in, const std::string& padding) { PK_Decryptor_EME dec(*rsa_key, padding); const byte* in_bytes = reinterpret_cast(in.data()); return make_string(dec.decrypt(in_bytes, in.size())); } std::string Py_RSA_PrivateKey::sign(const std::string& in, const std::string& padding, Python_RandomNumberGenerator& rng) { PK_Signer sign(*rsa_key, padding); const byte* in_bytes = reinterpret_cast(in.data()); sign.update(in_bytes, in.size()); return make_string(sign.signature(rng.get_underlying_rng())); } Py_RSA_PrivateKey::Py_RSA_PrivateKey(u32bit bits, Python_RandomNumberGenerator& rng) { rsa_key = new RSA_PrivateKey(rng.get_underlying_rng(), bits); } Py_RSA_PrivateKey::Py_RSA_PrivateKey(std::string pem_str, Python_RandomNumberGenerator& rng) { DataSource_Memory in(pem_str); Private_Key* pkcs8_key = PKCS8::load_key(in, rng.get_underlying_rng()); rsa_key = dynamic_cast(pkcs8_key); if(!rsa_key) throw std::invalid_argument("Key is not an RSA key"); } Py_RSA_PrivateKey::Py_RSA_PrivateKey(std::string pem_str, Python_RandomNumberGenerator& rng, std::string passphrase) { DataSource_Memory in(pem_str); Private_Key* pkcs8_key = PKCS8::load_key(in, rng.get_underlying_rng(), passphrase); rsa_key = dynamic_cast(pkcs8_key); if(!rsa_key) throw std::invalid_argument("Key is not an RSA key"); } class Py_RSA_PublicKey { public: Py_RSA_PublicKey(std::string pem_str); Py_RSA_PublicKey(const Py_RSA_PrivateKey&); ~Py_RSA_PublicKey() { delete rsa_key; } std::string get_N() const { return bigint2str(get_bigint_N()); } std::string get_E() const { return bigint2str(get_bigint_E()); } const BigInt& get_bigint_N() const { return rsa_key->get_n(); } const BigInt& get_bigint_E() const { return rsa_key->get_e(); } std::string to_string() const { return X509::PEM_encode(*rsa_key); } std::string to_ber() const { SecureVector bits = X509::BER_encode(*rsa_key); return std::string(reinterpret_cast(&bits[0]), bits.size()); } std::string encrypt(const std::string& in, const std::string& padding, Python_RandomNumberGenerator& rng); bool verify(const std::string& in, const std::string& padding, const std::string& signature); private: RSA_PublicKey* rsa_key; }; Py_RSA_PublicKey::Py_RSA_PublicKey(const Py_RSA_PrivateKey& priv) { rsa_key = new RSA_PublicKey(priv.get_bigint_N(), priv.get_bigint_E()); } Py_RSA_PublicKey::Py_RSA_PublicKey(std::string pem_str) { DataSource_Memory in(pem_str); Public_Key* x509_key = X509::load_key(in); rsa_key = dynamic_cast(x509_key); if(!rsa_key) throw std::invalid_argument("Key is not an RSA key"); } std::string Py_RSA_PublicKey::encrypt(const std::string& in, const std::string& padding, Python_RandomNumberGenerator& rng) { PK_Encryptor_EME enc(*rsa_key, padding); const byte* in_bytes = reinterpret_cast(in.data()); return make_string(enc.encrypt(in_bytes, in.size(), rng.get_underlying_rng())); } bool Py_RSA_PublicKey::verify(const std::string& in, const std::string& signature, const std::string& padding) { PK_Verifier ver(*rsa_key, padding); const byte* in_bytes = reinterpret_cast(in.data()); const byte* sig_bytes = reinterpret_cast(signature.data()); ver.update(in_bytes, in.size()); return ver.check_signature(sig_bytes, signature.size()); } void export_rsa() { python::class_ ("RSA_PublicKey", python::init()) .def(python::init()) .def("to_string", &Py_RSA_PublicKey::to_string) .def("to_ber", &Py_RSA_PublicKey::to_ber) .def("encrypt", &Py_RSA_PublicKey::encrypt) .def("verify", &Py_RSA_PublicKey::verify) .def("get_N", &Py_RSA_PublicKey::get_N) .def("get_E", &Py_RSA_PublicKey::get_E); python::class_ ("RSA_PrivateKey", python::init()) .def(python::init()) .def(python::init()) .def("to_string", &Py_RSA_PrivateKey::to_string) .def("to_ber", &Py_RSA_PrivateKey::to_ber) .def("decrypt", &Py_RSA_PrivateKey::decrypt) .def("sign", &Py_RSA_PrivateKey::sign) .def("get_N", &Py_RSA_PrivateKey::get_N) .def("get_E", &Py_RSA_PrivateKey::get_E); } Botan-1.10.12/src/wrap/python/x509.cpp0000664000175000017500000001057312654331322017064 0ustar jackjack00000000000000/* * Boost.Python module definition * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include #include #include #include #include #include using namespace Botan; #include namespace python = boost::python; template class vector_to_list { public: static PyObject* convert(const std::vector& in) { python::list out; typename std::vector::const_iterator i = in.begin(); while(i != in.end()) { out.append(*i); ++i; } return python::incref(out.ptr()); } vector_to_list() { python::to_python_converter, vector_to_list >(); } }; template class memvec_to_hexstr { public: static PyObject* convert(const T& in) { Pipe pipe(new Hex_Encoder); pipe.process_msg(in); std::string result = pipe.read_all_as_string(); return python::incref(python::str(result).ptr()); } memvec_to_hexstr() { python::to_python_converter >(); } }; BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(add_cert_ols, add_cert, 1, 2) BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(validate_cert_ols, validate_cert, 1, 2) void export_x509() { vector_to_list(); vector_to_list(); memvec_to_hexstr >(); python::class_ ("X509_Certificate", python::init()) .def(python::self == python::self) .def(python::self != python::self) .add_property("version", &X509_Certificate::x509_version) .add_property("is_CA", &X509_Certificate::is_CA_cert) .add_property("self_signed", &X509_Certificate::is_self_signed) .add_property("pathlimit", &X509_Certificate::path_limit) .add_property("as_pem", &X509_Object::PEM_encode) .def("start_time", &X509_Certificate::start_time) .def("end_time", &X509_Certificate::end_time) .def("subject_info", &X509_Certificate::subject_info) .def("issuer_info", &X509_Certificate::issuer_info) .def("ex_constraints", &X509_Certificate::ex_constraints) .def("policies", &X509_Certificate::policies) .def("subject_key_id", &X509_Certificate::subject_key_id) .def("authority_key_id", &X509_Certificate::authority_key_id); python::class_ ("X509_CRL", python::init()) .add_property("as_pem", &X509_Object::PEM_encode); python::enum_("verify_result") .value("verified", VERIFIED) .value("unknown_x509_error", UNKNOWN_X509_ERROR) .value("cannot_establish_trust", CANNOT_ESTABLISH_TRUST) .value("cert_chain_too_long", CERT_CHAIN_TOO_LONG) .value("signature_error", SIGNATURE_ERROR) .value("policy_error", POLICY_ERROR) .value("invalid_usage", INVALID_USAGE) .value("cert_format_error", CERT_FORMAT_ERROR) .value("cert_issuer_not_found", CERT_ISSUER_NOT_FOUND) .value("cert_not_yet_valid", CERT_NOT_YET_VALID) .value("cert_has_expired", CERT_HAS_EXPIRED) .value("cert_is_revoked", CERT_IS_REVOKED) .value("crl_format_error", CRL_FORMAT_ERROR) .value("crl_issuer_not_found", CRL_ISSUER_NOT_FOUND) .value("crl_not_yet_valid", CRL_NOT_YET_VALID) .value("crl_has_expired", CRL_HAS_EXPIRED) .value("ca_cert_cannot_sign", CA_CERT_CANNOT_SIGN) .value("ca_cert_not_for_cert_issuer", CA_CERT_NOT_FOR_CERT_ISSUER) .value("ca_cert_not_for_crl_issuer", CA_CERT_NOT_FOR_CRL_ISSUER); python::enum_("cert_usage") .value("any", X509_Store::ANY) .value("tls_server", X509_Store::TLS_SERVER) .value("tls_client", X509_Store::TLS_CLIENT) .value("code_signing", X509_Store::CODE_SIGNING) .value("email_protection", X509_Store::EMAIL_PROTECTION) .value("time_stamping", X509_Store::TIME_STAMPING) .value("crl_signing", X509_Store::CRL_SIGNING); { python::scope in_class = python::class_("X509_Store") .def("add_cert", &X509_Store::add_cert, add_cert_ols()) .def("validate", &X509_Store::validate_cert, validate_cert_ols()) .def("add_crl", &X509_Store::add_crl); } } Botan-1.10.12/src/wrap/sqlite/codec.cpp0000664000175000017500000001261312654331322017411 0ustar jackjack00000000000000/* * Codec class for SQLite3 encryption codec. * (C) 2010 Olivier de Gaalon * * Distributed under the terms of the Botan license */ #include "codec.h" #include Codec::Codec(void *db) { InitializeCodec(db); } Codec::Codec(const Codec *other, void *db) { //Only used to copy main db key for an attached db InitializeCodec(db); m_hasReadKey = other->m_hasReadKey; m_hasWriteKey = other->m_hasWriteKey; m_readKey = other->m_readKey; m_ivReadKey = other->m_ivReadKey; m_writeKey = other->m_writeKey; m_ivWriteKey = other->m_ivWriteKey; } void Codec::InitializeCodec(void *db) { m_hasReadKey = false; m_hasWriteKey = false; m_db = db; try { m_encipherFilter = get_cipher(BLOCK_CIPHER_STR, ENCRYPTION); m_decipherFilter = get_cipher(BLOCK_CIPHER_STR, DECRYPTION); m_cmac = new MAC_Filter(MAC_STR); m_encipherPipe.append(m_encipherFilter); m_decipherPipe.append(m_decipherFilter); m_macPipe.append(m_cmac); } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } } void Codec::GenerateWriteKey(const char *userPassword, int passwordLength) { try { #if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4) PBKDF *pbkdf = get_pbkdf(PBKDF_STR); SymmetricKey masterKey = pbkdf->derive_key(KEY_SIZE + IV_DERIVATION_KEY_SIZE, std::string(userPassword, passwordLength), (const byte*)SALT_STR.c_str(), SALT_SIZE, PBKDF_ITERATIONS); #elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,8,0) S2K* s2k = get_s2k(PBKDF_STR); s2k->set_iterations(PBKDF_ITERATIONS); s2k->change_salt((const byte*)SALT_STR.c_str(), SALT_SIZE); SymmetricKey masterKey = s2k->derive_key(KEY_SIZE + IV_DERIVATION_KEY_SIZE, std::string(userPassword, passwordLength)); #else #error "This code requires botan 1.8 or newer" #endif m_writeKey = SymmetricKey(masterKey.bits_of(), KEY_SIZE); m_ivWriteKey = SymmetricKey(masterKey.bits_of() + KEY_SIZE, IV_DERIVATION_KEY_SIZE); m_hasWriteKey = true; } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } } void Codec::DropWriteKey() { m_hasWriteKey = false; } void Codec::SetReadIsWrite() { m_readKey = m_writeKey; m_ivReadKey = m_ivWriteKey; m_hasReadKey = m_hasWriteKey; } void Codec::SetWriteIsRead() { m_writeKey = m_readKey; m_ivWriteKey = m_ivReadKey; m_hasWriteKey = m_hasReadKey; } unsigned char* Codec::Encrypt(int page, unsigned char *data, bool useWriteKey) { memcpy(m_page, data, m_pageSize); try { m_encipherFilter->set_key(useWriteKey ? m_writeKey : m_readKey); m_encipherFilter->set_iv(GetIVForPage(page, useWriteKey)); m_encipherPipe.process_msg(m_page, m_pageSize); m_encipherPipe.read(m_page, m_encipherPipe.remaining(Pipe::LAST_MESSAGE), Pipe::LAST_MESSAGE); } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } return m_page; //return location of newly ciphered data } void Codec::Decrypt(int page, unsigned char *data) { try { m_decipherFilter->set_key(m_readKey); m_decipherFilter->set_iv(GetIVForPage(page, false)); m_decipherPipe.process_msg(data, m_pageSize); m_decipherPipe.read(data, m_decipherPipe.remaining(Pipe::LAST_MESSAGE), Pipe::LAST_MESSAGE); } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } } InitializationVector Codec::GetIVForPage(u32bit page, bool useWriteKey) { try { static unsigned char *intiv[4]; store_le(page, (byte*)intiv); m_cmac->set_key(useWriteKey ? m_ivWriteKey : m_ivReadKey); m_macPipe.process_msg((byte*)intiv, 4); return m_macPipe.read_all(Pipe::LAST_MESSAGE); } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } } const char* Codec::GetAndResetError() { const char *message = m_botanErrorMsg; m_botanErrorMsg = 0; return message; } #include "codec_c_interface.h" void InitializeBotan() { LibraryInitializer::initialize(); } void* InitializeNewCodec(void *db) { return new Codec(db); } void* InitializeFromOtherCodec(const void *otherCodec, void *db) { return new Codec((Codec*)otherCodec, db); } void GenerateWriteKey(void *codec, const char *userPassword, int passwordLength) { ((Codec*)codec)->GenerateWriteKey(userPassword, passwordLength); } void DropWriteKey(void *codec) { ((Codec*)codec)->DropWriteKey(); } void SetWriteIsRead(void *codec) { ((Codec*)codec)->SetWriteIsRead(); } void SetReadIsWrite(void *codec) { ((Codec*)codec)->SetReadIsWrite(); } unsigned char* Encrypt(void *codec, int page, unsigned char *data, Bool useWriteKey) { return ((Codec*)codec)->Encrypt(page, data, useWriteKey); } void Decrypt(void *codec, int page, unsigned char *data) { ((Codec*)codec)->Decrypt(page, data); } void SetPageSize(void *codec, int pageSize) { ((Codec*)codec)->SetPageSize(pageSize); } Bool HasReadKey(void *codec) { return ((Codec*)codec)->HasReadKey(); } Bool HasWriteKey(void *codec) { return ((Codec*)codec)->HasWriteKey(); } void* GetDB(void *codec) { return ((Codec*)codec)->GetDB(); } const char* GetAndResetError(void *codec) { return ((Codec*)codec)->GetAndResetError(); } void DeleteCodec(void *codec) { Codec *deleteThisCodec = (Codec*)codec; delete deleteThisCodec; } Botan-1.10.12/src/wrap/sqlite/codec.h0000664000175000017500000000576112654331322017064 0ustar jackjack00000000000000/* * Codec class for SQLite3 encryption codec. * (C) 2010 Olivier de Gaalon * * Distributed under the terms of the Botan license */ #ifndef _CODEC_H_ #define _CODEC_H_ #include #include #include using namespace std; using namespace Botan; /*These constants can be used to tweak the codec behavior as follows *Note that once you've encrypted a database with these settings, *recompiling with any different settings will give you a library that *cannot read that database, even given the same passphrase.*/ //BLOCK_CIPHER_STR: Cipher and mode used for encrypting the database //make sure to add "/NoPadding" for modes that use padding schemes const string BLOCK_CIPHER_STR = "Twofish/XTS"; //PBKDF_STR: Key derivation function used to derive both the encryption //and IV derivation keys from the given database passphrase const string PBKDF_STR = "PBKDF2(SHA-160)"; //SALT_STR: Hard coded salt used to derive the key from the passphrase. const string SALT_STR = "&g#nB'9]"; //SALT_SIZE: Size of the salt in bytes (as given in SALT_STR) const int SALT_SIZE = 64/8; //64 bit, 8 byte salt //MAC_STR: CMAC used to derive the IV that is used for db page //encryption const string MAC_STR = "CMAC(Twofish)"; //PBKDF_ITERATIONS: Number of hash iterations used in the key derivation //process. const int PBKDF_ITERATIONS = 10000; //KEY_SIZE: Size of the encryption key. Note that XTS splits the key //between two ciphers, so if you're using XTS, double the intended key //size. (ie, "AES-128/XTS" should have a 256 bit KEY_SIZE) const int KEY_SIZE = 512/8; //512 bit, 64 byte key. (256 bit XTS key) //IV_DERIVATION_KEY_SIZE: Size of the key used with the CMAC (MAC_STR) //above. const int IV_DERIVATION_KEY_SIZE = 256/8; //256 bit, 32 byte key //This is definited in sqlite.h and very unlikely to change #define SQLITE_MAX_PAGE_SIZE 32768 class Codec { public: Codec(void *db); Codec(const Codec* other, void *db); void GenerateWriteKey(const char *userPassword, int passwordLength); void DropWriteKey(); void SetWriteIsRead(); void SetReadIsWrite(); unsigned char* Encrypt(int page, unsigned char *data, bool useWriteKey); void Decrypt(int page, unsigned char *data); void SetPageSize(int pageSize) { m_pageSize = pageSize; } bool HasReadKey() { return m_hasReadKey; } bool HasWriteKey() { return m_hasWriteKey; } void* GetDB() { return m_db; } const char* GetAndResetError(); private: bool m_hasReadKey; bool m_hasWriteKey; SymmetricKey m_readKey, m_writeKey, m_ivReadKey, m_ivWriteKey; Pipe m_encipherPipe, m_decipherPipe, m_macPipe; Keyed_Filter *m_encipherFilter; Keyed_Filter *m_decipherFilter; MAC_Filter *m_cmac; int m_pageSize; unsigned char m_page[SQLITE_MAX_PAGE_SIZE]; void *m_db; const char *m_botanErrorMsg; InitializationVector GetIVForPage(u32bit page, bool useWriteKey); void InitializeCodec(void *db); }; #endif Botan-1.10.12/src/wrap/sqlite/codec_c_interface.h0000664000175000017500000000271112654331322021376 0ustar jackjack00000000000000/* * Encryption codec class C interface * (C) 2010 Olivier de Gaalon * * Distributed under the terms of the Botan license */ #ifndef _CODEC_C_INTERFACE_H_ #define _CODEC_C_INTERFACE_H_ #ifdef __cplusplus typedef unsigned char Bool; #endif #ifdef __cplusplus extern "C" #endif void InitializeBotan(); #ifdef __cplusplus extern "C" #endif void* InitializeNewCodec(void *db); #ifdef __cplusplus extern "C" #endif void* InitializeFromOtherCodec(const void *otherCodec, void *db); #ifdef __cplusplus extern "C" #endif void GenerateWriteKey(void *codec, const char *userPassword, int passwordLength); #ifdef __cplusplus extern "C" #endif void DropWriteKey(void *codec); #ifdef __cplusplus extern "C" #endif void SetWriteIsRead(void *codec); #ifdef __cplusplus extern "C" #endif void SetReadIsWrite(void *codec); #ifdef __cplusplus extern "C" #endif unsigned char* Encrypt(void *codec, int page, unsigned char *data, Bool useWriteKey); #ifdef __cplusplus extern "C" #endif void Decrypt(void *codec, int page, unsigned char *data); #ifdef __cplusplus extern "C" #endif void SetPageSize(void *codec, int pageSize); #ifdef __cplusplus extern "C" #endif Bool HasReadKey(void *codec); #ifdef __cplusplus extern "C" #endif Bool HasWriteKey(void *codec); #ifdef __cplusplus extern "C" #endif void* GetDB(void *codec); #ifdef __cplusplus extern "C" #endif const char* GetAndResetError(void *codec); #ifdef __cplusplus extern "C" #endif void DeleteCodec(void *codec); #endifBotan-1.10.12/src/wrap/sqlite/codecext.c0000664000175000017500000001662012654331322017574 0ustar jackjack00000000000000/* * Encryption codec implementation * (C) 2010 Olivier de Gaalon * * Distributed under the terms of the Botan license */ #ifndef SQLITE_OMIT_DISKIO #ifdef SQLITE_HAS_CODEC #include "codec_c_interface.h" Bool HandleError(void *pCodec) { const char *error = GetAndResetError(pCodec); if (error) { sqlite3Error((sqlite3*)GetDB(pCodec), SQLITE_ERROR, "Botan Error: %s", error); return 1; } return 0; } // Guessing that "see" is related to SQLite Encryption Extension" (the semi-official, for-pay, encryption codec) // Just as useful for initializing Botan. void sqlite3_activate_see(const char *info) { InitializeBotan(); } // Free the encryption codec, called from pager.c (address passed in sqlite3PagerSetCodec) void sqlite3PagerFreeCodec(void *pCodec) { if (pCodec) DeleteCodec(pCodec); } // Report the page size to the codec, called from pager.c (address passed in sqlite3PagerSetCodec) void sqlite3CodecSizeChange(void *pCodec, int pageSize, int nReserve) { SetPageSize(pCodec, pageSize); } // Encrypt/Decrypt functionality, called by pager.c void* sqlite3Codec(void *pCodec, void *data, Pgno nPageNum, int nMode) { if (pCodec == NULL) //Db not encrypted return data; switch(nMode) { case 0: // Undo a "case 7" journal file encryption case 2: // Reload a page case 3: // Load a page if (HasReadKey(pCodec)) Decrypt(pCodec, nPageNum, (unsigned char*) data); break; case 6: // Encrypt a page for the main database file if (HasWriteKey(pCodec)) data = Encrypt(pCodec, nPageNum, (unsigned char*) data, 1); break; case 7: // Encrypt a page for the journal file /* *Under normal circumstances, the readkey is the same as the writekey. However, *when the database is being rekeyed, the readkey is not the same as the writekey. *(The writekey is the "destination key" for the rekey operation and the readkey *is the key the db is currently encrypted with) *Therefore, for case 7, when the rollback is being written, always encrypt using *the database's readkey, which is guaranteed to be the same key that was used to *read and write the original data. */ if (HasReadKey(pCodec)) data = Encrypt(pCodec, nPageNum, (unsigned char*) data, 0); break; } HandleError(pCodec); return data; } int sqlite3CodecAttach(sqlite3 *db, int nDb, const void *zKey, int nKey) { void *pCodec; if (zKey == NULL || nKey <= 0) { // No key specified, could mean either use the main db's encryption or no encryption if (nDb != 0 && nKey < 0) { //Is an attached database, therefore use the key of main database, if main database is encrypted void *pMainCodec = sqlite3PagerGetCodec(sqlite3BtreePager(db->aDb[0].pBt)); if (pMainCodec != NULL) { pCodec = InitializeFromOtherCodec(pMainCodec, db); sqlite3PagerSetCodec(sqlite3BtreePager(db->aDb[nDb].pBt), sqlite3Codec, sqlite3CodecSizeChange, sqlite3PagerFreeCodec, pCodec); } } } else { // Key specified, setup encryption key for database pCodec = InitializeNewCodec(db); GenerateWriteKey(pCodec, (const char*) zKey, nKey); SetReadIsWrite(pCodec); sqlite3PagerSetCodec(sqlite3BtreePager(db->aDb[nDb].pBt), sqlite3Codec, sqlite3CodecSizeChange, sqlite3PagerFreeCodec, pCodec); } if (HandleError(pCodec)) return SQLITE_ERROR; return SQLITE_OK; } void sqlite3CodecGetKey(sqlite3* db, int nDb, void **zKey, int *nKey) { // The unencrypted password is not stored for security reasons // therefore always return NULL *zKey = NULL; *nKey = -1; } int sqlite3_key(sqlite3 *db, const void *zKey, int nKey) { // The key is only set for the main database, not the temp database return sqlite3CodecAttach(db, 0, zKey, nKey); } int sqlite3_rekey(sqlite3 *db, const void *zKey, int nKey) { // Changes the encryption key for an existing database. int rc = SQLITE_ERROR; Btree *pbt = db->aDb[0].pBt; Pager *pPager = sqlite3BtreePager(pbt); void *pCodec = sqlite3PagerGetCodec(pPager); if ((zKey == NULL || nKey == 0) && pCodec == NULL) { // Database not encrypted and key not specified. Do nothing return SQLITE_OK; } if (pCodec == NULL) { // Database not encrypted, but key specified. Encrypt database pCodec = InitializeNewCodec(db); GenerateWriteKey(pCodec, (const char*) zKey, nKey); if (HandleError(pCodec)) return SQLITE_ERROR; sqlite3PagerSetCodec(pPager, sqlite3Codec, sqlite3CodecSizeChange, sqlite3PagerFreeCodec, pCodec); } else if (zKey == NULL || nKey == 0) { // Database encrypted, but key not specified. Decrypt database // Keep read key, drop write key DropWriteKey(pCodec); } else { // Database encrypted and key specified. Re-encrypt database with new key // Keep read key, change write key to new key GenerateWriteKey(pCodec, (const char*) zKey, nKey); if (HandleError(pCodec)) return SQLITE_ERROR; } // Start transaction rc = sqlite3BtreeBeginTrans(pbt, 1); if (rc == SQLITE_OK) { // Rewrite all pages using the new encryption key (if specified) int nPageCount = -1; sqlite3PagerPagecount(pPager, &nPageCount); Pgno nPage = (Pgno) nPageCount; Pgno nSkip = PAGER_MJ_PGNO(pPager); DbPage *pPage; Pgno n; for (n = 1; rc == SQLITE_OK && n <= nPage; n++) { if (n == nSkip) continue; rc = sqlite3PagerGet(pPager, n, &pPage); if (!rc) { rc = sqlite3PagerWrite(pPage); sqlite3PagerUnref(pPage); } else sqlite3Error(db, SQLITE_ERROR, "%s", "Error while rekeying database page. Transaction Canceled."); } } else sqlite3Error(db, SQLITE_ERROR, "%s", "Error beginning rekey transaction. Make sure that the current encryption key is correct."); if (rc == SQLITE_OK) { // All good, commit rc = sqlite3BtreeCommit(pbt); if (rc == SQLITE_OK) { //Database rekeyed and committed successfully, update read key if (HasWriteKey(pCodec)) SetReadIsWrite(pCodec); else //No write key == no longer encrypted sqlite3PagerSetCodec(pPager, NULL, NULL, NULL, NULL); } else { //FIXME: can't trigger this, not sure if rollback is needed, reference implementation didn't rollback sqlite3Error(db, SQLITE_ERROR, "%s", "Could not commit rekey transaction."); } } else { // Rollback, rekey failed sqlite3BtreeRollback(pbt, SQLITE_ERROR); // go back to read key if (HasReadKey(pCodec)) SetWriteIsRead(pCodec); else //Database wasn't encrypted to start with sqlite3PagerSetCodec(pPager, NULL, NULL, NULL, NULL); } return rc; } #endif // SQLITE_HAS_CODEC #endif // SQLITE_OMIT_DISKIO Botan-1.10.12/src/wrap/sqlite/readme.txt0000664000175000017500000000217412654331322017627 0ustar jackjack00000000000000Build instructions for BotanSqlite3 --- Requirements: 1. Botan 1.9.0 or later 2. SQLite3 amalgamation source, version 3.7.12.1 or later (previous versions may work, some will need minor changes) Building: 1. Extract sqlite3 amalgamation to a directory and add BotanSqlite3 source files If desired, codec.h can be modified to tweak the encryption algothrithms and parameters. (Defaults to Twofish/XTS with 256 bit key) 2. Apply the patch "sqlite3.diff": $ patch -p0 < sqlite3-amalgamation.patch If the patching fails for some reason (ie, changes in SQLite3), it should be trivial to do it manually. 3. Compile the sqlite3 library with Botan encryption support: $ gcc -c sqlite3.c -o botansqlite3.o && gcc -c codec.cpp -o codec.o `pkg-config --cflags botan-1.10` && ar rcs libbotansqlite3.a botansqlite3.o codec.o (replace "botan-1.10" with appropriate version) Testing: 1. Build the test: $ g++ test_sqlite.cpp -o test_sqlite `botan-config-1.10 --libs` ./libbotansqlite3.a (replace botan-config-1.10 w/ appropriate version) 2. Run the test $ ./test_sqlite 3. Look for "All seems good" Botan-1.10.12/src/wrap/sqlite/sqlite3-amalgamation.patch0000664000175000017500000000111212654331322022655 0ustar jackjack00000000000000--- ./sqlite3.c.orig 2011-05-12 10:03:32.051879390 +0800 +++ ./sqlite3.c 2011-05-12 10:09:04.028550281 +0800 @@ -17,6 +17,7 @@ ** language. The code for the "sqlite3" command-line shell is also in a ** separate file. This file contains only code for the core SQLite library. */ +#define SQLITE_HAS_CODEC 1 #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 #ifndef SQLITE_PRIVATE @@ -125956,3 +125957,4 @@ #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ /************** End of fts3_icu.c ********************************************/ +#include "codecext.c" Botan-1.10.12/src/wrap/sqlite/test_sqlite.cpp0000664000175000017500000001017412654331322020674 0ustar jackjack00000000000000/* * Quick and dirty test for SQLite3 encryption codec. * (C) 2010 Olivier de Gaalon * * Distributed under the terms of the Botan license */ #define SQLITE_HAS_CODEC 1 #include #include namespace SQL { const char * CREATE_TABLE_TEST = "create table 'test' (id INTEGER PRIMARY KEY, name TEXT, creationtime TEXT);"; const char * CREATE_TABLE_TEST2 = "create table 'test2' (id INTEGER PRIMARY KEY, name TEXT, creationtime TEXT);"; const char * INSERT_INTO_TEST = "INSERT INTO test (name, creationtime) VALUES ('widget', '1st time');\ INSERT INTO test (name, creationtime) VALUES ('widget', '2nd time');\ INSERT INTO test (name, creationtime) VALUES ('widget', '3rd time');\ INSERT INTO test (name, creationtime) VALUES ('widget', '4th time');\ INSERT INTO test (name, creationtime) VALUES ('widget', '5th time');"; const char * INSERT_INTO_TEST2 = "INSERT INTO test2 (name, creationtime) VALUES ('widget2', '1st time2');\ INSERT INTO test2 (name, creationtime) VALUES ('widget2', '2nd time2');\ INSERT INTO test2 (name, creationtime) VALUES ('widget2', '3rd time2');\ INSERT INTO test2 (name, creationtime) VALUES ('widget2', '4th time2');\ INSERT INTO test2 (name, creationtime) VALUES ('widget2', '5th time2');"; const char * SELECT_FROM_TEST = "SELECT * FROM test;"; const char * SELECT_FROM_TEST2 = "SELECT * FROM test2;"; }; static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "\t"); for(i=0; i